@openzeppelin/miden-multisig-client 0.12.8 → 0.13.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 +42 -4
- package/dist/account/builder.d.ts +1 -1
- package/dist/account/builder.d.ts.map +1 -1
- package/dist/account/builder.js +7 -5
- package/dist/account/builder.js.map +1 -1
- package/dist/account/builder.test.d.ts +2 -0
- package/dist/account/builder.test.d.ts.map +1 -0
- package/dist/account/builder.test.js +39 -0
- package/dist/account/builder.test.js.map +1 -0
- package/dist/account/masm.d.ts +3 -3
- package/dist/account/masm.d.ts.map +1 -1
- package/dist/account/masm.js +101 -98
- package/dist/account/masm.js.map +1 -1
- package/dist/account/storage.d.ts +1 -1
- package/dist/account/storage.d.ts.map +1 -1
- package/dist/account/storage.js +17 -7
- package/dist/account/storage.js.map +1 -1
- package/dist/client.d.ts +1 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +2 -2
- package/dist/client.js.map +1 -1
- package/dist/client.test.js +4 -4
- package/dist/client.test.js.map +1 -1
- package/dist/index.d.ts +8 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -1
- package/dist/index.js.map +1 -1
- package/dist/inspector.d.ts +1 -1
- package/dist/inspector.d.ts.map +1 -1
- package/dist/inspector.js +16 -10
- package/dist/inspector.js.map +1 -1
- package/dist/inspector.test.js +33 -22
- package/dist/inspector.test.js.map +1 -1
- package/dist/multisig/helpers.d.ts +1 -1
- package/dist/multisig/helpers.d.ts.map +1 -1
- package/dist/multisig/helpers.js +1 -1
- package/dist/multisig/helpers.js.map +1 -1
- package/dist/multisig/helpers.test.js +2 -2
- package/dist/multisig/helpers.test.js.map +1 -1
- package/dist/multisig/proposal/execution.d.ts +19 -0
- package/dist/multisig/proposal/execution.d.ts.map +1 -0
- package/dist/multisig/proposal/execution.js +158 -0
- package/dist/multisig/proposal/execution.js.map +1 -0
- package/dist/multisig/proposal/parser.d.ts +17 -0
- package/dist/multisig/proposal/parser.d.ts.map +1 -0
- package/dist/multisig/proposal/parser.js +147 -0
- package/dist/multisig/proposal/parser.js.map +1 -0
- package/dist/multisig/signing.d.ts +5 -0
- package/dist/multisig/signing.d.ts.map +1 -0
- package/dist/multisig/signing.js +14 -0
- package/dist/multisig/signing.js.map +1 -0
- package/dist/multisig.d.ts +10 -13
- package/dist/multisig.d.ts.map +1 -1
- package/dist/multisig.js +128 -337
- package/dist/multisig.js.map +1 -1
- package/dist/multisig.test.js +8 -4
- package/dist/multisig.test.js.map +1 -1
- package/dist/proposal/exported.d.ts +12 -0
- package/dist/proposal/exported.d.ts.map +1 -0
- package/dist/proposal/exported.js +88 -0
- package/dist/proposal/exported.js.map +1 -0
- package/dist/proposal/metadata.d.ts +15 -0
- package/dist/proposal/metadata.d.ts.map +1 -0
- package/dist/proposal/metadata.js +212 -0
- package/dist/proposal/metadata.js.map +1 -0
- package/dist/signer.d.ts +2 -20
- package/dist/signer.d.ts.map +1 -1
- package/dist/signer.js +2 -82
- package/dist/signer.js.map +1 -1
- package/dist/signer.test.js +22 -16
- package/dist/signer.test.js.map +1 -1
- package/dist/signers/ecdsa.d.ts +12 -0
- package/dist/signers/ecdsa.d.ts.map +1 -0
- package/dist/signers/ecdsa.js +30 -0
- package/dist/signers/ecdsa.js.map +1 -0
- package/dist/signers/falcon.d.ts +12 -0
- package/dist/signers/falcon.d.ts.map +1 -0
- package/dist/signers/falcon.js +31 -0
- package/dist/signers/falcon.js.map +1 -0
- package/dist/signers/falcon.test.d.ts +2 -0
- package/dist/signers/falcon.test.d.ts.map +1 -0
- package/dist/signers/falcon.test.js +113 -0
- package/dist/signers/falcon.test.js.map +1 -0
- package/dist/signers/index.d.ts +5 -0
- package/dist/signers/index.d.ts.map +1 -0
- package/dist/signers/index.js +5 -0
- package/dist/signers/index.js.map +1 -0
- package/dist/signers/miden-wallet.d.ts +16 -0
- package/dist/signers/miden-wallet.d.ts.map +1 -0
- package/dist/signers/miden-wallet.js +35 -0
- package/dist/signers/miden-wallet.js.map +1 -0
- package/dist/signers/miden-wallet.test.d.ts +2 -0
- package/dist/signers/miden-wallet.test.d.ts.map +1 -0
- package/dist/signers/miden-wallet.test.js +107 -0
- package/dist/signers/miden-wallet.test.js.map +1 -0
- package/dist/signers/para.d.ts +21 -0
- package/dist/signers/para.d.ts.map +1 -0
- package/dist/signers/para.js +43 -0
- package/dist/signers/para.js.map +1 -0
- package/dist/signers/para.test.d.ts +2 -0
- package/dist/signers/para.test.d.ts.map +1 -0
- package/dist/signers/para.test.js +88 -0
- package/dist/signers/para.test.js.map +1 -0
- package/dist/transaction/consumeNotes.d.ts +3 -3
- package/dist/transaction/consumeNotes.d.ts.map +1 -1
- package/dist/transaction/consumeNotes.js +11 -7
- package/dist/transaction/consumeNotes.js.map +1 -1
- package/dist/transaction/options.d.ts +2 -2
- package/dist/transaction/options.d.ts.map +1 -1
- package/dist/transaction/p2id.d.ts +1 -1
- package/dist/transaction/p2id.d.ts.map +1 -1
- package/dist/transaction/p2id.interop.test.d.ts +2 -0
- package/dist/transaction/p2id.interop.test.d.ts.map +1 -0
- package/dist/transaction/p2id.interop.test.js +36 -0
- package/dist/transaction/p2id.interop.test.js.map +1 -0
- package/dist/transaction/p2id.js +5 -5
- package/dist/transaction/p2id.js.map +1 -1
- package/dist/transaction/p2id.test.d.ts +2 -0
- package/dist/transaction/p2id.test.d.ts.map +1 -0
- package/dist/transaction/p2id.test.js +138 -0
- package/dist/transaction/p2id.test.js.map +1 -0
- package/dist/transaction/rpoRandomCoin.d.ts +7 -0
- package/dist/transaction/rpoRandomCoin.d.ts.map +1 -0
- package/dist/transaction/rpoRandomCoin.js +17 -0
- package/dist/transaction/rpoRandomCoin.js.map +1 -0
- package/dist/transaction/rpoRandomCoin.test.d.ts +2 -0
- package/dist/transaction/rpoRandomCoin.test.d.ts.map +1 -0
- package/dist/transaction/rpoRandomCoin.test.js +52 -0
- package/dist/transaction/rpoRandomCoin.test.js.map +1 -0
- package/dist/transaction/summary.d.ts +1 -1
- package/dist/transaction/summary.d.ts.map +1 -1
- package/dist/transaction/summary.js +1 -1
- package/dist/transaction/summary.js.map +1 -1
- package/dist/transaction/updatePsm.d.ts +1 -1
- package/dist/transaction/updatePsm.d.ts.map +1 -1
- package/dist/transaction/updatePsm.js +5 -5
- package/dist/transaction/updatePsm.js.map +1 -1
- package/dist/transaction/updateSigners.d.ts +1 -1
- package/dist/transaction/updateSigners.d.ts.map +1 -1
- package/dist/transaction/updateSigners.js +5 -5
- package/dist/transaction/updateSigners.js.map +1 -1
- package/dist/transaction.test.js +1 -1
- package/dist/transaction.test.js.map +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/digest.d.ts +6 -0
- package/dist/utils/digest.d.ts.map +1 -0
- package/dist/utils/digest.js +22 -0
- package/dist/utils/digest.js.map +1 -0
- package/dist/utils/ecdsa.d.ts +8 -0
- package/dist/utils/ecdsa.d.ts.map +1 -0
- package/dist/utils/ecdsa.js +60 -0
- package/dist/utils/ecdsa.js.map +1 -0
- package/dist/utils/ecdsa.test.d.ts +2 -0
- package/dist/utils/ecdsa.test.d.ts.map +1 -0
- package/dist/utils/ecdsa.test.js +85 -0
- package/dist/utils/ecdsa.test.js.map +1 -0
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/key.d.ts +10 -0
- package/dist/utils/key.d.ts.map +1 -0
- package/dist/utils/key.js +38 -0
- package/dist/utils/key.js.map +1 -0
- package/dist/utils/key.test.d.ts +2 -0
- package/dist/utils/key.test.d.ts.map +1 -0
- package/dist/utils/key.test.js +80 -0
- package/dist/utils/key.test.js.map +1 -0
- package/dist/utils/random.d.ts +1 -1
- package/dist/utils/random.d.ts.map +1 -1
- package/dist/utils/random.js +1 -1
- package/dist/utils/random.js.map +1 -1
- package/dist/utils/signature.d.ts +2 -1
- package/dist/utils/signature.d.ts.map +1 -1
- package/dist/utils/signature.js +6 -3
- package/dist/utils/signature.js.map +1 -1
- package/dist/utils/signature.test.js +11 -11
- package/dist/utils/signature.test.js.map +1 -1
- package/dist/utils/state-validation.d.ts +5 -0
- package/dist/utils/state-validation.d.ts.map +1 -0
- package/dist/utils/state-validation.js +30 -0
- package/dist/utils/state-validation.js.map +1 -0
- package/dist/utils/validation.d.ts +6 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +52 -0
- package/dist/utils/validation.js.map +1 -0
- package/dist/utils/word.d.ts +6 -1
- package/dist/utils/word.d.ts.map +1 -1
- package/dist/utils/word.js +11 -0
- package/dist/utils/word.js.map +1 -1
- package/dist/utils/word.test.js +54 -3
- package/dist/utils/word.test.js.map +1 -1
- package/package.json +4 -5
- package/src/account/builder.ts +7 -5
- package/src/account/masm.ts +103 -99
- package/src/account/storage.ts +19 -7
- package/src/client.test.ts +4 -4
- package/src/client.ts +3 -3
- package/src/index.ts +8 -1
- package/src/inspector.test.ts +38 -25
- package/src/inspector.ts +18 -10
- package/src/multisig/helpers.test.ts +2 -2
- package/src/multisig/helpers.ts +2 -1
- package/src/multisig/proposal/execution.ts +364 -0
- package/src/multisig/proposal/parser.ts +191 -0
- package/src/multisig/signing.ts +24 -0
- package/src/multisig.test.ts +8 -4
- package/src/multisig.ts +176 -434
- package/src/signer.ts +2 -95
- package/src/signers/ecdsa.ts +35 -0
- package/src/{signer.test.ts → signers/falcon.test.ts} +29 -33
- package/src/signers/falcon.ts +36 -0
- package/src/signers/index.ts +4 -0
- package/src/signers/miden-wallet.test.ts +119 -0
- package/src/signers/miden-wallet.ts +49 -0
- package/src/signers/para.test.ts +103 -0
- package/src/signers/para.ts +60 -0
- package/src/transaction/consumeNotes.ts +14 -10
- package/src/transaction/options.ts +2 -2
- package/src/transaction/p2id.ts +3 -8
- package/src/transaction/summary.ts +2 -2
- package/src/transaction/updatePsm.ts +5 -6
- package/src/transaction/updateSigners.ts +5 -6
- package/src/transaction.test.ts +1 -1
- package/src/types.ts +1 -1
- package/src/utils/digest.ts +25 -0
- package/src/utils/ecdsa.test.ts +104 -0
- package/src/utils/ecdsa.ts +77 -0
- package/src/utils/index.ts +1 -0
- package/src/utils/key.test.ts +89 -0
- package/src/utils/key.ts +49 -0
- package/src/utils/random.ts +1 -1
- package/src/utils/signature.test.ts +11 -11
- package/src/utils/signature.ts +10 -3
- package/src/utils/word.test.ts +57 -3
- package/src/utils/word.ts +13 -1
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
2
|
+
import { FalconSigner } from './falcon.js';
|
|
3
|
+
vi.mock('@miden-sdk/miden-sdk', () => {
|
|
4
|
+
const mockSignature = {
|
|
5
|
+
serialize: () => new Uint8Array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]),
|
|
6
|
+
};
|
|
7
|
+
const mockPublicKey = {
|
|
8
|
+
toCommitment: () => ({
|
|
9
|
+
toHex: () => '0x' + 'a'.repeat(64),
|
|
10
|
+
}),
|
|
11
|
+
serialize: () => new Uint8Array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]),
|
|
12
|
+
};
|
|
13
|
+
const mockSecretKey = {
|
|
14
|
+
publicKey: vi.fn().mockReturnValue(mockPublicKey),
|
|
15
|
+
sign: vi.fn().mockReturnValue(mockSignature),
|
|
16
|
+
};
|
|
17
|
+
return {
|
|
18
|
+
AuthSecretKey: {
|
|
19
|
+
rpoFalconWithRNG: vi.fn().mockReturnValue(mockSecretKey),
|
|
20
|
+
},
|
|
21
|
+
Word: {
|
|
22
|
+
fromHex: vi.fn((hex) => ({
|
|
23
|
+
toHex: () => hex,
|
|
24
|
+
toFelts: () => [1, 2, 3, 4],
|
|
25
|
+
})),
|
|
26
|
+
},
|
|
27
|
+
AccountId: {
|
|
28
|
+
fromHex: vi.fn((hex) => ({
|
|
29
|
+
prefix: () => ({ asInt: () => BigInt(1) }),
|
|
30
|
+
suffix: () => ({ asInt: () => BigInt(2) }),
|
|
31
|
+
})),
|
|
32
|
+
},
|
|
33
|
+
Felt: vi.fn().mockImplementation((v) => ({ value: v })),
|
|
34
|
+
FeltArray: vi.fn().mockImplementation((arr) => arr),
|
|
35
|
+
Rpo256: {
|
|
36
|
+
hashElements: vi.fn().mockReturnValue({
|
|
37
|
+
toHex: () => '0x' + 'b'.repeat(64),
|
|
38
|
+
}),
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
});
|
|
42
|
+
describe('FalconSigner', () => {
|
|
43
|
+
let mockSecretKey;
|
|
44
|
+
let signer;
|
|
45
|
+
beforeEach(async () => {
|
|
46
|
+
vi.clearAllMocks();
|
|
47
|
+
const { AuthSecretKey } = await import('@miden-sdk/miden-sdk');
|
|
48
|
+
mockSecretKey = AuthSecretKey.rpoFalconWithRNG(new Uint8Array(32));
|
|
49
|
+
signer = new FalconSigner(mockSecretKey);
|
|
50
|
+
});
|
|
51
|
+
describe('constructor', () => {
|
|
52
|
+
it('extracts commitment from public key', () => {
|
|
53
|
+
expect(signer.commitment).toBe('0x' + 'a'.repeat(64));
|
|
54
|
+
});
|
|
55
|
+
it('extracts public key without first byte', () => {
|
|
56
|
+
expect(signer.publicKey).toBe('0x0102030405060708090a0b0c0d0e0f');
|
|
57
|
+
});
|
|
58
|
+
it('calls publicKey method on secret key', () => {
|
|
59
|
+
expect(mockSecretKey.publicKey).toHaveBeenCalled();
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
describe('signAccountIdWithTimestamp', () => {
|
|
63
|
+
it('handles account ID with 0x prefix', async () => {
|
|
64
|
+
const signature = await signer.signAccountIdWithTimestamp('0x' + 'a'.repeat(30), 1700000000);
|
|
65
|
+
expect(signature).toMatch(/^0x[a-f0-9]+$/);
|
|
66
|
+
});
|
|
67
|
+
it('handles account ID without 0x prefix', async () => {
|
|
68
|
+
const signature = await signer.signAccountIdWithTimestamp('a'.repeat(30), 1700000000);
|
|
69
|
+
expect(signature).toMatch(/^0x[a-f0-9]+$/);
|
|
70
|
+
});
|
|
71
|
+
it('calls sign method with hashed digest', async () => {
|
|
72
|
+
await signer.signAccountIdWithTimestamp('0x' + 'a'.repeat(30), 1700000000);
|
|
73
|
+
expect(mockSecretKey.sign).toHaveBeenCalled();
|
|
74
|
+
});
|
|
75
|
+
it('returns signature without first byte', async () => {
|
|
76
|
+
const signature = await signer.signAccountIdWithTimestamp('0x' + 'a'.repeat(30), 1700000000);
|
|
77
|
+
expect(signature).toBe('0x010203040506070809');
|
|
78
|
+
});
|
|
79
|
+
it('includes timestamp in signed payload', async () => {
|
|
80
|
+
const { Felt, FeltArray } = await import('@miden-sdk/miden-sdk');
|
|
81
|
+
await signer.signAccountIdWithTimestamp('0x' + 'a'.repeat(30), 1700000000);
|
|
82
|
+
expect(FeltArray).toHaveBeenCalledWith(expect.arrayContaining([
|
|
83
|
+
expect.anything(),
|
|
84
|
+
expect.anything(),
|
|
85
|
+
expect.anything(),
|
|
86
|
+
expect.anything(),
|
|
87
|
+
]));
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
describe('signCommitment', () => {
|
|
91
|
+
it('handles commitment with 0x prefix', async () => {
|
|
92
|
+
const signature = await signer.signCommitment('0x' + 'c'.repeat(64));
|
|
93
|
+
expect(signature).toMatch(/^0x[a-f0-9]+$/);
|
|
94
|
+
});
|
|
95
|
+
it('handles commitment without 0x prefix', async () => {
|
|
96
|
+
const signature = await signer.signCommitment('c'.repeat(64));
|
|
97
|
+
expect(signature).toMatch(/^0x[a-f0-9]+$/);
|
|
98
|
+
});
|
|
99
|
+
it('pads short commitment hex to 64 characters', async () => {
|
|
100
|
+
const signature = await signer.signCommitment('abc');
|
|
101
|
+
expect(signature).toMatch(/^0x[a-f0-9]+$/);
|
|
102
|
+
});
|
|
103
|
+
it('calls sign method with word from hex', async () => {
|
|
104
|
+
await signer.signCommitment('0x' + 'c'.repeat(64));
|
|
105
|
+
expect(mockSecretKey.sign).toHaveBeenCalled();
|
|
106
|
+
});
|
|
107
|
+
it('returns signature without first byte', async () => {
|
|
108
|
+
const signature = await signer.signCommitment('0x' + 'c'.repeat(64));
|
|
109
|
+
expect(signature).toBe('0x010203040506070809');
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
//# sourceMappingURL=falcon.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"falcon.test.js","sourceRoot":"","sources":["../../src/signers/falcon.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { FalconSigner } from './falcon.js';
|
|
2
|
+
export { EcdsaSigner } from './ecdsa.js';
|
|
3
|
+
export { ParaSigner, type ParaSigningContext } from './para.js';
|
|
4
|
+
export { MidenWalletSigner, type WalletSigningContext } from './miden-wallet.js';
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/signers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,KAAK,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,KAAK,oBAAoB,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/signers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,UAAU,EAA2B,MAAM,WAAW,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAA6B,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Signer, SignatureScheme } from '../types.js';
|
|
2
|
+
export interface WalletSigningContext {
|
|
3
|
+
signBytes(data: Uint8Array, kind: 'word' | 'signingInputs'): Promise<Uint8Array>;
|
|
4
|
+
}
|
|
5
|
+
export declare class MidenWalletSigner implements Signer {
|
|
6
|
+
readonly commitment: string;
|
|
7
|
+
readonly publicKey: string;
|
|
8
|
+
readonly scheme: SignatureScheme;
|
|
9
|
+
private readonly wallet;
|
|
10
|
+
private readonly localAuthSigner;
|
|
11
|
+
constructor(wallet: WalletSigningContext, commitment: string, scheme: SignatureScheme, localAuthSigner?: Signer);
|
|
12
|
+
signAccountIdWithTimestamp(accountId: string, timestamp: number): Promise<string>;
|
|
13
|
+
signCommitment(commitmentHex: string): Promise<string>;
|
|
14
|
+
private signWord;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=miden-wallet.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"miden-wallet.d.ts","sourceRoot":"","sources":["../../src/signers/miden-wallet.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAK3D,MAAM,WAAW,oBAAoB;IACnC,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,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;IACjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuB;IAC9C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAgB;gBAG9C,MAAM,EAAE,oBAAoB,EAC5B,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,eAAe,EACvB,eAAe,CAAC,EAAE,MAAM;IASpB,0BAA0B,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAQjF,cAAc,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YAK9C,QAAQ;CAMvB"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { AuthDigest } from '../utils/digest.js';
|
|
2
|
+
import { bytesToHex } from '../utils/encoding.js';
|
|
3
|
+
import { wordToBytes } from '../utils/word.js';
|
|
4
|
+
export class MidenWalletSigner {
|
|
5
|
+
commitment;
|
|
6
|
+
publicKey;
|
|
7
|
+
scheme;
|
|
8
|
+
wallet;
|
|
9
|
+
localAuthSigner;
|
|
10
|
+
constructor(wallet, commitment, scheme, localAuthSigner) {
|
|
11
|
+
this.wallet = wallet;
|
|
12
|
+
this.commitment = commitment;
|
|
13
|
+
this.scheme = scheme;
|
|
14
|
+
this.localAuthSigner = localAuthSigner ?? null;
|
|
15
|
+
this.publicKey = localAuthSigner?.publicKey ?? commitment;
|
|
16
|
+
}
|
|
17
|
+
async signAccountIdWithTimestamp(accountId, timestamp) {
|
|
18
|
+
if (this.localAuthSigner) {
|
|
19
|
+
return this.localAuthSigner.signAccountIdWithTimestamp(accountId, timestamp);
|
|
20
|
+
}
|
|
21
|
+
const word = AuthDigest.fromAccountIdWithTimestamp(accountId, timestamp);
|
|
22
|
+
return this.signWord(word);
|
|
23
|
+
}
|
|
24
|
+
async signCommitment(commitmentHex) {
|
|
25
|
+
const word = AuthDigest.fromCommitmentHex(commitmentHex);
|
|
26
|
+
return this.signWord(word);
|
|
27
|
+
}
|
|
28
|
+
async signWord(word) {
|
|
29
|
+
const bytes = wordToBytes(word);
|
|
30
|
+
const signatureBytes = await this.wallet.signBytes(bytes, 'word');
|
|
31
|
+
const rawSignature = signatureBytes.slice(1);
|
|
32
|
+
return bytesToHex(rawSignature);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=miden-wallet.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"miden-wallet.js","sourceRoot":"","sources":["../../src/signers/miden-wallet.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAM/C,MAAM,OAAO,iBAAiB;IACnB,UAAU,CAAS;IACnB,SAAS,CAAS;IAClB,MAAM,CAAkB;IAChB,MAAM,CAAuB;IAC7B,eAAe,CAAgB;IAEhD,YACE,MAA4B,EAC5B,UAAkB,EAClB,MAAuB,EACvB,eAAwB;QAExB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,eAAe,GAAG,eAAe,IAAI,IAAI,CAAC;QAC/C,IAAI,CAAC,SAAS,GAAG,eAAe,EAAE,SAAS,IAAI,UAAU,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,0BAA0B,CAAC,SAAiB,EAAE,SAAiB;QACnE,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,OAAO,IAAI,CAAC,eAAe,CAAC,0BAA0B,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAC/E,CAAC;QACD,MAAM,IAAI,GAAG,UAAU,CAAC,0BAA0B,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QACzE,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,aAAqB;QACxC,MAAM,IAAI,GAAG,UAAU,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC;QACzD,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IAEO,KAAK,CAAC,QAAQ,CAAC,IAAuD;QAC5E,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAClE,MAAM,YAAY,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC7C,OAAO,UAAU,CAAC,YAAY,CAAC,CAAC;IAClC,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"miden-wallet.test.d.ts","sourceRoot":"","sources":["../../src/signers/miden-wallet.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
2
|
+
import { MidenWalletSigner } from './miden-wallet.js';
|
|
3
|
+
vi.mock('@miden-sdk/miden-sdk', () => ({
|
|
4
|
+
Word: {
|
|
5
|
+
fromHex: vi.fn((hex) => ({
|
|
6
|
+
toHex: () => hex,
|
|
7
|
+
toFelts: () => [
|
|
8
|
+
{ asInt: () => 1n },
|
|
9
|
+
{ asInt: () => 2n },
|
|
10
|
+
{ asInt: () => 3n },
|
|
11
|
+
{ asInt: () => 4n },
|
|
12
|
+
],
|
|
13
|
+
})),
|
|
14
|
+
},
|
|
15
|
+
AccountId: {
|
|
16
|
+
fromHex: vi.fn(() => ({
|
|
17
|
+
prefix: () => ({ asInt: () => BigInt(1) }),
|
|
18
|
+
suffix: () => ({ asInt: () => BigInt(2) }),
|
|
19
|
+
})),
|
|
20
|
+
},
|
|
21
|
+
Felt: vi.fn().mockImplementation((v) => ({ value: v })),
|
|
22
|
+
FeltArray: vi.fn().mockImplementation((arr) => arr),
|
|
23
|
+
Rpo256: {
|
|
24
|
+
hashElements: vi.fn().mockReturnValue({
|
|
25
|
+
toHex: () => '0x' + 'bb'.repeat(32),
|
|
26
|
+
toFelts: () => [
|
|
27
|
+
{ asInt: () => 10n },
|
|
28
|
+
{ asInt: () => 20n },
|
|
29
|
+
{ asInt: () => 30n },
|
|
30
|
+
{ asInt: () => 40n },
|
|
31
|
+
],
|
|
32
|
+
}),
|
|
33
|
+
},
|
|
34
|
+
}));
|
|
35
|
+
describe('MidenWalletSigner', () => {
|
|
36
|
+
let mockWallet;
|
|
37
|
+
beforeEach(() => {
|
|
38
|
+
vi.clearAllMocks();
|
|
39
|
+
mockWallet = {
|
|
40
|
+
signBytes: vi.fn().mockResolvedValue(new Uint8Array([0x00, 0x01, 0x02, 0x03, 0x04])),
|
|
41
|
+
};
|
|
42
|
+
});
|
|
43
|
+
describe('constructor', () => {
|
|
44
|
+
it('should set commitment, scheme, and publicKey', () => {
|
|
45
|
+
const signer = new MidenWalletSigner(mockWallet, '0xcommitment', 'falcon');
|
|
46
|
+
expect(signer.commitment).toBe('0xcommitment');
|
|
47
|
+
expect(signer.scheme).toBe('falcon');
|
|
48
|
+
expect(signer.publicKey).toBe('0xcommitment');
|
|
49
|
+
});
|
|
50
|
+
it('should use localAuthSigner publicKey when provided', () => {
|
|
51
|
+
const localSigner = {
|
|
52
|
+
commitment: '0xlocal',
|
|
53
|
+
publicKey: '0xlocalpubkey',
|
|
54
|
+
scheme: 'ecdsa',
|
|
55
|
+
signAccountIdWithTimestamp: vi.fn(),
|
|
56
|
+
signCommitment: vi.fn(),
|
|
57
|
+
};
|
|
58
|
+
const signer = new MidenWalletSigner(mockWallet, '0xcommitment', 'ecdsa', localSigner);
|
|
59
|
+
expect(signer.publicKey).toBe('0xlocalpubkey');
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
describe('signAccountIdWithTimestamp', () => {
|
|
63
|
+
it('should delegate to localAuthSigner when present', async () => {
|
|
64
|
+
const localSigner = {
|
|
65
|
+
commitment: '0xlocal',
|
|
66
|
+
publicKey: '0xlocalpubkey',
|
|
67
|
+
scheme: 'ecdsa',
|
|
68
|
+
signAccountIdWithTimestamp: vi.fn().mockResolvedValue('0xlocalsig'),
|
|
69
|
+
signCommitment: vi.fn(),
|
|
70
|
+
};
|
|
71
|
+
const signer = new MidenWalletSigner(mockWallet, '0xcommitment', 'ecdsa', localSigner);
|
|
72
|
+
const result = await signer.signAccountIdWithTimestamp('0x' + 'aa'.repeat(15), 1700000000);
|
|
73
|
+
expect(result).toBe('0xlocalsig');
|
|
74
|
+
expect(localSigner.signAccountIdWithTimestamp).toHaveBeenCalledWith('0x' + 'aa'.repeat(15), 1700000000);
|
|
75
|
+
expect(mockWallet.signBytes).not.toHaveBeenCalled();
|
|
76
|
+
});
|
|
77
|
+
it('should use wallet signing when no localAuthSigner', async () => {
|
|
78
|
+
const signer = new MidenWalletSigner(mockWallet, '0xcommitment', 'falcon');
|
|
79
|
+
const result = await signer.signAccountIdWithTimestamp('0x' + 'aa'.repeat(15), 1700000000);
|
|
80
|
+
expect(mockWallet.signBytes).toHaveBeenCalled();
|
|
81
|
+
expect(result).toMatch(/^0x/);
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
describe('signCommitment', () => {
|
|
85
|
+
it('should always use wallet signing', async () => {
|
|
86
|
+
const localSigner = {
|
|
87
|
+
commitment: '0xlocal',
|
|
88
|
+
publicKey: '0xlocalpubkey',
|
|
89
|
+
scheme: 'ecdsa',
|
|
90
|
+
signAccountIdWithTimestamp: vi.fn(),
|
|
91
|
+
signCommitment: vi.fn(),
|
|
92
|
+
};
|
|
93
|
+
const signer = new MidenWalletSigner(mockWallet, '0xcommitment', 'ecdsa', localSigner);
|
|
94
|
+
await signer.signCommitment('0x' + 'cc'.repeat(32));
|
|
95
|
+
expect(mockWallet.signBytes).toHaveBeenCalled();
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
describe('signature byte stripping', () => {
|
|
99
|
+
it('should strip the first byte from wallet signature response', async () => {
|
|
100
|
+
mockWallet.signBytes.mockResolvedValue(new Uint8Array([0x00, 0xaa, 0xbb, 0xcc]));
|
|
101
|
+
const signer = new MidenWalletSigner(mockWallet, '0xcommitment', 'falcon');
|
|
102
|
+
const result = await signer.signCommitment('0x' + 'cc'.repeat(32));
|
|
103
|
+
expect(result).toBe('0xaabbcc');
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
//# sourceMappingURL=miden-wallet.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"miden-wallet.test.js","sourceRoot":"","sources":["../../src/signers/miden-wallet.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { Signer, SignatureScheme } from '../types.js';
|
|
2
|
+
export interface ParaSigningContext {
|
|
3
|
+
signMessage(params: {
|
|
4
|
+
walletId: string;
|
|
5
|
+
messageBase64: string;
|
|
6
|
+
}): Promise<{
|
|
7
|
+
signature?: string;
|
|
8
|
+
}>;
|
|
9
|
+
}
|
|
10
|
+
export declare class ParaSigner implements Signer {
|
|
11
|
+
readonly commitment: string;
|
|
12
|
+
readonly publicKey: string;
|
|
13
|
+
readonly scheme: SignatureScheme;
|
|
14
|
+
private readonly para;
|
|
15
|
+
private readonly walletId;
|
|
16
|
+
constructor(para: ParaSigningContext, walletId: string, commitment: string, publicKey: string);
|
|
17
|
+
signAccountIdWithTimestamp(accountId: string, timestamp: number): Promise<string>;
|
|
18
|
+
signCommitment(commitmentHex: string): Promise<string>;
|
|
19
|
+
private signWord;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=para.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"para.d.ts","sourceRoot":"","sources":["../../src/signers/para.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAM3D,MAAM,WAAW,kBAAkB;IACjC,WAAW,CAAC,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACnG;AAED,qBAAa,UAAW,YAAW,MAAM;IACvC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAW;IAC3C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAqB;IAC1C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;gBAGhC,IAAI,EAAE,kBAAkB,EACxB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM;IAWb,0BAA0B,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAKjF,cAAc,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YAK9C,QAAQ;CAiBvB"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { AuthDigest } from '../utils/digest.js';
|
|
2
|
+
import { EcdsaFormat } from '../utils/ecdsa.js';
|
|
3
|
+
import { hexToBytes, uint8ArrayToBase64 } from '../utils/encoding.js';
|
|
4
|
+
import { wordToBytes } from '../utils/word.js';
|
|
5
|
+
export class ParaSigner {
|
|
6
|
+
commitment;
|
|
7
|
+
publicKey;
|
|
8
|
+
scheme = 'ecdsa';
|
|
9
|
+
para;
|
|
10
|
+
walletId;
|
|
11
|
+
constructor(para, walletId, commitment, publicKey) {
|
|
12
|
+
if (!EcdsaFormat.validatePublicKeyHex(publicKey)) {
|
|
13
|
+
throw new Error('Invalid ECDSA public key for ParaSigner');
|
|
14
|
+
}
|
|
15
|
+
this.para = para;
|
|
16
|
+
this.walletId = walletId;
|
|
17
|
+
this.commitment = commitment;
|
|
18
|
+
this.publicKey = EcdsaFormat.compressPublicKey(publicKey);
|
|
19
|
+
}
|
|
20
|
+
async signAccountIdWithTimestamp(accountId, timestamp) {
|
|
21
|
+
const digest = AuthDigest.fromAccountIdWithTimestamp(accountId, timestamp);
|
|
22
|
+
return this.signWord(digest);
|
|
23
|
+
}
|
|
24
|
+
async signCommitment(commitmentHex) {
|
|
25
|
+
const word = AuthDigest.fromCommitmentHex(commitmentHex);
|
|
26
|
+
return this.signWord(word);
|
|
27
|
+
}
|
|
28
|
+
async signWord(word) {
|
|
29
|
+
const wordBytes = wordToBytes(word);
|
|
30
|
+
const hashedHex = EcdsaFormat.keccakDigestHex(wordBytes);
|
|
31
|
+
const cleanHex = hashedHex.slice(2);
|
|
32
|
+
const messageBase64 = uint8ArrayToBase64(hexToBytes(cleanHex));
|
|
33
|
+
const res = await this.para.signMessage({
|
|
34
|
+
walletId: this.walletId,
|
|
35
|
+
messageBase64,
|
|
36
|
+
});
|
|
37
|
+
if (!res.signature) {
|
|
38
|
+
throw new Error('Para signing was denied by user');
|
|
39
|
+
}
|
|
40
|
+
return EcdsaFormat.normalizeRecoveryByte(res.signature);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=para.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"para.js","sourceRoot":"","sources":["../../src/signers/para.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAM/C,MAAM,OAAO,UAAU;IACZ,UAAU,CAAS;IACnB,SAAS,CAAS;IAClB,MAAM,GAAoB,OAAO,CAAC;IAC1B,IAAI,CAAqB;IACzB,QAAQ,CAAS;IAElC,YACE,IAAwB,EACxB,QAAgB,EAChB,UAAkB,EAClB,SAAiB;QAEjB,IAAI,CAAC,WAAW,CAAC,oBAAoB,CAAC,SAAS,CAAC,EAAE,CAAC;YACjD,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;QAC7D,CAAC;QACD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,SAAS,GAAG,WAAW,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,0BAA0B,CAAC,SAAiB,EAAE,SAAiB;QACnE,MAAM,MAAM,GAAG,UAAU,CAAC,0BAA0B,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAC3E,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,aAAqB;QACxC,MAAM,IAAI,GAAG,UAAU,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC;QACzD,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IAEO,KAAK,CAAC,QAAQ,CAAC,IAA4E;QACjG,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,SAAS,GAAG,WAAW,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;QACzD,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACpC,MAAM,aAAa,GAAG,kBAAkB,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;QAE/D,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC;YACtC,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,aAAa;SACd,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACrD,CAAC;QAED,OAAO,WAAW,CAAC,qBAAqB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC1D,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"para.test.d.ts","sourceRoot":"","sources":["../../src/signers/para.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
2
|
+
import { ParaSigner } from './para.js';
|
|
3
|
+
vi.mock('@miden-sdk/miden-sdk', () => ({
|
|
4
|
+
Word: {
|
|
5
|
+
fromHex: vi.fn((hex) => ({
|
|
6
|
+
toHex: () => hex,
|
|
7
|
+
toFelts: () => [
|
|
8
|
+
{ asInt: () => 1n },
|
|
9
|
+
{ asInt: () => 2n },
|
|
10
|
+
{ asInt: () => 3n },
|
|
11
|
+
{ asInt: () => 4n },
|
|
12
|
+
],
|
|
13
|
+
})),
|
|
14
|
+
},
|
|
15
|
+
AccountId: {
|
|
16
|
+
fromHex: vi.fn(() => ({
|
|
17
|
+
prefix: () => ({ asInt: () => BigInt(1) }),
|
|
18
|
+
suffix: () => ({ asInt: () => BigInt(2) }),
|
|
19
|
+
})),
|
|
20
|
+
},
|
|
21
|
+
Felt: vi.fn().mockImplementation((v) => ({ value: v })),
|
|
22
|
+
FeltArray: vi.fn().mockImplementation((arr) => arr),
|
|
23
|
+
Rpo256: {
|
|
24
|
+
hashElements: vi.fn().mockReturnValue({
|
|
25
|
+
toHex: () => '0x' + 'bb'.repeat(32),
|
|
26
|
+
toFelts: () => [
|
|
27
|
+
{ asInt: () => 10n },
|
|
28
|
+
{ asInt: () => 20n },
|
|
29
|
+
{ asInt: () => 30n },
|
|
30
|
+
{ asInt: () => 40n },
|
|
31
|
+
],
|
|
32
|
+
}),
|
|
33
|
+
},
|
|
34
|
+
}));
|
|
35
|
+
describe('ParaSigner', () => {
|
|
36
|
+
let mockPara;
|
|
37
|
+
const validCompressedKey = '0x02' + 'aa'.repeat(32);
|
|
38
|
+
const validUncompressedKey = '0x04' + 'aa'.repeat(32) + 'bb'.repeat(31) + 'b0';
|
|
39
|
+
beforeEach(() => {
|
|
40
|
+
vi.clearAllMocks();
|
|
41
|
+
mockPara = {
|
|
42
|
+
signMessage: vi.fn().mockResolvedValue({
|
|
43
|
+
signature: '0x' + 'cc'.repeat(64),
|
|
44
|
+
}),
|
|
45
|
+
};
|
|
46
|
+
});
|
|
47
|
+
describe('constructor', () => {
|
|
48
|
+
it('should accept a valid compressed public key', () => {
|
|
49
|
+
const signer = new ParaSigner(mockPara, 'wallet-1', '0xcommitment', validCompressedKey);
|
|
50
|
+
expect(signer.publicKey).toBe(validCompressedKey);
|
|
51
|
+
expect(signer.commitment).toBe('0xcommitment');
|
|
52
|
+
expect(signer.scheme).toBe('ecdsa');
|
|
53
|
+
});
|
|
54
|
+
it('should compress an uncompressed public key', () => {
|
|
55
|
+
const signer = new ParaSigner(mockPara, 'wallet-1', '0xcommitment', validUncompressedKey);
|
|
56
|
+
expect(signer.publicKey).toBe('0x02' + 'aa'.repeat(32));
|
|
57
|
+
});
|
|
58
|
+
it('should throw on invalid public key', () => {
|
|
59
|
+
expect(() => new ParaSigner(mockPara, 'wallet-1', '0xcommitment', '0xinvalid')).toThrow('Invalid ECDSA public key for ParaSigner');
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
describe('signAccountIdWithTimestamp', () => {
|
|
63
|
+
it('should call para signMessage and return normalized signature', async () => {
|
|
64
|
+
const signer = new ParaSigner(mockPara, 'wallet-1', '0xcommitment', validCompressedKey);
|
|
65
|
+
const result = await signer.signAccountIdWithTimestamp('0x' + 'aa'.repeat(15), 1700000000);
|
|
66
|
+
expect(mockPara.signMessage).toHaveBeenCalledWith(expect.objectContaining({
|
|
67
|
+
walletId: 'wallet-1',
|
|
68
|
+
messageBase64: expect.any(String),
|
|
69
|
+
}));
|
|
70
|
+
expect(result).toMatch(/^0x/);
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
describe('signCommitment', () => {
|
|
74
|
+
it('should call para signMessage', async () => {
|
|
75
|
+
const signer = new ParaSigner(mockPara, 'wallet-1', '0xcommitment', validCompressedKey);
|
|
76
|
+
await signer.signCommitment('0x' + 'cc'.repeat(32));
|
|
77
|
+
expect(mockPara.signMessage).toHaveBeenCalled();
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
describe('signing denial', () => {
|
|
81
|
+
it('should throw when para returns no signature', async () => {
|
|
82
|
+
mockPara.signMessage.mockResolvedValue({ signature: undefined });
|
|
83
|
+
const signer = new ParaSigner(mockPara, 'wallet-1', '0xcommitment', validCompressedKey);
|
|
84
|
+
await expect(signer.signCommitment('0x' + 'cc'.repeat(32))).rejects.toThrow('Para signing was denied by user');
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
//# sourceMappingURL=para.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"para.test.js","sourceRoot":"","sources":["../../src/signers/para.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import type { TransactionRequest, Word } from '@
|
|
1
|
+
import type { TransactionRequest, Word, WebClient } from '@miden-sdk/miden-sdk';
|
|
2
2
|
import type { SignatureOptions } from './options.js';
|
|
3
|
-
export declare function buildConsumeNotesTransactionRequest(noteIds: string[], options?: SignatureOptions): {
|
|
3
|
+
export declare function buildConsumeNotesTransactionRequest(webClient: WebClient, noteIds: string[], options?: SignatureOptions): Promise<{
|
|
4
4
|
request: TransactionRequest;
|
|
5
5
|
salt: Word;
|
|
6
|
-
}
|
|
6
|
+
}>;
|
|
7
7
|
//# sourceMappingURL=consumeNotes.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"consumeNotes.d.ts","sourceRoot":"","sources":["../../src/transaction/consumeNotes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,IAAI,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"consumeNotes.d.ts","sourceRoot":"","sources":["../../src/transaction/consumeNotes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAIhF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAErD,wBAAsB,mCAAmC,CACvD,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,MAAM,EAAE,EACjB,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC;IAAE,OAAO,EAAE,kBAAkB,CAAC;IAAC,IAAI,EAAE,IAAI,CAAA;CAAE,CAAC,CAkCtD"}
|
|
@@ -1,20 +1,24 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { NoteAndArgs, NoteAndArgsArray, 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
|
-
export function buildConsumeNotesTransactionRequest(noteIds, options = {}) {
|
|
4
|
+
export async function buildConsumeNotesTransactionRequest(webClient, noteIds, options = {}) {
|
|
5
5
|
if (noteIds.length === 0) {
|
|
6
6
|
throw new Error('At least one note ID is required');
|
|
7
7
|
}
|
|
8
|
-
const
|
|
8
|
+
const noteAndArgsArray = new NoteAndArgsArray();
|
|
9
9
|
for (const noteIdHex of noteIds) {
|
|
10
|
-
const
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
const inputNoteRecord = await webClient.getInputNote(noteIdHex);
|
|
11
|
+
if (!inputNoteRecord) {
|
|
12
|
+
throw new Error(`Note not found in local store: ${noteIdHex}`);
|
|
13
|
+
}
|
|
14
|
+
const note = inputNoteRecord.toNote();
|
|
15
|
+
const noteAndArgs = new NoteAndArgs(note, null);
|
|
16
|
+
noteAndArgsArray.push(noteAndArgs);
|
|
13
17
|
}
|
|
14
18
|
const authSaltHex = options.salt ? options.salt.toHex() : randomWord().toHex();
|
|
15
19
|
const authSaltForBuilder = WordType.fromHex(normalizeHexWord(authSaltHex));
|
|
16
20
|
let txBuilder = new TransactionRequestBuilder();
|
|
17
|
-
txBuilder = txBuilder.
|
|
21
|
+
txBuilder = txBuilder.withInputNotes(noteAndArgsArray);
|
|
18
22
|
txBuilder = txBuilder.withAuthArg(authSaltForBuilder);
|
|
19
23
|
if (options.signatureAdviceMap) {
|
|
20
24
|
txBuilder = txBuilder.extendAdviceMap(options.signatureAdviceMap);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"consumeNotes.js","sourceRoot":"","sources":["../../src/transaction/consumeNotes.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"consumeNotes.js","sourceRoot":"","sources":["../../src/transaction/consumeNotes.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,yBAAyB,EAAE,IAAI,IAAI,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAClH,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAGxD,MAAM,CAAC,KAAK,UAAU,mCAAmC,CACvD,SAAoB,EACpB,OAAiB,EACjB,UAA4B,EAAE;IAE9B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;IACtD,CAAC;IAED,MAAM,gBAAgB,GAAG,IAAI,gBAAgB,EAAE,CAAC;IAChD,KAAK,MAAM,SAAS,IAAI,OAAO,EAAE,CAAC;QAChC,MAAM,eAAe,GAAG,MAAM,SAAS,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;QAChE,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,kCAAkC,SAAS,EAAE,CAAC,CAAC;QACjE,CAAC;QACD,MAAM,IAAI,GAAG,eAAe,CAAC,MAAM,EAAE,CAAC;QACtC,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAChD,gBAAgB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACrC,CAAC;IAED,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,KAAK,EAAE,CAAC;IAE/E,MAAM,kBAAkB,GAAG,QAAQ,CAAC,OAAO,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC,CAAC;IAE3E,IAAI,SAAS,GAAG,IAAI,yBAAyB,EAAE,CAAC;IAChD,SAAS,GAAG,SAAS,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;IACvD,SAAS,GAAG,SAAS,CAAC,WAAW,CAAC,kBAAkB,CAAC,CAAC;IAEtD,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;QAC/B,SAAS,GAAG,SAAS,CAAC,eAAe,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACpE,CAAC;IAED,MAAM,iBAAiB,GAAG,QAAQ,CAAC,OAAO,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC,CAAC;IAE1E,OAAO;QACL,OAAO,EAAE,SAAS,CAAC,KAAK,EAAE;QAC1B,IAAI,EAAE,iBAAiB;KACxB,CAAC;AACJ,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { AdviceMap, Word } from '@
|
|
2
|
-
import type { SignatureScheme } from '
|
|
1
|
+
import type { AdviceMap, Word } from '@miden-sdk/miden-sdk';
|
|
2
|
+
import type { SignatureScheme } from '@openzeppelin/psm-client';
|
|
3
3
|
export interface SignatureOptions {
|
|
4
4
|
salt?: Word;
|
|
5
5
|
signatureAdviceMap?: AdviceMap;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../src/transaction/options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../src/transaction/options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAEhE,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,kBAAkB,CAAC,EAAE,SAAS,CAAC;IAC/B,eAAe,CAAC,EAAE,eAAe,CAAC;CACnC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { TransactionRequest, Word } from '@
|
|
1
|
+
import type { TransactionRequest, Word } from '@miden-sdk/miden-sdk';
|
|
2
2
|
import type { SignatureOptions } from './options.js';
|
|
3
3
|
export declare function buildP2idTransactionRequest(senderId: string, recipientId: string, faucetId: string, amount: bigint, options?: SignatureOptions): {
|
|
4
4
|
request: TransactionRequest;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"p2id.d.ts","sourceRoot":"","sources":["../../src/transaction/p2id.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,IAAI,EAAE,MAAM,
|
|
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;AAsBrE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAiCrD,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,gBAAqB,GAC7B;IAAE,OAAO,EAAE,kBAAkB,CAAC;IAAC,IAAI,EAAE,IAAI,CAAA;CAAE,CAqC7C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"p2id.interop.test.d.ts","sourceRoot":"","sources":["../../src/transaction/p2id.interop.test.ts"],"names":[],"mappings":""}
|