ox 1.7.1 → 1.7.2
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/CHANGELOG.md +15 -0
- package/dist/core/Hash.js +1 -1
- package/dist/core/Hash.js.map +1 -1
- package/dist/tempo/KeyAuthorization.d.ts +1 -1
- package/dist/tempo/KeyAuthorization.d.ts.map +1 -1
- package/dist/tempo/MultisigConfig.d.ts +151 -83
- package/dist/tempo/MultisigConfig.d.ts.map +1 -1
- package/dist/tempo/MultisigConfig.js +164 -86
- package/dist/tempo/MultisigConfig.js.map +1 -1
- package/dist/tempo/MultisigOperation.d.ts +324 -0
- package/dist/tempo/MultisigOperation.d.ts.map +1 -0
- package/dist/tempo/MultisigOperation.js +809 -0
- package/dist/tempo/MultisigOperation.js.map +1 -0
- package/dist/tempo/MultisigWitness.d.ts +106 -0
- package/dist/tempo/MultisigWitness.d.ts.map +1 -0
- package/dist/tempo/MultisigWitness.js +118 -0
- package/dist/tempo/MultisigWitness.js.map +1 -0
- package/dist/tempo/RpcSchemaTempo.d.ts +35 -0
- package/dist/tempo/RpcSchemaTempo.d.ts.map +1 -1
- package/dist/tempo/SignatureEnvelope.d.ts +60 -80
- package/dist/tempo/SignatureEnvelope.d.ts.map +1 -1
- package/dist/tempo/SignatureEnvelope.js +87 -146
- package/dist/tempo/SignatureEnvelope.js.map +1 -1
- package/dist/tempo/TransactionRequest.d.ts +9 -17
- package/dist/tempo/TransactionRequest.d.ts.map +1 -1
- package/dist/tempo/TransactionRequest.js +7 -7
- package/dist/tempo/TransactionRequest.js.map +1 -1
- package/dist/tempo/TxEnvelopeTempo.d.ts +3 -2
- package/dist/tempo/TxEnvelopeTempo.d.ts.map +1 -1
- package/dist/tempo/TxEnvelopeTempo.js +3 -2
- package/dist/tempo/TxEnvelopeTempo.js.map +1 -1
- package/dist/tempo/index.d.ts +22 -2
- package/dist/tempo/index.d.ts.map +1 -1
- package/dist/tempo/index.js +22 -2
- package/dist/tempo/index.js.map +1 -1
- package/dist/zod/tempo/AuthorizationTempo.d.ts +110 -110
- package/dist/zod/tempo/AuthorizationTempo.d.ts.map +1 -1
- package/dist/zod/tempo/KeyAuthorization.d.ts +90 -83
- package/dist/zod/tempo/KeyAuthorization.d.ts.map +1 -1
- package/dist/zod/tempo/MultisigConfig.d.ts +31 -2
- package/dist/zod/tempo/MultisigConfig.d.ts.map +1 -1
- package/dist/zod/tempo/MultisigConfig.js +26 -3
- package/dist/zod/tempo/MultisigConfig.js.map +1 -1
- package/dist/zod/tempo/MultisigOperation.d.ts +168 -0
- package/dist/zod/tempo/MultisigOperation.d.ts.map +1 -0
- package/dist/zod/tempo/MultisigOperation.js +65 -0
- package/dist/zod/tempo/MultisigOperation.js.map +1 -0
- package/dist/zod/tempo/MultisigWitness.d.ts +152 -0
- package/dist/zod/tempo/MultisigWitness.d.ts.map +1 -0
- package/dist/zod/tempo/MultisigWitness.js +76 -0
- package/dist/zod/tempo/MultisigWitness.js.map +1 -0
- package/dist/zod/tempo/RpcSchemaTempo.d.ts +607 -102
- package/dist/zod/tempo/RpcSchemaTempo.d.ts.map +1 -1
- package/dist/zod/tempo/RpcSchemaTempo.js +38 -0
- package/dist/zod/tempo/RpcSchemaTempo.js.map +1 -1
- package/dist/zod/tempo/SignatureEnvelope.d.ts +33 -33
- package/dist/zod/tempo/SignatureEnvelope.d.ts.map +1 -1
- package/dist/zod/tempo/SignatureEnvelope.js +9 -16
- package/dist/zod/tempo/SignatureEnvelope.js.map +1 -1
- package/dist/zod/tempo/Transaction.d.ts +228 -222
- package/dist/zod/tempo/Transaction.d.ts.map +1 -1
- package/dist/zod/tempo/TransactionRequest.d.ts +379 -176
- package/dist/zod/tempo/TransactionRequest.d.ts.map +1 -1
- package/dist/zod/tempo/TransactionRequest.js +11 -22
- package/dist/zod/tempo/TransactionRequest.js.map +1 -1
- package/dist/zod/tempo/TxEnvelopeTempo.d.ts +60 -48
- package/dist/zod/tempo/TxEnvelopeTempo.d.ts.map +1 -1
- package/dist/zod/tempo/ZoneRpcAuthentication.d.ts +15 -12
- package/dist/zod/tempo/ZoneRpcAuthentication.d.ts.map +1 -1
- package/dist/zod/tempo/z.d.ts +2 -0
- package/dist/zod/tempo/z.d.ts.map +1 -1
- package/dist/zod/tempo/z.js +2 -0
- package/dist/zod/tempo/z.js.map +1 -1
- package/package.json +21 -1
- package/src/core/Hash.ts +1 -1
- package/src/core/_test/Hash.test.ts +15 -0
- package/src/tempo/KeyAuthorization.test-d.ts +13 -1
- package/src/tempo/KeyAuthorization.test.ts +65 -0
- package/src/tempo/KeyAuthorization.ts +1 -1
- package/src/tempo/MultisigConfig.test-d.ts +52 -0
- package/src/tempo/MultisigConfig.test.ts +288 -227
- package/src/tempo/MultisigConfig.ts +275 -104
- package/src/tempo/MultisigOperation.test-d.ts +77 -0
- package/src/tempo/MultisigOperation.test.ts +1883 -0
- package/src/tempo/MultisigOperation.ts +1254 -0
- package/src/tempo/MultisigWitness.test-d.ts +42 -0
- package/src/tempo/MultisigWitness.test.ts +288 -0
- package/src/tempo/MultisigWitness.ts +210 -0
- package/src/tempo/RpcSchemaTempo.test-d.ts +56 -0
- package/src/tempo/RpcSchemaTempo.ts +37 -0
- package/src/tempo/SignatureEnvelope.test-d.ts +63 -46
- package/src/tempo/SignatureEnvelope.test.ts +523 -500
- package/src/tempo/SignatureEnvelope.ts +172 -242
- package/src/tempo/TransactionRequest.test-d.ts +11 -0
- package/src/tempo/TransactionRequest.test.ts +285 -33
- package/src/tempo/TransactionRequest.ts +15 -20
- package/src/tempo/TxEnvelopeTempo.test-d.ts +7 -0
- package/src/tempo/TxEnvelopeTempo.test.ts +25 -0
- package/src/tempo/TxEnvelopeTempo.ts +5 -3
- package/src/tempo/index.ts +22 -2
- package/src/tempo/multisig.e2e.test.ts +113 -86
- package/src/version.ts +1 -1
- package/src/zod/tempo/MultisigConfig.ts +29 -3
- package/src/zod/tempo/MultisigOperation.ts +69 -0
- package/src/zod/tempo/MultisigWitness.ts +101 -0
- package/src/zod/tempo/RpcSchemaTempo.ts +43 -0
- package/src/zod/tempo/SignatureEnvelope.ts +20 -38
- package/src/zod/tempo/TransactionRequest.ts +17 -26
- package/src/zod/tempo/_test/KeyAuthorization.test.ts +11 -0
- package/src/zod/tempo/_test/MultisigConfig.test-d.ts +13 -0
- package/src/zod/tempo/_test/MultisigConfig.test.ts +13 -2
- package/src/zod/tempo/_test/MultisigOperation.test-d.ts +27 -0
- package/src/zod/tempo/_test/MultisigOperation.test.ts +68 -0
- package/src/zod/tempo/_test/MultisigWitness.test-d.ts +13 -0
- package/src/zod/tempo/_test/MultisigWitness.test.ts +149 -0
- package/src/zod/tempo/_test/RpcSchemaTempo.test-d.ts +31 -0
- package/src/zod/tempo/_test/RpcSchemaTempo.test.ts +41 -0
- package/src/zod/tempo/_test/SignatureEnvelope.test-d.ts +1 -1
- package/src/zod/tempo/_test/SignatureEnvelope.test.ts +25 -34
- package/src/zod/tempo/_test/TransactionRequest.test.ts +176 -8
- package/src/zod/tempo/z.ts +2 -0
|
@@ -9,7 +9,7 @@ import * as TxEnvelopeTempo from './TxEnvelopeTempo.js'
|
|
|
9
9
|
|
|
10
10
|
const chainId = chain.id
|
|
11
11
|
const updateConfig = AbiFunction.from(
|
|
12
|
-
'function updateConfig(uint8 threshold, (address owner, uint8 weight)[] owners)',
|
|
12
|
+
'function updateConfig((bytes32 salt, uint64 version, uint8 threshold, (address owner, uint8 weight)[] owners) current, uint8 threshold, (address owner, uint8 weight)[] owners)',
|
|
13
13
|
)
|
|
14
14
|
|
|
15
15
|
describe('behavior: multisig (TIP-1061)', () => {
|
|
@@ -49,16 +49,21 @@ describe('behavior: multisig (TIP-1061)', () => {
|
|
|
49
49
|
}
|
|
50
50
|
|
|
51
51
|
function approve(parameters: {
|
|
52
|
-
|
|
52
|
+
address?: Address.Address | undefined
|
|
53
|
+
config: MultisigConfig.Config
|
|
53
54
|
payload: Hex.Hex
|
|
54
55
|
signers: readonly { privateKey: Hex.Hex }[]
|
|
55
|
-
version?: bigint | undefined
|
|
56
56
|
}) {
|
|
57
|
-
const {
|
|
57
|
+
const {
|
|
58
|
+
address = MultisigConfig.getAddress(parameters.config),
|
|
59
|
+
config,
|
|
60
|
+
payload,
|
|
61
|
+
signers,
|
|
62
|
+
} = parameters
|
|
58
63
|
const digest = MultisigConfig.getSignPayload({
|
|
64
|
+
account: address,
|
|
65
|
+
config,
|
|
59
66
|
payload,
|
|
60
|
-
initialConfig,
|
|
61
|
-
version,
|
|
62
67
|
})
|
|
63
68
|
const signatures = signers.map((signer) =>
|
|
64
69
|
SignatureEnvelope.from(
|
|
@@ -67,25 +72,10 @@ describe('behavior: multisig (TIP-1061)', () => {
|
|
|
67
72
|
)
|
|
68
73
|
// The node requires approvals ordered by recovered owner address.
|
|
69
74
|
return SignatureEnvelope.sortMultisigApprovals({
|
|
70
|
-
|
|
75
|
+
account: address,
|
|
76
|
+
config,
|
|
71
77
|
payload,
|
|
72
78
|
signatures,
|
|
73
|
-
version,
|
|
74
|
-
})
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
function multisigSignature(parameters: {
|
|
78
|
-
initialConfig: MultisigConfig.Config
|
|
79
|
-
payload: Hex.Hex
|
|
80
|
-
signers: readonly { privateKey: Hex.Hex }[]
|
|
81
|
-
init?: boolean | undefined
|
|
82
|
-
version?: bigint | undefined
|
|
83
|
-
}) {
|
|
84
|
-
const { init = false, ...approval } = parameters
|
|
85
|
-
return SignatureEnvelope.from({
|
|
86
|
-
initialConfig: parameters.initialConfig,
|
|
87
|
-
...(init ? { init: true } : {}),
|
|
88
|
-
signatures: approve(approval),
|
|
89
79
|
})
|
|
90
80
|
}
|
|
91
81
|
|
|
@@ -111,11 +101,14 @@ describe('behavior: multisig (TIP-1061)', () => {
|
|
|
111
101
|
})
|
|
112
102
|
const receipt = await send(
|
|
113
103
|
TxEnvelopeTempo.serialize(transaction, {
|
|
114
|
-
signature:
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
104
|
+
signature: SignatureEnvelope.from({
|
|
105
|
+
account: multisig.account,
|
|
106
|
+
config: multisig.initialConfig,
|
|
107
|
+
signatures: approve({
|
|
108
|
+
config: multisig.initialConfig,
|
|
109
|
+
payload: TxEnvelopeTempo.getSignPayload(transaction),
|
|
110
|
+
signers: multisig.ownerKeys,
|
|
111
|
+
}),
|
|
119
112
|
}),
|
|
120
113
|
}),
|
|
121
114
|
)
|
|
@@ -149,9 +142,10 @@ describe('behavior: multisig (TIP-1061)', () => {
|
|
|
149
142
|
})
|
|
150
143
|
const replacement = createKey()
|
|
151
144
|
const rotatedConfig = MultisigConfig.from({
|
|
145
|
+
owners: [{ owner: replacement.address, weight: 1 }],
|
|
152
146
|
salt: initialConfig.salt,
|
|
153
147
|
threshold: 1,
|
|
154
|
-
|
|
148
|
+
version: 1,
|
|
155
149
|
})
|
|
156
150
|
|
|
157
151
|
await fundAddress(client, { address: account })
|
|
@@ -168,10 +162,10 @@ describe('behavior: multisig (TIP-1061)', () => {
|
|
|
168
162
|
|
|
169
163
|
const bootstrap_signed = TxEnvelopeTempo.serialize(bootstrap, {
|
|
170
164
|
signature: SignatureEnvelope.from({
|
|
171
|
-
|
|
172
|
-
|
|
165
|
+
account,
|
|
166
|
+
config: initialConfig,
|
|
173
167
|
signatures: approve({
|
|
174
|
-
initialConfig,
|
|
168
|
+
config: initialConfig,
|
|
175
169
|
payload: TxEnvelopeTempo.getSignPayload(bootstrap),
|
|
176
170
|
signers: [ownerKeys[0]!, ownerKeys[1]!],
|
|
177
171
|
}),
|
|
@@ -199,7 +193,7 @@ describe('behavior: multisig (TIP-1061)', () => {
|
|
|
199
193
|
expect(response.from).toBe(account)
|
|
200
194
|
expect(response.signature?.type).toBe('multisig')
|
|
201
195
|
expect(
|
|
202
|
-
(response.signature as SignatureEnvelope.Multisig | undefined)?.
|
|
196
|
+
(response.signature as SignatureEnvelope.Multisig | undefined)?.config,
|
|
203
197
|
).toEqual(initialConfig)
|
|
204
198
|
}
|
|
205
199
|
|
|
@@ -212,6 +206,7 @@ describe('behavior: multisig (TIP-1061)', () => {
|
|
|
212
206
|
{
|
|
213
207
|
to: '0xaacc000000000000000000000000000000000000',
|
|
214
208
|
data: AbiFunction.encodeData(updateConfig, [
|
|
209
|
+
initialConfig,
|
|
215
210
|
rotatedConfig.threshold,
|
|
216
211
|
rotatedConfig.owners,
|
|
217
212
|
]),
|
|
@@ -226,9 +221,10 @@ describe('behavior: multisig (TIP-1061)', () => {
|
|
|
226
221
|
})
|
|
227
222
|
const updateSigned = TxEnvelopeTempo.serialize(update, {
|
|
228
223
|
signature: SignatureEnvelope.from({
|
|
229
|
-
|
|
224
|
+
account,
|
|
225
|
+
config: initialConfig,
|
|
230
226
|
signatures: approve({
|
|
231
|
-
initialConfig,
|
|
227
|
+
config: initialConfig,
|
|
232
228
|
payload: TxEnvelopeTempo.getSignPayload(update),
|
|
233
229
|
signers: [ownerKeys[0]!, ownerKeys[1]!],
|
|
234
230
|
}),
|
|
@@ -259,12 +255,13 @@ describe('behavior: multisig (TIP-1061)', () => {
|
|
|
259
255
|
|
|
260
256
|
const spend_signed = TxEnvelopeTempo.serialize(spend, {
|
|
261
257
|
signature: SignatureEnvelope.from({
|
|
262
|
-
|
|
258
|
+
account,
|
|
259
|
+
config: rotatedConfig,
|
|
263
260
|
signatures: approve({
|
|
264
|
-
|
|
261
|
+
address: account,
|
|
262
|
+
config: rotatedConfig,
|
|
265
263
|
payload: TxEnvelopeTempo.getSignPayload(spend),
|
|
266
264
|
signers: [replacement],
|
|
267
|
-
version: 1n,
|
|
268
265
|
}),
|
|
269
266
|
}),
|
|
270
267
|
})
|
|
@@ -295,10 +292,10 @@ describe('behavior: multisig (TIP-1061)', () => {
|
|
|
295
292
|
})
|
|
296
293
|
const childBootstrapSigned = TxEnvelopeTempo.serialize(childBootstrap, {
|
|
297
294
|
signature: SignatureEnvelope.from({
|
|
298
|
-
|
|
299
|
-
|
|
295
|
+
account: child.account,
|
|
296
|
+
config: child.initialConfig,
|
|
300
297
|
signatures: approve({
|
|
301
|
-
|
|
298
|
+
config: child.initialConfig,
|
|
302
299
|
payload: TxEnvelopeTempo.getSignPayload(childBootstrap),
|
|
303
300
|
signers: child.ownerKeys,
|
|
304
301
|
}),
|
|
@@ -330,21 +327,23 @@ describe('behavior: multisig (TIP-1061)', () => {
|
|
|
330
327
|
maxPriorityFeePerGas: Value.fromGwei('10'),
|
|
331
328
|
})
|
|
332
329
|
const digest = MultisigConfig.getSignPayload({
|
|
333
|
-
|
|
330
|
+
account,
|
|
331
|
+
config: initialConfig,
|
|
334
332
|
payload: TxEnvelopeTempo.getSignPayload(bootstrap),
|
|
335
333
|
})
|
|
336
334
|
const nested = SignatureEnvelope.from({
|
|
337
|
-
|
|
335
|
+
account: child.account,
|
|
336
|
+
config: child.initialConfig,
|
|
338
337
|
signatures: approve({
|
|
339
|
-
|
|
338
|
+
config: child.initialConfig,
|
|
340
339
|
payload: digest,
|
|
341
340
|
signers: child.ownerKeys,
|
|
342
341
|
}),
|
|
343
342
|
})
|
|
344
343
|
const bootstrapSigned = TxEnvelopeTempo.serialize(bootstrap, {
|
|
345
344
|
signature: SignatureEnvelope.from({
|
|
346
|
-
|
|
347
|
-
|
|
345
|
+
account,
|
|
346
|
+
config: initialConfig,
|
|
348
347
|
signatures: [nested],
|
|
349
348
|
}),
|
|
350
349
|
})
|
|
@@ -368,17 +367,23 @@ describe('behavior: multisig (TIP-1061)', () => {
|
|
|
368
367
|
maxPriorityFeePerGas: Value.fromGwei('10'),
|
|
369
368
|
})
|
|
370
369
|
const parentDigest = MultisigConfig.getSignPayload({
|
|
371
|
-
|
|
370
|
+
account,
|
|
371
|
+
config: initialConfig,
|
|
372
372
|
payload: TxEnvelopeTempo.getSignPayload(transaction),
|
|
373
373
|
})
|
|
374
|
-
const childSignature =
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
374
|
+
const childSignature = SignatureEnvelope.from({
|
|
375
|
+
account: child.account,
|
|
376
|
+
config: child.initialConfig,
|
|
377
|
+
signatures: approve({
|
|
378
|
+
config: child.initialConfig,
|
|
379
|
+
payload: parentDigest,
|
|
380
|
+
signers: child.ownerKeys,
|
|
381
|
+
}),
|
|
378
382
|
})
|
|
379
383
|
const serialized = TxEnvelopeTempo.serialize(transaction, {
|
|
380
384
|
signature: SignatureEnvelope.from({
|
|
381
|
-
|
|
385
|
+
account,
|
|
386
|
+
config: initialConfig,
|
|
382
387
|
signatures: [childSignature],
|
|
383
388
|
}),
|
|
384
389
|
})
|
|
@@ -410,10 +415,14 @@ describe('behavior: multisig (TIP-1061)', () => {
|
|
|
410
415
|
maxPriorityFeePerGas: Value.fromGwei('10'),
|
|
411
416
|
})
|
|
412
417
|
const signedByOwners = TxEnvelopeTempo.from(transaction, {
|
|
413
|
-
signature:
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
418
|
+
signature: SignatureEnvelope.from({
|
|
419
|
+
account: multisig.account,
|
|
420
|
+
config: multisig.initialConfig,
|
|
421
|
+
signatures: approve({
|
|
422
|
+
config: multisig.initialConfig,
|
|
423
|
+
payload: TxEnvelopeTempo.getSignPayload(transaction),
|
|
424
|
+
signers: multisig.ownerKeys,
|
|
425
|
+
}),
|
|
417
426
|
}),
|
|
418
427
|
})
|
|
419
428
|
const sponsored = TxEnvelopeTempo.from({
|
|
@@ -461,10 +470,14 @@ describe('behavior: multisig (TIP-1061)', () => {
|
|
|
461
470
|
const sponsored = TxEnvelopeTempo.from(transaction, { feePayerSignature })
|
|
462
471
|
const receipt = await send(
|
|
463
472
|
TxEnvelopeTempo.serialize(sponsored, {
|
|
464
|
-
signature:
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
473
|
+
signature: SignatureEnvelope.from({
|
|
474
|
+
account: multisig.account,
|
|
475
|
+
config: multisig.initialConfig,
|
|
476
|
+
signatures: approve({
|
|
477
|
+
config: multisig.initialConfig,
|
|
478
|
+
payload: TxEnvelopeTempo.getSignPayload(sponsored),
|
|
479
|
+
signers: multisig.ownerKeys,
|
|
480
|
+
}),
|
|
468
481
|
}),
|
|
469
482
|
}),
|
|
470
483
|
)
|
|
@@ -495,14 +508,16 @@ describe('behavior: multisig (TIP-1061)', () => {
|
|
|
495
508
|
const serialize = (
|
|
496
509
|
value: ReturnType<typeof transaction>,
|
|
497
510
|
signers: readonly { privateKey: Hex.Hex }[],
|
|
498
|
-
init = false,
|
|
499
511
|
) =>
|
|
500
512
|
TxEnvelopeTempo.serialize(value, {
|
|
501
|
-
signature:
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
513
|
+
signature: SignatureEnvelope.from({
|
|
514
|
+
account,
|
|
515
|
+
config: initialConfig,
|
|
516
|
+
signatures: approve({
|
|
517
|
+
config: initialConfig,
|
|
518
|
+
payload: TxEnvelopeTempo.getSignPayload(value),
|
|
519
|
+
signers,
|
|
520
|
+
}),
|
|
506
521
|
}),
|
|
507
522
|
})
|
|
508
523
|
|
|
@@ -510,7 +525,7 @@ describe('behavior: multisig (TIP-1061)', () => {
|
|
|
510
525
|
const bootstrapReceipt = (await client
|
|
511
526
|
.request({
|
|
512
527
|
method: 'eth_sendRawTransactionSync',
|
|
513
|
-
params: [serialize(bootstrap, [ownerKeys[0]!, ownerKeys[1]!]
|
|
528
|
+
params: [serialize(bootstrap, [ownerKeys[0]!, ownerKeys[1]!])],
|
|
514
529
|
})
|
|
515
530
|
.then((tx) => TransactionReceipt.fromRpc(tx as any)))!
|
|
516
531
|
expect(bootstrapReceipt.status).toBe('success')
|
|
@@ -568,10 +583,10 @@ describe('behavior: multisig (TIP-1061)', () => {
|
|
|
568
583
|
|
|
569
584
|
const bootstrap_signed = TxEnvelopeTempo.serialize(bootstrap, {
|
|
570
585
|
signature: SignatureEnvelope.from({
|
|
571
|
-
|
|
572
|
-
|
|
586
|
+
account,
|
|
587
|
+
config: initialConfig,
|
|
573
588
|
signatures: approve({
|
|
574
|
-
initialConfig,
|
|
589
|
+
config: initialConfig,
|
|
575
590
|
payload: TxEnvelopeTempo.getSignPayload(bootstrap),
|
|
576
591
|
signers: ownerKeys,
|
|
577
592
|
}),
|
|
@@ -618,9 +633,10 @@ describe('behavior: multisig (TIP-1061)', () => {
|
|
|
618
633
|
|
|
619
634
|
const authorize_signed = TxEnvelopeTempo.serialize(authorize, {
|
|
620
635
|
signature: SignatureEnvelope.from({
|
|
621
|
-
|
|
636
|
+
account,
|
|
637
|
+
config: initialConfig,
|
|
622
638
|
signatures: approve({
|
|
623
|
-
initialConfig,
|
|
639
|
+
config: initialConfig,
|
|
624
640
|
payload: TxEnvelopeTempo.getSignPayload(authorize),
|
|
625
641
|
signers: ownerKeys,
|
|
626
642
|
}),
|
|
@@ -698,6 +714,7 @@ describe('behavior: multisig (TIP-1061)', () => {
|
|
|
698
714
|
{
|
|
699
715
|
to: '0xaacc000000000000000000000000000000000000',
|
|
700
716
|
data: AbiFunction.encodeData(updateConfig, [
|
|
717
|
+
initialConfig,
|
|
701
718
|
initialConfig.threshold,
|
|
702
719
|
initialConfig.owners,
|
|
703
720
|
]),
|
|
@@ -744,11 +761,14 @@ describe('behavior: multisig (TIP-1061)', () => {
|
|
|
744
761
|
type: 'secp256k1',
|
|
745
762
|
})
|
|
746
763
|
const keyAuthorizationSigned = KeyAuthorization.from(keyAuthorization, {
|
|
747
|
-
signature:
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
764
|
+
signature: SignatureEnvelope.from({
|
|
765
|
+
account: multisig.account,
|
|
766
|
+
config: multisig.initialConfig,
|
|
767
|
+
signatures: approve({
|
|
768
|
+
config: multisig.initialConfig,
|
|
769
|
+
payload: KeyAuthorization.getSignPayload(keyAuthorization),
|
|
770
|
+
signers: multisig.ownerKeys,
|
|
771
|
+
}),
|
|
752
772
|
}),
|
|
753
773
|
})
|
|
754
774
|
const transaction = TxEnvelopeTempo.from({
|
|
@@ -787,10 +807,14 @@ describe('behavior: multisig (TIP-1061)', () => {
|
|
|
787
807
|
type: 'secp256k1',
|
|
788
808
|
})
|
|
789
809
|
const keyAuthorizationSigned = KeyAuthorization.from(keyAuthorization, {
|
|
790
|
-
signature:
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
810
|
+
signature: SignatureEnvelope.from({
|
|
811
|
+
account: multisig.account,
|
|
812
|
+
config: multisig.initialConfig,
|
|
813
|
+
signatures: approve({
|
|
814
|
+
config: multisig.initialConfig,
|
|
815
|
+
payload: KeyAuthorization.getSignPayload(keyAuthorization),
|
|
816
|
+
signers: multisig.ownerKeys,
|
|
817
|
+
}),
|
|
794
818
|
}),
|
|
795
819
|
})
|
|
796
820
|
const bootstrapTransaction = TxEnvelopeTempo.from({
|
|
@@ -805,11 +829,14 @@ describe('behavior: multisig (TIP-1061)', () => {
|
|
|
805
829
|
})
|
|
806
830
|
const bootstrapReceipt = await send(
|
|
807
831
|
TxEnvelopeTempo.serialize(bootstrapTransaction, {
|
|
808
|
-
signature:
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
832
|
+
signature: SignatureEnvelope.from({
|
|
833
|
+
account: multisig.account,
|
|
834
|
+
config: multisig.initialConfig,
|
|
835
|
+
signatures: approve({
|
|
836
|
+
config: multisig.initialConfig,
|
|
837
|
+
payload: TxEnvelopeTempo.getSignPayload(bootstrapTransaction),
|
|
838
|
+
signers: multisig.ownerKeys,
|
|
839
|
+
}),
|
|
813
840
|
}),
|
|
814
841
|
}),
|
|
815
842
|
)
|
package/src/version.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
/** @internal */
|
|
2
|
-
export const version = '1.7.
|
|
2
|
+
export const version = '1.7.2'
|
|
@@ -10,12 +10,13 @@ export const Owner = z.object({
|
|
|
10
10
|
weight: z.number(),
|
|
11
11
|
})
|
|
12
12
|
|
|
13
|
-
/** Native multisig configuration schema. */
|
|
13
|
+
/** Native multisig configuration domain schema. */
|
|
14
14
|
export const Config = z
|
|
15
15
|
.object({
|
|
16
|
-
salt: z.optional(z_Hex.Hex),
|
|
17
|
-
threshold: z.number(),
|
|
18
16
|
owners: z.readonly(z.array(Owner)),
|
|
17
|
+
salt: z_Hex.Hex,
|
|
18
|
+
threshold: z.number(),
|
|
19
|
+
version: z.bigint(),
|
|
19
20
|
})
|
|
20
21
|
.check(
|
|
21
22
|
z.refine(
|
|
@@ -23,3 +24,28 @@ export const Config = z
|
|
|
23
24
|
'expected valid native multisig configuration',
|
|
24
25
|
),
|
|
25
26
|
)
|
|
27
|
+
|
|
28
|
+
/** Native multisig configuration RPC schema. */
|
|
29
|
+
export const Rpc = z
|
|
30
|
+
.object({
|
|
31
|
+
owners: z.readonly(z.array(Owner)),
|
|
32
|
+
salt: z_Hex.Hex,
|
|
33
|
+
threshold: z.number(),
|
|
34
|
+
version: z_Hex.Hex,
|
|
35
|
+
})
|
|
36
|
+
.check(
|
|
37
|
+
z.refine((value) => {
|
|
38
|
+
try {
|
|
39
|
+
core_MultisigConfig.fromRpc(value)
|
|
40
|
+
return true
|
|
41
|
+
} catch {
|
|
42
|
+
return false
|
|
43
|
+
}
|
|
44
|
+
}, 'expected valid native multisig configuration'),
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
/** Codec decoding an RPC multisig configuration into a domain configuration. */
|
|
48
|
+
export const MultisigConfig = z.codec(Rpc, Config, {
|
|
49
|
+
decode: (value) => core_MultisigConfig.fromRpc(value),
|
|
50
|
+
encode: (value) => core_MultisigConfig.toRpc(value),
|
|
51
|
+
})
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/* eslint-disable jsdoc-js/require-jsdoc, jsdoc-js/require-description, jsdoc-js/require-example */
|
|
2
|
+
import * as core_MultisigOperation from '../../tempo/MultisigOperation.js'
|
|
3
|
+
import * as z_Address from '../Address.js'
|
|
4
|
+
import * as z_Hash from '../Hash.js'
|
|
5
|
+
import * as z_Hex from '../Hex.js'
|
|
6
|
+
import * as z_Uint from '../Uint.js'
|
|
7
|
+
import * as z from 'zod/mini'
|
|
8
|
+
import * as z_MultisigConfig from './MultisigConfig.js'
|
|
9
|
+
|
|
10
|
+
function baseFields() {
|
|
11
|
+
return {
|
|
12
|
+
account: z_Address.Address,
|
|
13
|
+
approvals: z.readonly(z.array(z_Hex.Hex)),
|
|
14
|
+
config: z_MultisigConfig.MultisigConfig,
|
|
15
|
+
configVersion: z_Uint.Uint64,
|
|
16
|
+
createdAt: z.number(),
|
|
17
|
+
hash: z_Hash.Hash,
|
|
18
|
+
init: z.boolean(),
|
|
19
|
+
signatureCount: z.number(),
|
|
20
|
+
threshold: z.number(),
|
|
21
|
+
updatedAt: z.number(),
|
|
22
|
+
weight: z.number(),
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const valid = z.refine((value) => {
|
|
27
|
+
try {
|
|
28
|
+
core_MultisigOperation.from(value as never)
|
|
29
|
+
return true
|
|
30
|
+
} catch {
|
|
31
|
+
return false
|
|
32
|
+
}
|
|
33
|
+
}, 'expected valid multisig operation')
|
|
34
|
+
|
|
35
|
+
/** Fields shared by every multisig operation schema. */
|
|
36
|
+
export const Base = z.object(baseFields())
|
|
37
|
+
|
|
38
|
+
/** Multisig transaction approval operation schema. */
|
|
39
|
+
export const TransactionOperation = z
|
|
40
|
+
.object({
|
|
41
|
+
...baseFields(),
|
|
42
|
+
expiresAt: z.optional(z.number()),
|
|
43
|
+
status: z.union([
|
|
44
|
+
z.literal('pending'),
|
|
45
|
+
z.literal('submitting'),
|
|
46
|
+
z.literal('success'),
|
|
47
|
+
]),
|
|
48
|
+
submissionId: z.optional(z_Hash.Hash),
|
|
49
|
+
transaction: z_Hex.Hex,
|
|
50
|
+
transactionHash: z.optional(z_Hash.Hash),
|
|
51
|
+
type: z.literal('transaction'),
|
|
52
|
+
})
|
|
53
|
+
.check(valid)
|
|
54
|
+
|
|
55
|
+
/** Multisig key authorization approval operation schema. */
|
|
56
|
+
export const KeyAuthorizationOperation = z
|
|
57
|
+
.object({
|
|
58
|
+
...baseFields(),
|
|
59
|
+
keyAuthorization: z_Hex.Hex,
|
|
60
|
+
status: z.union([z.literal('pending'), z.literal('success')]),
|
|
61
|
+
type: z.literal('keyAuthorization'),
|
|
62
|
+
})
|
|
63
|
+
.check(valid)
|
|
64
|
+
|
|
65
|
+
/** Transaction or key authorization multisig operation schema. */
|
|
66
|
+
export const Operation = z.union([
|
|
67
|
+
TransactionOperation,
|
|
68
|
+
KeyAuthorizationOperation,
|
|
69
|
+
])
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/* eslint-disable jsdoc-js/require-jsdoc, jsdoc-js/require-description, jsdoc-js/require-example */
|
|
2
|
+
import * as core_MultisigConfig from '../../tempo/MultisigConfig.js'
|
|
3
|
+
import * as core_MultisigWitness from '../../tempo/MultisigWitness.js'
|
|
4
|
+
import * as z_Address from '../Address.js'
|
|
5
|
+
import * as z_Hex from '../Hex.js'
|
|
6
|
+
import * as z from 'zod/mini'
|
|
7
|
+
import * as z_MultisigConfig from './MultisigConfig.js'
|
|
8
|
+
import * as z_SignatureEnvelope from './SignatureEnvelope.js'
|
|
9
|
+
|
|
10
|
+
const ConfigRpc = z
|
|
11
|
+
.object({
|
|
12
|
+
owners: z.readonly(z.array(z_MultisigConfig.Owner)),
|
|
13
|
+
salt: z_Hex.Hex,
|
|
14
|
+
threshold: z.number(),
|
|
15
|
+
version: z.number(),
|
|
16
|
+
})
|
|
17
|
+
.check(
|
|
18
|
+
z.refine(
|
|
19
|
+
(value) => core_MultisigConfig.validate(value),
|
|
20
|
+
'expected valid native multisig configuration',
|
|
21
|
+
),
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
const NestedPrimitiveApproval = z.object({
|
|
25
|
+
keyData: z.optional(z_Hex.Hex),
|
|
26
|
+
keyType: z.optional(z_SignatureEnvelope.Type),
|
|
27
|
+
owner: z_Address.Address,
|
|
28
|
+
})
|
|
29
|
+
|
|
30
|
+
const PrimitiveApproval = z.object({
|
|
31
|
+
keyData: z.optional(z_Hex.Hex),
|
|
32
|
+
keyType: z.optional(z_SignatureEnvelope.Type),
|
|
33
|
+
owner: z_Address.Address,
|
|
34
|
+
type: z.literal('primitive'),
|
|
35
|
+
})
|
|
36
|
+
|
|
37
|
+
const NestedWitness = z.object({
|
|
38
|
+
account: z_Address.Address,
|
|
39
|
+
approvals: z.readonly(
|
|
40
|
+
z
|
|
41
|
+
.array(NestedPrimitiveApproval)
|
|
42
|
+
.check(z.maxLength(core_MultisigConfig.maxSignatures)),
|
|
43
|
+
),
|
|
44
|
+
config: z_MultisigConfig.Config,
|
|
45
|
+
})
|
|
46
|
+
|
|
47
|
+
const NestedWitnessRpc = z.object({
|
|
48
|
+
account: z_Address.Address,
|
|
49
|
+
approvals: z.readonly(
|
|
50
|
+
z
|
|
51
|
+
.array(NestedPrimitiveApproval)
|
|
52
|
+
.check(z.maxLength(core_MultisigConfig.maxSignatures)),
|
|
53
|
+
),
|
|
54
|
+
config: ConfigRpc,
|
|
55
|
+
})
|
|
56
|
+
|
|
57
|
+
/** Native multisig simulation witness schema. */
|
|
58
|
+
export const Domain = z.object({
|
|
59
|
+
account: z_Address.Address,
|
|
60
|
+
approvals: z.readonly(
|
|
61
|
+
z
|
|
62
|
+
.array(
|
|
63
|
+
z.union([
|
|
64
|
+
PrimitiveApproval,
|
|
65
|
+
z.object({
|
|
66
|
+
type: z.literal('multisig'),
|
|
67
|
+
witness: NestedWitness,
|
|
68
|
+
}),
|
|
69
|
+
]),
|
|
70
|
+
)
|
|
71
|
+
.check(z.maxLength(core_MultisigConfig.maxSignatures)),
|
|
72
|
+
),
|
|
73
|
+
config: z_MultisigConfig.Config,
|
|
74
|
+
})
|
|
75
|
+
|
|
76
|
+
const Rpc_ = z.object({
|
|
77
|
+
account: z_Address.Address,
|
|
78
|
+
approvals: z.readonly(
|
|
79
|
+
z
|
|
80
|
+
.array(
|
|
81
|
+
z.union([
|
|
82
|
+
PrimitiveApproval,
|
|
83
|
+
z.object({
|
|
84
|
+
type: z.literal('multisig'),
|
|
85
|
+
witness: NestedWitnessRpc,
|
|
86
|
+
}),
|
|
87
|
+
]),
|
|
88
|
+
)
|
|
89
|
+
.check(z.maxLength(core_MultisigConfig.maxSignatures)),
|
|
90
|
+
),
|
|
91
|
+
config: ConfigRpc,
|
|
92
|
+
})
|
|
93
|
+
|
|
94
|
+
/** Codec decoding an RPC multisig witness into its domain representation. */
|
|
95
|
+
export const MultisigWitness = z.codec(Rpc_, Domain, {
|
|
96
|
+
decode: (value) => core_MultisigWitness.fromRpc(value),
|
|
97
|
+
encode: (value) => core_MultisigWitness.toRpc(value),
|
|
98
|
+
})
|
|
99
|
+
|
|
100
|
+
/** RPC native multisig simulation witness schema. */
|
|
101
|
+
export const Rpc = Rpc_
|
|
@@ -6,6 +6,8 @@ import * as z_Log from '../Log.js'
|
|
|
6
6
|
import * as z_StateOverrides from '../StateOverrides.js'
|
|
7
7
|
import { from } from '../internal/rpcSchemas/from.js'
|
|
8
8
|
import * as z from 'zod/mini'
|
|
9
|
+
import * as z_KeyAuthorization from './KeyAuthorization.js'
|
|
10
|
+
import * as z_MultisigOperation from './MultisigOperation.js'
|
|
9
11
|
import * as z_TransactionRequest from './TransactionRequest.js'
|
|
10
12
|
|
|
11
13
|
const BlockNumberOrTagOrIdentifier = z.union([
|
|
@@ -85,3 +87,44 @@ export const tempo_simulateV1 = from({
|
|
|
85
87
|
|
|
86
88
|
/** JSON-RPC method schemas for the `tempo_` namespace. */
|
|
87
89
|
export const Tempo = { tempo_simulateV1 }
|
|
90
|
+
|
|
91
|
+
/** Schema for the `multisig_approveRawTransaction` JSON-RPC method. */
|
|
92
|
+
export const multisig_approveRawTransaction = from({
|
|
93
|
+
method: 'multisig_approveRawTransaction',
|
|
94
|
+
params: z.tuple([z_Hex.Hex]),
|
|
95
|
+
returns: z_Hex.Hex,
|
|
96
|
+
})
|
|
97
|
+
|
|
98
|
+
/** Schema for the `multisig_approveRawTransactionSync` JSON-RPC method. */
|
|
99
|
+
export const multisig_approveRawTransactionSync = from({
|
|
100
|
+
method: 'multisig_approveRawTransactionSync',
|
|
101
|
+
params: z.tuple([z_Hex.Hex, z.optional(z.number())]),
|
|
102
|
+
returns: z_MultisigOperation.TransactionOperation,
|
|
103
|
+
})
|
|
104
|
+
|
|
105
|
+
/** Schema for the `multisig_approveKeyAuthorization` JSON-RPC method. */
|
|
106
|
+
export const multisig_approveKeyAuthorization = from({
|
|
107
|
+
method: 'multisig_approveKeyAuthorization',
|
|
108
|
+
params: z.tuple([
|
|
109
|
+
z.union([
|
|
110
|
+
z.object({ keyAuthorization: z_KeyAuthorization.Rpc }),
|
|
111
|
+
z.object({ hash: z_Hex.Hex, signature: z_Hex.Hex }),
|
|
112
|
+
]),
|
|
113
|
+
]),
|
|
114
|
+
returns: z_MultisigOperation.KeyAuthorizationOperation,
|
|
115
|
+
})
|
|
116
|
+
|
|
117
|
+
/** Schema for the `multisig_getOperation` JSON-RPC method. */
|
|
118
|
+
export const multisig_getOperation = from({
|
|
119
|
+
method: 'multisig_getOperation',
|
|
120
|
+
params: z.tuple([z_Hex.Hex]),
|
|
121
|
+
returns: z.nullable(z_MultisigOperation.Operation),
|
|
122
|
+
})
|
|
123
|
+
|
|
124
|
+
/** JSON-RPC method schemas for the `multisig_` namespace. */
|
|
125
|
+
export const Multisig = {
|
|
126
|
+
multisig_approveKeyAuthorization,
|
|
127
|
+
multisig_approveRawTransaction,
|
|
128
|
+
multisig_approveRawTransactionSync,
|
|
129
|
+
multisig_getOperation,
|
|
130
|
+
}
|