@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 @@
|
|
|
1
|
+
{"version":3,"file":"blockchain.js","sourceRoot":"","sources":["../../src/interfaces/blockchain.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Optional logger interface for core functions.
|
|
3
|
+
*
|
|
4
|
+
* Consumers provide their own implementation — file-based for CLI,
|
|
5
|
+
* console-based for browser, or a no-op for silent operation.
|
|
6
|
+
*/
|
|
7
|
+
export interface Logger {
|
|
8
|
+
debug(data: Readonly<Record<string, unknown>>, message: string): void;
|
|
9
|
+
info(data: Readonly<Record<string, unknown>>, message: string): void;
|
|
10
|
+
warn(data: Readonly<Record<string, unknown>>, message: string): void;
|
|
11
|
+
error(data: Readonly<Record<string, unknown>>, message: string): void;
|
|
12
|
+
}
|
|
13
|
+
export declare const noopLogger: Logger;
|
|
14
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/interfaces/logger.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,WAAW,MAAM;IACrB,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACtE,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACrE,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACrE,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACvE;AAED,eAAO,MAAM,UAAU,EAAE,MAKxB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/interfaces/logger.ts"],"names":[],"mappings":"AAaA,MAAM,CAAC,MAAM,UAAU,GAAW;IAChC,KAAK,KAAU,CAAC;IAChB,IAAI,KAAU,CAAC;IACf,IAAI,KAAU,CAAC;IACf,KAAK,KAAU,CAAC;CACjB,CAAC"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deposit detection and fee estimation for atomic swaps.
|
|
3
|
+
*
|
|
4
|
+
* Primary: BlockchainDataProvider (Electrum, WebSocket, etc — injected by caller).
|
|
5
|
+
* Fallback: mempool.space REST API (when no provider is available).
|
|
6
|
+
*/
|
|
7
|
+
import { type ElectrumServer } from './script-hash.js';
|
|
8
|
+
import type { BlockchainDataProvider } from '../../interfaces/blockchain.js';
|
|
9
|
+
export interface UtxoInput {
|
|
10
|
+
readonly txid: string;
|
|
11
|
+
readonly vout: number;
|
|
12
|
+
readonly value: number;
|
|
13
|
+
readonly height: number;
|
|
14
|
+
}
|
|
15
|
+
export interface DetectedDeposit {
|
|
16
|
+
readonly txid: string;
|
|
17
|
+
readonly vout: number;
|
|
18
|
+
readonly value: number;
|
|
19
|
+
readonly confirmations: number;
|
|
20
|
+
readonly status: 'mempool' | 'confirmed';
|
|
21
|
+
readonly utxos?: readonly UtxoInput[];
|
|
22
|
+
}
|
|
23
|
+
export interface WatchDepositParams {
|
|
24
|
+
readonly address: string;
|
|
25
|
+
readonly network?: 'mainnet' | 'testnet' | 'regtest';
|
|
26
|
+
readonly onStatus?: (msg: string) => void;
|
|
27
|
+
readonly signal?: AbortSignal;
|
|
28
|
+
readonly fetchFn?: typeof globalThis.fetch;
|
|
29
|
+
readonly blockchain?: BlockchainDataProvider;
|
|
30
|
+
}
|
|
31
|
+
export interface CheckDepositParams {
|
|
32
|
+
readonly address: string;
|
|
33
|
+
readonly network?: 'mainnet' | 'testnet' | 'regtest';
|
|
34
|
+
readonly fetchFn?: typeof globalThis.fetch;
|
|
35
|
+
readonly blockchain?: BlockchainDataProvider;
|
|
36
|
+
}
|
|
37
|
+
export interface EstimateFeeParams {
|
|
38
|
+
readonly network?: 'mainnet' | 'testnet' | 'regtest';
|
|
39
|
+
readonly fetchFn?: typeof globalThis.fetch;
|
|
40
|
+
readonly blockchain?: BlockchainDataProvider;
|
|
41
|
+
}
|
|
42
|
+
/** Build an ordered server list from a config URL string. */
|
|
43
|
+
export declare function resolveElectrumServers(configServer?: string): readonly ElectrumServer[];
|
|
44
|
+
/**
|
|
45
|
+
* One-shot deposit check — returns the first deposit found or null.
|
|
46
|
+
* Tries the blockchain provider first, falls back to mempool.space.
|
|
47
|
+
*/
|
|
48
|
+
export declare function checkDeposit(params: CheckDepositParams): Promise<DetectedDeposit | null>;
|
|
49
|
+
/**
|
|
50
|
+
* Poll for deposits using a blockchain provider with mempool.space fallback.
|
|
51
|
+
*
|
|
52
|
+
* If a BlockchainDataProvider is supplied, it is used as the primary data source.
|
|
53
|
+
* Otherwise, falls back to mempool.space REST API per-poll.
|
|
54
|
+
*/
|
|
55
|
+
export declare function watchForDeposit(params: WatchDepositParams): Promise<DetectedDeposit>;
|
|
56
|
+
/**
|
|
57
|
+
* Estimate the mining fee (in sats) for the lock transaction.
|
|
58
|
+
*
|
|
59
|
+
* Tries the blockchain provider first (6-block target),
|
|
60
|
+
* then mempool.space REST API, then falls back to 10 sat/vbyte.
|
|
61
|
+
*/
|
|
62
|
+
export declare function estimateLockTxFee(params?: EstimateFeeParams): Promise<{
|
|
63
|
+
readonly feeSats: number;
|
|
64
|
+
readonly feeRate: number;
|
|
65
|
+
}>;
|
|
66
|
+
//# sourceMappingURL=deposit-watcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deposit-watcher.d.ts","sourceRoot":"","sources":["../../../src/lib/bitcoin/deposit-watcher.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAyC,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC9F,OAAO,KAAK,EAAE,sBAAsB,EAAQ,MAAM,gCAAgC,CAAC;AAenF,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,WAAW,CAAC;IACzC,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,SAAS,EAAE,CAAC;CACvC;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;IACrD,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;IAC3C,QAAQ,CAAC,UAAU,CAAC,EAAE,sBAAsB,CAAC;CAC9C;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;IACrD,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;IAC3C,QAAQ,CAAC,UAAU,CAAC,EAAE,sBAAsB,CAAC;CAC9C;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;IACrD,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;IAC3C,QAAQ,CAAC,UAAU,CAAC,EAAE,sBAAsB,CAAC;CAC9C;AAaD,6DAA6D;AAC7D,wBAAgB,sBAAsB,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,cAAc,EAAE,CAKvF;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAS9F;AAgGD;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,eAAe,CAAC,CA2C1F;AAUD;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,GAAE,iBAAsB,GAC7B,OAAO,CAAC;IAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAYjE"}
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deposit detection and fee estimation for atomic swaps.
|
|
3
|
+
*
|
|
4
|
+
* Primary: BlockchainDataProvider (Electrum, WebSocket, etc — injected by caller).
|
|
5
|
+
* Fallback: mempool.space REST API (when no provider is available).
|
|
6
|
+
*/
|
|
7
|
+
import { delay } from '../delay.js';
|
|
8
|
+
import { addressToScriptHash, parseElectrumUrl } from './script-hash.js';
|
|
9
|
+
import { MEMPOOL_API, MEMPOOL_TESTNET_API, LOCK_TX_VBYTES, FALLBACK_FEE_RATE, MIN_FEE_RATE, MAX_FEE_RATE_MAINNET, MAX_FEE_RATE_TESTNET, FEE_MARGIN_MULTIPLIER, DEPOSIT_POLL_MS, MAX_DEPOSIT_UTXOS, } from '../default-config.js';
|
|
10
|
+
import { VerificationError } from '../../types/index.js';
|
|
11
|
+
/** Build an ordered server list from a config URL string. */
|
|
12
|
+
export function resolveElectrumServers(configServer) {
|
|
13
|
+
if (!configServer || configServer === 'mempool.space') {
|
|
14
|
+
return [];
|
|
15
|
+
}
|
|
16
|
+
return [parseElectrumUrl(configServer)];
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* One-shot deposit check — returns the first deposit found or null.
|
|
20
|
+
* Tries the blockchain provider first, falls back to mempool.space.
|
|
21
|
+
*/
|
|
22
|
+
export async function checkDeposit(params) {
|
|
23
|
+
const { address, network = 'mainnet', fetchFn = globalThis.fetch, blockchain } = params;
|
|
24
|
+
if (blockchain) {
|
|
25
|
+
const deposit = await checkDepositProvider(address, network, blockchain);
|
|
26
|
+
if (deposit !== null)
|
|
27
|
+
return deposit;
|
|
28
|
+
}
|
|
29
|
+
return checkDepositMempool(address, network, fetchFn);
|
|
30
|
+
}
|
|
31
|
+
function aggregateUtxos(utxos) {
|
|
32
|
+
if (utxos.length > MAX_DEPOSIT_UTXOS) {
|
|
33
|
+
throw new VerificationError('E_DEPOSIT_TOO_MANY_UTXOS', `deposit address received ${String(utxos.length)} UTXOs (cap ${String(MAX_DEPOSIT_UTXOS)}), possible dust-storm attack`);
|
|
34
|
+
}
|
|
35
|
+
const primary = utxos[0];
|
|
36
|
+
if (!primary) {
|
|
37
|
+
throw new Error('aggregateUtxos called with empty utxo list');
|
|
38
|
+
}
|
|
39
|
+
const totalValue = utxos.reduce((sum, u) => sum + u.value, 0);
|
|
40
|
+
const hasMempool = utxos.some((u) => u.confirmations === 0);
|
|
41
|
+
const minConfirmations = hasMempool
|
|
42
|
+
? 0
|
|
43
|
+
: Math.min(...utxos.map((u) => u.confirmations));
|
|
44
|
+
return {
|
|
45
|
+
txid: primary.txid,
|
|
46
|
+
vout: primary.vout,
|
|
47
|
+
value: totalValue,
|
|
48
|
+
confirmations: minConfirmations,
|
|
49
|
+
status: hasMempool ? 'mempool' : 'confirmed',
|
|
50
|
+
utxos: utxos.map((u) => ({ txid: u.txid, vout: u.vout, value: u.value, height: u.height ?? 0 })),
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
async function checkDepositProvider(address, network, blockchain) {
|
|
54
|
+
try {
|
|
55
|
+
const scriptHash = addressToScriptHash(address, network);
|
|
56
|
+
const utxos = await blockchain.listUnspent(scriptHash);
|
|
57
|
+
if (utxos.length === 0)
|
|
58
|
+
return null;
|
|
59
|
+
return aggregateUtxos(utxos);
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
async function checkDepositMempool(address, network, fetchFn) {
|
|
66
|
+
const baseUrl = network === 'mainnet' ? MEMPOOL_API : MEMPOOL_TESTNET_API;
|
|
67
|
+
try {
|
|
68
|
+
const collected = [];
|
|
69
|
+
let hasMempool = false;
|
|
70
|
+
const mempoolRes = await fetchFn(`${baseUrl}/address/${address}/txs/mempool`);
|
|
71
|
+
const mempoolTxs = (await mempoolRes.json());
|
|
72
|
+
for (const tx of mempoolTxs) {
|
|
73
|
+
for (let i = 0; i < tx.vout.length; i++) {
|
|
74
|
+
const output = tx.vout[i];
|
|
75
|
+
if (output.scriptpubkey_address === address) {
|
|
76
|
+
collected.push({ txid: tx.txid, vout: i, value: output.value, height: 0 });
|
|
77
|
+
hasMempool = true;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
const confirmedRes = await fetchFn(`${baseUrl}/address/${address}/txs`);
|
|
82
|
+
const confirmedTxs = (await confirmedRes.json());
|
|
83
|
+
for (const tx of confirmedTxs) {
|
|
84
|
+
for (let i = 0; i < tx.vout.length; i++) {
|
|
85
|
+
const output = tx.vout[i];
|
|
86
|
+
if (output.scriptpubkey_address === address) {
|
|
87
|
+
const height = tx.status.confirmed ? 1 : 0;
|
|
88
|
+
collected.push({ txid: tx.txid, vout: i, value: output.value, height });
|
|
89
|
+
if (!tx.status.confirmed)
|
|
90
|
+
hasMempool = true;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
if (collected.length === 0)
|
|
95
|
+
return null;
|
|
96
|
+
const primary = collected[0];
|
|
97
|
+
const totalValue = collected.reduce((sum, u) => sum + u.value, 0);
|
|
98
|
+
return {
|
|
99
|
+
txid: primary.txid,
|
|
100
|
+
vout: primary.vout,
|
|
101
|
+
value: totalValue,
|
|
102
|
+
confirmations: hasMempool ? 0 : 1,
|
|
103
|
+
status: hasMempool ? 'mempool' : 'confirmed',
|
|
104
|
+
utxos: collected,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Poll for deposits using a blockchain provider with mempool.space fallback.
|
|
113
|
+
*
|
|
114
|
+
* If a BlockchainDataProvider is supplied, it is used as the primary data source.
|
|
115
|
+
* Otherwise, falls back to mempool.space REST API per-poll.
|
|
116
|
+
*/
|
|
117
|
+
export async function watchForDeposit(params) {
|
|
118
|
+
const { address, network = 'mainnet', onStatus, signal, fetchFn = globalThis.fetch, } = params;
|
|
119
|
+
let { blockchain } = params;
|
|
120
|
+
const scriptHash = addressToScriptHash(address, network);
|
|
121
|
+
if (blockchain) {
|
|
122
|
+
onStatus?.('Connected to blockchain provider');
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
onStatus?.('Using mempool.space fallback...');
|
|
126
|
+
}
|
|
127
|
+
while (!signal?.aborted) {
|
|
128
|
+
if (blockchain) {
|
|
129
|
+
try {
|
|
130
|
+
const utxos = await blockchain.listUnspent(scriptHash);
|
|
131
|
+
if (utxos.length > 0) {
|
|
132
|
+
onStatus?.('Deposit detected via blockchain provider');
|
|
133
|
+
return aggregateUtxos(utxos);
|
|
134
|
+
}
|
|
135
|
+
onStatus?.('Waiting for BTC deposit...');
|
|
136
|
+
}
|
|
137
|
+
catch {
|
|
138
|
+
onStatus?.('Blockchain provider error, falling back to mempool.space...');
|
|
139
|
+
blockchain = undefined;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
const deposit = await checkDepositMempool(address, network, fetchFn);
|
|
144
|
+
if (deposit) {
|
|
145
|
+
onStatus?.('Deposit detected via mempool.space');
|
|
146
|
+
return deposit;
|
|
147
|
+
}
|
|
148
|
+
onStatus?.('Waiting for BTC deposit...');
|
|
149
|
+
}
|
|
150
|
+
await delay(DEPOSIT_POLL_MS);
|
|
151
|
+
}
|
|
152
|
+
throw new Error('Deposit watch aborted');
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Estimate the mining fee (in sats) for the lock transaction.
|
|
156
|
+
*
|
|
157
|
+
* Tries the blockchain provider first (6-block target),
|
|
158
|
+
* then mempool.space REST API, then falls back to 10 sat/vbyte.
|
|
159
|
+
*/
|
|
160
|
+
export async function estimateLockTxFee(params = {}) {
|
|
161
|
+
const { network = 'mainnet', fetchFn = globalThis.fetch, blockchain } = params;
|
|
162
|
+
if (blockchain) {
|
|
163
|
+
const providerResult = await estimateFeeProvider(blockchain, network);
|
|
164
|
+
if (providerResult)
|
|
165
|
+
return providerResult;
|
|
166
|
+
}
|
|
167
|
+
const mempoolResult = await estimateFeeMempool(network, fetchFn);
|
|
168
|
+
if (mempoolResult)
|
|
169
|
+
return mempoolResult;
|
|
170
|
+
return { feeSats: Math.ceil(LOCK_TX_VBYTES * FALLBACK_FEE_RATE), feeRate: FALLBACK_FEE_RATE };
|
|
171
|
+
}
|
|
172
|
+
function maxFeeRateFor(network) {
|
|
173
|
+
return network === 'mainnet' ? MAX_FEE_RATE_MAINNET : MAX_FEE_RATE_TESTNET;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Apply the MIN_FEE_RATE floor, FEE_MARGIN_MULTIPLIER pad, and per-network
|
|
177
|
+
* ceiling to a raw sat/vB estimate. The floor keeps the broadcast fee
|
|
178
|
+
* above strict Electrum nodes' minrelaytxfee, the multiplier absorbs
|
|
179
|
+
* short-term mempool pressure changes between estimate and broadcast,
|
|
180
|
+
* and the ceiling neutralises wildly inflated oracle answers
|
|
181
|
+
* (testnet's `halfHourFee` is the typical offender).
|
|
182
|
+
*/
|
|
183
|
+
function applyFeePolicy(rawSatPerVbyte, network) {
|
|
184
|
+
const padded = Math.ceil(rawSatPerVbyte * FEE_MARGIN_MULTIPLIER);
|
|
185
|
+
const floored = Math.max(MIN_FEE_RATE, padded);
|
|
186
|
+
return Math.min(maxFeeRateFor(network), floored);
|
|
187
|
+
}
|
|
188
|
+
async function estimateFeeProvider(blockchain, network) {
|
|
189
|
+
try {
|
|
190
|
+
const btcPerKb = await blockchain.estimateFee(6);
|
|
191
|
+
if (btcPerKb <= 0)
|
|
192
|
+
return null;
|
|
193
|
+
const raw = Math.ceil((btcPerKb * 1e8) / 1000);
|
|
194
|
+
const satPerVbyte = applyFeePolicy(raw, network);
|
|
195
|
+
return { feeSats: Math.ceil(LOCK_TX_VBYTES * satPerVbyte), feeRate: satPerVbyte };
|
|
196
|
+
}
|
|
197
|
+
catch {
|
|
198
|
+
return null;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
async function estimateFeeMempool(network, fetchFn) {
|
|
202
|
+
const baseUrl = network === 'mainnet' ? MEMPOOL_API : MEMPOOL_TESTNET_API;
|
|
203
|
+
try {
|
|
204
|
+
const res = await fetchFn(`${baseUrl}/v1/fees/recommended`, {
|
|
205
|
+
signal: AbortSignal.timeout(5_000),
|
|
206
|
+
});
|
|
207
|
+
if (!res.ok)
|
|
208
|
+
return null;
|
|
209
|
+
const data = (await res.json());
|
|
210
|
+
const base = data.halfHourFee > 0 ? data.halfHourFee : FALLBACK_FEE_RATE;
|
|
211
|
+
const rate = applyFeePolicy(base, network);
|
|
212
|
+
return { feeSats: Math.ceil(LOCK_TX_VBYTES * rate), feeRate: rate };
|
|
213
|
+
}
|
|
214
|
+
catch {
|
|
215
|
+
return null;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
//# sourceMappingURL=deposit-watcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deposit-watcher.js","sourceRoot":"","sources":["../../../src/lib/bitcoin/deposit-watcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare function addressToScriptHash(address: string, network?: 'mainnet' | 'testnet' | 'regtest'): string;
|
|
2
|
+
export interface ElectrumServer {
|
|
3
|
+
readonly host: string;
|
|
4
|
+
readonly port: number;
|
|
5
|
+
readonly ssl: boolean;
|
|
6
|
+
}
|
|
7
|
+
export declare function parseElectrumUrl(url: string): ElectrumServer;
|
|
8
|
+
//# sourceMappingURL=script-hash.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"script-hash.d.ts","sourceRoot":"","sources":["../../../src/lib/bitcoin/script-hash.ts"],"names":[],"mappings":"AAUA,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,SAAS,GAAG,SAAS,GAAG,SAAqB,GACrD,MAAM,CAOR;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;CACvB;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,CAU5D"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Converts a Bitcoin address to an Electrum script hash.
|
|
3
|
+
*
|
|
4
|
+
* Electrum indexes by SHA256(scriptPubKey), byte-reversed, hex-encoded.
|
|
5
|
+
* Uses @noble/hashes instead of node:crypto for browser compatibility.
|
|
6
|
+
*/
|
|
7
|
+
import { sha256 } from '@noble/hashes/sha2.js';
|
|
8
|
+
import { bytesToHex } from '@noble/hashes/utils.js';
|
|
9
|
+
import * as bitcoin from 'bitcoinjs-lib';
|
|
10
|
+
export function addressToScriptHash(address, network = 'mainnet') {
|
|
11
|
+
const net = network === 'mainnet' ? bitcoin.networks.bitcoin : (network === 'regtest' ? bitcoin.networks.regtest : bitcoin.networks.testnet);
|
|
12
|
+
const outputScript = bitcoin.address.toOutputScript(address, net);
|
|
13
|
+
const hash = sha256(outputScript);
|
|
14
|
+
const reversed = new Uint8Array(hash);
|
|
15
|
+
reversed.reverse();
|
|
16
|
+
return bytesToHex(reversed);
|
|
17
|
+
}
|
|
18
|
+
export function parseElectrumUrl(url) {
|
|
19
|
+
const sslMatch = url.match(/^ssl:\/\/([^:]+):(\d+)/);
|
|
20
|
+
if (sslMatch) {
|
|
21
|
+
return { host: sslMatch[1] ?? '', port: parseInt(sslMatch[2] ?? '50002', 10), ssl: true };
|
|
22
|
+
}
|
|
23
|
+
const tcpMatch = url.match(/^tcp:\/\/([^:]+):(\d+)/);
|
|
24
|
+
if (tcpMatch) {
|
|
25
|
+
return { host: tcpMatch[1] ?? '', port: parseInt(tcpMatch[2] ?? '50001', 10), ssl: false };
|
|
26
|
+
}
|
|
27
|
+
return { host: url, port: 50002, ssl: true };
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=script-hash.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"script-hash.js","sourceRoot":"","sources":["../../../src/lib/bitcoin/script-hash.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,KAAK,OAAO,MAAM,eAAe,CAAC;AAEzC,MAAM,UAAU,mBAAmB,CACjC,OAAe,EACf,UAA6C,SAAS;IAEtD,MAAM,GAAG,GAAG,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC7I,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAClE,MAAM,IAAI,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;IAClC,MAAM,QAAQ,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;IACtC,QAAQ,CAAC,OAAO,EAAE,CAAC;IACnB,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC;AAC9B,CAAC;AAQD,MAAM,UAAU,gBAAgB,CAAC,GAAW;IAC1C,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;IACrD,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,OAAO,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;IAC5F,CAAC;IACD,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;IACrD,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,OAAO,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;IAC7F,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;AAC/C,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { BlockchainDataProvider, Utxo } from '../../interfaces/blockchain.js';
|
|
2
|
+
import { type DetectedDeposit } from './deposit-watcher.js';
|
|
3
|
+
export interface SweepEstimate {
|
|
4
|
+
readonly sendSats: number;
|
|
5
|
+
readonly feeSats: number;
|
|
6
|
+
readonly feeRate: number;
|
|
7
|
+
readonly destAddress: string;
|
|
8
|
+
readonly fromAddress: string;
|
|
9
|
+
}
|
|
10
|
+
export interface SweepResult {
|
|
11
|
+
readonly txid: string;
|
|
12
|
+
readonly sendSats: number;
|
|
13
|
+
readonly feeSats: number;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Estimate the fee and output amount for a sweep transaction.
|
|
17
|
+
*
|
|
18
|
+
* Uses the same Electrum → mempool.space → fallback chain as lock tx fee.
|
|
19
|
+
* Supports multiple UTXOs — fee scales with input count.
|
|
20
|
+
*/
|
|
21
|
+
export declare function estimateSweep(deposit: DetectedDeposit, fromAddress: string, destAddress: string, network?: 'mainnet' | 'testnet' | 'regtest', fetchFn?: typeof globalThis.fetch, blockchain?: BlockchainDataProvider): Promise<SweepEstimate>;
|
|
22
|
+
/**
|
|
23
|
+
* Build and sign the sweep transaction. Returns raw hex ready for broadcast.
|
|
24
|
+
*
|
|
25
|
+
* Consolidates all UTXOs (via `deposit.utxos` or the single deposit itself)
|
|
26
|
+
* into a single output to `destAddress`.
|
|
27
|
+
*/
|
|
28
|
+
export declare function buildSweepTx(wif: string, deposit: DetectedDeposit, destAddress: string, sendSats: number, network?: 'mainnet' | 'testnet' | 'regtest'): string;
|
|
29
|
+
/**
|
|
30
|
+
* Broadcast a raw transaction via Electrum (primary) then mempool.space (fallback).
|
|
31
|
+
*/
|
|
32
|
+
export declare function broadcastSweep(rawHex: string, network?: 'mainnet' | 'testnet' | 'regtest', fetchFn?: typeof globalThis.fetch, blockchain?: BlockchainDataProvider): Promise<string>;
|
|
33
|
+
/**
|
|
34
|
+
* Fetch the confirmed UTXO list for a BTC address from the injected
|
|
35
|
+
* blockchain provider. Returns an empty array when the provider is absent or
|
|
36
|
+
* no UTXOs exist.
|
|
37
|
+
*/
|
|
38
|
+
export declare function listConfirmedUtxos(input: {
|
|
39
|
+
readonly address: string;
|
|
40
|
+
readonly network: 'mainnet' | 'testnet' | 'regtest';
|
|
41
|
+
readonly blockchain?: BlockchainDataProvider;
|
|
42
|
+
}): Promise<readonly Utxo[]>;
|
|
43
|
+
/** Pick the UTXO that best represents the "primary" deposit (largest value). */
|
|
44
|
+
export declare function pickPrimaryUtxo(utxos: readonly Utxo[]): Utxo | null;
|
|
45
|
+
/**
|
|
46
|
+
* Aggregate a UTXO list into a `DetectedDeposit` summary (sum of values, min
|
|
47
|
+
* confirmations, primary UTXO). Throws `E_DEPOSIT_TOO_MANY_UTXOS` when the
|
|
48
|
+
* list exceeds `MAX_DEPOSIT_UTXOS` (AV-A.20 dust-storm guard).
|
|
49
|
+
*/
|
|
50
|
+
export declare function aggregateUtxosAsDeposit(utxos: readonly Utxo[]): DetectedDeposit | null;
|
|
51
|
+
/**
|
|
52
|
+
* Fetch all UTXOs for a BTC address and aggregate them into a
|
|
53
|
+
* `DetectedDeposit`. Composes `listConfirmedUtxos` + `aggregateUtxosAsDeposit`.
|
|
54
|
+
*/
|
|
55
|
+
export declare function fetchUtxo(address: string, network?: 'mainnet' | 'testnet' | 'regtest', blockchain?: BlockchainDataProvider): Promise<DetectedDeposit | null>;
|
|
56
|
+
//# sourceMappingURL=sweep.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sweep.d.ts","sourceRoot":"","sources":["../../../src/lib/bitcoin/sweep.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,sBAAsB,EAAE,IAAI,EAAE,MAAM,gCAAgC,CAAC;AACnF,OAAO,EAAE,KAAK,eAAe,EAAqB,MAAM,sBAAsB,CAAC;AAS/E,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAaD;;;;;GAKG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,eAAe,EACxB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,SAAS,GAAG,SAAS,GAAG,SAAqB,EACtD,OAAO,GAAE,OAAO,UAAU,CAAC,KAAwB,EACnD,UAAU,CAAC,EAAE,sBAAsB,GAClC,OAAO,CAAC,aAAa,CAAC,CAaxB;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAC1B,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,eAAe,EACxB,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,SAAS,GAAG,SAAS,GAAG,SAAqB,GACrD,MAAM,CAqDR;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,SAAS,GAAG,SAAS,GAAG,SAAqB,EACtD,OAAO,GAAE,OAAO,UAAU,CAAC,KAAwB,EACnD,UAAU,CAAC,EAAE,sBAAsB,GAClC,OAAO,CAAC,MAAM,CAAC,CASjB;AAkCD;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,KAAK,EAAE;IAC9C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;IACpD,QAAQ,CAAC,UAAU,CAAC,EAAE,sBAAsB,CAAC;CAC9C,GAAG,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC,CAQ3B;AAED,gFAAgF;AAChF,wBAAgB,eAAe,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,GAAG,IAAI,GAAG,IAAI,CAGnE;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,GAAG,eAAe,GAAG,IAAI,CAyBtF;AAED;;;GAGG;AACH,wBAAsB,SAAS,CAC7B,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,SAAS,GAAG,SAAS,GAAG,SAAqB,EACtD,UAAU,CAAC,EAAE,sBAAsB,GAClC,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAQjC"}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build, sign, and broadcast a sweep transaction from a keystore UTXO.
|
|
3
|
+
*
|
|
4
|
+
* Sends the entire UTXO balance (minus fee) to a user-specified destination.
|
|
5
|
+
*/
|
|
6
|
+
import * as bitcoin from 'bitcoinjs-lib';
|
|
7
|
+
import { walletFromWif } from './wallet.js';
|
|
8
|
+
import { addressToScriptHash } from './script-hash.js';
|
|
9
|
+
import { estimateLockTxFee } from './deposit-watcher.js';
|
|
10
|
+
import { MEMPOOL_API, MEMPOOL_TESTNET_API, MAX_DEPOSIT_UTXOS, BROADCAST_TIMEOUT_MS, } from '../default-config.js';
|
|
11
|
+
import { VerificationError, DEFAULT_DUST_POLICY } from '../../types/index.js';
|
|
12
|
+
/** P2WPKH input weight in vbytes. */
|
|
13
|
+
const P2WPKH_INPUT_VBYTES = 68;
|
|
14
|
+
/** Transaction overhead + single P2WPKH output in vbytes. */
|
|
15
|
+
const TX_OVERHEAD_VBYTES = 42;
|
|
16
|
+
/** Estimate vbytes for a P2WPKH sweep with N inputs and 1 output. */
|
|
17
|
+
function estimateSweepVbytes(inputCount) {
|
|
18
|
+
return P2WPKH_INPUT_VBYTES * inputCount + TX_OVERHEAD_VBYTES;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Estimate the fee and output amount for a sweep transaction.
|
|
22
|
+
*
|
|
23
|
+
* Uses the same Electrum → mempool.space → fallback chain as lock tx fee.
|
|
24
|
+
* Supports multiple UTXOs — fee scales with input count.
|
|
25
|
+
*/
|
|
26
|
+
export async function estimateSweep(deposit, fromAddress, destAddress, network = 'mainnet', fetchFn = globalThis.fetch, blockchain) {
|
|
27
|
+
const { feeRate } = await estimateLockTxFee({ network, fetchFn, blockchain });
|
|
28
|
+
const inputCount = deposit.utxos ? deposit.utxos.length : 1;
|
|
29
|
+
const feeSats = Math.ceil(estimateSweepVbytes(inputCount) * feeRate);
|
|
30
|
+
const sendSats = deposit.value - feeSats;
|
|
31
|
+
if (sendSats <= 0) {
|
|
32
|
+
throw new Error(`Balance too small: ${String(deposit.value)} sats cannot cover ${String(feeSats)} sat fee`);
|
|
33
|
+
}
|
|
34
|
+
return { sendSats, feeSats, feeRate, destAddress, fromAddress };
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Build and sign the sweep transaction. Returns raw hex ready for broadcast.
|
|
38
|
+
*
|
|
39
|
+
* Consolidates all UTXOs (via `deposit.utxos` or the single deposit itself)
|
|
40
|
+
* into a single output to `destAddress`.
|
|
41
|
+
*/
|
|
42
|
+
export function buildSweepTx(wif, deposit, destAddress, sendSats, network = 'mainnet') {
|
|
43
|
+
const net = network === 'mainnet' ? bitcoin.networks.bitcoin : (network === 'regtest' ? bitcoin.networks.regtest : bitcoin.networks.testnet);
|
|
44
|
+
try {
|
|
45
|
+
bitcoin.address.toOutputScript(destAddress, net);
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
throw new VerificationError('E_DEST_ADDR_INVALID', `destAddress ${destAddress} is invalid for ${network}`);
|
|
49
|
+
}
|
|
50
|
+
const inputs = deposit.utxos ?? [deposit];
|
|
51
|
+
if (inputs.length > MAX_DEPOSIT_UTXOS) {
|
|
52
|
+
throw new VerificationError('E_DEPOSIT_TOO_MANY_UTXOS', `sweep refuses ${String(inputs.length)} inputs (cap ${String(MAX_DEPOSIT_UTXOS)}), possible dust-storm attack`);
|
|
53
|
+
}
|
|
54
|
+
if (BigInt(sendSats) < DEFAULT_DUST_POLICY.p2wpkhDustSats) {
|
|
55
|
+
throw new VerificationError('E_SWEEP_DUST', `sweep output ${String(sendSats)} below dust floor ${DEFAULT_DUST_POLICY.p2wpkhDustSats.toString()}`);
|
|
56
|
+
}
|
|
57
|
+
const wallet = walletFromWif(wif, network);
|
|
58
|
+
const p2wpkh = bitcoin.payments.p2wpkh({
|
|
59
|
+
pubkey: Buffer.from(wallet.keyPair.publicKey),
|
|
60
|
+
network: net,
|
|
61
|
+
});
|
|
62
|
+
if (!p2wpkh.output)
|
|
63
|
+
throw new Error('Failed to derive P2WPKH script');
|
|
64
|
+
const psbt = new bitcoin.Psbt({ network: net });
|
|
65
|
+
for (const utxo of inputs) {
|
|
66
|
+
psbt.addInput({
|
|
67
|
+
hash: utxo.txid,
|
|
68
|
+
index: utxo.vout,
|
|
69
|
+
witnessUtxo: {
|
|
70
|
+
script: p2wpkh.output,
|
|
71
|
+
value: BigInt(utxo.value),
|
|
72
|
+
},
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
psbt.addOutput({
|
|
76
|
+
address: destAddress,
|
|
77
|
+
value: BigInt(sendSats),
|
|
78
|
+
});
|
|
79
|
+
psbt.signAllInputs(wallet.keyPair);
|
|
80
|
+
psbt.finalizeAllInputs();
|
|
81
|
+
return psbt.extractTransaction().toHex();
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Broadcast a raw transaction via Electrum (primary) then mempool.space (fallback).
|
|
85
|
+
*/
|
|
86
|
+
export async function broadcastSweep(rawHex, network = 'mainnet', fetchFn = globalThis.fetch, blockchain) {
|
|
87
|
+
// Try blockchain provider
|
|
88
|
+
if (blockchain) {
|
|
89
|
+
const txid = await broadcastViaProvider(rawHex, blockchain);
|
|
90
|
+
if (txid)
|
|
91
|
+
return txid;
|
|
92
|
+
}
|
|
93
|
+
// Fallback to mempool.space
|
|
94
|
+
return broadcastViaMempool(rawHex, network, fetchFn);
|
|
95
|
+
}
|
|
96
|
+
async function broadcastViaProvider(rawHex, blockchain) {
|
|
97
|
+
try {
|
|
98
|
+
return await blockchain.broadcastTransaction(rawHex);
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
async function broadcastViaMempool(rawHex, network, fetchFn) {
|
|
105
|
+
const baseUrl = network === 'mainnet' ? MEMPOOL_API : MEMPOOL_TESTNET_API;
|
|
106
|
+
const res = await fetchFn(`${baseUrl}/tx`, {
|
|
107
|
+
method: 'POST',
|
|
108
|
+
headers: { 'Content-Type': 'text/plain' },
|
|
109
|
+
body: rawHex,
|
|
110
|
+
signal: AbortSignal.timeout(BROADCAST_TIMEOUT_MS),
|
|
111
|
+
});
|
|
112
|
+
if (!res.ok) {
|
|
113
|
+
const body = await res.text().catch(() => 'unknown error');
|
|
114
|
+
throw new Error(`Broadcast failed: ${body}`);
|
|
115
|
+
}
|
|
116
|
+
return (await res.text()).trim();
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Fetch the confirmed UTXO list for a BTC address from the injected
|
|
120
|
+
* blockchain provider. Returns an empty array when the provider is absent or
|
|
121
|
+
* no UTXOs exist.
|
|
122
|
+
*/
|
|
123
|
+
export async function listConfirmedUtxos(input) {
|
|
124
|
+
if (!input.blockchain)
|
|
125
|
+
return [];
|
|
126
|
+
try {
|
|
127
|
+
const scriptHash = addressToScriptHash(input.address, input.network);
|
|
128
|
+
return await input.blockchain.listUnspent(scriptHash);
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
return [];
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/** Pick the UTXO that best represents the "primary" deposit (largest value). */
|
|
135
|
+
export function pickPrimaryUtxo(utxos) {
|
|
136
|
+
if (utxos.length === 0)
|
|
137
|
+
return null;
|
|
138
|
+
return utxos.reduce((best, u) => (u.value > best.value ? u : best));
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Aggregate a UTXO list into a `DetectedDeposit` summary (sum of values, min
|
|
142
|
+
* confirmations, primary UTXO). Throws `E_DEPOSIT_TOO_MANY_UTXOS` when the
|
|
143
|
+
* list exceeds `MAX_DEPOSIT_UTXOS` (AV-A.20 dust-storm guard).
|
|
144
|
+
*/
|
|
145
|
+
export function aggregateUtxosAsDeposit(utxos) {
|
|
146
|
+
if (utxos.length === 0)
|
|
147
|
+
return null;
|
|
148
|
+
if (utxos.length > MAX_DEPOSIT_UTXOS) {
|
|
149
|
+
throw new VerificationError('E_DEPOSIT_TOO_MANY_UTXOS', `sweep refuses ${String(utxos.length)} inputs (cap ${String(MAX_DEPOSIT_UTXOS)}), possible dust-storm attack`);
|
|
150
|
+
}
|
|
151
|
+
const primary = pickPrimaryUtxo(utxos);
|
|
152
|
+
if (!primary)
|
|
153
|
+
return null;
|
|
154
|
+
const totalValue = utxos.reduce((sum, u) => sum + u.value, 0);
|
|
155
|
+
const hasMempool = utxos.some((u) => u.confirmations === 0);
|
|
156
|
+
return {
|
|
157
|
+
txid: primary.txid,
|
|
158
|
+
vout: primary.vout,
|
|
159
|
+
value: totalValue,
|
|
160
|
+
confirmations: hasMempool ? 0 : 1,
|
|
161
|
+
status: hasMempool ? 'mempool' : 'confirmed',
|
|
162
|
+
utxos: utxos.map((u) => ({
|
|
163
|
+
txid: u.txid,
|
|
164
|
+
vout: u.vout,
|
|
165
|
+
value: u.value,
|
|
166
|
+
height: u.height ?? 0,
|
|
167
|
+
})),
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Fetch all UTXOs for a BTC address and aggregate them into a
|
|
172
|
+
* `DetectedDeposit`. Composes `listConfirmedUtxos` + `aggregateUtxosAsDeposit`.
|
|
173
|
+
*/
|
|
174
|
+
export async function fetchUtxo(address, network = 'mainnet', blockchain) {
|
|
175
|
+
const utxos = await listConfirmedUtxos({ address, network, blockchain });
|
|
176
|
+
if (utxos.length === 0)
|
|
177
|
+
return null;
|
|
178
|
+
try {
|
|
179
|
+
return aggregateUtxosAsDeposit(utxos);
|
|
180
|
+
}
|
|
181
|
+
catch {
|
|
182
|
+
return null;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=sweep.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sweep.js","sourceRoot":"","sources":["../../../src/lib/bitcoin/sweep.ts"],"names":[],"mappings":"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"}
|