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
b6d85123
Commit
b6d85123
authored
Feb 16, 2021
by
Lint Action
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Fix code style issues with ESLint
parent
4e17107a
Changes
166
Hide whitespace changes
Inline
Side-by-side
Showing
166 changed files
with
889 additions
and
885 deletions
+889
-885
swap.test.ts
cypress/integration/swap.test.ts
+16
-6
commands.js
cypress/support/commands.js
+1
-1
index.tsx
src/components/AccountDetails/index.tsx
+4
-4
index.tsx
src/components/AddressInputPanel/index.tsx
+2
-2
index.tsx
src/components/Confetti/index.tsx
+1
-1
index.tsx
src/components/CurrencyInputPanel/index.tsx
+2
-2
index.tsx
src/components/CurrencyLogo/index.tsx
+1
-1
index.tsx
src/components/DoubleLogo/index.tsx
+1
-1
index.tsx
src/components/FormattedCurrencyAmount/index.tsx
+1
-1
index.tsx
src/components/Header/index.tsx
+4
-4
data.ts
src/components/LineChart/data.ts
+1
-1
index.tsx
src/components/LineChart/index.tsx
+14
-14
index.tsx
src/components/ListLogo/index.tsx
+1
-1
index.tsx
src/components/Logo/index.tsx
+2
-2
index.tsx
src/components/Modal/index.tsx
+9
-11
index.tsx
src/components/ModalViews/index.tsx
+1
-1
index.tsx
src/components/NavigationTabs/index.tsx
+1
-1
index.tsx
src/components/NumericalInput/index.tsx
+1
-1
index.tsx
src/components/Popover/index.tsx
+4
-4
ClaimPopup.tsx
src/components/Popups/ClaimPopup.tsx
+1
-1
ListUpdatePopup.tsx
src/components/Popups/ListUpdatePopup.tsx
+2
-2
PopupItem.tsx
src/components/Popups/PopupItem.tsx
+4
-4
TransactionPopup.tsx
src/components/Popups/TransactionPopup.tsx
+1
-1
index.tsx
src/components/Popups/index.tsx
+2
-2
index.tsx
src/components/PositionCard/index.tsx
+2
-2
CommonBases.tsx
src/components/SearchModal/CommonBases.tsx
+1
-1
CurrencyList.tsx
src/components/SearchModal/CurrencyList.tsx
+3
-3
CurrencySearch.tsx
src/components/SearchModal/CurrencySearch.tsx
+3
-3
CurrencySearchModal.tsx
src/components/SearchModal/CurrencySearchModal.tsx
+2
-2
ImportList.tsx
src/components/SearchModal/ImportList.tsx
+3
-3
ImportRow.tsx
src/components/SearchModal/ImportRow.tsx
+1
-1
ImportToken.tsx
src/components/SearchModal/ImportToken.tsx
+2
-2
Manage.tsx
src/components/SearchModal/Manage.tsx
+1
-1
ManageLists.tsx
src/components/SearchModal/ManageLists.tsx
+14
-14
ManageTokens.tsx
src/components/SearchModal/ManageTokens.tsx
+4
-4
SortButton.tsx
src/components/SearchModal/SortButton.tsx
+1
-1
filtering.ts
src/components/SearchModal/filtering.ts
+7
-7
styleds.tsx
src/components/SearchModal/styleds.tsx
+2
-2
index.tsx
src/components/Settings/index.tsx
+1
-1
index.tsx
src/components/Slider/index.tsx
+1
-1
index.tsx
src/components/TokenWarningModal/index.tsx
+1
-1
index.tsx
src/components/TransactionConfirmationModal/index.tsx
+3
-3
index.tsx
src/components/TransactionSettings/index.tsx
+5
-5
Option.tsx
src/components/WalletModal/Option.tsx
+2
-2
PendingView.tsx
src/components/WalletModal/PendingView.tsx
+2
-2
index.tsx
src/components/WalletModal/index.tsx
+7
-7
index.tsx
src/components/Web3Status/index.tsx
+3
-3
AddressClaimModal.tsx
src/components/claim/AddressClaimModal.tsx
+2
-2
ClaimModal.tsx
src/components/claim/ClaimModal.tsx
+1
-1
ClaimRewardModal.tsx
src/components/earn/ClaimRewardModal.tsx
+1
-1
StakingModal.tsx
src/components/earn/StakingModal.tsx
+10
-10
UnstakingModal.tsx
src/components/earn/UnstakingModal.tsx
+1
-1
BetterTradeLink.tsx
src/components/swap/BetterTradeLink.tsx
+4
-4
ConfirmSwapModal.tsx
src/components/swap/ConfirmSwapModal.tsx
+2
-2
SwapModalFooter.tsx
src/components/swap/SwapModalFooter.tsx
+4
-4
SwapModalHeader.tsx
src/components/swap/SwapModalHeader.tsx
+2
-2
UnsupportedCurrencyFooter.tsx
src/components/swap/UnsupportedCurrencyFooter.tsx
+3
-3
DelegateModal.tsx
src/components/vote/DelegateModal.tsx
+1
-1
VoteModal.tsx
src/components/vote/VoteModal.tsx
+2
-2
Fortmatic.ts
src/connectors/Fortmatic.ts
+3
-3
NetworkConnector.ts
src/connectors/NetworkConnector.ts
+6
-6
index.ts
src/connectors/index.ts
+6
-6
index.ts
src/constants/index.ts
+21
-21
lists.ts
src/constants/lists.ts
+1
-1
index.ts
src/constants/multicall/index.ts
+1
-1
index.ts
src/constants/v1/index.ts
+1
-1
Allowances.ts
src/data/Allowances.ts
+1
-1
Reserves.ts
src/data/Reserves.ts
+3
-3
V1.ts
src/data/V1.ts
+5
-5
Tokens.ts
src/hooks/Tokens.ts
+2
-2
Trades.ts
src/hooks/Trades.ts
+4
-4
index.ts
src/hooks/index.ts
+3
-3
useAddTokenToMetamask.ts
src/hooks/useAddTokenToMetamask.ts
+4
-4
useApproveCallback.ts
src/hooks/useApproveCallback.ts
+3
-3
useColor.ts
src/hooks/useColor.ts
+4
-4
useContract.ts
src/hooks/useContract.ts
+1
-1
useCopyClipboard.ts
src/hooks/useCopyClipboard.ts
+1
-1
useENS.ts
src/hooks/useENS.ts
+1
-1
useENSAddress.ts
src/hooks/useENSAddress.ts
+1
-1
useENSContentHash.ts
src/hooks/useENSContentHash.ts
+1
-1
useENSName.ts
src/hooks/useENSName.ts
+1
-1
useFetchListCallback.ts
src/hooks/useFetchListCallback.ts
+2
-2
useLast.ts
src/hooks/useLast.ts
+1
-1
useSwapCallback.ts
src/hooks/useSwapCallback.ts
+17
-17
useToggle.ts
src/hooks/useToggle.ts
+1
-1
useToggledVersion.ts
src/hooks/useToggledVersion.ts
+1
-1
useTransactionDeadline.ts
src/hooks/useTransactionDeadline.ts
+1
-1
useWindowSize.ts
src/hooks/useWindowSize.ts
+1
-1
useWrapCallback.ts
src/hooks/useWrapCallback.ts
+3
-3
i18n.ts
src/i18n.ts
+3
-3
index.tsx
src/index.tsx
+3
-7
ConfirmAddModalBottom.tsx
src/pages/AddLiquidity/ConfirmAddModalBottom.tsx
+1
-1
PoolPriceBar.tsx
src/pages/AddLiquidity/PoolPriceBar.tsx
+1
-1
index.tsx
src/pages/AddLiquidity/index.tsx
+17
-18
redirects.tsx
src/pages/AddLiquidity/redirects.tsx
+4
-4
App.tsx
src/pages/App.tsx
+1
-1
Countdown.tsx
src/pages/Earn/Countdown.tsx
+1
-1
Manage.tsx
src/pages/Earn/Manage.tsx
+2
-2
index.tsx
src/pages/Earn/index.tsx
+2
-2
MigrateV1Exchange.tsx
src/pages/MigrateV1/MigrateV1Exchange.tsx
+15
-7
RemoveV1Exchange.tsx
src/pages/MigrateV1/RemoveV1Exchange.tsx
+5
-5
index.tsx
src/pages/MigrateV1/index.tsx
+4
-6
index.tsx
src/pages/Pool/index.tsx
+10
-10
index.tsx
src/pages/PoolFinder/index.tsx
+1
-1
index.tsx
src/pages/RemoveLiquidity/index.tsx
+29
-30
redirects.tsx
src/pages/RemoveLiquidity/redirects.tsx
+2
-2
index.tsx
src/pages/Swap/index.tsx
+20
-20
redirects.tsx
src/pages/Swap/redirects.tsx
+3
-3
VotePage.tsx
src/pages/Vote/VotePage.tsx
+2
-2
react-app-env.d.ts
src/react-app-env.d.ts
+1
-1
actions.ts
src/state/application/actions.ts
+1
-1
hooks.ts
src/state/application/hooks.ts
+1
-1
reducer.test.ts
src/state/application/reducer.test.ts
+3
-3
reducer.ts
src/state/application/reducer.ts
+6
-6
updater.ts
src/state/application/updater.ts
+3
-3
actions.ts
src/state/burn/actions.ts
+1
-1
hooks.ts
src/state/burn/hooks.ts
+5
-5
reducer.ts
src/state/burn/reducer.ts
+3
-3
hooks.ts
src/state/claim/hooks.ts
+8
-8
hooks.ts
src/state/governance/hooks.ts
+9
-9
index.ts
src/state/index.ts
+2
-2
actions.ts
src/state/lists/actions.ts
+1
-1
hooks.ts
src/state/lists/hooks.ts
+10
-10
reducer.test.ts
src/state/lists/reducer.test.ts
+91
-91
reducer.ts
src/state/lists/reducer.ts
+14
-14
updater.ts
src/state/lists/updater.ts
+5
-5
actions.ts
src/state/mint/actions.ts
+1
-1
hooks.ts
src/state/mint/hooks.ts
+8
-8
reducer.test.ts
src/state/mint/reducer.test.ts
+1
-1
reducer.ts
src/state/mint/reducer.ts
+5
-5
actions.test.ts
src/state/multicall/actions.test.ts
+5
-5
actions.ts
src/state/multicall/actions.ts
+1
-1
hooks.ts
src/state/multicall/hooks.ts
+18
-20
reducer.test.ts
src/state/multicall/reducer.test.ts
+68
-68
reducer.ts
src/state/multicall/reducer.ts
+10
-10
updater.test.ts
src/state/multicall/updater.test.ts
+27
-27
updater.tsx
src/state/multicall/updater.tsx
+13
-15
hooks.ts
src/state/stake/hooks.ts
+11
-11
actions.ts
src/state/swap/actions.ts
+1
-1
hooks.test.ts
src/state/swap/hooks.test.ts
+8
-8
hooks.ts
src/state/swap/hooks.ts
+16
-16
reducer.test.ts
src/state/swap/reducer.test.ts
+3
-3
reducer.ts
src/state/swap/reducer.ts
+12
-12
hooks.tsx
src/state/transactions/hooks.tsx
+4
-4
reducer.test.ts
src/state/transactions/reducer.test.ts
+15
-15
reducer.ts
src/state/transactions/reducer.ts
+2
-2
updater.tsx
src/state/transactions/updater.tsx
+9
-9
hooks.tsx
src/state/user/hooks.tsx
+14
-14
reducer.test.ts
src/state/user/reducer.test.ts
+1
-1
reducer.ts
src/state/user/reducer.ts
+5
-5
hooks.ts
src/state/wallet/hooks.ts
+7
-7
DarkModeQueryParamReader.tsx
src/theme/DarkModeQueryParamReader.tsx
+1
-1
components.tsx
src/theme/components.tsx
+1
-1
index.tsx
src/theme/index.tsx
+6
-6
chunkArray.test.ts
src/utils/chunkArray.test.ts
+3
-3
chunkArray.ts
src/utils/chunkArray.ts
+1
-1
index.test.ts
src/utils/index.test.ts
+5
-5
index.ts
src/utils/index.ts
+2
-2
prices.test.ts
src/utils/prices.test.ts
+1
-1
prices.ts
src/utils/prices.ts
+1
-1
resolveENSContentHash.ts
src/utils/resolveENSContentHash.ts
+12
-12
retry.ts
src/utils/retry.ts
+2
-2
uriToHttp.test.ts
src/utils/uriToHttp.test.ts
+2
-2
useUSDCPrice.ts
src/utils/useUSDCPrice.ts
+2
-2
v1SwapArgument.test.ts
src/utils/v1SwapArgument.test.ts
+6
-6
v1SwapArguments.ts
src/utils/v1SwapArguments.ts
+7
-7
No files found.
cypress/integration/swap.test.ts
View file @
b6d85123
...
...
@@ -3,23 +3,33 @@ describe('Swap', () => {
cy
.
visit
(
'
/swap
'
)
})
it
(
'
can enter an amount into input
'
,
()
=>
{
cy
.
get
(
'
#swap-currency-input .token-amount-input
'
).
type
(
'
0.001
'
,
{
delay
:
200
}).
should
(
'
have.value
'
,
'
0.001
'
)
cy
.
get
(
'
#swap-currency-input .token-amount-input
'
)
.
type
(
'
0.001
'
,
{
delay
:
200
})
.
should
(
'
have.value
'
,
'
0.001
'
)
})
it
(
'
zero swap amount
'
,
()
=>
{
cy
.
get
(
'
#swap-currency-input .token-amount-input
'
).
type
(
'
0.0
'
,
{
delay
:
200
}).
should
(
'
have.value
'
,
'
0.0
'
)
cy
.
get
(
'
#swap-currency-input .token-amount-input
'
)
.
type
(
'
0.0
'
,
{
delay
:
200
})
.
should
(
'
have.value
'
,
'
0.0
'
)
})
it
(
'
invalid swap amount
'
,
()
=>
{
cy
.
get
(
'
#swap-currency-input .token-amount-input
'
).
type
(
'
\\
'
,
{
delay
:
200
}).
should
(
'
have.value
'
,
''
)
cy
.
get
(
'
#swap-currency-input .token-amount-input
'
)
.
type
(
'
\\
'
,
{
delay
:
200
})
.
should
(
'
have.value
'
,
''
)
})
it
(
'
can enter an amount into output
'
,
()
=>
{
cy
.
get
(
'
#swap-currency-output .token-amount-input
'
).
type
(
'
0.001
'
,
{
delay
:
200
}).
should
(
'
have.value
'
,
'
0.001
'
)
cy
.
get
(
'
#swap-currency-output .token-amount-input
'
)
.
type
(
'
0.001
'
,
{
delay
:
200
})
.
should
(
'
have.value
'
,
'
0.001
'
)
})
it
(
'
zero output amount
'
,
()
=>
{
cy
.
get
(
'
#swap-currency-output .token-amount-input
'
).
type
(
'
0.0
'
,
{
delay
:
200
}).
should
(
'
have.value
'
,
'
0.0
'
)
cy
.
get
(
'
#swap-currency-output .token-amount-input
'
)
.
type
(
'
0.0
'
,
{
delay
:
200
})
.
should
(
'
have.value
'
,
'
0.0
'
)
})
it
(
'
can swap ETH for DAI
'
,
()
=>
{
...
...
@@ -39,7 +49,7 @@ describe('Swap', () => {
describe
(
'
expert mode
'
,
()
=>
{
beforeEach
(()
=>
{
cy
.
window
().
then
(
(
win
)
=>
{
cy
.
window
().
then
(
win
=>
{
cy
.
stub
(
win
,
'
prompt
'
).
returns
(
'
confirm
'
)
})
cy
.
get
(
'
#open-settings-dialog-button
'
).
click
()
...
...
cypress/support/commands.js
View file @
b6d85123
...
...
@@ -77,6 +77,6 @@ Cypress.Commands.overwrite('visit', (original, url, options) => {
const
provider
=
new
JsonRpcProvider
(
'
https://rinkeby.infura.io/v3/4bf032f2d38a4ed6bb975b80d6340847
'
,
4
)
const
signer
=
new
Wallet
(
PRIVATE_KEY_TEST_NEVER_USE
,
provider
)
win
.
ethereum
=
new
CustomizedBridge
(
signer
,
provider
)
}
,
}
})
})
src/components/AccountDetails/index.tsx
View file @
b6d85123
...
...
@@ -26,7 +26,7 @@ const HeaderRow = styled.div`
${({
theme
})
=>
theme
.
flexRowNoWrap
}
;
padding: 1rem 1rem;
font-weight: 500;
color:
${
(
props
)
=>
(
props
.
color
===
'
blue
'
?
({
theme
})
=>
theme
.
primary1
:
'
inherit
'
)}
;
color:
${
props
=>
(
props
.
color
===
'
blue
'
?
({
theme
})
=>
theme
.
primary1
:
'
inherit
'
)}
;
${({
theme
})
=>
theme
.
mediaWidth
.
upToMedium
`
padding: 1rem;
`
}
;
...
...
@@ -223,7 +223,7 @@ export default function AccountDetails({
pendingTransactions
,
confirmedTransactions
,
ENSName
,
openOptions
,
openOptions
}:
AccountDetailsProps
)
{
const
{
chainId
,
account
,
connector
}
=
useActiveWeb3React
()
const
theme
=
useContext
(
ThemeContext
)
...
...
@@ -234,10 +234,10 @@ export default function AccountDetails({
const
isMetaMask
=
!!
(
ethereum
&&
ethereum
.
isMetaMask
)
const
name
=
Object
.
keys
(
SUPPORTED_WALLETS
)
.
filter
(
(
k
)
=>
k
=>
SUPPORTED_WALLETS
[
k
].
connector
===
connector
&&
(
connector
!==
injected
||
isMetaMask
===
(
k
===
'
METAMASK
'
))
)
.
map
(
(
k
)
=>
SUPPORTED_WALLETS
[
k
].
name
)[
0
]
.
map
(
k
=>
SUPPORTED_WALLETS
[
k
].
name
)[
0
]
return
<
WalletName
>
Connected with
{
name
}
</
WalletName
>
}
...
...
src/components/AddressInputPanel/index.tsx
View file @
b6d85123
...
...
@@ -68,7 +68,7 @@ const Input = styled.input<{ error?: boolean }>`
export
default
function
AddressInputPanel
({
id
,
value
,
onChange
,
onChange
}:
{
id
?:
string
// the typed string value
...
...
@@ -82,7 +82,7 @@ export default function AddressInputPanel({
const
{
address
,
loading
,
name
}
=
useENS
(
value
)
const
handleInput
=
useCallback
(
(
event
)
=>
{
event
=>
{
const
input
=
event
.
target
.
value
const
withoutSpaces
=
input
.
replace
(
/
\s
+/g
,
''
)
onChange
(
withoutSpaces
)
...
...
src/components/Confetti/index.tsx
View file @
b6d85123
...
...
@@ -20,7 +20,7 @@ export default function Confetti({ start, variant }: { start: boolean; variant?:
h
:
height
,
w
:
width
,
x
:
0
,
y
:
_variant
===
'
top
'
?
height
*
0.25
:
_variant
===
'
bottom
'
?
height
*
0.75
:
height
*
0.5
,
y
:
_variant
===
'
top
'
?
height
*
0.25
:
_variant
===
'
bottom
'
?
height
*
0.75
:
height
*
0.5
}
}
initialVelocityX=
{
15
}
initialVelocityY=
{
30
}
...
...
src/components/CurrencyInputPanel/index.tsx
View file @
b6d85123
...
...
@@ -147,7 +147,7 @@ export default function CurrencyInputPanel({
otherCurrency
,
id
,
showCommonBases
,
customBalanceText
,
customBalanceText
}:
CurrencyInputPanelProps
)
{
const
{
t
}
=
useTranslation
()
...
...
@@ -191,7 +191,7 @@ export default function CurrencyInputPanel({
<
NumericalInput
className=
"token-amount-input"
value=
{
value
}
onUserInput=
{
(
val
)
=>
{
onUserInput=
{
val
=>
{
onUserInput
(
val
)
}
}
/>
...
...
src/components/CurrencyLogo/index.tsx
View file @
b6d85123
...
...
@@ -28,7 +28,7 @@ const StyledLogo = styled(Logo)<{ size: string }>`
export
default
function
CurrencyLogo
({
currency
,
size
=
'
24px
'
,
style
,
style
}:
{
currency
?:
Currency
size
?:
string
...
...
src/components/DoubleLogo/index.tsx
View file @
b6d85123
...
...
@@ -29,7 +29,7 @@ export default function DoubleCurrencyLogo({
currency0
,
currency1
,
size
=
16
,
margin
=
false
,
margin
=
false
}:
DoubleCurrencyLogoProps
)
{
return
(
<
Wrapper
sizeraw=
{
size
}
margin=
{
margin
}
>
...
...
src/components/FormattedCurrencyAmount/index.tsx
View file @
b6d85123
...
...
@@ -5,7 +5,7 @@ const CURRENCY_AMOUNT_MIN = new Fraction(JSBI.BigInt(1), JSBI.BigInt(1000000))
export
default
function
FormattedCurrencyAmount
({
currencyAmount
,
significantDigits
=
4
,
significantDigits
=
4
}:
{
currencyAmount
:
CurrencyAmount
significantDigits
?:
number
...
...
src/components/Header/index.tsx
View file @
b6d85123
...
...
@@ -201,7 +201,7 @@ const UniIcon = styled.div`
const
activeClassName
=
'
ACTIVE
'
const
StyledNavLink
=
styled
(
NavLink
).
attrs
({
activeClassName
,
activeClassName
})
`
${({
theme
})
=>
theme
.
flexRowNoWrap
}
align-items: left;
...
...
@@ -228,7 +228,7 @@ const StyledNavLink = styled(NavLink).attrs({
`
const
StyledExternalLink
=
styled
(
ExternalLink
).
attrs
({
activeClassName
,
activeClassName
})
<
{
isActive
?:
boolean
}
>
`
${({
theme
})
=>
theme
.
flexRowNoWrap
}
align-items: left;
...
...
@@ -291,7 +291,7 @@ const NETWORK_LABELS: { [chainId in ChainId]?: string } = {
[
ChainId
.
RINKEBY
]:
'
Rinkeby
'
,
[
ChainId
.
ROPSTEN
]:
'
Ropsten
'
,
[
ChainId
.
G
Ö
RLI
]:
'
Görli
'
,
[
ChainId
.
KOVAN
]:
'
Kovan
'
,
[
ChainId
.
KOVAN
]:
'
Kovan
'
}
export
default
function
Header
()
{
...
...
@@ -380,7 +380,7 @@ export default function Header() {
<
HideSmall
>
<
TYPE
.
white
style=
{
{
paddingRight
:
'
.4rem
'
,
paddingRight
:
'
.4rem
'
}
}
>
<
CountUp
...
...
src/components/LineChart/data.ts
View file @
b6d85123
...
...
@@ -148,5 +148,5 @@ export const dummyData = [
{
time
:
'
2019-05-22
'
,
value
:
43.3
},
{
time
:
'
2019-05-23
'
,
value
:
42.73
},
{
time
:
'
2019-05-24
'
,
value
:
42.67
},
{
time
:
'
2019-05-28
'
,
value
:
42.75
}
,
{
time
:
'
2019-05-28
'
,
value
:
42.75
}
]
src/components/LineChart/index.tsx
View file @
b6d85123
...
...
@@ -78,28 +78,28 @@ const LineChart = ({
layout
:
{
backgroundColor
:
'
transparent
'
,
textColor
:
textColor
,
fontFamily
:
'
Inter
'
,
fontFamily
:
'
Inter
'
},
rightPriceScale
:
{
scaleMargins
:
{
top
:
0.1
,
bottom
:
0.1
,
bottom
:
0.1
},
borderVisible
:
false
,
borderVisible
:
false
},
timeScale
:
{
borderVisible
:
false
,
borderVisible
:
false
},
watermark
:
{
color
:
'
rgba(0, 0, 0, 0)
'
,
color
:
'
rgba(0, 0, 0, 0)
'
},
grid
:
{
horzLines
:
{
visible
:
false
,
visible
:
false
},
vertLines
:
{
visible
:
false
,
}
,
visible
:
false
}
},
crosshair
:
{
horzLine
:
{
...
...
@@ -107,16 +107,16 @@ const LineChart = ({
style
:
3
,
width
:
1
,
color
:
'
#505050
'
,
labelBackgroundColor
:
color
,
labelBackgroundColor
:
color
},
vertLine
:
{
visible
:
true
,
style
:
3
,
width
:
1
,
color
:
'
#505050
'
,
labelBackgroundColor
:
color
,
}
,
}
,
labelBackgroundColor
:
color
}
}
})
const
series
=
chart
.
addAreaSeries
({
...
...
@@ -124,13 +124,13 @@ const LineChart = ({
topColor
:
darken
(
0.4
,
color
),
bottomColor
:
theme
.
bg1
,
lineWidth
:
2
,
priceLineVisible
:
false
,
priceLineVisible
:
false
})
series
.
setData
(
data
)
// update the title when hovering on the chart
chart
.
subscribeCrosshairMove
(
function
(
param
)
{
chart
.
subscribeCrosshairMove
(
function
(
param
)
{
if
(
chartRef
?.
current
&&
(
param
===
undefined
||
...
...
src/components/ListLogo/index.tsx
View file @
b6d85123
...
...
@@ -13,7 +13,7 @@ export default function ListLogo({
logoURI
,
style
,
size
=
'
24px
'
,
alt
,
alt
}:
{
logoURI
:
string
size
?:
string
...
...
src/components/Logo/index.tsx
View file @
b6d85123
...
...
@@ -14,7 +14,7 @@ export interface LogoProps extends Pick<ImageProps, 'style' | 'alt' | 'className
export
default
function
Logo
({
srcs
,
alt
,
...
rest
}:
LogoProps
)
{
const
[,
refresh
]
=
useState
<
number
>
(
0
)
const
src
:
string
|
undefined
=
srcs
.
find
(
(
src
)
=>
!
BAD_SRCS
[
src
])
const
src
:
string
|
undefined
=
srcs
.
find
(
src
=>
!
BAD_SRCS
[
src
])
if
(
src
)
{
return
(
...
...
@@ -24,7 +24,7 @@ export default function Logo({ srcs, alt, ...rest }: LogoProps) {
src=
{
src
}
onError=
{
()
=>
{
if
(
src
)
BAD_SRCS
[
src
]
=
true
refresh
(
(
i
)
=>
i
+
1
)
refresh
(
i
=>
i
+
1
)
}
}
/>
)
...
...
src/components/Modal/index.tsx
View file @
b6d85123
...
...
@@ -29,7 +29,7 @@ const AnimatedDialogContent = animated(DialogContent)
const
StyledDialogContent
=
styled
(({
minHeight
,
maxHeight
,
mobile
,
isOpen
,
...
rest
})
=>
(
<
AnimatedDialogContent
{
...
rest
}
/>
)).
attrs
({
'
aria-label
'
:
'
dialog
'
,
'
aria-label
'
:
'
dialog
'
})
`
overflow-y:
${({
mobile
})
=>
(
mobile
?
'
scroll
'
:
'
hidden
'
)}
;
...
...
@@ -63,15 +63,13 @@ const StyledDialogContent = styled(({ minHeight, maxHeight, mobile, isOpen, ...r
`
}
${({
theme
,
mobile
})
=>
theme
.
mediaWidth
.
upToSmall
`
width: 85vw;
${
mobile
&&
${
mobile
&&
css
`
width: 100vw;
border-radius: 20px;
border-bottom-left-radius: 0;
border-bottom-right-radius: 0;
`
}
`
}
`
}
}
`
...
...
@@ -91,25 +89,25 @@ export default function Modal({
minHeight
=
false
,
maxHeight
=
90
,
initialFocusRef
,
children
,
children
}:
ModalProps
)
{
const
fadeTransition
=
useTransition
(
isOpen
,
null
,
{
config
:
{
duration
:
200
},
from
:
{
opacity
:
0
},
enter
:
{
opacity
:
1
},
leave
:
{
opacity
:
0
}
,
leave
:
{
opacity
:
0
}
})
const
[{
y
},
set
]
=
useSpring
(()
=>
({
y
:
0
,
config
:
{
mass
:
1
,
tension
:
210
,
friction
:
20
}
}))
const
bind
=
useGesture
({
onDrag
:
(
state
)
=>
{
onDrag
:
state
=>
{
set
({
y
:
state
.
down
?
state
.
movement
[
1
]
:
0
,
y
:
state
.
down
?
state
.
movement
[
1
]
:
0
})
if
(
state
.
movement
[
1
]
>
300
||
(
state
.
velocity
>
3
&&
state
.
direction
[
1
]
>
0
))
{
onDismiss
()
}
}
,
}
})
return
(
...
...
@@ -122,7 +120,7 @@ export default function Modal({
{
...
(
isMobile
?
{
...
bind
(),
style
:
{
transform
:
y
.
interpolate
(
(
y
)
=
>
`translateY($
{
y
>
0
?
y
:
0
}
px)`) },
style
:
{
transform
:
y
.
interpolate
(
y
=
>
`translateY($
{
y
>
0
?
y
:
0
}
px)`) }
}
:
{}
)}
aria-label="dialog content"
...
...
src/components/ModalViews/index.tsx
View file @
b6d85123
...
...
@@ -41,7 +41,7 @@ export function LoadingView({ children, onDismiss }: { children: any; onDismiss:
export
function
SubmittedView
({
children
,
onDismiss
,
hash
,
hash
}:
{
children
:
any
onDismiss
:
()
=>
void
...
...
src/components/NavigationTabs/index.tsx
View file @
b6d85123
...
...
@@ -22,7 +22,7 @@ const Tabs = styled.div`
const
activeClassName
=
'
ACTIVE
'
const
StyledNavLink
=
styled
(
NavLink
).
attrs
({
activeClassName
,
activeClassName
})
`
${({
theme
})
=>
theme
.
flexRowNoWrap
}
align-items: center;
...
...
src/components/NumericalInput/index.tsx
View file @
b6d85123
...
...
@@ -61,7 +61,7 @@ export const Input = React.memo(function InnerInput({
<
StyledInput
{
...
rest
}
value=
{
value
}
onChange=
{
(
event
)
=>
{
onChange=
{
event
=>
{
// replace commas with periods, because uniswap exclusively uses period as the decimal separator
enforcer
(
event
.
target
.
value
.
replace
(
/,/g
,
'
.
'
))
}
}
...
...
src/components/Popover/index.tsx
View file @
b6d85123
...
...
@@ -9,8 +9,8 @@ import Portal from '@reach/portal'
const
PopoverContainer
=
styled
.
div
<
{
show
:
boolean
}
>
`
z-index: 9999;
visibility:
${
(
props
)
=>
(
props
.
show
?
'
visible
'
:
'
hidden
'
)}
;
opacity:
${
(
props
)
=>
(
props
.
show
?
1
:
0
)}
;
visibility:
${
props
=>
(
props
.
show
?
'
visible
'
:
'
hidden
'
)}
;
opacity:
${
props
=>
(
props
.
show
?
1
:
0
)}
;
transition: visibility 150ms linear, opacity 150ms linear;
background:
${({
theme
})
=>
theme
.
bg2
}
;
...
...
@@ -91,8 +91,8 @@ export default function Popover({ content, show, children, placement = 'auto' }:
strategy
:
'
fixed
'
,
modifiers
:
[
{
name
:
'
offset
'
,
options
:
{
offset
:
[
8
,
8
]
}
},
{
name
:
'
arrow
'
,
options
:
{
element
:
arrowElement
}
}
,
]
,
{
name
:
'
arrow
'
,
options
:
{
element
:
arrowElement
}
}
]
})
const
updateCallback
=
useCallback
(()
=>
{
update
&&
update
()
...
...
src/components/Popups/ClaimPopup.tsx
View file @
b6d85123
...
...
@@ -10,7 +10,7 @@ import {
useModalOpen
,
useShowClaimPopup
,
useToggleSelfClaimModal
,
useToggleShowClaimPopup
,
useToggleShowClaimPopup
}
from
'
../../state/application/hooks
'
import
{
useUserHasAvailableClaim
,
useUserUnclaimedAmount
}
from
'
../../state/claim/hooks
'
...
...
src/components/Popups/ListUpdatePopup.tsx
View file @
b6d85123
...
...
@@ -23,7 +23,7 @@ export default function ListUpdatePopup({
listUrl
,
oldList
,
newList
,
auto
,
auto
}:
{
popKey
:
string
listUrl
:
string
...
...
@@ -40,7 +40,7 @@ export default function ListUpdatePopup({
ReactGA
.
event
({
category
:
'
Lists
'
,
action
:
'
Update List from Popup
'
,
label
:
listUrl
,
label
:
listUrl
})
dispatch
(
acceptListUpdate
(
listUrl
))
removeThisPopup
()
...
...
src/components/Popups/PopupItem.tsx
View file @
b6d85123
...
...
@@ -49,7 +49,7 @@ const AnimatedFader = animated(Fader)
export
default
function
PopupItem
({
removeAfterMs
,
content
,
popKey
,
popKey
}:
{
removeAfterMs
:
number
|
null
content
:
PopupContent
...
...
@@ -74,12 +74,12 @@ export default function PopupItem({
let
popupContent
if
(
'
txn
'
in
content
)
{
const
{
txn
:
{
hash
,
success
,
summary
}
,
txn
:
{
hash
,
success
,
summary
}
}
=
content
popupContent
=
<
TransactionPopup
hash=
{
hash
}
success=
{
success
}
summary=
{
summary
}
/>
}
else
if
(
'
listUpdate
'
in
content
)
{
const
{
listUpdate
:
{
listUrl
,
oldList
,
newList
,
auto
}
,
listUpdate
:
{
listUrl
,
oldList
,
newList
,
auto
}
}
=
content
popupContent
=
<
ListUpdatePopup
popKey=
{
popKey
}
listUrl=
{
listUrl
}
oldList=
{
oldList
}
newList=
{
newList
}
auto=
{
auto
}
/>
}
...
...
@@ -87,7 +87,7 @@ export default function PopupItem({
const
faderStyle
=
useSpring
({
from
:
{
width
:
'
100%
'
},
to
:
{
width
:
'
0%
'
},
config
:
{
duration
:
removeAfterMs
??
undefined
}
,
config
:
{
duration
:
removeAfterMs
??
undefined
}
})
return
(
...
...
src/components/Popups/TransactionPopup.tsx
View file @
b6d85123
...
...
@@ -15,7 +15,7 @@ const RowNoFlex = styled(AutoRow)`
export
default
function
TransactionPopup
({
hash
,
success
,
summary
,
summary
}:
{
hash
:
string
success
?:
boolean
...
...
src/components/Popups/index.tsx
View file @
b6d85123
...
...
@@ -54,7 +54,7 @@ export default function Popups() {
<>
<
FixedPopupColumn
gap=
"20px"
extraPadding=
{
urlWarningActive
}
>
<
ClaimPopup
/>
{
activePopups
.
map
(
(
item
)
=>
(
{
activePopups
.
map
(
item
=>
(
<
PopupItem
key=
{
item
.
key
}
content=
{
item
.
content
}
popKey=
{
item
.
key
}
removeAfterMs=
{
item
.
removeAfterMs
}
/>
))
}
</
FixedPopupColumn
>
...
...
@@ -63,7 +63,7 @@ export default function Popups() {
{
activePopups
// reverse so new items up front
.
slice
(
0
)
.
reverse
()
.
map
(
(
item
)
=>
(
.
map
(
item
=>
(
<
PopupItem
key=
{
item
.
key
}
content=
{
item
.
content
}
popKey=
{
item
.
key
}
removeAfterMs=
{
item
.
removeAfterMs
}
/>
))
}
</
MobilePopupInner
>
...
...
src/components/PositionCard/index.tsx
View file @
b6d85123
...
...
@@ -75,7 +75,7 @@ export function MinimalPositionCard({ pair, showUnwrapped = false, border }: Pos
JSBI
.
greaterThanOrEqual
(
totalPoolTokens
.
raw
,
userPoolBalance
.
raw
)
?
[
pair
.
getLiquidityValue
(
pair
.
token0
,
totalPoolTokens
,
userPoolBalance
,
false
),
pair
.
getLiquidityValue
(
pair
.
token1
,
totalPoolTokens
,
userPoolBalance
,
false
)
,
pair
.
getLiquidityValue
(
pair
.
token1
,
totalPoolTokens
,
userPoolBalance
,
false
)
]
:
[
undefined
,
undefined
]
...
...
@@ -186,7 +186,7 @@ export default function FullPositionCard({ pair, border, stakedBalance }: Positi
JSBI
.
greaterThanOrEqual
(
totalPoolTokens
.
raw
,
userPoolBalance
.
raw
)
?
[
pair
.
getLiquidityValue
(
pair
.
token0
,
totalPoolTokens
,
userPoolBalance
,
false
),
pair
.
getLiquidityValue
(
pair
.
token1
,
totalPoolTokens
,
userPoolBalance
,
false
)
,
pair
.
getLiquidityValue
(
pair
.
token1
,
totalPoolTokens
,
userPoolBalance
,
false
)
]
:
[
undefined
,
undefined
]
...
...
src/components/SearchModal/CommonBases.tsx
View file @
b6d85123
...
...
@@ -28,7 +28,7 @@ const BaseWrapper = styled.div<{ disable?: boolean }>`
export
default
function
CommonBases
({
chainId
,
onSelect
,
selectedCurrency
,
selectedCurrency
}:
{
chainId
?:
ChainId
selectedCurrency
?:
Currency
|
null
...
...
src/components/SearchModal/CurrencyList.tsx
View file @
b6d85123
...
...
@@ -102,7 +102,7 @@ function CurrencyRow({
onSelect
,
isSelected
,
otherSelected
,
style
,
style
}:
{
currency
:
Currency
onSelect
:
()
=>
void
...
...
@@ -153,7 +153,7 @@ export default function CurrencyList({
showETH
,
showImportView
,
setImportToken
,
breakIndex
,
breakIndex
}:
{
height
:
number
currencies
:
Currency
[]
...
...
@@ -241,7 +241,7 @@ export default function CurrencyList({
setImportToken
,
showImportView
,
breakIndex
,
theme
.
text1
,
theme
.
text1
]
)
...
...
src/components/SearchModal/CurrencySearch.tsx
View file @
b6d85123
...
...
@@ -61,7 +61,7 @@ export function CurrencySearch({
isOpen
,
showManageView
,
showImportView
,
setImportToken
,
setImportToken
}:
CurrencySearchProps
)
{
const
{
t
}
=
useTranslation
()
const
{
chainId
}
=
useActiveWeb3React
()
...
...
@@ -87,7 +87,7 @@ export function CurrencySearch({
ReactGA
.
event
({
category
:
'
Currency Select
'
,
action
:
'
Search by address
'
,
label
:
isAddressSearch
,
label
:
isAddressSearch
})
}
},
[
isAddressSearch
])
...
...
@@ -124,7 +124,7 @@ export function CurrencySearch({
// manage focus on modal show
const
inputRef
=
useRef
<
HTMLInputElement
>
()
const
handleInput
=
useCallback
(
(
event
)
=>
{
const
handleInput
=
useCallback
(
event
=>
{
const
input
=
event
.
target
.
value
const
checksummedInput
=
isAddress
(
input
)
setSearchQuery
(
checksummedInput
||
input
)
...
...
src/components/SearchModal/CurrencySearchModal.tsx
View file @
b6d85123
...
...
@@ -22,7 +22,7 @@ export enum CurrencyModalView {
search
,
manage
,
importToken
,
importList
,
importList
}
export
default
function
CurrencySearchModal
({
...
...
@@ -31,7 +31,7 @@ export default function CurrencySearchModal({
onCurrencySelect
,
selectedCurrency
,
otherSelectedCurrency
,
showCommonBases
=
false
,
showCommonBases
=
false
}:
CurrencySearchModalProps
)
{
const
[
modalView
,
setModalView
]
=
useState
<
CurrencyModalView
>
(
CurrencyModalView
.
manage
)
const
lastOpen
=
useLast
(
isOpen
)
...
...
src/components/SearchModal/ImportList.tsx
View file @
b6d85123
...
...
@@ -56,7 +56,7 @@ export function ImportList({ listURL, list, setModalView, onDismiss }: ImportPro
ReactGA
.
event
({
category
:
'
Lists
'
,
action
:
'
Add List
'
,
label
:
listURL
,
label
:
listURL
})
// turn list on
...
...
@@ -64,11 +64,11 @@ export function ImportList({ listURL, list, setModalView, onDismiss }: ImportPro
// go back to lists
setModalView
(
CurrencyModalView
.
manage
)
})
.
catch
(
(
error
)
=>
{
.
catch
(
error
=>
{
ReactGA
.
event
({
category
:
'
Lists
'
,
action
:
'
Add List Failed
'
,
label
:
listURL
,
label
:
listURL
})
setAddError
(
error
.
message
)
dispatch
(
removeList
(
listURL
))
...
...
src/components/SearchModal/ImportRow.tsx
View file @
b6d85123
...
...
@@ -45,7 +45,7 @@ export default function ImportRow({
style
,
dim
,
showImportView
,
setImportToken
,
setImportToken
}:
{
token
:
Token
style
?:
CSSProperties
...
...
src/components/SearchModal/ImportToken.tsx
View file @
b6d85123
...
...
@@ -74,7 +74,7 @@ export function ImportToken({ tokens, onBack, onDismiss, handleCurrencySelect }:
</
PaddedColumn
>
<
SectionBreak
/>
<
PaddedColumn
gap=
"md"
>
{
tokens
.
map
(
(
token
)
=>
{
{
tokens
.
map
(
token
=>
{
const
list
=
chainId
&&
inactiveTokenList
?.[
chainId
]?.[
token
.
address
]?.
list
return
(
<
Card
backgroundColor=
{
theme
.
bg2
}
key=
{
'
import
'
+
token
.
address
}
className=
".token-warning-container"
>
...
...
@@ -151,7 +151,7 @@ export function ImportToken({ tokens, onBack, onDismiss, handleCurrencySelect }:
borderRadius=
"20px"
padding=
"10px 1rem"
onClick=
{
()
=>
{
tokens
.
map
(
(
token
)
=>
addToken
(
token
))
tokens
.
map
(
token
=>
addToken
(
token
))
handleCurrencySelect
&&
handleCurrencySelect
(
tokens
[
0
])
}
}
className=
".token-dismiss-button"
...
...
src/components/SearchModal/Manage.tsx
View file @
b6d85123
...
...
@@ -46,7 +46,7 @@ export default function Manage({
setModalView
,
setImportList
,
setImportToken
,
setListUrl
,
setListUrl
}:
{
onDismiss
:
()
=>
void
setModalView
:
(
view
:
CurrencyModalView
)
=>
void
...
...
src/components/SearchModal/ManageLists.tsx
View file @
b6d85123
...
...
@@ -42,8 +42,8 @@ const UnpaddedLinkStyledButton = styled(LinkStyledButton)`
const
PopoverContainer
=
styled
.
div
<
{
show
:
boolean
}
>
`
z-index: 100;
visibility:
${
(
props
)
=>
(
props
.
show
?
'
visible
'
:
'
hidden
'
)}
;
opacity:
${
(
props
)
=>
(
props
.
show
?
1
:
0
)}
;
visibility:
${
props
=>
(
props
.
show
?
'
visible
'
:
'
hidden
'
)}
;
opacity:
${
props
=>
(
props
.
show
?
1
:
0
)}
;
transition: visibility 150ms linear, opacity 150ms linear;
background:
${({
theme
})
=>
theme
.
bg2
}
;
border: 1px solid
${({
theme
})
=>
theme
.
bg3
}
;
...
...
@@ -93,7 +93,7 @@ function listUrlRowHTMLId(listUrl: string) {
}
const
ListRow
=
memo
(
function
ListRow
({
listUrl
}:
{
listUrl
:
string
})
{
const
listsByUrl
=
useSelector
<
AppState
,
AppState
[
'
lists
'
][
'
byUrl
'
]
>
(
(
state
)
=>
state
.
lists
.
byUrl
)
const
listsByUrl
=
useSelector
<
AppState
,
AppState
[
'
lists
'
][
'
byUrl
'
]
>
(
state
=>
state
.
lists
.
byUrl
)
const
dispatch
=
useDispatch
<
AppDispatch
>
()
const
{
current
:
list
,
pendingUpdate
:
pending
}
=
listsByUrl
[
listUrl
]
...
...
@@ -109,7 +109,7 @@ const ListRow = memo(function ListRow({ listUrl }: { listUrl: string }) {
const
{
styles
,
attributes
}
=
usePopper
(
referenceElement
,
popperElement
,
{
placement
:
'
auto
'
,
strategy
:
'
fixed
'
,
modifiers
:
[{
name
:
'
offset
'
,
options
:
{
offset
:
[
8
,
8
]
}
}]
,
modifiers
:
[{
name
:
'
offset
'
,
options
:
{
offset
:
[
8
,
8
]
}
}]
})
useOnClickOutside
(
node
,
open
?
toggle
:
undefined
)
...
...
@@ -119,7 +119,7 @@ const ListRow = memo(function ListRow({ listUrl }: { listUrl: string }) {
ReactGA
.
event
({
category
:
'
Lists
'
,
action
:
'
Update List from List Select
'
,
label
:
listUrl
,
label
:
listUrl
})
dispatch
(
acceptListUpdate
(
listUrl
))
},
[
dispatch
,
listUrl
,
pending
])
...
...
@@ -128,13 +128,13 @@ const ListRow = memo(function ListRow({ listUrl }: { listUrl: string }) {
ReactGA
.
event
({
category
:
'
Lists
'
,
action
:
'
Start Remove List
'
,
label
:
listUrl
,
label
:
listUrl
})
if
(
window
.
prompt
(
`Please confirm you would like to remove this list by typing REMOVE`
)
===
`REMOVE`
)
{
ReactGA
.
event
({
category
:
'
Lists
'
,
action
:
'
Confirm Remove List
'
,
label
:
listUrl
,
label
:
listUrl
})
dispatch
(
removeList
(
listUrl
))
}
...
...
@@ -144,7 +144,7 @@ const ListRow = memo(function ListRow({ listUrl }: { listUrl: string }) {
ReactGA
.
event
({
category
:
'
Lists
'
,
action
:
'
Enable List
'
,
label
:
listUrl
,
label
:
listUrl
})
dispatch
(
enableList
(
listUrl
))
},
[
dispatch
,
listUrl
])
...
...
@@ -153,7 +153,7 @@ const ListRow = memo(function ListRow({ listUrl }: { listUrl: string }) {
ReactGA
.
event
({
category
:
'
Lists
'
,
action
:
'
Disable List
'
,
label
:
listUrl
,
label
:
listUrl
})
dispatch
(
disableList
(
listUrl
))
},
[
dispatch
,
listUrl
])
...
...
@@ -216,7 +216,7 @@ const ListContainer = styled.div`
export
function
ManageLists
({
setModalView
,
setImportList
,
setListUrl
,
setListUrl
}:
{
setModalView
:
(
view
:
CurrencyModalView
)
=>
void
setImportList
:
(
list
:
TokenList
)
=>
void
...
...
@@ -237,7 +237,7 @@ export function ManageLists({
}
},
[
activeCopy
,
activeListUrls
])
const
handleInput
=
useCallback
(
(
e
)
=>
{
const
handleInput
=
useCallback
(
e
=>
{
setListUrlInput
(
e
.
target
.
value
)
},
[])
...
...
@@ -250,7 +250,7 @@ export function ManageLists({
const
sortedLists
=
useMemo
(()
=>
{
const
listUrls
=
Object
.
keys
(
lists
)
return
listUrls
.
filter
(
(
listUrl
)
=>
{
.
filter
(
listUrl
=>
{
// only show loaded lists, hide unsupported lists
return
Boolean
(
lists
[
listUrl
].
current
)
&&
!
Boolean
(
UNSUPPORTED_LIST_URLS
.
includes
(
listUrl
))
})
...
...
@@ -286,7 +286,7 @@ export function ManageLists({
useEffect
(()
=>
{
async
function
fetchTempList
()
{
fetchList
(
listUrlInput
,
false
)
.
then
(
(
list
)
=>
setTempList
(
list
))
.
then
(
list
=>
setTempList
(
list
))
.
catch
(()
=>
setAddError
(
'
Error importing list
'
))
}
// if valid url, fetch details for card
...
...
@@ -367,7 +367,7 @@ export function ManageLists({
<
Separator
/>
<
ListContainer
>
<
AutoColumn
gap=
"md"
>
{
sortedLists
.
map
(
(
listUrl
)
=>
(
{
sortedLists
.
map
(
listUrl
=>
(
<
ListRow
key=
{
listUrl
}
listUrl=
{
listUrl
}
/>
))
}
</
AutoColumn
>
...
...
src/components/SearchModal/ManageTokens.tsx
View file @
b6d85123
...
...
@@ -37,7 +37,7 @@ const Footer = styled.div`
export
default
function
ManageTokens
({
setModalView
,
setImportToken
,
setImportToken
}:
{
setModalView
:
(
view
:
CurrencyModalView
)
=>
void
setImportToken
:
(
token
:
Token
)
=>
void
...
...
@@ -49,7 +49,7 @@ export default function ManageTokens({
// manage focus on modal show
const
inputRef
=
useRef
<
HTMLInputElement
>
()
const
handleInput
=
useCallback
(
(
event
)
=>
{
const
handleInput
=
useCallback
(
event
=>
{
const
input
=
event
.
target
.
value
const
checksummedInput
=
isAddress
(
input
)
setSearchQuery
(
checksummedInput
||
input
)
...
...
@@ -65,7 +65,7 @@ export default function ManageTokens({
const
handleRemoveAll
=
useCallback
(()
=>
{
if
(
chainId
&&
userAddedTokens
)
{
userAddedTokens
.
map
(
(
token
)
=>
{
userAddedTokens
.
map
(
token
=>
{
return
removeToken
(
chainId
,
token
.
address
)
})
}
...
...
@@ -74,7 +74,7 @@ export default function ManageTokens({
const
tokenList
=
useMemo
(()
=>
{
return
(
chainId
&&
userAddedTokens
.
map
(
(
token
)
=>
(
userAddedTokens
.
map
(
token
=>
(
<
RowBetween
key=
{
token
.
address
}
width=
"100%"
>
<
RowFixed
>
<
CurrencyLogo
currency=
{
token
}
size=
{
'
20px
'
}
/>
...
...
src/components/SearchModal/SortButton.tsx
View file @
b6d85123
...
...
@@ -19,7 +19,7 @@ export const FilterWrapper = styled(RowFixed)`
export
default
function
SortButton
({
toggleSortOrder
,
ascending
,
ascending
}:
{
toggleSortOrder
:
()
=>
void
ascending
:
boolean
...
...
src/components/SearchModal/filtering.ts
View file @
b6d85123
...
...
@@ -8,13 +8,13 @@ export function filterTokens(tokens: Token[], search: string): Token[] {
const
searchingAddress
=
isAddress
(
search
)
if
(
searchingAddress
)
{
return
tokens
.
filter
(
(
token
)
=>
token
.
address
===
searchingAddress
)
return
tokens
.
filter
(
token
=>
token
.
address
===
searchingAddress
)
}
const
lowerSearchParts
=
search
.
toLowerCase
()
.
split
(
/
\s
+/
)
.
filter
(
(
s
)
=>
s
.
length
>
0
)
.
filter
(
s
=>
s
.
length
>
0
)
if
(
lowerSearchParts
.
length
===
0
)
{
return
tokens
...
...
@@ -24,12 +24,12 @@ export function filterTokens(tokens: Token[], search: string): Token[] {
const
sParts
=
s
.
toLowerCase
()
.
split
(
/
\s
+/
)
.
filter
(
(
s
)
=>
s
.
length
>
0
)
.
filter
(
s
=>
s
.
length
>
0
)
return
lowerSearchParts
.
every
(
(
p
)
=>
p
.
length
===
0
||
sParts
.
some
((
sp
)
=>
sp
.
startsWith
(
p
)
||
sp
.
endsWith
(
p
)))
return
lowerSearchParts
.
every
(
p
=>
p
.
length
===
0
||
sParts
.
some
(
sp
=>
sp
.
startsWith
(
p
)
||
sp
.
endsWith
(
p
)))
}
return
tokens
.
filter
(
(
token
)
=>
{
return
tokens
.
filter
(
token
=>
{
const
{
symbol
,
name
}
=
token
return
(
symbol
&&
matchesSearch
(
symbol
))
||
(
name
&&
matchesSearch
(
name
))
})
...
...
@@ -44,7 +44,7 @@ export function useSortedTokensByQuery(tokens: Token[] | undefined, searchQuery:
const
symbolMatch
=
searchQuery
.
toLowerCase
()
.
split
(
/
\s
+/
)
.
filter
(
(
s
)
=>
s
.
length
>
0
)
.
filter
(
s
=>
s
.
length
>
0
)
if
(
symbolMatch
.
length
>
1
)
{
return
tokens
...
...
@@ -55,7 +55,7 @@ export function useSortedTokensByQuery(tokens: Token[] | undefined, searchQuery:
const
rest
:
Token
[]
=
[]
// sort tokens by exact match -> subtring on symbol match -> rest
tokens
.
map
(
(
token
)
=>
{
tokens
.
map
(
token
=>
{
if
(
token
.
symbol
?.
toLowerCase
()
===
symbolMatch
[
0
])
{
return
exactMatches
.
push
(
token
)
}
else
if
(
token
.
symbol
?.
toLowerCase
().
startsWith
(
searchQuery
.
toLowerCase
().
trim
()))
{
...
...
src/components/SearchModal/styleds.tsx
View file @
b6d85123
...
...
@@ -21,8 +21,8 @@ export const StyledMenu = styled.div`
export
const
PopoverContainer
=
styled
.
div
<
{
show
:
boolean
}
>
`
z-index: 100;
visibility:
${
(
props
)
=>
(
props
.
show
?
'
visible
'
:
'
hidden
'
)}
;
opacity:
${
(
props
)
=>
(
props
.
show
?
1
:
0
)}
;
visibility:
${
props
=>
(
props
.
show
?
'
visible
'
:
'
hidden
'
)}
;
opacity:
${
props
=>
(
props
.
show
?
1
:
0
)}
;
transition: visibility 150ms linear, opacity 150ms linear;
background:
${({
theme
})
=>
theme
.
bg2
}
;
border: 1px solid
${({
theme
})
=>
theme
.
bg3
}
;
...
...
src/components/Settings/index.tsx
View file @
b6d85123
...
...
@@ -9,7 +9,7 @@ import {
useExpertModeManager
,
useUserTransactionTTL
,
useUserSlippageTolerance
,
useUserSingleHopOnly
,
useUserSingleHopOnly
}
from
'
../../state/user/hooks
'
import
{
TYPE
}
from
'
../../theme
'
import
{
ButtonError
}
from
'
../Button
'
...
...
src/components/Slider/index.tsx
View file @
b6d85123
...
...
@@ -98,7 +98,7 @@ interface InputSliderProps {
export
default
function
Slider
({
value
,
onChange
,
min
=
0
,
step
=
1
,
max
=
100
,
size
=
28
}:
InputSliderProps
)
{
const
changeCallback
=
useCallback
(
(
e
)
=>
{
e
=>
{
onChange
(
parseInt
(
e
.
target
.
value
))
},
[
onChange
]
...
...
src/components/TokenWarningModal/index.tsx
View file @
b6d85123
...
...
@@ -6,7 +6,7 @@ import { ImportToken } from 'components/SearchModal/ImportToken'
export
default
function
TokenWarningModal
({
isOpen
,
tokens
,
onConfirm
,
onConfirm
}:
{
isOpen
:
boolean
tokens
:
Token
[]
...
...
src/components/TransactionConfirmationModal/index.tsx
View file @
b6d85123
...
...
@@ -71,7 +71,7 @@ function TransactionSubmittedContent({
onDismiss
,
chainId
,
hash
,
currencyToAdd
,
currencyToAdd
}:
{
onDismiss
:
()
=>
void
hash
:
string
|
undefined
...
...
@@ -134,7 +134,7 @@ export function ConfirmationModalContent({
title
,
bottomContent
,
onDismiss
,
topContent
,
topContent
}:
{
title
:
string
onDismiss
:
()
=>
void
...
...
@@ -199,7 +199,7 @@ export default function TransactionConfirmationModal({
hash
,
pendingText
,
content
,
currencyToAdd
,
currencyToAdd
}:
ConfirmationModalProps
)
{
const
{
chainId
}
=
useActiveWeb3React
()
...
...
src/components/TransactionSettings/index.tsx
View file @
b6d85123
...
...
@@ -11,11 +11,11 @@ import { darken } from 'polished'
enum
SlippageError
{
InvalidInput
=
'
InvalidInput
'
,
RiskyLow
=
'
RiskyLow
'
,
RiskyHigh
=
'
RiskyHigh
'
,
RiskyHigh
=
'
RiskyHigh
'
}
enum
DeadlineError
{
InvalidInput
=
'
InvalidInput
'
,
InvalidInput
=
'
InvalidInput
'
}
const
FancyButton
=
styled
.
button
`
...
...
@@ -199,7 +199,7 @@ export default function SlippageTabs({ rawSlippage, setRawSlippage, deadline, se
onBlur=
{
()
=>
{
parseCustomSlippage
((
rawSlippage
/
100
).
toFixed
(
2
))
}
}
onChange=
{
(
e
)
=>
parseCustomSlippage
(
e
.
target
.
value
)
}
onChange=
{
e
=>
parseCustomSlippage
(
e
.
target
.
value
)
}
color=
{
!
slippageInputIsValid
?
'
red
'
:
''
}
/>
%
...
...
@@ -211,7 +211,7 @@ export default function SlippageTabs({ rawSlippage, setRawSlippage, deadline, se
style=
{
{
fontSize
:
'
14px
'
,
paddingTop
:
'
7px
'
,
color
:
slippageError
===
SlippageError
.
InvalidInput
?
'
red
'
:
'
#F3841E
'
,
color
:
slippageError
===
SlippageError
.
InvalidInput
?
'
red
'
:
'
#F3841E
'
}
}
>
{
slippageError
===
SlippageError
.
InvalidInput
...
...
@@ -239,7 +239,7 @@ export default function SlippageTabs({ rawSlippage, setRawSlippage, deadline, se
}
}
placeholder=
{
(
deadline
/
60
).
toString
()
}
value=
{
deadlineInput
}
onChange=
{
(
e
)
=>
parseCustomDeadline
(
e
.
target
.
value
)
}
onChange=
{
e
=>
parseCustomDeadline
(
e
.
target
.
value
)
}
/>
</
OptionCustom
>
<
TYPE
.
body
style=
{
{
paddingLeft
:
'
8px
'
}
}
fontSize=
{
14
}
>
...
...
src/components/WalletModal/Option.tsx
View file @
b6d85123
...
...
@@ -62,7 +62,7 @@ const CircleWrapper = styled.div`
const
HeaderText
=
styled
.
div
`
${({
theme
})
=>
theme
.
flexRowNoWrap
}
;
color:
${
(
props
)
=>
(
props
.
color
===
'
blue
'
?
({
theme
})
=>
theme
.
primary1
:
({
theme
})
=>
theme
.
text1
)}
;
color:
${
props
=>
(
props
.
color
===
'
blue
'
?
({
theme
})
=>
theme
.
primary1
:
({
theme
})
=>
theme
.
text1
)}
;
font-size: 1rem;
font-weight: 500;
`
...
...
@@ -97,7 +97,7 @@ export default function Option({
subheader
=
null
,
icon
,
active
=
false
,
id
,
id
}:
{
link
?:
string
|
null
clickable
?:
boolean
...
...
src/components/WalletModal/PendingView.tsx
View file @
b6d85123
...
...
@@ -67,7 +67,7 @@ export default function PendingView({
connector
,
error
=
false
,
setPendingError
,
tryActivation
,
tryActivation
}:
{
connector
?:
AbstractConnector
error
?:
boolean
...
...
@@ -100,7 +100,7 @@ export default function PendingView({
)
}
</
LoadingWrapper
>
</
LoadingMessage
>
{
Object
.
keys
(
SUPPORTED_WALLETS
).
map
(
(
key
)
=>
{
{
Object
.
keys
(
SUPPORTED_WALLETS
).
map
(
key
=>
{
const
option
=
SUPPORTED_WALLETS
[
key
]
if
(
option
.
connector
===
connector
)
{
if
(
option
.
connector
===
injected
)
{
...
...
src/components/WalletModal/index.tsx
View file @
b6d85123
...
...
@@ -47,7 +47,7 @@ const HeaderRow = styled.div`
${({
theme
})
=>
theme
.
flexRowNoWrap
}
;
padding: 1rem 1rem;
font-weight: 500;
color:
${
(
props
)
=>
(
props
.
color
===
'
blue
'
?
({
theme
})
=>
theme
.
primary1
:
'
inherit
'
)}
;
color:
${
props
=>
(
props
.
color
===
'
blue
'
?
({
theme
})
=>
theme
.
primary1
:
'
inherit
'
)}
;
${({
theme
})
=>
theme
.
mediaWidth
.
upToMedium
`
padding: 1rem;
`
}
;
...
...
@@ -113,13 +113,13 @@ const WALLET_VIEWS = {
OPTIONS
:
'
options
'
,
OPTIONS_SECONDARY
:
'
options_secondary
'
,
ACCOUNT
:
'
account
'
,
PENDING
:
'
pending
'
,
PENDING
:
'
pending
'
}
export
default
function
WalletModal
({
pendingTransactions
,
confirmedTransactions
,
ENSName
,
ENSName
}:
{
pendingTransactions
:
string
[]
// hashes of pending
confirmedTransactions
:
string
[]
// hashes of confirmed
...
...
@@ -165,7 +165,7 @@ export default function WalletModal({
const
tryActivation
=
async
(
connector
:
AbstractConnector
|
undefined
)
=>
{
let
name
=
''
Object
.
keys
(
SUPPORTED_WALLETS
).
map
(
(
key
)
=>
{
Object
.
keys
(
SUPPORTED_WALLETS
).
map
(
key
=>
{
if
(
connector
===
SUPPORTED_WALLETS
[
key
].
connector
)
{
return
(
name
=
SUPPORTED_WALLETS
[
key
].
name
)
}
...
...
@@ -175,7 +175,7 @@ export default function WalletModal({
ReactGA
.
event
({
category
:
'
Wallet
'
,
action
:
'
Change Wallet
'
,
label
:
name
,
label
:
name
})
setPendingWallet
(
connector
)
// set wallet for pending view
setWalletView
(
WALLET_VIEWS
.
PENDING
)
...
...
@@ -186,7 +186,7 @@ export default function WalletModal({
}
connector
&&
activate
(
connector
,
undefined
,
true
).
catch
(
(
error
)
=>
{
activate
(
connector
,
undefined
,
true
).
catch
(
error
=>
{
if
(
error
instanceof
UnsupportedChainIdError
)
{
activate
(
connector
)
// a little janky...can't use setError because the connector isn't set
}
else
{
...
...
@@ -205,7 +205,7 @@ export default function WalletModal({
// get wallets user can switch too, depending on device/browser
function
getOptions
()
{
const
isMetamask
=
window
.
ethereum
&&
window
.
ethereum
.
isMetaMask
return
Object
.
keys
(
SUPPORTED_WALLETS
).
map
(
(
key
)
=>
{
return
Object
.
keys
(
SUPPORTED_WALLETS
).
map
(
key
=>
{
const
option
=
SUPPORTED_WALLETS
[
key
]
// check for mobile options
if
(
isMobile
)
{
...
...
src/components/Web3Status/index.tsx
View file @
b6d85123
...
...
@@ -174,7 +174,7 @@ function Web3StatusInner() {
return
txs
.
filter
(
isTransactionRecent
).
sort
(
newTransactionsFirst
)
},
[
allTransactions
])
const
pending
=
sortedRecentTransactions
.
filter
(
(
tx
)
=>
!
tx
.
receipt
).
map
((
tx
)
=>
tx
.
hash
)
const
pending
=
sortedRecentTransactions
.
filter
(
tx
=>
!
tx
.
receipt
).
map
(
tx
=>
tx
.
hash
)
const
hasPendingTransactions
=
!!
pending
.
length
const
hasSocks
=
useHasSocks
()
...
...
@@ -225,8 +225,8 @@ export default function Web3Status() {
return
txs
.
filter
(
isTransactionRecent
).
sort
(
newTransactionsFirst
)
},
[
allTransactions
])
const
pending
=
sortedRecentTransactions
.
filter
(
(
tx
)
=>
!
tx
.
receipt
).
map
((
tx
)
=>
tx
.
hash
)
const
confirmed
=
sortedRecentTransactions
.
filter
(
(
tx
)
=>
tx
.
receipt
).
map
((
tx
)
=>
tx
.
hash
)
const
pending
=
sortedRecentTransactions
.
filter
(
tx
=>
!
tx
.
receipt
).
map
(
tx
=>
tx
.
hash
)
const
confirmed
=
sortedRecentTransactions
.
filter
(
tx
=>
tx
.
receipt
).
map
(
tx
=>
tx
.
hash
)
if
(
!
contextNetwork
.
active
&&
!
active
)
{
return
null
...
...
src/components/claim/AddressClaimModal.tsx
View file @
b6d85123
...
...
@@ -75,11 +75,11 @@ export default function AddressClaimModal({ isOpen, onDismiss }: { isOpen: boole
function
onClaim
()
{
setAttempting
(
true
)
claimCallback
()
.
then
(
(
hash
)
=>
{
.
then
(
hash
=>
{
setHash
(
hash
)
})
// reset modal and log error
.
catch
(
(
error
)
=>
{
.
catch
(
error
=>
{
setAttempting
(
false
)
console
.
log
(
error
)
})
...
...
src/components/claim/ClaimModal.tsx
View file @
b6d85123
...
...
@@ -67,7 +67,7 @@ export default function ClaimModal() {
setAttempting
(
true
)
claimCallback
()
// reset modal and log error
.
catch
(
(
error
)
=>
{
.
catch
(
error
=>
{
setAttempting
(
false
)
console
.
log
(
error
)
})
...
...
src/components/earn/ClaimRewardModal.tsx
View file @
b6d85123
...
...
@@ -46,7 +46,7 @@ export default function ClaimRewardModal({ isOpen, onDismiss, stakingInfo }: Sta
.
getReward
({
gasLimit
:
350000
})
.
then
((
response
:
TransactionResponse
)
=>
{
addTransaction
(
response
,
{
summary
:
`Claim accumulated UNI rewards`
,
summary
:
`Claim accumulated UNI rewards`
})
setHash
(
response
.
hash
)
})
...
...
src/components/earn/StakingModal.tsx
View file @
b6d85123
...
...
@@ -97,7 +97,7 @@ export default function StakingModal({ isOpen, onDismiss, stakingInfo, userLiqui
)
.
then
((
response
:
TransactionResponse
)
=>
{
addTransaction
(
response
,
{
summary
:
`Deposit liquidity`
,
summary
:
`Deposit liquidity`
})
setHash
(
response
.
hash
)
})
...
...
@@ -141,50 +141,50 @@ export default function StakingModal({ isOpen, onDismiss, stakingInfo, userLiqui
{
name
:
'
name
'
,
type
:
'
string
'
},
{
name
:
'
version
'
,
type
:
'
string
'
},
{
name
:
'
chainId
'
,
type
:
'
uint256
'
},
{
name
:
'
verifyingContract
'
,
type
:
'
address
'
}
,
{
name
:
'
verifyingContract
'
,
type
:
'
address
'
}
]
const
domain
=
{
name
:
'
Uniswap V2
'
,
version
:
'
1
'
,
chainId
:
chainId
,
verifyingContract
:
pairContract
.
address
,
verifyingContract
:
pairContract
.
address
}
const
Permit
=
[
{
name
:
'
owner
'
,
type
:
'
address
'
},
{
name
:
'
spender
'
,
type
:
'
address
'
},
{
name
:
'
value
'
,
type
:
'
uint256
'
},
{
name
:
'
nonce
'
,
type
:
'
uint256
'
},
{
name
:
'
deadline
'
,
type
:
'
uint256
'
}
,
{
name
:
'
deadline
'
,
type
:
'
uint256
'
}
]
const
message
=
{
owner
:
account
,
spender
:
stakingInfo
.
stakingRewardAddress
,
value
:
liquidityAmount
.
raw
.
toString
(),
nonce
:
nonce
.
toHexString
(),
deadline
:
deadline
.
toNumber
()
,
deadline
:
deadline
.
toNumber
()
}
const
data
=
JSON
.
stringify
({
types
:
{
EIP712Domain
,
Permit
,
Permit
},
domain
,
primaryType
:
'
Permit
'
,
message
,
message
})
library
.
send
(
'
eth_signTypedData_v4
'
,
[
account
,
data
])
.
then
(
splitSignature
)
.
then
(
(
signature
)
=>
{
.
then
(
signature
=>
{
setSignatureData
({
v
:
signature
.
v
,
r
:
signature
.
r
,
s
:
signature
.
s
,
deadline
:
deadline
.
toNumber
()
,
deadline
:
deadline
.
toNumber
()
})
})
.
catch
(
(
error
)
=>
{
.
catch
(
error
=>
{
// for all errors other than 4001 (EIP-1193 user rejected request), fall back to manual approve
if
(
error
?.
code
!==
4001
)
{
approveCallback
()
...
...
src/components/earn/UnstakingModal.tsx
View file @
b6d85123
...
...
@@ -47,7 +47,7 @@ export default function UnstakingModal({ isOpen, onDismiss, stakingInfo }: Staki
.
exit
({
gasLimit
:
300000
})
.
then
((
response
:
TransactionResponse
)
=>
{
addTransaction
(
response
,
{
summary
:
`Withdraw deposited liquidity`
,
summary
:
`Withdraw deposited liquidity`
})
setHash
(
response
.
hash
)
})
...
...
src/components/swap/BetterTradeLink.tsx
View file @
b6d85123
...
...
@@ -33,8 +33,8 @@ export default function BetterTradeLink({ version }: { version: Version }) {
...
location
,
search
:
`?
${
stringify
({
...
search
,
use
:
version
!==
DEFAULT_VERSION
?
version
:
undefined
,
})}
`
,
use
:
version
!==
DEFAULT_VERSION
?
version
:
undefined
})}
`
}
},
[
location
,
search
,
version
])
...
...
@@ -58,8 +58,8 @@ export function DefaultVersionLink() {
...
location
,
search
:
`?
${
stringify
({
...
search
,
use
:
DEFAULT_VERSION
,
})}
`
,
use
:
DEFAULT_VERSION
})}
`
}
},
[
location
,
search
])
...
...
src/components/swap/ConfirmSwapModal.tsx
View file @
b6d85123
...
...
@@ -2,7 +2,7 @@ import { currencyEquals, Trade } from '@uniswap/sdk'
import
React
,
{
useCallback
,
useMemo
}
from
'
react
'
import
TransactionConfirmationModal
,
{
ConfirmationModalContent
,
TransactionErrorContent
,
TransactionErrorContent
}
from
'
../TransactionConfirmationModal
'
import
SwapModalFooter
from
'
./SwapModalFooter
'
import
SwapModalHeader
from
'
./SwapModalHeader
'
...
...
@@ -33,7 +33,7 @@ export default function ConfirmSwapModal({
swapErrorMessage
,
isOpen
,
attemptingTxn
,
txHash
,
txHash
}:
{
isOpen
:
boolean
trade
:
Trade
|
undefined
...
...
src/components/swap/SwapModalFooter.tsx
View file @
b6d85123
...
...
@@ -9,7 +9,7 @@ import {
computeSlippageAdjustedAmounts
,
computeTradePriceBreakdown
,
formatExecutionPrice
,
warningSeverity
,
warningSeverity
}
from
'
../../utils/prices
'
import
{
ButtonError
}
from
'
../Button
'
import
{
AutoColumn
}
from
'
../Column
'
...
...
@@ -23,7 +23,7 @@ export default function SwapModalFooter({
onConfirm
,
allowedSlippage
,
swapErrorMessage
,
disabledConfirm
,
disabledConfirm
}:
{
trade
:
Trade
allowedSlippage
:
number
...
...
@@ -35,7 +35,7 @@ export default function SwapModalFooter({
const
theme
=
useContext
(
ThemeContext
)
const
slippageAdjustedAmounts
=
useMemo
(()
=>
computeSlippageAdjustedAmounts
(
trade
,
allowedSlippage
),
[
allowedSlippage
,
trade
,
trade
])
const
{
priceImpactWithoutFee
,
realizedLPFee
}
=
useMemo
(()
=>
computeTradePriceBreakdown
(
trade
),
[
trade
])
const
severity
=
warningSeverity
(
priceImpactWithoutFee
)
...
...
@@ -56,7 +56,7 @@ export default function SwapModalFooter({
alignItems
:
'
center
'
,
display
:
'
flex
'
,
textAlign
:
'
right
'
,
paddingLeft
:
'
10px
'
,
paddingLeft
:
'
10px
'
}
}
>
{
formatExecutionPrice
(
trade
,
showInverted
)
}
...
...
src/components/swap/SwapModalHeader.tsx
View file @
b6d85123
...
...
@@ -18,7 +18,7 @@ export default function SwapModalHeader({
allowedSlippage
,
recipient
,
showAcceptChanges
,
onAcceptChanges
,
onAcceptChanges
}:
{
trade
:
Trade
allowedSlippage
:
number
...
...
@@ -28,7 +28,7 @@ export default function SwapModalHeader({
})
{
const
slippageAdjustedAmounts
=
useMemo
(()
=>
computeSlippageAdjustedAmounts
(
trade
,
allowedSlippage
),
[
trade
,
allowedSlippage
,
allowedSlippage
])
const
{
priceImpactWithoutFee
}
=
useMemo
(()
=>
computeTradePriceBreakdown
(
trade
),
[
trade
])
const
priceImpactSeverity
=
warningSeverity
(
priceImpactWithoutFee
)
...
...
src/components/swap/UnsupportedCurrencyFooter.tsx
View file @
b6d85123
...
...
@@ -40,7 +40,7 @@ const AddressText = styled(TYPE.blue)`
export
default
function
UnsupportedCurrencyFooter
({
show
,
currencies
,
currencies
}:
{
show
:
boolean
currencies
:
(
Currency
|
undefined
)[]
...
...
@@ -50,7 +50,7 @@ export default function UnsupportedCurrencyFooter({
const
tokens
=
chainId
&&
currencies
?
currencies
.
map
(
(
currency
)
=>
{
?
currencies
.
map
(
currency
=>
{
return
wrappedCurrency
(
currency
,
chainId
)
})
:
[]
...
...
@@ -67,7 +67,7 @@ export default function UnsupportedCurrencyFooter({
<
CloseIcon
onClick=
{
()
=>
setShowDetails
(
false
)
}
/>
</
RowBetween
>
{
tokens
.
map
(
(
token
)
=>
{
{
tokens
.
map
(
token
=>
{
return
(
token
&&
unsupportedTokens
&&
...
...
src/components/vote/DelegateModal.tsx
View file @
b6d85123
...
...
@@ -77,7 +77,7 @@ export default function DelegateModal({ isOpen, onDismiss, title }: VoteModalPro
if
(
!
delegateCallback
)
return
// try delegation and store hash
const
hash
=
await
delegateCallback
(
parsedAddress
??
undefined
)?.
catch
(
(
error
)
=>
{
const
hash
=
await
delegateCallback
(
parsedAddress
??
undefined
)?.
catch
(
error
=>
{
setAttempting
(
false
)
console
.
log
(
error
)
})
...
...
src/components/vote/VoteModal.tsx
View file @
b6d85123
...
...
@@ -44,7 +44,7 @@ interface VoteModalProps {
export
default
function
VoteModal
({
isOpen
,
onDismiss
,
proposalId
,
support
}:
VoteModalProps
)
{
const
{
chainId
}
=
useActiveWeb3React
()
const
{
voteCallback
,
voteCallback
}:
{
voteCallback
:
(
proposalId
:
string
|
undefined
,
support
:
boolean
)
=>
Promise
<
string
>
|
undefined
}
=
useVoteCallback
()
...
...
@@ -71,7 +71,7 @@ export default function VoteModal({ isOpen, onDismiss, proposalId, support }: Vo
if
(
!
voteCallback
)
return
// try delegation and store hash
const
hash
=
await
voteCallback
(
proposalId
,
support
)?.
catch
(
(
error
)
=>
{
const
hash
=
await
voteCallback
(
proposalId
,
support
)?.
catch
(
error
=>
{
setAttempting
(
false
)
console
.
log
(
error
)
})
...
...
src/connectors/Fortmatic.ts
View file @
b6d85123
...
...
@@ -9,7 +9,7 @@ const CHAIN_ID_NETWORK_ARGUMENT: { readonly [chainId in FormaticSupportedChains]
[
ChainId
.
MAINNET
]:
undefined
,
[
ChainId
.
ROPSTEN
]:
'
ropsten
'
,
[
ChainId
.
RINKEBY
]:
'
rinkeby
'
,
[
ChainId
.
KOVAN
]:
'
kovan
'
,
[
ChainId
.
KOVAN
]:
'
kovan
'
}
export
class
FortmaticConnector
extends
FortmaticConnectorCore
{
...
...
@@ -27,7 +27,7 @@ export class FortmaticConnector extends FortmaticConnectorCore {
const
provider
=
this
.
fortmatic
.
getProvider
()
const
pollForOverlayReady
=
new
Promise
(
(
resolve
)
=>
{
const
pollForOverlayReady
=
new
Promise
(
resolve
=>
{
const
interval
=
setInterval
(()
=>
{
if
(
provider
.
overlayReady
)
{
clearInterval
(
interval
)
...
...
@@ -39,7 +39,7 @@ export class FortmaticConnector extends FortmaticConnectorCore {
const
[
account
]
=
await
Promise
.
all
([
provider
.
enable
().
then
((
accounts
:
string
[])
=>
accounts
[
0
]),
pollForOverlayReady
,
pollForOverlayReady
])
return
{
provider
:
this
.
fortmatic
.
getProvider
(),
chainId
:
(
this
as
any
).
chainId
,
account
}
...
...
src/connectors/NetworkConnector.ts
View file @
b6d85123
...
...
@@ -60,7 +60,7 @@ class MiniRpcProvider implements AsyncSendable {
response
=
await
fetch
(
this
.
url
,
{
method
:
'
POST
'
,
headers
:
{
'
content-type
'
:
'
application/json
'
,
accept
:
'
application/json
'
},
body
:
JSON
.
stringify
(
batch
.
map
(
(
item
)
=>
item
.
request
)),
body
:
JSON
.
stringify
(
batch
.
map
(
item
=>
item
.
request
))
})
}
catch
(
error
)
{
batch
.
forEach
(({
reject
})
=>
reject
(
new
Error
(
'
Failed to send batch call
'
)))
...
...
@@ -87,7 +87,7 @@ class MiniRpcProvider implements AsyncSendable {
const
{
resolve
,
reject
,
request
:
{
method
}
,
request
:
{
method
}
}
=
byKey
[
result
.
id
]
if
(
resolve
&&
reject
)
{
if
(
'
error
'
in
result
)
{
...
...
@@ -111,8 +111,8 @@ class MiniRpcProvider implements AsyncSendable {
callback
:
(
error
:
any
,
response
:
any
)
=>
void
):
void
=>
{
this
.
request
(
request
.
method
,
request
.
params
)
.
then
(
(
result
)
=>
callback
(
null
,
{
jsonrpc
:
'
2.0
'
,
id
:
request
.
id
,
result
}))
.
catch
(
(
error
)
=>
callback
(
error
,
null
))
.
then
(
result
=>
callback
(
null
,
{
jsonrpc
:
'
2.0
'
,
id
:
request
.
id
,
result
}))
.
catch
(
error
=>
callback
(
error
,
null
))
}
public
readonly
request
=
async
(
...
...
@@ -131,10 +131,10 @@ class MiniRpcProvider implements AsyncSendable {
jsonrpc
:
'
2.0
'
,
id
:
this
.
nextId
++
,
method
,
params
,
params
},
resolve
,
reject
,
reject
})
})
this
.
batchTimeoutId
=
this
.
batchTimeoutId
??
setTimeout
(
this
.
clearBatch
,
this
.
batchWaitTimeMs
)
...
...
src/connectors/index.ts
View file @
b6d85123
...
...
@@ -18,7 +18,7 @@ if (typeof NETWORK_URL === 'undefined') {
}
export
const
network
=
new
NetworkConnector
({
urls
:
{
[
NETWORK_CHAIN_ID
]:
NETWORK_URL
}
,
urls
:
{
[
NETWORK_CHAIN_ID
]:
NETWORK_URL
}
})
let
networkLibrary
:
Web3Provider
|
undefined
...
...
@@ -27,7 +27,7 @@ export function getNetworkLibrary(): Web3Provider {
}
export
const
injected
=
new
InjectedConnector
({
supportedChainIds
:
[
1
,
3
,
4
,
5
,
42
]
,
supportedChainIds
:
[
1
,
3
,
4
,
5
,
42
]
})
// mainnet only
...
...
@@ -35,19 +35,19 @@ export const walletconnect = new WalletConnectConnector({
rpc
:
{
1
:
NETWORK_URL
},
bridge
:
'
https://bridge.walletconnect.org
'
,
qrcode
:
true
,
pollingInterval
:
15000
,
pollingInterval
:
15000
})
// mainnet only
export
const
fortmatic
=
new
FortmaticConnector
({
apiKey
:
FORMATIC_KEY
??
''
,
chainId
:
1
,
chainId
:
1
})
// mainnet only
export
const
portis
=
new
PortisConnector
({
dAppId
:
PORTIS_ID
??
''
,
networks
:
[
1
]
,
networks
:
[
1
]
})
// mainnet only
...
...
@@ -55,5 +55,5 @@ export const walletlink = new WalletLinkConnector({
url
:
NETWORK_URL
,
appName
:
'
Uniswap
'
,
appLogoUrl
:
'
https://mpng.pngfly.com/20181202/bex/kisspng-emoji-domain-unicorn-pin-badges-sticker-unicorn-tumblr-emoji-unicorn-iphoneemoji-5c046729264a77.5671679315437924251569.jpg
'
,
'
https://mpng.pngfly.com/20181202/bex/kisspng-emoji-domain-unicorn-pin-badges-sticker-unicorn-tumblr-emoji-unicorn-iphoneemoji-5c046729264a77.5671679315437924251569.jpg
'
})
src/constants/index.ts
View file @
b6d85123
...
...
@@ -37,18 +37,18 @@ export const UNI: { [chainId in ChainId]: Token } = {
[
ChainId
.
RINKEBY
]:
new
Token
(
ChainId
.
RINKEBY
,
UNI_ADDRESS
,
18
,
'
UNI
'
,
'
Uniswap
'
),
[
ChainId
.
ROPSTEN
]:
new
Token
(
ChainId
.
ROPSTEN
,
UNI_ADDRESS
,
18
,
'
UNI
'
,
'
Uniswap
'
),
[
ChainId
.
G
Ö
RLI
]:
new
Token
(
ChainId
.
G
Ö
RLI
,
UNI_ADDRESS
,
18
,
'
UNI
'
,
'
Uniswap
'
),
[
ChainId
.
KOVAN
]:
new
Token
(
ChainId
.
KOVAN
,
UNI_ADDRESS
,
18
,
'
UNI
'
,
'
Uniswap
'
)
,
[
ChainId
.
KOVAN
]:
new
Token
(
ChainId
.
KOVAN
,
UNI_ADDRESS
,
18
,
'
UNI
'
,
'
Uniswap
'
)
}
export
const
COMMON_CONTRACT_NAMES
:
{
[
address
:
string
]:
string
}
=
{
[
UNI_ADDRESS
]:
'
UNI
'
,
[
GOVERNANCE_ADDRESS
]:
'
Governance
'
,
[
TIMELOCK_ADDRESS
]:
'
Timelock
'
,
[
TIMELOCK_ADDRESS
]:
'
Timelock
'
}
// TODO: specify merkle distributor for mainnet
export
const
MERKLE_DISTRIBUTOR_ADDRESS
:
{
[
chainId
in
ChainId
]?:
string
}
=
{
[
ChainId
.
MAINNET
]:
'
0x090D4613473dEE047c3f2706764f49E0821D256e
'
,
[
ChainId
.
MAINNET
]:
'
0x090D4613473dEE047c3f2706764f49E0821D256e
'
}
const
WETH_ONLY
:
ChainTokenList
=
{
...
...
@@ -56,13 +56,13 @@ const WETH_ONLY: ChainTokenList = {
[
ChainId
.
ROPSTEN
]:
[
WETH
[
ChainId
.
ROPSTEN
]],
[
ChainId
.
RINKEBY
]:
[
WETH
[
ChainId
.
RINKEBY
]],
[
ChainId
.
G
Ö
RLI
]:
[
WETH
[
ChainId
.
G
Ö
RLI
]],
[
ChainId
.
KOVAN
]:
[
WETH
[
ChainId
.
KOVAN
]]
,
[
ChainId
.
KOVAN
]:
[
WETH
[
ChainId
.
KOVAN
]]
}
// used to construct intermediary pairs for trading
export
const
BASES_TO_CHECK_TRADES_AGAINST
:
ChainTokenList
=
{
...
WETH_ONLY
,
[
ChainId
.
MAINNET
]:
[...
WETH_ONLY
[
ChainId
.
MAINNET
],
DAI
,
USDC
,
USDT
,
COMP
,
MKR
,
WBTC
]
,
[
ChainId
.
MAINNET
]:
[...
WETH_ONLY
[
ChainId
.
MAINNET
],
DAI
,
USDC
,
USDT
,
COMP
,
MKR
,
WBTC
]
}
/**
...
...
@@ -71,31 +71,31 @@ export const BASES_TO_CHECK_TRADES_AGAINST: ChainTokenList = {
*/
export
const
CUSTOM_BASES
:
{
[
chainId
in
ChainId
]?:
{
[
tokenAddress
:
string
]:
Token
[]
}
}
=
{
[
ChainId
.
MAINNET
]:
{
[
AMPL
.
address
]:
[
DAI
,
WETH
[
ChainId
.
MAINNET
]]
,
}
,
[
AMPL
.
address
]:
[
DAI
,
WETH
[
ChainId
.
MAINNET
]]
}
}
// used for display in the default list when adding liquidity
export
const
SUGGESTED_BASES
:
ChainTokenList
=
{
...
WETH_ONLY
,
[
ChainId
.
MAINNET
]:
[...
WETH_ONLY
[
ChainId
.
MAINNET
],
DAI
,
USDC
,
USDT
,
WBTC
]
,
[
ChainId
.
MAINNET
]:
[...
WETH_ONLY
[
ChainId
.
MAINNET
],
DAI
,
USDC
,
USDT
,
WBTC
]
}
// used to construct the list of all pairs we consider by default in the frontend
export
const
BASES_TO_TRACK_LIQUIDITY_FOR
:
ChainTokenList
=
{
...
WETH_ONLY
,
[
ChainId
.
MAINNET
]:
[...
WETH_ONLY
[
ChainId
.
MAINNET
],
DAI
,
USDC
,
USDT
,
WBTC
]
,
[
ChainId
.
MAINNET
]:
[...
WETH_ONLY
[
ChainId
.
MAINNET
],
DAI
,
USDC
,
USDT
,
WBTC
]
}
export
const
PINNED_PAIRS
:
{
readonly
[
chainId
in
ChainId
]?:
[
Token
,
Token
][]
}
=
{
[
ChainId
.
MAINNET
]:
[
[
new
Token
(
ChainId
.
MAINNET
,
'
0x5d3a536E4D6DbD6114cc1Ead35777bAB948E3643
'
,
8
,
'
cDAI
'
,
'
Compound Dai
'
),
new
Token
(
ChainId
.
MAINNET
,
'
0x39AA39c021dfbaE8faC545936693aC917d5E7563
'
,
8
,
'
cUSDC
'
,
'
Compound USD Coin
'
)
,
new
Token
(
ChainId
.
MAINNET
,
'
0x39AA39c021dfbaE8faC545936693aC917d5E7563
'
,
8
,
'
cUSDC
'
,
'
Compound USD Coin
'
)
],
[
USDC
,
USDT
],
[
DAI
,
USDT
]
,
]
,
[
DAI
,
USDT
]
]
}
export
interface
WalletInfo
{
...
...
@@ -118,7 +118,7 @@ export const SUPPORTED_WALLETS: { [key: string]: WalletInfo } = {
description
:
'
Injected web3 provider.
'
,
href
:
null
,
color
:
'
#010101
'
,
primary
:
true
,
primary
:
true
},
METAMASK
:
{
connector
:
injected
,
...
...
@@ -126,7 +126,7 @@ export const SUPPORTED_WALLETS: { [key: string]: WalletInfo } = {
iconName
:
'
metamask.png
'
,
description
:
'
Easy-to-use browser extension.
'
,
href
:
null
,
color
:
'
#E8831D
'
,
color
:
'
#E8831D
'
},
WALLET_CONNECT
:
{
connector
:
walletconnect
,
...
...
@@ -135,7 +135,7 @@ export const SUPPORTED_WALLETS: { [key: string]: WalletInfo } = {
description
:
'
Connect to Trust Wallet, Rainbow Wallet and more...
'
,
href
:
null
,
color
:
'
#4196FC
'
,
mobile
:
true
,
mobile
:
true
},
WALLET_LINK
:
{
connector
:
walletlink
,
...
...
@@ -143,7 +143,7 @@ export const SUPPORTED_WALLETS: { [key: string]: WalletInfo } = {
iconName
:
'
coinbaseWalletIcon.svg
'
,
description
:
'
Use Coinbase Wallet app on mobile device
'
,
href
:
null
,
color
:
'
#315CF5
'
,
color
:
'
#315CF5
'
},
COINBASE_LINK
:
{
name
:
'
Open in Coinbase Wallet
'
,
...
...
@@ -152,7 +152,7 @@ export const SUPPORTED_WALLETS: { [key: string]: WalletInfo } = {
href
:
'
https://go.cb-w.com/mtUDhEZPy1
'
,
color
:
'
#315CF5
'
,
mobile
:
true
,
mobileOnly
:
true
,
mobileOnly
:
true
},
FORTMATIC
:
{
connector
:
fortmatic
,
...
...
@@ -161,7 +161,7 @@ export const SUPPORTED_WALLETS: { [key: string]: WalletInfo } = {
description
:
'
Login using Fortmatic hosted wallet
'
,
href
:
null
,
color
:
'
#6748FF
'
,
mobile
:
true
,
mobile
:
true
},
Portis
:
{
connector
:
portis
,
...
...
@@ -170,8 +170,8 @@ export const SUPPORTED_WALLETS: { [key: string]: WalletInfo } = {
description
:
'
Login using Portis hosted wallet
'
,
href
:
null
,
color
:
'
#4A6C9B
'
,
mobile
:
true
,
}
,
mobile
:
true
}
}
export
const
NetworkContextName
=
'
NETWORK
'
...
...
@@ -210,5 +210,5 @@ export const BLOCKED_ADDRESSES: string[] = [
'
0x7F367cC41522cE07553e823bf3be79A889DEbe1B
'
,
'
0xd882cFc20F52f2599D84b8e8D58C7FB62cfE344b
'
,
'
0x901bb9583b24D97e995513C6778dc6888AB6870e
'
,
'
0xA7e5d5A720f06526557c513402f2e6B5fA20b008
'
,
'
0xA7e5d5A720f06526557c513402f2e6B5fA20b008
'
]
src/constants/lists.ts
View file @
b6d85123
...
...
@@ -33,7 +33,7 @@ export const DEFAULT_LIST_OF_LISTS: string[] = [
CMC_STABLECOIN
,
KLEROS_LIST
,
GEMINI_LIST
,
...
UNSUPPORTED_LIST_URLS
,
// need to load unsupported tokens as well
...
UNSUPPORTED_LIST_URLS
// need to load unsupported tokens as well
]
// default lists to be 'active' aka searched across
...
...
src/constants/multicall/index.ts
View file @
b6d85123
...
...
@@ -6,7 +6,7 @@ const MULTICALL_NETWORKS: { [chainId in ChainId]: string } = {
[
ChainId
.
ROPSTEN
]:
'
0x53C43764255c17BD724F74c4eF150724AC50a3ed
'
,
[
ChainId
.
KOVAN
]:
'
0x2cc8688C5f75E365aaEEb4ea8D6a480405A48D2A
'
,
[
ChainId
.
RINKEBY
]:
'
0x42Ad527de7d4e9d9d011aC45B31D8551f8Fe9821
'
,
[
ChainId
.
G
Ö
RLI
]:
'
0x77dCa2C955b15e9dE4dbBCf1246B4B85b651e50e
'
,
[
ChainId
.
G
Ö
RLI
]:
'
0x77dCa2C955b15e9dE4dbBCf1246B4B85b651e50e
'
}
export
{
MULTICALL_ABI
,
MULTICALL_NETWORKS
}
src/constants/v1/index.ts
View file @
b6d85123
...
...
@@ -8,7 +8,7 @@ const V1_FACTORY_ADDRESSES: { [chainId in ChainId]: string } = {
[
ChainId
.
ROPSTEN
]:
'
0x9c83dCE8CA20E9aAF9D3efc003b2ea62aBC08351
'
,
[
ChainId
.
RINKEBY
]:
'
0xf5D915570BC477f9B8D6C0E980aA81757A3AaC36
'
,
[
ChainId
.
G
Ö
RLI
]:
'
0x6Ce570d02D73d4c384b46135E87f8C592A8c86dA
'
,
[
ChainId
.
KOVAN
]:
'
0xD3E51Ef092B2845f10401a0159B2B96e8B6c3D30
'
,
[
ChainId
.
KOVAN
]:
'
0xD3E51Ef092B2845f10401a0159B2B96e8B6c3D30
'
}
const
V1_FACTORY_INTERFACE
=
new
Interface
(
V1_FACTORY_ABI
)
...
...
src/data/Allowances.ts
View file @
b6d85123
...
...
@@ -12,6 +12,6 @@ export function useTokenAllowance(token?: Token, owner?: string, spender?: strin
return
useMemo
(()
=>
(
token
&&
allowance
?
new
TokenAmount
(
token
,
allowance
.
toString
())
:
undefined
),
[
token
,
allowance
,
allowance
])
}
src/data/Reserves.ts
View file @
b6d85123
...
...
@@ -13,7 +13,7 @@ export enum PairState {
LOADING
,
NOT_EXISTS
,
EXISTS
,
INVALID
,
INVALID
}
export
function
usePairs
(
currencies
:
[
Currency
|
undefined
,
Currency
|
undefined
][]):
[
PairState
,
Pair
|
null
][]
{
...
...
@@ -23,7 +23,7 @@ export function usePairs(currencies: [Currency | undefined, Currency | undefined
()
=>
currencies
.
map
(([
currencyA
,
currencyB
])
=>
[
wrappedCurrency
(
currencyA
,
chainId
),
wrappedCurrency
(
currencyB
,
chainId
)
,
wrappedCurrency
(
currencyB
,
chainId
)
]),
[
chainId
,
currencies
]
)
...
...
@@ -51,7 +51,7 @@ export function usePairs(currencies: [Currency | undefined, Currency | undefined
const
[
token0
,
token1
]
=
tokenA
.
sortsBefore
(
tokenB
)
?
[
tokenA
,
tokenB
]
:
[
tokenB
,
tokenA
]
return
[
PairState
.
EXISTS
,
new
Pair
(
new
TokenAmount
(
token0
,
reserve0
.
toString
()),
new
TokenAmount
(
token1
,
reserve1
.
toString
()))
,
new
Pair
(
new
TokenAmount
(
token0
,
reserve0
.
toString
()),
new
TokenAmount
(
token1
,
reserve1
.
toString
()))
]
})
},
[
results
,
tokens
])
...
...
src/data/V1.ts
View file @
b6d85123
...
...
@@ -11,7 +11,7 @@ import {
TokenAmount
,
Trade
,
TradeType
,
WETH
,
WETH
}
from
'
@uniswap/sdk
'
import
{
useMemo
}
from
'
react
'
import
{
useActiveWeb3React
}
from
'
../hooks
'
...
...
@@ -53,7 +53,7 @@ function useMockV1Pair(inputCurrency?: Currency): MockV1Pair | undefined {
export
function
useAllTokenV1Exchanges
():
{
[
exchangeAddress
:
string
]:
Token
}
{
const
allTokens
=
useAllTokens
()
const
factory
=
useV1FactoryContract
()
const
args
=
useMemo
(()
=>
Object
.
keys
(
allTokens
).
map
(
(
tokenAddress
)
=>
[
tokenAddress
]),
[
allTokens
])
const
args
=
useMemo
(()
=>
Object
.
keys
(
allTokens
).
map
(
tokenAddress
=>
[
tokenAddress
]),
[
allTokens
])
const
data
=
useSingleContractMultipleData
(
factory
,
'
getExchange
'
,
args
,
NEVER_RELOAD
)
...
...
@@ -77,7 +77,7 @@ export function useUserHasLiquidityInAllTokens(): boolean | undefined {
const
v1ExchangeLiquidityTokens
=
useMemo
(
()
=>
chainId
?
Object
.
keys
(
exchanges
).
map
(
(
address
)
=>
new
Token
(
chainId
,
address
,
18
,
'
UNI-V1
'
,
'
Uniswap V1
'
))
:
[],
chainId
?
Object
.
keys
(
exchanges
).
map
(
address
=>
new
Token
(
chainId
,
address
,
18
,
'
UNI-V1
'
,
'
Uniswap V1
'
))
:
[],
[
chainId
,
exchanges
]
)
...
...
@@ -85,7 +85,7 @@ export function useUserHasLiquidityInAllTokens(): boolean | undefined {
return
useMemo
(
()
=>
Object
.
keys
(
balances
).
some
(
(
tokenAddress
)
=>
{
Object
.
keys
(
balances
).
some
(
tokenAddress
=>
{
const
b
=
balances
[
tokenAddress
]?.
raw
return
b
&&
JSBI
.
greaterThan
(
b
,
JSBI
.
BigInt
(
0
))
}),
...
...
@@ -135,7 +135,7 @@ export function useV1Trade(
}
export
function
getTradeVersion
(
trade
?:
Trade
):
Version
|
undefined
{
const
isV1
=
trade
?.
route
?.
pairs
?.
some
(
(
pair
)
=>
pair
instanceof
MockV1Pair
)
const
isV1
=
trade
?.
route
?.
pairs
?.
some
(
pair
=>
pair
instanceof
MockV1Pair
)
if
(
isV1
)
return
Version
.
v1
if
(
isV1
===
false
)
return
Version
.
v2
return
undefined
...
...
src/hooks/Tokens.ts
View file @
b6d85123
...
...
@@ -113,7 +113,7 @@ export function useIsUserAddedToken(currency: Currency | undefined | null): bool
return
false
}
return
!!
userAddedTokens
.
find
(
(
token
)
=>
currencyEquals
(
currency
,
token
))
return
!!
userAddedTokens
.
find
(
token
=>
currencyEquals
(
currency
,
token
))
}
// parse a name or symbol from a token response
...
...
@@ -177,7 +177,7 @@ export function useToken(tokenAddress?: string): Token | undefined | null {
token
,
tokenName
.
loading
,
tokenName
.
result
,
tokenNameBytes32
.
result
,
tokenNameBytes32
.
result
])
}
...
...
src/hooks/Trades.ts
View file @
b6d85123
...
...
@@ -22,7 +22,7 @@ function useAllCommonPairs(currencyA?: Currency, currencyB?: Currency): Pair[] {
const
basePairs
:
[
Token
,
Token
][]
=
useMemo
(
()
=>
flatMap
(
bases
,
(
base
):
[
Token
,
Token
][]
=>
bases
.
map
(
(
otherBase
)
=>
[
base
,
otherBase
])).
filter
(
flatMap
(
bases
,
(
base
):
[
Token
,
Token
][]
=>
bases
.
map
(
otherBase
=>
[
base
,
otherBase
])).
filter
(
([
t0
,
t1
])
=>
t0
.
address
!==
t1
.
address
),
[
bases
]
...
...
@@ -39,7 +39,7 @@ function useAllCommonPairs(currencyA?: Currency, currencyB?: Currency): Pair[] {
// token B against all bases
...
bases
.
map
((
base
):
[
Token
,
Token
]
=>
[
tokenB
,
base
]),
// each base against all bases
...
basePairs
,
...
basePairs
]
.
filter
((
tokens
):
tokens
is
[
Token
,
Token
]
=>
Boolean
(
tokens
[
0
]
&&
tokens
[
1
]))
.
filter
(([
t0
,
t1
])
=>
t0
.
address
!==
t1
.
address
)
...
...
@@ -53,8 +53,8 @@ function useAllCommonPairs(currencyA?: Currency, currencyB?: Currency): Pair[] {
if
(
!
customBasesA
&&
!
customBasesB
)
return
true
if
(
customBasesA
&&
!
customBasesA
.
find
(
(
base
)
=>
tokenB
.
equals
(
base
)))
return
false
if
(
customBasesB
&&
!
customBasesB
.
find
(
(
base
)
=>
tokenA
.
equals
(
base
)))
return
false
if
(
customBasesA
&&
!
customBasesA
.
find
(
base
=>
tokenB
.
equals
(
base
)))
return
false
if
(
customBasesB
&&
!
customBasesB
.
find
(
base
=>
tokenA
.
equals
(
base
)))
return
false
return
true
})
...
...
src/hooks/index.ts
View file @
b6d85123
...
...
@@ -18,7 +18,7 @@ export function useEagerConnect() {
const
[
tried
,
setTried
]
=
useState
(
false
)
useEffect
(()
=>
{
injected
.
isAuthorized
().
then
(
(
isAuthorized
)
=>
{
injected
.
isAuthorized
().
then
(
isAuthorized
=>
{
if
(
isAuthorized
)
{
activate
(
injected
,
undefined
,
true
).
catch
(()
=>
{
setTried
(
true
)
...
...
@@ -58,7 +58,7 @@ export function useInactiveListener(suppress = false) {
if
(
ethereum
&&
ethereum
.
on
&&
!
active
&&
!
error
&&
!
suppress
)
{
const
handleChainChanged
=
()
=>
{
// eat errors
activate
(
injected
,
undefined
,
true
).
catch
(
(
error
)
=>
{
activate
(
injected
,
undefined
,
true
).
catch
(
error
=>
{
console
.
error
(
'
Failed to activate after chain changed
'
,
error
)
})
}
...
...
@@ -66,7 +66,7 @@ export function useInactiveListener(suppress = false) {
const
handleAccountsChanged
=
(
accounts
:
string
[])
=>
{
if
(
accounts
.
length
>
0
)
{
// eat errors
activate
(
injected
,
undefined
,
true
).
catch
(
(
error
)
=>
{
activate
(
injected
,
undefined
,
true
).
catch
(
error
=>
{
console
.
error
(
'
Failed to activate after accounts changed
'
,
error
)
})
}
...
...
src/hooks/useAddTokenToMetamask.ts
View file @
b6d85123
...
...
@@ -25,11 +25,11 @@ export default function useAddTokenToMetamask(
address
:
token
.
address
,
symbol
:
token
.
symbol
,
decimals
:
token
.
decimals
,
image
:
getTokenLogoURL
(
token
.
address
)
,
}
,
}
,
image
:
getTokenLogoURL
(
token
.
address
)
}
}
})
.
then
(
(
success
)
=>
{
.
then
(
success
=>
{
setSuccess
(
success
)
})
.
catch
(()
=>
setSuccess
(
false
))
...
...
src/hooks/useApproveCallback.ts
View file @
b6d85123
...
...
@@ -17,7 +17,7 @@ export enum ApprovalState {
UNKNOWN
,
NOT_APPROVED
,
PENDING
,
APPROVED
,
APPROVED
}
// returns a variable indicating the state of the approval and a function which approves if necessary or early returns
...
...
@@ -82,12 +82,12 @@ export function useApproveCallback(
return
tokenContract
.
approve
(
spender
,
useExact
?
amountToApprove
.
raw
.
toString
()
:
MaxUint256
,
{
gasLimit
:
calculateGasMargin
(
estimatedGas
)
,
gasLimit
:
calculateGasMargin
(
estimatedGas
)
})
.
then
((
response
:
TransactionResponse
)
=>
{
addTransaction
(
response
,
{
summary
:
'
Approve
'
+
amountToApprove
.
currency
.
symbol
,
approval
:
{
tokenAddress
:
token
.
address
,
spender
:
spender
}
,
approval
:
{
tokenAddress
:
token
.
address
,
spender
:
spender
}
})
})
.
catch
((
error
:
Error
)
=>
{
...
...
src/hooks/useColor.ts
View file @
b6d85123
...
...
@@ -14,7 +14,7 @@ async function getColorFromToken(token: Token): Promise<string | null> {
return
Vibrant
.
from
(
path
)
.
getPalette
()
.
then
(
(
palette
)
=>
{
.
then
(
palette
=>
{
if
(
palette
?.
Vibrant
)
{
let
detectedHex
=
palette
.
Vibrant
.
hex
let
AAscore
=
hex
(
detectedHex
,
'
#FFF
'
)
...
...
@@ -34,7 +34,7 @@ async function getColorFromUriPath(uri: string): Promise<string | null> {
return
Vibrant
.
from
(
formattedPath
)
.
getPalette
()
.
then
(
(
palette
)
=>
{
.
then
(
palette
=>
{
if
(
palette
?.
Vibrant
)
{
return
palette
.
Vibrant
.
hex
}
...
...
@@ -50,7 +50,7 @@ export function useColor(token?: Token) {
let
stale
=
false
if
(
token
)
{
getColorFromToken
(
token
).
then
(
(
tokenColor
)
=>
{
getColorFromToken
(
token
).
then
(
tokenColor
=>
{
if
(
!
stale
&&
tokenColor
!==
null
)
{
setColor
(
tokenColor
)
}
...
...
@@ -73,7 +73,7 @@ export function useListColor(listImageUri?: string) {
let
stale
=
false
if
(
listImageUri
)
{
getColorFromUriPath
(
listImageUri
).
then
(
(
color
)
=>
{
getColorFromUriPath
(
listImageUri
).
then
(
color
=>
{
if
(
!
stale
&&
color
!==
null
)
{
setColor
(
color
)
}
...
...
src/hooks/useContract.ts
View file @
b6d85123
...
...
@@ -9,7 +9,7 @@ import { useMemo } from 'react'
import
{
GOVERNANCE_ADDRESS
,
MERKLE_DISTRIBUTOR_ADDRESS
,
UNI
}
from
'
../constants
'
import
{
ARGENT_WALLET_DETECTOR_ABI
,
ARGENT_WALLET_DETECTOR_MAINNET_ADDRESS
,
ARGENT_WALLET_DETECTOR_MAINNET_ADDRESS
}
from
'
../constants/abis/argent-wallet-detector
'
import
ENS_PUBLIC_RESOLVER_ABI
from
'
../constants/abis/ens-public-resolver.json
'
import
ENS_ABI
from
'
../constants/abis/ens-registrar.json
'
...
...
src/hooks/useCopyClipboard.ts
View file @
b6d85123
...
...
@@ -4,7 +4,7 @@ import { useCallback, useEffect, useState } from 'react'
export
default
function
useCopyClipboard
(
timeout
=
500
):
[
boolean
,
(
toCopy
:
string
)
=>
void
]
{
const
[
isCopied
,
setIsCopied
]
=
useState
(
false
)
const
staticCopy
=
useCallback
(
(
text
)
=>
{
const
staticCopy
=
useCallback
(
text
=>
{
const
didCopy
=
copy
(
text
)
setIsCopied
(
didCopy
)
},
[])
...
...
src/hooks/useENS.ts
View file @
b6d85123
...
...
@@ -16,6 +16,6 @@ export default function useENS(
return
{
loading
:
reverseLookup
.
loading
||
lookup
.
loading
,
address
:
validated
?
validated
:
lookup
.
address
,
name
:
reverseLookup
.
ENSName
?
reverseLookup
.
ENSName
:
!
validated
&&
lookup
.
address
?
nameOrAddress
||
null
:
null
,
name
:
reverseLookup
.
ENSName
?
reverseLookup
.
ENSName
:
!
validated
&&
lookup
.
address
?
nameOrAddress
||
null
:
null
}
}
src/hooks/useENSAddress.ts
View file @
b6d85123
...
...
@@ -30,6 +30,6 @@ export default function useENSAddress(ensName?: string | null): { loading: boole
const
changed
=
debouncedName
!==
ensName
return
{
address
:
changed
?
null
:
addr
.
result
?.[
0
]
??
null
,
loading
:
changed
||
resolverAddress
.
loading
||
addr
.
loading
,
loading
:
changed
||
resolverAddress
.
loading
||
addr
.
loading
}
}
src/hooks/useENSContentHash.ts
View file @
b6d85123
...
...
@@ -27,6 +27,6 @@ export default function useENSContentHash(ensName?: string | null): { loading: b
return
{
contenthash
:
contenthash
.
result
?.[
0
]
??
null
,
loading
:
resolverAddressResult
.
loading
||
contenthash
.
loading
,
loading
:
resolverAddressResult
.
loading
||
contenthash
.
loading
}
}
src/hooks/useENSName.ts
View file @
b6d85123
...
...
@@ -32,6 +32,6 @@ export default function useENSName(address?: string): { ENSName: string | null;
const
changed
=
debouncedAddress
!==
address
return
{
ENSName
:
changed
?
null
:
name
.
result
?.[
0
]
??
null
,
loading
:
changed
||
resolverAddress
.
loading
||
name
.
loading
,
loading
:
changed
||
resolverAddress
.
loading
||
name
.
loading
}
}
src/hooks/useFetchListCallback.ts
View file @
b6d85123
...
...
@@ -36,11 +36,11 @@ export function useFetchListCallback(): (listUrl: string, sendDispatch?: boolean
const
requestId
=
nanoid
()
sendDispatch
&&
dispatch
(
fetchTokenList
.
pending
({
requestId
,
url
:
listUrl
}))
return
getTokenList
(
listUrl
,
ensResolver
)
.
then
(
(
tokenList
)
=>
{
.
then
(
tokenList
=>
{
sendDispatch
&&
dispatch
(
fetchTokenList
.
fulfilled
({
url
:
listUrl
,
tokenList
,
requestId
}))
return
tokenList
})
.
catch
(
(
error
)
=>
{
.
catch
(
error
=>
{
console
.
debug
(
`Failed to get list at url
${
listUrl
}
`
,
error
)
sendDispatch
&&
dispatch
(
fetchTokenList
.
rejected
({
url
:
listUrl
,
requestId
,
errorMessage
:
error
.
message
}))
throw
error
...
...
src/hooks/useLast.ts
View file @
b6d85123
...
...
@@ -11,7 +11,7 @@ export default function useLast<T>(
):
T
|
null
|
undefined
{
const
[
last
,
setLast
]
=
useState
<
T
|
null
|
undefined
>
(
filterFn
&&
filterFn
(
value
)
?
value
:
undefined
)
useEffect
(()
=>
{
setLast
(
(
last
)
=>
{
setLast
(
last
=>
{
const
shouldUse
:
boolean
=
filterFn
?
filterFn
(
value
)
:
true
if
(
shouldUse
)
return
value
return
last
...
...
src/hooks/useSwapCallback.ts
View file @
b6d85123
...
...
@@ -17,7 +17,7 @@ import { Version } from './useToggledVersion'
export
enum
SwapCallbackState
{
INVALID
,
LOADING
,
VALID
,
VALID
}
interface
SwapCall
{
...
...
@@ -75,7 +75,7 @@ function useSwapCallArguments(
feeOnTransfer
:
false
,
allowedSlippage
:
new
Percent
(
JSBI
.
BigInt
(
allowedSlippage
),
BIPS_BASE
),
recipient
,
deadline
:
deadline
.
toNumber
()
,
deadline
:
deadline
.
toNumber
()
})
)
...
...
@@ -85,7 +85,7 @@ function useSwapCallArguments(
feeOnTransfer
:
true
,
allowedSlippage
:
new
Percent
(
JSBI
.
BigInt
(
allowedSlippage
),
BIPS_BASE
),
recipient
,
deadline
:
deadline
.
toNumber
()
,
deadline
:
deadline
.
toNumber
()
})
)
}
...
...
@@ -95,12 +95,12 @@ function useSwapCallArguments(
v1SwapArguments
(
trade
,
{
allowedSlippage
:
new
Percent
(
JSBI
.
BigInt
(
allowedSlippage
),
BIPS_BASE
),
recipient
,
deadline
:
deadline
.
toNumber
()
,
deadline
:
deadline
.
toNumber
()
})
)
break
}
return
swapMethods
.
map
(
(
parameters
)
=>
({
parameters
,
contract
}))
return
swapMethods
.
map
(
parameters
=>
({
parameters
,
contract
}))
},
[
account
,
allowedSlippage
,
chainId
,
deadline
,
library
,
recipient
,
trade
,
v1Exchange
])
}
...
...
@@ -138,29 +138,29 @@ export function useSwapCallback(
state
:
SwapCallbackState
.
VALID
,
callback
:
async
function
onSwap
():
Promise
<
string
>
{
const
estimatedCalls
:
EstimatedSwapCall
[]
=
await
Promise
.
all
(
swapCalls
.
map
(
(
call
)
=>
{
swapCalls
.
map
(
call
=>
{
const
{
parameters
:
{
methodName
,
args
,
value
},
contract
,
contract
}
=
call
const
options
=
!
value
||
isZero
(
value
)
?
{}
:
{
value
}
return
contract
.
estimateGas
[
methodName
](...
args
,
options
)
.
then
(
(
gasEstimate
)
=>
{
.
then
(
gasEstimate
=>
{
return
{
call
,
gasEstimate
,
gasEstimate
}
})
.
catch
(
(
gasError
)
=>
{
.
catch
(
gasError
=>
{
console
.
debug
(
'
Gas estimate failed, trying eth_call to extract error
'
,
call
)
return
contract
.
callStatic
[
methodName
](...
args
,
options
)
.
then
(
(
result
)
=>
{
.
then
(
result
=>
{
console
.
debug
(
'
Unexpected successful call after failed estimate gas
'
,
call
,
gasError
,
result
)
return
{
call
,
error
:
new
Error
(
'
Unexpected issue with estimating the gas. Please try again.
'
)
}
})
.
catch
(
(
callError
)
=>
{
.
catch
(
callError
=>
{
console
.
debug
(
'
Call threw error
'
,
call
,
callError
)
let
errorMessage
:
string
switch
(
callError
.
reason
)
{
...
...
@@ -193,14 +193,14 @@ export function useSwapCallback(
const
{
call
:
{
contract
,
parameters
:
{
methodName
,
args
,
value
}
,
parameters
:
{
methodName
,
args
,
value
}
},
gasEstimate
,
gasEstimate
}
=
successfulEstimation
return
contract
[
methodName
](...
args
,
{
gasLimit
:
calculateGasMargin
(
gasEstimate
),
...(
value
&&
!
isZero
(
value
)
?
{
value
,
from
:
account
}
:
{
from
:
account
})
,
...(
value
&&
!
isZero
(
value
)
?
{
value
,
from
:
account
}
:
{
from
:
account
})
})
.
then
((
response
:
any
)
=>
{
const
inputSymbol
=
trade
.
inputAmount
.
currency
.
symbol
...
...
@@ -222,7 +222,7 @@ export function useSwapCallback(
tradeVersion
===
Version
.
v2
?
withRecipient
:
`
${
withRecipient
}
on
${(
tradeVersion
as
any
).
toUpperCase
()}
`
addTransaction
(
response
,
{
summary
:
withVersion
,
summary
:
withVersion
})
return
response
.
hash
...
...
@@ -238,7 +238,7 @@ export function useSwapCallback(
}
})
},
error
:
null
,
error
:
null
}
},
[
trade
,
library
,
account
,
chainId
,
recipient
,
recipientAddressOrName
,
swapCalls
,
addTransaction
])
}
src/hooks/useToggle.ts
View file @
b6d85123
...
...
@@ -2,6 +2,6 @@ import { useCallback, useState } from 'react'
export
default
function
useToggle
(
initialState
=
false
):
[
boolean
,
()
=>
void
]
{
const
[
state
,
setState
]
=
useState
(
initialState
)
const
toggle
=
useCallback
(()
=>
setState
(
(
state
)
=>
!
state
),
[])
const
toggle
=
useCallback
(()
=>
setState
(
state
=>
!
state
),
[])
return
[
state
,
toggle
]
}
src/hooks/useToggledVersion.ts
View file @
b6d85123
...
...
@@ -2,7 +2,7 @@ import useParsedQueryString from './useParsedQueryString'
export
enum
Version
{
v1
=
'
v1
'
,
v2
=
'
v2
'
,
v2
=
'
v2
'
}
export
const
DEFAULT_VERSION
:
Version
=
Version
.
v2
...
...
src/hooks/useTransactionDeadline.ts
View file @
b6d85123
...
...
@@ -6,7 +6,7 @@ import useCurrentBlockTimestamp from './useCurrentBlockTimestamp'
// combines the block timestamp with the user setting to give the deadline that should be used for any submitted transaction
export
default
function
useTransactionDeadline
():
BigNumber
|
undefined
{
const
ttl
=
useSelector
<
AppState
,
number
>
(
(
state
)
=>
state
.
user
.
userDeadline
)
const
ttl
=
useSelector
<
AppState
,
number
>
(
state
=>
state
.
user
.
userDeadline
)
const
blockTimestamp
=
useCurrentBlockTimestamp
()
return
useMemo
(()
=>
{
if
(
blockTimestamp
&&
ttl
)
return
blockTimestamp
.
add
(
ttl
)
...
...
src/hooks/useWindowSize.ts
View file @
b6d85123
...
...
@@ -5,7 +5,7 @@ const isClient = typeof window === 'object'
function
getSize
()
{
return
{
width
:
isClient
?
window
.
innerWidth
:
undefined
,
height
:
isClient
?
window
.
innerHeight
:
undefined
,
height
:
isClient
?
window
.
innerHeight
:
undefined
}
}
...
...
src/hooks/useWrapCallback.ts
View file @
b6d85123
...
...
@@ -9,7 +9,7 @@ import { useWETHContract } from './useContract'
export
enum
WrapType
{
NOT_APPLICABLE
,
WRAP
,
UNWRAP
,
UNWRAP
}
const
NOT_APPLICABLE
=
{
wrapType
:
WrapType
.
NOT_APPLICABLE
}
...
...
@@ -50,7 +50,7 @@ export default function useWrapCallback(
}
}
:
undefined
,
inputError
:
sufficientBalance
?
undefined
:
'
Insufficient ETH balance
'
,
inputError
:
sufficientBalance
?
undefined
:
'
Insufficient ETH balance
'
}
}
else
if
(
currencyEquals
(
WETH
[
chainId
],
inputCurrency
)
&&
outputCurrency
===
ETHER
)
{
return
{
...
...
@@ -66,7 +66,7 @@ export default function useWrapCallback(
}
}
:
undefined
,
inputError
:
sufficientBalance
?
undefined
:
'
Insufficient WETH balance
'
,
inputError
:
sufficientBalance
?
undefined
:
'
Insufficient WETH balance
'
}
}
else
{
return
NOT_APPLICABLE
...
...
src/i18n.ts
View file @
b6d85123
...
...
@@ -9,15 +9,15 @@ i18next
.
use
(
initReactI18next
)
.
init
({
backend
:
{
loadPath
:
`./locales/{{lng}}.json`
,
loadPath
:
`./locales/{{lng}}.json`
},
react
:
{
useSuspense
:
true
,
useSuspense
:
true
},
fallbackLng
:
'
en
'
,
preload
:
[
'
en
'
],
keySeparator
:
false
,
interpolation
:
{
escapeValue
:
false
}
,
interpolation
:
{
escapeValue
:
false
}
})
export
default
i18next
src/index.tsx
View file @
b6d85123
...
...
@@ -29,20 +29,16 @@ const GOOGLE_ANALYTICS_ID: string | undefined = process.env.REACT_APP_GOOGLE_ANA
if
(
typeof
GOOGLE_ANALYTICS_ID
===
'
string
'
)
{
ReactGA
.
initialize
(
GOOGLE_ANALYTICS_ID
)
ReactGA
.
set
({
customBrowserType
:
!
isMobile
?
'
desktop
'
:
'
web3
'
in
window
||
'
ethereum
'
in
window
?
'
mobileWeb3
'
:
'
mobileRegular
'
,
customBrowserType
:
!
isMobile
?
'
desktop
'
:
'
web3
'
in
window
||
'
ethereum
'
in
window
?
'
mobileWeb3
'
:
'
mobileRegular
'
})
}
else
{
ReactGA
.
initialize
(
'
test
'
,
{
testMode
:
true
,
debug
:
true
})
}
window
.
addEventListener
(
'
error
'
,
(
error
)
=>
{
window
.
addEventListener
(
'
error
'
,
error
=>
{
ReactGA
.
exception
({
description
:
`
${
error
.
message
}
@
${
error
.
filename
}
:
${
error
.
lineno
}
:
${
error
.
colno
}
`
,
fatal
:
true
,
fatal
:
true
})
})
...
...
src/pages/AddLiquidity/ConfirmAddModalBottom.tsx
View file @
b6d85123
...
...
@@ -13,7 +13,7 @@ export function ConfirmAddModalBottom({
currencies
,
parsedAmounts
,
poolTokenPercentage
,
onAdd
,
onAdd
}:
{
noLiquidity
?:
boolean
price
?:
Fraction
...
...
src/pages/AddLiquidity/PoolPriceBar.tsx
View file @
b6d85123
...
...
@@ -12,7 +12,7 @@ export function PoolPriceBar({
currencies
,
noLiquidity
,
poolTokenPercentage
,
price
,
price
}:
{
currencies
:
{
[
field
in
Field
]?:
Currency
}
noLiquidity
?:
boolean
...
...
src/pages/AddLiquidity/index.tsx
View file @
b6d85123
...
...
@@ -43,9 +43,9 @@ import UnsupportedCurrencyFooter from 'components/swap/UnsupportedCurrencyFooter
export
default
function
AddLiquidity
({
match
:
{
params
:
{
currencyIdA
,
currencyIdB
}
,
params
:
{
currencyIdA
,
currencyIdB
}
},
history
,
history
}:
RouteComponentProps
<
{
currencyIdA
?:
string
;
currencyIdB
?:
string
}
>
)
{
const
{
account
,
chainId
,
library
}
=
useActiveWeb3React
()
const
theme
=
useContext
(
ThemeContext
)
...
...
@@ -76,7 +76,7 @@ export default function AddLiquidity({
noLiquidity
,
liquidityMinted
,
poolTokenPercentage
,
error
,
error
}
=
useDerivedMintInfo
(
currencyA
??
undefined
,
currencyB
??
undefined
)
const
{
onFieldAInput
,
onFieldBInput
}
=
useMintActionHandlers
(
noLiquidity
)
...
...
@@ -95,7 +95,7 @@ export default function AddLiquidity({
// get formatted amounts
const
formattedAmounts
=
{
[
independentField
]:
typedValue
,
[
dependentField
]:
noLiquidity
?
otherTypedValue
:
parsedAmounts
[
dependentField
]?.
toSignificant
(
6
)
??
''
,
[
dependentField
]:
noLiquidity
?
otherTypedValue
:
parsedAmounts
[
dependentField
]?.
toSignificant
(
6
)
??
''
}
// get the max amounts user can add
...
...
@@ -103,7 +103,7 @@ export default function AddLiquidity({
(
accumulator
,
field
)
=>
{
return
{
...
accumulator
,
[
field
]:
maxAmountSpend
(
currencyBalances
[
field
])
,
[
field
]:
maxAmountSpend
(
currencyBalances
[
field
])
}
},
{}
...
...
@@ -113,7 +113,7 @@ export default function AddLiquidity({
(
accumulator
,
field
)
=>
{
return
{
...
accumulator
,
[
field
]:
maxAmounts
[
field
]?.
equalTo
(
parsedAmounts
[
field
]
??
'
0
'
)
,
[
field
]:
maxAmounts
[
field
]?.
equalTo
(
parsedAmounts
[
field
]
??
'
0
'
)
}
},
{}
...
...
@@ -136,7 +136,7 @@ export default function AddLiquidity({
const
amountsMin
=
{
[
Field
.
CURRENCY_A
]:
calculateSlippageAmount
(
parsedAmountA
,
noLiquidity
?
0
:
allowedSlippage
)[
0
],
[
Field
.
CURRENCY_B
]:
calculateSlippageAmount
(
parsedAmountB
,
noLiquidity
?
0
:
allowedSlippage
)[
0
]
,
[
Field
.
CURRENCY_B
]:
calculateSlippageAmount
(
parsedAmountB
,
noLiquidity
?
0
:
allowedSlippage
)[
0
]
}
let
estimate
,
...
...
@@ -153,7 +153,7 @@ export default function AddLiquidity({
amountsMin
[
tokenBIsETH
?
Field
.
CURRENCY_A
:
Field
.
CURRENCY_B
].
toString
(),
// token min
amountsMin
[
tokenBIsETH
?
Field
.
CURRENCY_B
:
Field
.
CURRENCY_A
].
toString
(),
// eth min
account
,
deadline
.
toHexString
()
,
deadline
.
toHexString
()
]
value
=
BigNumber
.
from
((
tokenBIsETH
?
parsedAmountB
:
parsedAmountA
).
raw
.
toString
())
}
else
{
...
...
@@ -167,18 +167,18 @@ export default function AddLiquidity({
amountsMin
[
Field
.
CURRENCY_A
].
toString
(),
amountsMin
[
Field
.
CURRENCY_B
].
toString
(),
account
,
deadline
.
toHexString
()
,
deadline
.
toHexString
()
]
value
=
null
}
setAttemptingTxn
(
true
)
await
estimate
(...
args
,
value
?
{
value
}
:
{})
.
then
(
(
estimatedGasLimit
)
=>
.
then
(
estimatedGasLimit
=>
method
(...
args
,
{
...(
value
?
{
value
}
:
{}),
gasLimit
:
calculateGasMargin
(
estimatedGasLimit
)
,
}).
then
(
(
response
)
=>
{
gasLimit
:
calculateGasMargin
(
estimatedGasLimit
)
}).
then
(
response
=>
{
setAttemptingTxn
(
false
)
addTransaction
(
response
,
{
...
...
@@ -190,7 +190,7 @@ export default function AddLiquidity({
'
and
'
+
parsedAmounts
[
Field
.
CURRENCY_B
]?.
toSignificant
(
3
)
+
'
'
+
currencies
[
Field
.
CURRENCY_B
]?.
symbol
,
currencies
[
Field
.
CURRENCY_B
]?.
symbol
})
setTxHash
(
response
.
hash
)
...
...
@@ -198,11 +198,11 @@ export default function AddLiquidity({
ReactGA
.
event
({
category
:
'
Liquidity
'
,
action
:
'
Add
'
,
label
:
[
currencies
[
Field
.
CURRENCY_A
]?.
symbol
,
currencies
[
Field
.
CURRENCY_B
]?.
symbol
].
join
(
'
/
'
)
,
label
:
[
currencies
[
Field
.
CURRENCY_A
]?.
symbol
,
currencies
[
Field
.
CURRENCY_B
]?.
symbol
].
join
(
'
/
'
)
})
})
)
.
catch
(
(
error
)
=>
{
.
catch
(
error
=>
{
setAttemptingTxn
(
false
)
// we only care if the error is something _other_ than the user rejected the tx
if
(
error
?.
code
!==
4001
)
{
...
...
@@ -245,9 +245,8 @@ export default function AddLiquidity({
</
Text
>
</
Row
>
<
TYPE
.
italic
fontSize=
{
12
}
textAlign=
"left"
padding=
{
'
8px 0 0 0
'
}
>
{
`Output is estimated. If the price changes by more than ${
allowedSlippage / 100
}% your transaction will revert.`
}
{
`Output is estimated. If the price changes by more than ${allowedSlippage /
100}% your transaction will revert.`
}
</
TYPE
.
italic
>
</
AutoColumn
>
)
...
...
src/pages/AddLiquidity/redirects.tsx
View file @
b6d85123
...
...
@@ -10,8 +10,8 @@ const OLD_PATH_STRUCTURE = /^(0x[a-fA-F0-9]{40})-(0x[a-fA-F0-9]{40})$/
export
function
RedirectOldAddLiquidityPathStructure
(
props
:
RouteComponentProps
<
{
currencyIdA
:
string
}
>
)
{
const
{
match
:
{
params
:
{
currencyIdA
}
,
}
,
params
:
{
currencyIdA
}
}
}
=
props
const
match
=
currencyIdA
.
match
(
OLD_PATH_STRUCTURE
)
if
(
match
?.
length
)
{
...
...
@@ -24,8 +24,8 @@ export function RedirectOldAddLiquidityPathStructure(props: RouteComponentProps<
export
function
RedirectDuplicateTokenIds
(
props
:
RouteComponentProps
<
{
currencyIdA
:
string
;
currencyIdB
:
string
}
>
)
{
const
{
match
:
{
params
:
{
currencyIdA
,
currencyIdB
}
,
}
,
params
:
{
currencyIdA
,
currencyIdB
}
}
}
=
props
if
(
currencyIdA
.
toLowerCase
()
===
currencyIdB
.
toLowerCase
())
{
return
<
Redirect
to=
{
`/add/${currencyIdA}`
}
/>
...
...
src/pages/App.tsx
View file @
b6d85123
...
...
@@ -15,7 +15,7 @@ import AddLiquidity from './AddLiquidity'
import
{
RedirectDuplicateTokenIds
,
RedirectOldAddLiquidityPathStructure
,
RedirectToAddLiquidity
,
RedirectToAddLiquidity
}
from
'
./AddLiquidity/redirects
'
import
Earn
from
'
./Earn
'
import
Manage
from
'
./Earn/Manage
'
...
...
src/pages/Earn/Countdown.tsx
View file @
b6d85123
...
...
@@ -10,7 +10,7 @@ const REWARDS_DURATION = DAY * REWARDS_DURATION_DAYS
export
function
Countdown
({
exactEnd
}:
{
exactEnd
?:
Date
})
{
// get end/beginning times
const
end
=
useMemo
(()
=>
(
exactEnd
?
Math
.
floor
(
exactEnd
.
getTime
()
/
1000
)
:
STAKING_GENESIS
+
REWARDS_DURATION
),
[
exactEnd
,
exactEnd
])
const
begin
=
useMemo
(()
=>
end
-
REWARDS_DURATION
,
[
end
])
...
...
src/pages/Earn/Manage.tsx
View file @
b6d85123
...
...
@@ -89,8 +89,8 @@ const DataRow = styled(RowBetween)`
export
default
function
Manage
({
match
:
{
params
:
{
currencyIdA
,
currencyIdB
}
,
}
,
params
:
{
currencyIdA
,
currencyIdB
}
}
}:
RouteComponentProps
<
{
currencyIdA
:
string
;
currencyIdB
:
string
}
>
)
{
const
{
account
,
chainId
}
=
useActiveWeb3React
()
...
...
src/pages/Earn/index.tsx
View file @
b6d85123
...
...
@@ -48,7 +48,7 @@ export default function Earn() {
* only show staking cards with balance
* @todo only account for this if rewards are inactive
*/
const
stakingInfosWithBalance
=
stakingInfos
?.
filter
(
(
s
)
=>
JSBI
.
greaterThan
(
s
.
stakedAmount
.
raw
,
BIG_INT_ZERO
))
const
stakingInfosWithBalance
=
stakingInfos
?.
filter
(
s
=>
JSBI
.
greaterThan
(
s
.
stakedAmount
.
raw
,
BIG_INT_ZERO
))
// toggle copy if rewards are inactive
const
stakingRewardsExist
=
Boolean
(
typeof
chainId
===
'
number
'
&&
(
STAKING_REWARDS_INFO
[
chainId
]?.
length
??
0
)
>
0
)
...
...
@@ -97,7 +97,7 @@ export default function Earn() {
)
:
stakingInfos
?.
length
!==
0
&&
stakingInfosWithBalance
.
length
===
0
?
(
<
OutlineCard
>
No active pools
</
OutlineCard
>
)
:
(
stakingInfosWithBalance
?.
map
(
(
stakingInfo
)
=>
{
stakingInfosWithBalance
?.
map
(
stakingInfo
=>
{
// need to sort by added liquidity here
return
<
PoolCard
key=
{
stakingInfo
.
stakingRewardAddress
}
stakingInfo=
{
stakingInfo
}
/>
})
...
...
src/pages/MigrateV1/MigrateV1Exchange.tsx
View file @
b6d85123
...
...
@@ -39,7 +39,7 @@ export function V1LiquidityInfo({
token
,
liquidityTokenAmount
,
tokenWorth
,
ethWorth
,
ethWorth
}:
{
token
:
Token
liquidityTokenAmount
:
TokenAmount
...
...
@@ -118,7 +118,12 @@ function V1PairMigration({ liquidityTokenAmount, token }: { liquidityTokenAmount
:
null
const
priceDifferenceFraction
:
Fraction
|
undefined
=
v1SpotPrice
&&
v2SpotPrice
?
v1SpotPrice
.
divide
(
v2SpotPrice
).
multiply
(
'
100
'
).
subtract
(
'
100
'
)
:
undefined
v1SpotPrice
&&
v2SpotPrice
?
v1SpotPrice
.
divide
(
v2SpotPrice
)
.
multiply
(
'
100
'
)
.
subtract
(
'
100
'
)
:
undefined
const
priceDifferenceAbs
:
Fraction
|
undefined
=
priceDifferenceFraction
?.
lessThan
(
ZERO
)
?
priceDifferenceFraction
?.
multiply
(
'
-1
'
)
...
...
@@ -126,7 +131,10 @@ function V1PairMigration({ liquidityTokenAmount, token }: { liquidityTokenAmount
const
minAmountETH
:
JSBI
|
undefined
=
v2SpotPrice
&&
tokenWorth
?
tokenWorth
.
divide
(
v2SpotPrice
).
multiply
(
WEI_DENOM
).
multiply
(
ALLOWED_OUTPUT_MIN_PERCENT
).
quotient
?
tokenWorth
.
divide
(
v2SpotPrice
)
.
multiply
(
WEI_DENOM
)
.
multiply
(
ALLOWED_OUTPUT_MIN_PERCENT
).
quotient
:
ethWorth
?.
numerator
const
minAmountToken
:
JSBI
|
undefined
=
...
...
@@ -157,11 +165,11 @@ function V1PairMigration({ liquidityTokenAmount, token }: { liquidityTokenAmount
ReactGA
.
event
({
category
:
'
Migrate
'
,
action
:
'
V1->V2
'
,
label
:
token
?.
symbol
,
label
:
token
?.
symbol
})
addTransaction
(
response
,
{
summary
:
`Migrate
${
token
.
symbol
}
liquidity to V2`
,
summary
:
`Migrate
${
token
.
symbol
}
liquidity to V2`
})
setPendingMigrationHash
(
response
.
hash
)
})
...
...
@@ -305,8 +313,8 @@ function V1PairMigration({ liquidityTokenAmount, token }: { liquidityTokenAmount
export
default
function
MigrateV1Exchange
({
history
,
match
:
{
params
:
{
address
}
,
}
,
params
:
{
address
}
}
}:
RouteComponentProps
<
{
address
:
string
}
>
)
{
const
validatedAddress
=
isAddress
(
address
)
const
{
chainId
,
account
}
=
useActiveWeb3React
()
...
...
src/pages/MigrateV1/RemoveV1Exchange.tsx
View file @
b6d85123
...
...
@@ -33,7 +33,7 @@ const ZERO_FRACTION = new Fraction(ZERO, ONE)
function
V1PairRemoval
({
exchangeContract
,
liquidityTokenAmount
,
token
,
token
}:
{
exchangeContract
:
Contract
liquidityTokenAmount
:
TokenAmount
...
...
@@ -75,11 +75,11 @@ function V1PairRemoval({
ReactGA
.
event
({
category
:
'
Remove
'
,
action
:
'
V1
'
,
label
:
token
?.
symbol
,
label
:
token
?.
symbol
})
addTransaction
(
response
,
{
summary
:
`Remove
${
chainId
&&
token
.
equals
(
WETH
[
chainId
])
?
'
WETH
'
:
token
.
symbol
}
/ETH V1 liquidity`
,
summary
:
`Remove
${
chainId
&&
token
.
equals
(
WETH
[
chainId
])
?
'
WETH
'
:
token
.
symbol
}
/ETH V1 liquidity`
})
setPendingRemovalHash
(
response
.
hash
)
})
...
...
@@ -128,8 +128,8 @@ function V1PairRemoval({
export
default
function
RemoveV1Exchange
({
match
:
{
params
:
{
address
}
,
}
,
params
:
{
address
}
}
}:
RouteComponentProps
<
{
address
:
string
}
>
)
{
const
validatedAddress
=
isAddress
(
address
)
const
{
chainId
,
account
}
=
useActiveWeb3React
()
...
...
src/pages/MigrateV1/index.tsx
View file @
b6d85123
...
...
@@ -24,7 +24,7 @@ export default function MigrateV1() {
const
{
account
,
chainId
}
=
useActiveWeb3React
()
const
[
tokenSearch
,
setTokenSearch
]
=
useState
<
string
>
(
''
)
const
handleTokenSearchChange
=
useCallback
(
(
e
)
=>
setTokenSearch
(
e
.
target
.
value
),
[
setTokenSearch
])
const
handleTokenSearchChange
=
useCallback
(
e
=>
setTokenSearch
(
e
.
target
.
value
),
[
setTokenSearch
])
// automatically add the search token
const
token
=
useToken
(
tokenSearch
)
...
...
@@ -42,19 +42,17 @@ export default function MigrateV1() {
const
V1Exchanges
=
useAllTokenV1Exchanges
()
const
V1LiquidityTokens
:
Token
[]
=
useMemo
(()
=>
{
return
chainId
?
Object
.
keys
(
V1Exchanges
).
map
(
(
exchangeAddress
)
=>
new
Token
(
chainId
,
exchangeAddress
,
18
,
'
UNI-V1
'
,
'
Uniswap V1
'
)
)
?
Object
.
keys
(
V1Exchanges
).
map
(
exchangeAddress
=>
new
Token
(
chainId
,
exchangeAddress
,
18
,
'
UNI-V1
'
,
'
Uniswap V1
'
))
:
[]
},
[
chainId
,
V1Exchanges
])
const
[
V1LiquidityBalances
,
V1LiquidityBalancesLoading
]
=
useTokenBalancesWithLoadingIndicator
(
account
??
undefined
,
V1LiquidityTokens
)
const
allV1PairsWithLiquidity
=
V1LiquidityTokens
.
filter
(
(
V1LiquidityToken
)
=>
{
const
allV1PairsWithLiquidity
=
V1LiquidityTokens
.
filter
(
V1LiquidityToken
=>
{
const
balance
=
V1LiquidityBalances
?.[
V1LiquidityToken
.
address
]
return
balance
&&
JSBI
.
greaterThan
(
balance
.
raw
,
JSBI
.
BigInt
(
0
))
}).
map
(
(
V1LiquidityToken
)
=>
{
}).
map
(
V1LiquidityToken
=>
{
const
balance
=
V1LiquidityBalances
[
V1LiquidityToken
.
address
]
return
balance
?
(
<
V1PositionCard
...
...
src/pages/Pool/index.tsx
View file @
b6d85123
...
...
@@ -81,11 +81,11 @@ export default function Pool() {
// fetch the user's balances of all tracked V2 LP tokens
const
trackedTokenPairs
=
useTrackedTokenPairs
()
const
tokenPairsWithLiquidityTokens
=
useMemo
(
()
=>
trackedTokenPairs
.
map
(
(
tokens
)
=>
({
liquidityToken
:
toV2LiquidityToken
(
tokens
),
tokens
})),
()
=>
trackedTokenPairs
.
map
(
tokens
=>
({
liquidityToken
:
toV2LiquidityToken
(
tokens
),
tokens
})),
[
trackedTokenPairs
]
)
const
liquidityTokens
=
useMemo
(()
=>
tokenPairsWithLiquidityTokens
.
map
(
(
tpwlt
)
=>
tpwlt
.
liquidityToken
),
[
tokenPairsWithLiquidityTokens
,
const
liquidityTokens
=
useMemo
(()
=>
tokenPairsWithLiquidityTokens
.
map
(
tpwlt
=>
tpwlt
.
liquidityToken
),
[
tokenPairsWithLiquidityTokens
])
const
[
v2PairsBalances
,
fetchingV2PairBalances
]
=
useTokenBalancesWithLoadingIndicator
(
account
??
undefined
,
...
...
@@ -103,7 +103,7 @@ export default function Pool() {
const
v2Pairs
=
usePairs
(
liquidityTokensWithBalances
.
map
(({
tokens
})
=>
tokens
))
const
v2IsLoading
=
fetchingV2PairBalances
||
v2Pairs
?.
length
<
liquidityTokensWithBalances
.
length
||
v2Pairs
?.
some
(
(
V2Pair
)
=>
!
V2Pair
)
fetchingV2PairBalances
||
v2Pairs
?.
length
<
liquidityTokensWithBalances
.
length
||
v2Pairs
?.
some
(
V2Pair
=>
!
V2Pair
)
const
allV2PairsWithLiquidity
=
v2Pairs
.
map
(([,
pair
])
=>
pair
).
filter
((
v2Pair
):
v2Pair
is
Pair
=>
Boolean
(
v2Pair
))
...
...
@@ -111,15 +111,15 @@ export default function Pool() {
// show liquidity even if its deposited in rewards contract
const
stakingInfo
=
useStakingInfo
()
const
stakingInfosWithBalance
=
stakingInfo
?.
filter
(
(
pool
)
=>
JSBI
.
greaterThan
(
pool
.
stakedAmount
.
raw
,
BIG_INT_ZERO
))
const
stakingPairs
=
usePairs
(
stakingInfosWithBalance
?.
map
(
(
stakingInfo
)
=>
stakingInfo
.
tokens
))
const
stakingInfosWithBalance
=
stakingInfo
?.
filter
(
pool
=>
JSBI
.
greaterThan
(
pool
.
stakedAmount
.
raw
,
BIG_INT_ZERO
))
const
stakingPairs
=
usePairs
(
stakingInfosWithBalance
?.
map
(
stakingInfo
=>
stakingInfo
.
tokens
))
// remove any pairs that also are included in pairs with stake in mining pool
const
v2PairsWithoutStakedAmount
=
allV2PairsWithLiquidity
.
filter
(
(
v2Pair
)
=>
{
const
v2PairsWithoutStakedAmount
=
allV2PairsWithLiquidity
.
filter
(
v2Pair
=>
{
return
(
stakingPairs
?.
map
(
(
stakingPair
)
=>
stakingPair
[
1
])
.
filter
(
(
stakingPair
)
=>
stakingPair
?.
liquidityToken
.
address
===
v2Pair
.
liquidityToken
.
address
).
length
===
0
?.
map
(
stakingPair
=>
stakingPair
[
1
])
.
filter
(
stakingPair
=>
stakingPair
?.
liquidityToken
.
address
===
v2Pair
.
liquidityToken
.
address
).
length
===
0
)
})
...
...
@@ -201,7 +201,7 @@ export default function Pool() {
<
span
>
↗
</
span
>
</
RowBetween
>
</
ButtonSecondary
>
{
v2PairsWithoutStakedAmount
.
map
(
(
v2Pair
)
=>
(
{
v2PairsWithoutStakedAmount
.
map
(
v2Pair
=>
(
<
FullPositionCard
key=
{
v2Pair
.
liquidityToken
.
address
}
pair=
{
v2Pair
}
/>
))
}
{
stakingPairs
.
map
(
...
...
src/pages/PoolFinder/index.tsx
View file @
b6d85123
...
...
@@ -23,7 +23,7 @@ import { TYPE } from '../../theme'
enum
Fields
{
TOKEN0
=
0
,
TOKEN1
=
1
,
TOKEN1
=
1
}
export
default
function
PoolFinder
()
{
...
...
src/pages/RemoveLiquidity/index.tsx
View file @
b6d85123
...
...
@@ -47,15 +47,15 @@ import { BigNumber } from '@ethersproject/bignumber'
export
default
function
RemoveLiquidity
({
history
,
match
:
{
params
:
{
currencyIdA
,
currencyIdB
}
,
}
,
params
:
{
currencyIdA
,
currencyIdB
}
}
}:
RouteComponentProps
<
{
currencyIdA
:
string
;
currencyIdB
:
string
}
>
)
{
const
[
currencyA
,
currencyB
]
=
[
useCurrency
(
currencyIdA
)
??
undefined
,
useCurrency
(
currencyIdB
)
??
undefined
]
const
{
account
,
chainId
,
library
}
=
useActiveWeb3React
()
const
[
tokenA
,
tokenB
]
=
useMemo
(()
=>
[
wrappedCurrency
(
currencyA
,
chainId
),
wrappedCurrency
(
currencyB
,
chainId
)],
[
currencyA
,
currencyB
,
chainId
,
chainId
])
const
theme
=
useContext
(
ThemeContext
)
...
...
@@ -90,7 +90,7 @@ export default function RemoveLiquidity({
[
Field
.
CURRENCY_A
]:
independentField
===
Field
.
CURRENCY_A
?
typedValue
:
parsedAmounts
[
Field
.
CURRENCY_A
]?.
toSignificant
(
6
)
??
''
,
[
Field
.
CURRENCY_B
]:
independentField
===
Field
.
CURRENCY_B
?
typedValue
:
parsedAmounts
[
Field
.
CURRENCY_B
]?.
toSignificant
(
6
)
??
''
,
independentField
===
Field
.
CURRENCY_B
?
typedValue
:
parsedAmounts
[
Field
.
CURRENCY_B
]?.
toSignificant
(
6
)
??
''
}
const
atMaxAmount
=
parsedAmounts
[
Field
.
LIQUIDITY_PERCENT
]?.
equalTo
(
new
Percent
(
'
1
'
))
...
...
@@ -120,50 +120,50 @@ export default function RemoveLiquidity({
{
name
:
'
name
'
,
type
:
'
string
'
},
{
name
:
'
version
'
,
type
:
'
string
'
},
{
name
:
'
chainId
'
,
type
:
'
uint256
'
},
{
name
:
'
verifyingContract
'
,
type
:
'
address
'
}
,
{
name
:
'
verifyingContract
'
,
type
:
'
address
'
}
]
const
domain
=
{
name
:
'
Uniswap V2
'
,
version
:
'
1
'
,
chainId
:
chainId
,
verifyingContract
:
pair
.
liquidityToken
.
address
,
verifyingContract
:
pair
.
liquidityToken
.
address
}
const
Permit
=
[
{
name
:
'
owner
'
,
type
:
'
address
'
},
{
name
:
'
spender
'
,
type
:
'
address
'
},
{
name
:
'
value
'
,
type
:
'
uint256
'
},
{
name
:
'
nonce
'
,
type
:
'
uint256
'
},
{
name
:
'
deadline
'
,
type
:
'
uint256
'
}
,
{
name
:
'
deadline
'
,
type
:
'
uint256
'
}
]
const
message
=
{
owner
:
account
,
spender
:
ROUTER_ADDRESS
,
value
:
liquidityAmount
.
raw
.
toString
(),
nonce
:
nonce
.
toHexString
(),
deadline
:
deadline
.
toNumber
()
,
deadline
:
deadline
.
toNumber
()
}
const
data
=
JSON
.
stringify
({
types
:
{
EIP712Domain
,
Permit
,
Permit
},
domain
,
primaryType
:
'
Permit
'
,
message
,
message
})
library
.
send
(
'
eth_signTypedData_v4
'
,
[
account
,
data
])
.
then
(
splitSignature
)
.
then
(
(
signature
)
=>
{
.
then
(
signature
=>
{
setSignatureData
({
v
:
signature
.
v
,
r
:
signature
.
r
,
s
:
signature
.
s
,
deadline
:
deadline
.
toNumber
()
,
deadline
:
deadline
.
toNumber
()
})
})
.
catch
(
(
error
)
=>
{
.
catch
(
error
=>
{
// for all errors other than 4001 (EIP-1193 user rejected request), fall back to manual approve
if
(
error
?.
code
!==
4001
)
{
approveCallback
()
...
...
@@ -181,13 +181,13 @@ export default function RemoveLiquidity({
)
const
onLiquidityInput
=
useCallback
((
typedValue
:
string
):
void
=>
onUserInput
(
Field
.
LIQUIDITY
,
typedValue
),
[
onUserInput
,
onUserInput
])
const
onCurrencyAInput
=
useCallback
((
typedValue
:
string
):
void
=>
onUserInput
(
Field
.
CURRENCY_A
,
typedValue
),
[
onUserInput
,
onUserInput
])
const
onCurrencyBInput
=
useCallback
((
typedValue
:
string
):
void
=>
onUserInput
(
Field
.
CURRENCY_B
,
typedValue
),
[
onUserInput
,
onUserInput
])
// tx sending
...
...
@@ -202,7 +202,7 @@ export default function RemoveLiquidity({
const
amountsMin
=
{
[
Field
.
CURRENCY_A
]:
calculateSlippageAmount
(
currencyAmountA
,
allowedSlippage
)[
0
],
[
Field
.
CURRENCY_B
]:
calculateSlippageAmount
(
currencyAmountB
,
allowedSlippage
)[
0
]
,
[
Field
.
CURRENCY_B
]:
calculateSlippageAmount
(
currencyAmountB
,
allowedSlippage
)[
0
]
}
if
(
!
currencyA
||
!
currencyB
)
throw
new
Error
(
'
missing tokens
'
)
...
...
@@ -226,7 +226,7 @@ export default function RemoveLiquidity({
amountsMin
[
currencyBIsETH
?
Field
.
CURRENCY_A
:
Field
.
CURRENCY_B
].
toString
(),
amountsMin
[
currencyBIsETH
?
Field
.
CURRENCY_B
:
Field
.
CURRENCY_A
].
toString
(),
account
,
deadline
.
toHexString
()
,
deadline
.
toHexString
()
]
}
// removeLiquidity
...
...
@@ -239,7 +239,7 @@ export default function RemoveLiquidity({
amountsMin
[
Field
.
CURRENCY_A
].
toString
(),
amountsMin
[
Field
.
CURRENCY_B
].
toString
(),
account
,
deadline
.
toHexString
()
,
deadline
.
toHexString
()
]
}
}
...
...
@@ -258,7 +258,7 @@ export default function RemoveLiquidity({
false
,
signatureData
.
v
,
signatureData
.
r
,
signatureData
.
s
,
signatureData
.
s
]
}
// removeLiquidityETHWithPermit
...
...
@@ -275,7 +275,7 @@ export default function RemoveLiquidity({
false
,
signatureData
.
v
,
signatureData
.
r
,
signatureData
.
s
,
signatureData
.
s
]
}
}
else
{
...
...
@@ -283,17 +283,17 @@ export default function RemoveLiquidity({
}
const
safeGasEstimates
:
(
BigNumber
|
undefined
)[]
=
await
Promise
.
all
(
methodNames
.
map
(
(
methodName
)
=>
methodNames
.
map
(
methodName
=>
router
.
estimateGas
[
methodName
](...
args
)
.
then
(
calculateGasMargin
)
.
catch
(
(
error
)
=>
{
.
catch
(
error
=>
{
console
.
error
(
`estimateGas failed`
,
methodName
,
args
,
error
)
return
undefined
})
)
)
const
indexOfSuccessfulEstimation
=
safeGasEstimates
.
findIndex
(
(
safeGasEstimate
)
=>
const
indexOfSuccessfulEstimation
=
safeGasEstimates
.
findIndex
(
safeGasEstimate
=>
BigNumber
.
isBigNumber
(
safeGasEstimate
)
)
...
...
@@ -306,7 +306,7 @@ export default function RemoveLiquidity({
setAttemptingTxn
(
true
)
await
router
[
methodName
](...
args
,
{
gasLimit
:
safeGasEstimate
,
gasLimit
:
safeGasEstimate
})
.
then
((
response
:
TransactionResponse
)
=>
{
setAttemptingTxn
(
false
)
...
...
@@ -320,7 +320,7 @@ export default function RemoveLiquidity({
'
and
'
+
parsedAmounts
[
Field
.
CURRENCY_B
]?.
toSignificant
(
3
)
+
'
'
+
currencyB
?.
symbol
,
currencyB
?.
symbol
})
setTxHash
(
response
.
hash
)
...
...
@@ -328,7 +328,7 @@ export default function RemoveLiquidity({
ReactGA
.
event
({
category
:
'
Liquidity
'
,
action
:
'
Remove
'
,
label
:
[
currencyA
?.
symbol
,
currencyB
?.
symbol
].
join
(
'
/
'
)
,
label
:
[
currencyA
?.
symbol
,
currencyB
?.
symbol
].
join
(
'
/
'
)
})
})
.
catch
((
error
:
Error
)
=>
{
...
...
@@ -369,9 +369,8 @@ export default function RemoveLiquidity({
</
RowBetween
>
<
TYPE
.
italic
fontSize=
{
12
}
color=
{
theme
.
text2
}
textAlign=
"left"
padding=
{
'
12px 0 0 0
'
}
>
{
`Output is estimated. If the price changes by more than ${
allowedSlippage / 100
}% your transaction will revert.`
}
{
`Output is estimated. If the price changes by more than ${allowedSlippage /
100}% your transaction will revert.`
}
</
TYPE
.
italic
>
</
AutoColumn
>
)
...
...
src/pages/RemoveLiquidity/redirects.tsx
View file @
b6d85123
...
...
@@ -5,8 +5,8 @@ const OLD_PATH_STRUCTURE = /^(0x[a-fA-F0-9]{40})-(0x[a-fA-F0-9]{40})$/
export
function
RedirectOldRemoveLiquidityPathStructure
({
match
:
{
params
:
{
tokens
}
,
}
,
params
:
{
tokens
}
}
}:
RouteComponentProps
<
{
tokens
:
string
}
>
)
{
if
(
!
OLD_PATH_STRUCTURE
.
test
(
tokens
))
{
return
<
Redirect
to=
"/pool"
/>
...
...
src/pages/Swap/index.tsx
View file @
b6d85123
...
...
@@ -36,7 +36,7 @@ import {
useDefaultsFromURLSearch
,
useDerivedSwapInfo
,
useSwapActionHandlers
,
useSwapState
,
useSwapState
}
from
'
../../state/swap/hooks
'
import
{
useExpertModeManager
,
useUserSlippageTolerance
,
useUserSingleHopOnly
}
from
'
../../state/user/hooks
'
import
{
LinkStyledButton
,
TYPE
}
from
'
../../theme
'
...
...
@@ -55,7 +55,7 @@ export default function Swap() {
// token warning stuff
const
[
loadedInputCurrency
,
loadedOutputCurrency
]
=
[
useCurrency
(
loadedUrlParams
?.
inputCurrencyId
),
useCurrency
(
loadedUrlParams
?.
outputCurrencyId
)
,
useCurrency
(
loadedUrlParams
?.
outputCurrencyId
)
]
const
[
dismissTokenWarning
,
setDismissTokenWarning
]
=
useState
<
boolean
>
(
false
)
const
urlLoadedTokens
:
Token
[]
=
useMemo
(
...
...
@@ -95,7 +95,7 @@ export default function Swap() {
currencyBalances
,
parsedAmount
,
currencies
,
inputError
:
swapInputError
,
inputError
:
swapInputError
}
=
useDerivedSwapInfo
()
const
{
wrapType
,
execute
:
onWrap
,
inputError
:
wrapInputError
}
=
useWrapCallback
(
currencies
[
Field
.
INPUT
],
...
...
@@ -107,7 +107,7 @@ export default function Swap() {
const
toggledVersion
=
useToggledVersion
()
const
tradesByVersion
=
{
[
Version
.
v1
]:
v1Trade
,
[
Version
.
v2
]:
v2Trade
,
[
Version
.
v2
]:
v2Trade
}
const
trade
=
showWrap
?
undefined
:
tradesByVersion
[
toggledVersion
]
const
defaultTrade
=
showWrap
?
undefined
:
tradesByVersion
[
DEFAULT_VERSION
]
...
...
@@ -118,11 +118,11 @@ export default function Swap() {
const
parsedAmounts
=
showWrap
?
{
[
Field
.
INPUT
]:
parsedAmount
,
[
Field
.
OUTPUT
]:
parsedAmount
,
[
Field
.
OUTPUT
]:
parsedAmount
}
:
{
[
Field
.
INPUT
]:
independentField
===
Field
.
INPUT
?
parsedAmount
:
trade
?.
inputAmount
,
[
Field
.
OUTPUT
]:
independentField
===
Field
.
OUTPUT
?
parsedAmount
:
trade
?.
outputAmount
,
[
Field
.
OUTPUT
]:
independentField
===
Field
.
OUTPUT
?
parsedAmount
:
trade
?.
outputAmount
}
const
{
onSwitchTokens
,
onCurrencySelection
,
onUserInput
,
onChangeRecipient
}
=
useSwapActionHandlers
()
...
...
@@ -154,14 +154,14 @@ export default function Swap() {
tradeToConfirm
:
undefined
,
attemptingTxn
:
false
,
swapErrorMessage
:
undefined
,
txHash
:
undefined
,
txHash
:
undefined
})
const
formattedAmounts
=
{
[
independentField
]:
typedValue
,
[
dependentField
]:
showWrap
?
parsedAmounts
[
independentField
]?.
toExact
()
??
''
:
parsedAmounts
[
dependentField
]?.
toSignificant
(
6
)
??
''
,
:
parsedAmounts
[
dependentField
]?.
toSignificant
(
6
)
??
''
}
const
route
=
trade
?.
route
...
...
@@ -202,7 +202,7 @@ export default function Swap() {
}
setSwapState
({
attemptingTxn
:
true
,
tradeToConfirm
,
showConfirm
,
swapErrorMessage
:
undefined
,
txHash
:
undefined
})
swapCallback
()
.
then
(
(
hash
)
=>
{
.
then
(
hash
=>
{
setSwapState
({
attemptingTxn
:
false
,
tradeToConfirm
,
showConfirm
,
swapErrorMessage
:
undefined
,
txHash
:
hash
})
ReactGA
.
event
({
...
...
@@ -216,22 +216,22 @@ export default function Swap() {
label
:
[
trade
?.
inputAmount
?.
currency
?.
symbol
,
trade
?.
outputAmount
?.
currency
?.
symbol
,
getTradeVersion
(
trade
)
,
].
join
(
'
/
'
)
,
getTradeVersion
(
trade
)
].
join
(
'
/
'
)
})
ReactGA
.
event
({
category
:
'
Routing
'
,
action
:
singleHopOnly
?
'
Swap with multihop disabled
'
:
'
Swap with multihop enabled
'
,
action
:
singleHopOnly
?
'
Swap with multihop disabled
'
:
'
Swap with multihop enabled
'
})
})
.
catch
(
(
error
)
=>
{
.
catch
(
error
=>
{
setSwapState
({
attemptingTxn
:
false
,
tradeToConfirm
,
showConfirm
,
swapErrorMessage
:
error
.
message
,
txHash
:
undefined
,
txHash
:
undefined
})
})
},
[
...
...
@@ -243,7 +243,7 @@ export default function Swap() {
recipientAddress
,
account
,
trade
,
singleHopOnly
,
singleHopOnly
])
// errors
...
...
@@ -274,7 +274,7 @@ export default function Swap() {
},
[
attemptingTxn
,
showConfirm
,
swapErrorMessage
,
trade
,
txHash
])
const
handleInputSelect
=
useCallback
(
(
inputCurrency
)
=>
{
inputCurrency
=>
{
setApprovalSubmitted
(
false
)
// reset 2 step UI for approvals
onCurrencySelection
(
Field
.
INPUT
,
inputCurrency
)
},
...
...
@@ -285,8 +285,8 @@ export default function Swap() {
maxAmountInput
&&
onUserInput
(
Field
.
INPUT
,
maxAmountInput
.
toExact
())
},
[
maxAmountInput
,
onUserInput
])
const
handleOutputSelect
=
useCallback
(
(
outputCurrency
)
=>
onCurrencySelection
(
Field
.
OUTPUT
,
outputCurrency
),
[
onCurrencySelection
,
const
handleOutputSelect
=
useCallback
(
outputCurrency
=>
onCurrencySelection
(
Field
.
OUTPUT
,
outputCurrency
),
[
onCurrencySelection
])
const
swapIsUnsupported
=
useIsTransactionUnsupported
(
currencies
?.
INPUT
,
currencies
?.
OUTPUT
)
...
...
@@ -447,7 +447,7 @@ export default function Swap() {
attemptingTxn
:
false
,
swapErrorMessage
:
undefined
,
showConfirm
:
true
,
txHash
:
undefined
,
txHash
:
undefined
})
}
}
}
...
...
@@ -476,7 +476,7 @@ export default function Swap() {
attemptingTxn
:
false
,
swapErrorMessage
:
undefined
,
showConfirm
:
true
,
txHash
:
undefined
,
txHash
:
undefined
})
}
}
}
...
...
src/pages/Swap/redirects.tsx
View file @
b6d85123
...
...
@@ -14,8 +14,8 @@ export function RedirectToSwap(props: RouteComponentProps<{ outputCurrency: stri
const
{
location
:
{
search
},
match
:
{
params
:
{
outputCurrency
}
,
}
,
params
:
{
outputCurrency
}
}
}
=
props
return
(
...
...
@@ -26,7 +26,7 @@ export function RedirectToSwap(props: RouteComponentProps<{ outputCurrency: stri
search
:
search
&&
search
.
length
>
1
?
`${search}&outputCurrency=${outputCurrency}`
:
`?outputCurrency=${outputCurrency}`
,
:
`?outputCurrency=${outputCurrency}`
}
}
/>
)
...
...
src/pages/Vote/VotePage.tsx
View file @
b6d85123
...
...
@@ -105,8 +105,8 @@ const ProposerAddressLink = styled(ExternalLink)`
export
default
function
VotePage
({
match
:
{
params
:
{
id
}
,
}
,
params
:
{
id
}
}
}:
RouteComponentProps
<
{
id
:
string
}
>
)
{
const
{
chainId
,
account
}
=
useActiveWeb3React
()
...
...
src/react-app-env.d.ts
View file @
b6d85123
/// <reference types="react-scripts" />
declare
module
'
jazzicon
'
{
export
default
function
(
diameter
:
number
,
seed
:
number
):
HTMLElement
export
default
function
(
diameter
:
number
,
seed
:
number
):
HTMLElement
}
declare
module
'
fortmatic
'
...
...
src/state/application/actions.ts
View file @
b6d85123
...
...
@@ -26,7 +26,7 @@ export enum ApplicationModal {
CLAIM_POPUP
,
MENU
,
DELEGATE
,
VOTE
,
VOTE
}
export
const
updateBlockNumber
=
createAction
<
{
chainId
:
number
;
blockNumber
:
number
}
>
(
'
application/updateBlockNumber
'
)
...
...
src/state/application/hooks.ts
View file @
b6d85123
...
...
@@ -85,5 +85,5 @@ export function useRemovePopup(): (key: string) => void {
// get the list of active popups
export
function
useActivePopups
():
AppState
[
'
application
'
][
'
popupList
'
]
{
const
list
=
useSelector
((
state
:
AppState
)
=>
state
.
application
.
popupList
)
return
useMemo
(()
=>
list
.
filter
(
(
item
)
=>
item
.
show
),
[
list
])
return
useMemo
(()
=>
list
.
filter
(
item
=>
item
.
show
),
[
list
])
}
src/state/application/reducer.test.ts
View file @
b6d85123
...
...
@@ -10,9 +10,9 @@ describe('application reducer', () => {
store
=
createStore
(
reducer
,
{
popupList
:
[],
blockNumber
:
{
[
ChainId
.
MAINNET
]:
3
,
[
ChainId
.
MAINNET
]:
3
},
openModal
:
null
,
openModal
:
null
})
})
...
...
@@ -65,7 +65,7 @@ describe('application reducer', () => {
store
.
dispatch
(
updateBlockNumber
({
chainId
:
ChainId
.
ROPSTEN
,
blockNumber
:
2
}))
expect
(
store
.
getState
().
blockNumber
).
toEqual
({
[
ChainId
.
MAINNET
]:
3
,
[
ChainId
.
ROPSTEN
]:
2
,
[
ChainId
.
ROPSTEN
]:
2
})
})
})
...
...
src/state/application/reducer.ts
View file @
b6d85123
...
...
@@ -12,10 +12,10 @@ export interface ApplicationState {
const
initialState
:
ApplicationState
=
{
blockNumber
:
{},
popupList
:
[],
openModal
:
null
,
openModal
:
null
}
export
default
createReducer
(
initialState
,
(
builder
)
=>
export
default
createReducer
(
initialState
,
builder
=>
builder
.
addCase
(
updateBlockNumber
,
(
state
,
action
)
=>
{
const
{
chainId
,
blockNumber
}
=
action
.
payload
...
...
@@ -29,17 +29,17 @@ export default createReducer(initialState, (builder) =>
state
.
openModal
=
action
.
payload
})
.
addCase
(
addPopup
,
(
state
,
{
payload
:
{
content
,
key
,
removeAfterMs
=
15000
}
})
=>
{
state
.
popupList
=
(
key
?
state
.
popupList
.
filter
(
(
popup
)
=>
popup
.
key
!==
key
)
:
state
.
popupList
).
concat
([
state
.
popupList
=
(
key
?
state
.
popupList
.
filter
(
popup
=>
popup
.
key
!==
key
)
:
state
.
popupList
).
concat
([
{
key
:
key
||
nanoid
(),
show
:
true
,
content
,
removeAfterMs
,
}
,
removeAfterMs
}
])
})
.
addCase
(
removePopup
,
(
state
,
{
payload
:
{
key
}
})
=>
{
state
.
popupList
.
forEach
(
(
p
)
=>
{
state
.
popupList
.
forEach
(
p
=>
{
if
(
p
.
key
===
key
)
{
p
.
show
=
false
}
...
...
src/state/application/updater.ts
View file @
b6d85123
...
...
@@ -13,12 +13,12 @@ export default function Updater(): null {
const
[
state
,
setState
]
=
useState
<
{
chainId
:
number
|
undefined
;
blockNumber
:
number
|
null
}
>
({
chainId
,
blockNumber
:
null
,
blockNumber
:
null
})
const
blockNumberCallback
=
useCallback
(
(
blockNumber
:
number
)
=>
{
setState
(
(
state
)
=>
{
setState
(
state
=>
{
if
(
chainId
===
state
.
chainId
)
{
if
(
typeof
state
.
blockNumber
!==
'
number
'
)
return
{
chainId
,
blockNumber
}
return
{
chainId
,
blockNumber
:
Math
.
max
(
blockNumber
,
state
.
blockNumber
)
}
...
...
@@ -38,7 +38,7 @@ export default function Updater(): null {
library
.
getBlockNumber
()
.
then
(
blockNumberCallback
)
.
catch
(
(
error
)
=>
console
.
error
(
`Failed to get block number for chainId:
${
chainId
}
`
,
error
))
.
catch
(
error
=>
console
.
error
(
`Failed to get block number for chainId:
${
chainId
}
`
,
error
))
library
.
on
(
'
block
'
,
blockNumberCallback
)
return
()
=>
{
...
...
src/state/burn/actions.ts
View file @
b6d85123
...
...
@@ -4,7 +4,7 @@ export enum Field {
LIQUIDITY_PERCENT
=
'
LIQUIDITY_PERCENT
'
,
LIQUIDITY
=
'
LIQUIDITY
'
,
CURRENCY_A
=
'
CURRENCY_A
'
,
CURRENCY_B
=
'
CURRENCY_B
'
,
CURRENCY_B
=
'
CURRENCY_B
'
}
export
const
typeInput
=
createAction
<
{
field
:
Field
;
typedValue
:
string
}
>
(
'
burn/typeInputBurn
'
)
src/state/burn/hooks.ts
View file @
b6d85123
...
...
@@ -12,7 +12,7 @@ import { useTokenBalances } from '../wallet/hooks'
import
{
Field
,
typeInput
}
from
'
./actions
'
export
function
useBurnState
():
AppState
[
'
burn
'
]
{
return
useSelector
<
AppState
,
AppState
[
'
burn
'
]
>
(
(
state
)
=>
state
.
burn
)
return
useSelector
<
AppState
,
AppState
[
'
burn
'
]
>
(
state
=>
state
.
burn
)
}
export
function
useDerivedBurnInfo
(
...
...
@@ -43,7 +43,7 @@ export function useDerivedBurnInfo(
const
tokens
=
{
[
Field
.
CURRENCY_A
]:
tokenA
,
[
Field
.
CURRENCY_B
]:
tokenB
,
[
Field
.
LIQUIDITY
]:
pair
?.
liquidityToken
,
[
Field
.
LIQUIDITY
]:
pair
?.
liquidityToken
}
// liquidity values
...
...
@@ -68,7 +68,7 @@ export function useDerivedBurnInfo(
:
undefined
const
liquidityValues
:
{
[
Field
.
CURRENCY_A
]?:
TokenAmount
;
[
Field
.
CURRENCY_B
]?:
TokenAmount
}
=
{
[
Field
.
CURRENCY_A
]:
liquidityValueA
,
[
Field
.
CURRENCY_B
]:
liquidityValueB
,
[
Field
.
CURRENCY_B
]:
liquidityValueB
}
let
percentToRemove
:
Percent
=
new
Percent
(
'
0
'
,
'
100
'
)
...
...
@@ -114,7 +114,7 @@ export function useDerivedBurnInfo(
[
Field
.
CURRENCY_B
]:
tokenB
&&
percentToRemove
&&
percentToRemove
.
greaterThan
(
'
0
'
)
&&
liquidityValueB
?
new
TokenAmount
(
tokenB
,
percentToRemove
.
multiply
(
liquidityValueB
.
raw
).
quotient
)
:
undefined
,
:
undefined
}
let
error
:
string
|
undefined
...
...
@@ -142,6 +142,6 @@ export function useBurnActionHandlers(): {
)
return
{
onUserInput
,
onUserInput
}
}
src/state/burn/reducer.ts
View file @
b6d85123
...
...
@@ -8,15 +8,15 @@ export interface BurnState {
const
initialState
:
BurnState
=
{
independentField
:
Field
.
LIQUIDITY_PERCENT
,
typedValue
:
'
0
'
,
typedValue
:
'
0
'
}
export
default
createReducer
<
BurnState
>
(
initialState
,
(
builder
)
=>
export
default
createReducer
<
BurnState
>
(
initialState
,
builder
=>
builder
.
addCase
(
typeInput
,
(
state
,
{
payload
:
{
field
,
typedValue
}
})
=>
{
return
{
...
state
,
independentField
:
field
,
typedValue
,
typedValue
}
})
)
src/state/claim/hooks.ts
View file @
b6d85123
...
...
@@ -30,7 +30,7 @@ function fetchClaim(account: string, chainId: ChainId): Promise<UserClaimData |
return
(
CLAIM_PROMISES
[
key
]
=
CLAIM_PROMISES
[
key
]
??
fetch
(
`https://gentle-frost-9e74.uniswap.workers.dev/
${
chainId
}
/
${
formatted
}
`
)
.
then
(
(
res
)
=>
{
.
then
(
res
=>
{
if
(
res
.
status
===
200
)
{
return
res
.
json
()
}
else
{
...
...
@@ -38,7 +38,7 @@ function fetchClaim(account: string, chainId: ChainId): Promise<UserClaimData |
return
null
}
})
.
catch
(
(
error
)
=>
{
.
catch
(
error
=>
{
console
.
error
(
'
Failed to get claim data
'
,
error
)
}))
}
...
...
@@ -53,11 +53,11 @@ export function useUserClaimData(account: string | null | undefined): UserClaimD
useEffect
(()
=>
{
if
(
!
account
||
!
chainId
)
return
fetchClaim
(
account
,
chainId
).
then
(
(
accountClaimInfo
)
=>
setClaimInfo
(
(
claimInfo
)
=>
{
fetchClaim
(
account
,
chainId
).
then
(
accountClaimInfo
=>
setClaimInfo
(
claimInfo
=>
{
return
{
...
claimInfo
,
[
key
]:
accountClaimInfo
,
[
key
]:
accountClaimInfo
}
})
)
...
...
@@ -102,18 +102,18 @@ export function useClaimCallback(
const
addTransaction
=
useTransactionAdder
()
const
distributorContract
=
useMerkleDistributorContract
()
const
claimCallback
=
async
function
()
{
const
claimCallback
=
async
function
()
{
if
(
!
claimData
||
!
account
||
!
library
||
!
chainId
||
!
distributorContract
)
return
const
args
=
[
claimData
.
index
,
account
,
claimData
.
amount
,
claimData
.
proof
]
return
distributorContract
.
estimateGas
[
'
claim
'
](...
args
,
{}).
then
(
(
estimatedGasLimit
)
=>
{
return
distributorContract
.
estimateGas
[
'
claim
'
](...
args
,
{}).
then
(
estimatedGasLimit
=>
{
return
distributorContract
.
claim
(...
args
,
{
value
:
null
,
gasLimit
:
calculateGasMargin
(
estimatedGasLimit
)
})
.
then
((
response
:
TransactionResponse
)
=>
{
addTransaction
(
response
,
{
summary
:
`Claimed
${
unClaimedAmount
?.
toSignificant
(
4
)}
UNI
`,
claim: { recipient: account }
,
claim: { recipient: account }
})
return response.hash
})
...
...
src/state/governance/hooks.ts
View file @
b6d85123
...
...
@@ -63,7 +63,7 @@ export function useDataFromEventLogs() {
const
pastEvents
=
await
library
?.
getLogs
(
filter
)
// reverse events to get them from newest to odlest
const
formattedEventData
=
pastEvents
?.
map
(
(
event
)
=>
{
?.
map
(
event
=>
{
const
eventParsed
=
eventParser
.
parseLog
(
event
).
args
return
{
description
:
eventParsed
.
description
,
...
...
@@ -77,9 +77,9 @@ export function useDataFromEventLogs() {
return
{
target
,
functionSig
:
name
,
callData
:
decoded
.
join
(
'
,
'
)
,
callData
:
decoded
.
join
(
'
,
'
)
}
})
,
})
}
})
.
reverse
()
...
...
@@ -132,7 +132,7 @@ export function useAllProposalData() {
againstCount
:
parseFloat
(
ethers
.
utils
.
formatUnits
(
allProposals
[
i
]?.
result
?.
againstVotes
.
toString
(),
18
)),
startBlock
:
parseInt
(
allProposals
[
i
]?.
result
?.
startBlock
?.
toString
()),
endBlock
:
parseInt
(
allProposals
[
i
]?.
result
?.
endBlock
?.
toString
()),
details
:
formattedEvents
[
i
].
details
,
details
:
formattedEvents
[
i
].
details
}
return
formattedProposal
})
...
...
@@ -143,7 +143,7 @@ export function useAllProposalData() {
export
function
useProposalData
(
id
:
string
):
ProposalData
|
undefined
{
const
allProposalData
=
useAllProposalData
()
return
allProposalData
?.
find
(
(
p
)
=>
p
.
id
===
id
)
return
allProposalData
?.
find
(
p
=>
p
.
id
===
id
)
}
// get the users delegatee if it exists
...
...
@@ -188,12 +188,12 @@ export function useDelegateCallback(): (delegatee: string | undefined) => undefi
if
(
!
library
||
!
chainId
||
!
account
||
!
isAddress
(
delegatee
??
''
))
return
undefined
const
args
=
[
delegatee
]
if
(
!
uniContract
)
throw
new
Error
(
'
No UNI Contract!
'
)
return
uniContract
.
estimateGas
.
delegate
(...
args
,
{}).
then
(
(
estimatedGasLimit
)
=>
{
return
uniContract
.
estimateGas
.
delegate
(...
args
,
{}).
then
(
estimatedGasLimit
=>
{
return
uniContract
.
delegate
(...
args
,
{
value
:
null
,
gasLimit
:
calculateGasMargin
(
estimatedGasLimit
)
})
.
then
((
response
:
TransactionResponse
)
=>
{
addTransaction
(
response
,
{
summary
:
`Delegated votes`
,
summary
:
`Delegated votes`
})
return
response
.
hash
})
...
...
@@ -215,12 +215,12 @@ export function useVoteCallback(): {
(
proposalId
:
string
|
undefined
,
support
:
boolean
)
=>
{
if
(
!
account
||
!
govContract
||
!
proposalId
)
return
const
args
=
[
proposalId
,
support
]
return
govContract
.
estimateGas
.
castVote
(...
args
,
{}).
then
(
(
estimatedGasLimit
)
=>
{
return
govContract
.
estimateGas
.
castVote
(...
args
,
{}).
then
(
estimatedGasLimit
=>
{
return
govContract
.
castVote
(...
args
,
{
value
:
null
,
gasLimit
:
calculateGasMargin
(
estimatedGasLimit
)
})
.
then
((
response
:
TransactionResponse
)
=>
{
addTransaction
(
response
,
{
summary
:
`Voted
${
support
?
'
for
'
:
'
against
'
}
proposal
${
proposalId
}
`
,
summary
:
`Voted
${
support
?
'
for
'
:
'
against
'
}
proposal
${
proposalId
}
`
})
return
response
.
hash
})
...
...
src/state/index.ts
View file @
b6d85123
...
...
@@ -22,10 +22,10 @@ const store = configureStore({
mint
,
burn
,
multicall
,
lists
,
lists
},
middleware
:
[...
getDefaultMiddleware
({
thunk
:
false
}),
save
({
states
:
PERSISTED_KEYS
})],
preloadedState
:
load
({
states
:
PERSISTED_KEYS
})
,
preloadedState
:
load
({
states
:
PERSISTED_KEYS
})
})
store
.
dispatch
(
updateVersion
())
...
...
src/state/lists/actions.ts
View file @
b6d85123
...
...
@@ -8,7 +8,7 @@ export const fetchTokenList: Readonly<{
}
>
=
{
pending
:
createAction
(
'
lists/fetchTokenList/pending
'
),
fulfilled
:
createAction
(
'
lists/fetchTokenList/fulfilled
'
),
rejected
:
createAction
(
'
lists/fetchTokenList/rejected
'
)
,
rejected
:
createAction
(
'
lists/fetchTokenList/rejected
'
)
}
// add and remove from list options
export
const
addList
=
createAction
<
string
>
(
'
lists/addList
'
)
...
...
src/state/lists/hooks.ts
View file @
b6d85123
...
...
@@ -41,7 +41,7 @@ const EMPTY_LIST: TokenAddressMap = {
[
ChainId
.
RINKEBY
]:
{},
[
ChainId
.
ROPSTEN
]:
{},
[
ChainId
.
G
Ö
RLI
]:
{},
[
ChainId
.
MAINNET
]:
{}
,
[
ChainId
.
MAINNET
]:
{}
}
const
listCache
:
WeakMap
<
TokenList
,
TokenAddressMap
>
|
null
=
...
...
@@ -55,7 +55,7 @@ export function listToTokenMap(list: TokenList): TokenAddressMap {
(
tokenMap
,
tokenInfo
)
=>
{
const
tags
:
TagInfo
[]
=
tokenInfo
.
tags
?.
map
(
(
tagId
)
=>
{
?.
map
(
tagId
=>
{
if
(
!
list
.
tags
?.[
tagId
])
return
undefined
return
{
...
list
.
tags
[
tagId
],
id
:
tagId
}
})
...
...
@@ -68,9 +68,9 @@ export function listToTokenMap(list: TokenList): TokenAddressMap {
...
tokenMap
[
token
.
chainId
],
[
token
.
address
]:
{
token
,
list
:
list
,
}
,
}
,
list
:
list
}
}
}
},
{
...
EMPTY_LIST
}
...
...
@@ -87,7 +87,7 @@ export function useAllLists(): {
readonly
error
:
string
|
null
}
}
{
return
useSelector
<
AppState
,
AppState
[
'
lists
'
][
'
byUrl
'
]
>
(
(
state
)
=>
state
.
lists
.
byUrl
)
return
useSelector
<
AppState
,
AppState
[
'
lists
'
][
'
byUrl
'
]
>
(
state
=>
state
.
lists
.
byUrl
)
}
function
combineMaps
(
map1
:
TokenAddressMap
,
map2
:
TokenAddressMap
):
TokenAddressMap
{
...
...
@@ -96,7 +96,7 @@ function combineMaps(map1: TokenAddressMap, map2: TokenAddressMap): TokenAddress
3
:
{
...
map1
[
3
],
...
map2
[
3
]
},
4
:
{
...
map1
[
4
],
...
map2
[
4
]
},
5
:
{
...
map1
[
5
],
...
map2
[
5
]
},
42
:
{
...
map1
[
42
],
...
map2
[
42
]
}
,
42
:
{
...
map1
[
42
],
...
map2
[
42
]
}
}
}
...
...
@@ -129,15 +129,15 @@ function useCombinedTokenMapFromUrls(urls: string[] | undefined): TokenAddressMa
// filter out unsupported lists
export
function
useActiveListUrls
():
string
[]
|
undefined
{
return
useSelector
<
AppState
,
AppState
[
'
lists
'
][
'
activeListUrls
'
]
>
(
(
state
)
=>
state
.
lists
.
activeListUrls
)?.
filter
(
(
url
)
=>
!
UNSUPPORTED_LIST_URLS
.
includes
(
url
)
return
useSelector
<
AppState
,
AppState
[
'
lists
'
][
'
activeListUrls
'
]
>
(
state
=>
state
.
lists
.
activeListUrls
)?.
filter
(
url
=>
!
UNSUPPORTED_LIST_URLS
.
includes
(
url
)
)
}
export
function
useInactiveListUrls
():
string
[]
{
const
lists
=
useAllLists
()
const
allActiveListUrls
=
useActiveListUrls
()
return
Object
.
keys
(
lists
).
filter
(
(
url
)
=>
!
allActiveListUrls
?.
includes
(
url
)
&&
!
UNSUPPORTED_LIST_URLS
.
includes
(
url
))
return
Object
.
keys
(
lists
).
filter
(
url
=>
!
allActiveListUrls
?.
includes
(
url
)
&&
!
UNSUPPORTED_LIST_URLS
.
includes
(
url
))
}
// get all the tokens from active lists, combine with local default tokens
...
...
src/state/lists/reducer.test.ts
View file @
b6d85123
...
...
@@ -9,20 +9,20 @@ const STUB_TOKEN_LIST = {
name
:
''
,
timestamp
:
''
,
version
:
{
major
:
1
,
minor
:
1
,
patch
:
1
},
tokens
:
[]
,
tokens
:
[]
}
const
PATCHED_STUB_LIST
=
{
...
STUB_TOKEN_LIST
,
version
:
{
...
STUB_TOKEN_LIST
.
version
,
patch
:
STUB_TOKEN_LIST
.
version
.
patch
+
1
}
,
version
:
{
...
STUB_TOKEN_LIST
.
version
,
patch
:
STUB_TOKEN_LIST
.
version
.
patch
+
1
}
}
const
MINOR_UPDATED_STUB_LIST
=
{
...
STUB_TOKEN_LIST
,
version
:
{
...
STUB_TOKEN_LIST
.
version
,
minor
:
STUB_TOKEN_LIST
.
version
.
minor
+
1
}
,
version
:
{
...
STUB_TOKEN_LIST
.
version
,
minor
:
STUB_TOKEN_LIST
.
version
.
minor
+
1
}
}
const
MAJOR_UPDATED_STUB_LIST
=
{
...
STUB_TOKEN_LIST
,
version
:
{
...
STUB_TOKEN_LIST
.
version
,
major
:
STUB_TOKEN_LIST
.
version
.
major
+
1
}
,
version
:
{
...
STUB_TOKEN_LIST
.
version
,
major
:
STUB_TOKEN_LIST
.
version
.
major
+
1
}
}
describe
(
'
list reducer
'
,
()
=>
{
...
...
@@ -31,7 +31,7 @@ describe('list reducer', () => {
beforeEach
(()
=>
{
store
=
createStore
(
reducer
,
{
byUrl
:
{},
activeListUrls
:
undefined
,
activeListUrls
:
undefined
})
})
...
...
@@ -45,10 +45,10 @@ describe('list reducer', () => {
error
:
null
,
loadingRequestId
:
'
request-id
'
,
current
:
null
,
pendingUpdate
:
null
,
}
,
pendingUpdate
:
null
}
},
selectedListUrl
:
undefined
,
selectedListUrl
:
undefined
})
})
...
...
@@ -59,10 +59,10 @@ describe('list reducer', () => {
error
:
null
,
current
:
STUB_TOKEN_LIST
,
pendingUpdate
:
null
,
loadingRequestId
:
null
,
}
,
loadingRequestId
:
null
}
},
activeListUrls
:
undefined
,
activeListUrls
:
undefined
})
store
.
dispatch
(
fetchTokenList
.
pending
({
requestId
:
'
request-id
'
,
url
:
'
fake-url
'
}))
...
...
@@ -72,10 +72,10 @@ describe('list reducer', () => {
error
:
null
,
current
:
STUB_TOKEN_LIST
,
loadingRequestId
:
'
request-id
'
,
pendingUpdate
:
null
,
}
,
pendingUpdate
:
null
}
},
activeListUrls
:
undefined
,
activeListUrls
:
undefined
})
})
})
...
...
@@ -91,10 +91,10 @@ describe('list reducer', () => {
error
:
null
,
current
:
STUB_TOKEN_LIST
,
loadingRequestId
:
null
,
pendingUpdate
:
null
,
}
,
pendingUpdate
:
null
}
},
activeListUrls
:
undefined
,
activeListUrls
:
undefined
})
})
...
...
@@ -111,10 +111,10 @@ describe('list reducer', () => {
error
:
null
,
current
:
STUB_TOKEN_LIST
,
loadingRequestId
:
null
,
pendingUpdate
:
null
,
}
,
pendingUpdate
:
null
}
},
activeListUrls
:
undefined
,
activeListUrls
:
undefined
})
})
...
...
@@ -132,10 +132,10 @@ describe('list reducer', () => {
error
:
null
,
current
:
STUB_TOKEN_LIST
,
loadingRequestId
:
null
,
pendingUpdate
:
PATCHED_STUB_LIST
,
}
,
pendingUpdate
:
PATCHED_STUB_LIST
}
},
activeListUrls
:
undefined
,
activeListUrls
:
undefined
})
})
it
(
'
does not save to current if list is newer minor version
'
,
()
=>
{
...
...
@@ -152,10 +152,10 @@ describe('list reducer', () => {
error
:
null
,
current
:
STUB_TOKEN_LIST
,
loadingRequestId
:
null
,
pendingUpdate
:
MINOR_UPDATED_STUB_LIST
,
}
,
pendingUpdate
:
MINOR_UPDATED_STUB_LIST
}
},
activeListUrls
:
undefined
,
activeListUrls
:
undefined
})
})
it
(
'
does not save to pending if list is newer major version
'
,
()
=>
{
...
...
@@ -172,10 +172,10 @@ describe('list reducer', () => {
error
:
null
,
current
:
STUB_TOKEN_LIST
,
loadingRequestId
:
null
,
pendingUpdate
:
MAJOR_UPDATED_STUB_LIST
,
}
,
pendingUpdate
:
MAJOR_UPDATED_STUB_LIST
}
},
activeListUrls
:
undefined
,
activeListUrls
:
undefined
})
})
})
...
...
@@ -185,7 +185,7 @@ describe('list reducer', () => {
store
.
dispatch
(
fetchTokenList
.
rejected
({
requestId
:
'
request-id
'
,
errorMessage
:
'
abcd
'
,
url
:
'
fake-url
'
}))
expect
(
store
.
getState
()).
toEqual
({
byUrl
:
{},
activeListUrls
:
undefined
,
activeListUrls
:
undefined
})
})
...
...
@@ -196,10 +196,10 @@ describe('list reducer', () => {
error
:
null
,
current
:
null
,
loadingRequestId
:
'
request-id
'
,
pendingUpdate
:
null
,
}
,
pendingUpdate
:
null
}
},
activeListUrls
:
undefined
,
activeListUrls
:
undefined
})
store
.
dispatch
(
fetchTokenList
.
rejected
({
requestId
:
'
request-id
'
,
errorMessage
:
'
abcd
'
,
url
:
'
fake-url
'
}))
expect
(
store
.
getState
()).
toEqual
({
...
...
@@ -208,10 +208,10 @@ describe('list reducer', () => {
error
:
'
abcd
'
,
current
:
null
,
loadingRequestId
:
null
,
pendingUpdate
:
null
,
}
,
pendingUpdate
:
null
}
},
activeListUrls
:
undefined
,
activeListUrls
:
undefined
})
})
})
...
...
@@ -226,10 +226,10 @@ describe('list reducer', () => {
error
:
null
,
current
:
null
,
loadingRequestId
:
null
,
pendingUpdate
:
null
,
}
,
pendingUpdate
:
null
}
},
activeListUrls
:
undefined
,
activeListUrls
:
undefined
})
})
it
(
'
no op for existing list
'
,
()
=>
{
...
...
@@ -239,10 +239,10 @@ describe('list reducer', () => {
error
:
null
,
current
:
STUB_TOKEN_LIST
,
loadingRequestId
:
null
,
pendingUpdate
:
null
,
}
,
pendingUpdate
:
null
}
},
activeListUrls
:
undefined
,
activeListUrls
:
undefined
})
store
.
dispatch
(
addList
(
'
fake-url
'
))
expect
(
store
.
getState
()).
toEqual
({
...
...
@@ -251,10 +251,10 @@ describe('list reducer', () => {
error
:
null
,
current
:
STUB_TOKEN_LIST
,
loadingRequestId
:
null
,
pendingUpdate
:
null
,
}
,
pendingUpdate
:
null
}
},
activeListUrls
:
undefined
,
activeListUrls
:
undefined
})
})
})
...
...
@@ -267,10 +267,10 @@ describe('list reducer', () => {
error
:
null
,
current
:
STUB_TOKEN_LIST
,
loadingRequestId
:
null
,
pendingUpdate
:
PATCHED_STUB_LIST
,
}
,
pendingUpdate
:
PATCHED_STUB_LIST
}
},
activeListUrls
:
undefined
,
activeListUrls
:
undefined
})
store
.
dispatch
(
acceptListUpdate
(
'
fake-url
'
))
expect
(
store
.
getState
()).
toEqual
({
...
...
@@ -279,10 +279,10 @@ describe('list reducer', () => {
error
:
null
,
current
:
PATCHED_STUB_LIST
,
loadingRequestId
:
null
,
pendingUpdate
:
null
,
}
,
pendingUpdate
:
null
}
},
activeListUrls
:
undefined
,
activeListUrls
:
undefined
})
})
})
...
...
@@ -295,15 +295,15 @@ describe('list reducer', () => {
error
:
null
,
current
:
STUB_TOKEN_LIST
,
loadingRequestId
:
null
,
pendingUpdate
:
PATCHED_STUB_LIST
,
}
,
pendingUpdate
:
PATCHED_STUB_LIST
}
},
activeListUrls
:
undefined
,
activeListUrls
:
undefined
})
store
.
dispatch
(
removeList
(
'
fake-url
'
))
expect
(
store
.
getState
()).
toEqual
({
byUrl
:
{},
activeListUrls
:
undefined
,
activeListUrls
:
undefined
})
})
it
(
'
Removes from active lists if active list is removed
'
,
()
=>
{
...
...
@@ -313,15 +313,15 @@ describe('list reducer', () => {
error
:
null
,
current
:
STUB_TOKEN_LIST
,
loadingRequestId
:
null
,
pendingUpdate
:
PATCHED_STUB_LIST
,
}
,
pendingUpdate
:
PATCHED_STUB_LIST
}
},
activeListUrls
:
[
'
fake-url
'
]
,
activeListUrls
:
[
'
fake-url
'
]
})
store
.
dispatch
(
removeList
(
'
fake-url
'
))
expect
(
store
.
getState
()).
toEqual
({
byUrl
:
{},
activeListUrls
:
[]
,
activeListUrls
:
[]
})
})
})
...
...
@@ -334,10 +334,10 @@ describe('list reducer', () => {
error
:
null
,
current
:
STUB_TOKEN_LIST
,
loadingRequestId
:
null
,
pendingUpdate
:
PATCHED_STUB_LIST
,
}
,
pendingUpdate
:
PATCHED_STUB_LIST
}
},
activeListUrls
:
undefined
,
activeListUrls
:
undefined
})
store
.
dispatch
(
enableList
(
'
fake-url
'
))
expect
(
store
.
getState
()).
toEqual
({
...
...
@@ -346,10 +346,10 @@ describe('list reducer', () => {
error
:
null
,
current
:
STUB_TOKEN_LIST
,
loadingRequestId
:
null
,
pendingUpdate
:
PATCHED_STUB_LIST
,
}
,
pendingUpdate
:
PATCHED_STUB_LIST
}
},
activeListUrls
:
[
'
fake-url
'
]
,
activeListUrls
:
[
'
fake-url
'
]
})
})
it
(
'
adds to url keys if not present already on enable
'
,
()
=>
{
...
...
@@ -359,10 +359,10 @@ describe('list reducer', () => {
error
:
null
,
current
:
STUB_TOKEN_LIST
,
loadingRequestId
:
null
,
pendingUpdate
:
PATCHED_STUB_LIST
,
}
,
pendingUpdate
:
PATCHED_STUB_LIST
}
},
activeListUrls
:
undefined
,
activeListUrls
:
undefined
})
store
.
dispatch
(
enableList
(
'
fake-url-invalid
'
))
expect
(
store
.
getState
()).
toEqual
({
...
...
@@ -371,16 +371,16 @@ describe('list reducer', () => {
error
:
null
,
current
:
STUB_TOKEN_LIST
,
loadingRequestId
:
null
,
pendingUpdate
:
PATCHED_STUB_LIST
,
pendingUpdate
:
PATCHED_STUB_LIST
},
'
fake-url-invalid
'
:
{
error
:
null
,
current
:
null
,
loadingRequestId
:
null
,
pendingUpdate
:
null
,
}
,
pendingUpdate
:
null
}
},
activeListUrls
:
[
'
fake-url-invalid
'
]
,
activeListUrls
:
[
'
fake-url-invalid
'
]
})
})
it
(
'
enable works if list already added
'
,
()
=>
{
...
...
@@ -390,10 +390,10 @@ describe('list reducer', () => {
error
:
null
,
current
:
null
,
loadingRequestId
:
null
,
pendingUpdate
:
null
,
}
,
pendingUpdate
:
null
}
},
activeListUrls
:
undefined
,
activeListUrls
:
undefined
})
store
.
dispatch
(
enableList
(
'
fake-url
'
))
expect
(
store
.
getState
()).
toEqual
({
...
...
@@ -402,10 +402,10 @@ describe('list reducer', () => {
error
:
null
,
current
:
null
,
loadingRequestId
:
null
,
pendingUpdate
:
null
,
}
,
pendingUpdate
:
null
}
},
activeListUrls
:
[
'
fake-url
'
]
,
activeListUrls
:
[
'
fake-url
'
]
})
})
})
...
...
@@ -419,16 +419,16 @@ describe('list reducer', () => {
error
:
null
,
current
:
STUB_TOKEN_LIST
,
loadingRequestId
:
null
,
pendingUpdate
:
null
,
pendingUpdate
:
null
},
'
https://unpkg.com/@uniswap/default-token-list@latest
'
:
{
error
:
null
,
current
:
STUB_TOKEN_LIST
,
loadingRequestId
:
null
,
pendingUpdate
:
null
,
}
,
pendingUpdate
:
null
}
},
activeListUrls
:
undefined
,
activeListUrls
:
undefined
})
store
.
dispatch
(
updateVersion
())
})
...
...
@@ -445,12 +445,12 @@ describe('list reducer', () => {
})
it
(
'
all lists are empty
'
,
()
=>
{
const
s
=
store
.
getState
()
Object
.
keys
(
s
.
byUrl
).
forEach
(
(
url
)
=>
{
Object
.
keys
(
s
.
byUrl
).
forEach
(
url
=>
{
expect
(
s
.
byUrl
[
url
]).
toEqual
({
error
:
null
,
current
:
null
,
loadingRequestId
:
null
,
pendingUpdate
:
null
,
pendingUpdate
:
null
})
})
})
...
...
@@ -469,17 +469,17 @@ describe('list reducer', () => {
error
:
null
,
current
:
STUB_TOKEN_LIST
,
loadingRequestId
:
null
,
pendingUpdate
:
null
,
pendingUpdate
:
null
},
'
https://unpkg.com/@uniswap/default-token-list@latest
'
:
{
error
:
null
,
current
:
STUB_TOKEN_LIST
,
loadingRequestId
:
null
,
pendingUpdate
:
null
,
}
,
pendingUpdate
:
null
}
},
activeListUrls
:
undefined
,
lastInitializedDefaultListOfLists
:
[
'
https://unpkg.com/@uniswap/default-token-list@latest
'
]
,
lastInitializedDefaultListOfLists
:
[
'
https://unpkg.com/@uniswap/default-token-list@latest
'
]
})
store
.
dispatch
(
updateVersion
())
})
...
...
@@ -491,7 +491,7 @@ describe('list reducer', () => {
error
:
null
,
current
:
STUB_TOKEN_LIST
,
loadingRequestId
:
null
,
pendingUpdate
:
null
,
pendingUpdate
:
null
})
})
it
(
'
removes lists in the last initialized list of lists
'
,
()
=>
{
...
...
@@ -502,13 +502,13 @@ describe('list reducer', () => {
const
byUrl
=
store
.
getState
().
byUrl
// note we don't expect the uniswap default list to be prepopulated
// this is ok.
Object
.
keys
(
byUrl
).
forEach
(
(
url
)
=>
{
Object
.
keys
(
byUrl
).
forEach
(
url
=>
{
if
(
url
!==
'
https://unpkg.com/@uniswap/default-token-list@latest/uniswap-default.tokenlist.json
'
)
{
expect
(
byUrl
[
url
]).
toEqual
({
error
:
null
,
current
:
null
,
loadingRequestId
:
null
,
pendingUpdate
:
null
,
pendingUpdate
:
null
})
}
})
...
...
src/state/lists/reducer.ts
View file @
b6d85123
...
...
@@ -28,7 +28,7 @@ const NEW_LIST_STATE: ListState = {
error
:
null
,
current
:
null
,
loadingRequestId
:
null
,
pendingUpdate
:
null
,
pendingUpdate
:
null
}
type
Mutable
<
T
>
=
{
-
readonly
[
P
in
keyof
T
]:
T
[
P
]
extends
ReadonlyArray
<
infer
U
>
?
U
[]
:
T
[
P
]
}
...
...
@@ -39,12 +39,12 @@ const initialState: ListsState = {
...
DEFAULT_LIST_OF_LISTS
.
reduce
<
Mutable
<
ListsState
[
'
byUrl
'
]
>>
((
memo
,
listUrl
)
=>
{
memo
[
listUrl
]
=
NEW_LIST_STATE
return
memo
},
{})
,
},
{})
},
activeListUrls
:
DEFAULT_ACTIVE_LIST_URLS
,
activeListUrls
:
DEFAULT_ACTIVE_LIST_URLS
}
export
default
createReducer
(
initialState
,
(
builder
)
=>
export
default
createReducer
(
initialState
,
builder
=>
builder
.
addCase
(
fetchTokenList
.
pending
,
(
state
,
{
payload
:
{
requestId
,
url
}
})
=>
{
state
.
byUrl
[
url
]
=
{
...
...
@@ -52,7 +52,7 @@ export default createReducer(initialState, (builder) =>
pendingUpdate
:
null
,
...
state
.
byUrl
[
url
],
loadingRequestId
:
requestId
,
error
:
null
,
error
:
null
}
})
.
addCase
(
fetchTokenList
.
fulfilled
,
(
state
,
{
payload
:
{
requestId
,
tokenList
,
url
}
})
=>
{
...
...
@@ -70,7 +70,7 @@ export default createReducer(initialState, (builder) =>
loadingRequestId
:
null
,
error
:
null
,
current
:
current
,
pendingUpdate
:
tokenList
,
pendingUpdate
:
tokenList
}
}
}
else
{
...
...
@@ -84,7 +84,7 @@ export default createReducer(initialState, (builder) =>
loadingRequestId
:
null
,
error
:
null
,
current
:
tokenList
,
pendingUpdate
:
null
,
pendingUpdate
:
null
}
}
})
...
...
@@ -99,7 +99,7 @@ export default createReducer(initialState, (builder) =>
loadingRequestId
:
null
,
error
:
errorMessage
,
current
:
null
,
pendingUpdate
:
null
,
pendingUpdate
:
null
}
})
.
addCase
(
addList
,
(
state
,
{
payload
:
url
})
=>
{
...
...
@@ -113,7 +113,7 @@ export default createReducer(initialState, (builder) =>
}
// remove list from active urls if needed
if
(
state
.
activeListUrls
&&
state
.
activeListUrls
.
includes
(
url
))
{
state
.
activeListUrls
=
state
.
activeListUrls
.
filter
(
(
u
)
=>
u
!==
url
)
state
.
activeListUrls
=
state
.
activeListUrls
.
filter
(
u
=>
u
!==
url
)
}
})
.
addCase
(
enableList
,
(
state
,
{
payload
:
url
})
=>
{
...
...
@@ -131,7 +131,7 @@ export default createReducer(initialState, (builder) =>
})
.
addCase
(
disableList
,
(
state
,
{
payload
:
url
})
=>
{
if
(
state
.
activeListUrls
&&
state
.
activeListUrls
.
includes
(
url
))
{
state
.
activeListUrls
=
state
.
activeListUrls
.
filter
(
(
u
)
=>
u
!==
url
)
state
.
activeListUrls
=
state
.
activeListUrls
.
filter
(
u
=>
u
!==
url
)
}
})
.
addCase
(
acceptListUpdate
,
(
state
,
{
payload
:
url
})
=>
{
...
...
@@ -141,10 +141,10 @@ export default createReducer(initialState, (builder) =>
state
.
byUrl
[
url
]
=
{
...
state
.
byUrl
[
url
],
pendingUpdate
:
null
,
current
:
state
.
byUrl
[
url
].
pendingUpdate
,
current
:
state
.
byUrl
[
url
].
pendingUpdate
}
})
.
addCase
(
updateVersion
,
(
state
)
=>
{
.
addCase
(
updateVersion
,
state
=>
{
// state loaded from localStorage, but new lists have never been initialized
if
(
!
state
.
lastInitializedDefaultListOfLists
)
{
state
.
byUrl
=
initialState
.
byUrl
...
...
@@ -156,13 +156,13 @@ export default createReducer(initialState, (builder) =>
)
const
newListOfListsSet
=
DEFAULT_LIST_OF_LISTS
.
reduce
<
Set
<
string
>>
((
s
,
l
)
=>
s
.
add
(
l
),
new
Set
())
DEFAULT_LIST_OF_LISTS
.
forEach
(
(
listUrl
)
=>
{
DEFAULT_LIST_OF_LISTS
.
forEach
(
listUrl
=>
{
if
(
!
lastInitializedSet
.
has
(
listUrl
))
{
state
.
byUrl
[
listUrl
]
=
NEW_LIST_STATE
}
})
state
.
lastInitializedDefaultListOfLists
.
forEach
(
(
listUrl
)
=>
{
state
.
lastInitializedDefaultListOfLists
.
forEach
(
listUrl
=>
{
if
(
!
newListOfListsSet
.
has
(
listUrl
))
{
delete
state
.
byUrl
[
listUrl
]
}
...
...
src/state/lists/updater.ts
View file @
b6d85123
...
...
@@ -26,8 +26,8 @@ export default function Updater(): null {
const
fetchList
=
useFetchListCallback
()
const
fetchAllListsCallback
=
useCallback
(()
=>
{
if
(
!
isWindowVisible
)
return
Object
.
keys
(
lists
).
forEach
(
(
url
)
=>
fetchList
(
url
).
catch
(
(
error
)
=>
console
.
debug
(
'
interval list fetching error
'
,
error
))
Object
.
keys
(
lists
).
forEach
(
url
=>
fetchList
(
url
).
catch
(
error
=>
console
.
debug
(
'
interval list fetching error
'
,
error
))
)
},
[
fetchList
,
isWindowVisible
,
lists
])
...
...
@@ -36,17 +36,17 @@ export default function Updater(): null {
// whenever a list is not loaded and not loading, try again to load it
useEffect
(()
=>
{
Object
.
keys
(
lists
).
forEach
(
(
listUrl
)
=>
{
Object
.
keys
(
lists
).
forEach
(
listUrl
=>
{
const
list
=
lists
[
listUrl
]
if
(
!
list
.
current
&&
!
list
.
loadingRequestId
&&
!
list
.
error
)
{
fetchList
(
listUrl
).
catch
(
(
error
)
=>
console
.
debug
(
'
list added fetching error
'
,
error
))
fetchList
(
listUrl
).
catch
(
error
=>
console
.
debug
(
'
list added fetching error
'
,
error
))
}
})
},
[
dispatch
,
fetchList
,
library
,
lists
])
// automatically update lists if versions are minor/patch
useEffect
(()
=>
{
Object
.
keys
(
lists
).
forEach
(
(
listUrl
)
=>
{
Object
.
keys
(
lists
).
forEach
(
listUrl
=>
{
const
list
=
lists
[
listUrl
]
if
(
list
.
current
&&
list
.
pendingUpdate
)
{
const
bump
=
getVersionUpgrade
(
list
.
current
.
version
,
list
.
pendingUpdate
.
version
)
...
...
src/state/mint/actions.ts
View file @
b6d85123
...
...
@@ -2,7 +2,7 @@ import { createAction } from '@reduxjs/toolkit'
export
enum
Field
{
CURRENCY_A
=
'
CURRENCY_A
'
,
CURRENCY_B
=
'
CURRENCY_B
'
,
CURRENCY_B
=
'
CURRENCY_B
'
}
export
const
typeInput
=
createAction
<
{
field
:
Field
;
typedValue
:
string
;
noLiquidity
:
boolean
}
>
(
'
mint/typeInputMint
'
)
...
...
src/state/mint/hooks.ts
View file @
b6d85123
...
...
@@ -14,7 +14,7 @@ import { Field, typeInput } from './actions'
const
ZERO
=
JSBI
.
BigInt
(
0
)
export
function
useMintState
():
AppState
[
'
mint
'
]
{
return
useSelector
<
AppState
,
AppState
[
'
mint
'
]
>
(
(
state
)
=>
state
.
mint
)
return
useSelector
<
AppState
,
AppState
[
'
mint
'
]
>
(
state
=>
state
.
mint
)
}
export
function
useMintActionHandlers
(
...
...
@@ -40,7 +40,7 @@ export function useMintActionHandlers(
return
{
onFieldAInput
,
onFieldBInput
,
onFieldBInput
}
}
...
...
@@ -70,7 +70,7 @@ export function useDerivedMintInfo(
const
currencies
:
{
[
field
in
Field
]?:
Currency
}
=
useMemo
(
()
=>
({
[
Field
.
CURRENCY_A
]:
currencyA
??
undefined
,
[
Field
.
CURRENCY_B
]:
currencyB
??
undefined
,
[
Field
.
CURRENCY_B
]:
currencyB
??
undefined
}),
[
currencyA
,
currencyB
]
)
...
...
@@ -85,11 +85,11 @@ export function useDerivedMintInfo(
// balances
const
balances
=
useCurrencyBalances
(
account
??
undefined
,
[
currencies
[
Field
.
CURRENCY_A
],
currencies
[
Field
.
CURRENCY_B
]
,
currencies
[
Field
.
CURRENCY_B
]
])
const
currencyBalances
:
{
[
field
in
Field
]?:
CurrencyAmount
}
=
{
[
Field
.
CURRENCY_A
]:
balances
[
0
],
[
Field
.
CURRENCY_B
]:
balances
[
1
]
,
[
Field
.
CURRENCY_B
]:
balances
[
1
]
}
// amounts
...
...
@@ -119,7 +119,7 @@ export function useDerivedMintInfo(
},
[
noLiquidity
,
otherTypedValue
,
currencies
,
dependentField
,
independentAmount
,
currencyA
,
chainId
,
currencyB
,
pair
])
const
parsedAmounts
:
{
[
field
in
Field
]:
CurrencyAmount
|
undefined
}
=
{
[
Field
.
CURRENCY_A
]:
independentField
===
Field
.
CURRENCY_A
?
independentAmount
:
dependentAmount
,
[
Field
.
CURRENCY_B
]:
independentField
===
Field
.
CURRENCY_A
?
dependentAmount
:
independentAmount
,
[
Field
.
CURRENCY_B
]:
independentField
===
Field
.
CURRENCY_A
?
dependentAmount
:
independentAmount
}
const
price
=
useMemo
(()
=>
{
...
...
@@ -140,7 +140,7 @@ export function useDerivedMintInfo(
const
{
[
Field
.
CURRENCY_A
]:
currencyAAmount
,
[
Field
.
CURRENCY_B
]:
currencyBAmount
}
=
parsedAmounts
const
[
tokenAmountA
,
tokenAmountB
]
=
[
wrappedCurrencyAmount
(
currencyAAmount
,
chainId
),
wrappedCurrencyAmount
(
currencyBAmount
,
chainId
)
,
wrappedCurrencyAmount
(
currencyBAmount
,
chainId
)
]
if
(
pair
&&
totalSupply
&&
tokenAmountA
&&
tokenAmountB
)
{
return
pair
.
getLiquidityMinted
(
totalSupply
,
tokenAmountA
,
tokenAmountB
)
...
...
@@ -191,6 +191,6 @@ export function useDerivedMintInfo(
noLiquidity
,
liquidityMinted
,
poolTokenPercentage
,
error
,
error
}
}
src/state/mint/reducer.test.ts
View file @
b6d85123
...
...
@@ -10,7 +10,7 @@ describe('mint reducer', () => {
store
=
createStore
(
reducer
,
{
independentField
:
Field
.
CURRENCY_A
,
typedValue
:
''
,
otherTypedValue
:
''
,
otherTypedValue
:
''
})
})
...
...
src/state/mint/reducer.ts
View file @
b6d85123
...
...
@@ -10,10 +10,10 @@ export interface MintState {
const
initialState
:
MintState
=
{
independentField
:
Field
.
CURRENCY_A
,
typedValue
:
''
,
otherTypedValue
:
''
,
otherTypedValue
:
''
}
export
default
createReducer
<
MintState
>
(
initialState
,
(
builder
)
=>
export
default
createReducer
<
MintState
>
(
initialState
,
builder
=>
builder
.
addCase
(
resetMintState
,
()
=>
initialState
)
.
addCase
(
typeInput
,
(
state
,
{
payload
:
{
field
,
typedValue
,
noLiquidity
}
})
=>
{
...
...
@@ -23,7 +23,7 @@ export default createReducer<MintState>(initialState, (builder) =>
return
{
...
state
,
independentField
:
field
,
typedValue
,
typedValue
}
}
// they're typing into a new field, store the other value
...
...
@@ -32,7 +32,7 @@ export default createReducer<MintState>(initialState, (builder) =>
...
state
,
independentField
:
field
,
typedValue
,
otherTypedValue
:
state
.
typedValue
,
otherTypedValue
:
state
.
typedValue
}
}
}
else
{
...
...
@@ -40,7 +40,7 @@ export default createReducer<MintState>(initialState, (builder) =>
...
state
,
independentField
:
field
,
typedValue
,
otherTypedValue
:
''
,
otherTypedValue
:
''
}
}
})
...
...
src/state/multicall/actions.test.ts
View file @
b6d85123
...
...
@@ -8,7 +8,7 @@ describe('actions', () => {
it
(
'
does not throw for invalid calldata
'
,
()
=>
{
expect
(
parseCallKey
(
'
0x6b175474e89094c44da98b954eedeac495271d0f-abc
'
)).
toEqual
({
address
:
'
0x6b175474e89094c44da98b954eedeac495271d0f
'
,
callData
:
'
abc
'
,
callData
:
'
abc
'
})
})
it
(
'
throws for invalid format
'
,
()
=>
{
...
...
@@ -17,13 +17,13 @@ describe('actions', () => {
it
(
'
throws for uppercase calldata
'
,
()
=>
{
expect
(
parseCallKey
(
'
0x6b175474e89094c44da98b954eedeac495271d0f-0xabcD
'
)).
toEqual
({
address
:
'
0x6b175474e89094c44da98b954eedeac495271d0f
'
,
callData
:
'
0xabcD
'
,
callData
:
'
0xabcD
'
})
})
it
(
'
parses pieces into address
'
,
()
=>
{
expect
(
parseCallKey
(
'
0x6b175474e89094c44da98b954eedeac495271d0f-0xabcd
'
)).
toEqual
({
address
:
'
0x6b175474e89094c44da98b954eedeac495271d0f
'
,
callData
:
'
0xabcd
'
,
callData
:
'
0xabcd
'
})
})
})
...
...
@@ -36,7 +36,7 @@ describe('actions', () => {
expect
(()
=>
toCallKey
({
address
:
'
0x6b175474e89094c44da98b954eedeac495271d0f
'
,
callData
:
'
abc
'
,
callData
:
'
abc
'
})
).
toThrow
(
'
Invalid hex: abc
'
)
})
...
...
@@ -44,7 +44,7 @@ describe('actions', () => {
expect
(()
=>
toCallKey
({
address
:
'
0x6b175474e89094c44da98b954eedeac495271d0f
'
,
callData
:
'
0xabcD
'
,
callData
:
'
0xabcD
'
})
).
toThrow
(
'
Invalid hex: 0xabcD
'
)
})
...
...
src/state/multicall/actions.ts
View file @
b6d85123
...
...
@@ -24,7 +24,7 @@ export function parseCallKey(callKey: string): Call {
}
return
{
address
:
pcs
[
0
],
callData
:
pcs
[
1
]
,
callData
:
pcs
[
1
]
}
}
...
...
src/state/multicall/hooks.ts
View file @
b6d85123
...
...
@@ -12,7 +12,7 @@ import {
removeMulticallListeners
,
parseCallKey
,
toCallKey
,
ListenerOptions
,
ListenerOptions
}
from
'
./actions
'
export
interface
Result
extends
ReadonlyArray
<
any
>
{
...
...
@@ -31,7 +31,7 @@ function isMethodArg(x: unknown): x is MethodArg {
function
isValidMethodArgs
(
x
:
unknown
):
x
is
MethodArgs
|
undefined
{
return
(
x
===
undefined
||
(
Array
.
isArray
(
x
)
&&
x
.
every
(
(
xi
)
=>
isMethodArg
(
xi
)
||
(
Array
.
isArray
(
xi
)
&&
xi
.
every
(
isMethodArg
))))
(
Array
.
isArray
(
x
)
&&
x
.
every
(
xi
=>
isMethodArg
(
xi
)
||
(
Array
.
isArray
(
xi
)
&&
xi
.
every
(
isMethodArg
))))
)
}
...
...
@@ -45,15 +45,13 @@ const INVALID_RESULT: CallResult = { valid: false, blockNumber: undefined, data:
// use this options object
export
const
NEVER_RELOAD
:
ListenerOptions
=
{
blocksPerFetch
:
Infinity
,
blocksPerFetch
:
Infinity
}
// the lowest level call for subscribing to contract data
function
useCallsData
(
calls
:
(
Call
|
undefined
)[],
options
?:
ListenerOptions
):
CallResult
[]
{
const
{
chainId
}
=
useActiveWeb3React
()
const
callResults
=
useSelector
<
AppState
,
AppState
[
'
multicall
'
][
'
callResults
'
]
>
(
(
state
)
=>
state
.
multicall
.
callResults
)
const
callResults
=
useSelector
<
AppState
,
AppState
[
'
multicall
'
][
'
callResults
'
]
>
(
state
=>
state
.
multicall
.
callResults
)
const
dispatch
=
useDispatch
<
AppDispatch
>
()
const
serializedCallKeys
:
string
=
useMemo
(
...
...
@@ -71,12 +69,12 @@ function useCallsData(calls: (Call | undefined)[], options?: ListenerOptions): C
useEffect
(()
=>
{
const
callKeys
:
string
[]
=
JSON
.
parse
(
serializedCallKeys
)
if
(
!
chainId
||
callKeys
.
length
===
0
)
return
undefined
const
calls
=
callKeys
.
map
(
(
key
)
=>
parseCallKey
(
key
))
const
calls
=
callKeys
.
map
(
key
=>
parseCallKey
(
key
))
dispatch
(
addMulticallListeners
({
chainId
,
calls
,
options
,
options
})
)
...
...
@@ -85,7 +83,7 @@ function useCallsData(calls: (Call | undefined)[], options?: ListenerOptions): C
removeMulticallListeners
({
chainId
,
calls
,
options
,
options
})
)
}
...
...
@@ -93,7 +91,7 @@ function useCallsData(calls: (Call | undefined)[], options?: ListenerOptions): C
return
useMemo
(
()
=>
calls
.
map
<
CallResult
>
(
(
call
)
=>
{
calls
.
map
<
CallResult
>
(
call
=>
{
if
(
!
chainId
||
!
call
)
return
INVALID_RESULT
const
result
=
callResults
[
chainId
]?.[
toCallKey
(
call
)]
...
...
@@ -147,7 +145,7 @@ function toCallState(
loading
:
false
,
error
:
true
,
syncing
,
result
,
result
}
}
}
...
...
@@ -156,7 +154,7 @@ function toCallState(
loading
:
false
,
syncing
,
result
:
result
,
error
:
!
success
,
error
:
!
success
}
}
...
...
@@ -171,10 +169,10 @@ export function useSingleContractMultipleData(
const
calls
=
useMemo
(
()
=>
contract
&&
fragment
&&
callInputs
&&
callInputs
.
length
>
0
?
callInputs
.
map
<
Call
>
(
(
inputs
)
=>
{
?
callInputs
.
map
<
Call
>
(
inputs
=>
{
return
{
address
:
contract
.
address
,
callData
:
contract
.
interface
.
encodeFunctionData
(
fragment
,
inputs
)
,
callData
:
contract
.
interface
.
encodeFunctionData
(
fragment
,
inputs
)
}
})
:
[],
...
...
@@ -186,7 +184,7 @@ export function useSingleContractMultipleData(
const
latestBlockNumber
=
useBlockNumber
()
return
useMemo
(()
=>
{
return
results
.
map
(
(
result
)
=>
toCallState
(
result
,
contract
?.
interface
,
fragment
,
latestBlockNumber
))
return
results
.
map
(
result
=>
toCallState
(
result
,
contract
?.
interface
,
fragment
,
latestBlockNumber
))
},
[
fragment
,
contract
,
results
,
latestBlockNumber
])
}
...
...
@@ -209,11 +207,11 @@ export function useMultipleContractSingleData(
const
calls
=
useMemo
(
()
=>
fragment
&&
addresses
&&
addresses
.
length
>
0
&&
callData
?
addresses
.
map
<
Call
|
undefined
>
(
(
address
)
=>
{
?
addresses
.
map
<
Call
|
undefined
>
(
address
=>
{
return
address
&&
callData
?
{
address
,
callData
,
callData
}
:
undefined
})
...
...
@@ -226,7 +224,7 @@ export function useMultipleContractSingleData(
const
latestBlockNumber
=
useBlockNumber
()
return
useMemo
(()
=>
{
return
results
.
map
(
(
result
)
=>
toCallState
(
result
,
contractInterface
,
fragment
,
latestBlockNumber
))
return
results
.
map
(
result
=>
toCallState
(
result
,
contractInterface
,
fragment
,
latestBlockNumber
))
},
[
fragment
,
results
,
contractInterface
,
latestBlockNumber
])
}
...
...
@@ -243,8 +241,8 @@ export function useSingleCallResult(
?
[
{
address
:
contract
.
address
,
callData
:
contract
.
interface
.
encodeFunctionData
(
fragment
,
inputs
)
,
}
,
callData
:
contract
.
interface
.
encodeFunctionData
(
fragment
,
inputs
)
}
]
:
[]
},
[
contract
,
fragment
,
inputs
])
...
...
src/state/multicall/reducer.test.ts
View file @
b6d85123
...
...
@@ -3,7 +3,7 @@ import {
errorFetchingMulticallResults
,
fetchingMulticallResults
,
removeMulticallListeners
,
updateMulticallResults
,
updateMulticallResults
}
from
'
./actions
'
import
reducer
,
{
MulticallState
}
from
'
./reducer
'
import
{
Store
,
createStore
}
from
'
@reduxjs/toolkit
'
...
...
@@ -29,20 +29,20 @@ describe('multicall reducer', () => {
calls
:
[
{
address
:
DAI_ADDRESS
,
callData
:
'
0x
'
,
}
,
]
,
callData
:
'
0x
'
}
]
})
)
expect
(
store
.
getState
()).
toEqual
({
callListeners
:
{
[
1
]:
{
[
`
${
DAI_ADDRESS
}
-0x`
]:
{
[
1
]:
1
,
}
,
}
,
[
1
]:
1
}
}
},
callResults
:
{}
,
callResults
:
{}
})
})
})
...
...
@@ -54,10 +54,10 @@ describe('multicall reducer', () => {
calls
:
[
{
address
:
DAI_ADDRESS
,
callData
:
'
0x
'
,
}
,
callData
:
'
0x
'
}
],
chainId
:
1
,
chainId
:
1
})
)
expect
(
store
.
getState
()).
toEqual
({
callResults
:
{},
callListeners
:
{}
})
...
...
@@ -69,9 +69,9 @@ describe('multicall reducer', () => {
calls
:
[
{
address
:
DAI_ADDRESS
,
callData
:
'
0x
'
,
}
,
]
,
callData
:
'
0x
'
}
]
})
)
store
.
dispatch
(
...
...
@@ -79,15 +79,15 @@ describe('multicall reducer', () => {
calls
:
[
{
address
:
DAI_ADDRESS
,
callData
:
'
0x
'
,
}
,
callData
:
'
0x
'
}
],
chainId
:
1
,
chainId
:
1
})
)
expect
(
store
.
getState
()).
toEqual
({
callResults
:
{},
callListeners
:
{
[
1
]:
{
[
`
${
DAI_ADDRESS
}
-0x`
]:
{}
}
}
,
callListeners
:
{
[
1
]:
{
[
`
${
DAI_ADDRESS
}
-0x`
]:
{}
}
}
})
})
})
...
...
@@ -99,8 +99,8 @@ describe('multicall reducer', () => {
chainId
:
1
,
blockNumber
:
1
,
results
:
{
abc
:
'
0x
'
,
}
,
abc
:
'
0x
'
}
})
)
expect
(
store
.
getState
()).
toEqual
({
...
...
@@ -108,10 +108,10 @@ describe('multicall reducer', () => {
[
1
]:
{
abc
:
{
blockNumber
:
1
,
data
:
'
0x
'
,
}
,
}
,
}
,
data
:
'
0x
'
}
}
}
})
})
it
(
'
updates old data
'
,
()
=>
{
...
...
@@ -120,8 +120,8 @@ describe('multicall reducer', () => {
chainId
:
1
,
blockNumber
:
1
,
results
:
{
abc
:
'
0x
'
,
}
,
abc
:
'
0x
'
}
})
)
store
.
dispatch
(
...
...
@@ -129,8 +129,8 @@ describe('multicall reducer', () => {
chainId
:
1
,
blockNumber
:
2
,
results
:
{
abc
:
'
0x2
'
,
}
,
abc
:
'
0x2
'
}
})
)
expect
(
store
.
getState
()).
toEqual
({
...
...
@@ -138,10 +138,10 @@ describe('multicall reducer', () => {
[
1
]:
{
abc
:
{
blockNumber
:
2
,
data
:
'
0x2
'
,
}
,
}
,
}
,
data
:
'
0x2
'
}
}
}
})
})
it
(
'
ignores late updates
'
,
()
=>
{
...
...
@@ -150,8 +150,8 @@ describe('multicall reducer', () => {
chainId
:
1
,
blockNumber
:
2
,
results
:
{
abc
:
'
0x2
'
,
}
,
abc
:
'
0x2
'
}
})
)
store
.
dispatch
(
...
...
@@ -159,8 +159,8 @@ describe('multicall reducer', () => {
chainId
:
1
,
blockNumber
:
1
,
results
:
{
abc
:
'
0x1
'
,
}
,
abc
:
'
0x1
'
}
})
)
expect
(
store
.
getState
()).
toEqual
({
...
...
@@ -168,10 +168,10 @@ describe('multicall reducer', () => {
[
1
]:
{
abc
:
{
blockNumber
:
2
,
data
:
'
0x2
'
,
}
,
}
,
}
,
data
:
'
0x2
'
}
}
}
})
})
})
...
...
@@ -181,15 +181,15 @@ describe('multicall reducer', () => {
fetchingMulticallResults
({
chainId
:
1
,
fetchingBlockNumber
:
2
,
calls
:
[{
address
:
DAI_ADDRESS
,
callData
:
'
0x0
'
}]
,
calls
:
[{
address
:
DAI_ADDRESS
,
callData
:
'
0x0
'
}]
})
)
expect
(
store
.
getState
()).
toEqual
({
callResults
:
{
[
1
]:
{
[
`
${
DAI_ADDRESS
}
-0x0`
]:
{
fetchingBlockNumber
:
2
}
,
}
,
}
,
[
`
${
DAI_ADDRESS
}
-0x0`
]:
{
fetchingBlockNumber
:
2
}
}
}
})
})
...
...
@@ -198,22 +198,22 @@ describe('multicall reducer', () => {
fetchingMulticallResults
({
chainId
:
1
,
fetchingBlockNumber
:
2
,
calls
:
[{
address
:
DAI_ADDRESS
,
callData
:
'
0x0
'
}]
,
calls
:
[{
address
:
DAI_ADDRESS
,
callData
:
'
0x0
'
}]
})
)
store
.
dispatch
(
fetchingMulticallResults
({
chainId
:
1
,
fetchingBlockNumber
:
3
,
calls
:
[{
address
:
DAI_ADDRESS
,
callData
:
'
0x0
'
}]
,
calls
:
[{
address
:
DAI_ADDRESS
,
callData
:
'
0x0
'
}]
})
)
expect
(
store
.
getState
()).
toEqual
({
callResults
:
{
[
1
]:
{
[
`
${
DAI_ADDRESS
}
-0x0`
]:
{
fetchingBlockNumber
:
3
}
,
}
,
}
,
[
`
${
DAI_ADDRESS
}
-0x0`
]:
{
fetchingBlockNumber
:
3
}
}
}
})
})
...
...
@@ -222,22 +222,22 @@ describe('multicall reducer', () => {
fetchingMulticallResults
({
chainId
:
1
,
fetchingBlockNumber
:
2
,
calls
:
[{
address
:
DAI_ADDRESS
,
callData
:
'
0x0
'
}]
,
calls
:
[{
address
:
DAI_ADDRESS
,
callData
:
'
0x0
'
}]
})
)
store
.
dispatch
(
fetchingMulticallResults
({
chainId
:
1
,
fetchingBlockNumber
:
1
,
calls
:
[{
address
:
DAI_ADDRESS
,
callData
:
'
0x0
'
}]
,
calls
:
[{
address
:
DAI_ADDRESS
,
callData
:
'
0x0
'
}]
})
)
expect
(
store
.
getState
()).
toEqual
({
callResults
:
{
[
1
]:
{
[
`
${
DAI_ADDRESS
}
-0x0`
]:
{
fetchingBlockNumber
:
2
}
,
}
,
}
,
[
`
${
DAI_ADDRESS
}
-0x0`
]:
{
fetchingBlockNumber
:
2
}
}
}
})
})
})
...
...
@@ -248,13 +248,13 @@ describe('multicall reducer', () => {
errorFetchingMulticallResults
({
chainId
:
1
,
fetchingBlockNumber
:
1
,
calls
:
[{
address
:
DAI_ADDRESS
,
callData
:
'
0x0
'
}]
,
calls
:
[{
address
:
DAI_ADDRESS
,
callData
:
'
0x0
'
}]
})
)
expect
(
store
.
getState
()).
toEqual
({
callResults
:
{
[
1
]:
{}
,
}
,
[
1
]:
{}
}
})
})
it
(
'
updates block number if we were fetching
'
,
()
=>
{
...
...
@@ -262,14 +262,14 @@ describe('multicall reducer', () => {
fetchingMulticallResults
({
chainId
:
1
,
fetchingBlockNumber
:
2
,
calls
:
[{
address
:
DAI_ADDRESS
,
callData
:
'
0x0
'
}]
,
calls
:
[{
address
:
DAI_ADDRESS
,
callData
:
'
0x0
'
}]
})
)
store
.
dispatch
(
errorFetchingMulticallResults
({
chainId
:
1
,
fetchingBlockNumber
:
2
,
calls
:
[{
address
:
DAI_ADDRESS
,
callData
:
'
0x0
'
}]
,
calls
:
[{
address
:
DAI_ADDRESS
,
callData
:
'
0x0
'
}]
})
)
expect
(
store
.
getState
()).
toEqual
({
...
...
@@ -278,10 +278,10 @@ describe('multicall reducer', () => {
[
`
${
DAI_ADDRESS
}
-0x0`
]:
{
blockNumber
:
2
,
// null data indicates error
data
:
null
,
}
,
}
,
}
,
data
:
null
}
}
}
})
})
it
(
'
does nothing if not errored on latest block
'
,
()
=>
{
...
...
@@ -289,22 +289,22 @@ describe('multicall reducer', () => {
fetchingMulticallResults
({
chainId
:
1
,
fetchingBlockNumber
:
3
,
calls
:
[{
address
:
DAI_ADDRESS
,
callData
:
'
0x0
'
}]
,
calls
:
[{
address
:
DAI_ADDRESS
,
callData
:
'
0x0
'
}]
})
)
store
.
dispatch
(
errorFetchingMulticallResults
({
chainId
:
1
,
fetchingBlockNumber
:
2
,
calls
:
[{
address
:
DAI_ADDRESS
,
callData
:
'
0x0
'
}]
,
calls
:
[{
address
:
DAI_ADDRESS
,
callData
:
'
0x0
'
}]
})
)
expect
(
store
.
getState
()).
toEqual
({
callResults
:
{
[
1
]:
{
[
`
${
DAI_ADDRESS
}
-0x0`
]:
{
fetchingBlockNumber
:
3
}
,
}
,
}
,
[
`
${
DAI_ADDRESS
}
-0x0`
]:
{
fetchingBlockNumber
:
3
}
}
}
})
})
})
...
...
src/state/multicall/reducer.ts
View file @
b6d85123
...
...
@@ -5,7 +5,7 @@ import {
fetchingMulticallResults
,
removeMulticallListeners
,
toCallKey
,
updateMulticallResults
,
updateMulticallResults
}
from
'
./actions
'
export
interface
MulticallState
{
...
...
@@ -32,17 +32,17 @@ export interface MulticallState {
}
const
initialState
:
MulticallState
=
{
callResults
:
{}
,
callResults
:
{}
}
export
default
createReducer
(
initialState
,
(
builder
)
=>
export
default
createReducer
(
initialState
,
builder
=>
builder
.
addCase
(
addMulticallListeners
,
(
state
,
{
payload
:
{
calls
,
chainId
,
options
:
{
blocksPerFetch
=
1
}
=
{}
}
})
=>
{
const
listeners
:
MulticallState
[
'
callListeners
'
]
=
state
.
callListeners
?
state
.
callListeners
:
(
state
.
callListeners
=
{})
listeners
[
chainId
]
=
listeners
[
chainId
]
??
{}
calls
.
forEach
(
(
call
)
=>
{
calls
.
forEach
(
call
=>
{
const
callKey
=
toCallKey
(
call
)
listeners
[
chainId
][
callKey
]
=
listeners
[
chainId
][
callKey
]
??
{}
listeners
[
chainId
][
callKey
][
blocksPerFetch
]
=
(
listeners
[
chainId
][
callKey
][
blocksPerFetch
]
??
0
)
+
1
...
...
@@ -56,7 +56,7 @@ export default createReducer(initialState, (builder) =>
:
(
state
.
callListeners
=
{})
if
(
!
listeners
[
chainId
])
return
calls
.
forEach
(
(
call
)
=>
{
calls
.
forEach
(
call
=>
{
const
callKey
=
toCallKey
(
call
)
if
(
!
listeners
[
chainId
][
callKey
])
return
if
(
!
listeners
[
chainId
][
callKey
][
blocksPerFetch
])
return
...
...
@@ -71,12 +71,12 @@ export default createReducer(initialState, (builder) =>
)
.
addCase
(
fetchingMulticallResults
,
(
state
,
{
payload
:
{
chainId
,
fetchingBlockNumber
,
calls
}
})
=>
{
state
.
callResults
[
chainId
]
=
state
.
callResults
[
chainId
]
??
{}
calls
.
forEach
(
(
call
)
=>
{
calls
.
forEach
(
call
=>
{
const
callKey
=
toCallKey
(
call
)
const
current
=
state
.
callResults
[
chainId
][
callKey
]
if
(
!
current
)
{
state
.
callResults
[
chainId
][
callKey
]
=
{
fetchingBlockNumber
,
fetchingBlockNumber
}
}
else
{
if
((
current
.
fetchingBlockNumber
??
0
)
>=
fetchingBlockNumber
)
return
...
...
@@ -86,7 +86,7 @@ export default createReducer(initialState, (builder) =>
})
.
addCase
(
errorFetchingMulticallResults
,
(
state
,
{
payload
:
{
fetchingBlockNumber
,
chainId
,
calls
}
})
=>
{
state
.
callResults
[
chainId
]
=
state
.
callResults
[
chainId
]
??
{}
calls
.
forEach
(
(
call
)
=>
{
calls
.
forEach
(
call
=>
{
const
callKey
=
toCallKey
(
call
)
const
current
=
state
.
callResults
[
chainId
][
callKey
]
if
(
!
current
)
return
// only should be dispatched if we are already fetching
...
...
@@ -99,12 +99,12 @@ export default createReducer(initialState, (builder) =>
})
.
addCase
(
updateMulticallResults
,
(
state
,
{
payload
:
{
chainId
,
results
,
blockNumber
}
})
=>
{
state
.
callResults
[
chainId
]
=
state
.
callResults
[
chainId
]
??
{}
Object
.
keys
(
results
).
forEach
(
(
callKey
)
=>
{
Object
.
keys
(
results
).
forEach
(
callKey
=>
{
const
current
=
state
.
callResults
[
chainId
][
callKey
]
if
((
current
?.
blockNumber
??
0
)
>
blockNumber
)
return
state
.
callResults
[
chainId
][
callKey
]
=
{
data
:
results
[
callKey
],
blockNumber
,
blockNumber
}
})
})
...
...
src/state/multicall/updater.test.ts
View file @
b6d85123
...
...
@@ -9,14 +9,14 @@ describe('multicall updater', () => {
[
1
]:
{
[
'
abc
'
]:
{
4
:
2
,
// 2 listeners care about 4 block old data
1
:
0
,
// 0 listeners care about 1 block old data
}
,
}
,
1
:
0
// 0 listeners care about 1 block old data
}
}
},
1
)
).
toEqual
({
abc
:
4
,
abc
:
4
})
})
it
(
'
applies min
'
,
()
=>
{
...
...
@@ -27,14 +27,14 @@ describe('multicall updater', () => {
[
'
abc
'
]:
{
4
:
2
,
// 2 listeners care about 4 block old data
3
:
1
,
// 1 listener cares about 3 block old data
1
:
0
,
// 0 listeners care about 1 block old data
}
,
}
,
1
:
0
// 0 listeners care about 1 block old data
}
}
},
1
)
).
toEqual
({
abc
:
3
,
abc
:
3
})
})
it
(
'
works for infinity
'
,
()
=>
{
...
...
@@ -44,18 +44,18 @@ describe('multicall updater', () => {
[
1
]:
{
[
'
abc
'
]:
{
4
:
2
,
// 2 listeners care about 4 block old data
1
:
0
,
// 0 listeners care about 1 block old data
1
:
0
// 0 listeners care about 1 block old data
},
[
'
def
'
]:
{
Infinity
:
2
,
}
,
}
,
Infinity
:
2
}
}
},
1
)
).
toEqual
({
abc
:
4
,
def
:
Infinity
,
def
:
Infinity
})
})
it
(
'
multiple keys
'
,
()
=>
{
...
...
@@ -65,19 +65,19 @@ describe('multicall updater', () => {
[
1
]:
{
[
'
abc
'
]:
{
4
:
2
,
// 2 listeners care about 4 block old data
1
:
0
,
// 0 listeners care about 1 block old data
1
:
0
// 0 listeners care about 1 block old data
},
[
'
def
'
]:
{
2
:
1
,
5
:
2
,
}
,
}
,
5
:
2
}
}
},
1
)
).
toEqual
({
abc
:
4
,
def
:
2
,
def
:
2
})
})
it
(
'
ignores negative numbers
'
,
()
=>
{
...
...
@@ -88,14 +88,14 @@ describe('multicall updater', () => {
[
'
abc
'
]:
{
4
:
2
,
1
:
-
1
,
[
-
3
]:
4
,
}
,
}
,
[
-
3
]:
4
}
}
},
1
)
).
toEqual
({
abc
:
4
,
abc
:
4
})
})
it
(
'
applies min to infinity
'
,
()
=>
{
...
...
@@ -106,14 +106,14 @@ describe('multicall updater', () => {
[
'
abc
'
]:
{
Infinity
:
2
,
// 2 listeners care about any data
4
:
2
,
// 2 listeners care about 4 block old data
1
:
0
,
// 0 listeners care about 1 block old data
}
,
}
,
1
:
0
// 0 listeners care about 1 block old data
}
}
},
1
)
).
toEqual
({
abc
:
4
,
abc
:
4
})
})
})
...
...
@@ -136,7 +136,7 @@ describe('multicall updater', () => {
expect
(
outdatedListeningKeys
(
{
[
1
]:
{
abc
:
{
data
:
'
0x
'
,
blockNumber
:
2
},
def
:
{
fetchingBlockNumber
:
2
}
}
,
[
1
]:
{
abc
:
{
data
:
'
0x
'
,
blockNumber
:
2
},
def
:
{
fetchingBlockNumber
:
2
}
}
},
{
abc
:
1
,
def
:
1
},
1
,
...
...
src/state/multicall/updater.tsx
View file @
b6d85123
...
...
@@ -13,7 +13,7 @@ import {
errorFetchingMulticallResults
,
fetchingMulticallResults
,
parseCallKey
,
updateMulticallResults
,
updateMulticallResults
}
from
'
./actions
'
// chunk calls so we do not exceed the gas limit
...
...
@@ -33,9 +33,7 @@ async function fetchChunk(
console
.
debug
(
'
Fetching chunk
'
,
multicallContract
,
chunk
,
minBlockNumber
)
let
resultsBlockNumber
,
returnData
try
{
;[
resultsBlockNumber
,
returnData
]
=
await
multicallContract
.
aggregate
(
chunk
.
map
((
obj
)
=>
[
obj
.
address
,
obj
.
callData
])
)
;[
resultsBlockNumber
,
returnData
]
=
await
multicallContract
.
aggregate
(
chunk
.
map
(
obj
=>
[
obj
.
address
,
obj
.
callData
]))
}
catch
(
error
)
{
console
.
debug
(
'
Failed to fetch chunk inside retry
'
,
error
)
throw
error
...
...
@@ -65,7 +63,7 @@ export function activeListeningKeys(
const
keyListeners
=
listeners
[
callKey
]
memo
[
callKey
]
=
Object
.
keys
(
keyListeners
)
.
filter
(
(
key
)
=>
{
.
filter
(
key
=>
{
const
blocksPerFetch
=
parseInt
(
key
)
if
(
blocksPerFetch
<=
0
)
return
false
return
keyListeners
[
blocksPerFetch
]
>
0
...
...
@@ -95,7 +93,7 @@ export function outdatedListeningKeys(
// no results at all, load everything
if
(
!
results
)
return
Object
.
keys
(
listeningKeys
)
return
Object
.
keys
(
listeningKeys
).
filter
(
(
callKey
)
=>
{
return
Object
.
keys
(
listeningKeys
).
filter
(
callKey
=>
{
const
blocksPerFetch
=
listeningKeys
[
callKey
]
const
data
=
callResults
[
chainId
][
callKey
]
...
...
@@ -114,7 +112,7 @@ export function outdatedListeningKeys(
export
default
function
Updater
():
null
{
const
dispatch
=
useDispatch
<
AppDispatch
>
()
const
state
=
useSelector
<
AppState
,
AppState
[
'
multicall
'
]
>
(
(
state
)
=>
state
.
multicall
)
const
state
=
useSelector
<
AppState
,
AppState
[
'
multicall
'
]
>
(
state
=>
state
.
multicall
)
// wait for listeners to settle before triggering updates
const
debouncedListeners
=
useDebounce
(
state
.
callListeners
,
100
)
const
latestBlockNumber
=
useBlockNumber
()
...
...
@@ -131,7 +129,7 @@ export default function Updater(): null {
},
[
chainId
,
state
.
callResults
,
listeningKeys
,
latestBlockNumber
])
const
serializedOutdatedCallKeys
=
useMemo
(()
=>
JSON
.
stringify
(
unserializedOutdatedCallKeys
.
sort
()),
[
unserializedOutdatedCallKeys
,
unserializedOutdatedCallKeys
])
useEffect
(()
=>
{
...
...
@@ -139,19 +137,19 @@ export default function Updater(): null {
const
outdatedCallKeys
:
string
[]
=
JSON
.
parse
(
serializedOutdatedCallKeys
)
if
(
outdatedCallKeys
.
length
===
0
)
return
const
calls
=
outdatedCallKeys
.
map
(
(
key
)
=>
parseCallKey
(
key
))
const
calls
=
outdatedCallKeys
.
map
(
key
=>
parseCallKey
(
key
))
const
chunkedCalls
=
chunkArray
(
calls
,
CALL_CHUNK_SIZE
)
if
(
cancellations
.
current
?.
blockNumber
!==
latestBlockNumber
)
{
cancellations
.
current
?.
cancellations
?.
forEach
(
(
c
)
=>
c
())
cancellations
.
current
?.
cancellations
?.
forEach
(
c
=>
c
())
}
dispatch
(
fetchingMulticallResults
({
calls
,
chainId
,
fetchingBlockNumber
:
latestBlockNumber
,
fetchingBlockNumber
:
latestBlockNumber
})
)
...
...
@@ -161,7 +159,7 @@ export default function Updater(): null {
const
{
cancel
,
promise
}
=
retry
(()
=>
fetchChunk
(
multicallContract
,
chunk
,
latestBlockNumber
),
{
n
:
Infinity
,
minWait
:
2500
,
maxWait
:
3500
,
maxWait
:
3500
})
promise
.
then
(({
results
:
returnData
,
blockNumber
:
fetchBlockNumber
})
=>
{
...
...
@@ -180,7 +178,7 @@ export default function Updater(): null {
memo
[
callKey
]
=
returnData
[
i
]
??
null
return
memo
},
{}),
blockNumber
:
fetchBlockNumber
,
blockNumber
:
fetchBlockNumber
})
)
})
...
...
@@ -194,12 +192,12 @@ export default function Updater(): null {
errorFetchingMulticallResults
({
calls
:
chunk
,
chainId
,
fetchingBlockNumber
:
latestBlockNumber
,
fetchingBlockNumber
:
latestBlockNumber
})
)
})
return
cancel
})
,
})
}
},
[
chainId
,
multicallContract
,
dispatch
,
serializedOutdatedCallKeys
,
latestBlockNumber
])
...
...
src/state/stake/hooks.ts
View file @
b6d85123
...
...
@@ -21,21 +21,21 @@ export const STAKING_REWARDS_INFO: {
[
ChainId
.
MAINNET
]:
[
{
tokens
:
[
WETH
[
ChainId
.
MAINNET
],
DAI
],
stakingRewardAddress
:
'
0xa1484C3aa22a66C62b77E0AE78E15258bd0cB711
'
,
stakingRewardAddress
:
'
0xa1484C3aa22a66C62b77E0AE78E15258bd0cB711
'
},
{
tokens
:
[
WETH
[
ChainId
.
MAINNET
],
USDC
],
stakingRewardAddress
:
'
0x7FBa4B8Dc5E7616e59622806932DBea72537A56b
'
,
stakingRewardAddress
:
'
0x7FBa4B8Dc5E7616e59622806932DBea72537A56b
'
},
{
tokens
:
[
WETH
[
ChainId
.
MAINNET
],
USDT
],
stakingRewardAddress
:
'
0x6C3e4cb2E96B01F4b866965A91ed4437839A121a
'
,
stakingRewardAddress
:
'
0x6C3e4cb2E96B01F4b866965A91ed4437839A121a
'
},
{
tokens
:
[
WETH
[
ChainId
.
MAINNET
],
WBTC
],
stakingRewardAddress
:
'
0xCA35e32e7926b96A9988f61d510E038108d8068e
'
,
}
,
]
,
stakingRewardAddress
:
'
0xCA35e32e7926b96A9988f61d510E038108d8068e
'
}
]
}
export
interface
StakingInfo
{
...
...
@@ -76,7 +76,7 @@ export function useStakingInfo(pairToFilterBy?: Pair | null): StakingInfo[] {
const
info
=
useMemo
(
()
=>
chainId
?
STAKING_REWARDS_INFO
[
chainId
]?.
filter
(
(
stakingRewardInfo
)
=>
?
STAKING_REWARDS_INFO
[
chainId
]?.
filter
(
stakingRewardInfo
=>
pairToFilterBy
===
undefined
?
true
:
pairToFilterBy
===
null
...
...
@@ -193,7 +193,7 @@ export function useStakingInfo(pairToFilterBy?: Pair | null): StakingInfo[] {
stakedAmount
:
stakedAmount
,
totalStakedAmount
:
totalStakedAmount
,
getHypotheticalRewardRate
,
active
,
active
})
}
return
memo
...
...
@@ -208,7 +208,7 @@ export function useStakingInfo(pairToFilterBy?: Pair | null): StakingInfo[] {
rewardRates
,
rewardsAddresses
,
totalSupplies
,
uni
,
uni
])
}
...
...
@@ -256,7 +256,7 @@ export function useDerivedStakeInfo(
return
{
parsedAmount
,
error
,
error
}
}
...
...
@@ -284,6 +284,6 @@ export function useDerivedUnstakeInfo(
return
{
parsedAmount
,
error
,
error
}
}
src/state/swap/actions.ts
View file @
b6d85123
...
...
@@ -2,7 +2,7 @@ import { createAction } from '@reduxjs/toolkit'
export
enum
Field
{
INPUT
=
'
INPUT
'
,
OUTPUT
=
'
OUTPUT
'
,
OUTPUT
=
'
OUTPUT
'
}
export
const
selectCurrency
=
createAction
<
{
field
:
Field
;
currencyId
:
string
}
>
(
'
swap/selectCurrency
'
)
...
...
src/state/swap/hooks.test.ts
View file @
b6d85123
...
...
@@ -17,7 +17,7 @@ describe('hooks', () => {
[
Field
.
INPUT
]:
{
currencyId
:
'
ETH
'
},
typedValue
:
'
20.5
'
,
independentField
:
Field
.
OUTPUT
,
recipient
:
null
,
recipient
:
null
})
})
...
...
@@ -29,7 +29,7 @@ describe('hooks', () => {
[
Field
.
OUTPUT
]:
{
currencyId
:
'
ETH
'
},
typedValue
:
''
,
independentField
:
Field
.
INPUT
,
recipient
:
null
,
recipient
:
null
})
})
...
...
@@ -43,7 +43,7 @@ describe('hooks', () => {
[
Field
.
INPUT
]:
{
currencyId
:
''
},
typedValue
:
'
20.5
'
,
independentField
:
Field
.
INPUT
,
recipient
:
null
,
recipient
:
null
})
})
...
...
@@ -57,7 +57,7 @@ describe('hooks', () => {
[
Field
.
INPUT
]:
{
currencyId
:
''
},
typedValue
:
'
20.5
'
,
independentField
:
Field
.
INPUT
,
recipient
:
null
,
recipient
:
null
})
})
...
...
@@ -66,7 +66,7 @@ describe('hooks', () => {
queryParametersToSwapState
(
parse
(
'
?outputCurrency=eth&exactAmount=20.5&recipient=0x0fF2D1eFd7A57B7562b2bf27F3f37899dB27F4a5
'
,
{
parseArrays
:
false
,
ignoreQueryPrefix
:
true
,
ignoreQueryPrefix
:
true
})
)
).
toEqual
({
...
...
@@ -74,7 +74,7 @@ describe('hooks', () => {
[
Field
.
INPUT
]:
{
currencyId
:
''
},
typedValue
:
'
20.5
'
,
independentField
:
Field
.
INPUT
,
recipient
:
'
0x0fF2D1eFd7A57B7562b2bf27F3f37899dB27F4a5
'
,
recipient
:
'
0x0fF2D1eFd7A57B7562b2bf27F3f37899dB27F4a5
'
})
})
test
(
'
accepts any recipient
'
,
()
=>
{
...
...
@@ -82,7 +82,7 @@ describe('hooks', () => {
queryParametersToSwapState
(
parse
(
'
?outputCurrency=eth&exactAmount=20.5&recipient=bob.argent.xyz
'
,
{
parseArrays
:
false
,
ignoreQueryPrefix
:
true
,
ignoreQueryPrefix
:
true
})
)
).
toEqual
({
...
...
@@ -90,7 +90,7 @@ describe('hooks', () => {
[
Field
.
INPUT
]:
{
currencyId
:
''
},
typedValue
:
'
20.5
'
,
independentField
:
Field
.
INPUT
,
recipient
:
'
bob.argent.xyz
'
,
recipient
:
'
bob.argent.xyz
'
})
})
})
...
...
src/state/swap/hooks.ts
View file @
b6d85123
...
...
@@ -20,7 +20,7 @@ import { useUserSlippageTolerance } from '../user/hooks'
import
{
computeSlippageAdjustedAmounts
}
from
'
../../utils/prices
'
export
function
useSwapState
():
AppState
[
'
swap
'
]
{
return
useSelector
<
AppState
,
AppState
[
'
swap
'
]
>
(
(
state
)
=>
state
.
swap
)
return
useSelector
<
AppState
,
AppState
[
'
swap
'
]
>
(
state
=>
state
.
swap
)
}
export
function
useSwapActionHandlers
():
{
...
...
@@ -35,7 +35,7 @@ export function useSwapActionHandlers(): {
dispatch
(
selectCurrency
({
field
,
currencyId
:
currency
instanceof
Token
?
currency
.
address
:
currency
===
ETHER
?
'
ETH
'
:
''
,
currencyId
:
currency
instanceof
Token
?
currency
.
address
:
currency
===
ETHER
?
'
ETH
'
:
''
})
)
},
...
...
@@ -64,7 +64,7 @@ export function useSwapActionHandlers(): {
onSwitchTokens
,
onCurrencySelection
,
onUserInput
,
onChangeRecipient
,
onChangeRecipient
}
}
...
...
@@ -91,7 +91,7 @@ export function tryParseAmount(value?: string, currency?: Currency): CurrencyAmo
const
BAD_RECIPIENT_ADDRESSES
:
string
[]
=
[
'
0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f
'
,
// v2 factory
'
0xf164fC0Ec4E93095b804a4795bBe1e041497b92a
'
,
// v2 router 01
'
0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
'
,
// v2 router 02
'
0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
'
// v2 router 02
]
/**
...
...
@@ -101,8 +101,8 @@ const BAD_RECIPIENT_ADDRESSES: string[] = [
*/
function
involvesAddress
(
trade
:
Trade
,
checksummedAddress
:
string
):
boolean
{
return
(
trade
.
route
.
path
.
some
(
(
token
)
=>
token
.
address
===
checksummedAddress
)
||
trade
.
route
.
pairs
.
some
(
(
pair
)
=>
pair
.
liquidityToken
.
address
===
checksummedAddress
)
trade
.
route
.
path
.
some
(
token
=>
token
.
address
===
checksummedAddress
)
||
trade
.
route
.
pairs
.
some
(
pair
=>
pair
.
liquidityToken
.
address
===
checksummedAddress
)
)
}
...
...
@@ -124,7 +124,7 @@ export function useDerivedSwapInfo(): {
typedValue
,
[
Field
.
INPUT
]:
{
currencyId
:
inputCurrencyId
},
[
Field
.
OUTPUT
]:
{
currencyId
:
outputCurrencyId
},
recipient
,
recipient
}
=
useSwapState
()
const
inputCurrency
=
useCurrency
(
inputCurrencyId
)
...
...
@@ -134,7 +134,7 @@ export function useDerivedSwapInfo(): {
const
relevantTokenBalances
=
useCurrencyBalances
(
account
??
undefined
,
[
inputCurrency
??
undefined
,
outputCurrency
??
undefined
,
outputCurrency
??
undefined
])
const
isExactIn
:
boolean
=
independentField
===
Field
.
INPUT
...
...
@@ -147,12 +147,12 @@ export function useDerivedSwapInfo(): {
const
currencyBalances
=
{
[
Field
.
INPUT
]:
relevantTokenBalances
[
0
],
[
Field
.
OUTPUT
]:
relevantTokenBalances
[
1
]
,
[
Field
.
OUTPUT
]:
relevantTokenBalances
[
1
]
}
const
currencies
:
{
[
field
in
Field
]?:
Currency
}
=
{
[
Field
.
INPUT
]:
inputCurrency
??
undefined
,
[
Field
.
OUTPUT
]:
outputCurrency
??
undefined
,
[
Field
.
OUTPUT
]:
outputCurrency
??
undefined
}
// get link to trade on v1, if a better rate exists
...
...
@@ -200,7 +200,7 @@ export function useDerivedSwapInfo(): {
:
null
:
slippageAdjustedAmounts
?
slippageAdjustedAmounts
[
Field
.
INPUT
]
:
null
,
:
null
]
if
(
balanceIn
&&
amountIn
&&
balanceIn
.
lessThan
(
amountIn
))
{
...
...
@@ -213,7 +213,7 @@ export function useDerivedSwapInfo(): {
parsedAmount
,
v2Trade
:
v2Trade
??
undefined
,
inputError
,
v1Trade
,
v1Trade
}
}
...
...
@@ -261,14 +261,14 @@ export function queryParametersToSwapState(parsedQs: ParsedQs): SwapState {
return
{
[
Field
.
INPUT
]:
{
currencyId
:
inputCurrency
,
currencyId
:
inputCurrency
},
[
Field
.
OUTPUT
]:
{
currencyId
:
outputCurrency
,
currencyId
:
outputCurrency
},
typedValue
:
parseTokenAmountURLParameter
(
parsedQs
.
exactAmount
),
independentField
:
parseIndependentFieldURLParameter
(
parsedQs
.
exactField
),
recipient
,
recipient
}
}
...
...
@@ -293,7 +293,7 @@ export function useDefaultsFromURLSearch():
field
:
parsed
.
independentField
,
inputCurrencyId
:
parsed
[
Field
.
INPUT
].
currencyId
,
outputCurrencyId
:
parsed
[
Field
.
OUTPUT
].
currencyId
,
recipient
:
parsed
.
recipient
,
recipient
:
parsed
.
recipient
})
)
...
...
src/state/swap/reducer.test.ts
View file @
b6d85123
...
...
@@ -11,7 +11,7 @@ describe('swap reducer', () => {
[
Field
.
INPUT
]:
{
currencyId
:
''
},
typedValue
:
''
,
independentField
:
Field
.
INPUT
,
recipient
:
null
,
recipient
:
null
})
})
...
...
@@ -20,7 +20,7 @@ describe('swap reducer', () => {
store
.
dispatch
(
selectCurrency
({
field
:
Field
.
OUTPUT
,
currencyId
:
'
0x0000
'
,
currencyId
:
'
0x0000
'
})
)
...
...
@@ -29,7 +29,7 @@ describe('swap reducer', () => {
[
Field
.
INPUT
]:
{
currencyId
:
''
},
typedValue
:
''
,
independentField
:
Field
.
INPUT
,
recipient
:
null
,
recipient
:
null
})
})
})
...
...
src/state/swap/reducer.ts
View file @
b6d85123
...
...
@@ -18,29 +18,29 @@ const initialState: SwapState = {
independentField
:
Field
.
INPUT
,
typedValue
:
''
,
[
Field
.
INPUT
]:
{
currencyId
:
''
,
currencyId
:
''
},
[
Field
.
OUTPUT
]:
{
currencyId
:
''
,
currencyId
:
''
},
recipient
:
null
,
recipient
:
null
}
export
default
createReducer
<
SwapState
>
(
initialState
,
(
builder
)
=>
export
default
createReducer
<
SwapState
>
(
initialState
,
builder
=>
builder
.
addCase
(
replaceSwapState
,
(
state
,
{
payload
:
{
typedValue
,
recipient
,
field
,
inputCurrencyId
,
outputCurrencyId
}
})
=>
{
return
{
[
Field
.
INPUT
]:
{
currencyId
:
inputCurrencyId
,
currencyId
:
inputCurrencyId
},
[
Field
.
OUTPUT
]:
{
currencyId
:
outputCurrencyId
,
currencyId
:
outputCurrencyId
},
independentField
:
field
,
typedValue
:
typedValue
,
recipient
,
recipient
}
}
)
...
...
@@ -52,29 +52,29 @@ export default createReducer<SwapState>(initialState, (builder) =>
...
state
,
independentField
:
state
.
independentField
===
Field
.
INPUT
?
Field
.
OUTPUT
:
Field
.
INPUT
,
[
field
]:
{
currencyId
:
currencyId
},
[
otherField
]:
{
currencyId
:
state
[
field
].
currencyId
}
,
[
otherField
]:
{
currencyId
:
state
[
field
].
currencyId
}
}
}
else
{
// the normal case
return
{
...
state
,
[
field
]:
{
currencyId
:
currencyId
}
,
[
field
]:
{
currencyId
:
currencyId
}
}
}
})
.
addCase
(
switchCurrencies
,
(
state
)
=>
{
.
addCase
(
switchCurrencies
,
state
=>
{
return
{
...
state
,
independentField
:
state
.
independentField
===
Field
.
INPUT
?
Field
.
OUTPUT
:
Field
.
INPUT
,
[
Field
.
INPUT
]:
{
currencyId
:
state
[
Field
.
OUTPUT
].
currencyId
},
[
Field
.
OUTPUT
]:
{
currencyId
:
state
[
Field
.
INPUT
].
currencyId
}
,
[
Field
.
OUTPUT
]:
{
currencyId
:
state
[
Field
.
INPUT
].
currencyId
}
}
})
.
addCase
(
typeInput
,
(
state
,
{
payload
:
{
field
,
typedValue
}
})
=>
{
return
{
...
state
,
independentField
:
field
,
typedValue
,
typedValue
}
})
.
addCase
(
setRecipient
,
(
state
,
{
payload
:
{
recipient
}
})
=>
{
...
...
src/state/transactions/hooks.tsx
View file @
b6d85123
...
...
@@ -21,7 +21,7 @@ export function useTransactionAdder(): (
{
summary
,
approval
,
claim
,
claim
}:
{
summary
?:
string
;
claim
?:
{
recipient
:
string
};
approval
?:
{
tokenAddress
:
string
;
spender
:
string
}
}
=
{}
)
=>
{
if
(
!
account
)
return
...
...
@@ -41,7 +41,7 @@ export function useTransactionAdder(): (
export
function
useAllTransactions
():
{
[
txHash
:
string
]:
TransactionDetails
}
{
const
{
chainId
}
=
useActiveWeb3React
()
const
state
=
useSelector
<
AppState
,
AppState
[
'
transactions
'
]
>
(
(
state
)
=>
state
.
transactions
)
const
state
=
useSelector
<
AppState
,
AppState
[
'
transactions
'
]
>
(
state
=>
state
.
transactions
)
return
chainId
?
state
[
chainId
]
??
{}
:
{}
}
...
...
@@ -69,7 +69,7 @@ export function useHasPendingApproval(tokenAddress: string | undefined, spender:
()
=>
typeof
tokenAddress
===
'
string
'
&&
typeof
spender
===
'
string
'
&&
Object
.
keys
(
allTransactions
).
some
(
(
hash
)
=>
{
Object
.
keys
(
allTransactions
).
some
(
hash
=>
{
const
tx
=
allTransactions
[
hash
]
if
(
!
tx
)
return
false
if
(
tx
.
receipt
)
{
...
...
@@ -93,7 +93,7 @@ export function useUserHasSubmittedClaim(
// get the txn if it has been submitted
const
claimTxn
=
useMemo
(()
=>
{
const
txnIndex
=
Object
.
keys
(
allTransactions
).
find
(
(
hash
)
=>
{
const
txnIndex
=
Object
.
keys
(
allTransactions
).
find
(
hash
=>
{
const
tx
=
allTransactions
[
hash
]
return
tx
.
claim
&&
tx
.
claim
.
recipient
===
account
})
...
...
src/state/transactions/reducer.test.ts
View file @
b6d85123
...
...
@@ -19,7 +19,7 @@ describe('transaction reducer', () => {
summary
:
'
hello world
'
,
hash
:
'
0x0
'
,
approval
:
{
tokenAddress
:
'
abc
'
,
spender
:
'
def
'
},
from
:
'
abc
'
,
from
:
'
abc
'
})
)
const
txs
=
store
.
getState
()
...
...
@@ -49,8 +49,8 @@ describe('transaction reducer', () => {
from
:
'
0x0
'
,
contractAddress
:
'
0x0
'
,
blockHash
:
'
0x0
'
,
blockNumber
:
1
,
}
,
blockNumber
:
1
}
})
)
expect
(
store
.
getState
()).
toEqual
({})
...
...
@@ -62,7 +62,7 @@ describe('transaction reducer', () => {
chainId
:
ChainId
.
RINKEBY
,
approval
:
{
spender
:
'
0x0
'
,
tokenAddress
:
'
0x0
'
},
summary
:
'
hello world
'
,
from
:
'
0x0
'
,
from
:
'
0x0
'
})
)
const
beforeTime
=
new
Date
().
getTime
()
...
...
@@ -78,8 +78,8 @@ describe('transaction reducer', () => {
from
:
'
0x0
'
,
contractAddress
:
'
0x0
'
,
blockHash
:
'
0x0
'
,
blockNumber
:
1
,
}
,
blockNumber
:
1
}
})
)
const
tx
=
store
.
getState
()[
ChainId
.
RINKEBY
]?.[
'
0x0
'
]
...
...
@@ -93,7 +93,7 @@ describe('transaction reducer', () => {
from
:
'
0x0
'
,
contractAddress
:
'
0x0
'
,
blockHash
:
'
0x0
'
,
blockNumber
:
1
,
blockNumber
:
1
})
})
})
...
...
@@ -104,7 +104,7 @@ describe('transaction reducer', () => {
checkedTransaction
({
chainId
:
ChainId
.
RINKEBY
,
hash
:
'
0x0
'
,
blockNumber
:
1
,
blockNumber
:
1
})
)
expect
(
store
.
getState
()).
toEqual
({})
...
...
@@ -116,14 +116,14 @@ describe('transaction reducer', () => {
chainId
:
ChainId
.
RINKEBY
,
approval
:
{
spender
:
'
0x0
'
,
tokenAddress
:
'
0x0
'
},
summary
:
'
hello world
'
,
from
:
'
0x0
'
,
from
:
'
0x0
'
})
)
store
.
dispatch
(
checkedTransaction
({
chainId
:
ChainId
.
RINKEBY
,
hash
:
'
0x0
'
,
blockNumber
:
1
,
blockNumber
:
1
})
)
const
tx
=
store
.
getState
()[
ChainId
.
RINKEBY
]?.[
'
0x0
'
]
...
...
@@ -136,21 +136,21 @@ describe('transaction reducer', () => {
chainId
:
ChainId
.
RINKEBY
,
approval
:
{
spender
:
'
0x0
'
,
tokenAddress
:
'
0x0
'
},
summary
:
'
hello world
'
,
from
:
'
0x0
'
,
from
:
'
0x0
'
})
)
store
.
dispatch
(
checkedTransaction
({
chainId
:
ChainId
.
RINKEBY
,
hash
:
'
0x0
'
,
blockNumber
:
3
,
blockNumber
:
3
})
)
store
.
dispatch
(
checkedTransaction
({
chainId
:
ChainId
.
RINKEBY
,
hash
:
'
0x0
'
,
blockNumber
:
1
,
blockNumber
:
1
})
)
const
tx
=
store
.
getState
()[
ChainId
.
RINKEBY
]?.[
'
0x0
'
]
...
...
@@ -166,7 +166,7 @@ describe('transaction reducer', () => {
summary
:
'
hello world
'
,
hash
:
'
0x0
'
,
approval
:
{
tokenAddress
:
'
abc
'
,
spender
:
'
def
'
},
from
:
'
abc
'
,
from
:
'
abc
'
})
)
store
.
dispatch
(
...
...
@@ -175,7 +175,7 @@ describe('transaction reducer', () => {
summary
:
'
hello world
'
,
hash
:
'
0x1
'
,
approval
:
{
tokenAddress
:
'
abc
'
,
spender
:
'
def
'
},
from
:
'
abc
'
,
from
:
'
abc
'
})
)
expect
(
Object
.
keys
(
store
.
getState
())).
toHaveLength
(
2
)
...
...
src/state/transactions/reducer.ts
View file @
b6d85123
...
...
@@ -4,7 +4,7 @@ import {
checkedTransaction
,
clearAllTransactions
,
finalizeTransaction
,
SerializableTransactionReceipt
,
SerializableTransactionReceipt
}
from
'
./actions
'
const
now
=
()
=>
new
Date
().
getTime
()
...
...
@@ -29,7 +29,7 @@ export interface TransactionState {
export
const
initialState
:
TransactionState
=
{}
export
default
createReducer
(
initialState
,
(
builder
)
=>
export
default
createReducer
(
initialState
,
builder
=>
builder
.
addCase
(
addTransaction
,
(
transactions
,
{
payload
:
{
chainId
,
from
,
hash
,
approval
,
summary
,
claim
}
})
=>
{
if
(
transactions
[
chainId
]?.[
hash
])
{
...
...
src/state/transactions/updater.tsx
View file @
b6d85123
...
...
@@ -35,7 +35,7 @@ export default function Updater(): null {
const
lastBlockNumber
=
useBlockNumber
()
const
dispatch
=
useDispatch
<
AppDispatch
>
()
const
state
=
useSelector
<
AppState
,
AppState
[
'
transactions
'
]
>
(
(
state
)
=>
state
.
transactions
)
const
state
=
useSelector
<
AppState
,
AppState
[
'
transactions
'
]
>
(
state
=>
state
.
transactions
)
const
transactions
=
chainId
?
state
[
chainId
]
??
{}
:
{}
...
...
@@ -46,11 +46,11 @@ export default function Updater(): null {
if
(
!
chainId
||
!
library
||
!
lastBlockNumber
)
return
Object
.
keys
(
transactions
)
.
filter
(
(
hash
)
=>
shouldCheck
(
lastBlockNumber
,
transactions
[
hash
]))
.
forEach
(
(
hash
)
=>
{
.
filter
(
hash
=>
shouldCheck
(
lastBlockNumber
,
transactions
[
hash
]))
.
forEach
(
hash
=>
{
library
.
getTransactionReceipt
(
hash
)
.
then
(
(
receipt
)
=>
{
.
then
(
receipt
=>
{
if
(
receipt
)
{
dispatch
(
finalizeTransaction
({
...
...
@@ -64,8 +64,8 @@ export default function Updater(): null {
status
:
receipt
.
status
,
to
:
receipt
.
to
,
transactionHash
:
receipt
.
transactionHash
,
transactionIndex
:
receipt
.
transactionIndex
,
}
,
transactionIndex
:
receipt
.
transactionIndex
}
})
)
...
...
@@ -74,8 +74,8 @@ export default function Updater(): null {
txn
:
{
hash
,
success
:
receipt
.
status
===
1
,
summary
:
transactions
[
hash
]?.
summary
,
}
,
summary
:
transactions
[
hash
]?.
summary
}
},
hash
)
...
...
@@ -83,7 +83,7 @@ export default function Updater(): null {
dispatch
(
checkedTransaction
({
chainId
,
hash
,
blockNumber
:
lastBlockNumber
}))
}
})
.
catch
(
(
error
)
=>
{
.
catch
(
error
=>
{
console
.
error
(
`failed to check transaction hash:
${
hash
}
`
,
error
)
})
})
...
...
src/state/user/hooks.tsx
View file @
b6d85123
...
...
@@ -19,7 +19,7 @@ import {
updateUserExpertMode
,
updateUserSlippageTolerance
,
toggleURLWarning
,
updateUserSingleHopOnly
,
updateUserSingleHopOnly
}
from
'
./actions
'
function
serializeToken
(
token
:
Token
):
SerializedToken
{
...
...
@@ -28,7 +28,7 @@ function serializeToken(token: Token): SerializedToken {
address
:
token
.
address
,
decimals
:
token
.
decimals
,
symbol
:
token
.
symbol
,
name
:
token
.
name
,
name
:
token
.
name
}
}
...
...
@@ -49,7 +49,7 @@ export function useIsDarkMode(): boolean {
>
(
({
user
:
{
matchesDarkMode
,
userDarkMode
}
})
=>
({
userDarkMode
,
matchesDarkMode
,
matchesDarkMode
}),
shallowEqual
)
...
...
@@ -69,7 +69,7 @@ export function useDarkModeManager(): [boolean, () => void] {
}
export
function
useIsExpertMode
():
boolean
{
return
useSelector
<
AppState
,
AppState
[
'
user
'
][
'
userExpertMode
'
]
>
(
(
state
)
=>
state
.
user
.
userExpertMode
)
return
useSelector
<
AppState
,
AppState
[
'
user
'
][
'
userExpertMode
'
]
>
(
state
=>
state
.
user
.
userExpertMode
)
}
export
function
useExpertModeManager
():
[
boolean
,
()
=>
void
]
{
...
...
@@ -87,14 +87,14 @@ export function useUserSingleHopOnly(): [boolean, (newSingleHopOnly: boolean) =>
const
dispatch
=
useDispatch
<
AppDispatch
>
()
const
singleHopOnly
=
useSelector
<
AppState
,
AppState
[
'
user
'
][
'
userSingleHopOnly
'
]
>
(
(
state
)
=>
state
.
user
.
userSingleHopOnly
state
=>
state
.
user
.
userSingleHopOnly
)
const
setSingleHopOnly
=
useCallback
(
(
newSingleHopOnly
:
boolean
)
=>
{
ReactGA
.
event
({
category
:
'
Routing
'
,
action
:
newSingleHopOnly
?
'
enable single hop
'
:
'
disable single hop
'
,
action
:
newSingleHopOnly
?
'
enable single hop
'
:
'
disable single hop
'
})
dispatch
(
updateUserSingleHopOnly
({
userSingleHopOnly
:
newSingleHopOnly
}))
},
...
...
@@ -106,7 +106,7 @@ export function useUserSingleHopOnly(): [boolean, (newSingleHopOnly: boolean) =>
export
function
useUserSlippageTolerance
():
[
number
,
(
slippage
:
number
)
=>
void
]
{
const
dispatch
=
useDispatch
<
AppDispatch
>
()
const
userSlippageTolerance
=
useSelector
<
AppState
,
AppState
[
'
user
'
][
'
userSlippageTolerance
'
]
>
(
(
state
)
=>
{
const
userSlippageTolerance
=
useSelector
<
AppState
,
AppState
[
'
user
'
][
'
userSlippageTolerance
'
]
>
(
state
=>
{
return
state
.
user
.
userSlippageTolerance
})
...
...
@@ -122,7 +122,7 @@ export function useUserSlippageTolerance(): [number, (slippage: number) => void]
export
function
useUserTransactionTTL
():
[
number
,
(
slippage
:
number
)
=>
void
]
{
const
dispatch
=
useDispatch
<
AppDispatch
>
()
const
userDeadline
=
useSelector
<
AppState
,
AppState
[
'
user
'
][
'
userDeadline
'
]
>
(
(
state
)
=>
{
const
userDeadline
=
useSelector
<
AppState
,
AppState
[
'
user
'
][
'
userDeadline
'
]
>
(
state
=>
{
return
state
.
user
.
userDeadline
})
...
...
@@ -169,7 +169,7 @@ export function useUserAddedTokens(): Token[] {
function
serializePair
(
pair
:
Pair
):
SerializedPair
{
return
{
token0
:
serializeToken
(
pair
.
token0
),
token1
:
serializeToken
(
pair
.
token1
)
,
token1
:
serializeToken
(
pair
.
token1
)
}
}
...
...
@@ -216,14 +216,14 @@ export function useTrackedTokenPairs(): [Token, Token][] {
const
generatedPairs
:
[
Token
,
Token
][]
=
useMemo
(
()
=>
chainId
?
flatMap
(
Object
.
keys
(
tokens
),
(
tokenAddress
)
=>
{
?
flatMap
(
Object
.
keys
(
tokens
),
tokenAddress
=>
{
const
token
=
tokens
[
tokenAddress
]
// for each token on the current chain,
return
(
// loop though all bases on the current chain
(
BASES_TO_TRACK_LIQUIDITY_FOR
[
chainId
]
??
[])
// to construct pairs of the given token with each base
.
map
(
(
base
)
=>
{
.
map
(
base
=>
{
if
(
base
.
address
===
token
.
address
)
{
return
null
}
else
{
...
...
@@ -245,7 +245,7 @@ export function useTrackedTokenPairs(): [Token, Token][] {
const
forChain
=
savedSerializedPairs
[
chainId
]
if
(
!
forChain
)
return
[]
return
Object
.
keys
(
forChain
).
map
(
(
pairId
)
=>
{
return
Object
.
keys
(
forChain
).
map
(
pairId
=>
{
return
[
deserializeToken
(
forChain
[
pairId
].
token0
),
deserializeToken
(
forChain
[
pairId
].
token1
)]
})
},
[
savedSerializedPairs
,
chainId
])
...
...
@@ -253,7 +253,7 @@ export function useTrackedTokenPairs(): [Token, Token][] {
const
combinedList
=
useMemo
(()
=>
userPairs
.
concat
(
generatedPairs
).
concat
(
pinnedPairs
),
[
generatedPairs
,
pinnedPairs
,
userPairs
,
userPairs
])
return
useMemo
(()
=>
{
...
...
@@ -266,6 +266,6 @@ export function useTrackedTokenPairs(): [Token, Token][] {
return
memo
},
{})
return
Object
.
keys
(
keyed
).
map
(
(
key
)
=>
keyed
[
key
])
return
Object
.
keys
(
keyed
).
map
(
key
=>
keyed
[
key
])
},
[
combinedList
])
}
src/state/user/reducer.test.ts
View file @
b6d85123
...
...
@@ -23,7 +23,7 @@ describe('swap reducer', () => {
store
=
createStore
(
reducer
,
{
...
initialState
,
userDeadline
:
undefined
,
userSlippageTolerance
:
undefined
,
userSlippageTolerance
:
undefined
}
as
any
)
store
.
dispatch
(
updateVersion
())
expect
(
store
.
getState
().
userDeadline
).
toEqual
(
DEFAULT_DEADLINE_FROM_NOW
)
...
...
src/state/user/reducer.ts
View file @
b6d85123
...
...
@@ -14,7 +14,7 @@ import {
updateUserSlippageTolerance
,
updateUserDeadline
,
toggleURLWarning
,
updateUserSingleHopOnly
,
updateUserSingleHopOnly
}
from
'
./actions
'
const
currentTimestamp
=
()
=>
new
Date
().
getTime
()
...
...
@@ -67,12 +67,12 @@ export const initialState: UserState = {
tokens
:
{},
pairs
:
{},
timestamp
:
currentTimestamp
(),
URLWarningVisible
:
true
,
URLWarningVisible
:
true
}
export
default
createReducer
(
initialState
,
(
builder
)
=>
export
default
createReducer
(
initialState
,
builder
=>
builder
.
addCase
(
updateVersion
,
(
state
)
=>
{
.
addCase
(
updateVersion
,
state
=>
{
// slippage isnt being tracked in local storage, reset to default
// noinspection SuspiciousTypeOfGuard
if
(
typeof
state
.
userSlippageTolerance
!==
'
number
'
)
{
...
...
@@ -139,7 +139,7 @@ export default createReducer(initialState, (builder) =>
}
state
.
timestamp
=
currentTimestamp
()
})
.
addCase
(
toggleURLWarning
,
(
state
)
=>
{
.
addCase
(
toggleURLWarning
,
state
=>
{
state
.
URLWarningVisible
=
!
state
.
URLWarningVisible
})
)
src/state/wallet/hooks.ts
View file @
b6d85123
...
...
@@ -32,7 +32,7 @@ export function useETHBalances(
const
results
=
useSingleContractMultipleData
(
multicallContract
,
'
getEthBalance
'
,
addresses
.
map
(
(
address
)
=>
[
address
])
addresses
.
map
(
address
=>
[
address
])
)
return
useMemo
(
...
...
@@ -58,11 +58,11 @@ export function useTokenBalancesWithLoadingIndicator(
[
tokens
]
)
const
validatedTokenAddresses
=
useMemo
(()
=>
validatedTokens
.
map
(
(
vt
)
=>
vt
.
address
),
[
validatedTokens
])
const
validatedTokenAddresses
=
useMemo
(()
=>
validatedTokens
.
map
(
vt
=>
vt
.
address
),
[
validatedTokens
])
const
balances
=
useMultipleContractSingleData
(
validatedTokenAddresses
,
ERC20_INTERFACE
,
'
balanceOf
'
,
[
address
])
const
anyLoading
:
boolean
=
useMemo
(()
=>
balances
.
some
(
(
callState
)
=>
callState
.
loading
),
[
balances
])
const
anyLoading
:
boolean
=
useMemo
(()
=>
balances
.
some
(
callState
=>
callState
.
loading
),
[
balances
])
return
[
useMemo
(
...
...
@@ -79,7 +79,7 @@ export function useTokenBalancesWithLoadingIndicator(
:
{},
[
address
,
validatedTokens
,
balances
]
),
anyLoading
,
anyLoading
]
}
...
...
@@ -102,16 +102,16 @@ export function useCurrencyBalances(
currencies
?:
(
Currency
|
undefined
)[]
):
(
CurrencyAmount
|
undefined
)[]
{
const
tokens
=
useMemo
(()
=>
currencies
?.
filter
((
currency
):
currency
is
Token
=>
currency
instanceof
Token
)
??
[],
[
currencies
,
currencies
])
const
tokenBalances
=
useTokenBalances
(
account
,
tokens
)
const
containsETH
:
boolean
=
useMemo
(()
=>
currencies
?.
some
(
(
currency
)
=>
currency
===
ETHER
)
??
false
,
[
currencies
])
const
containsETH
:
boolean
=
useMemo
(()
=>
currencies
?.
some
(
currency
=>
currency
===
ETHER
)
??
false
,
[
currencies
])
const
ethBalance
=
useETHBalances
(
containsETH
?
[
account
]
:
[])
return
useMemo
(
()
=>
currencies
?.
map
(
(
currency
)
=>
{
currencies
?.
map
(
currency
=>
{
if
(
!
account
||
!
currency
)
return
undefined
if
(
currency
instanceof
Token
)
return
tokenBalances
[
currency
.
address
]
if
(
currency
===
ETHER
)
return
ethBalance
[
account
]
...
...
src/theme/DarkModeQueryParamReader.tsx
View file @
b6d85123
...
...
@@ -14,7 +14,7 @@ export default function DarkModeQueryParamReader({ location: { search } }: Route
const
parsed
=
parse
(
search
,
{
parseArrays
:
false
,
ignoreQueryPrefix
:
true
,
ignoreQueryPrefix
:
true
})
const
theme
=
parsed
.
theme
...
...
src/theme/components.tsx
View file @
b6d85123
...
...
@@ -24,7 +24,7 @@ export const ButtonText = styled.button`
`
export
const
Button
=
styled
.
button
.
attrs
<
{
warning
:
boolean
},
{
backgroundColor
:
string
}
>
(({
warning
,
theme
})
=>
({
backgroundColor
:
warning
?
theme
.
red1
:
theme
.
primary1
,
backgroundColor
:
warning
?
theme
.
red1
:
theme
.
primary1
}))
`
padding: 1rem 2rem 1rem 2rem;
border-radius: 3rem;
...
...
src/theme/index.tsx
View file @
b6d85123
...
...
@@ -4,7 +4,7 @@ import styled, {
ThemeProvider
as
StyledComponentsThemeProvider
,
createGlobalStyle
,
css
,
DefaultTheme
,
DefaultTheme
}
from
'
styled-components
'
import
{
useIsDarkMode
}
from
'
../state/user/hooks
'
import
{
Text
,
TextProps
}
from
'
rebass
'
...
...
@@ -16,7 +16,7 @@ const MEDIA_WIDTHS = {
upToExtraSmall
:
500
,
upToSmall
:
720
,
upToMedium
:
960
,
upToLarge
:
1280
,
upToLarge
:
1280
}
const
mediaWidthTemplates
:
{
[
width
in
keyof
typeof
MEDIA_WIDTHS
]:
typeof
css
}
=
Object
.
keys
(
MEDIA_WIDTHS
).
reduce
(
...
...
@@ -80,7 +80,7 @@ export function colors(darkMode: boolean): Colors {
green1
:
'
#27AE60
'
,
yellow1
:
'
#FFE270
'
,
yellow2
:
'
#F3841E
'
,
blue1
:
'
#2172E5
'
,
blue1
:
'
#2172E5
'
// dont wanna forget these blue yet
// blue4: darkMode ? '#153d6f70' : '#C4D9F8',
...
...
@@ -95,7 +95,7 @@ export function theme(darkMode: boolean): DefaultTheme {
grids
:
{
sm
:
8
,
md
:
12
,
lg
:
24
,
lg
:
24
},
//shadows
...
...
@@ -112,7 +112,7 @@ export function theme(darkMode: boolean): DefaultTheme {
flexRowNoWrap
:
css
`
display: flex;
flex-flow: row nowrap;
`
,
`
}
}
...
...
@@ -173,7 +173,7 @@ export const TYPE = {
},
error
({
error
,
...
props
}:
{
error
:
boolean
}
&
TextProps
)
{
return
<
TextWrapper
fontWeight=
{
500
}
color=
{
error
?
'
red1
'
:
'
text2
'
}
{
...
props
}
/>
}
,
}
}
export
const
FixedGlobalStyle
=
createGlobalStyle
`
...
...
src/utils/chunkArray.test.ts
View file @
b6d85123
...
...
@@ -14,7 +14,7 @@ describe('#chunkArray', () => {
it
(
'
size exact half
'
,
()
=>
{
expect
(
chunkArray
([
1
,
2
,
3
,
4
],
2
)).
toEqual
([
[
1
,
2
],
[
3
,
4
]
,
[
3
,
4
]
])
})
it
(
'
evenly distributes
'
,
()
=>
{
...
...
@@ -22,8 +22,8 @@ describe('#chunkArray', () => {
expect
(
chunked
).
toEqual
([
[...
Array
(
34
).
keys
()],
[...
Array
(
34
).
keys
()].
map
(
(
i
)
=>
i
+
34
),
[...
Array
(
32
).
keys
()].
map
(
(
i
)
=>
i
+
68
),
[...
Array
(
34
).
keys
()].
map
(
i
=>
i
+
34
),
[...
Array
(
32
).
keys
()].
map
(
i
=>
i
+
68
)
])
expect
(
chunked
[
0
][
0
]).
toEqual
(
0
)
...
...
src/utils/chunkArray.ts
View file @
b6d85123
...
...
@@ -7,5 +7,5 @@ export default function chunkArray<T>(items: T[], maxChunkSize: number): T[][] {
const
numChunks
:
number
=
Math
.
ceil
(
items
.
length
/
maxChunkSize
)
const
chunkSize
=
Math
.
ceil
(
items
.
length
/
numChunks
)
return
[...
Array
(
numChunks
).
keys
()].
map
(
(
ix
)
=>
items
.
slice
(
ix
*
chunkSize
,
ix
*
chunkSize
+
chunkSize
))
return
[...
Array
(
numChunks
).
keys
()].
map
(
ix
=>
items
.
slice
(
ix
*
chunkSize
,
ix
*
chunkSize
+
chunkSize
))
}
src/utils/index.test.ts
View file @
b6d85123
...
...
@@ -8,7 +8,7 @@ import {
isAddress
,
shortenAddress
,
calculateGasMargin
,
basisPointsToPercent
,
basisPointsToPercent
}
from
'
.
'
describe
(
'
utils
'
,
()
=>
{
...
...
@@ -37,10 +37,10 @@ describe('utils', () => {
it
(
'
bounds are correct
'
,
()
=>
{
const
tokenAmount
=
new
TokenAmount
(
new
Token
(
ChainId
.
MAINNET
,
AddressZero
,
0
),
'
100
'
)
expect
(()
=>
calculateSlippageAmount
(
tokenAmount
,
-
1
)).
toThrow
()
expect
(
calculateSlippageAmount
(
tokenAmount
,
0
).
map
(
(
bound
)
=>
bound
.
toString
())).
toEqual
([
'
100
'
,
'
100
'
])
expect
(
calculateSlippageAmount
(
tokenAmount
,
100
).
map
(
(
bound
)
=>
bound
.
toString
())).
toEqual
([
'
99
'
,
'
101
'
])
expect
(
calculateSlippageAmount
(
tokenAmount
,
200
).
map
(
(
bound
)
=>
bound
.
toString
())).
toEqual
([
'
98
'
,
'
102
'
])
expect
(
calculateSlippageAmount
(
tokenAmount
,
10000
).
map
(
(
bound
)
=>
bound
.
toString
())).
toEqual
([
'
0
'
,
'
200
'
])
expect
(
calculateSlippageAmount
(
tokenAmount
,
0
).
map
(
bound
=>
bound
.
toString
())).
toEqual
([
'
100
'
,
'
100
'
])
expect
(
calculateSlippageAmount
(
tokenAmount
,
100
).
map
(
bound
=>
bound
.
toString
())).
toEqual
([
'
99
'
,
'
101
'
])
expect
(
calculateSlippageAmount
(
tokenAmount
,
200
).
map
(
bound
=>
bound
.
toString
())).
toEqual
([
'
98
'
,
'
102
'
])
expect
(
calculateSlippageAmount
(
tokenAmount
,
10000
).
map
(
bound
=>
bound
.
toString
())).
toEqual
([
'
0
'
,
'
200
'
])
expect
(()
=>
calculateSlippageAmount
(
tokenAmount
,
10001
)).
toThrow
()
})
})
...
...
src/utils/index.ts
View file @
b6d85123
...
...
@@ -22,7 +22,7 @@ const ETHERSCAN_PREFIXES: { [chainId in ChainId]: string } = {
3
:
'
ropsten.
'
,
4
:
'
rinkeby.
'
,
5
:
'
goerli.
'
,
42
:
'
kovan.
'
,
42
:
'
kovan.
'
}
export
function
getEtherscanLink
(
...
...
@@ -74,7 +74,7 @@ export function calculateSlippageAmount(value: CurrencyAmount, slippage: number)
}
return
[
JSBI
.
divide
(
JSBI
.
multiply
(
value
.
raw
,
JSBI
.
BigInt
(
10000
-
slippage
)),
JSBI
.
BigInt
(
10000
)),
JSBI
.
divide
(
JSBI
.
multiply
(
value
.
raw
,
JSBI
.
BigInt
(
10000
+
slippage
)),
JSBI
.
BigInt
(
10000
))
,
JSBI
.
divide
(
JSBI
.
multiply
(
value
.
raw
,
JSBI
.
BigInt
(
10000
+
slippage
)),
JSBI
.
BigInt
(
10000
))
]
}
...
...
src/utils/prices.test.ts
View file @
b6d85123
...
...
@@ -13,7 +13,7 @@ describe('prices', () => {
it
(
'
returns undefined for undefined
'
,
()
=>
{
expect
(
computeTradePriceBreakdown
(
undefined
)).
toEqual
({
priceImpactWithoutFee
:
undefined
,
realizedLPFee
:
undefined
,
realizedLPFee
:
undefined
})
})
...
...
src/utils/prices.ts
View file @
b6d85123
...
...
@@ -50,7 +50,7 @@ export function computeSlippageAdjustedAmounts(
const
pct
=
basisPointsToPercent
(
allowedSlippage
)
return
{
[
Field
.
INPUT
]:
trade
?.
maximumAmountIn
(
pct
),
[
Field
.
OUTPUT
]:
trade
?.
minimumAmountOut
(
pct
)
,
[
Field
.
OUTPUT
]:
trade
?.
minimumAmountOut
(
pct
)
}
}
...
...
src/utils/resolveENSContentHash.ts
View file @
b6d85123
...
...
@@ -8,20 +8,20 @@ const REGISTRAR_ABI = [
inputs
:
[
{
name
:
'
node
'
,
type
:
'
bytes32
'
,
}
,
type
:
'
bytes32
'
}
],
name
:
'
resolver
'
,
outputs
:
[
{
name
:
'
resolverAddress
'
,
type
:
'
address
'
,
}
,
type
:
'
address
'
}
],
payable
:
false
,
stateMutability
:
'
view
'
,
type
:
'
function
'
,
}
,
type
:
'
function
'
}
]
const
REGISTRAR_ADDRESS
=
'
0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e
'
...
...
@@ -32,21 +32,21 @@ const RESOLVER_ABI = [
{
internalType
:
'
bytes32
'
,
name
:
'
node
'
,
type
:
'
bytes32
'
,
}
,
type
:
'
bytes32
'
}
],
name
:
'
contenthash
'
,
outputs
:
[
{
internalType
:
'
bytes
'
,
name
:
''
,
type
:
'
bytes
'
,
}
,
type
:
'
bytes
'
}
],
payable
:
false
,
stateMutability
:
'
view
'
,
type
:
'
function
'
,
}
,
type
:
'
function
'
}
]
// cache the resolver contracts since most of them are the public resolver
...
...
src/utils/retry.ts
View file @
b6d85123
function
wait
(
ms
:
number
):
Promise
<
void
>
{
return
new
Promise
(
(
resolve
)
=>
setTimeout
(
resolve
,
ms
))
return
new
Promise
(
resolve
=>
setTimeout
(
resolve
,
ms
))
}
function
waitRandom
(
min
:
number
,
max
:
number
):
Promise
<
void
>
{
...
...
@@ -64,6 +64,6 @@ export function retry<T>(
if
(
completed
)
return
completed
=
true
rejectCancelled
(
new
CancelledError
())
}
,
}
}
}
src/utils/uriToHttp.test.ts
View file @
b6d85123
...
...
@@ -13,13 +13,13 @@ describe('uriToHttp', () => {
it
(
'
returns ipfs gateways for ipfs:// urls
'
,
()
=>
{
expect
(
uriToHttp
(
'
ipfs://QmV8AfDE8GFSGQvt3vck8EwAzsPuNTmtP8VcQJE3qxRPaZ
'
)).
toEqual
([
'
https://cloudflare-ipfs.com/ipfs/QmV8AfDE8GFSGQvt3vck8EwAzsPuNTmtP8VcQJE3qxRPaZ/
'
,
'
https://ipfs.io/ipfs/QmV8AfDE8GFSGQvt3vck8EwAzsPuNTmtP8VcQJE3qxRPaZ/
'
,
'
https://ipfs.io/ipfs/QmV8AfDE8GFSGQvt3vck8EwAzsPuNTmtP8VcQJE3qxRPaZ/
'
])
})
it
(
'
returns ipns gateways for ipns:// urls
'
,
()
=>
{
expect
(
uriToHttp
(
'
ipns://app.uniswap.org
'
)).
toEqual
([
'
https://cloudflare-ipfs.com/ipns/app.uniswap.org/
'
,
'
https://ipfs.io/ipns/app.uniswap.org/
'
,
'
https://ipfs.io/ipns/app.uniswap.org/
'
])
})
it
(
'
returns empty array for invalid scheme
'
,
()
=>
{
...
...
src/utils/useUSDCPrice.ts
View file @
b6d85123
...
...
@@ -16,10 +16,10 @@ export default function useUSDCPrice(currency?: Currency): Price | undefined {
()
=>
[
[
chainId
&&
wrapped
&&
currencyEquals
(
WETH
[
chainId
],
wrapped
)
?
undefined
:
currency
,
chainId
?
WETH
[
chainId
]
:
undefined
,
chainId
?
WETH
[
chainId
]
:
undefined
],
[
wrapped
?.
equals
(
USDC
)
?
undefined
:
wrapped
,
chainId
===
ChainId
.
MAINNET
?
USDC
:
undefined
],
[
chainId
?
WETH
[
chainId
]
:
undefined
,
chainId
===
ChainId
.
MAINNET
?
USDC
:
undefined
]
,
[
chainId
?
WETH
[
chainId
]
:
undefined
,
chainId
===
ChainId
.
MAINNET
?
USDC
:
undefined
]
],
[
chainId
,
currency
,
wrapped
]
)
...
...
src/utils/v1SwapArgument.test.ts
View file @
b6d85123
...
...
@@ -15,7 +15,7 @@ describe('v1SwapArguments', () => {
const
result
=
v1SwapArguments
(
trade
,
{
recipient
:
TEST_RECIPIENT_ADDRESS
,
allowedSlippage
:
new
Percent
(
'
1
'
,
'
100
'
),
deadline
:
20
*
60
,
deadline
:
20
*
60
})
expect
(
result
.
methodName
).
toEqual
(
'
ethToTokenTransferInput
'
)
expect
(
result
.
args
).
toEqual
([
'
0x62
'
,
'
0x4b0
'
,
TEST_RECIPIENT_ADDRESS
])
...
...
@@ -26,7 +26,7 @@ describe('v1SwapArguments', () => {
const
result
=
v1SwapArguments
(
trade
,
{
recipient
:
TEST_RECIPIENT_ADDRESS
,
allowedSlippage
:
new
Percent
(
'
1
'
,
'
100
'
),
deadline
:
40
*
60
,
deadline
:
40
*
60
})
expect
(
result
.
methodName
).
toEqual
(
'
tokenToEthTransferInput
'
)
expect
(
result
.
args
[
0
]).
toEqual
(
'
0x64
'
)
...
...
@@ -40,7 +40,7 @@ describe('v1SwapArguments', () => {
const
result
=
v1SwapArguments
(
trade
,
{
recipient
:
TEST_RECIPIENT_ADDRESS
,
allowedSlippage
:
new
Percent
(
'
1
'
,
'
100
'
),
deadline
:
20
*
60
,
deadline
:
20
*
60
})
expect
(
result
.
methodName
).
toEqual
(
'
tokenToTokenTransferInput
'
)
expect
(
result
.
args
[
0
]).
toEqual
(
'
0x64
'
)
...
...
@@ -56,7 +56,7 @@ describe('v1SwapArguments', () => {
const
result
=
v1SwapArguments
(
trade
,
{
recipient
:
TEST_RECIPIENT_ADDRESS
,
allowedSlippage
:
new
Percent
(
'
1
'
,
'
100
'
),
deadline
:
20
*
60
,
deadline
:
20
*
60
})
expect
(
result
.
methodName
).
toEqual
(
'
ethToTokenTransferOutput
'
)
expect
(
result
.
args
[
0
]).
toEqual
(
'
0x64
'
)
...
...
@@ -69,7 +69,7 @@ describe('v1SwapArguments', () => {
const
result
=
v1SwapArguments
(
trade
,
{
recipient
:
TEST_RECIPIENT_ADDRESS
,
allowedSlippage
:
new
Percent
(
'
1
'
,
'
100
'
),
deadline
:
20
*
60
,
deadline
:
20
*
60
})
expect
(
result
.
methodName
).
toEqual
(
'
tokenToEthTransferOutput
'
)
expect
(
result
.
args
[
0
]).
toEqual
(
'
0x64
'
)
...
...
@@ -83,7 +83,7 @@ describe('v1SwapArguments', () => {
const
result
=
v1SwapArguments
(
trade
,
{
recipient
:
TEST_RECIPIENT_ADDRESS
,
allowedSlippage
:
new
Percent
(
'
1
'
,
'
100
'
),
deadline
:
20
*
60
,
deadline
:
20
*
60
})
expect
(
result
.
methodName
).
toEqual
(
'
tokenToTokenTransferOutput
'
)
expect
(
result
.
args
[
0
]).
toEqual
(
'
0x64
'
)
...
...
src/utils/v1SwapArguments.ts
View file @
b6d85123
...
...
@@ -34,13 +34,13 @@ export default function v1SwapArguments(
return
{
methodName
:
'
ethToTokenTransferInput
'
,
args
:
[
minimumAmountOut
,
deadline
,
options
.
recipient
],
value
:
maximumAmountIn
,
value
:
maximumAmountIn
}
}
else
if
(
outputETH
)
{
return
{
methodName
:
'
tokenToEthTransferInput
'
,
args
:
[
maximumAmountIn
,
minimumAmountOut
,
deadline
,
options
.
recipient
],
value
:
'
0x0
'
,
value
:
'
0x0
'
}
}
else
{
const
outputToken
=
trade
.
outputAmount
.
currency
...
...
@@ -51,7 +51,7 @@ export default function v1SwapArguments(
return
{
methodName
:
'
tokenToTokenTransferInput
'
,
args
:
[
maximumAmountIn
,
minimumAmountOut
,
'
0x1
'
,
deadline
,
options
.
recipient
,
outputToken
.
address
],
value
:
'
0x0
'
,
value
:
'
0x0
'
}
}
}
else
{
...
...
@@ -59,13 +59,13 @@ export default function v1SwapArguments(
return
{
methodName
:
'
ethToTokenTransferOutput
'
,
args
:
[
minimumAmountOut
,
deadline
,
options
.
recipient
],
value
:
maximumAmountIn
,
value
:
maximumAmountIn
}
}
else
if
(
outputETH
)
{
return
{
methodName
:
'
tokenToEthTransferOutput
'
,
args
:
[
minimumAmountOut
,
maximumAmountIn
,
deadline
,
options
.
recipient
],
value
:
'
0x0
'
,
value
:
'
0x0
'
}
}
else
{
const
output
=
trade
.
outputAmount
.
currency
...
...
@@ -81,9 +81,9 @@ export default function v1SwapArguments(
MaxUint256
.
toHexString
(),
deadline
,
options
.
recipient
,
output
.
address
,
output
.
address
],
value
:
'
0x0
'
,
value
:
'
0x0
'
}
}
}
...
...
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