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.
- package/CHANGELOG.md +42 -0
- package/dist/core/Hash.js +1 -1
- package/dist/core/Hash.js.map +1 -1
- package/dist/tempo/KeyAuthorization.d.ts +2 -2
- 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 +340 -0
- package/dist/tempo/MultisigOperation.d.ts.map +1 -0
- package/dist/tempo/MultisigOperation.js +839 -0
- package/dist/tempo/MultisigOperation.js.map +1 -0
- package/dist/tempo/MultisigSimulation.d.ts +132 -0
- package/dist/tempo/MultisigSimulation.d.ts.map +1 -0
- package/dist/tempo/MultisigSimulation.js +140 -0
- package/dist/tempo/MultisigSimulation.js.map +1 -0
- package/dist/tempo/RpcSchemaTempo.d.ts +45 -0
- package/dist/tempo/RpcSchemaTempo.d.ts.map +1 -1
- package/dist/tempo/SignatureEnvelope.d.ts +55 -86
- package/dist/tempo/SignatureEnvelope.d.ts.map +1 -1
- package/dist/tempo/SignatureEnvelope.js +93 -158
- 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 +60 -180
- package/dist/zod/tempo/AuthorizationTempo.d.ts.map +1 -1
- package/dist/zod/tempo/KeyAuthorization.d.ts +65 -118
- 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 +158 -0
- package/dist/zod/tempo/MultisigOperation.d.ts.map +1 -0
- package/dist/zod/tempo/MultisigOperation.js +62 -0
- package/dist/zod/tempo/MultisigOperation.js.map +1 -0
- package/dist/zod/tempo/MultisigSimulation.d.ts +120 -0
- package/dist/zod/tempo/MultisigSimulation.d.ts.map +1 -0
- package/dist/zod/tempo/MultisigSimulation.js +78 -0
- package/dist/zod/tempo/MultisigSimulation.js.map +1 -0
- package/dist/zod/tempo/RpcSchemaTempo.d.ts +528 -144
- package/dist/zod/tempo/RpcSchemaTempo.d.ts.map +1 -1
- package/dist/zod/tempo/RpcSchemaTempo.js +47 -0
- package/dist/zod/tempo/RpcSchemaTempo.js.map +1 -1
- package/dist/zod/tempo/SignatureEnvelope.d.ts +18 -54
- package/dist/zod/tempo/SignatureEnvelope.d.ts.map +1 -1
- package/dist/zod/tempo/SignatureEnvelope.js +5 -22
- package/dist/zod/tempo/SignatureEnvelope.js.map +1 -1
- package/dist/zod/tempo/Transaction.d.ts +138 -348
- package/dist/zod/tempo/Transaction.d.ts.map +1 -1
- package/dist/zod/tempo/TransactionRequest.d.ts +286 -239
- 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/AuthorizationTempo.test.ts +4 -0
- package/src/tempo/KeyAuthorization.test-d.ts +13 -12
- package/src/tempo/KeyAuthorization.test.ts +109 -3
- package/src/tempo/KeyAuthorization.ts +4 -4
- 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 +79 -0
- package/src/tempo/MultisigOperation.test.ts +1950 -0
- package/src/tempo/MultisigOperation.ts +1293 -0
- package/src/tempo/MultisigSimulation.test-d.ts +33 -0
- package/src/tempo/MultisigSimulation.test.ts +283 -0
- package/src/tempo/MultisigSimulation.ts +266 -0
- package/src/tempo/RpcSchemaTempo.test-d.ts +91 -0
- package/src/tempo/RpcSchemaTempo.ts +46 -0
- package/src/tempo/SignatureEnvelope.test-d.ts +33 -72
- package/src/tempo/SignatureEnvelope.test.ts +533 -500
- package/src/tempo/SignatureEnvelope.ts +171 -258
- package/src/tempo/Transaction.test.ts +61 -0
- package/src/tempo/TransactionRequest.test-d.ts +11 -0
- package/src/tempo/TransactionRequest.test.ts +214 -41
- package/src/tempo/TransactionRequest.ts +19 -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 +164 -87
- package/src/version.ts +1 -1
- package/src/zod/tempo/MultisigConfig.ts +29 -3
- package/src/zod/tempo/MultisigOperation.ts +66 -0
- package/src/zod/tempo/MultisigSimulation.ts +98 -0
- package/src/zod/tempo/RpcSchemaTempo.ts +53 -0
- package/src/zod/tempo/SignatureEnvelope.ts +12 -54
- package/src/zod/tempo/TransactionRequest.ts +17 -26
- package/src/zod/tempo/_test/KeyAuthorization.test.ts +2 -4
- 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 +66 -0
- package/src/zod/tempo/_test/MultisigSimulation.test-d.ts +13 -0
- package/src/zod/tempo/_test/MultisigSimulation.test.ts +78 -0
- package/src/zod/tempo/_test/RpcSchemaTempo.test-d.ts +48 -0
- package/src/zod/tempo/_test/RpcSchemaTempo.test.ts +83 -0
- package/src/zod/tempo/_test/SignatureEnvelope.test-d.ts +1 -1
- package/src/zod/tempo/_test/SignatureEnvelope.test.ts +57 -120
- package/src/zod/tempo/_test/TransactionRequest.test.ts +43 -16
- 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 =
|
|
89
|
-
.
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
264
|
-
request_.
|
|
265
|
-
|
|
266
|
-
|
|
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.
|
|
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.
|
|
352
|
-
request_rpc.
|
|
353
|
-
|
|
354
|
-
|
|
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
|
-
|
|
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:
|
|
25
|
-
threshold:
|
|
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
|
|
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
|
>()
|