@rabby-wallet/rabby-swap 0.0.2 → 0.0.4

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/consts.js CHANGED
@@ -1,8 +1,8 @@
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 oneInchSupportChains } from './dexs/1inch';
5
- import { SUPPORT_CHAINS as paraswapSupportChains } from './dexs/paraswap';
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 oneInchSupportChains } from "./dexs/1inch";
5
+ import { SUPPORT_CHAINS as paraswapSupportChains } from "./dexs/paraswap";
6
6
  export var DEX_ENUM;
7
7
  (function (DEX_ENUM) {
8
8
  DEX_ENUM["ONEINCH"] = "1inch";
@@ -11,15 +11,15 @@ export var DEX_ENUM;
11
11
  DEX_ENUM["WRAPTOKEN"] = "WrapToken";
12
12
  })(DEX_ENUM || (DEX_ENUM = {}));
13
13
  export const WrapTokenAddressMap = {
14
- [CHAINS_ENUM.ETH]: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',
15
- [CHAINS_ENUM.BSC]: '0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c',
16
- [CHAINS_ENUM.POLYGON]: '0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270',
17
- [CHAINS_ENUM.OP]: '0x4200000000000000000000000000000000000006',
18
- [CHAINS_ENUM.FTM]: '0x21be370d5312f44cb42ce377bc9b8a0cef1a4c83',
19
- [CHAINS_ENUM.AVAX]: '0xb31f66aa3c1e785363f0875a1b74e27b85fd66c7',
20
- [CHAINS_ENUM.ARBITRUM]: '0x82af49447d8a07e3bd95bd0d56f35241523fbab1',
21
- [CHAINS_ENUM.KLAY]: '0xe4f05a66ec68b54a58b17c22107b02e0232cc817',
22
- [CHAINS_ENUM.GNOSIS]: '0xe91d153e0b41518a2ce8dd3d7944fa863463a97d',
14
+ [CHAINS_ENUM.ETH]: "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
15
+ [CHAINS_ENUM.BSC]: "0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c",
16
+ [CHAINS_ENUM.POLYGON]: "0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270",
17
+ [CHAINS_ENUM.OP]: "0x4200000000000000000000000000000000000006",
18
+ [CHAINS_ENUM.FTM]: "0x21be370d5312f44cb42ce377bc9b8a0cef1a4c83",
19
+ [CHAINS_ENUM.AVAX]: "0xb31f66aa3c1e785363f0875a1b74e27b85fd66c7",
20
+ [CHAINS_ENUM.ARBITRUM]: "0x82af49447d8a07e3bd95bd0d56f35241523fbab1",
21
+ [CHAINS_ENUM.KLAY]: "0xe4f05a66ec68b54a58b17c22107b02e0232cc817",
22
+ [CHAINS_ENUM.GNOSIS]: "0xe91d153e0b41518a2ce8dd3d7944fa863463a97d",
23
23
  };
