@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,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Recovery snapshot for a single atomic swap.
|
|
3
|
+
*
|
|
4
|
+
* Pairs with the keystore to let a recovery binary (eigenwallet swap CLI or
|
|
5
|
+
* Tauri GUI) drive a stuck swap to a terminal state. The snapshot is written
|
|
6
|
+
* exactly once per swap, between receiving Alice's encsig in /presigs and
|
|
7
|
+
* posting the signed PSBT to /fund — so it's guaranteed to exist before any
|
|
8
|
+
* on-chain commitment.
|
|
9
|
+
*
|
|
10
|
+
* The snapshot contains only PUBLIC protocol material; private keys live in
|
|
11
|
+
* the keystore. Together they are necessary and sufficient.
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* Bumped to 2 when Alice's `tx_cancel_sig` was added to
|
|
15
|
+
* `ProtocolParamsSnapshot`. Recovery binaries that need the autonomous-cancel
|
|
16
|
+
* field MUST refuse v1 snapshots; tools that only consume the always-present
|
|
17
|
+
* fields can keep accepting v1.
|
|
18
|
+
*/
|
|
19
|
+
export declare const SNAPSHOT_VERSION: 2;
|
|
20
|
+
export type ProtocolSnapshotPhase = 'funded-with-encsigs';
|
|
21
|
+
export interface ProtocolSnapshot {
|
|
22
|
+
readonly snapshotVersion: typeof SNAPSHOT_VERSION;
|
|
23
|
+
readonly capturedAtEpochMs: number;
|
|
24
|
+
readonly capturedBy: 'miradex-client';
|
|
25
|
+
readonly capturedByVersion: string;
|
|
26
|
+
readonly phaseMarker: ProtocolSnapshotPhase;
|
|
27
|
+
readonly swapId: string;
|
|
28
|
+
readonly externalSwapId: string;
|
|
29
|
+
readonly keystoreId: string;
|
|
30
|
+
readonly network: 'mainnet' | 'testnet' | 'regtest';
|
|
31
|
+
readonly protocolParams: ProtocolParamsSnapshot;
|
|
32
|
+
readonly lockTx: LockTxSnapshot;
|
|
33
|
+
readonly maker: MakerSnapshot;
|
|
34
|
+
readonly chain: ChainSnapshot;
|
|
35
|
+
readonly digest: string;
|
|
36
|
+
}
|
|
37
|
+
export interface ProtocolParamsSnapshot {
|
|
38
|
+
readonly A: string;
|
|
39
|
+
readonly S_a_bitcoin: string;
|
|
40
|
+
readonly S_a_monero: string;
|
|
41
|
+
readonly v_a: string | null;
|
|
42
|
+
readonly cancel_timelock: number;
|
|
43
|
+
readonly punish_timelock: number;
|
|
44
|
+
readonly remaining_refund_timelock: number | null;
|
|
45
|
+
readonly redeem_address: string;
|
|
46
|
+
readonly punish_address: string;
|
|
47
|
+
readonly tx_cancel_fee_sats: string;
|
|
48
|
+
readonly tx_refund_fee_sats: string;
|
|
49
|
+
readonly tx_redeem_fee_sats: string;
|
|
50
|
+
readonly tx_punish_fee_sats: string;
|
|
51
|
+
readonly amnesty_amount_sats: string | null;
|
|
52
|
+
readonly tx_partial_refund_fee_sats: string | null;
|
|
53
|
+
readonly tx_reclaim_fee_sats: string | null;
|
|
54
|
+
readonly tx_withhold_fee_sats: string | null;
|
|
55
|
+
readonly tx_mercy_fee_sats: string | null;
|
|
56
|
+
readonly monero_lock_address: string | null;
|
|
57
|
+
readonly xmr_amount_pico: string;
|
|
58
|
+
readonly tx_full_refund_encsig: string | null;
|
|
59
|
+
readonly tx_partial_refund_encsig: string | null;
|
|
60
|
+
/**
|
|
61
|
+
* Alice's plain ECDSA pre-sig on TxCancel (Message3). Persisted so a
|
|
62
|
+
* future autonomous-cancel binary can construct + broadcast TxCancel
|
|
63
|
+
* without the sidecar. Null when the sidecar version in front of this
|
|
64
|
+
* client did not surface it; in that case recovery still works through
|
|
65
|
+
* the sidecar-published cancel path. V-16 enabling-work.
|
|
66
|
+
*/
|
|
67
|
+
readonly tx_cancel_sig: string | null;
|
|
68
|
+
}
|
|
69
|
+
export interface LockTxSnapshot {
|
|
70
|
+
readonly txid: string;
|
|
71
|
+
readonly vout: number;
|
|
72
|
+
readonly amountSats: string;
|
|
73
|
+
/** UNSIGNED PSBT base64 — recovery binary signs locally with key from keystore. */
|
|
74
|
+
readonly unsignedPsbtBase64: string;
|
|
75
|
+
readonly lockAddress: string;
|
|
76
|
+
}
|
|
77
|
+
export interface MakerSnapshot {
|
|
78
|
+
readonly peerId: string;
|
|
79
|
+
readonly multiaddrs: ReadonlyArray<string>;
|
|
80
|
+
}
|
|
81
|
+
export interface ChainSnapshot {
|
|
82
|
+
readonly moneroWalletRestoreBlockheight: number | null;
|
|
83
|
+
readonly lockTransferProof: {
|
|
84
|
+
readonly tx_hash: string;
|
|
85
|
+
readonly tx_key: string | null;
|
|
86
|
+
} | null;
|
|
87
|
+
readonly sidecarStateAtCapture: string;
|
|
88
|
+
}
|
|
89
|
+
export interface BuildProtocolSnapshotInput {
|
|
90
|
+
readonly swapId: string;
|
|
91
|
+
readonly externalSwapId: string;
|
|
92
|
+
readonly keystoreId: string;
|
|
93
|
+
readonly network: 'mainnet' | 'testnet' | 'regtest';
|
|
94
|
+
readonly capturedByVersion: string;
|
|
95
|
+
readonly capturedAtEpochMs: number;
|
|
96
|
+
readonly protocolParams: ProtocolParamsSnapshot;
|
|
97
|
+
readonly lockTx: LockTxSnapshot;
|
|
98
|
+
readonly maker: MakerSnapshot;
|
|
99
|
+
readonly chain: ChainSnapshot;
|
|
100
|
+
readonly phaseMarker?: ProtocolSnapshotPhase;
|
|
101
|
+
}
|
|
102
|
+
export declare function buildProtocolSnapshot(input: BuildProtocolSnapshotInput): ProtocolSnapshot;
|
|
103
|
+
/**
|
|
104
|
+
* Reproducible serialization with sorted keys. The recovery tool can compute
|
|
105
|
+
* the same digest from the snapshot (minus the digest field) and reject
|
|
106
|
+
* tampered or corrupted files.
|
|
107
|
+
*/
|
|
108
|
+
export declare function canonicalSerialize(obj: unknown): string;
|
|
109
|
+
export declare function computeSnapshotDigest(snapshotBody: unknown): string;
|
|
110
|
+
export declare function verifySnapshotIntegrity(snapshot: ProtocolSnapshot): boolean;
|
|
111
|
+
//# sourceMappingURL=snapshot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../../src/atomic-swap/snapshot.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Recovery snapshot for a single atomic swap.
|
|
3
|
+
*
|
|
4
|
+
* Pairs with the keystore to let a recovery binary (eigenwallet swap CLI or
|
|
5
|
+
* Tauri GUI) drive a stuck swap to a terminal state. The snapshot is written
|
|
6
|
+
* exactly once per swap, between receiving Alice's encsig in /presigs and
|
|
7
|
+
* posting the signed PSBT to /fund — so it's guaranteed to exist before any
|
|
8
|
+
* on-chain commitment.
|
|
9
|
+
*
|
|
10
|
+
* The snapshot contains only PUBLIC protocol material; private keys live in
|
|
11
|
+
* the keystore. Together they are necessary and sufficient.
|
|
12
|
+
*/
|
|
13
|
+
import { sha256 } from '@noble/hashes/sha2.js';
|
|
14
|
+
import { bytesToHex } from '@noble/hashes/utils.js';
|
|
15
|
+
/**
|
|
16
|
+
* Bumped to 2 when Alice's `tx_cancel_sig` was added to
|
|
17
|
+
* `ProtocolParamsSnapshot`. Recovery binaries that need the autonomous-cancel
|
|
18
|
+
* field MUST refuse v1 snapshots; tools that only consume the always-present
|
|
19
|
+
* fields can keep accepting v1.
|
|
20
|
+
*/
|
|
21
|
+
export const SNAPSHOT_VERSION = 2;
|
|
22
|
+
export function buildProtocolSnapshot(input) {
|
|
23
|
+
const body = {
|
|
24
|
+
snapshotVersion: SNAPSHOT_VERSION,
|
|
25
|
+
capturedAtEpochMs: input.capturedAtEpochMs,
|
|
26
|
+
capturedBy: 'miradex-client',
|
|
27
|
+
capturedByVersion: input.capturedByVersion,
|
|
28
|
+
phaseMarker: input.phaseMarker ?? 'funded-with-encsigs',
|
|
29
|
+
swapId: input.swapId,
|
|
30
|
+
externalSwapId: input.externalSwapId,
|
|
31
|
+
keystoreId: input.keystoreId,
|
|
32
|
+
network: input.network,
|
|
33
|
+
protocolParams: input.protocolParams,
|
|
34
|
+
lockTx: input.lockTx,
|
|
35
|
+
maker: input.maker,
|
|
36
|
+
chain: input.chain,
|
|
37
|
+
};
|
|
38
|
+
const digest = computeSnapshotDigest(body);
|
|
39
|
+
return { ...body, digest };
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Reproducible serialization with sorted keys. The recovery tool can compute
|
|
43
|
+
* the same digest from the snapshot (minus the digest field) and reject
|
|
44
|
+
* tampered or corrupted files.
|
|
45
|
+
*/
|
|
46
|
+
export function canonicalSerialize(obj) {
|
|
47
|
+
return JSON.stringify(sortKeysDeep(obj));
|
|
48
|
+
}
|
|
49
|
+
function sortKeysDeep(value) {
|
|
50
|
+
if (Array.isArray(value)) {
|
|
51
|
+
return value.map(sortKeysDeep);
|
|
52
|
+
}
|
|
53
|
+
if (value !== null && typeof value === 'object') {
|
|
54
|
+
const entries = Object.entries(value)
|
|
55
|
+
.map(([k, v]) => [k, sortKeysDeep(v)])
|
|
56
|
+
.sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0));
|
|
57
|
+
return Object.fromEntries(entries);
|
|
58
|
+
}
|
|
59
|
+
return value;
|
|
60
|
+
}
|
|
61
|
+
export function computeSnapshotDigest(snapshotBody) {
|
|
62
|
+
const canonical = canonicalSerialize(snapshotBody);
|
|
63
|
+
return bytesToHex(sha256(new TextEncoder().encode(canonical)));
|
|
64
|
+
}
|
|
65
|
+
export function verifySnapshotIntegrity(snapshot) {
|
|
66
|
+
const { digest, ...body } = snapshot;
|
|
67
|
+
return computeSnapshotDigest(body) === digest;
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=snapshot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../../src/atomic-swap/snapshot.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEpD;;;;;GAKG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAU,CAAC;AAoG3C,MAAM,UAAU,qBAAqB,CAAC,KAAiC;IACrE,MAAM,IAAI,GAAG;QACX,eAAe,EAAE,gBAAgB;QACjC,iBAAiB,EAAE,KAAK,CAAC,iBAAiB;QAC1C,UAAU,EAAE,gBAAyB;QACrC,iBAAiB,EAAE,KAAK,CAAC,iBAAiB;QAC1C,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,qBAAqB;QACvD,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,cAAc,EAAE,KAAK,CAAC,cAAc;QACpC,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,cAAc,EAAE,KAAK,CAAC,cAAc;QACpC,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,KAAK,EAAE,KAAK,CAAC,KAAK;KACnB,CAAC;IACF,MAAM,MAAM,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;IAC3C,OAAO,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,CAAC;AAC7B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAY;IAC7C,OAAO,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC;AAC3C,CAAC;AAED,SAAS,YAAY,CAAC,KAAc;IAClC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IACjC,CAAC;IACD,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAChD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC;aAC7D,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAU,CAAC;aAC9C,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACpD,OAAO,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,YAAqB;IACzD,MAAM,SAAS,GAAG,kBAAkB,CAAC,YAAY,CAAC,CAAC;IACnD,OAAO,UAAU,CAAC,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,QAA0B;IAChE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,QAAQ,CAAC;IACrC,OAAO,qBAAqB,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC;AAChD,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type SubmitEncsigParams } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Poll until the server signals `submit_encsig`, then compute the TxRedeem
|
|
4
|
+
* adaptor signature from the supplied signed PSBT and submit it.
|
|
5
|
+
*
|
|
6
|
+
* @internal Exposed for standalone experimentation. Production consumers
|
|
7
|
+
* should use `MiradexEngine` / `AtomicFlow`.
|
|
8
|
+
*/
|
|
9
|
+
export declare function submitEncsigWhenReady(options: SubmitEncsigParams): Promise<void>;
|
|
10
|
+
//# sourceMappingURL=submit-encsig.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"submit-encsig.d.ts","sourceRoot":"","sources":["../../src/atomic-swap/submit-encsig.ts"],"names":[],"mappings":"AAQA,OAAO,EAAsB,KAAK,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAKzE;;;;;;GAMG;AACH,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmDtF"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Standalone submit_encsig helper for external consumers. Internal drivers
|
|
3
|
+
* handle this inline inside `driveSwapToCompletion`.
|
|
4
|
+
*/
|
|
5
|
+
import { TERMINAL_STATUSES, ProtocolError } from '../types/index.js';
|
|
6
|
+
import { computeRedeemDigest } from './presign.js';
|
|
7
|
+
import { encsignDigest } from '../lib/crypto/wasm.js';
|
|
8
|
+
import { delay } from '../lib/delay.js';
|
|
9
|
+
import { SwapCancelledError } from './types.js';
|
|
10
|
+
const TIMEOUT_MS = 3_600_000;
|
|
11
|
+
const POLL_MS = 10_000;
|
|
12
|
+
/**
|
|
13
|
+
* Poll until the server signals `submit_encsig`, then compute the TxRedeem
|
|
14
|
+
* adaptor signature from the supplied signed PSBT and submit it.
|
|
15
|
+
*
|
|
16
|
+
* @internal Exposed for standalone experimentation. Production consumers
|
|
17
|
+
* should use `MiradexEngine` / `AtomicFlow`.
|
|
18
|
+
*/
|
|
19
|
+
export async function submitEncsigWhenReady(options) {
|
|
20
|
+
const { api, swapId, keys, signedPsbtBase64, network, onProgress, signal } = options;
|
|
21
|
+
const deadline = Date.now() + TIMEOUT_MS;
|
|
22
|
+
while (Date.now() < deadline) {
|
|
23
|
+
if (signal?.aborted)
|
|
24
|
+
throw new SwapCancelledError();
|
|
25
|
+
const detail = await api.getSwapDetail(swapId);
|
|
26
|
+
if (TERMINAL_STATUSES.has(detail.status))
|
|
27
|
+
return;
|
|
28
|
+
const actionType = detail.requiredAction?.type;
|
|
29
|
+
if (actionType === 'submit_encsig') {
|
|
30
|
+
onProgress({ stage: 'submit_encsig', message: 'Computing encrypted signature', swapId });
|
|
31
|
+
const protocolParams = detail.protocolData?.type === 'atomicswap' ? detail.protocolData.params : null;
|
|
32
|
+
if (!protocolParams) {
|
|
33
|
+
throw new ProtocolError('E_PROTOCOL_PARAMS_MISSING', 'server requested submit_encsig but protocolParams are missing');
|
|
34
|
+
}
|
|
35
|
+
const redeemDigest = computeRedeemDigest({
|
|
36
|
+
signedPsbtBase64,
|
|
37
|
+
protocolParams,
|
|
38
|
+
bPubHex: keys.B,
|
|
39
|
+
network,
|
|
40
|
+
});
|
|
41
|
+
const txRedeemEncsig = encsignDigest(keys.b, protocolParams.S_a_bitcoin, redeemDigest);
|
|
42
|
+
onProgress({ stage: 'submit_encsig', message: 'Submitting encrypted signature', swapId });
|
|
43
|
+
await api.executeAction(swapId, {
|
|
44
|
+
type: 'submit_encsig',
|
|
45
|
+
tx_redeem_encsig: txRedeemEncsig,
|
|
46
|
+
});
|
|
47
|
+
onProgress({ stage: 'submit_encsig', message: 'Encrypted signature submitted', swapId });
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
if (actionType === 'cancel' || actionType === 'refund' || actionType === 'sweep')
|
|
51
|
+
return;
|
|
52
|
+
await delay(POLL_MS);
|
|
53
|
+
}
|
|
54
|
+
throw new ProtocolError('E_DRIVE_TIMEOUT', 'timed out waiting for submit_encsig signal');
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=submit-encsig.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"submit-encsig.js","sourceRoot":"","sources":["../../src/atomic-swap/submit-encsig.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,kBAAkB,EAA2B,MAAM,YAAY,CAAC;AAEzE,MAAM,UAAU,GAAG,SAAS,CAAC;AAC7B,MAAM,OAAO,GAAG,MAAM,CAAC;AAEvB;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,OAA2B;IACrE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IACrF,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC;IAEzC,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC7B,IAAI,MAAM,EAAE,OAAO;YAAE,MAAM,IAAI,kBAAkB,EAAE,CAAC;QAEpD,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAC/C,IAAI,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC;YAAE,OAAO;QAEjD,MAAM,UAAU,GAAG,MAAM,CAAC,cAAc,EAAE,IAAI,CAAC;QAE/C,IAAI,UAAU,KAAK,eAAe,EAAE,CAAC;YACnC,UAAU,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,+BAA+B,EAAE,MAAM,EAAE,CAAC,CAAC;YAEzF,MAAM,cAAc,GAClB,MAAM,CAAC,YAAY,EAAE,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;YACjF,IAAI,CAAC,cAAc,EAAE,CAAC;gBACpB,MAAM,IAAI,aAAa,CACrB,2BAA2B,EAC3B,+DAA+D,CAChE,CAAC;YACJ,CAAC;YAED,MAAM,YAAY,GAAG,mBAAmB,CAAC;gBACvC,gBAAgB;gBAChB,cAAc;gBACd,OAAO,EAAE,IAAI,CAAC,CAAC;gBACf,OAAO;aACR,CAAC,CAAC;YACH,MAAM,cAAc,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,EAAE,cAAc,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;YAEvF,UAAU,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,gCAAgC,EAAE,MAAM,EAAE,CAAC,CAAC;YAC1F,MAAM,GAAG,CAAC,aAAa,CAAC,MAAM,EAAE;gBAC9B,IAAI,EAAE,eAAe;gBACrB,gBAAgB,EAAE,cAAc;aACjC,CAAC,CAAC;YAEH,UAAU,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,+BAA+B,EAAE,MAAM,EAAE,CAAC,CAAC;YACzF,OAAO;QACT,CAAC;QAED,IAAI,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,OAAO;YAAE,OAAO;QAEzF,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC;IACvB,CAAC;IAED,MAAM,IAAI,aAAa,CACrB,iBAAiB,EACjB,4CAA4C,CAC7C,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared types and error classes for the BTC↔XMR atomic-swap driver.
|
|
3
|
+
*/
|
|
4
|
+
import type { Logger } from '../interfaces/logger.js';
|
|
5
|
+
import type { ApiClient } from '../api/index.js';
|
|
6
|
+
import type { VerificationResult, ClientKeys } from '../types/index.js';
|
|
7
|
+
import type { TempBtcWallet } from '../lib/bitcoin/wallet.js';
|
|
8
|
+
import type { SwapKeystore } from '../lib/keystore.js';
|
|
9
|
+
import type { DetectedDeposit } from '../lib/bitcoin/deposit-watcher.js';
|
|
10
|
+
import type { BlockchainDataProvider } from '../interfaces/blockchain.js';
|
|
11
|
+
export type AtomicSwapStage = 'keygen' | 'keystore_saved' | 'awaiting_deposit' | 'deposit_detected' | 'creating_swap' | 'signing_psbt' | 'funding' | 'submit_encsig' | 'verifying_xmr' | 'confirming' | 'sweeping' | 'complete' | 'cancelled' | 'error' | 'initializing' | 'pending' | 'awaiting_funding' | 'deposited' | 'swapping' | 'sending' | 'completed' | 'failed' | 'refunded' | 'cancelling' | 'withheld' | 'expired' | 'punished' | `unknown:${string}`;
|
|
12
|
+
/**
|
|
13
|
+
* Progress callback payload. Every stage populates `message`; per-stage
|
|
14
|
+
* fields:
|
|
15
|
+
*
|
|
16
|
+
* - `keygen` / `cancelled` / `error` — message only (plus swapId on error).
|
|
17
|
+
* - `keystore_saved` — `keystoreId`, `depositAddress`.
|
|
18
|
+
* - `awaiting_deposit` — `depositAddress`, `depositAmount`, `qr?`, `expectedOutput?`.
|
|
19
|
+
* - `deposit_detected` — `depositAddress`.
|
|
20
|
+
* - `creating_swap` — `swapId?`, `swapNumber?`, `expectedOutput?`.
|
|
21
|
+
* - `signing_psbt` — `swapId`, `verification?`.
|
|
22
|
+
* - `funding` / `submit_encsig` / `verifying_xmr` / `confirming` / `sweeping` — `swapId`.
|
|
23
|
+
* - `complete` — `swapId`, `txHash`.
|
|
24
|
+
* - `error` — `swapId?`, `errorCode?`.
|
|
25
|
+
*
|
|
26
|
+
* This remains a single readonly shape rather than a discriminated union to
|
|
27
|
+
* preserve call-site compatibility; consumers narrow by inspecting `stage`.
|
|
28
|
+
* Exhaustive-switch UIs can type-guard by stage + presence of the expected field.
|
|
29
|
+
*/
|
|
30
|
+
export interface AtomicSwapProgress {
|
|
31
|
+
readonly stage: AtomicSwapStage;
|
|
32
|
+
readonly message: string;
|
|
33
|
+
readonly keystoreId?: string;
|
|
34
|
+
readonly depositAddress?: string;
|
|
35
|
+
readonly depositAmount?: string;
|
|
36
|
+
readonly swapId?: string;
|
|
37
|
+
readonly txHash?: string;
|
|
38
|
+
readonly qr?: string;
|
|
39
|
+
readonly expectedOutput?: string;
|
|
40
|
+
readonly swapNumber?: string;
|
|
41
|
+
readonly verification?: VerificationResult;
|
|
42
|
+
/** Set on stage='error'. Maps to one of `ERROR_CODES`. */
|
|
43
|
+
readonly errorCode?: string;
|
|
44
|
+
}
|
|
45
|
+
export type ProgressCallback = (p: AtomicSwapProgress) => void;
|
|
46
|
+
export interface AtomicSwapCallbacks {
|
|
47
|
+
readonly onProgress: ProgressCallback;
|
|
48
|
+
readonly onDepositRequired: (address: string, amount: string, qr?: string) => void;
|
|
49
|
+
readonly saveKeystore: (id: string, json: string) => Promise<void>;
|
|
50
|
+
readonly loadKeystore: (id: string) => Promise<string | null>;
|
|
51
|
+
/**
|
|
52
|
+
* Persist the recovery snapshot for a swap. Called once per swap, AFTER the
|
|
53
|
+
* client has received Alice's encsig from /presigs and BEFORE it broadcasts
|
|
54
|
+
* via /fund. The snapshot pairs with the keystore to enable cross-binary
|
|
55
|
+
* recovery (e.g. via the eigenwallet swap CLI). Optional for back-compat.
|
|
56
|
+
*/
|
|
57
|
+
readonly saveProtocolSnapshot?: (swapId: string, snapshotJson: string) => Promise<void>;
|
|
58
|
+
readonly loadProtocolSnapshot?: (swapId: string) => Promise<string | null>;
|
|
59
|
+
}
|
|
60
|
+
export interface AtomicSwapParams {
|
|
61
|
+
readonly amount: string;
|
|
62
|
+
readonly destAddress: string;
|
|
63
|
+
readonly refundAddress: string;
|
|
64
|
+
readonly network?: 'mainnet' | 'testnet' | 'regtest';
|
|
65
|
+
readonly blockchain?: BlockchainDataProvider;
|
|
66
|
+
readonly logger?: Logger;
|
|
67
|
+
readonly monerodNodes?: readonly string[];
|
|
68
|
+
/**
|
|
69
|
+
* Pin a specific maker by `variantId` (as returned in `/quotes`) — e.g.
|
|
70
|
+
* `maker-K4ZK7eSx`. When omitted the server picks the highest-scored
|
|
71
|
+
* maker. Useful for load-distribution tests with multiple makers.
|
|
72
|
+
*/
|
|
73
|
+
readonly variantId?: string;
|
|
74
|
+
}
|
|
75
|
+
export interface AtomicSwapHandle {
|
|
76
|
+
readonly keystoreId: string;
|
|
77
|
+
readonly depositAddress: string;
|
|
78
|
+
readonly abort: () => void;
|
|
79
|
+
}
|
|
80
|
+
export interface RunAtomicSwapOptions {
|
|
81
|
+
readonly api: ApiClient;
|
|
82
|
+
readonly params: AtomicSwapParams;
|
|
83
|
+
readonly callbacks: AtomicSwapCallbacks;
|
|
84
|
+
readonly signal?: AbortSignal;
|
|
85
|
+
readonly fetchFn?: typeof globalThis.fetch;
|
|
86
|
+
}
|
|
87
|
+
export interface ResumeAtomicSwapParams {
|
|
88
|
+
readonly keystore: SwapKeystore;
|
|
89
|
+
readonly deposit: DetectedDeposit;
|
|
90
|
+
readonly network?: 'mainnet' | 'testnet' | 'regtest';
|
|
91
|
+
readonly blockchain?: BlockchainDataProvider;
|
|
92
|
+
readonly logger?: Logger;
|
|
93
|
+
readonly existingSwapId?: string;
|
|
94
|
+
readonly monerodNodes?: readonly string[];
|
|
95
|
+
/**
|
|
96
|
+
* Forwarded to `createSwap` when this resume call is creating a new swap
|
|
97
|
+
* (no `existingSwapId`). Pins a specific atomicswap maker. Ignored when
|
|
98
|
+
* `existingSwapId` is set because the maker was already chosen.
|
|
99
|
+
*/
|
|
100
|
+
readonly variantId?: string;
|
|
101
|
+
}
|
|
102
|
+
export interface ResumeAtomicSwapOptions {
|
|
103
|
+
readonly api: ApiClient;
|
|
104
|
+
readonly params: ResumeAtomicSwapParams;
|
|
105
|
+
readonly onProgress: ProgressCallback;
|
|
106
|
+
readonly signal?: AbortSignal;
|
|
107
|
+
readonly fetchFn?: typeof globalThis.fetch;
|
|
108
|
+
/**
|
|
109
|
+
* Optional snapshot persistence for resumed swaps. Normally the snapshot
|
|
110
|
+
* is written during the original run (between /presigs and /fund); the
|
|
111
|
+
* resume path writes a snapshot only if one hasn't been captured yet and
|
|
112
|
+
* the swap is still pre-fund.
|
|
113
|
+
*/
|
|
114
|
+
readonly saveProtocolSnapshot?: (swapId: string, snapshotJson: string) => Promise<void>;
|
|
115
|
+
readonly loadProtocolSnapshot?: (swapId: string) => Promise<string | null>;
|
|
116
|
+
}
|
|
117
|
+
export interface SubmitEncsigParams {
|
|
118
|
+
readonly api: ApiClient;
|
|
119
|
+
readonly swapId: string;
|
|
120
|
+
readonly keys: Pick<ClientKeys, 'b' | 'B'>;
|
|
121
|
+
readonly signedPsbtBase64: string;
|
|
122
|
+
readonly network: 'mainnet' | 'testnet' | 'regtest';
|
|
123
|
+
readonly onProgress: ProgressCallback;
|
|
124
|
+
readonly signal?: AbortSignal;
|
|
125
|
+
}
|
|
126
|
+
export interface DriveSwapOptions {
|
|
127
|
+
readonly api: ApiClient;
|
|
128
|
+
readonly swapId: string;
|
|
129
|
+
readonly keystoreId: string;
|
|
130
|
+
readonly wallet: TempBtcWallet;
|
|
131
|
+
readonly deposit: DetectedDeposit;
|
|
132
|
+
readonly keystore: SwapKeystore;
|
|
133
|
+
readonly network: 'mainnet' | 'testnet' | 'regtest';
|
|
134
|
+
readonly onProgress: ProgressCallback;
|
|
135
|
+
readonly signal?: AbortSignal;
|
|
136
|
+
readonly logger: Logger;
|
|
137
|
+
/**
|
|
138
|
+
* Blockchain data provider used by the resume path to fetch the raw
|
|
139
|
+
* TxLock hex when recomputing the redeem digest locally. Required by
|
|
140
|
+
* resumed swaps; the fresh-fund path never reads from it.
|
|
141
|
+
*/
|
|
142
|
+
readonly blockchain?: BlockchainDataProvider;
|
|
143
|
+
/**
|
|
144
|
+
* Optional snapshot persistence. When supplied, the driver writes a
|
|
145
|
+
* snapshot pairing with the keystore between /presigs and /fund — before
|
|
146
|
+
* any on-chain commitment.
|
|
147
|
+
*/
|
|
148
|
+
readonly saveProtocolSnapshot?: (swapId: string, snapshotJson: string) => Promise<void>;
|
|
149
|
+
readonly loadProtocolSnapshot?: (swapId: string) => Promise<string | null>;
|
|
150
|
+
/** Maker peer-id captured at swap-creation time, for the snapshot. */
|
|
151
|
+
readonly makerPeerId?: string;
|
|
152
|
+
/** Maker multiaddrs captured at swap-creation time, for the snapshot. */
|
|
153
|
+
readonly makerMultiaddrs?: ReadonlyArray<string>;
|
|
154
|
+
/** Optional package version stamped into the snapshot for diagnostics. */
|
|
155
|
+
readonly clientVersion?: string;
|
|
156
|
+
/** Optional override for Monero RPC nodes. Defaults to DEFAULT_NODES[network].monero. */
|
|
157
|
+
readonly monerodNodes?: readonly string[];
|
|
158
|
+
}
|
|
159
|
+
export interface FundingProofEntry {
|
|
160
|
+
readonly txid: string;
|
|
161
|
+
readonly vout: number;
|
|
162
|
+
readonly value: number;
|
|
163
|
+
readonly address: string;
|
|
164
|
+
readonly nonce: string;
|
|
165
|
+
readonly signature: string;
|
|
166
|
+
}
|
|
167
|
+
export { SwapCancelledError } from '../lib/errors.js';
|
|
168
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/atomic-swap/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
// SwapCancelledError lives in `lib/errors.ts` so retry.ts can import it
|
|
2
|
+
// without a circular dependency through `api/index.ts`. Re-exported here
|
|
3
|
+
// to preserve the historical import path.
|
|
4
|
+
export { SwapCancelledError } from '../lib/errors.js';
|
|
5
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/atomic-swap/types.ts"],"names":[],"mappings":"AA+MA,wEAAwE;AACxE,yEAAyE;AACzE,0CAA0C;AAC1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* N-of-M quorum wrapper for `BlockchainDataProvider`.
|
|
3
|
+
*
|
|
4
|
+
* Wraps several underlying providers and requires `quorum`-many to agree on
|
|
5
|
+
* each read. Removes the "single malicious Electrum server" failure mode
|
|
6
|
+
* (AV-E.4). Broadcast is not quorum-gated because one honest relay is
|
|
7
|
+
* sufficient to get the tx into the network.
|
|
8
|
+
*/
|
|
9
|
+
import type { BlockchainDataProvider } from '../interfaces/blockchain.js';
|
|
10
|
+
import type { Logger } from '../interfaces/logger.js';
|
|
11
|
+
export interface QuorumProviderConfig {
|
|
12
|
+
readonly providers: ReadonlyArray<BlockchainDataProvider>;
|
|
13
|
+
/** Minimum number of providers that must agree. Typically 2-of-3. */
|
|
14
|
+
readonly quorum: number;
|
|
15
|
+
readonly logger?: Logger;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Build a quorum provider from a set of underlying providers.
|
|
19
|
+
*
|
|
20
|
+
* @throws {VerificationError} `E_QUORUM_IMPOSSIBLE` if `providers.length < quorum`.
|
|
21
|
+
* @throws {VerificationError} `E_QUORUM_DISAGREE` (from method calls) when
|
|
22
|
+
* fewer than `quorum` providers agree on a value.
|
|
23
|
+
*/
|
|
24
|
+
export declare function createQuorumProvider(config: QuorumProviderConfig): BlockchainDataProvider;
|
|
25
|
+
//# sourceMappingURL=quorum-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quorum-provider.d.ts","sourceRoot":"","sources":["../../src/blockchain/quorum-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EACV,sBAAsB,EAGvB,MAAM,6BAA6B,CAAC;AACrC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAItD,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC,sBAAsB,CAAC,CAAC;IAC1D,qEAAqE;IACrE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,oBAAoB,GAAG,sBAAsB,CAwDzF"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { noopLogger } from '../interfaces/logger.js';
|
|
2
|
+
import { VerificationError } from '../types/index.js';
|
|
3
|
+
/**
|
|
4
|
+
* Build a quorum provider from a set of underlying providers.
|
|
5
|
+
*
|
|
6
|
+
* @throws {VerificationError} `E_QUORUM_IMPOSSIBLE` if `providers.length < quorum`.
|
|
7
|
+
* @throws {VerificationError} `E_QUORUM_DISAGREE` (from method calls) when
|
|
8
|
+
* fewer than `quorum` providers agree on a value.
|
|
9
|
+
*/
|
|
10
|
+
export function createQuorumProvider(config) {
|
|
11
|
+
if (config.providers.length < config.quorum) {
|
|
12
|
+
throw new VerificationError('E_QUORUM_IMPOSSIBLE', `need ${String(config.quorum)} providers but only ${String(config.providers.length)} supplied`);
|
|
13
|
+
}
|
|
14
|
+
const log = config.logger ?? noopLogger;
|
|
15
|
+
const providers = config.providers;
|
|
16
|
+
const quorum = config.quorum;
|
|
17
|
+
return {
|
|
18
|
+
async listUnspent(scriptHash) {
|
|
19
|
+
const settled = await Promise.allSettled(providers.map((p) => p.listUnspent(scriptHash)));
|
|
20
|
+
return pickQuorumUtxos(settled, quorum, log);
|
|
21
|
+
},
|
|
22
|
+
async getTransaction(txid) {
|
|
23
|
+
const settled = await Promise.allSettled(providers.map((p) => p.getTransaction(txid)));
|
|
24
|
+
return pickQuorumString(settled, quorum, log, 'getTransaction');
|
|
25
|
+
},
|
|
26
|
+
async getTransactionHeight(txid) {
|
|
27
|
+
const settled = await Promise.allSettled(providers.map((p) => p.getTransactionHeight(txid)));
|
|
28
|
+
return pickQuorumNumber(settled, quorum, log, 'getTransactionHeight');
|
|
29
|
+
},
|
|
30
|
+
async getHistory(scriptHash) {
|
|
31
|
+
const settled = await Promise.allSettled(providers.map((p) => p.getHistory(scriptHash)));
|
|
32
|
+
return pickQuorumHistory(settled, quorum, log);
|
|
33
|
+
},
|
|
34
|
+
async broadcastTransaction(hex) {
|
|
35
|
+
const errors = [];
|
|
36
|
+
for (const p of providers) {
|
|
37
|
+
try {
|
|
38
|
+
return await p.broadcastTransaction(hex);
|
|
39
|
+
}
|
|
40
|
+
catch (err) {
|
|
41
|
+
errors.push(err instanceof Error ? err.message : String(err));
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
throw new VerificationError('E_QUORUM_DISAGREE', `broadcast failed on every provider: ${errors.join('; ')}`);
|
|
45
|
+
},
|
|
46
|
+
async estimateFee(blocks) {
|
|
47
|
+
const settled = await Promise.allSettled(providers.map((p) => p.estimateFee(blocks)));
|
|
48
|
+
const nums = fulfilledValues(settled).filter((n) => Number.isFinite(n));
|
|
49
|
+
if (nums.length === 0) {
|
|
50
|
+
throw new VerificationError('E_QUORUM_DISAGREE', 'no provider returned a fee estimate');
|
|
51
|
+
}
|
|
52
|
+
const sorted = [...nums].sort((a, b) => a - b);
|
|
53
|
+
const mid = sorted[Math.floor(sorted.length / 2)];
|
|
54
|
+
return mid ?? 0;
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
function fulfilledValues(settled) {
|
|
59
|
+
return settled
|
|
60
|
+
.filter((s) => s.status === 'fulfilled')
|
|
61
|
+
.map((s) => s.value);
|
|
62
|
+
}
|
|
63
|
+
function pickQuorumString(settled, quorum, log, label) {
|
|
64
|
+
const counts = new Map();
|
|
65
|
+
for (const value of fulfilledValues(settled)) {
|
|
66
|
+
counts.set(value, (counts.get(value) ?? 0) + 1);
|
|
67
|
+
}
|
|
68
|
+
for (const [value, count] of counts) {
|
|
69
|
+
if (count >= quorum)
|
|
70
|
+
return value;
|
|
71
|
+
}
|
|
72
|
+
log.warn({ label, fulfilled: counts.size }, 'quorum-string disagree');
|
|
73
|
+
throw new VerificationError('E_QUORUM_DISAGREE', `${label}: no value agreed to by ${String(quorum)} providers`);
|
|
74
|
+
}
|
|
75
|
+
function pickQuorumNumber(settled, quorum, log, label) {
|
|
76
|
+
const values = fulfilledValues(settled).filter((n) => Number.isFinite(n));
|
|
77
|
+
if (values.length < quorum) {
|
|
78
|
+
log.warn({ label, fulfilled: values.length }, 'quorum-number too few responses');
|
|
79
|
+
throw new VerificationError('E_QUORUM_DISAGREE', `${label}: only ${String(values.length)} providers responded, need ${String(quorum)}`);
|
|
80
|
+
}
|
|
81
|
+
// Accept the median if at least `quorum` values fall within a ±1 band of it
|
|
82
|
+
// (handles normal propagation lag for block heights).
|
|
83
|
+
const sorted = [...values].sort((a, b) => a - b);
|
|
84
|
+
const median = sorted[Math.floor(sorted.length / 2)] ?? 0;
|
|
85
|
+
const agreeing = values.filter((v) => Math.abs(v - median) <= 1).length;
|
|
86
|
+
if (agreeing >= quorum)
|
|
87
|
+
return median;
|
|
88
|
+
throw new VerificationError('E_QUORUM_DISAGREE', `${label}: no median within ±1 agreed to by ${String(quorum)} providers`);
|
|
89
|
+
}
|
|
90
|
+
function utxoKey(u) {
|
|
91
|
+
return `${u.txid}:${String(u.vout)}:${String(u.value)}`;
|
|
92
|
+
}
|
|
93
|
+
function pickQuorumUtxos(settled, quorum, log) {
|
|
94
|
+
const counts = new Map();
|
|
95
|
+
for (const list of fulfilledValues(settled)) {
|
|
96
|
+
const seenInThisList = new Set();
|
|
97
|
+
for (const u of list) {
|
|
98
|
+
const key = utxoKey(u);
|
|
99
|
+
if (seenInThisList.has(key))
|
|
100
|
+
continue;
|
|
101
|
+
seenInThisList.add(key);
|
|
102
|
+
const entry = counts.get(key);
|
|
103
|
+
if (entry)
|
|
104
|
+
entry.count += 1;
|
|
105
|
+
else
|
|
106
|
+
counts.set(key, { utxo: u, count: 1 });
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
const accepted = [];
|
|
110
|
+
for (const [, entry] of counts) {
|
|
111
|
+
if (entry.count >= quorum)
|
|
112
|
+
accepted.push(entry.utxo);
|
|
113
|
+
}
|
|
114
|
+
log.debug({ distinct: counts.size, accepted: accepted.length, quorum }, 'quorum utxo merge');
|
|
115
|
+
return accepted;
|
|
116
|
+
}
|
|
117
|
+
function historyKey(h) {
|
|
118
|
+
return `${h.tx_hash}:${String(h.height)}`;
|
|
119
|
+
}
|
|
120
|
+
function pickQuorumHistory(settled, quorum, log) {
|
|
121
|
+
const counts = new Map();
|
|
122
|
+
for (const list of fulfilledValues(settled)) {
|
|
123
|
+
const seen = new Set();
|
|
124
|
+
for (const h of list) {
|
|
125
|
+
const key = historyKey(h);
|
|
126
|
+
if (seen.has(key))
|
|
127
|
+
continue;
|
|
128
|
+
seen.add(key);
|
|
129
|
+
const slot = counts.get(key);
|
|
130
|
+
if (slot)
|
|
131
|
+
slot.count += 1;
|
|
132
|
+
else
|
|
133
|
+
counts.set(key, { entry: h, count: 1 });
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
const accepted = [];
|
|
137
|
+
for (const [, slot] of counts) {
|
|
138
|
+
if (slot.count >= quorum)
|
|
139
|
+
accepted.push(slot.entry);
|
|
140
|
+
}
|
|
141
|
+
log.debug({ distinct: counts.size, accepted: accepted.length, quorum }, 'quorum history merge');
|
|
142
|
+
return accepted;
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=quorum-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quorum-provider.js","sourceRoot":"","sources":["../../src/blockchain/quorum-provider.ts"],"names":[],"mappings":"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"}
|