ox 0.14.38 → 0.14.39

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 (40) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/_cjs/tempo/MultisigConfig.js +71 -15
  3. package/_cjs/tempo/MultisigConfig.js.map +1 -1
  4. package/_cjs/tempo/MultisigOperation.js +42 -36
  5. package/_cjs/tempo/MultisigOperation.js.map +1 -1
  6. package/_cjs/tempo/SignatureEnvelope.js +71 -108
  7. package/_cjs/tempo/SignatureEnvelope.js.map +1 -1
  8. package/_cjs/version.js +1 -1
  9. package/_esm/tempo/MultisigConfig.js +140 -71
  10. package/_esm/tempo/MultisigConfig.js.map +1 -1
  11. package/_esm/tempo/MultisigOperation.js +42 -37
  12. package/_esm/tempo/MultisigOperation.js.map +1 -1
  13. package/_esm/tempo/SignatureEnvelope.js +84 -143
  14. package/_esm/tempo/SignatureEnvelope.js.map +1 -1
  15. package/_esm/version.js +1 -1
  16. package/_types/tempo/KeyAuthorization.d.ts +1 -1
  17. package/_types/tempo/KeyAuthorization.d.ts.map +1 -1
  18. package/_types/tempo/MultisigConfig.d.ts +137 -73
  19. package/_types/tempo/MultisigConfig.d.ts.map +1 -1
  20. package/_types/tempo/MultisigOperation.d.ts +1 -1
  21. package/_types/tempo/MultisigOperation.d.ts.map +1 -1
  22. package/_types/tempo/SignatureEnvelope.d.ts +81 -75
  23. package/_types/tempo/SignatureEnvelope.d.ts.map +1 -1
  24. package/_types/version.d.ts +1 -1
  25. package/package.json +6 -1
  26. package/tempo/KeyAuthorization.test-d.ts +12 -0
  27. package/tempo/KeyAuthorization.test.ts +54 -0
  28. package/tempo/KeyAuthorization.ts +1 -1
  29. package/tempo/MultisigConfig.test-d/package.json +6 -0
  30. package/tempo/MultisigConfig.test-d.ts +52 -0
  31. package/tempo/MultisigConfig.test.ts +291 -263
  32. package/tempo/MultisigConfig.ts +250 -95
  33. package/tempo/MultisigOperation.test-d.ts +6 -0
  34. package/tempo/MultisigOperation.test.ts +113 -72
  35. package/tempo/MultisigOperation.ts +41 -35
  36. package/tempo/SignatureEnvelope.test-d.ts +57 -40
  37. package/tempo/SignatureEnvelope.test.ts +523 -480
  38. package/tempo/SignatureEnvelope.ts +250 -257
  39. package/tempo/multisig.e2e.test.ts +113 -86
  40. package/version.ts +1 -1
@@ -2,12 +2,6 @@ import * as Address from '../core/Address.js';
2
2
  import * as Errors from '../core/Errors.js';
3
3
  import * as Hash from '../core/Hash.js';
4
4
  import * as Hex from '../core/Hex.js';
5
- /** Maximum number of owners allowed in a native multisig config. */
6
- export const maxOwners = 48;
7
- /** Maximum threshold accepted by a native multisig config. */
8
- export const maxThreshold = 0xff;
9
- /** Maximum number of owner approvals in a native multisig signature. */
10
- export const maxSignatures = 8;
11
5
  /**
12
6
  * Maximum number of native multisig signatures in one nested authorization
13
7
  * path, including the top-level transaction signature.
@@ -15,18 +9,28 @@ export const maxSignatures = 8;
15
9
  export const maxNestingDepth = 2;
16
10
  /** Maximum encoded byte length for one primitive owner approval. */
17
11
  export const maxOwnerSignatureBytes = 2049;
12
+ /** Maximum number of owners allowed in a native multisig config. */
13
+ export const maxOwners = 48;
14
+ /** Maximum number of owner approvals in a native multisig signature. */
15
+ export const maxSignatures = 8;
16
+ /** Maximum threshold accepted by a native multisig config. */
17
+ export const maxThreshold = 0xff;
18
+ /** Maximum version accepted by a native multisig config. */
19
+ export const maxVersion = 2n ** 64n - 1n;
18
20
  /** Tempo signature type byte for native multisig signatures. */
