@openocean.finance/widget 1.0.28 → 1.0.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/components/AmountInput/AmountInputEndAdornment.js +46 -39
- package/dist/esm/components/AmountInput/AmountInputEndAdornment.js.map +1 -1
- package/dist/esm/components/Messages/WarningMessages.js +2 -2
- package/dist/esm/components/Messages/WarningMessages.js.map +1 -1
- package/dist/esm/components/Step/Step.js +37 -29
- package/dist/esm/components/Step/Step.js.map +1 -1
- package/dist/esm/components/TransactionDetails.js +2 -5
- package/dist/esm/components/TransactionDetails.js.map +1 -1
- package/dist/esm/config/version.d.ts +1 -1
- package/dist/esm/config/version.js +1 -1
- package/dist/esm/cross/adapters/AcrossAdapter.d.ts +15 -0
- package/dist/esm/cross/adapters/AcrossAdapter.js +166 -0
- package/dist/esm/cross/adapters/AcrossAdapter.js.map +1 -0
- package/dist/esm/cross/adapters/BaseSwapAdapter.d.ts +107 -0
- package/dist/esm/cross/adapters/BaseSwapAdapter.js +44 -0
- package/dist/esm/cross/adapters/BaseSwapAdapter.js.map +1 -0
- package/dist/esm/cross/adapters/DebridgeAdapter.d.ts +20 -0
- package/dist/esm/cross/adapters/DebridgeAdapter.js +264 -0
- package/dist/esm/cross/adapters/DebridgeAdapter.js.map +1 -0
- package/dist/esm/cross/adapters/LifiAdapter.d.ts +19 -0
- package/dist/esm/cross/adapters/LifiAdapter.js +169 -0
- package/dist/esm/cross/adapters/LifiAdapter.js.map +1 -0
- package/dist/esm/cross/adapters/MayanAdapter.d.ts +14 -0
- package/dist/esm/cross/adapters/MayanAdapter.js +119 -0
- package/dist/esm/cross/adapters/MayanAdapter.js.map +1 -0
- package/dist/esm/cross/adapters/NearIntentsAdapter.d.ts +21 -0
- package/dist/esm/cross/adapters/NearIntentsAdapter.js +425 -0
- package/dist/esm/cross/adapters/NearIntentsAdapter.js.map +1 -0
- package/dist/esm/cross/adapters/OptimexAdapter.d.ts +19 -0
- package/dist/esm/cross/adapters/OptimexAdapter.js +216 -0
- package/dist/esm/cross/adapters/OptimexAdapter.js.map +1 -0
- package/dist/esm/cross/adapters/OrbiterAdapter.d.ts +20 -0
- package/dist/esm/cross/adapters/OrbiterAdapter.js +213 -0
- package/dist/esm/cross/adapters/OrbiterAdapter.js.map +1 -0
- package/dist/esm/cross/adapters/RelayAdapter.d.ts +14 -0
- package/dist/esm/cross/adapters/RelayAdapter.js +171 -0
- package/dist/esm/cross/adapters/RelayAdapter.js.map +1 -0
- package/dist/esm/cross/adapters/SymbiosisAdapter.d.ts +14 -0
- package/dist/esm/cross/adapters/SymbiosisAdapter.js +120 -0
- package/dist/esm/cross/adapters/SymbiosisAdapter.js.map +1 -0
- package/dist/esm/cross/adapters/XYFinanceAdapter.d.ts +14 -0
- package/dist/esm/cross/adapters/XYFinanceAdapter.js +177 -0
- package/dist/esm/cross/adapters/XYFinanceAdapter.js.map +1 -0
- package/dist/esm/cross/adapters/index.d.ts +2 -0
- package/dist/esm/cross/adapters/index.js +10 -0
- package/dist/esm/cross/adapters/index.js.map +1 -0
- package/dist/esm/cross/constants/index.d.ts +202 -0
- package/dist/esm/cross/constants/index.js +183 -0
- package/dist/esm/cross/constants/index.js.map +1 -0
- package/dist/esm/cross/crossChainQuote.d.ts +25 -0
- package/dist/esm/cross/crossChainQuote.js +127 -0
- package/dist/esm/cross/crossChainQuote.js.map +1 -0
- package/dist/esm/cross/factory.d.ts +9 -0
- package/dist/esm/cross/factory.js +125 -0
- package/dist/esm/cross/factory.js.map +1 -0
- package/dist/esm/cross/registry.d.ts +12 -0
- package/dist/esm/cross/registry.js +52 -0
- package/dist/esm/cross/registry.js.map +1 -0
- package/dist/esm/hooks/useChain.d.ts +1 -1
- package/dist/esm/hooks/useGasRefuel.d.ts +1 -1
- package/dist/esm/hooks/useGasSufficiencyBridge.js +1 -2
- package/dist/esm/hooks/useGasSufficiencyBridge.js.map +1 -1
- package/dist/esm/hooks/useRouteExecution.js +2 -1
- package/dist/esm/hooks/useRouteExecution.js.map +1 -1
- package/dist/esm/hooks/useRoutes.js +50 -32
- package/dist/esm/hooks/useRoutes.js.map +1 -1
- package/dist/esm/hooks/useSettingMonitor.js +1 -0
- package/dist/esm/hooks/useSettingMonitor.js.map +1 -1
- package/dist/esm/hooks/useTokenAddressBalance.d.ts +1 -1
- package/dist/esm/hooks/useTokenPrice.js +4 -2
- package/dist/esm/hooks/useTokenPrice.js.map +1 -1
- package/dist/esm/hooks/useTokens.d.ts +1 -1
- package/dist/esm/services/ExecuteRoute.js +142 -124
- package/dist/esm/services/ExecuteRoute.js.map +1 -1
- package/dist/esm/stores/form/useFieldController.d.ts +1 -1
- package/dist/esm/stores/routes/createRouteExecutionStore.js +6 -3
- package/dist/esm/stores/routes/createRouteExecutionStore.js.map +1 -1
- package/dist/esm/stores/routes/useSetExecutableRoute.d.ts +1 -1
- package/dist/esm/types/widget.d.ts +3 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +14 -4
- package/src/components/AmountInput/AmountInputEndAdornment.tsx +46 -46
- package/src/components/Messages/WarningMessages.tsx +7 -2
- package/src/components/Step/Step.tsx +37 -31
- package/src/components/TransactionDetails.tsx +10 -11
- package/src/config/version.ts +1 -1
- package/src/cross/adapters/AcrossAdapter.ts +193 -0
- package/src/cross/adapters/BaseSwapAdapter.ts +173 -0
- package/src/cross/adapters/DebridgeAdapter.ts +375 -0
- package/src/cross/adapters/LifiAdapter.ts +213 -0
- package/src/cross/adapters/MayanAdapter.ts +179 -0
- package/src/cross/adapters/NearIntentsAdapter.ts +539 -0
- package/src/cross/adapters/OptimexAdapter.ts +273 -0
- package/src/cross/adapters/OrbiterAdapter.ts +270 -0
- package/src/cross/adapters/RelayAdapter.ts +248 -0
- package/src/cross/adapters/SymbiosisAdapter.ts +144 -0
- package/src/cross/adapters/XYFinanceAdapter.ts +213 -0
- package/src/cross/adapters/index.ts +9 -0
- package/src/cross/constants/index.ts +223 -0
- package/src/cross/crossChainQuote.ts +181 -0
- package/src/cross/factory.ts +145 -0
- package/src/cross/registry.ts +65 -0
- package/src/hooks/useGasSufficiencyBridge.ts +1 -3
- package/src/hooks/useRouteExecution.ts +2 -1
- package/src/hooks/useRoutes.ts +64 -43
- package/src/hooks/useSettingMonitor.ts +1 -1
- package/src/hooks/useTokenPrice.ts +5 -3
- package/src/services/ExecuteRoute.ts +184 -171
- package/src/stores/routes/createRouteExecutionStore.ts +13 -4
- package/src/types/widget.ts +3 -0
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import {
|
|
2
|
+
type ChainName,
|
|
3
|
+
type Quote as MayanQuote,
|
|
4
|
+
addresses,
|
|
5
|
+
fetchQuote,
|
|
6
|
+
getSwapFromEvmTxPayload,
|
|
7
|
+
} from '@mayanfinance/swap-sdk'
|
|
8
|
+
import { ChainId } from '@openocean.finance/widget-sdk'
|
|
9
|
+
import { formatUnits, parseUnits } from 'viem'
|
|
10
|
+
|
|
11
|
+
import {
|
|
12
|
+
CROSS_CHAIN_FEE_RECEIVER,
|
|
13
|
+
type Currency,
|
|
14
|
+
ZERO_ADDRESS,
|
|
15
|
+
} from '../constants/index.js'
|
|
16
|
+
|
|
17
|
+
import type { WalletClient } from 'viem'
|
|
18
|
+
import type { Quote } from '../registry.js'
|
|
19
|
+
import {
|
|
20
|
+
BaseSwapAdapter,
|
|
21
|
+
type Chain,
|
|
22
|
+
type EvmQuoteParams,
|
|
23
|
+
type NormalizedQuote,
|
|
24
|
+
type NormalizedTxResponse,
|
|
25
|
+
type SwapStatus,
|
|
26
|
+
} from './BaseSwapAdapter.js'
|
|
27
|
+
|
|
28
|
+
const mappingChain: Record<string, ChainName> = {
|
|
29
|
+
[ChainId.ETH]: 'ethereum',
|
|
30
|
+
[ChainId.BSC]: 'bsc',
|
|
31
|
+
[ChainId.POL]: 'polygon',
|
|
32
|
+
[ChainId.AVA]: 'avalanche',
|
|
33
|
+
[ChainId.ARB]: 'arbitrum',
|
|
34
|
+
[ChainId.OPT]: 'optimism',
|
|
35
|
+
[ChainId.BAS]: 'base',
|
|
36
|
+
[ChainId.UNI]: 'unichain',
|
|
37
|
+
// [ChainId.LIN]: 'linea',
|
|
38
|
+
// [ChainId.HYE]: 'hypercore',
|
|
39
|
+
[ChainId.SOL]: 'solana',
|
|
40
|
+
[ChainId.SUI]: 'sui',
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export class MayanAdapter extends BaseSwapAdapter {
|
|
44
|
+
constructor() {
|
|
45
|
+
super()
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
getName(): string {
|
|
49
|
+
return 'Mayan'
|
|
50
|
+
}
|
|
51
|
+
getIcon(): string {
|
|
52
|
+
return 'https://swap.mayan.finance/favicon.ico'
|
|
53
|
+
}
|
|
54
|
+
getSupportedChains(): Chain[] {
|
|
55
|
+
return [...Object.keys(mappingChain).map(Number)]
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
getSupportedTokens(_sourceChain: Chain, _destChain: Chain): Currency[] {
|
|
59
|
+
return []
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
async getQuote(params: EvmQuoteParams): Promise<NormalizedQuote> {
|
|
63
|
+
const quoteParams = {
|
|
64
|
+
amount: +formatUnits(BigInt(params.amount), params.fromToken.decimals),
|
|
65
|
+
fromToken: params.fromToken.isNative
|
|
66
|
+
? ZERO_ADDRESS
|
|
67
|
+
: params.fromToken.address,
|
|
68
|
+
toToken: params.toToken.isNative ? ZERO_ADDRESS : params.toToken.address,
|
|
69
|
+
fromChain: mappingChain[params.fromChain],
|
|
70
|
+
toChain: mappingChain[params.toChain],
|
|
71
|
+
slippageBps: params.slippage,
|
|
72
|
+
referrer: CROSS_CHAIN_FEE_RECEIVER,
|
|
73
|
+
referrerBps: params.feeBps,
|
|
74
|
+
}
|
|
75
|
+
const quotes = await fetchQuote(quoteParams)
|
|
76
|
+
if (!quotes?.[0]) {
|
|
77
|
+
throw new Error('No quotes found')
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const formattedInputAmount = formatUnits(
|
|
81
|
+
BigInt(params.amount),
|
|
82
|
+
params.fromToken.decimals
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
const tokenInUsd = params.tokenInUsd
|
|
86
|
+
const tokenOutUsd = params.tokenOutUsd
|
|
87
|
+
const inputUsd = tokenInUsd * +formattedInputAmount
|
|
88
|
+
const outputUsd = tokenOutUsd * quotes[0].expectedAmountOut
|
|
89
|
+
|
|
90
|
+
return {
|
|
91
|
+
quoteParams: params,
|
|
92
|
+
|
|
93
|
+
outputAmount: parseUnits(
|
|
94
|
+
quotes[0].expectedAmountOut.toString(),
|
|
95
|
+
params.toToken.decimals
|
|
96
|
+
),
|
|
97
|
+
|
|
98
|
+
formattedOutputAmount: quotes[0].expectedAmountOut.toString(),
|
|
99
|
+
|
|
100
|
+
inputUsd,
|
|
101
|
+
outputUsd,
|
|
102
|
+
priceImpact:
|
|
103
|
+
!inputUsd || !outputUsd
|
|
104
|
+
? Number.NaN
|
|
105
|
+
: ((inputUsd - outputUsd) * 100) / inputUsd,
|
|
106
|
+
rate: quotes[0].expectedAmountOut / +formattedInputAmount,
|
|
107
|
+
gasFeeUsd: 0,
|
|
108
|
+
|
|
109
|
+
timeEstimate: quotes[0].etaSeconds,
|
|
110
|
+
contractAddress: addresses.MAYAN_FORWARDER_CONTRACT,
|
|
111
|
+
rawQuote: quotes[0],
|
|
112
|
+
|
|
113
|
+
protocolFee: quotes[0].clientRelayerFeeSuccess,
|
|
114
|
+
platformFeePercent: (params.feeBps * 100) / 10_000,
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
async executeSwap(
|
|
119
|
+
{ quote }: Quote,
|
|
120
|
+
walletClient: WalletClient
|
|
121
|
+
): Promise<NormalizedTxResponse> {
|
|
122
|
+
const account = walletClient.account?.address
|
|
123
|
+
if (!account) throw new Error('WalletClient account is not defined')
|
|
124
|
+
|
|
125
|
+
const res = getSwapFromEvmTxPayload(
|
|
126
|
+
quote.rawQuote as MayanQuote,
|
|
127
|
+
account,
|
|
128
|
+
quote.quoteParams.recipient,
|
|
129
|
+
{ evm: CROSS_CHAIN_FEE_RECEIVER },
|
|
130
|
+
account,
|
|
131
|
+
quote.quoteParams.fromChain,
|
|
132
|
+
null,
|
|
133
|
+
null
|
|
134
|
+
)
|
|
135
|
+
|
|
136
|
+
if (res.to && res.value && res.data) {
|
|
137
|
+
const tx = await walletClient.sendTransaction({
|
|
138
|
+
chain: undefined,
|
|
139
|
+
account,
|
|
140
|
+
to: res.to as `0x${string}`,
|
|
141
|
+
value: BigInt(res.value),
|
|
142
|
+
data: res.data as `0x${string}`,
|
|
143
|
+
})
|
|
144
|
+
return {
|
|
145
|
+
sender: quote.quoteParams.sender,
|
|
146
|
+
id: tx, // specific id for each provider
|
|
147
|
+
sourceTxHash: tx,
|
|
148
|
+
adapter: this.getName(),
|
|
149
|
+
sourceChain: quote.quoteParams.fromChain,
|
|
150
|
+
targetChain: quote.quoteParams.toChain,
|
|
151
|
+
inputAmount: quote.quoteParams.amount,
|
|
152
|
+
outputAmount: quote.outputAmount.toString(),
|
|
153
|
+
sourceToken: quote.quoteParams.fromToken,
|
|
154
|
+
targetToken: quote.quoteParams.toToken,
|
|
155
|
+
timestamp: new Date().getTime(),
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
throw new Error('Can not get Mayan data to swap')
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
async getTransactionStatus(p: NormalizedTxResponse): Promise<SwapStatus> {
|
|
163
|
+
const res = await fetch(
|
|
164
|
+
`https://explorer-api.mayan.finance/v3/swap/trx/${p.id}`
|
|
165
|
+
).then((r) => r.json())
|
|
166
|
+
|
|
167
|
+
return {
|
|
168
|
+
txHash: res.fulfillTxHash || '',
|
|
169
|
+
status:
|
|
170
|
+
res.status === 'ORDER_SETTLED'
|
|
171
|
+
? 'Success'
|
|
172
|
+
: res.status === 'ORDER_REFUNDED'
|
|
173
|
+
? 'Refunded'
|
|
174
|
+
: res.status === 'ORDER_CANCELED'
|
|
175
|
+
? 'Failed'
|
|
176
|
+
: 'Processing',
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|