ox 1.7.1 → 1.7.4

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 (123) hide show
  1. package/CHANGELOG.md +42 -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 +2 -2
  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 +340 -0
  11. package/dist/tempo/MultisigOperation.d.ts.map +1 -0
  12. package/dist/tempo/MultisigOperation.js +839 -0
  13. package/dist/tempo/MultisigOperation.js.map +1 -0
  14. package/dist/tempo/MultisigSimulation.d.ts +132 -0
  15. package/dist/tempo/MultisigSimulation.d.ts.map +1 -0
  16. package/dist/tempo/MultisigSimulation.js +140 -0
  17. package/dist/tempo/MultisigSimulation.js.map +1 -0
  18. package/dist/tempo/RpcSchemaTempo.d.ts +45 -0
  19. package/dist/tempo/RpcSchemaTempo.d.ts.map +1 -1
  20. package/dist/tempo/SignatureEnvelope.d.ts +55 -86
  21. package/dist/tempo/SignatureEnvelope.d.ts.map +1 -1
  22. package/dist/tempo/SignatureEnvelope.js +93 -158
  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 +60 -180
  37. package/dist/zod/tempo/AuthorizationTempo.d.ts.map +1 -1
  38. package/dist/zod/tempo/KeyAuthorization.d.ts +65 -118
  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 +158 -0
  45. package/dist/zod/tempo/MultisigOperation.d.ts.map +1 -0
  46. package/dist/zod/tempo/MultisigOperation.js +62 -0
  47. package/dist/zod/tempo/MultisigOperation.js.map +1 -0
  48. package/dist/zod/tempo/MultisigSimulation.d.ts +120 -0
  49. package/dist/zod/tempo/MultisigSimulation.d.ts.map +1 -0
  50. package/dist/zod/tempo/MultisigSimulation.js +78 -0
  51. package/dist/zod/tempo/MultisigSimulation.js.map +1 -0
  52. package/dist/zod/tempo/RpcSchemaTempo.d.ts +528 -144
  53. package/dist/zod/tempo/RpcSchemaTempo.d.ts.map +1 -1
  54. package/dist/zod/tempo/RpcSchemaTempo.js +47 -0
  55. package/dist/zod/tempo/RpcSchemaTempo.js.map +1 -1
  56. package/dist/zod/tempo/SignatureEnvelope.d.ts +18 -54
  57. package/dist/zod/tempo/SignatureEnvelope.d.ts.map +1 -1
  58. package/dist/zod/tempo/SignatureEnvelope.js +5 -22
  59. package/dist/zod/tempo/SignatureEnvelope.js.map +1 -1
  60. package/dist/zod/tempo/Transaction.d.ts +138 -348
  61. package/dist/zod/tempo/Transaction.d.ts.map +1 -1
  62. package/dist/zod/tempo/TransactionRequest.d.ts +286 -239
  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/AuthorizationTempo.test.ts +4 -0
  78. package/src/tempo/KeyAuthorization.test-d.ts +13 -12
  79. package/src/tempo/KeyAuthorization.test.ts +109 -3
  80. package/src/tempo/KeyAuthorization.ts +4 -4
  81. package/src/tempo/MultisigConfig.test-d.ts +52 -0
  82. package/src/tempo/MultisigConfig.test.ts +288 -227
  83. package/src/tempo/MultisigConfig.ts +275 -104
  84. package/src/tempo/MultisigOperation.test-d.ts +79 -0
  85. package/src/tempo/MultisigOperation.test.ts +1950 -0
  86. package/src/tempo/MultisigOperation.ts +1293 -0
  87. package/src/tempo/MultisigSimulation.test-d.ts +33 -0
  88. package/src/tempo/MultisigSimulation.test.ts +283 -0
  89. package/src/tempo/MultisigSimulation.ts +266 -0
  90. package/src/tempo/RpcSchemaTempo.test-d.ts +91 -0
  91. package/src/tempo/RpcSchemaTempo.ts +46 -0
  92. package/src/tempo/SignatureEnvelope.test-d.ts +33 -72
  93. package/src/tempo/SignatureEnvelope.test.ts +533 -500
  94. package/src/tempo/SignatureEnvelope.ts +171 -258
  95. package/src/tempo/Transaction.test.ts +61 -0
  96. package/src/tempo/TransactionRequest.test-d.ts +11 -0
  97. package/src/tempo/TransactionRequest.test.ts +214 -41
  98. package/src/tempo/TransactionRequest.ts +19 -20
  99. package/src/tempo/TxEnvelopeTempo.test-d.ts +7 -0
  100. package/src/tempo/TxEnvelopeTempo.test.ts +25 -0
  101. package/src/tempo/TxEnvelopeTempo.ts +5 -3
  102. package/src/tempo/index.ts +22 -2
  103. package/src/tempo/multisig.e2e.test.ts +164 -87
  104. package/src/version.ts +1 -1
  105. package/src/zod/tempo/MultisigConfig.ts +29 -3
  106. package/src/zod/tempo/MultisigOperation.ts +66 -0
  107. package/src/zod/tempo/MultisigSimulation.ts +98 -0
  108. package/src/zod/tempo/RpcSchemaTempo.ts +53 -0
  109. package/src/zod/tempo/SignatureEnvelope.ts +12 -54
  110. package/src/zod/tempo/TransactionRequest.ts +17 -26
  111. package/src/zod/tempo/_test/KeyAuthorization.test.ts +2 -4
  112. package/src/zod/tempo/_test/MultisigConfig.test-d.ts +13 -0
  113. package/src/zod/tempo/_test/MultisigConfig.test.ts +13 -2
  114. package/src/zod/tempo/_test/MultisigOperation.test-d.ts +27 -0
  115. package/src/zod/tempo/_test/MultisigOperation.test.ts +66 -0
  116. package/src/zod/tempo/_test/MultisigSimulation.test-d.ts +13 -0
  117. package/src/zod/tempo/_test/MultisigSimulation.test.ts +78 -0
  118. package/src/zod/tempo/_test/RpcSchemaTempo.test-d.ts +48 -0
  119. package/src/zod/tempo/_test/RpcSchemaTempo.test.ts +83 -0
  120. package/src/zod/tempo/_test/SignatureEnvelope.test-d.ts +1 -1
  121. package/src/zod/tempo/_test/SignatureEnvelope.test.ts +57 -120
  122. package/src/zod/tempo/_test/TransactionRequest.test.ts +43 -16
  123. package/src/zod/tempo/z.ts +2 -0