24
24
  export const DEX_SUPPORT_CHAINS = {
25
25
  [DEX_ENUM.WRAPTOKEN]: wrapTokenSupportChains,
@@ -27,3 +27,63 @@ export const DEX_SUPPORT_CHAINS = {
27
27
  [DEX_ENUM.PARASWAP]: paraswapSupportChains,
28
28
  [DEX_ENUM.ZEROXAPI]: zeroXSupportChains,
29
29
  };
30
+ export const DEX_ROUTER_WHITELIST = {
31
+ [DEX_ENUM.ONEINCH]: {
32
+ [CHAINS_ENUM.ETH]: "0x1111111254eeb25477b68fb85ed929f73a960582",
33
+ [CHAINS_ENUM.POLYGON]: "0x1111111254eeb25477b68fb85ed929f73a960582",
34
+ [CHAINS_ENUM.BSC]: "0x1111111254eeb25477b68fb85ed929f73a960582",
35
+ [CHAINS_ENUM.OP]: "0x1111111254eeb25477b68fb85ed929f73a960582",
36
+ [CHAINS_ENUM.FTM]: "0x1111111254eeb25477b68fb85ed929f73a960582",
37
+ [CHAINS_ENUM.AVAX]: "0x1111111254eeb25477b68fb85ed929f73a960582",
38
+ [CHAINS_ENUM.ARBITRUM]: "0x1111111254eeb25477b68fb85ed929f73a960582",
39
+ [CHAINS_ENUM.KLAY]: "0x1111111254eeb25477b68fb85ed929f73a960582",
40
+ [CHAINS_ENUM.GNOSIS]: "0x1111111254eeb25477b68fb85ed929f73a960582",
41
+ [CHAINS_ENUM.CELO]: "0x1111111254eeb25477b68fb85ed929f73a960582",
42
+ },
43
+ [DEX_ENUM.PARASWAP]: {
44
+ [CHAINS_ENUM.ETH]: "0xdef171fe48cf0115b1d80b88dc8eab59176fee57",
45
+ [CHAINS_ENUM.POLYGON]: "0xdef171fe48cf0115b1d80b88dc8eab59176fee57",
46
+ [CHAINS_ENUM.BSC]: "0xdef171fe48cf0115b1d80b88dc8eab59176fee57",
47
+ [CHAINS_ENUM.AVAX]: "0xdef171fe48cf0115b1d80b88dc8eab59176fee57",
48
+ },
49
+ [DEX_ENUM.ZEROXAPI]: {
50
+ [CHAINS_ENUM.ETH]: "0xdef1c0ded9bec7f1a1670819833240f027b25eff",
51
+ [CHAINS_ENUM.POLYGON]: "0xdef1c0ded9bec7f1a1670819833240f027b25eff",
52
+ [CHAINS_ENUM.BSC]: "0xdef1c0ded9bec7f1a1670819833240f027b25eff",
53
+ [CHAINS_ENUM.OP]: "0xdef1abe32c034e558cdd535791643c58a13acc10",
54
+ [CHAINS_ENUM.FTM]: "0xdef1c0ded9bec7f1a1670819833240f027b25eff",
55
+ [CHAINS_ENUM.CELO]: "0xdef1c0ded9bec7f1a1670819833240f027b25eff",
56
+ [CHAINS_ENUM.AVAX]: "0xdef1c0ded9bec7f1a1670819833240f027b25eff",
57
+ [CHAINS_ENUM.ARBITRUM]: "0xdef1c0ded9bec7f1a1670819833240f027b25eff",
58
+ },
59
+ };
60
+ export const DEX_SPENDER_WHITELIST = {
61
+ [DEX_ENUM.ONEINCH]: {
62
+ [CHAINS_ENUM.ETH]: "0x1111111254eeb25477b68fb85ed929f73a960582",
63
+ [CHAINS_ENUM.POLYGON]: "0x1111111254eeb25477b68fb85ed929f73a960582",
64
+ [CHAINS_ENUM.BSC]: "0x1111111254eeb25477b68fb85ed929f73a960582",
65
+ [CHAINS_ENUM.OP]: "0x1111111254eeb25477b68fb85ed929f73a960582",
66
+ [CHAINS_ENUM.FTM]: "0x1111111254eeb25477b68fb85ed929f73a960582",
67
+ [CHAINS_ENUM.AVAX]: "0x1111111254eeb25477b68fb85ed929f73a960582",
68
+ [CHAINS_ENUM.ARBITRUM]: "0x1111111254eeb25477b68fb85ed929f73a960582",
69
+ [CHAINS_ENUM.KLAY]: "0x1111111254eeb25477b68fb85ed929f73a960582",
70
+ [CHAINS_ENUM.GNOSIS]: "0x1111111254eeb25477b68fb85ed929f73a960582",
71
+ [CHAINS_ENUM.CELO]: "0x1111111254eeb25477b68fb85ed929f73a960582",
72
+ },
73
+ [DEX_ENUM.PARASWAP]: {
74
+ [CHAINS_ENUM.ETH]: "0x216b4b4ba9f3e719726886d34a177484278bfcae",
75
+ [CHAINS_ENUM.POLYGON]: "0x216b4b4ba9f3e719726886d34a177484278bfcae",
76
+ [CHAINS_ENUM.BSC]: "0x216b4b4ba9f3e719726886d34a177484278bfcae",
77
+ [CHAINS_ENUM.AVAX]: "0x216b4b4ba9f3e719726886d34a177484278bfcae",
78
+ },
79
+ [DEX_ENUM.ZEROXAPI]: {
80
+ [CHAINS_ENUM.ETH]: "0xdef1c0ded9bec7f1a1670819833240f027b25eff",
81
+ [CHAINS_ENUM.POLYGON]: "0xdef1c0ded9bec7f1a1670819833240f027b25eff",
82
+ [CHAINS_ENUM.BSC]: "0xdef1c0ded9bec7f1a1670819833240f027b25eff",
83
+ [CHAINS_ENUM.OP]: "0xdef1abe32c034e558cdd535791643c58a13acc10",
84
+ [CHAINS_ENUM.FTM]: "0xdef1c0ded9bec7f1a1670819833240f027b25eff",
85
+ [CHAINS_ENUM.CELO]: "0xdef1c0ded9bec7f1a1670819833240f027b25eff",
86
+ [CHAINS_ENUM.AVAX]: "0xdef1c0ded9bec7f1a1670819833240f027b25eff",
87
+ [CHAINS_ENUM.ARBITRUM]: "0xdef1c0ded9bec7f1a1670819833240f027b25eff",
88
+ },
89
+ };
@@ -1,4 +1,5 @@
1
1
  import { CHAINS_ENUM } from "@debank/common";
2
- import { QuoteParams, QuoteResult } from "../quote";
2
+ import { QuoteParams, QuoteResult, TxWithChainId, DecodeCalldataResult } from "../quote";
3
3
  export declare const SUPPORT_CHAINS: CHAINS_ENUM[];
4
4
  export declare const getQuote: (options: QuoteParams) => Promise<QuoteResult>;
5
+ export declare const decodeCalldata: (tx: TxWithChainId) => DecodeCalldataResult | null;
@@ -8,8 +8,11 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
8
8
  });
