@swapkit/core 0.0.0-nightly-20240208140027

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/LICENSE +201 -0
  2. package/dist/index.cjs +3 -0
  3. package/dist/index.cjs.map +1 -0
  4. package/dist/index.d.ts +305 -0
  5. package/dist/index.es.js +9109 -0
  6. package/dist/index.es.js.map +1 -0
  7. package/package.json +60 -0
  8. package/src/aggregator/contracts/avaxGeneric.ts +92 -0
  9. package/src/aggregator/contracts/avaxWoofi.ts +145 -0
  10. package/src/aggregator/contracts/bscGeneric.ts +106 -0
  11. package/src/aggregator/contracts/ethGeneric.ts +92 -0
  12. package/src/aggregator/contracts/index.ts +76 -0
  13. package/src/aggregator/contracts/pancakeV2.ts +145 -0
  14. package/src/aggregator/contracts/pangolin.ts +120 -0
  15. package/src/aggregator/contracts/routers/index.ts +58 -0
  16. package/src/aggregator/contracts/routers/kyber.ts +402 -0
  17. package/src/aggregator/contracts/routers/oneinch.ts +2188 -0
  18. package/src/aggregator/contracts/routers/pancakeswap.ts +340 -0
  19. package/src/aggregator/contracts/routers/pangolin.ts +340 -0
  20. package/src/aggregator/contracts/routers/sushiswap.ts +340 -0
  21. package/src/aggregator/contracts/routers/traderJoe.ts +340 -0
  22. package/src/aggregator/contracts/routers/uniswapv2.ts +340 -0
  23. package/src/aggregator/contracts/routers/uniswapv3.ts +254 -0
  24. package/src/aggregator/contracts/routers/woofi.ts +171 -0
  25. package/src/aggregator/contracts/sushiswap.ts +120 -0
  26. package/src/aggregator/contracts/traderJoe.ts +120 -0
  27. package/src/aggregator/contracts/uniswapV2.ts +120 -0
  28. package/src/aggregator/contracts/uniswapV2Leg.ts +128 -0
  29. package/src/aggregator/contracts/uniswapV3_100.ts +128 -0
  30. package/src/aggregator/contracts/uniswapV3_10000.ts +128 -0
  31. package/src/aggregator/contracts/uniswapV3_3000.ts +128 -0
  32. package/src/aggregator/contracts/uniswapV3_500.ts +128 -0
  33. package/src/aggregator/getSwapParams.ts +70 -0
  34. package/src/client/__tests__/helpers.test.ts +77 -0
  35. package/src/client/explorerUrls.ts +61 -0
  36. package/src/client/index.ts +769 -0
  37. package/src/client/thornode.ts +31 -0
  38. package/src/client/types.ts +108 -0
  39. package/src/index.ts +4 -0
