@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.
Files changed (110) hide show
  1. package/dist/esm/components/AmountInput/AmountInputEndAdornment.js +46 -39
  2. package/dist/esm/components/AmountInput/AmountInputEndAdornment.js.map +1 -1
  3. package/dist/esm/components/Messages/WarningMessages.js +2 -2
  4. package/dist/esm/components/Messages/WarningMessages.js.map +1 -1
  5. package/dist/esm/components/Step/Step.js +37 -29
  6. package/dist/esm/components/Step/Step.js.map +1 -1
  7. package/dist/esm/components/TransactionDetails.js +2 -5
  8. package/dist/esm/components/TransactionDetails.js.map +1 -1
  9. package/dist/esm/config/version.d.ts +1 -1
  10. package/dist/esm/config/version.js +1 -1
  11. package/dist/esm/cross/adapters/AcrossAdapter.d.ts +15 -0
  12. package/dist/esm/cross/adapters/AcrossAdapter.js +166 -0
  13. package/dist/esm/cross/adapters/AcrossAdapter.js.map +1 -0
  14. package/dist/esm/cross/adapters/BaseSwapAdapter.d.ts +107 -0
  15. package/dist/esm/cross/adapters/BaseSwapAdapter.js +44 -0
  16. package/dist/esm/cross/adapters/BaseSwapAdapter.js.map +1 -0
  17. package/dist/esm/cross/adapters/DebridgeAdapter.d.ts +20 -0
  18. package/dist/esm/cross/adapters/DebridgeAdapter.js +264 -0
  19. package/dist/esm/cross/adapters/DebridgeAdapter.js.map +1 -0
  20. package/dist/esm/cross/adapters/LifiAdapter.d.ts +19 -0
  21. package/dist/esm/cross/adapters/LifiAdapter.js +169 -0
  22. package/dist/esm/cross/adapters/LifiAdapter.js.map +1 -0
  23. package/dist/esm/cross/adapters/MayanAdapter.d.ts +14 -0
  24. package/dist/esm/cross/adapters/MayanAdapter.js +119 -0
  25. package/dist/esm/cross/adapters/MayanAdapter.js.map +1 -0
  26. package/dist/esm/cross/adapters/NearIntentsAdapter.d.ts +21 -0
  27. package/dist/esm/cross/adapters/NearIntentsAdapter.js +425 -0
  28. package/dist/esm/cross/adapters/NearIntentsAdapter.js.map +1 -0
  29. package/dist/esm/cross/adapters/OptimexAdapter.d.ts +19 -0
  30. package/dist/esm/cross/adapters/OptimexAdapter.js +216 -0
  31. package/dist/esm/cross/adapters/OptimexAdapter.js.map +1 -0
  32. package/dist/esm/cross/adapters/OrbiterAdapter.d.ts +20 -0
  33. package/dist/esm/cross/adapters/OrbiterAdapter.js +213 -0
  34. package/dist/esm/cross/adapters/OrbiterAdapter.js.map +1 -0
  35. package/dist/esm/cross/adapters/RelayAdapter.d.ts +14 -0
  36. package/dist/esm/cross/adapters/RelayAdapter.js +171 -0
  37. package/dist/esm/cross/adapters/RelayAdapter.js.map +1 -0
  38. package/dist/esm/cross/adapters/SymbiosisAdapter.d.ts +14 -0
  39. package/dist/esm/cross/adapters/SymbiosisAdapter.js +120 -0
  40. package/dist/esm/cross/adapters/SymbiosisAdapter.js.map +1 -0
  41. package/dist/esm/cross/adapters/XYFinanceAdapter.d.ts +14 -0
  42. package/dist/esm/cross/adapters/XYFinanceAdapter.js +177 -0
  43. package/dist/esm/cross/adapters/XYFinanceAdapter.js.map +1 -0
  44. package/dist/esm/cross/adapters/index.d.ts +2 -0
  45. package/dist/esm/cross/adapters/index.js +10 -0
  46. package/dist/esm/cross/adapters/index.js.map +1 -0
  47. package/dist/esm/cross/constants/index.d.ts +202 -0
  48. package/dist/esm/cross/constants/index.js +183 -0
  49. package/dist/esm/cross/constants/index.js.map +1 -0
  50. package/dist/esm/cross/crossChainQuote.d.ts +25 -0
  51. package/dist/esm/cross/crossChainQuote.js +127 -0
  52. package/dist/esm/cross/crossChainQuote.js.map +1 -0
  53. package/dist/esm/cross/factory.d.ts +9 -0
  54. package/dist/esm/cross/factory.js +125 -0
  55. package/dist/esm/cross/factory.js.map +1 -0
  56. package/dist/esm/cross/registry.d.ts +12 -0
  57. package/dist/esm/cross/registry.js +52 -0
  58. package/dist/esm/cross/registry.js.map +1 -0
  59. package/dist/esm/hooks/useChain.d.ts +1 -1
  60. package/dist/esm/hooks/useGasRefuel.d.ts +1 -1
  61. package/dist/esm/hooks/useGasSufficiencyBridge.js +1 -2
  62. package/dist/esm/hooks/useGasSufficiencyBridge.js.map +1 -1
  63. package/dist/esm/hooks/useRouteExecution.js +2 -1
  64. package/dist/esm/hooks/useRouteExecution.js.map +1 -1
  65. package/dist/esm/hooks/useRoutes.js +50 -32
  66. package/dist/esm/hooks/useRoutes.js.map +1 -1
  67. package/dist/esm/hooks/useSettingMonitor.js +1 -0
  68. package/dist/esm/hooks/useSettingMonitor.js.map +1 -1
  69. package/dist/esm/hooks/useTokenAddressBalance.d.ts +1 -1
  70. package/dist/esm/hooks/useTokenPrice.js +4 -2
  71. package/dist/esm/hooks/useTokenPrice.js.map +1 -1
  72. package/dist/esm/hooks/useTokens.d.ts +1 -1
  73. package/dist/esm/services/ExecuteRoute.js +142 -124
  74. package/dist/esm/services/ExecuteRoute.js.map +1 -1
  75. package/dist/esm/stores/form/useFieldController.d.ts +1 -1
  76. package/dist/esm/stores/routes/createRouteExecutionStore.js +6 -3
  77. package/dist/esm/stores/routes/createRouteExecutionStore.js.map +1 -1
  78. package/dist/esm/stores/routes/useSetExecutableRoute.d.ts +1 -1
  79. package/dist/esm/types/widget.d.ts +3 -0
  80. package/dist/tsconfig.tsbuildinfo +1 -0
  81. package/package.json +14 -4
  82. package/src/components/AmountInput/AmountInputEndAdornment.tsx +46 -46
  83. package/src/components/Messages/WarningMessages.tsx +7 -2
  84. package/src/components/Step/Step.tsx +37 -31
  85. package/src/components/TransactionDetails.tsx +10 -11
  86. package/src/config/version.ts +1 -1
  87. package/src/cross/adapters/AcrossAdapter.ts +193 -0
  88. package/src/cross/adapters/BaseSwapAdapter.ts +173 -0
  89. package/src/cross/adapters/DebridgeAdapter.ts +375 -0
  90. package/src/cross/adapters/LifiAdapter.ts +213 -0
  91. package/src/cross/adapters/MayanAdapter.ts +179 -0
  92. package/src/cross/adapters/NearIntentsAdapter.ts +539 -0
  93. package/src/cross/adapters/OptimexAdapter.ts +273 -0
  94. package/src/cross/adapters/OrbiterAdapter.ts +270 -0
  95. package/src/cross/adapters/RelayAdapter.ts +248 -0
  96. package/src/cross/adapters/SymbiosisAdapter.ts +144 -0
  97. package/src/cross/adapters/XYFinanceAdapter.ts +213 -0
  98. package/src/cross/adapters/index.ts +9 -0
  99. package/src/cross/constants/index.ts +223 -0
  100. package/src/cross/crossChainQuote.ts +181 -0
  101. package/src/cross/factory.ts +145 -0
  102. package/src/cross/registry.ts +65 -0
  103. package/src/hooks/useGasSufficiencyBridge.ts +1 -3
  104. package/src/hooks/useRouteExecution.ts +2 -1
  105. package/src/hooks/useRoutes.ts +64 -43
  106. package/src/hooks/useSettingMonitor.ts +1 -1
  107. package/src/hooks/useTokenPrice.ts +5 -3
  108. package/src/services/ExecuteRoute.ts +184 -171
  109. package/src/stores/routes/createRouteExecutionStore.ts +13 -4
  110. package/src/types/widget.ts +3 -0