9
9
  };
10
10
  import axios from "axios";
11
+ import { Interface } from "@ethersproject/abi";
11
12
  import { CHAINS_ENUM, CHAINS } from "@debank/common";
12
- const NATIVE_TOKEN = 'ETH';
13
+ import { isSameAddress } from "../utils";
14
+ import { ZeroXABI } from "../abi";
15
+ const NATIVE_TOKEN = "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee";
13
16
  const API_DOMAINS = {
14
17
  [CHAINS_ENUM.ETH]: "https://api.0x.org",
15
18
  [CHAINS_ENUM.POLYGON]: "https://polygon.api.0x.org",
@@ -58,18 +61,22 @@ export const getQuote = (options) => __awaiter(void 0, void 0, void 0, function*
58
61
  return response;
59
62
  });
60
63
  const params = {
61
- sellToken: options.fromToken === CHAINS[options.chain].nativeTokenAddress ? NATIVE_TOKEN : options.fromToken,
62
- buyToken: options.toToken === CHAINS[options.chain].nativeTokenAddress ? NATIVE_TOKEN : options.toToken,
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,
63
70
  sellAmount: options.amount,
64
71
  takerAddress: options.userAddress,
65
72
  slippagePercentage: options.slippage / 100,
66
73
  skipValidation: true,
67
74
  };
68
75
  if (options.feeRate) {
69
- params.buyTokenPercentageFee = options.feeRate;
76
+ params.buyTokenPercentageFee = options.feeRate / 100;
70
77
  params.feeRecipient = options.feeAddress;
71
78
  }
72
- const { data } = yield request.get('/swap/v1/quote', {
79
+ const { data } = yield request.get("/swap/v1/quote", {
73
80
  params,
74
81
  });
75
82
  return {
@@ -79,10 +86,38 @@ export const getQuote = (options) => __awaiter(void 0, void 0, void 0, function*
79
86
  value: data.value,
80
87
  from: data.from,
81
88
  },
82
- fromToken: data.sellTokenAddress === NATIVE_TOKEN ? CHAINS[options.chain].nativeTokenAddress : data.sellTokenAddress,
89
+ fromToken: isSameAddress(data.sellTokenAddress, NATIVE_TOKEN)
90
+ ? CHAINS[options.chain].nativeTokenAddress
91
+ : data.sellTokenAddress,
83
92
  spender: data.allowanceTarget,
84
93
  fromTokenAmount: data.sellAmount,
85
- toToken: data.buyTokenAddress === NATIVE_TOKEN ? CHAINS[options.chain].nativeTokenAddress : data.buyTokenAddress,
86
- toTokenAmount: data.buyAmount
94
+ toToken: isSameAddress(data.buyTokenAddress, NATIVE_TOKEN)
95
+ ? CHAINS[options.chain].nativeTokenAddress
96
+ : data.buyTokenAddress,
97
+ toTokenAmount: data.buyAmount,
87
98
  };
88
99
  });