19
21
  export const signatureTypeByte = '0x05';
20
22
  /** Zero 32-byte salt (the default when no salt is provided). */
21
23
  export const zeroSalt = `0x${'00'.repeat(32)}`;
22
24
  /** Domain prefix for the native multisig account address derivation. */
23
25
  const accountDomain = 'tempo:multisig:account';
26
+ /** Domain prefix for native multisig configuration commitments. */
27
+ const configDomain = 'tempo:multisig:config';
24
28
  /** Domain prefix for native multisig owner approvals. */
25
29
  const signatureDomain = 'tempo:multisig:signature';
26
30
  /**
27
31
  * Asserts that a native multisig {@link ox#MultisigConfig.Config} is valid.
28
32
  *
29
- * Mirrors the Tempo `InitMultisig::validate` rules: owners non-empty and
33
+ * Mirrors the Tempo configuration rules: owners non-empty and
30
34
  * `<= maxOwners`, strictly ascending unique nonzero owner addresses, nonzero
31
35
  * integer owner weights, integer `threshold` between `1` and `maxThreshold`,
32
36
  * total weight `<= 255` (u8 max), and a threshold reachable by at most
@@ -47,9 +51,10 @@ const signatureDomain = 'tempo:multisig:signature';
47
51
  * @param config - The multisig config.
48
52
  */
49
53
  export function assert(config) {
50
- const { salt, threshold, owners } = config;
54
+ const { owners, salt, threshold, version = 0n } = config;
51
55
  if (typeof salt !== 'undefined' && Hex.size(salt) !== 32)
52
56
  throw new InvalidConfigError({ reason: 'salt must be 32 bytes' });
57
+ assertVersion(version);
53
58
  if (owners.length === 0)
54
59
  throw new InvalidConfigError({ reason: 'owners cannot be empty' });
55
60
  if (owners.length > maxOwners)
@@ -99,38 +104,45 @@ export function assert(config) {
99
104
  reason: `threshold exceeds weight reachable by ${maxSignatures} owner signatures`,
100
105
  });
101
106
  }
107
+ // eslint-disable-next-line jsdoc/require-jsdoc
108
+ export function from(config) {
109
+ const version = config.version ?? 0n;
110
+ assertVersion(version);
111
+ const owners = [...config.owners].sort((a, b) => Hex.toBigInt(a.owner) < Hex.toBigInt(b.owner) ? -1 : 1);
112
+ const normalized = {
113
+ owners,
114
+ salt: config.salt ? Hex.padLeft(config.salt, 32) : zeroSalt,
115
+ threshold: config.threshold,
116
+ version: BigInt(version),
117
+ };
118
+ assert(normalized);
119
+ return normalized;
120
+ }
102
121
  /**
103
- * Normalizes a native multisig {@link ox#MultisigConfig.Config}.
104
- *
105
- * Sorts owners into strictly ascending `owner` address order (the canonical
106
- * form required for account derivation) and asserts the config is valid.
122
+ * Converts a JSON-RPC multisig configuration to its domain representation.
107
123
  *
108
124
  * @example
109
125
  * ```ts twoslash
110
126
  * import { MultisigConfig } from 'ox/tempo'
111
127
  *
112
- * const config = MultisigConfig.from({
113
- * threshold: 2,
128
+ * const config = MultisigConfig.fromRpc({
114
129
  * owners: [
115
- * { owner: '0x2222222222222222222222222222222222222222', weight: 1 },
116
130
  * { owner: '0x1111111111111111111111111111111111111111', weight: 1 },
117
131
  * ],
132
+ * salt: `0x${'00'.repeat(32)}`,
133
+ * threshold: 1,
134
+ * version: '0x0',
118
135
  * })
119
- * // owners are now sorted ascending by address
120
136
  * ```
121
137
  *
122
- * @param config - The multisig config.
123
- * @returns The normalized multisig config.
138
+ * @param config - The JSON-RPC multisig configuration.
139
+ * @returns The normalized multisig configuration.
124
140
  */
