viem 2.22.17 → 2.22.19
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 +20 -0
- package/_cjs/actions/public/simulate.js +1 -1
- package/_cjs/actions/public/simulate.js.map +1 -1
- package/_cjs/chains/definitions/forta.js +25 -0
- package/_cjs/chains/definitions/forta.js.map +1 -0
- package/_cjs/chains/definitions/sidra.js +25 -0
- package/_cjs/chains/definitions/sidra.js.map +1 -0
- package/_cjs/chains/definitions/songbird.js +6 -0
- package/_cjs/chains/definitions/songbird.js.map +1 -1
- package/_cjs/chains/definitions/wmcTestnet.js +22 -0
- package/_cjs/chains/definitions/wmcTestnet.js.map +1 -0
- package/_cjs/chains/index.js +14 -8
- package/_cjs/chains/index.js.map +1 -1
- package/_cjs/errors/version.js +1 -1
- package/_cjs/experimental/erc7821/actions/execute.js +36 -26
- package/_cjs/experimental/erc7821/actions/execute.js.map +1 -1
- package/_cjs/experimental/erc7821/actions/executeBatches.js +80 -0
- package/_cjs/experimental/erc7821/actions/executeBatches.js.map +1 -0
- package/_cjs/experimental/erc7821/actions/supportsExecutionMode.js +11 -3
- package/_cjs/experimental/erc7821/actions/supportsExecutionMode.js.map +1 -1
- package/_cjs/experimental/erc7821/constants.js +1 -0
- package/_cjs/experimental/erc7821/constants.js.map +1 -1
- package/_cjs/experimental/erc7821/decorators/erc7821.js +2 -0
- package/_cjs/experimental/erc7821/decorators/erc7821.js.map +1 -1
- package/_cjs/experimental/erc7821/index.js +3 -1
- package/_cjs/experimental/erc7821/index.js.map +1 -1
- package/_esm/actions/public/simulate.js +1 -1
- package/_esm/actions/public/simulate.js.map +1 -1
- package/_esm/chains/definitions/forta.js +22 -0
- package/_esm/chains/definitions/forta.js.map +1 -0
- package/_esm/chains/definitions/sidra.js +22 -0
- package/_esm/chains/definitions/sidra.js.map +1 -0
- package/_esm/chains/definitions/songbird.js +6 -0
- package/_esm/chains/definitions/songbird.js.map +1 -1
- package/_esm/chains/definitions/wmcTestnet.js +19 -0
- package/_esm/chains/definitions/wmcTestnet.js.map +1 -0
- package/_esm/chains/index.js +3 -0
- package/_esm/chains/index.js.map +1 -1
- package/_esm/errors/version.js +1 -1
- package/_esm/experimental/erc7821/actions/execute.js +36 -26
- package/_esm/experimental/erc7821/actions/execute.js.map +1 -1
- package/_esm/experimental/erc7821/actions/executeBatches.js +168 -0
- package/_esm/experimental/erc7821/actions/executeBatches.js.map +1 -0
- package/_esm/experimental/erc7821/actions/supportsExecutionMode.js +11 -3
- package/_esm/experimental/erc7821/actions/supportsExecutionMode.js.map +1 -1
- package/_esm/experimental/erc7821/constants.js +1 -0
- package/_esm/experimental/erc7821/constants.js.map +1 -1
- package/_esm/experimental/erc7821/decorators/erc7821.js +2 -0
- package/_esm/experimental/erc7821/decorators/erc7821.js.map +1 -1
- package/_esm/experimental/erc7821/index.js +1 -1
- package/_esm/experimental/erc7821/index.js.map +1 -1
- package/_types/actions/public/simulate.d.ts.map +1 -1
- package/_types/chains/definitions/forta.d.ts +37 -0
- package/_types/chains/definitions/forta.d.ts.map +1 -0
- package/_types/chains/definitions/sidra.d.ts +37 -0
- package/_types/chains/definitions/sidra.d.ts.map +1 -0
- package/_types/chains/definitions/songbird.d.ts +6 -10
- package/_types/chains/definitions/songbird.d.ts.map +1 -1
- package/_types/chains/definitions/wmcTestnet.d.ts +37 -0
- package/_types/chains/definitions/wmcTestnet.d.ts.map +1 -0
- package/_types/chains/index.d.ts +3 -0
- package/_types/chains/index.d.ts.map +1 -1
- package/_types/errors/version.d.ts +1 -1
- package/_types/experimental/erc7821/actions/execute.d.ts +2 -0
- package/_types/experimental/erc7821/actions/execute.d.ts.map +1 -1
- package/_types/experimental/erc7821/actions/executeBatches.d.ts +124 -0
- package/_types/experimental/erc7821/actions/executeBatches.d.ts.map +1 -0
- package/_types/experimental/erc7821/actions/supportsExecutionMode.d.ts +1 -1
- package/_types/experimental/erc7821/actions/supportsExecutionMode.d.ts.map +1 -1
- package/_types/experimental/erc7821/constants.d.ts +1 -0
- package/_types/experimental/erc7821/constants.d.ts.map +1 -1
- package/_types/experimental/erc7821/decorators/erc7821.d.ts +93 -0
- package/_types/experimental/erc7821/decorators/erc7821.d.ts.map +1 -1
- package/_types/experimental/erc7821/index.d.ts +1 -1
- package/_types/experimental/erc7821/index.d.ts.map +1 -1
- package/_types/types/calls.d.ts +21 -0
- package/_types/types/calls.d.ts.map +1 -1
- package/actions/public/simulate.ts +8 -7
- package/chains/definitions/forta.ts +22 -0
- package/chains/definitions/sidra.ts +22 -0
- package/chains/definitions/songbird.ts +6 -0
- package/chains/definitions/wmcTestnet.ts +19 -0
- package/chains/index.ts +3 -0
- package/errors/version.ts +1 -1
- package/experimental/erc7821/actions/execute.ts +48 -36
- package/experimental/erc7821/actions/executeBatches.ts +254 -0
- package/experimental/erc7821/actions/supportsExecutionMode.ts +22 -9
- package/experimental/erc7821/constants.ts +2 -0
- package/experimental/erc7821/decorators/erc7821.ts +109 -0
- package/experimental/erc7821/index.ts +6 -1
- package/package.json +1 -1
- package/types/calls.ts +18 -0
@@ -3,6 +3,7 @@ import type { Transport } from '../../../clients/transports/createTransport.js';
|
|
3
3
|
import type { Account } from '../../../types/account.js';
|
4
4
|
import type { Chain } from '../../../types/chain.js';
|
5
5
|
import { type ExecuteParameters, type ExecuteReturnType } from '../actions/execute.js';
|
6
|
+
import { type Batch, type ExecuteBatchesParameters, type ExecuteBatchesReturnType } from '../actions/executeBatches.js';
|
6
7
|
import { type SupportsExecutionModeParameters, type SupportsExecutionModeReturnType } from '../actions/supportsExecutionMode.js';
|
7
8
|
export type Erc7821Actions<chain extends Chain | undefined = Chain | undefined, account extends Account | undefined = Account | undefined> = {
|
8
9
|
/**
|
@@ -74,6 +75,98 @@ export type Erc7821Actions<chain extends Chain | undefined = Chain | undefined,
|
|
74
75
|
* @returns Transaction hash. {@link ExecuteReturnType}
|
75
76
|
*/
|
76
77
|
execute: <const calls extends readonly unknown[], chainOverride extends Chain | undefined = undefined>(parameters: ExecuteParameters<calls, chain, account, chainOverride>) => Promise<ExecuteReturnType>;
|
78
|
+
/**
|
79
|
+
* Executes batches of call(s) using "batch of batches" mode on an [ERC-7821-compatible contract](https://eips.ethereum.org/EIPS/eip-7821).
|
80
|
+
*
|
81
|
+
* @example
|
82
|
+
* ```ts
|
83
|
+
* import { createClient, http, parseEther } from 'viem'
|
84
|
+
* import { privateKeyToAccount } from 'viem/accounts'
|
85
|
+
* import { mainnet } from 'viem/chains'
|
86
|
+
* import { erc7821Actions } from 'viem/experimental'
|
87
|
+
*
|
88
|
+
* const account = privateKeyToAccount('0x...')
|
89
|
+
*
|
90
|
+
* const client = createClient({
|
91
|
+
* chain: mainnet,
|
92
|
+
* transport: http(),
|
93
|
+
* }).extend(erc7821Actions())
|
94
|
+
*
|
95
|
+
* const hash = await client.executeBatches({
|
96
|
+
* account,
|
97
|
+
* batches: [
|
98
|
+
* {
|
99
|
+
* calls: [
|
100
|
+
* {
|
101
|
+
* to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
|
102
|
+
* value: parseEther('1'),
|
103
|
+
* },
|
104
|
+
* ],
|
105
|
+
* },
|
106
|
+
* {
|
107
|
+
* calls: [
|
108
|
+
* {
|
109
|
+
* to: '0xcb98643b8786950F0461f3B0edf99D88F274574D',
|
110
|
+
* value: parseEther('2'),
|
111
|
+
* },
|
112
|
+
* {
|
113
|
+
* data: '0xdeadbeef',
|
114
|
+
* to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
|
115
|
+
* },
|
116
|
+
* ],
|
117
|
+
* },
|
118
|
+
* ],
|
119
|
+
* to: account.address,
|
120
|
+
* })
|
121
|
+
* ```
|
122
|
+
*
|
123
|
+
* @example
|
124
|
+
* ```ts
|
125
|
+
* // Account Hoisting
|
126
|
+
* import { createClient, http, parseEther } from 'viem'
|
127
|
+
* import { privateKeyToAccount } from 'viem/accounts'
|
128
|
+
* import { mainnet } from 'viem/chains'
|
129
|
+
* import { erc7821Actions } from 'viem/experimental'
|
130
|
+
*
|
131
|
+
* const account = privateKeyToAccount('0x...')
|
132
|
+
*
|
133
|
+
* const client = createClient({
|
134
|
+
* chain: mainnet,
|
135
|
+
* transport: http(),
|
136
|
+
* }).extend(erc7821Actions())
|
137
|
+
*
|
138
|
+
* const hash = await client.executeBatches({
|
139
|
+
* batches: [
|
140
|
+
* {
|
141
|
+
* calls: [
|
142
|
+
* {
|
143
|
+
* to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
|
144
|
+
* value: parseEther('1'),
|
145
|
+
* },
|
146
|
+
* ],
|
147
|
+
* },
|
148
|
+
* {
|
149
|
+
* calls: [
|
150
|
+
* {
|
151
|
+
* to: '0xcb98643b8786950F0461f3B0edf99D88F274574D',
|
152
|
+
* value: parseEther('2'),
|
153
|
+
* },
|
154
|
+
* {
|
155
|
+
* data: '0xdeadbeef',
|
156
|
+
* to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
|
157
|
+
* },
|
158
|
+
* ],
|
159
|
+
* },
|
160
|
+
* ],
|
161
|
+
* to: account.address,
|
162
|
+
* })
|
163
|
+
* ```
|
164
|
+
*
|
165
|
+
* @param client - Client to use.
|
166
|
+
* @param parameters - {@link ExecuteBatchesParameters}
|
167
|
+
* @returns Transaction hash. {@link ExecuteBatchesReturnType}
|
168
|
+
*/
|
169
|
+
executeBatches: <const batches extends readonly Batch[], chainOverride extends Chain | undefined = undefined>(parameters: ExecuteBatchesParameters<batches, chain, account, chainOverride>) => Promise<ExecuteBatchesReturnType>;
|
77
170
|
/**
|
78
171
|
* Checks if the contract supports the ERC-7821 execution mode.
|
79
172
|
*
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"erc7821.d.ts","sourceRoot":"","sources":["../../../../experimental/erc7821/decorators/erc7821.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kCAAkC,CAAA;AAC9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gDAAgD,CAAA;AAC/E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAA;AACxD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAA;AACpD,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EAEvB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EACL,KAAK,+BAA+B,EACpC,KAAK,+BAA+B,EAErC,MAAM,qCAAqC,CAAA;AAE5C,MAAM,MAAM,cAAc,CACxB,KAAK,SAAS,KAAK,GAAG,SAAS,GAAG,KAAK,GAAG,SAAS,EACnD,OAAO,SAAS,OAAO,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,IACvD;IACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAmEG;IACH,OAAO,EAAE,CACP,KAAK,CAAC,KAAK,SAAS,SAAS,OAAO,EAAE,EACtC,aAAa,SAAS,KAAK,GAAG,SAAS,GAAG,SAAS,EAEnD,UAAU,EAAE,iBAAiB,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,aAAa,CAAC,KAChE,OAAO,CAAC,iBAAiB,CAAC,CAAA;IAC/B;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,qBAAqB,EAAE,CACrB,UAAU,EAAE,+BAA+B,KACxC,OAAO,CAAC,+BAA+B,CAAC,CAAA;CAC9C,CAAA;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,KAE1B,SAAS,SAAS,SAAS,EAC3B,KAAK,SAAS,KAAK,GAAG,SAAS,sBAC/B,OAAO,SAAS,OAAO,GAAG,SAAS,gCAE3B,MAAM,CAAC,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,KACxC,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,
|
1
|
+
{"version":3,"file":"erc7821.d.ts","sourceRoot":"","sources":["../../../../experimental/erc7821/decorators/erc7821.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kCAAkC,CAAA;AAC9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gDAAgD,CAAA;AAC/E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAA;AACxD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAA;AACpD,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EAEvB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EACL,KAAK,KAAK,EACV,KAAK,wBAAwB,EAC7B,KAAK,wBAAwB,EAE9B,MAAM,8BAA8B,CAAA;AACrC,OAAO,EACL,KAAK,+BAA+B,EACpC,KAAK,+BAA+B,EAErC,MAAM,qCAAqC,CAAA;AAE5C,MAAM,MAAM,cAAc,CACxB,KAAK,SAAS,KAAK,GAAG,SAAS,GAAG,KAAK,GAAG,SAAS,EACnD,OAAO,SAAS,OAAO,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,IACvD;IACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAmEG;IACH,OAAO,EAAE,CACP,KAAK,CAAC,KAAK,SAAS,SAAS,OAAO,EAAE,EACtC,aAAa,SAAS,KAAK,GAAG,SAAS,GAAG,SAAS,EAEnD,UAAU,EAAE,iBAAiB,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,aAAa,CAAC,KAChE,OAAO,CAAC,iBAAiB,CAAC,CAAA;IAC/B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA0FG;IACH,cAAc,EAAE,CACd,KAAK,CAAC,OAAO,SAAS,SAAS,KAAK,EAAE,EACtC,aAAa,SAAS,KAAK,GAAG,SAAS,GAAG,SAAS,EAEnD,UAAU,EAAE,wBAAwB,CAClC,OAAO,EACP,KAAK,EACL,OAAO,EACP,aAAa,CACd,KACE,OAAO,CAAC,wBAAwB,CAAC,CAAA;IACtC;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,qBAAqB,EAAE,CACrB,UAAU,EAAE,+BAA+B,KACxC,OAAO,CAAC,+BAA+B,CAAC,CAAA;CAC9C,CAAA;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,KAE1B,SAAS,SAAS,SAAS,EAC3B,KAAK,SAAS,KAAK,GAAG,SAAS,sBAC/B,OAAO,SAAS,OAAO,GAAG,SAAS,gCAE3B,MAAM,CAAC,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,KACxC,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,CAQlC"}
|
@@ -1,5 +1,5 @@
|
|
1
|
-
/** */
|
2
1
|
export { type ExecuteErrorType, type ExecuteParameters, type ExecuteReturnType, execute, } from './actions/execute.js';
|
2
|
+
export { type ExecuteBatchesErrorType, type ExecuteBatchesParameters, type ExecuteBatchesReturnType, executeBatches, } from './actions/executeBatches.js';
|
3
3
|
export { type SupportsExecutionModeErrorType, type SupportsExecutionModeParameters, type SupportsExecutionModeReturnType, supportsExecutionMode, } from './actions/supportsExecutionMode.js';
|
4
4
|
export { ExecuteUnsupportedError, type ExecuteUnsupportedErrorType, FunctionSelectorNotRecognizedError, type FunctionSelectorNotRecognizedErrorType, } from './errors.js';
|
5
5
|
export { type Erc7821Actions, erc7821Actions } from './decorators/erc7821.js';
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../experimental/erc7821/index.ts"],"names":[],"mappings":"
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../experimental/erc7821/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,OAAO,GACR,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EACL,KAAK,uBAAuB,EAC5B,KAAK,wBAAwB,EAC7B,KAAK,wBAAwB,EAC7B,cAAc,GACf,MAAM,6BAA6B,CAAA;AACpC,OAAO,EACL,KAAK,8BAA8B,EACnC,KAAK,+BAA+B,EACpC,KAAK,+BAA+B,EACpC,qBAAqB,GACtB,MAAM,oCAAoC,CAAA;AAE3C,OAAO,EACL,uBAAuB,EACvB,KAAK,2BAA2B,EAChC,kCAAkC,EAClC,KAAK,sCAAsC,GAC5C,MAAM,aAAa,CAAA;AAEpB,OAAO,EAAE,KAAK,cAAc,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA"}
|
package/_types/types/calls.d.ts
CHANGED
@@ -16,4 +16,25 @@ export type Calls<calls extends readonly unknown[], extraProperties extends Reco
|
|
16
16
|
...result,
|
17
17
|
Prettify<Call<call, extraProperties>>
|
18
18
|
]> : readonly unknown[] extends calls ? calls : calls extends readonly (infer call extends OneOf<Call>)[] ? readonly Prettify<call>[] : readonly OneOf<Call>[];
|
19
|
+
export type Batches<batches extends readonly {
|
20
|
+
calls: readonly unknown[];
|
21
|
+
}[], properties extends Record<string, any> = {}, result extends readonly any[] = []> = batches extends readonly [infer batch extends {
|
22
|
+
calls: readonly unknown[];
|
23
|
+
}] ? [...result, {
|
24
|
+
calls: Calls<batch['calls']>;
|
25
|
+
} & properties] : batches extends readonly [
|
26
|
+
infer batch extends {
|
27
|
+
calls: readonly unknown[];
|
28
|
+
},
|
29
|
+
...infer rest extends readonly {
|
30
|
+
calls: readonly unknown[];
|
31
|
+
}[]
|
32
|
+
] ? Batches<[
|
33
|
+
...rest
|
34
|
+
], properties, [
|
35
|
+
...result,
|
36
|
+
{
|
37
|
+
calls: Calls<batch['calls']>;
|
38
|
+
} & properties
|
39
|
+
]> : batches;
|
19
40
|
//# sourceMappingURL=calls.d.ts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"calls.d.ts","sourceRoot":"","sources":["../../types/calls.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAC1D,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,WAAW,CAAA;AACpC,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,gBAAgB,CAAA;AACpE,OAAO,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAEjD,MAAM,MAAM,IAAI,CACd,IAAI,GAAG,OAAO,EACd,eAAe,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,EAAE,IAClD,KAAK,CACL,CAAC,eAAe,GAAG;IACjB,IAAI,CAAC,EAAE,GAAG,GAAG,SAAS,CAAA;IACtB,EAAE,EAAE,OAAO,CAAA;IACX,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAC3B,CAAC,GACF,CAAC,eAAe,GACd,CAAC,IAAI,CACH,8BAA8B,CAAC,IAAI,EAAE,kBAAkB,CAAC,EACxD,SAAS,CACV,GAAG;IACF,EAAE,EAAE,OAAO,CAAA;IACX,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAC3B,CAAC,CAAC,CACR,CAAA;AAED,MAAM,MAAM,KAAK,CACf,KAAK,SAAS,SAAS,OAAO,EAAE,EAChC,eAAe,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,EAAE,EAEpD,MAAM,SAAS,SAAS,GAAG,EAAE,GAAG,EAAE,IAChC,KAAK,SAAS,SAAS,EAAE,GACzB,SAAS,EAAE,GACX,KAAK,SAAS,SAAS,CAAC,MAAM,IAAI,CAAC,GACjC,SAAS,CAAC,GAAG,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC,CAAC,GAC3D,KAAK,SAAS,SAAS,CAAC,MAAM,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,GAChD,KAAK,CACH;IAAC,GAAG,IAAI;CAAC,EACT,eAAe,EACf;IAAC,GAAG,MAAM;IAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;CAAC,CACnD,GACD,SAAS,OAAO,EAAE,SAAS,KAAK,GAC9B,KAAK,GAGL,KAAK,SAAS,SAAS,CAAC,MAAM,IAAI,SAAS,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,GACvD,SAAS,QAAQ,CAAC,IAAI,CAAC,EAAE,GAEzB,SAAS,KAAK,CAAC,IAAI,CAAC,EAAE,CAAA"}
|
1
|
+
{"version":3,"file":"calls.d.ts","sourceRoot":"","sources":["../../types/calls.ts"],"names":[],"mappings":"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"}
|
@@ -242,13 +242,14 @@ export async function simulate<
|
|
242
242
|
const logs = call.logs?.map((log) => formatLog(log))
|
243
243
|
const status = call.status === '0x1' ? 'success' : 'failure'
|
244
244
|
|
245
|
-
const result =
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
245
|
+
const result =
|
246
|
+
abi && status === 'success'
|
247
|
+
? decodeFunctionResult({
|
248
|
+
abi,
|
249
|
+
data,
|
250
|
+
functionName,
|
251
|
+
})
|
252
|
+
: null
|
252
253
|
|
253
254
|
const error = (() => {
|
254
255
|
if (status === 'success') return undefined
|
@@ -0,0 +1,22 @@
|
|
1
|
+
import { defineChain } from '../../utils/chain/defineChain.js'
|
2
|
+
|
3
|
+
export const forta = /*#__PURE__*/ defineChain({
|
4
|
+
id: 80_931,
|
5
|
+
name: 'Forta Chain',
|
6
|
+
nativeCurrency: {
|
7
|
+
symbol: 'FORT',
|
8
|
+
name: 'FORT',
|
9
|
+
decimals: 18,
|
10
|
+
},
|
11
|
+
rpcUrls: {
|
12
|
+
default: {
|
13
|
+
http: ['https://rpc-forta-chain-8gj1qndmfc.t.conduit.xyz'],
|
14
|
+
},
|
15
|
+
},
|
16
|
+
blockExplorers: {
|
17
|
+
default: {
|
18
|
+
name: 'Forta Explorer',
|
19
|
+
url: 'https://explorer.forta.org',
|
20
|
+
},
|
21
|
+
},
|
22
|
+
})
|
@@ -0,0 +1,22 @@
|
|
1
|
+
import { defineChain } from '../../utils/chain/defineChain.js'
|
2
|
+
|
3
|
+
export const sidraChain = /*#__PURE__*/ defineChain({
|
4
|
+
id: 97_453,
|
5
|
+
name: 'Sidra Chain',
|
6
|
+
nativeCurrency: {
|
7
|
+
decimals: 18,
|
8
|
+
name: 'Sidra Digital Asset',
|
9
|
+
symbol: 'SDA',
|
10
|
+
},
|
11
|
+
rpcUrls: {
|
12
|
+
default: {
|
13
|
+
http: ['https://node.sidrachain.com'],
|
14
|
+
},
|
15
|
+
},
|
16
|
+
blockExplorers: {
|
17
|
+
default: {
|
18
|
+
name: 'Sidra Chain Explorer',
|
19
|
+
url: 'https://ledger.sidrachain.com',
|
20
|
+
},
|
21
|
+
},
|
22
|
+
})
|
@@ -18,4 +18,10 @@ export const songbird = /*#__PURE__*/ defineChain({
|
|
18
18
|
apiUrl: 'https://songbird-explorer.flare.network/api',
|
19
19
|
},
|
20
20
|
},
|
21
|
+
contracts: {
|
22
|
+
multicall3: {
|
23
|
+
address: '0xcA11bde05977b3631167028862bE2a173976CA11',
|
24
|
+
blockCreated: 13382504,
|
25
|
+
},
|
26
|
+
},
|
21
27
|
})
|
@@ -0,0 +1,19 @@
|
|
1
|
+
import { defineChain } from '../../utils/chain/defineChain.js'
|
2
|
+
|
3
|
+
export const wmcTestnet = /*#__PURE__*/ defineChain({
|
4
|
+
id: 42070,
|
5
|
+
name: 'WMC Testnet',
|
6
|
+
nativeCurrency: { name: 'WMTx', symbol: 'WMTx', decimals: 18 },
|
7
|
+
rpcUrls: {
|
8
|
+
default: {
|
9
|
+
http: ['https://rpc-testnet-base.worldmobile.net'],
|
10
|
+
},
|
11
|
+
},
|
12
|
+
blockExplorers: {
|
13
|
+
default: {
|
14
|
+
name: 'WMC Explorer',
|
15
|
+
url: 'https://explorer2-base-testnet.worldmobile.net',
|
16
|
+
},
|
17
|
+
},
|
18
|
+
testnet: true,
|
19
|
+
})
|
package/chains/index.ts
CHANGED
@@ -171,6 +171,7 @@ export { fluence } from './definitions/fluence.js'
|
|
171
171
|
export { fluenceStage } from './definitions/fluenceStage.js'
|
172
172
|
export { fluenceTestnet } from './definitions/fluenceTestnet.js'
|
173
173
|
export { forma } from './definitions/forma.js'
|
174
|
+
export { forta } from './definitions/forta.js'
|
174
175
|
/** @deprecated Use `anvil` instead. */
|
175
176
|
export { foundry } from './definitions/foundry.js'
|
176
177
|
export { fraxtal } from './definitions/fraxtal.js'
|
@@ -401,6 +402,7 @@ export { shibariumTestnet } from './definitions/shibariumTestnet.js'
|
|
401
402
|
export { shiden } from './definitions/shiden.js'
|
402
403
|
export { shimmer } from './definitions/shimmer.js'
|
403
404
|
export { shimmerTestnet } from './definitions/shimmerTestnet.js'
|
405
|
+
export { sidraChain } from './definitions/sidra.js'
|
404
406
|
export { silicon } from './definitions/silicon.js'
|
405
407
|
export { siliconSepolia } from './definitions/siliconSepolia.js'
|
406
408
|
export { sixProtocol } from './definitions/sixProtocol.js'
|
@@ -490,6 +492,7 @@ export { wanchainTestnet } from './definitions/wanchainTestnet.js'
|
|
490
492
|
export { weaveVMAlphanet } from './definitions/weavevmAlphanet.js'
|
491
493
|
export { wemix } from './definitions/wemix.js'
|
492
494
|
export { wemixTestnet } from './definitions/wemixTestnet.js'
|
495
|
+
export { wmcTestnet } from './definitions/wmcTestnet.js'
|
493
496
|
export { worldchain } from './definitions/worldchain.js'
|
494
497
|
export { worldchainSepolia } from './definitions/worldchainSepolia.js'
|
495
498
|
export { worldLand } from './definitions/worldLand.js'
|
package/errors/version.ts
CHANGED
@@ -1 +1 @@
|
|
1
|
-
export const version = '2.22.
|
1
|
+
export const version = '2.22.19'
|
@@ -32,6 +32,7 @@ import {
|
|
32
32
|
getContractError,
|
33
33
|
} from '../../../utils/errors/getContractError.js'
|
34
34
|
import type { FormattedTransactionRequest } from '../../../utils/formatters/transactionRequest.js'
|
35
|
+
import { withCache } from '../../../utils/promise/withCache.js'
|
35
36
|
import { abi, executionMode } from '../constants.js'
|
36
37
|
import {
|
37
38
|
ExecuteUnsupportedError,
|
@@ -151,37 +152,28 @@ export async function execute<
|
|
151
152
|
client: Client<Transport, chain, account>,
|
152
153
|
parameters: ExecuteParameters<calls, chain, account, chainOverride>,
|
153
154
|
): Promise<ExecuteReturnType> {
|
154
|
-
const {
|
155
|
+
const { authorizationList, calls, opData } = parameters
|
155
156
|
|
156
|
-
const
|
157
|
-
|
158
|
-
return {
|
159
|
-
data: call.abi ? encodeFunctionData(call) : (call.data ?? '0x'),
|
160
|
-
value: call.value ?? 0n,
|
161
|
-
target: call.to,
|
162
|
-
}
|
163
|
-
})
|
157
|
+
const address = authorizationList?.[0]?.contractAddress ?? parameters.address
|
158
|
+
const encodedCalls = encodeCalls(calls, opData)
|
164
159
|
const mode = opData ? executionMode.opData : executionMode.default
|
165
160
|
|
166
|
-
const
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
161
|
+
const supported = await withCache(
|
162
|
+
() =>
|
163
|
+
supportsExecutionMode(client, {
|
164
|
+
address,
|
165
|
+
mode,
|
166
|
+
}),
|
167
|
+
{
|
168
|
+
cacheKey: `supportsExecutionMode.${client.uid}.${address}.${mode}`,
|
169
|
+
},
|
173
170
|
)
|
174
|
-
|
175
|
-
const supported = await supportsExecutionMode(client, {
|
176
|
-
address: authorizationList?.[0]?.contractAddress ?? address,
|
177
|
-
opData,
|
178
|
-
})
|
179
171
|
if (!supported) throw new ExecuteUnsupportedError()
|
180
172
|
|
181
173
|
try {
|
182
174
|
return await sendTransaction(client, {
|
183
175
|
...parameters,
|
184
|
-
to: address,
|
176
|
+
to: parameters.address,
|
185
177
|
data: encodeFunctionData({
|
186
178
|
abi,
|
187
179
|
functionName: 'execute',
|
@@ -200,29 +192,25 @@ export async function execute<
|
|
200
192
|
)
|
201
193
|
throw new FunctionSelectorNotRecognizedError()
|
202
194
|
|
203
|
-
|
204
|
-
|
205
|
-
|
195
|
+
let matched: Call | null = null
|
196
|
+
for (const c of parameters.calls) {
|
197
|
+
const call = c as Call
|
198
|
+
if (!call.abi) continue
|
206
199
|
try {
|
207
|
-
|
200
|
+
const matches = Boolean(
|
208
201
|
decodeErrorResult({
|
209
202
|
abi: call.abi,
|
210
203
|
data: error.data!,
|
211
204
|
}),
|
212
205
|
)
|
213
|
-
|
214
|
-
|
215
|
-
}
|
216
|
-
}
|
217
|
-
abi: Abi
|
218
|
-
functionName: string
|
219
|
-
args: unknown[]
|
220
|
-
to: Address
|
221
|
-
} | null
|
206
|
+
if (!matches) continue
|
207
|
+
matched = call
|
208
|
+
} catch {}
|
209
|
+
}
|
222
210
|
if (!matched) throw e
|
223
211
|
|
224
212
|
throw getContractError(error as BaseError, {
|
225
|
-
abi: matched.abi,
|
213
|
+
abi: matched.abi as Abi,
|
226
214
|
address: matched.to,
|
227
215
|
args: matched.args,
|
228
216
|
docsPath: '/experimental/erc7821/execute',
|
@@ -230,3 +218,27 @@ export async function execute<
|
|
230
218
|
})
|
231
219
|
}
|
232
220
|
}
|
221
|
+
|
222
|
+
/** @internal */
|
223
|
+
export function encodeCalls(
|
224
|
+
calls_: Calls<readonly unknown[]>,
|
225
|
+
opData?: Hex | undefined,
|
226
|
+
) {
|
227
|
+
const calls = calls_.map((call_) => {
|
228
|
+
const call = call_ as Call
|
229
|
+
return {
|
230
|
+
data: call.abi ? encodeFunctionData(call) : (call.data ?? '0x'),
|
231
|
+
value: call.value ?? 0n,
|
232
|
+
target: call.to,
|
233
|
+
}
|
234
|
+
})
|
235
|
+
|
236
|
+
return AbiParameters.encode(
|
237
|
+
AbiParameters.from([
|
238
|
+
'struct Call { address target; uint256 value; bytes data; }',
|
239
|
+
'Call[] calls',
|
240
|
+
...(opData ? ['bytes opData'] : []),
|
241
|
+
]),
|
242
|
+
[calls, ...(opData ? [opData] : [])] as any,
|
243
|
+
)
|
244
|
+
}
|
@@ -0,0 +1,254 @@
|
|
1
|
+
import type { Abi, Address, Narrow } from 'abitype'
|
2
|
+
import * as AbiError from 'ox/AbiError'
|
3
|
+
import * as AbiParameters from 'ox/AbiParameters'
|
4
|
+
|
5
|
+
import {
|
6
|
+
type SendTransactionErrorType,
|
7
|
+
sendTransaction,
|
8
|
+
} from '../../../actions/wallet/sendTransaction.js'
|
9
|
+
import type { Client } from '../../../clients/createClient.js'
|
10
|
+
import type { Transport } from '../../../clients/transports/createTransport.js'
|
11
|
+
import type { BaseError } from '../../../errors/base.js'
|
12
|
+
import type { ErrorType } from '../../../errors/utils.js'
|
13
|
+
import type { Account, GetAccountParameter } from '../../../types/account.js'
|
14
|
+
import type { Batches, Call } from '../../../types/calls.js'
|
15
|
+
import type {
|
16
|
+
Chain,
|
17
|
+
DeriveChain,
|
18
|
+
GetChainParameter,
|
19
|
+
} from '../../../types/chain.js'
|
20
|
+
import type { Hex } from '../../../types/misc.js'
|
21
|
+
import type { UnionEvaluate, UnionPick } from '../../../types/utils.js'
|
22
|
+
import {
|
23
|
+
type DecodeErrorResultErrorType,
|
24
|
+
decodeErrorResult,
|
25
|
+
} from '../../../utils/abi/decodeErrorResult.js'
|
26
|
+
import {
|
27
|
+
type EncodeFunctionDataErrorType,
|
28
|
+
encodeFunctionData,
|
29
|
+
} from '../../../utils/abi/encodeFunctionData.js'
|
30
|
+
import {
|
31
|
+
type GetContractErrorReturnType,
|
32
|
+
getContractError,
|
33
|
+
} from '../../../utils/errors/getContractError.js'
|
34
|
+
import type { FormattedTransactionRequest } from '../../../utils/formatters/transactionRequest.js'
|
35
|
+
import { withCache } from '../../../utils/promise/withCache.js'
|
36
|
+
import { abi, executionMode } from '../constants.js'
|
37
|
+
import {
|
38
|
+
ExecuteUnsupportedError,
|
39
|
+
FunctionSelectorNotRecognizedError,
|
40
|
+
} from '../errors.js'
|
41
|
+
import { encodeCalls } from './execute.js'
|
42
|
+
import { supportsExecutionMode } from './supportsExecutionMode.js'
|
43
|
+
|
44
|
+
/** @internal */
|
45
|
+
export type Batch = { calls: readonly unknown[]; opData?: Hex | undefined }
|
46
|
+
|
47
|
+
export type ExecuteBatchesParameters<
|
48
|
+
batches extends readonly Batch[] = readonly Batch[],
|
49
|
+
chain extends Chain | undefined = Chain | undefined,
|
50
|
+
account extends Account | undefined = Account | undefined,
|
51
|
+
chainOverride extends Chain | undefined = Chain | undefined,
|
52
|
+
_derivedChain extends Chain | undefined = DeriveChain<chain, chainOverride>,
|
53
|
+
> = UnionEvaluate<
|
54
|
+
UnionPick<
|
55
|
+
FormattedTransactionRequest<_derivedChain>,
|
56
|
+
| 'authorizationList'
|
57
|
+
| 'gas'
|
58
|
+
| 'gasPrice'
|
59
|
+
| 'maxFeePerGas'
|
60
|
+
| 'maxPriorityFeePerGas'
|
61
|
+
>
|
62
|
+
> &
|
63
|
+
GetAccountParameter<account, Account | Address, true, true> &
|
64
|
+
GetChainParameter<chain, chainOverride> & {
|
65
|
+
/** Address that will execute the calls. */
|
66
|
+
address: Address
|
67
|
+
/** Batches to execute. */
|
68
|
+
batches: Batches<Narrow<batches>, { opData?: Hex | undefined }>
|
69
|
+
/** Additional data to include for execution. */
|
70
|
+
opData?: Hex | undefined
|
71
|
+
}
|
72
|
+
|
73
|
+
export type ExecuteBatchesReturnType = Hex
|
74
|
+
|
75
|
+
export type ExecuteBatchesErrorType =
|
76
|
+
| DecodeErrorResultErrorType
|
77
|
+
| GetContractErrorReturnType
|
78
|
+
| EncodeFunctionDataErrorType
|
79
|
+
| SendTransactionErrorType
|
80
|
+
| ErrorType
|
81
|
+
|
82
|
+
/**
|
83
|
+
* Executes batches of call(s) using "batch of batches" mode on an [ERC-7821-compatible contract](https://eips.ethereum.org/EIPS/eip-7821).
|
84
|
+
*
|
85
|
+
* @example
|
86
|
+
* ```ts
|
87
|
+
* import { createClient, http, parseEther } from 'viem'
|
88
|
+
* import { privateKeyToAccount } from 'viem/accounts'
|
89
|
+
* import { mainnet } from 'viem/chains'
|
90
|
+
* import { executeBatches } from 'viem/experimental/erc7821'
|
91
|
+
*
|
92
|
+
* const account = privateKeyToAccount('0x...')
|
93
|
+
*
|
94
|
+
* const client = createClient({
|
95
|
+
* chain: mainnet,
|
96
|
+
* transport: http(),
|
97
|
+
* })
|
98
|
+
*
|
99
|
+
* const hash = await executeBatches(client, {
|
100
|
+
* account,
|
101
|
+
* batches: [
|
102
|
+
* {
|
103
|
+
* calls: [
|
104
|
+
* {
|
105
|
+
* to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
|
106
|
+
* value: parseEther('1'),
|
107
|
+
* },
|
108
|
+
* ],
|
109
|
+
* },
|
110
|
+
* {
|
111
|
+
* calls: [
|
112
|
+
* {
|
113
|
+
* to: '0xcb98643b8786950F0461f3B0edf99D88F274574D',
|
114
|
+
* value: parseEther('2'),
|
115
|
+
* },
|
116
|
+
* {
|
117
|
+
* data: '0xdeadbeef',
|
118
|
+
* to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
|
119
|
+
* },
|
120
|
+
* ],
|
121
|
+
* },
|
122
|
+
* ],
|
123
|
+
* to: account.address,
|
124
|
+
* })
|
125
|
+
* ```
|
126
|
+
*
|
127
|
+
* @example
|
128
|
+
* ```ts
|
129
|
+
* // Account Hoisting
|
130
|
+
* import { createClient, http, parseEther } from 'viem'
|
131
|
+
* import { privateKeyToAccount } from 'viem/accounts'
|
132
|
+
* import { mainnet } from 'viem/chains'
|
133
|
+
* import { executeBatches } from 'viem/experimental/erc7821'
|
134
|
+
*
|
135
|
+
* const account = privateKeyToAccount('0x...')
|
136
|
+
*
|
137
|
+
* const client = createClient({
|
138
|
+
* chain: mainnet,
|
139
|
+
* transport: http(),
|
140
|
+
* })
|
141
|
+
*
|
142
|
+
* const hash = await executeBatches(client, {
|
143
|
+
* batches: [
|
144
|
+
* {
|
145
|
+
* calls: [
|
146
|
+
* {
|
147
|
+
* to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
|
148
|
+
* value: parseEther('1'),
|
149
|
+
* },
|
150
|
+
* ],
|
151
|
+
* },
|
152
|
+
* {
|
153
|
+
* calls: [
|
154
|
+
* {
|
155
|
+
* to: '0xcb98643b8786950F0461f3B0edf99D88F274574D',
|
156
|
+
* value: parseEther('2'),
|
157
|
+
* },
|
158
|
+
* {
|
159
|
+
* data: '0xdeadbeef',
|
160
|
+
* to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
|
161
|
+
* },
|
162
|
+
* ],
|
163
|
+
* },
|
164
|
+
* ],
|
165
|
+
* to: account.address,
|
166
|
+
* })
|
167
|
+
* ```
|
168
|
+
*
|
169
|
+
* @param client - Client to use.
|
170
|
+
* @param parameters - {@link ExecuteBatchesParameters}
|
171
|
+
* @returns Transaction hash. {@link ExecuteBatchesReturnType}
|
172
|
+
*/
|
173
|
+
export async function executeBatches<
|
174
|
+
batches extends readonly Batch[],
|
175
|
+
chain extends Chain | undefined,
|
176
|
+
account extends Account | undefined,
|
177
|
+
chainOverride extends Chain | undefined = undefined,
|
178
|
+
>(
|
179
|
+
client: Client<Transport, chain, account>,
|
180
|
+
parameters: ExecuteBatchesParameters<batches, chain, account, chainOverride>,
|
181
|
+
): Promise<ExecuteBatchesReturnType> {
|
182
|
+
const { authorizationList, batches } = parameters
|
183
|
+
|
184
|
+
const address = authorizationList?.[0]?.contractAddress ?? parameters.address
|
185
|
+
const encodedBatches = AbiParameters.encode(AbiParameters.from('bytes[]'), [
|
186
|
+
batches.map((b) => {
|
187
|
+
const batch = b as Batch
|
188
|
+
return encodeCalls(batch.calls, batch.opData)
|
189
|
+
}),
|
190
|
+
])
|
191
|
+
|
192
|
+
const supported = await withCache(
|
193
|
+
() =>
|
194
|
+
supportsExecutionMode(client, {
|
195
|
+
address,
|
196
|
+
mode: 'batchOfBatches',
|
197
|
+
}),
|
198
|
+
{
|
199
|
+
cacheKey: `supportsExecutionMode.${client.uid}.${address}.batchOfBatches`,
|
200
|
+
},
|
201
|
+
)
|
202
|
+
if (!supported) throw new ExecuteUnsupportedError()
|
203
|
+
|
204
|
+
try {
|
205
|
+
return await sendTransaction(client, {
|
206
|
+
...parameters,
|
207
|
+
to: parameters.address,
|
208
|
+
data: encodeFunctionData({
|
209
|
+
abi,
|
210
|
+
functionName: 'execute',
|
211
|
+
args: [executionMode.batchOfBatches, encodedBatches],
|
212
|
+
}),
|
213
|
+
} as any)
|
214
|
+
} catch (e) {
|
215
|
+
const error = (e as BaseError).walk((e) => 'data' in (e as Error)) as
|
216
|
+
| (BaseError & { data?: Hex | undefined })
|
217
|
+
| undefined
|
218
|
+
|
219
|
+
if (!error?.data) throw e
|
220
|
+
if (
|
221
|
+
error.data ===
|
222
|
+
AbiError.getSelector(AbiError.from('error FnSelectorNotRecognized()'))
|
223
|
+
)
|
224
|
+
throw new FunctionSelectorNotRecognizedError()
|
225
|
+
|
226
|
+
let matched: Call | null = null
|
227
|
+
for (const b of parameters.batches) {
|
228
|
+
const batch = b as Batch
|
229
|
+
for (const c of batch.calls) {
|
230
|
+
const call = c as Call
|
231
|
+
if (!call.abi) continue
|
232
|
+
try {
|
233
|
+
const matches = Boolean(
|
234
|
+
decodeErrorResult({
|
235
|
+
abi: call.abi,
|
236
|
+
data: error.data!,
|
237
|
+
}),
|
238
|
+
)
|
239
|
+
if (!matches) continue
|
240
|
+
matched = call
|
241
|
+
} catch {}
|
242
|
+
}
|
243
|
+
}
|
244
|
+
if (!matched) throw e
|
245
|
+
|
246
|
+
throw getContractError(error as BaseError, {
|
247
|
+
abi: matched.abi as Abi,
|
248
|
+
address: matched.to,
|
249
|
+
args: matched.args,
|
250
|
+
docsPath: '/experimental/erc7821/executeBatches',
|
251
|
+
functionName: matched.functionName,
|
252
|
+
})
|
253
|
+
}
|
254
|
+
}
|