100
+ export const decodeCalldata = (tx) => {
101
+ const chain = Object.values(CHAINS).find((item) => item.id === tx.chainId);
102
+ if (!chain)
103
+ return null;
104
+ const contractInterface = new Interface(ZeroXABI);
105
+ const result = contractInterface.parseTransaction({ data: tx.data });
106
+ if (result.name !== "transformERC20") {
107
+ return null;
108
+ }
109
+ const [inputToken, outputToken, inputTokenAmount, minOutputTokenAmount] = result.args;
110
+ if (!inputToken || !outputToken || !inputTokenAmount || !minOutputTokenAmount)
111
+ return null;
112
+ return {
113
+ fromToken: isSameAddress(inputToken, NATIVE_TOKEN)
114
+ ? chain.nativeTokenAddress
115
+ : inputToken,
116
+ fromTokenAmount: inputTokenAmount.toString(),
117
+ toToken: isSameAddress(outputToken, NATIVE_TOKEN)
118
+ ? chain.nativeTokenAddress
119
+ : outputToken,
120
+ minReceiveToTokenAmount: minOutputTokenAmount.toString(),
121
+ toTokenReceiver: tx.from,
122
+ };
123
+ };
@@ -1,4 +1,5 @@
1
1
  import { CHAINS_ENUM } from "@debank/common";
2
- import { QuoteParams, QuoteResult } from "../quote";
2
+ import { QuoteParams, QuoteResult, TxWithChainId, DecodeCalldataResult } from "../quote";
3
3
  export declare const SUPPORT_CHAINS: CHAINS_ENUM[];
4
4
  export declare const getQuote: (options: QuoteParams) => Promise<QuoteResult>;
5
+ export declare const decodeCalldata: (tx: TxWithChainId) => DecodeCalldataResult | null;
@@ -9,7 +9,10 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
9
9
  };
10
10
  import axios from "axios";
11
11
  import { CHAINS_ENUM, CHAINS } from "@debank/common";
12
- const NATIVE_TOKEN = '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE';
12
+ import { Interface } from "@ethersproject/abi";
13
+ import { isSameAddress } from "../utils";
14
+ import { OneInchABI } from "../abi";
15
+ const NATIVE_TOKEN = "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE";
13
16
  const request = axios.create({
14
17
  baseURL: "https://api.1inch.io/v5.0",
15
18
  });
@@ -49,8 +52,12 @@ export const getQuote = (options) => __awaiter(void 0, void 0, void 0, function*
49
52
  throw new Error(`${CHAINS[options.chain]} is not support on 1inch`);
50
53
  }
51
54
  const params = {
52
- fromTokenAddress: options.fromToken === CHAINS[options.chain].nativeTokenAddress ? NATIVE_TOKEN : options.fromToken,
53
- toTokenAddress: options.toToken === CHAINS[options.chain].nativeTokenAddress ? NATIVE_TOKEN : options.toToken,
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,
54
61
  amount: options.amount,
55
62
  fromAddress: options.userAddress,
56
63
  slippage: options.slippage,
@@ -65,12 +72,41 @@ export const getQuote = (options) => __awaiter(void 0, void 0, void 0, function*
65
72
  });
66
73
  return {
67
74
  tx: data.tx,
68
- fromToken: data.fromToken.address === NATIVE_TOKEN ? CHAINS[options.chain].nativeTokenAddress : data.fromToken.address,
75
+ fromToken: data.fromToken.address === NATIVE_TOKEN
76
+ ? CHAINS[options.chain].nativeTokenAddress
77
+ : data.fromToken.address,
69
78
  fromTokenAmount: data.fromTokenAmount,
70
79
  fromTokenDecimals: data.fromToken.decimals,
71
- toToken: data.toToken.address === NATIVE_TOKEN ? CHAINS[options.chain].nativeTokenAddress : data.toToken.address,
80
+ toToken: data.toToken.address === NATIVE_TOKEN
81
+ ? CHAINS[options.chain].nativeTokenAddress
82
+ : data.toToken.address,
72
83
  toTokenAmount: data.toTokenAmount,
73
84
  toTokenDecimals: data.toToken.decimals,
74
85
  spender: data.tx.to,
75
86
  };
76
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
+ };
@@ -1,4 +1,5 @@
1
1
  import { CHAINS_ENUM } from "@debank/common";
