@swapkit/toolboxes 4.2.1 → 4.3.3

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 (134) hide show
  1. package/dist/src/cardano/index.cjs +2 -2
  2. package/dist/src/cardano/index.cjs.map +3 -3
  3. package/dist/src/cardano/index.js +2 -2
  4. package/dist/src/cardano/index.js.map +3 -3
  5. package/dist/src/evm/index.cjs +2 -2
  6. package/dist/src/evm/index.cjs.map +8 -8
  7. package/dist/src/evm/index.js +2 -2
  8. package/dist/src/evm/index.js.map +8 -8
  9. package/dist/src/index.cjs +3 -3
  10. package/dist/src/index.cjs.map +15 -15
  11. package/dist/src/index.js +3 -3
  12. package/dist/src/index.js.map +15 -15
  13. package/dist/src/substrate/index.cjs +2 -2
  14. package/dist/src/substrate/index.cjs.map +3 -3
  15. package/dist/src/substrate/index.js +2 -2
  16. package/dist/src/substrate/index.js.map +3 -3
  17. package/dist/src/tron/index.cjs +2 -2
  18. package/dist/src/tron/index.cjs.map +3 -3
  19. package/dist/src/tron/index.js +2 -2
  20. package/dist/src/tron/index.js.map +3 -3
  21. package/dist/src/utxo/index.cjs +3 -3
  22. package/dist/src/utxo/index.cjs.map +6 -6
  23. package/dist/src/utxo/index.js +3 -3
  24. package/dist/src/utxo/index.js.map +6 -6
  25. package/dist/types/cardano/toolbox.d.ts +1 -1
  26. package/dist/types/cardano/toolbox.d.ts.map +1 -1
  27. package/dist/types/evm/api.d.ts +1 -1
  28. package/dist/types/evm/api.d.ts.map +1 -1
  29. package/dist/types/evm/helpers.d.ts.map +1 -1
  30. package/dist/types/evm/toolbox/baseEVMToolbox.d.ts +1 -1
  31. package/dist/types/evm/toolbox/baseEVMToolbox.d.ts.map +1 -1
  32. package/dist/types/evm/toolbox/evm.d.ts +97 -17
  33. package/dist/types/evm/toolbox/evm.d.ts.map +1 -1
  34. package/dist/types/evm/toolbox/index.d.ts.map +1 -1
  35. package/dist/types/evm/toolbox/op.d.ts +1 -1
  36. package/dist/types/evm/toolbox/op.d.ts.map +1 -1
  37. package/dist/types/evm/types.d.ts +4 -2
  38. package/dist/types/evm/types.d.ts.map +1 -1
  39. package/dist/types/substrate/balance.d.ts.map +1 -1
  40. package/dist/types/tron/toolbox.d.ts.map +1 -1
  41. package/dist/types/utxo/helpers/api.d.ts +2 -34
  42. package/dist/types/utxo/helpers/api.d.ts.map +1 -1
  43. package/dist/types/utxo/toolbox/bitcoinCash.d.ts +1 -1
  44. package/dist/types/utxo/toolbox/bitcoinCash.d.ts.map +1 -1
  45. package/dist/types/utxo/toolbox/index.d.ts +3 -27
  46. package/dist/types/utxo/toolbox/index.d.ts.map +1 -1
  47. package/dist/types/utxo/toolbox/params.d.ts +32 -0
  48. package/dist/types/utxo/toolbox/params.d.ts.map +1 -0
  49. package/dist/types/utxo/toolbox/utxo.d.ts +1 -1
  50. package/dist/types/utxo/toolbox/utxo.d.ts.map +1 -1
  51. package/dist/types/utxo/toolbox/zcash.d.ts.map +1 -1
  52. package/package.json +86 -58
  53. package/src/__tests__/address-validation-all-chains.test.ts +162 -0
  54. package/src/__tests__/addressValidator.test.ts +162 -0
  55. package/src/cardano/__tests__/toolbox.test.ts +48 -0
  56. package/src/cardano/index.ts +2 -0
  57. package/src/cardano/toolbox.ts +168 -0
  58. package/src/cardano/types.ts +10 -0
  59. package/src/cosmos/__tests__/toolbox.test.ts +91 -0
  60. package/src/cosmos/index.ts +4 -0
  61. package/src/cosmos/thorchainUtils/addressFormat.ts +22 -0
  62. package/src/cosmos/thorchainUtils/index.ts +4 -0
  63. package/src/cosmos/thorchainUtils/messages.ts +212 -0
  64. package/src/cosmos/thorchainUtils/registry.ts +43 -0
  65. package/src/cosmos/thorchainUtils/types/MsgCompiled.ts +2800 -0
  66. package/src/cosmos/thorchainUtils/types/client-types.ts +54 -0
  67. package/src/cosmos/thorchainUtils/types/index.ts +1 -0
  68. package/src/cosmos/toolbox/cosmos.ts +345 -0
  69. package/src/cosmos/toolbox/index.ts +35 -0
  70. package/src/cosmos/toolbox/thorchain.ts +249 -0
  71. package/src/cosmos/types.ts +48 -0
  72. package/src/cosmos/util.ts +214 -0
  73. package/src/evm/__tests__/address-validation.test.ts +84 -0
  74. package/src/evm/__tests__/ethereum.test.ts +137 -0
  75. package/src/evm/__tests__/signMessage.test.ts +60 -0
  76. package/src/evm/api.ts +10 -0
  77. package/src/evm/contracts/eth/multicall.ts +165 -0
  78. package/src/evm/contracts/op/gasOracle.ts +145 -0
  79. package/src/evm/helpers.ts +73 -0
  80. package/src/evm/index.ts +4 -0
  81. package/src/evm/toolbox/baseEVMToolbox.ts +695 -0
  82. package/src/evm/toolbox/evm.ts +67 -0
  83. package/src/evm/toolbox/index.ts +44 -0
  84. package/src/evm/toolbox/op.ts +163 -0
  85. package/src/evm/types.ts +146 -0
  86. package/src/index.ts +260 -0
  87. package/src/near/__tests__/core.test.ts +70 -0
  88. package/src/near/helpers/core.ts +85 -0
  89. package/src/near/helpers/gasEstimation.ts +96 -0
  90. package/src/near/helpers/nep141.ts +50 -0
  91. package/src/near/index.ts +21 -0
  92. package/src/near/toolbox.ts +421 -0
  93. package/src/near/types/contract.ts +32 -0
  94. package/src/near/types/nep141.ts +34 -0
  95. package/src/near/types/toolbox.ts +55 -0
  96. package/src/near/types.ts +44 -0
  97. package/src/radix/index.ts +132 -0
  98. package/src/ripple/index.ts +179 -0
  99. package/src/solana/index.ts +36 -0
  100. package/src/solana/toolbox.ts +415 -0
  101. package/src/substrate/balance.ts +88 -0
  102. package/src/substrate/index.ts +2 -0
  103. package/src/substrate/substrate.ts +281 -0
  104. package/src/substrate/types.ts +115 -0
  105. package/src/sui/__tests__/toolbox.test.ts +82 -0
  106. package/src/sui/index.ts +2 -0
  107. package/src/sui/toolbox.ts +165 -0
  108. package/src/sui/types.ts +11 -0
  109. package/src/ton/__tests__/toolbox.test.ts +63 -0
  110. package/src/ton/index.ts +2 -0
  111. package/src/ton/toolbox.ts +136 -0
  112. package/src/ton/types.ts +13 -0
  113. package/src/tron/__tests__/toolbox.test.ts +221 -0
  114. package/src/tron/helpers/trc20.abi.ts +107 -0
  115. package/src/tron/helpers/trongrid.ts +53 -0
  116. package/src/tron/index.ts +21 -0
  117. package/src/tron/toolbox.ts +585 -0
  118. package/src/tron/types.ts +83 -0
  119. package/src/types.ts +28 -0
  120. package/src/utils.ts +27 -0
  121. package/src/utxo/__tests__/zcash-integration.test.ts +97 -0
  122. package/src/utxo/helpers/api.ts +471 -0
  123. package/src/utxo/helpers/bchaddrjs.ts +166 -0
  124. package/src/utxo/helpers/coinselect.ts +92 -0
  125. package/src/utxo/helpers/index.ts +4 -0
  126. package/src/utxo/helpers/txSize.ts +137 -0
  127. package/src/utxo/index.ts +6 -0
  128. package/src/utxo/toolbox/bitcoinCash.ts +243 -0
  129. package/src/utxo/toolbox/index.ts +59 -0
  130. package/src/utxo/toolbox/params.ts +18 -0
  131. package/src/utxo/toolbox/utxo.ts +439 -0
  132. package/src/utxo/toolbox/validators.ts +36 -0
  133. package/src/utxo/toolbox/zcash.ts +245 -0
  134. package/src/utxo/types.ts +39 -0
package/package.json CHANGED
@@ -1,79 +1,91 @@
1
1
  {
2
2
  "dependencies": {
3
3
  "@bitcoinerlab/secp256k1": "~1.2.0",
4
- "@bitgo/utxo-lib": "~11.10.0",
5
- "@cosmjs/amino": "~0.33.0",
6
- "@cosmjs/crypto": "~0.33.0",
7
- "@cosmjs/proto-signing": "~0.33.0",
8
- "@cosmjs/stargate": "~0.33.0",
9
- "@meshsdk/core": "1.9.0-beta.74",
10
- "@mysten/bcs": "~1.8.0",
11
- "@mysten/sui": "~1.38.0",
12
- "@noble/hashes": "2.0.0-beta.1",
13
- "@polkadot/api": "~15.9.0",
14
- "@polkadot/keyring": "~13.5.0",
15
- "@polkadot/util": "~13.5.0",
16
- "@polkadot/util-crypto": "~13.5.0",
4
+ "@bitgo/utxo-lib": "~11.13.1",
5
+ "@cosmjs/amino": "~0.37.0",
6
+ "@cosmjs/crypto": "0.37.0",
7
+ "@cosmjs/proto-signing": "~0.37.0",
8
+ "@cosmjs/stargate": "~0.37.0",
9
+ "@meshsdk/core": "1.9.0-beta.86",
10
+ "@mysten/bcs": "~1.9.2",
11
+ "@mysten/sui": "~1.44.0",
12
+ "@near-js/accounts": "~2.5.0",
13
+ "@near-js/crypto": "~2.5.0",
14
+ "@near-js/providers": "~2.5.0",
15
+ "@near-js/signers": "~2.5.0",
16
+ "@near-js/transactions": "~2.5.0",
17
+ "@near-js/utils": "~2.5.0",
18
+ "@noble/hashes": "2.0.1",
19
+ "@polkadot/api": "15.10.2",
20
+ "@polkadot/keyring": "~13.5.7",
21
+ "@polkadot/rpc-provider": "~15.10.2",
22
+ "@polkadot/util": "~13.5.7",
23
+ "@polkadot/util-crypto": "~13.5.7",
17
24
  "@psf/bitcoincashjs-lib": "~4.0.3",
18
25
  "@radixdlt/babylon-gateway-api-sdk": "~1.10.0",
19
26
  "@radixdlt/radix-dapp-toolkit": "~2.2.0",
20
- "@scure/base": "~1.2.6",
21
- "@scure/bip32": "~1.7.0",
22
- "@scure/bip39": "~1.6.0",
27
+ "@scure/base": "~2.0.0",
28
+ "@scure/bip32": "~2.0.1",
29
+ "@scure/bip39": "~2.0.1",
23
30
  "@solana/spl-memo": "~0.2.5",
24
- "@solana/spl-token": "~0.4.13",
31
+ "@solana/spl-token": "~0.4.14",
25
32
  "@solana/web3.js": "~1.98.0",
26
- "@swapkit/helpers": "4.4.5",
33
+ "@swapkit/helpers": "4.5.3",
27
34
  "@ton/crypto": "~3.3.0",
28
- "@ton/ton": "~15.3.1",
35
+ "@ton/ton": "~15.4.0",
29
36
  "base64-js": "~1.5.1",
30
37
  "bitcoinjs-lib": "~6.1.0",
31
38
  "bs58check": "~4.0.0",
32
39
  "cashaddrjs": "~0.4.4",
33
40
  "coininfo": "~5.2.1",
34
- "cosmjs-types": "~0.9.0",
41
+ "cosmjs-types": "~0.10.1",
35
42
  "ecpair": "~2.1.0",
36
43
  "ethers": "^6.14.0",
37
- "micro-key-producer": "~0.7.6",
38
- "near-api-js": "~6.3.0",
44
+ "micro-key-producer": "~0.8.2",
39
45
  "near-sdk-js": "~2.0.0",
40
46
  "near-seed-phrase": "~0.2.1",
41
47
  "protobufjs": "~7.5.4",
42
- "tronweb": "~6.0.0",
43
- "ts-pattern": "^5.7.0",
44
- "xrpl": "~4.3.0"
48
+ "tronweb": "6.1.0",
49
+ "ts-pattern": "^5.9.0",
50
+ "xrpl": "~4.4.2"
45
51
  },
46
52
  "description": "SwapKit - Toolboxes",
47
53
  "devDependencies": {
48
54
  "@bitcoinerlab/secp256k1": "1.2.0",
49
- "@bitgo/utxo-lib": "11.10.0",
50
- "@cosmjs/amino": "0.33.1",
51
- "@cosmjs/crypto": "0.33.1",
52
- "@cosmjs/proto-signing": "0.33.1",
53
- "@cosmjs/stargate": "0.33.1",
54
- "@meshsdk/core": "1.9.0-beta.74",
55
- "@mysten/bcs": "1.8.0",
56
- "@mysten/sui": "1.38.0",
57
- "@noble/hashes": "2.0.0-beta.1",
58
- "@nomicfoundation/hardhat-ethers": "3.0.9",
59
- "@nomicfoundation/hardhat-toolbox": "5.0.0",
60
- "@polkadot/api": "15.9.2",
61
- "@polkadot/keyring": "13.5.5",
62
- "@polkadot/types": "15.9.2",
63
- "@polkadot/util": "13.5.5",
64
- "@polkadot/util-crypto": "13.5.5",
55
+ "@bitgo/utxo-lib": "11.13.1",
56
+ "@cosmjs/amino": "0.37.0",
57
+ "@cosmjs/crypto": "0.37.0",
58
+ "@cosmjs/proto-signing": "0.37.0",
59
+ "@cosmjs/stargate": "0.37.0",
60
+ "@meshsdk/core": "1.9.0-beta.86",
61
+ "@mysten/bcs": "1.9.2",
62
+ "@mysten/sui": "1.44.0",
63
+ "@near-js/accounts": "2.5.0",
64
+ "@near-js/crypto": "2.5.0",
65
+ "@near-js/providers": "2.5.0",
66
+ "@near-js/signers": "2.5.0",
67
+ "@near-js/transactions": "2.5.0",
68
+ "@near-js/utils": "2.5.0",
69
+ "@noble/hashes": "2.0.1",
70
+ "@nomicfoundation/hardhat-ethers": "4.0.3",
71
+ "@nomicfoundation/hardhat-network-helpers": "3.0.2",
72
+ "@nomicfoundation/hardhat-toolbox": "6.1.0",
73
+ "@polkadot/api": "15.10.2",
74
+ "@polkadot/keyring": "13.5.7",
75
+ "@polkadot/types": "15.10.2",
76
+ "@polkadot/util": "13.5.7",
77
+ "@polkadot/util-crypto": "13.5.7",
65
78
  "@psf/bitcoincashjs-lib": "4.0.3",
66
79
  "@radixdlt/babylon-gateway-api-sdk": "1.10.1",
67
80
  "@radixdlt/radix-dapp-toolkit": "2.2.1",
68
- "@scure/base": "1.2.6",
69
- "@scure/bip32": "1.7.0",
70
- "@scure/bip39": "1.6.0",
81
+ "@scure/base": "2.0.0",
82
+ "@scure/bip32": "2.0.1",
83
+ "@scure/bip39": "2.0.1",
71
84
  "@solana/spl-memo": "0.2.5",
72
- "@solana/spl-token": "0.4.13",
85
+ "@solana/spl-token": "0.4.14",
73
86
  "@solana/web3.js": "1.98.4",
74
- "@swapkit/helpers": "4.4.5",
75
87
  "@ton/crypto": "3.3.0",
76
- "@ton/ton": "15.3.1",
88
+ "@ton/ton": "15.4.0",
77
89
  "@types/bn.js": "5.2.0",
78
90
  "@types/crypto-js": "4.2.2",
79
91
  "@types/elliptic": "6.4.18",
@@ -82,83 +94,99 @@
82
94
  "bs58check": "4.0.0",
83
95
  "cashaddrjs": "0.4.4",
84
96
  "coininfo": "5.2.1",
85
- "cosmjs-types": "0.9.0",
97
+ "cosmjs-types": "0.10.1",
86
98
  "ecpair": "2.1.0",
87
99
  "ethers": "6.15.0",
88
- "hardhat": "2.25.0",
89
- "micro-key-producer": "0.7.6",
90
- "near-api-js": "6.3.0",
100
+ "hardhat": "3.0.11",
101
+ "micro-key-producer": "0.8.2",
91
102
  "near-sdk-js": "2.0.0",
92
103
  "near-seed-phrase": "0.2.1",
93
104
  "protobufjs": "7.5.4",
94
- "tronweb": "6.0.4",
95
- "ts-pattern": "5.8.0",
96
- "xrpl": "4.3.0"
105
+ "tronweb": "6.1.0",
106
+ "ts-pattern": "5.9.0",
107
+ "xrpl": "4.4.2"
97
108
  },
98
109
  "exports": {
99
- ".": { "default": "./dist/src/index.js", "require": "./dist/src/index.cjs", "types": "./dist/types/index.d.ts" },
110
+ ".": {
111
+ "bun": "./src/index.ts",
112
+ "default": "./dist/src/index.js",
113
+ "require": "./dist/src/index.cjs",
114
+ "types": "./dist/types/index.d.ts"
115
+ },
100
116
  "./cardano": {
117
+ "bun": "./src/cardano/index.ts",
101
118
  "default": "./dist/src/cardano/index.js",
102
119
  "require": "./dist/src/cardano/index.cjs",
103
120
  "types": "./dist/types/cardano/index.d.ts"
104
121
  },
105
122
  "./cosmos": {
123
+ "bun": "./src/cosmos/index.ts",
106
124
  "default": "./dist/src/cosmos/index.js",
107
125
  "require": "./dist/src/cosmos/index.cjs",
108
126
  "types": "./dist/types/cosmos/index.d.ts"
109
127
  },
110
128
  "./evm": {
129
+ "bun": "./src/evm/index.ts",
111
130
  "default": "./dist/src/evm/index.js",
112
131
  "require": "./dist/src/evm/index.cjs",
113
132
  "types": "./dist/types/evm/index.d.ts"
114
133
  },
115
134
  "./near": {
135
+ "bun": "./src/near/index.ts",
116
136
  "default": "./dist/src/near/index.js",
117
137
  "require": "./dist/src/near/index.cjs",
118
138
  "types": "./dist/types/near/index.d.ts"
119
139
  },
120
140
  "./radix": {
141
+ "bun": "./src/radix/index.ts",
121
142
  "default": "./dist/src/radix/index.js",
122
143
  "require": "./dist/src/radix/index.cjs",
123
144
  "types": "./dist/types/radix/index.d.ts"
124
145
  },
125
146
  "./ripple": {
147
+ "bun": "./src/ripple/index.ts",
126
148
  "default": "./dist/src/ripple/index.js",
127
149
  "require": "./dist/src/ripple/index.cjs",
128
150
  "types": "./dist/types/ripple/index.d.ts"
129
151
  },
130
152
  "./solana": {
153
+ "bun": "./src/solana/index.ts",
131
154
  "default": "./dist/src/solana/index.js",
132
155
  "require": "./dist/src/solana/index.cjs",
133
156
  "types": "./dist/types/solana/index.d.ts"
134
157
  },
135
158
  "./substrate": {
159
+ "bun": "./src/substrate/index.ts",
136
160
  "default": "./dist/src/substrate/index.js",
137
161
  "require": "./dist/src/substrate/index.cjs",
138
162
  "types": "./dist/types/substrate/index.d.ts"
139
163
  },
140
164
  "./sui": {
165
+ "bun": "./src/sui/index.ts",
141
166
  "default": "./dist/src/sui/index.js",
142
167
  "require": "./dist/src/sui/index.cjs",
143
168
  "types": "./dist/types/sui/index.d.ts"
144
169
  },
145
170
  "./ton": {
171
+ "bun": "./src/ton/index.ts",
146
172
  "default": "./dist/src/ton/index.js",
147
173
  "require": "./dist/src/ton/index.cjs",
148
174
  "types": "./dist/types/ton/index.d.ts"
149
175
  },
150
176
  "./tron": {
177
+ "bun": "./src/tron/index.ts",
151
178
  "default": "./dist/src/tron/index.js",
152
179
  "require": "./dist/src/tron/index.cjs",
153
180
  "types": "./dist/types/tron/index.d.ts"
154
181
  },
155
182
  "./utxo": {
183
+ "bun": "./src/utxo/index.ts",
156
184
  "default": "./dist/src/utxo/index.js",
157
185
  "require": "./dist/src/utxo/index.cjs",
158
186
  "types": "./dist/types/utxo/index.d.ts"
159
187
  }
160
188
  },
161
- "files": ["dist/"],
189
+ "files": ["dist/", "src/"],
162
190
  "homepage": "https://github.com/swapkit/SwapKit",
163
191
  "license": "Apache-2.0",
164
192
  "name": "@swapkit/toolboxes",
@@ -166,12 +194,12 @@
166
194
  "scripts": {
167
195
  "build": "bun run ./build.ts",
168
196
  "build:clean": "rm -rf dist && bun run ./build.ts",
169
- "clean": "rm -rf dist node_modules *.tsbuildinfo",
197
+ "clean": "rm -rf cache dist node_modules *.tsbuildinfo",
170
198
  "test": "bun test",
171
199
  "test:ci": "bun test --coverage",
172
200
  "type-check": "bun tsc --noEmit",
173
201
  "type-check:go": "tsgo"
174
202
  },
175
203
  "type": "module",
176
- "version": "4.2.1"
204
+ "version": "4.3.3"
177
205
  }
@@ -0,0 +1,162 @@
1
+ import { beforeAll, describe, expect, test } from "bun:test";
2
+ import { Chain } from "@swapkit/helpers";
3
+ import { getAddressValidator } from "../index";
4
+
5
+ const context: { validateAddress: (params: { address: string; chain: Chain }) => boolean } = {} as any;
6
+
7
+ beforeAll(async () => {
8
+ context.validateAddress = await getAddressValidator();
9
+ });
10
+
11
+ describe("Address Validation - All Chains", () => {
12
+ describe("Valid addresses for each chain", () => {
13
+ const validAddresses = {
14
+ [Chain.Ethereum]: ["0x51176f5F0B7ccC8fA0376F08aaa28F316A38a2a0"],
15
+ [Chain.Avalanche]: ["0x51176f5F0B7ccC8fA0376F08aaa28F316A38a2a0"],
16
+ [Chain.Arbitrum]: ["0x51176f5F0B7ccC8fA0376F08aaa28F316A38a2a0"],
17
+ [Chain.BinanceSmartChain]: ["0x51176f5F0B7ccC8fA0376F08aaa28F316A38a2a0"],
18
+ [Chain.Optimism]: ["0x51176f5F0B7ccC8fA0376F08aaa28F316A38a2a0"],
19
+ [Chain.Polygon]: ["0x51176f5F0B7ccC8fA0376F08aaa28F316A38a2a0"],
20
+ [Chain.Base]: ["0x51176f5F0B7ccC8fA0376F08aaa28F316A38a2a0"],
21
+ [Chain.Bitcoin]: ["bc1qjpmp8xvg9k4ysa7nvev3lw7qcclvxzt2ex75kr", "1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa"],
22
+ [Chain.BitcoinCash]: ["qzhcfqxrnhcw88c433tq0fjlw0uut8c0e5d3cf8566"],
23
+ [Chain.Dogecoin]: ["DPrKsuhVibyfMMYRmKP49US5PBQR8zq6v4"],
24
+ [Chain.Litecoin]: ["ltc1qs4h7p8x0kfhs88wazmq2d40t59dwdlxd6rlpjz"],
25
+ [Chain.Dash]: ["XoBBveBZv32rq9MMBt88QSVsUtdj9cMCLy"],
26
+ [Chain.Zcash]: ["t1Mh7QW9g1gK94CSRxniD49aLAJ67s6UerX"],
27
+ [Chain.Cosmos]: ["cosmos12d7d2rlxp7urkp8z0p8sft2fm07ewyjrfvul3f"],
28
+ [Chain.Kujira]: ["kujira12d7d2rlxp7urkp8z0p8sft2fm07ewyjrcy78ur"],
29
+ [Chain.Maya]: ["maya1hm0sdz9v2h5jwjuu0ssp8x98upvlc6py2t7e6j"],
30
+ [Chain.Noble]: ["noble12d7d2rlxp7urkp8z0p8sft2fm07ewyjrp0fhf8"],
31
+ [Chain.THORChain]: ["thor1hm0sdz9v2h5jwjuu0ssp8x98upvlc6py2uq4vz"],
32
+ [Chain.Polkadot]: ["16kQVedQo7yYoFSp2MnQ78zP39xWnFGePnZps2APEyt9K9KZ"],
33
+ [Chain.Chainflip]: ["cFPctKfXisvnrhss2eMV2VdiUNRm1F5pX4WfqkcT3ZrLKJXrS"],
34
+ [Chain.Cardano]: [
35
+ "addr1qxk2md7wufs2cas0dfxch0uu59079s7yc5k9pw8s49wpm25s8ynu4svqm7m4hd04d4jvm6e5vvyw7dm4gvpqyfklgn8qetu85s",
36
+ ],
37
+ [Chain.Near]: ["a03fafdf5f97d3c6be6bff9e55f057dda76fefbb7e149f5469248f41e812cb6e"],
38
+ [Chain.Ripple]: ["rhDQXdwWR2RstC7sLjLMbjCeWT3PuSAZVu"],
39
+ [Chain.Solana]: ["4UHWuPwyV3XCcnwrpEdWAEW3WLUP1RDMaK3ANNsRUjfM"],
40
+ [Chain.Sui]: ["0x57b861db681d8e47b586e6e9a92f6ed210dbbb440670b8122420848cf0e844fb"],
41
+ [Chain.Ton]: ["EQCC1GV4iL5EkQqICYshf3AF7ESbceCYhVK-go1SkOMOBTNE"],
42
+ [Chain.Radix]: [] as string[],
43
+ [Chain.Harbor]: [] as string[],
44
+ };
45
+
46
+ for (const [chain, addresses] of Object.entries(validAddresses)) {
47
+ if (addresses.length === 0) continue;
48
+
49
+ test(`should validate valid ${chain} addresses`, () => {
50
+ for (const address of addresses) {
51
+ const result = context.validateAddress({ address, chain: chain as Chain });
52
+ expect(result).toBe(true);
53
+ }
54
+ });
55
+ }
56
+ });
57
+
58
+ describe("Invalid addresses should be rejected", () => {
59
+ const invalidTestCases: Array<{ chain: Chain; addresses: string[] }> = [
60
+ {
61
+ addresses: [
62
+ "",
63
+ "invalid",
64
+ "0x123",
65
+ "0xG051176f5F0B7ccC8fA0376F08aaa28F316A38a2a0",
66
+ "THr473cZqHwBLEmTWUUR1WTotxijWWbRGD",
67
+ "bc1qjpmp8xvg9k4ysa7nvev3lw7qcclvxzt2ex75kr",
68
+ "cosmos12d7d2rlxp7urkp8z0p8sft2fm07ewyjrfvul3f",
69
+ ],
70
+ chain: Chain.Ethereum,
71
+ },
72
+ {
73
+ addresses: [
74
+ "",
75
+ "invalid",
76
+ "0x51176f5F0B7ccC8fA0376F08aaa28F316A38a2a0",
77
+ "THr473cZqHwBLEmTWUUR1WTotxijWWbRGD",
78
+ "cosmos12d7d2rlxp7urkp8z0p8sft2fm07ewyjrfvul3f",
79
+ "qzhcfqxrnhcw88c433tq0fjlw0uut8c0e5d3cf8566",
80
+ ],
81
+ chain: Chain.Bitcoin,
82
+ },
83
+ {
84
+ addresses: [
85
+ "",
86
+ "invalid",
87
+ "0x51176f5F0B7ccC8fA0376F08aaa28F316A38a2a0",
88
+ "bc1qjpmp8xvg9k4ysa7nvev3lw7qcclvxzt2ex75kr",
89
+ "thor1hm0sdz9v2h5jwjuu0ssp8x98upvlc6py2uq4vz",
90
+ "maya1hm0sdz9v2h5jwjuu0ssp8x98upvlc6py2t7e6j",
91
+ ],
92
+ chain: Chain.Cosmos,
93
+ },
94
+ {
95
+ addresses: [
96
+ "",
97
+ "invalid",
98
+ "0x51176f5F0B7ccC8fA0376F08aaa28F316A38a2a0",
99
+ "4UHWuPwyV3XCcnwrpEdWAEW3WLUP1RDMaK3ANNsRUjfM123",
100
+ "123",
101
+ ],
102
+ chain: Chain.Solana,
103
+ },
104
+ { addresses: ["", "invalid!"], chain: Chain.Near },
105
+ {
106
+ addresses: [
107
+ "",
108
+ "invalid",
109
+ "0x51176f5F0B7ccC8fA0376F08aaa28F316A38a2a0",
110
+ "bc1qjpmp8xvg9k4ysa7nvev3lw7qcclvxzt2ex75kr",
111
+ ],
112
+ chain: Chain.Cardano,
113
+ },
114
+ {
115
+ addresses: [
116
+ "",
117
+ "invalid",
118
+ "0x51176f5F0B7ccC8fA0376F08aaa28F316A38a2a0",
119
+ "bc1qjpmp8xvg9k4ysa7nvev3lw7qcclvxzt2ex75kr",
120
+ ],
121
+ chain: Chain.Ripple,
122
+ },
123
+ ];
124
+
125
+ for (const { chain, addresses } of invalidTestCases) {
126
+ test(`should reject invalid ${chain} addresses`, () => {
127
+ for (const address of addresses) {
128
+ const result = context.validateAddress({ address, chain });
129
+ expect(result).toBe(false);
130
+ }
131
+ });
132
+ }
133
+ });
134
+
135
+ describe("Edge cases and type safety", () => {
136
+ test("should handle non-string inputs safely", () => {
137
+ const edgeCases = [null, undefined, 123, {}, [], true, false];
138
+
139
+ for (const testCase of edgeCases) {
140
+ expect(context.validateAddress({ address: testCase as any, chain: Chain.Ethereum })).toBe(false);
141
+ }
142
+ });
143
+
144
+ test("should reject cross-chain address usage", () => {
145
+ expect(
146
+ context.validateAddress({ address: "0x51176f5F0B7ccC8fA0376F08aaa28F316A38a2a0", chain: Chain.Bitcoin }),
147
+ ).toBe(false);
148
+
149
+ expect(
150
+ context.validateAddress({ address: "bc1qjpmp8xvg9k4ysa7nvev3lw7qcclvxzt2ex75kr", chain: Chain.Ethereum }),
151
+ ).toBe(false);
152
+
153
+ expect(
154
+ context.validateAddress({ address: "cosmos12d7d2rlxp7urkp8z0p8sft2fm07ewyjrfvul3f", chain: Chain.Maya }),
155
+ ).toBe(false);
156
+
157
+ expect(context.validateAddress({ address: "THr473cZqHwBLEmTWUUR1WTotxijWWbRGD", chain: Chain.Ethereum })).toBe(
158
+ false,
159
+ );
160
+ });
161
+ });
162
+ });
@@ -0,0 +1,162 @@
1
+ import { beforeAll, describe, expect, test } from "bun:test";
2
+ import { Chain } from "@swapkit/helpers";
3
+ import { getAddressValidator } from "../index";
4
+
5
+ const context: { validateAddress: (params: { address: string; chain: Chain }) => boolean } = {} as any;
6
+
7
+ beforeAll(async () => {
8
+ context.validateAddress = await getAddressValidator();
9
+ });
10
+
11
+ describe("Address Validation - All Chains", () => {
12
+ describe("Valid addresses for each chain", () => {
13
+ const validAddresses = {
14
+ [Chain.Ethereum]: ["0x51176f5F0B7ccC8fA0376F08aaa28F316A38a2a0"],
15
+ [Chain.Avalanche]: ["0x51176f5F0B7ccC8fA0376F08aaa28F316A38a2a0"],
16
+ [Chain.Arbitrum]: ["0x51176f5F0B7ccC8fA0376F08aaa28F316A38a2a0"],
17
+ [Chain.BinanceSmartChain]: ["0x51176f5F0B7ccC8fA0376F08aaa28F316A38a2a0"],
18
+ [Chain.Optimism]: ["0x51176f5F0B7ccC8fA0376F08aaa28F316A38a2a0"],
19
+ [Chain.Polygon]: ["0x51176f5F0B7ccC8fA0376F08aaa28F316A38a2a0"],
20
+ [Chain.Base]: ["0x51176f5F0B7ccC8fA0376F08aaa28F316A38a2a0"],
21
+ [Chain.Bitcoin]: ["bc1qjpmp8xvg9k4ysa7nvev3lw7qcclvxzt2ex75kr", "1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa"],
22
+ [Chain.BitcoinCash]: ["qzhcfqxrnhcw88c433tq0fjlw0uut8c0e5d3cf8566"],
23
+ [Chain.Dogecoin]: ["DPrKsuhVibyfMMYRmKP49US5PBQR8zq6v4"],
24
+ [Chain.Litecoin]: ["ltc1qs4h7p8x0kfhs88wazmq2d40t59dwdlxd6rlpjz"],
25
+ [Chain.Dash]: ["XoBBveBZv32rq9MMBt88QSVsUtdj9cMCLy"],
26
+ [Chain.Zcash]: ["t1Mh7QW9g1gK94CSRxniD49aLAJ67s6UerX"],
27
+ [Chain.Cosmos]: ["cosmos12d7d2rlxp7urkp8z0p8sft2fm07ewyjrfvul3f"],
28
+ [Chain.Kujira]: ["kujira12d7d2rlxp7urkp8z0p8sft2fm07ewyjrcy78ur"],
29
+ [Chain.Maya]: ["maya1hm0sdz9v2h5jwjuu0ssp8x98upvlc6py2t7e6j"],
30
+ [Chain.Noble]: ["noble12d7d2rlxp7urkp8z0p8sft2fm07ewyjrp0fhf8"],
31
+ [Chain.THORChain]: ["thor1hm0sdz9v2h5jwjuu0ssp8x98upvlc6py2uq4vz"],
32
+ [Chain.Polkadot]: ["16kQVedQo7yYoFSp2MnQ78zP39xWnFGePnZps2APEyt9K9KZ"],
33
+ [Chain.Chainflip]: ["cFPctKfXisvnrhss2eMV2VdiUNRm1F5pX4WfqkcT3ZrLKJXrS"],
34
+ [Chain.Cardano]: [
35
+ "addr1qxk2md7wufs2cas0dfxch0uu59079s7yc5k9pw8s49wpm25s8ynu4svqm7m4hd04d4jvm6e5vvyw7dm4gvpqyfklgn8qetu85s",
36
+ ],
37
+ [Chain.Near]: ["a03fafdf5f97d3c6be6bff9e55f057dda76fefbb7e149f5469248f41e812cb6e"],
38
+ [Chain.Ripple]: ["rhDQXdwWR2RstC7sLjLMbjCeWT3PuSAZVu"],
39
+ [Chain.Solana]: ["4UHWuPwyV3XCcnwrpEdWAEW3WLUP1RDMaK3ANNsRUjfM"],
40
+ [Chain.Sui]: ["0x57b861db681d8e47b586e6e9a92f6ed210dbbb440670b8122420848cf0e844fb"],
41
+ [Chain.Ton]: ["EQCC1GV4iL5EkQqICYshf3AF7ESbceCYhVK-go1SkOMOBTNE"],
42
+ [Chain.Radix]: [] as string[],
43
+ [Chain.Harbor]: [] as string[],
44
+ };
45
+
46
+ for (const [chain, addresses] of Object.entries(validAddresses)) {
47
+ if (addresses.length === 0) continue;
48
+
49
+ test(`should validate valid ${chain} addresses`, () => {
50
+ for (const address of addresses) {
51
+ const result = context.validateAddress({ address, chain: chain as Chain });
52
+ expect(result).toBe(true);
53
+ }
54
+ });
55
+ }
56
+ });
57
+
58
+ describe("Invalid addresses should be rejected", () => {
59
+ const invalidTestCases: Array<{ chain: Chain; addresses: string[] }> = [
60
+ {
61
+ addresses: [
62
+ "",
63
+ "invalid",
64
+ "0x123",
65
+ "0xG051176f5F0B7ccC8fA0376F08aaa28F316A38a2a0",
66
+ "THr473cZqHwBLEmTWUUR1WTotxijWWbRGD",
67
+ "bc1qjpmp8xvg9k4ysa7nvev3lw7qcclvxzt2ex75kr",
68
+ "cosmos12d7d2rlxp7urkp8z0p8sft2fm07ewyjrfvul3f",
69
+ ],
70
+ chain: Chain.Ethereum,
71
+ },
72
+ {
73
+ addresses: [
74
+ "",
75
+ "invalid",
76
+ "0x51176f5F0B7ccC8fA0376F08aaa28F316A38a2a0",
77
+ "THr473cZqHwBLEmTWUUR1WTotxijWWbRGD",
78
+ "cosmos12d7d2rlxp7urkp8z0p8sft2fm07ewyjrfvul3f",
79
+ "qzhcfqxrnhcw88c433tq0fjlw0uut8c0e5d3cf8566",
80
+ ],
81
+ chain: Chain.Bitcoin,
82
+ },
83
+ {
84
+ addresses: [
85
+ "",
86
+ "invalid",
87
+ "0x51176f5F0B7ccC8fA0376F08aaa28F316A38a2a0",
88
+ "bc1qjpmp8xvg9k4ysa7nvev3lw7qcclvxzt2ex75kr",
89
+ "thor1hm0sdz9v2h5jwjuu0ssp8x98upvlc6py2uq4vz",
90
+ "maya1hm0sdz9v2h5jwjuu0ssp8x98upvlc6py2t7e6j",
91
+ ],
92
+ chain: Chain.Cosmos,
93
+ },
94
+ {
95
+ addresses: [
96
+ "",
97
+ "invalid",
98
+ "0x51176f5F0B7ccC8fA0376F08aaa28F316A38a2a0",
99
+ "4UHWuPwyV3XCcnwrpEdWAEW3WLUP1RDMaK3ANNsRUjfM123",
100
+ "123",
101
+ ],
102
+ chain: Chain.Solana,
103
+ },
104
+ { addresses: ["", "invalid!"], chain: Chain.Near },
105
+ {
106
+ addresses: [
107
+ "",
108
+ "invalid",
109
+ "0x51176f5F0B7ccC8fA0376F08aaa28F316A38a2a0",
110
+ "bc1qjpmp8xvg9k4ysa7nvev3lw7qcclvxzt2ex75kr",
111
+ ],
112
+ chain: Chain.Cardano,
113
+ },
114
+ {
115
+ addresses: [
116
+ "",
117
+ "invalid",
118
+ "0x51176f5F0B7ccC8fA0376F08aaa28F316A38a2a0",
119
+ "bc1qjpmp8xvg9k4ysa7nvev3lw7qcclvxzt2ex75kr",
120
+ ],
121
+ chain: Chain.Ripple,
122
+ },
123
+ ];
124
+
125
+ for (const { chain, addresses } of invalidTestCases) {
126
+ test(`should reject invalid ${chain} addresses`, () => {
127
+ for (const address of addresses) {
128
+ const result = context.validateAddress({ address, chain });
129
+ expect(result).toBe(false);
130
+ }
131
+ });
132
+ }
133
+ });
134
+
135
+ describe("Edge cases and type safety", () => {
136
+ test("should handle non-string inputs safely", () => {
137
+ const edgeCases = [null, undefined, 123, {}, [], true, false];
138
+
139
+ for (const testCase of edgeCases) {
140
+ expect(context.validateAddress({ address: testCase as any, chain: Chain.Ethereum })).toBe(false);
141
+ }
142
+ });
143
+
144
+ test("should reject cross-chain address usage", () => {
145
+ expect(
146
+ context.validateAddress({ address: "0x51176f5F0B7ccC8fA0376F08aaa28F316A38a2a0", chain: Chain.Bitcoin }),
147
+ ).toBe(false);
148
+
149
+ expect(
150
+ context.validateAddress({ address: "bc1qjpmp8xvg9k4ysa7nvev3lw7qcclvxzt2ex75kr", chain: Chain.Ethereum }),
151
+ ).toBe(false);
152
+
153
+ expect(
154
+ context.validateAddress({ address: "cosmos12d7d2rlxp7urkp8z0p8sft2fm07ewyjrfvul3f", chain: Chain.Maya }),
155
+ ).toBe(false);
156
+
157
+ expect(context.validateAddress({ address: "THr473cZqHwBLEmTWUUR1WTotxijWWbRGD", chain: Chain.Ethereum })).toBe(
158
+ false,
159
+ );
160
+ });
161
+ });
162
+ });
@@ -0,0 +1,48 @@
1
+ import { beforeAll, describe, expect, test } from "bun:test";
2
+ import { Chain } from "@swapkit/helpers";
3
+ import { getCardanoToolbox } from "../toolbox";
4
+
5
+ const TEST_PHRASE = "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about";
6
+
7
+ const context: { toolbox: Awaited<ReturnType<typeof getCardanoToolbox>> } = {} as any;
8
+
9
+ beforeAll(async () => {
10
+ context.toolbox = await getCardanoToolbox({ phrase: TEST_PHRASE });
11
+ });
12
+
13
+ describe("Cardano Toolbox", () => {
14
+ test("should validate valid Cardano addresses", () => {
15
+ const validAddresses = [
16
+ "addr_test1qz2fxv2umyhttkxyxp8x0dlpdt3k6cwng5pxj3jhsydzer3n0d3vllmyqwsx5wktcd8cc3sq835lu7drv2xwl2wywfgs68faae",
17
+ ];
18
+
19
+ for (const address of validAddresses) {
20
+ expect(context.toolbox.validateAddress(address)).toBe(true);
21
+ }
22
+ });
23
+
24
+ test("should reject invalid Cardano addresses", () => {
25
+ const invalidAddresses = [
26
+ "",
27
+ "invalid",
28
+ "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
29
+ "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t",
30
+ "1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa",
31
+ ];
32
+
33
+ for (const address of invalidAddresses) {
34
+ expect(context.toolbox.validateAddress(address)).toBe(false);
35
+ }
36
+ });
37
+
38
+ test("should generate valid Cardano address from phrase", () => {
39
+ const address = context.toolbox.getAddress();
40
+ expect(address.startsWith("addr")).toBe(true);
41
+ });
42
+
43
+ test("should estimate transaction fee", async () => {
44
+ const fee = await context.toolbox.estimateTransactionFee();
45
+ expect(fee.chain).toBe(Chain.Cardano);
46
+ expect(fee.getValue("number")).toBeGreaterThan(0);
47
+ });
48
+ });
@@ -0,0 +1,2 @@
1
+ export * from "./toolbox";
2
+ export * from "./types";