@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/__tests__/decodeCalldata.ts +279 -0
- package/dist/abi.d.ts +106 -0
- package/dist/abi.js +545 -0
- package/dist/consts.d.ts +61 -1
- package/dist/consts.js +74 -14
- package/dist/dexs/0xapi.d.ts +2 -1
- package/dist/dexs/0xapi.js +43 -8
- package/dist/dexs/1inch.d.ts +2 -1
- package/dist/dexs/1inch.js +41 -5
- package/dist/dexs/paraswap.d.ts +2 -1
- package/dist/dexs/paraswap.js +90 -9
- package/dist/index.d.ts +3 -3
- package/dist/index.js +3 -3
- package/dist/quote.d.ts +11 -0
- package/dist/quote.js +15 -3
- package/package.json +2 -1
- package/src/abi.ts +548 -0
- package/src/consts.ts +81 -20
- package/src/dexs/0xapi.ts +58 -9
- package/src/dexs/1inch.ts +65 -6
- package/src/dexs/paraswap.ts +132 -11
- package/src/dexs/wrapToken.ts +1 -1
- package/src/index.ts +15 -4
- package/src/quote.ts +29 -4
- package/svgTransform.js +11 -0
package/dist/consts.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { CHAINS_ENUM } from
|
|
2
|
-
import { SUPPORT_CHAINS as wrapTokenSupportChains } from
|
|
3
|
-
import { SUPPORT_CHAINS as zeroXSupportChains } from
|
|
4
|
-
import { SUPPORT_CHAINS as oneInchSupportChains } from
|
|
5
|
-
import { SUPPORT_CHAINS as paraswapSupportChains } from
|
|
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]:
|
|
15
|
-
[CHAINS_ENUM.BSC]:
|
|
16
|
-
[CHAINS_ENUM.POLYGON]:
|
|
17
|
-
[CHAINS_ENUM.OP]:
|
|
18
|
-
[CHAINS_ENUM.FTM]:
|
|
19
|
-
[CHAINS_ENUM.AVAX]:
|
|
20
|
-
[CHAINS_ENUM.ARBITRUM]:
|
|
21
|
-
[CHAINS_ENUM.KLAY]:
|
|
22
|
-
[CHAINS_ENUM.GNOSIS]:
|
|
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
|
+
};
|
package/dist/dexs/0xapi.d.ts
CHANGED
|
@@ -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;
|
package/dist/dexs/0xapi.js
CHANGED
|
@@ -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
|
-
|
|
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
|
|
62
|
-
|
|
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(
|
|
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
|
|
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
|
|
86
|
-
|
|
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
|
+
};
|
package/dist/dexs/1inch.d.ts
CHANGED
|
@@ -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;
|
package/dist/dexs/1inch.js
CHANGED
|
@@ -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
|
-
|
|
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
|
|
53
|
-
|
|
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
|
|
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
|
|
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
|
+
};
|
package/dist/dexs/paraswap.d.ts
CHANGED
|
@@ -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;
|
package/dist/dexs/paraswap.js
CHANGED
|
@@ -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
|
|
55
|
-
|
|
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:
|
|
66
|
+
includeContractMethods: "simpleSwap,multiSwap,megaSwap",
|
|
60
67
|
});
|
|
61
68
|
const params = {
|
|
62
|
-
srcToken: options.fromToken === CHAINS[options.chain].nativeTokenAddress
|
|
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
|
|
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.
|
|
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
|
|
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
|
|
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
|
|
2
|
-
import { getQuote } from
|
|
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
|
|
2
|
-
import { getQuote } from
|
|
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.
|
|
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
|
},
|