@openzeppelin/miden-multisig-client 0.17.0-rc.2 → 0.17.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 +172 -47
- package/dist/account/builder.d.ts +2 -2
- package/dist/account/builder.d.ts.map +1 -1
- package/dist/account/builder.js +49 -24
- package/dist/account/builder.js.map +1 -1
- package/dist/connectivity.d.ts +2 -0
- package/dist/connectivity.d.ts.map +1 -1
- package/dist/connectivity.js +7 -4
- package/dist/connectivity.js.map +1 -1
- package/dist/index.d.ts +8 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/dist/multisig/authArgErrors.d.ts +59 -0
- package/dist/multisig/authArgErrors.d.ts.map +1 -0
- package/dist/multisig/authArgErrors.js +115 -0
- package/dist/multisig/authArgErrors.js.map +1 -0
- package/dist/multisig/helpers.d.ts +5 -0
- package/dist/multisig/helpers.d.ts.map +1 -1
- package/dist/multisig/helpers.js +7 -2
- package/dist/multisig/helpers.js.map +1 -1
- package/dist/multisig.d.ts +140 -0
- package/dist/multisig.d.ts.map +1 -1
- package/dist/multisig.js +419 -12
- package/dist/multisig.js.map +1 -1
- package/dist/procedures.d.ts +1 -1
- package/dist/procedures.js +1 -1
- package/dist/recovery/proposalNoteImport.d.ts +173 -0
- package/dist/recovery/proposalNoteImport.d.ts.map +1 -0
- package/dist/recovery/proposalNoteImport.js +411 -0
- package/dist/recovery/proposalNoteImport.js.map +1 -0
- package/dist/recovery/publicNoteBackfill.d.ts +168 -0
- package/dist/recovery/publicNoteBackfill.d.ts.map +1 -0
- package/dist/recovery/publicNoteBackfill.js +368 -0
- package/dist/recovery/publicNoteBackfill.js.map +1 -0
- package/dist/recovery/recoverNotes.d.ts +147 -0
- package/dist/recovery/recoverNotes.d.ts.map +1 -0
- package/dist/recovery/recoverNotes.js +163 -0
- package/dist/recovery/recoverNotes.js.map +1 -0
- package/dist/recovery/transportDrain.d.ts +124 -0
- package/dist/recovery/transportDrain.d.ts.map +1 -0
- package/dist/recovery/transportDrain.js +262 -0
- package/dist/recovery/transportDrain.js.map +1 -0
- package/dist/transaction/consumeNotes.d.ts.map +1 -1
- package/dist/transaction/consumeNotes.js +4 -1
- package/dist/transaction/consumeNotes.js.map +1 -1
- package/dist/transaction/p2id.d.ts.map +1 -1
- package/dist/transaction/p2id.js +4 -1
- package/dist/transaction/p2id.js.map +1 -1
- package/dist/transaction/summary.d.ts +10 -4
- package/dist/transaction/summary.d.ts.map +1 -1
- package/dist/transaction/summary.js +13 -7
- package/dist/transaction/summary.js.map +1 -1
- package/dist/transaction/updateGuardian.js +4 -1
- package/dist/transaction/updateGuardian.js.map +1 -1
- package/dist/transaction/updateProcedureThreshold.js +4 -1
- package/dist/transaction/updateProcedureThreshold.js.map +1 -1
- package/dist/transaction/updateSigners.js +4 -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/package.json +14 -10
- package/src/account/builder.ts +87 -35
- package/src/connectivity.ts +9 -4
- package/src/index.ts +34 -1
- package/src/multisig/authArgErrors.ts +138 -0
- package/src/multisig/helpers.ts +7 -2
- package/src/multisig.ts +513 -20
- package/src/procedures.ts +1 -1
- package/src/recovery/proposalNoteImport.ts +548 -0
- package/src/recovery/publicNoteBackfill.ts +502 -0
- package/src/recovery/recoverNotes.ts +288 -0
- package/src/recovery/transportDrain.ts +330 -0
- package/src/transaction/consumeNotes.ts +4 -1
- package/src/transaction/p2id.ts +4 -1
- package/src/transaction/summary.ts +13 -7
- package/src/transaction/updateGuardian.ts +4 -1
- package/src/transaction/updateProcedureThreshold.ts +4 -1
- package/src/transaction/updateSigners.ts +4 -1
- package/src/transaction.ts +1 -1
- package/dist/account/builder.test.d.ts +0 -2
- package/dist/account/builder.test.d.ts.map +0 -1
- package/dist/account/builder.test.js +0 -166
- package/dist/account/builder.test.js.map +0 -1
- package/dist/account/masm/account-components/auth.d.ts +0 -2
- package/dist/account/masm/account-components/auth.d.ts.map +0 -1
- package/dist/account/masm/account-components/auth.js +0 -46
- package/dist/account/masm/account-components/auth.js.map +0 -1
- package/dist/account/masm/index.d.ts +0 -2
- package/dist/account/masm/index.d.ts.map +0 -1
- package/dist/account/masm/index.js +0 -4
- package/dist/account/masm/index.js.map +0 -1
- package/dist/account/masm.d.ts +0 -2
- package/dist/account/masm.d.ts.map +0 -1
- package/dist/account/masm.js +0 -4
- package/dist/account/masm.js.map +0 -1
- package/dist/account/storage.test.d.ts +0 -2
- package/dist/account/storage.test.d.ts.map +0 -1
- package/dist/account/storage.test.js +0 -73
- package/dist/account/storage.test.js.map +0 -1
- package/dist/client.test.d.ts +0 -2
- package/dist/client.test.d.ts.map +0 -1
- package/dist/client.test.js +0 -380
- package/dist/client.test.js.map +0 -1
- package/dist/connectivity.test.d.ts +0 -2
- package/dist/connectivity.test.d.ts.map +0 -1
- package/dist/connectivity.test.js +0 -61
- package/dist/connectivity.test.js.map +0 -1
- package/dist/inspector.test.d.ts +0 -2
- package/dist/inspector.test.d.ts.map +0 -1
- package/dist/inspector.test.js +0 -425
- package/dist/inspector.test.js.map +0 -1
- package/dist/lookupAuth.test.d.ts +0 -2
- package/dist/lookupAuth.test.d.ts.map +0 -1
- package/dist/lookupAuth.test.js +0 -138
- package/dist/lookupAuth.test.js.map +0 -1
- package/dist/multisig/consumeNotesErrors.test.d.ts +0 -2
- package/dist/multisig/consumeNotesErrors.test.d.ts.map +0 -1
- package/dist/multisig/consumeNotesErrors.test.js +0 -28
- package/dist/multisig/consumeNotesErrors.test.js.map +0 -1
- package/dist/multisig/helpers.test.d.ts +0 -2
- package/dist/multisig/helpers.test.d.ts.map +0 -1
- package/dist/multisig/helpers.test.js +0 -94
- package/dist/multisig/helpers.test.js.map +0 -1
- package/dist/multisig.test.d.ts +0 -2
- package/dist/multisig.test.d.ts.map +0 -1
- package/dist/multisig.test.js +0 -4112
- package/dist/multisig.test.js.map +0 -1
- package/dist/proposal/factory.test.d.ts +0 -2
- package/dist/proposal/factory.test.d.ts.map +0 -1
- package/dist/proposal/factory.test.js +0 -32
- package/dist/proposal/factory.test.js.map +0 -1
- package/dist/proposal/metadata.test.d.ts +0 -2
- package/dist/proposal/metadata.test.d.ts.map +0 -1
- package/dist/proposal/metadata.test.js +0 -193
- package/dist/proposal/metadata.test.js.map +0 -1
- package/dist/prover/config.test.d.ts +0 -2
- package/dist/prover/config.test.d.ts.map +0 -1
- package/dist/prover/config.test.js +0 -54
- package/dist/prover/config.test.js.map +0 -1
- package/dist/prover/errors.test.d.ts +0 -2
- package/dist/prover/errors.test.d.ts.map +0 -1
- package/dist/prover/errors.test.js +0 -29
- package/dist/prover/errors.test.js.map +0 -1
- package/dist/prover/retry.test.d.ts +0 -2
- package/dist/prover/retry.test.d.ts.map +0 -1
- package/dist/prover/retry.test.js +0 -20
- package/dist/prover/retry.test.js.map +0 -1
- package/dist/prover/workflow.test.d.ts +0 -2
- package/dist/prover/workflow.test.d.ts.map +0 -1
- package/dist/prover/workflow.test.js +0 -105
- package/dist/prover/workflow.test.js.map +0 -1
- package/dist/raw-client.test.d.ts +0 -2
- package/dist/raw-client.test.d.ts.map +0 -1
- package/dist/raw-client.test.js +0 -111
- package/dist/raw-client.test.js.map +0 -1
- package/dist/rpc/config.test.d.ts +0 -2
- package/dist/rpc/config.test.d.ts.map +0 -1
- package/dist/rpc/config.test.js +0 -24
- package/dist/rpc/config.test.js.map +0 -1
- package/dist/rpc/errors.test.d.ts +0 -2
- package/dist/rpc/errors.test.d.ts.map +0 -1
- package/dist/rpc/errors.test.js +0 -34
- package/dist/rpc/errors.test.js.map +0 -1
- package/dist/rpc/retry.test.d.ts +0 -2
- package/dist/rpc/retry.test.d.ts.map +0 -1
- package/dist/rpc/retry.test.js +0 -98
- package/dist/rpc/retry.test.js.map +0 -1
- package/dist/signers/ecdsa.test.d.ts +0 -2
- package/dist/signers/ecdsa.test.d.ts.map +0 -1
- package/dist/signers/ecdsa.test.js +0 -88
- package/dist/signers/ecdsa.test.js.map +0 -1
- package/dist/signers/falcon.test.d.ts +0 -2
- package/dist/signers/falcon.test.d.ts.map +0 -1
- package/dist/signers/falcon.test.js +0 -161
- package/dist/signers/falcon.test.js.map +0 -1
- package/dist/signers/miden-wallet.ecdsa-recovery.test.d.ts +0 -2
- package/dist/signers/miden-wallet.ecdsa-recovery.test.d.ts.map +0 -1
- package/dist/signers/miden-wallet.ecdsa-recovery.test.js +0 -148
- package/dist/signers/miden-wallet.ecdsa-recovery.test.js.map +0 -1
- package/dist/signers/miden-wallet.test.d.ts +0 -2
- package/dist/signers/miden-wallet.test.d.ts.map +0 -1
- package/dist/signers/miden-wallet.test.js +0 -164
- package/dist/signers/miden-wallet.test.js.map +0 -1
- package/dist/signers/para.test.d.ts +0 -2
- package/dist/signers/para.test.d.ts.map +0 -1
- package/dist/signers/para.test.js +0 -146
- package/dist/signers/para.test.js.map +0 -1
- package/dist/transaction/index.d.ts +0 -8
- package/dist/transaction/index.d.ts.map +0 -1
- package/dist/transaction/index.js +0 -7
- package/dist/transaction/index.js.map +0 -1
- package/dist/transaction/p2id.test.d.ts +0 -2
- package/dist/transaction/p2id.test.d.ts.map +0 -1
- package/dist/transaction/p2id.test.js +0 -246
- package/dist/transaction/p2id.test.js.map +0 -1
- package/dist/transaction/rpoRandomCoin.test.d.ts +0 -2
- package/dist/transaction/rpoRandomCoin.test.d.ts.map +0 -1
- package/dist/transaction/rpoRandomCoin.test.js +0 -52
- package/dist/transaction/rpoRandomCoin.test.js.map +0 -1
- package/dist/transaction/summary.test.d.ts +0 -2
- package/dist/transaction/summary.test.d.ts.map +0 -1
- package/dist/transaction/summary.test.js +0 -26
- package/dist/transaction/summary.test.js.map +0 -1
- package/dist/transaction.test.d.ts +0 -2
- package/dist/transaction.test.d.ts.map +0 -1
- package/dist/transaction.test.js +0 -122
- package/dist/transaction.test.js.map +0 -1
- package/dist/types/proposal.test.d.ts +0 -2
- package/dist/types/proposal.test.d.ts.map +0 -1
- package/dist/types/proposal.test.js +0 -56
- package/dist/types/proposal.test.js.map +0 -1
- package/dist/utils/digest.test.d.ts +0 -2
- package/dist/utils/digest.test.d.ts.map +0 -1
- package/dist/utils/digest.test.js +0 -48
- package/dist/utils/digest.test.js.map +0 -1
- package/dist/utils/ecdsa.test.d.ts +0 -2
- package/dist/utils/ecdsa.test.d.ts.map +0 -1
- package/dist/utils/ecdsa.test.js +0 -131
- package/dist/utils/ecdsa.test.js.map +0 -1
- package/dist/utils/encoding.test.d.ts +0 -2
- package/dist/utils/encoding.test.d.ts.map +0 -1
- package/dist/utils/encoding.test.js +0 -185
- package/dist/utils/encoding.test.js.map +0 -1
- package/dist/utils/key.test.d.ts +0 -2
- package/dist/utils/key.test.d.ts.map +0 -1
- package/dist/utils/key.test.js +0 -82
- package/dist/utils/key.test.js.map +0 -1
- package/dist/utils/signature.test.d.ts +0 -2
- package/dist/utils/signature.test.d.ts.map +0 -1
- package/dist/utils/signature.test.js +0 -164
- package/dist/utils/signature.test.js.map +0 -1
- package/dist/utils/word.test.d.ts +0 -2
- package/dist/utils/word.test.d.ts.map +0 -1
- package/dist/utils/word.test.js +0 -54
- package/dist/utils/word.test.js.map +0 -1
- package/masm/account_components/auth/guarded_multisig.masm +0 -42
- package/src/account/builder.test.ts +0 -238
- package/src/account/masm/account-components/auth.ts +0 -46
- package/src/account/masm/index.ts +0 -4
- package/src/account/masm.ts +0 -4
- package/src/account/storage.test.ts +0 -90
- package/src/client.test.ts +0 -473
- package/src/connectivity.test.ts +0 -67
- package/src/inspector.test.ts +0 -542
- package/src/lookupAuth.test.ts +0 -185
- package/src/multisig/consumeNotesErrors.test.ts +0 -43
- package/src/multisig/helpers.test.ts +0 -114
- package/src/multisig.test.ts +0 -5008
- package/src/proposal/factory.test.ts +0 -40
- package/src/proposal/metadata.test.ts +0 -235
- package/src/prover/config.test.ts +0 -90
- package/src/prover/errors.test.ts +0 -61
- package/src/prover/retry.test.ts +0 -38
- package/src/prover/workflow.test.ts +0 -145
- package/src/raw-client.test.ts +0 -171
- package/src/rpc/config.test.ts +0 -45
- package/src/rpc/errors.test.ts +0 -69
- package/src/rpc/retry.test.ts +0 -144
- package/src/signers/ecdsa.test.ts +0 -111
- package/src/signers/falcon.test.ts +0 -197
- package/src/signers/miden-wallet.ecdsa-recovery.test.ts +0 -201
- package/src/signers/miden-wallet.test.ts +0 -206
- package/src/signers/para.test.ts +0 -186
- package/src/transaction/index.ts +0 -13
- package/src/transaction/p2id.test.ts +0 -371
- package/src/transaction/rpoRandomCoin.test.ts +0 -64
- package/src/transaction/summary.test.ts +0 -32
- package/src/transaction.test.ts +0 -142
- package/src/types/proposal.test.ts +0 -68
- package/src/utils/digest.test.ts +0 -55
- package/src/utils/ecdsa.test.ts +0 -164
- package/src/utils/encoding.test.ts +0 -233
- package/src/utils/key.test.ts +0 -91
- package/src/utils/signature.test.ts +0 -210
- package/src/utils/word.test.ts +0 -64
package/src/utils/key.test.ts
DELETED
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, vi } from 'vitest';
|
|
2
|
-
import { PublicKeyFormat } from './key.js';
|
|
3
|
-
|
|
4
|
-
vi.mock('@miden-sdk/miden-sdk', () => ({
|
|
5
|
-
Word: class {
|
|
6
|
-
private u64s: BigUint64Array;
|
|
7
|
-
constructor(u64s: BigUint64Array) {
|
|
8
|
-
this.u64s = u64s;
|
|
9
|
-
}
|
|
10
|
-
toHex() {
|
|
11
|
-
const h3 = this.u64s[3].toString(16).padStart(16, '0');
|
|
12
|
-
const h2 = this.u64s[2].toString(16).padStart(16, '0');
|
|
13
|
-
const h1 = this.u64s[1].toString(16).padStart(16, '0');
|
|
14
|
-
const h0 = this.u64s[0].toString(16).padStart(16, '0');
|
|
15
|
-
return '0x' + h3 + h2 + h1 + h0;
|
|
16
|
-
}
|
|
17
|
-
},
|
|
18
|
-
}));
|
|
19
|
-
|
|
20
|
-
vi.mock('./signature.js', () => ({
|
|
21
|
-
ECDSA_AUTH_SCHEME_ID: 1,
|
|
22
|
-
FALCON_AUTH_SCHEME_ID: 2,
|
|
23
|
-
tryComputeCommitmentHex: vi.fn((_hex: string, _scheme: string) => '0x' + 'cc'.repeat(32)),
|
|
24
|
-
}));
|
|
25
|
-
|
|
26
|
-
describe('PublicKeyFormat', () => {
|
|
27
|
-
describe('parse', () => {
|
|
28
|
-
it('should treat 32-byte input as Word commitment with falcon scheme', () => {
|
|
29
|
-
const bytes = new Uint8Array(32);
|
|
30
|
-
bytes[0] = 0x42;
|
|
31
|
-
const result = PublicKeyFormat.parse(bytes);
|
|
32
|
-
expect(result.scheme).toBe('falcon');
|
|
33
|
-
expect(result.commitment).toBe(result.publicKeyHex);
|
|
34
|
-
expect(result.publicKeyHex).toMatch(/^0x[a-f0-9]{64}$/);
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
it('should detect 0x02-prefixed key as falcon', () => {
|
|
38
|
-
const bytes = new Uint8Array(200);
|
|
39
|
-
bytes[0] = 0x02;
|
|
40
|
-
bytes[1] = 0xab;
|
|
41
|
-
const result = PublicKeyFormat.parse(bytes);
|
|
42
|
-
expect(result.scheme).toBe('falcon');
|
|
43
|
-
expect(result.commitment).toBe('0x' + 'cc'.repeat(32));
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
it('should detect 0x01-prefixed 34-byte key as ecdsa', () => {
|
|
47
|
-
const bytes = new Uint8Array(34);
|
|
48
|
-
bytes[0] = 0x01;
|
|
49
|
-
bytes[1] = 0x02;
|
|
50
|
-
const result = PublicKeyFormat.parse(bytes);
|
|
51
|
-
expect(result.scheme).toBe('ecdsa');
|
|
52
|
-
expect(result.commitment).toBe('0x' + 'cc'.repeat(32));
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
it('should detect 33-byte input as ecdsa', () => {
|
|
56
|
-
const bytes = new Uint8Array(33);
|
|
57
|
-
bytes[0] = 0x02;
|
|
58
|
-
const result = PublicKeyFormat.parse(bytes);
|
|
59
|
-
expect(result.scheme).toBe('ecdsa');
|
|
60
|
-
});
|
|
61
|
-
|
|
62
|
-
it('should detect 65-byte input as ecdsa', () => {
|
|
63
|
-
const bytes = new Uint8Array(65);
|
|
64
|
-
bytes[0] = 0x04;
|
|
65
|
-
const result = PublicKeyFormat.parse(bytes);
|
|
66
|
-
expect(result.scheme).toBe('ecdsa');
|
|
67
|
-
});
|
|
68
|
-
|
|
69
|
-
it('should default to falcon for unknown lengths', () => {
|
|
70
|
-
const bytes = new Uint8Array(500);
|
|
71
|
-
const result = PublicKeyFormat.parse(bytes);
|
|
72
|
-
expect(result.scheme).toBe('falcon');
|
|
73
|
-
});
|
|
74
|
-
});
|
|
75
|
-
|
|
76
|
-
describe('wordBytesToHex', () => {
|
|
77
|
-
it('should convert 32 zero bytes to a valid hex string', () => {
|
|
78
|
-
const bytes = new Uint8Array(32);
|
|
79
|
-
const result = PublicKeyFormat.wordBytesToHex(bytes);
|
|
80
|
-
expect(result).toMatch(/^0x[a-f0-9]{64}$/);
|
|
81
|
-
});
|
|
82
|
-
|
|
83
|
-
it('should produce consistent output for same input', () => {
|
|
84
|
-
const bytes = new Uint8Array(32);
|
|
85
|
-
bytes[0] = 0xff;
|
|
86
|
-
const a = PublicKeyFormat.wordBytesToHex(bytes);
|
|
87
|
-
const b = PublicKeyFormat.wordBytesToHex(bytes);
|
|
88
|
-
expect(a).toBe(b);
|
|
89
|
-
});
|
|
90
|
-
});
|
|
91
|
-
});
|
|
@@ -1,210 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
2
|
-
import {
|
|
3
|
-
signatureHexToBytes,
|
|
4
|
-
buildSignatureAdviceEntry,
|
|
5
|
-
mergeSignatureAdviceMaps,
|
|
6
|
-
toWord,
|
|
7
|
-
tryComputeEcdsaCommitmentHex,
|
|
8
|
-
} from './signature.js';
|
|
9
|
-
|
|
10
|
-
// Mock the Miden SDK
|
|
11
|
-
vi.mock('@miden-sdk/miden-sdk', () => ({
|
|
12
|
-
AdviceMap: vi.fn().mockImplementation(() => ({
|
|
13
|
-
insert: vi.fn(),
|
|
14
|
-
})),
|
|
15
|
-
Felt: vi.fn().mockImplementation((v: bigint) => ({ value: v })),
|
|
16
|
-
FeltArray: vi.fn().mockImplementation((arr: any[]) => arr),
|
|
17
|
-
Poseidon2: {
|
|
18
|
-
hashElements: vi.fn().mockReturnValue({
|
|
19
|
-
toHex: () => '0x' + 'h'.repeat(64),
|
|
20
|
-
}),
|
|
21
|
-
},
|
|
22
|
-
Signature: {
|
|
23
|
-
deserialize: vi.fn().mockReturnValue({
|
|
24
|
-
toPreparedSignature: vi.fn().mockReturnValue([1, 2, 3, 4]),
|
|
25
|
-
}),
|
|
26
|
-
},
|
|
27
|
-
Word: {
|
|
28
|
-
fromHex: vi.fn((hex: string) => ({
|
|
29
|
-
toHex: () => hex,
|
|
30
|
-
toFelts: () => [
|
|
31
|
-
{ value: 1n },
|
|
32
|
-
{ value: 2n },
|
|
33
|
-
{ value: 3n },
|
|
34
|
-
{ value: 4n },
|
|
35
|
-
],
|
|
36
|
-
})),
|
|
37
|
-
},
|
|
38
|
-
PublicKey: {
|
|
39
|
-
deserialize: vi.fn().mockReturnValue({
|
|
40
|
-
toCommitment: () => ({ toHex: () => '0x' + 'c'.repeat(64) }),
|
|
41
|
-
}),
|
|
42
|
-
},
|
|
43
|
-
}));
|
|
44
|
-
|
|
45
|
-
describe('signature utilities', () => {
|
|
46
|
-
beforeEach(() => {
|
|
47
|
-
vi.clearAllMocks();
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
describe('signatureHexToBytes', () => {
|
|
51
|
-
it('prepends auth scheme byte (2 = Falcon Poseidon2)', () => {
|
|
52
|
-
const result = signatureHexToBytes('deadbeef');
|
|
53
|
-
expect(result[0]).toBe(2);
|
|
54
|
-
});
|
|
55
|
-
|
|
56
|
-
it('prepends auth scheme byte (1 = ECDSA)', () => {
|
|
57
|
-
const result = signatureHexToBytes('deadbeef', 'ecdsa');
|
|
58
|
-
expect(result[0]).toBe(1);
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
it('converts hex to bytes after prefix', () => {
|
|
62
|
-
const result = signatureHexToBytes('deadbeef');
|
|
63
|
-
expect(result.slice(1)).toEqual(new Uint8Array([0xde, 0xad, 0xbe, 0xef]));
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
it('handles 0x prefix', () => {
|
|
67
|
-
const result = signatureHexToBytes('0xaabbccdd');
|
|
68
|
-
expect(result[0]).toBe(2);
|
|
69
|
-
expect(result.slice(1)).toEqual(new Uint8Array([0xaa, 0xbb, 0xcc, 0xdd]));
|
|
70
|
-
});
|
|
71
|
-
|
|
72
|
-
it('returns correct length (input bytes + 1)', () => {
|
|
73
|
-
const sigHex = 'a'.repeat(128); // 64 bytes
|
|
74
|
-
const result = signatureHexToBytes(sigHex);
|
|
75
|
-
expect(result.length).toBe(65); // 64 bytes + 1 prefix byte
|
|
76
|
-
});
|
|
77
|
-
|
|
78
|
-
it('handles empty signature', () => {
|
|
79
|
-
const result = signatureHexToBytes('');
|
|
80
|
-
expect(result).toEqual(new Uint8Array([2]));
|
|
81
|
-
});
|
|
82
|
-
|
|
83
|
-
it('handles empty with 0x prefix', () => {
|
|
84
|
-
const result = signatureHexToBytes('0x');
|
|
85
|
-
expect(result).toEqual(new Uint8Array([2]));
|
|
86
|
-
});
|
|
87
|
-
});
|
|
88
|
-
|
|
89
|
-
describe('buildSignatureAdviceEntry', () => {
|
|
90
|
-
it('returns key and values', async () => {
|
|
91
|
-
const { Word, Signature } = await import('@miden-sdk/miden-sdk');
|
|
92
|
-
const pubkeyCommitment = Word.fromHex('0x' + 'a'.repeat(64));
|
|
93
|
-
const message = Word.fromHex('0x' + 'b'.repeat(64));
|
|
94
|
-
const signature = Signature.deserialize(new Uint8Array([0, 1, 2, 3]));
|
|
95
|
-
|
|
96
|
-
const { key, values } = buildSignatureAdviceEntry(pubkeyCommitment, message, signature);
|
|
97
|
-
|
|
98
|
-
expect(key).toBeDefined();
|
|
99
|
-
expect(values).toBeDefined();
|
|
100
|
-
});
|
|
101
|
-
|
|
102
|
-
it('hashes pubkey commitment and message to produce key', async () => {
|
|
103
|
-
const { Word, Signature, Poseidon2 } = await import('@miden-sdk/miden-sdk');
|
|
104
|
-
const pubkeyCommitment = Word.fromHex('0x' + 'a'.repeat(64));
|
|
105
|
-
const message = Word.fromHex('0x' + 'b'.repeat(64));
|
|
106
|
-
const signature = Signature.deserialize(new Uint8Array([0, 1, 2, 3]));
|
|
107
|
-
|
|
108
|
-
buildSignatureAdviceEntry(pubkeyCommitment, message, signature);
|
|
109
|
-
|
|
110
|
-
expect(Poseidon2.hashElements).toHaveBeenCalled();
|
|
111
|
-
});
|
|
112
|
-
|
|
113
|
-
it('uses toPreparedSignature to get values', async () => {
|
|
114
|
-
const { Word, Signature } = await import('@miden-sdk/miden-sdk');
|
|
115
|
-
const pubkeyCommitment = Word.fromHex('0x' + 'a'.repeat(64));
|
|
116
|
-
const message = Word.fromHex('0x' + 'b'.repeat(64));
|
|
117
|
-
const signature = Signature.deserialize(new Uint8Array([0, 1, 2, 3]));
|
|
118
|
-
|
|
119
|
-
const { values } = buildSignatureAdviceEntry(pubkeyCommitment, message, signature);
|
|
120
|
-
|
|
121
|
-
expect(signature.toPreparedSignature).toHaveBeenCalledWith(message);
|
|
122
|
-
expect(values).toEqual([1, 2, 3, 4]);
|
|
123
|
-
});
|
|
124
|
-
});
|
|
125
|
-
|
|
126
|
-
describe('mergeSignatureAdviceMaps', () => {
|
|
127
|
-
it('inserts all entries into advice map', async () => {
|
|
128
|
-
const { AdviceMap, Word, Signature } = await import('@miden-sdk/miden-sdk');
|
|
129
|
-
const advice = new AdviceMap();
|
|
130
|
-
|
|
131
|
-
const entries = [
|
|
132
|
-
{
|
|
133
|
-
key: Word.fromHex('0x' + 'a'.repeat(64)),
|
|
134
|
-
values: [{ value: 1n }, { value: 2n }],
|
|
135
|
-
},
|
|
136
|
-
{
|
|
137
|
-
key: Word.fromHex('0x' + 'b'.repeat(64)),
|
|
138
|
-
values: [{ value: 3n }, { value: 4n }],
|
|
139
|
-
},
|
|
140
|
-
];
|
|
141
|
-
|
|
142
|
-
const result = mergeSignatureAdviceMaps(advice, entries as any);
|
|
143
|
-
|
|
144
|
-
expect(advice.insert).toHaveBeenCalledTimes(2);
|
|
145
|
-
expect(result).toBe(advice);
|
|
146
|
-
});
|
|
147
|
-
|
|
148
|
-
it('returns the same advice map', async () => {
|
|
149
|
-
const { AdviceMap } = await import('@miden-sdk/miden-sdk');
|
|
150
|
-
const advice = new AdviceMap();
|
|
151
|
-
|
|
152
|
-
const result = mergeSignatureAdviceMaps(advice, []);
|
|
153
|
-
|
|
154
|
-
expect(result).toBe(advice);
|
|
155
|
-
});
|
|
156
|
-
|
|
157
|
-
it('handles empty entries array', async () => {
|
|
158
|
-
const { AdviceMap } = await import('@miden-sdk/miden-sdk');
|
|
159
|
-
const advice = new AdviceMap();
|
|
160
|
-
|
|
161
|
-
mergeSignatureAdviceMaps(advice, []);
|
|
162
|
-
|
|
163
|
-
expect(advice.insert).not.toHaveBeenCalled();
|
|
164
|
-
});
|
|
165
|
-
});
|
|
166
|
-
|
|
167
|
-
describe('toWord', () => {
|
|
168
|
-
it('creates Word from hex string', async () => {
|
|
169
|
-
const { Word } = await import('@miden-sdk/miden-sdk');
|
|
170
|
-
|
|
171
|
-
const word = toWord('abc123');
|
|
172
|
-
|
|
173
|
-
expect(Word.fromHex).toHaveBeenCalled();
|
|
174
|
-
expect(word).toBeDefined();
|
|
175
|
-
});
|
|
176
|
-
|
|
177
|
-
it('normalizes hex before creating Word', async () => {
|
|
178
|
-
const { Word } = await import('@miden-sdk/miden-sdk');
|
|
179
|
-
|
|
180
|
-
toWord('abc');
|
|
181
|
-
|
|
182
|
-
// Should be called with normalized hex (0x + padded to 64 chars)
|
|
183
|
-
expect(Word.fromHex).toHaveBeenCalledWith('0x' + '0'.repeat(61) + 'abc');
|
|
184
|
-
});
|
|
185
|
-
|
|
186
|
-
it('handles 0x prefix', async () => {
|
|
187
|
-
const { Word } = await import('@miden-sdk/miden-sdk');
|
|
188
|
-
|
|
189
|
-
toWord('0xdef');
|
|
190
|
-
|
|
191
|
-
expect(Word.fromHex).toHaveBeenCalledWith('0x' + '0'.repeat(61) + 'def');
|
|
192
|
-
});
|
|
193
|
-
|
|
194
|
-
it('handles full 64-char hex', async () => {
|
|
195
|
-
const { Word } = await import('@miden-sdk/miden-sdk');
|
|
196
|
-
const fullHex = 'f'.repeat(64);
|
|
197
|
-
|
|
198
|
-
toWord(fullHex);
|
|
199
|
-
|
|
200
|
-
expect(Word.fromHex).toHaveBeenCalledWith('0x' + fullHex);
|
|
201
|
-
});
|
|
202
|
-
});
|
|
203
|
-
|
|
204
|
-
describe('tryComputeEcdsaCommitmentHex', () => {
|
|
205
|
-
it('returns normalized commitment when SDK supports ECDSA public keys', () => {
|
|
206
|
-
const commitment = tryComputeEcdsaCommitmentHex('0x' + 'aa'.repeat(33));
|
|
207
|
-
expect(commitment).toBe('0x' + 'c'.repeat(64));
|
|
208
|
-
});
|
|
209
|
-
});
|
|
210
|
-
});
|
package/src/utils/word.test.ts
DELETED
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, vi } from 'vitest';
|
|
2
|
-
import { wordElementToBigInt, wordToHex } from './word.js';
|
|
3
|
-
import { Word } from '@miden-sdk/miden-sdk';
|
|
4
|
-
|
|
5
|
-
// Mock the Miden SDK Word class
|
|
6
|
-
vi.mock('@miden-sdk/miden-sdk', () => ({
|
|
7
|
-
Word: {
|
|
8
|
-
fromHex: (hex: string): { toU64s: () => BigUint64Array; toHex: () => string } => {
|
|
9
|
-
// Parse hex string (remove 0x prefix if present)
|
|
10
|
-
const cleanHex = hex.startsWith('0x') ? hex.slice(2) : hex;
|
|
11
|
-
if (cleanHex.length !== 64) {
|
|
12
|
-
throw new Error('Hex string must be 64 characters');
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
// Parse as big-endian: [e3_bytes][e2_bytes][e1_bytes][e0_bytes]
|
|
16
|
-
const e3 = BigInt('0x' + cleanHex.slice(0, 16));
|
|
17
|
-
const e2 = BigInt('0x' + cleanHex.slice(16, 32));
|
|
18
|
-
const e1 = BigInt('0x' + cleanHex.slice(32, 48));
|
|
19
|
-
const e0 = BigInt('0x' + cleanHex.slice(48, 64));
|
|
20
|
-
|
|
21
|
-
const elements = new BigUint64Array([e0, e1, e2, e3]);
|
|
22
|
-
|
|
23
|
-
return {
|
|
24
|
-
toU64s: () => elements,
|
|
25
|
-
toHex: () => {
|
|
26
|
-
const h3 = elements[3].toString(16).padStart(16, '0');
|
|
27
|
-
const h2 = elements[2].toString(16).padStart(16, '0');
|
|
28
|
-
const h1 = elements[1].toString(16).padStart(16, '0');
|
|
29
|
-
const h0 = elements[0].toString(16).padStart(16, '0');
|
|
30
|
-
return '0x' + h3 + h2 + h1 + h0;
|
|
31
|
-
},
|
|
32
|
-
};
|
|
33
|
-
},
|
|
34
|
-
},
|
|
35
|
-
}));
|
|
36
|
-
|
|
37
|
-
describe('word utilities', () => {
|
|
38
|
-
describe('wordElementToBigInt', () => {
|
|
39
|
-
it('should return element at valid index', () => {
|
|
40
|
-
const word = Word.fromHex(
|
|
41
|
-
'0x016ab79593165e5b849776919e0c0298fb9dac880d593d93edd7134bdcdb4b6f'
|
|
42
|
-
);
|
|
43
|
-
expect(wordElementToBigInt(word as Word, 0)).toBe(BigInt('0xedd7134bdcdb4b6f'));
|
|
44
|
-
expect(wordElementToBigInt(word as Word, 3)).toBe(BigInt('0x016ab79593165e5b'));
|
|
45
|
-
});
|
|
46
|
-
|
|
47
|
-
it('should return 0n for invalid index', () => {
|
|
48
|
-
const word = Word.fromHex(
|
|
49
|
-
'0x016ab79593165e5b849776919e0c0298fb9dac880d593d93edd7134bdcdb4b6f'
|
|
50
|
-
);
|
|
51
|
-
expect(wordElementToBigInt(word as Word, -1)).toBe(0n);
|
|
52
|
-
expect(wordElementToBigInt(word as Word, 4)).toBe(0n);
|
|
53
|
-
});
|
|
54
|
-
});
|
|
55
|
-
|
|
56
|
-
describe('wordToHex', () => {
|
|
57
|
-
it('should convert word back to hex string', () => {
|
|
58
|
-
const originalHex = '0xd6c130dba13c67ac4733915f24bea9d19f517f51a65c74ded7bcd27e066b400e';
|
|
59
|
-
const word = Word.fromHex(originalHex);
|
|
60
|
-
const hex = wordToHex(word as Word);
|
|
61
|
-
expect(hex).toBe(originalHex);
|
|
62
|
-
});
|
|
63
|
-
});
|
|
64
|
-
});
|