@@ -1,4 +1,5 @@
1
1
  /* eslint-disable jsdoc-js/require-jsdoc, jsdoc-js/require-description, jsdoc-js/require-example */
2
+ import * as z_Address from '../Address.js'
2
3
  import * as z_Block from '../Block.js'
3
4
  import * as z_BlockOverrides from '../BlockOverrides.js'
4
5
  import * as z_Hex from '../Hex.js'
@@ -6,6 +7,9 @@ import * as z_Log from '../Log.js'
6
7
  import * as z_StateOverrides from '../StateOverrides.js'
7
8
  import { from } from '../internal/rpcSchemas/from.js'
8
9
  import * as z from 'zod/mini'
10
+ import * as z_KeyAuthorization from './KeyAuthorization.js'
11
+ import * as z_MultisigConfig from './MultisigConfig.js'
12
+ import * as z_MultisigOperation from './MultisigOperation.js'
9
13
  import * as z_TransactionRequest from './TransactionRequest.js'
10
14
 
11
15
  const BlockNumberOrTagOrIdentifier = z.union([
@@ -85,3 +89,52 @@ export const tempo_simulateV1 = from({
85
89
 
86
90
  /** JSON-RPC method schemas for the `tempo_` namespace. */
87
91
  export const Tempo = { tempo_simulateV1 }
92
+
93
+ /** Schema for the `multisig_approveKeyAuthorization` JSON-RPC method. */
94
+ export const multisig_approveKeyAuthorization = from({
95
+ method: 'multisig_approveKeyAuthorization',
96
+ params: z.tuple([
97
+ z.union([
98
+ z.object({ keyAuthorization: z_KeyAuthorization.Rpc }),
99
+ z.object({ hash: z_Hex.Hex, signature: z_Hex.Hex }),
100
+ ]),
101
+ ]),
102
+ returns: z_MultisigOperation.KeyAuthorizationOperation,
103
+ })
104
+
105
+ /** Schema for the `multisig_approveRawTransaction` JSON-RPC method. */
106
+ export const multisig_approveRawTransaction = from({
107
+ method: 'multisig_approveRawTransaction',
108
+ params: z.tuple([z_Hex.Hex]),
109
+ returns: z_Hex.Hex,
110
+ })
111
+
112
+ /** Schema for the `multisig_approveRawTransactionSync` JSON-RPC method. */
113
+ export const multisig_approveRawTransactionSync = from({
114
+ method: 'multisig_approveRawTransactionSync',
115
+ params: z.tuple([z_Hex.Hex, z.optional(z.number())]),
116
+ returns: z_MultisigOperation.TransactionOperation,
117
+ })
118
+
119
+ /** Schema for the `multisig_getConfig` JSON-RPC method. */
120
+ export const multisig_getConfig = from({
121
+ method: 'multisig_getConfig',
122
+ params: z.tuple([z.object({ address: z_Address.Address })]),
123
+ returns: z.nullable(z_MultisigConfig.Rpc),
124
+ })
125
+
126
+ /** Schema for the `multisig_getOperation` JSON-RPC method. */
127
+ export const multisig_getOperation = from({
128
+ method: 'multisig_getOperation',
129
+ params: z.tuple([z_Hex.Hex]),
130
+ returns: z.nullable(z_MultisigOperation.Operation),
131
+ })
132
+
133
+ /** JSON-RPC method schemas for the `multisig_` namespace. */
134
+ export const Multisig = {
135
+ multisig_approveKeyAuthorization,
136
+ multisig_approveRawTransaction,
137
+ multisig_approveRawTransactionSync,
138
+ multisig_getConfig,
139
+ multisig_getOperation,
140
+ }
@@ -85,54 +85,15 @@ export const KeychainRpc = z.object({
85
85
  })
86
86
 
87
87
  /** RPC native multisig signature envelope schema. */
88
- export const MultisigRpc = z
89
- .union([
90
- z.strictObject({
91
- account: z_Address.Address,
92
- signatures: z.lazy(
93
- (): z.ZodMiniType<
94
- readonly core_SignatureEnvelope.SignatureEnvelopeRpc[],
95
- readonly core_SignatureEnvelope.SignatureEnvelopeRpc[]
96
- > =>
97
- z.readonly(
98
- z
99
- .array(Rpc)
100
- .check(
101
- z.minLength(1),
102
- z.maxLength(core_MultisigConfig.maxSignatures),
103
- ),
104
- ) as never,
105
- ),
106
- }),
107
- z.strictObject({
108
- init: z_MultisigConfig.Config,
109
- signatures: z.lazy(
110
- (): z.ZodMiniType<
111
- readonly core_SignatureEnvelope.SignatureEnvelopeRpc[],
112
- readonly core_SignatureEnvelope.SignatureEnvelopeRpc[]
113
- > =>
114
- z.readonly(
115
- z
116
- .array(Rpc)
117
- .check(
118
- z.minLength(1),
119
- z.maxLength(core_MultisigConfig.maxSignatures),
120
- ),
121
- ) as never,
122
- ),
123
- }),
124
- ])
125
- // Keep invalid recursive approvals inside Zod's issue path.
126
- .check(
127
- z.refine((value) => {
128
- try {
129
- core_SignatureEnvelope.fromRpc(value)
130
- return true
131
- } catch {
132
- return false
133
- }
134
- }, 'expected valid native multisig signature'),
135
- )
88
+ export const MultisigRpc = z_Hex.Hex.check(
89
+ z.refine((value) => {
90
+ try {
91
+ return core_SignatureEnvelope.fromRpc(value).type === 'multisig'
92
+ } catch {
93
+ return false
94
+ }
95
+ }, 'expected valid native multisig signature'),
96
+ )
136
97
 
137
98
  /** RPC signature envelope schema. */
138
99
  export const Rpc = z.union([
@@ -188,7 +149,7 @@ export const Keychain = z.object({
188
149
  export const Multisig = z
189
150
  .object({
190
151
  account: z_Address.Address,
191
- init: z.optional(z_MultisigConfig.Config),
152
+ config: z_MultisigConfig.Config,
192
153
  // `signatures` is recursive; type the getter concretely to break the cycle.
193
154
  signatures: z.lazy(
194
155
  (): z.ZodMiniType<readonly core_SignatureEnvelope.SignatureEnvelope[]> =>
@@ -227,6 +188,8 @@ export const Serialized = z_Hex.Hex
227
188
  function fromRpc(
228
189
  value: core_SignatureEnvelope.SignatureEnvelopeRpc,
229
190
  ): core_SignatureEnvelope.SignatureEnvelope {
191
+ if (typeof value === 'string') return core_SignatureEnvelope.fromRpc(value)
192
+
230
193
  if (value.type === 'secp256k1') {
231
194
  const secp256k1 = value as core_SignatureEnvelope.Secp256k1Rpc
232
195
  return {
@@ -273,11 +236,6 @@ function fromRpc(
273
236
  }
274
237
  }
275
238
 
276
- if ('signatures' in value && ('account' in value || 'init' in value))
277
- return core_SignatureEnvelope.fromRpc(
278
- value as core_SignatureEnvelope.MultisigRpc,
279
- )
280
-
281
239
  const keychain = value as core_SignatureEnvelope.KeychainRpc
282
240
  return {
283
241
  inner: fromRpc(keychain.signature),
@@ -1,6 +1,6 @@
1
1
  /* eslint-disable jsdoc-js/require-jsdoc, jsdoc-js/require-description, jsdoc-js/require-example */
2
- import type * as core_TransactionRequest from '../../tempo/TransactionRequest.js'
3
2
  import * as core_Hex from '../../core/Hex.js'
3
+ import type * as core_TransactionRequest from '../../tempo/TransactionRequest.js'
4
4
  import * as z_AccessList from '../AccessList.js'
5
5
  import * as z_Address from '../Address.js'
6
6
  import * as z_Hex from '../Hex.js'
@@ -13,6 +13,7 @@ import {
13
13
  import * as z from 'zod/mini'
14
14
  import * as z_AuthorizationTempo from './AuthorizationTempo.js'
15
15
  import * as z_KeyAuthorization from './KeyAuthorization.js'
16
+ import * as z_MultisigSimulation from './MultisigSimulation.js'
16
17
  import * as z_SignatureEnvelope from './SignatureEnvelope.js'
17
18
 
18
19
  const fromRpcType = { '0x76': 'tempo' } as const
@@ -58,14 +59,6 @@ const CallToRpc = z.object({
58
59
 
59
60
  const Capabilities = z.record(z.string(), z.unknown())
60
61
 
61
- const MultisigInit = z.object({
62
- salt: z_Hex.Hex,
63
- threshold: z.number(),
64
- owners: z.readonly(
65
- z.array(z.object({ owner: z_Address.Address, weight: z.number() })),
66
- ),
67
- })
68
-
69
62
  /** RPC tempo transaction request schema. */
70
63
  export const Rpc = z.object({
71
64
  accessList: z.optional(z_AccessList.AccessList),
@@ -90,8 +83,7 @@ export const Rpc = z.object({
90
83
  maxFeePerBlobGas: z.optional(z_Hex.Hex),
91
84
  maxFeePerGas: z.optional(z_Hex.Hex),
92
85
  maxPriorityFeePerGas: z.optional(z_Hex.Hex),
93
- multisigInit: z.optional(MultisigInit),
94
- multisigSignatureCount: z.optional(z.number()),
86
+ multisigSimulation: z.optional(z_MultisigSimulation.Rpc),
95
87
  nonce: z.optional(z_Hex.Hex),
96
88
  nonceKey: z.optional(z_Hex.Hex),
97
89
  r: z.optional(z_Hex.Hex),
@@ -144,8 +136,7 @@ export const Domain = z.object({
144
136
  maxFeePerBlobGas: z.optional(z.bigint()),
145
137
  maxFeePerGas: z.optional(z.bigint()),
146
138
  maxPriorityFeePerGas: z.optional(z.bigint()),
147
- multisigInit: z.optional(MultisigInit),
148
- multisigSignatureCount: z.optional(z.number()),
139
+ multisigSimulation: z.optional(z_MultisigSimulation.Domain),
149
140
  nonce: z.optional(z.bigint()),
150
141
  nonceKey: z.optional(z.union([z.bigint(), z.literal('random')])),
151
142
  r: z.optional(z_Hex.Hex),
@@ -184,8 +175,7 @@ export const DomainToRpc = z.object({
184
175
  maxFeePerBlobGas: z.optional(uintBigintNumberish()),
185
176
  maxFeePerGas: z.optional(uintBigintNumberish()),
186
177
  maxPriorityFeePerGas: z.optional(uintBigintNumberish()),
187
- multisigInit: z.optional(MultisigInit),
188
- multisigSignatureCount: z.optional(z.number()),
178
+ multisigSimulation: z.optional(z_MultisigSimulation.Domain),
189
179
  nonce: z.optional(uintBigintNumberish()),
190
180
  nonceKey: z.optional(z.union([uintBigintNumberish(), z.literal('random')])),
191
181
  r: z.optional(z_Hex.Hex),
@@ -216,7 +206,7 @@ export const TransactionRequestToRpc = z.codec(Rpc, DomainToRpc, {
216
206
  function fromRpc(
217
207
  request: core_TransactionRequest.Rpc,
218
208
  ): core_TransactionRequest.TransactionRequest {
219
- const { authorizationList: _, ...rest } = request
209
+ const { authorizationList: _, multisigSimulation: __, ...rest } = request
220
210
  const request_ = z.decode(
221
211
  z_TransactionRequest.TransactionRequest,
222
212
  rest as never,
@@ -260,10 +250,11 @@ function fromRpc(
260
250
  if (typeof request.keyData !== 'undefined') request_.keyData = request.keyData
261
251
  if (typeof request.keyId !== 'undefined') request_.keyId = request.keyId
262
252
  if (typeof request.keyType !== 'undefined') request_.keyType = request.keyType
263
- if (typeof request.multisigInit !== 'undefined')
264
- request_.multisigInit = request.multisigInit
265
- if (typeof request.multisigSignatureCount !== 'undefined')
266
- request_.multisigSignatureCount = request.multisigSignatureCount
253
+ if (typeof request.multisigSimulation !== 'undefined')
254
+ request_.multisigSimulation = z.decode(
255
+ z_MultisigSimulation.MultisigSimulation,
256
+ request.multisigSimulation,
257
+ )
267
258
  if (typeof request.validBefore !== 'undefined')
268
259
  request_.validBefore = core_Hex.toNumber(request.validBefore)
269
260
  if (typeof request.validAfter !== 'undefined')
@@ -292,8 +283,7 @@ function toRpc(
292
283
  typeof request.keyData !== 'undefined' ||
293
284
  typeof request.keyId !== 'undefined' ||
294
285
  typeof request.keyType !== 'undefined' ||
295
- typeof request.multisigInit !== 'undefined' ||
296
- typeof request.multisigSignatureCount !== 'undefined' ||
286
+ typeof request.multisigSimulation !== 'undefined' ||
297
287
  typeof request.nonceKey !== 'undefined' ||
298
288
  typeof request.validBefore !== 'undefined' ||
299
289
  typeof request.validAfter !== 'undefined' ||
@@ -348,10 +338,11 @@ function toRpc(
348
338
  if (typeof request.keyId !== 'undefined') request_rpc.keyId = request.keyId
349
339
  if (typeof request.keyType !== 'undefined')
350
340
  request_rpc.keyType = request.keyType
351
- if (typeof request.multisigInit !== 'undefined')
352
- request_rpc.multisigInit = request.multisigInit
353
- if (typeof request.multisigSignatureCount !== 'undefined')
354
- request_rpc.multisigSignatureCount = request.multisigSignatureCount
341
+ if (typeof request.multisigSimulation !== 'undefined')
342
+ request_rpc.multisigSimulation = z.encode(
343
+ z_MultisigSimulation.MultisigSimulation,
344
+ request.multisigSimulation,
345
+ )
355
346
  if (typeof request.validBefore !== 'undefined')
356
347
  request_rpc.validBefore = encodeNumberish(request.validBefore)
357
348
  if (typeof request.validAfter !== 'undefined')
@@ -142,10 +142,8 @@ describe('KeyAuthorization', () => {
142
142
  })
143
143
 
144
144
  test('round-trips multisig signatures', () => {
145
- const multisigRpc = {
146
- account: '0x1111111111111111111111111111111111111111',
147
- signatures: [rpc.signature],
148
- } as const
145
+ const multisigRpc =
146
+ '0xf89794be95c3f554e9fc85ec51be69a3d807a0d55bcf2cf83ba000000000000000000000000000000000000000000000000000000000000000000101d7d694f39fd6e51aad88f6f4ce6ab8827279cfffb9226601f843b841fa78c5905fb0b9d6066ef531f962a62bc6ef0d5eb59ecb134056d206f75aaed7780926ff2601a935c2c79707d9e1799948c9f19dcdde1e090e903b19a07923d01c' as const
149
147
  const withMultisig = { ...rpc, signature: multisigRpc }
150
148
  const decoded = z.decode(z_KeyAuthorization.KeyAuthorization, withMultisig)
151
149
  expect(decoded).toEqual(core_KeyAuthorization.fromRpc(withMultisig))
@@ -0,0 +1,13 @@
1
+ import type * as core_MultisigConfig from '../../../tempo/MultisigConfig.js'
2
+ import type * as z from 'zod/mini'
3
+ import { expectTypeOf, test } from 'vp/test'
4
+ import * as z_MultisigConfig from '../MultisigConfig.js'
5
+
6
+ test('MultisigConfig decodes RPC configurations', () => {
7
+ expectTypeOf<core_MultisigConfig.Rpc>().toMatchTypeOf<
8
+ z.input<typeof z_MultisigConfig.MultisigConfig>
9
+ >()
10
+ expectTypeOf<
11
+ z.output<typeof z_MultisigConfig.MultisigConfig>
12
+ >().toMatchTypeOf<core_MultisigConfig.Config>()
13
+ })
@@ -9,20 +9,31 @@ const config = {
9
9
  weight: 1,
10
10
  },
11
11
  ],
12
+ salt: '0x0000000000000000000000000000000000000000000000000000000000000000',
12
13
  threshold: 1,
14
+ version: 0n,
13
15
  } as const
14
16
 
17
+ const rpc = { ...config, version: '0x0' } as const
18
+
15
19
  describe('Config', () => {
16
20
  test('accepts valid native multisig configurations', () => {
17
21
  expect(z.safeDecode(z_MultisigConfig.Config, config).success).toBe(true)
18
22
  })
19
23
 
24
+ test('round-trips RPC configurations', () => {
25
+ const decoded = z.decode(z_MultisigConfig.MultisigConfig, rpc)
26
+
27
+ expect(decoded).toEqual(config)
28
+ expect(z.encode(z_MultisigConfig.MultisigConfig, decoded)).toEqual(rpc)
29
+ })
30
+
20
31
  test('rejects configurations outside protocol limits', () => {
21
32
  expect(
22
33
  z.safeDecode(z_MultisigConfig.Config, {
23
34
  ...config,
24
- owners: [{ ...config.owners[0], weight: 9 }],
25
- threshold: 9,
35
+ owners: [{ ...config.owners[0], weight: 255 }],
36
+ threshold: 256,
26
37
  }).success,
27
38
  ).toMatchInlineSnapshot(`false`)
28
39
  })
@@ -0,0 +1,27 @@
1
+ import type * as core_MultisigOperation from '../../../tempo/MultisigOperation.js'
2
+ import type * as z from 'zod/mini'
3
+ import { expectTypeOf, test } from 'vp/test'
4
+ import * as z_MultisigOperation from '../MultisigOperation.js'
5
+
6
+ test('operation schemas decode RPC operations', () => {
7
+ expectTypeOf<core_MultisigOperation.TransactionRpc>().toMatchTypeOf<
8
+ z.input<typeof z_MultisigOperation.TransactionOperation>
9
+ >()
10
+ expectTypeOf<
11
+ z.output<typeof z_MultisigOperation.TransactionOperation>
12
+ >().toMatchTypeOf<core_MultisigOperation.TransactionOperation>()
13
+
14
+ expectTypeOf<core_MultisigOperation.KeyAuthorizationRpc>().toMatchTypeOf<
15
+ z.input<typeof z_MultisigOperation.KeyAuthorizationOperation>
16
+ >()
17
+ expectTypeOf<
18
+ z.output<typeof z_MultisigOperation.KeyAuthorizationOperation>
19
+ >().toMatchTypeOf<core_MultisigOperation.KeyAuthorizationOperation>()
20
+
21
+ expectTypeOf<core_MultisigOperation.Rpc>().toMatchTypeOf<
22
+ z.input<typeof z_MultisigOperation.Operation>
23
+ >()
24
+ expectTypeOf<
25
+ z.output<typeof z_MultisigOperation.Operation>
26
+ >().toMatchTypeOf<core_MultisigOperation.Operation>()
27
+ })
@@ -0,0 +1,66 @@
1
+ import { describe, expect, test } from 'vp/test'
2
+ import * as core_MultisigOperation from '../../../tempo/MultisigOperation.js'
3
+ import * as z_MultisigOperation from '../MultisigOperation.js'
4
+ import * as z from 'zod/mini'
5
+
6
+ const rpc = {
7
+ account: '0xf81b7763d3a6876195d780865bd783dbd97dd36e',
8
+ approvals: [
9
+ '0x01000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000065ecbe4d1a6330a44c8f7ef951d4bf165e6c6b721efada985fb41661bc6e7fd6c8734640c4998ff7e374b06ce1a64a2ecd82ab036384fb83d9a79b127a27d503200',
10
+ ],
11
+ config: {
12
+ owners: [
13
+ {
14
+ owner: '0x07e1ed8ea0e9601e5546b0a03aed683df3601407',
15
+ weight: 1,
16
+ },
17
+ {
18
+ owner: '0x288f0cd85005f34168f731a468aef268c2f9456f',
19
+ weight: 1,
20
+ },
21
+ ],
22
+ salt: '0x0000000000000000000000000000000000000000000000000000000000000000',
23
+ threshold: 2,
24
+ version: '0x1',
25
+ },
26
+ createdAt: 1,
27
+ hash: '0xcdbc24a8fb192f799c5d166b13a99fb29cbb15e71a5e730988d6f8b3c5959d02',
28
+ signatureCount: 1,
29
+ status: 'pending',
30
+ threshold: 2,
31
+ transaction:
32
+ '0x76e9821079808080dad99407e1ed8ea0e9601e5546b0a03aed683df360140780821234c0808080808080c0',
33
+ type: 'transaction',
34
+ updatedAt: 2,
35
+ weight: 1,
36
+ } as const
37
+
38
+ describe('TransactionOperation', () => {
39
+ test('decodes an RPC operation', () => {
40
+ expect(z.decode(z_MultisigOperation.TransactionOperation, rpc)).toEqual(
41
+ core_MultisigOperation.fromRpc(rpc),
42
+ )
43
+ })
44
+
45
+ test('round-trips via encode', () => {
46
+ const operation = z.decode(z_MultisigOperation.TransactionOperation, rpc)
47
+ expect(
48
+ z.encode(z_MultisigOperation.TransactionOperation, operation),
49
+ ).toEqual(core_MultisigOperation.toRpc(operation))
50
+ })
51
+
52
+ test('rejects internally inconsistent operations', () => {
53
+ expect(
54
+ z.safeDecode(z_MultisigOperation.TransactionOperation, {
55
+ ...rpc,
56
+ weight: 2,
57
+ }).success,
58
+ ).toBe(false)
59
+ })
60
+ })
61
+
62
+ describe('Operation', () => {
63
+ test('accepts transaction operations', () => {
64
+ expect(z.safeDecode(z_MultisigOperation.Operation, rpc).success).toBe(true)
65
+ })
66
+ })
@@ -0,0 +1,13 @@
1
+ import type * as core_MultisigSimulation from '../../../tempo/MultisigSimulation.js'
2
+ import type * as z from 'zod/mini'
3
+ import { expectTypeOf, test } from 'vp/test'
4
+ import * as z_MultisigSimulation from '../MultisigSimulation.js'
5
+
6
+ test('MultisigSimulation decodes RPC specs', () => {
7
+ expectTypeOf<core_MultisigSimulation.Rpc>().toMatchTypeOf<
8
+ z.input<typeof z_MultisigSimulation.MultisigSimulation>
9
+ >()
10
+ expectTypeOf<
11
+ z.output<typeof z_MultisigSimulation.MultisigSimulation>
12
+ >().toMatchTypeOf<core_MultisigSimulation.Spec>()
13
+ })
@@ -0,0 +1,78 @@
1
+ import { describe, expect, test } from 'vp/test'
2
+ import * as core_MultisigSimulation from '../../../tempo/MultisigSimulation.js'
3
+ import * as z_MultisigSimulation from '../MultisigSimulation.js'
4
+ import * as z from 'zod/mini'
5
+
6
+ const rpc = {
7
+ account: '0xcccccccccccccccccccccccccccccccccccccccc',
8
+ approvals: [
9
+ {
10
+ owner: '0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',
11
+ type: 'primitive',
12
+ },
13
+ {
14
+ spec: {
15
+ account: '0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb',
16
+ approvals: [
17
+ {
18
+ owner: '0xdddddddddddddddddddddddddddddddddddddddd',
19
+ },
20
+ ],
21
+ config:
22
+ '0xf83ba022222222222222222222222222222222222222222222222222222222222222220201d7d694dddddddddddddddddddddddddddddddddddddddd01',
23
+ },
24
+ type: 'multisig',
25
+ },
26
+ ],
27
+ config:
28
+ '0xf852a011111111111111111111111111111111111111111111111111111111111111110102eed694aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa01d694bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb01',
29
+ } as const satisfies core_MultisigSimulation.Rpc
30
+
31
+ describe('MultisigSimulation', () => {
32
+ test('behavior: converts between RPC and domain specs', () => {
33
+ const spec = z.decode(z_MultisigSimulation.MultisigSimulation, rpc)
34
+
35
+ expect(spec).toEqual(core_MultisigSimulation.fromRpc(rpc))
36
+ expect(
37
+ z.encode(z_MultisigSimulation.MultisigSimulation, spec),
38
+ ).toStrictEqual(rpc)
39
+ })
40
+
41
+ test('error: rejects more than eight root approvals', () => {
42
+ expect(
43
+ z.safeDecode(z_MultisigSimulation.Rpc, {
44
+ ...rpc,
45
+ approvals: Array.from({ length: 9 }, () => rpc.approvals[0]),
46
+ }).success,
47
+ ).toMatchInlineSnapshot(`false`)
48
+ })
49
+
50
+ test('error: rejects more than eight nested approvals', () => {
51
+ expect(
52
+ z.safeDecode(z_MultisigSimulation.Rpc, {
53
+ ...rpc,
54
+ approvals: [
55
+ {
56
+ ...rpc.approvals[1],
57
+ spec: {
58
+ ...rpc.approvals[1].spec,
59
+ approvals: Array.from(
60
+ { length: 9 },
61
+ () => rpc.approvals[1].spec.approvals[0],
62
+ ),
63
+ },
64
+ },
65
+ ],
66
+ }).success,
67
+ ).toMatchInlineSnapshot(`false`)
68
+ })
69
+
70
+ test('error: rejects malformed encoded configurations', () => {
71
+ expect(
72
+ z.safeDecode(z_MultisigSimulation.Rpc, {
73
+ ...rpc,
74
+ config: '0x01',
75
+ }).success,
76
+ ).toMatchInlineSnapshot(`false`)
77
+ })
78
+ })
@@ -1,3 +1,6 @@
1
+ import type * as core_Address from '../../../core/Address.js'
2
+ import type * as core_MultisigConfig from '../../../tempo/MultisigConfig.js'
3
+ import type * as core_MultisigOperation from '../../../tempo/MultisigOperation.js'
1
4
  import type * as z from 'zod/mini'
2
5
  import { expectTypeOf, test } from 'vp/test'
3
6
  import * as z_RpcSchemaTempo from '../RpcSchemaTempo.js'
@@ -20,3 +23,48 @@ test('Tempo namespace exposes tempo_simulateV1', () => {
20
23
  typeof z_RpcSchemaTempo.tempo_simulateV1
21
24
  >()
22
25
  })
26
+
27
+ test('multisig methods have the expected method names', () => {
28
+ expectTypeOf<
29
+ typeof z_RpcSchemaTempo.multisig_approveKeyAuthorization.method
30
+ >().toEqualTypeOf<'multisig_approveKeyAuthorization'>()
31
+ expectTypeOf<
32
+ typeof z_RpcSchemaTempo.multisig_approveRawTransaction.method
33
+ >().toEqualTypeOf<'multisig_approveRawTransaction'>()
34
+ expectTypeOf<
35
+ typeof z_RpcSchemaTempo.multisig_approveRawTransactionSync.method
36
+ >().toEqualTypeOf<'multisig_approveRawTransactionSync'>()
37
+ expectTypeOf<
38
+ typeof z_RpcSchemaTempo.multisig_getConfig.method
39
+ >().toEqualTypeOf<'multisig_getConfig'>()
40
+ expectTypeOf<
41
+ typeof z_RpcSchemaTempo.multisig_getOperation.method
42
+ >().toEqualTypeOf<'multisig_getOperation'>()
43
+ })
44
+
45
+ test('multisig_getConfig has the expected request and return types', () => {
46
+ expectTypeOf<
47
+ z.input<typeof z_RpcSchemaTempo.multisig_getConfig.params>
48
+ >().toEqualTypeOf<[{ address: core_Address.Address }]>()
49
+ expectTypeOf<
50
+ z.output<typeof z_RpcSchemaTempo.multisig_getConfig.returns>
51
+ >().toEqualTypeOf<core_MultisigConfig.Rpc | null>()
52
+ })
53
+
54
+ test('multisig return schemas decode RPC operations', () => {
55
+ expectTypeOf<
56
+ z.output<typeof z_RpcSchemaTempo.multisig_approveRawTransactionSync.returns>
57
+ >().toMatchTypeOf<core_MultisigOperation.TransactionOperation>()
58
+ expectTypeOf<
59
+ z.output<typeof z_RpcSchemaTempo.multisig_getOperation.returns>
60
+ >().toMatchTypeOf<core_MultisigOperation.Operation | null>()
61
+ })
62
+
63
+ test('Multisig namespace exposes multisig methods', () => {
64
+ expectTypeOf<
65
+ typeof z_RpcSchemaTempo.Multisig.multisig_getConfig
66
+ >().toEqualTypeOf<typeof z_RpcSchemaTempo.multisig_getConfig>()
67
+ expectTypeOf<
68
+ typeof z_RpcSchemaTempo.Multisig.multisig_getOperation
69
+ >().toEqualTypeOf<typeof z_RpcSchemaTempo.multisig_getOperation>()
70
+ })
@@ -54,3 +54,86 @@ describe('tempo_simulateV1', () => {
54
54
  ).toBe(true)
55
55
  })
56
56
  })
57
+
58
+ describe('multisig methods', () => {
59
+ test('decodes key authorization approval params', () => {
60
+ expect(
61
+ z_RpcSchema.decodeParams(
62
+ z_RpcSchemaTempo.Multisig,
63
+ 'multisig_approveKeyAuthorization',
64
+ [{ hash: '0x01', signature: '0x02' }],
65
+ ),
66
+ ).toEqual([{ hash: '0x01', signature: '0x02' }])
67
+ })
68
+
69
+ test('decodes raw transaction params', () => {
70
+ expect(
71
+ z_RpcSchema.decodeParams(
72
+ z_RpcSchemaTempo.Multisig,
73
+ 'multisig_approveRawTransactionSync',
74
+ ['0x76', 30_000],
75
+ ),
76
+ ).toEqual(['0x76', 30_000])
77
+ })
78
+
79
+ test('decodes config params', () => {
80
+ expect(
81
+ z_RpcSchema.decodeParams(
82
+ z_RpcSchemaTempo.Multisig,
83
+ 'multisig_getConfig',
84
+ [{ address: '0xcafebabecafebabecafebabecafebabecafebabe' }],
85
+ ),
86
+ ).toEqual([{ address: '0xcafebabecafebabecafebabecafebabecafebabe' }])
87
+ })
88
+
89
+ test('decodes config result', () => {
90
+ const config = {
91
+ owners: [
92
+ {
93
+ owner: '0x1111111111111111111111111111111111111111',
94
+ weight: 1,
95
+ },
96
+ ],
97
+ salt: '0x0000000000000000000000000000000000000000000000000000000000000000',
98
+ threshold: 1,
99
+ version: '0x0',
100
+ } as const
101
+
102
+ expect(
103
+ z_RpcSchema.decodeReturns(
104
+ z_RpcSchemaTempo.Multisig,
105
+ 'multisig_getConfig',
106
+ config,
107
+ ),
108
+ ).toEqual(config)
109
+ })
110
+
111
+ test('accepts a missing config result', () => {
112
+ expect(
113
+ z_RpcSchema.decodeReturns(
114
+ z_RpcSchemaTempo.Multisig,
115
+ 'multisig_getConfig',
116
+ null,
117
+ ),
118
+ ).toBeNull()
119
+ })
120
+
121
+ test('accepts a missing operation result', () => {
122
+ expect(
123
+ z_RpcSchema.decodeReturns(
124
+ z_RpcSchemaTempo.Multisig,
125
+ 'multisig_getOperation',
126
+ null,
127
+ ),
128
+ ).toBeNull()
129
+ })
130
+
131
+ test('exposes method and request schemas', () => {
132
+ expect(
133
+ z.safeDecode(z_RpcSchemaTempo.multisig_getOperation.request, {
134
+ method: 'multisig_getOperation',
135
+ params: ['0x01'],
136
+ }).success,
137
+ ).toBe(true)
138
+ })
139
+ })
@@ -12,7 +12,7 @@ test('SignatureEnvelope decodes RPC into a signature envelope', () => {
12
12
  >()
13
13
  })
14
14
 
15
- test('MultisigRpc preserves the native multisig RPC union', () => {
15
+ test('MultisigRpc preserves the complete witness shape', () => {
16
16
  expectTypeOf<core_SignatureEnvelope.MultisigRpc>().toExtend<
17
17
  z.input<typeof z_SignatureEnvelope.MultisigRpc>
18
18
  >()