@openzeppelin/miden-multisig-client 0.16.1 → 0.17.0-rc.1
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 +192 -11
- package/dist/account/builder.d.ts.map +1 -1
- package/dist/account/builder.js +32 -25
- package/dist/account/builder.js.map +1 -1
- package/dist/account/builder.test.js +73 -21
- package/dist/account/builder.test.js.map +1 -1
- package/dist/account/layout.d.ts +31 -0
- package/dist/account/layout.d.ts.map +1 -0
- package/dist/account/layout.js +31 -0
- package/dist/account/layout.js.map +1 -0
- package/dist/account/masm/account-components/auth.d.ts +1 -4
- package/dist/account/masm/account-components/auth.d.ts.map +1 -1
- package/dist/account/masm/account-components/auth.js +36 -53
- package/dist/account/masm/account-components/auth.js.map +1 -1
- package/dist/account/masm/index.d.ts +0 -1
- package/dist/account/masm/index.d.ts.map +1 -1
- package/dist/account/masm/index.js +0 -1
- package/dist/account/masm/index.js.map +1 -1
- package/dist/account/storage.d.ts +4 -0
- package/dist/account/storage.d.ts.map +1 -1
- package/dist/account/storage.js +9 -20
- package/dist/account/storage.js.map +1 -1
- package/dist/client.d.ts +4 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +10 -5
- package/dist/client.js.map +1 -1
- package/dist/client.test.js +74 -16
- package/dist/client.test.js.map +1 -1
- package/dist/index.d.ts +5 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/inspector.d.ts +59 -1
- package/dist/inspector.d.ts.map +1 -1
- package/dist/inspector.js +157 -29
- package/dist/inspector.js.map +1 -1
- package/dist/inspector.test.js +246 -37
- package/dist/inspector.test.js.map +1 -1
- package/dist/multisig.d.ts +109 -33
- package/dist/multisig.d.ts.map +1 -1
- package/dist/multisig.js +307 -104
- package/dist/multisig.js.map +1 -1
- package/dist/multisig.test.js +582 -58
- package/dist/multisig.test.js.map +1 -1
- package/dist/procedures.d.ts +6 -7
- package/dist/procedures.d.ts.map +1 -1
- package/dist/procedures.js +6 -7
- package/dist/procedures.js.map +1 -1
- package/dist/proposal/metadata.d.ts.map +1 -1
- package/dist/proposal/metadata.js +13 -2
- package/dist/proposal/metadata.js.map +1 -1
- package/dist/proposal/metadata.test.js +57 -0
- package/dist/proposal/metadata.test.js.map +1 -1
- package/dist/prover/errors.d.ts +5 -0
- package/dist/prover/errors.d.ts.map +1 -1
- package/dist/prover/errors.js +7 -155
- package/dist/prover/errors.js.map +1 -1
- package/dist/prover/errors.test.js +5 -0
- package/dist/prover/errors.test.js.map +1 -1
- package/dist/prover/retry.d.ts +1 -6
- package/dist/prover/retry.d.ts.map +1 -1
- package/dist/prover/retry.js +5 -28
- package/dist/prover/retry.js.map +1 -1
- package/dist/prover/retry.test.js +1 -1
- package/dist/prover/retry.test.js.map +1 -1
- package/dist/prover/workflow.d.ts +4 -3
- package/dist/prover/workflow.d.ts.map +1 -1
- package/dist/prover/workflow.js +5 -2
- package/dist/prover/workflow.js.map +1 -1
- package/dist/prover/workflow.test.js +28 -3
- package/dist/prover/workflow.test.js.map +1 -1
- package/dist/retry/classify.d.ts +16 -0
- package/dist/retry/classify.d.ts.map +1 -0
- package/dist/retry/classify.js +187 -0
- package/dist/retry/classify.js.map +1 -0
- package/dist/retry/runtime.d.ts +13 -0
- package/dist/retry/runtime.d.ts.map +1 -0
- package/dist/retry/runtime.js +33 -0
- package/dist/retry/runtime.js.map +1 -0
- package/dist/rpc/config.d.ts +11 -0
- package/dist/rpc/config.d.ts.map +1 -0
- package/dist/rpc/config.js +17 -0
- package/dist/rpc/config.js.map +1 -0
- package/dist/rpc/config.test.d.ts +2 -0
- package/dist/rpc/config.test.d.ts.map +1 -0
- package/dist/rpc/config.test.js +24 -0
- package/dist/rpc/config.test.js.map +1 -0
- package/dist/rpc/errors.d.ts +2 -0
- package/dist/rpc/errors.d.ts.map +1 -0
- package/dist/rpc/errors.js +11 -0
- package/dist/rpc/errors.js.map +1 -0
- package/dist/rpc/errors.test.d.ts +2 -0
- package/dist/rpc/errors.test.d.ts.map +1 -0
- package/dist/rpc/errors.test.js +34 -0
- package/dist/rpc/errors.test.js.map +1 -0
- package/dist/rpc/retry.d.ts +4 -0
- package/dist/rpc/retry.d.ts.map +1 -0
- package/dist/rpc/retry.js +6 -0
- package/dist/rpc/retry.js.map +1 -0
- package/dist/rpc/retry.test.d.ts +2 -0
- package/dist/rpc/retry.test.d.ts.map +1 -0
- package/dist/rpc/retry.test.js +98 -0
- package/dist/rpc/retry.test.js.map +1 -0
- package/dist/transaction/index.d.ts +1 -1
- package/dist/transaction/index.d.ts.map +1 -1
- package/dist/transaction/index.js +1 -1
- package/dist/transaction/index.js.map +1 -1
- package/dist/transaction/p2id.d.ts +17 -6
- package/dist/transaction/p2id.d.ts.map +1 -1
- package/dist/transaction/p2id.js +22 -31
- package/dist/transaction/p2id.js.map +1 -1
- package/dist/transaction/p2id.test.js +62 -24
- package/dist/transaction/p2id.test.js.map +1 -1
- package/dist/transaction/summary.d.ts +45 -2
- package/dist/transaction/summary.d.ts.map +1 -1
- package/dist/transaction/summary.js +42 -2
- package/dist/transaction/summary.js.map +1 -1
- package/dist/transaction/summary.test.d.ts +2 -0
- package/dist/transaction/summary.test.d.ts.map +1 -0
- package/dist/transaction/summary.test.js +26 -0
- package/dist/transaction/summary.test.js.map +1 -0
- package/dist/transaction/updateGuardian.d.ts.map +1 -1
- package/dist/transaction/updateGuardian.js +16 -18
- package/dist/transaction/updateGuardian.js.map +1 -1
- package/dist/transaction/updateProcedureThreshold.d.ts.map +1 -1
- package/dist/transaction/updateProcedureThreshold.js +15 -17
- package/dist/transaction/updateProcedureThreshold.js.map +1 -1
- package/dist/transaction/updateSigners.d.ts +6 -1
- package/dist/transaction/updateSigners.d.ts.map +1 -1
- package/dist/transaction/updateSigners.js +20 -17
- package/dist/transaction/updateSigners.js.map +1 -1
- package/dist/transaction.d.ts +2 -2
- package/dist/transaction.d.ts.map +1 -1
- package/dist/transaction.js +1 -1
- package/dist/transaction.js.map +1 -1
- package/dist/types/proposal.d.ts +28 -4
- package/dist/types/proposal.d.ts.map +1 -1
- package/dist/types/proposal.js +18 -0
- package/dist/types/proposal.js.map +1 -1
- package/dist/types.d.ts +0 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/signature.d.ts +11 -7
- package/dist/utils/signature.d.ts.map +1 -1
- package/dist/utils/signature.js +24 -58
- package/dist/utils/signature.js.map +1 -1
- package/dist/utils/word.d.ts +7 -0
- package/dist/utils/word.d.ts.map +1 -1
- package/dist/utils/word.js +15 -0
- package/dist/utils/word.js.map +1 -1
- package/masm/account_components/auth/guarded_multisig.masm +42 -0
- package/package.json +7 -4
- package/src/account/builder.test.ts +111 -45
- package/src/account/builder.ts +45 -33
- package/src/account/layout.ts +33 -0
- package/src/account/masm/account-components/auth.ts +36 -56
- package/src/account/masm/index.ts +0 -1
- package/src/account/storage.ts +9 -22
- package/src/client.test.ts +87 -16
- package/src/client.ts +16 -3
- package/src/index.ts +27 -1
- package/src/inspector.test.ts +330 -38
- package/src/inspector.ts +196 -33
- package/src/multisig.test.ts +680 -63
- package/src/multisig.ts +400 -115
- package/src/procedures.ts +6 -7
- package/src/proposal/metadata.test.ts +76 -0
- package/src/proposal/metadata.ts +13 -2
- package/src/prover/errors.test.ts +8 -0
- package/src/prover/errors.ts +7 -175
- package/src/prover/retry.test.ts +1 -1
- package/src/prover/retry.ts +10 -35
- package/src/prover/workflow.test.ts +40 -4
- package/src/prover/workflow.ts +16 -4
- package/src/retry/classify.ts +220 -0
- package/src/retry/runtime.ts +45 -0
- package/src/rpc/config.test.ts +45 -0
- package/src/rpc/config.ts +30 -0
- package/src/rpc/errors.test.ts +69 -0
- package/src/rpc/errors.ts +12 -0
- package/src/rpc/retry.test.ts +144 -0
- package/src/rpc/retry.ts +12 -0
- package/src/transaction/index.ts +7 -1
- package/src/transaction/p2id.test.ts +112 -31
- package/src/transaction/p2id.ts +39 -38
- package/src/transaction/summary.test.ts +32 -0
- package/src/transaction/summary.ts +83 -4
- package/src/transaction/updateGuardian.ts +15 -25
- package/src/transaction/updateProcedureThreshold.ts +13 -29
- package/src/transaction/updateSigners.ts +38 -30
- package/src/transaction.ts +8 -1
- package/src/types/proposal.ts +43 -4
- package/src/types.ts +0 -1
- package/src/utils/signature.ts +32 -65
- package/src/utils/word.ts +17 -0
- package/dist/account/masm/auth.d.ts +0 -5
- package/dist/account/masm/auth.d.ts.map +0 -1
- package/dist/account/masm/auth.js +0 -1509
- package/dist/account/masm/auth.js.map +0 -1
- package/masm/account_components/auth/multisig.masm +0 -12
- package/masm/account_components/auth/multisig_ecdsa.masm +0 -12
- package/masm/account_components/auth/multisig_guardian.masm +0 -16
- package/masm/account_components/auth/multisig_guardian_ecdsa.masm +0 -16
- package/masm/auth/guardian.masm +0 -199
- package/masm/auth/guardian_ecdsa.masm +0 -195
- package/masm/auth/multisig.masm +0 -554
- package/masm/auth/multisig_ecdsa.masm +0 -554
- package/src/account/masm/auth.ts +0 -1512
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
import { describe, expect, it, vi } from 'vitest';
|
|
3
|
+
import { resolveRpcConfig } from './config.js';
|
|
4
|
+
import { retryRpcRead } from './retry.js';
|
|
5
|
+
import { retryDelay } from '../retry/runtime.js';
|
|
6
|
+
function fixtures() {
|
|
7
|
+
return JSON.parse(readFileSync(new URL('../../../../fixtures/miden-multisig-client/rpc-policy-fixtures.json', import.meta.url), 'utf8'));
|
|
8
|
+
}
|
|
9
|
+
function recordingRuntime() {
|
|
10
|
+
const sleeps = [];
|
|
11
|
+
return {
|
|
12
|
+
sleeps,
|
|
13
|
+
sleep: (delayMs) => {
|
|
14
|
+
sleeps.push(delayMs);
|
|
15
|
+
return Promise.resolve();
|
|
16
|
+
},
|
|
17
|
+
unitRandom: () => 0.5,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
function rateLimitError() {
|
|
21
|
+
return Object.assign(new Error('Too Many Requests!'), {
|
|
22
|
+
code: 'ResourceExhausted',
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
describe('retryRpcRead', () => {
|
|
26
|
+
it('matches every shared delay vector', () => {
|
|
27
|
+
for (const fixture of fixtures().delays) {
|
|
28
|
+
expect(retryDelay(fixture.retryIndex, fixture.unitRandom)).toBe(fixture.delayMs);
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
it('waits out rate limiting and returns the eventual result', async () => {
|
|
32
|
+
const runtime = recordingRuntime();
|
|
33
|
+
const operation = vi
|
|
34
|
+
.fn()
|
|
35
|
+
.mockRejectedValueOnce(rateLimitError())
|
|
36
|
+
.mockRejectedValueOnce(rateLimitError())
|
|
37
|
+
.mockResolvedValueOnce('synced');
|
|
38
|
+
const result = await retryRpcRead(operation, resolveRpcConfig({ retry: { maxAttempts: 3 } }), runtime);
|
|
39
|
+
expect(result).toBe('synced');
|
|
40
|
+
expect(operation).toHaveBeenCalledTimes(3);
|
|
41
|
+
expect(runtime.sleeps).toEqual([retryDelay(0, 0.5), retryDelay(1, 0.5)]);
|
|
42
|
+
});
|
|
43
|
+
it('throws a permanent error immediately without sleeping', async () => {
|
|
44
|
+
const runtime = recordingRuntime();
|
|
45
|
+
const permanent = Object.assign(new Error('malformed account id'), {
|
|
46
|
+
code: 'InvalidArgument',
|
|
47
|
+
});
|
|
48
|
+
const operation = vi.fn().mockRejectedValue(permanent);
|
|
49
|
+
await expect(retryRpcRead(operation, resolveRpcConfig({ retry: { maxAttempts: 5 } }), runtime)).rejects.toBe(permanent);
|
|
50
|
+
expect(operation).toHaveBeenCalledTimes(1);
|
|
51
|
+
expect(runtime.sleeps).toEqual([]);
|
|
52
|
+
});
|
|
53
|
+
it('rethrows the final upstream error unchanged after budget exhaustion', async () => {
|
|
54
|
+
const runtime = recordingRuntime();
|
|
55
|
+
const final = Object.assign(new Error('still rate limited'), {
|
|
56
|
+
code: 'ResourceExhausted',
|
|
57
|
+
});
|
|
58
|
+
const operation = vi
|
|
59
|
+
.fn()
|
|
60
|
+
.mockRejectedValueOnce(rateLimitError())
|
|
61
|
+
.mockRejectedValueOnce(final);
|
|
62
|
+
await expect(retryRpcRead(operation, resolveRpcConfig({ retry: { maxAttempts: 2 } }), runtime)).rejects.toBe(final);
|
|
63
|
+
expect(operation).toHaveBeenCalledTimes(2);
|
|
64
|
+
expect(runtime.sleeps).toHaveLength(1);
|
|
65
|
+
});
|
|
66
|
+
it('retries a transient read once under the default config', async () => {
|
|
67
|
+
const runtime = recordingRuntime();
|
|
68
|
+
const operation = vi
|
|
69
|
+
.fn()
|
|
70
|
+
.mockRejectedValueOnce(rateLimitError())
|
|
71
|
+
.mockResolvedValueOnce('synced');
|
|
72
|
+
await expect(retryRpcRead(operation, resolveRpcConfig(undefined), runtime)).resolves.toBe('synced');
|
|
73
|
+
expect(operation).toHaveBeenCalledTimes(2);
|
|
74
|
+
expect(runtime.sleeps).toHaveLength(1);
|
|
75
|
+
});
|
|
76
|
+
it('never retries under an explicit single-attempt config', async () => {
|
|
77
|
+
const runtime = recordingRuntime();
|
|
78
|
+
const operation = vi.fn().mockRejectedValue(rateLimitError());
|
|
79
|
+
await expect(retryRpcRead(operation, resolveRpcConfig({ retry: { maxAttempts: 1 } }), runtime)).rejects.toThrow('Too Many Requests!');
|
|
80
|
+
expect(operation).toHaveBeenCalledTimes(1);
|
|
81
|
+
expect(runtime.sleeps).toEqual([]);
|
|
82
|
+
});
|
|
83
|
+
it('completes 64 concurrent reads against a rate-limited node', async () => {
|
|
84
|
+
const runtime = recordingRuntime();
|
|
85
|
+
let rejected = 0;
|
|
86
|
+
const operation = () => {
|
|
87
|
+
if (rejected < 40) {
|
|
88
|
+
rejected += 1;
|
|
89
|
+
return Promise.reject(rateLimitError());
|
|
90
|
+
}
|
|
91
|
+
return Promise.resolve('synced');
|
|
92
|
+
};
|
|
93
|
+
const results = await Promise.all(Array.from({ length: 64 }, () => retryRpcRead(operation, resolveRpcConfig({ retry: { maxAttempts: 4 } }), runtime)));
|
|
94
|
+
expect(results).toEqual(Array.from({ length: 64 }, () => 'synced'));
|
|
95
|
+
expect(rejected).toBe(40);
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
//# sourceMappingURL=retry.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.test.js","sourceRoot":"","sources":["../../src/rpc/retry.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { executeForSummary } from './summary.js';
|
|
1
|
+
export { chainAnchorFromBase64, chainAnchorToBase64, executeForSummary, executeForSummaryAt, summarySalt, } from './summary.js';
|
|
2
2
|
export { buildUpdateSignersTransactionRequest } from './updateSigners.js';
|
|
3
3
|
export { buildUpdateProcedureThresholdTransactionRequest } from './updateProcedureThreshold.js';
|
|
4
4
|
export { buildUpdateGuardianTransactionRequest } from './updateGuardian.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/transaction/index.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/transaction/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,iBAAiB,EACjB,mBAAmB,EACnB,WAAW,GACZ,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,oCAAoC,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAAE,+CAA+C,EAAE,MAAM,+BAA+B,CAAC;AAChG,OAAO,EAAE,qCAAqC,EAAE,MAAM,qBAAqB,CAAC;AAC5E,OAAO,EAAE,mCAAmC,EAAE,MAAM,mBAAmB,CAAC;AACxE,OAAO,EAAE,2BAA2B,EAAE,MAAM,WAAW,CAAC;AACxD,YAAY,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { executeForSummary } from './summary.js';
|
|
1
|
+
export { chainAnchorFromBase64, chainAnchorToBase64, executeForSummary, executeForSummaryAt, summarySalt, } from './summary.js';
|
|
2
2
|
export { buildUpdateSignersTransactionRequest } from './updateSigners.js';
|
|
3
3
|
export { buildUpdateProcedureThresholdTransactionRequest } from './updateProcedureThreshold.js';
|
|
4
4
|
export { buildUpdateGuardianTransactionRequest } from './updateGuardian.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/transaction/index.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/transaction/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,iBAAiB,EACjB,mBAAmB,EACnB,WAAW,GACZ,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,oCAAoC,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAAE,+CAA+C,EAAE,MAAM,+BAA+B,CAAC;AAChG,OAAO,EAAE,qCAAqC,EAAE,MAAM,qBAAqB,CAAC;AAC5E,OAAO,EAAE,mCAAmC,EAAE,MAAM,mBAAmB,CAAC;AACxE,OAAO,EAAE,2BAA2B,EAAE,MAAM,WAAW,CAAC"}
|
|
@@ -1,8 +1,19 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { TransactionRequest, Word } from '@miden-sdk/miden-sdk';
|
|
2
2
|
import { Note, NoteType } from '@miden-sdk/miden-sdk';
|
|
3
3
|
import type { SignatureOptions } from './options.js';
|
|
4
4
|
import type { P2idNoteVisibility } from '../types/proposal.js';
|
|
5
|
-
|
|
5
|
+
/**
|
|
6
|
+
* P2IDE execution constraints (issue #366). Presence of either height builds
|
|
7
|
+
* a P2IDE note instead of a plain P2ID note, mirroring the Miden SDK's
|
|
8
|
+
* `reclaimAfter`/`timelockUntil` semantics on `SendOptions`.
|
|
9
|
+
*/
|
|
10
|
+
export interface P2ideHeightOptions {
|
|
11
|
+
/** Absolute block height at which the sender may reclaim the note. */
|
|
12
|
+
reclaimHeight?: number;
|
|
13
|
+
/** Absolute block height before which the note cannot be consumed. */
|
|
14
|
+
timelockHeight?: number;
|
|
15
|
+
}
|
|
16
|
+
export interface P2idTransactionOptions extends SignatureOptions, P2ideHeightOptions {
|
|
6
17
|
/** Visibility of the created note. Defaults to `NoteType.Public`. */
|
|
7
18
|
noteType?: NoteType;
|
|
8
19
|
}
|
|
@@ -22,11 +33,11 @@ export declare function deriveP2idSerialNumber(salt: Word): Word;
|
|
|
22
33
|
/**
|
|
23
34
|
* Rebuilds the P2ID note a proposal creates, from its metadata fields. The
|
|
24
35
|
* note is deterministic in the salt, so the resulting ID matches the note the
|
|
25
|
-
* proposal produces on execution
|
|
26
|
-
*
|
|
36
|
+
* proposal produces on execution. Since Miden 0.16, the asset
|
|
37
|
+
* callback flag is encoded in the faucet account ID.
|
|
27
38
|
*/
|
|
28
|
-
export declare function buildP2idNoteFromMetadata(senderId: string, recipientId: string, faucetId: string, amount: bigint,
|
|
29
|
-
export declare function buildP2idTransactionRequest(senderId: string, recipientId: string, faucetId: string, amount: bigint,
|
|
39
|
+
export declare function buildP2idNoteFromMetadata(senderId: string, recipientId: string, faucetId: string, amount: bigint, noteType: NoteType, saltHex: string, heights?: P2ideHeightOptions): Note;
|
|
40
|
+
export declare function buildP2idTransactionRequest(senderId: string, recipientId: string, faucetId: string, amount: bigint, options?: P2idTransactionOptions): {
|
|
30
41
|
request: TransactionRequest;
|
|
31
42
|
salt: Word;
|
|
32
43
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"p2id.d.ts","sourceRoot":"","sources":["../../src/transaction/p2id.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"p2id.d.ts","sourceRoot":"","sources":["../../src/transaction/p2id.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAML,IAAI,EAOJ,QAAQ,EAIT,MAAM,sBAAsB,CAAC;AAG9B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAG/D;;;;GAIG;AACH,MAAM,WAAW,kBAAkB;IACjC,sEAAsE;IACtE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,sEAAsE;IACtE,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,sBAAuB,SAAQ,gBAAgB,EAAE,kBAAkB;IAClF,qEAAqE;IACrE,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,QAAQ,CAUrE;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,QAAQ,GAAG,SAAS,GAAG,kBAAkB,GAAG,SAAS,CAErG;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAMvD;AA4CD;;;;;GAKG;AACH,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,kBAAuB,GAC/B,IAAI,CASN;AAED,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,sBAA2B,GACnC;IAAE,OAAO,EAAE,kBAAkB,CAAC;IAAC,IAAI,EAAE,IAAI,CAAA;CAAE,CA+B7C"}
|
package/dist/transaction/p2id.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { AccountId, FeltArray, FungibleAsset, MidenArrays, Note, NoteAssets, NoteMetadata, NoteRecipient, NoteScript, NoteStorage, NoteTag, NoteType, Poseidon2, TransactionRequestBuilder, Word as WordType, } from '@miden-sdk/miden-sdk';
|
|
1
|
+
import { AccountId, Felt, FeltArray, FungibleAsset, MidenArrays, Note, NoteAssets, NoteMetadata, NoteRecipient, NoteScript, NoteStorage, NoteTag, NoteType, Poseidon2, TransactionRequestBuilder, Word as WordType, } from '@miden-sdk/miden-sdk';
|
|
2
2
|
import { randomWord } from '../utils/random.js';
|
|
3
3
|
import { normalizeHexWord } from '../utils/encoding.js';
|
|
4
|
+
import { parseP2ideHeight } from '../types/proposal.js';
|
|
4
5
|
/**
|
|
5
6
|
* Parses the metadata wire value for a P2ID note visibility (issue #322).
|
|
6
7
|
* Absent => public, the only behavior before the field existed. An unknown
|
|
@@ -32,33 +33,23 @@ export function deriveP2idSerialNumber(salt) {
|
|
|
32
33
|
...zeroWord.toFelts(),
|
|
33
34
|
]));
|
|
34
35
|
}
|
|
35
|
-
|
|
36
|
-
* Builds the fungible asset to transfer, sourcing the callback flag from the held asset.
|
|
37
|
-
*
|
|
38
|
-
* In Miden 0.15 the callback flag is part of the vault key, so rebuilding the asset from
|
|
39
|
-
* `faucet`/`amount` with the default flag would not match the held asset and the transfer
|
|
40
|
-
* would abort. When the faucet is absent the default flag is used, surfacing the
|
|
41
|
-
* missing-asset error during execution.
|
|
42
|
-
*/
|
|
43
|
-
function resolveFungibleAssetFromVault(account, faucet, amount) {
|
|
44
|
-
const faucetHex = faucet.toString();
|
|
45
|
-
const assetFromVault = account
|
|
46
|
-
.vault()
|
|
47
|
-
.fungibleAssets()
|
|
48
|
-
.find(asset => asset.faucetId().toString() === faucetHex);
|
|
49
|
-
if (!assetFromVault) {
|
|
50
|
-
return new FungibleAsset(faucet, amount);
|
|
51
|
-
}
|
|
52
|
-
return FungibleAsset.fromVaultKey(assetFromVault.vaultKey(), amount);
|
|
53
|
-
}
|
|
54
|
-
function buildP2idNote(sender, recipient, noteAssets, noteType, saltHex) {
|
|
36
|
+
function buildP2idNote(sender, recipient, noteAssets, noteType, saltHex, heights = {}) {
|
|
55
37
|
const salt = WordType.fromHex(normalizeHexWord(saltHex));
|
|
56
38
|
const serialNum = deriveP2idSerialNumber(salt);
|
|
57
|
-
const
|
|
58
|
-
const
|
|
39
|
+
const reclaimHeight = parseP2ideHeight('reclaimHeight', heights.reclaimHeight);
|
|
40
|
+
const timelockHeight = parseP2ideHeight('timelockHeight', heights.timelockHeight);
|
|
41
|
+
const isP2ide = reclaimHeight !== undefined || timelockHeight !== undefined;
|
|
42
|
+
// P2IDE storage layout (miden-standards `P2ideNoteStorage`): the P2ID
|
|
43
|
+
// storage plus reclaim/timelock heights as felts, 0 encoding "unset".
|
|
44
|
+
const noteScript = isP2ide ? NoteScript.p2ide() : NoteScript.p2id();
|
|
45
|
+
const storageFelts = [
|
|
59
46
|
recipient.suffix(),
|
|
60
47
|
recipient.prefix(),
|
|
61
|
-
]
|
|
48
|
+
];
|
|
49
|
+
if (isP2ide) {
|
|
50
|
+
storageFelts.push(new Felt(BigInt(reclaimHeight ?? 0)), new Felt(BigInt(timelockHeight ?? 0)));
|
|
51
|
+
}
|
|
52
|
+
const noteStorage = new NoteStorage(new FeltArray(storageFelts));
|
|
62
53
|
const noteRecipient = new NoteRecipient(serialNum, noteScript, noteStorage);
|
|
63
54
|
const noteTag = NoteTag.withAccountTarget(recipient);
|
|
64
55
|
const noteMetadata = new NoteMetadata(sender, noteType, noteTag);
|
|
@@ -67,20 +58,20 @@ function buildP2idNote(sender, recipient, noteAssets, noteType, saltHex) {
|
|
|
67
58
|
/**
|
|
68
59
|
* Rebuilds the P2ID note a proposal creates, from its metadata fields. The
|
|
69
60
|
* note is deterministic in the salt, so the resulting ID matches the note the
|
|
70
|
-
* proposal produces on execution
|
|
71
|
-
*
|
|
61
|
+
* proposal produces on execution. Since Miden 0.16, the asset
|
|
62
|
+
* callback flag is encoded in the faucet account ID.
|
|
72
63
|
*/
|
|
73
|
-
export function buildP2idNoteFromMetadata(senderId, recipientId, faucetId, amount,
|
|
64
|
+
export function buildP2idNoteFromMetadata(senderId, recipientId, faucetId, amount, noteType, saltHex, heights = {}) {
|
|
74
65
|
const sender = AccountId.fromHex(senderId);
|
|
75
66
|
const recipient = AccountId.fromHex(recipientId);
|
|
76
67
|
const faucet = AccountId.fromHex(faucetId);
|
|
77
|
-
const asset =
|
|
68
|
+
const asset = new FungibleAsset(faucet, amount);
|
|
78
69
|
const noteAssets = new NoteAssets([asset]);
|
|
79
|
-
return buildP2idNote(sender, recipient, noteAssets, noteType, saltHex);
|
|
70
|
+
return buildP2idNote(sender, recipient, noteAssets, noteType, saltHex, heights);
|
|
80
71
|
}
|
|
81
|
-
export function buildP2idTransactionRequest(senderId, recipientId, faucetId, amount,
|
|
72
|
+
export function buildP2idTransactionRequest(senderId, recipientId, faucetId, amount, options = {}) {
|
|
82
73
|
const authSaltHex = options.salt ? options.salt.toHex() : randomWord().toHex();
|
|
83
|
-
const note = buildP2idNoteFromMetadata(senderId, recipientId, faucetId, amount,
|
|
74
|
+
const note = buildP2idNoteFromMetadata(senderId, recipientId, faucetId, amount, options.noteType ?? NoteType.Public, authSaltHex, { reclaimHeight: options.reclaimHeight, timelockHeight: options.timelockHeight });
|
|
84
75
|
const outputNotes = new MidenArrays.NoteArray([note]);
|
|
85
76
|
const authSaltForBuilder = WordType.fromHex(normalizeHexWord(authSaltHex));
|
|
86
77
|
let txBuilder = new TransactionRequestBuilder();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"p2id.js","sourceRoot":"","sources":["../../src/transaction/p2id.ts"],"names":[],"mappings":"AACA,OAAO,EACL,SAAS,EACT,SAAS,EACT,aAAa,EACb,WAAW,EACX,IAAI,EACJ,UAAU,EACV,YAAY,EACZ,aAAa,EACb,UAAU,EACV,WAAW,EACX,OAAO,EACP,QAAQ,EACR,SAAS,EACT,yBAAyB,EACzB,IAAI,IAAI,QAAQ,GACjB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"p2id.js","sourceRoot":"","sources":["../../src/transaction/p2id.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
|
2
|
-
const {
|
|
2
|
+
const { mockFungibleAssetConstructor, mockHashElements, mockNormalizeHexWord, mockRandomWord, mockWordFromHex, noteMetadataCalls, noteRecipientCalls, noteStorageCalls, saltFelts, } = vi.hoisted(() => {
|
|
3
3
|
const saltFelts = [
|
|
4
4
|
{ id: 'felt-0' },
|
|
5
5
|
{ id: 'felt-1' },
|
|
@@ -7,13 +7,10 @@ const { mockFromVaultKey, mockFungibleAssetConstructor, mockHashElements, mockNo
|
|
|
7
7
|
{ id: 'felt-3' },
|
|
8
8
|
];
|
|
9
9
|
return {
|
|
10
|
-
mockFromVaultKey: vi.fn((vaultKey, amount) => ({
|
|
11
|
-
kind: 'asset-from-vault-key',
|
|
12
|
-
vaultKey,
|
|
13
|
-
amount,
|
|
14
|
-
})),
|
|
15
10
|
mockFungibleAssetConstructor: vi.fn(),
|
|
16
11
|
noteMetadataCalls: [],
|
|
12
|
+
noteRecipientCalls: [],
|
|
13
|
+
noteStorageCalls: [],
|
|
17
14
|
mockHashElements: vi.fn().mockReturnValue({ toString: () => 'serial' }),
|
|
18
15
|
mockNormalizeHexWord: vi.fn((hex) => hex),
|
|
19
16
|
mockRandomWord: vi.fn().mockReturnValue({
|
|
@@ -53,7 +50,9 @@ vi.mock('@miden-sdk/miden-sdk', () => {
|
|
|
53
50
|
constructor(_assets) { }
|
|
54
51
|
}
|
|
55
52
|
class NoteStorage {
|
|
56
|
-
constructor(
|
|
53
|
+
constructor(inputs) {
|
|
54
|
+
noteStorageCalls.push([inputs]);
|
|
55
|
+
}
|
|
57
56
|
}
|
|
58
57
|
class NoteMetadata {
|
|
59
58
|
constructor(sender, noteType, noteTag) {
|
|
@@ -61,7 +60,9 @@ vi.mock('@miden-sdk/miden-sdk', () => {
|
|
|
61
60
|
}
|
|
62
61
|
}
|
|
63
62
|
class NoteRecipient {
|
|
64
|
-
constructor(
|
|
63
|
+
constructor(serialNum, noteScript, noteInputs) {
|
|
64
|
+
noteRecipientCalls.push([serialNum, noteScript, noteInputs]);
|
|
65
|
+
}
|
|
65
66
|
}
|
|
66
67
|
class Note {
|
|
67
68
|
constructor(_assets, _metadata, _recipient) { }
|
|
@@ -70,7 +71,6 @@ vi.mock('@miden-sdk/miden-sdk', () => {
|
|
|
70
71
|
constructor(faucet, amount) {
|
|
71
72
|
mockFungibleAssetConstructor(faucet, amount);
|
|
72
73
|
}
|
|
73
|
-
static fromVaultKey = mockFromVaultKey;
|
|
74
74
|
}
|
|
75
75
|
class NoteArray {
|
|
76
76
|
constructor(_notes) { }
|
|
@@ -111,6 +111,7 @@ vi.mock('@miden-sdk/miden-sdk', () => {
|
|
|
111
111
|
NoteStorage,
|
|
112
112
|
NoteScript: {
|
|
113
113
|
p2id: vi.fn(() => ({ kind: 'p2id-script' })),
|
|
114
|
+
p2ide: vi.fn(() => ({ kind: 'p2ide-script' })),
|
|
114
115
|
},
|
|
115
116
|
NoteTag: {
|
|
116
117
|
withAccountTarget: vi.fn(() => ({ kind: 'tag' })),
|
|
@@ -138,31 +139,22 @@ vi.mock('../utils/random.js', () => ({
|
|
|
138
139
|
randomWord: mockRandomWord,
|
|
139
140
|
}));
|
|
140
141
|
import { buildP2idTransactionRequest, parseP2idNoteType, p2idNoteTypeToMetadata } from './p2id.js';
|
|
141
|
-
const FAUCET_ID = '0x7bfb0f38b0fafa103f86a805594171';
|
|
142
|
-
const mockAccount = {
|
|
143
|
-
vault: () => ({
|
|
144
|
-
fungibleAssets: () => [
|
|
145
|
-
{
|
|
146
|
-
faucetId: () => ({ toString: () => FAUCET_ID }),
|
|
147
|
-
vaultKey: () => ({ kind: 'vault-key' }),
|
|
148
|
-
},
|
|
149
|
-
],
|
|
150
|
-
}),
|
|
151
|
-
};
|
|
152
142
|
import { NoteType } from '@miden-sdk/miden-sdk';
|
|
143
|
+
const FAUCET_ID = '0x7bfb0f38b0fafa103f86a805594171';
|
|
153
144
|
describe('buildP2idTransactionRequest', () => {
|
|
154
145
|
beforeEach(() => {
|
|
155
|
-
mockFromVaultKey.mockClear();
|
|
156
146
|
mockFungibleAssetConstructor.mockClear();
|
|
157
147
|
mockHashElements.mockClear();
|
|
158
148
|
mockNormalizeHexWord.mockClear();
|
|
159
149
|
mockRandomWord.mockClear();
|
|
160
150
|
mockWordFromHex.mockClear();
|
|
161
151
|
noteMetadataCalls.length = 0;
|
|
152
|
+
noteRecipientCalls.length = 0;
|
|
153
|
+
noteStorageCalls.length = 0;
|
|
162
154
|
});
|
|
163
155
|
it('derives serial number from salt felts plus four zero felts', () => {
|
|
164
156
|
const salt = { toHex: () => '0x' + '11'.repeat(32) };
|
|
165
|
-
buildP2idTransactionRequest('0x7bfb0f38b0fafa103f86a805594170', '0x8a65fc5a39e4cd106d648e3eb4ab5f', FAUCET_ID, 10n,
|
|
157
|
+
buildP2idTransactionRequest('0x7bfb0f38b0fafa103f86a805594170', '0x8a65fc5a39e4cd106d648e3eb4ab5f', FAUCET_ID, 10n, { salt });
|
|
166
158
|
expect(mockRandomWord).not.toHaveBeenCalled();
|
|
167
159
|
expect(mockHashElements).toHaveBeenCalledTimes(1);
|
|
168
160
|
const [feltArrayArg] = mockHashElements.mock.calls[0];
|
|
@@ -174,15 +166,61 @@ describe('buildP2idTransactionRequest', () => {
|
|
|
174
166
|
}
|
|
175
167
|
});
|
|
176
168
|
it('creates a public note by default (issue #322)', () => {
|
|
177
|
-
buildP2idTransactionRequest('0x7bfb0f38b0fafa103f86a805594170', '0x8a65fc5a39e4cd106d648e3eb4ab5f',
|
|
169
|
+
buildP2idTransactionRequest('0x7bfb0f38b0fafa103f86a805594170', '0x8a65fc5a39e4cd106d648e3eb4ab5f', FAUCET_ID, 10n);
|
|
178
170
|
expect(noteMetadataCalls).toHaveLength(1);
|
|
179
171
|
expect(noteMetadataCalls[0][1]).toBe(NoteType.Public);
|
|
180
172
|
});
|
|
173
|
+
it('builds the asset from the faucet id, whose callback flag it carries since Miden 0.16', () => {
|
|
174
|
+
buildP2idTransactionRequest('0x7bfb0f38b0fafa103f86a805594170', '0x8a65fc5a39e4cd106d648e3eb4ab5f', FAUCET_ID, 10n);
|
|
175
|
+
expect(mockFungibleAssetConstructor).toHaveBeenCalledTimes(1);
|
|
176
|
+
const [faucet, amount] = mockFungibleAssetConstructor.mock.calls[0];
|
|
177
|
+
expect(faucet.hex).toBe(FAUCET_ID);
|
|
178
|
+
expect(amount).toBe(10n);
|
|
179
|
+
});
|
|
181
180
|
it('threads the requested noteType into the note metadata (issue #322)', () => {
|
|
182
|
-
buildP2idTransactionRequest('0x7bfb0f38b0fafa103f86a805594170', '0x8a65fc5a39e4cd106d648e3eb4ab5f', '0x7bfb0f38b0fafa103f86a805594171', 10n,
|
|
181
|
+
buildP2idTransactionRequest('0x7bfb0f38b0fafa103f86a805594170', '0x8a65fc5a39e4cd106d648e3eb4ab5f', '0x7bfb0f38b0fafa103f86a805594171', 10n, { noteType: NoteType.Private });
|
|
183
182
|
expect(noteMetadataCalls).toHaveLength(1);
|
|
184
183
|
expect(noteMetadataCalls[0][1]).toBe(NoteType.Private);
|
|
185
184
|
});
|
|
185
|
+
it('builds a plain P2ID note without heights: p2id script, 2 storage items', () => {
|
|
186
|
+
buildP2idTransactionRequest('0x7bfb0f38b0fafa103f86a805594170', '0x8a65fc5a39e4cd106d648e3eb4ab5f', FAUCET_ID, 10n);
|
|
187
|
+
expect(noteRecipientCalls).toHaveLength(1);
|
|
188
|
+
expect(noteRecipientCalls[0][1]).toEqual({ kind: 'p2id-script' });
|
|
189
|
+
const [storageInputs] = noteStorageCalls[0];
|
|
190
|
+
expect(storageInputs.values).toEqual([2, 1]);
|
|
191
|
+
});
|
|
192
|
+
it('builds a P2IDE note when reclaimHeight is set (issue #366)', () => {
|
|
193
|
+
buildP2idTransactionRequest('0x7bfb0f38b0fafa103f86a805594170', '0x8a65fc5a39e4cd106d648e3eb4ab5f', FAUCET_ID, 10n, { reclaimHeight: 12345 });
|
|
194
|
+
expect(noteRecipientCalls).toHaveLength(1);
|
|
195
|
+
expect(noteRecipientCalls[0][1]).toEqual({ kind: 'p2ide-script' });
|
|
196
|
+
// P2IDE storage layout: [suffix, prefix, reclaim, timelock], 0 = unset.
|
|
197
|
+
const [storageInputs] = noteStorageCalls[0];
|
|
198
|
+
expect(storageInputs.values).toHaveLength(4);
|
|
199
|
+
expect(storageInputs.values.slice(0, 2)).toEqual([2, 1]);
|
|
200
|
+
expect(storageInputs.values[2].value).toBe(12345n);
|
|
201
|
+
expect(storageInputs.values[3].value).toBe(0n);
|
|
202
|
+
});
|
|
203
|
+
it('builds a P2IDE note when only timelockHeight is set (issue #366)', () => {
|
|
204
|
+
buildP2idTransactionRequest('0x7bfb0f38b0fafa103f86a805594170', '0x8a65fc5a39e4cd106d648e3eb4ab5f', FAUCET_ID, 10n, { timelockHeight: 777 });
|
|
205
|
+
expect(noteRecipientCalls[0][1]).toEqual({ kind: 'p2ide-script' });
|
|
206
|
+
const [storageInputs] = noteStorageCalls[0];
|
|
207
|
+
expect(storageInputs.values[2].value).toBe(0n);
|
|
208
|
+
expect(storageInputs.values[3].value).toBe(777n);
|
|
209
|
+
});
|
|
210
|
+
it('carries both heights into the P2IDE storage (issue #366)', () => {
|
|
211
|
+
buildP2idTransactionRequest('0x7bfb0f38b0fafa103f86a805594170', '0x8a65fc5a39e4cd106d648e3eb4ab5f', FAUCET_ID, 10n, { reclaimHeight: 500, timelockHeight: 400 });
|
|
212
|
+
const [storageInputs] = noteStorageCalls[0];
|
|
213
|
+
expect(storageInputs.values[2].value).toBe(500n);
|
|
214
|
+
expect(storageInputs.values[3].value).toBe(400n);
|
|
215
|
+
});
|
|
216
|
+
it.each([
|
|
217
|
+
['zero', 0],
|
|
218
|
+
['negative', -5],
|
|
219
|
+
['fractional', 1.5],
|
|
220
|
+
['above u32::MAX', 0x1_0000_0000],
|
|
221
|
+
])('rejects a %s height instead of building a divergent note (issue #366)', (_label, height) => {
|
|
222
|
+
expect(() => buildP2idTransactionRequest('0x7bfb0f38b0fafa103f86a805594170', '0x8a65fc5a39e4cd106d648e3eb4ab5f', FAUCET_ID, 10n, { reclaimHeight: height })).toThrow(/unsupported reclaimHeight/);
|
|
223
|
+
});
|
|
186
224
|
});
|
|
187
225
|
describe('parseP2idNoteType', () => {
|
|
188
226
|
it('maps absent to Public (pre-#322 proposals)', () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"p2id.test.js","sourceRoot":"","sources":["../../src/transaction/p2id.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAG9D,MAAM,EACJ,
|
|
1
|
+
{"version":3,"file":"p2id.test.js","sourceRoot":"","sources":["../../src/transaction/p2id.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,47 @@
|
|
|
1
1
|
import type { MidenClient, TransactionRequest, TransactionSummary, WasmWebClient } from '@miden-sdk/miden-sdk';
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
import { ChainAnchor, Word } from '@miden-sdk/miden-sdk';
|
|
3
|
+
/**
|
|
4
|
+
* Captures a `ChainAnchor` for the request at the current sync height and
|
|
5
|
+
* executes the transaction against it to obtain the summary awaiting
|
|
6
|
+
* authorization. The anchor is returned alongside the summary so the proposer
|
|
7
|
+
* can ship it with the signed data; cosigners and the executor then reproduce
|
|
8
|
+
* the summary — which binds the reference block commitment since protocol
|
|
9
|
+
* 0.16 — with {@link executeForSummaryAt} regardless of their own sync height.
|
|
10
|
+
*/
|
|
11
|
+
export declare function executeForSummary(client: MidenClient, accountId: string, txRequest: TransactionRequest, midenRpcEndpoint: string): Promise<{
|
|
12
|
+
summary: TransactionSummary;
|
|
13
|
+
anchor: ChainAnchor;
|
|
14
|
+
}>;
|
|
15
|
+
export declare function executeForSummary(client: WasmWebClient, accountId: string, txRequest: TransactionRequest, midenRpcEndpoint?: string): Promise<{
|
|
16
|
+
summary: TransactionSummary;
|
|
17
|
+
anchor: ChainAnchor;
|
|
18
|
+
}>;
|
|
19
|
+
/**
|
|
20
|
+
* Executes a transaction at the given `ChainAnchor`'s reference block to
|
|
21
|
+
* obtain the summary awaiting authorization — the anchored counterpart of
|
|
22
|
+
* {@link executeForSummary} for cosigners and executors holding a proposal's
|
|
23
|
+
* anchor.
|
|
24
|
+
*/
|
|
25
|
+
export declare function executeForSummaryAt(client: MidenClient, accountId: string, txRequest: TransactionRequest, anchor: ChainAnchor, midenRpcEndpoint: string): Promise<TransactionSummary>;
|
|
26
|
+
export declare function executeForSummaryAt(client: WasmWebClient, accountId: string, txRequest: TransactionRequest, anchor: ChainAnchor, midenRpcEndpoint?: string): Promise<TransactionSummary>;
|
|
27
|
+
/**
|
|
28
|
+
* Serializes a `ChainAnchor` to base64 for the proposal wire payload.
|
|
29
|
+
*/
|
|
30
|
+
export declare function chainAnchorToBase64(anchor: ChainAnchor): string;
|
|
31
|
+
/**
|
|
32
|
+
* Deserializes a `ChainAnchor` from its base64 wire form. `ChainAnchor`
|
|
33
|
+
* deserialization validates the header/chain consistency internally, so a
|
|
34
|
+
* decoded anchor only needs its block commitment checked against the signed
|
|
35
|
+
* transaction summary before it is safe to execute against.
|
|
36
|
+
*/
|
|
37
|
+
export declare function chainAnchorFromBase64(anchorBase64: string): ChainAnchor;
|
|
38
|
+
/**
|
|
39
|
+
* Reads the auth-arg salt back out of a transaction summary.
|
|
40
|
+
*
|
|
41
|
+
* Since miden-protocol 0.16-rc the summary binds seven user-defined elements
|
|
42
|
+
* instead of a dedicated salt word. The guarded-multisig auth component zeroes
|
|
43
|
+
* the leading three and passes the auth args as the trailing four, so the salt
|
|
44
|
+
* is the tail of `userParams()`.
|
|
45
|
+
*/
|
|
46
|
+
export declare function summarySalt(summary: TransactionSummary): Word;
|
|
4
47
|
//# sourceMappingURL=summary.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"summary.d.ts","sourceRoot":"","sources":["../../src/transaction/summary.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,kBAAkB,EAClB,kBAAkB,EAClB,aAAa,EACd,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"summary.d.ts","sourceRoot":"","sources":["../../src/transaction/summary.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,kBAAkB,EAClB,kBAAkB,EAClB,aAAa,EACd,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAa,WAAW,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAWpE;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,WAAW,EACnB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,kBAAkB,EAC7B,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC;IAAE,OAAO,EAAE,kBAAkB,CAAC;IAAC,MAAM,EAAE,WAAW,CAAA;CAAE,CAAC,CAAC;AACjE,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,aAAa,EACrB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,kBAAkB,EAC7B,gBAAgB,CAAC,EAAE,MAAM,GACxB,OAAO,CAAC;IAAE,OAAO,EAAE,kBAAkB,CAAC;IAAC,MAAM,EAAE,WAAW,CAAA;CAAE,CAAC,CAAC;AAcjE;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,WAAW,EACnB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,kBAAkB,EAC7B,MAAM,EAAE,WAAW,EACnB,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,kBAAkB,CAAC,CAAC;AAC/B,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,aAAa,EACrB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,kBAAkB,EAC7B,MAAM,EAAE,WAAW,EACnB,gBAAgB,CAAC,EAAE,MAAM,GACxB,OAAO,CAAC,kBAAkB,CAAC,CAAC;AAa/B;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAE/D;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,MAAM,GAAG,WAAW,CAEvE;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,IAAI,CAE7D"}
|
|
@@ -1,8 +1,48 @@
|
|
|
1
|
-
import { AccountId } from '@miden-sdk/miden-sdk';
|
|
1
|
+
import { AccountId, ChainAnchor, Word } from '@miden-sdk/miden-sdk';
|
|
2
2
|
import { getRawMidenClient } from '../raw-client.js';
|
|
3
|
+
import { base64ToUint8Array, uint8ArrayToBase64 } from '../utils/encoding.js';
|
|
4
|
+
/**
|
|
5
|
+
* Index of the first user param carrying the auth-arg salt. The guarded-multisig
|
|
6
|
+
* auth component zeroes user params 0-2 and fills 3-6 with the auth args, matching
|
|
7
|
+
* `push.0.0.0` ahead of `multisig::auth_tx` in `guarded_multisig.masm`.
|
|
8
|
+
*/
|
|
9
|
+
const SALT_USER_PARAM_OFFSET = 3;
|
|
3
10
|
export async function executeForSummary(client, accountId, txRequest, midenRpcEndpoint) {
|
|
4
11
|
const acc = AccountId.fromHex(accountId);
|
|
5
12
|
const rawClient = await getRawMidenClient(client, midenRpcEndpoint);
|
|
6
|
-
|
|
13
|
+
const anchor = await rawClient.chainAnchorForRequest(txRequest);
|
|
14
|
+
const summary = await rawClient.executeForSummaryAt(acc, txRequest, anchor);
|
|
15
|
+
return { summary, anchor };
|
|
16
|
+
}
|
|
17
|
+
export async function executeForSummaryAt(client, accountId, txRequest, anchor, midenRpcEndpoint) {
|
|
18
|
+
const acc = AccountId.fromHex(accountId);
|
|
19
|
+
const rawClient = await getRawMidenClient(client, midenRpcEndpoint);
|
|
20
|
+
return rawClient.executeForSummaryAt(acc, txRequest, anchor);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Serializes a `ChainAnchor` to base64 for the proposal wire payload.
|
|
24
|
+
*/
|
|
25
|
+
export function chainAnchorToBase64(anchor) {
|
|
26
|
+
return uint8ArrayToBase64(anchor.serialize());
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Deserializes a `ChainAnchor` from its base64 wire form. `ChainAnchor`
|
|
30
|
+
* deserialization validates the header/chain consistency internally, so a
|
|
31
|
+
* decoded anchor only needs its block commitment checked against the signed
|
|
32
|
+
* transaction summary before it is safe to execute against.
|
|
33
|
+
*/
|
|
34
|
+
export function chainAnchorFromBase64(anchorBase64) {
|
|
35
|
+
return ChainAnchor.deserialize(base64ToUint8Array(anchorBase64));
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Reads the auth-arg salt back out of a transaction summary.
|
|
39
|
+
*
|
|
40
|
+
* Since miden-protocol 0.16-rc the summary binds seven user-defined elements
|
|
41
|
+
* instead of a dedicated salt word. The guarded-multisig auth component zeroes
|
|
42
|
+
* the leading three and passes the auth args as the trailing four, so the salt
|
|
43
|
+
* is the tail of `userParams()`.
|
|
44
|
+
*/
|
|
45
|
+
export function summarySalt(summary) {
|
|
46
|
+
return Word.newFromFelts(summary.userParams().slice(SALT_USER_PARAM_OFFSET));
|
|
7
47
|
}
|
|
8
48
|
//# sourceMappingURL=summary.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"summary.js","sourceRoot":"","sources":["../../src/transaction/summary.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"summary.js","sourceRoot":"","sources":["../../src/transaction/summary.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE9E;;;;GAIG;AACH,MAAM,sBAAsB,GAAG,CAAC,CAAC;AAsBjC,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,MAAmC,EACnC,SAAiB,EACjB,SAA6B,EAC7B,gBAAyB;IAEzB,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACzC,MAAM,SAAS,GAAG,MAAM,iBAAiB,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IACpE,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC;IAChE,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,mBAAmB,CAAC,GAAG,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;IAC5E,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;AAC7B,CAAC;AAsBD,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,MAAmC,EACnC,SAAiB,EACjB,SAA6B,EAC7B,MAAmB,EACnB,gBAAyB;IAEzB,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACzC,MAAM,SAAS,GAAG,MAAM,iBAAiB,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IACpE,OAAO,SAAS,CAAC,mBAAmB,CAAC,GAAG,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;AAC/D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAmB;IACrD,OAAO,kBAAkB,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;AAChD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,YAAoB;IACxD,OAAO,WAAW,CAAC,WAAW,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC,CAAC;AACnE,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,WAAW,CAAC,OAA2B;IACrD,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC,CAAC;AAC/E,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"summary.test.d.ts","sourceRoot":"","sources":["../../src/transaction/summary.test.ts"],"names":[],"mappings":""}
|