@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,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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"}
|