@rabby-wallet/rabby-swap 0.0.19 → 0.0.21

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.
@@ -0,0 +1,96 @@
1
+ import { CHAINS_ENUM } from "@debank/common";
2
+ export declare enum DEX_ENUM {
3
+ PARASWAP = "ParaSwap",
4
+ ZEROXAPI = "0xAPI",
5
+ WRAPTOKEN = "WrapToken",
6
+ OPENOCEAN = "OpenOcean"
7
+ }
8
+ export declare const WrapTokenAddressMap: {
9
+ ETH: string;
10
+ BSC: string;
11
+ POLYGON: string;
12
+ OP: string;
13
+ FTM: string;
14
+ AVAX: string;
15
+ ARBITRUM: string;
16
+ KLAY: string;
17
+ GNOSIS: string;
18
+ };
19
+ export declare const DEX_SUPPORT_CHAINS: {
20
+ WrapToken: CHAINS_ENUM[];
21
+ ParaSwap: CHAINS_ENUM[];
22
+ "0xAPI": CHAINS_ENUM[];
23
+ OpenOcean: CHAINS_ENUM[];
24
+ };
25
+ export declare const DEX_ROUTER_WHITELIST: {
26
+ ParaSwap: {
27
+ ETH: string;
28
+ POLYGON: string;
29
+ BSC: string;
30
+ AVAX: string;
31
+ FTM: string;
32
+ ARBITRUM: string;
33
+ OP: string;
34
+ };
35
+ "0xAPI": {
36
+ ETH: string;
37
+ POLYGON: string;
38
+ BSC: string;
39
+ OP: string;
40
+ FTM: string;
41
+ CELO: string;
42
+ AVAX: string;
43
+ ARBITRUM: string;
44
+ };
45
+ OpenOcean: {
46
+ ETH: string;
47
+ POLYGON: string;
48
+ BSC: string;
49
+ OP: string;
50
+ FTM: string;
51
+ AVAX: string;
52
+ ARBITRUM: string;
53
+ CRO: string;
54
+ GNOSIS: string;
55
+ AURORA: string;
56
+ BOBA: string;
57
+ KAVA: string;
58
+ METIS: string;
59
+ };
60
+ };
61
+ export declare const DEX_SPENDER_WHITELIST: {
62
+ ParaSwap: {
63
+ ETH: string;
64
+ POLYGON: string;
65
+ BSC: string;
66
+ AVAX: string;
67
+ FTM: string;
68
+ OP: string;
69
+ ARBITRUM: string;
70
+ };
71
+ "0xAPI": {
72
+ ETH: string;
73
+ POLYGON: string;
74
+ BSC: string;
75
+ OP: string;
76
+ FTM: string;
77
+ CELO: string;
78
+ AVAX: string;
79
+ ARBITRUM: string;
80
+ };
81
+ OpenOcean: {
82
+ ETH: string;
83
+ POLYGON: string;
84
+ BSC: string;
85
+ OP: string;
86
+ FTM: string;
87
+ AVAX: string;
88
+ ARBITRUM: string;
89
+ CRO: string;
90
+ GNOSIS: string;
91
+ AURORA: string;
92
+ BOBA: string;
93
+ KAVA: string;
94
+ METIS: string;
95
+ };
96
+ };
package/dist/consts.js ADDED
@@ -0,0 +1,127 @@
1
+ import { CHAINS_ENUM } from "@debank/common";
2
+ import { SUPPORT_CHAINS as wrapTokenSupportChains } from "./dexs/wrapToken";
3
+ import { SUPPORT_CHAINS as zeroXSupportChains } from "./dexs/0xapi";
4
+ import { SUPPORT_CHAINS as paraswapSupportChains } from "./dexs/paraswap";
5
+ import { SUPPORT_CHAINS as openOceanSupportChains } from "./dexs/openocean";
6
+ export var DEX_ENUM;
7
+ (function (DEX_ENUM) {
8
+ // ONEINCH = "1inch",
9
+ DEX_ENUM["PARASWAP"] = "ParaSwap";
10
+ DEX_ENUM["ZEROXAPI"] = "0xAPI";
11
+ DEX_ENUM["WRAPTOKEN"] = "WrapToken";
12
+ DEX_ENUM["OPENOCEAN"] = "OpenOcean";
13
+ })(DEX_ENUM || (DEX_ENUM = {}));
14
+ export const WrapTokenAddressMap = {
15
+ [CHAINS_ENUM.ETH]: "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
16
+ [CHAINS_ENUM.BSC]: "0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c",
17
+ [CHAINS_ENUM.POLYGON]: "0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270",
18
+ [CHAINS_ENUM.OP]: "0x4200000000000000000000000000000000000006",
19
+ [CHAINS_ENUM.FTM]: "0x21be370d5312f44cb42ce377bc9b8a0cef1a4c83",
20
+ [CHAINS_ENUM.AVAX]: "0xb31f66aa3c1e785363f0875a1b74e27b85fd66c7",
21
+ [CHAINS_ENUM.ARBITRUM]: "0x82af49447d8a07e3bd95bd0d56f35241523fbab1",
22
+ [CHAINS_ENUM.KLAY]: "0xe4f05a66ec68b54a58b17c22107b02e0232cc817",
23
+ [CHAINS_ENUM.GNOSIS]: "0xe91d153e0b41518a2ce8dd3d7944fa863463a97d",
24
+ };
25
+ export const DEX_SUPPORT_CHAINS = {
26
+ [DEX_ENUM.WRAPTOKEN]: wrapTokenSupportChains,
27
+ // [DEX_ENUM.ONEINCH]: oneInchSupportChains,
28
+ [DEX_ENUM.PARASWAP]: paraswapSupportChains,
29
+ [DEX_ENUM.ZEROXAPI]: zeroXSupportChains,
30
+ [DEX_ENUM.OPENOCEAN]: openOceanSupportChains,
31
+ };
32
+ export const DEX_ROUTER_WHITELIST = {
33
+ // [DEX_ENUM.ONEINCH]: {
34
+ // [CHAINS_ENUM.ETH]: "0x1111111254eeb25477b68fb85ed929f73a960582",
35
+ // [CHAINS_ENUM.POLYGON]: "0x1111111254eeb25477b68fb85ed929f73a960582",
36
+ // [CHAINS_ENUM.BSC]: "0x1111111254eeb25477b68fb85ed929f73a960582",
37
+ // [CHAINS_ENUM.OP]: "0x1111111254eeb25477b68fb85ed929f73a960582",
38
+ // [CHAINS_ENUM.FTM]: "0x1111111254eeb25477b68fb85ed929f73a960582",
39
+ // [CHAINS_ENUM.AVAX]: "0x1111111254eeb25477b68fb85ed929f73a960582",
40
+ // [CHAINS_ENUM.ARBITRUM]: "0x1111111254eeb25477b68fb85ed929f73a960582",
41
+ // [CHAINS_ENUM.KLAY]: "0x1111111254eeb25477b68fb85ed929f73a960582",
42
+ // [CHAINS_ENUM.GNOSIS]: "0x1111111254eeb25477b68fb85ed929f73a960582",
43
+ // [CHAINS_ENUM.CELO]: "0x1111111254eeb25477b68fb85ed929f73a960582",
44
+ // },
45
+ [DEX_ENUM.PARASWAP]: {
46
+ [CHAINS_ENUM.ETH]: "0xdef171fe48cf0115b1d80b88dc8eab59176fee57",
47
+ [CHAINS_ENUM.POLYGON]: "0xdef171fe48cf0115b1d80b88dc8eab59176fee57",
48
+ [CHAINS_ENUM.BSC]: "0xdef171fe48cf0115b1d80b88dc8eab59176fee57",
49
+ [CHAINS_ENUM.AVAX]: "0xdef171fe48cf0115b1d80b88dc8eab59176fee57",
50
+ [CHAINS_ENUM.FTM]: "0xdef171fe48cf0115b1d80b88dc8eab59176fee57",
51
+ [CHAINS_ENUM.ARBITRUM]: "0xdef171fe48cf0115b1d80b88dc8eab59176fee57",
52
+ [CHAINS_ENUM.OP]: "0xdef171fe48cf0115b1d80b88dc8eab59176fee57",
53
+ },
54
+ [DEX_ENUM.ZEROXAPI]: {
55
+ [CHAINS_ENUM.ETH]: "0xdef1c0ded9bec7f1a1670819833240f027b25eff",
56
+ [CHAINS_ENUM.POLYGON]: "0xdef1c0ded9bec7f1a1670819833240f027b25eff",
57
+ [CHAINS_ENUM.BSC]: "0xdef1c0ded9bec7f1a1670819833240f027b25eff",
58
+ [CHAINS_ENUM.OP]: "0xdef1abe32c034e558cdd535791643c58a13acc10",
59
+ [CHAINS_ENUM.FTM]: "0xdef189deaef76e379df891899eb5a00a94cbc250",
60
+ [CHAINS_ENUM.CELO]: "0xdef1c0ded9bec7f1a1670819833240f027b25eff",
61
+ [CHAINS_ENUM.AVAX]: "0xdef1c0ded9bec7f1a1670819833240f027b25eff",
62
+ [CHAINS_ENUM.ARBITRUM]: "0xdef1c0ded9bec7f1a1670819833240f027b25eff",
63
+ },
64
+ [DEX_ENUM.OPENOCEAN]: {
65
+ [CHAINS_ENUM.ETH]: "0x6352a56caadC4F1E25CD6c75970Fa768A3304e64",
66
+ [CHAINS_ENUM.POLYGON]: "0x6352a56caadC4F1E25CD6c75970Fa768A3304e64",
67
+ [CHAINS_ENUM.BSC]: "0x6352a56caadC4F1E25CD6c75970Fa768A3304e64",
68
+ [CHAINS_ENUM.OP]: "0x6352a56caadC4F1E25CD6c75970Fa768A3304e64",
69
+ [CHAINS_ENUM.FTM]: "0x6352a56caadC4F1E25CD6c75970Fa768A3304e64",
70
+ [CHAINS_ENUM.AVAX]: "0x6352a56caadC4F1E25CD6c75970Fa768A3304e64",
71
+ [CHAINS_ENUM.ARBITRUM]: "0x6352a56caadC4F1E25CD6c75970Fa768A3304e64",
72
+ [CHAINS_ENUM.CRO]: "0x6352a56caadC4F1E25CD6c75970Fa768A3304e64",
73
+ [CHAINS_ENUM.GNOSIS]: "0x6352a56caadC4F1E25CD6c75970Fa768A3304e64",
74
+ [CHAINS_ENUM.AURORA]: "0x6352a56caadC4F1E25CD6c75970Fa768A3304e64",
75
+ [CHAINS_ENUM.BOBA]: "0x6352a56caadC4F1E25CD6c75970Fa768A3304e64",
76
+ [CHAINS_ENUM.KAVA]: "0x6352a56caadC4F1E25CD6c75970Fa768A3304e64",
77
+ [CHAINS_ENUM.METIS]: "0x6352a56caadC4F1E25CD6c75970Fa768A3304e64",
78
+ },
79
+ };
80
+ export const DEX_SPENDER_WHITELIST = {
81
+ // [DEX_ENUM.ONEINCH]: {
82
+ // [CHAINS_ENUM.ETH]: "0x1111111254eeb25477b68fb85ed929f73a960582",
83
+ // [CHAINS_ENUM.POLYGON]: "0x1111111254eeb25477b68fb85ed929f73a960582",
84
+ // [CHAINS_ENUM.BSC]: "0x1111111254eeb25477b68fb85ed929f73a960582",
85
+ // [CHAINS_ENUM.OP]: "0x1111111254eeb25477b68fb85ed929f73a960582",
86
+ // [CHAINS_ENUM.FTM]: "0x1111111254eeb25477b68fb85ed929f73a960582",
87
+ // [CHAINS_ENUM.AVAX]: "0x1111111254eeb25477b68fb85ed929f73a960582",
88
+ // [CHAINS_ENUM.ARBITRUM]: "0x1111111254eeb25477b68fb85ed929f73a960582",
89
+ // [CHAINS_ENUM.KLAY]: "0x1111111254eeb25477b68fb85ed929f73a960582",
90
+ // [CHAINS_ENUM.GNOSIS]: "0x1111111254eeb25477b68fb85ed929f73a960582",
91
+ // [CHAINS_ENUM.CELO]: "0x1111111254eeb25477b68fb85ed929f73a960582",
92
+ // },
93
+ [DEX_ENUM.PARASWAP]: {
94
+ [CHAINS_ENUM.ETH]: "0x216b4b4ba9f3e719726886d34a177484278bfcae",
95
+ [CHAINS_ENUM.POLYGON]: "0x216b4b4ba9f3e719726886d34a177484278bfcae",
96
+ [CHAINS_ENUM.BSC]: "0x216b4b4ba9f3e719726886d34a177484278bfcae",
97
+ [CHAINS_ENUM.AVAX]: "0x216b4b4ba9f3e719726886d34a177484278bfcae",
98
+ [CHAINS_ENUM.FTM]: "0x216b4b4ba9f3e719726886d34a177484278bfcae",
99
+ [CHAINS_ENUM.OP]: "0x216b4b4ba9f3e719726886d34a177484278bfcae",
100
+ [CHAINS_ENUM.ARBITRUM]: "0x216b4b4ba9f3e719726886d34a177484278bfcae",
101
+ },
102
+ [DEX_ENUM.ZEROXAPI]: {
103
+ [CHAINS_ENUM.ETH]: "0xdef1c0ded9bec7f1a1670819833240f027b25eff",
104
+ [CHAINS_ENUM.POLYGON]: "0xdef1c0ded9bec7f1a1670819833240f027b25eff",
105
+ [CHAINS_ENUM.BSC]: "0xdef1c0ded9bec7f1a1670819833240f027b25eff",
106
+ [CHAINS_ENUM.OP]: "0xdef1abe32c034e558cdd535791643c58a13acc10",
107
+ [CHAINS_ENUM.FTM]: "0xdef189deaef76e379df891899eb5a00a94cbc250",
108
+ [CHAINS_ENUM.CELO]: "0xdef1c0ded9bec7f1a1670819833240f027b25eff",
109
+ [CHAINS_ENUM.AVAX]: "0xdef1c0ded9bec7f1a1670819833240f027b25eff",
110
+ [CHAINS_ENUM.ARBITRUM]: "0xdef1c0ded9bec7f1a1670819833240f027b25eff",
111
+ },
112
+ [DEX_ENUM.OPENOCEAN]: {
113
+ [CHAINS_ENUM.ETH]: "0x6352a56caadC4F1E25CD6c75970Fa768A3304e64",
114
+ [CHAINS_ENUM.POLYGON]: "0x6352a56caadC4F1E25CD6c75970Fa768A3304e64",
115
+ [CHAINS_ENUM.BSC]: "0x6352a56caadC4F1E25CD6c75970Fa768A3304e64",
116
+ [CHAINS_ENUM.OP]: "0x6352a56caadC4F1E25CD6c75970Fa768A3304e64",
117
+ [CHAINS_ENUM.FTM]: "0x6352a56caadC4F1E25CD6c75970Fa768A3304e64",
118
+ [CHAINS_ENUM.AVAX]: "0x6352a56caadC4F1E25CD6c75970Fa768A3304e64",
119
+ [CHAINS_ENUM.ARBITRUM]: "0x6352a56caadC4F1E25CD6c75970Fa768A3304e64",
120
+ [CHAINS_ENUM.CRO]: "0x6352a56caadC4F1E25CD6c75970Fa768A3304e64",
121
+ [CHAINS_ENUM.GNOSIS]: "0x6352a56caadC4F1E25CD6c75970Fa768A3304e64",
122
+ [CHAINS_ENUM.AURORA]: "0x6352a56caadC4F1E25CD6c75970Fa768A3304e64",
123
+ [CHAINS_ENUM.BOBA]: "0x6352a56caadC4F1E25CD6c75970Fa768A3304e64",
124
+ [CHAINS_ENUM.KAVA]: "0x6352a56caadC4F1E25CD6c75970Fa768A3304e64",
125
+ [CHAINS_ENUM.METIS]: "0x6352a56caadC4F1E25CD6c75970Fa768A3304e64",
126
+ },
127
+ };
@@ -0,0 +1,5 @@
1
+ import { CHAINS_ENUM } from "@debank/common";
2
+ import { QuoteParams, QuoteResult, TxWithChainId, DecodeCalldataResult } from "../quote";
3
+ export declare const SUPPORT_CHAINS: CHAINS_ENUM[];
4
+ export declare const getQuote: (options: QuoteParams) => Promise<QuoteResult>;
5
+ export declare const decodeCalldata: (tx: TxWithChainId) => DecodeCalldataResult | null;
@@ -0,0 +1,124 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import axios from "axios";
11
+ import { Interface } from "@ethersproject/abi";
12
+ import { CHAINS_ENUM, CHAINS } from "@debank/common";
13
+ import { isSameAddress } from "../utils";
14
+ import { ZeroXABI } from "../abi";
15
+ const NATIVE_TOKEN = "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee";
16
+ const API_DOMAINS = {
17
+ [CHAINS_ENUM.ETH]: "https://api.0x.org",
18
+ [CHAINS_ENUM.POLYGON]: "https://polygon.api.0x.org",
19
+ [CHAINS_ENUM.BSC]: "https://bsc.api.0x.org",
20
+ [CHAINS_ENUM.OP]: "https://optimism.api.0x.org",
21
+ [CHAINS_ENUM.FTM]: "https://fantom.api.0x.org",
22
+ [CHAINS_ENUM.CELO]: "https://celo.api.0x.org",
23
+ [CHAINS_ENUM.AVAX]: "https://avalanche.api.0x.org",
24
+ [CHAINS_ENUM.ARBITRUM]: "https://arbitrum.api.0x.org",
25
+ };
26
+ export const SUPPORT_CHAINS = [
27
+ CHAINS_ENUM.ETH,
28
+ CHAINS_ENUM.POLYGON,
29
+ CHAINS_ENUM.BSC,
30
+ CHAINS_ENUM.OP,
31
+ CHAINS_ENUM.FTM,
32
+ CHAINS_ENUM.AVAX,
33
+ CHAINS_ENUM.ARBITRUM,
34
+ CHAINS_ENUM.CELO,
35
+ ];
36
+ export const getQuote = (options) => __awaiter(void 0, void 0, void 0, function* () {
37
+ if (!SUPPORT_CHAINS.includes(options.chain)) {
38
+ throw new Error(`${CHAINS[options.chain]} is not support on 1inch`);
39
+ }
40
+ const baseURL = API_DOMAINS[options.chain];
41
+ const request = axios.create({
42
+ baseURL,
43
+ });
44
+ request.interceptors.response.use((response) => {
45
+ var _a, _b;
46
+ const code = (_a = response.data) === null || _a === void 0 ? void 0 : _a.code;
47
+ const msg = (_b = response.data) === null || _b === void 0 ? void 0 : _b.reason;
48
+ if (code && code !== 200) {
49
+ if (msg) {
50
+ let err;
51
+ try {
52
+ err = new Error(JSON.parse(msg));
53
+ }
54
+ catch (e) {
55
+ err = new Error(msg);
56
+ }
57
+ throw err;
58
+ }
59
+ throw new Error(response.data);
60
+ }
61
+ return response;
62
+ });
63
+ const params = {
64
+ sellToken: options.fromToken === CHAINS[options.chain].nativeTokenAddress
65
+ ? NATIVE_TOKEN
66
+ : options.fromToken,
67
+ buyToken: options.toToken === CHAINS[options.chain].nativeTokenAddress
68
+ ? NATIVE_TOKEN
69
+ : options.toToken,
70
+ sellAmount: options.amount,
71
+ takerAddress: options.userAddress,
72
+ slippagePercentage: options.slippage / 100,
73
+ skipValidation: true,
74
+ };
75
+ if (options.feeRate !== null && options.feeRate !== undefined) {
76
+ params.buyTokenPercentageFee = options.feeRate / 100;
77
+ params.feeRecipient = options.feeAddress;
78
+ params.affiliateAddress = options.feeAddress;
79
+ }
80
+ const { data } = yield request.get("/swap/v1/quote", {
81
+ params,
82
+ });
83
+ return {
84
+ tx: {
85
+ data: data.data,
86
+ to: data.to,
87
+ value: data.value,
88
+ from: data.from,
89
+ },
90
+ fromToken: isSameAddress(data.sellTokenAddress, NATIVE_TOKEN)
91
+ ? CHAINS[options.chain].nativeTokenAddress
92
+ : data.sellTokenAddress,
93
+ spender: data.allowanceTarget,
94
+ fromTokenAmount: data.sellAmount,
95
+ toToken: isSameAddress(data.buyTokenAddress, NATIVE_TOKEN)
96
+ ? CHAINS[options.chain].nativeTokenAddress
97
+ : data.buyTokenAddress,
98
+ toTokenAmount: data.buyAmount,
99
+ };
100
+ });
101
+ export const decodeCalldata = (tx) => {
102
+ const chain = Object.values(CHAINS).find((item) => item.id === tx.chainId);
103
+ if (!chain)
104
+ return null;
105
+ const contractInterface = new Interface(ZeroXABI);
106
+ const result = contractInterface.parseTransaction({ data: tx.data });
107
+ if (result.name !== "transformERC20") {
108
+ return null;
109
+ }
110
+ const [inputToken, outputToken, inputTokenAmount, minOutputTokenAmount] = result.args;
111
+ if (!inputToken || !outputToken || !inputTokenAmount || !minOutputTokenAmount)
112
+ return null;
113
+ return {
114
+ fromToken: isSameAddress(inputToken, NATIVE_TOKEN)
115
+ ? chain.nativeTokenAddress
116
+ : inputToken,
117
+ fromTokenAmount: inputTokenAmount.toString(),
118
+ toToken: isSameAddress(outputToken, NATIVE_TOKEN)
119
+ ? chain.nativeTokenAddress
120
+ : outputToken,
121
+ minReceiveToTokenAmount: minOutputTokenAmount.toString(),
122
+ toTokenReceiver: tx.from,
123
+ };
124
+ };
@@ -0,0 +1,5 @@
1
+ import { CHAINS_ENUM } from "@debank/common";
2
+ import { QuoteParams, QuoteResult, TxWithChainId, DecodeCalldataResult } from "../quote";
3
+ export declare const SUPPORT_CHAINS: CHAINS_ENUM[];
4
+ export declare const getQuote: (options: QuoteParams) => Promise<QuoteResult>;
5
+ export declare const decodeCalldata: (tx: TxWithChainId) => DecodeCalldataResult | null;
@@ -0,0 +1,112 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import axios from "axios";
11
+ import { CHAINS_ENUM, CHAINS } from "@debank/common";
12
+ import { Interface } from "@ethersproject/abi";
13
+ import { isSameAddress } from "../utils";
14
+ import { OneInchABI } from "../abi";
15
+ const NATIVE_TOKEN = "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE";
16
+ const request = axios.create({
17
+ baseURL: "https://api.1inch.io/v5.0",
18
+ });
19
+ request.interceptors.response.use((response) => {
20
+ var _a, _b, _c;
21
+ const code = (_a = response.data) === null || _a === void 0 ? void 0 : _a.statusCode;
22
+ const msg = ((_b = response.data) === null || _b === void 0 ? void 0 : _b.description) || ((_c = response.data) === null || _c === void 0 ? void 0 : _c.error);
23
+ if (code && code !== 200) {
24
+ if (msg) {
25
+ let err;
26
+ try {
27
+ err = new Error(JSON.parse(msg));
28
+ }
29
+ catch (e) {
30
+ err = new Error(msg);
31
+ }
32
+ throw err;
33
+ }
34
+ throw new Error(response.data);
35
+ }
36
+ return response;
37
+ });
38
+ export const SUPPORT_CHAINS = [
39
+ CHAINS_ENUM.ETH,
40
+ CHAINS_ENUM.POLYGON,
41
+ CHAINS_ENUM.BSC,
42
+ CHAINS_ENUM.OP,
43
+ CHAINS_ENUM.FTM,
44
+ CHAINS_ENUM.AVAX,
45
+ CHAINS_ENUM.ARBITRUM,
46
+ CHAINS_ENUM.KLAY,
47
+ CHAINS_ENUM.GNOSIS,
48
+ ];
49
+ export const getQuote = (options) => __awaiter(void 0, void 0, void 0, function* () {
50
+ const chainId = CHAINS[options.chain].id;
51
+ if (!SUPPORT_CHAINS.includes(options.chain)) {
52
+ throw new Error(`${CHAINS[options.chain]} is not support on 1inch`);
53
+ }
54
+ const params = {
55
+ fromTokenAddress: options.fromToken === CHAINS[options.chain].nativeTokenAddress
56
+ ? NATIVE_TOKEN
57
+ : options.fromToken,
58
+ toTokenAddress: options.toToken === CHAINS[options.chain].nativeTokenAddress
59
+ ? NATIVE_TOKEN
60
+ : options.toToken,
61
+ amount: options.amount,
62
+ fromAddress: options.userAddress,
63
+ slippage: options.slippage,
64
+ disableEstimate: true,
65
+ };
66
+ if (options.feeRate !== null && options.feeRate !== undefined) {
67
+ params.fee = options.feeRate;
68
+ params.referrerAddress = options.feeAddress;
69
+ }
70
+ const { data } = yield request.get(`/${chainId}/swap`, {
71
+ params,
72
+ });
73
+ return {
74
+ tx: data.tx,
75
+ fromToken: data.fromToken.address === NATIVE_TOKEN
76
+ ? CHAINS[options.chain].nativeTokenAddress
77
+ : data.fromToken.address,
78
+ fromTokenAmount: data.fromTokenAmount,
79
+ fromTokenDecimals: data.fromToken.decimals,
80
+ toToken: data.toToken.address === NATIVE_TOKEN
81
+ ? CHAINS[options.chain].nativeTokenAddress
82
+ : data.toToken.address,
83
+ toTokenAmount: data.toTokenAmount,
84
+ toTokenDecimals: data.toToken.decimals,
85
+ spender: data.tx.to,
86
+ };
87
+ });
88
+ export const decodeCalldata = (tx) => {
89
+ const chain = Object.values(CHAINS).find((item) => item.id === tx.chainId);
90
+ if (!chain)
91
+ return null;
92
+ const contractInterface = new Interface(OneInchABI);
93
+ const result = contractInterface.parseTransaction({ data: tx.data });
94
+ if (result.name !== "swap") {
95
+ return null;
96
+ }
97
+ const [executor, desc] = result.args;
98
+ const [srcToken, dstToken, srcReceiver, dstReceiver, amount, minReturnAmount,] = desc;
99
+ if (!srcToken || !dstToken || !dstReceiver || !amount || !minReturnAmount)
100
+ return null;
101
+ return {
102
+ fromToken: isSameAddress(srcToken, NATIVE_TOKEN)
103
+ ? chain.nativeTokenAddress
104
+ : srcToken,
105
+ fromTokenAmount: amount.toString(),
106
+ toToken: isSameAddress(dstToken, NATIVE_TOKEN)
107
+ ? chain.nativeTokenAddress
108
+ : dstToken,
109
+ minReceiveToTokenAmount: minReturnAmount.toString(),
110
+ toTokenReceiver: dstReceiver,
111
+ };
112
+ };
@@ -0,0 +1,5 @@
1
+ import { CHAINS_ENUM } from "@debank/common";
2
+ import { QuoteParams, QuoteResult, TxWithChainId, DecodeCalldataResult } from "../quote";
3
+ export declare const SUPPORT_CHAINS: CHAINS_ENUM[];
4
+ export declare const getQuote: (options: QuoteParams) => Promise<QuoteResult>;
5
+ export declare const decodeCalldata: (tx: TxWithChainId) => DecodeCalldataResult | null;
@@ -0,0 +1,165 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import axios from "axios";
11
+ import { Interface } from "@ethersproject/abi";
12
+ import { CHAINS_ENUM, CHAINS } from "@debank/common";
13
+ import BigNumber from "bignumber.js";
14
+ import { isSameAddress } from "../utils";
15
+ import { OpenOceanABI } from "../abi";
16
+ const NATIVE_TOKENS = {
17
+ [CHAINS_ENUM.ETH]: "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",
18
+ [CHAINS_ENUM.POLYGON]: "0x0000000000000000000000000000000000001010",
19
+ [CHAINS_ENUM.BSC]: "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",
20
+ [CHAINS_ENUM.OP]: "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",
21
+ [CHAINS_ENUM.FTM]: "0x0000000000000000000000000000000000000000",
22
+ [CHAINS_ENUM.AVAX]: "0x0000000000000000000000000000000000000000",
23
+ [CHAINS_ENUM.ARBITRUM]: "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",
24
+ [CHAINS_ENUM.CRO]: "0x0000000000000000000000000000000000000000",
25
+ [CHAINS_ENUM.GNOSIS]: "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",
26
+ [CHAINS_ENUM.AURORA]: "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",
27
+ [CHAINS_ENUM.BOBA]: "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",
28
+ [CHAINS_ENUM.KAVA]: "0x0000000000000000000000000000000000000000",
29
+ [CHAINS_ENUM.METIS]: "0x0000000000000000000000000000000000000000",
30
+ };
31
+ const chainCode = {
32
+ [CHAINS_ENUM.ETH]: "eth",
33
+ [CHAINS_ENUM.POLYGON]: "polygon",
34
+ [CHAINS_ENUM.BSC]: "bsc",
35
+ [CHAINS_ENUM.OP]: "optimism",
36
+ [CHAINS_ENUM.FTM]: "fantom",
37
+ [CHAINS_ENUM.AVAX]: "avax",
38
+ [CHAINS_ENUM.ARBITRUM]: "arbitrum",
39
+ [CHAINS_ENUM.CRO]: "cronos",
40
+ [CHAINS_ENUM.GNOSIS]: "xdai",
41
+ [CHAINS_ENUM.AURORA]: "aurora",
42
+ [CHAINS_ENUM.BOBA]: "boba",
43
+ [CHAINS_ENUM.KAVA]: "kava",
44
+ [CHAINS_ENUM.METIS]: "metis",
45
+ };
46
+ export const SUPPORT_CHAINS = [
47
+ CHAINS_ENUM.ETH,
48
+ CHAINS_ENUM.POLYGON,
49
+ CHAINS_ENUM.BSC,
50
+ CHAINS_ENUM.OP,
51
+ CHAINS_ENUM.FTM,
52
+ CHAINS_ENUM.AVAX,
53
+ CHAINS_ENUM.ARBITRUM,
54
+ CHAINS_ENUM.CRO,
55
+ /**
56
+ * 接口返回 swap error
57
+ */
58
+ // CHAINS_ENUM.METIS,
59
+ /**
60
+ * pre api v1
61
+ */
62
+ // CHAINS_ENUM.AURORA,
63
+ /**
64
+ * 未开源
65
+ */
66
+ // CHAINS_ENUM.GNOSIS,
67
+ // CHAINS_ENUM.BOBA,
68
+ // CHAINS_ENUM.KAVA, //pre api v1
69
+ ];
70
+ export const getQuote = (options) => __awaiter(void 0, void 0, void 0, function* () {
71
+ if (!SUPPORT_CHAINS.includes(options.chain)) {
72
+ throw new Error(`${CHAINS[options.chain]} is not support on OpenOcean`);
73
+ }
74
+ const swapChainCode = chainCode[options.chain];
75
+ const baseURL = `https://open-api.openocean.finance/v3/${swapChainCode}`;
76
+ const request = axios.create({
77
+ baseURL,
78
+ });
79
+ request.interceptors.response.use((response) => {
80
+ var _a, _b;
81
+ const code = (_a = response.data) === null || _a === void 0 ? void 0 : _a.code;
82
+ const msg = (_b = response.data) === null || _b === void 0 ? void 0 : _b.reason;
83
+ if (code === 200)
84
+ return response.data;
85
+ if (code && code !== 200) {
86
+ if (msg) {
87
+ let err;
88
+ try {
89
+ err = new Error(JSON.parse(msg));
90
+ }
91
+ catch (e) {
92
+ err = new Error(msg);
93
+ }
94
+ throw err;
95
+ }
96
+ throw new Error(response.data);
97
+ }
98
+ return response;
99
+ });
100
+ const NATIVE_TOKEN = NATIVE_TOKENS[options.chain];
101
+ const params = {
102
+ inTokenAddress: options.fromToken === CHAINS[options.chain].nativeTokenAddress
103
+ ? NATIVE_TOKEN
104
+ : options.fromToken,
105
+ outTokenAddress: options.toToken === CHAINS[options.chain].nativeTokenAddress
106
+ ? NATIVE_TOKEN
107
+ : options.toToken,
108
+ amount: new BigNumber(options.amount)
109
+ .div(10 ** options.fromTokenDecimals)
110
+ .toFixed(),
111
+ slippage: options.slippage,
112
+ gasPrice: options.gasPrice || 1,
113
+ account: options.userAddress,
114
+ };
115
+ if (options.feeRate !== null && options.feeRate !== undefined) {
116
+ params.referrerFee = options.feeRate;
117
+ params.referrer = options.feeAddress;
118
+ }
119
+ const { data } = yield request.get("/swap_quote", {
120
+ params,
121
+ });
122
+ return {
123
+ tx: {
124
+ data: data.data,
125
+ to: data.to,
126
+ value: data.value,
127
+ from: data.from,
128
+ },
129
+ fromToken: isSameAddress(data.inToken.address, NATIVE_TOKEN)
130
+ ? CHAINS[options.chain].nativeTokenAddress
131
+ : data.inToken.address,
132
+ spender: data.to,
133
+ fromTokenAmount: data.inAmount,
134
+ toToken: isSameAddress(data.outToken.address, NATIVE_TOKEN)
135
+ ? CHAINS[options.chain].nativeTokenAddress
136
+ : data.outToken.address,
137
+ toTokenAmount: data.outAmount,
138
+ };
139
+ });
140
+ export const decodeCalldata = (tx) => {
141
+ const chain = Object.values(CHAINS).find((item) => item.id === tx.chainId);
142
+ if (!chain)
143
+ return null;
144
+ const contractInterface = new Interface(OpenOceanABI);
145
+ const result = contractInterface.parseTransaction({ data: tx.data });
146
+ if (result.name !== "swap") {
147
+ return null;
148
+ }
149
+ const [caller, data] = result.args;
150
+ const [srcToken, dstToken, srcReceiver, dstReceiver, amount, minReturnAmount,] = data;
151
+ if (!srcToken || !dstToken || !dstReceiver || !amount || !minReturnAmount)
152
+ return null;
153
+ const NATIVE_TOKEN = NATIVE_TOKENS[chain.enum];
154
+ return {
155
+ fromToken: isSameAddress(srcToken, NATIVE_TOKEN)
156
+ ? chain.nativeTokenAddress
157
+ : srcToken,
158
+ fromTokenAmount: amount.toString(),
159
+ toToken: isSameAddress(dstToken, NATIVE_TOKEN)
160
+ ? chain.nativeTokenAddress
161
+ : dstToken,
162
+ minReceiveToTokenAmount: minReturnAmount.toString(),
163
+ toTokenReceiver: tx.from,
164
+ };
165
+ };
@@ -0,0 +1,5 @@
1
+ import { CHAINS_ENUM } from "@debank/common";
2
+ import { QuoteParams, QuoteResult, TxWithChainId, DecodeCalldataResult } from "../quote";
3
+ export declare const SUPPORT_CHAINS: CHAINS_ENUM[];
4
+ export declare const getQuote: (options: QuoteParams) => Promise<QuoteResult>;
5
+ export declare const decodeCalldata: (tx: TxWithChainId) => DecodeCalldataResult | null;