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
f5087880
Unverified
Commit
f5087880
authored
Mar 21, 2022
by
Zach Pomerantz
Committed by
GitHub
Mar 21, 2022
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
fix: impact rendering (#3553)
* fix: price impact rendering * fix: webkit-compat gradient
parent
377026bc
Changes
9
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
65 additions
and
55 deletions
+65
-55
Expando.tsx
src/lib/components/Expando.tsx
+1
-1
Output.tsx
src/lib/components/Swap/Output.tsx
+1
-1
Details.tsx
src/lib/components/Swap/Summary/Details.tsx
+14
-12
Summary.tsx
src/lib/components/Swap/Summary/Summary.tsx
+4
-4
index.tsx
src/lib/components/Swap/Summary/index.tsx
+11
-11
Caption.tsx
src/lib/components/Swap/Toolbar/Caption.tsx
+5
-4
TokenImg.tsx
src/lib/components/TokenImg.tsx
+1
-0
useSwapInfo.tsx
src/lib/hooks/swap/useSwapInfo.tsx
+17
-10
useUSDCPriceImpact.ts
src/lib/hooks/useUSDCPriceImpact.ts
+11
-12
No files found.
src/lib/components/Expando.tsx
View file @
f5087880
...
...
@@ -18,7 +18,7 @@ const ExpandoColumn = styled(Column)<{ height: number; open: boolean }>`
transition: height 0.25s, padding 0.25s;
:after {
background: linear-gradient(
#ffffff00
,
${({
theme
})
=>
theme
.
dialog
}
);
background: linear-gradient(
transparent
,
${({
theme
})
=>
theme
.
dialog
}
);
bottom: 0;
content: '';
height: 0.75em;
...
...
src/lib/components/Swap/Output.tsx
View file @
f5087880
...
...
@@ -83,7 +83,7 @@ export default function Output({ disabled, focused, children }: PropsWithChildre
<
Row
>
<
USDC
gap=
{
0.5
}
isLoading=
{
isRouteLoading
}
>
{
outputUSDC
?
`$${formatCurrencyAmount(outputUSDC, 6, 'en', 2)}`
:
'
-
'
}{
'
'
}
{
impact
.
display
&&
<
ThemedText
.
Body2
color=
{
impact
.
warning
}
>
(
{
impact
.
display
}
)
</
ThemedText
.
Body2
>
}
{
impact
&&
<
ThemedText
.
Body2
color=
{
impact
.
warning
}
>
(
{
impact
.
toString
()
}
)
</
ThemedText
.
Body2
>
}
</
USDC
>
{
balance
&&
(
<
Balance
focused=
{
focused
}
>
...
...
src/lib/components/Swap/Summary/Details.tsx
View file @
f5087880
import
{
t
}
from
'
@lingui/macro
'
import
{
useLingui
}
from
'
@lingui/react
'
import
{
Trade
}
from
'
@uniswap/router-sdk
'
import
{
Currency
,
Percent
,
TradeType
}
from
'
@uniswap/sdk-core
'
import
{
Currency
,
TradeType
}
from
'
@uniswap/sdk-core
'
import
{
useAtomValue
}
from
'
jotai/utils
'
import
Column
from
'
lib/components/Column
'
import
Row
from
'
lib/components/Row
'
import
{
Slippage
}
from
'
lib/hooks/useSlippage
'
import
{
PriceImpact
}
from
'
lib/hooks/useUSDCPriceImpact
'
import
{
feeOptionsAtom
}
from
'
lib/state/swap
'
import
styled
,
{
Color
,
ThemedText
}
from
'
lib/theme
'
import
{
useMemo
}
from
'
react
'
...
...
@@ -36,11 +38,11 @@ function Detail({ label, value, color }: DetailProps) {
interface
DetailsProps
{
trade
:
Trade
<
Currency
,
Currency
,
TradeType
>
slippage
:
{
auto
:
boolean
;
allowed
:
Percent
;
warning
?:
Color
}
priceImpact
:
{
priceImpact
?:
string
;
warning
?:
Color
}
slippage
:
Slippage
impact
?:
PriceImpact
}
export
default
function
Details
({
trade
,
slippage
,
priceI
mpact
}:
DetailsProps
)
{
export
default
function
Details
({
trade
,
slippage
,
i
mpact
}:
DetailsProps
)
{
const
{
inputAmount
,
outputAmount
}
=
trade
const
inputCurrency
=
inputAmount
.
currency
const
outputCurrency
=
outputAmount
.
currency
...
...
@@ -61,8 +63,8 @@ export default function Details({ trade, slippage, priceImpact }: DetailsProps)
}
}
if
(
priceImpact
.
priceI
mpact
)
{
rows
.
push
([
t
`Price impact`
,
priceImpact
.
priceImpact
,
priceI
mpact
.
warning
])
if
(
i
mpact
)
{
rows
.
push
([
t
`Price impact`
,
impact
.
toString
(),
i
mpact
.
warning
])
}
if
(
lpFeeAmount
)
{
...
...
@@ -85,15 +87,15 @@ export default function Details({ trade, slippage, priceImpact }: DetailsProps)
return
rows
},
[
feeOptions
,
priceImpact
,
lpFeeAmount
,
trade
,
slippage
,
outputAmount
,
i18n
.
locale
,
impact
,
inputCurrency
,
integrator
,
lpFeeAmount
,
outputAmount
,
outputCurrency
,
inputCurrency
,
slippage
,
trade
,
])
return
(
...
...
src/lib/components/Swap/Summary/Summary.tsx
View file @
f5087880
...
...
@@ -42,16 +42,16 @@ interface SummaryProps {
output
:
CurrencyAmount
<
Currency
>
inputUSDC
?:
CurrencyAmount
<
Currency
>
outputUSDC
?:
CurrencyAmount
<
Currency
>
priceI
mpact
?:
PriceImpact
i
mpact
?:
PriceImpact
}
export
default
function
Summary
({
input
,
output
,
inputUSDC
,
outputUSDC
,
priceI
mpact
}:
SummaryProps
)
{
export
default
function
Summary
({
input
,
output
,
inputUSDC
,
outputUSDC
,
i
mpact
}:
SummaryProps
)
{
return
(
<
Row
gap=
{
priceI
mpact
?
1
:
0.25
}
>
<
Row
gap=
{
i
mpact
?
1
:
0.25
}
>
<
TokenValue
input=
{
input
}
usdc=
{
inputUSDC
}
/>
<
ArrowRight
/>
<
TokenValue
input=
{
output
}
usdc=
{
outputUSDC
}
>
{
priceImpact
&&
<
ThemedText
.
Caption
color=
{
priceImpact
.
warning
}
>
(
{
priceImpact
.
display
}
)
</
ThemedText
.
Caption
>
}
{
impact
&&
<
ThemedText
.
Caption
color=
{
impact
.
warning
}
>
(
{
impact
.
toString
()
}
)
</
ThemedText
.
Caption
>
}
</
TokenValue
>
</
Row
>
)
...
...
src/lib/components/Swap/Summary/index.tsx
View file @
f5087880
...
...
@@ -10,7 +10,7 @@ import Row from 'lib/components/Row'
import
{
Slippage
}
from
'
lib/hooks/useSlippage
'
import
{
PriceImpact
}
from
'
lib/hooks/useUSDCPriceImpact
'
import
{
AlertTriangle
,
BarChart
,
Info
}
from
'
lib/icons
'
import
styled
,
{
Color
,
ThemedText
}
from
'
lib/theme
'
import
styled
,
{
ThemedText
}
from
'
lib/theme
'
import
{
useCallback
,
useMemo
,
useState
}
from
'
react
'
import
{
formatCurrencyAmount
}
from
'
utils/formatCurrencyAmount
'
import
{
tradeMeaningfullyDiffers
}
from
'
utils/tradeMeaningFullyDiffer
'
...
...
@@ -41,16 +41,16 @@ const Body = styled(Column)<{ open: boolean }>`
}
`
function
Subhead
({
priceImpact
,
slippage
}:
{
priceImpact
:
{
warning
?:
Color
}
;
slippage
:
Slippage
})
{
function
Subhead
({
impact
,
slippage
}:
{
impact
?:
PriceImpact
;
slippage
:
Slippage
})
{
return
(
<
Row
gap=
{
0.5
}
>
{
priceImpact
.
warning
||
slippage
.
warning
?
(
<
AlertTriangle
color=
{
priceImpact
.
warning
||
slippage
.
warning
}
/>
{
impact
?
.
warning
||
slippage
.
warning
?
(
<
AlertTriangle
color=
{
impact
?
.
warning
||
slippage
.
warning
}
/>
)
:
(
<
Info
color=
"secondary"
/>
)
}
<
ThemedText
.
Subhead2
color=
{
priceImpact
.
warning
||
slippage
.
warning
||
'
secondary
'
}
>
{
priceImpact
.
warning
?
(
<
ThemedText
.
Subhead2
color=
{
impact
?
.
warning
||
slippage
.
warning
||
'
secondary
'
}
>
{
impact
?
.
warning
?
(
<
Trans
>
High price impact
</
Trans
>
)
:
slippage
.
warning
?
(
<
Trans
>
High slippage
</
Trans
>
...
...
@@ -132,7 +132,7 @@ interface SummaryDialogProps {
slippage
:
Slippage
inputUSDC
?:
CurrencyAmount
<
Currency
>
outputUSDC
?:
CurrencyAmount
<
Currency
>
impact
:
PriceImpact
impact
?
:
PriceImpact
onConfirm
:
()
=>
void
}
...
...
@@ -152,23 +152,23 @@ export function SummaryDialog({ trade, slippage, inputUSDC, outputUSDC, impact,
output=
{
outputAmount
}
inputUSDC=
{
inputUSDC
}
outputUSDC=
{
outputUSDC
}
priceI
mpact=
{
impact
}
i
mpact=
{
impact
}
/>
<
Price
trade=
{
trade
}
/>
</
Heading
>
<
Column
gap=
{
open
?
0
:
0.75
}
style=
{
{
transition
:
'
gap 0.25s
'
}
}
>
<
Expando
title=
{
<
Subhead
priceI
mpact=
{
impact
}
slippage=
{
slippage
}
/>
}
title=
{
<
Subhead
i
mpact=
{
impact
}
slippage=
{
slippage
}
/>
}
open=
{
open
}
onExpand=
{
onExpand
}
height=
{
7
}
>
<
Details
trade=
{
trade
}
slippage=
{
slippage
}
priceI
mpact=
{
impact
}
/>
<
Details
trade=
{
trade
}
slippage=
{
slippage
}
i
mpact=
{
impact
}
/>
</
Expando
>
<
Footing
>
<
Estimate
trade=
{
trade
}
slippage=
{
slippage
}
/>
</
Footing
>
<
ConfirmButton
trade=
{
trade
}
highPriceImpact=
{
impact
.
warning
===
'
error
'
}
onConfirm=
{
onConfirm
}
/>
<
ConfirmButton
trade=
{
trade
}
highPriceImpact=
{
impact
?
.
warning
===
'
error
'
}
onConfirm=
{
onConfirm
}
/>
</
Column
>
</
Body
>
</>
...
...
src/lib/components/Swap/Toolbar/Caption.tsx
View file @
f5087880
...
...
@@ -84,16 +84,17 @@ export function Trade({
}:
{
trade
:
InterfaceTrade
<
Currency
,
Currency
,
TradeType
>
outputUSDC
?:
CurrencyAmount
<
Currency
>
impact
:
PriceImpact
impact
?
:
PriceImpact
})
{
return
(
<>
<
Tooltip
placement=
"bottom"
icon=
{
impact
.
warning
?
AlertTriangle
:
Info
}
>
<
Tooltip
placement=
"bottom"
icon=
{
impact
?
.
warning
?
AlertTriangle
:
Info
}
>
<
Column
gap=
{
0.75
}
>
{
impact
.
warning
&&
(
{
impact
?
.
warning
&&
(
<>
<
ThemedText
.
Caption
>
The output amount is estimated at
{
impact
.
display
}
less than the input amount due to high price impact
The output amount is estimated at
{
impact
.
toString
()
}
less than the input amount due to high price
impact
</
ThemedText
.
Caption
>
<
Rule
/>
</>
...
...
src/lib/components/TokenImg.tsx
View file @
f5087880
...
...
@@ -17,6 +17,7 @@ function TokenImg({ token, ...rest }: TokenImgProps) {
// Use the wrapped token info so that it includes the logoURI.
const
tokenInfo
=
useToken
(
token
.
isToken
?
token
.
wrapped
.
address
:
undefined
)
??
token
// TODO(zzmp): TokenImg takes a frame to switch.
const
srcs
=
useCurrencyLogoURIs
(
tokenInfo
)
const
[
src
,
setSrc
]
=
useState
<
string
|
undefined
>
()
useEffect
(()
=>
{
...
...
src/lib/hooks/swap/useSwapInfo.tsx
View file @
f5087880
...
...
@@ -28,7 +28,7 @@ interface SwapInfo {
state
:
TradeState
}
slippage
:
Slippage
impact
:
PriceImpact
impact
?
:
PriceImpact
}
// from the current swap inputs, compute the best trade and return it.
...
...
@@ -65,11 +65,7 @@ function useComputeSwapInfo(): SwapInfo {
// Compute slippage and impact off of the trade so that it refreshes with the trade.
// (Using amountIn/amountOut would show (incorrect) intermediate values.)
const
slippage
=
useSlippage
(
trade
.
trade
)
const
{
inputUSDC
:
usdcIn
,
outputUSDC
:
usdcOut
,
priceImpact
:
impact
,
}
=
useUSDCPriceImpact
(
trade
.
trade
?.
inputAmount
,
trade
.
trade
?.
outputAmount
)
const
{
inputUSDC
,
outputUSDC
,
impact
}
=
useUSDCPriceImpact
(
trade
.
trade
?.
inputAmount
,
trade
.
trade
?.
outputAmount
)
return
useMemo
(
()
=>
({
...
...
@@ -77,19 +73,31 @@ function useComputeSwapInfo(): SwapInfo {
currency
:
currencyIn
,
amount
:
amountIn
,
balance
:
balanceIn
,
usdc
:
usdcIn
,
usdc
:
inputUSDC
,
},
[
Field
.
OUTPUT
]:
{
currency
:
currencyOut
,
amount
:
amountOut
,
balance
:
balanceOut
,
usdc
:
usdcOut
,
usdc
:
outputUSDC
,
},
trade
,
slippage
,
impact
,
}),
[
amountIn
,
amountOut
,
balanceIn
,
balanceOut
,
currencyIn
,
currencyOut
,
impact
,
slippage
,
trade
,
usdcIn
,
usdcOut
]
[
amountIn
,
amountOut
,
balanceIn
,
balanceOut
,
currencyIn
,
currencyOut
,
impact
,
inputUSDC
,
outputUSDC
,
slippage
,
trade
,
]
)
}
...
...
@@ -98,7 +106,6 @@ const swapInfoAtom = atom<SwapInfo>({
[
Field
.
OUTPUT
]:
{},
trade
:
{
state
:
TradeState
.
INVALID
},
slippage
:
{
auto
:
true
,
allowed
:
new
Percent
(
0
)
},
impact
:
{},
})
export
function
SwapInfoUpdater
()
{
...
...
src/lib/hooks/useUSDCPriceImpact.ts
View file @
f5087880
...
...
@@ -5,8 +5,9 @@ import { computeFiatValuePriceImpact } from 'utils/computeFiatValuePriceImpact'
import
{
getPriceImpactWarning
}
from
'
utils/prices
'
export
interface
PriceImpact
{
display
?:
string
percent
:
Percent
warning
?:
'
warning
'
|
'
error
'
toString
():
string
}
/**
...
...
@@ -19,22 +20,20 @@ export default function useUSDCPriceImpact(
):
{
inputUSDC
?:
CurrencyAmount
<
Token
>
outputUSDC
?:
CurrencyAmount
<
Token
>
priceImpact
:
PriceImpact
impact
?
:
PriceImpact
}
{
const
inputUSDC
=
useUSDCValue
(
inputAmount
)
??
undefined
const
outputUSDC
=
useUSDCValue
(
outputAmount
)
??
undefined
return
useMemo
(()
=>
{
const
priceImpact
=
computeFiatValuePriceImpact
(
inputUSDC
,
outputUSDC
)
const
warning
=
getPriceImpactWarning
(
priceImpact
)
return
{
inputUSDC
,
outputUSDC
,
priceImpact
:
{
priceImpact
,
display
:
priceImpact
&&
toHumanReadablePriceImpact
(
priceImpact
),
warning
,
},
}
const
impact
=
priceImpact
?
{
percent
:
priceImpact
,
warning
:
getPriceImpactWarning
(
priceImpact
),
toString
:
()
=>
toHumanReadablePriceImpact
(
priceImpact
),
}
:
undefined
return
{
inputUSDC
,
outputUSDC
,
impact
}
},
[
inputUSDC
,
outputUSDC
])
}
...
...
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