ox 0.14.39 → 0.14.40

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 (42) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/_cjs/tempo/MultisigOperation.js +10 -8
  3. package/_cjs/tempo/MultisigOperation.js.map +1 -1
  4. package/_cjs/tempo/MultisigWitness.js +92 -0
  5. package/_cjs/tempo/MultisigWitness.js.map +1 -0
  6. package/_cjs/tempo/TransactionRequest.js +7 -1
  7. package/_cjs/tempo/TransactionRequest.js.map +1 -1
  8. package/_cjs/tempo/index.js +2 -1
  9. package/_cjs/tempo/index.js.map +1 -1
  10. package/_cjs/version.js +1 -1
  11. package/_esm/tempo/MultisigOperation.js +10 -8
  12. package/_esm/tempo/MultisigOperation.js.map +1 -1
  13. package/_esm/tempo/MultisigWitness.js +123 -0
  14. package/_esm/tempo/MultisigWitness.js.map +1 -0
  15. package/_esm/tempo/TransactionRequest.js +7 -1
  16. package/_esm/tempo/TransactionRequest.js.map +1 -1
  17. package/_esm/tempo/index.js +9 -0
  18. package/_esm/tempo/index.js.map +1 -1
  19. package/_esm/version.js +1 -1
  20. package/_types/tempo/MultisigOperation.d.ts.map +1 -1
  21. package/_types/tempo/MultisigWitness.d.ts +106 -0
  22. package/_types/tempo/MultisigWitness.d.ts.map +1 -0
  23. package/_types/tempo/TransactionRequest.d.ts +6 -3
  24. package/_types/tempo/TransactionRequest.d.ts.map +1 -1
  25. package/_types/tempo/index.d.ts +9 -0
  26. package/_types/tempo/index.d.ts.map +1 -1
  27. package/_types/version.d.ts +1 -1
  28. package/package.json +16 -1
  29. package/tempo/MultisigOperation.test.ts +87 -9
  30. package/tempo/MultisigOperation.ts +10 -8
  31. package/tempo/MultisigWitness/package.json +6 -0
  32. package/tempo/MultisigWitness.test-d/package.json +6 -0
  33. package/tempo/MultisigWitness.test-d.ts +42 -0
  34. package/tempo/MultisigWitness.test.ts +289 -0
  35. package/tempo/MultisigWitness.ts +210 -0
  36. package/tempo/RpcSchemaTempo.test-d.ts +25 -0
  37. package/tempo/TransactionRequest.test-d/package.json +6 -0
  38. package/tempo/TransactionRequest.test-d.ts +24 -0
  39. package/tempo/TransactionRequest.test.ts +102 -1
  40. package/tempo/TransactionRequest.ts +12 -2
  41. package/tempo/index.ts +9 -0
  42. package/version.ts +1 -1
@@ -1,6 +1,74 @@
1
- import { TransactionRequest } from 'ox/tempo'
1
+ import { type MultisigWitness, TransactionRequest } from 'ox/tempo'
2
2
  import { describe, expect, test } from 'vitest'
3
3
 
