Skip to content

Commit 8f50579

Browse files
committed
Implement QuoteSteps
1 parent 74c7fc2 commit 8f50579

File tree

16 files changed

+620
-77
lines changed

16 files changed

+620
-77
lines changed

apps/kyberswap-interface/.env.production

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,4 +50,4 @@ VITE_AFFILIATE_SERVICE=https://affiliate-service.kyberswap.com/api
5050
VITE_SOLANA_RPC=https://solana.kyberengineering.io
5151

5252
VITE_SMART_EXIT_API_URL=https://conditional-order.kyberswap.com/api
53-
VITE_CROSSCHAIN_AGGREGATOR_API=https://crosschain-aggregator.kyberswap.com
53+
VITE_CROSSCHAIN_AGGREGATOR_API=https://pre-crosschain-aggregator.kyberengineering.io
14.7 KB
Binary file not shown.
File renamed without changes.
Lines changed: 8 additions & 0 deletions
Loading

apps/kyberswap-interface/src/components/swapv2/LimitOrder/ListOrder/index.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import { Text } from 'rebass'
99
import { useGetListOrdersQuery } from 'services/limitOrder'
1010
import styled from 'styled-components'
1111

12-
import { ReactComponent as NoDataIcon } from 'assets/svg/no-data.svg'
12+
import { ReactComponent as NoDataIcon } from 'assets/svg/no_data.svg'
1313
import { ButtonLight } from 'components/Button'
1414
import Column from 'components/Column'
1515
import LocalLoader from 'components/LocalLoader'

apps/kyberswap-interface/src/components/swapv2/LimitOrder/OrderBook/index.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import { Text } from 'rebass'
88
import { useGetOrdersByTokenPairQuery } from 'services/limitOrder'
99
import styled, { CSSProperties } from 'styled-components'
1010

11-
import { ReactComponent as NoDataIcon } from 'assets/svg/no-data.svg'
11+
import { ReactComponent as NoDataIcon } from 'assets/svg/no_data.svg'
1212
import LocalLoader from 'components/LocalLoader'
1313
import RefreshLoading from 'components/RefreshLoading'
1414
import { useActiveWeb3React } from 'hooks'

apps/kyberswap-interface/src/pages/CrossChainSwap/adapters/KyberAcrossAdapter.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -579,7 +579,7 @@ export class KyberAcrossAdapter extends BaseSwapAdapter {
579579
})
580580

