@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,43 @@
|
|
|
1
|
+
import type { BlockchainDataProvider } from '../../interfaces/blockchain.js';
|
|
2
|
+
export interface TxCancelVerification {
|
|
3
|
+
readonly verified: boolean;
|
|
4
|
+
readonly reason: string;
|
|
5
|
+
/** Raw TxCancel hex, present on the success path. Needed by client-side refund. */
|
|
6
|
+
readonly txCancelHex?: string;
|
|
7
|
+
/** TxCancel txid (big-endian display form), present on the success path. */
|
|
8
|
+
readonly txCancelTxid?: string;
|
|
9
|
+
/** Block height at which TxCancel confirmed, present on the success path. */
|
|
10
|
+
readonly blockHeight?: number;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Verify a TxCancel transaction on-chain before sharing s_b.
|
|
14
|
+
*
|
|
15
|
+
* @param blockchain Connected blockchain data provider
|
|
16
|
+
* @param txCancelTxid Transaction ID from the server's cancel response
|
|
17
|
+
* @param txCancelHex Raw transaction hex from the server
|
|
18
|
+
* @param lockAddress The P2WSH lock address our BTC was funded to
|
|
19
|
+
* @param network Bitcoin network
|
|
20
|
+
*/
|
|
21
|
+
export declare function verifyTxCancel(blockchain: BlockchainDataProvider, txCancelTxid: string, txCancelHex: string, lockAddress: string, network: 'mainnet' | 'testnet' | 'regtest'): Promise<TxCancelVerification>;
|
|
22
|
+
/**
|
|
23
|
+
* Additional check: verify the lock address has been spent (no remaining UTXOs).
|
|
24
|
+
* This is a secondary confirmation that TxCancel actually consumed the locked funds.
|
|
25
|
+
*/
|
|
26
|
+
export declare function verifyLockAddressSpent(blockchain: BlockchainDataProvider, lockAddress: string, network: 'mainnet' | 'testnet' | 'regtest'): Promise<boolean>;
|
|
27
|
+
/**
|
|
28
|
+
* Discover and verify TxCancel entirely from on-chain data.
|
|
29
|
+
*
|
|
30
|
+
* Zero server trust — finds TxCancel by querying the lock address's transaction
|
|
31
|
+
* history via Electrum. The lock address will have exactly 2 transactions:
|
|
32
|
+
* TxLock (the deposit) and TxCancel (the spend).
|
|
33
|
+
*
|
|
34
|
+
* If depositTxid is known, we filter it out. If not, we identify TxCancel by
|
|
35
|
+
* checking which transaction spends FROM the lock address (has it as an input).
|
|
36
|
+
*
|
|
37
|
+
* @param blockchain Connected blockchain data provider
|
|
38
|
+
* @param lockAddress The P2WSH lock address
|
|
39
|
+
* @param depositTxid The known deposit (TxLock) txid, or empty string if unknown
|
|
40
|
+
* @param network Bitcoin network
|
|
41
|
+
*/
|
|
42
|
+
export declare function discoverAndVerifyTxCancel(blockchain: BlockchainDataProvider, lockAddress: string, depositTxid: string, network: 'mainnet' | 'testnet' | 'regtest'): Promise<TxCancelVerification>;
|
|
43
|
+
//# sourceMappingURL=tx-verify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tx-verify.d.ts","sourceRoot":"","sources":["../../../src/lib/bitcoin/tx-verify.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAI7E,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,mFAAmF;IACnF,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,4EAA4E;IAC5E,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,6EAA6E;IAC7E,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED;;;;;;;;GAQG;AACH,wBAAsB,cAAc,CAClC,UAAU,EAAE,sBAAsB,EAClC,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,GACzC,OAAO,CAAC,oBAAoB,CAAC,CAuC/B;AAsDD;;;GAGG;AACH,wBAAsB,sBAAsB,CAC1C,UAAU,EAAE,sBAAsB,EAClC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,GACzC,OAAO,CAAC,OAAO,CAAC,CAQlB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,yBAAyB,CAC7C,UAAU,EAAE,sBAAsB,EAClC,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,GACzC,OAAO,CAAC,oBAAoB,CAAC,CA6E/B"}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Independent on-chain verification of TxCancel before sharing s_b.
|
|
3
|
+
*
|
|
4
|
+
* Prevents the collusion attack where the server lies about TxCancel being
|
|
5
|
+
* confirmed in order to trick the client into revealing s_b. If s_b is leaked
|
|
6
|
+
* without a confirmed TxCancel, the maker can combine s_a + s_b to sweep
|
|
7
|
+
* the XMR while keeping the BTC locked (punishing the client).
|
|
8
|
+
*
|
|
9
|
+
* Verification steps:
|
|
10
|
+
* 1. Fetch raw tx from Electrum independently (not from the server)
|
|
11
|
+
* 2. Confirm the server's hex matches the on-chain hex
|
|
12
|
+
* 3. Decode the tx and verify it spends from our known lock address
|
|
13
|
+
* 4. Confirm the tx is included in a block (height > 0)
|
|
14
|
+
*/
|
|
15
|
+
import * as bitcoin from 'bitcoinjs-lib';
|
|
16
|
+
import { addressToScriptHash } from './script-hash.js';
|
|
17
|
+
import { uint8ArrayEquals } from '../crypto/bytes.js';
|
|
18
|
+
/**
|
|
19
|
+
* Verify a TxCancel transaction on-chain before sharing s_b.
|
|
20
|
+
*
|
|
21
|
+
* @param blockchain Connected blockchain data provider
|
|
22
|
+
* @param txCancelTxid Transaction ID from the server's cancel response
|
|
23
|
+
* @param txCancelHex Raw transaction hex from the server
|
|
24
|
+
* @param lockAddress The P2WSH lock address our BTC was funded to
|
|
25
|
+
* @param network Bitcoin network
|
|
26
|
+
*/
|
|
27
|
+
export async function verifyTxCancel(blockchain, txCancelTxid, txCancelHex, lockAddress, network) {
|
|
28
|
+
const onChainHex = await blockchain.getTransaction(txCancelTxid);
|
|
29
|
+
if (!onChainHex) {
|
|
30
|
+
return { verified: false, reason: 'TxCancel not found on-chain via Electrum' };
|
|
31
|
+
}
|
|
32
|
+
if (onChainHex !== txCancelHex) {
|
|
33
|
+
return {
|
|
34
|
+
verified: false,
|
|
35
|
+
reason: 'Server tx hex does not match on-chain tx — possible tampering',
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
const spendsFromLock = verifyTxSpendsFromAddress(onChainHex, lockAddress, network);
|
|
39
|
+
if (!spendsFromLock) {
|
|
40
|
+
return {
|
|
41
|
+
verified: false,
|
|
42
|
+
reason: 'TxCancel does not spend from the expected lock address',
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
const height = await blockchain.getTransactionHeight(txCancelTxid);
|
|
46
|
+
if (height <= 0) {
|
|
47
|
+
return {
|
|
48
|
+
verified: false,
|
|
49
|
+
reason: height === 0
|
|
50
|
+
? 'TxCancel is in the mempool but not yet confirmed'
|
|
51
|
+
: 'Could not verify TxCancel block inclusion',
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
return {
|
|
55
|
+
verified: true,
|
|
56
|
+
reason: `Confirmed at block height ${String(height)}`,
|
|
57
|
+
txCancelHex: onChainHex,
|
|
58
|
+
txCancelTxid,
|
|
59
|
+
blockHeight: height,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Decode a raw Bitcoin transaction and check that at least one input
|
|
64
|
+
* spends from the given address (the P2WSH lock address).
|
|
65
|
+
*
|
|
66
|
+
* For P2WSH inputs, the previous output script is not directly in the tx.
|
|
67
|
+
* Instead, we verify using the script hash of the lock address against
|
|
68
|
+
* the Electrum UTXO list. As a belt-and-suspenders check, we also verify
|
|
69
|
+
* the lock address has no remaining UTXOs (the TxCancel spent them).
|
|
70
|
+
*/
|
|
71
|
+
function verifyTxSpendsFromAddress(rawHex, lockAddress, network) {
|
|
72
|
+
try {
|
|
73
|
+
const tx = bitcoin.Transaction.fromHex(rawHex);
|
|
74
|
+
const btcNetwork = network === 'mainnet' ? bitcoin.networks.bitcoin : (network === 'regtest' ? bitcoin.networks.regtest : bitcoin.networks.testnet);
|
|
75
|
+
// For P2WSH, the witness script's last push is the redeem script.
|
|
76
|
+
// We can derive the expected scriptPubKey from the lock address and compare.
|
|
77
|
+
const expectedOutput = bitcoin.address.toOutputScript(lockAddress, btcNetwork);
|
|
78
|
+
// In the atomic swap protocol, TxCancel spends the TxLock output which
|
|
79
|
+
// was sent to the P2WSH lock address. The witness contains the redeem script
|
|
80
|
+
// as the last element; hashing it with OP_0 <SHA256> gives us the scriptPubKey.
|
|
81
|
+
for (const input of tx.ins) {
|
|
82
|
+
if (!input.witness || input.witness.length === 0)
|
|
83
|
+
continue;
|
|
84
|
+
// The last witness element for P2WSH is the witness script
|
|
85
|
+
const witnessScript = input.witness[input.witness.length - 1];
|
|
86
|
+
if (!witnessScript || witnessScript.length === 0)
|
|
87
|
+
continue;
|
|
88
|
+
// Derive P2WSH scriptPubKey from the witness script
|
|
89
|
+
const p2wsh = bitcoin.payments.p2wsh({
|
|
90
|
+
redeem: { output: witnessScript },
|
|
91
|
+
network: btcNetwork,
|
|
92
|
+
});
|
|
93
|
+
if (p2wsh.output &&
|
|
94
|
+
uint8ArrayEquals(new Uint8Array(p2wsh.output), new Uint8Array(expectedOutput))) {
|
|
95
|
+
return true;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return false;
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
return false;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Additional check: verify the lock address has been spent (no remaining UTXOs).
|
|
106
|
+
* This is a secondary confirmation that TxCancel actually consumed the locked funds.
|
|
107
|
+
*/
|
|
108
|
+
export async function verifyLockAddressSpent(blockchain, lockAddress, network) {
|
|
109
|
+
try {
|
|
110
|
+
const scriptHash = addressToScriptHash(lockAddress, network);
|
|
111
|
+
const utxos = await blockchain.listUnspent(scriptHash);
|
|
112
|
+
return utxos.length === 0;
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
return false;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Discover and verify TxCancel entirely from on-chain data.
|
|
120
|
+
*
|
|
121
|
+
* Zero server trust — finds TxCancel by querying the lock address's transaction
|
|
122
|
+
* history via Electrum. The lock address will have exactly 2 transactions:
|
|
123
|
+
* TxLock (the deposit) and TxCancel (the spend).
|
|
124
|
+
*
|
|
125
|
+
* If depositTxid is known, we filter it out. If not, we identify TxCancel by
|
|
126
|
+
* checking which transaction spends FROM the lock address (has it as an input).
|
|
127
|
+
*
|
|
128
|
+
* @param blockchain Connected blockchain data provider
|
|
129
|
+
* @param lockAddress The P2WSH lock address
|
|
130
|
+
* @param depositTxid The known deposit (TxLock) txid, or empty string if unknown
|
|
131
|
+
* @param network Bitcoin network
|
|
132
|
+
*/
|
|
133
|
+
export async function discoverAndVerifyTxCancel(blockchain, lockAddress, depositTxid, network) {
|
|
134
|
+
const scriptHash = addressToScriptHash(lockAddress, network);
|
|
135
|
+
const history = await blockchain.getHistory(scriptHash);
|
|
136
|
+
if (history.length < 2) {
|
|
137
|
+
return {
|
|
138
|
+
verified: false,
|
|
139
|
+
reason: `Lock address has ${String(history.length)} transaction(s) — TxCancel not yet broadcast`,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
// Strategy A: If we know the deposit txid, filter it out
|
|
143
|
+
// Strategy B: If we don't, check each tx to find the one that spends FROM the lock address
|
|
144
|
+
let cancelTxid = '';
|
|
145
|
+
let cancelHeight = 0;
|
|
146
|
+
if (depositTxid) {
|
|
147
|
+
const cancelEntry = history.find((entry) => entry.tx_hash !== depositTxid);
|
|
148
|
+
if (cancelEntry) {
|
|
149
|
+
cancelTxid = cancelEntry.tx_hash;
|
|
150
|
+
cancelHeight = cancelEntry.height;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
// Fallback: iterate history and find the tx that spends from the lock address
|
|
154
|
+
if (!cancelTxid) {
|
|
155
|
+
for (const entry of history) {
|
|
156
|
+
const hex = await blockchain.getTransaction(entry.tx_hash);
|
|
157
|
+
if (!hex)
|
|
158
|
+
continue;
|
|
159
|
+
if (verifyTxSpendsFromAddress(hex, lockAddress, network)) {
|
|
160
|
+
cancelTxid = entry.tx_hash;
|
|
161
|
+
cancelHeight = entry.height;
|
|
162
|
+
break;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
if (!cancelTxid) {
|
|
167
|
+
return {
|
|
168
|
+
verified: false,
|
|
169
|
+
reason: 'Could not identify TxCancel in lock address history',
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
if (cancelHeight <= 0) {
|
|
173
|
+
return {
|
|
174
|
+
verified: false,
|
|
175
|
+
reason: cancelHeight === 0
|
|
176
|
+
? 'TxCancel is in the mempool but not yet confirmed'
|
|
177
|
+
: 'TxCancel has unknown confirmation status',
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
const rawHex = await blockchain.getTransaction(cancelTxid);
|
|
181
|
+
if (!rawHex) {
|
|
182
|
+
return {
|
|
183
|
+
verified: false,
|
|
184
|
+
reason: 'Could not fetch TxCancel raw transaction from Electrum',
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
const spendsFromLock = verifyTxSpendsFromAddress(rawHex, lockAddress, network);
|
|
188
|
+
if (!spendsFromLock) {
|
|
189
|
+
return {
|
|
190
|
+
verified: false,
|
|
191
|
+
reason: 'Transaction found but does not spend from the lock address',
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
return {
|
|
195
|
+
verified: true,
|
|
196
|
+
reason: `TxCancel ${cancelTxid.slice(0, 12)}... confirmed at height ${String(cancelHeight)}`,
|
|
197
|
+
txCancelHex: rawHex,
|
|
198
|
+
txCancelTxid: cancelTxid,
|
|
199
|
+
blockHeight: cancelHeight,
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
//# sourceMappingURL=tx-verify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tx-verify.js","sourceRoot":"","sources":["../../../src/lib/bitcoin/tx-verify.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
declare const ECPair: any;
|
|
2
|
+
export interface TempBtcWallet {
|
|
3
|
+
readonly keyPair: ReturnType<typeof ECPair.makeRandom>;
|
|
4
|
+
readonly address: string;
|
|
5
|
+
readonly publicKey: Buffer;
|
|
6
|
+
readonly wif: string;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Create an ephemeral P2WPKH wallet. The private key is held in memory only
|
|
10
|
+
* and must be persisted via `createKeystore` if the caller needs to resume.
|
|
11
|
+
*/
|
|
12
|
+
export declare function createTempWallet(network?: 'mainnet' | 'testnet' | 'regtest'): TempBtcWallet;
|
|
13
|
+
/**
|
|
14
|
+
* Sign every input of a PSBT with the wallet's key pair and finalise.
|
|
15
|
+
* Returns the base64-encoded signed PSBT.
|
|
16
|
+
*/
|
|
17
|
+
export declare function signPsbt(psbtBase64: string, wallet: TempBtcWallet, network?: 'mainnet' | 'testnet' | 'regtest'): string;
|
|
18
|
+
/**
|
|
19
|
+
* Identity of the lock transaction derivable from an unsigned PSBT.
|
|
20
|
+
*
|
|
21
|
+
* Segwit txid is invariant to signing — it's hash(version, inputs, outputs,
|
|
22
|
+
* locktime) without witnesses — so callers can trust this matches what the
|
|
23
|
+
* sidecar will broadcast after `signFundingPsbt`.
|
|
24
|
+
*/
|
|
25
|
+
export interface UnsignedFundingPsbt {
|
|
26
|
+
/** Base64-encoded UNSIGNED PSBT, ready to send to the sidecar in /presigs. */
|
|
27
|
+
readonly psbtBase64: string;
|
|
28
|
+
/** Big-endian display-form txid of the (eventually-signed) lock tx. */
|
|
29
|
+
readonly txid: string;
|
|
30
|
+
/** Index of the lock output within the tx (always 0 for the simple shape). */
|
|
31
|
+
readonly vout: number;
|
|
32
|
+
/** Lock-output value in satoshis. */
|
|
33
|
+
readonly amountSats: number;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Build an UNSIGNED PSBT that pays from the wallet's UTXOs to a lock address.
|
|
37
|
+
*
|
|
38
|
+
* Returns the unsigned PSBT plus the deterministic txid+vout+value the sidecar
|
|
39
|
+
* uses to drive the libp2p protocol's Message2/3 with Alice. Sign later with
|
|
40
|
+
* `signFundingPsbt` once the encsig has been received and a snapshot persisted.
|
|
41
|
+
*
|
|
42
|
+
* @param lockAmountSats — Exact output amount the protocol negotiated. MUST
|
|
43
|
+
* match what Alice expects in Message2; mismatches cause rejection. When
|
|
44
|
+
* omitted, falls back to the total UTXO value (zero mining fee — testing only).
|
|
45
|
+
*/
|
|
46
|
+
export declare function buildUnsignedFundingPsbt(wallet: TempBtcWallet, utxos: readonly {
|
|
47
|
+
readonly txid: string;
|
|
48
|
+
readonly vout: number;
|
|
49
|
+
readonly value: number;
|
|
50
|
+
}[], lockAddress: string, network?: 'mainnet' | 'testnet' | 'regtest', lockAmountSats?: number): UnsignedFundingPsbt;
|
|
51
|
+
/**
|
|
52
|
+
* Sign a previously-built unsigned funding PSBT. Returns the base64 of the
|
|
53
|
+
* fully-signed, finalized PSBT, ready to broadcast (or to forward to the
|
|
54
|
+
* sidecar's /fund endpoint).
|
|
55
|
+
*/
|
|
56
|
+
export declare function signFundingPsbt(unsignedPsbtBase64: string, wallet: TempBtcWallet, network?: 'mainnet' | 'testnet' | 'regtest'): string;
|
|
57
|
+
/**
|
|
58
|
+
* Backwards-compatible build+sign in one call. Prefer `buildUnsignedFundingPsbt`
|
|
59
|
+
* + `signFundingPsbt` so the snapshot can be written between the two steps.
|
|
60
|
+
*/
|
|
61
|
+
export declare function buildAndSignFundingPsbt(wallet: TempBtcWallet, utxos: readonly {
|
|
62
|
+
readonly txid: string;
|
|
63
|
+
readonly vout: number;
|
|
64
|
+
readonly value: number;
|
|
65
|
+
}[], lockAddress: string, network?: 'mainnet' | 'testnet' | 'regtest', lockAmountSats?: number): string;
|
|
66
|
+
/**
|
|
67
|
+
* Recover a wallet instance from a WIF-encoded private key.
|
|
68
|
+
*/
|
|
69
|
+
export declare function walletFromWif(wif: string, network?: 'mainnet' | 'testnet' | 'regtest'): TempBtcWallet;
|
|
70
|
+
export {};
|
|
71
|
+
//# sourceMappingURL=wallet.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wallet.d.ts","sourceRoot":"","sources":["../../../src/lib/bitcoin/wallet.ts"],"names":[],"mappings":"AAUA,QAAA,MAAM,MAAM,KAAqB,CAAC;AAElC,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC,OAAO,MAAM,CAAC,UAAU,CAAC,CAAC;IACvD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,GAAE,SAAS,GAAG,SAAS,GAAG,SAAqB,GAAG,aAAa,CAiBtG;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CACtB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,aAAa,EACrB,OAAO,GAAE,SAAS,GAAG,SAAS,GAAG,SAAqB,GACrD,MAAM,CAQR;AAED;;;;;;GAMG;AACH,MAAM,WAAW,mBAAmB;IAClC,8EAA8E;IAC9E,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,uEAAuE;IACvE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,8EAA8E;IAC9E,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,qCAAqC;IACrC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,aAAa,EACrB,KAAK,EAAE,SAAS;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,EAC1F,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,SAAS,GAAG,SAAS,GAAG,SAAqB,EACtD,cAAc,CAAC,EAAE,MAAM,GACtB,mBAAmB,CA6DrB;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,kBAAkB,EAAE,MAAM,EAC1B,MAAM,EAAE,aAAa,EACrB,OAAO,GAAE,SAAS,GAAG,SAAS,GAAG,SAAqB,GACrD,MAAM,CAER;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,aAAa,EACrB,KAAK,EAAE,SAAS;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,EAC1F,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,SAAS,GAAG,SAAS,GAAG,SAAqB,EACtD,cAAc,CAAC,EAAE,MAAM,GACtB,MAAM,CAGR;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,SAAS,GAAG,SAAS,GAAG,SAAqB,GACrD,aAAa,CAiBf"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ephemeral P2WPKH wallet for atomic swap lock transactions.
|
|
3
|
+
* Keys are generated in-memory and persisted only via the keystore file.
|
|
4
|
+
*/
|
|
5
|
+
import * as bitcoin from 'bitcoinjs-lib';
|
|
6
|
+
import { ECPairFactory } from 'ecpair';
|
|
7
|
+
import * as ecc from 'tiny-secp256k1';
|
|
8
|
+
import { VerificationError } from '../../types/index.js';
|
|
9
|
+
bitcoin.initEccLib(ecc);
|
|
10
|
+
const ECPair = ECPairFactory(ecc);
|
|
11
|
+
/**
|
|
12
|
+
* Create an ephemeral P2WPKH wallet. The private key is held in memory only
|
|
13
|
+
* and must be persisted via `createKeystore` if the caller needs to resume.
|
|
14
|
+
*/
|
|
15
|
+
export function createTempWallet(network = 'mainnet') {
|
|
16
|
+
const net = network === 'mainnet' ? bitcoin.networks.bitcoin : (network === 'regtest' ? bitcoin.networks.regtest : bitcoin.networks.testnet);
|
|
17
|
+
const keyPair = ECPair.makeRandom({ network: net });
|
|
18
|
+
const { address } = bitcoin.payments.p2wpkh({
|
|
19
|
+
pubkey: Buffer.from(keyPair.publicKey),
|
|
20
|
+
network: net,
|
|
21
|
+
});
|
|
22
|
+
if (!address)
|
|
23
|
+
throw new Error('Failed to derive BTC address');
|
|
24
|
+
return {
|
|
25
|
+
keyPair,
|
|
26
|
+
address,
|
|
27
|
+
publicKey: Buffer.from(keyPair.publicKey),
|
|
28
|
+
wif: keyPair.toWIF(),
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Sign every input of a PSBT with the wallet's key pair and finalise.
|
|
33
|
+
* Returns the base64-encoded signed PSBT.
|
|
34
|
+
*/
|
|
35
|
+
export function signPsbt(psbtBase64, wallet, network = 'mainnet') {
|
|
36
|
+
const net = network === 'mainnet' ? bitcoin.networks.bitcoin : (network === 'regtest' ? bitcoin.networks.regtest : bitcoin.networks.testnet);
|
|
37
|
+
const psbt = bitcoin.Psbt.fromBase64(psbtBase64, { network: net });
|
|
38
|
+
psbt.signAllInputs(wallet.keyPair);
|
|
39
|
+
psbt.finalizeAllInputs();
|
|
40
|
+
return psbt.toBase64();
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Build an UNSIGNED PSBT that pays from the wallet's UTXOs to a lock address.
|
|
44
|
+
*
|
|
45
|
+
* Returns the unsigned PSBT plus the deterministic txid+vout+value the sidecar
|
|
46
|
+
* uses to drive the libp2p protocol's Message2/3 with Alice. Sign later with
|
|
47
|
+
* `signFundingPsbt` once the encsig has been received and a snapshot persisted.
|
|
48
|
+
*
|
|
49
|
+
* @param lockAmountSats — Exact output amount the protocol negotiated. MUST
|
|
50
|
+
* match what Alice expects in Message2; mismatches cause rejection. When
|
|
51
|
+
* omitted, falls back to the total UTXO value (zero mining fee — testing only).
|
|
52
|
+
*/
|
|
53
|
+
export function buildUnsignedFundingPsbt(wallet, utxos, lockAddress, network = 'mainnet', lockAmountSats) {
|
|
54
|
+
if (utxos.length === 0)
|
|
55
|
+
throw new Error('At least one UTXO is required');
|
|
56
|
+
const net = network === 'mainnet' ? bitcoin.networks.bitcoin : (network === 'regtest' ? bitcoin.networks.regtest : bitcoin.networks.testnet);
|
|
57
|
+
try {
|
|
58
|
+
bitcoin.address.toOutputScript(lockAddress, net);
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
throw new VerificationError('E_DEST_ADDR_INVALID', `lockAddress ${lockAddress} is invalid for ${network}`);
|
|
62
|
+
}
|
|
63
|
+
const psbt = new bitcoin.Psbt({ network: net });
|
|
64
|
+
const p2wpkh = bitcoin.payments.p2wpkh({
|
|
65
|
+
pubkey: Buffer.from(wallet.keyPair.publicKey),
|
|
66
|
+
network: net,
|
|
67
|
+
});
|
|
68
|
+
if (!p2wpkh.output)
|
|
69
|
+
throw new Error('Failed to derive P2WPKH script');
|
|
70
|
+
const totalInputValue = utxos.reduce((sum, u) => sum + u.value, 0);
|
|
71
|
+
for (const utxo of utxos) {
|
|
72
|
+
psbt.addInput({
|
|
73
|
+
hash: utxo.txid,
|
|
74
|
+
index: utxo.vout,
|
|
75
|
+
witnessUtxo: {
|
|
76
|
+
script: p2wpkh.output,
|
|
77
|
+
value: BigInt(utxo.value),
|
|
78
|
+
},
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
const outputSats = lockAmountSats && lockAmountSats > 0 ? lockAmountSats : totalInputValue;
|
|
82
|
+
psbt.addOutput({
|
|
83
|
+
address: lockAddress,
|
|
84
|
+
value: BigInt(outputSats),
|
|
85
|
+
});
|
|
86
|
+
// Read txid from the unsigned tx; segwit txid is fixed once inputs/outputs
|
|
87
|
+
// are set. bitcoinjs-lib doesn't expose an unsigned-Transaction accessor on
|
|
88
|
+
// Psbt, so reconstruct one from the public input/output lists.
|
|
89
|
+
const tx = new bitcoin.Transaction();
|
|
90
|
+
tx.version = 2;
|
|
91
|
+
tx.locktime = 0;
|
|
92
|
+
for (const input of psbt.txInputs) {
|
|
93
|
+
tx.addInput(input.hash, input.index, input.sequence ?? 0xffffffff);
|
|
94
|
+
}
|
|
95
|
+
for (const output of psbt.txOutputs) {
|
|
96
|
+
tx.addOutput(output.script, BigInt(output.value));
|
|
97
|
+
}
|
|
98
|
+
const txid = tx.getId();
|
|
99
|
+
return {
|
|
100
|
+
psbtBase64: psbt.toBase64(),
|
|
101
|
+
txid,
|
|
102
|
+
vout: 0,
|
|
103
|
+
amountSats: outputSats,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Sign a previously-built unsigned funding PSBT. Returns the base64 of the
|
|
108
|
+
* fully-signed, finalized PSBT, ready to broadcast (or to forward to the
|
|
109
|
+
* sidecar's /fund endpoint).
|
|
110
|
+
*/
|
|
111
|
+
export function signFundingPsbt(unsignedPsbtBase64, wallet, network = 'mainnet') {
|
|
112
|
+
return signPsbt(unsignedPsbtBase64, wallet, network);
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Backwards-compatible build+sign in one call. Prefer `buildUnsignedFundingPsbt`
|
|
116
|
+
* + `signFundingPsbt` so the snapshot can be written between the two steps.
|
|
117
|
+
*/
|
|
118
|
+
export function buildAndSignFundingPsbt(wallet, utxos, lockAddress, network = 'mainnet', lockAmountSats) {
|
|
119
|
+
const unsigned = buildUnsignedFundingPsbt(wallet, utxos, lockAddress, network, lockAmountSats);
|
|
120
|
+
return signFundingPsbt(unsigned.psbtBase64, wallet, network);
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Recover a wallet instance from a WIF-encoded private key.
|
|
124
|
+
*/
|
|
125
|
+
export function walletFromWif(wif, network = 'mainnet') {
|
|
126
|
+
const net = network === 'mainnet' ? bitcoin.networks.bitcoin : (network === 'regtest' ? bitcoin.networks.regtest : bitcoin.networks.testnet);
|
|
127
|
+
const keyPair = ECPair.fromWIF(wif, net);
|
|
128
|
+
const { address } = bitcoin.payments.p2wpkh({
|
|
129
|
+
pubkey: Buffer.from(keyPair.publicKey),
|
|
130
|
+
network: net,
|
|
131
|
+
});
|
|
132
|
+
if (!address)
|
|
133
|
+
throw new Error('Failed to derive BTC address from WIF');
|
|
134
|
+
return {
|
|
135
|
+
keyPair,
|
|
136
|
+
address,
|
|
137
|
+
publicKey: Buffer.from(keyPair.publicKey),
|
|
138
|
+
wif: keyPair.toWIF(),
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=wallet.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wallet.js","sourceRoot":"","sources":["../../../src/lib/bitcoin/wallet.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,OAAO,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,KAAK,GAAG,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEzD,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;AACxB,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;AASlC;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,UAA6C,SAAS;IACrF,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,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;IAEpD,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC1C,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;QACtC,OAAO,EAAE,GAAG;KACb,CAAC,CAAC;IAEH,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAE9D,OAAO;QACL,OAAO;QACP,OAAO;QACP,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;QACzC,GAAG,EAAE,OAAO,CAAC,KAAK,EAAE;KACrB,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,QAAQ,CACtB,UAAkB,EAClB,MAAqB,EACrB,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,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;IAEnE,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACnC,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAEzB,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC;AACzB,CAAC;AAoBD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,wBAAwB,CACtC,MAAqB,EACrB,KAA0F,EAC1F,WAAmB,EACnB,UAA6C,SAAS,EACtD,cAAuB;IAEvB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;IAEzE,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,IAAI,CAAC;QACH,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;IACnD,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,iBAAiB,CACzB,qBAAqB,EACrB,eAAe,WAAW,mBAAmB,OAAO,EAAE,CACvD,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;IAEhD,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;QACrC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC;QAC7C,OAAO,EAAE,GAAG;KACb,CAAC,CAAC;IACH,IAAI,CAAC,MAAM,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IAEtE,MAAM,eAAe,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAEnE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,QAAQ,CAAC;YACZ,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,KAAK,EAAE,IAAI,CAAC,IAAI;YAChB,WAAW,EAAE;gBACX,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;aAC1B;SACF,CAAC,CAAC;IACL,CAAC;IAED,MAAM,UAAU,GAAG,cAAc,IAAI,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,eAAe,CAAC;IAE3F,IAAI,CAAC,SAAS,CAAC;QACb,OAAO,EAAE,WAAW;QACpB,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC;KAC1B,CAAC,CAAC;IAEH,2EAA2E;IAC3E,4EAA4E;IAC5E,+DAA+D;IAC/D,MAAM,EAAE,GAAG,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IACrC,EAAE,CAAC,OAAO,GAAG,CAAC,CAAC;IACf,EAAE,CAAC,QAAQ,GAAG,CAAC,CAAC;IAChB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClC,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,QAAQ,IAAI,UAAU,CAAC,CAAC;IACrE,CAAC;IACD,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QACpC,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACpD,CAAC;IACD,MAAM,IAAI,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC;IAExB,OAAO;QACL,UAAU,EAAE,IAAI,CAAC,QAAQ,EAAE;QAC3B,IAAI;QACJ,IAAI,EAAE,CAAC;QACP,UAAU,EAAE,UAAU;KACvB,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAC7B,kBAA0B,EAC1B,MAAqB,EACrB,UAA6C,SAAS;IAEtD,OAAO,QAAQ,CAAC,kBAAkB,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;AACvD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CACrC,MAAqB,EACrB,KAA0F,EAC1F,WAAmB,EACnB,UAA6C,SAAS,EACtD,cAAuB;IAEvB,MAAM,QAAQ,GAAG,wBAAwB,CAAC,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC;IAC/F,OAAO,eAAe,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;AAC/D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAC3B,GAAW,EACX,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,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAEzC,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC1C,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;QACtC,OAAO,EAAE,GAAG;KACb,CAAC,CAAC;IAEH,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAEvE,OAAO;QACL,OAAO;QACP,OAAO;QACP,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;QACzC,GAAG,EAAE,OAAO,CAAC,KAAK,EAAE;KACrB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { bytesToHex as toHex, hexToBytes as fromHex } from '@noble/hashes/utils.js';
|
|
2
|
+
export { toHex as bytesToHex, fromHex as hexToBytes };
|
|
3
|
+
/** Byte-wise equality for two `Uint8Array`s of any length. */
|
|
4
|
+
export declare function uint8ArrayEquals(a: Uint8Array, b: Uint8Array): boolean;
|
|
5
|
+
/**
|
|
6
|
+
* Constant-time equality over two equal-length hex strings. Canonical
|
|
7
|
+
* comparator for hex-encoded bytes in the client; used for digest, pubkey, and
|
|
8
|
+
* txid equality checks.
|
|
9
|
+
*
|
|
10
|
+
* @remarks Hex itself is not secret at the boundaries this function is used
|
|
11
|
+
* today, but keeping one comparator avoids footguns when future code compares
|
|
12
|
+
* a secret-dependent hex value.
|
|
13
|
+
*/
|
|
14
|
+
export declare function constantTimeEqualHex(a: string, b: string): boolean;
|
|
15
|
+
/**
|
|
16
|
+
* Zero-fill a buffer holding secret bytes. Best-effort; V8 may copy buffers
|
|
17
|
+
* internally, so this is a defence-in-depth mechanism alongside minimising
|
|
18
|
+
* secret lifetime (AV-G.2).
|
|
19
|
+
*/
|
|
20
|
+
export declare function wipe(buf: Uint8Array): void;
|
|
21
|
+
//# sourceMappingURL=bytes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bytes.d.ts","sourceRoot":"","sources":["../../../src/lib/crypto/bytes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,IAAI,KAAK,EAAE,UAAU,IAAI,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAEpF,OAAO,EAAE,KAAK,IAAI,UAAU,EAAE,OAAO,IAAI,UAAU,EAAE,CAAC;AAEtD,8DAA8D;AAC9D,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,GAAG,OAAO,CAMtE;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAOlE;AAED;;;;GAIG;AACH,wBAAgB,IAAI,CAAC,GAAG,EAAE,UAAU,GAAG,IAAI,CAE1C"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { bytesToHex as toHex, hexToBytes as fromHex } from '@noble/hashes/utils.js';
|
|
2
|
+
export { toHex as bytesToHex, fromHex as hexToBytes };
|
|
3
|
+
/** Byte-wise equality for two `Uint8Array`s of any length. */
|
|
4
|
+
export function uint8ArrayEquals(a, b) {
|
|
5
|
+
if (a.length !== b.length)
|
|
6
|
+
return false;
|
|
7
|
+
for (let i = 0; i < a.length; i++) {
|
|
8
|
+
if (a[i] !== b[i])
|
|
9
|
+
return false;
|
|
10
|
+
}
|
|
11
|
+
return true;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Constant-time equality over two equal-length hex strings. Canonical
|
|
15
|
+
* comparator for hex-encoded bytes in the client; used for digest, pubkey, and
|
|
16
|
+
* txid equality checks.
|
|
17
|
+
*
|
|
18
|
+
* @remarks Hex itself is not secret at the boundaries this function is used
|
|
19
|
+
* today, but keeping one comparator avoids footguns when future code compares
|
|
20
|
+
* a secret-dependent hex value.
|
|
21
|
+
*/
|
|
22
|
+
export function constantTimeEqualHex(a, b) {
|
|
23
|
+
if (a.length !== b.length)
|
|
24
|
+
return false;
|
|
25
|
+
let acc = 0;
|
|
26
|
+
for (let i = 0; i < a.length; i++) {
|
|
27
|
+
acc |= a.charCodeAt(i) ^ b.charCodeAt(i);
|
|
28
|
+
}
|
|
29
|
+
return acc === 0;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Zero-fill a buffer holding secret bytes. Best-effort; V8 may copy buffers
|
|
33
|
+
* internally, so this is a defence-in-depth mechanism alongside minimising
|
|
34
|
+
* secret lifetime (AV-G.2).
|
|
35
|
+
*/
|
|
36
|
+
export function wipe(buf) {
|
|
37
|
+
buf.fill(0);
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=bytes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bytes.js","sourceRoot":"","sources":["../../../src/lib/crypto/bytes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,IAAI,KAAK,EAAE,UAAU,IAAI,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAEpF,OAAO,EAAE,KAAK,IAAI,UAAU,EAAE,OAAO,IAAI,UAAU,EAAE,CAAC;AAEtD,8DAA8D;AAC9D,MAAM,UAAU,gBAAgB,CAAC,CAAa,EAAE,CAAa;IAC3D,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACxC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;IAClC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,oBAAoB,CAAC,CAAS,EAAE,CAAS;IACvD,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACxC,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,GAAG,IAAI,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,GAAG,KAAK,CAAC,CAAC;AACnB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,IAAI,CAAC,GAAe;IAClC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unified error class for every WASM-backed operation.
|
|
3
|
+
* `.code` is a stable string matching the Rust-side MiradexWasmError::code()
|
|
4
|
+
* (see ../../../miradex-rust/src).
|
|
5
|
+
*/
|
|
6
|
+
export declare class WasmError extends Error {
|
|
7
|
+
readonly code: string;
|
|
8
|
+
readonly cause?: unknown | undefined;
|
|
9
|
+
readonly name = "WasmError";
|
|
10
|
+
constructor(code: string, message: string, cause?: unknown | undefined);
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/lib/crypto/errors.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,qBAAa,SAAU,SAAQ,KAAK;aAGhB,IAAI,EAAE,MAAM;aAEZ,KAAK,CAAC,EAAE,OAAO;IAJjC,QAAQ,CAAC,IAAI,eAAe;gBAEV,IAAI,EAAE,MAAM,EAC5B,OAAO,EAAE,MAAM,EACC,KAAK,CAAC,EAAE,OAAO,YAAA;CAIlC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unified error class for every WASM-backed operation.
|
|
3
|
+
* `.code` is a stable string matching the Rust-side MiradexWasmError::code()
|
|
4
|
+
* (see ../../../miradex-rust/src).
|
|
5
|
+
*/
|
|
6
|
+
export class WasmError extends Error {
|
|
7
|
+
code;
|
|
8
|
+
cause;
|
|
9
|
+
name = 'WasmError';
|
|
10
|
+
constructor(code, message, cause) {
|
|
11
|
+
super(message);
|
|
12
|
+
this.code = code;
|
|
13
|
+
this.cause = cause;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/lib/crypto/errors.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,OAAO,SAAU,SAAQ,KAAK;IAGhB;IAEA;IAJT,IAAI,GAAG,WAAW,CAAC;IAC5B,YACkB,IAAY,EAC5B,OAAe,EACC,KAAe;QAE/B,KAAK,CAAC,OAAO,CAAC,CAAC;QAJC,SAAI,GAAJ,IAAI,CAAQ;QAEZ,UAAK,GAAL,KAAK,CAAU;IAGjC,CAAC;CACF"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @deprecated Import directly from '@miradex/client' (or './wasm.js').
|
|
3
|
+
* This file re-exports the unified surface for backwards compatibility.
|
|
4
|
+
* Scheduled for removal in 0.4.0.
|
|
5
|
+
*/
|
|
6
|
+
import { WasmError } from './errors.js';
|
|
7
|
+
export { ensureWasm as ensureKeygen, generateClientKeys, generateClientKeysFromSeed, verifyDleqProof, signDigest, encsignDigest, decryptSignature, verifyEncsig, recoverAdaptorScalar, isKeygenAvailable, initKeygen, } from './wasm.js';
|
|
8
|
+
/**
|
|
9
|
+
* Legacy error class retained for downstream `new KeygenError(...)` and
|
|
10
|
+
* `err.name === 'KeygenError'` patterns. Thrown errors from the new unified
|
|
11
|
+
* loader are plain `WasmError` instances; this subclass is for direct
|
|
12
|
+
* construction by consumers.
|
|
13
|
+
*/
|
|
14
|
+
export declare class KeygenError extends WasmError {
|
|
15
|
+
constructor(message: string, code?: string, cause?: unknown);
|
|
16
|
+
}
|
|
17
|
+
export type { WasmModule as KeygenWasmModule } from './types.js';
|
|
18
|
+
export type { EnsureWasmOptions as EnsureKeygenOptions } from './wasm.js';
|
|
19
|
+
//# sourceMappingURL=keygen.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keygen.d.ts","sourceRoot":"","sources":["../../../src/lib/crypto/keygen.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,OAAO,EACL,UAAU,IAAI,YAAY,EAC1B,kBAAkB,EAClB,0BAA0B,EAC1B,eAAe,EACf,UAAU,EACV,aAAa,EACb,gBAAgB,EAChB,YAAY,EACZ,oBAAoB,EACpB,iBAAiB,EACjB,UAAU,GACX,MAAM,WAAW,CAAC;AAEnB;;;;;GAKG;AACH,qBAAa,WAAY,SAAQ,SAAS;gBAC5B,OAAO,EAAE,MAAM,EAAE,IAAI,SAAa,EAAE,KAAK,CAAC,EAAE,OAAO;CAQhE;AAED,YAAY,EAAE,UAAU,IAAI,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACjE,YAAY,EAAE,iBAAiB,IAAI,mBAAmB,EAAE,MAAM,WAAW,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @deprecated Import directly from '@miradex/client' (or './wasm.js').
|
|
3
|
+
* This file re-exports the unified surface for backwards compatibility.
|
|
4
|
+
* Scheduled for removal in 0.4.0.
|
|
5
|
+
*/
|
|
6
|
+
import { WasmError } from './errors.js';
|
|
7
|
+
export { ensureWasm as ensureKeygen, generateClientKeys, generateClientKeysFromSeed, verifyDleqProof, signDigest, encsignDigest, decryptSignature, verifyEncsig, recoverAdaptorScalar, isKeygenAvailable, initKeygen, } from './wasm.js';
|
|
8
|
+
/**
|
|
9
|
+
* Legacy error class retained for downstream `new KeygenError(...)` and
|
|
10
|
+
* `err.name === 'KeygenError'` patterns. Thrown errors from the new unified
|
|
11
|
+
* loader are plain `WasmError` instances; this subclass is for direct
|
|
12
|
+
* construction by consumers.
|
|
13
|
+
*/
|
|
14
|
+
export class KeygenError extends WasmError {
|
|
15
|
+
constructor(message, code = 'E_KEYGEN', cause) {
|
|
16
|
+
super(code, message, cause);
|
|
17
|
+
Object.defineProperty(this, 'name', {
|
|
18
|
+
value: 'KeygenError',
|
|
19
|
+
writable: false,
|
|
20
|
+
configurable: true,
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=keygen.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keygen.js","sourceRoot":"","sources":["../../../src/lib/crypto/keygen.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,OAAO,EACL,UAAU,IAAI,YAAY,EAC1B,kBAAkB,EAClB,0BAA0B,EAC1B,eAAe,EACf,UAAU,EACV,aAAa,EACb,gBAAgB,EAChB,YAAY,EACZ,oBAAoB,EACpB,iBAAiB,EACjB,UAAU,GACX,MAAM,WAAW,CAAC;AAEnB;;;;;GAKG;AACH,MAAM,OAAO,WAAY,SAAQ,SAAS;IACxC,YAAY,OAAe,EAAE,IAAI,GAAG,UAAU,EAAE,KAAe;QAC7D,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;QAC5B,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE;YAClC,KAAK,EAAE,aAAa;YACpB,QAAQ,EAAE,KAAK;YACf,YAAY,EAAE,IAAI;SACnB,CAAC,CAAC;IACL,CAAC;CACF"}
|