@miradexio/client 0.1.1 → 0.1.3
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 +72 -114
- 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 +1 -13
- package/dist/atomic-swap/monero-sweep/index.d.ts.map +1 -1
- package/dist/atomic-swap/monero-sweep/index.js +36 -65
- 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 +8 -15
- 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-state.d.ts +8 -1
- package/dist/engine/flows/atomic-flow-state.d.ts.map +1 -1
- package/dist/engine/flows/atomic-flow.d.ts +1 -28
- package/dist/engine/flows/atomic-flow.d.ts.map +1 -1
- package/dist/engine/flows/atomic-flow.js +98 -128
- package/dist/engine/flows/atomic-flow.js.map +1 -1
- package/dist/engine/flows/error-routing.d.ts +11 -0
- package/dist/engine/flows/error-routing.d.ts.map +1 -0
- package/dist/engine/flows/error-routing.js +17 -0
- package/dist/engine/flows/error-routing.js.map +1 -0
- 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 +11 -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 +2 -0
- package/dist/types/status.d.ts.map +1 -1
- package/dist/types/status.js +17 -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/quotes.zod.d.ts +35 -20
- package/dist/wire/server/quotes.zod.d.ts.map +1 -1
- package/dist/wire/server/quotes.zod.js +1 -0
- package/dist/wire/server/quotes.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 +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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"}
|
|
@@ -1,14 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* External rate oracles for cross-checking engine quotes.
|
|
3
|
-
*
|
|
4
|
-
* The client queries two independent oracles (e.g., CoinGecko + CryptoCompare)
|
|
5
|
-
* and demands they agree within a band before allowing a swap to proceed.
|
|
6
|
-
* Any wider disagreement surfaces as `E_ORACLE_SPREAD`; too few responses as
|
|
7
|
-
* `E_ORACLE_QUORUM`.
|
|
8
|
-
*
|
|
9
|
-
* @security Closes AV-D.4 / AV-H.12 — protects against sidecar + proxy
|
|
10
|
-
* collusion on rate quotes.
|
|
11
|
-
*/
|
|
12
1
|
import type { Logger } from '../interfaces/logger.js';
|
|
13
2
|
export interface RateOracleConfig {
|
|
14
3
|
readonly oracleUrls: ReadonlyArray<string>;
|
|
@@ -17,16 +6,5 @@ export interface RateOracleConfig {
|
|
|
17
6
|
readonly quorum: number;
|
|
18
7
|
readonly logger?: Logger;
|
|
19
8
|
}
|
|
20
|
-
/**
|
|
21
|
-
* Query every configured oracle in parallel, extract a numeric rate from each
|
|
22
|
-
* response, and return the median if at least `quorum` oracles agree within
|
|
23
|
-
* a 2 % band.
|
|
24
|
-
*
|
|
25
|
-
* @param input Oracle URLs, fetch function, timeout, quorum, logger.
|
|
26
|
-
* @param extractRate Per-oracle adapter that pulls the rate out of the body.
|
|
27
|
-
* @returns The median rate across all agreeing oracles.
|
|
28
|
-
* @throws {VerificationError} `E_ORACLE_QUORUM` when fewer than `quorum`
|
|
29
|
-
* oracles respond; `E_ORACLE_SPREAD` when the rates span more than 2 %.
|
|
30
|
-
*/
|
|
31
9
|
export declare function fetchConsensusRate(input: RateOracleConfig, extractRate: (url: string, body: unknown) => number): Promise<number>;
|
|
32
10
|
//# sourceMappingURL=rate-oracle.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rate-oracle.d.ts","sourceRoot":"","sources":["../../src/verification/rate-oracle.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"rate-oracle.d.ts","sourceRoot":"","sources":["../../src/verification/rate-oracle.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAKtD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAC3C,QAAQ,CAAC,OAAO,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;IAC1C,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAOD,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,gBAAgB,EACvB,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,KAAK,MAAM,GAClD,OAAO,CAAC,MAAM,CAAC,CAoCjB"}
|
|
@@ -1,18 +1,13 @@
|
|
|
1
|
+
// AV-D.4 / AV-H.12: rate-oracle quorum. Query two independent oracles
|
|
2
|
+
// (CoinGecko + CryptoCompare etc.) and require agreement within a band.
|
|
3
|
+
// E_ORACLE_SPREAD on wider disagreement, E_ORACLE_QUORUM on too few responses.
|
|
1
4
|
import { noopLogger } from '../interfaces/logger.js';
|
|
2
5
|
import { VerificationError } from '../types/index.js';
|
|
3
6
|
import { VERIFY_FETCH_TIMEOUT_MS } from './constants.js';
|
|
4
7
|
const DEFAULT_SPREAD_CAP = 0.02; // 2 %
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
* a 2 % band.
|
|
9
|
-
*
|
|
10
|
-
* @param input Oracle URLs, fetch function, timeout, quorum, logger.
|
|
11
|
-
* @param extractRate Per-oracle adapter that pulls the rate out of the body.
|
|
12
|
-
* @returns The median rate across all agreeing oracles.
|
|
13
|
-
* @throws {VerificationError} `E_ORACLE_QUORUM` when fewer than `quorum`
|
|
14
|
-
* oracles respond; `E_ORACLE_SPREAD` when the rates span more than 2 %.
|
|
15
|
-
*/
|
|
8
|
+
// Returns the median rate across oracles that agree within 2%.
|
|
9
|
+
// Throws E_ORACLE_QUORUM if fewer than `quorum` responded,
|
|
10
|
+
// E_ORACLE_SPREAD if disagreement exceeds the cap.
|
|
16
11
|
export async function fetchConsensusRate(input, extractRate) {
|
|
17
12
|
const timeoutMs = input.timeoutMs ?? VERIFY_FETCH_TIMEOUT_MS;
|
|
18
13
|
const log = input.logger ?? noopLogger;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rate-oracle.js","sourceRoot":"","sources":["../../src/verification/rate-oracle.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"rate-oracle.js","sourceRoot":"","sources":["../../src/verification/rate-oracle.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,33 +1,6 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* SDK-owned THORChain verification endpoints. Same shape as the chainflip
|
|
3
|
-
* registry: hardcoded per network so the SDK never trusts the server-supplied
|
|
4
|
-
* `verification.inbound_addresses_url`.
|
|
5
|
-
*
|
|
6
|
-
* On regtest the URL points at the system-tests fake-verifier
|
|
7
|
-
* (`system-tests/verifier/`), which serves a `ThornodeInboundAddressesSchema`-
|
|
8
|
-
* shaped response built from the swap row in Postgres.
|
|
9
|
-
*
|
|
10
|
-
* Returns `undefined` for any network without configured endpoints — the SDK
|
|
11
|
-
* fails closed rather than falling back to server-supplied URLs.
|
|
12
|
-
*/
|
|
13
1
|
export type ThorchainNetwork = 'mainnet' | 'testnet' | 'regtest';
|
|
14
2
|
export interface ThorchainVerificationEndpoints {
|
|
15
|
-
/**
|
|
16
|
-
* `GET ${inboundAddressesUrl}` returns an array of
|
|
17
|
-
* `ThornodeInboundAddress` objects (chain, address, halted, ...). This
|
|
18
|
-
* is THORNode's *primary* inbound per chain — exactly one entry per
|
|
19
|
-
* chain. On regtest the verifier echoes the swap row back as a
|
|
20
|
-
* single-vault array.
|
|
21
|
-
*/
|
|
22
3
|
readonly inboundAddressesUrl: string;
|
|
23
|
-
/**
|
|
24
|
-
* `GET ${asgardVaultsUrl}` returns every Asgard vault (not just the
|
|
25
|
-
* primary), used as a fallback when the primary check misses. During
|
|
26
|
-
* THORChain churn the primary inbound rotates ahead of the retiring
|
|
27
|
-
* vault, but the retiring vault still legitimately accepts in-flight
|
|
28
|
-
* deposits — the wider asgard list catches that case. Optional: if
|
|
29
|
-
* unset (e.g. regtest), the verifier skips the fallback.
|
|
30
|
-
*/
|
|
31
4
|
readonly asgardVaultsUrl?: string;
|
|
32
5
|
}
|
|
33
6
|
export declare const THORCHAIN_VERIFICATION_NETWORKS: Readonly<Partial<Record<ThorchainNetwork, ThorchainVerificationEndpoints>>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"thorchain-networks.d.ts","sourceRoot":"","sources":["../../src/verification/thorchain-networks.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"thorchain-networks.d.ts","sourceRoot":"","sources":["../../src/verification/thorchain-networks.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;AAEjE,MAAM,WAAW,8BAA8B;IAE7C,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IAIrC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;CACnC;AAiBD,eAAO,MAAM,+BAA+B,EAAE,QAAQ,CACpD,OAAO,CAAC,MAAM,CAAC,gBAAgB,EAAE,8BAA8B,CAAC,CAAC,CAalE,CAAC;AAEF,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,gBAAgB,GACxB,8BAA8B,GAAG,SAAS,CAE5C"}
|
|
@@ -1,21 +1,19 @@
|
|
|
1
|
-
//
|
|
2
|
-
//
|
|
3
|
-
//
|
|
1
|
+
// Hardcoded per network so the SDK never trusts a server-supplied
|
|
2
|
+
// verification.inbound_addresses_url. On regtest the URL points at the
|
|
3
|
+
// system-tests fake-verifier (system-tests/verifier/), which serves a
|
|
4
|
+
// ThornodeInboundAddressesSchema-shaped response from the swap row.
|
|
5
|
+
// Returns undefined for unconfigured networks — SDK fails closed.
|
|
6
|
+
// Distinct from chainflip's regtest port (9099) so both stacks can run
|
|
7
|
+
// side-by-side.
|
|
4
8
|
const DEFAULT_REGTEST_VERIFIER_URL = 'http://127.0.0.1:9098/thorchain/inbound_addresses';
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
// (Nine Realms `*.ninerealms.com` endpoints were retired April 2025.)
|
|
9
|
+
// Liquify is primary because *.thorchain.network HTTP-403s some IPs.
|
|
10
|
+
// Nine Realms (*.ninerealms.com) was retired April 2025.
|
|
8
11
|
const THORCHAIN_MAINNET_INBOUND_ADDRESSES = 'https://gateway.liquify.com/chain/thorchain_api/thorchain/inbound_addresses';
|
|
9
12
|
const THORCHAIN_MAINNET_ASGARD_VAULTS = 'https://gateway.liquify.com/chain/thorchain_api/thorchain/vaults/asgard';
|
|
10
|
-
//
|
|
11
|
-
//
|
|
12
|
-
//
|
|
13
|
-
//
|
|
14
|
-
// **atomic swaps only** — every other provider (thorchain, chainflip,
|
|
15
|
-
// near-intents) executes on mainnet regardless of the flag, because
|
|
16
|
-
// no usable testnet exists for them. So testnet here mirrors mainnet
|
|
17
|
-
// — verification still hits real THORNode, swaps are real-money. The
|
|
18
|
-
// UI surfaces this with the testnet banner so users aren't surprised.
|
|
13
|
+
// No usable public THORChain stagenet exists (legacy stagenet-thornode.ninerealms.com
|
|
14
|
+
// was retired April 2025, no replacement). The `testnet` flag governs
|
|
15
|
+
// atomicswap only; thorchain/chainflip/near-intents run on mainnet
|
|
16
|
+
// regardless. Testnet swaps are real-money — UI shows a banner.
|
|
19
17
|
export const THORCHAIN_VERIFICATION_NETWORKS = {
|
|
20
18
|
mainnet: {
|
|
21
19
|
inboundAddressesUrl: THORCHAIN_MAINNET_INBOUND_ADDRESSES,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"thorchain-networks.js","sourceRoot":"","sources":["../../src/verification/thorchain-networks.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"thorchain-networks.js","sourceRoot":"","sources":["../../src/verification/thorchain-networks.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,uEAAuE;AACvE,sEAAsE;AACtE,oEAAoE;AACpE,kEAAkE;AAalE,uEAAuE;AACvE,gBAAgB;AAChB,MAAM,4BAA4B,GAAG,mDAAmD,CAAC;AAEzF,qEAAqE;AACrE,yDAAyD;AACzD,MAAM,mCAAmC,GACvC,6EAA6E,CAAC;AAChF,MAAM,+BAA+B,GACnC,yEAAyE,CAAC;AAE5E,sFAAsF;AACtF,sEAAsE;AACtE,mEAAmE;AACnE,gEAAgE;AAChE,MAAM,CAAC,MAAM,+BAA+B,GAExC;IACF,OAAO,EAAE;QACP,mBAAmB,EAAE,mCAAmC;QACxD,eAAe,EAAE,+BAA+B;KACjD;IACD,OAAO,EAAE;QACP,mBAAmB,EAAE,mCAAmC;QACxD,eAAe,EAAE,+BAA+B;KACjD;IACD,OAAO,EAAE;QACP,mBAAmB,EAAE,4BAA4B;KAClD;CACF,CAAC;AAEF,MAAM,UAAU,4BAA4B,CAC1C,OAAyB;IAEzB,OAAO,+BAA+B,CAAC,OAAO,CAAC,CAAC;AAClD,CAAC"}
|
|
@@ -3,34 +3,12 @@ import type { Logger } from '../interfaces/logger.js';
|
|
|
3
3
|
import { type VerifyParams } from './shared.js';
|
|
4
4
|
import { type ThornodeInboundAddress } from '../wire/thorchain.zod.js';
|
|
5
5
|
import { type ThorchainNetwork } from './thorchain-networks.js';
|
|
6
|
-
/**
|
|
7
|
-
* Verify a THORChain deposit address against the SDK-owned inbound-addresses
|
|
8
|
-
* endpoint. The endpoint is hardcoded per network in `thorchain-networks.ts`
|
|
9
|
-
* — `v.inbound_addresses_url` from the server is intentionally ignored so a
|
|
10
|
-
* compromised server cannot redirect verification to its own infrastructure.
|
|
11
|
-
*
|
|
12
|
-
* Memo is parsed strictly (no substring matching) per AV-A.14 / AV-K.6.
|
|
13
|
-
* Vault quorum and quote cross-check live in separate helpers used by the
|
|
14
|
-
* swap-executor layer.
|
|
15
|
-
*
|
|
16
|
-
* Fails closed when the network has no configured verifier endpoints.
|
|
17
|
-
*/
|
|
18
6
|
export declare function verifyThorchain(depositAddress: string, v: ThorchainVerification, params: VerifyParams, fetchFn: typeof globalThis.fetch, network: ThorchainNetwork, resume?: boolean, externalSignal?: AbortSignal): Promise<VerificationResult>;
|
|
19
7
|
export interface FetchThorchainVaultsInput {
|
|
20
8
|
readonly fetchFn: typeof globalThis.fetch;
|
|
21
9
|
readonly timeoutMs?: number;
|
|
22
10
|
readonly logger?: Logger;
|
|
23
11
|
}
|
|
24
|
-
/**
|
|
25
|
-
* Fetch THORChain inbound addresses from THORNode and Midgard in parallel.
|
|
26
|
-
* Returns the list of vaults that appear in at least two independent sources
|
|
27
|
-
* agreeing on `(chain, address)` and are not halted / paused.
|
|
28
|
-
*
|
|
29
|
-
* @throws {VerificationError} `E_THORCHAIN_QUORUM` when fewer than 2 sources
|
|
30
|
-
* respond successfully.
|
|
31
|
-
* @throws {VerificationError} `E_THORCHAIN_VAULT_DISAGREE` when no vault is
|
|
32
|
-
* reported by at least 2 sources for the requested chain.
|
|
33
|
-
*/
|
|
34
12
|
export declare function fetchThorchainVaults(input: FetchThorchainVaultsInput): Promise<readonly ThornodeInboundAddress[]>;
|
|
35
13
|
export interface VerifyThorchainQuoteInput {
|
|
36
14
|
readonly fromAsset: string;
|
|
@@ -43,13 +21,5 @@ export interface VerifyThorchainQuoteInput {
|
|
|
43
21
|
readonly timeoutMs?: number;
|
|
44
22
|
readonly thornodeUrls?: readonly string[];
|
|
45
23
|
}
|
|
46
|
-
/**
|
|
47
|
-
* Cross-check the engine's `expectedOutput` against a live THORNode quote
|
|
48
|
-
* fetched from ≥ 2 independent sources. Rejects when the engine value falls
|
|
49
|
-
* outside the slippage band from the median of the node quotes.
|
|
50
|
-
*
|
|
51
|
-
* @throws {VerificationError} `E_THORNODE_QUOTE_UNAVAILABLE` when no source responds.
|
|
52
|
-
* @throws {VerificationError} `E_RATE_DRIFT` when the engine value is out of band.
|
|
53
|
-
*/
|
|
54
24
|
export declare function verifyThorchainQuote(input: VerifyThorchainQuoteInput): Promise<void>;
|
|
55
25
|
//# sourceMappingURL=thorchain.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"thorchain.d.ts","sourceRoot":"","sources":["../../src/verification/thorchain.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAqB,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACtG,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAmC,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAGjF,OAAO,EAEL,KAAK,sBAAsB,EAI5B,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAgC,KAAK,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"thorchain.d.ts","sourceRoot":"","sources":["../../src/verification/thorchain.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAqB,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACtG,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAmC,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAGjF,OAAO,EAEL,KAAK,sBAAsB,EAI5B,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAgC,KAAK,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAsB9F,wBAAsB,eAAe,CACnC,cAAc,EAAE,MAAM,EACtB,CAAC,EAAE,qBAAqB,EACxB,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,OAAO,UAAU,CAAC,KAAK,EAChC,OAAO,EAAE,gBAAgB,EACzB,MAAM,CAAC,EAAE,OAAO,EAChB,cAAc,CAAC,EAAE,WAAW,GAC3B,OAAO,CAAC,kBAAkB,CAAC,CAkH7B;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,OAAO,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;IAC1C,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAKD,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,yBAAyB,GAC/B,OAAO,CAAC,SAAS,sBAAsB,EAAE,CAAC,CAe5C;AA0CD,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;IAC1C,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC3C;AAMD,wBAAsB,oBAAoB,CAAC,KAAK,EAAE,yBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC,CAkC1F"}
|