@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
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Client-side TxRefund construction, signing, and witness assembly.
|
|
3
|
+
*
|
|
4
|
+
* Bob never transmits `s_b` or `b` to the server. Alice's adaptor-encrypted
|
|
5
|
+
* signature on TxRefund is decrypted locally using `s_b` (byte-reversed from
|
|
6
|
+
* Ed25519 little-endian to secp256k1 big-endian). Bob signs the same digest
|
|
7
|
+
* with `b`. Both 64-byte compact signatures are DER-encoded, the SIGHASH_ALL
|
|
8
|
+
* byte is appended, and they are placed on the witness stack in the order
|
|
9
|
+
* `[sig_B, sig_A, witness_script]` so the P2WSH script `<A>
|
|
10
|
+
* OP_CHECKSIGVERIFY <B> OP_CHECKSIG` verifies.
|
|
11
|
+
*
|
|
12
|
+
* Reference: `new-eigenwallet/new-core/swap-core/src/bitcoin/full_refund.rs`
|
|
13
|
+
* and Part 6 of `miradex-client-tx-refund-client-side-spec.md`.
|
|
14
|
+
*/
|
|
15
|
+
import * as bitcoin from 'bitcoinjs-lib';
|
|
16
|
+
import * as ecc from 'tiny-secp256k1';
|
|
17
|
+
import { decryptSignature, verifyEncsig, signDigest } from '../lib/crypto/wasm.js';
|
|
18
|
+
import { buildMultisigWitnessScript } from './presign.js';
|
|
19
|
+
import { VerificationError, DEFAULT_DUST_POLICY } from '../types/verification.js';
|
|
20
|
+
import { ProtocolError } from '../types/protocol.js';
|
|
21
|
+
const SEQUENCE_FINAL = 0xffffffff;
|
|
22
|
+
/** secp256k1 curve order n. */
|
|
23
|
+
const SECP256K1_N = BigInt('0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141');
|
|
24
|
+
/** n/2; canonical low-S upper bound. */
|
|
25
|
+
const SECP256K1_N_HALF = SECP256K1_N >> 1n;
|
|
26
|
+
function resolveNetwork(network) {
|
|
27
|
+
switch (network) {
|
|
28
|
+
case 'mainnet':
|
|
29
|
+
return bitcoin.networks.bitcoin;
|
|
30
|
+
case 'regtest':
|
|
31
|
+
return bitcoin.networks.regtest;
|
|
32
|
+
case 'testnet':
|
|
33
|
+
return bitcoin.networks.testnet;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
function reverseHex(hex) {
|
|
37
|
+
return Buffer.from(Buffer.from(hex, 'hex')).reverse().toString('hex');
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Build an unsigned single-output TxRefund spending TxCancel's sole output.
|
|
41
|
+
* Returns the serialised tx hex and the output value in sats so callers can
|
|
42
|
+
* plumb it into the BIP143 sighash.
|
|
43
|
+
*/
|
|
44
|
+
export function buildFullRefund(params) {
|
|
45
|
+
const net = resolveNetwork(params.network);
|
|
46
|
+
const txCancel = bitcoin.Transaction.fromHex(params.txCancelHex);
|
|
47
|
+
const cancelOut = txCancel.outs[0];
|
|
48
|
+
if (!cancelOut) {
|
|
49
|
+
throw new ProtocolError('E_TX_CANCEL_MALFORMED', 'TxCancel has no output at index 0');
|
|
50
|
+
}
|
|
51
|
+
const cancelValue = BigInt(cancelOut.value);
|
|
52
|
+
const refundValue = cancelValue - params.refundFeeSats;
|
|
53
|
+
if (refundValue <= DEFAULT_DUST_POLICY.p2wpkhDustSats) {
|
|
54
|
+
throw new VerificationError('E_REFUND_DUST', `refund output ${refundValue.toString()} below P2WPKH dust floor ${DEFAULT_DUST_POLICY.p2wpkhDustSats.toString()}`);
|
|
55
|
+
}
|
|
56
|
+
const tx = new bitcoin.Transaction();
|
|
57
|
+
tx.version = 2;
|
|
58
|
+
tx.locktime = 0;
|
|
59
|
+
const txCancelTxidLE = Buffer.from(Buffer.from(txCancel.getId(), 'hex')).reverse();
|
|
60
|
+
tx.addInput(txCancelTxidLE, 0, SEQUENCE_FINAL);
|
|
61
|
+
tx.addOutput(bitcoin.address.toOutputScript(params.refundAddress, net), refundValue);
|
|
62
|
+
return {
|
|
63
|
+
txRefundHex: tx.toHex(),
|
|
64
|
+
refundOutputValueSats: refundValue,
|
|
65
|
+
cancelOutputValueSats: cancelValue,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Build an unsigned two-output TxPartialRefund (amnesty variant).
|
|
70
|
+
* - Output 0: refund back to Bob.
|
|
71
|
+
* - Output 1: new 2-of-2 P2WSH holding the amnesty amount.
|
|
72
|
+
*/
|
|
73
|
+
export function buildPartialRefund(params) {
|
|
74
|
+
const net = resolveNetwork(params.network);
|
|
75
|
+
const txCancel = bitcoin.Transaction.fromHex(params.txCancelHex);
|
|
76
|
+
const cancelOut = txCancel.outs[0];
|
|
77
|
+
if (!cancelOut) {
|
|
78
|
+
throw new ProtocolError('E_TX_CANCEL_MALFORMED', 'TxCancel has no output at index 0');
|
|
79
|
+
}
|
|
80
|
+
const cancelValue = BigInt(cancelOut.value);
|
|
81
|
+
const refundValue = cancelValue - params.amnestyAmountSats - params.partialRefundFeeSats;
|
|
82
|
+
if (refundValue <= DEFAULT_DUST_POLICY.p2wpkhDustSats) {
|
|
83
|
+
throw new VerificationError('E_REFUND_DUST', `partial refund output ${refundValue.toString()} below P2WPKH dust floor ${DEFAULT_DUST_POLICY.p2wpkhDustSats.toString()}`);
|
|
84
|
+
}
|
|
85
|
+
if (params.amnestyAmountSats <= DEFAULT_DUST_POLICY.p2wshDustSats) {
|
|
86
|
+
throw new VerificationError('E_AMNESTY_DUST', `amnesty output ${params.amnestyAmountSats.toString()} below P2WSH dust floor ${DEFAULT_DUST_POLICY.p2wshDustSats.toString()}`);
|
|
87
|
+
}
|
|
88
|
+
const witnessScript = buildMultisigWitnessScript(params.aPubHex, params.bPubHex);
|
|
89
|
+
const amnestyP2wsh = bitcoin.payments.p2wsh({
|
|
90
|
+
redeem: { output: witnessScript },
|
|
91
|
+
network: net,
|
|
92
|
+
});
|
|
93
|
+
if (!amnestyP2wsh.output) {
|
|
94
|
+
throw new ProtocolError('E_AMNESTY_DERIVE', 'failed to derive amnesty P2WSH');
|
|
95
|
+
}
|
|
96
|
+
const tx = new bitcoin.Transaction();
|
|
97
|
+
tx.version = 2;
|
|
98
|
+
tx.locktime = 0;
|
|
99
|
+
const txCancelTxidLE = Buffer.from(Buffer.from(txCancel.getId(), 'hex')).reverse();
|
|
100
|
+
tx.addInput(txCancelTxidLE, 0, SEQUENCE_FINAL);
|
|
101
|
+
tx.addOutput(bitcoin.address.toOutputScript(params.refundAddress, net), refundValue);
|
|
102
|
+
tx.addOutput(Buffer.from(amnestyP2wsh.output), params.amnestyAmountSats);
|
|
103
|
+
return {
|
|
104
|
+
txRefundHex: tx.toHex(),
|
|
105
|
+
refundOutputValueSats: refundValue,
|
|
106
|
+
amnestyOutputValueSats: params.amnestyAmountSats,
|
|
107
|
+
cancelOutputValueSats: cancelValue,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Verify encsig, decrypt Alice's signature, sign with Bob's key, DER-encode,
|
|
112
|
+
* append SIGHASH_ALL, and assemble the 2-of-2 witness.
|
|
113
|
+
*/
|
|
114
|
+
export function signRefund(params) {
|
|
115
|
+
const tx = bitcoin.Transaction.fromHex(params.txRefundHex);
|
|
116
|
+
const digest = Buffer.from(tx.hashForWitnessV0(0, params.witnessScript, params.txCancelOutputValueSats, bitcoin.Transaction.SIGHASH_ALL));
|
|
117
|
+
const digestHex = digest.toString('hex');
|
|
118
|
+
const encsigOk = verifyEncsig(params.aPubHex, params.sBPubHex, digestHex, params.encsigRefund);
|
|
119
|
+
if (!encsigOk) {
|
|
120
|
+
throw new VerificationError('E_ENCSIG_REFUND_INVALID', 'Alice encsig_refund does not verify under the recomputed refund digest');
|
|
121
|
+
}
|
|
122
|
+
const sBSecp = reverseHex(params.sBHexLE);
|
|
123
|
+
const sigACompact = Buffer.from(decryptSignature(sBSecp, params.encsigRefund), 'hex');
|
|
124
|
+
const sigBCompact = Buffer.from(signDigest(params.bHex, digestHex), 'hex');
|
|
125
|
+
if (!isLowS(sigACompact)) {
|
|
126
|
+
throw new VerificationError('E_SIG_HIGH_S', 'decrypted Alice sig is not in low-S form');
|
|
127
|
+
}
|
|
128
|
+
if (!isLowS(sigBCompact)) {
|
|
129
|
+
throw new VerificationError('E_SIG_HIGH_S', 'Bob sig is not in low-S form');
|
|
130
|
+
}
|
|
131
|
+
const aPub = Buffer.from(params.aPubHex, 'hex');
|
|
132
|
+
const bPub = Buffer.from(params.bPubHex, 'hex');
|
|
133
|
+
if (!ecc.verify(digest, aPub, sigACompact)) {
|
|
134
|
+
throw new VerificationError('E_REFUND_SIG_A', 'Alice sig fails local ECDSA verification against A');
|
|
135
|
+
}
|
|
136
|
+
if (!ecc.verify(digest, bPub, sigBCompact)) {
|
|
137
|
+
throw new VerificationError('E_REFUND_SIG_B', 'Bob sig fails local ECDSA verification against B');
|
|
138
|
+
}
|
|
139
|
+
const sigAWithHashType = Buffer.concat([
|
|
140
|
+
compactToDer(sigACompact),
|
|
141
|
+
Buffer.from([bitcoin.Transaction.SIGHASH_ALL]),
|
|
142
|
+
]);
|
|
143
|
+
const sigBWithHashType = Buffer.concat([
|
|
144
|
+
compactToDer(sigBCompact),
|
|
145
|
+
Buffer.from([bitcoin.Transaction.SIGHASH_ALL]),
|
|
146
|
+
]);
|
|
147
|
+
const firstInput = tx.ins[0];
|
|
148
|
+
if (!firstInput) {
|
|
149
|
+
throw new ProtocolError('E_TX_CANCEL_MALFORMED', 'unsigned refund tx has no input 0');
|
|
150
|
+
}
|
|
151
|
+
firstInput.witness = [sigBWithHashType, sigAWithHashType, params.witnessScript];
|
|
152
|
+
params.logger?.debug({ digest: digestHex, txid: tx.getId() }, 'assembled client-side TxRefund');
|
|
153
|
+
return {
|
|
154
|
+
txid: tx.getId(),
|
|
155
|
+
hex: tx.toHex(),
|
|
156
|
+
digestHex,
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Encode a 64-byte compact ECDSA signature as strict DER.
|
|
161
|
+
* The sighash byte is NOT appended; the caller concatenates SIGHASH_ALL.
|
|
162
|
+
*/
|
|
163
|
+
export function compactToDer(compact) {
|
|
164
|
+
if (compact.length !== 64) {
|
|
165
|
+
throw new Error(`expected 64-byte compact signature, got ${String(compact.length)}`);
|
|
166
|
+
}
|
|
167
|
+
const r = trimLeadingZeros(compact.subarray(0, 32));
|
|
168
|
+
const s = trimLeadingZeros(compact.subarray(32, 64));
|
|
169
|
+
const rEnc = encodeDerInteger(r);
|
|
170
|
+
const sEnc = encodeDerInteger(s);
|
|
171
|
+
const body = Buffer.concat([rEnc, sEnc]);
|
|
172
|
+
if (body.length > 0xff) {
|
|
173
|
+
throw new Error('DER body length overflows single byte');
|
|
174
|
+
}
|
|
175
|
+
return Buffer.concat([Buffer.from([0x30, body.length]), body]);
|
|
176
|
+
}
|
|
177
|
+
/** Decode a strict-DER ECDSA signature back into a 64-byte compact form. */
|
|
178
|
+
export function derToCompact(der) {
|
|
179
|
+
if (der.length < 8 || der[0] !== 0x30) {
|
|
180
|
+
throw new Error('DER must start with 0x30 SEQUENCE tag');
|
|
181
|
+
}
|
|
182
|
+
let i = 2;
|
|
183
|
+
if (der[i] !== 0x02)
|
|
184
|
+
throw new Error('expected r INTEGER tag');
|
|
185
|
+
const rLen = der[i + 1];
|
|
186
|
+
if (rLen === undefined)
|
|
187
|
+
throw new Error('DER truncated at r length');
|
|
188
|
+
const r = der.subarray(i + 2, i + 2 + rLen);
|
|
189
|
+
i += 2 + rLen;
|
|
190
|
+
if (der[i] !== 0x02)
|
|
191
|
+
throw new Error('expected s INTEGER tag');
|
|
192
|
+
const sLen = der[i + 1];
|
|
193
|
+
if (sLen === undefined)
|
|
194
|
+
throw new Error('DER truncated at s length');
|
|
195
|
+
const s = der.subarray(i + 2, i + 2 + sLen);
|
|
196
|
+
return Buffer.concat([padTo32(r), padTo32(s)]);
|
|
197
|
+
}
|
|
198
|
+
function trimLeadingZeros(buf) {
|
|
199
|
+
let i = 0;
|
|
200
|
+
while (i < buf.length - 1 && buf[i] === 0)
|
|
201
|
+
i++;
|
|
202
|
+
return buf.subarray(i);
|
|
203
|
+
}
|
|
204
|
+
function encodeDerInteger(integer) {
|
|
205
|
+
const high = integer[0] ?? 0;
|
|
206
|
+
const needsPrefix = (high & 0x80) !== 0;
|
|
207
|
+
const value = needsPrefix ? Buffer.concat([Buffer.from([0x00]), integer]) : integer;
|
|
208
|
+
return Buffer.concat([Buffer.from([0x02, value.length]), value]);
|
|
209
|
+
}
|
|
210
|
+
function padTo32(buf) {
|
|
211
|
+
if (buf.length === 32)
|
|
212
|
+
return buf;
|
|
213
|
+
if (buf.length > 32)
|
|
214
|
+
return buf.subarray(buf.length - 32);
|
|
215
|
+
return Buffer.concat([Buffer.alloc(32 - buf.length), buf]);
|
|
216
|
+
}
|
|
217
|
+
/** Reject high-S signatures (BIP146). */
|
|
218
|
+
export function isLowS(compact) {
|
|
219
|
+
if (compact.length !== 64)
|
|
220
|
+
return false;
|
|
221
|
+
const s = BigInt('0x' + compact.subarray(32, 64).toString('hex'));
|
|
222
|
+
return s > 0n && s <= SECP256K1_N_HALF;
|
|
223
|
+
}
|
|
224
|
+
//# sourceMappingURL=refund.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refund.js","sourceRoot":"","sources":["../../src/atomic-swap/refund.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { type RunAtomicSwapOptions, type ResumeAtomicSwapOptions } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Run a full client-side atomic swap from keygen through sweep completion.
|
|
4
|
+
*
|
|
5
|
+
* @internal Prefer `SwapExecutor.executeAtomicSwap` or `MiradexEngine` for
|
|
6
|
+
* stable consumer surface. This function is retained for advanced callers
|
|
7
|
+
* that need fine-grained control over the drive loop.
|
|
8
|
+
* @throws {SwapCancelledError} when the caller aborts via `signal`.
|
|
9
|
+
* @throws {VerificationError} when an independent crypto check fails.
|
|
10
|
+
* @throws {ProtocolError} when protocol-level state is unrecoverable.
|
|
11
|
+
*/
|
|
12
|
+
export declare function runAtomicSwap(options: RunAtomicSwapOptions): Promise<{
|
|
13
|
+
swapId: string;
|
|
14
|
+
keystoreId: string;
|
|
15
|
+
depositAddress: string;
|
|
16
|
+
}>;
|
|
17
|
+
/**
|
|
18
|
+
* Resume an atomic swap from a stored keystore + detected deposit. When
|
|
19
|
+
* `existingSwapId` is provided, picks up the existing swap from its current
|
|
20
|
+
* `requiredAction` without creating a new swap on the server.
|
|
21
|
+
*
|
|
22
|
+
* @internal Prefer `MiradexEngine.resume` / `AtomicFlow.resumeFromKeystore`.
|
|
23
|
+
*/
|
|
24
|
+
export declare function resumeAtomicSwap(options: ResumeAtomicSwapOptions): Promise<{
|
|
25
|
+
swapId: string;
|
|
26
|
+
}>;
|
|
27
|
+
//# sourceMappingURL=run.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/atomic-swap/run.ts"],"names":[],"mappings":"AAwBA,OAAO,EAEL,KAAK,oBAAoB,EACzB,KAAK,uBAAuB,EAC7B,MAAM,YAAY,CAAC;AAGpB;;;;;;;;;GASG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,CAAC,CAsMzE;AAED;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,uBAAuB,GAC/B,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAqG7B"}
|
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
import { noopLogger } from '../interfaces/logger.js';
|
|
2
|
+
import { generateClientKeysFromSeed } from '../lib/crypto/wasm.js';
|
|
3
|
+
import { generateMnemonicKeys } from '../lib/crypto/mnemonic.js';
|
|
4
|
+
import { walletFromWif } from '../lib/bitcoin/wallet.js';
|
|
5
|
+
import { createKeystore } from '../lib/keystore.js';
|
|
6
|
+
import { deriveLibp2pIdentity } from '../lib/crypto/libp2p-identity.js';
|
|
7
|
+
import { bytesToHex } from '@noble/hashes/utils.js';
|
|
8
|
+
import { randomBytes } from '@noble/hashes/utils.js';
|
|
9
|
+
import { watchForDeposit, estimateLockTxFee } from '../lib/bitcoin/deposit-watcher.js';
|
|
10
|
+
import { solveChallenge, encodePowHeader } from '../lib/pow-solver.js';
|
|
11
|
+
import { driveSwapToCompletion, createFundingProof, } from './drive.js';
|
|
12
|
+
import { SwapCancelledError, } from './types.js';
|
|
13
|
+
import { ProtocolError } from '../types/protocol.js';
|
|
14
|
+
/**
|
|
15
|
+
* Run a full client-side atomic swap from keygen through sweep completion.
|
|
16
|
+
*
|
|
17
|
+
* @internal Prefer `SwapExecutor.executeAtomicSwap` or `MiradexEngine` for
|
|
18
|
+
* stable consumer surface. This function is retained for advanced callers
|
|
19
|
+
* that need fine-grained control over the drive loop.
|
|
20
|
+
* @throws {SwapCancelledError} when the caller aborts via `signal`.
|
|
21
|
+
* @throws {VerificationError} when an independent crypto check fails.
|
|
22
|
+
* @throws {ProtocolError} when protocol-level state is unrecoverable.
|
|
23
|
+
*/
|
|
24
|
+
export async function runAtomicSwap(options) {
|
|
25
|
+
const { api, params, callbacks, signal, fetchFn = globalThis.fetch } = options;
|
|
26
|
+
const { destAddress, refundAddress, network = 'mainnet' } = params;
|
|
27
|
+
const log = params.logger ?? noopLogger;
|
|
28
|
+
const { onProgress } = callbacks;
|
|
29
|
+
log.info({ network, destAddress, refundAddress, amount: params.amount }, 'Starting atomic swap');
|
|
30
|
+
onProgress({ stage: 'keygen', message: 'Generating swap keys' });
|
|
31
|
+
const mnemonicKeys = generateMnemonicKeys(network);
|
|
32
|
+
const keys = generateClientKeysFromSeed(mnemonicKeys.s_b_seed, mnemonicKeys.v_b_seed, mnemonicKeys.b_seed);
|
|
33
|
+
const wallet = walletFromWif(mnemonicKeys.wif, network);
|
|
34
|
+
const verification = await api.verifyKeys({
|
|
35
|
+
s_b_bitcoin: keys.s_b_bitcoin,
|
|
36
|
+
s_b_monero: keys.s_b_monero,
|
|
37
|
+
dleq_proof: keys.dleq_proof,
|
|
38
|
+
v_b: keys.v_b,
|
|
39
|
+
});
|
|
40
|
+
if (!verification.valid) {
|
|
41
|
+
log.error({ reason: verification.reason }, 'Key verification failed');
|
|
42
|
+
throw new Error(`Key verification failed: ${verification.reason}. DO NOT DEPOSIT.`);
|
|
43
|
+
}
|
|
44
|
+
log.info({ network, destAddress, refundAddress }, '[run] starting new atomic swap');
|
|
45
|
+
const masterSeedHex = bytesToHex(randomBytes(32));
|
|
46
|
+
const libp2pIdentity = await deriveLibp2pIdentity(masterSeedHex);
|
|
47
|
+
log.info({ peerId: libp2pIdentity.libp2pPeerId }, '[run] per-swap libp2p identity derived (seed in keystore, peer-id forwarded to sidecar)');
|
|
48
|
+
const keystore = createKeystore({
|
|
49
|
+
wif: wallet.wif,
|
|
50
|
+
btcAddress: wallet.address,
|
|
51
|
+
network,
|
|
52
|
+
s_b: keys.s_b,
|
|
53
|
+
v_b: keys.v_b,
|
|
54
|
+
S_b_bitcoin: keys.s_b_bitcoin,
|
|
55
|
+
S_b_monero: keys.s_b_monero,
|
|
56
|
+
dleq_proof: keys.dleq_proof,
|
|
57
|
+
b: keys.b,
|
|
58
|
+
B: keys.B,
|
|
59
|
+
eigenwallet_master_seed: masterSeedHex,
|
|
60
|
+
libp2p_peer_id: libp2pIdentity.libp2pPeerId,
|
|
61
|
+
receiveAddress: destAddress,
|
|
62
|
+
refundAddress,
|
|
63
|
+
mnemonic: mnemonicKeys.mnemonic,
|
|
64
|
+
derivation: mnemonicKeys.derivation,
|
|
65
|
+
});
|
|
66
|
+
const keystoreId = `swap-backup-${String(Date.now())}`;
|
|
67
|
+
await callbacks.saveKeystore(keystoreId, JSON.stringify(keystore, null, 2));
|
|
68
|
+
onProgress({
|
|
69
|
+
stage: 'keystore_saved',
|
|
70
|
+
message: `Keystore saved (contains recovery mnemonic): ${keystoreId}`,
|
|
71
|
+
keystoreId,
|
|
72
|
+
depositAddress: wallet.address,
|
|
73
|
+
});
|
|
74
|
+
const { feeSats: preFee } = await estimateLockTxFee({
|
|
75
|
+
network, fetchFn, blockchain: params.blockchain,
|
|
76
|
+
});
|
|
77
|
+
const userAmountSats = Math.round(parseFloat(params.amount) * 1e8);
|
|
78
|
+
const requiredDepositSats = userAmountSats + preFee;
|
|
79
|
+
const requiredDepositBtc = (requiredDepositSats / 1e8).toFixed(8);
|
|
80
|
+
let expectedXmr = '';
|
|
81
|
+
try {
|
|
82
|
+
const quotes = await api.getQuotes({ from: 'BTC', to: 'XMR', amount: params.amount });
|
|
83
|
+
const atomicQuote = quotes.quotes?.find((q) => q.provider === 'atomicswap');
|
|
84
|
+
expectedXmr = atomicQuote?.expectedOutput ?? '';
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
/* quote unavailable — non-fatal */
|
|
88
|
+
}
|
|
89
|
+
callbacks.onDepositRequired(wallet.address, requiredDepositBtc);
|
|
90
|
+
onProgress({
|
|
91
|
+
stage: 'awaiting_deposit',
|
|
92
|
+
message: `Send ${requiredDepositBtc} BTC to the address above. The swap will start automatically once the deposit is detected.`,
|
|
93
|
+
depositAddress: wallet.address,
|
|
94
|
+
depositAmount: requiredDepositBtc,
|
|
95
|
+
keystoreId,
|
|
96
|
+
expectedOutput: expectedXmr,
|
|
97
|
+
});
|
|
98
|
+
if (signal?.aborted) {
|
|
99
|
+
onProgress({ stage: 'cancelled', message: 'Swap cancelled.' });
|
|
100
|
+
throw new SwapCancelledError();
|
|
101
|
+
}
|
|
102
|
+
let deposit;
|
|
103
|
+
try {
|
|
104
|
+
deposit = await watchForDeposit({
|
|
105
|
+
address: wallet.address,
|
|
106
|
+
network,
|
|
107
|
+
signal,
|
|
108
|
+
fetchFn,
|
|
109
|
+
blockchain: params.blockchain,
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
if (signal?.aborted) {
|
|
114
|
+
onProgress({ stage: 'cancelled', message: 'Swap cancelled. No BTC was deposited.' });
|
|
115
|
+
throw new SwapCancelledError();
|
|
116
|
+
}
|
|
117
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
118
|
+
throw new Error(`Deposit watch failed: ${reason}`);
|
|
119
|
+
}
|
|
120
|
+
const depositBtc = (deposit.value / 1e8).toFixed(8);
|
|
121
|
+
onProgress({
|
|
122
|
+
stage: 'deposit_detected',
|
|
123
|
+
message: `Deposit detected: ${depositBtc} BTC (txid: ${deposit.txid.slice(0, 16)}...)`,
|
|
124
|
+
depositAddress: wallet.address,
|
|
125
|
+
});
|
|
126
|
+
if (signal?.aborted)
|
|
127
|
+
throw new SwapCancelledError();
|
|
128
|
+
onProgress({ stage: 'creating_swap', message: 'Estimating fee' });
|
|
129
|
+
const { feeSats, feeRate } = await estimateLockTxFee({
|
|
130
|
+
network, fetchFn, blockchain: params.blockchain,
|
|
131
|
+
});
|
|
132
|
+
const swapSats = deposit.value - feeSats;
|
|
133
|
+
if (swapSats <= 0) {
|
|
134
|
+
throw new Error(`Deposit too small: ${deposit.value} sats cannot cover ${feeSats} sat fee`);
|
|
135
|
+
}
|
|
136
|
+
const swapBtc = (swapSats / 1e8).toFixed(8);
|
|
137
|
+
onProgress({
|
|
138
|
+
stage: 'creating_swap',
|
|
139
|
+
message: `Fee: ${String(feeSats)} sats (${String(feeRate)} sat/vB). Swapping ${swapBtc} BTC.`,
|
|
140
|
+
});
|
|
141
|
+
const { fundingProof } = createFundingProof(wallet, deposit);
|
|
142
|
+
onProgress({ stage: 'creating_swap', message: 'Solving proof of work' });
|
|
143
|
+
const challenge = await api.getChallenge();
|
|
144
|
+
const powPayload = await solveChallenge(challenge);
|
|
145
|
+
const powHeader = encodePowHeader(powPayload);
|
|
146
|
+
const swapRes = await api.createSwap({
|
|
147
|
+
from: 'BTC',
|
|
148
|
+
to: 'XMR',
|
|
149
|
+
amount: swapBtc,
|
|
150
|
+
destAddress,
|
|
151
|
+
refundAddress,
|
|
152
|
+
provider: 'atomicswap',
|
|
153
|
+
...(params.variantId !== undefined ? { variantId: params.variantId } : {}),
|
|
154
|
+
protocol: {
|
|
155
|
+
type: 'atomicSwap',
|
|
156
|
+
atomicSwap: {
|
|
157
|
+
S_b_bitcoin: keys.s_b_bitcoin,
|
|
158
|
+
S_b_monero: keys.s_b_monero,
|
|
159
|
+
dleq_proof: keys.dleq_proof,
|
|
160
|
+
v_b: keys.v_b,
|
|
161
|
+
B: keys.B,
|
|
162
|
+
libp2p_seed_hex: keystore.keys.eigenwallet_master_seed,
|
|
163
|
+
},
|
|
164
|
+
fundingProof: [...fundingProof],
|
|
165
|
+
},
|
|
166
|
+
}, powHeader);
|
|
167
|
+
const swapId = swapRes.swapNumber;
|
|
168
|
+
log.info({ swapNumber: swapRes.swapNumber, amount: swapBtc, variantId: params.variantId ?? null }, 'Swap created on server');
|
|
169
|
+
onProgress({
|
|
170
|
+
stage: 'creating_swap',
|
|
171
|
+
message: `Swap created: ${swapRes.swapNumber}`,
|
|
172
|
+
swapId,
|
|
173
|
+
expectedOutput: swapRes.expectedAmountOut ?? undefined,
|
|
174
|
+
swapNumber: swapRes.swapNumber,
|
|
175
|
+
});
|
|
176
|
+
onProgress({ stage: 'creating_swap', message: 'Negotiating with maker', swapId });
|
|
177
|
+
await driveSwapToCompletion({
|
|
178
|
+
api, swapId, keystoreId, wallet, deposit, keystore, network, onProgress, signal, logger: log,
|
|
179
|
+
blockchain: params.blockchain,
|
|
180
|
+
saveProtocolSnapshot: callbacks.saveProtocolSnapshot,
|
|
181
|
+
loadProtocolSnapshot: callbacks.loadProtocolSnapshot,
|
|
182
|
+
monerodNodes: params.monerodNodes,
|
|
183
|
+
});
|
|
184
|
+
return { swapId, keystoreId, depositAddress: wallet.address };
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Resume an atomic swap from a stored keystore + detected deposit. When
|
|
188
|
+
* `existingSwapId` is provided, picks up the existing swap from its current
|
|
189
|
+
* `requiredAction` without creating a new swap on the server.
|
|
190
|
+
*
|
|
191
|
+
* @internal Prefer `MiradexEngine.resume` / `AtomicFlow.resumeFromKeystore`.
|
|
192
|
+
*/
|
|
193
|
+
export async function resumeAtomicSwap(options) {
|
|
194
|
+
const { api, params, onProgress, signal, fetchFn = globalThis.fetch } = options;
|
|
195
|
+
const { keystore, deposit, network = 'mainnet' } = params;
|
|
196
|
+
const log = params.logger ?? noopLogger;
|
|
197
|
+
const destAddress = keystore.swap.receiveAddress;
|
|
198
|
+
const refundAddress = keystore.swap.refundAddress;
|
|
199
|
+
const wallet = walletFromWif(keystore.btc.wif, network);
|
|
200
|
+
let swapId = params.existingSwapId ?? '';
|
|
201
|
+
if (swapId) {
|
|
202
|
+
onProgress({ stage: 'creating_swap', message: 'Resuming existing swap', swapId });
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
// Creating a new swap from an existing keystore. Legacy V2-migrated
|
|
206
|
+
// keystores have an empty master seed and cannot start new swaps —
|
|
207
|
+
// their original libp2p identity is unrecoverable and cross-binary
|
|
208
|
+
// recovery won't work. Force the user to create a fresh keystore.
|
|
209
|
+
if (!keystore.keys.eigenwallet_master_seed) {
|
|
210
|
+
throw new ProtocolError('E_LIBP2P_SEED_REQUIRED', 'This keystore has no libp2p master seed. Create a fresh keystore to start a new swap.');
|
|
211
|
+
}
|
|
212
|
+
const depositBtc = (deposit.value / 1e8).toFixed(8);
|
|
213
|
+
onProgress({
|
|
214
|
+
stage: 'deposit_detected',
|
|
215
|
+
message: `Deposit: ${depositBtc} BTC (txid: ${deposit.txid.slice(0, 16)}...)`,
|
|
216
|
+
depositAddress: wallet.address,
|
|
217
|
+
});
|
|
218
|
+
if (signal?.aborted)
|
|
219
|
+
throw new SwapCancelledError();
|
|
220
|
+
const { feeSats, feeRate } = await estimateLockTxFee({
|
|
221
|
+
network, fetchFn, blockchain: params.blockchain,
|
|
222
|
+
});
|
|
223
|
+
const swapSats = deposit.value - feeSats;
|
|
224
|
+
if (swapSats <= 0) {
|
|
225
|
+
throw new Error(`Deposit too small: ${deposit.value} sats cannot cover ${feeSats} sat fee`);
|
|
226
|
+
}
|
|
227
|
+
const swapBtc = (swapSats / 1e8).toFixed(8);
|
|
228
|
+
onProgress({
|
|
229
|
+
stage: 'creating_swap',
|
|
230
|
+
message: `Fee: ${String(feeSats)} sats (${String(feeRate)} sat/vB). Swapping ${swapBtc} BTC.`,
|
|
231
|
+
});
|
|
232
|
+
const { fundingProof } = createFundingProof(wallet, deposit);
|
|
233
|
+
onProgress({ stage: 'creating_swap', message: 'Solving proof of work' });
|
|
234
|
+
const challenge = await api.getChallenge();
|
|
235
|
+
const powPayload = await solveChallenge(challenge);
|
|
236
|
+
const powHeader = encodePowHeader(powPayload);
|
|
237
|
+
const swapRes = await api.createSwap({
|
|
238
|
+
from: 'BTC',
|
|
239
|
+
to: 'XMR',
|
|
240
|
+
amount: swapBtc,
|
|
241
|
+
destAddress,
|
|
242
|
+
refundAddress,
|
|
243
|
+
provider: 'atomicswap',
|
|
244
|
+
...(params.variantId !== undefined ? { variantId: params.variantId } : {}),
|
|
245
|
+
protocol: {
|
|
246
|
+
type: 'atomicSwap',
|
|
247
|
+
atomicSwap: {
|
|
248
|
+
S_b_bitcoin: keystore.keys.S_b_bitcoin,
|
|
249
|
+
S_b_monero: keystore.keys.S_b_monero,
|
|
250
|
+
dleq_proof: keystore.keys.dleq_proof,
|
|
251
|
+
v_b: keystore.keys.v_b,
|
|
252
|
+
B: keystore.keys.B,
|
|
253
|
+
libp2p_seed_hex: keystore.keys.eigenwallet_master_seed,
|
|
254
|
+
},
|
|
255
|
+
fundingProof: [...fundingProof],
|
|
256
|
+
},
|
|
257
|
+
}, powHeader);
|
|
258
|
+
swapId = swapRes.swapNumber;
|
|
259
|
+
onProgress({
|
|
260
|
+
stage: 'creating_swap',
|
|
261
|
+
message: `Swap created: ${swapRes.swapNumber}`,
|
|
262
|
+
swapId,
|
|
263
|
+
expectedOutput: swapRes.expectedAmountOut ?? undefined,
|
|
264
|
+
swapNumber: swapRes.swapNumber,
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
// Resume path: keystoreId isn't reliably known here (the caller loaded the
|
|
268
|
+
// keystore from storage and we don't carry the id through). Derive a stable
|
|
269
|
+
// placeholder from the BTC address so downstream consumers can still tell
|
|
270
|
+
// which keystore the snapshot is for.
|
|
271
|
+
const resumedKeystoreId = `resumed-${keystore.btc.address}`;
|
|
272
|
+
await driveSwapToCompletion({
|
|
273
|
+
api, swapId, keystoreId: resumedKeystoreId,
|
|
274
|
+
wallet, deposit, keystore, network, onProgress, signal, logger: log,
|
|
275
|
+
blockchain: params.blockchain,
|
|
276
|
+
saveProtocolSnapshot: options.saveProtocolSnapshot,
|
|
277
|
+
loadProtocolSnapshot: options.loadProtocolSnapshot,
|
|
278
|
+
monerodNodes: params.monerodNodes,
|
|
279
|
+
});
|
|
280
|
+
return { swapId };
|
|
281
|
+
}
|
|
282
|
+
//# sourceMappingURL=run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/atomic-swap/run.ts"],"names":[],"mappings":"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"}
|