2
- import { QuoteParams, QuoteResult } from "../quote";
2
+ import { QuoteParams, QuoteResult, TxWithChainId, DecodeCalldataResult } from "../quote";
3
3
  export declare const SUPPORT_CHAINS: CHAINS_ENUM[];
4
4
  export declare const getQuote: (options: QuoteParams) => Promise<QuoteResult>;
5
+ export declare const decodeCalldata: (tx: TxWithChainId) => DecodeCalldataResult | null;
@@ -8,7 +8,10 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
8
8
  });
9
9
  };
10
10
  import axios from "axios";
11
+ import { Interface } from "@ethersproject/abi";
11
12
  import { CHAINS_ENUM, CHAINS } from "@debank/common";
13
+ import { isSameAddress } from "../utils";
14
+ import { ParaSwapABI } from "../abi";
12
15
  const NATIVE_TOKEN = "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE";
13
16
  const request = axios.create({
14
17
  baseURL: "https://apiv5.paraswap.io",
@@ -51,17 +54,25 @@ export const getQuote = (options) => __awaiter(void 0, void 0, void 0, function*
51
54
  }
52
55
  const { priceRoute } = yield getPriceRoute({
53
56
  srcDecimals: options.fromTokenDecimals,
54
- srcToken: options.fromToken === CHAINS[options.chain].nativeTokenAddress ? NATIVE_TOKEN : options.fromToken,
55
- destToken: options.toToken === CHAINS[options.chain].nativeTokenAddress ? NATIVE_TOKEN : options.toToken,
57
+ srcToken: options.fromToken === CHAINS[options.chain].nativeTokenAddress
58
+ ? NATIVE_TOKEN
59
+ : options.fromToken,
60
+ destToken: options.toToken === CHAINS[options.chain].nativeTokenAddress
61
+ ? NATIVE_TOKEN
62
+ : options.toToken,
56
63
  amount: options.amount,
57
64
  userAddress: options.userAddress,
58
65
  network: chainId,
59
- includeContractMethods: 'simpleSwap,multiSwap,megaSwap',
66
+ includeContractMethods: "simpleSwap,multiSwap,megaSwap",
60
67
  });
61
68
  const params = {
62
- srcToken: options.fromToken === CHAINS[options.chain].nativeTokenAddress ? NATIVE_TOKEN : options.fromToken,
69
+ srcToken: options.fromToken === CHAINS[options.chain].nativeTokenAddress
70
+ ? NATIVE_TOKEN
71
+ : options.fromToken,
63
72
  srcDecimals: options.fromTokenDecimals,
64
- destToken: options.toToken === CHAINS[options.chain].nativeTokenAddress ? NATIVE_TOKEN : options.toToken,
73
+ destToken: options.toToken === CHAINS[options.chain].nativeTokenAddress
74
+ ? NATIVE_TOKEN
75
+ : options.toToken,
65
76
  srcAmount: options.amount,
66
77
  userAddress: options.userAddress,
67
78
  slippage: Math.floor(options.slippage * 100),
@@ -71,21 +82,91 @@ export const getQuote = (options) => __awaiter(void 0, void 0, void 0, function*
71
82
  params.partnerFeeBps = (options.feeRate * 100).toString();
72
83
  params.partnerAddress = options.feeAddress;
73
84
  }
74
- const { data } = yield request.get(`/transactions/${chainId}`, {
85
+ const { data } = yield request.post(`/transactions/${chainId}`, params, {
75
86
  params: {
76
87
  ignoreChecks: true,
77
88
  ignoreGasEstimate: true,
78
89
  },
79
- data: params,
80
90
  });
81
91
  return {
82
92
  tx: data,
83
- fromToken: priceRoute.srcToken === NATIVE_TOKEN ? CHAINS[options.chain].nativeTokenAddress : priceRoute.srcToken,
93
+ fromToken: priceRoute.srcToken === NATIVE_TOKEN
94
+ ? CHAINS[options.chain].nativeTokenAddress
95
+ : priceRoute.srcToken,
84
96
  fromTokenAmount: priceRoute.srcAmount,
85
97
  fromTokenDecimals: priceRoute.srcDecimals,
86
- toToken: priceRoute.destToken === NATIVE_TOKEN ? CHAINS[options.chain].nativeTokenAddress : priceRoute.destToken,
98
+ toToken: priceRoute.destToken === NATIVE_TOKEN
99
+ ? CHAINS[options.chain].nativeTokenAddress
100
+ : priceRoute.destToken,
87
101
  toTokenAmount: priceRoute.destAmount,
88
102
  toTokenDecimals: priceRoute.destDecimals,
89
103
  spender: data.to,
90
104
  };
91
105
  });
106
+ export const decodeCalldata = (tx) => {
107
+ const chain = Object.values(CHAINS).find((item) => item.id === tx.chainId);
108
+ const nullAddress = "0x0000000000000000000000000000000000000000";
109
+ if (!chain)
110
+ return null;
111
+ const contractInterface = new Interface(ParaSwapABI);
112
+ const result = contractInterface.parseTransaction({
113
+ data: tx.data,
114
+ });
115
+ switch (result.name) {
116
+ case "simpleSwap": {
117
+ const [data] = result.args;
118
+ const [fromToken, toToken, fromAmount, toAmount, expectedAmount, callees, exchangeData, startIndexes, values, beneficiary,] = data;
119
+ if (!fromToken || !toToken || !fromAmount || !toAmount)
120
+ return null;
121
+ return {
122
+ fromToken: isSameAddress(fromToken, NATIVE_TOKEN)
123
+ ? chain.nativeTokenAddress
124
+ : fromToken,
125
+ fromTokenAmount: fromAmount.toString(),
126
+ toToken: isSameAddress(toToken, NATIVE_TOKEN)
127
+ ? chain.nativeTokenAddress
128
+ : toToken,
129
+ minReceiveToTokenAmount: toAmount.toString(),
130
+ toTokenReceiver: beneficiary === nullAddress ? tx.from : beneficiary,
131
+ };
132
+ }
133
+ case "multiSwap": {
134
+ const [data] = result.args;
135
+ const [fromToken, fromAmount, toAmount, expectedAmount, beneficiary, path,] = data;
136
+ if (!fromToken || !fromAmount || !toAmount || !path || path.length <= 0)
137
+ return null;
138
+ const [toToken] = path[path.length - 1];
139
+ return {
140
+ fromToken: isSameAddress(fromToken, NATIVE_TOKEN)
141
+ ? chain.nativeTokenAddress
142
+ : fromToken,
143
+ fromTokenAmount: fromAmount.toString(),
144
+ toToken: isSameAddress(toToken, NATIVE_TOKEN)
145
+ ? chain.nativeTokenAddress
146
+ : toToken,
147
+ minReceiveToTokenAmount: toAmount.toString(),
148
+ toTokenReceiver: beneficiary === nullAddress ? tx.from : beneficiary,
149
+ };
150
+ }
151
+ case "megaSwap":
152
+ const [data] = result.args;
153
+ const [fromToken, fromAmount, toAmount, expectedAmount, beneficiary, path,] = data;
154
+ if (!fromToken || !fromAmount || !toAmount || !path || path.length <= 0)
155
+ return null;
156
+ const [fromAmountPercent, swapPath] = path[0];
157
+ const [toToken] = swapPath[swapPath.length - 1];
158
+ return {
159
+ fromToken: isSameAddress(fromToken, NATIVE_TOKEN)
160
+ ? chain.nativeTokenAddress
161
+ : fromToken,
162
+ fromTokenAmount: fromAmount.toString(),
163
+ toToken: isSameAddress(toToken, NATIVE_TOKEN)
164
+ ? chain.nativeTokenAddress
165
+ : toToken,
166
+ minReceiveToTokenAmount: toAmount.toString(),
167
+ toTokenReceiver: beneficiary === nullAddress ? tx.from : beneficiary,
168
+ };
169
+ default:
170
+ return null;
171
+ }
172
+ };
package/dist/index.d.ts CHANGED
@@ -1,3 +1,3 @@
1
- import { WrapTokenAddressMap, DEX_ENUM, DEX_SUPPORT_CHAINS } from './consts';
2
- import { getQuote } from './quote';
3
- export { WrapTokenAddressMap, DEX_ENUM, DEX_SUPPORT_CHAINS, getQuote };
1
+ import { WrapTokenAddressMap, DEX_ENUM, DEX_SUPPORT_CHAINS, DEX_ROUTER_WHITELIST, DEX_SPENDER_WHITELIST } from "./consts";
2
+ import { getQuote } from "./quote";
3
+ export { WrapTokenAddressMap, DEX_ENUM, DEX_SUPPORT_CHAINS, getQuote, DEX_ROUTER_WHITELIST, DEX_SPENDER_WHITELIST, };
package/dist/index.js CHANGED
@@ -1,3 +1,3 @@
1
- import { WrapTokenAddressMap, DEX_ENUM, DEX_SUPPORT_CHAINS } from './consts';
2
- import { getQuote } from './quote';
3
- export { WrapTokenAddressMap, DEX_ENUM, DEX_SUPPORT_CHAINS, getQuote };
1
+ import { WrapTokenAddressMap, DEX_ENUM, DEX_SUPPORT_CHAINS, DEX_ROUTER_WHITELIST, DEX_SPENDER_WHITELIST, } from "./consts";
2
+ import { getQuote } from "./quote";
3
+ export { WrapTokenAddressMap, DEX_ENUM, DEX_SUPPORT_CHAINS, getQuote, DEX_ROUTER_WHITELIST, DEX_SPENDER_WHITELIST, };
package/dist/quote.d.ts CHANGED
@@ -20,6 +20,9 @@ export interface Tx {
20
20
  gas?: number;
21
21
  gasPrice?: string;
22
22
  }
23
+ export interface TxWithChainId extends Tx {
24
+ chainId: number;
25
+ }
23
26
  export interface QuoteResult {
24
27
  tx: Tx;
25
28
  fromToken: string;
@@ -31,3 +34,11 @@ export interface QuoteResult {
31
34
  spender: string;
32
35
  }
33
36
  export declare const getQuote: (id: DEX_ENUM, params: QuoteParams) => Promise<QuoteResult>;
37
+ export interface DecodeCalldataResult {
38
+ fromToken: string;
39
+ fromTokenAmount: string;
40
+ toToken: string;
41
+ minReceiveToTokenAmount: string;
42
+ toTokenReceiver: string;
43
+ }
44
+ export declare const decodeCalldata: (id: DEX_ENUM, tx: TxWithChainId) => DecodeCalldataResult | null;
package/dist/quote.js CHANGED
@@ -9,9 +9,9 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
9
9
  };
10
10
  import { DEX_ENUM } from './consts';
11
11
  import { getQuote as wrapTokenGetQuote } from './dexs/wrapToken';
12
- import { getQuote as oneInchGetQuote } from './dexs/1inch';
13
- import { getQuote as zeroXGetQuote } from './dexs/0xapi';
14
- import { getQuote as paraSwapGetQuote } from './dexs/paraswap';
12
+ import { getQuote as oneInchGetQuote, decodeCalldata as oneInchDecodeCalldata } from './dexs/1inch';
13
+ import { getQuote as zeroXGetQuote, decodeCalldata as zeroXDecodeCalldata } from './dexs/0xapi';
14
+ import { getQuote as paraSwapGetQuote, decodeCalldata as paraSwapDecodeCalldata } from './dexs/paraswap';
15
15
  export const getQuote = (id, params) => __awaiter(void 0, void 0, void 0, function* () {
16
16
  switch (id) {
17
17
  case DEX_ENUM.WRAPTOKEN:
@@ -26,3 +26,15 @@ export const getQuote = (id, params) => __awaiter(void 0, void 0, void 0, functi
26
26
  throw new Error(`${id} is not supported!`);
27
27
  }
28
28
  });
29
+ export const decodeCalldata = (id, tx) => {
30
+ switch (id) {
31
+ case DEX_ENUM.ONEINCH:
32
+ return oneInchDecodeCalldata(tx);
33
+ case DEX_ENUM.PARASWAP:
34
+ return paraSwapDecodeCalldata(tx);
35
+ case DEX_ENUM.ZEROXAPI:
36
+ return zeroXDecodeCalldata(tx);
37
+ default:
38
+ throw new Error(`${id} is not supported!`);
39
+ }
40
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rabby-wallet/rabby-swap",
3
- "version": "0.0.2",
3
+ "version": "0.0.4",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "scripts": {
@@ -14,6 +14,7 @@
14
14
  },
15
15
  "dependencies": {
16
16
  "@debank/common": "^0.2.20",
17
+ "@ethersproject/abi": "^5.7.0",
17
18
  "axios": "^0.27.2",
18
19
  "web3-eth-abi": "^1.8.1"
19
20
  },