ox 1.0.0-beta.9 → 1.0.0
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 +1143 -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/internal/abiParameters.d.ts.map +1 -1
- package/dist/core/internal/abiParameters.js +21 -3
- 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/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/_test/AbiParameters.decode.test.ts +88 -12
- package/src/core/_test/AbiParameters.encode.test.ts +68 -0
- package/src/core/_test/Rlp.test.ts +101 -0
- package/src/core/internal/abiParameters.ts +21 -3
- 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/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
|
@@ -83,7 +83,6 @@ export const KeychainRpc = z.object({
|
|
|
83
83
|
/** RPC native multisig signature envelope schema. */
|
|
84
84
|
export const MultisigRpc = z.object({
|
|
85
85
|
account: z_Address.Address,
|
|
86
|
-
configId: z_Hex.Hex,
|
|
87
86
|
init: z.optional(z_MultisigConfig.Config),
|
|
88
87
|
// Owner approvals are raw serialized signatures (node `Vec<Bytes>`).
|
|
89
88
|
signatures: z.readonly(z.array(z_Hex.Hex)),
|
|
@@ -140,7 +139,6 @@ export const Keychain = z.object({
|
|
|
140
139
|
/** Native multisig signature envelope schema. */
|
|
141
140
|
export const Multisig = z.object({
|
|
142
141
|
account: z_Address.Address,
|
|
143
|
-
genesisConfigId: z_Hex.Hex,
|
|
144
142
|
init: z.optional(z_MultisigConfig.Config),
|
|
145
143
|
// `signatures` is recursive; type the getter concretely to break the cycle.
|
|
146
144
|
signatures: z.lazy(
|
|
@@ -22,12 +22,16 @@ const FeePayerSignature = z.object({
|
|
|
22
22
|
yParity: z_Number.Number,
|
|
23
23
|
})
|
|
24
24
|
|
|
25
|
+
/** Nullable RPC call field schema (the node serializes absent fields as `null`). */
|
|
26
|
+
const NullableHex = z.optional(z.union([z_Hex.Hex, z.null()]))
|
|
27
|
+
|
|
25
28
|
/** Tempo transaction call schema (decodes the RPC `input` field to `data`). */
|
|
26
29
|
const Call = z.codec(
|
|
27
30
|
z.object({
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
+
data: NullableHex,
|
|
32
|
+
input: NullableHex,
|
|
33
|
+
to: NullableHex,
|
|
34
|
+
value: NullableHex,
|
|
31
35
|
}),
|
|
32
36
|
z.object({
|
|
33
37
|
data: z.optional(z_Hex.Hex),
|
|
@@ -36,9 +40,9 @@ const Call = z.codec(
|
|
|
36
40
|
}),
|
|
37
41
|
{
|
|
38
42
|
decode: (value) => ({
|
|
39
|
-
data: value.input,
|
|
40
|
-
to: value.to,
|
|
41
|
-
value: value.value === '0x' ? undefined : value.value,
|
|
43
|
+
data: value.input ?? value.data ?? undefined,
|
|
44
|
+
to: value.to ?? undefined,
|
|
45
|
+
value: !value.value || value.value === '0x' ? undefined : value.value,
|
|
42
46
|
}),
|
|
43
47
|
encode: (value) => ({
|
|
44
48
|
input: value.data,
|
|
@@ -51,9 +55,10 @@ const Call = z.codec(
|
|
|
51
55
|
/** Encode-only tempo transaction call schema accepting numberish `toRpc` inputs. */
|
|
52
56
|
const CallToRpc = z.codec(
|
|
53
57
|
z.object({
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
58
|
+
data: NullableHex,
|
|
59
|
+
input: NullableHex,
|
|
60
|
+
to: NullableHex,
|
|
61
|
+
value: NullableHex,
|
|
57
62
|
}),
|
|
58
63
|
z.object({
|
|
59
64
|
data: z.optional(z_Hex.Hex),
|
|
@@ -62,9 +67,9 @@ const CallToRpc = z.codec(
|
|
|
62
67
|
}),
|
|
63
68
|
{
|
|
64
69
|
decode: (value) => ({
|
|
65
|
-
data: value.input,
|
|
66
|
-
to: value.to,
|
|
67
|
-
value: value.value === '0x' ? undefined : value.value,
|
|
70
|
+
data: value.input ?? value.data ?? undefined,
|
|
71
|
+
to: value.to ?? undefined,
|
|
72
|
+
value: !value.value || value.value === '0x' ? undefined : value.value,
|
|
68
73
|
}),
|
|
69
74
|
encode: (value) => ({
|
|
70
75
|
input: value.data,
|
|
@@ -74,21 +79,78 @@ const CallToRpc = z.codec(
|
|
|
74
79
|
},
|
|
75
80
|
)
|
|
76
81
|
|
|
82
|
+
/** Optional fields the node serializes as `null` when absent. */
|
|
83
|
+
const nullableFields = [
|
|
84
|
+
'feePayer',
|
|
85
|
+
'feePayerSignature',
|
|
86
|
+
'gasPrice',
|
|
87
|
+
'keyAuthorization',
|
|
88
|
+
'nonceKey',
|
|
89
|
+
'validAfter',
|
|
90
|
+
'validBefore',
|
|
91
|
+
] as const
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Wraps a tempo transaction object schema in a wire-shape codec: scrubs
|
|
95
|
+
* node-null optionals and maps the `aaAuthorizationList` RPC field to
|
|
96
|
+
* `authorizationList` (and back on encode).
|
|
97
|
+
*/
|
|
98
|
+
function wire<schema extends z.ZodMiniType>(schema: schema) {
|
|
99
|
+
return z.codec(z.looseObject({ type: z.literal('0x76') }), schema, {
|
|
100
|
+
decode: (rpc) => {
|
|
101
|
+
const { aaAuthorizationList, ...rest } = rpc as Record<string, unknown>
|
|
102
|
+
for (const key of nullableFields) if (rest[key] === null) delete rest[key]
|
|
103
|
+
if (Array.isArray(aaAuthorizationList) && aaAuthorizationList.length > 0)
|
|
104
|
+
rest.authorizationList = aaAuthorizationList
|
|
105
|
+
return rest as never
|
|
106
|
+
},
|
|
107
|
+
encode: (rpc) => {
|
|
108
|
+
const { authorizationList, ...rest } = rpc as Record<string, unknown>
|
|
109
|
+
return {
|
|
110
|
+
...rest,
|
|
111
|
+
...(authorizationList
|
|
112
|
+
? { aaAuthorizationList: authorizationList }
|
|
113
|
+
: {}),
|
|
114
|
+
} as never
|
|
115
|
+
},
|
|
116
|
+
})
|
|
117
|
+
}
|
|
118
|
+
|
|
77
119
|
/** Tempo transaction schema (type `0x76`). */
|
|
78
|
-
export const Tempo =
|
|
79
|
-
|
|
120
|
+
export const Tempo = wire(
|
|
121
|
+
z.object(
|
|
122
|
+
fields(z_Uint.Uint, z_Number.Number, Call, z_AuthorizationTempo.ListSigned),
|
|
123
|
+
),
|
|
80
124
|
)
|
|
81
125
|
|
|
82
126
|
/** Encode-only tempo transaction schema accepting numberish `toRpc` inputs. */
|
|
83
|
-
export const TempoToRpc =
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
127
|
+
export const TempoToRpc = wire(
|
|
128
|
+
z.object(
|
|
129
|
+
fields(
|
|
130
|
+
z_Uint.UintToRpc,
|
|
131
|
+
z_Number.NumberToRpc,
|
|
132
|
+
CallToRpc,
|
|
133
|
+
z_AuthorizationTempo.ListSignedToRpc,
|
|
134
|
+
),
|
|
89
135
|
),
|
|
90
136
|
)
|
|
91
137
|
|
|
138
|
+
/** Pending tempo transaction schema (type `0x76`, not yet included in a block). */
|
|
139
|
+
export const PendingTempo = wire(
|
|
140
|
+
z.object({
|
|
141
|
+
...fields(
|
|
142
|
+
z_Uint.Uint,
|
|
143
|
+
z_Number.Number,
|
|
144
|
+
Call,
|
|
145
|
+
z_AuthorizationTempo.ListSigned,
|
|
146
|
+
),
|
|
147
|
+
blockHash: z.null(),
|
|
148
|
+
blockNumber: z.null(),
|
|
149
|
+
blockTimestamp: z.optional(z.null()),
|
|
150
|
+
transactionIndex: z.null(),
|
|
151
|
+
}),
|
|
152
|
+
)
|
|
153
|
+
|
|
92
154
|
function fields<
|
|
93
155
|
uint extends z.ZodMiniType,
|
|
94
156
|
num extends z.ZodMiniType,
|
|
@@ -132,5 +194,5 @@ export const TransactionToRpc = z.union([
|
|
|
132
194
|
z_Transaction.TransactionToRpc,
|
|
133
195
|
])
|
|
134
196
|
|
|
135
|
-
/** Pending tempo transaction schema. */
|
|
136
|
-
export const Pending = z_Transaction.Pending
|
|
197
|
+
/** Pending tempo transaction schema (union of tempo + standard transaction types). */
|
|
198
|
+
export const Pending = z.union([PendingTempo, z_Transaction.Pending])
|
|
@@ -14,7 +14,6 @@ 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
16
|
import * as z_SignatureEnvelope from './SignatureEnvelope.js'
|
|
17
|
-
import * as z_TokenId from './TokenId.js'
|
|
18
17
|
|
|
19
18
|
const fromRpcType = { '0x76': 'tempo' } as const
|
|
20
19
|
const toRpcType = { tempo: '0x76' } as const
|
|
@@ -57,6 +56,16 @@ const CallToRpc = z.object({
|
|
|
57
56
|
value: z.optional(uintBigintNumberish()),
|
|
58
57
|
})
|
|
59
58
|
|
|
59
|
+
const Capabilities = z.record(z.string(), z.unknown())
|
|
60
|
+
|
|
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
|
+
|
|
60
69
|
/** RPC tempo transaction request schema. */
|
|
61
70
|
export const Rpc = z.object({
|
|
62
71
|
accessList: z.optional(z_AccessList.AccessList),
|
|
@@ -64,6 +73,7 @@ export const Rpc = z.object({
|
|
|
64
73
|
blobVersionedHashes: z.optional(z.readonly(z.array(z_Hex.Hex))),
|
|
65
74
|
blobs: z.optional(z.readonly(z.array(z_Hex.Hex))),
|
|
66
75
|
calls: z.optional(z.readonly(z.array(CallRpc))),
|
|
76
|
+
capabilities: z.optional(Capabilities),
|
|
67
77
|
chainId: z.optional(z_Hex.Hex),
|
|
68
78
|
data: z.optional(z_Hex.Hex),
|
|
69
79
|
feePayer: z.optional(z.boolean()),
|
|
@@ -75,10 +85,13 @@ export const Rpc = z.object({
|
|
|
75
85
|
input: z.optional(z_Hex.Hex),
|
|
76
86
|
keyAuthorization: z.optional(z_KeyAuthorization.Rpc),
|
|
77
87
|
keyData: z.optional(z_Hex.Hex),
|
|
88
|
+
keyId: z.optional(z_Address.Address),
|
|
78
89
|
keyType: z.optional(KeyType),
|
|
79
90
|
maxFeePerBlobGas: z.optional(z_Hex.Hex),
|
|
80
91
|
maxFeePerGas: z.optional(z_Hex.Hex),
|
|
81
92
|
maxPriorityFeePerGas: z.optional(z_Hex.Hex),
|
|
93
|
+
multisigInit: z.optional(MultisigInit),
|
|
94
|
+
multisigSignatureCount: z.optional(z.number()),
|
|
82
95
|
nonce: z.optional(z_Hex.Hex),
|
|
83
96
|
nonceKey: z.optional(z_Hex.Hex),
|
|
84
97
|
r: z.optional(z_Hex.Hex),
|
|
@@ -114,21 +127,25 @@ export const Domain = z.object({
|
|
|
114
127
|
blobVersionedHashes: z.optional(z.readonly(z.array(z_Hex.Hex))),
|
|
115
128
|
blobs: z.optional(z.readonly(z.array(z_Hex.Hex))),
|
|
116
129
|
calls: z.optional(z.readonly(z.array(Call))),
|
|
130
|
+
capabilities: z.optional(Capabilities),
|
|
117
131
|
chainId: z.optional(z.number()),
|
|
118
132
|
data: z.optional(z_Hex.Hex),
|
|
119
133
|
feePayer: z.optional(z.boolean()),
|
|
120
134
|
feePayerSignature: z.optional(z.union([SignatureDecoded, z.null()])),
|
|
121
|
-
feeToken: z.optional(
|
|
135
|
+
feeToken: z.optional(z_Address.Address),
|
|
122
136
|
from: z.optional(z_Address.Address),
|
|
123
137
|
gas: z.optional(z.bigint()),
|
|
124
138
|
gasPrice: z.optional(z.bigint()),
|
|
125
139
|
input: z.optional(z_Hex.Hex),
|
|
126
140
|
keyAuthorization: z.optional(z_KeyAuthorization.Domain),
|
|
127
141
|
keyData: z.optional(z_Hex.Hex),
|
|
142
|
+
keyId: z.optional(z_Address.Address),
|
|
128
143
|
keyType: z.optional(KeyType),
|
|
129
144
|
maxFeePerBlobGas: z.optional(z.bigint()),
|
|
130
145
|
maxFeePerGas: z.optional(z.bigint()),
|
|
131
146
|
maxPriorityFeePerGas: z.optional(z.bigint()),
|
|
147
|
+
multisigInit: z.optional(MultisigInit),
|
|
148
|
+
multisigSignatureCount: z.optional(z.number()),
|
|
132
149
|
nonce: z.optional(z.bigint()),
|
|
133
150
|
nonceKey: z.optional(z.union([z.bigint(), z.literal('random')])),
|
|
134
151
|
r: z.optional(z_Hex.Hex),
|
|
@@ -150,21 +167,25 @@ export const DomainToRpc = z.object({
|
|
|
150
167
|
blobVersionedHashes: z.optional(z.readonly(z.array(z_Hex.Hex))),
|
|
151
168
|
blobs: z.optional(z.readonly(z.array(z_Hex.Hex))),
|
|
152
169
|
calls: z.optional(z.readonly(z.array(CallToRpc))),
|
|
170
|
+
capabilities: z.optional(Capabilities),
|
|
153
171
|
chainId: z.optional(uintNumberNumberish()),
|
|
154
172
|
data: z.optional(z_Hex.Hex),
|
|
155
173
|
feePayer: z.optional(z.boolean()),
|
|
156
174
|
feePayerSignature: z.optional(z.union([SignatureDecoded, z.null()])),
|
|
157
|
-
feeToken: z.optional(
|
|
175
|
+
feeToken: z.optional(z_Address.Address),
|
|
158
176
|
from: z.optional(z_Address.Address),
|
|
159
177
|
gas: z.optional(uintBigintNumberish()),
|
|
160
178
|
gasPrice: z.optional(uintBigintNumberish()),
|
|
161
179
|
input: z.optional(z_Hex.Hex),
|
|
162
180
|
keyAuthorization: z.optional(z_KeyAuthorization.DomainToRpc),
|
|
163
181
|
keyData: z.optional(z_Hex.Hex),
|
|
182
|
+
keyId: z.optional(z_Address.Address),
|
|
164
183
|
keyType: z.optional(KeyType),
|
|
165
184
|
maxFeePerBlobGas: z.optional(uintBigintNumberish()),
|
|
166
185
|
maxFeePerGas: z.optional(uintBigintNumberish()),
|
|
167
186
|
maxPriorityFeePerGas: z.optional(uintBigintNumberish()),
|
|
187
|
+
multisigInit: z.optional(MultisigInit),
|
|
188
|
+
multisigSignatureCount: z.optional(z.number()),
|
|
168
189
|
nonce: z.optional(uintBigintNumberish()),
|
|
169
190
|
nonceKey: z.optional(z.union([uintBigintNumberish(), z.literal('random')])),
|
|
170
191
|
r: z.optional(z_Hex.Hex),
|
|
@@ -232,6 +253,17 @@ function fromRpc(
|
|
|
232
253
|
z_KeyAuthorization.KeyAuthorization,
|
|
233
254
|
request.keyAuthorization as never,
|
|
234
255
|
) as never
|
|
256
|
+
if (typeof request.capabilities !== 'undefined')
|
|
257
|
+
request_.capabilities = request.capabilities
|
|
258
|
+
if (typeof request.feePayer !== 'undefined')
|
|
259
|
+
request_.feePayer = request.feePayer
|
|
260
|
+
if (typeof request.keyData !== 'undefined') request_.keyData = request.keyData
|
|
261
|
+
if (typeof request.keyId !== 'undefined') request_.keyId = request.keyId
|
|
262
|
+
if (typeof request.keyType !== 'undefined') request_.keyType = request.keyType
|
|
263
|
+
if (typeof request.multisigInit !== 'undefined')
|
|
264
|
+
request_.multisigInit = request.multisigInit
|
|
265
|
+
if (typeof request.multisigSignatureCount !== 'undefined')
|
|
266
|
+
request_.multisigSignatureCount = request.multisigSignatureCount
|
|
235
267
|
if (typeof request.validBefore !== 'undefined')
|
|
236
268
|
request_.validBefore = core_Hex.toNumber(request.validBefore)
|
|
237
269
|
if (typeof request.validAfter !== 'undefined')
|
|
@@ -251,6 +283,22 @@ function toRpc(
|
|
|
251
283
|
authorizationList: undefined,
|
|
252
284
|
} as never) as core_TransactionRequest.Rpc
|
|
253
285
|
|
|
286
|
+
const tempo =
|
|
287
|
+
typeof request.calls !== 'undefined' ||
|
|
288
|
+
typeof request.capabilities !== 'undefined' ||
|
|
289
|
+
typeof request.feePayer !== 'undefined' ||
|
|
290
|
+
typeof request.feeToken !== 'undefined' ||
|
|
291
|
+
typeof request.keyAuthorization !== 'undefined' ||
|
|
292
|
+
typeof request.keyData !== 'undefined' ||
|
|
293
|
+
typeof request.keyId !== 'undefined' ||
|
|
294
|
+
typeof request.keyType !== 'undefined' ||
|
|
295
|
+
typeof request.multisigInit !== 'undefined' ||
|
|
296
|
+
typeof request.multisigSignatureCount !== 'undefined' ||
|
|
297
|
+
typeof request.nonceKey !== 'undefined' ||
|
|
298
|
+
typeof request.validBefore !== 'undefined' ||
|
|
299
|
+
typeof request.validAfter !== 'undefined' ||
|
|
300
|
+
request.type === 'tempo'
|
|
301
|
+
|
|
254
302
|
if (request.authorizationList)
|
|
255
303
|
request_rpc.authorizationList = z.encode(
|
|
256
304
|
z_AuthorizationTempo.ListSignedToRpc,
|
|
@@ -269,24 +317,41 @@ function toRpc(
|
|
|
269
317
|
value: call.value ? encodeNumberish(call.value) : '0x',
|
|
270
318
|
data: call.data ?? '0x',
|
|
271
319
|
}))
|
|
272
|
-
else if (request.to || request.data || request.value)
|
|
320
|
+
else if (request.to || request.data || request.value || tempo)
|
|
273
321
|
request_rpc.calls = [
|
|
274
322
|
{
|
|
275
|
-
to:
|
|
323
|
+
to:
|
|
324
|
+
request.to ||
|
|
325
|
+
(tempo && (!request.data || request.data === '0x')
|
|
326
|
+
? '0x0000000000000000000000000000000000000000'
|
|
327
|
+
: undefined),
|
|
276
328
|
value: request.value ? encodeNumberish(request.value) : '0x',
|
|
277
329
|
data: request.data ?? '0x',
|
|
278
330
|
},
|
|
279
331
|
]
|
|
280
|
-
if (
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
332
|
+
if (
|
|
333
|
+
typeof request.feeToken !== 'undefined' &&
|
|
334
|
+
!(request.feePayer === true && !request.feePayerSignature)
|
|
335
|
+
)
|
|
336
|
+
request_rpc.feeToken = request.feeToken
|
|
285
337
|
if (request.keyAuthorization)
|
|
286
338
|
request_rpc.keyAuthorization = z.encode(
|
|
287
339
|
z_KeyAuthorization.KeyAuthorizationToRpc,
|
|
288
340
|
request.keyAuthorization as never,
|
|
289
341
|
) as never
|
|
342
|
+
if (typeof request.capabilities !== 'undefined')
|
|
343
|
+
request_rpc.capabilities = request.capabilities
|
|
344
|
+
if (typeof request.feePayer !== 'undefined')
|
|
345
|
+
request_rpc.feePayer = request.feePayer
|
|
346
|
+
if (typeof request.keyData !== 'undefined')
|
|
347
|
+
request_rpc.keyData = shimKeyData(request.keyData)
|
|
348
|
+
if (typeof request.keyId !== 'undefined') request_rpc.keyId = request.keyId
|
|
349
|
+
if (typeof request.keyType !== 'undefined')
|
|
350
|
+
request_rpc.keyType = request.keyType
|
|
351
|
+
if (typeof request.multisigInit !== 'undefined')
|
|
352
|
+
request_rpc.multisigInit = request.multisigInit
|
|
353
|
+
if (typeof request.multisigSignatureCount !== 'undefined')
|
|
354
|
+
request_rpc.multisigSignatureCount = request.multisigSignatureCount
|
|
290
355
|
if (typeof request.validBefore !== 'undefined')
|
|
291
356
|
request_rpc.validBefore = encodeNumberish(request.validBefore)
|
|
292
357
|
if (typeof request.validAfter !== 'undefined')
|
|
@@ -300,16 +365,7 @@ function toRpc(
|
|
|
300
365
|
})()
|
|
301
366
|
if (nonceKey) request_rpc.nonceKey = nonceKey
|
|
302
367
|
|
|
303
|
-
if (
|
|
304
|
-
typeof request.calls !== 'undefined' ||
|
|
305
|
-
typeof request.feePayer !== 'undefined' ||
|
|
306
|
-
typeof request.feeToken !== 'undefined' ||
|
|
307
|
-
typeof request.keyAuthorization !== 'undefined' ||
|
|
308
|
-
typeof request.nonceKey !== 'undefined' ||
|
|
309
|
-
typeof request.validBefore !== 'undefined' ||
|
|
310
|
-
typeof request.validAfter !== 'undefined' ||
|
|
311
|
-
request.type === 'tempo'
|
|
312
|
-
) {
|
|
368
|
+
if (tempo) {
|
|
313
369
|
request_rpc.type = toRpcType.tempo
|
|
314
370
|
delete request_rpc.data
|
|
315
371
|
delete request_rpc.input
|
|
@@ -320,6 +376,16 @@ function toRpc(
|
|
|
320
376
|
return request_rpc
|
|
321
377
|
}
|
|
322
378
|
|
|
379
|
+
/**
|
|
380
|
+
* Shims key data longer than 4 bytes into a 2-byte big-endian length hint
|
|
381
|
+
* (the node's gas estimator only accepts 1, 2, or 4-byte key data).
|
|
382
|
+
*/
|
|
383
|
+
function shimKeyData(data: core_Hex.Hex): core_Hex.Hex {
|
|
384
|
+
const byteLength = core_Hex.size(data)
|
|
385
|
+
if (byteLength <= 4) return data
|
|
386
|
+
return core_Hex.fromNumber(byteLength, { size: 2 })
|
|
387
|
+
}
|
|
388
|
+
|
|
323
389
|
/** Decodes an RPC signature into a recovered signature. */
|
|
324
390
|
function signatureFromRpc(signature: {
|
|
325
391
|
r: core_Hex.Hex
|
|
@@ -31,7 +31,7 @@ const baseFields = {
|
|
|
31
31
|
calls: z.readonly(z.array(Call)),
|
|
32
32
|
chainId: z.number(),
|
|
33
33
|
feePayerSignature: z.optional(z.union([FeePayerSignature, z.null()])),
|
|
34
|
-
feeToken: z.optional(
|
|
34
|
+
feeToken: z.optional(z_Address.Address),
|
|
35
35
|
from: z.optional(z_Address.Address),
|
|
36
36
|
gas: z.optional(z.bigint()),
|
|
37
37
|
keyAuthorization: z.optional(z_KeyAuthorization.Domain),
|
|
@@ -26,6 +26,59 @@ describe('KeyAuthorization', () => {
|
|
|
26
26
|
)
|
|
27
27
|
})
|
|
28
28
|
|
|
29
|
+
test('decodes node-null optional fields', () => {
|
|
30
|
+
const withNulls = {
|
|
31
|
+
...rpc,
|
|
32
|
+
allowedCalls: null,
|
|
33
|
+
expiry: null,
|
|
34
|
+
limits: null,
|
|
35
|
+
} as const
|
|
36
|
+
expect(z.decode(z_KeyAuthorization.KeyAuthorization, withNulls)).toEqual(
|
|
37
|
+
core_KeyAuthorization.fromRpc(withNulls),
|
|
38
|
+
)
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
test('decodes nested node-null optional fields', () => {
|
|
42
|
+
const withNestedNulls = {
|
|
43
|
+
...rpc,
|
|
44
|
+
allowedCalls: [
|
|
45
|
+
{
|
|
46
|
+
selectorRules: [{ recipients: null, selector: '0xa9059cbb' }],
|
|
47
|
+
target: '0x20c0000000000000000000000000000000000001',
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
selectorRules: null,
|
|
51
|
+
target: '0x20c0000000000000000000000000000000000002',
|
|
52
|
+
},
|
|
53
|
+
],
|
|
54
|
+
limits: [
|
|
55
|
+
{
|
|
56
|
+
limit: '0x989680',
|
|
57
|
+
period: null,
|
|
58
|
+
token: '0x20c0000000000000000000000000000000000001',
|
|
59
|
+
},
|
|
60
|
+
],
|
|
61
|
+
} as const
|
|
62
|
+
expect(
|
|
63
|
+
z.decode(z_KeyAuthorization.KeyAuthorization, withNestedNulls),
|
|
64
|
+
).toEqual(core_KeyAuthorization.fromRpc(withNestedNulls))
|
|
65
|
+
})
|
|
66
|
+
|
|
67
|
+
test('decodes witness and admin fields', () => {
|
|
68
|
+
const withAdmin = {
|
|
69
|
+
...rpc,
|
|
70
|
+
account: '0x814e5e0e31016b9a7f138c76b7e7b2bb5c1ab6a6',
|
|
71
|
+
isAdmin: true,
|
|
72
|
+
witness:
|
|
73
|
+
'0x0000000000000000000000000000000000000000000000000000000000000001',
|
|
74
|
+
} as const
|
|
75
|
+
const decoded = z.decode(z_KeyAuthorization.KeyAuthorization, withAdmin)
|
|
76
|
+
expect(decoded).toEqual(core_KeyAuthorization.fromRpc(withAdmin))
|
|
77
|
+
expect(z.encode(z_KeyAuthorization.KeyAuthorization, decoded)).toEqual(
|
|
78
|
+
core_KeyAuthorization.toRpc(decoded),
|
|
79
|
+
)
|
|
80
|
+
})
|
|
81
|
+
|
|
29
82
|
test('decodes nested allowedCalls into scopes', () => {
|
|
30
83
|
const withScopes = {
|
|
31
84
|
...rpc,
|
|
@@ -21,8 +21,6 @@ const p256 = {
|
|
|
21
21
|
|
|
22
22
|
const multisig = {
|
|
23
23
|
account: '0xbe95c3f554e9fc85ec51be69a3d807a0d55bcf2c',
|
|
24
|
-
configId:
|
|
25
|
-
'0x0000000000000000000000000000000000000000000000000000000000000000',
|
|
26
24
|
signatures: [
|
|
27
25
|
core_SignatureEnvelope.serialize(core_SignatureEnvelope.fromRpc(secp256k1)),
|
|
28
26
|
],
|
|
@@ -35,6 +35,48 @@ const rpc = {
|
|
|
35
35
|
type: '0x76',
|
|
36
36
|
} as const
|
|
37
37
|
|
|
38
|
+
/** Mined shape as serialized by the tempo node (absent optionals are `null`). */
|
|
39
|
+
const nodeRpc = {
|
|
40
|
+
accessList: [],
|
|
41
|
+
aaAuthorizationList: [],
|
|
42
|
+
blockHash:
|
|
43
|
+
'0xa27e7b87e6f558014cb357e8361579de7f8bff8c2f39beb47e5cc75cd7bbba40',
|
|
44
|
+
blockNumber: '0x5a',
|
|
45
|
+
blockTimestamp: '0x6a4d7ca5',
|
|
46
|
+
calls: [
|
|
47
|
+
{
|
|
48
|
+
data: null,
|
|
49
|
+
input:
|
|
50
|
+
'0x5c559d2000000000000000000000000000000000000000000000000000000000abf52baf',
|
|
51
|
+
to: '0xfdc0000000000000000000000000000000000000',
|
|
52
|
+
value: '0x0',
|
|
53
|
+
},
|
|
54
|
+
],
|
|
55
|
+
chainId: '0x539',
|
|
56
|
+
feePayerSignature: null,
|
|
57
|
+
feeToken: '0x20c0000000000000000000000000000000000000',
|
|
58
|
+
from: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',
|
|
59
|
+
gas: '0x81fb2',
|
|
60
|
+
gasPrice: '0x23c34600',
|
|
61
|
+
hash: '0x76e9adc3b5f6262159d49582a64b8696ecf5864ac5237f72b5c0797ca380e9d4',
|
|
62
|
+
keyAuthorization: null,
|
|
63
|
+
maxFeePerGas: '0x2aea5400',
|
|
64
|
+
maxPriorityFeePerGas: '0x0',
|
|
65
|
+
nonce: '0x0',
|
|
66
|
+
nonceKey: '0x0',
|
|
67
|
+
signature: {
|
|
68
|
+
r: '0xc5363149ebd9b247cd6948469677efbed1c58be3a79ec020ff767e41196b464',
|
|
69
|
+
s: '0x701c441f1ce3ca8dd0bff969924db2c8817a7dec1ade02c39c79bd57c8d0089d',
|
|
70
|
+
type: 'secp256k1',
|
|
71
|
+
v: '0x0',
|
|
72
|
+
yParity: '0x0',
|
|
73
|
+
},
|
|
74
|
+
transactionIndex: '0x0',
|
|
75
|
+
type: '0x76',
|
|
76
|
+
validAfter: null,
|
|
77
|
+
validBefore: null,
|
|
78
|
+
} as const
|
|
79
|
+
|
|
38
80
|
describe('Tempo', () => {
|
|
39
81
|
test('decodes a tempo transaction', () => {
|
|
40
82
|
const decoded = z.decode(z_Transaction.Tempo, rpc)
|
|
@@ -71,6 +113,119 @@ describe('Tempo', () => {
|
|
|
71
113
|
type: '0x76',
|
|
72
114
|
})
|
|
73
115
|
})
|
|
116
|
+
|
|
117
|
+
test('decodes a node transaction (null optionals)', () => {
|
|
118
|
+
const decoded = z.decode(z_Transaction.Tempo, nodeRpc)
|
|
119
|
+
expect(decoded).toMatchInlineSnapshot(`
|
|
120
|
+
{
|
|
121
|
+
"accessList": [],
|
|
122
|
+
"blockHash": "0xa27e7b87e6f558014cb357e8361579de7f8bff8c2f39beb47e5cc75cd7bbba40",
|
|
123
|
+
"blockNumber": 90n,
|
|
124
|
+
"blockTimestamp": 1783463077n,
|
|
125
|
+
"calls": [
|
|
126
|
+
{
|
|
127
|
+
"data": "0x5c559d2000000000000000000000000000000000000000000000000000000000abf52baf",
|
|
128
|
+
"to": "0xfdc0000000000000000000000000000000000000",
|
|
129
|
+
"value": 0n,
|
|
130
|
+
},
|
|
131
|
+
],
|
|
132
|
+
"chainId": 1337,
|
|
133
|
+
"feeToken": "0x20c0000000000000000000000000000000000000",
|
|
134
|
+
"from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266",
|
|
135
|
+
"gas": 532402n,
|
|
136
|
+
"gasPrice": 600000000n,
|
|
137
|
+
"hash": "0x76e9adc3b5f6262159d49582a64b8696ecf5864ac5237f72b5c0797ca380e9d4",
|
|
138
|
+
"maxFeePerGas": 720000000n,
|
|
139
|
+
"maxPriorityFeePerGas": 0n,
|
|
140
|
+
"nonce": 0n,
|
|
141
|
+
"nonceKey": 0n,
|
|
142
|
+
"signature": {
|
|
143
|
+
"signature": {
|
|
144
|
+
"r": "0x0c5363149ebd9b247cd6948469677efbed1c58be3a79ec020ff767e41196b464",
|
|
145
|
+
"s": "0x701c441f1ce3ca8dd0bff969924db2c8817a7dec1ade02c39c79bd57c8d0089d",
|
|
146
|
+
"yParity": 0,
|
|
147
|
+
},
|
|
148
|
+
"type": "secp256k1",
|
|
149
|
+
},
|
|
150
|
+
"transactionIndex": 0,
|
|
151
|
+
"type": "tempo",
|
|
152
|
+
}
|
|
153
|
+
`)
|
|
154
|
+
})
|
|
155
|
+
|
|
156
|
+
test('maps `aaAuthorizationList` to `authorizationList`', () => {
|
|
157
|
+
const decoded = z.decode(z_Transaction.Tempo, {
|
|
158
|
+
...nodeRpc,
|
|
159
|
+
aaAuthorizationList: [
|
|
160
|
+
{
|
|
161
|
+
address: '0xfdc0000000000000000000000000000000000000',
|
|
162
|
+
chainId: '0x539',
|
|
163
|
+
nonce: '0x1',
|
|
164
|
+
signature: {
|
|
165
|
+
r: '0xc5363149ebd9b247cd6948469677efbed1c58be3a79ec020ff767e41196b464',
|
|
166
|
+
s: '0x701c441f1ce3ca8dd0bff969924db2c8817a7dec1ade02c39c79bd57c8d0089d',
|
|
167
|
+
type: 'secp256k1',
|
|
168
|
+
yParity: '0x0',
|
|
169
|
+
},
|
|
170
|
+
},
|
|
171
|
+
],
|
|
172
|
+
})
|
|
173
|
+
expect(decoded.type === 'tempo' && decoded.authorizationList)
|
|
174
|
+
.toMatchInlineSnapshot(`
|
|
175
|
+
[
|
|
176
|
+
{
|
|
177
|
+
"address": "0xfdc0000000000000000000000000000000000000",
|
|
178
|
+
"chainId": 1337,
|
|
179
|
+
"nonce": 1n,
|
|
180
|
+
"signature": {
|
|
181
|
+
"signature": {
|
|
182
|
+
"r": "0x0c5363149ebd9b247cd6948469677efbed1c58be3a79ec020ff767e41196b464",
|
|
183
|
+
"s": "0x701c441f1ce3ca8dd0bff969924db2c8817a7dec1ade02c39c79bd57c8d0089d",
|
|
184
|
+
"yParity": 0,
|
|
185
|
+
},
|
|
186
|
+
"type": "secp256k1",
|
|
187
|
+
},
|
|
188
|
+
},
|
|
189
|
+
]
|
|
190
|
+
`)
|
|
191
|
+
|
|
192
|
+
const encoded = z.encode(z_Transaction.Tempo, decoded)
|
|
193
|
+
expect(
|
|
194
|
+
'aaAuthorizationList' in encoded && encoded.aaAuthorizationList,
|
|
195
|
+
).toHaveLength(1)
|
|
196
|
+
expect(encoded).not.toHaveProperty('authorizationList')
|
|
197
|
+
})
|
|
198
|
+
})
|
|
199
|
+
|
|
200
|
+
describe('PendingTempo', () => {
|
|
201
|
+
test('decodes a pending node transaction', () => {
|
|
202
|
+
const decoded = z.decode(z_Transaction.PendingTempo, {
|
|
203
|
+
...nodeRpc,
|
|
204
|
+
blockHash: null,
|
|
205
|
+
blockNumber: null,
|
|
206
|
+
blockTimestamp: undefined,
|
|
207
|
+
gasPrice: '0x2aea5400',
|
|
208
|
+
transactionIndex: null,
|
|
209
|
+
})
|
|
210
|
+
expect(decoded).toMatchObject({
|
|
211
|
+
blockHash: null,
|
|
212
|
+
blockNumber: null,
|
|
213
|
+
gasPrice: 720000000n,
|
|
214
|
+
transactionIndex: null,
|
|
215
|
+
type: 'tempo',
|
|
216
|
+
})
|
|
217
|
+
})
|
|
218
|
+
|
|
219
|
+
test('decodes via the `Pending` union', () => {
|
|
220
|
+
const decoded = z.decode(z_Transaction.Pending, {
|
|
221
|
+
...nodeRpc,
|
|
222
|
+
blockHash: null,
|
|
223
|
+
blockNumber: null,
|
|
224
|
+
blockTimestamp: undefined,
|
|
225
|
+
transactionIndex: null,
|
|
226
|
+
})
|
|
227
|
+
expect(decoded).toMatchObject({ type: 'tempo' })
|
|
228
|
+
})
|
|
74
229
|
})
|
|
75
230
|
|
|
76
231
|
describe('Transaction', () => {
|
|
@@ -44,6 +44,50 @@ describe('TransactionRequest', () => {
|
|
|
44
44
|
)
|
|
45
45
|
})
|
|
46
46
|
|
|
47
|
+
test('gas-model hints and capabilities round-trip', () => {
|
|
48
|
+
const hints = {
|
|
49
|
+
capabilities: { balanceDiffs: true },
|
|
50
|
+
keyData: '0x0578',
|
|
51
|
+
keyId: '0xcccccccccccccccccccccccccccccccccccccccc',
|
|
52
|
+
keyType: 'webAuthn',
|
|
53
|
+
multisigInit: {
|
|
54
|
+
salt: '0x0000000000000000000000000000000000000000000000000000000000000000',
|
|
55
|
+
threshold: 2,
|
|
56
|
+
owners: [
|
|
57
|
+
{
|
|
58
|
+
owner: '0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',
|
|
59
|
+
weight: 1,
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
owner: '0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb',
|
|
63
|
+
weight: 1,
|
|
64
|
+
},
|
|
65
|
+
],
|
|
66
|
+
},
|
|
67
|
+
multisigSignatureCount: 2,
|
|
68
|
+
} as const
|
|
69
|
+
|
|
70
|
+
const decoded = z.decode(z_TransactionRequest.TransactionRequest, {
|
|
71
|
+
...rpc,
|
|
72
|
+
...hints,
|
|
73
|
+
})
|
|
74
|
+
expect(decoded).toMatchObject(hints)
|
|
75
|
+
|
|
76
|
+
const encoded = z.encode(z_TransactionRequest.TransactionRequest, decoded)
|
|
77
|
+
expect(encoded).toMatchObject(hints)
|
|
78
|
+
expect(encoded).toEqual(core_TransactionRequest.toRpc(decoded))
|
|
79
|
+
})
|
|
80
|
+
|
|
81
|
+
test('feeToken is withheld until the fee payer signs (TIP-76)', () => {
|
|
82
|
+
const decoded = z.decode(z_TransactionRequest.TransactionRequest, rpc)
|
|
83
|
+
const pending = z.encode(z_TransactionRequest.TransactionRequest, {
|
|
84
|
+
...decoded,
|
|
85
|
+
feePayer: true,
|
|
86
|
+
})
|
|
87
|
+
expect(pending.feeToken).toBeUndefined()
|
|
88
|
+
expect(pending.feePayer).toBe(true)
|
|
89
|
+
})
|
|
90
|
+
|
|
47
91
|
test('rejects an invalid request', () => {
|
|
48
92
|
expect(
|
|
49
93
|
z.safeDecode(z_TransactionRequest.TransactionRequest, {
|