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.
Files changed (121) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/dist/core/Hash.js +1 -1
  3. package/dist/core/Hash.js.map +1 -1
  4. package/dist/tempo/KeyAuthorization.d.ts +1 -1
  5. package/dist/tempo/KeyAuthorization.d.ts.map +1 -1
  6. package/dist/tempo/MultisigConfig.d.ts +151 -83
  7. package/dist/tempo/MultisigConfig.d.ts.map +1 -1
  8. package/dist/tempo/MultisigConfig.js +164 -86
  9. package/dist/tempo/MultisigConfig.js.map +1 -1
  10. package/dist/tempo/MultisigOperation.d.ts +324 -0
  11. package/dist/tempo/MultisigOperation.d.ts.map +1 -0
  12. package/dist/tempo/MultisigOperation.js +809 -0
  13. package/dist/tempo/MultisigOperation.js.map +1 -0
  14. package/dist/tempo/MultisigWitness.d.ts +106 -0
  15. package/dist/tempo/MultisigWitness.d.ts.map +1 -0
  16. package/dist/tempo/MultisigWitness.js +118 -0
  17. package/dist/tempo/MultisigWitness.js.map +1 -0
  18. package/dist/tempo/RpcSchemaTempo.d.ts +35 -0
  19. package/dist/tempo/RpcSchemaTempo.d.ts.map +1 -1
  20. package/dist/tempo/SignatureEnvelope.d.ts +60 -80
  21. package/dist/tempo/SignatureEnvelope.d.ts.map +1 -1
  22. package/dist/tempo/SignatureEnvelope.js +87 -146
  23. package/dist/tempo/SignatureEnvelope.js.map +1 -1
  24. package/dist/tempo/TransactionRequest.d.ts +9 -17
  25. package/dist/tempo/TransactionRequest.d.ts.map +1 -1
  26. package/dist/tempo/TransactionRequest.js +7 -7
  27. package/dist/tempo/TransactionRequest.js.map +1 -1
  28. package/dist/tempo/TxEnvelopeTempo.d.ts +3 -2
  29. package/dist/tempo/TxEnvelopeTempo.d.ts.map +1 -1
  30. package/dist/tempo/TxEnvelopeTempo.js +3 -2
  31. package/dist/tempo/TxEnvelopeTempo.js.map +1 -1
  32. package/dist/tempo/index.d.ts +22 -2
  33. package/dist/tempo/index.d.ts.map +1 -1
  34. package/dist/tempo/index.js +22 -2
  35. package/dist/tempo/index.js.map +1 -1
  36. package/dist/zod/tempo/AuthorizationTempo.d.ts +110 -110
  37. package/dist/zod/tempo/AuthorizationTempo.d.ts.map +1 -1
  38. package/dist/zod/tempo/KeyAuthorization.d.ts +90 -83
  39. package/dist/zod/tempo/KeyAuthorization.d.ts.map +1 -1
  40. package/dist/zod/tempo/MultisigConfig.d.ts +31 -2
  41. package/dist/zod/tempo/MultisigConfig.d.ts.map +1 -1
  42. package/dist/zod/tempo/MultisigConfig.js +26 -3
  43. package/dist/zod/tempo/MultisigConfig.js.map +1 -1
  44. package/dist/zod/tempo/MultisigOperation.d.ts +168 -0
  45. package/dist/zod/tempo/MultisigOperation.d.ts.map +1 -0
  46. package/dist/zod/tempo/MultisigOperation.js +65 -0
  47. package/dist/zod/tempo/MultisigOperation.js.map +1 -0
  48. package/dist/zod/tempo/MultisigWitness.d.ts +152 -0
  49. package/dist/zod/tempo/MultisigWitness.d.ts.map +1 -0
  50. package/dist/zod/tempo/MultisigWitness.js +76 -0
  51. package/dist/zod/tempo/MultisigWitness.js.map +1 -0
  52. package/dist/zod/tempo/RpcSchemaTempo.d.ts +607 -102
  53. package/dist/zod/tempo/RpcSchemaTempo.d.ts.map +1 -1
  54. package/dist/zod/tempo/RpcSchemaTempo.js +38 -0
  55. package/dist/zod/tempo/RpcSchemaTempo.js.map +1 -1
  56. package/dist/zod/tempo/SignatureEnvelope.d.ts +33 -33
  57. package/dist/zod/tempo/SignatureEnvelope.d.ts.map +1 -1
  58. package/dist/zod/tempo/SignatureEnvelope.js +9 -16
  59. package/dist/zod/tempo/SignatureEnvelope.js.map +1 -1
  60. package/dist/zod/tempo/Transaction.d.ts +228 -222
  61. package/dist/zod/tempo/Transaction.d.ts.map +1 -1
  62. package/dist/zod/tempo/TransactionRequest.d.ts +379 -176
  63. package/dist/zod/tempo/TransactionRequest.d.ts.map +1 -1
  64. package/dist/zod/tempo/TransactionRequest.js +11 -22
  65. package/dist/zod/tempo/TransactionRequest.js.map +1 -1
  66. package/dist/zod/tempo/TxEnvelopeTempo.d.ts +60 -48
  67. package/dist/zod/tempo/TxEnvelopeTempo.d.ts.map +1 -1
  68. package/dist/zod/tempo/ZoneRpcAuthentication.d.ts +15 -12
  69. package/dist/zod/tempo/ZoneRpcAuthentication.d.ts.map +1 -1
  70. package/dist/zod/tempo/z.d.ts +2 -0
  71. package/dist/zod/tempo/z.d.ts.map +1 -1
  72. package/dist/zod/tempo/z.js +2 -0
  73. package/dist/zod/tempo/z.js.map +1 -1
  74. package/package.json +21 -1
  75. package/src/core/Hash.ts +1 -1
  76. package/src/core/_test/Hash.test.ts +15 -0
  77. package/src/tempo/KeyAuthorization.test-d.ts +13 -1
  78. package/src/tempo/KeyAuthorization.test.ts +65 -0
  79. package/src/tempo/KeyAuthorization.ts +1 -1
  80. package/src/tempo/MultisigConfig.test-d.ts +52 -0
  81. package/src/tempo/MultisigConfig.test.ts +288 -227
  82. package/src/tempo/MultisigConfig.ts +275 -104
  83. package/src/tempo/MultisigOperation.test-d.ts +77 -0
  84. package/src/tempo/MultisigOperation.test.ts +1883 -0
  85. package/src/tempo/MultisigOperation.ts +1254 -0
  86. package/src/tempo/MultisigWitness.test-d.ts +42 -0
  87. package/src/tempo/MultisigWitness.test.ts +288 -0
  88. package/src/tempo/MultisigWitness.ts +210 -0
  89. package/src/tempo/RpcSchemaTempo.test-d.ts +56 -0
  90. package/src/tempo/RpcSchemaTempo.ts +37 -0
  91. package/src/tempo/SignatureEnvelope.test-d.ts +63 -46
  92. package/src/tempo/SignatureEnvelope.test.ts +523 -500
  93. package/src/tempo/SignatureEnvelope.ts +172 -242
  94. package/src/tempo/TransactionRequest.test-d.ts +11 -0
  95. package/src/tempo/TransactionRequest.test.ts +285 -33
  96. package/src/tempo/TransactionRequest.ts +15 -20
  97. package/src/tempo/TxEnvelopeTempo.test-d.ts +7 -0
  98. package/src/tempo/TxEnvelopeTempo.test.ts +25 -0
  99. package/src/tempo/TxEnvelopeTempo.ts +5 -3
  100. package/src/tempo/index.ts +22 -2
  101. package/src/tempo/multisig.e2e.test.ts +113 -86
  102. package/src/version.ts +1 -1
  103. package/src/zod/tempo/MultisigConfig.ts +29 -3
  104. package/src/zod/tempo/MultisigOperation.ts +69 -0
  105. package/src/zod/tempo/MultisigWitness.ts +101 -0
  106. package/src/zod/tempo/RpcSchemaTempo.ts +43 -0
  107. package/src/zod/tempo/SignatureEnvelope.ts +20 -38
  108. package/src/zod/tempo/TransactionRequest.ts +17 -26
  109. package/src/zod/tempo/_test/KeyAuthorization.test.ts +11 -0
  110. package/src/zod/tempo/_test/MultisigConfig.test-d.ts +13 -0
  111. package/src/zod/tempo/_test/MultisigConfig.test.ts +13 -2
  112. package/src/zod/tempo/_test/MultisigOperation.test-d.ts +27 -0
  113. package/src/zod/tempo/_test/MultisigOperation.test.ts +68 -0
  114. package/src/zod/tempo/_test/MultisigWitness.test-d.ts +13 -0
  115. package/src/zod/tempo/_test/MultisigWitness.test.ts +149 -0
  116. package/src/zod/tempo/_test/RpcSchemaTempo.test-d.ts +31 -0
  117. package/src/zod/tempo/_test/RpcSchemaTempo.test.ts +41 -0
  118. package/src/zod/tempo/_test/SignatureEnvelope.test-d.ts +1 -1
  119. package/src/zod/tempo/_test/SignatureEnvelope.test.ts +25 -34
  120. package/src/zod/tempo/_test/TransactionRequest.test.ts +176 -8
  121. 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
