Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
I
interface
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
LuckySwap
interface
Commits
2d118a90
Unverified
Commit
2d118a90
authored
Apr 23, 2021
by
Moody Salem
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
refactor some hooks into the hooks directory
parent
b69f08cb
Changes
9
Show whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
42 additions
and
43 deletions
+42
-43
useApproveCallback.ts
src/hooks/useApproveCallback.ts
+1
-1
useIsSwapUnsupported.ts
src/hooks/useIsSwapUnsupported.ts
+21
-0
useTokenAllowance.ts
src/hooks/useTokenAllowance.ts
+1
-2
v2Trades.ts
src/hooks/v2Trades.ts
+7
-30
index.tsx
src/pages/AddLiquidity/index.tsx
+2
-2
index.tsx
src/pages/AddLiquidityV2/index.tsx
+2
-2
PositionPage.tsx
src/pages/Pool/PositionPage.tsx
+3
-1
index.tsx
src/pages/Swap/index.tsx
+2
-2
hooks.ts
src/state/swap/hooks.ts
+3
-3
No files found.
src/hooks/useApproveCallback.ts
View file @
2d118a90
...
@@ -4,13 +4,13 @@ import { TokenAmount, CurrencyAmount, ETHER } from '@uniswap/sdk-core'
...
@@ -4,13 +4,13 @@ import { TokenAmount, CurrencyAmount, ETHER } from '@uniswap/sdk-core'
import
{
Trade
}
from
'
@uniswap/v2-sdk
'
import
{
Trade
}
from
'
@uniswap/v2-sdk
'
import
{
useCallback
,
useMemo
}
from
'
react
'
import
{
useCallback
,
useMemo
}
from
'
react
'
import
{
ROUTER_ADDRESS
}
from
'
../constants
'
import
{
ROUTER_ADDRESS
}
from
'
../constants
'
import
{
useTokenAllowance
}
from
'
../data/Allowances
'
import
{
Field
}
from
'
../state/swap/actions
'
import
{
Field
}
from
'
../state/swap/actions
'
import
{
useTransactionAdder
,
useHasPendingApproval
}
from
'
../state/transactions/hooks
'
import
{
useTransactionAdder
,
useHasPendingApproval
}
from
'
../state/transactions/hooks
'
import
{
computeSlippageAdjustedAmounts
}
from
'
../utils/prices
'
import
{
computeSlippageAdjustedAmounts
}
from
'
../utils/prices
'
import
{
calculateGasMargin
}
from
'
../utils
'
import
{
calculateGasMargin
}
from
'
../utils
'
import
{
useTokenContract
}
from
'
./useContract
'
import
{
useTokenContract
}
from
'
./useContract
'
import
{
useActiveWeb3React
}
from
'
./index
'
import
{
useActiveWeb3React
}
from
'
./index
'
import
{
useTokenAllowance
}
from
'
./useTokenAllowance
'
export
enum
ApprovalState
{
export
enum
ApprovalState
{
UNKNOWN
,
UNKNOWN
,
...
...
src/hooks/useIsSwapUnsupported.ts
0 → 100644
View file @
2d118a90
import
{
Currency
,
Token
}
from
'
@uniswap/sdk-core
'
import
{
useMemo
}
from
'
react
'
import
{
useUnsupportedTokens
}
from
'
./Tokens
'
/**
* Returns true if the input currency or output currency cannot be traded in the interface
* @param currencyIn the input currency to check
* @param currencyOut the output currency to check
*/
export
function
useIsSwapUnsupported
(
currencyIn
?:
Currency
,
currencyOut
?:
Currency
):
boolean
{
const
unsupportedTokens
:
{
[
address
:
string
]:
Token
}
=
useUnsupportedTokens
()
return
useMemo
(()
=>
{
// if unsupported list loaded & either token on list, mark as unsupported
return
Boolean
(
unsupportedTokens
&&
((
currencyIn
&&
currencyIn
instanceof
Token
&&
unsupportedTokens
[
currencyIn
.
address
])
||
(
currencyOut
&&
currencyOut
instanceof
Token
&&
unsupportedTokens
[
currencyOut
.
address
]))
)
},
[
currencyIn
,
currencyOut
,
unsupportedTokens
])
}
src/
data/Allowances
.ts
→
src/
hooks/useTokenAllowance
.ts
View file @
2d118a90
import
{
Token
,
TokenAmount
}
from
'
@uniswap/sdk-core
'
import
{
Token
,
TokenAmount
}
from
'
@uniswap/sdk-core
'
import
{
useMemo
}
from
'
react
'
import
{
useMemo
}
from
'
react
'
import
{
useTokenContract
}
from
'
../hooks/useContract
'
import
{
useSingleCallResult
}
from
'
../state/multicall/hooks
'
import
{
useSingleCallResult
}
from
'
../state/multicall/hooks
'
import
{
useTokenContract
}
from
'
./useContract
'
export
function
useTokenAllowance
(
token
?:
Token
,
owner
?:
string
,
spender
?:
string
):
TokenAmount
|
undefined
{
export
function
useTokenAllowance
(
token
?:
Token
,
owner
?:
string
,
spender
?:
string
):
TokenAmount
|
undefined
{
const
contract
=
useTokenContract
(
token
?.
address
,
false
)
const
contract
=
useTokenContract
(
token
?.
address
,
false
)
...
...
src/hooks/Trades.ts
→
src/hooks/
v2
Trades.ts
View file @
2d118a90
import
{
isTradeBetter
}
from
'
utils/trades
'
import
{
Pair
,
Trade
}
from
'
@uniswap/v2-sdk
'
import
{
Currency
,
CurrencyAmount
,
Token
}
from
'
@uniswap/sdk-core
'
import
{
Currency
,
CurrencyAmount
,
Token
}
from
'
@uniswap/sdk-core
'
import
{
Pair
,
Trade
}
from
'
@uniswap/v2-sdk
'
import
flatMap
from
'
lodash.flatmap
'
import
flatMap
from
'
lodash.flatmap
'
import
{
useMemo
}
from
'
react
'
import
{
useMemo
}
from
'
react
'
import
{
useUserSingleHopOnly
}
from
'
state/user/hooks
'
import
{
isTradeBetter
}
from
'
utils/trades
'
import
{
import
{
ADDITIONAL_BASES
,
BASES_TO_CHECK_TRADES_AGAINST
,
BASES_TO_CHECK_TRADES_AGAINST
,
CUSTOM_BASES
,
BETTER_TRADE_LESS_HOPS_THRESHOLD
,
BETTER_TRADE_LESS_HOPS_THRESHOLD
,
ADDITIONAL
_BASES
,
CUSTOM
_BASES
,
}
from
'
../constants
'
}
from
'
../constants
'
import
{
PairState
,
usePairs
}
from
'
../data/V2
'
import
{
PairState
,
usePairs
}
from
'
../data/V2
'
import
{
wrappedCurrency
}
from
'
../utils/wrappedCurrency
'
import
{
wrappedCurrency
}
from
'
../utils/wrappedCurrency
'
import
{
useActiveWeb3React
}
from
'
./index
'
import
{
useActiveWeb3React
}
from
'
./index
'
import
{
useUnsupportedTokens
}
from
'
./Tokens
'
import
{
useUserSingleHopOnly
}
from
'
state/user/hooks
'
function
useAllCommonPairs
(
currencyA
?:
Currency
,
currencyB
?:
Currency
):
Pair
[]
{
function
useAllCommonPairs
(
currencyA
?:
Currency
,
currencyB
?:
Currency
):
Pair
[]
{
const
{
chainId
}
=
useActiveWeb3React
()
const
{
chainId
}
=
useActiveWeb3React
()
...
@@ -96,7 +93,7 @@ const MAX_HOPS = 3
...
@@ -96,7 +93,7 @@ const MAX_HOPS = 3
/**
/**
* Returns the best trade for the exact amount of tokens in to the given token out
* Returns the best trade for the exact amount of tokens in to the given token out
*/
*/
export
function
useTradeExactIn
(
currencyAmountIn
?:
CurrencyAmount
,
currencyOut
?:
Currency
):
Trade
|
null
{
export
function
use
V2
TradeExactIn
(
currencyAmountIn
?:
CurrencyAmount
,
currencyOut
?:
Currency
):
Trade
|
null
{
const
allowedPairs
=
useAllCommonPairs
(
currencyAmountIn
?.
currency
,
currencyOut
)
const
allowedPairs
=
useAllCommonPairs
(
currencyAmountIn
?.
currency
,
currencyOut
)
const
[
singleHopOnly
]
=
useUserSingleHopOnly
()
const
[
singleHopOnly
]
=
useUserSingleHopOnly
()
...
@@ -130,7 +127,7 @@ export function useTradeExactIn(currencyAmountIn?: CurrencyAmount, currencyOut?:
...
@@ -130,7 +127,7 @@ export function useTradeExactIn(currencyAmountIn?: CurrencyAmount, currencyOut?:
/**
/**
* Returns the best trade for the token in to the exact amount of token out
* Returns the best trade for the token in to the exact amount of token out
*/
*/
export
function
useTradeExactOut
(
currencyIn
?:
Currency
,
currencyAmountOut
?:
CurrencyAmount
):
Trade
|
null
{
export
function
use
V2
TradeExactOut
(
currencyIn
?:
Currency
,
currencyAmountOut
?:
CurrencyAmount
):
Trade
|
null
{
const
allowedPairs
=
useAllCommonPairs
(
currencyIn
,
currencyAmountOut
?.
currency
)
const
allowedPairs
=
useAllCommonPairs
(
currencyIn
,
currencyAmountOut
?.
currency
)
const
[
singleHopOnly
]
=
useUserSingleHopOnly
()
const
[
singleHopOnly
]
=
useUserSingleHopOnly
()
...
@@ -158,23 +155,3 @@ export function useTradeExactOut(currencyIn?: Currency, currencyAmountOut?: Curr
...
@@ -158,23 +155,3 @@ export function useTradeExactOut(currencyIn?: Currency, currencyAmountOut?: Curr
return
null
return
null
},
[
currencyIn
,
currencyAmountOut
,
allowedPairs
,
singleHopOnly
])
},
[
currencyIn
,
currencyAmountOut
,
allowedPairs
,
singleHopOnly
])
}
}
export
function
useIsTransactionUnsupported
(
currencyIn
?:
Currency
,
currencyOut
?:
Currency
):
boolean
{
const
unsupportedTokens
:
{
[
address
:
string
]:
Token
}
=
useUnsupportedTokens
()
const
{
chainId
}
=
useActiveWeb3React
()
const
tokenIn
=
wrappedCurrency
(
currencyIn
,
chainId
)
const
tokenOut
=
wrappedCurrency
(
currencyOut
,
chainId
)
// if unsupported list loaded & either token on list, mark as unsupported
if
(
unsupportedTokens
)
{
if
(
tokenIn
&&
Object
.
keys
(
unsupportedTokens
).
includes
(
tokenIn
.
address
))
{
return
true
}
if
(
tokenOut
&&
Object
.
keys
(
unsupportedTokens
).
includes
(
tokenOut
.
address
))
{
return
true
}
}
return
false
}
src/pages/AddLiquidity/index.tsx
View file @
2d118a90
...
@@ -13,6 +13,7 @@ import { AutoColumn, ColumnCenter } from '../../components/Column'
...
@@ -13,6 +13,7 @@ import { AutoColumn, ColumnCenter } from '../../components/Column'
import
{
TransactionSubmittedContent
,
ConfirmationPendingContent
}
from
'
../../components/TransactionConfirmationModal
'
import
{
TransactionSubmittedContent
,
ConfirmationPendingContent
}
from
'
../../components/TransactionConfirmationModal
'
import
CurrencyInputPanel
from
'
../../components/CurrencyInputPanel
'
import
CurrencyInputPanel
from
'
../../components/CurrencyInputPanel
'
import
{
AutoRow
,
RowBetween
,
RowFixed
}
from
'
../../components/Row
'
import
{
AutoRow
,
RowBetween
,
RowFixed
}
from
'
../../components/Row
'
import
{
useIsSwapUnsupported
}
from
'
../../hooks/useIsSwapUnsupported
'
import
Review
from
'
./Review
'
import
Review
from
'
./Review
'
import
{
useActiveWeb3React
}
from
'
../../hooks
'
import
{
useActiveWeb3React
}
from
'
../../hooks
'
import
{
useCurrency
}
from
'
../../hooks/Tokens
'
import
{
useCurrency
}
from
'
../../hooks/Tokens
'
...
@@ -29,7 +30,6 @@ import { wrappedCurrency } from '../../utils/wrappedCurrency'
...
@@ -29,7 +30,6 @@ import { wrappedCurrency } from '../../utils/wrappedCurrency'
import
AppBody
from
'
../AppBody
'
import
AppBody
from
'
../AppBody
'
import
{
Dots
}
from
'
../Pool/styleds
'
import
{
Dots
}
from
'
../Pool/styleds
'
import
{
currencyId
}
from
'
../../utils/currencyId
'
import
{
currencyId
}
from
'
../../utils/currencyId
'
import
{
useIsTransactionUnsupported
}
from
'
hooks/Trades
'
import
UnsupportedCurrencyFooter
from
'
components/swap/UnsupportedCurrencyFooter
'
import
UnsupportedCurrencyFooter
from
'
components/swap/UnsupportedCurrencyFooter
'
import
{
import
{
DynamicSection
,
DynamicSection
,
...
@@ -317,7 +317,7 @@ export default function AddLiquidity({
...
@@ -317,7 +317,7 @@ export default function AddLiquidity({
// const isCreate = history.location.pathname.includes('/create')
// const isCreate = history.location.pathname.includes('/create')
const
addIsUnsupported
=
useIs
Transaction
Unsupported
(
currencies
?.
CURRENCY_A
,
currencies
?.
CURRENCY_B
)
const
addIsUnsupported
=
useIs
Swap
Unsupported
(
currencies
?.
CURRENCY_A
,
currencies
?.
CURRENCY_B
)
const
clearAll
=
useCallback
(()
=>
{
const
clearAll
=
useCallback
(()
=>
{
onFieldAInput
(
''
)
onFieldAInput
(
''
)
...
...
src/pages/AddLiquidityV2/index.tsx
View file @
2d118a90
...
@@ -22,6 +22,7 @@ import { PairState } from '../../data/V2'
...
@@ -22,6 +22,7 @@ import { PairState } from '../../data/V2'
import
{
useActiveWeb3React
}
from
'
../../hooks
'
import
{
useActiveWeb3React
}
from
'
../../hooks
'
import
{
useCurrency
}
from
'
../../hooks/Tokens
'
import
{
useCurrency
}
from
'
../../hooks/Tokens
'
import
{
ApprovalState
,
useApproveCallback
}
from
'
../../hooks/useApproveCallback
'
import
{
ApprovalState
,
useApproveCallback
}
from
'
../../hooks/useApproveCallback
'
import
{
useIsSwapUnsupported
}
from
'
../../hooks/useIsSwapUnsupported
'
import
useTransactionDeadline
from
'
../../hooks/useTransactionDeadline
'
import
useTransactionDeadline
from
'
../../hooks/useTransactionDeadline
'
import
{
useWalletModalToggle
}
from
'
../../state/application/hooks
'
import
{
useWalletModalToggle
}
from
'
../../state/application/hooks
'
import
{
Field
}
from
'
../../state/mint/actions
'
import
{
Field
}
from
'
../../state/mint/actions
'
...
@@ -38,7 +39,6 @@ import { Dots, Wrapper } from '../Pool/styleds'
...
@@ -38,7 +39,6 @@ import { Dots, Wrapper } from '../Pool/styleds'
import
{
ConfirmAddModalBottom
}
from
'
./ConfirmAddModalBottom
'
import
{
ConfirmAddModalBottom
}
from
'
./ConfirmAddModalBottom
'
import
{
currencyId
}
from
'
../../utils/currencyId
'
import
{
currencyId
}
from
'
../../utils/currencyId
'
import
{
PoolPriceBar
}
from
'
./PoolPriceBar
'
import
{
PoolPriceBar
}
from
'
./PoolPriceBar
'
import
{
useIsTransactionUnsupported
}
from
'
hooks/Trades
'
import
UnsupportedCurrencyFooter
from
'
components/swap/UnsupportedCurrencyFooter
'
import
UnsupportedCurrencyFooter
from
'
components/swap/UnsupportedCurrencyFooter
'
import
{
useV2DerivedMintInfo
}
from
'
state/mint/v2
'
import
{
useV2DerivedMintInfo
}
from
'
state/mint/v2
'
...
@@ -309,7 +309,7 @@ export default function AddLiquidity({
...
@@ -309,7 +309,7 @@ export default function AddLiquidity({
const
isCreate
=
history
.
location
.
pathname
.
includes
(
'
/create
'
)
const
isCreate
=
history
.
location
.
pathname
.
includes
(
'
/create
'
)
const
addIsUnsupported
=
useIs
Transaction
Unsupported
(
currencies
?.
CURRENCY_A
,
currencies
?.
CURRENCY_B
)
const
addIsUnsupported
=
useIs
Swap
Unsupported
(
currencies
?.
CURRENCY_A
,
currencies
?.
CURRENCY_B
)
return
(
return
(
<>
<>
...
...
src/pages/Pool/PositionPage.tsx
View file @
2d118a90
...
@@ -69,7 +69,9 @@ const ResponsiveGrid = styled.div`
...
@@ -69,7 +69,9 @@ const ResponsiveGrid = styled.div`
`
`
// responsive text
// responsive text
const
Label
=
styled
(
TYPE
.
label
)
<
{
end
?:
boolean
}
>
`
// disable the warning because we don't use the end prop, we just want to filter it out
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const
Label
=
styled
(({
end
,
...
props
})
=>
<
TYPE
.
label
{
...
props
}
/>)
<
{
end
?:
boolean
}
>
`
display: flex;
display: flex;
font-size: 16px;
font-size: 16px;
justify-content:
${({
end
})
=>
(
end
?
'
flex-end
'
:
'
flex-start
'
)}
;
justify-content:
${({
end
})
=>
(
end
?
'
flex-end
'
:
'
flex-start
'
)}
;
...
...
src/pages/Swap/index.tsx
View file @
2d118a90
...
@@ -27,6 +27,7 @@ import { useActiveWeb3React } from '../../hooks'
...
@@ -27,6 +27,7 @@ import { useActiveWeb3React } from '../../hooks'
import
{
useCurrency
,
useAllTokens
}
from
'
../../hooks/Tokens
'
import
{
useCurrency
,
useAllTokens
}
from
'
../../hooks/Tokens
'
import
{
ApprovalState
,
useApproveCallbackFromTrade
}
from
'
../../hooks/useApproveCallback
'
import
{
ApprovalState
,
useApproveCallbackFromTrade
}
from
'
../../hooks/useApproveCallback
'
import
useENSAddress
from
'
../../hooks/useENSAddress
'
import
useENSAddress
from
'
../../hooks/useENSAddress
'
import
{
useIsSwapUnsupported
}
from
'
../../hooks/useIsSwapUnsupported
'
import
{
useSwapCallback
}
from
'
../../hooks/useSwapCallback
'
import
{
useSwapCallback
}
from
'
../../hooks/useSwapCallback
'
import
useToggledVersion
,
{
Version
}
from
'
../../hooks/useToggledVersion
'
import
useToggledVersion
,
{
Version
}
from
'
../../hooks/useToggledVersion
'
import
useWrapCallback
,
{
WrapType
}
from
'
../../hooks/useWrapCallback
'
import
useWrapCallback
,
{
WrapType
}
from
'
../../hooks/useWrapCallback
'
...
@@ -45,7 +46,6 @@ import { computeTradePriceBreakdown, warningSeverity } from '../../utils/prices'
...
@@ -45,7 +46,6 @@ import { computeTradePriceBreakdown, warningSeverity } from '../../utils/prices'
import
AppBody
from
'
../AppBody
'
import
AppBody
from
'
../AppBody
'
import
{
ClickableText
}
from
'
../Pool/styleds
'
import
{
ClickableText
}
from
'
../Pool/styleds
'
import
Loader
from
'
../../components/Loader
'
import
Loader
from
'
../../components/Loader
'
import
{
useIsTransactionUnsupported
}
from
'
hooks/Trades
'
import
UnsupportedCurrencyFooter
from
'
components/swap/UnsupportedCurrencyFooter
'
import
UnsupportedCurrencyFooter
from
'
components/swap/UnsupportedCurrencyFooter
'
import
{
RouteComponentProps
}
from
'
react-router-dom
'
import
{
RouteComponentProps
}
from
'
react-router-dom
'
...
@@ -284,7 +284,7 @@ export default function Swap({ history }: RouteComponentProps) {
...
@@ -284,7 +284,7 @@ export default function Swap({ history }: RouteComponentProps) {
onCurrencySelection
,
onCurrencySelection
,
])
])
const
swapIsUnsupported
=
useIs
Transaction
Unsupported
(
currencies
?.
INPUT
,
currencies
?.
OUTPUT
)
const
swapIsUnsupported
=
useIs
Swap
Unsupported
(
currencies
?.
INPUT
,
currencies
?.
OUTPUT
)
return
(
return
(
<>
<>
...
...
src/state/swap/hooks.ts
View file @
2d118a90
...
@@ -7,7 +7,7 @@ import { useCallback, useEffect, useState } from 'react'
...
@@ -7,7 +7,7 @@ import { useCallback, useEffect, useState } from 'react'
import
{
useDispatch
,
useSelector
}
from
'
react-redux
'
import
{
useDispatch
,
useSelector
}
from
'
react-redux
'
import
{
useActiveWeb3React
}
from
'
../../hooks
'
import
{
useActiveWeb3React
}
from
'
../../hooks
'
import
{
useCurrency
}
from
'
../../hooks/Tokens
'
import
{
useCurrency
}
from
'
../../hooks/Tokens
'
import
{
use
TradeExactIn
,
useTradeExactOut
}
from
'
../../hooks/
Trades
'
import
{
use
V2TradeExactIn
,
useV2TradeExactOut
}
from
'
../../hooks/v2
Trades
'
import
useParsedQueryString
from
'
../../hooks/useParsedQueryString
'
import
useParsedQueryString
from
'
../../hooks/useParsedQueryString
'
import
{
isAddress
}
from
'
../../utils
'
import
{
isAddress
}
from
'
../../utils
'
import
{
AppDispatch
,
AppState
}
from
'
../index
'
import
{
AppDispatch
,
AppState
}
from
'
../index
'
...
@@ -135,8 +135,8 @@ export function useDerivedSwapInfo(): {
...
@@ -135,8 +135,8 @@ export function useDerivedSwapInfo(): {
const
isExactIn
:
boolean
=
independentField
===
Field
.
INPUT
const
isExactIn
:
boolean
=
independentField
===
Field
.
INPUT
const
parsedAmount
=
tryParseAmount
(
typedValue
,
(
isExactIn
?
inputCurrency
:
outputCurrency
)
??
undefined
)
const
parsedAmount
=
tryParseAmount
(
typedValue
,
(
isExactIn
?
inputCurrency
:
outputCurrency
)
??
undefined
)
const
bestTradeExactIn
=
useTradeExactIn
(
isExactIn
?
parsedAmount
:
undefined
,
outputCurrency
??
undefined
)
const
bestTradeExactIn
=
use
V2
TradeExactIn
(
isExactIn
?
parsedAmount
:
undefined
,
outputCurrency
??
undefined
)
const
bestTradeExactOut
=
useTradeExactOut
(
inputCurrency
??
undefined
,
!
isExactIn
?
parsedAmount
:
undefined
)
const
bestTradeExactOut
=
use
V2
TradeExactOut
(
inputCurrency
??
undefined
,
!
isExactIn
?
parsedAmount
:
undefined
)
const
v2Trade
=
isExactIn
?
bestTradeExactIn
:
bestTradeExactOut
const
v2Trade
=
isExactIn
?
bestTradeExactIn
:
bestTradeExactOut
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment