@miradexio/client 0.1.0

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 (405) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +405 -0
  3. package/dist/address/base58.d.ts +9 -0
  4. package/dist/address/base58.d.ts.map +1 -0
  5. package/dist/address/base58.js +33 -0
  6. package/dist/address/base58.js.map +1 -0
  7. package/dist/address/bech32.d.ts +13 -0
  8. package/dist/address/bech32.d.ts.map +1 -0
  9. package/dist/address/bech32.js +41 -0
  10. package/dist/address/bech32.js.map +1 -0
  11. package/dist/address/evm.d.ts +5 -0
  12. package/dist/address/evm.d.ts.map +1 -0
  13. package/dist/address/evm.js +27 -0
  14. package/dist/address/evm.js.map +1 -0
  15. package/dist/address/index.d.ts +15 -0
  16. package/dist/address/index.d.ts.map +1 -0
  17. package/dist/address/index.js +134 -0
  18. package/dist/address/index.js.map +1 -0
  19. package/dist/address/monero.d.ts +15 -0
  20. package/dist/address/monero.d.ts.map +1 -0
  21. package/dist/address/monero.js +30 -0
  22. package/dist/address/monero.js.map +1 -0
  23. package/dist/address/polkadot.d.ts +10 -0
  24. package/dist/address/polkadot.d.ts.map +1 -0
  25. package/dist/address/polkadot.js +36 -0
  26. package/dist/address/polkadot.js.map +1 -0
  27. package/dist/address/solana.d.ts +5 -0
  28. package/dist/address/solana.d.ts.map +1 -0
  29. package/dist/address/solana.js +17 -0
  30. package/dist/address/solana.js.map +1 -0
  31. package/dist/address/ton.d.ts +11 -0
  32. package/dist/address/ton.d.ts.map +1 -0
  33. package/dist/address/ton.js +28 -0
  34. package/dist/address/ton.js.map +1 -0
  35. package/dist/api/index.d.ts +80 -0
  36. package/dist/api/index.d.ts.map +1 -0
  37. package/dist/api/index.js +213 -0
  38. package/dist/api/index.js.map +1 -0
  39. package/dist/atomic-swap/drive.d.ts +22 -0
  40. package/dist/atomic-swap/drive.d.ts.map +1 -0
  41. package/dist/atomic-swap/drive.js +713 -0
  42. package/dist/atomic-swap/drive.js.map +1 -0
  43. package/dist/atomic-swap/extract.d.ts +46 -0
  44. package/dist/atomic-swap/extract.d.ts.map +1 -0
  45. package/dist/atomic-swap/extract.js +55 -0
  46. package/dist/atomic-swap/extract.js.map +1 -0
  47. package/dist/atomic-swap/index.d.ts +15 -0
  48. package/dist/atomic-swap/index.d.ts.map +1 -0
  49. package/dist/atomic-swap/index.js +13 -0
  50. package/dist/atomic-swap/index.js.map +1 -0
  51. package/dist/atomic-swap/monero-sweep/errors.d.ts +2 -0
  52. package/dist/atomic-swap/monero-sweep/errors.d.ts.map +1 -0
  53. package/dist/atomic-swap/monero-sweep/errors.js +43 -0
  54. package/dist/atomic-swap/monero-sweep/errors.js.map +1 -0
  55. package/dist/atomic-swap/monero-sweep/index.d.ts +33 -0
  56. package/dist/atomic-swap/monero-sweep/index.d.ts.map +1 -0
  57. package/dist/atomic-swap/monero-sweep/index.js +415 -0
  58. package/dist/atomic-swap/monero-sweep/index.js.map +1 -0
  59. package/dist/atomic-swap/monero-sweep/ring-select.d.ts +12 -0
  60. package/dist/atomic-swap/monero-sweep/ring-select.d.ts.map +1 -0
  61. package/dist/atomic-swap/monero-sweep/ring-select.js +61 -0
  62. package/dist/atomic-swap/monero-sweep/ring-select.js.map +1 -0
  63. package/dist/atomic-swap/presign.d.ts +101 -0
  64. package/dist/atomic-swap/presign.d.ts.map +1 -0
  65. package/dist/atomic-swap/presign.js +460 -0
  66. package/dist/atomic-swap/presign.js.map +1 -0
  67. package/dist/atomic-swap/refund.d.ts +72 -0
  68. package/dist/atomic-swap/refund.d.ts.map +1 -0
  69. package/dist/atomic-swap/refund.js +224 -0
  70. package/dist/atomic-swap/refund.js.map +1 -0
  71. package/dist/atomic-swap/run.d.ts +27 -0
  72. package/dist/atomic-swap/run.d.ts.map +1 -0
  73. package/dist/atomic-swap/run.js +282 -0
  74. package/dist/atomic-swap/run.js.map +1 -0
  75. package/dist/atomic-swap/snapshot.d.ts +111 -0
  76. package/dist/atomic-swap/snapshot.d.ts.map +1 -0
  77. package/dist/atomic-swap/snapshot.js +69 -0
  78. package/dist/atomic-swap/snapshot.js.map +1 -0
  79. package/dist/atomic-swap/submit-encsig.d.ts +10 -0
  80. package/dist/atomic-swap/submit-encsig.d.ts.map +1 -0
  81. package/dist/atomic-swap/submit-encsig.js +56 -0
  82. package/dist/atomic-swap/submit-encsig.js.map +1 -0
  83. package/dist/atomic-swap/types.d.ts +168 -0
  84. package/dist/atomic-swap/types.d.ts.map +1 -0
  85. package/dist/atomic-swap/types.js +5 -0
  86. package/dist/atomic-swap/types.js.map +1 -0
  87. package/dist/blockchain/quorum-provider.d.ts +25 -0
  88. package/dist/blockchain/quorum-provider.d.ts.map +1 -0
  89. package/dist/blockchain/quorum-provider.js +144 -0
  90. package/dist/blockchain/quorum-provider.js.map +1 -0
  91. package/dist/cooperative-redeem.d.ts +23 -0
  92. package/dist/cooperative-redeem.d.ts.map +1 -0
  93. package/dist/cooperative-redeem.js +40 -0
  94. package/dist/cooperative-redeem.js.map +1 -0
  95. package/dist/engine/blockchain-querier.d.ts +34 -0
  96. package/dist/engine/blockchain-querier.d.ts.map +1 -0
  97. package/dist/engine/blockchain-querier.js +2 -0
  98. package/dist/engine/blockchain-querier.js.map +1 -0
  99. package/dist/engine/engine-state.d.ts +20 -0
  100. package/dist/engine/engine-state.d.ts.map +1 -0
  101. package/dist/engine/engine-state.js +9 -0
  102. package/dist/engine/engine-state.js.map +1 -0
  103. package/dist/engine/flow-context.d.ts +494 -0
  104. package/dist/engine/flow-context.d.ts.map +1 -0
  105. package/dist/engine/flow-context.js +147 -0
  106. package/dist/engine/flow-context.js.map +1 -0
  107. package/dist/engine/flows/atomic-flow-state.d.ts +124 -0
  108. package/dist/engine/flows/atomic-flow-state.d.ts.map +1 -0
  109. package/dist/engine/flows/atomic-flow-state.js +2 -0
  110. package/dist/engine/flows/atomic-flow-state.js.map +1 -0
  111. package/dist/engine/flows/atomic-flow.d.ts +88 -0
  112. package/dist/engine/flows/atomic-flow.d.ts.map +1 -0
  113. package/dist/engine/flows/atomic-flow.js +1192 -0
  114. package/dist/engine/flows/atomic-flow.js.map +1 -0
  115. package/dist/engine/flows/history-flow-state.d.ts +19 -0
  116. package/dist/engine/flows/history-flow-state.d.ts.map +1 -0
  117. package/dist/engine/flows/history-flow-state.js +2 -0
  118. package/dist/engine/flows/history-flow-state.js.map +1 -0
  119. package/dist/engine/flows/providers-flow-state.d.ts +14 -0
  120. package/dist/engine/flows/providers-flow-state.d.ts.map +1 -0
  121. package/dist/engine/flows/providers-flow-state.js +2 -0
  122. package/dist/engine/flows/providers-flow-state.js.map +1 -0
  123. package/dist/engine/flows/quote-flow-state.d.ts +20 -0
  124. package/dist/engine/flows/quote-flow-state.d.ts.map +1 -0
  125. package/dist/engine/flows/quote-flow-state.js +2 -0
  126. package/dist/engine/flows/quote-flow-state.js.map +1 -0
  127. package/dist/engine/flows/swap-flow-state.d.ts +155 -0
  128. package/dist/engine/flows/swap-flow-state.d.ts.map +1 -0
  129. package/dist/engine/flows/swap-flow-state.js +2 -0
  130. package/dist/engine/flows/swap-flow-state.js.map +1 -0
  131. package/dist/engine/flows/swap-flow.d.ts +81 -0
  132. package/dist/engine/flows/swap-flow.d.ts.map +1 -0
  133. package/dist/engine/flows/swap-flow.js +720 -0
  134. package/dist/engine/flows/swap-flow.js.map +1 -0
  135. package/dist/engine/flows/tokens-flow-state.d.ts +16 -0
  136. package/dist/engine/flows/tokens-flow-state.d.ts.map +1 -0
  137. package/dist/engine/flows/tokens-flow-state.js +2 -0
  138. package/dist/engine/flows/tokens-flow-state.js.map +1 -0
  139. package/dist/engine/miradex-engine.d.ts +152 -0
  140. package/dist/engine/miradex-engine.d.ts.map +1 -0
  141. package/dist/engine/miradex-engine.js +278 -0
  142. package/dist/engine/miradex-engine.js.map +1 -0
  143. package/dist/engine/pipeline.d.ts +27 -0
  144. package/dist/engine/pipeline.d.ts.map +1 -0
  145. package/dist/engine/pipeline.js +166 -0
  146. package/dist/engine/pipeline.js.map +1 -0
  147. package/dist/engine/platform.d.ts +220 -0
  148. package/dist/engine/platform.d.ts.map +1 -0
  149. package/dist/engine/platform.js +2 -0
  150. package/dist/engine/platform.js.map +1 -0
  151. package/dist/index.d.ts +85 -0
  152. package/dist/index.d.ts.map +1 -0
  153. package/dist/index.js +62 -0
  154. package/dist/index.js.map +1 -0
  155. package/dist/interfaces/blockchain.d.ts +33 -0
  156. package/dist/interfaces/blockchain.d.ts.map +1 -0
  157. package/dist/interfaces/blockchain.js +2 -0
  158. package/dist/interfaces/blockchain.js.map +1 -0
  159. package/dist/interfaces/logger.d.ts +14 -0
  160. package/dist/interfaces/logger.d.ts.map +1 -0
  161. package/dist/interfaces/logger.js +7 -0
  162. package/dist/interfaces/logger.js.map +1 -0
  163. package/dist/lib/bitcoin/deposit-watcher.d.ts +66 -0
  164. package/dist/lib/bitcoin/deposit-watcher.d.ts.map +1 -0
  165. package/dist/lib/bitcoin/deposit-watcher.js +218 -0
  166. package/dist/lib/bitcoin/deposit-watcher.js.map +1 -0
  167. package/dist/lib/bitcoin/script-hash.d.ts +8 -0
  168. package/dist/lib/bitcoin/script-hash.d.ts.map +1 -0
  169. package/dist/lib/bitcoin/script-hash.js +29 -0
  170. package/dist/lib/bitcoin/script-hash.js.map +1 -0
  171. package/dist/lib/bitcoin/sweep.d.ts +56 -0
  172. package/dist/lib/bitcoin/sweep.d.ts.map +1 -0
  173. package/dist/lib/bitcoin/sweep.js +185 -0
  174. package/dist/lib/bitcoin/sweep.js.map +1 -0
  175. package/dist/lib/bitcoin/tx-verify.d.ts +43 -0
  176. package/dist/lib/bitcoin/tx-verify.d.ts.map +1 -0
  177. package/dist/lib/bitcoin/tx-verify.js +202 -0
  178. package/dist/lib/bitcoin/tx-verify.js.map +1 -0
  179. package/dist/lib/bitcoin/wallet.d.ts +71 -0
  180. package/dist/lib/bitcoin/wallet.d.ts.map +1 -0
  181. package/dist/lib/bitcoin/wallet.js +141 -0
  182. package/dist/lib/bitcoin/wallet.js.map +1 -0
  183. package/dist/lib/crypto/bytes.d.ts +21 -0
  184. package/dist/lib/crypto/bytes.d.ts.map +1 -0
  185. package/dist/lib/crypto/bytes.js +39 -0
  186. package/dist/lib/crypto/bytes.js.map +1 -0
  187. package/dist/lib/crypto/errors.d.ts +12 -0
  188. package/dist/lib/crypto/errors.d.ts.map +1 -0
  189. package/dist/lib/crypto/errors.js +16 -0
  190. package/dist/lib/crypto/errors.js.map +1 -0
  191. package/dist/lib/crypto/keygen.d.ts +19 -0
  192. package/dist/lib/crypto/keygen.d.ts.map +1 -0
  193. package/dist/lib/crypto/keygen.js +24 -0
  194. package/dist/lib/crypto/keygen.js.map +1 -0
  195. package/dist/lib/crypto/libp2p-identity.d.ts +25 -0
  196. package/dist/lib/crypto/libp2p-identity.d.ts.map +1 -0
  197. package/dist/lib/crypto/libp2p-identity.js +80 -0
  198. package/dist/lib/crypto/libp2p-identity.js.map +1 -0
  199. package/dist/lib/crypto/mnemonic.d.ts +28 -0
  200. package/dist/lib/crypto/mnemonic.d.ts.map +1 -0
  201. package/dist/lib/crypto/mnemonic.js +97 -0
  202. package/dist/lib/crypto/mnemonic.js.map +1 -0
  203. package/dist/lib/crypto/platform.d.ts +10 -0
  204. package/dist/lib/crypto/platform.d.ts.map +1 -0
  205. package/dist/lib/crypto/platform.js +38 -0
  206. package/dist/lib/crypto/platform.js.map +1 -0
  207. package/dist/lib/crypto/scalars.d.ts +33 -0
  208. package/dist/lib/crypto/scalars.d.ts.map +1 -0
  209. package/dist/lib/crypto/scalars.js +81 -0
  210. package/dist/lib/crypto/scalars.js.map +1 -0
  211. package/dist/lib/crypto/types.d.ts +24 -0
  212. package/dist/lib/crypto/types.d.ts.map +1 -0
  213. package/dist/lib/crypto/types.js +2 -0
  214. package/dist/lib/crypto/types.js.map +1 -0
  215. package/dist/lib/crypto/wasm.d.ts +51 -0
  216. package/dist/lib/crypto/wasm.d.ts.map +1 -0
  217. package/dist/lib/crypto/wasm.js +192 -0
  218. package/dist/lib/crypto/wasm.js.map +1 -0
  219. package/dist/lib/default-config.d.ts +140 -0
  220. package/dist/lib/default-config.d.ts.map +1 -0
  221. package/dist/lib/default-config.js +239 -0
  222. package/dist/lib/default-config.js.map +1 -0
  223. package/dist/lib/delay.d.ts +6 -0
  224. package/dist/lib/delay.d.ts.map +1 -0
  225. package/dist/lib/delay.js +20 -0
  226. package/dist/lib/delay.js.map +1 -0
  227. package/dist/lib/errors.d.ts +90 -0
  228. package/dist/lib/errors.d.ts.map +1 -0
  229. package/dist/lib/errors.js +129 -0
  230. package/dist/lib/errors.js.map +1 -0
  231. package/dist/lib/format.d.ts +7 -0
  232. package/dist/lib/format.d.ts.map +1 -0
  233. package/dist/lib/format.js +43 -0
  234. package/dist/lib/format.js.map +1 -0
  235. package/dist/lib/keystore.d.ts +85 -0
  236. package/dist/lib/keystore.d.ts.map +1 -0
  237. package/dist/lib/keystore.js +105 -0
  238. package/dist/lib/keystore.js.map +1 -0
  239. package/dist/lib/monero/output-scanner.d.ts +53 -0
  240. package/dist/lib/monero/output-scanner.d.ts.map +1 -0
  241. package/dist/lib/monero/output-scanner.js +180 -0
  242. package/dist/lib/monero/output-scanner.js.map +1 -0
  243. package/dist/lib/monero/rpc.d.ts +131 -0
  244. package/dist/lib/monero/rpc.d.ts.map +1 -0
  245. package/dist/lib/monero/rpc.js +267 -0
  246. package/dist/lib/monero/rpc.js.map +1 -0
  247. package/dist/lib/monero/verify-lock.d.ts +50 -0
  248. package/dist/lib/monero/verify-lock.d.ts.map +1 -0
  249. package/dist/lib/monero/verify-lock.js +161 -0
  250. package/dist/lib/monero/verify-lock.js.map +1 -0
  251. package/dist/lib/monero/verify-sweep.d.ts +59 -0
  252. package/dist/lib/monero/verify-sweep.d.ts.map +1 -0
  253. package/dist/lib/monero/verify-sweep.js +82 -0
  254. package/dist/lib/monero/verify-sweep.js.map +1 -0
  255. package/dist/lib/monero/wasm.d.ts +19 -0
  256. package/dist/lib/monero/wasm.d.ts.map +1 -0
  257. package/dist/lib/monero/wasm.js +24 -0
  258. package/dist/lib/monero/wasm.js.map +1 -0
  259. package/dist/lib/pow-solver.d.ts +4 -0
  260. package/dist/lib/pow-solver.d.ts.map +1 -0
  261. package/dist/lib/pow-solver.js +37 -0
  262. package/dist/lib/pow-solver.js.map +1 -0
  263. package/dist/lib/retry.d.ts +86 -0
  264. package/dist/lib/retry.d.ts.map +1 -0
  265. package/dist/lib/retry.js +104 -0
  266. package/dist/lib/retry.js.map +1 -0
  267. package/dist/portable.d.ts +23 -0
  268. package/dist/portable.d.ts.map +1 -0
  269. package/dist/portable.js +13 -0
  270. package/dist/portable.js.map +1 -0
  271. package/dist/quote-binding.d.ts +31 -0
  272. package/dist/quote-binding.d.ts.map +1 -0
  273. package/dist/quote-binding.js +40 -0
  274. package/dist/quote-binding.js.map +1 -0
  275. package/dist/swap-executor.d.ts +51 -0
  276. package/dist/swap-executor.d.ts.map +1 -0
  277. package/dist/swap-executor.js +138 -0
  278. package/dist/swap-executor.js.map +1 -0
  279. package/dist/types/api.d.ts +34 -0
  280. package/dist/types/api.d.ts.map +1 -0
  281. package/dist/types/api.js +18 -0
  282. package/dist/types/api.js.map +1 -0
  283. package/dist/types/errors.d.ts +94 -0
  284. package/dist/types/errors.d.ts.map +1 -0
  285. package/dist/types/errors.js +93 -0
  286. package/dist/types/errors.js.map +1 -0
  287. package/dist/types/index.d.ts +8 -0
  288. package/dist/types/index.d.ts.map +1 -0
  289. package/dist/types/index.js +10 -0
  290. package/dist/types/index.js.map +1 -0
  291. package/dist/types/keys.d.ts +33 -0
  292. package/dist/types/keys.d.ts.map +1 -0
  293. package/dist/types/keys.js +2 -0
  294. package/dist/types/keys.js.map +1 -0
  295. package/dist/types/protocol.d.ts +93 -0
  296. package/dist/types/protocol.d.ts.map +1 -0
  297. package/dist/types/protocol.js +18 -0
  298. package/dist/types/protocol.js.map +1 -0
  299. package/dist/types/status.d.ts +3 -0
  300. package/dist/types/status.d.ts.map +1 -0
  301. package/dist/types/status.js +23 -0
  302. package/dist/types/status.js.map +1 -0
  303. package/dist/types/verification.d.ts +49 -0
  304. package/dist/types/verification.d.ts.map +1 -0
  305. package/dist/types/verification.js +34 -0
  306. package/dist/types/verification.js.map +1 -0
  307. package/dist/verification/atomic-swap.d.ts +9 -0
  308. package/dist/verification/atomic-swap.d.ts.map +1 -0
  309. package/dist/verification/atomic-swap.js +22 -0
  310. package/dist/verification/atomic-swap.js.map +1 -0
  311. package/dist/verification/chainflip-networks.d.ts +46 -0
  312. package/dist/verification/chainflip-networks.d.ts.map +1 -0
  313. package/dist/verification/chainflip-networks.js +24 -0
  314. package/dist/verification/chainflip-networks.js.map +1 -0
  315. package/dist/verification/chainflip.d.ts +61 -0
  316. package/dist/verification/chainflip.d.ts.map +1 -0
  317. package/dist/verification/chainflip.js +377 -0
  318. package/dist/verification/chainflip.js.map +1 -0
  319. package/dist/verification/constants.d.ts +52 -0
  320. package/dist/verification/constants.d.ts.map +1 -0
  321. package/dist/verification/constants.js +54 -0
  322. package/dist/verification/constants.js.map +1 -0
  323. package/dist/verification/index.d.ts +71 -0
  324. package/dist/verification/index.d.ts.map +1 -0
  325. package/dist/verification/index.js +91 -0
  326. package/dist/verification/index.js.map +1 -0
  327. package/dist/verification/memo.d.ts +27 -0
  328. package/dist/verification/memo.d.ts.map +1 -0
  329. package/dist/verification/memo.js +52 -0
  330. package/dist/verification/memo.js.map +1 -0
  331. package/dist/verification/near-intents.d.ts +91 -0
  332. package/dist/verification/near-intents.d.ts.map +1 -0
  333. package/dist/verification/near-intents.js +213 -0
  334. package/dist/verification/near-intents.js.map +1 -0
  335. package/dist/verification/rate-oracle.d.ts +32 -0
  336. package/dist/verification/rate-oracle.d.ts.map +1 -0
  337. package/dist/verification/rate-oracle.js +43 -0
  338. package/dist/verification/rate-oracle.js.map +1 -0
  339. package/dist/verification/shared.d.ts +20 -0
  340. package/dist/verification/shared.d.ts.map +1 -0
  341. package/dist/verification/shared.js +25 -0
  342. package/dist/verification/shared.js.map +1 -0
  343. package/dist/verification/thorchain-networks.d.ts +35 -0
  344. package/dist/verification/thorchain-networks.d.ts.map +1 -0
  345. package/dist/verification/thorchain-networks.js +35 -0
  346. package/dist/verification/thorchain-networks.js.map +1 -0
  347. package/dist/verification/thorchain.d.ts +55 -0
  348. package/dist/verification/thorchain.d.ts.map +1 -0
  349. package/dist/verification/thorchain.js +232 -0
  350. package/dist/verification/thorchain.js.map +1 -0
  351. package/dist/wasm-pins.d.ts +4 -0
  352. package/dist/wasm-pins.d.ts.map +1 -0
  353. package/dist/wasm-pins.js +6 -0
  354. package/dist/wasm-pins.js.map +1 -0
  355. package/dist/wire/chainflip.zod.d.ts +144 -0
  356. package/dist/wire/chainflip.zod.d.ts.map +1 -0
  357. package/dist/wire/chainflip.zod.js +33 -0
  358. package/dist/wire/chainflip.zod.js.map +1 -0
  359. package/dist/wire/near-intents.zod.d.ts +376 -0
  360. package/dist/wire/near-intents.zod.d.ts.map +1 -0
  361. package/dist/wire/near-intents.zod.js +101 -0
  362. package/dist/wire/near-intents.zod.js.map +1 -0
  363. package/dist/wire/server/action.zod.d.ts +1119 -0
  364. package/dist/wire/server/action.zod.d.ts.map +1 -0
  365. package/dist/wire/server/action.zod.js +173 -0
  366. package/dist/wire/server/action.zod.js.map +1 -0
  367. package/dist/wire/server/common.zod.d.ts +62 -0
  368. package/dist/wire/server/common.zod.d.ts.map +1 -0
  369. package/dist/wire/server/common.zod.js +43 -0
  370. package/dist/wire/server/common.zod.js.map +1 -0
  371. package/dist/wire/server/index.d.ts +8 -0
  372. package/dist/wire/server/index.d.ts.map +1 -0
  373. package/dist/wire/server/index.js +8 -0
  374. package/dist/wire/server/index.js.map +1 -0
  375. package/dist/wire/server/pow.zod.d.ts +45 -0
  376. package/dist/wire/server/pow.zod.d.ts.map +1 -0
  377. package/dist/wire/server/pow.zod.js +18 -0
  378. package/dist/wire/server/pow.zod.js.map +1 -0
  379. package/dist/wire/server/quotes.zod.d.ts +694 -0
  380. package/dist/wire/server/quotes.zod.d.ts.map +1 -0
  381. package/dist/wire/server/quotes.zod.js +103 -0
  382. package/dist/wire/server/quotes.zod.js.map +1 -0
  383. package/dist/wire/server/swap.zod.d.ts +1981 -0
  384. package/dist/wire/server/swap.zod.d.ts.map +1 -0
  385. package/dist/wire/server/swap.zod.js +270 -0
  386. package/dist/wire/server/swap.zod.js.map +1 -0
  387. package/dist/wire/server/tokens.zod.d.ts +93 -0
  388. package/dist/wire/server/tokens.zod.d.ts.map +1 -0
  389. package/dist/wire/server/tokens.zod.js +28 -0
  390. package/dist/wire/server/tokens.zod.js.map +1 -0
  391. package/dist/wire/server/verify.zod.d.ts +30 -0
  392. package/dist/wire/server/verify.zod.d.ts.map +1 -0
  393. package/dist/wire/server/verify.zod.js +12 -0
  394. package/dist/wire/server/verify.zod.js.map +1 -0
  395. package/dist/wire/thorchain.zod.d.ts +224 -0
  396. package/dist/wire/thorchain.zod.d.ts.map +1 -0
  397. package/dist/wire/thorchain.zod.js +51 -0
  398. package/dist/wire/thorchain.zod.js.map +1 -0
  399. package/package.json +128 -0
  400. package/wasm/miradex-rust/README.md +74 -0
  401. package/wasm/miradex-rust/miradex_rust.d.ts +149 -0
  402. package/wasm/miradex-rust/miradex_rust.js +943 -0
  403. package/wasm/miradex-rust/miradex_rust_bg.wasm +0 -0
  404. package/wasm/miradex-rust/miradex_rust_bg.wasm.d.ts +31 -0
  405. package/wasm/miradex-rust/package.json +24 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 MiraDex
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,405 @@
1
+ # @miradex/client
2
+
3
+ Headless TypeScript SDK for cross-chain swaps. Runs entirely in your
4
+ process — browser, Node.js — and does the
5
+ security-critical work itself: key generation, signing, deposit
6
+ verification, adaptor-signature handling, on-chain state recovery,
7
+ and the BTC↔XMR atomic-swap drive loop. The server proposes state;
8
+ the SDK verifies every claim against an independent on-chain source.
9
+ A compromised server cannot move user funds.
10
+
11
+ ## Providers
12
+
13
+ | Provider | Pairs | Settlement model |
14
+ | --- | --- | --- |
15
+ | `atomicswap` | BTC ↔ XMR | Cryptographic atomic swap (HTLC + adaptor signatures) |
16
+ | `thorchain` | 13 native gas assets (BTC, ETH, BSC, AVAX, …) | THORChain TSS-managed vaults |
17
+ | `chainflip` | BTC, ETH, ARB, DOT, SOL — multiple assets | Chainflip state-chain deposit channels |
18
+ | `near_intents` | 16 chains | Solver-pulled intent settlement (Defuse 1Click) |
19
+
20
+ `atomicswap` is the only provider that is non-custodial in the strict
21
+ cryptographic sense — funds are never under any third-party control
22
+ at any step. The other three move funds through validator-managed
23
+ vaults or solver escrows; the SDK still verifies every state claim
24
+ against the upstream's own infrastructure, but the atomic-swap
25
+ protocol's trust model is qualitatively different and is documented
26
+ separately in
27
+ [`ATOMIC-SWAP-PAPER.md`](./ATOMIC-SWAP-PAPER.md).
28
+ Per-provider trust analysis is in [`PROTOCOLS.md`](./PROTOCOLS.md).
29
+
30
+ ---
31
+
32
+ ## Table of contents
33
+
34
+ - [@miradex/client](#miradexclient)
35
+ - [Providers](#providers)
36
+ - [Table of contents](#table-of-contents)
37
+ - [Quick start](#quick-start)
38
+ - [Providers](#providers-1)
39
+ - [`atomicswap`](#atomicswap)
40
+ - [`thorchain`](#thorchain)
41
+ - [`chainflip`](#chainflip)
42
+ - [`near_intents`](#near_intents)
43
+ - [The SDK surface](#the-sdk-surface)
44
+ - [Sub-path exports](#sub-path-exports)
45
+ - [`PlatformAdapter`](#platformadapter)
46
+ - [Direct entry points](#direct-entry-points)
47
+ - [Events](#events)
48
+ - [Security model](#security-model)
49
+ - [Configuration](#configuration)
50
+ - [`EngineConfig`](#engineconfig)
51
+ - [Errors](#errors)
52
+ - [Build](#build)
53
+ - [Building from source](#building-from-source)
54
+ - [License](#license)
55
+
56
+ ---
57
+
58
+ ## Quick start
59
+
60
+ ```bash
61
+ pnpm add @miradex/client
62
+ # or
63
+ npm install @miradex/client
64
+ ```
65
+
66
+ ```ts
67
+ import { MiradexEngine, type PlatformAdapter } from '@miradex/client';
68
+
69
+ const platform: PlatformAdapter = /* see §PlatformAdapter */;
70
+
71
+ const engine = new MiradexEngine(
72
+ {
73
+ apiUrl: 'https://api.miradex.io/',
74
+ network: 'mainnet',
75
+ slippageBps: 300,
76
+ },
77
+ platform,
78
+ );
79
+
80
+ engine.on('state', (s) => {
81
+ console.log(s.activeFlow?.kind, s.activeFlow?.snapshot.phase);
82
+ });
83
+
84
+ // BTC ↔ XMR (atomicswap)
85
+ await engine.startAtomicSwap({
86
+ amount: '0.01',
87
+ destAddress: '8...',
88
+ refundAddress: 'bc1q...',
89
+ });
90
+
91
+ // Anything else (thorchain, chainflip, near_intents)
92
+ const { quotes } = await engine.apiClient.getQuotes({
93
+ from: 'BTC',
94
+ to: 'ETH',
95
+ amount: '0.01',
96
+ });
97
+ await engine.startSwap({
98
+ fromToken: 'BTC',
99
+ fromChain: 'bitcoin',
100
+ toToken: 'ETH',
101
+ toChain: 'ethereum',
102
+ amount: '0.01',
103
+ destAddress: '0x...',
104
+ refundAddress: 'bc1q...',
105
+ selectedQuote: quotes[0],
106
+ });
107
+ ```
108
+
109
+ The engine takes care of quoting via the server, generating
110
+ client-side keys and persisting the keystore (atomic-swap only),
111
+ driving the swap state machine with verification at every step, and
112
+ emitting `EngineEvents` so a UI can render progress.
113
+
114
+ The full per-provider drive — every protocol step, every
115
+ verification, every error — lives in
116
+ [`PROTOCOLS.md`](./PROTOCOLS.md). The BTC↔XMR atomic-swap protocol gets
117
+ its own attack-by-attack analysis in
118
+ [`ATOMIC-SWAP-PAPER.md`](./ATOMIC-SWAP-PAPER.md).
119
+
120
+ ---
121
+
122
+ ## Providers
123
+
124
+ ### `atomicswap`
125
+
126
+ BTC ↔ XMR via the eigenwallet-style two-curve atomic-swap protocol.
127
+ The only provider that is non-custodial in the strict cryptographic
128
+ sense: BTC is locked into a 2-of-2 P2WSH
129
+ (`<A> CHECKSIGVERIFY <B> CHECKSIG`) before XMR is locked, and the
130
+ adaptor-signature construction binds Alice's BTC redemption to
131
+ revealing the Monero scalar Bob needs to derive the joint Monero
132
+ spend key. Refund and punish paths are timelocked Bitcoin script;
133
+ liveness past the cancel window is the only operational requirement
134
+ on Bob.
135
+
136
+ The SDK independently:
137
+
138
+ - Verifies Alice's DLEQ proof in WASM before any BTC is broadcast.
139
+ - Derives the lock address locally from `(A, B)` and rejects any
140
+ server-supplied address that does not match.
141
+ - Recomputes the BIP143 sighash for `TxRedeem` and constant-time
142
+ compares it against the server's claim before adaptor-signing.
143
+ - Fetches the XMR lock tx from a quorum of monerod nodes, re-derives
144
+ the joint output key, and rejects `unlock_time != 0`.
145
+ - Verifies the recovered `s_a` satisfies `s_a · G == S_a_monero`
146
+ before sweeping.
147
+ - Bounds-checks every BIP68 sequence, every fee, and the amnesty
148
+ amount against the configured policy.
149
+ - Refuses to broadcast `TxLock` without first persisting a recovery
150
+ snapshot.
151
+
152
+ If anything goes wrong the SDK can refund autonomously without the
153
+ server: `verifyTxCancel` reads `TxCancel` from Electrum, decrypts
154
+ Alice's `tx_full_refund_encsig` with `s_b`, signs with `b`, and
155
+ broadcasts.
156
+
157
+ ### `thorchain`
158
+
159
+ 13 native gas assets (BTC, ETH, BSC, AVAX, …) via THORChain's Asgard
160
+ threshold-signature vaults. The user deposits the source asset to a
161
+ vault address; THORChain's validator set synthesises the destination
162
+ asset from its liquidity pools and broadcasts an outbound tx to the
163
+ destination address. Failed trades auto-refund to the inbound
164
+ sender.
165
+
166
+ The SDK independently:
167
+
168
+ - Reads the active vault list from THORNode and Midgard directly
169
+ (hardcoded URLs per network in
170
+ [`thorchain-networks.ts`](./src/verification/thorchain-networks.ts)
171
+ — the server cannot redirect verification to its own nodes).
172
+ - Confirms the deposit address is an active vault.
173
+ - Parses the registered memo and confirms it binds to the user's
174
+ destination address.
175
+
176
+ ### `chainflip`
177
+
178
+ BTC, ETH, ARB, DOT, SOL via Chainflip's per-swap deposit channels.
179
+ Each trade gets a unique deposit address with an explicit
180
+ destination + refund-address binding committed at channel creation.
181
+ The validator set executes the swap and sends the output to the
182
+ bound destination; failures or expiries auto-refund.
183
+
184
+ The SDK independently:
185
+
186
+ - Reads the channel from the Chainflip broker REST or state-chain
187
+ JSON-RPC (hardcoded broker endpoints per network).
188
+ - Confirms the channel's destination and refund addresses match
189
+ what the user supplied.
190
+ - Confirms the source/destination chains match the requested swap.
191
+
192
+ ### `near_intents`
193
+
194
+ 16 chains (TRON, TON, XRP, Optimism, Doge, BCH, …) via Defuse 1Click.
195
+ The 1Click backend returns a per-quote deposit address; a solver
196
+ fronts the destination asset on the destination chain and claims the
197
+ deposit on the source chain after settlement. 1Click auto-refunds to
198
+ `refundTo` if the deposit lands after deadline or no solver bids.
199
+
200
+ The SDK independently:
201
+
202
+ - Reads the intent status from 1Click directly and confirms it is
203
+ registered.
204
+ - Confirms the deposit address is the one 1Click expects.
205
+ - Surfaces 1Click's terminal status (`SUCCESS` / `FAILED`) verbatim.
206
+
207
+ ---
208
+
209
+ ## The SDK surface
210
+
211
+ ### Sub-path exports
212
+
213
+ For consumers that want only part of the SDK:
214
+
215
+ | Sub-path | Contents | When to use |
216
+ | --- | --- | --- |
217
+ | `@miradex/client` | The full SDK (`MiradexEngine`, all flows, all verifiers) | Default |
218
+ | `@miradex/client/portable` | Browser/RN-safe subset; no Node built-ins | Bundlers that fail on Node imports |
219
+ | `@miradex/client/api` | `ApiClient` transport only | Building your own UI without the engine |
220
+ | `@miradex/client/atomic-swap` | BTC↔XMR protocol surface (`runAtomicSwap`, `resumeAtomicSwap`, `submitEncsigWhenReady`) | Standalone atomic-swap consumer |
221
+ | `@miradex/client/atomic-swap/presign` | Pre-sig computation, redeem-digest recompute, `deriveLockAddress` | Independent verification & recovery binaries |
222
+ | `@miradex/client/atomic-swap/refund` | TxFullRefund / TxPartialRefund builders + signer | Standalone refund / recovery tools |
223
+ | `@miradex/client/atomic-swap/monero-sweep` | Monero sweep pipeline | Standalone sweep tool, e.g. for cooperative-redeem |
224
+ | `@miradex/client/verification` | Umbrella for all provider verifiers + helpers | Verify-only consumers (audit logs, watchtowers) |
225
+ | `@miradex/client/verification/{thorchain,chainflip,near-intents}` | Per-provider verifier | Light-touch integration |
226
+ | `@miradex/client/lib/bitcoin/tx-verify` | TxCancel independent verifier | Refund tools |
227
+ | `@miradex/client/lib/monero/verify-lock` | XMR lock independent verifier | Auditing, watchtowers |
228
+
229
+ ### `PlatformAdapter`
230
+
231
+ The engine is decoupled from platform I/O via a `PlatformAdapter`
232
+ interface ([`src/engine/platform.ts`](./src/engine/platform.ts)).
233
+ You implement it once for your environment; the engine consumes it.
234
+
235
+ Required methods:
236
+
237
+ - `watchDeposit(address, network, signal, onStatus?)` /
238
+ `checkDeposit(address, network)` / `fetchUtxo(address, network)` —
239
+ Bitcoin deposit detection.
240
+ - `saveKeystore(keystore, label)` / `loadKeystore(id)` /
241
+ `listKeystores()` / `deleteKeystore(id)` — keystore persistence.
242
+ - `estimateFee(network)` — fee-rate query.
243
+ - `broadcastTx(rawHex, network)` — Bitcoin broadcast.
244
+ - `createBlockchainQuerier(network)` /
245
+ `createBlockchainProvider(network)` — Electrum-equivalent on Node,
246
+ mempool.space-equivalent in browsers.
247
+ - `generateQr(text)` — QR rendering for deposit addresses.
248
+ - `logger: Logger` — structured logger.
249
+
250
+ Optional methods (recovery + cache):
251
+
252
+ - `saveSwapProtocol(swapId, params)` / `loadSwapProtocol(swapId)` —
253
+ write-through cache of public per-swap params.
254
+ - `saveProtocolSnapshot(swapId, json)` /
255
+ `loadProtocolSnapshot(swapId)` — one-shot recovery snapshot
256
+ written between `/presigs` and `/fund`.
257
+
258
+ Reference implementations:
259
+
260
+ - **Browser:** the miradex-web adapter
261
+ ([`miradex-web/lib/miradex-web/browser-adapter.ts`](https://github.com/miradexio/miradex-web/blob/main/lib/miradex-web/browser-adapter.ts))
262
+ — uses `idb` for IndexedDB, mempool.space + electrs CORS endpoints
263
+ for Bitcoin queries, `qrcode.react` for QR, browser file download
264
+ for keystore export.
265
+ - **Node / Electron:** — SQLite + Electrum + filesystem keystore.
266
+
267
+ ### Direct entry points
268
+
269
+ If you do not want the engine, drive flows directly:
270
+
271
+ ```ts
272
+ import { runAtomicSwap, SwapExecutor } from '@miradex/client';
273
+
274
+ // Atomic swap, low-level:
275
+ await runAtomicSwap({
276
+ api: apiClient,
277
+ params: { amount: '0.01', destAddress: '8...', refundAddress: 'bc1q...', network: 'mainnet' },
278
+ callbacks: { onProgress, onDepositRequired, saveKeystore, loadKeystore },
279
+ signal: abortController.signal,
280
+ });
281
+
282
+ // Routed swap, low-level:
283
+ const executor = new SwapExecutor(apiClient);
284
+ const result = await executor.executeSwap({
285
+ from: 'BTC', to: 'ETH', amount: '0.01',
286
+ destAddress: '0x...', refundAddress: 'bc1q...',
287
+ provider: 'thorchain',
288
+ });
289
+ ```
290
+
291
+ Cancellation: pass an `AbortController.signal` and call `.abort()`.
292
+ The flow throws `SwapCancelledError`. The keystore (and any partial
293
+ on-chain progress) survives.
294
+
295
+ ### Events
296
+
297
+ `MiradexEngine extends EventEmitter`; useful events are:
298
+
299
+ - `state` — fires whenever the engine's `EngineState` changes.
300
+ - `flow:progress` — fires when an active flow's pipeline phase
301
+ changes.
302
+ - `flow:complete` / `flow:error` — terminal-state notifications.
303
+
304
+ See [`src/engine/miradex-engine.ts`](./src/engine/miradex-engine.ts).
305
+
306
+ ---
307
+
308
+ ## Security model
309
+
310
+ The SDK does not trust the server beyond reachability and HTTPS message
311
+ integrity: every state claim is verified against an independent
312
+ source — Electrum quorum for Bitcoin, monerod RPC quorum for Monero,
313
+ THORNode + Midgard for THORChain, the Chainflip broker for
314
+ Chainflip, the 1Click backend for NEAR Intents. The full
315
+ attack-by-attack analysis for the BTC↔XMR atomic swap is in
316
+ [`ATOMIC-SWAP-PAPER.md`](./ATOMIC-SWAP-PAPER.md).
317
+
318
+ ---
319
+
320
+ ## Configuration
321
+
322
+ ### `EngineConfig`
323
+
324
+ The first argument to `new MiradexEngine`:
325
+
326
+ | Field | Type | Default | Notes |
327
+ | --- | --- | --- | --- |
328
+ | `apiUrl` | `string` | required | Base URL of the server |
329
+ | `network` | `'mainnet' \| 'testnet' \| 'regtest'` | `'mainnet'` | |
330
+ | `slippageBps` | `number` | `100` (1.00%) | Bounded `[10, 500]` on mainnet/testnet, `[10, 10000]` on regtest. Out-of-range throws `E_SLIPPAGE_OUT_OF_RANGE` |
331
+ | `apiTimeout` | `number` | `60_000` ms | Per-request timeout |
332
+ | `apiMaxRetries` | `number` | `3` | Bounded retry count |
333
+ | `monerodNodes` | `readonly string[]` | network default | Quorum verifier requires ≥ 2 of N to agree |
334
+ | `fetchFn` | `typeof fetch` | `globalThis.fetch` | Override for Tor-proxied fetch |
335
+
336
+ Sources of network defaults:
337
+
338
+ - Bitcoin Electrum servers in
339
+ [`src/lib/default-config.ts`](./src/lib/default-config.ts) (use
340
+ `ELECTRUM_SERVERS` / `electrumUrlForNetwork`).
341
+ - Monero RPC nodes — `MONERO_MAINNET_NODES` / `MONERO_STAGENET_NODES`
342
+ re-exported from `@miradex/client`.
343
+
344
+ ---
345
+
346
+ ## Errors
347
+
348
+ Every verification and protocol error carries a stable `code` string.
349
+ Handle them by code, not by message text — the messages may change
350
+ between releases. Codes are exported from `@miradex/client` as
351
+ `ERROR_CODES`.
352
+
353
+ ```ts
354
+ import { VerificationError, ProtocolError } from '@miradex/client';
355
+
356
+ try {
357
+ await engine.startAtomicSwap(params);
358
+ } catch (err) {
359
+ if (err instanceof VerificationError && err.code === 'E_LOCK_ADDR_MISMATCH') {
360
+ // Server tried to make us fund an attacker-controlled address.
361
+ }
362
+ }
363
+ ```
364
+
365
+ Selected codes (full list in the technical paper appendix):
366
+
367
+ | Code | Cause |
368
+ | --- | --- |
369
+ | `E_LOCK_ADDR_MISMATCH` | Locally-derived P2WSH ≠ server's claim — refusing to fund |
370
+ | `E_DLEQ_PROOF_INVALID` | Alice's DLEQ proof failed verification |
371
+ | `E_DLEQ_PROOF_REQUIRED` | Alice provided keys without a DLEQ proof |
372
+ | `E_REDEEM_DIGEST_MISMATCH` | Locally-recomputed redeem digest ≠ server's claim — refusing encsig |
373
+ | `E_XMR_LOCK_FAILED` | XMR lock did not verify against quorum |
374
+ | `E_S_A_MISMATCH` | `s_a` returned by server does not satisfy `s_a · G == S_a_monero` |
375
+ | `E_S_A_MONERO_MISSING` | `S_a_monero` absent — refusing to release encsig |
376
+ | `E_TIMELOCK_OUT_OF_RANGE` | A BIP68 sequence was outside accepted range |
377
+ | `E_FEE_BELOW_RELAY` / `E_FEE_ABOVE_CAP` | Fee outside policy band |
378
+ | `E_AMNESTY_EXCEEDS_CAP` | Amnesty amount exceeded the configured ratio of lock |
379
+ | `E_SNAPSHOT_WRITE_FAILED` | Refusing to broadcast TxLock without persisting recovery snapshot first |
380
+ | `E_PRESIGS_WEDGED` | Server repeatedly rejected `/presigs` — swap is wedged, fail to surface restart UI |
381
+ | `E_THORCHAIN_VAULT_MISMATCH` | Deposit address not in active THORChain vaults |
382
+ | `E_CHAINFLIP_CHANNEL_MISBINDING` | Chainflip channel binding does not match user's expected destination |
383
+ | `E_NEAR_INTENT_NOT_REGISTERED` | Deposit address unknown to 1Click (HTTP 404) |
384
+ | `E_NEAR_INTENT_FAILED` | 1Click reports `FAILED` |
385
+ | `E_RATE_DRIFT` | Engine's expected output drifted from the accepted quote beyond `slippageBps` |
386
+ | `E_SLIPPAGE_OUT_OF_RANGE` | `slippageBps` outside the network's allowed band |
387
+
388
+ ---
389
+
390
+ ## Build
391
+
392
+ ### Building from source
393
+
394
+ ```bash
395
+ pnpm install
396
+ pnpm -F @miradex/client build # tsc → dist/
397
+ pnpm -F @miradex/client typecheck
398
+ pnpm -F @miradex/client test
399
+ ```
400
+
401
+ ---
402
+
403
+ ## License
404
+
405
+ MIT. See [LICENSE](./LICENSE).
@@ -0,0 +1,9 @@
1
+ export declare function validateBase58Check(address: string, expectedVersions: readonly number[]): {
2
+ valid: boolean;
3
+ reason?: string;
4
+ };
5
+ export declare function validateXrpAddress(address: string): {
6
+ valid: boolean;
7
+ reason?: string;
8
+ };
9
+ //# sourceMappingURL=base58.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base58.d.ts","sourceRoot":"","sources":["../../src/address/base58.ts"],"names":[],"mappings":"AAKA,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,EACf,gBAAgB,EAAE,SAAS,MAAM,EAAE,GAClC;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAcrC;AAKD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAavF"}
@@ -0,0 +1,33 @@
1
+ import { base58check as b58c } from '@scure/base';
2
+ import { sha256 } from '@noble/hashes/sha2.js';
3
+ const bs58check = b58c(sha256);
4
+ export function validateBase58Check(address, expectedVersions) {
5
+ try {
6
+ const decoded = bs58check.decode(address);
7
+ if (decoded.length < 2)
8
+ return { valid: false, reason: 'Too short' };
9
+ const version = decoded[0];
10
+ if (!expectedVersions.includes(version)) {
11
+ return { valid: false, reason: `Invalid version byte: 0x${version.toString(16)}` };
12
+ }
13
+ return { valid: true };
14
+ }
15
+ catch {
16
+ return { valid: false, reason: 'Invalid base58check encoding' };
17
+ }
18
+ }
19
+ // XRP uses a different base58 alphabet
20
+ const XRP_ALPHABET = 'rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz';
21
+ export function validateXrpAddress(address) {
22
+ if (!address.startsWith('r') || address.length < 25 || address.length > 35) {
23
+ return { valid: false, reason: 'XRP address must start with r and be 25-35 chars' };
24
+ }
25
+ // Validate characters are in XRP alphabet
26
+ for (const c of address) {
27
+ if (!XRP_ALPHABET.includes(c)) {
28
+ return { valid: false, reason: `Invalid character '${c}' in XRP address` };
29
+ }
30
+ }
31
+ return { valid: true };
32
+ }
33
+ //# sourceMappingURL=base58.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base58.js","sourceRoot":"","sources":["../../src/address/base58.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,IAAI,IAAI,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE/C,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;AAE/B,MAAM,UAAU,mBAAmB,CACjC,OAAe,EACf,gBAAmC;IAEnC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC1C,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;QAErE,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,CAAE,CAAC;QAC5B,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YACxC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,2BAA2B,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACrF,CAAC;QAED,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,8BAA8B,EAAE,CAAC;IAClE,CAAC;AACH,CAAC;AAED,uCAAuC;AACvC,MAAM,YAAY,GAAG,4DAA4D,CAAC;AAElF,MAAM,UAAU,kBAAkB,CAAC,OAAe;IAChD,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,EAAE,IAAI,OAAO,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QAC3E,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,kDAAkD,EAAE,CAAC;IACtF,CAAC;IAED,0CAA0C;IAC1C,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9B,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,sBAAsB,CAAC,kBAAkB,EAAE,CAAC;QAC7E,CAAC;IACH,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACzB,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Validate a bech32/bech32m address.
3
+ *
4
+ * For segwit addresses (BTC bc1, LTC ltc1), the first word is the witness
5
+ * version and is skipped before fromWords conversion.
6
+ *
7
+ * For non-segwit bech32 (Cosmos, THORChain), all words are data.
8
+ */
9
+ export declare function validateBech32(address: string, expectedHrp: string, minDataLen?: number, maxDataLen?: number): {
10
+ valid: boolean;
11
+ reason?: string;
12
+ };
13
+ //# sourceMappingURL=bech32.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bech32.d.ts","sourceRoot":"","sources":["../../src/address/bech32.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,UAAU,SAAK,EACf,UAAU,SAAK,GACd;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAiCrC"}
@@ -0,0 +1,41 @@
1
+ import { bech32, bech32m } from '@scure/base';
2
+ /**
3
+ * Validate a bech32/bech32m address.
4
+ *
5
+ * For segwit addresses (BTC bc1, LTC ltc1), the first word is the witness
6
+ * version and is skipped before fromWords conversion.
7
+ *
8
+ * For non-segwit bech32 (Cosmos, THORChain), all words are data.
9
+ */
10
+ export function validateBech32(address, expectedHrp, minDataLen = 20, maxDataLen = 40) {
11
+ try {
12
+ let decoded;
13
+ try {
14
+ decoded = bech32m.decode(address);
15
+ }
16
+ catch {
17
+ decoded = bech32.decode(address);
18
+ }
19
+ if (decoded.prefix !== expectedHrp) {
20
+ return { valid: false, reason: `Expected HRP '${expectedHrp}', got '${decoded.prefix}'` };
21
+ }
22
+ // Segwit addresses (bc, ltc) have a witness version as the first word
23
+ const isSegwit = expectedHrp === 'bc' ||
24
+ expectedHrp === 'ltc' ||
25
+ expectedHrp === 'tb' ||
26
+ expectedHrp === 'tltc';
27
+ const words = isSegwit ? decoded.words.slice(1) : decoded.words;
28
+ const data = bech32.fromWords(words);
29
+ if (data.length < minDataLen || data.length > maxDataLen) {
30
+ return {
31
+ valid: false,
32
+ reason: `Data length ${data.length} out of range [${minDataLen}, ${maxDataLen}]`,
33
+ };
34
+ }
35
+ return { valid: true };
36
+ }
37
+ catch {
38
+ return { valid: false, reason: 'Invalid bech32 encoding' };
39
+ }
40
+ }
41
+ //# sourceMappingURL=bech32.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bech32.js","sourceRoot":"","sources":["../../src/address/bech32.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE9C;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAC5B,OAAe,EACf,WAAmB,EACnB,UAAU,GAAG,EAAE,EACf,UAAU,GAAG,EAAE;IAEf,IAAI,CAAC;QACH,IAAI,OAA4C,CAAC;QACjD,IAAI,CAAC;YACH,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,OAAgC,CAAC,CAAC;QAC7D,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,OAAgC,CAAC,CAAC;QAC5D,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;YACnC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,iBAAiB,WAAW,WAAW,OAAO,CAAC,MAAM,GAAG,EAAE,CAAC;QAC5F,CAAC;QAED,sEAAsE;QACtE,MAAM,QAAQ,GACZ,WAAW,KAAK,IAAI;YACpB,WAAW,KAAK,KAAK;YACrB,WAAW,KAAK,IAAI;YACpB,WAAW,KAAK,MAAM,CAAC;QACzB,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;QAEhE,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACrC,IAAI,IAAI,CAAC,MAAM,GAAG,UAAU,IAAI,IAAI,CAAC,MAAM,GAAG,UAAU,EAAE,CAAC;YACzD,OAAO;gBACL,KAAK,EAAE,KAAK;gBACZ,MAAM,EAAE,eAAe,IAAI,CAAC,MAAM,kBAAkB,UAAU,KAAK,UAAU,GAAG;aACjF,CAAC;QACJ,CAAC;QAED,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,yBAAyB,EAAE,CAAC;IAC7D,CAAC;AACH,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare function validateEvmAddress(address: string): {
2
+ valid: boolean;
3
+ reason?: string;
4
+ };
5
+ //# sourceMappingURL=evm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evm.d.ts","sourceRoot":"","sources":["../../src/address/evm.ts"],"names":[],"mappings":"AAGA,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CA4BvF"}
@@ -0,0 +1,27 @@
1
+ import { keccak_256 } from '@noble/hashes/sha3.js';
2
+ import { bytesToHex } from '../lib/crypto/scalars.js';
3
+ export function validateEvmAddress(address) {
4
+ if (!/^0x[0-9a-fA-F]{40}$/.test(address)) {
5
+ return { valid: false, reason: 'Must be 0x followed by 40 hex characters' };
6
+ }
7
+ // If address is all-lowercase or all-uppercase, skip checksum (valid but unchecksummed)
8
+ const hex = address.slice(2);
9
+ if (hex === hex.toLowerCase() || hex === hex.toUpperCase()) {
10
+ return { valid: true };
11
+ }
12
+ // EIP-55 mixed-case checksum validation
13
+ const hashHex = bytesToHex(keccak_256(new TextEncoder().encode(hex.toLowerCase())));
14
+ for (let i = 0; i < 40; i++) {
15
+ const c = hex.charAt(i);
16
+ const h = parseInt(hashHex.charAt(i), 16);
17
+ if (/[a-fA-F]/.test(c)) {
18
+ const shouldBeUpper = h >= 8;
19
+ const isUpper = c === c.toUpperCase();
20
+ if (shouldBeUpper !== isUpper) {
21
+ return { valid: false, reason: 'Invalid EIP-55 checksum' };
22
+ }
23
+ }
24
+ }
25
+ return { valid: true };
26
+ }
27
+ //# sourceMappingURL=evm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evm.js","sourceRoot":"","sources":["../../src/address/evm.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAEtD,MAAM,UAAU,kBAAkB,CAAC,OAAe;IAChD,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACzC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,0CAA0C,EAAE,CAAC;IAC9E,CAAC;IAED,wFAAwF;IACxF,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC7B,IAAI,GAAG,KAAK,GAAG,CAAC,WAAW,EAAE,IAAI,GAAG,KAAK,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC;QAC3D,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACzB,CAAC;IAED,wCAAwC;IACxC,MAAM,OAAO,GAAG,UAAU,CAAC,UAAU,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC;IAEpF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACxB,MAAM,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAE1C,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YACvB,MAAM,aAAa,GAAG,CAAC,IAAI,CAAC,CAAC;YAC7B,MAAM,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;YACtC,IAAI,aAAa,KAAK,OAAO,EAAE,CAAC;gBAC9B,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,yBAAyB,EAAE,CAAC;YAC7D,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACzB,CAAC"}
@@ -0,0 +1,15 @@
1
+ export interface ValidationResult {
2
+ readonly valid: boolean;
3
+ readonly reason?: string;
4
+ }
5
+ /**
6
+ * Validate a cryptocurrency address for a given token or chain.
7
+ * Pure function — works identically in Node.js and browser.
8
+ */
9
+ export declare function validateAddress(address: string, tokenOrChain: string): ValidationResult;
10
+ export declare function resolveChain(tokenOrChain: string): string;
11
+ export declare function getSupportedChains(): readonly string[];
12
+ /** Tokens commonly received on a given chain. Used to populate the
13
+ * Tokens column in the address book without per-row tagging. */
14
+ export declare function tokensForChain(chain: string): readonly string[];
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/address/index.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAoGD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,gBAAgB,CAYvF;AAED,wBAAgB,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED,wBAAgB,kBAAkB,IAAI,SAAS,MAAM,EAAE,CAEtD;AAcD;iEACiE;AACjE,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAE/D"}