125
- export function from(config) {
126
- const owners = [...config.owners].sort((a, b) => Hex.toBigInt(a.owner) < Hex.toBigInt(b.owner) ? -1 : 1);
127
- const normalized = {
128
- salt: config.salt ? Hex.padLeft(config.salt, 32) : zeroSalt,
129
- threshold: config.threshold,
130
- owners,
131
- };
132
- assert(normalized);
133
- return normalized;
141
+ export function fromRpc(config) {
142
+ return from({
143
+ ...config,
144
+ version: Hex.toBigInt(config.version),
145
+ });
134
146
  }
135
147
  /**
136
148
  * Converts an RLP {@link ox#MultisigConfig.Tuple} back to a
@@ -142,6 +154,7 @@ export function from(config) {
142
154
  *
143
155
  * const config = MultisigConfig.fromTuple([
144
156
  * `0x${'00'.repeat(32)}`,
157
+ * '0x',
145
158
  * '0x01',
146
159
  * [['0x1111111111111111111111111111111111111111', '0x01']],
147
160
  * ])
@@ -151,10 +164,8 @@ export function from(config) {
151
164
  * @returns The multisig config.
152
165
  */
153
166
  export function fromTuple(tuple) {
154
- const [salt, threshold, owners] = tuple;
167
+ const [salt, version, threshold, owners] = tuple;
155
168
  return {
156
- salt: salt && salt !== '0x' ? Hex.padLeft(salt, 32) : zeroSalt,
157
- threshold: threshold === '0x' ? 0 : Hex.toNumber(threshold),
158
169
  owners: owners.map((owner) => {
159
170
  const [ownerAddress, weight] = owner;
160
171
  return {
@@ -162,6 +173,9 @@ export function fromTuple(tuple) {
162
173
  weight: !weight || weight === '0x' ? 0 : Hex.toNumber(weight),
163
174
  };
164
175
  }),
176
+ salt: salt && salt !== '0x' ? Hex.padLeft(salt, 32) : zeroSalt,
177
+ threshold: threshold === '0x' ? 0 : Hex.toNumber(threshold),
178
+ version: version === '0x' ? 0n : Hex.toBigInt(version),
165
179
  };
166
180
  }
167
181
  /**
@@ -170,28 +184,32 @@ export function fromTuple(tuple) {
170
184
  * Preimage (fixed-width big-endian, **not** RLP):
171
185
  * `keccak256("tempo:multisig:account" || salt || u8(threshold) || u8(owners.length) || (owner || u8(weight)) for each owner)[12:32]`.
172
186
  *
173
- * The address is derived once from the initial (bootstrap) config and never
174
- * changes — config updates do not affect it.
187
+ * The address is derived once from the initial version-0 config. Config
188
+ * updates do not change it.
175
189
  *
176
190
  * @example
177
191
  * ```ts twoslash
178
192
  * import { MultisigConfig } from 'ox/tempo'
179
193
  *
180
194
  * const initialConfig = MultisigConfig.from({
181
- * threshold: 1,
182
195
  * owners: [
183
196
  * { owner: '0x1111111111111111111111111111111111111111', weight: 1 },
184
197
  * ],
198
+ * threshold: 1,
185
199
  * })
186
200
  *
187
201
  * const address = MultisigConfig.getAddress(initialConfig)
188
202
  * ```
189
203
  *
190
- * @param config - The initial (bootstrap) multisig config.
204
+ * @param config - The initial multisig config.
191
205
  * @returns The multisig account address.
192
206
  */
193
207
  export function getAddress(config) {
194
208
  assert(config);
209
+ if (BigInt(config.version ?? 0) !== 0n)
210
+ throw new InvalidConfigError({
211
+ reason: 'account address requires version zero',
212
+ });
195
213
  const hash = Hash.keccak256(Hex.concat(Hex.fromString(accountDomain), Hex.padLeft(config.salt ?? zeroSalt, 32), Hex.fromNumber(config.threshold, { size: 1 }), Hex.fromNumber(config.owners.length, { size: 1 }), ...config.owners.flatMap((owner) => [
196
214
  owner.owner,
197
215
  Hex.fromNumber(owner.weight, { size: 1 }),
@@ -199,8 +217,41 @@ export function getAddress(config) {
199
217
  const account = Address.from(Hex.slice(hash, 12, 32));
200
218
  if (Hex.toBigInt(account) === 0n)
201
219
  throw new InvalidConfigError({ reason: 'derived account cannot be zero' });
220
+ if (config.owners.some((owner) => Address.isEqual(owner.owner, account)))
221
+ throw new InvalidConfigError({
222
+ reason: 'derived account cannot be an owner',
223
+ });
202
224
  return account;
203
225
  }
226
+ /**
227
+ * Computes the commitment for a native multisig configuration.
228
+ *
229
+ * The commitment uses raw fixed-width fields, not RLP or ABI encoding:
230
+ * `keccak256("tempo:multisig:config" || salt || uint64be(version) || uint8(threshold) || uint8(owners.length) || owners)`.
231
+ *
232
+ * @example
233
+ * ```ts twoslash
234
+ * import { MultisigConfig } from 'ox/tempo'
235
+ *
236
+ * const commitment = MultisigConfig.getCommitment({
237
+ * owners: [
238
+ * { owner: '0x1111111111111111111111111111111111111111', weight: 1 },
239
+ * ],
240
+ * threshold: 1,
241
+ * version: 1n,
242
+ * })
243
+ * ```
244
+ *
245
+ * @param config - The complete multisig configuration.
246
+ * @returns The configuration commitment.
247
+ */
248
+ export function getCommitment(config) {
249
+ assert(config);
250
+ return Hash.keccak256(Hex.concat(Hex.fromString(configDomain), Hex.padLeft(config.salt ?? zeroSalt, 32), Hex.fromNumber(config.version ?? 0n, { size: 8 }), Hex.fromNumber(config.threshold, { size: 1 }), Hex.fromNumber(config.owners.length, { size: 1 }), ...config.owners.flatMap((owner) => [
251
+ owner.owner,
252
+ Hex.fromNumber(owner.weight, { size: 1 }),
253
+ ])));
254
+ }
204
255
  /**
205
256
  * Computes the digest a native multisig owner approves (signs).
206
257
  *
@@ -208,9 +259,9 @@ export function getAddress(config) {
208
259
  * where `inner_digest` is the transaction sign payload
209
260
  * ({@link ox#TxEnvelopeTempo.(getSignPayload:function)}).
210
261
  *
211
- * The digest is keyed on the permanent `account` derived from the initial
212
- * (bootstrap) config and the current config `version`. Bootstrap approvals use
213
- * version `0n`, which is also the default; each config update increments it.
262
+ * The digest is keyed on the permanent `account` and the supplied config
263
+ * version. Initial approvals use version `0n`; each config update increments
264
+ * it.
214
265
  *
215
266
  * For a nested multisig owner approval, the parent digest becomes the nested
216
267
  * approval's `payload`, with the nested multisig `account`.
@@ -219,11 +270,11 @@ export function getAddress(config) {
219
270
  * ```ts twoslash
220
271
  * import { MultisigConfig, TxEnvelopeTempo } from 'ox/tempo'
221
272
  *
222
- * const initialConfig = MultisigConfig.from({
223
- * threshold: 1,
273
+ * const config = MultisigConfig.from({
224
274
  * owners: [
225
275
  * { owner: '0x1111111111111111111111111111111111111111', weight: 1 },
226
276
  * ],
277
+ * threshold: 1,
227
278
  * })
228
279
  *
229
280
  * const envelope = TxEnvelopeTempo.from({
@@ -232,52 +283,54 @@ export function getAddress(config) {
232
283
  * })
233
284
  *
234
285
  * const digest = MultisigConfig.getSignPayload({
286
+ * account: MultisigConfig.getAddress(config),
287
+ * config,
235
288
  * payload: TxEnvelopeTempo.getSignPayload(envelope),
236
- * initialConfig,
237
289
  * })
238
290
  * ```
239
291
  *
240
- * @example
241
- * ### From `account`
242
- *
243
- * If you already have the permanent `account` (for example, recovered from a
244
- * stored envelope), pass it directly:
292
+ * @param value - The digest derivation parameters.
293
+ * @returns The owner approval digest.
294
+ */
295
+ export function getSignPayload(value) {
296
+ const { account, config, payload } = value;
297
+ assertVersion(config.version);
298
+ return Hash.keccak256(Hex.concat(Hex.fromString(signatureDomain), Hex.from(payload), account, Hex.fromNumber(config.version ?? 0n, { size: 8 })));
299
+ }
300
+ /**
301
+ * Converts a multisig configuration to its JSON-RPC representation.
245
302
  *
303
+ * @example
246
304
  * ```ts twoslash
247
- * import { MultisigConfig, TxEnvelopeTempo } from 'ox/tempo'
305
+ * import { MultisigConfig } from 'ox/tempo'
248
306
  *
249
- * const initialConfig = MultisigConfig.from({
250
- * threshold: 1,
307
+ * const config = MultisigConfig.toRpc({
251
308
  * owners: [
252
309
  * { owner: '0x1111111111111111111111111111111111111111', weight: 1 },
253
310
  * ],
254
- * })
255
- * const account = MultisigConfig.getAddress(initialConfig)
256
- *
257
- * const envelope = TxEnvelopeTempo.from({ chainId: 1, calls: [] })
258
- *
259
- * const digest = MultisigConfig.getSignPayload({
260
- * payload: TxEnvelopeTempo.getSignPayload(envelope),
261
- * account,
262
- * version: 1n
311
+ * threshold: 1,
263
312
  * })
264
313
  * ```
265
314
  *
266
- * @param value - The digest derivation parameters.
267
- * @returns The owner approval digest.
315
+ * @param config - The multisig configuration.
316
+ * @returns The JSON-RPC multisig configuration.
268
317
  */
269
- export function getSignPayload(value) {
270
- const { payload, version = 0n } = value;
271
- const account = 'account' in value && value.account
272
- ? value.account
273
- : getAddress(value.initialConfig);
274
- return Hash.keccak256(Hex.concat(Hex.fromString(signatureDomain), Hex.from(payload), account, Hex.fromNumber(version, { size: 8 })));
318
+ export function toRpc(config) {
319
+ const value = from(config);
320
+ return {
321
+ owners: value.owners.map((owner) => ({
322
+ owner: owner.owner,
323
+ weight: Number(owner.weight),
324
+ })),
325
+ salt: value.salt,
326
+ threshold: Number(value.threshold),
327
+ version: Hex.fromNumber(value.version),
328
+ };
275
329
  }
276
330
  /**
277
- * Converts a {@link ox#MultisigConfig.Config} to its RLP tuple form (carried
278
- * by the multisig signature `init`).
331
+ * Converts a {@link ox#MultisigConfig.Config} to its RLP tuple form.
279
332
  *
280
- * Tuple shape: `[salt, threshold, [[owner, weight], ...]]`. The
333
+ * Tuple shape: `[salt, version, threshold, [[owner, weight], ...]]`. The
281
334
  * 32-byte `salt` encodes as a full fixed-width string; other integers use
282
335
  * canonical RLP encoding (zero values encode as `0x`).
283
336
  *
@@ -286,10 +339,10 @@ export function getSignPayload(value) {
286
339
  * import { MultisigConfig } from 'ox/tempo'
287
340
  *
288
341
  * const tuple = MultisigConfig.toTuple({
289
- * threshold: 1,
290
342
  * owners: [
291
343
  * { owner: '0x1111111111111111111111111111111111111111', weight: 1 },
292
344
  * ],
345
+ * threshold: 1,
293
346
  * })
294
347
  * ```
295
348
  *
@@ -302,7 +355,13 @@ export function toTuple(config) {
302
355
  // `salt` is a fixed 32-byte value: it RLP-encodes as a full 32-byte string
303
356
  // (including the zero salt), never trimmed like an integer.
304
357
  const salt = config.salt ? Hex.padLeft(config.salt, 32) : zeroSalt;
305
- return [salt, Hex.fromNumber(config.threshold), owners];
358
+ const version = BigInt(config.version ?? 0);
359
+ return [
360
+ salt,
361
+ version === 0n ? '0x' : Hex.fromNumber(version),
362
+ Hex.fromNumber(config.threshold),
363
+ owners,
364
+ ];
306
365
  }
307
366
  /**
308
367
  * Validates a native multisig {@link ox#MultisigConfig.Config}. Returns `true`
@@ -313,10 +372,10 @@ export function toTuple(config) {
313
372
  * import { MultisigConfig } from 'ox/tempo'
314
373
  *
315
374
  * const valid = MultisigConfig.validate({
316
- * threshold: 1,
317
375
  * owners: [
318
376
  * { owner: '0x1111111111111111111111111111111111111111', weight: 1 },
319
377
  * ],
378
+ * threshold: 1,
320
379
  * })
321
380
  * // @log: true
322
381
  * ```
@@ -345,4 +404,14 @@ export class InvalidConfigError extends Errors.BaseError {
345
404
  });
346
405
  }
347
406
  }
407
+ /** @internal */
408
+ function assertVersion(version) {
409
+ if ((typeof version !== 'bigint' && typeof version !== 'number') ||
410
+ (typeof version === 'number' && !Number.isSafeInteger(version)) ||
411
+ BigInt(version) < 0n ||
412
+ BigInt(version) > maxVersion)
413
+ throw new InvalidConfigError({
414
+ reason: 'version must be an unsigned 64-bit integer',
415
+ });
416
+ }
348
417
  //# sourceMappingURL=MultisigConfig.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MultisigConfig.js","sourceRoot":"","sources":["../../tempo/MultisigConfig.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"MultisigConfig.js","sourceRoot":"","sources":["../../tempo/MultisigConfig.ts"],"names":[],"mappings":"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"}
@@ -34,8 +34,8 @@ export function getHash(options) {
34
34
  : KeyAuthorization_.getSignPayload(KeyAuthorization_.deserialize(options.keyAuthorization));
35
35
  return MultisigConfig.getSignPayload({
36
36
  account,
37
+ config: { version: configVersion },
37
38
  payload,
38
- version: configVersion,
39
39
  });
40
40
  }
41
41
  /**
@@ -100,20 +100,15 @@ export function serializeTransaction(operation, options) {
100
100
  assertRetainedApprovals(value, approvals);
101
101
  const signatures = SignatureEnvelope.sortMultisigApprovals({
102
102
  account: value.account,
103
+ config: value.config,
103
104
  payload: TxEnvelopeTempo.getSignPayload(envelope),
104
105
  signatures: approvals,
105
- version: value.configVersion,
106
106
  });
107
- const signature = value.init
108
- ? SignatureEnvelope.from({
109
- init: true,
110
- initialConfig: value.config,
111
- signatures,
112
- })
113
- : SignatureEnvelope.from({
114
- account: value.account,
115
- signatures,
116
- });
107
+ const signature = SignatureEnvelope.from({
108
+ account: value.account,
109
+ config: value.config,
110
+ signatures,
111
+ });
117
112
  return TxEnvelopeTempo.serialize(envelope, value.transaction.startsWith(TxEnvelopeTempo.feePayerMagic)
118
113
  ? {
119
114
  format: 'feePayer',
@@ -138,20 +133,24 @@ export function serializeTransaction(operation, options) {
138
133
  */
139
134
  export function from(operation) {
140
135
  try {
141
- const config = MultisigConfig.from(operation.config);
136
+ const config = MultisigConfig.from({
137
+ ...operation.config,
138
+ version: operation.configVersion,
139
+ });
142
140
  if (typeof config.threshold !== 'number' ||
143
141
  config.owners.some((owner) => typeof owner.weight !== 'number'))
144
142
  throw new InvalidOperationError({
145
143
  reason: 'config threshold and owner weights must be numbers',
146
144
  });
147
- assertBase(operation, config);
148
- if (operation.type === 'transaction')
149
- assertTransaction(operation);
150
- else if (operation.type === 'keyAuthorization')
151
- assertKeyAuthorization(operation, config);
145
+ const value = { ...operation, config };
146
+ assertBase(value, config);
147
+ if (value.type === 'transaction')
148
+ assertTransaction(value);
149
+ else if (value.type === 'keyAuthorization')
150
+ assertKeyAuthorization(value, config);
152
151
  else
153
152
  throw new InvalidOperationError({ reason: 'unknown operation type' });
154
- return { ...operation, config };
153
+ return value;
155
154
  }
156
155
  catch (cause) {
157
156
  if (cause instanceof InvalidOperationError)
@@ -185,7 +184,11 @@ export function fromRpc(operation) {
185
184
  throw new InvalidOperationError({
186
185
  reason: 'configVersion must use canonical quantity encoding',
187
186
  });
188
- return from({ ...operation, configVersion });
187
+ return from({
188
+ ...operation,
189
+ config: MultisigConfig.fromRpc(operation.config),
190
+ configVersion,
191
+ });
189
192
  }
190
193
  catch (cause) {
191
194
  if (cause instanceof InvalidOperationError)
@@ -211,6 +214,7 @@ export function toRpc(operation) {
211
214
  const value = from(operation);
212
215
  return {
213
216
  ...value,
217
+ config: MultisigConfig.toRpc(value.config),
214
218
  configVersion: Hex.fromNumber(value.configVersion),
215
219
  };
216
220
  }
@@ -262,10 +266,6 @@ async function selectApprovals_internal(options, path) {
262
266
  throw new InvalidApprovalError({
263
267
  reason: `owner ${group.address} has conflicting signature types`,
264
268
  });
265
- if (nested.some((signature) => signature.init))
266
- throw new InvalidApprovalError({
267
- reason: `nested multisig owner ${group.address} cannot carry init`,
268
- });
269
269
  if (path.length >= MultisigConfig.maxNestingDepth ||
270
270
  path.includes(group.address.toLowerCase()))
271
271
  throw new InvalidApprovalError({
@@ -276,14 +276,18 @@ async function selectApprovals_internal(options, path) {
276
276
  reason: `nested multisig owner ${group.address} requires a config resolver`,
277
277
  });
278
278
  const resolved = await options.resolveConfig({ account: group.address });
279
+ const config = MultisigConfig.from({
280
+ ...resolved.config,
281
+ version: resolved.version,
282
+ });
279
283
  const selected = await selectApprovals_internal({
280
284
  account: group.address,
281
285
  approvals: nested.flatMap((signature) => signature.signatures.map((approval) => SignatureEnvelope.serialize(approval))),
282
- config: MultisigConfig.from(resolved.config),
286
+ config,
283
287
  hash: MultisigConfig.getSignPayload({
284
288
  account: group.address,
289
+ config,
285
290
  payload: options.hash,
286
- version: resolved.version,
287
291
  }),
288
292
  resolveConfig: options.resolveConfig,
289
293
  }, [...path, group.address.toLowerCase()]);
@@ -291,6 +295,7 @@ async function selectApprovals_internal(options, path) {
291
295
  address: group.address,
292
296
  signature: SignatureEnvelope.serialize(SignatureEnvelope.from({
293
297
  account: group.address,
298
+ config,
294
299
  signatures: selected.approvals.map((approval) => SignatureEnvelope.from(approval)),
295
300
  })),
296
301
  });
@@ -299,6 +304,7 @@ async function selectApprovals_internal(options, path) {
299
304
  address: group.address,
300
305
  signature: SignatureEnvelope.serialize(SignatureEnvelope.from({
301
306
  account: group.address,
307
+ config,
302
308
  signatures: selected.selectedApprovals.map((approval) => SignatureEnvelope.from(approval)),
303
309
  })),
304
310
  weight: group.weight,
@@ -422,7 +428,7 @@ function assertBase(operation, config) {
422
428
  if (typeof approval !== 'string' ||
423
429
  !Hex.validate(approval, { strict: true }))
424
430
  throw new InvalidOperationError({ reason: 'approval is invalid' });
425
- const signature = assertApproval(operation.account, approval);
431
+ const signature = assertApproval(operation.account, approval, config);
426
432
  const address = SignatureEnvelope.extractAddress({
427
433
  payload: operation.hash,
428
434
  signature,
@@ -586,13 +592,9 @@ function assertKeyAuthorization(operation, config) {
586
592
  reason: 'key authorization signatureCount does not match its signature',
587
593
  });
588
594
  assertSelectedApprovals(operation, signature.signatures, authorization);
589
- if (!!signature.init !== operation.init)
595
+ if (!sameConfig(signature.config, config))
590
596
  throw new InvalidOperationError({
591
- reason: 'key authorization bootstrap state does not match',
592
- });
593
- if (signature.init && !sameConfig(signature.init, config))
594
- throw new InvalidOperationError({
595
- reason: 'key authorization bootstrap config does not match',
597
+ reason: 'key authorization config does not match',
596
598
  });
597
599
  }
598
600
  assertOperationHash(operation, KeyAuthorization_.getSignPayload(authorization));
@@ -607,10 +609,11 @@ function assertKeyAuthorization(operation, config) {
607
609
  *
608
610
  * @internal
609
611
  */
610
- function assertApproval(account, serialized) {
612
+ function assertApproval(account, serialized, config) {
611
613
  const approval = SignatureEnvelope.deserialize(serialized);
612
614
  SignatureEnvelope.assert({
613
615
  account,
616
+ config,
614
617
  signatures: [approval],
615
618
  type: 'multisig',
616
619
  });
@@ -652,8 +655,8 @@ function assertSelectedApprovals(operation, selected, authorization) {
652
655
  }
653
656
  const digest = MultisigConfig.getSignPayload({
654
657
  account: operation.account,
658
+ config: operation.config,
655
659
  payload: KeyAuthorization_.getSignPayload(authorization),
656
- version: operation.configVersion,
657
660
  });
658
661
  const addresses = selected.map((signature) => SignatureEnvelope.extractAddress({ payload: digest, signature }));
659
662
  for (let index = 1; index < addresses.length; index++) {
@@ -680,7 +683,8 @@ function includesApproval(retained, selected) {
680
683
  SignatureEnvelope.serialize(selected).toLowerCase());
681
684
  if (retained.account.toLowerCase() !== selected.account.toLowerCase())
682
685
  return false;
683
- // Nested versions are not serialized, so selected child approvals must preserve the validated retained order.
686
+ if (!sameConfig(retained.config, selected.config))
687
+ return false;
684
688
  let index = 0;
685
689
  for (const approval of selected.signatures) {
686
690
  while (index < retained.signatures.length &&
@@ -714,8 +718,8 @@ function isWeightReachable(weights, signatureCount, weight) {
714
718
  function assertOperationHash(operation, payload) {
715
719
  const hash = MultisigConfig.getSignPayload({
716
720
  account: operation.account,
721
+ config: operation.config,
717
722
  payload,
718
- version: operation.configVersion,
719
723
  });
720
724
  if (hash.toLowerCase() !== operation.hash.toLowerCase())
721
725
  throw new InvalidOperationError({
@@ -743,6 +747,7 @@ function sameConfig(a, b) {
743
747
  const configB = MultisigConfig.from(b);
744
748
  return (Hex.isEqual(configA.salt ?? MultisigConfig.zeroSalt, configB.salt ?? MultisigConfig.zeroSalt) &&
745
749
  configA.threshold === configB.threshold &&
750
+ configA.version === configB.version &&
746
751
  configA.owners.length === configB.owners.length &&
747
752
  configA.owners.every((owner, index) => {
748
753
  const other = configB.owners[index];