@miradexio/client 0.1.0 → 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 +10 -13
- 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 -5
- 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":"output-scanner.js","sourceRoot":"","sources":["../../../src/lib/monero/output-scanner.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"output-scanner.js","sourceRoot":"","sources":["../../../src/lib/monero/output-scanner.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/monero/rpc.d.ts
CHANGED
|
@@ -1,24 +1,9 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Typed wrappers for monerod RPC endpoints.
|
|
3
|
-
*
|
|
4
|
-
* All functions use multi-node fallback: try each node in order until one succeeds.
|
|
5
|
-
* Supports both binary RPC (POST to path) and JSON-RPC (POST to /json_rpc).
|
|
6
|
-
* Works on restricted RPC port (18089/38089).
|
|
7
|
-
*/
|
|
8
1
|
import type { Logger } from '../../interfaces/logger.js';
|
|
9
2
|
export interface MonerodConfig {
|
|
10
3
|
readonly nodes: readonly string[];
|
|
11
4
|
readonly logger?: Logger;
|
|
12
5
|
}
|
|
13
|
-
/**
|
|
14
|
-
* Default public Monero mainnet RPC endpoints. Source of truth lives in
|
|
15
|
-
* `default-config.ts`; this re-export preserves the existing public name.
|
|
16
|
-
*/
|
|
17
6
|
export declare const MAINNET_NODES: readonly string[];
|
|
18
|
-
/**
|
|
19
|
-
* Default public Monero stagenet RPC endpoints. Source of truth lives in
|
|
20
|
-
* `default-config.ts`.
|
|
21
|
-
*/
|
|
22
7
|
export declare const STAGENET_NODES: readonly string[];
|
|
23
8
|
export interface MoneroTxJson {
|
|
24
9
|
readonly extra: readonly number[];
|
|
@@ -61,10 +46,6 @@ export interface FeeEstimate {
|
|
|
61
46
|
readonly feePerByte: number;
|
|
62
47
|
readonly quantizationMask: number;
|
|
63
48
|
}
|
|
64
|
-
/**
|
|
65
|
-
* Fetch a transaction by hash from monerod.
|
|
66
|
-
* Returns the full parsed tx JSON, global output indices, and metadata.
|
|
67
|
-
*/
|
|
68
49
|
export declare function fetchTransaction(config: MonerodConfig, txHash: string): Promise<FetchedTransaction>;
|
|
69
50
|
export interface MoneroQuorumConfig {
|
|
70
51
|
readonly nodes: readonly string[];
|
|
@@ -72,60 +53,15 @@ export interface MoneroQuorumConfig {
|
|
|
72
53
|
readonly timeoutMs: number;
|
|
73
54
|
readonly logger?: Logger;
|
|
74
55
|
}
|
|
75
|
-
/**
|
|
76
|
-
* Fetch a transaction from `quorum`-many independent monerod nodes in parallel
|
|
77
|
-
* and only return once at least that many nodes agree on the canonical fields
|
|
78
|
-
* (extra, vout, ecdhInfo, unlock_time). Confirmations may differ by up to ±2.
|
|
79
|
-
*
|
|
80
|
-
* @throws {VerificationError} `E_MONERO_QUORUM` when too few nodes respond.
|
|
81
|
-
* @security Closes AV-E.5 — single malicious node cannot forge a lock tx.
|
|
82
|
-
*/
|
|
83
56
|
export declare function fetchTransactionQuorum(config: MoneroQuorumConfig, lockTxHash: string): Promise<FetchedTransaction>;
|
|
84
|
-
/**
|
|
85
|
-
* Fetch output public keys and commitments by global index.
|
|
86
|
-
* Used for building the ring of decoys.
|
|
87
|
-
*/
|
|
88
57
|
export declare function fetchOutputKeys(config: MonerodConfig, globalIndices: readonly number[]): Promise<readonly OutputKeyInfo[]>;
|
|
89
|
-
/**
|
|
90
|
-
* Get the current chain height from monerod.
|
|
91
|
-
*/
|
|
92
58
|
export declare function fetchChainHeight(config: MonerodConfig): Promise<number>;
|
|
93
59
|
export interface BroadcastResult {
|
|
94
60
|
readonly txHash: string;
|
|
95
61
|
readonly status: string;
|
|
96
|
-
/** True if the tx was rejected because the key image is already spent.
|
|
97
|
-
* This means we already broadcast this tx successfully in a previous attempt. */
|
|
98
62
|
readonly alreadySpent: boolean;
|
|
99
63
|
}
|
|
100
|
-
/**
|
|
101
|
-
* Broadcast a raw signed transaction to the Monero network.
|
|
102
|
-
*
|
|
103
|
-
* If the daemon returns `double_spend`, this is treated as a prior successful
|
|
104
|
-
* broadcast (only we have the spend key, so we must have sent it before).
|
|
105
|
-
* Returns `alreadySpent: true` instead of throwing.
|
|
106
|
-
*/
|
|
107
64
|
export declare function broadcastTransaction(config: MonerodConfig, rawTxHex: string): Promise<BroadcastResult>;
|
|
108
|
-
/**
|
|
109
|
-
* Fetch the cumulative RCT output distribution per block.
|
|
110
|
-
* Used for gamma distribution decoy selection.
|
|
111
|
-
*
|
|
112
|
-
* Returns an array where `distribution[i]` is the cumulative count
|
|
113
|
-
* of RCT outputs up to and including block `i + startHeight`.
|
|
114
|
-
*/
|
|
115
|
-
/**
|
|
116
|
-
* Fetch the cumulative RCT output distribution per block.
|
|
117
|
-
* Used for gamma distribution decoy selection.
|
|
118
|
-
*
|
|
119
|
-
* Returns the full cumulative distribution: `base` is added to each entry
|
|
120
|
-
* so the array represents absolute cumulative counts from block 0.
|
|
121
|
-
*
|
|
122
|
-
* Must request with `binary: false` to get JSON-parseable data
|
|
123
|
-
* (default binary format embeds raw bytes that break JSON.parse).
|
|
124
|
-
*/
|
|
125
65
|
export declare function fetchOutputDistribution(config: MonerodConfig): Promise<readonly number[]>;
|
|
126
|
-
/**
|
|
127
|
-
* Get the current fee estimate from monerod.
|
|
128
|
-
* Returns fee per byte in piconeros.
|
|
129
|
-
*/
|
|
130
66
|
export declare function fetchFeeEstimate(config: MonerodConfig): Promise<FeeEstimate>;
|
|
131
67
|
//# sourceMappingURL=rpc.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rpc.d.ts","sourceRoot":"","sources":["../../../src/lib/monero/rpc.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"rpc.d.ts","sourceRoot":"","sources":["../../../src/lib/monero/rpc.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/monero/rpc.js
CHANGED
|
@@ -1,15 +1,11 @@
|
|
|
1
|
+
// Multi-node fallback: try each node in order until one succeeds. Supports
|
|
2
|
+
// binary RPC (POST to path) and JSON-RPC (POST /json_rpc). Works on the
|
|
3
|
+
// restricted RPC port (18089 / 38089).
|
|
1
4
|
import { noopLogger } from '../../interfaces/logger.js';
|
|
2
5
|
import { VerificationError } from '../../types/index.js';
|
|
3
6
|
import { MONERO_MAINNET_NODES, MONERO_STAGENET_NODES, } from '../default-config.js';
|
|
4
|
-
|
|
5
|
-
* Default public Monero mainnet RPC endpoints. Source of truth lives in
|
|
6
|
-
* `default-config.ts`; this re-export preserves the existing public name.
|
|
7
|
-
*/
|
|
7
|
+
// Re-exports (source of truth in default-config.ts).
|
|
8
8
|
export const MAINNET_NODES = MONERO_MAINNET_NODES;
|
|
9
|
-
/**
|
|
10
|
-
* Default public Monero stagenet RPC endpoints. Source of truth lives in
|
|
11
|
-
* `default-config.ts`.
|
|
12
|
-
*/
|
|
13
9
|
export const STAGENET_NODES = MONERO_STAGENET_NODES;
|
|
14
10
|
async function tryNodes(config, label, makeRequest) {
|
|
15
11
|
const log = config.logger ?? noopLogger;
|
|
@@ -27,10 +23,7 @@ async function tryNodes(config, label, makeRequest) {
|
|
|
27
23
|
}
|
|
28
24
|
throw new Error(`${label}: all ${String(config.nodes.length)} nodes failed. Errors: ${errors.join('; ')}`);
|
|
29
25
|
}
|
|
30
|
-
|
|
31
|
-
* Fetch a transaction by hash from monerod.
|
|
32
|
-
* Returns the full parsed tx JSON, global output indices, and metadata.
|
|
33
|
-
*/
|
|
26
|
+
// Returns the parsed tx JSON, global output indices, and metadata.
|
|
34
27
|
export async function fetchTransaction(config, txHash) {
|
|
35
28
|
return tryNodes(config, 'get_transactions', async (nodeUrl) => {
|
|
36
29
|
const response = await fetch(`${nodeUrl}/get_transactions`, {
|
|
@@ -60,14 +53,9 @@ export async function fetchTransaction(config, txHash) {
|
|
|
60
53
|
};
|
|
61
54
|
});
|
|
62
55
|
}
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
* (extra, vout, ecdhInfo, unlock_time). Confirmations may differ by up to ±2.
|
|
67
|
-
*
|
|
68
|
-
* @throws {VerificationError} `E_MONERO_QUORUM` when too few nodes respond.
|
|
69
|
-
* @security Closes AV-E.5 — single malicious node cannot forge a lock tx.
|
|
70
|
-
*/
|
|
56
|
+
// AV-E.5: parallel quorum fetch from N nodes; require >=quorum to agree on
|
|
57
|
+
// canonical fields (extra, vout, ecdhInfo, unlock_time). Confirmations may
|
|
58
|
+
// drift by +/-2. Throws E_MONERO_QUORUM if too few nodes respond.
|
|
71
59
|
export async function fetchTransactionQuorum(config, lockTxHash) {
|
|
72
60
|
const log = config.logger ?? noopLogger;
|
|
73
61
|
const attempts = config.nodes.map((url) => withTimeout(fetchTransaction({ nodes: [url], logger: log }, lockTxHash), config.timeoutMs));
|
|
@@ -121,10 +109,7 @@ async function withTimeout(promise, ms) {
|
|
|
121
109
|
promise.then((value) => { clearTimeout(timer); resolve(value); }, (err) => { clearTimeout(timer); reject(err instanceof Error ? err : new Error(String(err))); });
|
|
122
110
|
});
|
|
123
111
|
}
|
|
124
|
-
|
|
125
|
-
* Fetch output public keys and commitments by global index.
|
|
126
|
-
* Used for building the ring of decoys.
|
|
127
|
-
*/
|
|
112
|
+
// Output public keys + commitments by global index. Used to build the ring.
|
|
128
113
|
export async function fetchOutputKeys(config, globalIndices) {
|
|
129
114
|
return tryNodes(config, 'get_outs', async (nodeUrl) => {
|
|
130
115
|
const response = await fetch(`${nodeUrl}/get_outs`, {
|
|
@@ -144,9 +129,6 @@ export async function fetchOutputKeys(config, globalIndices) {
|
|
|
144
129
|
return result.outs;
|
|
145
130
|
});
|
|
146
131
|
}
|
|
147
|
-
/**
|
|
148
|
-
* Get the current chain height from monerod.
|
|
149
|
-
*/
|
|
150
132
|
export async function fetchChainHeight(config) {
|
|
151
133
|
return tryNodes(config, 'get_info', async (nodeUrl) => {
|
|
152
134
|
const response = await fetch(`${nodeUrl}/get_info`, {
|
|
@@ -162,13 +144,8 @@ export async function fetchChainHeight(config) {
|
|
|
162
144
|
return result.height;
|
|
163
145
|
});
|
|
164
146
|
}
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
*
|
|
168
|
-
* If the daemon returns `double_spend`, this is treated as a prior successful
|
|
169
|
-
* broadcast (only we have the spend key, so we must have sent it before).
|
|
170
|
-
* Returns `alreadySpent: true` instead of throwing.
|
|
171
|
-
*/
|
|
147
|
+
// double_spend is treated as a prior successful broadcast and returned as
|
|
148
|
+
// alreadySpent: true rather than thrown.
|
|
172
149
|
export async function broadcastTransaction(config, rawTxHex) {
|
|
173
150
|
return tryNodes(config, 'send_raw_transaction', async (nodeUrl) => {
|
|
174
151
|
const response = await fetch(`${nodeUrl}/send_raw_transaction`, {
|
|
@@ -182,11 +159,9 @@ export async function broadcastTransaction(config, rawTxHex) {
|
|
|
182
159
|
if (result.status === 'OK') {
|
|
183
160
|
return { txHash: result.tx_hash ?? '', status: 'OK', alreadySpent: false };
|
|
184
161
|
}
|
|
185
|
-
// Double spend means we already broadcast this tx — treat as success
|
|
186
162
|
if (result.double_spend) {
|
|
187
163
|
return { txHash: '', status: 'double_spend', alreadySpent: true };
|
|
188
164
|
}
|
|
189
|
-
// Any other rejection is a real error
|
|
190
165
|
const flags = Object.entries(result)
|
|
191
166
|
.filter(([k, v]) => k !== 'status' && k !== 'reason' && k !== 'tx_hash' && v === true)
|
|
192
167
|
.map(([k]) => k);
|
|
@@ -209,23 +184,10 @@ async function jsonRpc(nodeUrl, method, params) {
|
|
|
209
184
|
throw new Error(`JSON-RPC returned no result for ${method}`);
|
|
210
185
|
return result.result;
|
|
211
186
|
}
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
* Returns an array where `distribution[i]` is the cumulative count
|
|
217
|
-
* of RCT outputs up to and including block `i + startHeight`.
|
|
218
|
-
*/
|
|
219
|
-
/**
|
|
220
|
-
* Fetch the cumulative RCT output distribution per block.
|
|
221
|
-
* Used for gamma distribution decoy selection.
|
|
222
|
-
*
|
|
223
|
-
* Returns the full cumulative distribution: `base` is added to each entry
|
|
224
|
-
* so the array represents absolute cumulative counts from block 0.
|
|
225
|
-
*
|
|
226
|
-
* Must request with `binary: false` to get JSON-parseable data
|
|
227
|
-
* (default binary format embeds raw bytes that break JSON.parse).
|
|
228
|
-
*/
|
|
187
|
+
// Cumulative RCT output distribution per block, used by the gamma decoy
|
|
188
|
+
// picker. Returns absolute cumulative counts from block 0 (base added per
|
|
189
|
+
// entry). Must request binary:false; the default binary format embeds raw
|
|
190
|
+
// bytes that break JSON.parse.
|
|
229
191
|
export async function fetchOutputDistribution(config) {
|
|
230
192
|
return tryNodes(config, 'get_output_distribution', async (nodeUrl) => {
|
|
231
193
|
const result = await jsonRpc(nodeUrl, 'get_output_distribution', {
|
|
@@ -240,18 +202,14 @@ export async function fetchOutputDistribution(config) {
|
|
|
240
202
|
const dist = result.distributions[0];
|
|
241
203
|
if (!dist)
|
|
242
204
|
throw new Error('Empty distributions array');
|
|
243
|
-
//
|
|
244
|
-
// Add base to get absolute cumulative counts.
|
|
205
|
+
// from_height > 0 returns a base-relative distribution; add base for absolute.
|
|
245
206
|
if (dist.base > 0) {
|
|
246
207
|
return dist.distribution.map((v) => v + dist.base);
|
|
247
208
|
}
|
|
248
209
|
return dist.distribution;
|
|
249
210
|
});
|
|
250
211
|
}
|
|
251
|
-
|
|
252
|
-
* Get the current fee estimate from monerod.
|
|
253
|
-
* Returns fee per byte in piconeros.
|
|
254
|
-
*/
|
|
212
|
+
// Fee per byte in piconeros.
|
|
255
213
|
export async function fetchFeeEstimate(config) {
|
|
256
214
|
return tryNodes(config, 'get_fee_estimate', async (nodeUrl) => {
|
|
257
215
|
const result = await jsonRpc(nodeUrl, 'get_fee_estimate', { grace_blocks: 10 });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rpc.js","sourceRoot":"","sources":["../../../src/lib/monero/rpc.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"rpc.js","sourceRoot":"","sources":["../../../src/lib/monero/rpc.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,11 +8,6 @@ export interface XmrLockVerification {
|
|
|
8
8
|
readonly confirmations: number;
|
|
9
9
|
/** Reason for failure (if not verified). */
|
|
10
10
|
readonly reason?: string;
|
|
11
|
-
/**
|
|
12
|
-
* True when a failure is the user waiting for confirmations to accumulate.
|
|
13
|
-
* Callers may retry after a delay. Any other failure is terminal and must
|
|
14
|
-
* not be retried without human decision.
|
|
15
|
-
*/
|
|
16
11
|
readonly retryable?: boolean;
|
|
17
12
|
}
|
|
18
13
|
export interface VerifyXmrLockParams {
|
|
@@ -39,12 +34,5 @@ export interface VerifyXmrLockParams {
|
|
|
39
34
|
/** Logger. */
|
|
40
35
|
readonly logger?: Logger;
|
|
41
36
|
}
|
|
42
|
-
/**
|
|
43
|
-
* Verify that XMR is locked at the shared address by scanning the lock
|
|
44
|
-
* transaction from a public Monero node.
|
|
45
|
-
*
|
|
46
|
-
* Call this BEFORE submitting encsig. If this returns verified: false,
|
|
47
|
-
* DO NOT submit the encrypted signature.
|
|
48
|
-
*/
|
|
49
37
|
export declare function verifyXmrLocked(params: VerifyXmrLockParams): Promise<XmrLockVerification>;
|
|
50
38
|
//# sourceMappingURL=verify-lock.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify-lock.d.ts","sourceRoot":"","sources":["../../../src/lib/monero/verify-lock.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"verify-lock.d.ts","sourceRoot":"","sources":["../../../src/lib/monero/verify-lock.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAWzD,MAAM,WAAW,mBAAmB;IAClC,qCAAqC;IACrC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,gDAAgD;IAChD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,+BAA+B;IAC/B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,4CAA4C;IAC5C,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAGzB,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,MAAM,WAAW,mBAAmB;IAClC,6CAA6C;IAC7C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,6DAA6D;IAC7D,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,yEAAyE;IACzE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,oCAAoC;IACpC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,oDAAoD;IACpD,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,iFAAiF;IACjF,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,0EAA0E;IAC1E,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1C,0DAA0D;IAC1D,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,sDAAsD;IACtD,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,oEAAoE;IACpE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,cAAc;IACd,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAKD,wBAAsB,eAAe,CACnC,MAAM,EAAE,mBAAmB,GAC1B,OAAO,CAAC,mBAAmB,CAAC,CA4K9B"}
|
|
@@ -1,26 +1,13 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
* Fetches the lock transaction from a public Monero node and scans its
|
|
5
|
-
* outputs using the shared view key. This ensures the client doesn't
|
|
6
|
-
* submit encsig (releasing BTC) unless the XMR is actually locked.
|
|
7
|
-
*
|
|
8
|
-
* Uses @noble/ed25519 + @noble/hashes — both already in dependencies.
|
|
9
|
-
* No WASM, no heavy dependencies, no sidecar required.
|
|
10
|
-
*/
|
|
1
|
+
// Fetch the lock tx from a public monerod and scan its outputs with the
|
|
2
|
+
// shared view key. Gates submit_encsig (which releases BTC) on the XMR
|
|
3
|
+
// actually being locked. Pure @noble/ed25519 + @noble/hashes — no WASM.
|
|
11
4
|
import { Point } from '@noble/ed25519';
|
|
12
5
|
import { bytesToHex } from '@noble/hashes/utils.js';
|
|
13
6
|
import { noopLogger } from '../../interfaces/logger.js';
|
|
14
7
|
import { extractTxPubKey, hexToScalar, deriveScalar, decryptAmount, } from './output-scanner.js';
|
|
15
8
|
import { fetchTransaction, fetchTransactionQuorum, STAGENET_NODES } from './rpc.js';
|
|
16
9
|
const FAIL = { verified: false, amount: 0n, confirmations: 0 };
|
|
17
|
-
|
|
18
|
-
* Verify that XMR is locked at the shared address by scanning the lock
|
|
19
|
-
* transaction from a public Monero node.
|
|
20
|
-
*
|
|
21
|
-
* Call this BEFORE submitting encsig. If this returns verified: false,
|
|
22
|
-
* DO NOT submit the encrypted signature.
|
|
23
|
-
*/
|
|
10
|
+
// Call BEFORE submit_encsig. verified:false => do not release the encsig.
|
|
24
11
|
export async function verifyXmrLocked(params) {
|
|
25
12
|
const { lockTxHash, viewKeyHex, spendPubHex, expectedAmount, minConfirmations = 10, txKeyHex, logger: log = noopLogger, } = params;
|
|
26
13
|
const quorumNodes = params.monerodNodes;
|
|
@@ -41,8 +28,7 @@ export async function verifyXmrLocked(params) {
|
|
|
41
28
|
catch (err) {
|
|
42
29
|
const reason = `Could not fetch tx: ${err instanceof Error ? err.message : String(err)}`;
|
|
43
30
|
log.warn({ lockTxHash, reason }, 'Monerod fetch failed; marking retryable');
|
|
44
|
-
// Transient
|
|
45
|
-
// backoff rather than treat this as a hard verification failure.
|
|
31
|
+
// Transient: caller backs off and retries.
|
|
46
32
|
return { ...FAIL, reason, retryable: true };
|
|
47
33
|
}
|
|
48
34
|
if (confirmations < minConfirmations) {
|
|
@@ -54,9 +40,8 @@ export async function verifyXmrLocked(params) {
|
|
|
54
40
|
retryable: true,
|
|
55
41
|
};
|
|
56
42
|
}
|
|
57
|
-
// AV-A.5:
|
|
58
|
-
//
|
|
59
|
-
// it, so treat any non-zero value as a griefing attempt.
|
|
43
|
+
// AV-A.5: tx-level unlock_time != 0 keeps the output spend-locked past the
|
|
44
|
+
// cancel window. No legitimate swap-lock tx uses it; reject as griefing.
|
|
60
45
|
if (txJson.unlock_time !== undefined && txJson.unlock_time !== 0) {
|
|
61
46
|
return {
|
|
62
47
|
verified: false,
|
|
@@ -120,8 +105,8 @@ export async function verifyXmrLocked(params) {
|
|
|
120
105
|
const output = txJson.vout[i];
|
|
121
106
|
if (!output)
|
|
122
107
|
continue;
|
|
123
|
-
// AV-A.5: skip per-output unlock_time != 0 so a mixed lock tx
|
|
124
|
-
//
|
|
108
|
+
// AV-A.5: skip per-output unlock_time != 0 so a mixed lock tx still
|
|
109
|
+
// matches when the honest output is our target.
|
|
125
110
|
if (output.unlock_time !== undefined && output.unlock_time !== 0)
|
|
126
111
|
continue;
|
|
127
112
|
const outputKeyHex = output.target.tagged_key?.key ?? output.target.key;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify-lock.js","sourceRoot":"","sources":["../../../src/lib/monero/verify-lock.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"verify-lock.js","sourceRoot":"","sources":["../../../src/lib/monero/verify-lock.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Verify a sweep transaction's construction data before signing.
|
|
3
|
-
*
|
|
4
|
-
* Checks that:
|
|
5
|
-
* 1. The destination address matches the expected receive address
|
|
6
|
-
* 2. The amount is positive
|
|
7
|
-
* 3. The fee is reasonable (not zero, not more than 10% of amount)
|
|
8
|
-
* 4. The inputs exist and have valid ring sizes
|
|
9
|
-
*
|
|
10
|
-
* This runs in TypeScript (not WASM) so business rules like fee caps
|
|
11
|
-
* can be updated without recompiling Rust.
|
|
12
|
-
*/
|
|
13
1
|
import type { Logger } from '../../interfaces/logger.js';
|
|
14
2
|
export interface SweepConstructionData {
|
|
15
3
|
readonly inputs: readonly SweepInputData[];
|
|
@@ -46,14 +34,6 @@ export interface SweepVerificationResult {
|
|
|
46
34
|
readonly fee: string;
|
|
47
35
|
readonly reason?: string;
|
|
48
36
|
}
|
|
49
|
-
/**
|
|
50
|
-
* Verify sweep construction data before signing.
|
|
51
|
-
*
|
|
52
|
-
* @param constructionData - Full construction data from server
|
|
53
|
-
* @param expectedAddress - The client's XMR receive address
|
|
54
|
-
* @param logger - Optional structured logger
|
|
55
|
-
* @returns Verification result with amount, fee, and reason if invalid
|
|
56
|
-
*/
|
|
57
37
|
export declare function verifySweepTx(constructionData: SweepConstructionData, expectedAddress: string, logger?: Logger): SweepVerificationResult;
|
|
58
38
|
export {};
|
|
59
39
|
//# sourceMappingURL=verify-sweep.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify-sweep.d.ts","sourceRoot":"","sources":["../../../src/lib/monero/verify-sweep.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"verify-sweep.d.ts","sourceRoot":"","sources":["../../../src/lib/monero/verify-sweep.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAMzD,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,MAAM,EAAE,SAAS,cAAc,EAAE,CAAC;IAC3C,QAAQ,CAAC,WAAW,EAAE;QAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC;IACrF,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,UAAU,cAAc;IACtB,QAAQ,CAAC,YAAY,EAAE,SAAS;QAAE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC/F,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,WAAW,CAAC,EAAE;QACrB,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;QACrC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;QAC/B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;QAC9B,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;QACrC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAC1B,QAAQ,CAAC,kBAAkB,EAAE,SAAS,MAAM,EAAE,CAAC;QAC/C,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;QAC/B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;KAChC,CAAC;IACF,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;CACzC;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAgB,aAAa,CAC3B,gBAAgB,EAAE,qBAAqB,EACvC,eAAe,EAAE,MAAM,EACvB,MAAM,GAAE,MAAmB,GAC1B,uBAAuB,CAiEzB"}
|
|
@@ -1,43 +1,26 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
* 3. The fee is reasonable (not zero, not more than 10% of amount)
|
|
8
|
-
* 4. The inputs exist and have valid ring sizes
|
|
9
|
-
*
|
|
10
|
-
* This runs in TypeScript (not WASM) so business rules like fee caps
|
|
11
|
-
* can be updated without recompiling Rust.
|
|
12
|
-
*/
|
|
1
|
+
// Pre-sign sanity check for sweep construction data:
|
|
2
|
+
// 1. destination matches the expected receive address
|
|
3
|
+
// 2. amount is positive
|
|
4
|
+
// 3. fee is positive and <= 10% of amount
|
|
5
|
+
// 4. inputs exist and ring sizes match the rct_type
|
|
6
|
+
// Lives in TS (not WASM) so business rules can change without rebuilding Rust.
|
|
13
7
|
import { noopLogger } from '../../interfaces/logger.js';
|
|
14
8
|
const CLSAG_RING_SIZE = 16;
|
|
15
9
|
const PRE_CLSAG_RING_SIZE = 11;
|
|
16
|
-
/**
|
|
17
|
-
* Verify sweep construction data before signing.
|
|
18
|
-
*
|
|
19
|
-
* @param constructionData - Full construction data from server
|
|
20
|
-
* @param expectedAddress - The client's XMR receive address
|
|
21
|
-
* @param logger - Optional structured logger
|
|
22
|
-
* @returns Verification result with amount, fee, and reason if invalid
|
|
23
|
-
*/
|
|
24
10
|
export function verifySweepTx(constructionData, expectedAddress, logger = noopLogger) {
|
|
25
11
|
const amount = String(constructionData.destination.amount);
|
|
26
12
|
const fee = String(constructionData.fee);
|
|
27
|
-
// 1. Destination address must match exactly
|
|
28
13
|
if (constructionData.destination.address !== expectedAddress) {
|
|
29
14
|
const reason = `Destination mismatch: expected ${expectedAddress}, got ${constructionData.destination.address}`;
|
|
30
15
|
logger.error({ expectedAddress, got: constructionData.destination.address }, reason);
|
|
31
16
|
return { valid: false, amount, fee, reason };
|
|
32
17
|
}
|
|
33
|
-
// 2. Amount must be positive
|
|
34
18
|
const amountNum = BigInt(amount);
|
|
35
19
|
if (amountNum <= 0n) {
|
|
36
20
|
const reason = `Sweep amount must be positive, got ${amount}`;
|
|
37
21
|
logger.error({ amount }, reason);
|
|
38
22
|
return { valid: false, amount, fee, reason };
|
|
39
23
|
}
|
|
40
|
-
// 3. Fee must be positive and not exceed 10% of amount
|
|
41
24
|
const feeNum = BigInt(fee);
|
|
42
25
|
if (feeNum <= 0n) {
|
|
43
26
|
const reason = `Fee must be positive, got ${fee}`;
|
|
@@ -50,13 +33,12 @@ export function verifySweepTx(constructionData, expectedAddress, logger = noopLo
|
|
|
50
33
|
logger.warn({ fee, amount, maxFee: maxFee.toString() }, reason);
|
|
51
34
|
return { valid: false, amount, fee, reason };
|
|
52
35
|
}
|
|
53
|
-
// 4. Must have at least one input
|
|
54
36
|
if (constructionData.inputs.length === 0) {
|
|
55
37
|
const reason = 'No inputs in construction data';
|
|
56
38
|
logger.error({}, reason);
|
|
57
39
|
return { valid: false, amount, fee, reason };
|
|
58
40
|
}
|
|
59
|
-
//
|
|
41
|
+
// rct_type 6 = CLSAG+BP+; otherwise CLSAG+BP.
|
|
60
42
|
const expectedRingSize = constructionData.rct_type === 6 ? CLSAG_RING_SIZE : PRE_CLSAG_RING_SIZE;
|
|
61
43
|
for (let i = 0; i < constructionData.inputs.length; i++) {
|
|
62
44
|
const input = constructionData.inputs[i];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify-sweep.js","sourceRoot":"","sources":["../../../src/lib/monero/verify-sweep.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"verify-sweep.js","sourceRoot":"","sources":["../../../src/lib/monero/verify-sweep.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pow-solver.d.ts","sourceRoot":"","sources":["../../src/lib/pow-solver.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pow-solver.d.ts","sourceRoot":"","sources":["../../src/lib/pow-solver.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAIlE,wBAAsB,cAAc,CAClC,SAAS,EAAE,YAAY,EACvB,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,GACpD,OAAO,CAAC,UAAU,CAAC,CA0BrB;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,UAAU,GAAG,MAAM,CAE3D"}
|
package/dist/lib/pow-solver.js
CHANGED
|
@@ -1,11 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
* The server issues a SHA-256 hash-preimage challenge: given a salt and a
|
|
5
|
-
* target hash, find a number n in [0, maxnumber] such that
|
|
6
|
-
* SHA-256(salt + String(n)) === challenge. The solution is sent as a
|
|
7
|
-
* Base64-encoded JSON header on the swap creation request.
|
|
8
|
-
*/
|
|
1
|
+
// Server issues a SHA-256 preimage challenge: given salt + target hash,
|
|
2
|
+
// find n in [0, maxnumber] such that sha256(salt + String(n)) === target.
|
|
3
|
+
// Solution is sent as a base64 JSON header on the swap-create request.
|
|
9
4
|
import { sha256 } from '@noble/hashes/sha2.js';
|
|
10
5
|
import { bytesToHex } from '@noble/hashes/utils.js';
|
|
11
6
|
const BATCH_SIZE = 10_000;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pow-solver.js","sourceRoot":"","sources":["../../src/lib/pow-solver.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"pow-solver.js","sourceRoot":"","sources":["../../src/lib/pow-solver.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,0EAA0E;AAC1E,uEAAuE;AAEvE,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAIpD,MAAM,UAAU,GAAG,MAAM,CAAC;AAE1B,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,SAAuB,EACvB,UAAqD;IAErD,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,SAAS,CAAC;IAEzD,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,IAAI,SAAS,EAAE,KAAK,IAAI,UAAU,EAAE,CAAC;QAC5D,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,UAAU,EAAE,SAAS,GAAG,CAAC,CAAC,CAAC;QAExD,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;YACjC,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5E,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;gBACpB,OAAO;oBACL,SAAS,EAAE,SAAS,CAAC,SAAS;oBAC9B,SAAS,EAAE,MAAM;oBACjB,MAAM,EAAE,CAAC;oBACT,IAAI;oBACJ,SAAS,EAAE,SAAS,CAAC,SAAS;iBAC/B,CAAC;YACJ,CAAC;QACH,CAAC;QAED,UAAU,EAAE,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAE7B,sEAAsE;QACtE,MAAM,IAAI,OAAO,CAAO,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACnD,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAmB;IACjD,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;AACvC,CAAC"}
|