@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
@@ -0,0 +1,180 @@
1
+ /**
2
+ * Monero output scanning — detect owned outputs in a transaction.
3
+ *
4
+ * Given a transaction JSON (from monerod /get_transactions), the shared view key,
5
+ * and the combined spend public key, this module scans each output to determine
6
+ * if it belongs to the lock address. For matching outputs, it decrypts the amount
7
+ * and computes the RCT commitment mask.
8
+ *
9
+ * Reusable by both verify-xmr-lock.ts (lock verification) and monero-sweep.ts
10
+ * (sweep construction).
11
+ */
12
+ import { Point } from '@noble/ed25519';
13
+ import { keccak_256 } from '@noble/hashes/sha3.js';
14
+ import { bytesToHex, hexToBytes } from '@noble/hashes/utils.js';
15
+ import { noopLogger } from '../../interfaces/logger.js';
16
+ import { ED25519_GROUP_ORDER, bytesToBigIntLE, hexToScalarLE, bigIntToBytes, } from '../crypto/scalars.js';
17
+ /**
18
+ * Scan a transaction's outputs to find ones belonging to the given keys.
19
+ *
20
+ * @param txJson - Parsed transaction JSON from monerod
21
+ * @param globalOutputIndices - Global indices for each output (from get_transactions response)
22
+ * @param viewKeyHex - Combined private view key (32 bytes hex)
23
+ * @param spendPubHex - Combined public spend key S_a + S_b (32 bytes hex)
24
+ * @param computeMask - Function to compute commitment mask (typically WASM compute_commitment_mask)
25
+ * @param decryptAmountFn - Function to decrypt RCT amount (typically WASM decrypt_amount). If not provided, uses TS fallback.
26
+ * @param logger - Optional structured logger
27
+ * @returns Array of matching outputs with all metadata
28
+ */
29
+ export function scanTransactionOutputs(params) {
30
+ const { txJson, globalOutputIndices, viewKeyHex, spendPubHex, computeMask, decryptAmountFn, logger: log = noopLogger } = params;
31
+ const txPubKeyR = extractTxPubKey(txJson.extra);
32
+ if (!txPubKeyR) {
33
+ log.error({ extraLen: txJson.extra.length }, 'No tx public key (tag 0x01) found in extra');
34
+ return [];
35
+ }
36
+ const txPubKeyHex = bytesToHex(txPubKeyR);
37
+ log.debug({ txPubKeyR: txPubKeyHex.slice(0, 16) + '...' }, 'Extracted tx public key R');
38
+ let d8Bytes;
39
+ try {
40
+ const viewKey = hexToScalar(viewKeyHex);
41
+ const rPoint = Point.fromHex(txPubKeyHex);
42
+ const sharedSecret = rPoint.multiply(viewKey);
43
+ const d8 = sharedSecret.clearCofactor();
44
+ d8Bytes = d8.toBytes();
45
+ }
46
+ catch (err) {
47
+ log.error({ error: err instanceof Error ? err.message : String(err) }, 'Failed to compute shared secret');
48
+ return [];
49
+ }
50
+ let spendPub;
51
+ try {
52
+ spendPub = Point.fromHex(spendPubHex);
53
+ }
54
+ catch (err) {
55
+ log.error({ error: err instanceof Error ? err.message : String(err), spendPubHex }, 'Invalid spend public key');
56
+ return [];
57
+ }
58
+ const results = [];
59
+ for (let i = 0; i < txJson.vout.length; i++) {
60
+ const output = txJson.vout[i];
61
+ if (!output)
62
+ continue;
63
+ const outputKeyHex = output.target.tagged_key?.key ?? output.target.key;
64
+ if (!outputKeyHex)
65
+ continue;
66
+ // P' = Hs(D8 || varint(i)) * G + B
67
+ const derivationScalar = deriveScalar(d8Bytes, i);
68
+ const expectedKey = Point.BASE.multiply(derivationScalar).add(spendPub);
69
+ const expectedKeyHex = bytesToHex(expectedKey.toBytes());
70
+ const isMatch = expectedKeyHex === outputKeyHex;
71
+ if (isMatch) {
72
+ // Decrypt amount — prefer WASM (uses same key derivation as mask/key images)
73
+ const ecdhInfo = txJson.rct_signatures.ecdhInfo[i];
74
+ let amount;
75
+ if (decryptAmountFn && ecdhInfo) {
76
+ amount = decryptAmountFn(viewKeyHex, txPubKeyHex, i, ecdhInfo.amount);
77
+ }
78
+ else {
79
+ amount = decryptAmount(d8Bytes, i, ecdhInfo);
80
+ }
81
+ let rctMask = '';
82
+ try {
83
+ rctMask = computeMask(viewKeyHex, txPubKeyHex, i);
84
+ }
85
+ catch (err) {
86
+ log.warn({ outputIndex: i, error: err instanceof Error ? err.message : String(err) }, 'Failed to compute commitment mask');
87
+ }
88
+ const globalIdx = globalOutputIndices[i] ?? 0;
89
+ log.info({
90
+ outputIndex: i,
91
+ globalOutputIndex: globalIdx,
92
+ amount: amount.toString(),
93
+ rctMaskLen: rctMask.length,
94
+ }, 'Found matching output');
95
+ results.push({
96
+ oneTimePublicKey: outputKeyHex,
97
+ txPublicKey: txPubKeyHex,
98
+ outputIndex: i,
99
+ globalOutputIndex: globalIdx,
100
+ amount,
101
+ rctMask,
102
+ });
103
+ }
104
+ }
105
+ log.info({ scannedOutputs: txJson.vout.length, matches: results.length }, 'Output scanning complete');
106
+ return results;
107
+ }
108
+ /** Extract the tx public key R from the extra field. Tag 0x01 = 32-byte pubkey. */
109
+ export function extractTxPubKey(extra) {
110
+ for (let i = 0; i < extra.length; i++) {
111
+ if (extra[i] === 0x01 && i + 32 < extra.length) {
112
+ return new Uint8Array(extra.slice(i + 1, i + 33));
113
+ }
114
+ }
115
+ return null;
116
+ }
117
+ /** Decode a hex-encoded little-endian scalar reduced mod L. */
118
+ export function hexToScalar(hex) {
119
+ return hexToScalarLE(hex);
120
+ }
121
+ /** Hs(D8 || varint(i)) mod L: keccak output interpreted as a little-endian scalar. */
122
+ export function deriveScalar(d8Bytes, outputIndex) {
123
+ const hash = deriveScalarBytes(d8Bytes, outputIndex);
124
+ const raw = bytesToBigIntLE(hash);
125
+ return ((raw % ED25519_GROUP_ORDER) + ED25519_GROUP_ORDER) % ED25519_GROUP_ORDER;
126
+ }
127
+ /** Keccak256(D8 || varint(i)) as raw 32 bytes. */
128
+ export function deriveScalarBytes(d8Bytes, outputIndex) {
129
+ const varintBuf = encodeVarint(outputIndex);
130
+ const preimage = new Uint8Array(d8Bytes.length + varintBuf.length);
131
+ preimage.set(d8Bytes);
132
+ preimage.set(varintBuf, d8Bytes.length);
133
+ return keccak_256(preimage);
134
+ }
135
+ /** Decrypt a Monero RingCT amount (Bulletproofs+ style, 8-byte XOR). */
136
+ export function decryptAmount(d8Bytes, outputIndex, ecdhInfo) {
137
+ if (!ecdhInfo)
138
+ return 0n;
139
+ // Match wallet2 / Rust WASM `decrypt_amount_inner`:
140
+ // derivation_scalar = sc_reduce32(keccak256(D8 || varint(i)))
141
+ // amount_key = keccak256("amount" || derivation_scalar.as_bytes())
142
+ // The reduced scalar is serialised canonically as 32 LE bytes before the
143
+ // second hash. Feeding the raw keccak256 output (without mod-L reduction)
144
+ // is wrong whenever the hash exceeds the group order, which silently
145
+ // produces garbage XOR plaintexts that can pass a one-sided
146
+ // `< expectedAmount` check downstream.
147
+ const rawDerivationHash = deriveScalarBytes(d8Bytes, outputIndex);
148
+ const derivationScalarBytes = bigIntToBytes(bytesToBigIntLE(rawDerivationHash));
149
+ const amountPrefix = new TextEncoder().encode('amount');
150
+ const amountPreimage = new Uint8Array(amountPrefix.length + 32);
151
+ amountPreimage.set(amountPrefix);
152
+ amountPreimage.set(derivationScalarBytes, amountPrefix.length);
153
+ const amountKey = keccak_256(amountPreimage);
154
+ // XOR first 8 bytes
155
+ const encryptedAmount = hexToBytes(ecdhInfo.amount);
156
+ const decrypted = new Uint8Array(8);
157
+ for (let i = 0; i < 8; i++) {
158
+ decrypted[i] = (encryptedAmount[i] ?? 0) ^ (amountKey[i] ?? 0);
159
+ }
160
+ // Read as little-endian u64
161
+ let amount = 0n;
162
+ for (let i = 7; i >= 0; i--) {
163
+ amount = (amount << 8n) | BigInt(decrypted[i] ?? 0);
164
+ }
165
+ return amount;
166
+ }
167
+ /** Encode a number as a Monero varint (unsigned LEB128). */
168
+ export function encodeVarint(value) {
169
+ const bytes = [];
170
+ let v = value;
171
+ do {
172
+ let b = v & 0x7f;
173
+ v >>>= 7;
174
+ if (v !== 0)
175
+ b |= 0x80;
176
+ bytes.push(b);
177
+ } while (v !== 0);
178
+ return new Uint8Array(bytes);
179
+ }
180
+ //# sourceMappingURL=output-scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output-scanner.js","sourceRoot":"","sources":["../../../src/lib/monero/output-scanner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,131 @@
1
+ /**
2
+ * Typed wrappers for monerod RPC endpoints.
3
+ *
4
+ * All functions use multi-node fallback: try each node in order until one succeeds.
5
+ * Supports both binary RPC (POST to path) and JSON-RPC (POST to /json_rpc).
6
+ * Works on restricted RPC port (18089/38089).
7
+ */
8
+ import type { Logger } from '../../interfaces/logger.js';
9
+ export interface MonerodConfig {
10
+ readonly nodes: readonly string[];
11
+ readonly logger?: Logger;
12
+ }
13
+ /**
14
+ * Default public Monero mainnet RPC endpoints. Source of truth lives in
15
+ * `default-config.ts`; this re-export preserves the existing public name.
16
+ */
17
+ export declare const MAINNET_NODES: readonly string[];
18
+ /**
19
+ * Default public Monero stagenet RPC endpoints. Source of truth lives in
20
+ * `default-config.ts`.
21
+ */
22
+ export declare const STAGENET_NODES: readonly string[];
23
+ export interface MoneroTxJson {
24
+ readonly extra: readonly number[];
25
+ readonly unlock_time?: number;
26
+ readonly vout: readonly {
27
+ readonly amount: number;
28
+ readonly target: {
29
+ readonly tagged_key?: {
30
+ readonly key: string;
31
+ readonly view_tag: string;
32
+ };
33
+ readonly key?: string;
34
+ };
35
+ readonly unlock_time?: number;
36
+ }[];
37
+ readonly rct_signatures: {
38
+ readonly type: number;
39
+ readonly ecdhInfo: readonly {
40
+ readonly amount: string;
41
+ }[];
42
+ readonly outPk: readonly string[];
43
+ };
44
+ }
45
+ export interface FetchedTransaction {
46
+ readonly txJson: MoneroTxJson;
47
+ readonly blockHeight: number;
48
+ readonly confirmations: number;
49
+ readonly inPool: boolean;
50
+ /** Global output indices for each output in the transaction. */
51
+ readonly outputIndices: readonly number[];
52
+ readonly txHash: string;
53
+ }
54
+ export interface OutputKeyInfo {
55
+ readonly key: string;
56
+ readonly mask: string;
57
+ readonly unlocked: boolean;
58
+ readonly height: number;
59
+ }
60
+ export interface FeeEstimate {
61
+ readonly feePerByte: number;
62
+ readonly quantizationMask: number;
63
+ }
64
+ /**
65
+ * Fetch a transaction by hash from monerod.
66
+ * Returns the full parsed tx JSON, global output indices, and metadata.
67
+ */
68
+ export declare function fetchTransaction(config: MonerodConfig, txHash: string): Promise<FetchedTransaction>;
69
+ export interface MoneroQuorumConfig {
70
+ readonly nodes: readonly string[];
71
+ readonly quorum: number;
72
+ readonly timeoutMs: number;
73
+ readonly logger?: Logger;
74
+ }
75
+ /**
76
+ * Fetch a transaction from `quorum`-many independent monerod nodes in parallel
77
+ * and only return once at least that many nodes agree on the canonical fields
78
+ * (extra, vout, ecdhInfo, unlock_time). Confirmations may differ by up to ±2.
79
+ *
80
+ * @throws {VerificationError} `E_MONERO_QUORUM` when too few nodes respond.
81
+ * @security Closes AV-E.5 — single malicious node cannot forge a lock tx.
82
+ */
83
+ export declare function fetchTransactionQuorum(config: MoneroQuorumConfig, lockTxHash: string): Promise<FetchedTransaction>;
84
+ /**
85
+ * Fetch output public keys and commitments by global index.
86
+ * Used for building the ring of decoys.
87
+ */
88
+ export declare function fetchOutputKeys(config: MonerodConfig, globalIndices: readonly number[]): Promise<readonly OutputKeyInfo[]>;
89
+ /**
90
+ * Get the current chain height from monerod.
91
+ */
92
+ export declare function fetchChainHeight(config: MonerodConfig): Promise<number>;
93
+ export interface BroadcastResult {
94
+ readonly txHash: string;
95
+ readonly status: string;
96
+ /** True if the tx was rejected because the key image is already spent.
97
+ * This means we already broadcast this tx successfully in a previous attempt. */
98
+ readonly alreadySpent: boolean;
99
+ }
100
+ /**
101
+ * Broadcast a raw signed transaction to the Monero network.
102
+ *
103
+ * If the daemon returns `double_spend`, this is treated as a prior successful
104
+ * broadcast (only we have the spend key, so we must have sent it before).
105
+ * Returns `alreadySpent: true` instead of throwing.
106
+ */
107
+ export declare function broadcastTransaction(config: MonerodConfig, rawTxHex: string): Promise<BroadcastResult>;
108
+ /**
109
+ * Fetch the cumulative RCT output distribution per block.
110
+ * Used for gamma distribution decoy selection.
111
+ *
112
+ * Returns an array where `distribution[i]` is the cumulative count
113
+ * of RCT outputs up to and including block `i + startHeight`.
114
+ */
115
+ /**
116
+ * Fetch the cumulative RCT output distribution per block.
117
+ * Used for gamma distribution decoy selection.
118
+ *
119
+ * Returns the full cumulative distribution: `base` is added to each entry
120
+ * so the array represents absolute cumulative counts from block 0.
121
+ *
122
+ * Must request with `binary: false` to get JSON-parseable data
123
+ * (default binary format embeds raw bytes that break JSON.parse).
124
+ */
125
+ export declare function fetchOutputDistribution(config: MonerodConfig): Promise<readonly number[]>;
126
+ /**
127
+ * Get the current fee estimate from monerod.
128
+ * Returns fee per byte in piconeros.
129
+ */
130
+ export declare function fetchFeeEstimate(config: MonerodConfig): Promise<FeeEstimate>;
131
+ //# sourceMappingURL=rpc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rpc.d.ts","sourceRoot":"","sources":["../../../src/lib/monero/rpc.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,267 @@
1
+ import { noopLogger } from '../../interfaces/logger.js';
2
+ import { VerificationError } from '../../types/index.js';
3
+ import { MONERO_MAINNET_NODES, MONERO_STAGENET_NODES, } from '../default-config.js';
4
+ /**
5
+ * Default public Monero mainnet RPC endpoints. Source of truth lives in
6
+ * `default-config.ts`; this re-export preserves the existing public name.
7
+ */
8
+ export const MAINNET_NODES = MONERO_MAINNET_NODES;
9
+ /**
10
+ * Default public Monero stagenet RPC endpoints. Source of truth lives in
11
+ * `default-config.ts`.
12
+ */
13
+ export const STAGENET_NODES = MONERO_STAGENET_NODES;
14
+ async function tryNodes(config, label, makeRequest) {
15
+ const log = config.logger ?? noopLogger;
16
+ const errors = [];
17
+ for (const nodeUrl of config.nodes) {
18
+ try {
19
+ log.debug({ nodeUrl, label }, 'Trying monerod node');
20
+ return await makeRequest(nodeUrl);
21
+ }
22
+ catch (err) {
23
+ const msg = err instanceof Error ? err.message : String(err);
24
+ errors.push(`${nodeUrl}: ${msg}`);
25
+ log.warn({ nodeUrl, error: msg, label }, 'Monerod node failed, trying next');
26
+ }
27
+ }
28
+ throw new Error(`${label}: all ${String(config.nodes.length)} nodes failed. Errors: ${errors.join('; ')}`);
29
+ }
30
+ /**
31
+ * Fetch a transaction by hash from monerod.
32
+ * Returns the full parsed tx JSON, global output indices, and metadata.
33
+ */
34
+ export async function fetchTransaction(config, txHash) {
35
+ return tryNodes(config, 'get_transactions', async (nodeUrl) => {
36
+ const response = await fetch(`${nodeUrl}/get_transactions`, {
37
+ method: 'POST',
38
+ headers: { 'Content-Type': 'application/json' },
39
+ body: JSON.stringify({ txs_hashes: [txHash], decode_as_json: true }),
40
+ });
41
+ if (!response.ok)
42
+ throw new Error(`HTTP ${String(response.status)}`);
43
+ const result = (await response.json());
44
+ if (result.status !== 'OK')
45
+ throw new Error(`RPC status: ${result.status}`);
46
+ if (!result.txs || result.txs.length === 0) {
47
+ const missed = result.missed_tx?.join(', ') ?? txHash;
48
+ throw new Error(`Transaction not found: ${missed}`);
49
+ }
50
+ const entry = result.txs[0];
51
+ if (!entry)
52
+ throw new Error('Empty txs array');
53
+ return {
54
+ txJson: JSON.parse(entry.as_json),
55
+ blockHeight: entry.block_height,
56
+ confirmations: entry.confirmations,
57
+ inPool: entry.in_pool,
58
+ outputIndices: entry.output_indices ?? [],
59
+ txHash: entry.tx_hash,
60
+ };
61
+ });
62
+ }
63
+ /**
64
+ * Fetch a transaction from `quorum`-many independent monerod nodes in parallel
65
+ * and only return once at least that many nodes agree on the canonical fields
66
+ * (extra, vout, ecdhInfo, unlock_time). Confirmations may differ by up to ±2.
67
+ *
68
+ * @throws {VerificationError} `E_MONERO_QUORUM` when too few nodes respond.
69
+ * @security Closes AV-E.5 — single malicious node cannot forge a lock tx.
70
+ */
71
+ export async function fetchTransactionQuorum(config, lockTxHash) {
72
+ const log = config.logger ?? noopLogger;
73
+ const attempts = config.nodes.map((url) => withTimeout(fetchTransaction({ nodes: [url], logger: log }, lockTxHash), config.timeoutMs));
74
+ const settled = await Promise.allSettled(attempts);
75
+ const successes = settled
76
+ .filter((s) => s.status === 'fulfilled')
77
+ .map((s) => s.value);
78
+ if (successes.length < config.quorum) {
79
+ throw new VerificationError('E_MONERO_QUORUM', `only ${String(successes.length)} of ${String(config.nodes.length)} nodes responded, need ${String(config.quorum)}`);
80
+ }
81
+ return pickAgreeingTransaction(successes, config.quorum);
82
+ }
83
+ function canonicalTxKey(tx) {
84
+ const { txJson } = tx;
85
+ return JSON.stringify({
86
+ extra: txJson.extra,
87
+ unlock_time: txJson.unlock_time ?? 0,
88
+ vout: txJson.vout,
89
+ ecdhInfo: txJson.rct_signatures.ecdhInfo,
90
+ outPk: txJson.rct_signatures.outPk,
91
+ });
92
+ }
93
+ function pickAgreeingTransaction(successes, quorum) {
94
+ const buckets = new Map();
95
+ for (const tx of successes) {
96
+ const key = canonicalTxKey(tx);
97
+ const bucket = buckets.get(key);
98
+ if (bucket)
99
+ bucket.push(tx);
100
+ else
101
+ buckets.set(key, [tx]);
102
+ }
103
+ for (const [, txs] of buckets) {
104
+ if (txs.length >= quorum) {
105
+ const confirmations = medianConfirmations(txs);
106
+ const first = txs[0];
107
+ if (!first)
108
+ continue;
109
+ return { ...first, confirmations };
110
+ }
111
+ }
112
+ throw new VerificationError('E_MONERO_QUORUM', `no ${String(quorum)} nodes returned byte-identical transaction data`);
113
+ }
114
+ function medianConfirmations(txs) {
115
+ const values = txs.map((t) => t.confirmations).sort((a, b) => a - b);
116
+ return values[Math.floor(values.length / 2)] ?? 0;
117
+ }
118
+ async function withTimeout(promise, ms) {
119
+ return new Promise((resolve, reject) => {
120
+ const timer = setTimeout(() => reject(new Error(`timeout after ${String(ms)}ms`)), ms);
121
+ promise.then((value) => { clearTimeout(timer); resolve(value); }, (err) => { clearTimeout(timer); reject(err instanceof Error ? err : new Error(String(err))); });
122
+ });
123
+ }
124
+ /**
125
+ * Fetch output public keys and commitments by global index.
126
+ * Used for building the ring of decoys.
127
+ */
128
+ export async function fetchOutputKeys(config, globalIndices) {
129
+ return tryNodes(config, 'get_outs', async (nodeUrl) => {
130
+ const response = await fetch(`${nodeUrl}/get_outs`, {
131
+ method: 'POST',
132
+ headers: { 'Content-Type': 'application/json' },
133
+ body: JSON.stringify({
134
+ outputs: globalIndices.map((index) => ({ amount: 0, index })),
135
+ get_txid: false,
136
+ }),
137
+ });
138
+ if (!response.ok)
139
+ throw new Error(`HTTP ${String(response.status)}`);
140
+ const result = (await response.json());
141
+ if (result.status !== 'OK' || !result.outs) {
142
+ throw new Error(`get_outs failed: ${result.status}`);
143
+ }
144
+ return result.outs;
145
+ });
146
+ }
147
+ /**
148
+ * Get the current chain height from monerod.
149
+ */
150
+ export async function fetchChainHeight(config) {
151
+ return tryNodes(config, 'get_info', async (nodeUrl) => {
152
+ const response = await fetch(`${nodeUrl}/get_info`, {
153
+ method: 'POST',
154
+ headers: { 'Content-Type': 'application/json' },
155
+ body: JSON.stringify({}),
156
+ });
157
+ if (!response.ok)
158
+ throw new Error(`HTTP ${String(response.status)}`);
159
+ const result = (await response.json());
160
+ if (result.status !== 'OK')
161
+ throw new Error(`get_info failed: ${result.status}`);
162
+ return result.height;
163
+ });
164
+ }
165
+ /**
166
+ * Broadcast a raw signed transaction to the Monero network.
167
+ *
168
+ * If the daemon returns `double_spend`, this is treated as a prior successful
169
+ * broadcast (only we have the spend key, so we must have sent it before).
170
+ * Returns `alreadySpent: true` instead of throwing.
171
+ */
172
+ export async function broadcastTransaction(config, rawTxHex) {
173
+ return tryNodes(config, 'send_raw_transaction', async (nodeUrl) => {
174
+ const response = await fetch(`${nodeUrl}/send_raw_transaction`, {
175
+ method: 'POST',
176
+ headers: { 'Content-Type': 'application/json' },
177
+ body: JSON.stringify({ tx_as_hex: rawTxHex, do_not_relay: false }),
178
+ });
179
+ if (!response.ok)
180
+ throw new Error(`HTTP ${String(response.status)}`);
181
+ const result = (await response.json());
182
+ if (result.status === 'OK') {
183
+ return { txHash: result.tx_hash ?? '', status: 'OK', alreadySpent: false };
184
+ }
185
+ // Double spend means we already broadcast this tx — treat as success
186
+ if (result.double_spend) {
187
+ return { txHash: '', status: 'double_spend', alreadySpent: true };
188
+ }
189
+ // Any other rejection is a real error
190
+ const flags = Object.entries(result)
191
+ .filter(([k, v]) => k !== 'status' && k !== 'reason' && k !== 'tx_hash' && v === true)
192
+ .map(([k]) => k);
193
+ const detail = flags.length > 0 ? ` [flags: ${flags.join(', ')}]` : '';
194
+ throw new Error(`Daemon rejected tx: ${result.reason || 'unknown reason'}${detail} (status: ${result.status})`);
195
+ });
196
+ }
197
+ async function jsonRpc(nodeUrl, method, params) {
198
+ const response = await fetch(`${nodeUrl}/json_rpc`, {
199
+ method: 'POST',
200
+ headers: { 'Content-Type': 'application/json' },
201
+ body: JSON.stringify({ jsonrpc: '2.0', id: '0', method, params }),
202
+ });
203
+ if (!response.ok)
204
+ throw new Error(`HTTP ${String(response.status)}`);
205
+ const result = (await response.json());
206
+ if (result.error)
207
+ throw new Error(`JSON-RPC error: ${result.error.message}`);
208
+ if (!result.result)
209
+ throw new Error(`JSON-RPC returned no result for ${method}`);
210
+ return result.result;
211
+ }
212
+ /**
213
+ * Fetch the cumulative RCT output distribution per block.
214
+ * Used for gamma distribution decoy selection.
215
+ *
216
+ * Returns an array where `distribution[i]` is the cumulative count
217
+ * of RCT outputs up to and including block `i + startHeight`.
218
+ */
219
+ /**
220
+ * Fetch the cumulative RCT output distribution per block.
221
+ * Used for gamma distribution decoy selection.
222
+ *
223
+ * Returns the full cumulative distribution: `base` is added to each entry
224
+ * so the array represents absolute cumulative counts from block 0.
225
+ *
226
+ * Must request with `binary: false` to get JSON-parseable data
227
+ * (default binary format embeds raw bytes that break JSON.parse).
228
+ */
229
+ export async function fetchOutputDistribution(config) {
230
+ return tryNodes(config, 'get_output_distribution', async (nodeUrl) => {
231
+ const result = await jsonRpc(nodeUrl, 'get_output_distribution', {
232
+ amounts: [0],
233
+ cumulative: true,
234
+ from_height: 0,
235
+ binary: false,
236
+ });
237
+ if (result.status !== 'OK' || !result.distributions || result.distributions.length === 0) {
238
+ throw new Error(`get_output_distribution failed: ${result.status}`);
239
+ }
240
+ const dist = result.distributions[0];
241
+ if (!dist)
242
+ throw new Error('Empty distributions array');
243
+ // If from_height > 0, the distribution is relative to `base`.
244
+ // Add base to get absolute cumulative counts.
245
+ if (dist.base > 0) {
246
+ return dist.distribution.map((v) => v + dist.base);
247
+ }
248
+ return dist.distribution;
249
+ });
250
+ }
251
+ /**
252
+ * Get the current fee estimate from monerod.
253
+ * Returns fee per byte in piconeros.
254
+ */
255
+ export async function fetchFeeEstimate(config) {
256
+ return tryNodes(config, 'get_fee_estimate', async (nodeUrl) => {
257
+ const result = await jsonRpc(nodeUrl, 'get_fee_estimate', { grace_blocks: 10 });
258
+ if (result.status !== 'OK') {
259
+ throw new Error(`get_fee_estimate failed: ${result.status}`);
260
+ }
261
+ return {
262
+ feePerByte: result.fee,
263
+ quantizationMask: result.quantization_mask,
264
+ };
265
+ });
266
+ }
267
+ //# sourceMappingURL=rpc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rpc.js","sourceRoot":"","sources":["../../../src/lib/monero/rpc.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ import type { Logger } from '../../interfaces/logger.js';
2
+ export interface XmrLockVerification {
3
+ /** Whether the lock was verified. */
4
+ readonly verified: boolean;
5
+ /** Amount locked in piconeros (if verified). */
6
+ readonly amount: bigint;
7
+ /** Number of confirmations. */
8
+ readonly confirmations: number;
9
+ /** Reason for failure (if not verified). */
10
+ readonly reason?: string;
11
+ /**
12
+ * True when a failure is the user waiting for confirmations to accumulate.
13
+ * Callers may retry after a delay. Any other failure is terminal and must
14
+ * not be retried without human decision.
15
+ */
16
+ readonly retryable?: boolean;
17
+ }
18
+ export interface VerifyXmrLockParams {
19
+ /** Lock transaction hash (hex, 64 chars). */
20
+ readonly lockTxHash: string;
21
+ /** Shared private view key v = v_a + v_b (hex, 64 chars). */
22
+ readonly viewKeyHex: string;
23
+ /** Combined public spend key S_a_monero + S_b_monero (hex, 64 chars). */
24
+ readonly spendPubHex: string;
25
+ /** Expected amount in piconeros. */
26
+ readonly expectedAmount: bigint;
27
+ /** Minimum confirmations required (default: 10). */
28
+ readonly minConfirmations?: number;
29
+ /** Public Monero node URL (single-node path; prefer `monerodNodes` + quorum). */
30
+ readonly monerodUrl?: string;
31
+ /** Multiple Monero node URLs for quorum verification (≥3 recommended). */
32
+ readonly monerodNodes?: readonly string[];
33
+ /** Minimum nodes that must agree on the tx. Default 2. */
34
+ readonly monerodQuorum?: number;
35
+ /** Per-node request timeout in ms. Default 15_000. */
36
+ readonly monerodTimeoutMs?: number;
37
+ /** Alice's tx secret key r (hex). If provided, verifies R = r*G. */
38
+ readonly txKeyHex?: string;
39
+ /** Logger. */
40
+ readonly logger?: Logger;
41
+ }
42
+ /**
43
+ * Verify that XMR is locked at the shared address by scanning the lock
44
+ * transaction from a public Monero node.
45
+ *
46
+ * Call this BEFORE submitting encsig. If this returns verified: false,
47
+ * DO NOT submit the encrypted signature.
48
+ */
49
+ export declare function verifyXmrLocked(params: VerifyXmrLockParams): Promise<XmrLockVerification>;
50
+ //# sourceMappingURL=verify-lock.d.ts.map