ox 1.0.0-beta.9 → 1.0.1
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 +1151 -0
- package/dist/core/AbiParameters.d.ts.map +1 -1
- package/dist/core/AbiParameters.js +4 -1
- package/dist/core/AbiParameters.js.map +1 -1
- package/dist/core/Rlp.d.ts +27 -5
- package/dist/core/Rlp.d.ts.map +1 -1
- package/dist/core/Rlp.js +40 -4
- package/dist/core/Rlp.js.map +1 -1
- package/dist/core/RpcSchema.d.ts +1 -1
- package/dist/core/Siwe.d.ts +4 -4
- package/dist/core/Siwe.js +5 -5
- package/dist/core/Siwe.js.map +1 -1
- package/dist/core/internal/abiParameters.d.ts +1 -1
- package/dist/core/internal/abiParameters.d.ts.map +1 -1
- package/dist/core/internal/abiParameters.js +22 -4
- package/dist/core/internal/abiParameters.js.map +1 -1
- package/dist/core/internal/rpcSchemas/eth.d.ts +36 -0
- package/dist/core/internal/rpcSchemas/eth.d.ts.map +1 -1
- package/dist/erc4337/EntryPoint.d.ts +1072 -1
- package/dist/erc4337/EntryPoint.d.ts.map +1 -1
- package/dist/erc4337/EntryPoint.js +872 -0
- package/dist/erc4337/EntryPoint.js.map +1 -1
- package/dist/erc4337/RpcSchema.d.ts +2 -2
- package/dist/erc4337/RpcSchema.d.ts.map +1 -1
- package/dist/erc4337/UserOperation.d.ts +39 -10
- package/dist/erc4337/UserOperation.d.ts.map +1 -1
- package/dist/erc4337/UserOperation.js +62 -48
- package/dist/erc4337/UserOperation.js.map +1 -1
- package/dist/erc4337/UserOperationGas.d.ts +9 -5
- package/dist/erc4337/UserOperationGas.d.ts.map +1 -1
- package/dist/erc4337/UserOperationGas.js +17 -15
- package/dist/erc4337/UserOperationGas.js.map +1 -1
- package/dist/erc4337/UserOperationReceipt.d.ts +4 -4
- package/dist/erc4337/UserOperationReceipt.d.ts.map +1 -1
- package/dist/erc4337/UserOperationReceipt.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +2 -2
- package/dist/tempo/Channel.d.ts +8 -14
- package/dist/tempo/Channel.d.ts.map +1 -1
- package/dist/tempo/Channel.js +4 -8
- package/dist/tempo/Channel.js.map +1 -1
- package/dist/tempo/KeyAuthorization.d.ts +5 -5
- package/dist/tempo/KeyAuthorization.d.ts.map +1 -1
- package/dist/tempo/KeyAuthorization.js +4 -4
- package/dist/tempo/KeyAuthorization.js.map +1 -1
- package/dist/tempo/MultisigConfig.d.ts +37 -85
- package/dist/tempo/MultisigConfig.d.ts.map +1 -1
- package/dist/tempo/MultisigConfig.js +39 -83
- package/dist/tempo/MultisigConfig.js.map +1 -1
- package/dist/tempo/PoolId.d.ts +8 -7
- package/dist/tempo/PoolId.d.ts.map +1 -1
- package/dist/tempo/PoolId.js +10 -6
- package/dist/tempo/PoolId.js.map +1 -1
- package/dist/tempo/SignatureEnvelope.d.ts +32 -30
- package/dist/tempo/SignatureEnvelope.d.ts.map +1 -1
- package/dist/tempo/SignatureEnvelope.js +56 -51
- package/dist/tempo/SignatureEnvelope.js.map +1 -1
- package/dist/tempo/Transaction.d.ts +16 -5
- package/dist/tempo/Transaction.d.ts.map +1 -1
- package/dist/tempo/Transaction.js +34 -7
- package/dist/tempo/Transaction.js.map +1 -1
- package/dist/tempo/TransactionReceipt.d.ts +3 -3
- package/dist/tempo/TransactionReceipt.d.ts.map +1 -1
- package/dist/tempo/TransactionReceipt.js +8 -1
- package/dist/tempo/TransactionReceipt.js.map +1 -1
- package/dist/tempo/TransactionRequest.d.ts +15 -2
- package/dist/tempo/TransactionRequest.d.ts.map +1 -1
- package/dist/tempo/TransactionRequest.js +65 -29
- package/dist/tempo/TransactionRequest.js.map +1 -1
- package/dist/tempo/TxEnvelopeTempo.d.ts +2 -3
- package/dist/tempo/TxEnvelopeTempo.d.ts.map +1 -1
- package/dist/tempo/TxEnvelopeTempo.js +5 -6
- package/dist/tempo/TxEnvelopeTempo.js.map +1 -1
- package/dist/tempo/index.d.ts +6 -26
- package/dist/tempo/index.d.ts.map +1 -1
- package/dist/tempo/index.js +6 -26
- package/dist/tempo/index.js.map +1 -1
- package/dist/zod/Abi.d.ts +214 -0
- package/dist/zod/Abi.d.ts.map +1 -0
- package/dist/zod/Abi.js +5 -0
- package/dist/zod/Abi.js.map +1 -0
- package/dist/zod/AbiConstructor.d.ts +58 -0
- package/dist/zod/AbiConstructor.d.ts.map +1 -0
- package/dist/zod/AbiConstructor.js +18 -0
- package/dist/zod/AbiConstructor.js.map +1 -0
- package/dist/zod/AbiError.d.ts +20 -0
- package/dist/zod/AbiError.d.ts.map +1 -0
- package/dist/zod/AbiError.js +9 -0
- package/dist/zod/AbiError.js.map +1 -0
- package/dist/zod/AbiEvent.d.ts +23 -0
- package/dist/zod/AbiEvent.d.ts.map +1 -0
- package/dist/zod/AbiEvent.js +11 -0
- package/dist/zod/AbiEvent.js.map +1 -0
- package/dist/zod/AbiFallback.d.ts +16 -0
- package/dist/zod/AbiFallback.d.ts.map +1 -0
- package/dist/zod/AbiFallback.js +16 -0
- package/dist/zod/AbiFallback.js.map +1 -0
- package/dist/zod/AbiFunction.d.ts +109 -0
- package/dist/zod/AbiFunction.d.ts.map +1 -0
- package/dist/zod/AbiFunction.js +26 -0
- package/dist/zod/AbiFunction.js.map +1 -0
- package/dist/zod/AbiItem.d.ts +216 -0
- package/dist/zod/AbiItem.d.ts.map +1 -0
- package/dist/zod/AbiItem.js +26 -0
- package/dist/zod/AbiItem.js.map +1 -0
- package/dist/zod/AbiParameter.d.ts +32 -0
- package/dist/zod/AbiParameter.d.ts.map +1 -0
- package/dist/zod/AbiParameter.js +28 -0
- package/dist/zod/AbiParameter.js.map +1 -0
- package/dist/zod/AbiParameters.d.ts +30 -0
- package/dist/zod/AbiParameters.d.ts.map +1 -0
- package/dist/zod/AbiParameters.js +6 -0
- package/dist/zod/AbiParameters.js.map +1 -0
- package/dist/zod/AbiReceive.d.ts +6 -0
- package/dist/zod/AbiReceive.d.ts.map +1 -0
- package/dist/zod/AbiReceive.js +7 -0
- package/dist/zod/AbiReceive.js.map +1 -0
- package/dist/zod/RpcSchema.d.ts +1 -0
- package/dist/zod/RpcSchema.d.ts.map +1 -1
- package/dist/zod/Solidity.d.ts +15 -0
- package/dist/zod/Solidity.d.ts.map +1 -0
- package/dist/zod/Solidity.js +41 -0
- package/dist/zod/Solidity.js.map +1 -0
- package/dist/zod/TypedData.d.ts +226 -0
- package/dist/zod/TypedData.d.ts.map +1 -0
- package/dist/zod/TypedData.js +84 -0
- package/dist/zod/TypedData.js.map +1 -0
- package/dist/zod/internal/rpcSchemas/Eth.d.ts +1 -0
- package/dist/zod/internal/rpcSchemas/Eth.d.ts.map +1 -1
- package/dist/zod/internal/rpcSchemas/Eth.js +5 -0
- package/dist/zod/internal/rpcSchemas/Eth.js.map +1 -1
- package/dist/zod/tempo/AuthorizationTempo.d.ts +0 -20
- package/dist/zod/tempo/AuthorizationTempo.d.ts.map +1 -1
- package/dist/zod/tempo/KeyAuthorization.d.ts +503 -67
- package/dist/zod/tempo/KeyAuthorization.d.ts.map +1 -1
- package/dist/zod/tempo/KeyAuthorization.js +32 -15
- package/dist/zod/tempo/KeyAuthorization.js.map +1 -1
- package/dist/zod/tempo/RpcSchemaTempo.d.ts +216 -34
- package/dist/zod/tempo/RpcSchemaTempo.d.ts.map +1 -1
- package/dist/zod/tempo/SignatureEnvelope.d.ts +0 -6
- package/dist/zod/tempo/SignatureEnvelope.d.ts.map +1 -1
- package/dist/zod/tempo/SignatureEnvelope.js +0 -2
- package/dist/zod/tempo/SignatureEnvelope.js.map +1 -1
- package/dist/zod/tempo/Transaction.d.ts +1479 -333
- package/dist/zod/tempo/Transaction.d.ts.map +1 -1
- package/dist/zod/tempo/Transaction.js +65 -16
- package/dist/zod/tempo/Transaction.js.map +1 -1
- package/dist/zod/tempo/TransactionRequest.d.ts +410 -57
- package/dist/zod/tempo/TransactionRequest.d.ts.map +1 -1
- package/dist/zod/tempo/TransactionRequest.js +81 -18
- package/dist/zod/tempo/TransactionRequest.js.map +1 -1
- package/dist/zod/tempo/TxEnvelopeTempo.d.ts +225 -18
- package/dist/zod/tempo/TxEnvelopeTempo.d.ts.map +1 -1
- package/dist/zod/tempo/TxEnvelopeTempo.js +1 -1
- package/dist/zod/tempo/TxEnvelopeTempo.js.map +1 -1
- package/dist/zod/tempo/ZoneRpcAuthentication.d.ts +0 -3
- package/dist/zod/tempo/ZoneRpcAuthentication.d.ts.map +1 -1
- package/dist/zod/tempo/z.d.ts +0 -1
- package/dist/zod/tempo/z.d.ts.map +1 -1
- package/dist/zod/tempo/z.js +0 -1
- package/dist/zod/tempo/z.js.map +1 -1
- package/dist/zod/z.d.ts +12 -0
- package/dist/zod/z.d.ts.map +1 -1
- package/dist/zod/z.js +12 -0
- package/dist/zod/z.js.map +1 -1
- package/package.json +62 -11
- package/src/core/AbiParameters.ts +3 -1
- package/src/core/Rlp.ts +66 -3
- package/src/core/RpcSchema.ts +1 -1
- package/src/core/Siwe.ts +6 -6
- package/src/core/_test/AbiParameters.decode.test.ts +101 -12
- package/src/core/_test/AbiParameters.encode.test.ts +68 -0
- package/src/core/_test/Rlp.test.ts +101 -0
- package/src/core/_test/Siwe.test.ts +6 -8
- package/src/core/internal/abiParameters.ts +22 -5
- package/src/core/internal/rpcSchemas/eth.ts +36 -0
- package/src/erc4337/EntryPoint.ts +875 -1
- package/src/erc4337/RpcSchema.ts +4 -2
- package/src/erc4337/UserOperation.ts +130 -60
- package/src/erc4337/UserOperationGas.ts +36 -28
- package/src/erc4337/UserOperationReceipt.ts +15 -7
- package/src/erc4337/_test/EntryPoint.test.ts +48 -0
- package/src/erc4337/_test/RpcSchema.test-d.ts +56 -0
- package/src/erc4337/_test/UserOperation.snap-d.ts +31 -0
- package/src/erc4337/_test/UserOperation.test.ts +221 -5
- package/src/erc4337/_test/UserOperationGas.test.ts +30 -1
- package/src/index.ts +2 -2
- package/src/tempo/Channel.test.ts +2 -23
- package/src/tempo/Channel.ts +10 -22
- package/src/tempo/KeyAuthorization.test.ts +22 -0
- package/src/tempo/KeyAuthorization.ts +9 -9
- package/src/tempo/MultisigConfig.test.ts +54 -37
- package/src/tempo/MultisigConfig.ts +59 -134
- package/src/tempo/PoolId.test.ts +7 -41
- package/src/tempo/PoolId.ts +15 -10
- package/src/tempo/SignatureEnvelope.test.ts +118 -17
- package/src/tempo/SignatureEnvelope.ts +77 -72
- package/src/tempo/Transaction.test.ts +0 -15
- package/src/tempo/Transaction.ts +63 -12
- package/src/tempo/TransactionReceipt.test.ts +76 -0
- package/src/tempo/TransactionReceipt.ts +11 -5
- package/src/tempo/TransactionRequest.test.ts +174 -1
- package/src/tempo/TransactionRequest.ts +84 -32
- package/src/tempo/TxEnvelopeTempo.test.ts +2 -2
- package/src/tempo/TxEnvelopeTempo.ts +7 -7
- package/src/tempo/e2e.test.ts +228 -50
- package/src/tempo/index.ts +6 -26
- package/src/version.ts +1 -1
- package/src/zod/Abi.ts +5 -0
- package/src/zod/AbiConstructor.ts +24 -0
- package/src/zod/AbiError.ts +9 -0
- package/src/zod/AbiEvent.ts +11 -0
- package/src/zod/AbiFallback.ts +22 -0
- package/src/zod/AbiFunction.ts +32 -0
- package/src/zod/AbiItem.ts +28 -0
- package/src/zod/AbiParameter.ts +36 -0
- package/src/zod/AbiParameters.ts +7 -0
- package/src/zod/AbiReceive.ts +7 -0
- package/src/zod/Solidity.ts +83 -0
- package/src/zod/TypedData.ts +111 -0
- package/src/zod/_test/Abi.test-d.ts +46 -0
- package/src/zod/_test/Abi.test.ts +163 -0
- package/src/zod/_test/TypedData.test-d.ts +20 -0
- package/src/zod/_test/TypedData.test.ts +87 -0
- package/src/zod/_test/z.test-d.ts +6 -0
- package/src/zod/_test/z.test.ts +17 -0
- package/src/zod/internal/rpcSchemas/Eth.ts +6 -0
- package/src/zod/tempo/KeyAuthorization.ts +34 -15
- package/src/zod/tempo/SignatureEnvelope.ts +0 -2
- package/src/zod/tempo/Transaction.ts +84 -22
- package/src/zod/tempo/TransactionRequest.ts +86 -20
- package/src/zod/tempo/TxEnvelopeTempo.ts +1 -1
- package/src/zod/tempo/_test/KeyAuthorization.test.ts +53 -0
- package/src/zod/tempo/_test/SignatureEnvelope.test.ts +0 -2
- package/src/zod/tempo/_test/Transaction.test.ts +155 -0
- package/src/zod/tempo/_test/TransactionRequest.test.ts +44 -0
- package/src/zod/tempo/z.ts +0 -1
- package/src/zod/z.ts +12 -0
- package/dist/tempo/TokenId.d.ts +0 -87
- package/dist/tempo/TokenId.d.ts.map +0 -1
- package/dist/tempo/TokenId.js +0 -123
- package/dist/tempo/TokenId.js.map +0 -1
- package/dist/zod/tempo/TokenId.d.ts +0 -6
- package/dist/zod/tempo/TokenId.d.ts.map +0 -1
- package/dist/zod/tempo/TokenId.js +0 -14
- package/dist/zod/tempo/TokenId.js.map +0 -1
- package/src/CHANGELOG.md +0 -820
- package/src/tempo/TokenId.bench.ts +0 -36
- package/src/tempo/TokenId.test.ts +0 -79
- package/src/tempo/TokenId.ts +0 -141
- package/src/zod/tempo/TokenId.ts +0 -15
- package/src/zod/tempo/_test/TokenId.test-d.ts +0 -17
- package/src/zod/tempo/_test/TokenId.test.ts +0 -21
package/src/tempo/Transaction.ts
CHANGED
|
@@ -103,18 +103,40 @@ export type Tempo<
|
|
|
103
103
|
export type TempoRpc<pending extends boolean = false> = Compute<
|
|
104
104
|
Omit<
|
|
105
105
|
Tempo<pending, Hex.Hex, Hex.Hex, ToRpcType['tempo']>,
|
|
106
|
-
|
|
106
|
+
| 'authorizationList'
|
|
107
|
+
| 'calls'
|
|
108
|
+
| 'feePayerSignature'
|
|
109
|
+
| 'gasPrice'
|
|
110
|
+
| 'keyAuthorization'
|
|
111
|
+
| 'nonceKey'
|
|
112
|
+
| 'signature'
|
|
113
|
+
| 'validAfter'
|
|
114
|
+
| 'validBefore'
|
|
107
115
|
> & {
|
|
108
116
|
aaAuthorizationList?: AuthorizationTempo.ListRpc | undefined
|
|
109
117
|
calls:
|
|
110
118
|
| readonly {
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
119
|
+
data?: Hex.Hex | null | undefined
|
|
120
|
+
input?: Hex.Hex | null | undefined
|
|
121
|
+
to?: Hex.Hex | null | undefined
|
|
122
|
+
value?: Hex.Hex | null | undefined
|
|
114
123
|
}[]
|
|
115
124
|
| undefined
|
|
116
|
-
|
|
125
|
+
feePayerSignature?:
|
|
126
|
+
| {
|
|
127
|
+
r: Hex.Hex
|
|
128
|
+
s: Hex.Hex
|
|
129
|
+
v?: Hex.Hex | undefined
|
|
130
|
+
yParity: Hex.Hex
|
|
131
|
+
}
|
|
132
|
+
| null
|
|
133
|
+
| undefined
|
|
134
|
+
gasPrice?: Hex.Hex | null | undefined
|
|
135
|
+
keyAuthorization?: KeyAuthorization.Rpc | null | undefined
|
|
136
|
+
nonceKey?: Hex.Hex | null | undefined
|
|
117
137
|
signature: SignatureEnvelope.SignatureEnvelopeRpc
|
|
138
|
+
validAfter?: Hex.Hex | null | undefined
|
|
139
|
+
validBefore?: Hex.Hex | null | undefined
|
|
118
140
|
}
|
|
119
141
|
>
|
|
120
142
|
|
|
@@ -199,19 +221,26 @@ export function fromRpc<
|
|
|
199
221
|
transaction as ox_Transaction.Rpc<pending>,
|
|
200
222
|
) as Transaction<pending>
|
|
201
223
|
|
|
202
|
-
|
|
224
|
+
if (transaction.type !== '0x76') return transaction_ as never
|
|
225
|
+
|
|
226
|
+
transaction_.type = 'tempo'
|
|
203
227
|
|
|
204
|
-
|
|
228
|
+
// Tempo transactions carry `calls`; scrub the flat call fields the generic
|
|
229
|
+
// decoder fabricates.
|
|
230
|
+
delete (transaction_ as any).data
|
|
231
|
+
delete (transaction_ as any).input
|
|
232
|
+
delete (transaction_ as any).to
|
|
233
|
+
delete (transaction_ as any).value
|
|
234
|
+
|
|
235
|
+
if (transaction.aaAuthorizationList?.length)
|
|
205
236
|
transaction_.authorizationList = AuthorizationTempo.fromRpcList(
|
|
206
237
|
transaction.aaAuthorizationList,
|
|
207
238
|
)
|
|
208
|
-
|
|
209
|
-
}
|
|
239
|
+
delete (transaction_ as any).aaAuthorizationList
|
|
210
240
|
if (transaction.calls)
|
|
211
241
|
transaction_.calls = transaction.calls.map((call) => ({
|
|
212
|
-
to: call.to,
|
|
242
|
+
to: call.to ?? undefined,
|
|
213
243
|
value: call.value && call.value !== '0x' ? BigInt(call.value) : undefined,
|
|
214
|
-
// @ts-expect-error
|
|
215
244
|
data: call.input || call.data || '0x',
|
|
216
245
|
}))
|
|
217
246
|
if (transaction.feeToken) transaction_.feeToken = transaction.feeToken
|
|
@@ -235,6 +264,18 @@ export function fromRpc<
|
|
|
235
264
|
)
|
|
236
265
|
}
|
|
237
266
|
|
|
267
|
+
// The node serializes absent optional fields as `null`; scrub them.
|
|
268
|
+
for (const key of [
|
|
269
|
+
'feePayer',
|
|
270
|
+
'feePayerSignature',
|
|
271
|
+
'gasPrice',
|
|
272
|
+
'keyAuthorization',
|
|
273
|
+
'nonceKey',
|
|
274
|
+
'validAfter',
|
|
275
|
+
'validBefore',
|
|
276
|
+
] as const)
|
|
277
|
+
if ((transaction_ as any)[key] === null) delete (transaction_ as any)[key]
|
|
278
|
+
|
|
238
279
|
return transaction_ as never
|
|
239
280
|
}
|
|
240
281
|
|
|
@@ -300,7 +341,15 @@ export function toRpc<pending extends boolean = false>(
|
|
|
300
341
|
transaction as ox_Transaction.Transaction<pending>,
|
|
301
342
|
) as Rpc<pending>
|
|
302
343
|
|
|
303
|
-
|
|
344
|
+
if (transaction.type !== 'tempo') return rpc
|
|
345
|
+
|
|
346
|
+
rpc.type = '0x76'
|
|
347
|
+
|
|
348
|
+
// Tempo transactions carry `calls`; scrub the flat call fields the generic
|
|
349
|
+
// encoder fabricates.
|
|
350
|
+
delete (rpc as any).input
|
|
351
|
+
delete (rpc as any).to
|
|
352
|
+
delete (rpc as any).value
|
|
304
353
|
|
|
305
354
|
if (transaction.authorizationList)
|
|
306
355
|
rpc.aaAuthorizationList = AuthorizationTempo.toRpcList(
|
|
@@ -323,6 +372,8 @@ export function toRpc<pending extends boolean = false>(
|
|
|
323
372
|
Signature.yParityToV(Number(transaction.feePayerSignature.yParity)),
|
|
324
373
|
)
|
|
325
374
|
}
|
|
375
|
+
if (transaction.nonceKey !== undefined)
|
|
376
|
+
rpc.nonceKey = Quantity.fromNumberish(transaction.nonceKey)
|
|
326
377
|
if (transaction.signature)
|
|
327
378
|
rpc.signature = SignatureEnvelope.toRpc(transaction.signature)
|
|
328
379
|
if (transaction.validAfter !== undefined)
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { TransactionReceipt } from 'ox/tempo'
|
|
2
|
+
import { describe, expect, test } from 'vite-plus/test'
|
|
3
|
+
|
|
4
|
+
const rpc = {
|
|
5
|
+
blockHash:
|
|
6
|
+
'0xc350d807505fb835650f0013632c5515592987ba169bbc6626d9fc54d91f0f0b',
|
|
7
|
+
blockNumber: '0x12f296f',
|
|
8
|
+
contractAddress: null,
|
|
9
|
+
cumulativeGasUsed: '0x82515',
|
|
10
|
+
effectiveGasPrice: '0x21c2f6c09',
|
|
11
|
+
feePayer: '0x814e5e0e31016b9a7f138c76b7e7b2bb5c1ab6a6',
|
|
12
|
+
feeToken: '0x20c0000000000000000000000000000000000001',
|
|
13
|
+
from: '0x814e5e0e31016b9a7f138c76b7e7b2bb5c1ab6a6',
|
|
14
|
+
gasUsed: '0x2abba',
|
|
15
|
+
logs: [],
|
|
16
|
+
logsBloom: `0x${'00'.repeat(256)}`,
|
|
17
|
+
status: '0x1',
|
|
18
|
+
to: '0x3fc91a3afd70395cd496c647d5a6cc9d4b2b7fad',
|
|
19
|
+
transactionHash:
|
|
20
|
+
'0x353fdfc38a2f26115daadee9f5b8392ce62b84f410957967e2ed56b35338cdd0',
|
|
21
|
+
transactionIndex: '0x2',
|
|
22
|
+
type: '0x76',
|
|
23
|
+
} as const satisfies TransactionReceipt.Rpc
|
|
24
|
+
|
|
25
|
+
describe('fromRpc', () => {
|
|
26
|
+
test('default', () => {
|
|
27
|
+
const receipt = TransactionReceipt.fromRpc(rpc)
|
|
28
|
+
expect(receipt).toMatchInlineSnapshot(`
|
|
29
|
+
{
|
|
30
|
+
"blobGasPrice": undefined,
|
|
31
|
+
"blobGasUsed": undefined,
|
|
32
|
+
"blockHash": "0xc350d807505fb835650f0013632c5515592987ba169bbc6626d9fc54d91f0f0b",
|
|
33
|
+
"blockNumber": 19868015n,
|
|
34
|
+
"contractAddress": null,
|
|
35
|
+
"cumulativeGasUsed": 533781n,
|
|
36
|
+
"effectiveGasPrice": 9062804489n,
|
|
37
|
+
"feePayer": "0x814e5e0e31016b9a7f138c76b7e7b2bb5c1ab6a6",
|
|
38
|
+
"feeToken": "0x20c0000000000000000000000000000000000001",
|
|
39
|
+
"from": "0x814e5e0e31016b9a7f138c76b7e7b2bb5c1ab6a6",
|
|
40
|
+
"gasUsed": 175034n,
|
|
41
|
+
"logs": [],
|
|
42
|
+
"logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
|
|
43
|
+
"status": "success",
|
|
44
|
+
"to": "0x3fc91a3afd70395cd496c647d5a6cc9d4b2b7fad",
|
|
45
|
+
"transactionHash": "0x353fdfc38a2f26115daadee9f5b8392ce62b84f410957967e2ed56b35338cdd0",
|
|
46
|
+
"transactionIndex": 2,
|
|
47
|
+
"type": "tempo",
|
|
48
|
+
}
|
|
49
|
+
`)
|
|
50
|
+
})
|
|
51
|
+
|
|
52
|
+
test('behavior: non-tempo type passes through the generic mapping', () => {
|
|
53
|
+
const receipt = TransactionReceipt.fromRpc({ ...rpc, type: '0x2' })
|
|
54
|
+
expect(receipt.type).toBe('eip1559')
|
|
55
|
+
})
|
|
56
|
+
|
|
57
|
+
test('behavior: null', () => {
|
|
58
|
+
expect(TransactionReceipt.fromRpc(null)).toBeNull()
|
|
59
|
+
})
|
|
60
|
+
})
|
|
61
|
+
|
|
62
|
+
describe('toRpc', () => {
|
|
63
|
+
test('default', () => {
|
|
64
|
+
const receipt = TransactionReceipt.fromRpc(rpc)
|
|
65
|
+
const encoded = TransactionReceipt.toRpc(receipt)
|
|
66
|
+
expect(encoded.type).toBe('0x76')
|
|
67
|
+
expect(encoded.feePayer).toBe(rpc.feePayer)
|
|
68
|
+
expect(encoded.feeToken).toBe(rpc.feeToken)
|
|
69
|
+
expect(TransactionReceipt.fromRpc(encoded)).toEqual(receipt)
|
|
70
|
+
})
|
|
71
|
+
|
|
72
|
+
test('behavior: non-tempo type passes through the generic mapping', () => {
|
|
73
|
+
const receipt = TransactionReceipt.fromRpc({ ...rpc, type: '0x2' })
|
|
74
|
+
expect(TransactionReceipt.toRpc(receipt).type).toBe('0x2')
|
|
75
|
+
})
|
|
76
|
+
})
|
|
@@ -13,7 +13,7 @@ import * as ox_TransactionReceipt from '../core/TransactionReceipt.js'
|
|
|
13
13
|
*/
|
|
14
14
|
export type TransactionReceipt<
|
|
15
15
|
status = ox_TransactionReceipt.Status,
|
|
16
|
-
type =
|
|
16
|
+
type = Type,
|
|
17
17
|
bigintType = bigint,
|
|
18
18
|
numberType = number,
|
|
19
19
|
> = Compute<
|
|
@@ -32,7 +32,7 @@ export type TransactionReceipt<
|
|
|
32
32
|
|
|
33
33
|
export type Rpc = TransactionReceipt<
|
|
34
34
|
ox_TransactionReceipt.RpcStatus,
|
|
35
|
-
|
|
35
|
+
RpcType,
|
|
36
36
|
Hex.Hex,
|
|
37
37
|
Hex.Hex
|
|
38
38
|
>
|
|
@@ -118,9 +118,14 @@ export const toRpcType = {
|
|
|
118
118
|
export function fromRpc<const receipt extends Rpc | null>(
|
|
119
119
|
receipt: receipt | Rpc | null,
|
|
120
120
|
): receipt extends Rpc ? TransactionReceipt : null {
|
|
121
|
-
|
|
121
|
+
const decoded = ox_TransactionReceipt.fromRpc(
|
|
122
122
|
receipt as ox_TransactionReceipt.Rpc,
|
|
123
|
-
)
|
|
123
|
+
)
|
|
124
|
+
if (!decoded) return null as never
|
|
125
|
+
return {
|
|
126
|
+
...decoded,
|
|
127
|
+
type: (fromRpcType as any)[receipt!.type] ?? receipt!.type,
|
|
128
|
+
} as never
|
|
124
129
|
}
|
|
125
130
|
|
|
126
131
|
export declare namespace fromRpc {
|
|
@@ -192,6 +197,7 @@ export function toRpc(receipt: toRpc.Input): Rpc {
|
|
|
192
197
|
...rpc,
|
|
193
198
|
feePayer: receipt.feePayer,
|
|
194
199
|
feeToken: receipt.feeToken,
|
|
200
|
+
type: (toRpcType as any)[receipt.type] ?? receipt.type,
|
|
195
201
|
}
|
|
196
202
|
}
|
|
197
203
|
|
|
@@ -199,7 +205,7 @@ export declare namespace toRpc {
|
|
|
199
205
|
/** Numberish input accepted by {@link ox#TransactionReceipt.(toRpc:function)}. */
|
|
200
206
|
export type Input = TransactionReceipt<
|
|
201
207
|
ox_TransactionReceipt.Status,
|
|
202
|
-
|
|
208
|
+
Type,
|
|
203
209
|
Hex.Hex | bigint | number,
|
|
204
210
|
Hex.Hex | number
|
|
205
211
|
>
|
|
@@ -69,6 +69,40 @@ describe('fromRpc', () => {
|
|
|
69
69
|
expect(request.nonceKey).toBe(255n)
|
|
70
70
|
})
|
|
71
71
|
|
|
72
|
+
test('behavior: gas-model hints and capabilities pass through', () => {
|
|
73
|
+
const request = TransactionRequest.fromRpc({
|
|
74
|
+
calls: [{ to: '0xcafebabecafebabecafebabecafebabecafebabe' }],
|
|
75
|
+
capabilities: { balanceDiffs: true },
|
|
76
|
+
feePayer: true,
|
|
77
|
+
keyData: '0x0578',
|
|
78
|
+
keyId: '0xcccccccccccccccccccccccccccccccccccccccc',
|
|
79
|
+
keyType: 'webAuthn',
|
|
80
|
+
multisigInit: {
|
|
81
|
+
salt: '0x0000000000000000000000000000000000000000000000000000000000000000',
|
|
82
|
+
threshold: 2,
|
|
83
|
+
owners: [
|
|
84
|
+
{
|
|
85
|
+
owner: '0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',
|
|
86
|
+
weight: 1,
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
owner: '0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb',
|
|
90
|
+
weight: 1,
|
|
91
|
+
},
|
|
92
|
+
],
|
|
93
|
+
},
|
|
94
|
+
multisigSignatureCount: 2,
|
|
95
|
+
type: '0x76',
|
|
96
|
+
})
|
|
97
|
+
expect(request.capabilities).toEqual({ balanceDiffs: true })
|
|
98
|
+
expect(request.feePayer).toBe(true)
|
|
99
|
+
expect(request.keyData).toBe('0x0578')
|
|
100
|
+
expect(request.keyId).toBe('0xcccccccccccccccccccccccccccccccccccccccc')
|
|
101
|
+
expect(request.keyType).toBe('webAuthn')
|
|
102
|
+
expect(request.multisigInit).toMatchObject({ threshold: 2 })
|
|
103
|
+
expect(request.multisigSignatureCount).toBe(2)
|
|
104
|
+
})
|
|
105
|
+
|
|
72
106
|
test('behavior: empty', () => {
|
|
73
107
|
const request = TransactionRequest.fromRpc({})
|
|
74
108
|
expect(request).toMatchInlineSnapshot('{}')
|
|
@@ -123,6 +157,101 @@ describe('toRpc', () => {
|
|
|
123
157
|
`)
|
|
124
158
|
})
|
|
125
159
|
|
|
160
|
+
test('behavior: gas-model hints and capabilities are carried', () => {
|
|
161
|
+
const request = TransactionRequest.toRpc({
|
|
162
|
+
calls: [{ to: '0xcafebabecafebabecafebabecafebabecafebabe' }],
|
|
163
|
+
capabilities: { balanceDiffs: true },
|
|
164
|
+
feePayer: false,
|
|
165
|
+
keyData: '0x0578',
|
|
166
|
+
keyId: '0xcccccccccccccccccccccccccccccccccccccccc',
|
|
167
|
+
keyType: 'webAuthn',
|
|
168
|
+
multisigInit: {
|
|
169
|
+
salt: '0x0000000000000000000000000000000000000000000000000000000000000000',
|
|
170
|
+
threshold: 2,
|
|
171
|
+
owners: [
|
|
172
|
+
{
|
|
173
|
+
owner: '0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',
|
|
174
|
+
weight: 1,
|
|
175
|
+
},
|
|
176
|
+
{
|
|
177
|
+
owner: '0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb',
|
|
178
|
+
weight: 1,
|
|
179
|
+
},
|
|
180
|
+
],
|
|
181
|
+
},
|
|
182
|
+
multisigSignatureCount: 2,
|
|
183
|
+
})
|
|
184
|
+
expect(request.capabilities).toEqual({ balanceDiffs: true })
|
|
185
|
+
expect(request.feePayer).toBe(false)
|
|
186
|
+
expect(request.keyData).toBe('0x0578')
|
|
187
|
+
expect(request.keyId).toBe('0xcccccccccccccccccccccccccccccccccccccccc')
|
|
188
|
+
expect(request.keyType).toBe('webAuthn')
|
|
189
|
+
expect(request.multisigInit).toMatchObject({ threshold: 2 })
|
|
190
|
+
expect(request.multisigSignatureCount).toBe(2)
|
|
191
|
+
expect(request.type).toBe('0x76')
|
|
192
|
+
})
|
|
193
|
+
|
|
194
|
+
test('behavior: key data longer than 4 bytes shims into a length hint', () => {
|
|
195
|
+
const request = TransactionRequest.toRpc({
|
|
196
|
+
calls: [{ to: '0xcafebabecafebabecafebabecafebabecafebabe' }],
|
|
197
|
+
keyData: `0x${'aa'.repeat(1400)}`,
|
|
198
|
+
keyType: 'webAuthn',
|
|
199
|
+
})
|
|
200
|
+
// 1400 bytes -> 0x0578 big-endian length hint.
|
|
201
|
+
expect(request.keyData).toBe('0x0578')
|
|
202
|
+
})
|
|
203
|
+
|
|
204
|
+
test('behavior: feeToken is withheld until the fee payer signs (TIP-76)', () => {
|
|
205
|
+
const pending = TransactionRequest.toRpc({
|
|
206
|
+
calls: [{ to: '0xcafebabecafebabecafebabecafebabecafebabe' }],
|
|
207
|
+
feePayer: true,
|
|
208
|
+
feeToken: '0x20c0000000000000000000000000000000000000',
|
|
209
|
+
})
|
|
210
|
+
expect(pending.feeToken).toBeUndefined()
|
|
211
|
+
expect(pending.feePayer).toBe(true)
|
|
212
|
+
|
|
213
|
+
const signed = TransactionRequest.toRpc({
|
|
214
|
+
calls: [{ to: '0xcafebabecafebabecafebabecafebabecafebabe' }],
|
|
215
|
+
feePayer: true,
|
|
216
|
+
feePayerSignature: {
|
|
217
|
+
r: '0x0000000000000000000000000000000000000000000000000000000000000001',
|
|
218
|
+
s: '0x0000000000000000000000000000000000000000000000000000000000000002',
|
|
219
|
+
yParity: 1,
|
|
220
|
+
},
|
|
221
|
+
feeToken: '0x20c0000000000000000000000000000000000000',
|
|
222
|
+
})
|
|
223
|
+
expect(signed.feeToken).toBe('0x20c0000000000000000000000000000000000000')
|
|
224
|
+
})
|
|
225
|
+
|
|
226
|
+
test('behavior: data-less call defaults to the zero address', () => {
|
|
227
|
+
const flat = TransactionRequest.toRpc({
|
|
228
|
+
feeToken: '0x20c0000000000000000000000000000000000000',
|
|
229
|
+
value: 100n,
|
|
230
|
+
})
|
|
231
|
+
expect(flat.calls).toMatchInlineSnapshot(`
|
|
232
|
+
[
|
|
233
|
+
{
|
|
234
|
+
"data": "0x",
|
|
235
|
+
"to": "0x0000000000000000000000000000000000000000",
|
|
236
|
+
"value": "0x64",
|
|
237
|
+
},
|
|
238
|
+
]
|
|
239
|
+
`)
|
|
240
|
+
|
|
241
|
+
const bare = TransactionRequest.toRpc({
|
|
242
|
+
feeToken: '0x20c0000000000000000000000000000000000000',
|
|
243
|
+
})
|
|
244
|
+
expect(bare.calls).toMatchInlineSnapshot(`
|
|
245
|
+
[
|
|
246
|
+
{
|
|
247
|
+
"data": "0x",
|
|
248
|
+
"to": "0x0000000000000000000000000000000000000000",
|
|
249
|
+
"value": "0x",
|
|
250
|
+
},
|
|
251
|
+
]
|
|
252
|
+
`)
|
|
253
|
+
})
|
|
254
|
+
|
|
126
255
|
test("behavior: nonceKey 'random' generates a 192-bit value", () => {
|
|
127
256
|
const request = TransactionRequest.toRpc({
|
|
128
257
|
calls: [
|
|
@@ -311,9 +440,53 @@ describe('toEnvelope', () => {
|
|
|
311
440
|
expect(envelope.validAfter).toBe(100)
|
|
312
441
|
})
|
|
313
442
|
|
|
314
|
-
test('
|
|
443
|
+
test('behavior: data-less request defaults to a zero-address call', () => {
|
|
444
|
+
const envelope = TransactionRequest.toEnvelope({
|
|
445
|
+
chainId: 1,
|
|
446
|
+
maxFeePerGas: 1n,
|
|
447
|
+
})
|
|
448
|
+
expect(envelope.calls).toEqual([
|
|
449
|
+
{ to: '0x0000000000000000000000000000000000000000' },
|
|
450
|
+
])
|
|
451
|
+
})
|
|
452
|
+
|
|
453
|
+
test('behavior: feePayer marks the envelope as pending a fee payer signature (TIP-76)', () => {
|
|
454
|
+
const envelope = TransactionRequest.toEnvelope({
|
|
455
|
+
calls: [{ to: '0x0000000000000000000000000000000000000000' }],
|
|
456
|
+
chainId: 1,
|
|
457
|
+
feePayer: true,
|
|
458
|
+
feeToken: '0x20c0000000000000000000000000000000000000',
|
|
459
|
+
maxFeePerGas: 1n,
|
|
460
|
+
})
|
|
461
|
+
expect(envelope.feePayerSignature).toBeNull()
|
|
462
|
+
|
|
463
|
+
// An explicit fee payer signature wins over the marker.
|
|
464
|
+
const signed = TransactionRequest.toEnvelope({
|
|
465
|
+
calls: [{ to: '0x0000000000000000000000000000000000000000' }],
|
|
466
|
+
chainId: 1,
|
|
467
|
+
feePayer: true,
|
|
468
|
+
feePayerSignature: {
|
|
469
|
+
r: '0x0000000000000000000000000000000000000000000000000000000000000001',
|
|
470
|
+
s: '0x0000000000000000000000000000000000000000000000000000000000000002',
|
|
471
|
+
yParity: 1,
|
|
472
|
+
},
|
|
473
|
+
maxFeePerGas: 1n,
|
|
474
|
+
})
|
|
475
|
+
expect(signed.feePayerSignature).not.toBeNull()
|
|
476
|
+
|
|
477
|
+
// No fee payer, no marker.
|
|
478
|
+
const plain = TransactionRequest.toEnvelope({
|
|
479
|
+
calls: [{ to: '0x0000000000000000000000000000000000000000' }],
|
|
480
|
+
chainId: 1,
|
|
481
|
+
maxFeePerGas: 1n,
|
|
482
|
+
})
|
|
483
|
+
expect(plain.feePayerSignature).toBeUndefined()
|
|
484
|
+
})
|
|
485
|
+
|
|
486
|
+
test('error: explicit empty calls throws via envelope assert', () => {
|
|
315
487
|
expect(() =>
|
|
316
488
|
TransactionRequest.toEnvelope({
|
|
489
|
+
calls: [],
|
|
317
490
|
chainId: 1,
|
|
318
491
|
maxFeePerGas: 1n,
|
|
319
492
|
}),
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type * as Address from '../core/Address.js'
|
|
1
2
|
import type * as Errors from '../core/Errors.js'
|
|
2
3
|
import * as Hex from '../core/Hex.js'
|
|
3
4
|
import * as Quantity from '../core/internal/quantity.js'
|
|
@@ -6,14 +7,21 @@ import * as Signature from '../core/Signature.js'
|
|
|
6
7
|
import * as ox_TransactionRequest from '../core/TransactionRequest.js'
|
|
7
8
|
import * as AuthorizationTempo from './AuthorizationTempo.js'
|
|
8
9
|
import * as KeyAuthorization from './KeyAuthorization.js'
|
|
10
|
+
import type * as MultisigConfig from './MultisigConfig.js'
|
|
9
11
|
import * as SignatureEnvelope from './SignatureEnvelope.js'
|
|
10
|
-
import * as TokenId from './TokenId.js'
|
|
11
12
|
import * as Transaction from './Transaction.js'
|
|
12
13
|
import * as TxEnvelopeTempo from './TxEnvelopeTempo.js'
|
|
13
14
|
import type { Call } from './TxEnvelopeTempo.js'
|
|
14
15
|
|
|
15
16
|
type KeyType = 'secp256k1' | 'p256' | 'webAuthn'
|
|
16
17
|
|
|
18
|
+
/**
|
|
19
|
+
* Bootstrap multisig config hint for node-side gas modeling (TIP-1061).
|
|
20
|
+
* The node prices multisig gas from it during simulation, and ignores it
|
|
21
|
+
* for registered senders.
|
|
22
|
+
*/
|
|
23
|
+
export type MultisigInit = Compute<MultisigConfig.Config & { salt: Hex.Hex }>
|
|
24
|
+
|
|
17
25
|
/**
|
|
18
26
|
* A Transaction Request that is generic to all transaction types.
|
|
19
27
|
*
|
|
@@ -35,12 +43,16 @@ export type TransactionRequest<
|
|
|
35
43
|
| AuthorizationTempo.ListSigned<bigintType, numberType>
|
|
36
44
|
| undefined
|
|
37
45
|
calls?: readonly Call<bigintType>[] | undefined
|
|
46
|
+
capabilities?: Record<string, unknown> | undefined
|
|
38
47
|
feePayerSignature?: Signature.Signature<true, numberType> | null | undefined
|
|
39
48
|
keyAuthorization?: KeyAuthorization.KeyAuthorization<true> | undefined
|
|
40
49
|
keyData?: Hex.Hex | undefined
|
|
50
|
+
keyId?: Address.Address | undefined
|
|
41
51
|
keyType?: KeyType | undefined
|
|
42
52
|
feePayer?: boolean | undefined
|
|
43
|
-
feeToken?:
|
|
53
|
+
feeToken?: Address.Address | undefined
|
|
54
|
+
multisigInit?: MultisigInit | undefined
|
|
55
|
+
multisigSignatureCount?: number | undefined
|
|
44
56
|
nonceKey?: 'random' | bigintType | undefined
|
|
45
57
|
signature?: SignatureEnvelope.SignatureEnvelope<numberType> | undefined
|
|
46
58
|
validBefore?: numberType | undefined
|
|
@@ -202,6 +214,22 @@ export function toRpc(request: toRpc.Input): Rpc {
|
|
|
202
214
|
authorizationList: undefined,
|
|
203
215
|
}) as Rpc
|
|
204
216
|
|
|
217
|
+
const tempo =
|
|
218
|
+
typeof request.calls !== 'undefined' ||
|
|
219
|
+
typeof request.capabilities !== 'undefined' ||
|
|
220
|
+
typeof request.feePayer !== 'undefined' ||
|
|
221
|
+
typeof request.feeToken !== 'undefined' ||
|
|
222
|
+
typeof request.keyAuthorization !== 'undefined' ||
|
|
223
|
+
typeof request.keyData !== 'undefined' ||
|
|
224
|
+
typeof request.keyId !== 'undefined' ||
|
|
225
|
+
typeof request.keyType !== 'undefined' ||
|
|
226
|
+
typeof request.multisigInit !== 'undefined' ||
|
|
227
|
+
typeof request.multisigSignatureCount !== 'undefined' ||
|
|
228
|
+
typeof request.nonceKey !== 'undefined' ||
|
|
229
|
+
typeof request.validBefore !== 'undefined' ||
|
|
230
|
+
typeof request.validAfter !== 'undefined' ||
|
|
231
|
+
request.type === 'tempo'
|
|
232
|
+
|
|
205
233
|
if (request.authorizationList)
|
|
206
234
|
request_rpc.authorizationList = AuthorizationTempo.toRpcList(
|
|
207
235
|
request.authorizationList,
|
|
@@ -216,20 +244,40 @@ export function toRpc(request: toRpc.Input): Rpc {
|
|
|
216
244
|
value: call.value ? Quantity.fromNumberish(call.value) : '0x',
|
|
217
245
|
data: call.data ?? '0x',
|
|
218
246
|
}))
|
|
219
|
-
else if (request.to || request.data || request.value)
|
|
247
|
+
else if (request.to || request.data || request.value || tempo)
|
|
220
248
|
request_rpc.calls = [
|
|
221
249
|
{
|
|
222
|
-
to:
|
|
250
|
+
to:
|
|
251
|
+
request.to ||
|
|
252
|
+
(tempo && (!request.data || request.data === '0x')
|
|
253
|
+
? '0x0000000000000000000000000000000000000000'
|
|
254
|
+
: undefined),
|
|
223
255
|
value: request.value ? Quantity.fromNumberish(request.value) : '0x',
|
|
224
256
|
data: request.data ?? '0x',
|
|
225
257
|
},
|
|
226
258
|
]
|
|
227
|
-
if (
|
|
228
|
-
|
|
259
|
+
if (
|
|
260
|
+
typeof request.feeToken !== 'undefined' &&
|
|
261
|
+
!(request.feePayer === true && !request.feePayerSignature)
|
|
262
|
+
)
|
|
263
|
+
request_rpc.feeToken = request.feeToken
|
|
229
264
|
if (request.keyAuthorization)
|
|
230
265
|
request_rpc.keyAuthorization = KeyAuthorization.toRpc(
|
|
231
266
|
request.keyAuthorization,
|
|
232
267
|
)
|
|
268
|
+
if (typeof request.capabilities !== 'undefined')
|
|
269
|
+
request_rpc.capabilities = request.capabilities
|
|
270
|
+
if (typeof request.feePayer !== 'undefined')
|
|
271
|
+
request_rpc.feePayer = request.feePayer
|
|
272
|
+
if (typeof request.keyData !== 'undefined')
|
|
273
|
+
request_rpc.keyData = shimKeyData(request.keyData)
|
|
274
|
+
if (typeof request.keyId !== 'undefined') request_rpc.keyId = request.keyId
|
|
275
|
+
if (typeof request.keyType !== 'undefined')
|
|
276
|
+
request_rpc.keyType = request.keyType
|
|
277
|
+
if (typeof request.multisigInit !== 'undefined')
|
|
278
|
+
request_rpc.multisigInit = request.multisigInit
|
|
279
|
+
if (typeof request.multisigSignatureCount !== 'undefined')
|
|
280
|
+
request_rpc.multisigSignatureCount = request.multisigSignatureCount
|
|
233
281
|
if (typeof request.validBefore !== 'undefined')
|
|
234
282
|
request_rpc.validBefore = Quantity.fromNumberish(request.validBefore)
|
|
235
283
|
if (typeof request.validAfter !== 'undefined')
|
|
@@ -243,16 +291,7 @@ export function toRpc(request: toRpc.Input): Rpc {
|
|
|
243
291
|
})()
|
|
244
292
|
if (nonceKey) request_rpc.nonceKey = nonceKey
|
|
245
293
|
|
|
246
|
-
if (
|
|
247
|
-
typeof request.calls !== 'undefined' ||
|
|
248
|
-
typeof request.feePayer !== 'undefined' ||
|
|
249
|
-
typeof request.feeToken !== 'undefined' ||
|
|
250
|
-
typeof request.keyAuthorization !== 'undefined' ||
|
|
251
|
-
typeof request.nonceKey !== 'undefined' ||
|
|
252
|
-
typeof request.validBefore !== 'undefined' ||
|
|
253
|
-
typeof request.validAfter !== 'undefined' ||
|
|
254
|
-
request.type === 'tempo'
|
|
255
|
-
) {
|
|
294
|
+
if (tempo) {
|
|
256
295
|
request_rpc.type = Transaction.toRpcType.tempo
|
|
257
296
|
delete request_rpc.data
|
|
258
297
|
delete request_rpc.input
|
|
@@ -306,21 +345,20 @@ export function toEnvelope(
|
|
|
306
345
|
): TxEnvelopeTempo.TxEnvelopeTempo {
|
|
307
346
|
const calls = (() => {
|
|
308
347
|
if (request.calls) return request.calls
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
return [] as readonly Call[]
|
|
348
|
+
const to =
|
|
349
|
+
request.to ||
|
|
350
|
+
(!request.data || request.data === '0x'
|
|
351
|
+
? '0x0000000000000000000000000000000000000000'
|
|
352
|
+
: undefined)
|
|
353
|
+
return [
|
|
354
|
+
{
|
|
355
|
+
...(typeof to !== 'undefined' ? { to } : {}),
|
|
356
|
+
...(typeof request.data !== 'undefined' ? { data: request.data } : {}),
|
|
357
|
+
...(typeof request.value !== 'undefined'
|
|
358
|
+
? { value: request.value }
|
|
359
|
+
: {}),
|
|
360
|
+
},
|
|
361
|
+
] satisfies readonly Call[]
|
|
324
362
|
})()
|
|
325
363
|
|
|
326
364
|
const nonceKey = (() => {
|
|
@@ -342,7 +380,9 @@ export function toEnvelope(
|
|
|
342
380
|
: {}),
|
|
343
381
|
...(typeof request.feePayerSignature !== 'undefined'
|
|
344
382
|
? { feePayerSignature: request.feePayerSignature }
|
|
345
|
-
:
|
|
383
|
+
: request.feePayer
|
|
384
|
+
? { feePayerSignature: null }
|
|
385
|
+
: {}),
|
|
346
386
|
...(typeof request.feeToken !== 'undefined'
|
|
347
387
|
? { feeToken: request.feeToken }
|
|
348
388
|
: {}),
|
|
@@ -387,3 +427,15 @@ export declare namespace toEnvelope {
|
|
|
387
427
|
| Hex.toBigInt.ErrorType
|
|
388
428
|
| Errors.GlobalErrorType
|
|
389
429
|
}
|
|
430
|
+
|
|
431
|
+
/**
|
|
432
|
+
* Shims key data longer than 4 bytes into a 2-byte big-endian length hint.
|
|
433
|
+
* The node's gas estimator only accepts 1, 2, or 4-byte key data as a
|
|
434
|
+
* signature-size hint; anything else silently falls back to the default.
|
|
435
|
+
* @internal
|
|
436
|
+
*/
|
|
437
|
+
function shimKeyData(data: Hex.Hex): Hex.Hex {
|
|
438
|
+
const byteLength = Hex.size(data)
|
|
439
|
+
if (byteLength <= 4) return data
|
|
440
|
+
return Hex.fromNumber(byteLength, { size: 2 })
|
|
441
|
+
}
|
|
@@ -1464,7 +1464,7 @@ describe('encodeForSigning', () => {
|
|
|
1464
1464
|
},
|
|
1465
1465
|
],
|
|
1466
1466
|
feePayerSignature: null,
|
|
1467
|
-
feeToken:
|
|
1467
|
+
feeToken: '0x20c0000000000000000000000000000000000001',
|
|
1468
1468
|
nonce: 0n,
|
|
1469
1469
|
})
|
|
1470
1470
|
const signature = Secp256k1.sign({
|
|
@@ -1485,7 +1485,7 @@ describe('encodeForSigning', () => {
|
|
|
1485
1485
|
const sponsored = TxEnvelopeTempo.from({
|
|
1486
1486
|
...signed,
|
|
1487
1487
|
feePayerSignature,
|
|
1488
|
-
feeToken:
|
|
1488
|
+
feeToken: '0x20c0000000000000000000000000000000000002',
|
|
1489
1489
|
})
|
|
1490
1490
|
|
|
1491
1491
|
expect(TxEnvelopeTempo.encodeForSigning(sponsored)).toBe(
|