viem 2.22.5 → 2.22.7
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 +18 -0
- package/README.md +8 -2
- package/_cjs/chains/definitions/huddle01Mainnet.js +29 -0
- package/_cjs/chains/definitions/huddle01Mainnet.js.map +1 -0
- package/_cjs/chains/definitions/huddle01Testnet.js +29 -0
- package/_cjs/chains/definitions/huddle01Testnet.js.map +1 -0
- package/_cjs/chains/definitions/kroma.js +6 -0
- package/_cjs/chains/definitions/kroma.js.map +1 -1
- package/_cjs/chains/definitions/kromaSepolia.js +6 -0
- package/_cjs/chains/definitions/kromaSepolia.js.map +1 -1
- package/_cjs/chains/index.js +11 -7
- package/_cjs/chains/index.js.map +1 -1
- package/_cjs/errors/version.js +1 -1
- package/_cjs/experimental/eip7702/actions/prepareAuthorization.js +9 -8
- package/_cjs/experimental/eip7702/actions/prepareAuthorization.js.map +1 -1
- package/_cjs/zksync/actions/requestExecute.js +112 -0
- package/_cjs/zksync/actions/requestExecute.js.map +1 -0
- package/_cjs/zksync/constants/abis.js +3039 -1
- package/_cjs/zksync/constants/abis.js.map +1 -1
- package/_cjs/zksync/constants/number.js +2 -1
- package/_cjs/zksync/constants/number.js.map +1 -1
- package/_cjs/zksync/decorators/walletL1.js +10 -0
- package/_cjs/zksync/decorators/walletL1.js.map +1 -0
- package/_cjs/zksync/errors/bridge.js +24 -0
- package/_cjs/zksync/errors/bridge.js.map +1 -0
- package/_cjs/zksync/index.js +8 -1
- package/_cjs/zksync/index.js.map +1 -1
- package/_cjs/zksync/utils/bridge/getL2HashFromPriorityOp.js +28 -0
- package/_cjs/zksync/utils/bridge/getL2HashFromPriorityOp.js.map +1 -0
- package/_esm/chains/definitions/huddle01Mainnet.js +26 -0
- package/_esm/chains/definitions/huddle01Mainnet.js.map +1 -0
- package/_esm/chains/definitions/huddle01Testnet.js +26 -0
- package/_esm/chains/definitions/huddle01Testnet.js.map +1 -0
- package/_esm/chains/definitions/kroma.js +6 -0
- package/_esm/chains/definitions/kroma.js.map +1 -1
- package/_esm/chains/definitions/kromaSepolia.js +6 -0
- package/_esm/chains/definitions/kromaSepolia.js.map +1 -1
- package/_esm/chains/index.js +4 -1
- package/_esm/chains/index.js.map +1 -1
- package/_esm/errors/version.js +1 -1
- package/_esm/experimental/eip7702/actions/prepareAuthorization.js +9 -8
- package/_esm/experimental/eip7702/actions/prepareAuthorization.js.map +1 -1
- package/_esm/zksync/actions/requestExecute.js +167 -0
- package/_esm/zksync/actions/requestExecute.js.map +1 -0
- package/_esm/zksync/constants/abis.js +3038 -0
- package/_esm/zksync/constants/abis.js.map +1 -1
- package/_esm/zksync/constants/number.js +1 -0
- package/_esm/zksync/constants/number.js.map +1 -1
- package/_esm/zksync/decorators/walletL1.js +7 -0
- package/_esm/zksync/decorators/walletL1.js.map +1 -0
- package/_esm/zksync/errors/bridge.js +19 -0
- package/_esm/zksync/errors/bridge.js.map +1 -0
- package/_esm/zksync/index.js +3 -0
- package/_esm/zksync/index.js.map +1 -1
- package/_esm/zksync/utils/bridge/getL2HashFromPriorityOp.js +53 -0
- package/_esm/zksync/utils/bridge/getL2HashFromPriorityOp.js.map +1 -0
- package/_types/chains/definitions/huddle01Mainnet.d.ts +39 -0
- package/_types/chains/definitions/huddle01Mainnet.d.ts.map +1 -0
- package/_types/chains/definitions/huddle01Testnet.d.ts +39 -0
- package/_types/chains/definitions/huddle01Testnet.d.ts.map +1 -0
- package/_types/chains/definitions/kroma.d.ts +6 -10
- package/_types/chains/definitions/kroma.d.ts.map +1 -1
- package/_types/chains/definitions/kromaSepolia.d.ts +6 -10
- package/_types/chains/definitions/kromaSepolia.d.ts.map +1 -1
- package/_types/chains/index.d.ts +4 -1
- package/_types/chains/index.d.ts.map +1 -1
- package/_types/errors/version.d.ts +1 -1
- package/_types/experimental/eip7702/actions/prepareAuthorization.d.ts +5 -1
- package/_types/experimental/eip7702/actions/prepareAuthorization.d.ts.map +1 -1
- package/_types/zksync/actions/requestExecute.d.ts +95 -0
- package/_types/zksync/actions/requestExecute.d.ts.map +1 -0
- package/_types/zksync/constants/abis.d.ts +2356 -0
- package/_types/zksync/constants/abis.d.ts.map +1 -1
- package/_types/zksync/constants/number.d.ts +1 -0
- package/_types/zksync/constants/number.d.ts.map +1 -1
- package/_types/zksync/decorators/walletL1.d.ts +41 -0
- package/_types/zksync/decorators/walletL1.d.ts.map +1 -0
- package/_types/zksync/errors/bridge.d.ts +14 -0
- package/_types/zksync/errors/bridge.d.ts.map +1 -0
- package/_types/zksync/index.d.ts +3 -0
- package/_types/zksync/index.d.ts.map +1 -1
- package/_types/zksync/utils/bridge/getL2HashFromPriorityOp.d.ts +34 -0
- package/_types/zksync/utils/bridge/getL2HashFromPriorityOp.d.ts.map +1 -0
- package/chains/definitions/huddle01Mainnet.ts +27 -0
- package/chains/definitions/huddle01Testnet.ts +27 -0
- package/chains/definitions/kroma.ts +6 -0
- package/chains/definitions/kromaSepolia.ts +6 -0
- package/chains/index.ts +4 -1
- package/errors/version.ts +1 -1
- package/experimental/eip7702/actions/prepareAuthorization.ts +11 -7
- package/package.json +1 -1
- package/zksync/actions/requestExecute.ts +282 -0
- package/zksync/constants/abis.ts +3040 -0
- package/zksync/constants/number.ts +1 -0
- package/zksync/decorators/walletL1.ts +71 -0
- package/zksync/errors/bridge.ts +29 -0
- package/zksync/index.ts +15 -0
- package/zksync/utils/bridge/getL2HashFromPriorityOp.ts +63 -0
@@ -0,0 +1,167 @@
|
|
1
|
+
import { generatePrivateKey } from '../../accounts/generatePrivateKey.js';
|
2
|
+
import { privateKeyToAddress } from '../../accounts/utils/privateKeyToAddress.js';
|
3
|
+
import { readContract } from '../../actions/public/readContract.js';
|
4
|
+
import { sendTransaction, } from '../../actions/wallet/sendTransaction.js';
|
5
|
+
import { publicActions } from '../../clients/decorators/public.js';
|
6
|
+
import { AccountNotFoundError } from '../../errors/account.js';
|
7
|
+
import { ClientChainNotConfiguredError } from '../../errors/chain.js';
|
8
|
+
import { encodeFunctionData, isAddressEqual, parseAccount, } from '../../utils/index.js';
|
9
|
+
import { bridgehubAbi } from '../constants/abis.js';
|
10
|
+
import { ethAddressInContracts } from '../constants/address.js';
|
11
|
+
import { requiredL1ToL2GasPerPubdataLimit } from '../constants/number.js';
|
12
|
+
import { BaseFeeHigherThanValueError, } from '../errors/bridge.js';
|
13
|
+
import { estimateGasL1ToL2 } from './estimateGasL1ToL2.js';
|
14
|
+
import { getBridgehubContractAddress } from './getBridgehubContractAddress.js';
|
15
|
+
/**
|
16
|
+
* Requests execution of a L2 transaction from L1.
|
17
|
+
*
|
18
|
+
* @param client - Client to use
|
19
|
+
* @param parameters - {@link RequestExecuteParameters}
|
20
|
+
* @returns hash - The [Transaction](https://viem.sh/docs/glossary/terms#transaction) hash. {@link RequestExecuteReturnType}
|
21
|
+
*
|
22
|
+
* @example
|
23
|
+
* import { createPublicClient, http } from 'viem'
|
24
|
+
* import { privateKeyToAccount } from 'viem/accounts'
|
25
|
+
* import { zksync, mainnet } from 'viem/chains'
|
26
|
+
* import { requestExecute, publicActionsL2 } from 'viem/zksync'
|
27
|
+
*
|
28
|
+
* const client = createPublicClient({
|
29
|
+
* chain: mainnet,
|
30
|
+
* transport: http(),
|
31
|
+
* })
|
32
|
+
*
|
33
|
+
* const clientL2 = createPublicClient({
|
34
|
+
* chain: zksync,
|
35
|
+
* transport: http(),
|
36
|
+
* }).extend(publicActionsL2())
|
37
|
+
*
|
38
|
+
* const hash = await requestExecute(client, {
|
39
|
+
* client: clientL2,
|
40
|
+
* account: privateKeyToAccount('0x…'),
|
41
|
+
* contractAddress: '0x43020e6e11cef7dce8e37baa09d9a996ac722057'
|
42
|
+
* calldata: '0x',
|
43
|
+
* l2Value: 1_000_000_000_000_000_000n,
|
44
|
+
* })
|
45
|
+
*
|
46
|
+
* @example Account Hoisting
|
47
|
+
* import { createPublicClient, createWalletClient, http } from 'viem'
|
48
|
+
* import { privateKeyToAccount } from 'viem/accounts'
|
49
|
+
* import { zksync, mainnet } from 'viem/chains'
|
50
|
+
* import { requestExecute, publicActionsL2 } from 'viem/zksync'
|
51
|
+
*
|
52
|
+
* const client = createWalletClient({
|
53
|
+
* account: privateKeyToAccount('0x…'),
|
54
|
+
* chain: mainnet,
|
55
|
+
* transport: http(),
|
56
|
+
* })
|
57
|
+
*
|
58
|
+
* const clientL2 = createPublicClient({
|
59
|
+
* chain: zksync,
|
60
|
+
* transport: http(),
|
61
|
+
* }).extend(publicActionsL2())
|
62
|
+
*
|
63
|
+
* const hash = await requestExecute(client, {
|
64
|
+
* client: clientL2,
|
65
|
+
* contractAddress: '0x43020e6e11cef7dce8e37baa09d9a996ac722057'
|
66
|
+
* calldata: '0x',
|
67
|
+
* l2Value: 1_000_000_000_000_000_000n,
|
68
|
+
* })
|
69
|
+
*/
|
70
|
+
export async function requestExecute(client, parameters) {
|
71
|
+
let { account: account_ = client.account, chain: chain_ = client.chain, client: l2Client, contractAddress, calldata, l2Value = 0n, mintValue = 0n, operatorTip = 0n, factoryDeps = [], gasPerPubdataByte = requiredL1ToL2GasPerPubdataLimit, refundRecipient, l2GasLimit, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, ...rest } = parameters;
|
72
|
+
const account = account_ ? parseAccount(account_) : client.account;
|
73
|
+
if (!account)
|
74
|
+
throw new AccountNotFoundError({
|
75
|
+
docsPath: '/docs/actions/wallet/sendTransaction',
|
76
|
+
});
|
77
|
+
if (!l2Client.chain)
|
78
|
+
throw new ClientChainNotConfiguredError();
|
79
|
+
const bridgehub = await getBridgehubContractAddress(l2Client);
|
80
|
+
const baseToken = await readContract(client, {
|
81
|
+
address: bridgehub,
|
82
|
+
abi: bridgehubAbi,
|
83
|
+
functionName: 'baseToken',
|
84
|
+
args: [BigInt(l2Client.chain.id)],
|
85
|
+
});
|
86
|
+
const isETHBasedChain = isAddressEqual(baseToken, ethAddressInContracts);
|
87
|
+
refundRecipient ??= account.address;
|
88
|
+
l2GasLimit ??= await estimateGasL1ToL2(l2Client, {
|
89
|
+
chain: l2Client.chain,
|
90
|
+
// If the `from` address is not provided, we use a random address, because
|
91
|
+
// due to storage slot aggregation, the gas estimation will depend on the address
|
92
|
+
// and so estimation for the zero address may be smaller than for the sender.
|
93
|
+
account: l2Client.account ??
|
94
|
+
parseAccount(privateKeyToAddress(generatePrivateKey())),
|
95
|
+
data: calldata,
|
96
|
+
to: contractAddress,
|
97
|
+
value: l2Value,
|
98
|
+
gasPerPubdata: gasPerPubdataByte,
|
99
|
+
factoryDeps,
|
100
|
+
});
|
101
|
+
let gasPriceForEstimation = maxFeePerGas || gasPrice;
|
102
|
+
if (!gasPriceForEstimation) {
|
103
|
+
const estimatedFee = await getFeePrice(client);
|
104
|
+
gasPriceForEstimation = estimatedFee.maxFeePerGas;
|
105
|
+
maxFeePerGas = estimatedFee.maxFeePerGas;
|
106
|
+
maxPriorityFeePerGas ??= estimatedFee.maxPriorityFeePerGas;
|
107
|
+
}
|
108
|
+
const baseCost = await readContract(client, {
|
109
|
+
address: bridgehub,
|
110
|
+
abi: bridgehubAbi,
|
111
|
+
functionName: 'l2TransactionBaseCost',
|
112
|
+
args: [
|
113
|
+
BigInt(l2Client.chain.id),
|
114
|
+
gasPriceForEstimation,
|
115
|
+
l2GasLimit,
|
116
|
+
gasPerPubdataByte,
|
117
|
+
],
|
118
|
+
});
|
119
|
+
const l2Costs = baseCost + operatorTip + l2Value;
|
120
|
+
let providedValue = isETHBasedChain ? value : mintValue;
|
121
|
+
if (!providedValue || providedValue === 0n) {
|
122
|
+
providedValue = l2Costs;
|
123
|
+
}
|
124
|
+
if (baseCost > providedValue)
|
125
|
+
throw new BaseFeeHigherThanValueError(baseCost, providedValue);
|
126
|
+
const data = encodeFunctionData({
|
127
|
+
abi: bridgehubAbi,
|
128
|
+
functionName: 'requestL2TransactionDirect',
|
129
|
+
args: [
|
130
|
+
{
|
131
|
+
chainId: BigInt(l2Client.chain.id),
|
132
|
+
mintValue: providedValue,
|
133
|
+
l2Contract: contractAddress,
|
134
|
+
l2Value: l2Value,
|
135
|
+
l2Calldata: calldata,
|
136
|
+
l2GasLimit: l2GasLimit,
|
137
|
+
l2GasPerPubdataByteLimit: gasPerPubdataByte,
|
138
|
+
factoryDeps: factoryDeps,
|
139
|
+
refundRecipient: refundRecipient,
|
140
|
+
},
|
141
|
+
],
|
142
|
+
});
|
143
|
+
return await sendTransaction(client, {
|
144
|
+
chain: chain_,
|
145
|
+
account: account,
|
146
|
+
to: bridgehub,
|
147
|
+
value: isETHBasedChain ? providedValue : value,
|
148
|
+
data,
|
149
|
+
gasPrice,
|
150
|
+
maxFeePerGas,
|
151
|
+
maxPriorityFeePerGas,
|
152
|
+
...rest,
|
153
|
+
});
|
154
|
+
}
|
155
|
+
async function getFeePrice(client) {
|
156
|
+
const client_ = client.extend(publicActions);
|
157
|
+
const block = await client_.getBlock();
|
158
|
+
const baseFee = typeof block.baseFeePerGas !== 'bigint'
|
159
|
+
? await client_.getGasPrice()
|
160
|
+
: block.baseFeePerGas;
|
161
|
+
const maxPriorityFeePerGas = await client_.estimateMaxPriorityFeePerGas();
|
162
|
+
return {
|
163
|
+
maxFeePerGas: (baseFee * 3n) / 2n + maxPriorityFeePerGas,
|
164
|
+
maxPriorityFeePerGas: maxPriorityFeePerGas,
|
165
|
+
};
|
166
|
+
}
|
167
|
+
//# sourceMappingURL=requestExecute.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"requestExecute.js","sourceRoot":"","sources":["../../../zksync/actions/requestExecute.ts"],"names":[],"mappings":"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"}
|