@openzeppelin/miden-multisig-client 0.15.0 → 0.16.0
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 +25 -1
- package/dist/account/builder.d.ts +2 -1
- package/dist/account/builder.d.ts.map +1 -1
- package/dist/account/builder.js +1 -0
- package/dist/account/builder.js.map +1 -1
- package/dist/account/builder.test.js +2 -2
- package/dist/account/builder.test.js.map +1 -1
- package/dist/client.d.ts +9 -5
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +5 -5
- package/dist/client.js.map +1 -1
- package/dist/client.test.js +46 -15
- package/dist/client.test.js.map +1 -1
- package/dist/connectivity.d.ts +38 -0
- package/dist/connectivity.d.ts.map +1 -0
- package/dist/connectivity.js +97 -0
- package/dist/connectivity.js.map +1 -0
- package/dist/connectivity.test.d.ts +2 -0
- package/dist/connectivity.test.d.ts.map +1 -0
- package/dist/connectivity.test.js +61 -0
- package/dist/connectivity.test.js.map +1 -0
- package/dist/index.d.ts +9 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -3
- package/dist/index.js.map +1 -1
- package/dist/multisig.d.ts +68 -7
- package/dist/multisig.d.ts.map +1 -1
- package/dist/multisig.js +90 -18
- package/dist/multisig.js.map +1 -1
- package/dist/multisig.test.js +214 -79
- package/dist/multisig.test.js.map +1 -1
- package/dist/proposal/metadata.d.ts.map +1 -1
- package/dist/proposal/metadata.js +12 -0
- package/dist/proposal/metadata.js.map +1 -1
- package/dist/proposal/metadata.test.js +49 -0
- package/dist/proposal/metadata.test.js.map +1 -1
- package/dist/raw-client.d.ts +2 -2
- package/dist/raw-client.d.ts.map +1 -1
- package/dist/raw-client.js +14 -4
- package/dist/raw-client.js.map +1 -1
- package/dist/raw-client.test.js +25 -3
- package/dist/raw-client.test.js.map +1 -1
- package/dist/signers/miden-wallet.d.ts +44 -1
- package/dist/signers/miden-wallet.d.ts.map +1 -1
- package/dist/signers/miden-wallet.ecdsa-recovery.test.d.ts +2 -0
- package/dist/signers/miden-wallet.ecdsa-recovery.test.d.ts.map +1 -0
- package/dist/signers/miden-wallet.ecdsa-recovery.test.js +148 -0
- package/dist/signers/miden-wallet.ecdsa-recovery.test.js.map +1 -0
- package/dist/signers/miden-wallet.js +97 -6
- package/dist/signers/miden-wallet.js.map +1 -1
- package/dist/signers/miden-wallet.test.js +8 -13
- package/dist/signers/miden-wallet.test.js.map +1 -1
- package/dist/transaction/consumeNotes.d.ts +6 -2
- package/dist/transaction/consumeNotes.d.ts.map +1 -1
- package/dist/transaction/consumeNotes.js +0 -4
- package/dist/transaction/consumeNotes.js.map +1 -1
- package/dist/transaction/options.d.ts +3 -0
- package/dist/transaction/options.d.ts.map +1 -1
- package/dist/transaction/p2id.d.ts +20 -2
- package/dist/transaction/p2id.d.ts.map +1 -1
- package/dist/transaction/p2id.js +46 -3
- package/dist/transaction/p2id.js.map +1 -1
- package/dist/transaction/p2id.test.js +66 -6
- package/dist/transaction/p2id.test.js.map +1 -1
- package/dist/transaction/summary.d.ts +2 -1
- package/dist/transaction/summary.d.ts.map +1 -1
- package/dist/transaction/summary.js.map +1 -1
- package/dist/transaction/updateGuardian.d.ts +6 -2
- package/dist/transaction/updateGuardian.d.ts.map +1 -1
- package/dist/transaction/updateGuardian.js.map +1 -1
- package/dist/transaction/updateProcedureThreshold.d.ts +7 -2
- package/dist/transaction/updateProcedureThreshold.d.ts.map +1 -1
- package/dist/transaction/updateProcedureThreshold.js.map +1 -1
- package/dist/transaction/updateSigners.d.ts +7 -2
- package/dist/transaction/updateSigners.d.ts.map +1 -1
- package/dist/transaction/updateSigners.js.map +1 -1
- package/dist/transaction.d.ts +1 -1
- 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 +5 -0
- package/dist/types/proposal.d.ts.map +1 -1
- package/dist/types/proposal.js +3 -0
- package/dist/types/proposal.js.map +1 -1
- package/dist/utils/ecdsa.d.ts +17 -0
- package/dist/utils/ecdsa.d.ts.map +1 -1
- package/dist/utils/ecdsa.js +44 -1
- package/dist/utils/ecdsa.js.map +1 -1
- package/dist/utils/ecdsa.test.js +46 -0
- package/dist/utils/ecdsa.test.js.map +1 -1
- package/package.json +12 -3
- package/src/account/builder.test.ts +19 -11
- package/src/account/builder.ts +2 -1
- package/src/client.test.ts +67 -15
- package/src/client.ts +18 -10
- package/src/connectivity.test.ts +67 -0
- package/src/connectivity.ts +111 -0
- package/src/index.ts +20 -1
- package/src/multisig.test.ts +267 -80
- package/src/multisig.ts +109 -20
- package/src/proposal/metadata.test.ts +60 -0
- package/src/proposal/metadata.ts +14 -0
- package/src/raw-client.test.ts +41 -3
- package/src/raw-client.ts +15 -5
- package/src/signers/miden-wallet.ecdsa-recovery.test.ts +201 -0
- package/src/signers/miden-wallet.test.ts +11 -19
- package/src/signers/miden-wallet.ts +134 -7
- package/src/transaction/consumeNotes.ts +11 -1
- package/src/transaction/options.ts +4 -0
- package/src/transaction/p2id.test.ts +98 -8
- package/src/transaction/p2id.ts +64 -4
- package/src/transaction/summary.ts +12 -0
- package/src/transaction/updateGuardian.ts +11 -1
- package/src/transaction/updateProcedureThreshold.ts +13 -1
- package/src/transaction/updateSigners.ts +13 -1
- package/src/transaction.ts +3 -0
- package/src/types/proposal.ts +9 -0
- package/src/utils/ecdsa.test.ts +60 -0
- package/src/utils/ecdsa.ts +51 -1
- package/dist/account/masm/authLibraries.d.ts +0 -6
- package/dist/account/masm/authLibraries.d.ts.map +0 -1
- package/dist/account/masm/authLibraries.js +0 -17
- package/dist/account/masm/authLibraries.js.map +0 -1
- package/dist/multisig/proposal/execution.d.ts +0 -20
- package/dist/multisig/proposal/execution.d.ts.map +0 -1
- package/dist/multisig/proposal/execution.js +0 -166
- package/dist/multisig/proposal/execution.js.map +0 -1
- package/dist/multisig/proposal/parser.d.ts +0 -17
- package/dist/multisig/proposal/parser.d.ts.map +0 -1
- package/dist/multisig/proposal/parser.js +0 -147
- package/dist/multisig/proposal/parser.js.map +0 -1
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { isProcedureName } from '../procedures.js';
|
|
2
|
+
import { isP2idNoteVisibility } from '../types/proposal.js';
|
|
2
3
|
export class ProposalMetadataCodec {
|
|
3
4
|
static toGuardian(metadata) {
|
|
4
5
|
const base = {
|
|
@@ -21,6 +22,10 @@ export class ProposalMetadataCodec {
|
|
|
21
22
|
recipientId: metadata.recipientId,
|
|
22
23
|
faucetId: metadata.faucetId,
|
|
23
24
|
amount: metadata.amount,
|
|
25
|
+
// Canonicalize: emit note_type only when private, so a public note
|
|
26
|
+
// keeps the pre-#322 wire shape and matches the Rust encoder (which
|
|
27
|
+
// round-trips through the NoteType enum). Absent => public.
|
|
28
|
+
noteType: metadata.noteType === 'private' ? 'private' : undefined,
|
|
24
29
|
};
|
|
25
30
|
case 'switch_guardian':
|
|
26
31
|
return {
|
|
@@ -63,12 +68,16 @@ export class ProposalMetadataCodec {
|
|
|
63
68
|
if (!guardian.recipientId || !guardian.faucetId || !guardian.amount) {
|
|
64
69
|
throw new Error('p2id proposal is missing required metadata fields');
|
|
65
70
|
}
|
|
71
|
+
if (guardian.noteType !== undefined && !isP2idNoteVisibility(guardian.noteType)) {
|
|
72
|
+
throw new Error(`p2id proposal has unsupported noteType '${guardian.noteType}': expected 'public' or 'private'`);
|
|
73
|
+
}
|
|
66
74
|
return {
|
|
67
75
|
...base,
|
|
68
76
|
proposalType: 'p2id',
|
|
69
77
|
recipientId: guardian.recipientId,
|
|
70
78
|
faucetId: guardian.faucetId,
|
|
71
79
|
amount: guardian.amount,
|
|
80
|
+
noteType: guardian.noteType,
|
|
72
81
|
};
|
|
73
82
|
case 'consume_notes':
|
|
74
83
|
if (!guardian.noteIds || guardian.noteIds.length === 0) {
|
|
@@ -158,6 +167,9 @@ export class ProposalMetadataCodec {
|
|
|
158
167
|
if (!metadata.recipientId || !metadata.faucetId || !metadata.amount) {
|
|
159
168
|
throw new Error('p2id proposal metadata is incomplete');
|
|
160
169
|
}
|
|
170
|
+
if (metadata.noteType !== undefined && !isP2idNoteVisibility(metadata.noteType)) {
|
|
171
|
+
throw new Error(`p2id proposal has unsupported noteType '${metadata.noteType}'`);
|
|
172
|
+
}
|
|
161
173
|
return metadata;
|
|
162
174
|
case 'custom':
|
|
163
175
|
// Custom proposals are opaque to the SDK; nothing to validate beyond
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../src/proposal/metadata.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../src/proposal/metadata.ts"],"names":[],"mappings":"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"}
|
|
@@ -84,4 +84,53 @@ describe('ProposalMetadataCodec custom proposal types (issue #266)', () => {
|
|
|
84
84
|
expect(back.targetThreshold).toBe(2);
|
|
85
85
|
});
|
|
86
86
|
});
|
|
87
|
+
describe('ProposalMetadataCodec p2id noteType (issue #322)', () => {
|
|
88
|
+
const baseWire = {
|
|
89
|
+
proposalType: 'p2id',
|
|
90
|
+
recipientId: '0xrecipient',
|
|
91
|
+
faucetId: '0xfaucet',
|
|
92
|
+
amount: '1000',
|
|
93
|
+
};
|
|
94
|
+
it('round-trips a private noteType through the codec', () => {
|
|
95
|
+
const md = ProposalMetadataCodec.fromGuardian({
|
|
96
|
+
...baseWire,
|
|
97
|
+
noteType: 'private',
|
|
98
|
+
});
|
|
99
|
+
expect(md.noteType).toBe('private');
|
|
100
|
+
const wire = ProposalMetadataCodec.toGuardian(md);
|
|
101
|
+
expect(wire.noteType).toBe('private');
|
|
102
|
+
});
|
|
103
|
+
it('leaves noteType absent for legacy proposals (=> public)', () => {
|
|
104
|
+
const md = ProposalMetadataCodec.fromGuardian(baseWire);
|
|
105
|
+
expect(md.noteType).toBeUndefined();
|
|
106
|
+
expect(ProposalMetadataCodec.toGuardian(md).noteType).toBeUndefined();
|
|
107
|
+
});
|
|
108
|
+
it('canonicalizes an explicit public noteType to absent on encode', () => {
|
|
109
|
+
const md = {
|
|
110
|
+
proposalType: 'p2id',
|
|
111
|
+
description: '',
|
|
112
|
+
recipientId: '0xrecipient',
|
|
113
|
+
faucetId: '0xfaucet',
|
|
114
|
+
amount: '1000',
|
|
115
|
+
noteType: 'public',
|
|
116
|
+
};
|
|
117
|
+
// toGuardian omits the field so a public note keeps the pre-#322 wire
|
|
118
|
+
// shape and matches the Rust encoder, even if handed an explicit 'public'.
|
|
119
|
+
expect(ProposalMetadataCodec.toGuardian(md).noteType).toBeUndefined();
|
|
120
|
+
});
|
|
121
|
+
it('fromGuardian rejects an unsupported noteType', () => {
|
|
122
|
+
expect(() => ProposalMetadataCodec.fromGuardian({ ...baseWire, noteType: 'encrypted' })).toThrow(/unsupported noteType/);
|
|
123
|
+
});
|
|
124
|
+
it('validate rejects an unsupported noteType', () => {
|
|
125
|
+
const md = {
|
|
126
|
+
proposalType: 'p2id',
|
|
127
|
+
description: '',
|
|
128
|
+
recipientId: '0xrecipient',
|
|
129
|
+
faucetId: '0xfaucet',
|
|
130
|
+
amount: '1000',
|
|
131
|
+
noteType: 'encrypted',
|
|
132
|
+
};
|
|
133
|
+
expect(() => ProposalMetadataCodec.validate(md)).toThrow(/unsupported noteType/);
|
|
134
|
+
});
|
|
135
|
+
});
|
|
87
136
|
//# sourceMappingURL=metadata.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metadata.test.js","sourceRoot":"","sources":["../../src/proposal/metadata.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"metadata.test.js","sourceRoot":"","sources":["../../src/proposal/metadata.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAOtD,QAAQ,CAAC,gEAAgE,EAAE,GAAG,EAAE;IAC9E,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,MAAM,EAAE,GAAiC;YACvC,YAAY,EAAE,eAAe;YAC7B,WAAW,EAAE,kBAAkB;YAC/B,OAAO,EAAE,CAAC,OAAO,CAAC;YAClB,eAAe,EAAE,CAAC;YAClB,KAAK,EAAE,CAAC,kBAAkB,CAAC;SAC5B,CAAC;QACF,MAAM,IAAI,GAAG,qBAAqB,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAClD,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;QACxC,MAAM,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjD,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,OAAO,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,IAAI,GAA6B;YACrC,YAAY,EAAE,eAAe;YAC7B,OAAO,EAAE,CAAC,OAAO,CAAC;YAClB,2BAA2B,EAAE,CAAC;YAC9B,iBAAiB,EAAE,CAAC,kBAAkB,CAAC;SACxC,CAAC;QACF,MAAM,EAAE,GAAG,qBAAqB,CAAC,YAAY,CAAC,IAAI,CAAiC,CAAC;QACpF,MAAM,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC9C,MAAM,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACvE,MAAM,EAAE,GAAiC;YACvC,YAAY,EAAE,eAAe;YAC7B,WAAW,EAAE,QAAQ;YACrB,OAAO,EAAE,CAAC,OAAO,CAAC;SACnB,CAAC;QACF,MAAM,IAAI,GAAG,qBAAqB,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAClD,MAAM,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC,aAAa,EAAE,CAAC;QACzD,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,aAAa,EAAE,CAAC;QAC/C,MAAM,IAAI,GAAG,qBAAqB,CAAC,YAAY,CAAC,IAAI,CAAiC,CAAC;QACtF,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,aAAa,EAAE,CAAC;QAC7C,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,aAAa,EAAE,CAAC;IACrC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,0DAA0D,EAAE,GAAG,EAAE;IACxE,EAAE,CAAC,sFAAsF,EAAE,GAAG,EAAE;QAC9F,MAAM,IAAI,GAA6B;YACrC,YAAY,EAAE,OAAO;YACrB,WAAW,EAAE,sBAAsB;SACpC,CAAC;QACF,MAAM,EAAE,GAAG,qBAAqB,CAAC,YAAY,CAAC,IAAI,CAA2B,CAAC;QAC9E,MAAM,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvC,MAAM,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACrE,MAAM,EAAE,GAA2B;YACjC,YAAY,EAAE,QAAQ;YACtB,WAAW,EAAE,sBAAsB;YACnC,eAAe,EAAE,OAAO;SACzB,CAAC;QACF,MAAM,IAAI,GAAG,qBAAqB,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAClD,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAExC,MAAM,IAAI,GAAG,qBAAqB,CAAC,YAAY,CAAC,IAAI,CAA2B,CAAC;QAChF,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACzC,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,EAAE,GAA2B;YACjC,YAAY,EAAE,QAAQ;YACtB,WAAW,EAAE,QAAQ;YACrB,eAAe,EAAE,OAAO;SACzB,CAAC;QACF,MAAM,CAAC,qBAAqB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,MAAM,IAAI,GAA6B;YACrC,YAAY,EAAE,4BAA4B;YAC1C,eAAe,EAAE,YAAY;YAC7B,eAAe,EAAE,CAAC;SACnB,CAAC;QACF,MAAM,EAAE,GAAG,qBAAqB,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QACpD,MAAM,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QAC3D,MAAM,IAAI,GAAG,qBAAqB,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAClD,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QAC7D,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAChD,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,kDAAkD,EAAE,GAAG,EAAE;IAChE,MAAM,QAAQ,GAA6B;QACzC,YAAY,EAAE,MAAM;QACpB,WAAW,EAAE,aAAa;QAC1B,QAAQ,EAAE,UAAU;QACpB,MAAM,EAAE,MAAM;KACf,CAAC;IAEF,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,EAAE,GAAG,qBAAqB,CAAC,YAAY,CAAC;YAC5C,GAAG,QAAQ;YACX,QAAQ,EAAE,SAAS;SACpB,CAAyB,CAAC;QAC3B,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAEpC,MAAM,IAAI,GAAG,qBAAqB,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAClD,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,MAAM,EAAE,GAAG,qBAAqB,CAAC,YAAY,CAAC,QAAQ,CAAyB,CAAC;QAChF,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,aAAa,EAAE,CAAC;QACpC,MAAM,CAAC,qBAAqB,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,aAAa,EAAE,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACvE,MAAM,EAAE,GAAG;YACT,YAAY,EAAE,MAAM;YACpB,WAAW,EAAE,EAAE;YACf,WAAW,EAAE,aAAa;YAC1B,QAAQ,EAAE,UAAU;YACpB,MAAM,EAAE,MAAM;YACd,QAAQ,EAAE,QAAQ;SACK,CAAC;QAE1B,sEAAsE;QACtE,2EAA2E;QAC3E,MAAM,CAAC,qBAAqB,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,aAAa,EAAE,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,CAAC,GAAG,EAAE,CACV,qBAAqB,CAAC,YAAY,CAAC,EAAE,GAAG,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC,CAC3E,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,EAAE,GAAG;YACT,YAAY,EAAE,MAAM;YACpB,WAAW,EAAE,EAAE;YACf,WAAW,EAAE,aAAa;YAC1B,QAAQ,EAAE,UAAU;YACpB,MAAM,EAAE,MAAM;YACd,QAAQ,EAAE,WAAW;SACa,CAAC;QACrC,MAAM,CAAC,GAAG,EAAE,CAAC,qBAAqB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;IACnF,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/dist/raw-client.d.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { MidenClient, type TransactionProver, type TransactionScript, WasmWebClient } from '@miden-sdk/miden-sdk';
|
|
2
|
-
export declare const DEFAULT_MIDEN_RPC_URL = "https://rpc.devnet.miden.io";
|
|
3
2
|
export type RawClientSource = MidenClient | WasmWebClient;
|
|
4
3
|
export interface ScriptLibrarySource {
|
|
5
4
|
namespace: string;
|
|
6
5
|
code: string;
|
|
7
6
|
linking?: 'dynamic' | 'static';
|
|
8
7
|
}
|
|
9
|
-
export declare function
|
|
8
|
+
export declare function requireConfigValue(field: string, value?: unknown): string;
|
|
9
|
+
export declare function requireMidenRpcEndpoint(endpoint?: string): string;
|
|
10
10
|
export declare function getRawMidenClient(client: RawClientSource, rpcUrl?: string): Promise<WasmWebClient>;
|
|
11
11
|
export declare function getTransactionProver(client: RawClientSource): TransactionProver | null;
|
|
12
12
|
export declare function compileTxScript(client: RawClientSource, code: string, libraries?: ScriptLibrarySource[], rpcUrl?: string): Promise<TransactionScript>;
|
package/dist/raw-client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"raw-client.d.ts","sourceRoot":"","sources":["../src/raw-client.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,aAAa,EACd,MAAM,sBAAsB,CAAC;AAE9B,
|
|
1
|
+
{"version":3,"file":"raw-client.d.ts","sourceRoot":"","sources":["../src/raw-client.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,aAAa,EACd,MAAM,sBAAsB,CAAC;AAE9B,MAAM,MAAM,eAAe,GAAG,WAAW,GAAG,aAAa,CAAC;AAC1D,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC;CAChC;AAID,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,CASzE;AAED,wBAAgB,uBAAuB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAEjE;AAMD,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,eAAe,EACvB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,aAAa,CAAC,CAmBxB;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,eAAe,GAAG,iBAAiB,GAAG,IAAI,CAEtF;AAED,wBAAsB,eAAe,CACnC,MAAM,EAAE,eAAe,EACvB,IAAI,EAAE,MAAM,EACZ,SAAS,GAAE,mBAAmB,EAAO,EACrC,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,iBAAiB,CAAC,CAgB5B"}
|
package/dist/raw-client.js
CHANGED
|
@@ -1,8 +1,17 @@
|
|
|
1
1
|
import { WasmWebClient, } from '@miden-sdk/miden-sdk';
|
|
2
|
-
export const DEFAULT_MIDEN_RPC_URL = 'https://rpc.devnet.miden.io';
|
|
3
2
|
const rawClientCache = new WeakMap();
|
|
4
|
-
export function
|
|
5
|
-
|
|
3
|
+
export function requireConfigValue(field, value) {
|
|
4
|
+
if (typeof value !== 'string') {
|
|
5
|
+
throw new Error(`missing required configuration: ${field}`);
|
|
6
|
+
}
|
|
7
|
+
const normalizedValue = value.trim();
|
|
8
|
+
if (normalizedValue === '') {
|
|
9
|
+
throw new Error(`missing required configuration: ${field}`);
|
|
10
|
+
}
|
|
11
|
+
return normalizedValue;
|
|
12
|
+
}
|
|
13
|
+
export function requireMidenRpcEndpoint(endpoint) {
|
|
14
|
+
return requireConfigValue('midenRpcEndpoint', endpoint);
|
|
6
15
|
}
|
|
7
16
|
function isPublicMidenClient(client) {
|
|
8
17
|
return 'accounts' in client && 'sync' in client;
|
|
@@ -15,7 +24,8 @@ export async function getRawMidenClient(client, rpcUrl) {
|
|
|
15
24
|
if (cached) {
|
|
16
25
|
return cached;
|
|
17
26
|
}
|
|
18
|
-
const
|
|
27
|
+
const endpoint = requireMidenRpcEndpoint(rpcUrl);
|
|
28
|
+
const rawClient = WasmWebClient.createClient(endpoint, undefined, undefined, await client.storeIdentifier());
|
|
19
29
|
rawClientCache.set(client, rawClient);
|
|
20
30
|
return rawClient;
|
|
21
31
|
}
|
package/dist/raw-client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"raw-client.js","sourceRoot":"","sources":["../src/raw-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,aAAa,GACd,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"raw-client.js","sourceRoot":"","sources":["../src/raw-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,aAAa,GACd,MAAM,sBAAsB,CAAC;AAS9B,MAAM,cAAc,GAAG,IAAI,OAAO,EAAuC,CAAC;AAE1E,MAAM,UAAU,kBAAkB,CAAC,KAAa,EAAE,KAAe;IAC/D,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,mCAAmC,KAAK,EAAE,CAAC,CAAC;IAC9D,CAAC;IACD,MAAM,eAAe,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IACrC,IAAI,eAAe,KAAK,EAAE,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,mCAAmC,KAAK,EAAE,CAAC,CAAC;IAC9D,CAAC;IACD,OAAO,eAAe,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,QAAiB;IACvD,OAAO,kBAAkB,CAAC,kBAAkB,EAAE,QAAQ,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,mBAAmB,CAAC,MAAuB;IAClD,OAAO,UAAU,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,CAAC;AAClD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,MAAuB,EACvB,MAAe;IAEf,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,EAAE,CAAC;QACjC,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC1C,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,QAAQ,GAAG,uBAAuB,CAAC,MAAM,CAAC,CAAC;IACjD,MAAM,SAAS,GAAG,aAAa,CAAC,YAAY,CAC1C,QAAQ,EACR,SAAS,EACT,SAAS,EACT,MAAM,MAAM,CAAC,eAAe,EAAE,CAC/B,CAAC;IACF,cAAc,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACtC,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAAuB;IAC1D,OAAO,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC;AACnE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAAuB,EACvB,IAAY,EACZ,YAAmC,EAAE,EACrC,MAAe;IAEf,IAAI,mBAAmB,CAAC,MAAM,CAAC,EAAE,CAAC;QAChC,OAAO,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1D,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,iBAAiB,EAAE,CAAC;IACpD,KAAK,MAAM,OAAO,IAAI,SAAS,EAAE,CAAC;QAChC,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QAC3E,IAAI,OAAO,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;YACjC,OAAO,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;QAC1C,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;AACvC,CAAC"}
|
package/dist/raw-client.test.js
CHANGED
|
@@ -7,13 +7,35 @@ vi.mock('@miden-sdk/miden-sdk', () => ({
|
|
|
7
7
|
createClient: mockCreateClient,
|
|
8
8
|
},
|
|
9
9
|
}));
|
|
10
|
-
import { compileTxScript, getRawMidenClient, getTransactionProver,
|
|
10
|
+
import { compileTxScript, getRawMidenClient, getTransactionProver, requireConfigValue, } from './raw-client.js';
|
|
11
11
|
describe('raw-client', () => {
|
|
12
12
|
beforeEach(() => {
|
|
13
13
|
mockCreateClient.mockReset();
|
|
14
14
|
});
|
|
15
|
-
it('
|
|
16
|
-
expect(
|
|
15
|
+
it.each([undefined, null, 42, {}, []])('rejects non-string configuration value %j consistently', (value) => {
|
|
16
|
+
expect(() => requireConfigValue('guardianEndpoint', value)).toThrow('missing required configuration: guardianEndpoint');
|
|
17
|
+
});
|
|
18
|
+
it('trims surrounding whitespace from configuration values', () => {
|
|
19
|
+
expect(requireConfigValue('guardianEndpoint', ' http://localhost:3000\n')).toBe('http://localhost:3000');
|
|
20
|
+
});
|
|
21
|
+
it('rejects shadow client creation without an RPC endpoint', async () => {
|
|
22
|
+
const client = {
|
|
23
|
+
accounts: {},
|
|
24
|
+
sync: vi.fn(),
|
|
25
|
+
defaultProver: null,
|
|
26
|
+
storeIdentifier: vi.fn(() => 'browser-db'),
|
|
27
|
+
};
|
|
28
|
+
await expect(getRawMidenClient(client)).rejects.toThrow('missing required configuration: midenRpcEndpoint');
|
|
29
|
+
await expect(getRawMidenClient(client, ' ')).rejects.toThrow('missing required configuration: midenRpcEndpoint');
|
|
30
|
+
expect(mockCreateClient).not.toHaveBeenCalled();
|
|
31
|
+
});
|
|
32
|
+
it('returns an injected raw web client without needing an endpoint', async () => {
|
|
33
|
+
const rawClient = {
|
|
34
|
+
executeTransaction: vi.fn(),
|
|
35
|
+
proveTransaction: vi.fn(),
|
|
36
|
+
};
|
|
37
|
+
await expect(getRawMidenClient(rawClient)).resolves.toBe(rawClient);
|
|
38
|
+
expect(mockCreateClient).not.toHaveBeenCalled();
|
|
17
39
|
});
|
|
18
40
|
it('returns the default prover from a public MidenClient', () => {
|
|
19
41
|
const prover = { kind: 'devnet-prover' };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"raw-client.test.js","sourceRoot":"","sources":["../src/raw-client.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9D,MAAM,EAAE,gBAAgB,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAC7C,gBAAgB,EAAE,EAAE,CAAC,EAAE,EAAE;CAC1B,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,sBAAsB,EAAE,GAAG,EAAE,CAAC,CAAC;IACrC,aAAa,EAAE;QACb,YAAY,EAAE,gBAAgB;KAC/B;CACF,CAAC,CAAC,CAAC;AAEJ,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,oBAAoB,EACpB,
|
|
1
|
+
{"version":3,"file":"raw-client.test.js","sourceRoot":"","sources":["../src/raw-client.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +1,58 @@
|
|
|
1
1
|
import type { RequestAuthPayload } from '@openzeppelin/guardian-client';
|
|
2
2
|
import type { Signer, SignatureScheme } from '../types.js';
|
|
3
3
|
export interface WalletSigningContext {
|
|
4
|
+
/**
|
|
5
|
+
* Sign `data` with the wallet's key.
|
|
6
|
+
*
|
|
7
|
+
* `signBytes` MUST return the signature in the Miden SDK's serialized form: a
|
|
8
|
+
* 1-byte scheme tag followed by the raw signature. The signer always strips that
|
|
9
|
+
* leading tag byte, exactly as the SDK's own `EcdsaSigner`/`FalconSigner` do with
|
|
10
|
+
* `Signature.serialize()`.
|
|
11
|
+
*
|
|
12
|
+
* For an ECDSA (secp256k1/keccak) signer constructed WITHOUT an explicit public
|
|
13
|
+
* key and without a `localAuthSigner`, the raw signature MUST carry the recovery
|
|
14
|
+
* byte — the 65-byte `r||s||v` form (66 bytes including the tag) — so the public
|
|
15
|
+
* key can be recovered from it. A 64-byte signature with no recovery byte cannot
|
|
16
|
+
* be recovered, and the signer fails closed when `publicKey` is read.
|
|
17
|
+
*/
|
|
4
18
|
signBytes(data: Uint8Array, kind: 'word' | 'signingInputs'): Promise<Uint8Array>;
|
|
5
19
|
}
|
|
6
20
|
export declare class MidenWalletSigner implements Signer {
|
|
7
21
|
readonly commitment: string;
|
|
8
|
-
readonly publicKey: string;
|
|
9
22
|
readonly scheme: SignatureScheme;
|
|
10
23
|
private readonly wallet;
|
|
11
24
|
private readonly localAuthSigner;
|
|
25
|
+
private readonly explicitPublicKey;
|
|
26
|
+
private resolvedPublicKey;
|
|
27
|
+
private lastSignedMessage;
|
|
28
|
+
private lastSignature;
|
|
12
29
|
constructor(wallet: WalletSigningContext, commitment: string, scheme: SignatureScheme, localAuthSigner?: Signer, publicKey?: string);
|
|
30
|
+
/**
|
|
31
|
+
* The signer's public key.
|
|
32
|
+
*
|
|
33
|
+
* Returns immediately for Falcon. For ECDSA the key is resolved from one of
|
|
34
|
+
* three sources — an explicit key, a delegate `localAuthSigner`, or recovery
|
|
35
|
+
* from a signature the signer has already produced — and every source is
|
|
36
|
+
* verified against {@link commitment} via the same `Poseidon2(publicKey) ==
|
|
37
|
+
* commitment` invariant the transaction kernel enforces. Reading `publicKey`
|
|
38
|
+
* before any source is available, or when the resolved key does not match the
|
|
39
|
+
* commitment, throws: a loud sign-time failure instead of an opaque kernel
|
|
40
|
+
* assertion ("invalid public key commitment") at execute time.
|
|
41
|
+
*/
|
|
42
|
+
get publicKey(): string;
|
|
43
|
+
/**
|
|
44
|
+
* Verify an already point-validated ECDSA public-key candidate against
|
|
45
|
+
* {@link commitment} and cache it on success.
|
|
46
|
+
*
|
|
47
|
+
* A mismatching commitment is always rejected. `requireCommitment` distinguishes
|
|
48
|
+
* the recovery path — where a signature already exists, so the SDK must be
|
|
49
|
+
* initialized and an uncomputable commitment is an error — from the
|
|
50
|
+
* explicit/delegate paths, where a caller may read `publicKey` before the SDK is
|
|
51
|
+
* initialized. In that cold-SDK case the commitment cannot be computed yet, so
|
|
52
|
+
* the candidate is returned WITHOUT being cached and verification is re-attempted
|
|
53
|
+
* on the next read (once the SDK is up, as it always is in the guardian flow).
|
|
54
|
+
*/
|
|
55
|
+
private verifyAndCache;
|
|
13
56
|
signAccountIdWithTimestamp(accountId: string, timestamp: number): Promise<string>;
|
|
14
57
|
signRequest(accountId: string, timestamp: number, requestPayload: RequestAuthPayload): Promise<string>;
|
|
15
58
|
signCommitment(commitmentHex: string): Promise<string>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"miden-wallet.d.ts","sourceRoot":"","sources":["../../src/signers/miden-wallet.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACxE,OAAO,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"miden-wallet.d.ts","sourceRoot":"","sources":["../../src/signers/miden-wallet.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACxE,OAAO,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAQ3D,MAAM,WAAW,oBAAoB;IACnC;;;;;;;;;;;;;OAaG;IACH,SAAS,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;CAClF;AAED,qBAAa,iBAAkB,YAAW,MAAM;IAC9C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;IACjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuB;IAC9C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAgB;IAChD,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAgB;IAClD,OAAO,CAAC,iBAAiB,CAAgB;IACzC,OAAO,CAAC,iBAAiB,CAA2B;IACpD,OAAO,CAAC,aAAa,CAA2B;gBAG9C,MAAM,EAAE,oBAAoB,EAC5B,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,eAAe,EACvB,eAAe,CAAC,EAAE,MAAM,EACxB,SAAS,CAAC,EAAE,MAAM;IAgBpB;;;;;;;;;;;OAWG;IACH,IAAI,SAAS,IAAI,MAAM,CAyBtB;IAED;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,cAAc;IAqBhB,0BAA0B,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAQjF,WAAW,CACf,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,kBAAkB,GACjC,OAAO,CAAC,MAAM,CAAC;IAOZ,cAAc,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAK5D;;;OAGG;IACG,iBAAiB,CAAC,gBAAgB,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YAQzE,QAAQ;CAcvB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"miden-wallet.ecdsa-recovery.test.d.ts","sourceRoot":"","sources":["../../src/signers/miden-wallet.ecdsa-recovery.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { secp256k1 } from '@noble/curves/secp256k1';
|
|
3
|
+
import { keccak_256 } from '@noble/hashes/sha3.js';
|
|
4
|
+
import { MidenWalletSigner } from './miden-wallet.js';
|
|
5
|
+
import { tryComputeEcdsaCommitmentHex } from '../utils/signature.js';
|
|
6
|
+
import { bytesToHex, hexToBytes } from '../utils/encoding.js';
|
|
7
|
+
import { buildGuardianSignatureFromSigner } from '../multisig/signing.js';
|
|
8
|
+
// Real-crypto repro for the reported failure:
|
|
9
|
+
// "assertion failed with error message: invalid public key commitment"
|
|
10
|
+
//
|
|
11
|
+
// These tests use the real WASM SDK (Poseidon2/PublicKey, via tests/setup-wasm.ts)
|
|
12
|
+
// and real secp256k1 keypairs — NOT mocks — so they exercise the exact kernel
|
|
13
|
+
// invariant `Poseidon2(publicKey) == pub_key_commitment` that the transaction
|
|
14
|
+
// kernel enforces in `ecdsa_k256_keccak.masm` (`assert_eqw "invalid public key
|
|
15
|
+
// commitment"`). A wallet-delegated ECDSA cosigner whose `publicKey` degrades to
|
|
16
|
+
// the 32-byte commitment — or is a valid-but-wrong key — fails that invariant.
|
|
17
|
+
// Deterministic keys so the repro is reproducible run-to-run.
|
|
18
|
+
const PRIVATE_KEY = hexToBytes('0x' + '11'.repeat(32));
|
|
19
|
+
const COMPRESSED_PUBKEY_HEX = bytesToHex(secp256k1.getPublicKey(PRIVATE_KEY, true));
|
|
20
|
+
// A second, unrelated key: valid secp256k1 but NOT the one the commitment is for.
|
|
21
|
+
const OTHER_PRIVATE_KEY = hexToBytes('0x' + '22'.repeat(32));
|
|
22
|
+
const OTHER_COMPRESSED_PUBKEY_HEX = bytesToHex(secp256k1.getPublicKey(OTHER_PRIVATE_KEY, true));
|
|
23
|
+
/** Asserts a nullable value is present and returns it narrowed (avoids `!`). */
|
|
24
|
+
function expectPresent(value) {
|
|
25
|
+
expect(value ?? null).not.toBeNull();
|
|
26
|
+
return value;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* A wallet that signs like the real Miden Wallet ECDSA path: it keccak256-hashes
|
|
30
|
+
* the word bytes it receives, produces a 65-byte `r||s||v` signature, and prepends
|
|
31
|
+
* a 1-byte scheme tag (which `MidenWalletSigner.signWord` strips via `slice(1)`).
|
|
32
|
+
*/
|
|
33
|
+
function ecdsaWallet(privateKey) {
|
|
34
|
+
return {
|
|
35
|
+
async signBytes(data) {
|
|
36
|
+
const msgHash = keccak_256(data);
|
|
37
|
+
const sig = secp256k1.sign(msgHash, privateKey);
|
|
38
|
+
const compact = sig.toCompactRawBytes(); // 64 bytes: r || s
|
|
39
|
+
const tagged = new Uint8Array(1 + 65);
|
|
40
|
+
tagged[0] = 1; // scheme tag, dropped by the signer
|
|
41
|
+
tagged.set(compact, 1);
|
|
42
|
+
tagged[1 + 64] = sig.recovery; // recovery byte v
|
|
43
|
+
return tagged;
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
/** Minimal ECDSA delegate (`localAuthSigner`) carrying a fixed public key. */
|
|
48
|
+
function ecdsaDelegate(commitment, publicKey) {
|
|
49
|
+
return {
|
|
50
|
+
commitment,
|
|
51
|
+
publicKey,
|
|
52
|
+
scheme: 'ecdsa',
|
|
53
|
+
signAccountIdWithTimestamp: async () => '0x00',
|
|
54
|
+
signCommitment: async () => '0x00',
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
describe('MidenWalletSigner ECDSA public-key resolution', () => {
|
|
58
|
+
it('resolves the real ECDSA public key from its own signature so it hashes to the account commitment', async () => {
|
|
59
|
+
// The account's stored commitment is Poseidon2(pubkey) — exactly what the kernel checks.
|
|
60
|
+
const accountCommitment = expectPresent(tryComputeEcdsaCommitmentHex(COMPRESSED_PUBKEY_HEX));
|
|
61
|
+
// Wallet-delegated ECDSA cosigner constructed WITHOUT an explicit public key —
|
|
62
|
+
// the reported failure path, where `publicKey` silently fell back to the commitment.
|
|
63
|
+
const signer = new MidenWalletSigner(ecdsaWallet(PRIVATE_KEY), accountCommitment, 'ecdsa');
|
|
64
|
+
await signer.signCommitment(accountCommitment);
|
|
65
|
+
// The resolved public key must be the real 33-byte key, not the 32-byte commitment...
|
|
66
|
+
expect(signer.publicKey).toBe(COMPRESSED_PUBKEY_HEX);
|
|
67
|
+
expect(signer.publicKey).not.toBe(accountCommitment);
|
|
68
|
+
// ...and it must Poseidon2-hash back to the commitment (the kernel's assert_eqw).
|
|
69
|
+
expect(tryComputeEcdsaCommitmentHex(signer.publicKey)).toBe(accountCommitment);
|
|
70
|
+
});
|
|
71
|
+
it('fails closed when the wallet signature recovers a key that does not match the commitment', async () => {
|
|
72
|
+
// The account commitment is for PRIVATE_KEY, but the wallet signs with a
|
|
73
|
+
// different key. Recovery must reject the mismatch rather than trust it.
|
|
74
|
+
const accountCommitment = expectPresent(tryComputeEcdsaCommitmentHex(COMPRESSED_PUBKEY_HEX));
|
|
75
|
+
const signer = new MidenWalletSigner(ecdsaWallet(OTHER_PRIVATE_KEY), accountCommitment, 'ecdsa');
|
|
76
|
+
await signer.signCommitment(accountCommitment);
|
|
77
|
+
expect(() => signer.publicKey).toThrow(/does not match the signer commitment/);
|
|
78
|
+
});
|
|
79
|
+
it('accepts an explicit ECDSA public key whose commitment matches, without needing to sign', () => {
|
|
80
|
+
const accountCommitment = expectPresent(tryComputeEcdsaCommitmentHex(COMPRESSED_PUBKEY_HEX));
|
|
81
|
+
const signer = new MidenWalletSigner(ecdsaWallet(PRIVATE_KEY), accountCommitment, 'ecdsa', undefined, COMPRESSED_PUBKEY_HEX);
|
|
82
|
+
expect(signer.publicKey).toBe(COMPRESSED_PUBKEY_HEX);
|
|
83
|
+
expect(tryComputeEcdsaCommitmentHex(signer.publicKey)).toBe(accountCommitment);
|
|
84
|
+
});
|
|
85
|
+
it('rejects an explicit ECDSA public key whose commitment does not match the signer commitment', () => {
|
|
86
|
+
// A well-formed 33-byte key (passes format validation) that belongs to a
|
|
87
|
+
// different account. It must be rejected at the source, not carried into signing.
|
|
88
|
+
const accountCommitment = expectPresent(tryComputeEcdsaCommitmentHex(COMPRESSED_PUBKEY_HEX));
|
|
89
|
+
const signer = new MidenWalletSigner(ecdsaWallet(PRIVATE_KEY), accountCommitment, 'ecdsa', undefined, OTHER_COMPRESSED_PUBKEY_HEX);
|
|
90
|
+
expect(() => signer.publicKey).toThrow(/does not match the signer commitment/);
|
|
91
|
+
});
|
|
92
|
+
it('rejects an explicit ECDSA key that is a valid length but not a secp256k1 point', () => {
|
|
93
|
+
// 33-byte, correct compressed tag, but x is off-curve — must be rejected at
|
|
94
|
+
// construction, SDK-independently, not silently carried to execute time.
|
|
95
|
+
const accountCommitment = expectPresent(tryComputeEcdsaCommitmentHex(COMPRESSED_PUBKEY_HEX));
|
|
96
|
+
expect(() => new MidenWalletSigner(ecdsaWallet(PRIVATE_KEY), accountCommitment, 'ecdsa', undefined, '0x02' + 'ff'.repeat(32))).toThrow(/not a valid secp256k1 point/);
|
|
97
|
+
});
|
|
98
|
+
it('compresses an explicitly-provided 65-byte uncompressed public key', () => {
|
|
99
|
+
const uncompressed = bytesToHex(secp256k1.getPublicKey(PRIVATE_KEY, false)); // 65 bytes
|
|
100
|
+
const accountCommitment = expectPresent(tryComputeEcdsaCommitmentHex(COMPRESSED_PUBKEY_HEX));
|
|
101
|
+
const signer = new MidenWalletSigner(ecdsaWallet(PRIVATE_KEY), accountCommitment, 'ecdsa', undefined, uncompressed);
|
|
102
|
+
expect(signer.publicKey).toBe(COMPRESSED_PUBKEY_HEX);
|
|
103
|
+
});
|
|
104
|
+
it('accepts a localAuthSigner whose ECDSA public key matches the commitment', () => {
|
|
105
|
+
const accountCommitment = expectPresent(tryComputeEcdsaCommitmentHex(COMPRESSED_PUBKEY_HEX));
|
|
106
|
+
const delegate = ecdsaDelegate(accountCommitment, COMPRESSED_PUBKEY_HEX);
|
|
107
|
+
const signer = new MidenWalletSigner(ecdsaWallet(PRIVATE_KEY), accountCommitment, 'ecdsa', delegate);
|
|
108
|
+
expect(signer.publicKey).toBe(COMPRESSED_PUBKEY_HEX);
|
|
109
|
+
expect(tryComputeEcdsaCommitmentHex(signer.publicKey)).toBe(accountCommitment);
|
|
110
|
+
});
|
|
111
|
+
it('rejects a localAuthSigner whose ECDSA public key does not match the commitment', () => {
|
|
112
|
+
const accountCommitment = expectPresent(tryComputeEcdsaCommitmentHex(COMPRESSED_PUBKEY_HEX));
|
|
113
|
+
const delegate = ecdsaDelegate(accountCommitment, OTHER_COMPRESSED_PUBKEY_HEX);
|
|
114
|
+
const signer = new MidenWalletSigner(ecdsaWallet(PRIVATE_KEY), accountCommitment, 'ecdsa', delegate);
|
|
115
|
+
expect(() => signer.publicKey).toThrow(/does not match the signer commitment/);
|
|
116
|
+
});
|
|
117
|
+
it('rejects a localAuthSigner whose ECDSA key is a valid length but not a secp256k1 point', () => {
|
|
118
|
+
const accountCommitment = expectPresent(tryComputeEcdsaCommitmentHex(COMPRESSED_PUBKEY_HEX));
|
|
119
|
+
const delegate = ecdsaDelegate(accountCommitment, '0x02' + 'ff'.repeat(32));
|
|
120
|
+
const signer = new MidenWalletSigner(ecdsaWallet(PRIVATE_KEY), accountCommitment, 'ecdsa', delegate);
|
|
121
|
+
expect(() => signer.publicKey).toThrow(/not a valid secp256k1 point/);
|
|
122
|
+
});
|
|
123
|
+
it('resolves the public key through a non-signCommitment path (signLookupMessage)', async () => {
|
|
124
|
+
const accountCommitment = expectPresent(tryComputeEcdsaCommitmentHex(COMPRESSED_PUBKEY_HEX));
|
|
125
|
+
const signer = new MidenWalletSigner(ecdsaWallet(PRIVATE_KEY), accountCommitment, 'ecdsa');
|
|
126
|
+
await signer.signLookupMessage(accountCommitment, 1700000000);
|
|
127
|
+
expect(signer.publicKey).toBe(COMPRESSED_PUBKEY_HEX);
|
|
128
|
+
});
|
|
129
|
+
it('builds a guardian ProposalSignature carrying the recovered key (integration via buildGuardianSignatureFromSigner)', async () => {
|
|
130
|
+
const accountCommitment = expectPresent(tryComputeEcdsaCommitmentHex(COMPRESSED_PUBKEY_HEX));
|
|
131
|
+
const signer = new MidenWalletSigner(ecdsaWallet(PRIVATE_KEY), accountCommitment, 'ecdsa');
|
|
132
|
+
// The exact call the guardian flow makes (multisig/signing.ts): sign the
|
|
133
|
+
// commitment, then read `signer.publicKey` for the ProposalSignature that is sent
|
|
134
|
+
// to the guardian and packed into the transaction advice map. This is the seam
|
|
135
|
+
// where the report observed `publicKey === commitment`.
|
|
136
|
+
const proposalSignature = await buildGuardianSignatureFromSigner(signer, accountCommitment);
|
|
137
|
+
expect(proposalSignature.scheme).toBe('ecdsa');
|
|
138
|
+
if (proposalSignature.scheme !== 'ecdsa')
|
|
139
|
+
throw new Error('expected an ecdsa ProposalSignature');
|
|
140
|
+
// The signature reaching the guardian/kernel must carry the real 33-byte key,
|
|
141
|
+
// not the 32-byte commitment — otherwise Poseidon2(publicKey) == commitment fails.
|
|
142
|
+
const resolvedKey = expectPresent(proposalSignature.publicKey);
|
|
143
|
+
expect(resolvedKey).toBe(COMPRESSED_PUBKEY_HEX);
|
|
144
|
+
expect(resolvedKey).not.toBe(accountCommitment);
|
|
145
|
+
expect(tryComputeEcdsaCommitmentHex(resolvedKey)).toBe(accountCommitment);
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
//# sourceMappingURL=miden-wallet.ecdsa-recovery.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"miden-wallet.ecdsa-recovery.test.js","sourceRoot":"","sources":["../../src/signers/miden-wallet.ecdsa-recovery.test.ts"],"names":[],"mappings":"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"}
|