@@ -0,0 +1,107 @@
1
+ import type { useWalletSelector } from '@near-wallet-selector/react-hook';
2
+ import { ChainId } from '@openocean.finance/widget-sdk';
3
+ import type { AdaptedWallet } from '@reservoir0x/relay-sdk';
4
+ import type { WalletAdapterProps } from '@solana/wallet-adapter-base';
5
+ import type { Connection } from '@solana/web3.js';
6
+ import type { WalletClient } from 'viem';
7
+ import type { Currency as EvmCurrency, NearToken, SolanaToken } from '../constants/index.js';
8
+ import type { Quote } from '../registry.js';
9
+ export declare enum NonEvmChain {
10
+ Near = "near",
11
+ Bitcoin = "bitcoin",
12
+ Solana = "solana"
13
+ }
14
+ export declare const BitcoinToken: {
15
+ name: string;
16
+ symbol: string;
17
+ decimals: number;
18
+ logo: string;
19
+ };
20
+ export type Chain = ChainId | NonEvmChain;
21
+ export type Currency = EvmCurrency | NearToken | typeof BitcoinToken | SolanaToken;
22
+ export declare const NonEvmChainInfo: {
23
+ [key in NonEvmChain]: {
24
+ name: string;
25
+ icon: string;
26
+ };
27
+ };
28
+ export declare const NOT_SUPPORTED_CHAINS_PRICE_SERVICE: (ChainId | NonEvmChain)[];
29
+ export interface QuoteParams {
30
+ feeBps: number;
31
+ fromChain: Chain;
32
+ toChain: Chain;
33
+ fromToken: Currency;
34
+ toToken: Currency;
35
+ amount: string;
36
+ slippage: number;
37
+ walletClient?: AdaptedWallet | WalletClient;
38
+ tokenInUsd: number;
39
+ tokenOutUsd: number;
40
+ sender: string;
41
+ recipient: string;
42
+ publicKey?: string;
43
+ }
44
+ export interface EvmQuoteParams extends QuoteParams {
45
+ fromToken: EvmCurrency;
46
+ toToken: EvmCurrency;
47
+ }
48
+ export interface NearQuoteParams extends QuoteParams {
49
+ nearTokens: NearToken[];
50
+ }
51
+ export interface NormalizedQuote {
52
+ quoteParams: QuoteParams;
53
+ outputAmount: bigint;
54
+ formattedOutputAmount: string;
55
+ inputUsd: number;
56
+ outputUsd: number;
57
+ rate: number;
58
+ timeEstimate: number;
59
+ priceImpact: number;
60
+ gasFeeUsd: number;
61
+ contractAddress: string;
62
+ rawQuote: any;
63
+ protocolFee: number;
64
+ protocolFeeString?: string;
65
+ platformFeePercent: number;
66
+ }
67
+ export interface NormalizedTxResponse {
68
+ id: string;
69
+ sourceTxHash: string;
70
+ sender: string;
71
+ adapter: string;
72
+ sourceChain: Chain;
73
+ targetChain: Chain;
74
+ inputAmount: string;
75
+ outputAmount: string;
76
+ sourceToken: Currency;
77
+ targetToken: Currency;
78
+ targetTxHash?: string;
79
+ timestamp: number;
80
+ status?: 'Processing' | 'Success' | 'Failed' | 'Refunded';
81
+ }
82
+ export interface SwapStatus {
83
+ txHash: string;
84
+ status: 'Processing' | 'Success' | 'Failed' | 'Refunded';
85
+ }
86
+ export interface SwapProvider {
87
+ getName(): string;
88
+ getIcon(): string;
89
+ getSupportedChains(): Chain[];
90
+ getSupportedTokens(sourceChain: Chain, destChain: Chain): Currency[];
91
+ getQuote(params: QuoteParams): Promise<NormalizedQuote>;
92
+ executeSwap(quote: Quote, walletClient: WalletClient, nearWallet?: ReturnType<typeof useWalletSelector>, sendBtcFn?: (params: {
93
+ recipient: string;
94
+ amount: string | number;
95
+ }) => Promise<string>, sendSolanaTransaction?: WalletAdapterProps['sendTransaction'], connection?: Connection): Promise<NormalizedTxResponse>;
96
+ getTransactionStatus(p: NormalizedTxResponse): Promise<SwapStatus>;
97
+ }
98
+ export declare abstract class BaseSwapAdapter implements SwapProvider {
99
+ abstract getName(): string;
100
+ abstract getIcon(): string;
101
+ abstract getSupportedChains(): Chain[];
102
+ abstract getSupportedTokens(sourceChain: Chain, destChain: Chain): Currency[];
103
+ abstract getQuote(params: QuoteParams): Promise<NormalizedQuote>;
104
+ abstract executeSwap(params: Quote, walletClient: WalletClient, nearWallet?: ReturnType<typeof useWalletSelector>): Promise<NormalizedTxResponse>;
105
+ abstract getTransactionStatus(p: NormalizedTxResponse): Promise<SwapStatus>;
106
+ protected handleError(error: any): never;
107
+ }
@@ -0,0 +1,44 @@
1
+ import { ChainId } from '@openocean.finance/widget-sdk';
2
+ export var NonEvmChain;
3
+ (function (NonEvmChain) {
4
+ NonEvmChain["Near"] = "near";
5
+ NonEvmChain["Bitcoin"] = "bitcoin";
6
+ NonEvmChain["Solana"] = "solana";
7
+ })(NonEvmChain || (NonEvmChain = {}));
8
+ export const BitcoinToken = {
9
+ name: 'Bitcoin',
10
+ symbol: 'BTC',
11
+ decimals: 8,
12
+ logo: 'https://storage.googleapis.com/ks-setting-1d682dca/285205e7-a16d-421c-a794-67439cd6b54f1751515894455.png',
13
+ };
14
+ export const NonEvmChainInfo = {
15
+ [NonEvmChain.Near]: {
16
+ name: 'NEAR',
17
+ icon: 'https://storage.googleapis.com/ks-setting-1d682dca/000c677f-2ebc-44cc-8d76-e4c6d07627631744962669170.png',
18
+ },
19
+ [NonEvmChain.Bitcoin]: {
20
+ name: 'Bitcoin',
21
+ icon: 'https://storage.googleapis.com/ks-setting-1d682dca/285205e7-a16d-421c-a794-67439cd6b54f1751515894455.png',
22
+ },
23
+ [NonEvmChain.Solana]: {
24
+ name: 'Solana',
25
+ icon: 'https://solana.com/favicon.png',
26
+ },
27
+ };
28
+ export const NOT_SUPPORTED_CHAINS_PRICE_SERVICE = [
29
+ ChainId.FTM,
30
+ ChainId.SCL,
31
+ ChainId.BLS,
32
+ // ChainId.ZKSYNC,
33
+ // ChainId.HYPEREVM,
34
+ NonEvmChain.Solana,
35
+ NonEvmChain.Bitcoin,
36
+ NonEvmChain.Near,
37
+ ];
38
+ export class BaseSwapAdapter {
39
+ handleError(error) {
40
+ console.error(`[${this.getName()}] Error:`, error);
41
+ throw new Error(`${this.getName()} provider error: ${error.message || 'Unknown error'}`);
42
+ }
43
+ }
44
+ //# sourceMappingURL=BaseSwapAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseSwapAdapter.js","sourceRoot":"","sources":["../../../../src/cross/adapters/BaseSwapAdapter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAA;AAcvD,MAAM,CAAN,IAAY,WAIX;AAJD,WAAY,WAAW;IACrB,4BAAa,CAAA;IACb,kCAAmB,CAAA;IACnB,gCAAiB,CAAA;AACnB,CAAC,EAJW,WAAW,KAAX,WAAW,QAItB;AAED,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,IAAI,EAAE,SAAS;IACf,MAAM,EAAE,KAAK;IACb,QAAQ,EAAE,CAAC;IACX,IAAI,EAAE,0GAA0G;CACjH,CAAA;AASD,MAAM,CAAC,MAAM,eAAe,GAExB;IACF,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE;QAClB,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,0GAA0G;KACjH;IACD,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE;QACrB,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,0GAA0G;KACjH;IACD,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE;QACpB,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,gCAAgC;KACvC;CACF,CAAA;AAED,MAAM,CAAC,MAAM,kCAAkC,GAAG;IAChD,OAAO,CAAC,GAAG;IACX,OAAO,CAAC,GAAG;IACX,OAAO,CAAC,GAAG;IACX,kBAAkB;IAClB,oBAAoB;IACpB,WAAW,CAAC,MAAM;IAClB,WAAW,CAAC,OAAO;IACnB,WAAW,CAAC,IAAI;CACjB,CAAA;AA4FD,MAAM,OAAgB,eAAe;IAazB,WAAW,CAAC,KAAU;QAC9B,OAAO,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,CAAC,CAAA;QAClD,MAAM,IAAI,KAAK,CACb,GAAG,IAAI,CAAC,OAAO,EAAE,oBAAoB,KAAK,CAAC,OAAO,IAAI,eAAe,EAAE,CACxE,CAAA;IACH,CAAC;CACF"}
@@ -0,0 +1,20 @@
1
+ import type { useWalletSelector } from '@near-wallet-selector/react-hook';
2
+ import type { WalletAdapterProps } from '@solana/wallet-adapter-base';
3
+ import { type Connection } from '@solana/web3.js';
4
+ import { type WalletClient } from 'viem';
5
+ import type { Currency } from '../constants/index.js';
6
+ import type { Quote } from '../registry.js';
7
+ import { BaseSwapAdapter, type Chain, type NormalizedQuote, type NormalizedTxResponse, type QuoteParams, type SwapStatus } from './BaseSwapAdapter.js';
8
+ export declare class DeBridgeAdapter extends BaseSwapAdapter {
9
+ constructor();
10
+ getName(): string;
11
+ getIcon(): string;
12
+ getSupportedChains(): Chain[];
13
+ getSupportedTokens(_sourceChain: Chain, _destChain: Chain): Currency[];
14
+ getQuote(params: QuoteParams): Promise<NormalizedQuote>;
15
+ executeSwap({ quote }: Quote, walletClient: WalletClient, _nearWallet?: ReturnType<typeof useWalletSelector>, _sendBtcFn?: (params: {
16
+ recipient: string;
17
+ amount: string | number;
18
+ }) => Promise<string>, sendSolanaFn?: WalletAdapterProps['sendTransaction'], solanaConnection?: Connection): Promise<NormalizedTxResponse>;
19
+ getTransactionStatus(p: NormalizedTxResponse): Promise<SwapStatus>;
20
+ }
@@ -0,0 +1,264 @@
1
+ import { ChainId } from '@openocean.finance/widget-sdk';
2
+ import { Transaction, VersionedTransaction, } from '@solana/web3.js';
3
+ import { formatUnits } from 'viem';
4
+ import { TOKEN_API_URL } from '../constants/index.js';
5
+ import { CROSS_CHAIN_FEE_RECEIVER, CROSS_CHAIN_FEE_RECEIVER_SOLANA, ZERO_ADDRESS, } from '../constants/index.js';
6
+ import { NativeCurrencies } from '../constants/index.js';
7
+ import { BaseSwapAdapter, NOT_SUPPORTED_CHAINS_PRICE_SERVICE, NonEvmChain, } from './BaseSwapAdapter.js';
8
+ const DEBRIDGE_API = 'https://dln.debridge.finance/v1.0/dln/order';
9
+ const mappingChainId = {
10
+ [ChainId.DAI]: 100000002,
11
+ [ChainId.MAM]: 100000004, // Metis
12
+ [ChainId.SON]: 100000014, // Sonic
13
+ [ChainId.ABS]: 100000017, // Abstract
14
+ [ChainId.BER]: 100000020, // Berachain
15
+ [ChainId.BOB]: 100000021, // BOB
16
+ [ChainId.MNT]: 100000023, // Mantle
17
+ [NonEvmChain.Solana]: 7565164,
18
+ };
19
+ export class DeBridgeAdapter extends BaseSwapAdapter {
20
+ constructor() {
21
+ super();
22
+ }
23
+ getName() {
24
+ return 'deBridge';
25
+ }
26
+ getIcon() {
27
+ return 'https://app.debridge.finance/assets/images/meta-deswap/favicon-32x32.png';
28
+ }
29
+ getSupportedChains() {
30
+ return [
31
+ ChainId.ETH,
32
+ ChainId.BSC,
33
+ ChainId.POL,
34
+ ChainId.AVA,
35
+ ChainId.ARB,
36
+ ChainId.OPT,
37
+ ChainId.ONE,
38
+ ChainId.FSN,
39
+ ChainId.MOR,
40
+ ChainId.CEL,
41
+ ChainId.FUS,
42
+ ChainId.TLO,
43
+ ChainId.CRO,
44
+ ChainId.BOB,
45
+ ChainId.RSK,
46
+ ChainId.VEL,
47
+ ChainId.MOO,
48
+ ChainId.MAM,
49
+ ChainId.AUR,
50
+ ChainId.EVM,
51
+ ChainId.ARN,
52
+ ChainId.ERA,
53
+ ChainId.PZE,
54
+ ChainId.LNA,
55
+ ChainId.BAS,
56
+ ChainId.SCL,
57
+ ChainId.MOD,
58
+ ChainId.MNT,
59
+ ChainId.BLS,
60
+ ChainId.SEI,
61
+ ChainId.FRA,
62
+ ChainId.TAI,
63
+ ChainId.GRA,
64
+ ChainId.IMX,
65
+ ChainId.KAI,
66
+ ChainId.XLY,
67
+ // NonEvmChain.Solana,
68
+ ];
69
+ }
70
+ getSupportedTokens(_sourceChain, _destChain) {
71
+ return [];
72
+ }
73
+ async getQuote(params) {
74
+ const fromToken = params.fromToken;
75
+ const toToken = params.toToken;
76
+ let p = {
77
+ srcChainId: mappingChainId[params.fromChain] || params.fromChain,
78
+ srcChainTokenIn: params.fromChain === 'solana'
79
+ ? params.fromToken.id
80
+ : fromToken.isNative
81
+ ? ZERO_ADDRESS
82
+ : fromToken.address,
83
+ srcChainTokenInAmount: params.amount,
84
+ dstChainId: mappingChainId[params.toChain] || params.toChain,
85
+ dstChainTokenOut: params.toChain === 'solana'
86
+ ? params.toToken.id
87
+ : toToken.isNative
88
+ ? ZERO_ADDRESS
89
+ : toToken.address,
90
+ dstChainTokenOutAmount: 'auto',
91
+ enableEstimate: false,
92
+ prependOperatingExpenses: false,
93
+ referralCode: 31982,
94
+ affiliateFeePercent: (params.feeBps * 100) / 10000,
95
+ affiliateFeeRecipient: params.fromChain === 'solana'
96
+ ? CROSS_CHAIN_FEE_RECEIVER_SOLANA
97
+ : CROSS_CHAIN_FEE_RECEIVER,
98
+ };
99
+ let path = 'quote';
100
+ if (params.recipient && params.sender && params.sender !== ZERO_ADDRESS) {
101
+ path = 'create-tx';
102
+ p = {
103
+ ...p,
104
+ srcChainOrderAuthorityAddress: params.sender,
105
+ dstChainOrderAuthorityAddress: params.recipient,
106
+ dstChainTokenOutRecipient: params.recipient,
107
+ };
108
+ }
109
+ // Convert the parameters object to URL query string
110
+ const queryParams = new URLSearchParams();
111
+ for (const [key, value] of Object.entries(p)) {
112
+ queryParams.append(key, String(value));
113
+ }
114
+ const r = await fetch(`${DEBRIDGE_API}/${path}?${queryParams.toString()}`).then((res) => res.json());
115
+ if (!r.estimation) {
116
+ throw new Error(r.errorMessage);
117
+ }
118
+ //const inputUsd = r.estimation.srcChainTokenIn.approximateUsdValue
119
+ //const outputUsd = r.estimation.dstChainTokenOut.recommendedApproximateUsdValue
120
+ const formattedInputAmount = formatUnits(BigInt(params.amount), params.fromToken.decimals);
121
+ const formattedOutputAmount = formatUnits(BigInt(r.estimation.dstChainTokenOut.recommendedAmount), params.toToken.decimals);
122
+ const inputUsd = NOT_SUPPORTED_CHAINS_PRICE_SERVICE.includes(params.fromChain)
123
+ ? r.estimation.srcChainTokenIn.approximateUsdValue
124
+ : params.tokenInUsd * +formattedInputAmount;
125
+ const outputUsd = NOT_SUPPORTED_CHAINS_PRICE_SERVICE.includes(params.toChain)
126
+ ? r.estimation.dstChainTokenOut.recommendedApproximateUsdValue
127
+ : params.tokenOutUsd * +formattedOutputAmount;
128
+ const fixFee = r.fixFee;
129
+ const wrappedAddress = NativeCurrencies[params.fromChain].wrapped.address;
130
+ const nativePrice = await fetch(`${TOKEN_API_URL}/v1/public/tokens/prices`, {
131
+ method: 'POST',
132
+ body: JSON.stringify({
133
+ [params.fromChain]: [wrappedAddress],
134
+ }),
135
+ })
136
+ .then((res) => res.json())
137
+ .then((res) => {
138
+ return res?.data?.[params.fromChain]?.[wrappedAddress]?.PriceBuy || 0;
139
+ });
140
+ const nativeDecimals = params.fromChain === 'solana'
141
+ ? 9
142
+ : NativeCurrencies[params.fromChain].decimals;
143
+ const protocolFee = Number(nativePrice) * (Number(fixFee) / 10 ** nativeDecimals);
144
+ const protocolFeeString = `${Number(fixFee) / 10 ** nativeDecimals} ${params.fromChain === 'solana'
145
+ ? 'SOL'
146
+ : NativeCurrencies[params.fromChain].symbol}`;
147
+ return {
148
+ quoteParams: params,
149
+ outputAmount: BigInt(r.estimation.dstChainTokenOut.recommendedAmount),
150
+ formattedOutputAmount,
151
+ inputUsd,
152
+ outputUsd,
153
+ priceImpact: !inputUsd || !outputUsd
154
+ ? Number.NaN
155
+ : ((inputUsd - outputUsd) * 100) / inputUsd,
156
+ rate: +formattedOutputAmount / +formattedInputAmount,
157
+ gasFeeUsd: 0,
158
+ timeEstimate: r.order.approximateFulfillmentDelay,
159
+ contractAddress: r.tx.allowanceTarget || r.tx.to,
160
+ rawQuote: r,
161
+ protocolFee,
162
+ protocolFeeString,
163
+ platformFeePercent: (params.feeBps * 100) / 10000,
164
+ };
165
+ }
166
+ async executeSwap({ quote }, walletClient, _nearWallet, _sendBtcFn, sendSolanaFn, solanaConnection) {
167
+ if (quote.quoteParams.fromChain === 'solana') {
168
+ if (!solanaConnection || !sendSolanaFn)
169
+ throw new Error('Connection is not defined for Solana swap');
170
+ const txBuffer = Buffer.from(quote.rawQuote.tx.data.slice(2), 'hex');
171
+ // Try to deserialize as VersionedTransaction first
172
+ let transaction;
173
+ try {
174
+ transaction = VersionedTransaction.deserialize(txBuffer);
175
+ console.log('Parsed as VersionedTransaction');
176
+ }
177
+ catch (versionedError) {
178
+ console.log('Failed to parse as VersionedTransaction, trying legacy Transaction');
179
+ try {
180
+ transaction = Transaction.from(txBuffer);
181
+ console.log('Parsed as legacy Transaction');
182
+ }
183
+ catch (legacyError) {
184
+ throw new Error('Could not parse transaction as either VersionedTransaction or legacy Transaction');
185
+ }
186
+ }
187
+ console.log('Transaction parsed successfully:', transaction);
188
+ // Send through wallet adapter
189
+ const signature = await sendSolanaFn(transaction, solanaConnection);
190
+ const waitForConfirmation = async (txId) => {
191
+ try {
192
+ const latestBlockhash = await solanaConnection.getLatestBlockhash();
193
+ // Wait for confirmation with timeout
194
+ const confirmation = await Promise.race([
195
+ solanaConnection.confirmTransaction({
196
+ signature: txId,
197
+ blockhash: latestBlockhash.blockhash,
198
+ lastValidBlockHeight: latestBlockhash.lastValidBlockHeight,
199
+ }, 'confirmed'),
200
+ new Promise((_, reject) => setTimeout(() => reject(new Error('Transaction confirmation timeout')), 60000)),
201
+ ]);
202
+ const confirmationResult = confirmation;
203
+ if (confirmationResult.value.err) {
204
+ throw new Error(`Transaction failed: ${JSON.stringify(confirmationResult.value.err)}`);
205
+ }
206
+ console.log('Transaction confirmed successfully!');
207
+ }
208
+ catch (confirmError) {
209
+ console.error('Transaction confirmation failed:', confirmError);
210
+ // Check if transaction actually succeeded despite timeout
211
+ const txStatus = await solanaConnection.getSignatureStatus(txId);
212
+ if (txStatus?.value?.confirmationStatus !== 'confirmed') {
213
+ throw new Error(`Transaction was not confirmed: ${confirmError.message}`);
214
+ }
215
+ }
216
+ };
217
+ await waitForConfirmation(signature);
218
+ return {
219
+ sender: quote.quoteParams.sender,
220
+ id: quote.rawQuote.orderId, // specific id for debridge
221
+ sourceTxHash: signature,
222
+ adapter: this.getName(),
223
+ sourceChain: quote.quoteParams.fromChain,
224
+ targetChain: quote.quoteParams.toChain,
225
+ inputAmount: quote.quoteParams.amount,
226
+ outputAmount: quote.outputAmount.toString(),
227
+ sourceToken: quote.quoteParams.fromToken,
228
+ targetToken: quote.quoteParams.toToken,
229
+ timestamp: new Date().getTime(),
230
+ };
231
+ }
232
+ const account = walletClient.account?.address;
233
+ if (!account)
234
+ throw new Error('WalletClient account is not defined');
235
+ const tx = await walletClient.sendTransaction({
236
+ chain: undefined,
237
+ account,
238
+ to: quote.rawQuote.tx.to,
239
+ value: BigInt(quote.rawQuote.tx.value),
240
+ data: quote.rawQuote.tx.data,
241
+ });
242
+ return {
243
+ sender: quote.quoteParams.sender,
244
+ id: quote.rawQuote.orderId, // specific id for each provider
245
+ sourceTxHash: tx,
246
+ adapter: this.getName(),
247
+ sourceChain: quote.quoteParams.fromChain,
248
+ targetChain: quote.quoteParams.toChain,
249
+ inputAmount: quote.quoteParams.amount,
250
+ outputAmount: quote.outputAmount.toString(),
251
+ sourceToken: quote.quoteParams.fromToken,
252
+ targetToken: quote.quoteParams.toToken,
253
+ timestamp: new Date().getTime(),
254
+ };
255
+ }
256
+ async getTransactionStatus(p) {
257
+ const r = await fetch(`${DEBRIDGE_API}/${p.id}/status`).then((res) => res.json());
258
+ return {
259
+ status: r.status === 'Fulfilled' ? 'Success' : 'Processing',
260
+ txHash: p.id,
261
+ };
262
+ }
263
+ }
264
+ //# sourceMappingURL=DebridgeAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DebridgeAdapter.js","sourceRoot":"","sources":["../../../../src/cross/adapters/DebridgeAdapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { WalletAdapterProps } from '@solana/wallet-adapter-base';
2
+ import { Connection } from '@solana/web3.js';
3
+ import { WalletClient } from 'viem';
4
+ import { Currency } from '../constants/index.js';
5
+ import { Quote } from '../registry.js';
6
+ import { BaseSwapAdapter, Chain, NormalizedQuote, NormalizedTxResponse, QuoteParams, SwapStatus } from './BaseSwapAdapter.js';
7
+ export declare class LifiAdapter extends BaseSwapAdapter {
8
+ constructor();
9
+ getName(): string;
10
+ getIcon(): string;
11
+ getSupportedChains(): Chain[];
12
+ getSupportedTokens(_sourceChain: Chain, _destChain: Chain): Currency[];
13
+ getQuote(params: QuoteParams): Promise<NormalizedQuote>;
14
+ executeSwap({ quote }: Quote, walletClient: WalletClient, _nearWalletClient?: any, _sendBtcFn?: (params: {
15
+ recipient: string;
16
+ amount: string | number;
17
+ }) => Promise<string>, sendTransaction?: WalletAdapterProps['sendTransaction'], connection?: Connection): Promise<NormalizedTxResponse>;
18
+ getTransactionStatus(p: NormalizedTxResponse): Promise<SwapStatus>;
19
+ }
@@ -0,0 +1,169 @@
1
+ import { createConfig, getQuote, getStatus } from '@lifi/sdk';
2
+ import { Transaction, VersionedTransaction } from '@solana/web3.js';
3
+ import { formatUnits } from 'viem';
4
+ import { CROSS_CHAIN_FEE_RECEIVER, ZERO_ADDRESS, MAINNET_NETWORKS } from '../constants/index.js';
5
+ import { BaseSwapAdapter, NOT_SUPPORTED_CHAINS_PRICE_SERVICE, NonEvmChain, } from './BaseSwapAdapter.js';
6
+ export class LifiAdapter extends BaseSwapAdapter {
7
+ constructor() {
8
+ super();
9
+ createConfig({
10
+ integrator: 'kyberswap',
11
+ });
12
+ }
13
+ getName() {
14
+ return 'LIFI';
15
+ }
16
+ getIcon() {
17
+ return 'https://storage.googleapis.com/ks-setting-1d682dca/aed3a971-48be-4c3c-9597-5ab78073fbf11745552578218.png';
18
+ }
19
+ getSupportedChains() {
20
+ return [NonEvmChain.Solana, ...MAINNET_NETWORKS];
21
+ }
22
+ getSupportedTokens(_sourceChain, _destChain) {
23
+ return [];
24
+ }
25
+ async getQuote(params) {
26
+ const r = await getQuote({
27
+ fromChain: params.fromChain === 'solana' ? 'SOL' : +params.fromChain, // Arbitrum
28
+ fromToken: params.fromChain === 'solana'
29
+ ? params.fromToken.id
30
+ : params.fromToken.isNative
31
+ ? ZERO_ADDRESS
32
+ : params.fromToken.wrapped.address,
33
+ fromAmount: params.amount,
34
+ fromAddress: params.sender === ZERO_ADDRESS ? CROSS_CHAIN_FEE_RECEIVER : params.sender,
35
+ toChain: params.toChain === 'solana' ? 'SOL' : +params.toChain,
36
+ toToken: params.toChain === 'solana'
37
+ ? params.toToken.id
38
+ : params.toToken.isNative
39
+ ? ZERO_ADDRESS
40
+ : params.toToken.wrapped.address,
41
+ toAddress: params.recipient,
42
+ fee: params.feeBps / 10000,
43
+ });
44
+ //const inputUsd = Number(r.estimate.fromAmountUSD || '0')
45
+ //const outputUsd = Number(r.estimate.toAmountUSD || '0')
46
+ const formattedOutputAmount = formatUnits(BigInt(r.estimate.toAmount), params.toToken.decimals);
47
+ const formattedInputAmount = formatUnits(BigInt(params.amount), params.fromToken.decimals);
48
+ const inputUsd = NOT_SUPPORTED_CHAINS_PRICE_SERVICE.includes(params.fromChain)
49
+ ? Number(r.estimate.fromAmountUSD)
50
+ : params.tokenInUsd * +formattedInputAmount;
51
+ const outputUsd = NOT_SUPPORTED_CHAINS_PRICE_SERVICE.includes(params.toChain)
52
+ ? Number(r.estimate.toAmountUSD)
53
+ : params.tokenOutUsd * +formattedOutputAmount;
54
+ return {
55
+ quoteParams: params,
56
+ outputAmount: BigInt(r.estimate.toAmount),
57
+ formattedOutputAmount: formatUnits(BigInt(r.estimate.toAmount), params.toToken.decimals),
58
+ inputUsd,
59
+ outputUsd,
60
+ priceImpact: !inputUsd || !outputUsd ? NaN : ((inputUsd - outputUsd) * 100) / inputUsd,
61
+ rate: +formattedOutputAmount / +formattedInputAmount,
62
+ gasFeeUsd: 0,
63
+ timeEstimate: r.estimate.executionDuration,
64
+ contractAddress: r.transactionRequest?.to || r.estimate.approvalAddress,
65
+ rawQuote: r,
66
+ protocolFee: 0,
67
+ platformFeePercent: (params.feeBps * 100) / 10000,
68
+ };
69
+ }
70
+ async executeSwap({ quote }, walletClient, _nearWalletClient, _sendBtcFn, sendTransaction, connection) {
71
+ if (quote.quoteParams.fromChain === NonEvmChain.Solana) {
72
+ if (!connection || !sendTransaction)
73
+ throw new Error('Connection is not defined for Solana swap');
74
+ const txBuffer = Buffer.from(quote.rawQuote.transactionRequest.data, 'base64');
75
+ // Try to deserialize as VersionedTransaction first
76
+ let transaction;
77
+ try {
78
+ transaction = VersionedTransaction.deserialize(txBuffer);
79
+ console.log('Parsed as VersionedTransaction');
80
+ }
81
+ catch (versionedError) {
82
+ console.log('Failed to parse as VersionedTransaction, trying legacy Transaction');
83
+ try {
84
+ transaction = Transaction.from(txBuffer);
85
+ console.log('Parsed as legacy Transaction');
86
+ }
87
+ catch (legacyError) {
88
+ throw new Error('Could not parse transaction as either VersionedTransaction or legacy Transaction');
89
+ }
90
+ }
91
+ console.log('Transaction parsed successfully:', transaction);
92
+ // Send through wallet adapter
93
+ const signature = await sendTransaction(transaction, connection);
94
+ try {
95
+ const latestBlockhash = await connection.getLatestBlockhash();
96
+ // Wait for confirmation with timeout
97
+ const confirmation = await Promise.race([
98
+ connection.confirmTransaction({
99
+ signature,
100
+ blockhash: latestBlockhash.blockhash,
101
+ lastValidBlockHeight: latestBlockhash.lastValidBlockHeight,
102
+ }, 'confirmed'),
103
+ new Promise((_, reject) => setTimeout(() => reject(new Error('Transaction confirmation timeout')), 60000)),
104
+ ]);
105
+ const confirmationResult = confirmation;
106
+ if (confirmationResult.value.err) {
107
+ throw new Error(`Transaction failed: ${JSON.stringify(confirmationResult.value.err)}`);
108
+ }
109
+ console.log('Transaction confirmed successfully!');
110
+ }
111
+ catch (confirmError) {
112
+ console.error('Transaction confirmation failed:', confirmError);
113
+ // Check if transaction actually succeeded despite timeout
114
+ const txStatus = await connection.getSignatureStatus(signature);
115
+ if (txStatus?.value?.confirmationStatus !== 'confirmed') {
116
+ throw new Error(`Transaction was not confirmed: ${confirmError.message}`);
117
+ }
118
+ }
119
+ return {
120
+ sender: quote.quoteParams.sender,
121
+ id: signature,
122
+ sourceTxHash: signature,
123
+ adapter: this.getName(),
124
+ sourceChain: quote.quoteParams.fromChain,
125
+ targetChain: quote.quoteParams.toChain,
126
+ inputAmount: quote.quoteParams.amount,
127
+ outputAmount: quote.outputAmount.toString(),
128
+ sourceToken: quote.quoteParams.fromToken,
129
+ targetToken: quote.quoteParams.toToken,
130
+ timestamp: new Date().getTime(),
131
+ };
132
+ }
133
+ const account = walletClient.account?.address;
134
+ if (!account)
135
+ throw new Error('WalletClient account is not defined');
136
+ const tx = await walletClient.sendTransaction({
137
+ chain: undefined,
138
+ account,
139
+ to: quote.rawQuote.transactionRequest.to,
140
+ value: BigInt(quote.rawQuote.transactionRequest.value),
141
+ data: quote.rawQuote.transactionRequest.data,
142
+ });
143
+ return {
144
+ sender: quote.quoteParams.sender,
145
+ id: tx, // specific id for each provider
146
+ sourceTxHash: tx,
147
+ adapter: this.getName(),
148
+ sourceChain: quote.quoteParams.fromChain,
149
+ targetChain: quote.quoteParams.toChain,
150
+ inputAmount: quote.quoteParams.amount,
151
+ outputAmount: quote.outputAmount.toString(),
152
+ sourceToken: quote.quoteParams.fromToken,
153
+ targetToken: quote.quoteParams.toToken,
154
+ timestamp: new Date().getTime(),
155
+ };
156
+ }
157
+ async getTransactionStatus(p) {
158
+ const res = await getStatus({
159
+ fromChain: p.sourceChain === 'solana' ? 'SOL' : +p.sourceChain,
160
+ toChain: p.targetChain === 'solana' ? 'SOL' : +p.targetChain,
161
+ txHash: p.sourceTxHash,
162
+ });
163
+ return {
164
+ txHash: res?.receiving?.txHash || '',
165
+ status: res.status === 'DONE' ? 'Success' : res.status === 'FAILED' ? 'Failed' : 'Processing',
166
+ };
167
+ }
168
+ }
169
+ //# sourceMappingURL=LifiAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LifiAdapter.js","sourceRoot":"","sources":["../../../../src/cross/adapters/LifiAdapter.ts"],"names":[],"mappings":"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"}