@miradexio/client 0.1.1 → 0.1.2
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/README.md +57 -292
- package/dist/address/base58.d.ts.map +1 -1
- package/dist/address/base58.js +1 -2
- package/dist/address/base58.js.map +1 -1
- package/dist/address/bech32.d.ts +0 -8
- package/dist/address/bech32.d.ts.map +1 -1
- package/dist/address/bech32.js +3 -9
- package/dist/address/bech32.js.map +1 -1
- package/dist/address/evm.d.ts.map +1 -1
- package/dist/address/evm.js +1 -2
- package/dist/address/evm.js.map +1 -1
- package/dist/address/index.d.ts +0 -6
- package/dist/address/index.d.ts.map +1 -1
- package/dist/address/index.js +6 -9
- package/dist/address/index.js.map +1 -1
- package/dist/address/monero.d.ts +0 -10
- package/dist/address/monero.d.ts.map +1 -1
- package/dist/address/monero.js +4 -10
- package/dist/address/monero.js.map +1 -1
- package/dist/address/polkadot.d.ts +0 -5
- package/dist/address/polkadot.d.ts.map +1 -1
- package/dist/address/polkadot.js +2 -6
- package/dist/address/polkadot.js.map +1 -1
- package/dist/address/ton.d.ts +0 -6
- package/dist/address/ton.d.ts.map +1 -1
- package/dist/address/ton.js +3 -8
- package/dist/address/ton.js.map +1 -1
- package/dist/api/index.d.ts +0 -19
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +18 -37
- package/dist/api/index.js.map +1 -1
- package/dist/atomic-swap/drive.d.ts +0 -13
- package/dist/atomic-swap/drive.d.ts.map +1 -1
- package/dist/atomic-swap/drive.js +66 -111
- package/dist/atomic-swap/drive.js.map +1 -1
- package/dist/atomic-swap/extract.d.ts +0 -23
- package/dist/atomic-swap/extract.d.ts.map +1 -1
- package/dist/atomic-swap/extract.js +6 -16
- package/dist/atomic-swap/extract.js.map +1 -1
- package/dist/atomic-swap/index.d.ts +0 -7
- package/dist/atomic-swap/index.d.ts.map +1 -1
- package/dist/atomic-swap/index.js +1 -7
- package/dist/atomic-swap/index.js.map +1 -1
- package/dist/atomic-swap/monero-sweep/errors.d.ts.map +1 -1
- package/dist/atomic-swap/monero-sweep/errors.js +5 -20
- package/dist/atomic-swap/monero-sweep/errors.js.map +1 -1
- package/dist/atomic-swap/monero-sweep/index.d.ts +0 -13
- package/dist/atomic-swap/monero-sweep/index.d.ts.map +1 -1
- package/dist/atomic-swap/monero-sweep/index.js +30 -56
- package/dist/atomic-swap/monero-sweep/index.js.map +1 -1
- package/dist/atomic-swap/monero-sweep/ring-select.d.ts +0 -4
- package/dist/atomic-swap/monero-sweep/ring-select.d.ts.map +1 -1
- package/dist/atomic-swap/monero-sweep/ring-select.js +9 -21
- package/dist/atomic-swap/monero-sweep/ring-select.js.map +1 -1
- package/dist/atomic-swap/presign.d.ts +0 -63
- package/dist/atomic-swap/presign.d.ts.map +1 -1
- package/dist/atomic-swap/presign.js +30 -90
- package/dist/atomic-swap/presign.js.map +1 -1
- package/dist/atomic-swap/refund.d.ts +0 -18
- package/dist/atomic-swap/refund.d.ts.map +1 -1
- package/dist/atomic-swap/refund.js +16 -32
- package/dist/atomic-swap/refund.js.map +1 -1
- package/dist/atomic-swap/run.d.ts +0 -17
- package/dist/atomic-swap/run.d.ts.map +1 -1
- package/dist/atomic-swap/run.js +11 -25
- package/dist/atomic-swap/run.js.map +1 -1
- package/dist/atomic-swap/snapshot.d.ts +0 -30
- package/dist/atomic-swap/snapshot.d.ts.map +1 -1
- package/dist/atomic-swap/snapshot.js +8 -23
- package/dist/atomic-swap/snapshot.js.map +1 -1
- package/dist/atomic-swap/submit-encsig.d.ts +0 -7
- package/dist/atomic-swap/submit-encsig.d.ts.map +1 -1
- package/dist/atomic-swap/submit-encsig.js +2 -11
- package/dist/atomic-swap/submit-encsig.js.map +1 -1
- package/dist/atomic-swap/types.d.ts +2 -55
- package/dist/atomic-swap/types.d.ts.map +1 -1
- package/dist/atomic-swap/types.js +2 -3
- package/dist/atomic-swap/types.js.map +1 -1
- package/dist/blockchain/quorum-provider.d.ts +0 -15
- package/dist/blockchain/quorum-provider.d.ts.map +1 -1
- package/dist/blockchain/quorum-provider.js +7 -9
- package/dist/blockchain/quorum-provider.js.map +1 -1
- package/dist/cooperative-redeem.d.ts +5 -14
- package/dist/cooperative-redeem.d.ts.map +1 -1
- package/dist/cooperative-redeem.js +3 -20
- package/dist/cooperative-redeem.js.map +1 -1
- package/dist/engine/blockchain-querier.d.ts +0 -22
- package/dist/engine/blockchain-querier.d.ts.map +1 -1
- package/dist/engine/engine-state.d.ts +0 -8
- package/dist/engine/engine-state.d.ts.map +1 -1
- package/dist/engine/engine-state.js.map +1 -1
- package/dist/engine/flow-context.d.ts +0 -20
- package/dist/engine/flow-context.d.ts.map +1 -1
- package/dist/engine/flow-context.js +17 -41
- package/dist/engine/flow-context.js.map +1 -1
- package/dist/engine/flows/atomic-flow.d.ts +0 -28
- package/dist/engine/flows/atomic-flow.d.ts.map +1 -1
- package/dist/engine/flows/atomic-flow.js +64 -121
- package/dist/engine/flows/atomic-flow.js.map +1 -1
- package/dist/engine/flows/swap-flow.d.ts +0 -19
- package/dist/engine/flows/swap-flow.d.ts.map +1 -1
- package/dist/engine/flows/swap-flow.js +41 -83
- package/dist/engine/flows/swap-flow.js.map +1 -1
- package/dist/engine/miradex-engine.d.ts +1 -62
- package/dist/engine/miradex-engine.d.ts.map +1 -1
- package/dist/engine/miradex-engine.js +18 -50
- package/dist/engine/miradex-engine.js.map +1 -1
- package/dist/engine/pipeline.d.ts +0 -11
- package/dist/engine/pipeline.d.ts.map +1 -1
- package/dist/engine/pipeline.js +9 -21
- package/dist/engine/pipeline.js.map +1 -1
- package/dist/engine/platform.d.ts +0 -160
- package/dist/engine/platform.d.ts.map +1 -1
- package/dist/engine/platform.js +2 -0
- package/dist/engine/platform.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -11
- package/dist/index.js.map +1 -1
- package/dist/interfaces/blockchain.d.ts +1 -13
- package/dist/interfaces/blockchain.d.ts.map +1 -1
- package/dist/interfaces/blockchain.js +1 -0
- package/dist/interfaces/blockchain.js.map +1 -1
- package/dist/interfaces/logger.d.ts +0 -6
- package/dist/interfaces/logger.d.ts.map +1 -1
- package/dist/interfaces/logger.js.map +1 -1
- package/dist/lib/bitcoin/deposit-watcher.d.ts +0 -23
- package/dist/lib/bitcoin/deposit-watcher.d.ts.map +1 -1
- package/dist/lib/bitcoin/deposit-watcher.js +7 -31
- package/dist/lib/bitcoin/deposit-watcher.js.map +1 -1
- package/dist/lib/bitcoin/script-hash.d.ts.map +1 -1
- package/dist/lib/bitcoin/script-hash.js +2 -6
- package/dist/lib/bitcoin/script-hash.js.map +1 -1
- package/dist/lib/bitcoin/sweep.d.ts +0 -30
- package/dist/lib/bitcoin/sweep.d.ts.map +1 -1
- package/dist/lib/bitcoin/sweep.js +11 -40
- package/dist/lib/bitcoin/sweep.js.map +1 -1
- package/dist/lib/bitcoin/tx-verify.d.ts +0 -28
- package/dist/lib/bitcoin/tx-verify.d.ts.map +1 -1
- package/dist/lib/bitcoin/tx-verify.js +20 -61
- package/dist/lib/bitcoin/tx-verify.js.map +1 -1
- package/dist/lib/bitcoin/wallet.d.ts +0 -38
- package/dist/lib/bitcoin/wallet.d.ts.map +1 -1
- package/dist/lib/bitcoin/wallet.js +13 -38
- package/dist/lib/bitcoin/wallet.js.map +1 -1
- package/dist/lib/crypto/bytes.d.ts +0 -14
- package/dist/lib/crypto/bytes.d.ts.map +1 -1
- package/dist/lib/crypto/bytes.js +5 -14
- package/dist/lib/crypto/bytes.js.map +1 -1
- package/dist/lib/crypto/errors.d.ts +0 -5
- package/dist/lib/crypto/errors.d.ts.map +1 -1
- package/dist/lib/crypto/errors.js +2 -5
- package/dist/lib/crypto/errors.js.map +1 -1
- package/dist/lib/crypto/libp2p-identity.d.ts +0 -15
- package/dist/lib/crypto/libp2p-identity.d.ts.map +1 -1
- package/dist/lib/crypto/libp2p-identity.js +16 -28
- package/dist/lib/crypto/libp2p-identity.js.map +1 -1
- package/dist/lib/crypto/mnemonic.d.ts +0 -9
- package/dist/lib/crypto/mnemonic.d.ts.map +1 -1
- package/dist/lib/crypto/mnemonic.js +11 -27
- package/dist/lib/crypto/mnemonic.js.map +1 -1
- package/dist/lib/crypto/platform.d.ts +0 -6
- package/dist/lib/crypto/platform.d.ts.map +1 -1
- package/dist/lib/crypto/platform.js +2 -6
- package/dist/lib/crypto/platform.js.map +1 -1
- package/dist/lib/crypto/scalars.d.ts +0 -23
- package/dist/lib/crypto/scalars.d.ts.map +1 -1
- package/dist/lib/crypto/scalars.js +10 -23
- package/dist/lib/crypto/scalars.js.map +1 -1
- package/dist/lib/crypto/types.d.ts +0 -4
- package/dist/lib/crypto/types.d.ts.map +1 -1
- package/dist/lib/crypto/wasm.d.ts +0 -23
- package/dist/lib/crypto/wasm.d.ts.map +1 -1
- package/dist/lib/crypto/wasm.js +9 -16
- package/dist/lib/crypto/wasm.js.map +1 -1
- package/dist/lib/default-config.d.ts +1 -59
- package/dist/lib/default-config.d.ts.map +1 -1
- package/dist/lib/default-config.js +22 -61
- package/dist/lib/default-config.js.map +1 -1
- package/dist/lib/errors.d.ts +0 -54
- package/dist/lib/errors.d.ts.map +1 -1
- package/dist/lib/errors.js +12 -35
- package/dist/lib/errors.js.map +1 -1
- package/dist/lib/keystore.d.ts +0 -24
- package/dist/lib/keystore.d.ts.map +1 -1
- package/dist/lib/keystore.js +3 -10
- package/dist/lib/keystore.js.map +1 -1
- package/dist/lib/monero/output-scanner.d.ts +0 -18
- package/dist/lib/monero/output-scanner.d.ts.map +1 -1
- package/dist/lib/monero/output-scanner.js +17 -40
- package/dist/lib/monero/output-scanner.js.map +1 -1
- package/dist/lib/monero/rpc.d.ts +0 -64
- package/dist/lib/monero/rpc.d.ts.map +1 -1
- package/dist/lib/monero/rpc.js +17 -59
- package/dist/lib/monero/rpc.js.map +1 -1
- package/dist/lib/monero/verify-lock.d.ts +0 -12
- package/dist/lib/monero/verify-lock.d.ts.map +1 -1
- package/dist/lib/monero/verify-lock.js +9 -24
- package/dist/lib/monero/verify-lock.js.map +1 -1
- package/dist/lib/monero/verify-sweep.d.ts +0 -20
- package/dist/lib/monero/verify-sweep.d.ts.map +1 -1
- package/dist/lib/monero/verify-sweep.js +7 -25
- package/dist/lib/monero/verify-sweep.js.map +1 -1
- package/dist/lib/pow-solver.d.ts.map +1 -1
- package/dist/lib/pow-solver.js +3 -8
- package/dist/lib/pow-solver.js.map +1 -1
- package/dist/lib/retry.d.ts +7 -64
- package/dist/lib/retry.d.ts.map +1 -1
- package/dist/lib/retry.js +13 -13
- package/dist/lib/retry.js.map +1 -1
- package/dist/portable.d.ts.map +1 -1
- package/dist/portable.js +3 -4
- package/dist/portable.js.map +1 -1
- package/dist/quote-binding.d.ts +0 -13
- package/dist/quote-binding.d.ts.map +1 -1
- package/dist/quote-binding.js +3 -18
- package/dist/quote-binding.js.map +1 -1
- package/dist/swap-executor.d.ts +1 -5
- package/dist/swap-executor.d.ts.map +1 -1
- package/dist/swap-executor.js +1 -1
- package/dist/swap-executor.js.map +1 -1
- package/dist/types/api.d.ts +0 -6
- package/dist/types/api.d.ts.map +1 -1
- package/dist/types/api.js +6 -9
- package/dist/types/api.js.map +1 -1
- package/dist/types/errors.d.ts +0 -7
- package/dist/types/errors.d.ts.map +1 -1
- package/dist/types/errors.js +2 -7
- package/dist/types/errors.js.map +1 -1
- package/dist/types/index.js +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/types/keys.d.ts +0 -15
- package/dist/types/keys.d.ts.map +1 -1
- package/dist/types/protocol.d.ts +0 -51
- package/dist/types/protocol.d.ts.map +1 -1
- package/dist/types/protocol.js +3 -8
- package/dist/types/protocol.js.map +1 -1
- package/dist/types/status.d.ts.map +1 -1
- package/dist/types/status.js +9 -14
- package/dist/types/status.js.map +1 -1
- package/dist/types/verification.d.ts +0 -10
- package/dist/types/verification.d.ts.map +1 -1
- package/dist/types/verification.js +7 -15
- package/dist/types/verification.js.map +1 -1
- package/dist/verification/chainflip-networks.d.ts +2 -35
- package/dist/verification/chainflip-networks.d.ts.map +1 -1
- package/dist/verification/chainflip-networks.js +12 -4
- package/dist/verification/chainflip-networks.js.map +1 -1
- package/dist/verification/chainflip.d.ts +0 -40
- package/dist/verification/chainflip.d.ts.map +1 -1
- package/dist/verification/chainflip.js +49 -129
- package/dist/verification/chainflip.js.map +1 -1
- package/dist/verification/constants.d.ts +0 -40
- package/dist/verification/constants.d.ts.map +1 -1
- package/dist/verification/constants.js +14 -40
- package/dist/verification/constants.js.map +1 -1
- package/dist/verification/index.d.ts +0 -26
- package/dist/verification/index.d.ts.map +1 -1
- package/dist/verification/index.js +8 -12
- package/dist/verification/index.js.map +1 -1
- package/dist/verification/memo.d.ts +0 -15
- package/dist/verification/memo.d.ts.map +1 -1
- package/dist/verification/memo.js +9 -27
- package/dist/verification/memo.js.map +1 -1
- package/dist/verification/near-intents.d.ts +0 -63
- package/dist/verification/near-intents.d.ts.map +1 -1
- package/dist/verification/near-intents.js +25 -67
- package/dist/verification/near-intents.js.map +1 -1
- package/dist/verification/rate-oracle.d.ts +0 -22
- package/dist/verification/rate-oracle.d.ts.map +1 -1
- package/dist/verification/rate-oracle.js +6 -11
- package/dist/verification/rate-oracle.js.map +1 -1
- package/dist/verification/thorchain-networks.d.ts +0 -27
- package/dist/verification/thorchain-networks.d.ts.map +1 -1
- package/dist/verification/thorchain-networks.js +13 -15
- package/dist/verification/thorchain-networks.js.map +1 -1
- package/dist/verification/thorchain.d.ts +0 -30
- package/dist/verification/thorchain.d.ts.map +1 -1
- package/dist/verification/thorchain.js +24 -47
- package/dist/verification/thorchain.js.map +1 -1
- package/dist/wasm-pins.d.ts +3 -3
- package/dist/wasm-pins.js +1 -1
- package/dist/wire/near-intents.zod.d.ts +0 -27
- package/dist/wire/near-intents.zod.d.ts.map +1 -1
- package/dist/wire/near-intents.zod.js +15 -23
- package/dist/wire/near-intents.zod.js.map +1 -1
- package/dist/wire/server/action.zod.d.ts +0 -10
- package/dist/wire/server/action.zod.d.ts.map +1 -1
- package/dist/wire/server/action.zod.js +8 -14
- package/dist/wire/server/action.zod.js.map +1 -1
- package/dist/wire/server/common.zod.d.ts +0 -13
- package/dist/wire/server/common.zod.d.ts.map +1 -1
- package/dist/wire/server/common.zod.js +6 -14
- package/dist/wire/server/common.zod.js.map +1 -1
- package/dist/wire/server/swap.zod.d.ts +0 -42
- package/dist/wire/server/swap.zod.d.ts.map +1 -1
- package/dist/wire/server/swap.zod.js +12 -26
- package/dist/wire/server/swap.zod.js.map +1 -1
- package/dist/wire/thorchain.zod.d.ts +0 -8
- package/dist/wire/thorchain.zod.d.ts.map +1 -1
- package/dist/wire/thorchain.zod.js +3 -8
- package/dist/wire/thorchain.zod.js.map +1 -1
- package/package.json +4 -4
- package/wasm/miradex-rust/README.md +3 -4
- package/wasm/miradex-rust/miradex_rust.d.ts +4 -6
- package/wasm/miradex-rust/miradex_rust.js +4 -6
- package/wasm/miradex-rust/miradex_rust_bg.wasm +0 -0
|
@@ -1,52 +1,12 @@
|
|
|
1
1
|
export declare const VERIFY_MAX_ATTEMPTS = 12;
|
|
2
2
|
export declare const VERIFY_RETRY_DELAY_MS = 5000;
|
|
3
3
|
export declare const VERIFY_FETCH_TIMEOUT_MS = 10000;
|
|
4
|
-
/**
|
|
5
|
-
* Chainflip's hosted broker REST `/v2/swaps/<composite>` lags channel
|
|
6
|
-
* creation by ~30-60s — the broker creates the on-chain channel via
|
|
7
|
-
* `broker_request_swap_deposit_address` immediately, but the REST
|
|
8
|
-
* indexer ingests it on its own cadence. A first-attempt 404 is normal.
|
|
9
|
-
*
|
|
10
|
-
* Total retry budget covers the typical worst-case ingest delay; the
|
|
11
|
-
* backoff schedule starts tight (so the common case clears in seconds)
|
|
12
|
-
* and lengthens to avoid hammering the gateway during real outages.
|
|
13
|
-
*/
|
|
14
4
|
export declare const CHAINFLIP_REST_RETRY_TOTAL_MS = 120000;
|
|
15
5
|
export declare const CHAINFLIP_REST_RETRY_BACKOFF_MS: readonly number[];
|
|
16
6
|
export declare const ATOMICSWAP_TIMELOCK_MIN_BLOCKS = 5;
|
|
17
7
|
export declare const ATOMICSWAP_TIMELOCK_MAX_BLOCKS = 288;
|
|
18
|
-
/**
|
|
19
|
-
* Bounds for the BIP68 sequence applied to TxPunish — the relative timelock
|
|
20
|
-
* Alice must wait after TxCancel confirms before she can broadcast TxPunish.
|
|
21
|
-
*
|
|
22
|
-
* The minimum is the size of the refund window Bob is guaranteed: between
|
|
23
|
-
* TxCancel confirming and TxPunish becoming spendable, Bob must have time to
|
|
24
|
-
* notice, decrypt the encsig, and broadcast TxFullRefund/TxPartialRefund. A
|
|
25
|
-
* sub-block window degenerates into a fee race that Alice can win by
|
|
26
|
-
* out-of-band miner submission.
|
|
27
|
-
*
|
|
28
|
-
* Production deployments should configure ASB with the documented mainnet
|
|
29
|
-
* defaults (≥72). This lower bound (5) is the smallest positive integer that
|
|
30
|
-
* still rejects the degenerate `0` case the V-1 fix guards against, and exists
|
|
31
|
-
* to allow regtest tier2/system-test fixtures (which use 50) to run without
|
|
32
|
-
* patching every consumer of these constants.
|
|
33
|
-
*
|
|
34
|
-
* @security Closes V-1 — the Rust core enforces real production bounds via the
|
|
35
|
-
* env config (e.g. `bitcoin_punish_timelock` defaults).
|
|
36
|
-
*/
|
|
37
8
|
export declare const ATOMICSWAP_PUNISH_TIMELOCK_MIN_BLOCKS = 5;
|
|
38
9
|
export declare const ATOMICSWAP_PUNISH_TIMELOCK_MAX_BLOCKS = 288;
|
|
39
|
-
/**
|
|
40
|
-
* Bounds for the BIP68 sequence applied to TxReclaim — the additional wait
|
|
41
|
-
* after TxPartialRefund confirms before Bob can pull the amnesty back.
|
|
42
|
-
*
|
|
43
|
-
* Min is 1 — only the degenerate `0` case is rejected. Matches the Rust
|
|
44
|
-
* source (xmr-atomic-swap/core/swap-env/src/env.rs:65,88) which sets
|
|
45
|
-
* `bitcoin_remaining_refund_timelock = 2` for both mainnet and testnet;
|
|
46
|
-
* a stricter floor here would reject the Rust-shipped defaults.
|
|
47
|
-
*
|
|
48
|
-
* @security Closes V-1 (amnesty-path variant) — only `0` is unsafe.
|
|
49
|
-
*/
|
|
50
10
|
export declare const ATOMICSWAP_REMAINING_REFUND_TIMELOCK_MIN_BLOCKS = 1;
|
|
51
11
|
export declare const ATOMICSWAP_REMAINING_REFUND_TIMELOCK_MAX_BLOCKS = 288;
|
|
52
12
|
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/verification/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,mBAAmB,KAAK,CAAC;AACtC,eAAO,MAAM,qBAAqB,OAAQ,CAAC;AAC3C,eAAO,MAAM,uBAAuB,QAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/verification/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,mBAAmB,KAAK,CAAC;AACtC,eAAO,MAAM,qBAAqB,OAAQ,CAAC;AAC3C,eAAO,MAAM,uBAAuB,QAAS,CAAC;AAO9C,eAAO,MAAM,6BAA6B,SAAU,CAAC;AACrD,eAAO,MAAM,+BAA+B,EAAE,SAAS,MAAM,EAE5D,CAAC;AACF,eAAO,MAAM,8BAA8B,IAAI,CAAC;AAChD,eAAO,MAAM,8BAA8B,MAAM,CAAC;AAOlD,eAAO,MAAM,qCAAqC,IAAI,CAAC;AACvD,eAAO,MAAM,qCAAqC,MAAM,CAAC;AAMzD,eAAO,MAAM,+CAA+C,IAAI,CAAC;AACjE,eAAO,MAAM,+CAA+C,MAAM,CAAC"}
|
|
@@ -1,54 +1,28 @@
|
|
|
1
1
|
export const VERIFY_MAX_ATTEMPTS = 12;
|
|
2
2
|
export const VERIFY_RETRY_DELAY_MS = 5_000;
|
|
3
3
|
export const VERIFY_FETCH_TIMEOUT_MS = 10_000;
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
*
|
|
10
|
-
* Total retry budget covers the typical worst-case ingest delay; the
|
|
11
|
-
* backoff schedule starts tight (so the common case clears in seconds)
|
|
12
|
-
* and lengthens to avoid hammering the gateway during real outages.
|
|
13
|
-
*/
|
|
4
|
+
// Chainflip's broker REST /v2/swaps/<composite> lags channel creation by
|
|
5
|
+
// ~30-60s (the on-chain channel exists immediately, the REST indexer
|
|
6
|
+
// catches up on its own cadence). First-attempt 404 is normal.
|
|
7
|
+
// Backoff starts tight so the common case clears in seconds, then
|
|
8
|
+
// lengthens so we don't hammer the gateway during real outages.
|
|
14
9
|
export const CHAINFLIP_REST_RETRY_TOTAL_MS = 120_000;
|
|
15
10
|
export const CHAINFLIP_REST_RETRY_BACKOFF_MS = [
|
|
16
11
|
1_000, 2_000, 4_000, 8_000, 16_000, 30_000, 30_000, 30_000,
|
|
17
12
|
];
|
|
18
13
|
export const ATOMICSWAP_TIMELOCK_MIN_BLOCKS = 5;
|
|
19
14
|
export const ATOMICSWAP_TIMELOCK_MAX_BLOCKS = 288;
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
* TxCancel confirming and TxPunish becoming spendable, Bob must have time to
|
|
26
|
-
* notice, decrypt the encsig, and broadcast TxFullRefund/TxPartialRefund. A
|
|
27
|
-
* sub-block window degenerates into a fee race that Alice can win by
|
|
28
|
-
* out-of-band miner submission.
|
|
29
|
-
*
|
|
30
|
-
* Production deployments should configure ASB with the documented mainnet
|
|
31
|
-
* defaults (≥72). This lower bound (5) is the smallest positive integer that
|
|
32
|
-
* still rejects the degenerate `0` case the V-1 fix guards against, and exists
|
|
33
|
-
* to allow regtest tier2/system-test fixtures (which use 50) to run without
|
|
34
|
-
* patching every consumer of these constants.
|
|
35
|
-
*
|
|
36
|
-
* @security Closes V-1 — the Rust core enforces real production bounds via the
|
|
37
|
-
* env config (e.g. `bitcoin_punish_timelock` defaults).
|
|
38
|
-
*/
|
|
15
|
+
// V-1: BIP68 bounds for TxPunish (relative timelock Alice waits after
|
|
16
|
+
// TxCancel confirms). Floor is 5 — the smallest positive integer that
|
|
17
|
+
// rejects the degenerate 0 case while still admitting regtest fixtures
|
|
18
|
+
// that use 50. Real production bounds (>=72 mainnet) are enforced in the
|
|
19
|
+
// Rust core via env config.
|
|
39
20
|
export const ATOMICSWAP_PUNISH_TIMELOCK_MIN_BLOCKS = 5;
|
|
40
21
|
export const ATOMICSWAP_PUNISH_TIMELOCK_MAX_BLOCKS = 288;
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
* Min is 1 — only the degenerate `0` case is rejected. Matches the Rust
|
|
46
|
-
* source (xmr-atomic-swap/core/swap-env/src/env.rs:65,88) which sets
|
|
47
|
-
* `bitcoin_remaining_refund_timelock = 2` for both mainnet and testnet;
|
|
48
|
-
* a stricter floor here would reject the Rust-shipped defaults.
|
|
49
|
-
*
|
|
50
|
-
* @security Closes V-1 (amnesty-path variant) — only `0` is unsafe.
|
|
51
|
-
*/
|
|
22
|
+
// V-1 amnesty variant: BIP68 bounds for TxReclaim. Min is 1 — only the
|
|
23
|
+
// degenerate 0 is unsafe. Matches the Rust default
|
|
24
|
+
// bitcoin_remaining_refund_timelock = 2 (xmr-atomic-swap/core/swap-env/
|
|
25
|
+
// src/env.rs:65,88).
|
|
52
26
|
export const ATOMICSWAP_REMAINING_REFUND_TIMELOCK_MIN_BLOCKS = 1;
|
|
53
27
|
export const ATOMICSWAP_REMAINING_REFUND_TIMELOCK_MAX_BLOCKS = 288;
|
|
54
28
|
//# sourceMappingURL=constants.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/verification/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,CAAC;AACtC,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,CAAC;AAC3C,MAAM,CAAC,MAAM,uBAAuB,GAAG,MAAM,CAAC;AAE9C
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/verification/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,CAAC;AACtC,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,CAAC;AAC3C,MAAM,CAAC,MAAM,uBAAuB,GAAG,MAAM,CAAC;AAE9C,yEAAyE;AACzE,qEAAqE;AACrE,+DAA+D;AAC/D,kEAAkE;AAClE,gEAAgE;AAChE,MAAM,CAAC,MAAM,6BAA6B,GAAG,OAAO,CAAC;AACrD,MAAM,CAAC,MAAM,+BAA+B,GAAsB;IAChE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;CAC3D,CAAC;AACF,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAAC,CAAC;AAChD,MAAM,CAAC,MAAM,8BAA8B,GAAG,GAAG,CAAC;AAElD,sEAAsE;AACtE,sEAAsE;AACtE,uEAAuE;AACvE,yEAAyE;AACzE,4BAA4B;AAC5B,MAAM,CAAC,MAAM,qCAAqC,GAAG,CAAC,CAAC;AACvD,MAAM,CAAC,MAAM,qCAAqC,GAAG,GAAG,CAAC;AAEzD,uEAAuE;AACvE,mDAAmD;AACnD,wEAAwE;AACxE,qBAAqB;AACrB,MAAM,CAAC,MAAM,+CAA+C,GAAG,CAAC,CAAC;AACjE,MAAM,CAAC,MAAM,+CAA+C,GAAG,GAAG,CAAC"}
|
|
@@ -1,12 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Deposit-address verification dispatcher.
|
|
3
|
-
*
|
|
4
|
-
* Each provider has a dedicated verification path that validates the deposit
|
|
5
|
-
* address against the provider's own infrastructure (THORNode vaults,
|
|
6
|
-
* Chainflip channels, NEAR intent registry, atomic-swap lock script). Common
|
|
7
|
-
* client-side checks (address presence, output amount, destination match) run
|
|
8
|
-
* for every provider.
|
|
9
|
-
*/
|
|
10
1
|
import type { Logger } from '../interfaces/logger.js';
|
|
11
2
|
import type { SwapVerification, VerificationResult } from '../types/index.js';
|
|
12
3
|
import { verifyAtomicSwap } from './atomic-swap.js';
|
|
@@ -48,24 +39,7 @@ export interface VerifyDepositParams {
|
|
|
48
39
|
readonly fetchFn?: typeof globalThis.fetch;
|
|
49
40
|
readonly resume?: boolean;
|
|
50
41
|
readonly logger?: Logger;
|
|
51
|
-
/**
|
|
52
|
-
* External abort signal. Wired from the engine's AbortController so a
|
|
53
|
-
* caller-side `engine.destroy()` actually stops verification mid-flight.
|
|
54
|
-
* Without this, the chainflip REST retry loop alone can keep polling
|
|
55
|
-
* for up to CHAINFLIP_REST_RETRY_TOTAL_MS (120 s) after the engine has
|
|
56
|
-
* been told to stop — burning user bandwidth and racing whatever the
|
|
57
|
-
* caller spun up to replace it.
|
|
58
|
-
*/
|
|
59
42
|
readonly signal?: AbortSignal;
|
|
60
43
|
}
|
|
61
|
-
/**
|
|
62
|
-
* Verify a deposit address against the authoritative infrastructure for its
|
|
63
|
-
* provider. Common client-side checks (address presence, output amount,
|
|
64
|
-
* destination match) run for every provider.
|
|
65
|
-
*
|
|
66
|
-
* @throws {VerificationError} `E_PROVIDER_UNKNOWN` for an unrecognised
|
|
67
|
-
* provider; `E_UNEXPECTED_TIMELOCK` when `timelock_blocks` is set for a
|
|
68
|
-
* non-atomicswap provider.
|
|
69
|
-
*/
|
|
70
44
|
export declare function verifyDepositAddress(params: VerifyDepositParams): Promise<VerificationResult>;
|
|
71
45
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/verification/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/verification/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
// Per-provider verification dispatcher. Each path validates against the
|
|
2
|
+
// provider's own infrastructure (THORNode vaults, Chainflip channels,
|
|
3
|
+
// 1Click intent registry, atomic-swap lock script). Common client-side
|
|
4
|
+
// checks (address presence, output amount, destination match) run for all.
|
|
1
5
|
import { noopLogger } from '../interfaces/logger.js';
|
|
2
6
|
import { VerificationError } from '../types/index.js';
|
|
3
7
|
import { verifyAtomicSwap } from './atomic-swap.js';
|
|
@@ -14,15 +18,8 @@ export { THORCHAIN_VERIFICATION_NETWORKS, thorchainEndpointsForNetwork, } from '
|
|
|
14
18
|
export { fetchNearIntentStatus, requireIntentBinds, requireIntentDeadlineMargin, verifyNearIntentOnChain, } from './near-intents.js';
|
|
15
19
|
export { fetchConsensusRate } from './rate-oracle.js';
|
|
16
20
|
export { VERIFY_FETCH_TIMEOUT_MS, VERIFY_MAX_ATTEMPTS, VERIFY_RETRY_DELAY_MS } from './constants.js';
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
* provider. Common client-side checks (address presence, output amount,
|
|
20
|
-
* destination match) run for every provider.
|
|
21
|
-
*
|
|
22
|
-
* @throws {VerificationError} `E_PROVIDER_UNKNOWN` for an unrecognised
|
|
23
|
-
* provider; `E_UNEXPECTED_TIMELOCK` when `timelock_blocks` is set for a
|
|
24
|
-
* non-atomicswap provider.
|
|
25
|
-
*/
|
|
21
|
+
// Throws E_PROVIDER_UNKNOWN for an unknown provider, E_UNEXPECTED_TIMELOCK
|
|
22
|
+
// when timelock_blocks is set on a non-atomicswap provider.
|
|
26
23
|
export async function verifyDepositAddress(params) {
|
|
27
24
|
const { depositAddress, verification, destAddress, refundAddress, toToken, amount, fromChain, toChain, fromToken, network = 'mainnet', protocol, expectedAmountOut, expectedDestAddress, fetchFn = globalThis.fetch, resume, logger = noopLogger, signal, } = params;
|
|
28
25
|
const verifyParams = {
|
|
@@ -34,9 +31,8 @@ export async function verifyDepositAddress(params) {
|
|
|
34
31
|
toChain,
|
|
35
32
|
fromToken,
|
|
36
33
|
};
|
|
37
|
-
// AV-A.13
|
|
38
|
-
//
|
|
39
|
-
// confusion attempt — reject loudly.
|
|
34
|
+
// AV-A.13: timelock_blocks is only meaningful for atomicswap. Anything
|
|
35
|
+
// else is a client bug or a server confusion attempt; fail loud.
|
|
40
36
|
if (verification.provider !== 'atomicswap' && protocol?.timelock_blocks !== undefined) {
|
|
41
37
|
throw new VerificationError('E_UNEXPECTED_TIMELOCK', `timelock_blocks is set for non-atomicswap provider ${verification.provider}`);
|
|
42
38
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/verification/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/verification/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,21 +7,6 @@ export interface ParsedThorchainMemo {
|
|
|
7
7
|
readonly affiliate?: string;
|
|
8
8
|
readonly affiliateFeeBps?: number;
|
|
9
9
|
}
|
|
10
|
-
/**
|
|
11
|
-
* Parse a THORChain memo string. Accepts `SWAP:`, `=:`, and `s:` prefixes
|
|
12
|
-
* followed by asset, destination, optional min-out (either a plain integer
|
|
13
|
-
* or the streaming form `LIMIT/INTERVAL/QUANTITY`), optional affiliate,
|
|
14
|
-
* optional affiliate fee in bps.
|
|
15
|
-
*
|
|
16
|
-
* @throws {VerificationError} `E_MEMO_MALFORMED` when the memo does not
|
|
17
|
-
* match the canonical ABI.
|
|
18
|
-
*/
|
|
19
10
|
export declare function parseThorchainMemo(memo: string): ParsedThorchainMemo;
|
|
20
|
-
/**
|
|
21
|
-
* Assert the parsed memo's destination field equals the expected address.
|
|
22
|
-
*
|
|
23
|
-
* @throws {VerificationError} `E_MEMO_DEST_MISMATCH` on mismatch.
|
|
24
|
-
* @throws {VerificationError} `E_MEMO_MALFORMED` if the memo fails to parse.
|
|
25
|
-
*/
|
|
26
11
|
export declare function requireMemoBindsDestination(memo: string, expectedDestAddress: string): void;
|
|
27
12
|
//# sourceMappingURL=memo.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memo.d.ts","sourceRoot":"","sources":["../../src/verification/memo.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"memo.d.ts","sourceRoot":"","sources":["../../src/verification/memo.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;CACnC;AAMD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,mBAAmB,CAepE;AAGD,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,EAAE,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAQ3F"}
|
|
@@ -1,26 +1,13 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
* destination address is a substring. An attacker-controlled memo of the form
|
|
6
|
-
* `SWAP:ETH.ETH:0xATTACKER:0:affid_<USER_ADDR>:10` would pass that check.
|
|
7
|
-
*
|
|
8
|
-
* The strict parser matches the THORChain memo ABI and compares the
|
|
9
|
-
* destination field only.
|
|
10
|
-
*
|
|
11
|
-
* @security Closes AV-A.14 variant / AV-K.6.
|
|
12
|
-
*/
|
|
1
|
+
// AV-A.14 / AV-K.6: strict THORChain memo parser.
|
|
2
|
+
// memo.includes(destAddress) was vulnerable: a memo like
|
|
3
|
+
// SWAP:ETH.ETH:0xATTACKER:0:affid_<USER_ADDR>:10 passes a substring check.
|
|
4
|
+
// The parser here matches the memo ABI and compares the destination field only.
|
|
13
5
|
import { VerificationError } from '../types/index.js';
|
|
14
6
|
const THORCHAIN_MEMO_RE = /^(?:SWAP|=|s):([A-Z0-9./-]+):([A-Za-z0-9_./]+)(?::(\d+)(?:\/(\d+)\/(\d+))?)?(?::([A-Za-z0-9]+))?(?::(\d+))?$/;
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
* optional affiliate fee in bps.
|
|
20
|
-
*
|
|
21
|
-
* @throws {VerificationError} `E_MEMO_MALFORMED` when the memo does not
|
|
22
|
-
* match the canonical ABI.
|
|
23
|
-
*/
|
|
7
|
+
// Accepts SWAP:, =:, and s: prefixes plus asset, destination, optional
|
|
8
|
+
// min-out (integer or streaming LIMIT/INTERVAL/QUANTITY), optional
|
|
9
|
+
// affiliate, optional affiliate fee bps. Throws E_MEMO_MALFORMED on a
|
|
10
|
+
// memo that doesn't match the canonical ABI.
|
|
24
11
|
export function parseThorchainMemo(memo) {
|
|
25
12
|
const match = memo.trim().match(THORCHAIN_MEMO_RE);
|
|
26
13
|
if (!match) {
|
|
@@ -37,12 +24,7 @@ export function parseThorchainMemo(memo) {
|
|
|
37
24
|
affiliateFeeBps: feeBps !== undefined ? Number(feeBps) : undefined,
|
|
38
25
|
};
|
|
39
26
|
}
|
|
40
|
-
|
|
41
|
-
* Assert the parsed memo's destination field equals the expected address.
|
|
42
|
-
*
|
|
43
|
-
* @throws {VerificationError} `E_MEMO_DEST_MISMATCH` on mismatch.
|
|
44
|
-
* @throws {VerificationError} `E_MEMO_MALFORMED` if the memo fails to parse.
|
|
45
|
-
*/
|
|
27
|
+
// Throws E_MEMO_DEST_MISMATCH on mismatch, E_MEMO_MALFORMED if memo doesn't parse.
|
|
46
28
|
export function requireMemoBindsDestination(memo, expectedDestAddress) {
|
|
47
29
|
const parsed = parseThorchainMemo(memo);
|
|
48
30
|
if (parsed.destAddress !== expectedDestAddress) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memo.js","sourceRoot":"","sources":["../../src/verification/memo.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"memo.js","sourceRoot":"","sources":["../../src/verification/memo.ts"],"names":[],"mappings":"AAAA,kDAAkD;AAClD,yDAAyD;AACzD,2EAA2E;AAC3E,gFAAgF;AAEhF,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,MAAM,iBAAiB,GACrB,8GAA8G,CAAC;AAYjH,uEAAuE;AACvE,mEAAmE;AACnE,sEAAsE;AACtE,6CAA6C;AAC7C,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACnD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,iBAAiB,CAAC,kBAAkB,EAAE,wBAAwB,IAAI,EAAE,CAAC,CAAC;IAClF,CAAC;IACD,MAAM,CAAC,EAAE,KAAK,GAAG,EAAE,EAAE,WAAW,GAAG,EAAE,EAAE,MAAM,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,CAAC,GAAG,KAAK,CAAC;IAChH,OAAO;QACL,KAAK;QACL,WAAW;QACX,MAAM,EAAE,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS;QACzD,iBAAiB,EAAE,iBAAiB,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,SAAS;QAC1F,iBAAiB,EAAE,iBAAiB,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,SAAS;QAC1F,SAAS;QACT,eAAe,EAAE,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS;KACnE,CAAC;AACJ,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,2BAA2B,CAAC,IAAY,EAAE,mBAA2B;IACnF,MAAM,MAAM,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IACxC,IAAI,MAAM,CAAC,WAAW,KAAK,mBAAmB,EAAE,CAAC;QAC/C,MAAM,IAAI,iBAAiB,CACzB,sBAAsB,EACtB,oBAAoB,MAAM,CAAC,WAAW,0BAA0B,mBAAmB,EAAE,CACtF,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -1,64 +1,18 @@
|
|
|
1
1
|
import type { NearIntentsVerification, VerificationResult } from '../types/index.js';
|
|
2
2
|
import { type NearIntentStatusResponse } from '../wire/near-intents.zod.js';
|
|
3
|
-
/**
|
|
4
|
-
* Verify a NEAR-Intents deposit address against the 1Click status endpoint.
|
|
5
|
-
* Uses an explicit status enum switch (no `!== 'NOT_FOUND'` substring).
|
|
6
|
-
*/
|
|
7
3
|
export declare function verifyNearIntents(v: NearIntentsVerification, fetchFn: typeof globalThis.fetch, externalSignal?: AbortSignal): Promise<VerificationResult>;
|
|
8
4
|
export interface FetchNearIntentStatusInput {
|
|
9
5
|
readonly statusUrl: string;
|
|
10
6
|
readonly fetchFn: typeof globalThis.fetch;
|
|
11
7
|
readonly timeoutMs?: number;
|
|
12
8
|
}
|
|
13
|
-
/**
|
|
14
|
-
* Fetch 1Click `/v0/status` and return a flattened intent view. Performs an
|
|
15
|
-
* exhaustive enum switch over the 7 real status values.
|
|
16
|
-
*
|
|
17
|
-
* Mapping of HTTP / status to error codes:
|
|
18
|
-
* - HTTP 404 → `E_NEAR_INTENT_NOT_REGISTERED` (deposit address unknown to 1Click)
|
|
19
|
-
* - HTTP non-2xx (non-404) → `E_NEAR_INTENT_FAILED` (network / server error)
|
|
20
|
-
* - status === 'FAILED' → `E_NEAR_INTENT_FAILED`
|
|
21
|
-
* - status in {PENDING_DEPOSIT, KNOWN_DEPOSIT_TX, INCOMPLETE_DEPOSIT,
|
|
22
|
-
* PROCESSING, SUCCESS, REFUNDED} → returns the flattened response.
|
|
23
|
-
*
|
|
24
|
-
* 1Click does not surface an "EXPIRED" status. Past-deadline detection is
|
|
25
|
-
* performed via `requireIntentDeadlineMargin` against `quote.deadline`.
|
|
26
|
-
*
|
|
27
|
-
* @throws {VerificationError} `E_NEAR_INTENT_NOT_REGISTERED` on HTTP 404.
|
|
28
|
-
* @throws {VerificationError} `E_NEAR_INTENT_FAILED` on HTTP error or
|
|
29
|
-
* `status === 'FAILED'`.
|
|
30
|
-
*/
|
|
31
9
|
export declare function fetchNearIntentStatus(input: FetchNearIntentStatusInput): Promise<NearIntentStatusResponse>;
|
|
32
10
|
export interface RequireIntentBindsInput {
|
|
33
11
|
readonly destinationAddress: string;
|
|
34
|
-
/**
|
|
35
|
-
* Optional 1Click destination-asset ID (e.g.
|
|
36
|
-
* `nep141:eth-0xa0b8…omft.near`). Pass it to assert the intent really
|
|
37
|
-
* targets the destination chain you expect — 1Click's `/v0/status`
|
|
38
|
-
* exposes the chain only inside this asset ID, not as a separate field.
|
|
39
|
-
*/
|
|
40
12
|
readonly destinationAssetId?: string;
|
|
41
13
|
readonly refundAddress?: string;
|
|
42
14
|
}
|
|
43
|
-
/**
|
|
44
|
-
* Assert the returned intent binds the caller's expected destination address,
|
|
45
|
-
* destination asset, and (optional) refund address.
|
|
46
|
-
*
|
|
47
|
-
* @throws {VerificationError} `E_NEAR_INTENT_MISBINDING` on any mismatch.
|
|
48
|
-
*/
|
|
49
15
|
export declare function requireIntentBinds(intent: NearIntentStatusResponse, expected: RequireIntentBindsInput): void;
|
|
50
|
-
/**
|
|
51
|
-
* Enforce the quote deadline has at least the safety margin (90 min) before
|
|
52
|
-
* it expires relative to `Date.now()`. The deadline lives at
|
|
53
|
-
* `quoteResponse.quote.deadline` in the raw 1Click response and is surfaced
|
|
54
|
-
* as `intent.deadline` after flattening.
|
|
55
|
-
*
|
|
56
|
-
* Returns silently if `intent.deadline` is null (1Click's dry-run quotes
|
|
57
|
-
* omit the deadline; we cannot enforce expiry against an absent value).
|
|
58
|
-
*
|
|
59
|
-
* @throws {VerificationError} `E_NEAR_INTENT_EXPIRING` when the deadline is
|
|
60
|
-
* sooner than the safety margin.
|
|
61
|
-
*/
|
|
62
16
|
export declare function requireIntentDeadlineMargin(intent: NearIntentStatusResponse): void;
|
|
63
17
|
export interface VerifyNearIntentOnChainInput {
|
|
64
18
|
readonly intentHash: string;
|
|
@@ -70,22 +24,5 @@ export interface VerifyNearIntentOnChainInput {
|
|
|
70
24
|
readonly fetchFn: typeof globalThis.fetch;
|
|
71
25
|
readonly timeoutMs?: number;
|
|
72
26
|
}
|
|
73
|
-
/**
|
|
74
|
-
* **Direct-blockchain near-intents only — NOT for 1Click swaps.**
|
|
75
|
-
*
|
|
76
|
-
* Queries the NEAR contract `intents.near` via JSON-RPC `get_intent` and
|
|
77
|
-
* cross-checks that an intent hash binds the expected destination + amount.
|
|
78
|
-
* This is the verification path for swaps that go through the solver-relay
|
|
79
|
-
* directly. 1Click swaps do not surface usable on-chain intent hashes
|
|
80
|
-
* suitable for this query — for 1Click, use `fetchNearIntentStatus` +
|
|
81
|
-
* `requireIntentBinds` against the `/v0/status` URL instead.
|
|
82
|
-
*
|
|
83
|
-
* Kept available for a future direct-blockchain near_intents provider
|
|
84
|
-
* (`packages/miradex-client/src/...` / `daemons/near/`).
|
|
85
|
-
*
|
|
86
|
-
* @throws {VerificationError} `E_NEAR_INTENT_FAILED` on RPC error.
|
|
87
|
-
* @throws {VerificationError} `E_NEAR_INTENT_CHAIN_DEST` on destination mismatch.
|
|
88
|
-
* @throws {VerificationError} `E_NEAR_INTENT_CHAIN_AMOUNT` on amount mismatch.
|
|
89
|
-
*/
|
|
90
27
|
export declare function verifyNearIntentOnChain(input: VerifyNearIntentOnChainInput): Promise<void>;
|
|
91
28
|
//# sourceMappingURL=near-intents.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"near-intents.d.ts","sourceRoot":"","sources":["../../src/verification/near-intents.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAqB,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAGxG,OAAO,EAIL,KAAK,wBAAwB,EAC9B,MAAM,6BAA6B,CAAC;AAkBrC
|
|
1
|
+
{"version":3,"file":"near-intents.d.ts","sourceRoot":"","sources":["../../src/verification/near-intents.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAqB,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAGxG,OAAO,EAIL,KAAK,wBAAwB,EAC9B,MAAM,6BAA6B,CAAC;AAkBrC,wBAAsB,iBAAiB,CACrC,CAAC,EAAE,uBAAuB,EAC1B,OAAO,EAAE,OAAO,UAAU,CAAC,KAAK,EAChC,cAAc,CAAC,EAAE,WAAW,GAC3B,OAAO,CAAC,kBAAkB,CAAC,CAyC7B;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;IAC1C,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AASD,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,0BAA0B,GAChC,OAAO,CAAC,wBAAwB,CAAC,CAoDnC;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IAIpC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CACjC;AAGD,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,wBAAwB,EAChC,QAAQ,EAAE,uBAAuB,GAChC,IAAI,CAyBN;AAKD,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,wBAAwB,GAC/B,IAAI,CAWN;AAED,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE;QAAE,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAA;KAAE,CAAC;IAClG,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;IAC1C,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAQD,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,4BAA4B,GAClC,OAAO,CAAC,IAAI,CAAC,CA4Cf"}
|
|
@@ -2,10 +2,9 @@ import { check, errMsg, failOf, resultOf } from './shared.js';
|
|
|
2
2
|
import { VerificationError } from '../types/index.js';
|
|
3
3
|
import { NearIntentRawStatusSchema, NearIntentOnChainSchema, NearRpcResponseSchema, } from '../wire/near-intents.zod.js';
|
|
4
4
|
import { VERIFY_FETCH_TIMEOUT_MS } from './constants.js';
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
// as active. Source: 1Click OpenAPI v0.1.10 + live captures.
|
|
5
|
+
// 1Click status enum (7 values). INCOMPLETE_DEPOSIT means "deposit observed
|
|
6
|
+
// but below bridge minimum" — intent is registered and the address is real,
|
|
7
|
+
// so it counts as active here. Source: 1Click OpenAPI v0.1.10.
|
|
9
8
|
const ACTIVE_STATUSES = [
|
|
10
9
|
'PENDING_DEPOSIT',
|
|
11
10
|
'KNOWN_DEPOSIT_TX',
|
|
@@ -15,15 +14,10 @@ const ACTIVE_STATUSES = [
|
|
|
15
14
|
'REFUNDED',
|
|
16
15
|
];
|
|
17
16
|
const INTENT_DEADLINE_MARGIN_MS = 90 * 60 * 1000;
|
|
18
|
-
|
|
19
|
-
* Verify a NEAR-Intents deposit address against the 1Click status endpoint.
|
|
20
|
-
* Uses an explicit status enum switch (no `!== 'NOT_FOUND'` substring).
|
|
21
|
-
*/
|
|
17
|
+
// Explicit status enum switch (no '!== NOT_FOUND' substring matching).
|
|
22
18
|
export async function verifyNearIntents(v, fetchFn, externalSignal) {
|
|
23
19
|
const checks = [];
|
|
24
|
-
//
|
|
25
|
-
// emit a public-clickable URL). Without one we cannot run the live check —
|
|
26
|
-
// surface that explicitly rather than calling fetch() on null.
|
|
20
|
+
// Schema permits null status_url; surface explicitly rather than fetch(null).
|
|
27
21
|
if (!v.status_url) {
|
|
28
22
|
return failOf('near_intents', [
|
|
29
23
|
check('NEAR reachable', false, 'No public status URL available'),
|
|
@@ -53,24 +47,13 @@ export async function verifyNearIntents(v, fetchFn, externalSignal) {
|
|
|
53
47
|
}
|
|
54
48
|
return resultOf('near_intents', checks);
|
|
55
49
|
}
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
* - status === 'FAILED' → `E_NEAR_INTENT_FAILED`
|
|
64
|
-
* - status in {PENDING_DEPOSIT, KNOWN_DEPOSIT_TX, INCOMPLETE_DEPOSIT,
|
|
65
|
-
* PROCESSING, SUCCESS, REFUNDED} → returns the flattened response.
|
|
66
|
-
*
|
|
67
|
-
* 1Click does not surface an "EXPIRED" status. Past-deadline detection is
|
|
68
|
-
* performed via `requireIntentDeadlineMargin` against `quote.deadline`.
|
|
69
|
-
*
|
|
70
|
-
* @throws {VerificationError} `E_NEAR_INTENT_NOT_REGISTERED` on HTTP 404.
|
|
71
|
-
* @throws {VerificationError} `E_NEAR_INTENT_FAILED` on HTTP error or
|
|
72
|
-
* `status === 'FAILED'`.
|
|
73
|
-
*/
|
|
50
|
+
// HTTP/status -> error code:
|
|
51
|
+
// 404 -> E_NEAR_INTENT_NOT_REGISTERED
|
|
52
|
+
// non-2xx (non-404) -> E_NEAR_INTENT_FAILED
|
|
53
|
+
// status === FAILED -> E_NEAR_INTENT_FAILED
|
|
54
|
+
// PENDING_DEPOSIT/PROCESSING/SUCCESS/REFUNDED/... -> flattened response
|
|
55
|
+
// 1Click has no EXPIRED status; past-deadline is detected via
|
|
56
|
+
// requireIntentDeadlineMargin against quote.deadline.
|
|
74
57
|
export async function fetchNearIntentStatus(input) {
|
|
75
58
|
const timeoutMs = input.timeoutMs ?? VERIFY_FETCH_TIMEOUT_MS;
|
|
76
59
|
const res = await input.fetchFn(input.statusUrl, { signal: AbortSignal.timeout(timeoutMs) });
|
|
@@ -85,9 +68,9 @@ export async function fetchNearIntentStatus(input) {
|
|
|
85
68
|
if (parsed.status === 'FAILED') {
|
|
86
69
|
throw new VerificationError('E_NEAR_INTENT_FAILED', `intent failed on 1Click${parsed.swapDetails.refundReason ? ` (${parsed.swapDetails.refundReason})` : ''}`);
|
|
87
70
|
}
|
|
88
|
-
//
|
|
89
|
-
//
|
|
90
|
-
//
|
|
71
|
+
// Binding fields live under quoteResponse.quoteRequest (recipient, refundTo,
|
|
72
|
+
// originAsset, ...) and quoteResponse.quote (depositAddress, depositMemo,
|
|
73
|
+
// deadline, amounts).
|
|
91
74
|
const qr = parsed.quoteResponse;
|
|
92
75
|
const request = qr?.quoteRequest ?? {};
|
|
93
76
|
const quote = qr?.quote;
|
|
@@ -112,12 +95,7 @@ export async function fetchNearIntentStatus(input) {
|
|
|
112
95
|
refundReason: parsed.swapDetails.refundReason ?? null,
|
|
113
96
|
};
|
|
114
97
|
}
|
|
115
|
-
|
|
116
|
-
* Assert the returned intent binds the caller's expected destination address,
|
|
117
|
-
* destination asset, and (optional) refund address.
|
|
118
|
-
*
|
|
119
|
-
* @throws {VerificationError} `E_NEAR_INTENT_MISBINDING` on any mismatch.
|
|
120
|
-
*/
|
|
98
|
+
// Throws E_NEAR_INTENT_MISBINDING on any mismatch.
|
|
121
99
|
export function requireIntentBinds(intent, expected) {
|
|
122
100
|
if (intent.destinationAddress !== expected.destinationAddress) {
|
|
123
101
|
throw new VerificationError('E_NEAR_INTENT_MISBINDING', `intent destination ${String(intent.destinationAddress)} != expected ${expected.destinationAddress}`);
|
|
@@ -131,18 +109,9 @@ export function requireIntentBinds(intent, expected) {
|
|
|
131
109
|
throw new VerificationError('E_NEAR_INTENT_MISBINDING', `intent refund ${String(intent.refundAddress)} != expected ${expected.refundAddress}`);
|
|
132
110
|
}
|
|
133
111
|
}
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
* `quoteResponse.quote.deadline` in the raw 1Click response and is surfaced
|
|
138
|
-
* as `intent.deadline` after flattening.
|
|
139
|
-
*
|
|
140
|
-
* Returns silently if `intent.deadline` is null (1Click's dry-run quotes
|
|
141
|
-
* omit the deadline; we cannot enforce expiry against an absent value).
|
|
142
|
-
*
|
|
143
|
-
* @throws {VerificationError} `E_NEAR_INTENT_EXPIRING` when the deadline is
|
|
144
|
-
* sooner than the safety margin.
|
|
145
|
-
*/
|
|
112
|
+
// 90-minute safety margin against intent.deadline. Silent no-op when
|
|
113
|
+
// deadline is null (1Click dry-run quotes). Throws E_NEAR_INTENT_EXPIRING
|
|
114
|
+
// when remaining < margin.
|
|
146
115
|
export function requireIntentDeadlineMargin(intent) {
|
|
147
116
|
if (intent.deadline === null)
|
|
148
117
|
return;
|
|
@@ -154,23 +123,12 @@ export function requireIntentDeadlineMargin(intent) {
|
|
|
154
123
|
throw new VerificationError('E_NEAR_INTENT_EXPIRING', `intent deadline in ${(remaining / 60_000).toFixed(1)} minutes, below safety margin`);
|
|
155
124
|
}
|
|
156
125
|
}
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
* directly. 1Click swaps do not surface usable on-chain intent hashes
|
|
164
|
-
* suitable for this query — for 1Click, use `fetchNearIntentStatus` +
|
|
165
|
-
* `requireIntentBinds` against the `/v0/status` URL instead.
|
|
166
|
-
*
|
|
167
|
-
* Kept available for a future direct-blockchain near_intents provider
|
|
168
|
-
* (`packages/miradex-client/src/...` / `daemons/near/`).
|
|
169
|
-
*
|
|
170
|
-
* @throws {VerificationError} `E_NEAR_INTENT_FAILED` on RPC error.
|
|
171
|
-
* @throws {VerificationError} `E_NEAR_INTENT_CHAIN_DEST` on destination mismatch.
|
|
172
|
-
* @throws {VerificationError} `E_NEAR_INTENT_CHAIN_AMOUNT` on amount mismatch.
|
|
173
|
-
*/
|
|
126
|
+
// Direct-blockchain near-intents only, NOT for 1Click. Queries
|
|
127
|
+
// intents.near via JSON-RPC get_intent and confirms the intent hash binds
|
|
128
|
+
// the expected destination + amount. Kept around for a future
|
|
129
|
+
// direct-blockchain provider; 1Click swaps use fetchNearIntentStatus +
|
|
130
|
+
// requireIntentBinds against /v0/status instead.
|
|
131
|
+
// Throws E_NEAR_INTENT_FAILED (RPC), E_NEAR_INTENT_CHAIN_DEST, E_NEAR_INTENT_CHAIN_AMOUNT.
|
|
174
132
|
export async function verifyNearIntentOnChain(input) {
|
|
175
133
|
const timeoutMs = input.timeoutMs ?? VERIFY_FETCH_TIMEOUT_MS;
|
|
176
134
|
const body = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"near-intents.js","sourceRoot":"","sources":["../../src/verification/near-intents.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EACL,yBAAyB,EACzB,uBAAuB,EACvB,qBAAqB,GAEtB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAEzD,
|
|
1
|
+
{"version":3,"file":"near-intents.js","sourceRoot":"","sources":["../../src/verification/near-intents.ts"],"names":[],"mappings":"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"}
|