- initialConfig: MultisigConfig.Config
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 { initialConfig, payload, signers, version = 0n } = parameters
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
- initialConfig,
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: multisigSignature({
115
- initialConfig: multisig.initialConfig,
116
- init: true,
117
- payload: TxEnvelopeTempo.getSignPayload(transaction),
118
- signers: multisig.ownerKeys,
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
- owners: [{ owner: replacement.address, weight: 1 }],
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
- initialConfig,
172
- init: true,
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)?.init,
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
- initialConfig,
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
- initialConfig,
258
+ account,
259
+ config: rotatedConfig,
263
260
  signatures: approve({
264
- initialConfig,
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
- initialConfig: child.initialConfig,
299
- init: true,
295
+ account: child.account,
296
+ config: child.initialConfig,
300
297
  signatures: approve({
301
- initialConfig: child.initialConfig,
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
- initialConfig,
330
+ account,
331
+ config: initialConfig,
334
332
  payload: TxEnvelopeTempo.getSignPayload(bootstrap),
335
333
  })
336
334
  const nested = SignatureEnvelope.from({
337
- initialConfig: child.initialConfig,
335
+ account: child.account,
336
+ config: child.initialConfig,
338
337
  signatures: approve({
339
- initialConfig: child.initialConfig,
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
- initialConfig,
347
- init: true,
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
- initialConfig,
370
+ account,
371
+ config: initialConfig,
372
372
  payload: TxEnvelopeTempo.getSignPayload(transaction),
373
373
  })
374
- const childSignature = multisigSignature({
375
- initialConfig: child.initialConfig,
376
- payload: parentDigest,
377
- signers: child.ownerKeys,
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
- initialConfig,
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: multisigSignature({
414
- initialConfig: multisig.initialConfig,
415
- payload: TxEnvelopeTempo.getSignPayload(transaction),
416
- signers: multisig.ownerKeys,
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: multisigSignature({
465
- initialConfig: multisig.initialConfig,
466
- payload: TxEnvelopeTempo.getSignPayload(sponsored),
467
- signers: multisig.ownerKeys,
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: multisigSignature({
502
- initialConfig,
503
- init,
504
- payload: TxEnvelopeTempo.getSignPayload(value),
505
- signers,
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]!], true)],
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
- initialConfig,
572
- init: true,
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
- initialConfig,
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: multisigSignature({
748
- initialConfig: multisig.initialConfig,
749
- init: true,
750
- payload: KeyAuthorization.getSignPayload(keyAuthorization),
751
- signers: multisig.ownerKeys,
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: multisigSignature({
791
- initialConfig: multisig.initialConfig,
792
- payload: KeyAuthorization.getSignPayload(keyAuthorization),
793
- signers: multisig.ownerKeys,
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: multisigSignature({
809
- initialConfig: multisig.initialConfig,
810
- init: true,
811
- payload: TxEnvelopeTempo.getSignPayload(bootstrapTransaction),
812
- signers: multisig.ownerKeys,
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.1'
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
+ }