581581
const approveTxHash = await walletClient.sendTransaction({
582-
account: walletClient.account!,
582+
account: walletClient.account || ('0x0' as Address),
583583
chain: originChain,
584584
to: swapAndDepositData.swapToken,
585585
data: approveCalldata,

apps/kyberswap-interface/src/pages/CrossChainSwap/adapters/KyberSwapAdapter.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,11 @@ import { getPublicClient } from '@wagmi/core'
33
import routeApi from 'services/route'
44
import { WalletClient, formatUnits } from 'viem'
55

6+
import kyberswapIcon from 'assets/images/kyberswap.ico'
67
import { wagmiConfig } from 'components/Web3Provider'
78
import { AGGREGATOR_API } from 'constants/env'
89
import { AGGREGATOR_API_PATHS, ETHER_ADDRESS } from 'constants/index'
910
import { MAINNET_NETWORKS, NETWORKS_INFO } from 'constants/networks'
10-
import store from 'state'
11-
12-
import { Quote } from '../registry'
1311
import {
1412
BaseSwapAdapter,
1513
Chain,
@@ -18,7 +16,9 @@ import {
1816
NormalizedQuote,
1917
NormalizedTxResponse,
2018
SwapStatus,
21-
} from './BaseSwapAdapter'
19+
} from 'pages/CrossChainSwap/adapters/BaseSwapAdapter'
20+
import { Quote } from 'pages/CrossChainSwap/registry'
21+
import store from 'state'
2222

2323
export class KyberSwapAdapter extends BaseSwapAdapter {
2424
constructor() {
@@ -29,7 +29,7 @@ export class KyberSwapAdapter extends BaseSwapAdapter {
2929
return 'KyberSwap'
3030
}
3131
getIcon(): string {
32-
return 'https://kyberswap.com/favicon.ico'
32+
return kyberswapIcon
3333
}
3434
getSupportedChains(): Chain[] {
3535
return [...MAINNET_NETWORKS].filter(item => !NOT_SUPPORTED_CHAINS_PRICE_SERVICE.includes(item))

apps/kyberswap-interface/src/pages/CrossChainSwap/components/ConfirmationPopup.tsx

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,18 +22,17 @@ import { ETHER_ADDRESS } from 'constants/index'
2222
import { NETWORKS_INFO } from 'constants/networks'
2323
import useTheme from 'hooks/useTheme'
2424
import useTracking, { CROSS_CHAIN_MIXPANEL_TYPE, TRACKING_EVENT_TYPE, useCrossChainMixpanel } from 'hooks/useTracking'
25+
import { Chain, Currency, NonEvmChain, NonEvmChainInfo } from 'pages/CrossChainSwap/adapters'
26+
import { PiWarning } from 'pages/CrossChainSwap/components/PiWarning'
27+
import { QuoteProviderName } from 'pages/CrossChainSwap/components/QuoteProviderName'
28+
import { Summary } from 'pages/CrossChainSwap/components/Summary'
29+
import { useCrossChainSwap } from 'pages/CrossChainSwap/hooks/useCrossChainSwap'
30+
import { getChainName } from 'pages/CrossChainSwap/utils'
2531
import { useCrossChainTransactions } from 'state/crossChainSwap'
2632
import { ExternalLink } from 'theme'
2733
import { getEtherscanLink, isEvmChain, shortenHash } from 'utils'
2834
import { formatDisplayNumber } from 'utils/numbers'
2935

30-
import { Chain, Currency, NonEvmChain, NonEvmChainInfo } from '../adapters'
31-
import { useCrossChainSwap } from '../hooks/useCrossChainSwap'
32-
import { getChainName } from '../utils'
33-
import { PiWarning } from './PiWarning'
34-
import { Tag } from './QuoteSelector'
35-
import { Summary } from './Summary'
36-
3736
const Wrapper = styled.div`
3837
padding: 1rem;
3938
display: flex;
@@ -434,8 +433,10 @@ export const ConfirmationPopup = ({ isOpen, onDismiss }: { isOpen: boolean; onDi
434433
<PiWarning />
435434

436435
<Text marginY="1rem" fontStyle="italic" color={'#737373'} fontSize={12} display="flex" alignItems="center">
437-
<Trans>Routed via {selectedQuote.adapter.getName()}</Trans>
438-
{selectedQuote.adapter.getName() === 'Optimex' && <Tag>{t`Beta`}</Tag>}
436+
<Text as="span" mr="4px">
437+
<Trans>Routed via</Trans>
438+
</Text>
439+
<QuoteProviderName quote={selectedQuote} />
439440
</Text>
440441

441442
<ButtonPrimary onClick={handleSwap}>{t`Confirm Swap`}</ButtonPrimary>
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
import { t } from '@lingui/macro'
2+
import React from 'react'
3+
import { Text } from 'rebass'
4+
import styled from 'styled-components'
5+
6+
import { SwapProvider } from 'pages/CrossChainSwap/adapters'
7+
import { registry } from 'pages/CrossChainSwap/hooks/useCrossChainSwap'
8+
import { Quote } from 'pages/CrossChainSwap/registry'
9+
10+
const Tag = styled.div`
11+
background-color: ${({ theme }) => theme.subText + '33'};
12+
color: ${({ theme }) => theme.text};
13+
border-radius: 999px;
14+
margin-left: 4px;
15+
font-size: 10px;
16+
padding: 2px 6px;
17+
`
18+
19+
const getStepProviders = (quote: Quote): SwapProvider[] => {
20+
if (quote.adapter.getName().toLowerCase() !== 'kyberacross') return []
21+
22+
const steps = quote.quote.rawQuote?.steps
23+
if (!Array.isArray(steps)) return []
24+
25+
return steps
26+
.map(step => {
27+
const providerName = typeof step?.provider === 'string' ? step.provider : null
28+
const providerAdapter = registry.getAdapter(providerName)
29+
return providerAdapter
30+
})
31+
.filter(Boolean) as SwapProvider[]
32+
}
33+
34+
export const QuoteProviderName = ({ quote }: { quote: Quote }) => {
35+
const stepProviders = getStepProviders(quote)
36+
const adapter = quote.adapter
37+
38+
if (stepProviders.length > 0) {
39+
return (
40+
<>
41+
{stepProviders.map((provider, index) => (
42+
<React.Fragment key={provider.getName()}>
43+
{index > 0 && <Text mx="4px">+</Text>}
44+
<img src={provider.getIcon()} alt={provider.getName()} width={14} height={14} />
45+
<Text ml="4px">{provider.getName()}</Text>
46+
</React.Fragment>
47+
))}
48+
</>
49+
)
50+
}
51+
52+
const adapterName = adapter.getName()
53+
const isBeta = adapterName === 'Optimex'
54+
55+
return (
56+
<>
57+
<img src={adapter.getIcon()} alt={adapterName} width={14} height={14} />
58+
<Text ml="4px">{adapterName}</Text>
59+
{isBeta && <Tag>{t`Beta`}</Tag>}
60+
</>
61+
)
62+
}

0 commit comments

Comments
 (0)