@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
|
@@ -15,18 +15,6 @@ export interface ScannedOutput {
|
|
|
15
15
|
/** RCT commitment blinding factor (32 bytes hex). Computed via WASM. */
|
|
16
16
|
readonly rctMask: string;
|
|
17
17
|
}
|
|
18
|
-
/**
|
|
19
|
-
* Scan a transaction's outputs to find ones belonging to the given keys.
|
|
20
|
-
*
|
|
21
|
-
* @param txJson - Parsed transaction JSON from monerod
|
|
22
|
-
* @param globalOutputIndices - Global indices for each output (from get_transactions response)
|
|
23
|
-
* @param viewKeyHex - Combined private view key (32 bytes hex)
|
|
24
|
-
* @param spendPubHex - Combined public spend key S_a + S_b (32 bytes hex)
|
|
25
|
-
* @param computeMask - Function to compute commitment mask (typically WASM compute_commitment_mask)
|
|
26
|
-
* @param decryptAmountFn - Function to decrypt RCT amount (typically WASM decrypt_amount). If not provided, uses TS fallback.
|
|
27
|
-
* @param logger - Optional structured logger
|
|
28
|
-
* @returns Array of matching outputs with all metadata
|
|
29
|
-
*/
|
|
30
18
|
export declare function scanTransactionOutputs(params: {
|
|
31
19
|
readonly txJson: MoneroTxJson;
|
|
32
20
|
readonly globalOutputIndices: readonly number[];
|
|
@@ -36,18 +24,12 @@ export declare function scanTransactionOutputs(params: {
|
|
|
36
24
|
readonly decryptAmountFn?: (viewKeyHex: string, txPubKeyHex: string, outputIndex: number, encryptedHex: string) => bigint;
|
|
37
25
|
readonly logger?: Logger;
|
|
38
26
|
}): ScannedOutput[];
|
|
39
|
-
/** Extract the tx public key R from the extra field. Tag 0x01 = 32-byte pubkey. */
|
|
40
27
|
export declare function extractTxPubKey(extra: readonly number[]): Uint8Array | null;
|
|
41
|
-
/** Decode a hex-encoded little-endian scalar reduced mod L. */
|
|
42
28
|
export declare function hexToScalar(hex: string): bigint;
|
|
43
|
-
/** Hs(D8 || varint(i)) mod L: keccak output interpreted as a little-endian scalar. */
|
|
44
29
|
export declare function deriveScalar(d8Bytes: Uint8Array, outputIndex: number): bigint;
|
|
45
|
-
/** Keccak256(D8 || varint(i)) as raw 32 bytes. */
|
|
46
30
|
export declare function deriveScalarBytes(d8Bytes: Uint8Array, outputIndex: number): Uint8Array;
|
|
47
|
-
/** Decrypt a Monero RingCT amount (Bulletproofs+ style, 8-byte XOR). */
|
|
48
31
|
export declare function decryptAmount(d8Bytes: Uint8Array, outputIndex: number, ecdhInfo: {
|
|
49
32
|
readonly amount: string;
|
|
50
33
|
} | undefined): bigint;
|
|
51
|
-
/** Encode a number as a Monero varint (unsigned LEB128). */
|
|
52
34
|
export declare function encodeVarint(value: number): Uint8Array;
|
|
53
35
|
//# sourceMappingURL=output-scanner.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"output-scanner.d.ts","sourceRoot":"","sources":["../../../src/lib/monero/output-scanner.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"output-scanner.d.ts","sourceRoot":"","sources":["../../../src/lib/monero/output-scanner.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAQzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAE7C,yEAAyE;AACzE,MAAM,WAAW,aAAa;IAC5B,4CAA4C;IAC5C,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,+CAA+C;IAC/C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,mDAAmD;IACnD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,6CAA6C;IAC7C,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,qCAAqC;IACrC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,wEAAwE;IACxE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAID,wBAAgB,sBAAsB,CAAC,MAAM,EAAE;IAC7C,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,mBAAmB,EAAE,SAAS,MAAM,EAAE,CAAC;IAChD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,MAAM,CAAC;IAC/F,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,MAAM,CAAC;IAC1H,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B,GAAG,aAAa,EAAE,CAuGlB;AAGD,wBAAgB,eAAe,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,UAAU,GAAG,IAAI,CAO3E;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE/C;AAGD,wBAAgB,YAAY,CAAC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAI7E;AAGD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,GAAG,UAAU,CAMtF;AASD,wBAAgB,aAAa,CAC3B,OAAO,EAAE,UAAU,EACnB,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,GAChD,MAAM,CAuBR;AAGD,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CAUtD"}
|
|
@@ -1,31 +1,13 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
* Given a transaction JSON (from monerod /get_transactions), the shared view key,
|
|
5
|
-
* and the combined spend public key, this module scans each output to determine
|
|
6
|
-
* if it belongs to the lock address. For matching outputs, it decrypts the amount
|
|
7
|
-
* and computes the RCT commitment mask.
|
|
8
|
-
*
|
|
9
|
-
* Reusable by both verify-xmr-lock.ts (lock verification) and monero-sweep.ts
|
|
10
|
-
* (sweep construction).
|
|
11
|
-
*/
|
|
1
|
+
// Detect owned outputs in a Monero tx given the shared view key and the
|
|
2
|
+
// combined spend pubkey. For matches, decrypt the amount and compute the
|
|
3
|
+
// RCT commitment mask. Used by verify-xmr-lock.ts and monero-sweep.ts.
|
|
12
4
|
import { Point } from '@noble/ed25519';
|
|
13
5
|
import { keccak_256 } from '@noble/hashes/sha3.js';
|
|
14
6
|
import { bytesToHex, hexToBytes } from '@noble/hashes/utils.js';
|
|
15
7
|
import { noopLogger } from '../../interfaces/logger.js';
|
|
16
8
|
import { ED25519_GROUP_ORDER, bytesToBigIntLE, hexToScalarLE, bigIntToBytes, } from '../crypto/scalars.js';
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
*
|
|
20
|
-
* @param txJson - Parsed transaction JSON from monerod
|
|
21
|
-
* @param globalOutputIndices - Global indices for each output (from get_transactions response)
|
|
22
|
-
* @param viewKeyHex - Combined private view key (32 bytes hex)
|
|
23
|
-
* @param spendPubHex - Combined public spend key S_a + S_b (32 bytes hex)
|
|
24
|
-
* @param computeMask - Function to compute commitment mask (typically WASM compute_commitment_mask)
|
|
25
|
-
* @param decryptAmountFn - Function to decrypt RCT amount (typically WASM decrypt_amount). If not provided, uses TS fallback.
|
|
26
|
-
* @param logger - Optional structured logger
|
|
27
|
-
* @returns Array of matching outputs with all metadata
|
|
28
|
-
*/
|
|
9
|
+
// computeMask / decryptAmountFn typically wrap the WASM equivalents;
|
|
10
|
+
// decryptAmountFn falls back to the local TS impl when omitted.
|
|
29
11
|
export function scanTransactionOutputs(params) {
|
|
30
12
|
const { txJson, globalOutputIndices, viewKeyHex, spendPubHex, computeMask, decryptAmountFn, logger: log = noopLogger } = params;
|
|
31
13
|
const txPubKeyR = extractTxPubKey(txJson.extra);
|
|
@@ -69,7 +51,7 @@ export function scanTransactionOutputs(params) {
|
|
|
69
51
|
const expectedKeyHex = bytesToHex(expectedKey.toBytes());
|
|
70
52
|
const isMatch = expectedKeyHex === outputKeyHex;
|
|
71
53
|
if (isMatch) {
|
|
72
|
-
//
|
|
54
|
+
// Prefer the WASM decrypt — same key derivation as mask / key images.
|
|
73
55
|
const ecdhInfo = txJson.rct_signatures.ecdhInfo[i];
|
|
74
56
|
let amount;
|
|
75
57
|
if (decryptAmountFn && ecdhInfo) {
|
|
@@ -105,7 +87,7 @@ export function scanTransactionOutputs(params) {
|
|
|
105
87
|
log.info({ scannedOutputs: txJson.vout.length, matches: results.length }, 'Output scanning complete');
|
|
106
88
|
return results;
|
|
107
89
|
}
|
|
108
|
-
|
|
90
|
+
// Tag 0x01 = 32B pubkey.
|
|
109
91
|
export function extractTxPubKey(extra) {
|
|
110
92
|
for (let i = 0; i < extra.length; i++) {
|
|
111
93
|
if (extra[i] === 0x01 && i + 32 < extra.length) {
|
|
@@ -114,17 +96,16 @@ export function extractTxPubKey(extra) {
|
|
|
114
96
|
}
|
|
115
97
|
return null;
|
|
116
98
|
}
|
|
117
|
-
/** Decode a hex-encoded little-endian scalar reduced mod L. */
|
|
118
99
|
export function hexToScalar(hex) {
|
|
119
100
|
return hexToScalarLE(hex);
|
|
120
101
|
}
|
|
121
|
-
|
|
102
|
+
// Hs(D8 || varint(i)) mod L; keccak output as little-endian scalar.
|
|
122
103
|
export function deriveScalar(d8Bytes, outputIndex) {
|
|
123
104
|
const hash = deriveScalarBytes(d8Bytes, outputIndex);
|
|
124
105
|
const raw = bytesToBigIntLE(hash);
|
|
125
106
|
return ((raw % ED25519_GROUP_ORDER) + ED25519_GROUP_ORDER) % ED25519_GROUP_ORDER;
|
|
126
107
|
}
|
|
127
|
-
|
|
108
|
+
// Raw 32B keccak256(D8 || varint(i)).
|
|
128
109
|
export function deriveScalarBytes(d8Bytes, outputIndex) {
|
|
129
110
|
const varintBuf = encodeVarint(outputIndex);
|
|
130
111
|
const preimage = new Uint8Array(d8Bytes.length + varintBuf.length);
|
|
@@ -132,18 +113,16 @@ export function deriveScalarBytes(d8Bytes, outputIndex) {
|
|
|
132
113
|
preimage.set(varintBuf, d8Bytes.length);
|
|
133
114
|
return keccak_256(preimage);
|
|
134
115
|
}
|
|
135
|
-
|
|
116
|
+
// RingCT amount decryption (Bulletproofs+ style 8-byte XOR).
|
|
117
|
+
// Matches wallet2 / Rust WASM decrypt_amount_inner:
|
|
118
|
+
// derivation_scalar = sc_reduce32(keccak256(D8 || varint(i)))
|
|
119
|
+
// amount_key = keccak256("amount" || derivation_scalar.as_bytes())
|
|
120
|
+
// The reduced scalar is serialised canonically as 32 LE bytes before the
|
|
121
|
+
// second hash. Skipping mod-L reduction silently produces garbage XOR
|
|
122
|
+
// plaintexts whenever the hash exceeds the group order.
|
|
136
123
|
export function decryptAmount(d8Bytes, outputIndex, ecdhInfo) {
|
|
137
124
|
if (!ecdhInfo)
|
|
138
125
|
return 0n;
|
|
139
|
-
// Match wallet2 / Rust WASM `decrypt_amount_inner`:
|
|
140
|
-
// derivation_scalar = sc_reduce32(keccak256(D8 || varint(i)))
|
|
141
|
-
// amount_key = keccak256("amount" || derivation_scalar.as_bytes())
|
|
142
|
-
// The reduced scalar is serialised canonically as 32 LE bytes before the
|
|
143
|
-
// second hash. Feeding the raw keccak256 output (without mod-L reduction)
|
|
144
|
-
// is wrong whenever the hash exceeds the group order, which silently
|
|
145
|
-
// produces garbage XOR plaintexts that can pass a one-sided
|
|
146
|
-
// `< expectedAmount` check downstream.
|
|
147
126
|
const rawDerivationHash = deriveScalarBytes(d8Bytes, outputIndex);
|
|
148
127
|
const derivationScalarBytes = bigIntToBytes(bytesToBigIntLE(rawDerivationHash));
|
|
149
128
|
const amountPrefix = new TextEncoder().encode('amount');
|
|
@@ -151,20 +130,18 @@ export function decryptAmount(d8Bytes, outputIndex, ecdhInfo) {
|
|
|
151
130
|
amountPreimage.set(amountPrefix);
|
|
152
131
|
amountPreimage.set(derivationScalarBytes, amountPrefix.length);
|
|
153
132
|
const amountKey = keccak_256(amountPreimage);
|
|
154
|
-
// XOR first 8 bytes
|
|
155
133
|
const encryptedAmount = hexToBytes(ecdhInfo.amount);
|
|
156
134
|
const decrypted = new Uint8Array(8);
|
|
157
135
|
for (let i = 0; i < 8; i++) {
|
|
158
136
|
decrypted[i] = (encryptedAmount[i] ?? 0) ^ (amountKey[i] ?? 0);
|
|
159
137
|
}
|
|
160
|
-
// Read as little-endian u64
|
|
161
138
|
let amount = 0n;
|
|
162
139
|
for (let i = 7; i >= 0; i--) {
|
|
163
140
|
amount = (amount << 8n) | BigInt(decrypted[i] ?? 0);
|
|
164
141
|
}
|
|
165
142
|
return amount;
|
|
166
143
|
}
|
|
167
|
-
|
|
144
|
+
// Monero varint = unsigned LEB128.
|
|
168
145
|
export function encodeVarint(value) {
|
|
169
146
|
const bytes = [];
|
|
170
147
|
let v = value;
|
|
@@ -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;
|