@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.
- package/LICENSE +21 -0
- package/README.md +405 -0
- package/dist/address/base58.d.ts +9 -0
- package/dist/address/base58.d.ts.map +1 -0
- package/dist/address/base58.js +33 -0
- package/dist/address/base58.js.map +1 -0
- package/dist/address/bech32.d.ts +13 -0
- package/dist/address/bech32.d.ts.map +1 -0
- package/dist/address/bech32.js +41 -0
- package/dist/address/bech32.js.map +1 -0
- package/dist/address/evm.d.ts +5 -0
- package/dist/address/evm.d.ts.map +1 -0
- package/dist/address/evm.js +27 -0
- package/dist/address/evm.js.map +1 -0
- package/dist/address/index.d.ts +15 -0
- package/dist/address/index.d.ts.map +1 -0
- package/dist/address/index.js +134 -0
- package/dist/address/index.js.map +1 -0
- package/dist/address/monero.d.ts +15 -0
- package/dist/address/monero.d.ts.map +1 -0
- package/dist/address/monero.js +30 -0
- package/dist/address/monero.js.map +1 -0
- package/dist/address/polkadot.d.ts +10 -0
- package/dist/address/polkadot.d.ts.map +1 -0
- package/dist/address/polkadot.js +36 -0
- package/dist/address/polkadot.js.map +1 -0
- package/dist/address/solana.d.ts +5 -0
- package/dist/address/solana.d.ts.map +1 -0
- package/dist/address/solana.js +17 -0
- package/dist/address/solana.js.map +1 -0
- package/dist/address/ton.d.ts +11 -0
- package/dist/address/ton.d.ts.map +1 -0
- package/dist/address/ton.js +28 -0
- package/dist/address/ton.js.map +1 -0
- package/dist/api/index.d.ts +80 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +213 -0
- package/dist/api/index.js.map +1 -0
- package/dist/atomic-swap/drive.d.ts +22 -0
- package/dist/atomic-swap/drive.d.ts.map +1 -0
- package/dist/atomic-swap/drive.js +713 -0
- package/dist/atomic-swap/drive.js.map +1 -0
- package/dist/atomic-swap/extract.d.ts +46 -0
- package/dist/atomic-swap/extract.d.ts.map +1 -0
- package/dist/atomic-swap/extract.js +55 -0
- package/dist/atomic-swap/extract.js.map +1 -0
- package/dist/atomic-swap/index.d.ts +15 -0
- package/dist/atomic-swap/index.d.ts.map +1 -0
- package/dist/atomic-swap/index.js +13 -0
- package/dist/atomic-swap/index.js.map +1 -0
- package/dist/atomic-swap/monero-sweep/errors.d.ts +2 -0
- package/dist/atomic-swap/monero-sweep/errors.d.ts.map +1 -0
- package/dist/atomic-swap/monero-sweep/errors.js +43 -0
- package/dist/atomic-swap/monero-sweep/errors.js.map +1 -0
- package/dist/atomic-swap/monero-sweep/index.d.ts +33 -0
- package/dist/atomic-swap/monero-sweep/index.d.ts.map +1 -0
- package/dist/atomic-swap/monero-sweep/index.js +415 -0
- package/dist/atomic-swap/monero-sweep/index.js.map +1 -0
- package/dist/atomic-swap/monero-sweep/ring-select.d.ts +12 -0
- package/dist/atomic-swap/monero-sweep/ring-select.d.ts.map +1 -0
- package/dist/atomic-swap/monero-sweep/ring-select.js +61 -0
- package/dist/atomic-swap/monero-sweep/ring-select.js.map +1 -0
- package/dist/atomic-swap/presign.d.ts +101 -0
- package/dist/atomic-swap/presign.d.ts.map +1 -0
- package/dist/atomic-swap/presign.js +460 -0
- package/dist/atomic-swap/presign.js.map +1 -0
- package/dist/atomic-swap/refund.d.ts +72 -0
- package/dist/atomic-swap/refund.d.ts.map +1 -0
- package/dist/atomic-swap/refund.js +224 -0
- package/dist/atomic-swap/refund.js.map +1 -0
- package/dist/atomic-swap/run.d.ts +27 -0
- package/dist/atomic-swap/run.d.ts.map +1 -0
- package/dist/atomic-swap/run.js +282 -0
- package/dist/atomic-swap/run.js.map +1 -0
- package/dist/atomic-swap/snapshot.d.ts +111 -0
- package/dist/atomic-swap/snapshot.d.ts.map +1 -0
- package/dist/atomic-swap/snapshot.js +69 -0
- package/dist/atomic-swap/snapshot.js.map +1 -0
- package/dist/atomic-swap/submit-encsig.d.ts +10 -0
- package/dist/atomic-swap/submit-encsig.d.ts.map +1 -0
- package/dist/atomic-swap/submit-encsig.js +56 -0
- package/dist/atomic-swap/submit-encsig.js.map +1 -0
- package/dist/atomic-swap/types.d.ts +168 -0
- package/dist/atomic-swap/types.d.ts.map +1 -0
- package/dist/atomic-swap/types.js +5 -0
- package/dist/atomic-swap/types.js.map +1 -0
- package/dist/blockchain/quorum-provider.d.ts +25 -0
- package/dist/blockchain/quorum-provider.d.ts.map +1 -0
- package/dist/blockchain/quorum-provider.js +144 -0
- package/dist/blockchain/quorum-provider.js.map +1 -0
- package/dist/cooperative-redeem.d.ts +23 -0
- package/dist/cooperative-redeem.d.ts.map +1 -0
- package/dist/cooperative-redeem.js +40 -0
- package/dist/cooperative-redeem.js.map +1 -0
- package/dist/engine/blockchain-querier.d.ts +34 -0
- package/dist/engine/blockchain-querier.d.ts.map +1 -0
- package/dist/engine/blockchain-querier.js +2 -0
- package/dist/engine/blockchain-querier.js.map +1 -0
- package/dist/engine/engine-state.d.ts +20 -0
- package/dist/engine/engine-state.d.ts.map +1 -0
- package/dist/engine/engine-state.js +9 -0
- package/dist/engine/engine-state.js.map +1 -0
- package/dist/engine/flow-context.d.ts +494 -0
- package/dist/engine/flow-context.d.ts.map +1 -0
- package/dist/engine/flow-context.js +147 -0
- package/dist/engine/flow-context.js.map +1 -0
- package/dist/engine/flows/atomic-flow-state.d.ts +124 -0
- package/dist/engine/flows/atomic-flow-state.d.ts.map +1 -0
- package/dist/engine/flows/atomic-flow-state.js +2 -0
- package/dist/engine/flows/atomic-flow-state.js.map +1 -0
- package/dist/engine/flows/atomic-flow.d.ts +88 -0
- package/dist/engine/flows/atomic-flow.d.ts.map +1 -0
- package/dist/engine/flows/atomic-flow.js +1192 -0
- package/dist/engine/flows/atomic-flow.js.map +1 -0
- package/dist/engine/flows/history-flow-state.d.ts +19 -0
- package/dist/engine/flows/history-flow-state.d.ts.map +1 -0
- package/dist/engine/flows/history-flow-state.js +2 -0
- package/dist/engine/flows/history-flow-state.js.map +1 -0
- package/dist/engine/flows/providers-flow-state.d.ts +14 -0
- package/dist/engine/flows/providers-flow-state.d.ts.map +1 -0
- package/dist/engine/flows/providers-flow-state.js +2 -0
- package/dist/engine/flows/providers-flow-state.js.map +1 -0
- package/dist/engine/flows/quote-flow-state.d.ts +20 -0
- package/dist/engine/flows/quote-flow-state.d.ts.map +1 -0
- package/dist/engine/flows/quote-flow-state.js +2 -0
- package/dist/engine/flows/quote-flow-state.js.map +1 -0
- package/dist/engine/flows/swap-flow-state.d.ts +155 -0
- package/dist/engine/flows/swap-flow-state.d.ts.map +1 -0
- package/dist/engine/flows/swap-flow-state.js +2 -0
- package/dist/engine/flows/swap-flow-state.js.map +1 -0
- package/dist/engine/flows/swap-flow.d.ts +81 -0
- package/dist/engine/flows/swap-flow.d.ts.map +1 -0
- package/dist/engine/flows/swap-flow.js +720 -0
- package/dist/engine/flows/swap-flow.js.map +1 -0
- package/dist/engine/flows/tokens-flow-state.d.ts +16 -0
- package/dist/engine/flows/tokens-flow-state.d.ts.map +1 -0
- package/dist/engine/flows/tokens-flow-state.js +2 -0
- package/dist/engine/flows/tokens-flow-state.js.map +1 -0
- package/dist/engine/miradex-engine.d.ts +152 -0
- package/dist/engine/miradex-engine.d.ts.map +1 -0
- package/dist/engine/miradex-engine.js +278 -0
- package/dist/engine/miradex-engine.js.map +1 -0
- package/dist/engine/pipeline.d.ts +27 -0
- package/dist/engine/pipeline.d.ts.map +1 -0
- package/dist/engine/pipeline.js +166 -0
- package/dist/engine/pipeline.js.map +1 -0
- package/dist/engine/platform.d.ts +220 -0
- package/dist/engine/platform.d.ts.map +1 -0
- package/dist/engine/platform.js +2 -0
- package/dist/engine/platform.js.map +1 -0
- package/dist/index.d.ts +85 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +62 -0
- package/dist/index.js.map +1 -0
- package/dist/interfaces/blockchain.d.ts +33 -0
- package/dist/interfaces/blockchain.d.ts.map +1 -0
- package/dist/interfaces/blockchain.js +2 -0
- package/dist/interfaces/blockchain.js.map +1 -0
- package/dist/interfaces/logger.d.ts +14 -0
- package/dist/interfaces/logger.d.ts.map +1 -0
- package/dist/interfaces/logger.js +7 -0
- package/dist/interfaces/logger.js.map +1 -0
- package/dist/lib/bitcoin/deposit-watcher.d.ts +66 -0
- package/dist/lib/bitcoin/deposit-watcher.d.ts.map +1 -0
- package/dist/lib/bitcoin/deposit-watcher.js +218 -0
- package/dist/lib/bitcoin/deposit-watcher.js.map +1 -0
- package/dist/lib/bitcoin/script-hash.d.ts +8 -0
- package/dist/lib/bitcoin/script-hash.d.ts.map +1 -0
- package/dist/lib/bitcoin/script-hash.js +29 -0
- package/dist/lib/bitcoin/script-hash.js.map +1 -0
- package/dist/lib/bitcoin/sweep.d.ts +56 -0
- package/dist/lib/bitcoin/sweep.d.ts.map +1 -0
- package/dist/lib/bitcoin/sweep.js +185 -0
- package/dist/lib/bitcoin/sweep.js.map +1 -0
- package/dist/lib/bitcoin/tx-verify.d.ts +43 -0
- package/dist/lib/bitcoin/tx-verify.d.ts.map +1 -0
- package/dist/lib/bitcoin/tx-verify.js +202 -0
- package/dist/lib/bitcoin/tx-verify.js.map +1 -0
- package/dist/lib/bitcoin/wallet.d.ts +71 -0
- package/dist/lib/bitcoin/wallet.d.ts.map +1 -0
- package/dist/lib/bitcoin/wallet.js +141 -0
- package/dist/lib/bitcoin/wallet.js.map +1 -0
- package/dist/lib/crypto/bytes.d.ts +21 -0
- package/dist/lib/crypto/bytes.d.ts.map +1 -0
- package/dist/lib/crypto/bytes.js +39 -0
- package/dist/lib/crypto/bytes.js.map +1 -0
- package/dist/lib/crypto/errors.d.ts +12 -0
- package/dist/lib/crypto/errors.d.ts.map +1 -0
- package/dist/lib/crypto/errors.js +16 -0
- package/dist/lib/crypto/errors.js.map +1 -0
- package/dist/lib/crypto/keygen.d.ts +19 -0
- package/dist/lib/crypto/keygen.d.ts.map +1 -0
- package/dist/lib/crypto/keygen.js +24 -0
- package/dist/lib/crypto/keygen.js.map +1 -0
- package/dist/lib/crypto/libp2p-identity.d.ts +25 -0
- package/dist/lib/crypto/libp2p-identity.d.ts.map +1 -0
- package/dist/lib/crypto/libp2p-identity.js +80 -0
- package/dist/lib/crypto/libp2p-identity.js.map +1 -0
- package/dist/lib/crypto/mnemonic.d.ts +28 -0
- package/dist/lib/crypto/mnemonic.d.ts.map +1 -0
- package/dist/lib/crypto/mnemonic.js +97 -0
- package/dist/lib/crypto/mnemonic.js.map +1 -0
- package/dist/lib/crypto/platform.d.ts +10 -0
- package/dist/lib/crypto/platform.d.ts.map +1 -0
- package/dist/lib/crypto/platform.js +38 -0
- package/dist/lib/crypto/platform.js.map +1 -0
- package/dist/lib/crypto/scalars.d.ts +33 -0
- package/dist/lib/crypto/scalars.d.ts.map +1 -0
- package/dist/lib/crypto/scalars.js +81 -0
- package/dist/lib/crypto/scalars.js.map +1 -0
- package/dist/lib/crypto/types.d.ts +24 -0
- package/dist/lib/crypto/types.d.ts.map +1 -0
- package/dist/lib/crypto/types.js +2 -0
- package/dist/lib/crypto/types.js.map +1 -0
- package/dist/lib/crypto/wasm.d.ts +51 -0
- package/dist/lib/crypto/wasm.d.ts.map +1 -0
- package/dist/lib/crypto/wasm.js +192 -0
- package/dist/lib/crypto/wasm.js.map +1 -0
- package/dist/lib/default-config.d.ts +140 -0
- package/dist/lib/default-config.d.ts.map +1 -0
- package/dist/lib/default-config.js +239 -0
- package/dist/lib/default-config.js.map +1 -0
- package/dist/lib/delay.d.ts +6 -0
- package/dist/lib/delay.d.ts.map +1 -0
- package/dist/lib/delay.js +20 -0
- package/dist/lib/delay.js.map +1 -0
- package/dist/lib/errors.d.ts +90 -0
- package/dist/lib/errors.d.ts.map +1 -0
- package/dist/lib/errors.js +129 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/format.d.ts +7 -0
- package/dist/lib/format.d.ts.map +1 -0
- package/dist/lib/format.js +43 -0
- package/dist/lib/format.js.map +1 -0
- package/dist/lib/keystore.d.ts +85 -0
- package/dist/lib/keystore.d.ts.map +1 -0
- package/dist/lib/keystore.js +105 -0
- package/dist/lib/keystore.js.map +1 -0
- package/dist/lib/monero/output-scanner.d.ts +53 -0
- package/dist/lib/monero/output-scanner.d.ts.map +1 -0
- package/dist/lib/monero/output-scanner.js +180 -0
- package/dist/lib/monero/output-scanner.js.map +1 -0
- package/dist/lib/monero/rpc.d.ts +131 -0
- package/dist/lib/monero/rpc.d.ts.map +1 -0
- package/dist/lib/monero/rpc.js +267 -0
- package/dist/lib/monero/rpc.js.map +1 -0
- package/dist/lib/monero/verify-lock.d.ts +50 -0
- package/dist/lib/monero/verify-lock.d.ts.map +1 -0
- package/dist/lib/monero/verify-lock.js +161 -0
- package/dist/lib/monero/verify-lock.js.map +1 -0
- package/dist/lib/monero/verify-sweep.d.ts +59 -0
- package/dist/lib/monero/verify-sweep.d.ts.map +1 -0
- package/dist/lib/monero/verify-sweep.js +82 -0
- package/dist/lib/monero/verify-sweep.js.map +1 -0
- package/dist/lib/monero/wasm.d.ts +19 -0
- package/dist/lib/monero/wasm.d.ts.map +1 -0
- package/dist/lib/monero/wasm.js +24 -0
- package/dist/lib/monero/wasm.js.map +1 -0
- package/dist/lib/pow-solver.d.ts +4 -0
- package/dist/lib/pow-solver.d.ts.map +1 -0
- package/dist/lib/pow-solver.js +37 -0
- package/dist/lib/pow-solver.js.map +1 -0
- package/dist/lib/retry.d.ts +86 -0
- package/dist/lib/retry.d.ts.map +1 -0
- package/dist/lib/retry.js +104 -0
- package/dist/lib/retry.js.map +1 -0
- package/dist/portable.d.ts +23 -0
- package/dist/portable.d.ts.map +1 -0
- package/dist/portable.js +13 -0
- package/dist/portable.js.map +1 -0
- package/dist/quote-binding.d.ts +31 -0
- package/dist/quote-binding.d.ts.map +1 -0
- package/dist/quote-binding.js +40 -0
- package/dist/quote-binding.js.map +1 -0
- package/dist/swap-executor.d.ts +51 -0
- package/dist/swap-executor.d.ts.map +1 -0
- package/dist/swap-executor.js +138 -0
- package/dist/swap-executor.js.map +1 -0
- package/dist/types/api.d.ts +34 -0
- package/dist/types/api.d.ts.map +1 -0
- package/dist/types/api.js +18 -0
- package/dist/types/api.js.map +1 -0
- package/dist/types/errors.d.ts +94 -0
- package/dist/types/errors.d.ts.map +1 -0
- package/dist/types/errors.js +93 -0
- package/dist/types/errors.js.map +1 -0
- package/dist/types/index.d.ts +8 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +10 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/keys.d.ts +33 -0
- package/dist/types/keys.d.ts.map +1 -0
- package/dist/types/keys.js +2 -0
- package/dist/types/keys.js.map +1 -0
- package/dist/types/protocol.d.ts +93 -0
- package/dist/types/protocol.d.ts.map +1 -0
- package/dist/types/protocol.js +18 -0
- package/dist/types/protocol.js.map +1 -0
- package/dist/types/status.d.ts +3 -0
- package/dist/types/status.d.ts.map +1 -0
- package/dist/types/status.js +23 -0
- package/dist/types/status.js.map +1 -0
- package/dist/types/verification.d.ts +49 -0
- package/dist/types/verification.d.ts.map +1 -0
- package/dist/types/verification.js +34 -0
- package/dist/types/verification.js.map +1 -0
- package/dist/verification/atomic-swap.d.ts +9 -0
- package/dist/verification/atomic-swap.d.ts.map +1 -0
- package/dist/verification/atomic-swap.js +22 -0
- package/dist/verification/atomic-swap.js.map +1 -0
- package/dist/verification/chainflip-networks.d.ts +46 -0
- package/dist/verification/chainflip-networks.d.ts.map +1 -0
- package/dist/verification/chainflip-networks.js +24 -0
- package/dist/verification/chainflip-networks.js.map +1 -0
- package/dist/verification/chainflip.d.ts +61 -0
- package/dist/verification/chainflip.d.ts.map +1 -0
- package/dist/verification/chainflip.js +377 -0
- package/dist/verification/chainflip.js.map +1 -0
- package/dist/verification/constants.d.ts +52 -0
- package/dist/verification/constants.d.ts.map +1 -0
- package/dist/verification/constants.js +54 -0
- package/dist/verification/constants.js.map +1 -0
- package/dist/verification/index.d.ts +71 -0
- package/dist/verification/index.d.ts.map +1 -0
- package/dist/verification/index.js +91 -0
- package/dist/verification/index.js.map +1 -0
- package/dist/verification/memo.d.ts +27 -0
- package/dist/verification/memo.d.ts.map +1 -0
- package/dist/verification/memo.js +52 -0
- package/dist/verification/memo.js.map +1 -0
- package/dist/verification/near-intents.d.ts +91 -0
- package/dist/verification/near-intents.d.ts.map +1 -0
- package/dist/verification/near-intents.js +213 -0
- package/dist/verification/near-intents.js.map +1 -0
- package/dist/verification/rate-oracle.d.ts +32 -0
- package/dist/verification/rate-oracle.d.ts.map +1 -0
- package/dist/verification/rate-oracle.js +43 -0
- package/dist/verification/rate-oracle.js.map +1 -0
- package/dist/verification/shared.d.ts +20 -0
- package/dist/verification/shared.d.ts.map +1 -0
- package/dist/verification/shared.js +25 -0
- package/dist/verification/shared.js.map +1 -0
- package/dist/verification/thorchain-networks.d.ts +35 -0
- package/dist/verification/thorchain-networks.d.ts.map +1 -0
- package/dist/verification/thorchain-networks.js +35 -0
- package/dist/verification/thorchain-networks.js.map +1 -0
- package/dist/verification/thorchain.d.ts +55 -0
- package/dist/verification/thorchain.d.ts.map +1 -0
- package/dist/verification/thorchain.js +232 -0
- package/dist/verification/thorchain.js.map +1 -0
- package/dist/wasm-pins.d.ts +4 -0
- package/dist/wasm-pins.d.ts.map +1 -0
- package/dist/wasm-pins.js +6 -0
- package/dist/wasm-pins.js.map +1 -0
- package/dist/wire/chainflip.zod.d.ts +144 -0
- package/dist/wire/chainflip.zod.d.ts.map +1 -0
- package/dist/wire/chainflip.zod.js +33 -0
- package/dist/wire/chainflip.zod.js.map +1 -0
- package/dist/wire/near-intents.zod.d.ts +376 -0
- package/dist/wire/near-intents.zod.d.ts.map +1 -0
- package/dist/wire/near-intents.zod.js +101 -0
- package/dist/wire/near-intents.zod.js.map +1 -0
- package/dist/wire/server/action.zod.d.ts +1119 -0
- package/dist/wire/server/action.zod.d.ts.map +1 -0
- package/dist/wire/server/action.zod.js +173 -0
- package/dist/wire/server/action.zod.js.map +1 -0
- package/dist/wire/server/common.zod.d.ts +62 -0
- package/dist/wire/server/common.zod.d.ts.map +1 -0
- package/dist/wire/server/common.zod.js +43 -0
- package/dist/wire/server/common.zod.js.map +1 -0
- package/dist/wire/server/index.d.ts +8 -0
- package/dist/wire/server/index.d.ts.map +1 -0
- package/dist/wire/server/index.js +8 -0
- package/dist/wire/server/index.js.map +1 -0
- package/dist/wire/server/pow.zod.d.ts +45 -0
- package/dist/wire/server/pow.zod.d.ts.map +1 -0
- package/dist/wire/server/pow.zod.js +18 -0
- package/dist/wire/server/pow.zod.js.map +1 -0
- package/dist/wire/server/quotes.zod.d.ts +694 -0
- package/dist/wire/server/quotes.zod.d.ts.map +1 -0
- package/dist/wire/server/quotes.zod.js +103 -0
- package/dist/wire/server/quotes.zod.js.map +1 -0
- package/dist/wire/server/swap.zod.d.ts +1981 -0
- package/dist/wire/server/swap.zod.d.ts.map +1 -0
- package/dist/wire/server/swap.zod.js +270 -0
- package/dist/wire/server/swap.zod.js.map +1 -0
- package/dist/wire/server/tokens.zod.d.ts +93 -0
- package/dist/wire/server/tokens.zod.d.ts.map +1 -0
- package/dist/wire/server/tokens.zod.js +28 -0
- package/dist/wire/server/tokens.zod.js.map +1 -0
- package/dist/wire/server/verify.zod.d.ts +30 -0
- package/dist/wire/server/verify.zod.d.ts.map +1 -0
- package/dist/wire/server/verify.zod.js +12 -0
- package/dist/wire/server/verify.zod.js.map +1 -0
- package/dist/wire/thorchain.zod.d.ts +224 -0
- package/dist/wire/thorchain.zod.d.ts.map +1 -0
- package/dist/wire/thorchain.zod.js +51 -0
- package/dist/wire/thorchain.zod.js.map +1 -0
- package/package.json +128 -0
- package/wasm/miradex-rust/README.md +74 -0
- package/wasm/miradex-rust/miradex_rust.d.ts +149 -0
- package/wasm/miradex-rust/miradex_rust.js +943 -0
- package/wasm/miradex-rust/miradex_rust_bg.wasm +0 -0
- package/wasm/miradex-rust/miradex_rust_bg.wasm.d.ts +31 -0
- 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 @@
|
|
|
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"}
|