4
+ const multisigWitnessRpc = {
5
+ account: '0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',
6
+ approvals: [
7
+ {
8
+ keyType: 'secp256k1',
9
+ owner: '0x1111111111111111111111111111111111111111',
10
+ type: 'primitive',
11
+ },
12
+ {
13
+ type: 'multisig',
14
+ witness: {
15
+ account: '0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb',
16
+ approvals: [
17
+ {
18
+ keyData: '0x0578',
19
+ keyType: 'webAuthn',
20
+ owner: '0x2222222222222222222222222222222222222222',
21
+ },
22
+ ],
23
+ config: {
24
+ owners: [
25
+ {
26
+ owner: '0x2222222222222222222222222222222222222222',
27
+ weight: 1,
28
+ },
29
+ ],
30
+ salt: `0x${'22'.repeat(32)}`,
31
+ threshold: 1,
32
+ version: 1,
33
+ },
34
+ },
35
+ },
36
+ ],
37
+ config: {
38
+ owners: [
39
+ {
40
+ owner: '0x1111111111111111111111111111111111111111',
41
+ weight: 1,
42
+ },
43
+ {
44
+ owner: '0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb',
45
+ weight: 1,
46
+ },
47
+ ],
48
+ salt: `0x${'11'.repeat(32)}`,
49
+ threshold: 2,
50
+ version: 0,
51
+ },
52
+ } as const satisfies MultisigWitness.Rpc
53
+
54
+ const multisigWitness = {
55
+ ...multisigWitnessRpc,
56
+ approvals: [
57
+ multisigWitnessRpc.approvals[0],
58
+ {
59
+ ...multisigWitnessRpc.approvals[1],
60
+ witness: {
61
+ ...multisigWitnessRpc.approvals[1].witness,
62
+ config: {
63
+ ...multisigWitnessRpc.approvals[1].witness.config,
64
+ version: 1n,
65
+ },
66
+ },
67
+ },
68
+ ],
69
+ config: { ...multisigWitnessRpc.config, version: 0n },
70
+ } as const satisfies MultisigWitness.MultisigWitness
71
+
4
72
  describe('fromRpc', () => {
5
73
  test('default', () => {
6
74
  const request = TransactionRequest.fromRpc({
@@ -69,6 +137,21 @@ describe('fromRpc', () => {
69
137
  expect(request.nonceKey).toBe(255n)
70
138
  })
71
139
 
140
+ test('behavior: multisig witness', () => {
141
+ const request = TransactionRequest.fromRpc({
142
+ from: '0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',
143
+ multisigWitness: multisigWitnessRpc,
144
+ type: '0x76',
145
+ })
146
+
147
+ expect(request.multisigWitness?.config.version).toBe(0n)
148
+ const nested = request.multisigWitness?.approvals[1]
149
+ expect(nested?.type).toBe('multisig')
150
+ if (nested?.type !== 'multisig') throw new Error('expected multisig')
151
+ expect(nested.witness.config.version).toBe(1n)
152
+ expect(nested.witness.approvals[0]?.keyType).toBe('webAuthn')
153
+ })
154
+
72
155
  test('behavior: empty', () => {
73
156
  const request = TransactionRequest.fromRpc({})
74
157
  expect(request).toMatchInlineSnapshot('{}')
@@ -122,6 +205,20 @@ describe('toRpc', () => {
122
205
  }
123
206
  `)
124
207
  })
208
+
209
+ test('behavior: multisig witness', () => {
210
+ const request = TransactionRequest.toRpc({
211
+ from: '0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',
212
+ multisigWitness,
213
+ })
214
+
215
+ expect(request.multisigWitness?.config.version).toBe(0)
216
+ const nested = request.multisigWitness?.approvals[1]
217
+ expect(nested?.type).toBe('multisig')
218
+ if (nested?.type !== 'multisig') throw new Error('expected multisig')
219
+ expect(nested.witness.config.version).toBe(1)
220
+ expect(request.type).toBe('0x76')
221
+ })
125
222
  })
126
223
 
127
224
  describe('roundtrip', () => {
@@ -144,6 +241,7 @@ describe('roundtrip', () => {
144
241
  nonceKey: 255n,
145
242
  gas: 100000n,
146
243
  maxFeePerGas: 1000000000n,
244
+ multisigWitness,
147
245
  }
148
246
 
149
247
  const rpc = TransactionRequest.toRpc(original)
@@ -164,6 +262,7 @@ describe('roundtrip', () => {
164
262
  expect(converted.nonceKey).toBe(original.nonceKey)
165
263
  expect(converted.gas).toBe(original.gas)
166
264
  expect(converted.maxFeePerGas).toBe(original.maxFeePerGas)
265
+ expect(converted.multisigWitness).toEqual(original.multisigWitness)
167
266
  expect(converted.type).toBe('tempo')
168
267
  })
169
268
 
@@ -181,6 +280,7 @@ describe('roundtrip', () => {
181
280
  validAfter: '0x32',
182
281
  nonceKey: '0xff',
183
282
  gas: '0x186a0',
283
+ multisigWitness: multisigWitnessRpc,
184
284
  type: '0x76',
185
285
  }
186
286
 
@@ -193,6 +293,7 @@ describe('roundtrip', () => {
193
293
  expect(rpc.validAfter).toBe(original.validAfter)
194
294
  expect(rpc.nonceKey).toBe(original.nonceKey)
195
295
  expect(rpc.gas).toBe(original.gas)
296
+ expect(rpc.multisigWitness).toEqual(original.multisigWitness)
196
297
  expect(rpc.type).toBe('0x76')
197
298
  })
198
299
  })
@@ -4,6 +4,7 @@ import type { Compute } from '../core/internal/types.js'
4
4
  import * as ox_TransactionRequest from '../core/TransactionRequest.js'
5
5
  import * as AuthorizationTempo from './AuthorizationTempo.js'
6
6
  import * as KeyAuthorization from './KeyAuthorization.js'
7
+ import * as MultisigWitness from './MultisigWitness.js'
7
8
  import * as TempoAddress from './TempoAddress.js'
8
9
  import * as TokenId from './TokenId.js'
9
10
  import * as Transaction from './Transaction.js'
@@ -38,6 +39,7 @@ export type TransactionRequest<
38
39
  keyType?: KeyType | undefined
39
40
  feePayer?: boolean | undefined
40
41
  feeToken?: TokenId.TokenIdOrAddress<addressType> | undefined
42
+ multisigWitness?: MultisigWitness.MultisigWitness<bigintType> | undefined
41
43
  nonceKey?: 'random' | bigintType | undefined
42
44
  validBefore?: numberType | undefined
43
45
  validAfter?: numberType | undefined
@@ -47,11 +49,12 @@ export type TransactionRequest<
47
49
  /** RPC representation of a {@link ox#TransactionRequest.TransactionRequest}. */
48
50
  export type Rpc = Omit<
49
51
  TransactionRequest<Hex.Hex, Hex.Hex, string, Hex.Hex>,
50
- 'authorizationList' | 'feeToken' | 'keyAuthorization'
52
+ 'authorizationList' | 'feeToken' | 'keyAuthorization' | 'multisigWitness'
51
53
  > & {
52
54
  authorizationList?: AuthorizationTempo.ListRpc | undefined
53
55
  feeToken?: Hex.Hex | undefined
54
56
  keyAuthorization?: KeyAuthorization.Rpc | undefined
57
+ multisigWitness?: MultisigWitness.Rpc | undefined
55
58
  nonceKey?: Hex.Hex | undefined
56
59
  }
57
60
 
@@ -76,7 +79,7 @@ export type Rpc = Omit<
76
79
  * @returns A transaction request.
77
80
  */
78
81
  export function fromRpc(request: Rpc): TransactionRequest {
79
- const { authorizationList: _, ...rest } = request
82
+ const { authorizationList: _, multisigWitness: __, ...rest } = request
80
83
  const request_ = ox_TransactionRequest.fromRpc(
81
84
  rest as any,
82
85
  ) as TransactionRequest
@@ -107,6 +110,8 @@ export function fromRpc(request: Rpc): TransactionRequest {
107
110
  request_.keyAuthorization = KeyAuthorization.fromRpc(
108
111
  request.keyAuthorization,
109
112
  )
113
+ if (request.multisigWitness)
114
+ request_.multisigWitness = MultisigWitness.fromRpc(request.multisigWitness)
110
115
  if (typeof request.validBefore !== 'undefined')
111
116
  request_.validBefore = Hex.toNumber(request.validBefore as Hex.Hex)
112
117
  if (typeof request.validAfter !== 'undefined')
@@ -120,6 +125,7 @@ export function fromRpc(request: Rpc): TransactionRequest {
120
125
  export declare namespace fromRpc {
121
126
  export type ErrorType =
122
127
  | AuthorizationTempo.fromRpcList.ErrorType
128
+ | MultisigWitness.fromRpc.ErrorType
123
129
  | Hex.toNumber.ErrorType
124
130
  | Hex.toBigInt.ErrorType
125
131
  | Errors.GlobalErrorType
@@ -204,6 +210,8 @@ export function toRpc(request: TransactionRequest): Rpc {
204
210
  request_rpc.keyAuthorization = KeyAuthorization.toRpc(
205
211
  request.keyAuthorization,
206
212
  )
213
+ if (request.multisigWitness)
214
+ request_rpc.multisigWitness = MultisigWitness.toRpc(request.multisigWitness)
207
215
  if (typeof request.validBefore !== 'undefined')
208
216
  request_rpc.validBefore = Hex.fromNumber(request.validBefore)
209
217
  if (typeof request.validAfter !== 'undefined')
@@ -222,6 +230,7 @@ export function toRpc(request: TransactionRequest): Rpc {
222
230
  typeof request.feePayer !== 'undefined' ||
223
231
  typeof request.feeToken !== 'undefined' ||
224
232
  typeof request.keyAuthorization !== 'undefined' ||
233
+ typeof request.multisigWitness !== 'undefined' ||
225
234
  typeof request.nonceKey !== 'undefined' ||
226
235
  typeof request.validBefore !== 'undefined' ||
227
236
  typeof request.validAfter !== 'undefined' ||
@@ -240,6 +249,7 @@ export function toRpc(request: TransactionRequest): Rpc {
240
249
  export declare namespace toRpc {
241
250
  export type ErrorType =
242
251
  | AuthorizationTempo.toRpcList.ErrorType
252
+ | MultisigWitness.toRpc.ErrorType
243
253
  | Hex.fromNumber.ErrorType
244
254
  | Errors.GlobalErrorType
245
255
  }
package/tempo/index.ts CHANGED
@@ -159,6 +159,15 @@ export * as MultisigConfig from './MultisigConfig.js'
159
159
  * @category Reference
160
160
  */
161
161
  export * as MultisigOperation from './MultisigOperation.js'
162
+ /**
163
+ * Native multisig RPC simulation witness utilities.
164
+ *
165
+ * Converts complete root and nested owner witnesses between their domain and
166
+ * Tempo JSON-RPC representations.
167
+ *
168
+ * @category Reference
169
+ */
170
+ export * as MultisigWitness from './MultisigWitness.js'
162
171
  /**
163
172
  * Utilities for constructing period durations (in seconds) for recurring spending limits.
164
173
  *
package/version.ts CHANGED
@@ -1,2 +1,2 @@
1
1
  /** @internal */
2
- export const version = '0.14.39'
2
+ export const version = '0.14.40'