@@ -0,0 +1,128 @@
1
+ export const uniswapV3_100 = [
2
+ {
3
+ inputs: [
4
+ { internalType: 'address', name: '_ttp', type: 'address' },
5
+ { internalType: 'address', name: '_weth', type: 'address' },
6
+ { internalType: 'address', name: '_swapRouter', type: 'address' },
7
+ { internalType: 'uint24', name: '_poolFee', type: 'uint24' },
8
+ ],
9
+ stateMutability: 'nonpayable',
10
+ type: 'constructor',
11
+ },
12
+ {
13
+ anonymous: false,
14
+ inputs: [
15
+ { indexed: false, internalType: 'uint256', name: 'fee', type: 'uint256' },
16
+ { indexed: false, internalType: 'address', name: 'feeRecipient', type: 'address' },
17
+ ],
18
+ name: 'FeeSet',
19
+ type: 'event',
20
+ },
21
+ {
22
+ anonymous: false,
23
+ inputs: [
24
+ { indexed: true, internalType: 'address', name: 'owner', type: 'address' },
25
+ { indexed: false, internalType: 'bool', name: 'active', type: 'bool' },
26
+ ],
27
+ name: 'OwnerSet',
28
+ type: 'event',
29
+ },
30
+ {
31
+ inputs: [],
32
+ name: 'fee',
33
+ outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],
34
+ stateMutability: 'view',
35
+ type: 'function',
36
+ },
37
+ {
38
+ inputs: [],
39
+ name: 'feeRecipient',
40
+ outputs: [{ internalType: 'address', name: '', type: 'address' }],
41
+ stateMutability: 'view',
42
+ type: 'function',
43
+ },
44
+ {
45
+ inputs: [{ internalType: 'address', name: '', type: 'address' }],
46
+ name: 'owners',
47
+ outputs: [{ internalType: 'bool', name: '', type: 'bool' }],
48
+ stateMutability: 'view',
49
+ type: 'function',
50
+ },
51
+ {
52
+ inputs: [],
53
+ name: 'poolFee',
54
+ outputs: [{ internalType: 'uint24', name: '', type: 'uint24' }],
55
+ stateMutability: 'view',
56
+ type: 'function',
57
+ },
58
+ {
59
+ inputs: [
60
+ { internalType: 'uint256', name: '_fee', type: 'uint256' },
61
+ { internalType: 'address', name: '_feeRecipient', type: 'address' },
62
+ ],
63
+ name: 'setFee',
64
+ outputs: [],
65
+ stateMutability: 'nonpayable',
66
+ type: 'function',
67
+ },
68
+ {
69
+ inputs: [
70
+ { internalType: 'address', name: 'owner', type: 'address' },
71
+ { internalType: 'bool', name: 'active', type: 'bool' },
72
+ ],
73
+ name: 'setOwner',
74
+ outputs: [],
75
+ stateMutability: 'nonpayable',
76
+ type: 'function',
77
+ },
78
+ {
79
+ inputs: [
80
+ { internalType: 'address', name: 'tcRouter', type: 'address' },
81
+ { internalType: 'address', name: 'tcVault', type: 'address' },
82
+ { internalType: 'string', name: 'tcMemo', type: 'string' },
83
+ { internalType: 'address', name: 'token', type: 'address' },
84
+ { internalType: 'uint256', name: 'amount', type: 'uint256' },
85
+ { internalType: 'uint256', name: 'amountOutMin', type: 'uint256' },
86
+ { internalType: 'uint256', name: 'deadline', type: 'uint256' },
87
+ ],
88
+ name: 'swapIn',
89
+ outputs: [],
90
+ stateMutability: 'nonpayable',
91
+ type: 'function',
92
+ },
93
+ {
94
+ inputs: [
95
+ { internalType: 'address', name: 'token', type: 'address' },
96
+ { internalType: 'address', name: 'to', type: 'address' },
97
+ { internalType: 'uint256', name: 'amountOutMin', type: 'uint256' },
98
+ ],
99
+ name: 'swapOut',
100
+ outputs: [],
101
+ stateMutability: 'payable',
102
+ type: 'function',
103
+ },
104
+ {
105
+ inputs: [],
106
+ name: 'swapRouter',
107
+ outputs: [{ internalType: 'contract IUniswapRouterV3', name: '', type: 'address' }],
108
+ stateMutability: 'view',
109
+ type: 'function',
110
+ },
111
+ {
112
+ inputs: [],
113
+ name: 'tokenTransferProxy',
114
+ outputs: [
115
+ { internalType: 'contract TSAggregatorTokenTransferProxy', name: '', type: 'address' },
116
+ ],
117
+ stateMutability: 'view',
118
+ type: 'function',
119
+ },
120
+ {
121
+ inputs: [],
122
+ name: 'weth',
123
+ outputs: [{ internalType: 'contract IWETH9', name: '', type: 'address' }],
124
+ stateMutability: 'view',
125
+ type: 'function',
126
+ },
127
+ { stateMutability: 'payable', type: 'receive' },
128
+ ];
@@ -0,0 +1,128 @@
1
+ export const uniswapV3_10000 = [
2
+ {
3
+ inputs: [
4
+ { internalType: 'address', name: '_ttp', type: 'address' },
5
+ { internalType: 'address', name: '_weth', type: 'address' },
6
+ { internalType: 'address', name: '_swapRouter', type: 'address' },
7
+ { internalType: 'uint24', name: '_poolFee', type: 'uint24' },
8
+ ],
9
+ stateMutability: 'nonpayable',
10
+ type: 'constructor',
11
+ },
12
+ {
13
+ anonymous: false,
14
+ inputs: [
15
+ { indexed: false, internalType: 'uint256', name: 'fee', type: 'uint256' },
16
+ { indexed: false, internalType: 'address', name: 'feeRecipient', type: 'address' },
17
+ ],
18
+ name: 'FeeSet',
19
+ type: 'event',
20
+ },
21
+ {
22
+ anonymous: false,
23
+ inputs: [
24
+ { indexed: true, internalType: 'address', name: 'owner', type: 'address' },
25
+ { indexed: false, internalType: 'bool', name: 'active', type: 'bool' },
26
+ ],
27
+ name: 'OwnerSet',
28
+ type: 'event',
29
+ },
30
+ {
31
+ inputs: [],
32
+ name: 'fee',
33
+ outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],
34
+ stateMutability: 'view',
35
+ type: 'function',
36
+ },
37
+ {
38
+ inputs: [],
39
+ name: 'feeRecipient',
40
+ outputs: [{ internalType: 'address', name: '', type: 'address' }],
41
+ stateMutability: 'view',
42
+ type: 'function',
43
+ },
44
+ {
45
+ inputs: [{ internalType: 'address', name: '', type: 'address' }],
46
+ name: 'owners',
47
+ outputs: [{ internalType: 'bool', name: '', type: 'bool' }],
48
+ stateMutability: 'view',
49
+ type: 'function',
50
+ },
51
+ {
52
+ inputs: [],
53
+ name: 'poolFee',
54
+ outputs: [{ internalType: 'uint24', name: '', type: 'uint24' }],
55
+ stateMutability: 'view',
56
+ type: 'function',
57
+ },
58
+ {
59
+ inputs: [
60
+ { internalType: 'uint256', name: '_fee', type: 'uint256' },
61
+ { internalType: 'address', name: '_feeRecipient', type: 'address' },
62
+ ],
63
+ name: 'setFee',
64
+ outputs: [],
65
+ stateMutability: 'nonpayable',
66
+ type: 'function',
67
+ },
68
+ {
69
+ inputs: [
70
+ { internalType: 'address', name: 'owner', type: 'address' },
71
+ { internalType: 'bool', name: 'active', type: 'bool' },
72
+ ],
73
+ name: 'setOwner',
74
+ outputs: [],
75
+ stateMutability: 'nonpayable',
76
+ type: 'function',
77
+ },
78
+ {
79
+ inputs: [
80
+ { internalType: 'address', name: 'tcRouter', type: 'address' },
81
+ { internalType: 'address', name: 'tcVault', type: 'address' },
82
+ { internalType: 'string', name: 'tcMemo', type: 'string' },
83
+ { internalType: 'address', name: 'token', type: 'address' },
84
+ { internalType: 'uint256', name: 'amount', type: 'uint256' },
85
+ { internalType: 'uint256', name: 'amountOutMin', type: 'uint256' },
86
+ { internalType: 'uint256', name: 'deadline', type: 'uint256' },
87
+ ],
88
+ name: 'swapIn',
89
+ outputs: [],
90
+ stateMutability: 'nonpayable',
91
+ type: 'function',
92
+ },
93
+ {
94
+ inputs: [
95
+ { internalType: 'address', name: 'token', type: 'address' },
96
+ { internalType: 'address', name: 'to', type: 'address' },
97
+ { internalType: 'uint256', name: 'amountOutMin', type: 'uint256' },
98
+ ],
99
+ name: 'swapOut',
100
+ outputs: [],
101
+ stateMutability: 'payable',
102
+ type: 'function',
103
+ },
104
+ {
105
+ inputs: [],
106
+ name: 'swapRouter',
107
+ outputs: [{ internalType: 'contract IUniswapRouterV3', name: '', type: 'address' }],
108
+ stateMutability: 'view',
109
+ type: 'function',
110
+ },
111
+ {
112
+ inputs: [],
113
+ name: 'tokenTransferProxy',
114
+ outputs: [
115
+ { internalType: 'contract TSAggregatorTokenTransferProxy', name: '', type: 'address' },
116
+ ],
117
+ stateMutability: 'view',
118
+ type: 'function',
119
+ },
120
+ {
121
+ inputs: [],
122
+ name: 'weth',
123
+ outputs: [{ internalType: 'contract IWETH9', name: '', type: 'address' }],
124
+ stateMutability: 'view',
125
+ type: 'function',
126
+ },
127
+ { stateMutability: 'payable', type: 'receive' },
128
+ ];
@@ -0,0 +1,128 @@
1
+ export const uniswapV3_3000 = [
2
+ {
3
+ inputs: [
4
+ { internalType: 'address', name: '_ttp', type: 'address' },
5
+ { internalType: 'address', name: '_weth', type: 'address' },
6
+ { internalType: 'address', name: '_swapRouter', type: 'address' },
7
+ { internalType: 'uint24', name: '_poolFee', type: 'uint24' },
8
+ ],
9
+ stateMutability: 'nonpayable',
10
+ type: 'constructor',
11
+ },
12
+ {
13
+ anonymous: false,
14
+ inputs: [
15
+ { indexed: false, internalType: 'uint256', name: 'fee', type: 'uint256' },
16
+ { indexed: false, internalType: 'address', name: 'feeRecipient', type: 'address' },
17
+ ],
18
+ name: 'FeeSet',
19
+ type: 'event',
20
+ },
21
+ {
22
+ anonymous: false,
23
+ inputs: [
24
+ { indexed: true, internalType: 'address', name: 'owner', type: 'address' },
25
+ { indexed: false, internalType: 'bool', name: 'active', type: 'bool' },
26
+ ],
27
+ name: 'OwnerSet',
28
+ type: 'event',
29
+ },
30
+ {
31
+ inputs: [],
32
+ name: 'fee',
33
+ outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],
34
+ stateMutability: 'view',
35
+ type: 'function',
36
+ },
37
+ {
38
+ inputs: [],
39
+ name: 'feeRecipient',
40
+ outputs: [{ internalType: 'address', name: '', type: 'address' }],
41
+ stateMutability: 'view',
42
+ type: 'function',
43
+ },
44
+ {
45
+ inputs: [{ internalType: 'address', name: '', type: 'address' }],
46
+ name: 'owners',
47
+ outputs: [{ internalType: 'bool', name: '', type: 'bool' }],
48
+ stateMutability: 'view',
49
+ type: 'function',
50
+ },
51
+ {
52
+ inputs: [],
53
+ name: 'poolFee',
54
+ outputs: [{ internalType: 'uint24', name: '', type: 'uint24' }],
55
+ stateMutability: 'view',
56
+ type: 'function',
57
+ },
58
+ {
59
+ inputs: [
60
+ { internalType: 'uint256', name: '_fee', type: 'uint256' },
61
+ { internalType: 'address', name: '_feeRecipient', type: 'address' },
62
+ ],
63
+ name: 'setFee',
64
+ outputs: [],
65
+ stateMutability: 'nonpayable',
66
+ type: 'function',
67
+ },
68
+ {
69
+ inputs: [
70
+ { internalType: 'address', name: 'owner', type: 'address' },
71
+ { internalType: 'bool', name: 'active', type: 'bool' },
72
+ ],
73
+ name: 'setOwner',
74
+ outputs: [],
75
+ stateMutability: 'nonpayable',
76
+ type: 'function',
77
+ },
78
+ {
79
+ inputs: [
80
+ { internalType: 'address', name: 'tcRouter', type: 'address' },
81
+ { internalType: 'address', name: 'tcVault', type: 'address' },
82
+ { internalType: 'string', name: 'tcMemo', type: 'string' },
83
+ { internalType: 'address', name: 'token', type: 'address' },
84
+ { internalType: 'uint256', name: 'amount', type: 'uint256' },
85
+ { internalType: 'uint256', name: 'amountOutMin', type: 'uint256' },
86
+ { internalType: 'uint256', name: 'deadline', type: 'uint256' },
87
+ ],
88
+ name: 'swapIn',
89
+ outputs: [],
90
+ stateMutability: 'nonpayable',
91
+ type: 'function',
92
+ },
93
+ {
94
+ inputs: [
95
+ { internalType: 'address', name: 'token', type: 'address' },
96
+ { internalType: 'address', name: 'to', type: 'address' },
97
+ { internalType: 'uint256', name: 'amountOutMin', type: 'uint256' },
98
+ ],
99
+ name: 'swapOut',
100
+ outputs: [],
101
+ stateMutability: 'payable',
102
+ type: 'function',
103
+ },
104
+ {
105
+ inputs: [],
106
+ name: 'swapRouter',
107
+ outputs: [{ internalType: 'contract IUniswapRouterV3', name: '', type: 'address' }],
108
+ stateMutability: 'view',
109
+ type: 'function',
110
+ },
111
+ {
112
+ inputs: [],
113
+ name: 'tokenTransferProxy',
114
+ outputs: [
115
+ { internalType: 'contract TSAggregatorTokenTransferProxy', name: '', type: 'address' },
116
+ ],
117
+ stateMutability: 'view',
118
+ type: 'function',
119
+ },
120
+ {
121
+ inputs: [],
122
+ name: 'weth',
123
+ outputs: [{ internalType: 'contract IWETH9', name: '', type: 'address' }],
124
+ stateMutability: 'view',
125
+ type: 'function',
126
+ },
127
+ { stateMutability: 'payable', type: 'receive' },
128
+ ];
@@ -0,0 +1,128 @@
1
+ export const uniswapV3_500 = [
2
+ {
3
+ inputs: [
4
+ { internalType: 'address', name: '_ttp', type: 'address' },
5
+ { internalType: 'address', name: '_weth', type: 'address' },
6
+ { internalType: 'address', name: '_swapRouter', type: 'address' },
7
+ { internalType: 'uint24', name: '_poolFee', type: 'uint24' },
8
+ ],
9
+ stateMutability: 'nonpayable',
10
+ type: 'constructor',
11
+ },
12
+ {
13
+ anonymous: false,
14
+ inputs: [
15
+ { indexed: false, internalType: 'uint256', name: 'fee', type: 'uint256' },
16
+ { indexed: false, internalType: 'address', name: 'feeRecipient', type: 'address' },
17
+ ],
18
+ name: 'FeeSet',
19
+ type: 'event',
20
+ },
21
+ {
22
+ anonymous: false,
23
+ inputs: [
24
+ { indexed: true, internalType: 'address', name: 'owner', type: 'address' },
25
+ { indexed: false, internalType: 'bool', name: 'active', type: 'bool' },
26
+ ],
27
+ name: 'OwnerSet',
28
+ type: 'event',
29
+ },
30
+ {
31
+ inputs: [],
32
+ name: 'fee',
33
+ outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],
34
+ stateMutability: 'view',
35
+ type: 'function',
36
+ },
37
+ {
38
+ inputs: [],
39
+ name: 'feeRecipient',
40
+ outputs: [{ internalType: 'address', name: '', type: 'address' }],
41
+ stateMutability: 'view',
42
+ type: 'function',
43
+ },
44
+ {
45
+ inputs: [{ internalType: 'address', name: '', type: 'address' }],
46
+ name: 'owners',
47
+ outputs: [{ internalType: 'bool', name: '', type: 'bool' }],
48
+ stateMutability: 'view',
49
+ type: 'function',
50
+ },
51
+ {
52
+ inputs: [],
53
+ name: 'poolFee',
54
+ outputs: [{ internalType: 'uint24', name: '', type: 'uint24' }],
55
+ stateMutability: 'view',
56
+ type: 'function',
57
+ },
58
+ {
59
+ inputs: [
60
+ { internalType: 'uint256', name: '_fee', type: 'uint256' },
61
+ { internalType: 'address', name: '_feeRecipient', type: 'address' },
62
+ ],
63
+ name: 'setFee',
64
+ outputs: [],
65
+ stateMutability: 'nonpayable',
66
+ type: 'function',
67
+ },
68
+ {
69
+ inputs: [
70
+ { internalType: 'address', name: 'owner', type: 'address' },
71
+ { internalType: 'bool', name: 'active', type: 'bool' },
72
+ ],
73
+ name: 'setOwner',
74
+ outputs: [],
75
+ stateMutability: 'nonpayable',
76
+ type: 'function',
77
+ },
78
+ {
79
+ inputs: [
80
+ { internalType: 'address', name: 'tcRouter', type: 'address' },
81
+ { internalType: 'address', name: 'tcVault', type: 'address' },
82
+ { internalType: 'string', name: 'tcMemo', type: 'string' },
83
+ { internalType: 'address', name: 'token', type: 'address' },
84
+ { internalType: 'uint256', name: 'amount', type: 'uint256' },
85
+ { internalType: 'uint256', name: 'amountOutMin', type: 'uint256' },
86
+ { internalType: 'uint256', name: 'deadline', type: 'uint256' },
87
+ ],
88
+ name: 'swapIn',
89
+ outputs: [],
90
+ stateMutability: 'nonpayable',
91
+ type: 'function',
92
+ },
93
+ {
94
+ inputs: [
95
+ { internalType: 'address', name: 'token', type: 'address' },
96
+ { internalType: 'address', name: 'to', type: 'address' },
97
+ { internalType: 'uint256', name: 'amountOutMin', type: 'uint256' },
98
+ ],
99
+ name: 'swapOut',
100
+ outputs: [],
101
+ stateMutability: 'payable',
102
+ type: 'function',
103
+ },
104
+ {
105
+ inputs: [],
106
+ name: 'swapRouter',
107
+ outputs: [{ internalType: 'contract IUniswapRouterV3', name: '', type: 'address' }],
108
+ stateMutability: 'view',
109
+ type: 'function',
110
+ },
111
+ {
112
+ inputs: [],
113
+ name: 'tokenTransferProxy',
114
+ outputs: [
115
+ { internalType: 'contract TSAggregatorTokenTransferProxy', name: '', type: 'address' },
116
+ ],
117
+ stateMutability: 'view',
118
+ type: 'function',
119
+ },
120
+ {
121
+ inputs: [],
122
+ name: 'weth',
123
+ outputs: [{ internalType: 'contract IWETH9', name: '', type: 'address' }],
124
+ stateMutability: 'view',
125
+ type: 'function',
126
+ },
127
+ { stateMutability: 'payable', type: 'receive' },
128
+ ];
@@ -0,0 +1,70 @@
1
+ import type { QuoteRoute } from '@swapkit/helpers';
2
+
3
+ import type { AGG_CONTRACT_ADDRESS } from './contracts/index.ts';
4
+ import { lowercasedGenericAbiMappings } from './contracts/index.ts';
5
+
6
+ type SwapInParams = {
7
+ calldata: QuoteRoute['calldata'];
8
+ recipient: string;
9
+ streamSwap?: boolean;
10
+ contractAddress: AGG_CONTRACT_ADDRESS;
11
+ toChecksumAddress: (address: string) => string;
12
+ };
13
+
14
+ export const getSwapInParams = ({
15
+ streamSwap,
16
+ contractAddress,
17
+ recipient,
18
+ toChecksumAddress,
19
+ calldata: {
20
+ amount,
21
+ amountOutMin = '',
22
+ data = '',
23
+ deadline,
24
+ memo,
25
+ router,
26
+ memoStreamingSwap,
27
+ tcMemo,
28
+ tcRouter,
29
+ tcVault,
30
+ vault,
31
+ token,
32
+ },
33
+ }: SwapInParams) => {
34
+ const isGeneric = !!lowercasedGenericAbiMappings[contractAddress.toLowerCase()];
35
+
36
+ if (isGeneric && !router) {
37
+ throw new Error('Router is required on calldata for swapIn with GenericContract');
38
+ }
39
+
40
+ /**
41
+ * Data structure for contract calls
42
+ * GENERIC: tcRouter, tcVault, tcMemo, token, amount, router, data, deadline
43
+ * ETH_UNISWAP: tcRouter, tcVault, tcMemo, token, amount, amountOutMin, deadline
44
+ * AVAX_PANGOLIN: tcRouter, tcVault, tcMemo, token, amount, amountOutMin, deadline
45
+ * AVAX_WOOFI: router, vault, memo, token, amount, amountOutMin, deadline
46
+ */
47
+
48
+ const baseMemo = tcMemo || memo;
49
+ const transactionMemo = streamSwap ? memoStreamingSwap || baseMemo : baseMemo;
50
+
51
+ if (!tcVault && !vault) throw new Error('TC Vault is required on calldata');
52
+ if (!tcRouter && !router) throw new Error('TC Router is required on calldata');
53
+ if (!transactionMemo) throw new Error('TC Memo is required on calldata');
54
+ if (!token) throw new Error('Token is required on calldata');
55
+
56
+ const baseParams = [
57
+ // v2 contracts don't have tcVault, tcRouter, tcMemo but vault, router, memo
58
+ toChecksumAddress((tcRouter || router) as string),
59
+ toChecksumAddress((tcVault || vault) as string),
60
+ transactionMemo.replace('{recipientAddress}', recipient),
61
+ toChecksumAddress(token),
62
+ amount,
63
+ ];
64
+
65
+ const contractParams = isGeneric
66
+ ? [toChecksumAddress(router as string), data, deadline]
67
+ : [amountOutMin, deadline];
68
+
69
+ return [...baseParams, ...contractParams];
70
+ };
@@ -0,0 +1,77 @@
1
+ import { Chain, ChainToExplorerUrl } from '@swapkit/types';
2
+ import { describe, expect, test } from 'vitest';
3
+
4
+ import { getExplorerAddressUrl, getExplorerTxUrl } from '../explorerUrls.ts';
5
+
6
+ describe('Explorer URLs', () => {
7
+ [Chain.Binance, Chain.Maya, Chain.Kujira, Chain.THORChain].forEach((chain) => {
8
+ test(`getExplorerTxUrl returns correct URL for ${chain}`, () => {
9
+ expect(getExplorerTxUrl({ chain, txHash: '0x123456789' })).toBe(
10
+ `${ChainToExplorerUrl[chain]}/tx/123456789`,
11
+ );
12
+
13
+ expect(getExplorerAddressUrl({ chain, address: 'asdfg' })).toBe(
14
+ `${ChainToExplorerUrl[chain]}/address/asdfg`,
15
+ );
16
+ });
17
+ });
18
+
19
+ [
20
+ Chain.Arbitrum,
21
+ Chain.Avalanche,
22
+ Chain.BinanceSmartChain,
23
+ Chain.Ethereum,
24
+ Chain.Optimism,
25
+ Chain.Polygon,
26
+ ].forEach((chain) => {
27
+ test(`getExplorerTxUrl returns correct URL for ${chain}`, () => {
28
+ expect(getExplorerTxUrl({ chain, txHash: '0x123456789' })).toBe(
29
+ `${ChainToExplorerUrl[chain]}/tx/0x123456789`,
30
+ );
31
+
32
+ expect(getExplorerAddressUrl({ chain, address: 'asdfg' })).toBe(
33
+ `${ChainToExplorerUrl[chain]}/address/asdfg`,
34
+ );
35
+ });
36
+ });
37
+
38
+ [Chain.Bitcoin, Chain.BitcoinCash, Chain.Dogecoin, Chain.Litecoin].forEach((chain) => {
39
+ test(`getExplorerTxUrl returns correct URL for ${chain}`, () => {
40
+ expect(getExplorerTxUrl({ chain, txHash: '0x123456789' })).toBe(
41
+ `${ChainToExplorerUrl[chain]}/transaction/0x123456789`,
42
+ );
43
+
44
+ expect(getExplorerAddressUrl({ chain, address: 'asdfg' })).toBe(
45
+ `${ChainToExplorerUrl[chain]}/address/asdfg`,
46
+ );
47
+ });
48
+ });
49
+
50
+ test('getExplorerTxUrl throws Error for unsupported Chain', () => {
51
+ expect(() =>
52
+ getExplorerTxUrl({ chain: 'unsupported' as Chain, txHash: '0x12345' }),
53
+ ).toThrowError('Unsupported chain: unsupported');
54
+ });
55
+
56
+ test('getExplorerAddressUrl throws Error for unsupported Chain', () => {
57
+ expect(() =>
58
+ getExplorerAddressUrl({ chain: 'unsupported' as Chain, address: 'asdfg' }),
59
+ ).toThrowError('Unsupported chain: unsupported');
60
+ });
61
+ test('getExplorerTxUrl adds 0x for EVM like chains', () => {
62
+ expect(getExplorerTxUrl({ chain: Chain.Ethereum, txHash: '12345' })).toBe(
63
+ 'https://etherscan.io/tx/0x12345',
64
+ );
65
+ });
66
+
67
+ test('getExplorerTxUrl returns correct URL for Cosmos', () => {
68
+ expect(getExplorerTxUrl({ chain: Chain.Cosmos, txHash: 'pqrst' })).toBe(
69
+ 'https://cosmos.bigdipper.live/transactions/pqrst',
70
+ );
71
+ });
72
+ test('getExplorerAddressUrl returns correct URL for Cosmos', () => {
73
+ expect(getExplorerAddressUrl({ chain: Chain.Cosmos, address: 'zabcd' })).toBe(
74
+ 'https://cosmos.bigdipper.live/account/zabcd',
75
+ );
76
+ });
77
+ });