FRE-600: Fix code review blockers

- Consolidated duplicate UndoManagers to single instance
- Fixed connection promise to only resolve on 'connected' status
- Fixed WebSocketProvider import (WebsocketProvider)
- Added proper doc.destroy() cleanup
- Renamed isPresenceInitialized property to avoid conflict

Co-Authored-By: Paperclip <noreply@paperclip.ing>
This commit is contained in:
2026-04-25 00:08:01 -04:00
parent 65b552bb08
commit 7c684a42cc
48450 changed files with 5679671 additions and 383 deletions

2168
node_modules/viem/_esm/op-stack/abis.js generated vendored Normal file

File diff suppressed because it is too large Load Diff

1
node_modules/viem/_esm/op-stack/abis.js.map generated vendored Normal file

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,54 @@
import { parseAccount, } from '../../accounts/utils/parseAccount.js';
import { prepareTransactionRequest, } from '../../actions/wallet/prepareTransactionRequest.js';
/**
* Prepares parameters for a [deposit transaction](https://github.com/ethereum-optimism/optimism/blob/develop/specs/deposits.md) to be initiated on an L1.
*
* - Docs: https://viem.sh/op-stack/actions/buildDepositTransaction
*
* @param client - Client to use
* @param parameters - {@link BuildDepositTransactionParameters}
* @returns Parameters for `depositTransaction`. {@link DepositTransactionReturnType}
*
* @example
* import { createWalletClient, http, parseEther } from 'viem'
* import { base } from 'viem/chains'
* import { publicActionsL2 } from 'viem/op-stack'
* import { buildDepositTransaction } from 'viem/wallet'
*
* const client = createWalletClient({
* chain: base,
* transport: http(),
* }).extend(publicActionsL2())
*
* const args = await buildDepositTransaction(client, {
* account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',
* to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
* value: parseEther('1'),
* })
*/
export async function buildDepositTransaction(client, args) {
const { account: account_, chain = client.chain, gas, data, isCreation, mint, to, value, } = args;
const account = account_ ? parseAccount(account_) : undefined;
const request = await prepareTransactionRequest(client, {
account: mint ? undefined : account,
chain,
gas,
data,
parameters: ['gas'],
to,
value,
});
return {
account,
request: {
data: request.data,
gas: request.gas,
mint,
isCreation,
to: request.to,
value: request.value,
},
targetChain: chain,
};
}
//# sourceMappingURL=buildDepositTransaction.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"buildDepositTransaction.js","sourceRoot":"","sources":["../../../op-stack/actions/buildDepositTransaction.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,YAAY,GACb,MAAM,sCAAsC,CAAA;AAC7C,OAAO,EAGL,yBAAyB,GAC1B,MAAM,mDAAmD,CAAA;AAuE1D;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAM3C,MAAyC,EACzC,IAKC;IAED,MAAM,EACJ,OAAO,EAAE,QAAQ,EACjB,KAAK,GAAG,MAAM,CAAC,KAAK,EACpB,GAAG,EACH,IAAI,EACJ,UAAU,EACV,IAAI,EACJ,EAAE,EACF,KAAK,GACN,GAAG,IAAI,CAAA;IAER,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IAE7D,MAAM,OAAO,GAAG,MAAM,yBAAyB,CAAC,MAAM,EAAE;QACtD,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO;QACnC,KAAK;QACL,GAAG;QACH,IAAI;QACJ,UAAU,EAAE,CAAC,KAAK,CAAC;QACnB,EAAE;QACF,KAAK;KACiC,CAAC,CAAA;IAEzC,OAAO;QACL,OAAO;QACP,OAAO,EAAE;YACP,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,IAAI;YACJ,UAAU;YACV,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,KAAK,EAAE,OAAO,CAAC,KAAK;SACrB;QACD,WAAW,EAAE,KAAK;KACuD,CAAA;AAC7E,CAAC"}

View File

@@ -0,0 +1,50 @@
import { parseAccount, } from '../../accounts/utils/parseAccount.js';
import { prepareTransactionRequest, } from '../../actions/wallet/prepareTransactionRequest.js';
/**
* Prepares parameters for a [withdrawal](https://community.optimism.io/docs/protocol/withdrawal-flow/#withdrawal-initiating-transaction) from an L2 to the L1.
*
* - Docs: https://viem.sh/op-stack/actions/buildInitiateWithdrawal
*
* @param client - Client to use
* @param parameters - {@link BuildInitiateWithdrawalParameters}
* @returns Parameters for `depositTransaction`. {@link DepositTransactionReturnType}
*
* @example
* import { createPublicClient, http, parseEther } from 'viem'
* import { mainnet } from 'viem/chains'
* import { buildInitiateWithdrawal } from 'viem/wallet'
*
* const client = createPublicClient({
* chain: mainnet,
* transport: http(),
* })
*
* const args = await buildInitiateWithdrawal(client, {
* account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',
* to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
* value: parseEther('1'),
* })
*/
export async function buildInitiateWithdrawal(client, args) {
const { account: account_, chain = client.chain, gas, data, to, value } = args;
const account = account_ ? parseAccount(account_) : undefined;
const request = await prepareTransactionRequest(client, {
account: null,
chain,
gas,
data,
parameters: ['gas'],
to,
value,
});
return {
account,
request: {
data: request.data,
gas: request.gas,
to: request.to,
value: request.value,
},
};
}
//# sourceMappingURL=buildInitiateWithdrawal.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"buildInitiateWithdrawal.js","sourceRoot":"","sources":["../../../op-stack/actions/buildInitiateWithdrawal.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,YAAY,GACb,MAAM,sCAAsC,CAAA;AAC7C,OAAO,EAGL,yBAAyB,GAC1B,MAAM,mDAAmD,CAAA;AA8C1D;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAM3C,MAAyC,EACzC,IAKC;IAED,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,GAAG,MAAM,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,IAAI,CAAA;IAE9E,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IAE7D,MAAM,OAAO,GAAG,MAAM,yBAAyB,CAAC,MAAM,EAAE;QACtD,OAAO,EAAE,IAAI;QACb,KAAK;QACL,GAAG;QACH,IAAI;QACJ,UAAU,EAAE,CAAC,KAAK,CAAC;QACnB,EAAE;QACF,KAAK;KACiC,CAAC,CAAA;IAEzC,OAAO;QACL,OAAO;QACP,OAAO,EAAE;YACP,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,KAAK,EAAE,OAAO,CAAC,KAAK;SACrB;KAC6D,CAAA;AAClE,CAAC"}

View File

@@ -0,0 +1,87 @@
import { getBlock, } from '../../actions/public/getBlock.js';
import { getProof, } from '../../actions/public/getProof.js';
import { fromRlp } from '../../utils/encoding/fromRlp.js';
import { toRlp } from '../../utils/encoding/toRlp.js';
import { keccak256 } from '../../utils/hash/keccak256.js';
import { contracts } from '../contracts.js';
import { getWithdrawalHashStorageSlot, } from '../utils/getWithdrawalHashStorageSlot.js';
const outputRootProofVersion = '0x0000000000000000000000000000000000000000000000000000000000000000';
/**
* Builds the transaction that proves a withdrawal was initiated on an L2. Used in the Withdrawal flow.
*
* - Docs: https://viem.sh/op-stack/actions/buildProveWithdrawal
*
* @param client - Client to use
* @param parameters - {@link BuildProveWithdrawalParameters}
* @returns The prove withdraw transaction request. {@link BuildProveWithdrawalReturnType}
*
* @example
* import { createPublicClient, http } from 'viem'
* import { optimism } from 'viem/chains'
* import { buildProveWithdrawal } from 'viem/op-stack'
*
* const publicClientL2 = createPublicClient({
* chain: optimism,
* transport: http(),
* })
*
* const args = await buildProveWithdrawal(publicClientL2, {
* output: { ... },
* withdrawal: { ... },
* })
*/
export async function buildProveWithdrawal(client, args) {
const { account, chain = client.chain, game, output, withdrawal } = args;
const { withdrawalHash } = withdrawal;
const { l2BlockNumber } = game ?? output;
const slot = getWithdrawalHashStorageSlot({ withdrawalHash });
const [proof, block] = await Promise.all([
getProof(client, {
address: contracts.l2ToL1MessagePasser.address,
storageKeys: [slot],
blockNumber: l2BlockNumber,
}),
getBlock(client, {
blockNumber: l2BlockNumber,
}),
]);
return {
account,
l2OutputIndex: game?.index ?? output?.outputIndex,
outputRootProof: {
latestBlockhash: block.hash,
messagePasserStorageRoot: proof.storageHash,
stateRoot: block.stateRoot,
version: outputRootProofVersion,
},
targetChain: chain,
withdrawalProof: maybeAddProofNode(keccak256(slot), proof.storageProof[0].proof),
withdrawal,
};
}
/** @internal */
export function maybeAddProofNode(key, proof) {
const lastProofRlp = proof[proof.length - 1];
const lastProof = fromRlp(lastProofRlp);
if (lastProof.length !== 17)
return proof;
const modifiedProof = [...proof];
for (const item of lastProof) {
// Find any nodes located inside of the branch node.
if (!Array.isArray(item))
continue;
// Check if the key inside the node matches the key we're looking for. We remove the first
// two characters (0x) and then we remove one more character (the first nibble) since this
// is the identifier for the type of node we're looking at. In this case we don't actually
// care what type of node it is because a branch node would only ever be the final proof
// element if (1) it includes the leaf node we're looking for or (2) it stores the value
// within itself. If (1) then this logic will work, if (2) then this won't find anything
// and we won't append any proof elements, which is exactly what we would want.
const suffix = item[0].slice(3);
if (typeof suffix !== 'string' || !key.endsWith(suffix))
continue;
modifiedProof.push(toRlp(item));
}
return modifiedProof;
}
//# sourceMappingURL=buildProveWithdrawal.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"buildProveWithdrawal.js","sourceRoot":"","sources":["../../../op-stack/actions/buildProveWithdrawal.ts"],"names":[],"mappings":"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"}

View File

@@ -0,0 +1,87 @@
import { writeContract, } from '../../actions/wallet/writeContract.js';
import { zeroAddress } from '../../constants/address.js';
import { portalAbi } from '../abis.js';
/**
* Initiates a [deposit transaction](https://github.com/ethereum-optimism/optimism/blob/develop/specs/deposits.md) on an L1, which executes a transaction on L2.
*
* Internally performs a contract write to the [`depositTransaction` function](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts-bedrock/src/L1/OptimismPortal.sol#L378)
* on the [Optimism Portal contract](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts-bedrock/src/L1/OptimismPortal.sol).
*
* - Docs: https://viem.sh/op-stack/actions/depositTransaction
*
* @param client - Client to use
* @param parameters - {@link DepositTransactionParameters}
* @returns The L1 transaction hash. {@link DepositTransactionReturnType}
*
* @example
* import { createWalletClient, custom, parseEther } from 'viem'
* import { base, mainnet } from 'viem/chains'
* import { depositTransaction } from 'viem/op-stack'
*
* const client = createWalletClient({
* chain: mainnet,
* transport: custom(window.ethereum),
* })
*
* const hash = await depositTransaction(client, {
* account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',
* request: {
* gas: 21_000n,
* to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
* value: parseEther('1'),
* },
* targetChain: base,
* })
*
* @example
* // Account Hoisting
* import { createWalletClient, http } from 'viem'
* import { privateKeyToAccount } from 'viem/accounts'
* import { base, mainnet } from 'viem/chains'
* import { depositTransaction } from 'viem/op-stack'
*
* const client = createWalletClient({
* account: privateKeyToAccount('0x…'),
* chain: mainnet,
* transport: http(),
* })
*
* const hash = await depositTransaction(client, {
* request: {
* gas: 21_000n,
* to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
* value: parseEther('1'),
* },
* targetChain: base,
* })
*/
export async function depositTransaction(client, parameters) {
const { account, chain = client.chain, gas, maxFeePerGas, maxPriorityFeePerGas, nonce, request: { data = '0x', gas: l2Gas, isCreation = false, mint, to = '0x', value, }, targetChain, } = parameters;
const portalAddress = (() => {
if (parameters.portalAddress)
return parameters.portalAddress;
if (chain)
return targetChain.contracts.portal[chain.id].address;
return Object.values(targetChain.contracts.portal)[0].address;
})();
return writeContract(client, {
account: account,
abi: portalAbi,
address: portalAddress,
chain,
functionName: 'depositTransaction',
args: [
isCreation ? zeroAddress : to,
value ?? mint ?? 0n,
l2Gas,
isCreation,
data,
],
maxFeePerGas,
maxPriorityFeePerGas,
nonce,
value: mint,
gas: gas ?? undefined,
});
}
//# sourceMappingURL=depositTransaction.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"depositTransaction.js","sourceRoot":"","sources":["../../../op-stack/actions/depositTransaction.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,aAAa,GACd,MAAM,uCAAuC,CAAA;AAG9C,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAA;AAWxD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAwCtC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqDG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAKtC,MAAyC,EACzC,UAAuE;IAEvE,MAAM,EACJ,OAAO,EACP,KAAK,GAAG,MAAM,CAAC,KAAK,EACpB,GAAG,EACH,YAAY,EACZ,oBAAoB,EACpB,KAAK,EACL,OAAO,EAAE,EACP,IAAI,GAAG,IAAI,EACX,GAAG,EAAE,KAAK,EACV,UAAU,GAAG,KAAK,EAClB,IAAI,EACJ,EAAE,GAAG,IAAI,EACT,KAAK,GACN,EACD,WAAW,GACZ,GAAG,UAAU,CAAA;IAEd,MAAM,aAAa,GAAG,CAAC,GAAG,EAAE;QAC1B,IAAI,UAAU,CAAC,aAAa;YAAE,OAAO,UAAU,CAAC,aAAa,CAAA;QAC7D,IAAI,KAAK;YAAE,OAAO,WAAY,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,OAAO,CAAA;QACjE,OAAO,MAAM,CAAC,MAAM,CAAC,WAAY,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAA;IAChE,CAAC,CAAC,EAAE,CAAA;IAEJ,OAAO,aAAa,CAAC,MAAM,EAAE;QAC3B,OAAO,EAAE,OAAQ;QACjB,GAAG,EAAE,SAAS;QACd,OAAO,EAAE,aAAa;QACtB,KAAK;QACL,YAAY,EAAE,oBAAoB;QAClC,IAAI,EAAE;YACJ,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE;YAC7B,KAAK,IAAI,IAAI,IAAI,EAAE;YACnB,KAAK;YACL,UAAU;YACV,IAAI;SACL;QACD,YAAY;QACZ,oBAAoB;QACpB,KAAK;QACL,KAAK,EAAE,IAAI;QACX,GAAG,EAAE,GAAG,IAAI,SAAS;KACmB,CAAC,CAAA;AAC7C,CAAC"}

View File

@@ -0,0 +1,55 @@
import { parseAccount, } from '../../accounts/utils/parseAccount.js';
import { encodeFunctionData, } from '../../utils/abi/encodeFunctionData.js';
import { getContractError, } from '../../utils/errors/getContractError.js';
import { estimateL1Fee, } from './estimateL1Fee.js';
/**
* Estimates the L1 data fee required to execute an L2 contract write.
*
* @param client - Client to use
* @param parameters - {@link EstimateContractL1FeeParameters}
* @returns The gas estimate (in wei). {@link EstimateContractL1FeeReturnType}
*
* @example
* import { createPublicClient, http, parseAbi } from 'viem'
* import { optimism } from 'viem/chains'
* import { estimateContractL1Fee } from 'viem/op-stack'
*
* const client = createPublicClient({
* chain: optimism,
* transport: http(),
* })
* const l1Fee = await estimateContractL1Fee(client, {
* address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',
* abi: parseAbi(['function mint() public']),
* functionName: 'mint',
* account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',
* })
*/
export async function estimateContractL1Fee(client, parameters) {
const { abi, address, args, functionName, ...request } = parameters;
const data = encodeFunctionData({
abi,
args,
functionName,
});
try {
const fee = await estimateL1Fee(client, {
data,
to: address,
...request,
});
return fee;
}
catch (error) {
const account = request.account ? parseAccount(request.account) : undefined;
throw getContractError(error, {
abi,
address,
args,
docsPath: '/docs/chains/op-stack/estimateContractL1Fee',
functionName,
sender: account?.address,
});
}
}
//# sourceMappingURL=estimateContractL1Fee.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"estimateContractL1Fee.js","sourceRoot":"","sources":["../../../op-stack/actions/estimateContractL1Fee.ts"],"names":[],"mappings":"AAGA,OAAO,EAEL,YAAY,GACb,MAAM,sCAAsC,CAAA;AAY7C,OAAO,EAGL,kBAAkB,GACnB,MAAM,uCAAuC,CAAA;AAC9C,OAAO,EAEL,gBAAgB,GACjB,MAAM,wCAAwC,CAAA;AAC/C,OAAO,EAGL,aAAa,GACd,MAAM,oBAAoB,CAAA;AA4C3B;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAQzC,MAAyC,EACzC,UAOC;IAED,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,OAAO,EAAE,GACpD,UAA6C,CAAA;IAC/C,MAAM,IAAI,GAAG,kBAAkB,CAAC;QAC9B,GAAG;QACH,IAAI;QACJ,YAAY;KACmB,CAAC,CAAA;IAClC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,MAAM,EAAE;YACtC,IAAI;YACJ,EAAE,EAAE,OAAO;YACX,GAAG,OAAO;SAC2B,CAAC,CAAA;QACxC,OAAO,GAAG,CAAA;IACZ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;QAC3E,MAAM,gBAAgB,CAAC,KAAkB,EAAE;YACzC,GAAG;YACH,OAAO;YACP,IAAI;YACJ,QAAQ,EAAE,6CAA6C;YACvD,YAAY;YACZ,MAAM,EAAE,OAAO,EAAE,OAAO;SACzB,CAAC,CAAA;IACJ,CAAC;AACH,CAAC"}

View File

@@ -0,0 +1,55 @@
import { parseAccount, } from '../../accounts/utils/parseAccount.js';
import { encodeFunctionData, } from '../../utils/abi/encodeFunctionData.js';
import { getContractError, } from '../../utils/errors/getContractError.js';
import { estimateL1Gas, } from './estimateL1Gas.js';
/**
* Estimates the L1 data gas required to successfully execute a contract write function call.
*
* @param client - Client to use
* @param parameters - {@link EstimateContractL1GasParameters}
* @returns The gas estimate (in wei). {@link EstimateContractL1GasReturnType}
*
* @example
* import { createPublicClient, http, parseAbi } from 'viem'
* import { optimism } from 'viem/chains'
* import { estimateContractL1Gas } from 'viem/op-stack'
*
* const client = createPublicClient({
* chain: optimism,
* transport: http(),
* })
* const l1Gas = await estimateContractL1Gas(client, {
* address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',
* abi: parseAbi(['function mint() public']),
* functionName: 'mint',
* account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',
* })
*/
export async function estimateContractL1Gas(client, parameters) {
const { abi, address, args, functionName, ...request } = parameters;
const data = encodeFunctionData({
abi,
args,
functionName,
});
try {
const gas = await estimateL1Gas(client, {
data,
to: address,
...request,
});
return gas;
}
catch (error) {
const account = request.account ? parseAccount(request.account) : undefined;
throw getContractError(error, {
abi,
address,
args,
docsPath: '/docs/chains/op-stack/estimateContractL1Gas',
functionName,
sender: account?.address,
});
}
}
//# sourceMappingURL=estimateContractL1Gas.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"estimateContractL1Gas.js","sourceRoot":"","sources":["../../../op-stack/actions/estimateContractL1Gas.ts"],"names":[],"mappings":"AAGA,OAAO,EAEL,YAAY,GACb,MAAM,sCAAsC,CAAA;AAY7C,OAAO,EAGL,kBAAkB,GACnB,MAAM,uCAAuC,CAAA;AAC9C,OAAO,EAEL,gBAAgB,GACjB,MAAM,wCAAwC,CAAA;AAC/C,OAAO,EAGL,aAAa,GACd,MAAM,oBAAoB,CAAA;AA4C3B;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAQzC,MAAyC,EACzC,UAOC;IAED,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,OAAO,EAAE,GACpD,UAA6C,CAAA;IAC/C,MAAM,IAAI,GAAG,kBAAkB,CAAC;QAC9B,GAAG;QACH,IAAI;QACJ,YAAY;KACmB,CAAC,CAAA;IAClC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,MAAM,EAAE;YACtC,IAAI;YACJ,EAAE,EAAE,OAAO;YACX,GAAG,OAAO;SAC2B,CAAC,CAAA;QACxC,OAAO,GAAG,CAAA;IACZ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;QAC3E,MAAM,gBAAgB,CAAC,KAAkB,EAAE;YACzC,GAAG;YACH,OAAO;YACP,IAAI;YACJ,QAAQ,EAAE,6CAA6C;YACvD,YAAY;YACZ,MAAM,EAAE,OAAO,EAAE,OAAO;SACzB,CAAC,CAAA;IACJ,CAAC;AACH,CAAC"}

View File

@@ -0,0 +1,55 @@
import { parseAccount, } from '../../accounts/utils/parseAccount.js';
import { encodeFunctionData, } from '../../utils/abi/encodeFunctionData.js';
import { getContractError, } from '../../utils/errors/getContractError.js';
import { estimateTotalFee, } from './estimateTotalFee.js';
/**
* Estimates the L1 data fee + L2 fee to execute an L2 contract write.
*
* @param client - Client to use
* @param parameters - {@link EstimateContractTotalFeeParameters}
* @returns The gas estimate (in wei). {@link EstimateContractTotalFeeReturnType}
*
* @example
* import { createPublicClient, http, parseAbi } from 'viem'
* import { optimism } from 'viem/chains'
* import { estimateContractTotalFee } from 'viem/op-stack'
*
* const client = createPublicClient({
* chain: optimism,
* transport: http(),
* })
* const totalFee = await estimateContractTotalFee(client, {
* address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',
* abi: parseAbi(['function mint() public']),
* functionName: 'mint',
* account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',
* })
*/
export async function estimateContractTotalFee(client, parameters) {
const { abi, address, args, functionName, ...request } = parameters;
const data = encodeFunctionData({
abi,
args,
functionName,
});
try {
const fee = await estimateTotalFee(client, {
data,
to: address,
...request,
});
return fee;
}
catch (error) {
const account = request.account ? parseAccount(request.account) : undefined;
throw getContractError(error, {
abi,
address,
args,
docsPath: '/docs/chains/op-stack/estimateTotalFee',
functionName,
sender: account?.address,
});
}
}
//# sourceMappingURL=estimateContractTotalFee.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"estimateContractTotalFee.js","sourceRoot":"","sources":["../../../op-stack/actions/estimateContractTotalFee.ts"],"names":[],"mappings":"AAGA,OAAO,EAEL,YAAY,GACb,MAAM,sCAAsC,CAAA;AAY7C,OAAO,EAGL,kBAAkB,GACnB,MAAM,uCAAuC,CAAA;AAC9C,OAAO,EAEL,gBAAgB,GACjB,MAAM,wCAAwC,CAAA;AAC/C,OAAO,EAGL,gBAAgB,GACjB,MAAM,uBAAuB,CAAA;AA8C9B;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAQ5C,MAAyC,EACzC,UAOC;IAED,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,OAAO,EAAE,GACpD,UAAgD,CAAA;IAClD,MAAM,IAAI,GAAG,kBAAkB,CAAC;QAC9B,GAAG;QACH,IAAI;QACJ,YAAY;KACmB,CAAC,CAAA;IAClC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,gBAAgB,CAAC,MAAM,EAAE;YACzC,IAAI;YACJ,EAAE,EAAE,OAAO;YACX,GAAG,OAAO;SAC8B,CAAC,CAAA;QAC3C,OAAO,GAAG,CAAA;IACZ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;QAC3E,MAAM,gBAAgB,CAAC,KAAkB,EAAE;YACzC,GAAG;YACH,OAAO;YACP,IAAI;YACJ,QAAQ,EAAE,wCAAwC;YAClD,YAAY;YACZ,MAAM,EAAE,OAAO,EAAE,OAAO;SACzB,CAAC,CAAA;IACJ,CAAC;AACH,CAAC"}

View File

@@ -0,0 +1,55 @@
import { parseAccount, } from '../../accounts/utils/parseAccount.js';
import { encodeFunctionData, } from '../../utils/abi/encodeFunctionData.js';
import { getContractError, } from '../../utils/errors/getContractError.js';
import { estimateTotalGas, } from './estimateTotalGas.js';
/**
* Estimates the L1 data gas + L2 gas required to successfully execute a contract write function call.
*
* @param client - Client to use
* @param parameters - {@link EstimateContractTotalGasParameters}
* @returns The gas estimate (in wei). {@link EstimateContractTotalGasReturnType}
*
* @example
* import { createPublicClient, http, parseAbi } from 'viem'
* import { optimism } from 'viem/chains'
* import { estimateContractTotalGas } from 'viem/op-stack'
*
* const client = createPublicClient({
* chain: optimism,
* transport: http(),
* })
* const totalGas = await estimateContractTotalGas(client, {
* address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',
* abi: parseAbi(['function mint() public']),
* functionName: 'mint',
* account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',
* })
*/
export async function estimateContractTotalGas(client, parameters) {
const { abi, address, args, functionName, ...request } = parameters;
const data = encodeFunctionData({
abi,
args,
functionName,
});
try {
const gas = await estimateTotalGas(client, {
data,
to: address,
...request,
});
return gas;
}
catch (error) {
const account = request.account ? parseAccount(request.account) : undefined;
throw getContractError(error, {
abi,
address,
args,
docsPath: '/docs/chains/op-stack/estimateTotalGas',
functionName,
sender: account?.address,
});
}
}
//# sourceMappingURL=estimateContractTotalGas.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"estimateContractTotalGas.js","sourceRoot":"","sources":["../../../op-stack/actions/estimateContractTotalGas.ts"],"names":[],"mappings":"AAGA,OAAO,EAEL,YAAY,GACb,MAAM,sCAAsC,CAAA;AAY7C,OAAO,EAGL,kBAAkB,GACnB,MAAM,uCAAuC,CAAA;AAC9C,OAAO,EAEL,gBAAgB,GACjB,MAAM,wCAAwC,CAAA;AAC/C,OAAO,EAGL,gBAAgB,GACjB,MAAM,uBAAuB,CAAA;AA8C9B;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAQ5C,MAAyC,EACzC,UAOC;IAED,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,OAAO,EAAE,GACpD,UAAgD,CAAA;IAClD,MAAM,IAAI,GAAG,kBAAkB,CAAC;QAC9B,GAAG;QACH,IAAI;QACJ,YAAY;KACmB,CAAC,CAAA;IAClC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,gBAAgB,CAAC,MAAM,EAAE;YACzC,IAAI;YACJ,EAAE,EAAE,OAAO;YACX,GAAG,OAAO;SAC8B,CAAC,CAAA;QAC3C,OAAO,GAAG,CAAA;IACZ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;QAC3E,MAAM,gBAAgB,CAAC,KAAkB,EAAE;YACzC,GAAG;YACH,OAAO;YACP,IAAI;YACJ,QAAQ,EAAE,wCAAwC;YAClD,YAAY;YACZ,MAAM,EAAE,OAAO,EAAE,OAAO;SACzB,CAAC,CAAA;IACJ,CAAC;AACH,CAAC"}

View File

@@ -0,0 +1,66 @@
import { estimateContractGas, } from '../../actions/public/estimateContractGas.js';
import { zeroAddress } from '../../constants/address.js';
import { portalAbi } from '../abis.js';
/**
* Estimates gas required to initiate a [deposit transaction](https://github.com/ethereum-optimism/optimism/blob/develop/specs/deposits.md) on an L1, which executes a transaction on L2.
*
* - Docs: https://viem.sh/op-stack/actions/estimateDepositTransactionGas
*
* @param client - Client to use
* @param parameters - {@link EstimateDepositTransactionGasParameters}
* @returns The L1 transaction hash. {@link EstimateDepositTransactionGasReturnType}
*
* @example
* import { createPublicClient, custom, parseEther } from 'viem'
* import { base, mainnet } from 'viem/chains'
* import { estimateDepositTransactionGas } from 'viem/op-stack'
*
* const client = createPublicClient({
* chain: mainnet,
* transport: custom(window.ethereum),
* })
*
* const gas = await estimateDepositTransactionGas(client, {
* account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',
* args: {
* gas: 21_000n,
* to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
* value: parseEther('1'),
* },
* targetChain: base,
* })
*/
export async function estimateDepositTransactionGas(client, parameters) {
const { account, chain = client.chain, gas, maxFeePerGas, maxPriorityFeePerGas, nonce, request: { data = '0x', gas: l2Gas, isCreation = false, mint, to = '0x', value, }, targetChain, } = parameters;
const portalAddress = (() => {
if (parameters.portalAddress)
return parameters.portalAddress;
if (chain)
return targetChain.contracts.portal[chain.id].address;
return Object.values(targetChain.contracts.portal)[0].address;
})();
const params = {
account,
abi: portalAbi,
address: portalAddress,
functionName: 'depositTransaction',
args: [
isCreation ? zeroAddress : to,
value ?? mint ?? 0n,
l2Gas,
isCreation,
data,
],
gas,
maxFeePerGas,
maxPriorityFeePerGas,
nonce,
value: mint,
// TODO: Not sure `chain` is necessary since it's not used downstream
// in `estimateContractGas` or `estimateGas`
// @ts-expect-error
chain,
};
return estimateContractGas(client, params);
}
//# sourceMappingURL=estimateDepositTransactionGas.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"estimateDepositTransactionGas.js","sourceRoot":"","sources":["../../../op-stack/actions/estimateDepositTransactionGas.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,mBAAmB,GACpB,MAAM,6CAA6C,CAAA;AAGpD,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAA;AAUxD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAsCtC;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,CAAC,KAAK,UAAU,6BAA6B,CAKjD,MAAyC,EACzC,UAIC;IAED,MAAM,EACJ,OAAO,EACP,KAAK,GAAG,MAAM,CAAC,KAAK,EACpB,GAAG,EACH,YAAY,EACZ,oBAAoB,EACpB,KAAK,EACL,OAAO,EAAE,EACP,IAAI,GAAG,IAAI,EACX,GAAG,EAAE,KAAK,EACV,UAAU,GAAG,KAAK,EAClB,IAAI,EACJ,EAAE,GAAG,IAAI,EACT,KAAK,GACN,EACD,WAAW,GACZ,GAAG,UAAU,CAAA;IAEd,MAAM,aAAa,GAAG,CAAC,GAAG,EAAE;QAC1B,IAAI,UAAU,CAAC,aAAa;YAAE,OAAO,UAAU,CAAC,aAAa,CAAA;QAC7D,IAAI,KAAK;YAAE,OAAO,WAAY,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,OAAO,CAAA;QACjE,OAAO,MAAM,CAAC,MAAM,CAAC,WAAY,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAA;IAChE,CAAC,CAAC,EAAE,CAAA;IAEJ,MAAM,MAAM,GAAG;QACb,OAAO;QACP,GAAG,EAAE,SAAS;QACd,OAAO,EAAE,aAAa;QACtB,YAAY,EAAE,oBAAoB;QAClC,IAAI,EAAE;YACJ,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE;YAC7B,KAAK,IAAI,IAAI,IAAI,EAAE;YACnB,KAAK;YACL,UAAU;YACV,IAAI;SACL;QACD,GAAG;QACH,YAAY;QACZ,oBAAoB;QACpB,KAAK;QACL,KAAK,EAAE,IAAI;QACX,qEAAqE;QACrE,4CAA4C;QAC5C,mBAAmB;QACnB,KAAK;KAIN,CAAA;IACD,OAAO,mBAAmB,CAAC,MAAM,EAAE,MAAa,CAAC,CAAA;AACnD,CAAC"}

View File

@@ -0,0 +1,61 @@
import { estimateContractGas, } from '../../actions/public/estimateContractGas.js';
import { portal2Abi, portalAbi } from '../abis.js';
/**
* Estimates gas required to finalize a withdrawal that occurred on an L2.
*
* - Docs: https://viem.sh/op-stack/actions/estimateFinalizeWithdrawalGas
*
* @param client - Client to use
* @param parameters - {@link EstimateFinalizeWithdrawalGasParameters}
* @returns Estimated gas. {@link EstimateFinalizeWithdrawalGasReturnType}
*
* @example
* import { createPublicClient, http, parseEther } from 'viem'
* import { base, mainnet } from 'viem/chains'
* import { estimateFinalizeWithdrawalGas } from 'viem/op-stack'
*
* const client = createPublicClient({
* chain: mainnet,
* transport: http(),
* })
*
* const gas = await estimateFinalizeWithdrawalGas(client, {
* account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',
* targetChain: optimism,
* withdrawal: { ... },
* })
*/
export async function estimateFinalizeWithdrawalGas(client, parameters) {
const { account, chain = client.chain, gas, maxFeePerGas, maxPriorityFeePerGas, nonce, proofSubmitter, targetChain, withdrawal, } = parameters;
const portalAddress = (() => {
if (parameters.portalAddress)
return parameters.portalAddress;
if (chain)
return targetChain.contracts.portal[chain.id].address;
return Object.values(targetChain.contracts.portal)[0].address;
})();
const [functionName, args, abi] = proofSubmitter
? [
'finalizeWithdrawalTransactionExternalProof',
[withdrawal, proofSubmitter],
portal2Abi,
]
: ['finalizeWithdrawalTransaction', [withdrawal], portalAbi];
const params = {
account,
abi,
address: portalAddress,
functionName,
args,
gas,
maxFeePerGas,
maxPriorityFeePerGas,
nonce,
// TODO: Not sure `chain` is necessary since it's not used downstream
// in `estimateContractGas` or `estimateGas`
// @ts-expect-error
chain,
};
return estimateContractGas(client, params);
}
//# sourceMappingURL=estimateFinalizeWithdrawalGas.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"estimateFinalizeWithdrawalGas.js","sourceRoot":"","sources":["../../../op-stack/actions/estimateFinalizeWithdrawalGas.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,mBAAmB,GACpB,MAAM,6CAA6C,CAAA;AAYpD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAuClD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,CAAC,KAAK,UAAU,6BAA6B,CAKjD,MAAyC,EACzC,UAIC;IAED,MAAM,EACJ,OAAO,EACP,KAAK,GAAG,MAAM,CAAC,KAAK,EACpB,GAAG,EACH,YAAY,EACZ,oBAAoB,EACpB,KAAK,EACL,cAAc,EACd,WAAW,EACX,UAAU,GACX,GAAG,UAAU,CAAA;IAEd,MAAM,aAAa,GAAG,CAAC,GAAG,EAAE;QAC1B,IAAI,UAAU,CAAC,aAAa;YAAE,OAAO,UAAU,CAAC,aAAa,CAAA;QAC7D,IAAI,KAAK;YAAE,OAAO,WAAY,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,OAAO,CAAA;QACjE,OAAO,MAAM,CAAC,MAAM,CAAC,WAAY,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAA;IAChE,CAAC,CAAC,EAAE,CAAA;IAEJ,MAAM,CAAC,YAAY,EAAE,IAAI,EAAE,GAAG,CAAC,GAAG,cAAc;QAC9C,CAAC,CAAC;YACE,4CAA4C;YAC5C,CAAC,UAAU,EAAE,cAAc,CAAC;YAC5B,UAAU;SACX;QACH,CAAC,CAAC,CAAC,+BAA+B,EAAE,CAAC,UAAU,CAAC,EAAE,SAAS,CAAC,CAAA;IAE9D,MAAM,MAAM,GAAG;QACb,OAAO;QACP,GAAG;QACH,OAAO,EAAE,aAAa;QACtB,YAAY;QACZ,IAAI;QACJ,GAAG;QACH,YAAY;QACZ,oBAAoB;QACpB,KAAK;QACL,qEAAqE;QACrE,4CAA4C;QAC5C,mBAAmB;QACnB,KAAK;KACkC,CAAA;IAEzC,OAAO,mBAAmB,CAAC,MAAM,EAAE,MAAa,CAAC,CAAA;AACnD,CAAC"}

View File

@@ -0,0 +1,52 @@
import { estimateContractGas, } from '../../actions/public/estimateContractGas.js';
import { l2ToL1MessagePasserAbi } from '../abis.js';
import { contracts } from '../contracts.js';
/**
* Estimates gas required to initiate a [withdrawal](https://community.optimism.io/docs/protocol/withdrawal-flow/#withdrawal-initiating-transaction) on an L2 to the L1.
*
* - Docs: https://viem.sh/op-stack/actions/estimateInitiateWithdrawalGas
*
* @param client - Client to use
* @param parameters - {@link EstimateInitiateWithdrawalGasParameters}
* @returns Estimated gas. {@link EstimateInitiateWithdrawalGasReturnType}
*
* @example
* import { createPublicClient, http, parseEther } from 'viem'
* import { base, mainnet } from 'viem/chains'
* import { estimateInitiateWithdrawalGas } from 'viem/op-stack'
*
* const client = createPublicClient({
* chain: mainnet,
* transport: http(),
* })
*
* const gas = await estimateInitiateWithdrawalGas(client, {
* account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',
* request: {
* gas: 21_000n,
* to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
* value: parseEther('1'),
* },
* })
*/
export async function estimateInitiateWithdrawalGas(client, parameters) {
const { account, chain = client.chain, gas, maxFeePerGas, maxPriorityFeePerGas, nonce, request: { data = '0x', gas: l1Gas, to, value }, } = parameters;
const params = {
account,
abi: l2ToL1MessagePasserAbi,
address: contracts.l2ToL1MessagePasser.address,
functionName: 'initiateWithdrawal',
args: [to, l1Gas, data],
gas,
maxFeePerGas,
maxPriorityFeePerGas,
nonce,
value,
// TODO: Not sure `chain` is necessary since it's not used downstream
// in `estimateContractGas` or `estimateGas`
// @ts-expect-error
chain,
};
return estimateContractGas(client, params);
}
//# sourceMappingURL=estimateInitiateWithdrawalGas.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"estimateInitiateWithdrawalGas.js","sourceRoot":"","sources":["../../../op-stack/actions/estimateInitiateWithdrawalGas.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,mBAAmB,GACpB,MAAM,6CAA6C,CAAA;AAYpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAA;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAoC3C;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,MAAM,CAAC,KAAK,UAAU,6BAA6B,CAKjD,MAAyC,EACzC,UAIC;IAED,MAAM,EACJ,OAAO,EACP,KAAK,GAAG,MAAM,CAAC,KAAK,EACpB,GAAG,EACH,YAAY,EACZ,oBAAoB,EACpB,KAAK,EACL,OAAO,EAAE,EAAE,IAAI,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,GAChD,GAAG,UAAU,CAAA;IAEd,MAAM,MAAM,GAAG;QACb,OAAO;QACP,GAAG,EAAE,sBAAsB;QAC3B,OAAO,EAAE,SAAS,CAAC,mBAAmB,CAAC,OAAO;QAC9C,YAAY,EAAE,oBAAoB;QAClC,IAAI,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC;QACvB,GAAG;QACH,YAAY;QACZ,oBAAoB;QACpB,KAAK;QACL,KAAK;QACL,qEAAqE;QACrE,4CAA4C;QAC5C,mBAAmB;QACnB,KAAK;KAIN,CAAA;IACD,OAAO,mBAAmB,CAAC,MAAM,EAAE,MAAa,CAAC,CAAA;AACnD,CAAC"}

View File

@@ -0,0 +1,60 @@
import { readContract, } from '../../actions/public/readContract.js';
import { getChainContractAddress } from '../../utils/chain/getChainContractAddress.js';
import { serializeTransaction, } from '../../utils/transaction/serializeTransaction.js';
import { parseGwei } from '../../utils/unit/parseGwei.js';
import { gasPriceOracleAbi } from '../abis.js';
import { contracts } from '../contracts.js';
/**
* Estimates the L1 data fee required to execute an L2 transaction.
*
* @param client - Client to use
* @param parameters - {@link EstimateL1FeeParameters}
* @returns The fee (in wei). {@link EstimateL1FeeReturnType}
*
* @example
* import { createPublicClient, http, parseEther } from 'viem'
* import { optimism } from 'viem/chains'
* import { estimateL1Fee } from 'viem/chains/optimism'
*
* const client = createPublicClient({
* chain: optimism,
* transport: http(),
* })
* const l1Fee = await estimateL1Fee(client, {
* account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',
* to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
* value: parseEther('1'),
* })
*/
export async function estimateL1Fee(client, args) {
const { chain = client.chain, gasPriceOracleAddress: gasPriceOracleAddress_, } = args;
const gasPriceOracleAddress = (() => {
if (gasPriceOracleAddress_)
return gasPriceOracleAddress_;
if (chain)
return getChainContractAddress({
chain,
contract: 'gasPriceOracle',
});
return contracts.gasPriceOracle.address;
})();
const transaction = serializeTransaction({
...args,
chainId: chain?.id ?? 1,
type: 'eip1559',
// Set upper-limit-ish stub values. Shouldn't affect the estimate too much as we are
// tweaking dust bytes here (as opposed to long `data` bytes).
// See: https://github.com/ethereum-optimism/optimism/blob/54d02df55523c9e1b4b38ed082c12a42087323a0/packages/contracts-bedrock/src/L2/GasPriceOracle.sol#L242-L248.
gas: args.data ? 300000n : 21000n,
maxFeePerGas: parseGwei('5'),
maxPriorityFeePerGas: parseGwei('1'),
nonce: 1,
});
return readContract(client, {
abi: gasPriceOracleAbi,
address: gasPriceOracleAddress,
functionName: 'getL1Fee',
args: [transaction],
});
}
//# sourceMappingURL=estimateL1Fee.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"estimateL1Fee.js","sourceRoot":"","sources":["../../../op-stack/actions/estimateL1Fee.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,YAAY,GACb,MAAM,sCAAsC,CAAA;AAW7C,OAAO,EAAE,uBAAuB,EAAE,MAAM,8CAA8C,CAAA;AAEtF,OAAO,EAEL,oBAAoB,GACrB,MAAM,iDAAiD,CAAA;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAA;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAsB3C;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAKjC,MAA2C,EAC3C,IAA+D;IAE/D,MAAM,EACJ,KAAK,GAAG,MAAM,CAAC,KAAK,EACpB,qBAAqB,EAAE,sBAAsB,GAC9C,GAAG,IAAI,CAAA;IAER,MAAM,qBAAqB,GAAG,CAAC,GAAG,EAAE;QAClC,IAAI,sBAAsB;YAAE,OAAO,sBAAsB,CAAA;QACzD,IAAI,KAAK;YACP,OAAO,uBAAuB,CAAC;gBAC7B,KAAK;gBACL,QAAQ,EAAE,gBAAgB;aAC3B,CAAC,CAAA;QACJ,OAAO,SAAS,CAAC,cAAc,CAAC,OAAO,CAAA;IACzC,CAAC,CAAC,EAAE,CAAA;IAEJ,MAAM,WAAW,GAAG,oBAAoB,CAAC;QACvC,GAAG,IAAI;QACP,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,CAAC;QACvB,IAAI,EAAE,SAAS;QAEf,oFAAoF;QACpF,8DAA8D;QAC9D,mKAAmK;QACnK,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,OAAQ,CAAC,CAAC,CAAC,MAAO;QACnC,YAAY,EAAE,SAAS,CAAC,GAAG,CAAC;QAC5B,oBAAoB,EAAE,SAAS,CAAC,GAAG,CAAC;QACpC,KAAK,EAAE,CAAC;KACkB,CAAC,CAAA;IAE7B,OAAO,YAAY,CAAC,MAAM,EAAE;QAC1B,GAAG,EAAE,iBAAiB;QACtB,OAAO,EAAE,qBAAqB;QAC9B,YAAY,EAAE,UAAU;QACxB,IAAI,EAAE,CAAC,WAAkB,CAAC;KAC3B,CAAC,CAAA;AACJ,CAAC"}

View File

@@ -0,0 +1,60 @@
import { readContract, } from '../../actions/public/readContract.js';
import { getChainContractAddress } from '../../utils/chain/getChainContractAddress.js';
import { serializeTransaction, } from '../../utils/transaction/serializeTransaction.js';
import { parseGwei } from '../../utils/unit/parseGwei.js';
import { gasPriceOracleAbi } from '../abis.js';
import { contracts } from '../contracts.js';
/**
* Estimates the L1 data gas required to execute an L2 transaction.
*
* @param client - Client to use
* @param parameters - {@link EstimateL1GasParameters}
* @returns The gas estimate. {@link EstimateL1GasReturnType}
*
* @example
* import { createPublicClient, http, parseEther } from 'viem'
* import { optimism } from 'viem/chains'
* import { estimateL1Gas } from 'viem/chains/optimism'
*
* const client = createPublicClient({
* chain: optimism,
* transport: http(),
* })
* const l1Gas = await estimateL1Gas(client, {
* account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',
* to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
* value: parseEther('1'),
* })
*/
export async function estimateL1Gas(client, args) {
const { chain = client.chain, gasPriceOracleAddress: gasPriceOracleAddress_, } = args;
const gasPriceOracleAddress = (() => {
if (gasPriceOracleAddress_)
return gasPriceOracleAddress_;
if (chain)
return getChainContractAddress({
chain,
contract: 'gasPriceOracle',
});
return contracts.gasPriceOracle.address;
})();
const transaction = serializeTransaction({
...args,
chainId: chain?.id ?? 1,
type: 'eip1559',
// Set upper-limit-ish stub values. Shouldn't affect the estimate too much as we are
// tweaking dust bytes here (as opposed to long `data` bytes).
// See: https://github.com/ethereum-optimism/optimism/blob/54d02df55523c9e1b4b38ed082c12a42087323a0/packages/contracts-bedrock/src/L2/GasPriceOracle.sol#L242-L248.
gas: args.data ? 300000n : 21000n,
maxFeePerGas: parseGwei('5'),
maxPriorityFeePerGas: parseGwei('1'),
nonce: 1,
});
return readContract(client, {
abi: gasPriceOracleAbi,
address: gasPriceOracleAddress,
functionName: 'getL1GasUsed',
args: [transaction],
});
}
//# sourceMappingURL=estimateL1Gas.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"estimateL1Gas.js","sourceRoot":"","sources":["../../../op-stack/actions/estimateL1Gas.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,YAAY,GACb,MAAM,sCAAsC,CAAA;AAW7C,OAAO,EAAE,uBAAuB,EAAE,MAAM,8CAA8C,CAAA;AAEtF,OAAO,EAEL,oBAAoB,GACrB,MAAM,iDAAiD,CAAA;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAA;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAsB3C;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAKjC,MAAyC,EACzC,IAA4D;IAE5D,MAAM,EACJ,KAAK,GAAG,MAAM,CAAC,KAAK,EACpB,qBAAqB,EAAE,sBAAsB,GAC9C,GAAG,IAAI,CAAA;IAER,MAAM,qBAAqB,GAAG,CAAC,GAAG,EAAE;QAClC,IAAI,sBAAsB;YAAE,OAAO,sBAAsB,CAAA;QACzD,IAAI,KAAK;YACP,OAAO,uBAAuB,CAAC;gBAC7B,KAAK;gBACL,QAAQ,EAAE,gBAAgB;aAC3B,CAAC,CAAA;QACJ,OAAO,SAAS,CAAC,cAAc,CAAC,OAAO,CAAA;IACzC,CAAC,CAAC,EAAE,CAAA;IAEJ,MAAM,WAAW,GAAG,oBAAoB,CAAC;QACvC,GAAG,IAAI;QACP,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,CAAC;QACvB,IAAI,EAAE,SAAS;QAEf,oFAAoF;QACpF,8DAA8D;QAC9D,mKAAmK;QACnK,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,OAAQ,CAAC,CAAC,CAAC,MAAO;QACnC,YAAY,EAAE,SAAS,CAAC,GAAG,CAAC;QAC5B,oBAAoB,EAAE,SAAS,CAAC,GAAG,CAAC;QACpC,KAAK,EAAE,CAAC;KACkB,CAAC,CAAA;IAE7B,OAAO,YAAY,CAAC,MAAM,EAAE;QAC1B,GAAG,EAAE,iBAAiB;QACtB,OAAO,EAAE,qBAAqB;QAC9B,YAAY,EAAE,cAAc;QAC5B,IAAI,EAAE,CAAC,WAAkB,CAAC;KAC3B,CAAC,CAAA;AACJ,CAAC"}

View File

@@ -0,0 +1,73 @@
import { estimateGas, } from '../../actions/public/estimateGas.js';
import { readContract, } from '../../actions/public/readContract.js';
import { getChainContractAddress } from '../../utils/chain/getChainContractAddress.js';
import { l1BlockAbi } from '../abis.js';
import { contracts } from '../contracts.js';
/**
* Estimates the operator fee required to execute an L2 transaction.
*
* Operator fees are part of the Isthmus upgrade and allow OP Stack operators
* to recover costs related to Alt-DA, ZK proving, or custom gas tokens.
* Returns 0 for pre-Isthmus chains or when operator fee functions don't exist.
*
* @param client - Client to use
* @param parameters - {@link EstimateOperatorFeeParameters}
* @returns The operator fee (in wei). {@link EstimateOperatorFeeReturnType}
*
* @example
* import { createPublicClient, http, parseEther } from 'viem'
* import { optimism } from 'viem/chains'
* import { estimateOperatorFee } from 'viem/chains/optimism'
*
* const client = createPublicClient({
* chain: optimism,
* transport: http(),
* })
* const operatorFee = await estimateOperatorFee(client, {
* account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',
* to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
* value: parseEther('1'),
* })
*/
export async function estimateOperatorFee(client, args) {
const { chain = client.chain, l1BlockAddress: l1BlockAddress_ } = args;
const l1BlockAddress = (() => {
if (l1BlockAddress_)
return l1BlockAddress_;
if (chain?.contracts?.l1Block)
return getChainContractAddress({
chain,
contract: 'l1Block',
});
return contracts.l1Block.address;
})();
// Try to get operator fee parameters. If any of these calls fail,
// it means this is a pre-Isthmus chain and operator fees don't apply
try {
// Get operator fee parameters first to fail fast if not supported
const [operatorFeeScalar, operatorFeeConstant] = await Promise.all([
readContract(client, {
abi: l1BlockAbi,
address: l1BlockAddress,
functionName: 'operatorFeeScalar',
}),
readContract(client, {
abi: l1BlockAbi,
address: l1BlockAddress,
functionName: 'operatorFeeConstant',
}),
]);
// Estimate gas for the actual transaction
const gasUsed = await estimateGas(client, args);
// Calculate operator fee: saturatingAdd(saturatingMul(gasUsed, scalar) / 1e6, constant)
// Using saturating arithmetic to prevent overflow
const scaledFee = (gasUsed * BigInt(operatorFeeScalar)) / 1000000n;
return scaledFee + BigInt(operatorFeeConstant);
}
catch {
// If any call fails, this is likely a pre-Isthmus chain or the contract
// doesn't support these functions. Return 0 for operator fee.
return 0n;
}
}
//# sourceMappingURL=estimateOperatorFee.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"estimateOperatorFee.js","sourceRoot":"","sources":["../../../op-stack/actions/estimateOperatorFee.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,WAAW,GACZ,MAAM,qCAAqC,CAAA;AAC5C,OAAO,EAEL,YAAY,GACb,MAAM,sCAAsC,CAAA;AAQ7C,OAAO,EAAE,uBAAuB,EAAE,MAAM,8CAA8C,CAAA;AAEtF,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAsB3C;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAKvC,MAA2C,EAC3C,IAAqE;IAErE,MAAM,EAAE,KAAK,GAAG,MAAM,CAAC,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,GAAG,IAAI,CAAA;IAEtE,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE;QAC3B,IAAI,eAAe;YAAE,OAAO,eAAe,CAAA;QAC3C,IAAI,KAAK,EAAE,SAAS,EAAE,OAAO;YAC3B,OAAO,uBAAuB,CAAC;gBAC7B,KAAK;gBACL,QAAQ,EAAE,SAAS;aACpB,CAAC,CAAA;QACJ,OAAO,SAAS,CAAC,OAAO,CAAC,OAAO,CAAA;IAClC,CAAC,CAAC,EAAE,CAAA;IAEJ,kEAAkE;IAClE,qEAAqE;IACrE,IAAI,CAAC;QACH,kEAAkE;QAClE,MAAM,CAAC,iBAAiB,EAAE,mBAAmB,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACjE,YAAY,CAAC,MAAM,EAAE;gBACnB,GAAG,EAAE,UAAU;gBACf,OAAO,EAAE,cAAc;gBACvB,YAAY,EAAE,mBAAmB;aAClC,CAAC;YACF,YAAY,CAAC,MAAM,EAAE;gBACnB,GAAG,EAAE,UAAU;gBACf,OAAO,EAAE,cAAc;gBACvB,YAAY,EAAE,qBAAqB;aACpC,CAAC;SACH,CAAC,CAAA;QAEF,0CAA0C;QAC1C,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,MAAM,EAAE,IAA6B,CAAC,CAAA;QAExE,wFAAwF;QACxF,kDAAkD;QAClD,MAAM,SAAS,GAAG,CAAC,OAAO,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC,GAAG,QAAU,CAAA;QACpE,OAAO,SAAS,GAAG,MAAM,CAAC,mBAAmB,CAAC,CAAA;IAChD,CAAC;IAAC,MAAM,CAAC;QACP,wEAAwE;QACxE,8DAA8D;QAC9D,OAAO,EAAE,CAAA;IACX,CAAC;AACH,CAAC"}

View File

@@ -0,0 +1,57 @@
import { estimateContractGas, } from '../../actions/public/estimateContractGas.js';
import { portalAbi } from '../abis.js';
/**
* Estimates gas required to prove a withdrawal that occurred on an L2.
*
* - Docs: https://viem.sh/op-stack/actions/estimateProveWithdrawalGas
*
* @param client - Client to use
* @param parameters - {@link EstimateProveWithdrawalGasParameters}
* @returns Estimated gas. {@link EstimateProveWithdrawalGasReturnType}
*
* @example
* import { createPublicClient, http, parseEther } from 'viem'
* import { base, mainnet } from 'viem/chains'
* import { estimateProveWithdrawalGas } from 'viem/op-stack'
*
* const client = createPublicClient({
* chain: mainnet,
* transport: http(),
* })
*
* const gas = await estimateProveWithdrawalGas(client, {
* account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',
* l2OutputIndex: 4529n,
* outputRootProof: { ... },
* targetChain: optimism,
* withdrawalProof: [ ... ],
* withdrawal: { ... },
* })
*/
export async function estimateProveWithdrawalGas(client, parameters) {
const { account, chain = client.chain, gas, l2OutputIndex, maxFeePerGas, maxPriorityFeePerGas, nonce, outputRootProof, targetChain, withdrawalProof, withdrawal, } = parameters;
const portalAddress = (() => {
if (parameters.portalAddress)
return parameters.portalAddress;
if (chain)
return targetChain.contracts.portal[chain.id].address;
return Object.values(targetChain.contracts.portal)[0].address;
})();
const params = {
account,
abi: portalAbi,
address: portalAddress,
functionName: 'proveWithdrawalTransaction',
args: [withdrawal, l2OutputIndex, outputRootProof, withdrawalProof],
gas,
maxFeePerGas,
maxPriorityFeePerGas,
nonce,
// TODO: Not sure `chain` is necessary since it's not used downstream
// in `estimateContractGas` or `estimateGas`
// @ts-expect-error
chain,
};
return estimateContractGas(client, params);
}
//# sourceMappingURL=estimateProveWithdrawalGas.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"estimateProveWithdrawalGas.js","sourceRoot":"","sources":["../../../op-stack/actions/estimateProveWithdrawalGas.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,mBAAmB,GACpB,MAAM,6CAA6C,CAAA;AAapD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAgDtC;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAK9C,MAAyC,EACzC,UAIC;IAED,MAAM,EACJ,OAAO,EACP,KAAK,GAAG,MAAM,CAAC,KAAK,EACpB,GAAG,EACH,aAAa,EACb,YAAY,EACZ,oBAAoB,EACpB,KAAK,EACL,eAAe,EACf,WAAW,EACX,eAAe,EACf,UAAU,GACX,GAAG,UAAU,CAAA;IAEd,MAAM,aAAa,GAAG,CAAC,GAAG,EAAE;QAC1B,IAAI,UAAU,CAAC,aAAa;YAAE,OAAO,UAAU,CAAC,aAAa,CAAA;QAC7D,IAAI,KAAK;YAAE,OAAO,WAAY,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,OAAO,CAAA;QACjE,OAAO,MAAM,CAAC,MAAM,CAAC,WAAY,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAA;IAChE,CAAC,CAAC,EAAE,CAAA;IAEJ,MAAM,MAAM,GAAG;QACb,OAAO;QACP,GAAG,EAAE,SAAS;QACd,OAAO,EAAE,aAAa;QACtB,YAAY,EAAE,4BAA4B;QAC1C,IAAI,EAAE,CAAC,UAAU,EAAE,aAAa,EAAE,eAAe,EAAE,eAAe,CAAC;QACnE,GAAG;QACH,YAAY;QACZ,oBAAoB;QACpB,KAAK;QACL,qEAAqE;QACrE,4CAA4C;QAC5C,mBAAmB;QACnB,KAAK;KAIN,CAAA;IACD,OAAO,mBAAmB,CAAC,MAAM,EAAE,MAAa,CAAC,CAAA;AACnD,CAAC"}

View File

@@ -0,0 +1,39 @@
import { estimateGas, } from '../../actions/public/estimateGas.js';
import { getGasPrice, } from '../../actions/public/getGasPrice.js';
import { prepareTransactionRequest, } from '../../actions/wallet/prepareTransactionRequest.js';
import { estimateL1Fee, } from './estimateL1Fee.js';
import { estimateOperatorFee, } from './estimateOperatorFee.js';
/**
* Estimates the L1 data fee + L2 fee + operator fee to execute an L2 transaction.
*
* @param client - Client to use
* @param parameters - {@link EstimateTotalFeeParameters}
* @returns The fee (in wei). {@link EstimateTotalFeeReturnType}
*
* @example
* import { createPublicClient, http, parseEther } from 'viem'
* import { optimism } from 'viem/chains'
* import { estimateTotalFee } from 'viem/chains/optimism'
*
* const client = createPublicClient({
* chain: optimism,
* transport: http(),
* })
* const totalGas = await estimateTotalFee(client, {
* account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',
* to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
* value: parseEther('1'),
* })
*/
export async function estimateTotalFee(client, args) {
// Populate transaction with required fields to accurately estimate gas.
const request = await prepareTransactionRequest(client, args);
const [l1Fee, operatorFee, l2Gas, l2GasPrice] = await Promise.all([
estimateL1Fee(client, request),
estimateOperatorFee(client, request),
estimateGas(client, request),
getGasPrice(client),
]);
return l1Fee + operatorFee + l2Gas * l2GasPrice;
}
//# sourceMappingURL=estimateTotalFee.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"estimateTotalFee.js","sourceRoot":"","sources":["../../../op-stack/actions/estimateTotalFee.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,WAAW,GACZ,MAAM,qCAAqC,CAAA;AAC5C,OAAO,EAEL,WAAW,GACZ,MAAM,qCAAqC,CAAA;AAC5C,OAAO,EAGL,yBAAyB,GAC1B,MAAM,mDAAmD,CAAA;AAO1D,OAAO,EAGL,aAAa,GACd,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAGL,mBAAmB,GACpB,MAAM,0BAA0B,CAAA;AAoBjC;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAKpC,MAAyC,EACzC,IAA+D;IAE/D,wEAAwE;IACxE,MAAM,OAAO,GAAG,MAAM,yBAAyB,CAC7C,MAAM,EACN,IAA2C,CAC5C,CAAA;IAED,MAAM,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,UAAU,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAChE,aAAa,CAAC,MAAM,EAAE,OAAkC,CAAC;QACzD,mBAAmB,CAAC,MAAM,EAAE,OAAwC,CAAC;QACrE,WAAW,CAAC,MAAM,EAAE,OAAgC,CAAC;QACrD,WAAW,CAAC,MAAM,CAAC;KACpB,CAAC,CAAA;IAEF,OAAO,KAAK,GAAG,WAAW,GAAG,KAAK,GAAG,UAAU,CAAA;AACjD,CAAC"}

View File

@@ -0,0 +1,32 @@
import { estimateGas, } from '../../actions/public/estimateGas.js';
import { estimateL1Gas, } from './estimateL1Gas.js';
/**
* Estimates the amount of L1 data gas + L2 gas required to execute an L2 transaction.
*
* @param client - Client to use
* @param parameters - {@link EstimateTotalGasParameters}
* @returns The gas estimate. {@link EstimateTotalGasReturnType}
*
* @example
* import { createPublicClient, http, parseEther } from 'viem'
* import { optimism } from 'viem/chains'
* import { estimateTotalGas } from 'viem/chains/optimism'
*
* const client = createPublicClient({
* chain: optimism,
* transport: http(),
* })
* const totalGas = await estimateTotalGas(client, {
* account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',
* to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
* value: parseEther('1'),
* })
*/
export async function estimateTotalGas(client, args) {
const [l1Gas, l2Gas] = await Promise.all([
estimateL1Gas(client, args),
estimateGas(client, args),
]);
return l1Gas + l2Gas;
}
//# sourceMappingURL=estimateTotalGas.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"estimateTotalGas.js","sourceRoot":"","sources":["../../../op-stack/actions/estimateTotalGas.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,WAAW,GACZ,MAAM,qCAAqC,CAAA;AAQ5C,OAAO,EAGL,aAAa,GACd,MAAM,oBAAoB,CAAA;AAiB3B;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAKpC,MAAyC,EACzC,IAA+D;IAE/D,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACvC,aAAa,CAAC,MAAM,EAAE,IAA+B,CAAC;QACtD,WAAW,CAAC,MAAM,EAAE,IAA6B,CAAC;KACnD,CAAC,CAAA;IAEF,OAAO,KAAK,GAAG,KAAK,CAAA;AACtB,CAAC"}

View File

@@ -0,0 +1,56 @@
import { writeContract, } from '../../actions/wallet/writeContract.js';
import { portal2Abi, portalAbi } from '../abis.js';
/**
* Finalizes a withdrawal that occurred on an L2. Used in the Withdrawal flow.
*
* - Docs: https://viem.sh/op-stack/actions/finalizeWithdrawal
*
* @param client - Client to use
* @param parameters - {@link FinalizeWithdrawalParameters}
* @returns The finalize transaction hash. {@link FinalizeWithdrawalReturnType}
*
* @example
* import { createWalletClient, http } from 'viem'
* import { mainnet, optimism } from 'viem/chains'
* import { finalizeWithdrawal } from 'viem/op-stack'
*
* const walletClientL1 = createWalletClient({
* chain: mainnet,
* transport: http(),
* })
*
* const request = await finalizeWithdrawal(walletClientL1, {
* targetChain: optimism,
* withdrawal: { ... },
* })
*/
export async function finalizeWithdrawal(client, parameters) {
const { account, chain = client.chain, gas, maxFeePerGas, maxPriorityFeePerGas, nonce, proofSubmitter, targetChain, withdrawal, } = parameters;
const portalAddress = (() => {
if (parameters.portalAddress)
return parameters.portalAddress;
if (chain)
return targetChain.contracts.portal[chain.id].address;
return Object.values(targetChain.contracts.portal)[0].address;
})();
const [functionName, args, abi] = proofSubmitter
? [
'finalizeWithdrawalTransactionExternalProof',
[withdrawal, proofSubmitter],
portal2Abi,
]
: ['finalizeWithdrawalTransaction', [withdrawal], portalAbi];
return writeContract(client, {
account: account,
abi,
address: portalAddress,
chain,
functionName,
args,
gas: gas ?? undefined,
maxFeePerGas,
maxPriorityFeePerGas,
nonce,
});
}
//# sourceMappingURL=finalizeWithdrawal.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"finalizeWithdrawal.js","sourceRoot":"","sources":["../../../op-stack/actions/finalizeWithdrawal.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,aAAa,GACd,MAAM,uCAAuC,CAAA;AAa9C,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AA4ClD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAKtC,MAAyC,EACzC,UAAuE;IAEvE,MAAM,EACJ,OAAO,EACP,KAAK,GAAG,MAAM,CAAC,KAAK,EACpB,GAAG,EACH,YAAY,EACZ,oBAAoB,EACpB,KAAK,EACL,cAAc,EACd,WAAW,EACX,UAAU,GACX,GAAG,UAAU,CAAA;IAEd,MAAM,aAAa,GAAG,CAAC,GAAG,EAAE;QAC1B,IAAI,UAAU,CAAC,aAAa;YAAE,OAAO,UAAU,CAAC,aAAa,CAAA;QAC7D,IAAI,KAAK;YAAE,OAAO,WAAY,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,OAAO,CAAA;QACjE,OAAO,MAAM,CAAC,MAAM,CAAC,WAAY,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAA;IAChE,CAAC,CAAC,EAAE,CAAA;IAEJ,MAAM,CAAC,YAAY,EAAE,IAAI,EAAE,GAAG,CAAC,GAAG,cAAc;QAC9C,CAAC,CAAC;YACE,4CAA4C;YAC5C,CAAC,UAAU,EAAE,cAAc,CAAC;YAC5B,UAAU;SACX;QACH,CAAC,CAAC,CAAC,+BAA+B,EAAE,CAAC,UAAU,CAAC,EAAE,SAAS,CAAC,CAAA;IAE9D,OAAO,aAAa,CAAC,MAAM,EAAE;QAC3B,OAAO,EAAE,OAAQ;QACjB,GAAG;QACH,OAAO,EAAE,aAAa;QACtB,KAAK;QACL,YAAY;QACZ,IAAI;QACJ,GAAG,EAAE,GAAG,IAAI,SAAS;QACrB,YAAY;QACZ,oBAAoB;QACpB,KAAK;KACmC,CAAC,CAAA;AAC7C,CAAC"}

40
node_modules/viem/_esm/op-stack/actions/getGame.js generated vendored Normal file
View File

@@ -0,0 +1,40 @@
import { GameNotFoundError, } from '../errors/withdrawal.js';
import { getGames } from './getGames.js';
/**
* Retrieves a valid dispute game on an L2 that occurred after a provided L2 block number.
*
* - Docs: https://viem.sh/op-stack/actions/getGame
*
* @param client - Client to use
* @param parameters - {@link GetGameParameters}
* @returns A valid dispute game. {@link GetGameReturnType}
*
* @example
* import { createPublicClient, http } from 'viem'
* import { mainnet, optimism } from 'viem/chains'
* import { getGame } from 'viem/op-stack'
*
* const publicClientL1 = createPublicClient({
* chain: mainnet,
* transport: http(),
* })
*
* const game = await getGame(publicClientL1, {
* l2BlockNumber: 69420n,
* targetChain: optimism
* })
*/
export async function getGame(client, parameters) {
const { l2BlockNumber, strategy = 'latest' } = parameters;
const latestGames = await getGames(client, parameters);
const games = latestGames.filter((game) => game.l2BlockNumber > l2BlockNumber);
const game = (() => {
if (strategy === 'random')
return games[Math.floor(Math.random() * games.length)];
return games[0];
})();
if (!game)
throw new GameNotFoundError();
return game;
}
//# sourceMappingURL=getGame.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"getGame.js","sourceRoot":"","sources":["../../../op-stack/actions/getGame.ts"],"names":[],"mappings":"AASA,OAAO,EACL,iBAAiB,GAElB,MAAM,yBAAyB,CAAA;AAGhC,OAAO,EAA0B,QAAQ,EAAE,MAAM,eAAe,CAAA;AAqChE;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAK3B,MAAyC,EACzC,UAAmD;IAEnD,MAAM,EAAE,aAAa,EAAE,QAAQ,GAAG,QAAQ,EAAE,GAAG,UAAU,CAAA;IAEzD,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;IAEtD,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC,CAAA;IAE9E,MAAM,IAAI,GAAG,CAAC,GAAG,EAAE;QACjB,IAAI,QAAQ,KAAK,QAAQ;YACvB,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAA;QACxD,OAAO,KAAK,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC,CAAC,EAAE,CAAA;IAEJ,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,iBAAiB,EAAE,CAAA;IACxC,OAAO,IAAI,CAAA;AACb,CAAC"}

84
node_modules/viem/_esm/op-stack/actions/getGames.js generated vendored Normal file
View File

@@ -0,0 +1,84 @@
import { multicall, } from '../../actions/public/multicall.js';
import { readContract, } from '../../actions/public/readContract.js';
import { disputeGameAbi, disputeGameFactoryAbi, portal2Abi } from '../abis.js';
/**
* Retrieves dispute games for an L2.
*
* - Docs: https://viem.sh/op-stack/actions/getGame
*
* @param client - Client to use
* @param parameters - {@link GetGameParameters}
* @returns Dispute games. {@link GetGameReturnType}
*
* @example
* import { createPublicClient, http } from 'viem'
* import { mainnet, optimism } from 'viem/chains'
* import { getGames } from 'viem/op-stack'
*
* const publicClientL1 = createPublicClient({
* chain: mainnet,
* transport: http(),
* })
*
* const games = await getGames(publicClientL1, {
* targetChain: optimism
* })
*/
export async function getGames(client, parameters) {
const { chain = client.chain, l2BlockNumber, limit = 100, targetChain, } = parameters;
const portalAddress = (() => {
if (parameters.portalAddress)
return parameters.portalAddress;
if (chain)
return targetChain.contracts.portal[chain.id].address;
return Object.values(targetChain.contracts.portal)[0].address;
})();
const disputeGameFactoryAddress = (() => {
if (parameters.disputeGameFactoryAddress)
return parameters.disputeGameFactoryAddress;
if (chain)
return targetChain.contracts.disputeGameFactory[chain.id].address;
return Object.values(targetChain.contracts.disputeGameFactory)[0].address;
})();
const [gameCount, gameType] = await Promise.all([
readContract(client, {
abi: disputeGameFactoryAbi,
functionName: 'gameCount',
args: [],
address: disputeGameFactoryAddress,
}),
readContract(client, {
abi: portal2Abi,
functionName: 'respectedGameType',
address: portalAddress,
}),
]);
const rawGames = (await readContract(client, {
abi: disputeGameFactoryAbi,
functionName: 'findLatestGames',
address: disputeGameFactoryAddress,
args: [
gameType,
BigInt(Math.max(0, Number(gameCount - 1n))),
BigInt(Math.min(limit, Number(gameCount))),
],
}));
const l2SequenceNumbers = await multicall(client, {
allowFailure: false,
contracts: rawGames.map((game) => ({
abi: disputeGameAbi,
address: `0x${game.metadata.slice(26)}`,
functionName: 'l2SequenceNumber',
})),
});
const games = rawGames
.map((game, i) => {
const blockNumber = l2SequenceNumbers[i];
return !l2BlockNumber || blockNumber > l2BlockNumber
? { ...game, l2BlockNumber: blockNumber }
: null;
})
.filter(Boolean);
return games;
}
//# sourceMappingURL=getGames.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"getGames.js","sourceRoot":"","sources":["../../../op-stack/actions/getGames.ts"],"names":[],"mappings":"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"}

View File

@@ -0,0 +1,41 @@
import { readContract, } from '../../actions/public/readContract.js';
import { getChainContractAddress } from '../../utils/chain/getChainContractAddress.js';
import { gasPriceOracleAbi } from '../abis.js';
import { contracts } from '../contracts.js';
/**
* get the L1 base fee
*
* @param client - Client to use
* @param parameters - {@link GetL1BaseFeeParameters}
* @returns The basefee (in wei). {@link GetL1BaseFeeReturnType}
*
* @example
* import { createPublicClient, http, parseEther } from 'viem'
* import { optimism } from 'viem/chains'
* import { getL1BaseFee } from 'viem/chains/optimism'
*
* const client = createPublicClient({
* chain: optimism,
* transport: http(),
* })
* const l1BaseFee = await getL1BaseFee(client)
*/
export async function getL1BaseFee(client, args) {
const { chain = client.chain, gasPriceOracleAddress: gasPriceOracleAddress_, } = args || {};
const gasPriceOracleAddress = (() => {
if (gasPriceOracleAddress_)
return gasPriceOracleAddress_;
if (chain)
return getChainContractAddress({
chain,
contract: 'gasPriceOracle',
});
return contracts.gasPriceOracle.address;
})();
return readContract(client, {
abi: gasPriceOracleAbi,
address: gasPriceOracleAddress,
functionName: 'l1BaseFee',
});
}
//# sourceMappingURL=getL1BaseFee.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"getL1BaseFee.js","sourceRoot":"","sources":["../../../op-stack/actions/getL1BaseFee.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,YAAY,GACb,MAAM,sCAAsC,CAAA;AAO7C,OAAO,EAAE,uBAAuB,EAAE,MAAM,8CAA8C,CAAA;AAGtF,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAmB3C;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAIhC,MAAgC,EAChC,IAA+D;IAE/D,MAAM,EACJ,KAAK,GAAG,MAAM,CAAC,KAAK,EACpB,qBAAqB,EAAE,sBAAsB,GAC9C,GAAG,IAAI,IAAI,EAAE,CAAA;IAEd,MAAM,qBAAqB,GAAG,CAAC,GAAG,EAAE;QAClC,IAAI,sBAAsB;YAAE,OAAO,sBAAsB,CAAA;QACzD,IAAI,KAAK;YACP,OAAO,uBAAuB,CAAC;gBAC7B,KAAK;gBACL,QAAQ,EAAE,gBAAgB;aAC3B,CAAC,CAAA;QACJ,OAAO,SAAS,CAAC,cAAc,CAAC,OAAO,CAAA;IACzC,CAAC,CAAC,EAAE,CAAA;IAEJ,OAAO,YAAY,CAAC,MAAM,EAAE;QAC1B,GAAG,EAAE,iBAAiB;QACtB,OAAO,EAAE,qBAAqB;QAC9B,YAAY,EAAE,WAAW;KAC1B,CAAC,CAAA;AACJ,CAAC"}

62
node_modules/viem/_esm/op-stack/actions/getL2Output.js generated vendored Normal file
View File

@@ -0,0 +1,62 @@
import { readContract, } from '../../actions/public/readContract.js';
import { l2OutputOracleAbi } from '../abis.js';
import { getGame } from './getGame.js';
import { getPortalVersion, } from './getPortalVersion.js';
/**
* Retrieves the first L2 output proposal that occurred after a provided block number.
*
* - Docs: https://viem.sh/op-stack/actions/getL2Output
*
* @param client - Client to use
* @param parameters - {@link GetL2OutputParameters}
* @returns The L2 output. {@link GetL2OutputReturnType}
*
* @example
* import { createPublicClient, http } from 'viem'
* import { mainnet, optimism } from 'viem/chains'
* import { getL2Output } from 'viem/op-stack'
*
* const publicClientL1 = createPublicClient({
* chain: mainnet,
* transport: http(),
* })
*
* const output = await getL2Output(publicClientL1, {
* l2BlockNumber: 69420n,
* targetChain: optimism
* })
*/
export async function getL2Output(client, parameters) {
const { chain = client.chain, l2BlockNumber, targetChain } = parameters;
const version = await getPortalVersion(client, parameters);
if (version.major >= 3) {
const game = await getGame(client, parameters);
return {
l2BlockNumber: game.l2BlockNumber,
outputIndex: game.index,
outputRoot: game.rootClaim,
timestamp: game.timestamp,
};
}
const l2OutputOracleAddress = (() => {
if (parameters.l2OutputOracleAddress)
return parameters.l2OutputOracleAddress;
if (chain)
return targetChain.contracts.l2OutputOracle[chain.id].address;
return Object.values(targetChain.contracts.l2OutputOracle)[0].address;
})();
const outputIndex = await readContract(client, {
address: l2OutputOracleAddress,
abi: l2OutputOracleAbi,
functionName: 'getL2OutputIndexAfter',
args: [l2BlockNumber],
});
const output = await readContract(client, {
address: l2OutputOracleAddress,
abi: l2OutputOracleAbi,
functionName: 'getL2Output',
args: [outputIndex],
});
return { outputIndex, ...output };
}
//# sourceMappingURL=getL2Output.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"getL2Output.js","sourceRoot":"","sources":["../../../op-stack/actions/getL2Output.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,YAAY,GACb,MAAM,sCAAsC,CAAA;AAY7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAG9C,OAAO,EAA0B,OAAO,EAAE,MAAM,cAAc,CAAA;AAC9D,OAAO,EAEL,gBAAgB,GACjB,MAAM,uBAAuB,CAAA;AA8B9B;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAK/B,MAAyC,EACzC,UAAuD;IAEvD,MAAM,EAAE,KAAK,GAAG,MAAM,CAAC,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,GAAG,UAAU,CAAA;IAEvE,MAAM,OAAO,GAAG,MAAM,gBAAgB,CACpC,MAAM,EACN,UAAwC,CACzC,CAAA;IAED,IAAI,OAAO,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE,UAA+B,CAAC,CAAA;QACnE,OAAO;YACL,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,WAAW,EAAE,IAAI,CAAC,KAAK;YACvB,UAAU,EAAE,IAAI,CAAC,SAAS;YAC1B,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,CAAA;IACH,CAAC;IAED,MAAM,qBAAqB,GAAG,CAAC,GAAG,EAAE;QAClC,IAAI,UAAU,CAAC,qBAAqB;YAClC,OAAO,UAAU,CAAC,qBAAqB,CAAA;QACzC,IAAI,KAAK;YACP,OAAQ,WAAuC,CAAC,SAAS,CAAC,cAAc,CACtE,KAAK,CAAC,EAAE,CACT,CAAC,OAAO,CAAA;QACX,OACE,MAAM,CAAC,MAAM,CACV,WAAuC,CAAC,SAAS,CAAC,cAAc,CAEpE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAA;IACd,CAAC,CAAC,EAAE,CAAA;IAEJ,MAAM,WAAW,GAAG,MAAM,YAAY,CAAC,MAAM,EAAE;QAC7C,OAAO,EAAE,qBAAqB;QAC9B,GAAG,EAAE,iBAAiB;QACtB,YAAY,EAAE,uBAAuB;QACrC,IAAI,EAAE,CAAC,aAAa,CAAC;KACtB,CAAC,CAAA;IACF,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,MAAM,EAAE;QACxC,OAAO,EAAE,qBAAqB;QAC9B,GAAG,EAAE,iBAAiB;QACtB,YAAY,EAAE,aAAa;QAC3B,IAAI,EAAE,CAAC,WAAW,CAAC;KACpB,CAAC,CAAA;IAEF,OAAO,EAAE,WAAW,EAAE,GAAG,MAAM,EAAE,CAAA;AACnC,CAAC"}

View File

@@ -0,0 +1,48 @@
import { readContract, } from '../../actions/public/readContract.js';
import { withCache } from '../../utils/promise/withCache.js';
import { portal2Abi } from '../abis.js';
/**
* Retrieves the current version of the Portal contract.
*
* - Docs: https://viem.sh/op-stack/actions/getPortalVersion
*
* @param client - Client to use
* @param parameters - {@link GetPortalVersionParameters}
* @returns The version object.
*
* @example
* import { createPublicClient, http } from 'viem'
* import { mainnet } from 'viem/chains'
* import { getPortalVersion } from 'viem/op-stack'
*
* const publicClientL1 = createPublicClient({
* chain: mainnet,
* transport: http(),
* })
*
* const version = await getPortalVersion(publicClientL1, {
* targetChain: optimism,
* })
*
* if (version.major > 3)
* console.log('Fault proofs are enabled on this version of optimism')
* console.log('Fault proofs are not enabled on this version of optimism')
*/
export async function getPortalVersion(client, parameters) {
const { chain = client.chain, targetChain } = parameters;
const portalAddress = (() => {
if (parameters.portalAddress)
return parameters.portalAddress;
if (chain)
return targetChain.contracts.portal[chain.id].address;
return Object.values(targetChain.contracts.portal)[0].address;
})();
const version = await withCache(() => readContract(client, {
abi: portal2Abi,
address: portalAddress,
functionName: 'version',
}), { cacheKey: ['portalVersion', portalAddress].join('.'), cacheTime: 300 });
const [major, minor, patch] = version.split('.').map(Number);
return { major, minor, patch };
}
//# sourceMappingURL=getPortalVersion.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"getPortalVersion.js","sourceRoot":"","sources":["../../../op-stack/actions/getPortalVersion.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,YAAY,GACb,MAAM,sCAAsC,CAAA;AAS7C,OAAO,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAA;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAkBvC;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAIpC,MAAgC,EAChC,UAA4D;IAE5D,MAAM,EAAE,KAAK,GAAG,MAAM,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,UAAU,CAAA;IAExD,MAAM,aAAa,GAAG,CAAC,GAAG,EAAE;QAC1B,IAAI,UAAU,CAAC,aAAa;YAAE,OAAO,UAAU,CAAC,aAAa,CAAA;QAC7D,IAAI,KAAK;YAAE,OAAO,WAAY,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,OAAO,CAAA;QACjE,OAAO,MAAM,CAAC,MAAM,CAAC,WAAY,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAA;IAChE,CAAC,CAAC,EAAE,CAAA;IAEJ,MAAM,OAAO,GAAG,MAAM,SAAS,CAC7B,GAAG,EAAE,CACH,YAAY,CAAC,MAAM,EAAE;QACnB,GAAG,EAAE,UAAU;QACf,OAAO,EAAE,aAAa;QACtB,YAAY,EAAE,SAAS;KACxB,CAAC,EACJ,EAAE,QAAQ,EAAE,CAAC,eAAe,EAAE,aAAa,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,CACzE,CAAA;IAED,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IAE5D,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAA;AAChC,CAAC"}

View File

@@ -0,0 +1,118 @@
import { multicall, } from '../../actions/public/multicall.js';
import { readContract } from '../../actions/public/readContract.js';
import { BaseError } from '../../errors/base.js';
import { l2OutputOracleAbi, portal2Abi, portalAbi } from '../abis.js';
import { getPortalVersion } from './getPortalVersion.js';
const buffer = 10;
/**
* Returns the time until the withdrawal transaction can be finalized. Used for the [Withdrawal](/op-stack/guides/withdrawals) flow.
*
* - Docs: https://viem.sh/op-stack/actions/getTimeToFinalize
*
* @param client - Client to use
* @param parameters - {@link GetTimeToFinalizeParameters}
* @returns Time until finalize. {@link GetTimeToFinalizeReturnType}
*
* @example
* import { createPublicClient, http } from 'viem'
* import { getBlockNumber } from 'viem/actions'
* import { mainnet, optimism } from 'viem/chains'
* import { getTimeToFinalize } from 'viem/op-stack'
*
* const publicClientL1 = createPublicClient({
* chain: mainnet,
* transport: http(),
* })
* const publicClientL2 = createPublicClient({
* chain: optimism,
* transport: http(),
* })
*
* const receipt = await publicClientL2.getTransactionReceipt({
* hash: '0x9a2f4283636ddeb9ac32382961b22c177c9e86dd3b283735c154f897b1a7ff4a',
* })
*
* const [withdrawal] = getWithdrawals(receipt)
*
* const { seconds } = await getTimeToFinalize(publicClientL1, {
* withdrawalHash: withdrawal.withdrawalHash,
* targetChain: optimism
* })
*/
export async function getTimeToFinalize(client, parameters) {
const { chain = client.chain, withdrawalHash, targetChain } = parameters;
const portalAddress = (() => {
if (parameters.portalAddress)
return parameters.portalAddress;
if (chain)
return targetChain.contracts.portal[chain.id].address;
return Object.values(targetChain.contracts.portal)[0].address;
})();
const portalVersion = await getPortalVersion(client, { portalAddress });
// Legacy
if (portalVersion.major < 3) {
const l2OutputOracleAddress = (() => {
if (parameters.l2OutputOracleAddress)
return parameters.l2OutputOracleAddress;
if (chain)
return targetChain.contracts.l2OutputOracle[chain.id].address;
return Object.values(targetChain.contracts.l2OutputOracle)[0].address;
})();
const [[_outputRoot, proveTimestamp, _l2OutputIndex], period] = await multicall(client, {
allowFailure: false,
contracts: [
{
abi: portalAbi,
address: portalAddress,
functionName: 'provenWithdrawals',
args: [withdrawalHash],
},
{
abi: l2OutputOracleAbi,
address: l2OutputOracleAddress,
functionName: 'FINALIZATION_PERIOD_SECONDS',
},
],
});
const secondsSinceProven = Date.now() / 1000 - Number(proveTimestamp);
const secondsToFinalize = Number(period) - secondsSinceProven;
const seconds = Math.floor(secondsToFinalize < 0 ? 0 : secondsToFinalize + buffer);
const timestamp = Date.now() + seconds * 1000;
return { period: Number(period), seconds, timestamp };
}
const numProofSubmitters = await readContract(client, {
abi: portal2Abi,
address: portalAddress,
functionName: 'numProofSubmitters',
args: [withdrawalHash],
}).catch(() => 1n);
const proofSubmitter = await readContract(client, {
abi: portal2Abi,
address: portalAddress,
functionName: 'proofSubmitters',
args: [withdrawalHash, numProofSubmitters - 1n],
}).catch(() => undefined);
const [[_disputeGameProxy, proveTimestamp], proofMaturityDelaySeconds] = await Promise.all([
proofSubmitter
? readContract(client, {
abi: portal2Abi,
address: portalAddress,
functionName: 'provenWithdrawals',
args: [withdrawalHash, proofSubmitter],
})
: Promise.resolve(['0x', 0n]),
readContract(client, {
abi: portal2Abi,
address: portalAddress,
functionName: 'proofMaturityDelaySeconds',
}),
]);
if (proveTimestamp === 0n)
throw new BaseError('Withdrawal has not been proven on L1.');
const secondsSinceProven = Date.now() / 1000 - Number(proveTimestamp);
const secondsToFinalize = Number(proofMaturityDelaySeconds) - secondsSinceProven;
const seconds = Math.floor(secondsToFinalize < 0n ? 0 : secondsToFinalize + buffer);
const timestamp = Date.now() + seconds * 1000;
return { period: Number(proofMaturityDelaySeconds), seconds, timestamp };
}
//# sourceMappingURL=getTimeToFinalize.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"getTimeToFinalize.js","sourceRoot":"","sources":["../../../op-stack/actions/getTimeToFinalize.ts"],"names":[],"mappings":"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"}

View File

@@ -0,0 +1,81 @@
import { getGames } from './getGames.js';
/**
* Returns the time until the next L2 dispute game (after the provided block number) is submitted.
* Used for the [Withdrawal](/op-stack/guides/withdrawals) flow.
*
* - Docs: https://viem.sh/op-stack/actions/getTimeToNextGame
*
* @param client - Client to use
* @param parameters - {@link GetTimeToNextGameParameters}
* @returns The L2 transaction hash. {@link GetTimeToNextGameReturnType}
*
* @example
* import { createPublicClient, http } from 'viem'
* import { getBlockNumber } from 'viem/actions'
* import { mainnet, optimism } from 'viem/chains'
* import { getTimeToNextGame } from 'viem/op-stack'
*
* const publicClientL1 = createPublicClient({
* chain: mainnet,
* transport: http(),
* })
*
* const { seconds } = await getTimeToNextGame(publicClientL1, {
* l2BlockNumber: 113405763n,
* targetChain: optimism
* })
*/
export async function getTimeToNextGame(client, parameters) {
const { intervalBuffer = 1.1, l2BlockNumber } = parameters;
const games = await getGames(client, {
...parameters,
l2BlockNumber: undefined,
limit: 10,
});
if (games.length === 0) {
return { interval: 0, seconds: 0, timestamp: undefined };
}
const deltas = games
.map(({ l2BlockNumber, timestamp }, index) => {
return index === games.length - 1
? null
: [
games[index + 1].timestamp - timestamp,
games[index + 1].l2BlockNumber - l2BlockNumber,
];
})
.filter(Boolean);
const interval = deltas.length > 0
? Math.ceil(deltas.reduce((a, [b]) => Number(a) - Number(b), 0) / deltas.length)
: 0;
const blockInterval = deltas.length > 0
? Math.ceil(deltas.reduce((a, [_, b]) => Number(a) - Number(b), 0) / deltas.length)
: 0;
const latestGame = games[0];
const latestGameTimestamp = Number(latestGame.timestamp) * 1000;
const intervalWithBuffer = Math.ceil(interval * intervalBuffer);
const now = Date.now();
const seconds = (() => {
// If the current timestamp is lesser than the latest dispute game timestamp,
// then we assume that the dispute game has already been submitted.
if (now < latestGameTimestamp)
return 0;
// If the latest dispute game block is newer than the provided dispute game block number,
// then we assume that the dispute game has already been submitted.
if (latestGame.l2BlockNumber > l2BlockNumber)
return 0;
// If there is only a single game, no interval data
if (intervalWithBuffer === 0)
return 0;
const elapsedBlocks = Number(l2BlockNumber - latestGame.l2BlockNumber);
const elapsed = Math.ceil((now - latestGameTimestamp) / 1000);
const secondsToNextOutput = intervalWithBuffer - (elapsed % intervalWithBuffer);
return elapsedBlocks < blockInterval
? secondsToNextOutput
: Math.floor(elapsedBlocks / Number(blockInterval)) * intervalWithBuffer +
secondsToNextOutput;
})();
const timestamp = seconds > 0 ? now + seconds * 1000 : undefined;
return { interval, seconds, timestamp };
}
//# sourceMappingURL=getTimeToNextGame.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"getTimeToNextGame.js","sourceRoot":"","sources":["../../../op-stack/actions/getTimeToNextGame.ts"],"names":[],"mappings":"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"}

View File

@@ -0,0 +1,91 @@
import { multicall, } from '../../actions/public/multicall.js';
import { readContract, } from '../../actions/public/readContract.js';
import { l2OutputOracleAbi } from '../abis.js';
/**
* Returns the time until the next L2 output (after the provided block number) is submitted. Used for the [Withdrawal](/op-stack/guides/withdrawals) flow.
*
* - Docs: https://viem.sh/op-stack/actions/getTimeToNextL2Output
*
* @param client - Client to use
* @param parameters - {@link GetTimeToNextL2OutputParameters}
* @returns The L2 transaction hash. {@link GetTimeToNextL2OutputReturnType}
*
* @example
* import { createPublicClient, http } from 'viem'
* import { getBlockNumber } from 'viem/actions'
* import { mainnet, optimism } from 'viem/chains'
* import { getTimeToNextL2Output } from 'viem/op-stack'
*
* const publicClientL1 = createPublicClient({
* chain: mainnet,
* transport: http(),
* })
* const publicClientL2 = createPublicClient({
* chain: optimism,
* transport: http(),
* })
*
* const { seconds } = await getTimeToNextL2Output(publicClientL1, {
* targetChain: optimism
* })
*/
export async function getTimeToNextL2Output(client, parameters) {
const { intervalBuffer = 1.1, chain = client.chain, l2BlockNumber, targetChain, } = parameters;
const l2OutputOracleAddress = (() => {
if (parameters.l2OutputOracleAddress)
return parameters.l2OutputOracleAddress;
if (chain)
return targetChain.contracts.l2OutputOracle[chain.id].address;
return Object.values(targetChain.contracts.l2OutputOracle)[0].address;
})();
const [latestOutputIndex, blockTime, blockInterval] = await multicall(client, {
allowFailure: false,
contracts: [
{
abi: l2OutputOracleAbi,
address: l2OutputOracleAddress,
functionName: 'latestOutputIndex',
},
{
abi: l2OutputOracleAbi,
address: l2OutputOracleAddress,
functionName: 'L2_BLOCK_TIME',
},
{
abi: l2OutputOracleAbi,
address: l2OutputOracleAddress,
functionName: 'SUBMISSION_INTERVAL',
},
],
});
const latestOutput = await readContract(client, {
abi: l2OutputOracleAbi,
address: l2OutputOracleAddress,
functionName: 'getL2Output',
args: [latestOutputIndex],
});
const latestOutputTimestamp = Number(latestOutput.timestamp) * 1000;
const interval = Number(blockInterval * blockTime);
const intervalWithBuffer = Math.ceil(interval * intervalBuffer);
const now = Date.now();
const seconds = (() => {
// If the current timestamp is lesser than the latest L2 output timestamp,
// then we assume that the L2 output has already been submitted.
if (now < latestOutputTimestamp)
return 0;
// If the latest L2 output block is newer than the provided L2 block number,
// then we assume that the L2 output has already been submitted.
if (latestOutput.l2BlockNumber > l2BlockNumber)
return 0;
const elapsedBlocks = Number(l2BlockNumber - latestOutput.l2BlockNumber);
const elapsed = Math.ceil((now - latestOutputTimestamp) / 1000);
const secondsToNextOutput = intervalWithBuffer - (elapsed % intervalWithBuffer);
return elapsedBlocks < blockInterval
? secondsToNextOutput
: Math.floor(elapsedBlocks / Number(blockInterval)) * intervalWithBuffer +
secondsToNextOutput;
})();
const timestamp = seconds > 0 ? now + seconds * 1000 : undefined;
return { interval, seconds, timestamp };
}
//# sourceMappingURL=getTimeToNextL2Output.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"getTimeToNextL2Output.js","sourceRoot":"","sources":["../../../op-stack/actions/getTimeToNextL2Output.ts"],"names":[],"mappings":"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"}

View File

@@ -0,0 +1,48 @@
import { getPortalVersion, } from './getPortalVersion.js';
import { getTimeToNextGame, } from './getTimeToNextGame.js';
import { getTimeToNextL2Output, } from './getTimeToNextL2Output.js';
/**
* Returns the time until the withdrawal transaction is ready to prove. Used for the [Withdrawal](/op-stack/guides/withdrawals) flow.
*
* - Docs: https://viem.sh/op-stack/actions/getTimeToProve
*
* @param client - Client to use
* @param parameters - {@link GetTimeToNextL2OutputParameters}
* @returns Time until prove step is ready. {@link GetTimeToNextL2OutputReturnType}
*
* @example
* import { createPublicClient, http } from 'viem'
* import { getBlockNumber } from 'viem/actions'
* import { mainnet, optimism } from 'viem/chains'
* import { getTimeToProve } from 'viem/op-stack'
*
* const publicClientL1 = createPublicClient({
* chain: mainnet,
* transport: http(),
* })
* const publicClientL2 = createPublicClient({
* chain: optimism,
* transport: http(),
* })
*
* const receipt = await publicClientL2.getTransactionReceipt({ hash: '0x...' })
* const { period, seconds, timestamp } = await getTimeToProve(publicClientL1, {
* receipt,
* targetChain: optimism
* })
*/
export async function getTimeToProve(client, parameters) {
const { receipt } = parameters;
const portalVersion = await getPortalVersion(client, parameters);
// Legacy
if (portalVersion.major < 3)
return getTimeToNextL2Output(client, {
...parameters,
l2BlockNumber: receipt.blockNumber,
});
return getTimeToNextGame(client, {
...parameters,
l2BlockNumber: receipt.blockNumber,
});
}
//# sourceMappingURL=getTimeToProve.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"getTimeToProve.js","sourceRoot":"","sources":["../../../op-stack/actions/getTimeToProve.ts"],"names":[],"mappings":"AAYA,OAAO,EAGL,gBAAgB,GACjB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAIL,iBAAiB,GAClB,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAIL,qBAAqB,GACtB,MAAM,4BAA4B,CAAA;AAkCnC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAKlC,MAAyC,EACzC,UAA0D;IAE1D,MAAM,EAAE,OAAO,EAAE,GAAG,UAAU,CAAA;IAE9B,MAAM,aAAa,GAAG,MAAM,gBAAgB,CAC1C,MAAM,EACN,UAAwC,CACzC,CAAA;IAED,SAAS;IACT,IAAI,aAAa,CAAC,KAAK,GAAG,CAAC;QACzB,OAAO,qBAAqB,CAAC,MAAM,EAAE;YACnC,GAAG,UAAU;YACb,aAAa,EAAE,OAAO,CAAC,WAAW;SACA,CAAC,CAAA;IAEvC,OAAO,iBAAiB,CAAC,MAAM,EAAE;QAC/B,GAAG,UAAU;QACb,aAAa,EAAE,OAAO,CAAC,WAAW;KACJ,CAAC,CAAA;AACnC,CAAC"}

View File

@@ -0,0 +1,268 @@
import { readContract, } from '../../actions/public/readContract.js';
import { ContractFunctionRevertedError } from '../../errors/contract.js';
import { anchorStateRegistryAbi, portal2Abi, portalAbi } from '../abis.js';
import { ReceiptContainsNoWithdrawalsError, } from '../errors/withdrawal.js';
import { getWithdrawals, } from '../utils/getWithdrawals.js';
import { getGame, } from './getGame.js';
import { getL2Output, } from './getL2Output.js';
import { getPortalVersion, } from './getPortalVersion.js';
import { getTimeToFinalize, } from './getTimeToFinalize.js';
/**
* Returns the current status of a withdrawal. Used for the [Withdrawal](/op-stack/guides/withdrawals) flow.
*
* - Docs: https://viem.sh/op-stack/actions/getWithdrawalStatus
*
* @param client - Client to use
* @param parameters - {@link GetWithdrawalStatusParameters}
* @returns Status of the withdrawal. {@link GetWithdrawalStatusReturnType}
*
* @example
* import { createPublicClient, http } from 'viem'
* import { getBlockNumber } from 'viem/actions'
* import { mainnet, optimism } from 'viem/chains'
* import { getWithdrawalStatus } from 'viem/op-stack'
*
* const publicClientL1 = createPublicClient({
* chain: mainnet,
* transport: http(),
* })
* const publicClientL2 = createPublicClient({
* chain: optimism,
* transport: http(),
* })
*
* const receipt = await publicClientL2.getTransactionReceipt({ hash: '0x...' })
* const status = await getWithdrawalStatus(publicClientL1, {
* receipt,
* targetChain: optimism
* })
*/
export async function getWithdrawalStatus(client, parameters) {
const { chain = client.chain, gameLimit = 100, receipt, targetChain: targetChain_, logIndex = 0, } = parameters;
const targetChain = targetChain_;
const portalAddress = (() => {
if (parameters.portalAddress)
return parameters.portalAddress;
if (chain)
return targetChain.contracts.portal[chain.id].address;
return Object.values(targetChain.contracts.portal)[0].address;
})();
const l2BlockNumber = receipt?.blockNumber ?? parameters.l2BlockNumber;
const withdrawal = (() => {
if (receipt) {
const withdrawal = getWithdrawals({ logs: receipt.logs })[logIndex];
if (!withdrawal)
throw new ReceiptContainsNoWithdrawalsError({
hash: receipt.transactionHash,
});
return withdrawal;
}
return {
sender: parameters.sender,
withdrawalHash: parameters.withdrawalHash,
};
})();
const portalVersion = await getPortalVersion(client, parameters);
// Legacy (Portal < v3)
if (portalVersion.major < 3) {
const [outputResult, proveResult, finalizedResult, timeToFinalizeResult] = await Promise.allSettled([
getL2Output(client, {
...parameters,
l2BlockNumber,
}),
readContract(client, {
abi: portalAbi,
address: portalAddress,
functionName: 'provenWithdrawals',
args: [withdrawal.withdrawalHash],
}),
readContract(client, {
abi: portalAbi,
address: portalAddress,
functionName: 'finalizedWithdrawals',
args: [withdrawal.withdrawalHash],
}),
getTimeToFinalize(client, {
...parameters,
withdrawalHash: withdrawal.withdrawalHash,
}),
]);
// If the L2 Output is not processed yet (ie. the actions throws), this means
// that the withdrawal is not ready to prove.
if (outputResult.status === 'rejected') {
const error = outputResult.reason;
if (error.cause instanceof ContractFunctionRevertedError &&
error.cause.data?.args?.[0] ===
'L2OutputOracle: cannot get output for a block that has not been proposed')
return 'waiting-to-prove';
throw error;
}
if (proveResult.status === 'rejected')
throw proveResult.reason;
if (finalizedResult.status === 'rejected')
throw finalizedResult.reason;
if (timeToFinalizeResult.status === 'rejected')
throw timeToFinalizeResult.reason;
const [_, proveTimestamp] = proveResult.value;
if (!proveTimestamp)
return 'ready-to-prove';
const finalized = finalizedResult.value;
if (finalized)
return 'finalized';
const { seconds } = timeToFinalizeResult.value;
return seconds > 0 ? 'waiting-to-finalize' : 'ready-to-finalize';
}
const numProofSubmitters = await readContract(client, {
abi: portal2Abi,
address: portalAddress,
functionName: 'numProofSubmitters',
args: [withdrawal.withdrawalHash],
}).catch(() => 1n);
const proofSubmitter = await readContract(client, {
abi: portal2Abi,
address: portalAddress,
functionName: 'proofSubmitters',
args: [withdrawal.withdrawalHash, numProofSubmitters - 1n],
}).catch(() => withdrawal.sender);
const [disputeGameResult, provenWithdrawalsResult, checkWithdrawalResult, finalizedResult,] = await Promise.allSettled([
getGame(client, {
...parameters,
l2BlockNumber,
limit: gameLimit,
}),
readContract(client, {
abi: portal2Abi,
address: portalAddress,
functionName: 'provenWithdrawals',
args: [withdrawal.withdrawalHash, proofSubmitter],
}),
readContract(client, {
abi: portal2Abi,
address: portalAddress,
functionName: 'checkWithdrawal',
args: [withdrawal.withdrawalHash, proofSubmitter],
}),
readContract(client, {
abi: portal2Abi,
address: portalAddress,
functionName: 'finalizedWithdrawals',
args: [withdrawal.withdrawalHash],
}),
]);
if (finalizedResult.status === 'fulfilled' && finalizedResult.value)
return 'finalized';
if (provenWithdrawalsResult.status === 'rejected')
throw provenWithdrawalsResult.reason;
if (disputeGameResult.status === 'rejected') {
const error = disputeGameResult.reason;
if (error.name === 'GameNotFoundError')
return 'waiting-to-prove';
throw disputeGameResult.reason;
}
if (checkWithdrawalResult.status === 'rejected') {
const error = checkWithdrawalResult.reason;
if (error.cause instanceof ContractFunctionRevertedError) {
// All potential error causes listed here, can either be the error string or the error name
// if custom error types are returned.
const errorCauses = {
'ready-to-prove': [
'OptimismPortal: invalid game type',
'OptimismPortal: withdrawal has not been proven yet',
'OptimismPortal: withdrawal has not been proven by proof submitter address yet',
'OptimismPortal: dispute game created before respected game type was updated',
'InvalidGameType',
'LegacyGame',
'Unproven',
// After U16
'OptimismPortal_Unproven',
'OptimismPortal_InvalidProofTimestamp',
],
'waiting-to-finalize': [
'OptimismPortal: proven withdrawal has not matured yet',
'OptimismPortal: output proposal has not been finalized yet',
'OptimismPortal: output proposal in air-gap',
],
};
// Pick out the error message and/or error name
// Return the status based on the error
const errors = [
error.cause.data?.errorName,
error.cause.data?.args?.[0],
];
// After U16 we get a generic error message (OptimismPortal_InvalidRootClaim) because the
// OptimismPortal will call AnchorStateRegistry.isGameClaimValid which simply returns
// true/false. If we get this generic error, we need to figure out why the function returned
// false and return a proper status accordingly. We can also check these conditions when we
// get ProofNotOldEnough so users can be notified when their pending proof becomes invalid
// before it can be finalized.
if (errors.includes('OptimismPortal_InvalidRootClaim') ||
errors.includes('OptimismPortal_ProofNotOldEnough')) {
// Get the dispute game address from the proven withdrawal.
const disputeGameAddress = provenWithdrawalsResult.value[0];
// Get the AnchorStateRegistry address from the portal.
const anchorStateRegistry = await readContract(client, {
abi: portal2Abi,
address: portalAddress,
functionName: 'anchorStateRegistry',
});
// Check if the game is proper, respected, and finalized.
const [isGameProperResult, isGameRespectedResult, isGameFinalizedResult,] = await Promise.allSettled([
readContract(client, {
abi: anchorStateRegistryAbi,
address: anchorStateRegistry,
functionName: 'isGameProper',
args: [disputeGameAddress],
}),
readContract(client, {
abi: anchorStateRegistryAbi,
address: anchorStateRegistry,
functionName: 'isGameRespected',
args: [disputeGameAddress],
}),
readContract(client, {
abi: anchorStateRegistryAbi,
address: anchorStateRegistry,
functionName: 'isGameFinalized',
args: [disputeGameAddress],
}),
]);
// If any of the calls failed, throw the error.
if (isGameProperResult.status === 'rejected')
throw isGameProperResult.reason;
if (isGameRespectedResult.status === 'rejected')
throw isGameRespectedResult.reason;
if (isGameFinalizedResult.status === 'rejected')
throw isGameFinalizedResult.reason;
// If the game isn't proper, the user needs to re-prove.
if (!isGameProperResult.value) {
return 'ready-to-prove';
}
// If the game isn't respected, the user needs to re-prove.
if (!isGameRespectedResult.value) {
return 'ready-to-prove';
}
// If the game isn't finalized, the user needs to wait to finalize.
if (!isGameFinalizedResult.value) {
return 'waiting-to-finalize';
}
// If the actual error was ProofNotOldEnough, then at this point the game is probably
// completely fine but the proof hasn't passed the waiting period. Otherwise, the only
// reason we'd be here is if the game resolved in favor of the challenger, which means the
// user needs to re-prove the withdrawal.
if (errors.includes('OptimismPortal_ProofNotOldEnough')) {
return 'waiting-to-finalize';
}
return 'ready-to-prove';
}
if (errorCauses['ready-to-prove'].some((cause) => errors.includes(cause)))
return 'ready-to-prove';
if (errorCauses['waiting-to-finalize'].some((cause) => errors.includes(cause)))
return 'waiting-to-finalize';
}
throw checkWithdrawalResult.reason;
}
if (finalizedResult.status === 'rejected')
throw finalizedResult.reason;
return 'ready-to-finalize';
}
//# sourceMappingURL=getWithdrawalStatus.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,72 @@
import { writeContract, } from '../../actions/wallet/writeContract.js';
import { l2ToL1MessagePasserAbi } from '../abis.js';
import { contracts } from '../contracts.js';
/**
* Initiates a [withdrawal](https://community.optimism.io/docs/protocol/withdrawal-flow/#withdrawal-initiating-transaction) on an L2 to the L1.
*
* Internally performs a contract write to the [`initiateWithdrawal` function](https://github.com/ethereum-optimism/optimism/blob/283f0aa2e3358ced30ff7cbd4028c0c0c3faa140/packages/contracts-bedrock/src/L2/L2ToL1MessagePasser.sol#L73)
* on the [Optimism L2ToL1MessagePasser predeploy contract](https://github.com/ethereum-optimism/optimism/blob/283f0aa2e3358ced30ff7cbd4028c0c0c3faa140/packages/contracts-bedrock/src/L2/L2ToL1MessagePasser.sol).
*
* - Docs: https://viem.sh/op-stack/actions/initiateWithdrawal
*
* @param client - Client to use
* @param parameters - {@link InitiateWithdrawalParameters}
* @returns The L2 transaction hash. {@link InitiateWithdrawalReturnType}
*
* @example
* import { createWalletClient, custom, parseEther } from 'viem'
* import { base, mainnet } from 'viem/chains'
* import { initiateWithdrawal } from 'viem/op-stack'
*
* const client = createWalletClient({
* chain: mainnet,
* transport: custom(window.ethereum),
* })
*
* const hash = await initiateWithdrawal(client, {
* account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',
* args: {
* gas: 21_000n,
* to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
* value: parseEther('1'),
* },
* })
*
* @example
* // Account Hoisting
* import { createWalletClient, http } from 'viem'
* import { privateKeyToAccount } from 'viem/accounts'
* import { base, mainnet } from 'viem/chains'
* import { initiateWithdrawal } from 'viem/op-stack'
*
* const client = createWalletClient({
* account: privateKeyToAccount('0x…'),
* chain: mainnet,
* transport: http(),
* })
*
* const hash = await initiateWithdrawal(client, {
* request: {
* gas: 21_000n,
* to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
* value: parseEther('1'),
* },
* })
*/
export async function initiateWithdrawal(client, parameters) {
const { account, chain = client.chain, gas, maxFeePerGas, maxPriorityFeePerGas, nonce, request: { data = '0x', gas: l1Gas, to, value }, } = parameters;
return writeContract(client, {
account: account,
abi: l2ToL1MessagePasserAbi,
address: contracts.l2ToL1MessagePasser.address,
chain,
functionName: 'initiateWithdrawal',
args: [to, l1Gas, data],
gas: gas ?? undefined,
maxFeePerGas,
maxPriorityFeePerGas,
nonce,
value,
});
}
//# sourceMappingURL=initiateWithdrawal.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"initiateWithdrawal.js","sourceRoot":"","sources":["../../../op-stack/actions/initiateWithdrawal.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,aAAa,GACd,MAAM,uCAAuC,CAAA;AAa9C,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAA;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAsC3C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmDG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAKtC,MAAyC,EACzC,UAAuE;IAEvE,MAAM,EACJ,OAAO,EACP,KAAK,GAAG,MAAM,CAAC,KAAK,EACpB,GAAG,EACH,YAAY,EACZ,oBAAoB,EACpB,KAAK,EACL,OAAO,EAAE,EAAE,IAAI,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,GAChD,GAAG,UAAU,CAAA;IAEd,OAAO,aAAa,CAAC,MAAM,EAAE;QAC3B,OAAO,EAAE,OAAQ;QACjB,GAAG,EAAE,sBAAsB;QAC3B,OAAO,EAAE,SAAS,CAAC,mBAAmB,CAAC,OAAO;QAC9C,KAAK;QACL,YAAY,EAAE,oBAAoB;QAClC,IAAI,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC;QACvB,GAAG,EAAE,GAAG,IAAI,SAAS;QACrB,YAAY;QACZ,oBAAoB;QACpB,KAAK;QACL,KAAK;KACmC,CAAC,CAAA;AAC7C,CAAC"}

View File

@@ -0,0 +1,53 @@
import { writeContract, } from '../../actions/wallet/writeContract.js';
import { portal2Abi } from '../abis.js';
/**
* Proves a withdrawal that occurred on an L2. Used in the Withdrawal flow.
*
* - Docs: https://viem.sh/op-stack/actions/proveWithdrawal
*
* @param client - Client to use
* @param parameters - {@link ProveWithdrawalParameters}
* @returns The prove transaction hash. {@link ProveWithdrawalReturnType}
*
* @example
* import { createWalletClient, http } from 'viem'
* import { mainnet, optimism } from 'viem/chains'
* import { proveWithdrawal } from 'viem/op-stack'
*
* const walletClientL1 = createWalletClient({
* chain: mainnet,
* transport: http(),
* })
*
* const request = await proveWithdrawal(walletClientL1, {
* account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',
* l2OutputIndex: 4529n,
* outputRootProof: { ... },
* targetChain: optimism,
* withdrawalProof: [ ... ],
* withdrawal: { ... },
* })
*/
export async function proveWithdrawal(client, parameters) {
const { account, chain = client.chain, gas, l2OutputIndex, maxFeePerGas, maxPriorityFeePerGas, nonce, outputRootProof, targetChain, withdrawalProof, withdrawal, } = parameters;
const portalAddress = (() => {
if (parameters.portalAddress)
return parameters.portalAddress;
if (chain)
return targetChain.contracts.portal[chain.id].address;
return Object.values(targetChain.contracts.portal)[0].address;
})();
return writeContract(client, {
account: account,
abi: portal2Abi,
address: portalAddress,
chain,
functionName: 'proveWithdrawalTransaction',
args: [withdrawal, l2OutputIndex, outputRootProof, withdrawalProof],
gas: gas ?? undefined,
maxFeePerGas,
maxPriorityFeePerGas,
nonce,
});
}
//# sourceMappingURL=proveWithdrawal.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"proveWithdrawal.js","sourceRoot":"","sources":["../../../op-stack/actions/proveWithdrawal.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,aAAa,GACd,MAAM,uCAAuC,CAAA;AAa9C,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAuDvC;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAKnC,MAAyC,EACzC,UAAoE;IAEpE,MAAM,EACJ,OAAO,EACP,KAAK,GAAG,MAAM,CAAC,KAAK,EACpB,GAAG,EACH,aAAa,EACb,YAAY,EACZ,oBAAoB,EACpB,KAAK,EACL,eAAe,EACf,WAAW,EACX,eAAe,EACf,UAAU,GACX,GAAG,UAAU,CAAA;IAEd,MAAM,aAAa,GAAG,CAAC,GAAG,EAAE;QAC1B,IAAI,UAAU,CAAC,aAAa;YAAE,OAAO,UAAU,CAAC,aAAa,CAAA;QAC7D,IAAI,KAAK;YAAE,OAAO,WAAY,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,OAAO,CAAA;QACjE,OAAO,MAAM,CAAC,MAAM,CAAC,WAAY,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAA;IAChE,CAAC,CAAC,EAAE,CAAA;IAEJ,OAAO,aAAa,CAAC,MAAM,EAAE;QAC3B,OAAO,EAAE,OAAQ;QACjB,GAAG,EAAE,UAAU;QACf,OAAO,EAAE,aAAa;QACtB,KAAK;QACL,YAAY,EAAE,4BAA4B;QAC1C,IAAI,EAAE,CAAC,UAAU,EAAE,aAAa,EAAE,eAAe,EAAE,eAAe,CAAC;QACnE,GAAG,EAAE,GAAG,IAAI,SAAS;QACrB,YAAY;QACZ,oBAAoB;QACpB,KAAK;KACmC,CAAC,CAAA;AAC7C,CAAC"}

View File

@@ -0,0 +1,61 @@
import { poll } from '../../utils/poll.js';
import { GameNotFoundError } from '../errors/withdrawal.js';
import { getGame, } from './getGame.js';
import { getTimeToNextGame, } from './getTimeToNextGame.js';
/**
* Waits for the next dispute game (after the provided block number) to be submitted.
*
* - Docs: https://viem.sh/op-stack/actions/waitForNextGame
*
* @param client - Client to use
* @param parameters - {@link WaitForNextGameParameters}
* @returns The L2 transaction hash. {@link WaitForNextGameReturnType}
*
* @example
* import { createPublicClient, http } from 'viem'
* import { getBlockNumber } from 'viem/actions'
* import { mainnet, optimism } from 'viem/chains'
* import { waitForNextGame } from 'viem/op-stack'
*
* const publicClientL1 = createPublicClient({
* chain: mainnet,
* transport: http(),
* })
* const publicClientL2 = createPublicClient({
* chain: optimism,
* transport: http(),
* })
*
* const l2BlockNumber = await getBlockNumber(publicClientL2)
* await waitForNextGame(publicClientL1, {
* l2BlockNumber,
* targetChain: optimism
* })
*/
export async function waitForNextGame(client, parameters) {
const { pollingInterval = client.pollingInterval } = parameters;
const { seconds } = await getTimeToNextGame(client, parameters);
return new Promise((resolve, reject) => {
poll(async ({ unpoll }) => {
try {
const game = await getGame(client, {
...parameters,
strategy: 'random',
});
unpoll();
resolve(game);
}
catch (e) {
const error = e;
if (!(error instanceof GameNotFoundError)) {
unpoll();
reject(e);
}
}
}, {
interval: pollingInterval,
initialWaitTime: async () => seconds * 1000,
});
});
}
//# sourceMappingURL=waitForNextGame.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"waitForNextGame.js","sourceRoot":"","sources":["../../../op-stack/actions/waitForNextGame.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAE3D,OAAO,EAGL,OAAO,GACR,MAAM,cAAc,CAAA;AACrB,OAAO,EAGL,iBAAiB,GAClB,MAAM,wBAAwB,CAAA;AAkC/B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAKnC,MAAyC,EACzC,UAA2D;IAE3D,MAAM,EAAE,eAAe,GAAG,MAAM,CAAC,eAAe,EAAE,GAAG,UAAU,CAAA;IAE/D,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,iBAAiB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;IAE/D,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,IAAI,CACF,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;YACnB,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE;oBACjC,GAAG,UAAU;oBACb,QAAQ,EAAE,QAAQ;iBACnB,CAAC,CAAA;gBACF,MAAM,EAAE,CAAA;gBACR,OAAO,CAAC,IAAI,CAAC,CAAA;YACf,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,MAAM,KAAK,GAAG,CAAqB,CAAA;gBACnC,IAAI,CAAC,CAAC,KAAK,YAAY,iBAAiB,CAAC,EAAE,CAAC;oBAC1C,MAAM,EAAE,CAAA;oBACR,MAAM,CAAC,CAAC,CAAC,CAAA;gBACX,CAAC;YACH,CAAC;QACH,CAAC,EACD;YACE,QAAQ,EAAE,eAAe;YACzB,eAAe,EAAE,KAAK,IAAI,EAAE,CAAC,OAAO,GAAG,IAAI;SAC5C,CACF,CAAA;IACH,CAAC,CAAC,CAAA;AACJ,CAAC"}

View File

@@ -0,0 +1,58 @@
import { ContractFunctionRevertedError } from '../../errors/contract.js';
import { poll } from '../../utils/poll.js';
import { getL2Output, } from './getL2Output.js';
import { getTimeToNextL2Output, } from './getTimeToNextL2Output.js';
/**
* Waits for the next L2 output (after the provided block number) to be submitted.
*
* - Docs: https://viem.sh/op-stack/actions/waitForNextL2Output
*
* @param client - Client to use
* @param parameters - {@link WaitForNextL2OutputParameters}
* @returns The L2 transaction hash. {@link WaitForNextL2OutputReturnType}
*
* @example
* import { createPublicClient, http } from 'viem'
* import { getBlockNumber } from 'viem/actions'
* import { mainnet, optimism } from 'viem/chains'
* import { waitForNextL2Output } from 'viem/op-stack'
*
* const publicClientL1 = createPublicClient({
* chain: mainnet,
* transport: http(),
* })
* const publicClientL2 = createPublicClient({
* chain: optimism,
* transport: http(),
* })
*
* const l2BlockNumber = await getBlockNumber(publicClientL2)
* await waitForNextL2Output(publicClientL1, {
* l2BlockNumber,
* targetChain: optimism
* })
*/
export async function waitForNextL2Output(client, parameters) {
const { pollingInterval = client.pollingInterval } = parameters;
const { seconds } = await getTimeToNextL2Output(client, parameters);
return new Promise((resolve, reject) => {
poll(async ({ unpoll }) => {
try {
const output = await getL2Output(client, parameters);
unpoll();
resolve(output);
}
catch (e) {
const error = e;
if (!(error.cause instanceof ContractFunctionRevertedError)) {
unpoll();
reject(e);
}
}
}, {
interval: pollingInterval,
initialWaitTime: async () => seconds * 1000,
});
});
}
//# sourceMappingURL=waitForNextL2Output.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"waitForNextL2Output.js","sourceRoot":"","sources":["../../../op-stack/actions/waitForNextL2Output.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,6BAA6B,EAAE,MAAM,0BAA0B,CAAA;AAQxE,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAE1C,OAAO,EAIL,WAAW,GACZ,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAGL,qBAAqB,GACtB,MAAM,4BAA4B,CAAA;AA4BnC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAKvC,MAAyC,EACzC,UAA+D;IAE/D,MAAM,EAAE,eAAe,GAAG,MAAM,CAAC,eAAe,EAAE,GAAG,UAAU,CAAA;IAE/D,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,qBAAqB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;IAEnE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,IAAI,CACF,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;YACnB,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,WAAW,CAC9B,MAAM,EACN,UAAmC,CACpC,CAAA;gBACD,MAAM,EAAE,CAAA;gBACR,OAAO,CAAC,MAAM,CAAC,CAAA;YACjB,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,MAAM,KAAK,GAAG,CAAyB,CAAA;gBACvC,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,YAAY,6BAA6B,CAAC,EAAE,CAAC;oBAC5D,MAAM,EAAE,CAAA;oBACR,MAAM,CAAC,CAAC,CAAC,CAAA;gBACX,CAAC;YACH,CAAC;QACH,CAAC,EACD;YACE,QAAQ,EAAE,eAAe;YACzB,eAAe,EAAE,KAAK,IAAI,EAAE,CAAC,OAAO,GAAG,IAAI;SAC5C,CACF,CAAA;IACH,CAAC,CAAC,CAAA;AACJ,CAAC"}

View File

@@ -0,0 +1,41 @@
import { wait } from '../../utils/wait.js';
import { getTimeToFinalize, } from './getTimeToFinalize.js';
/**
* Waits until the withdrawal transaction can be finalized. Used for the [Withdrawal](/op-stack/guides/withdrawals) flow.
*
* - Docs: https://viem.sh/op-stack/actions/waitToFinalize
*
* @param client - Client to use
* @param parameters - {@link WaitToFinalizeParameters}
*
* @example
* import { createPublicClient, http } from 'viem'
* import { getBlockNumber } from 'viem/actions'
* import { mainnet, optimism } from 'viem/chains'
* import { waitToFinalize } from 'viem/op-stack'
*
* const publicClientL1 = createPublicClient({
* chain: mainnet,
* transport: http(),
* })
* const publicClientL2 = createPublicClient({
* chain: optimism,
* transport: http(),
* })
*
* const receipt = await publicClientL2.getTransactionReceipt({
* hash: '0x9a2f4283636ddeb9ac32382961b22c177c9e86dd3b283735c154f897b1a7ff4a',
* })
*
* const [withdrawal] = getWithdrawals(receipt)
*
* await waitToFinalize(publicClientL1, {
* withdrawalHash: withdrawal.withdrawalHash,
* targetChain: optimism
* })
*/
export async function waitToFinalize(client, parameters) {
const { seconds } = await getTimeToFinalize(client, parameters);
await wait(seconds * 1000);
}
//# sourceMappingURL=waitToFinalize.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"waitToFinalize.js","sourceRoot":"","sources":["../../../op-stack/actions/waitToFinalize.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAC1C,OAAO,EAGL,iBAAiB,GAClB,MAAM,wBAAwB,CAAA;AAS/B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAKlC,MAAyC,EACzC,UAA0D;IAE1D,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,iBAAiB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;IAC/D,MAAM,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,CAAA;AAC5B,CAAC"}

79
node_modules/viem/_esm/op-stack/actions/waitToProve.js generated vendored Normal file
View File

@@ -0,0 +1,79 @@
import { ReceiptContainsNoWithdrawalsError } from '../errors/withdrawal.js';
import { getWithdrawals, } from '../utils/getWithdrawals.js';
import { getPortalVersion, } from './getPortalVersion.js';
import { waitForNextGame, } from './waitForNextGame.js';
import { waitForNextL2Output, } from './waitForNextL2Output.js';
/**
* Waits until the L2 withdrawal transaction is ready to be proved. Used for the [Withdrawal](/op-stack/guides/withdrawals) flow.
*
* - Docs: https://viem.sh/op-stack/actions/waitToProve
*
* @param client - Client to use
* @param parameters - {@link WaitToProveParameters}
* @returns The L2 output and withdrawal message. {@link WaitToProveReturnType}
*
* @example
* import { createPublicClient, http } from 'viem'
* import { getBlockNumber } from 'viem/actions'
* import { mainnet, optimism } from 'viem/chains'
* import { waitToProve } from 'viem/op-stack'
*
* const publicClientL1 = createPublicClient({
* chain: mainnet,
* transport: http(),
* })
* const publicClientL2 = createPublicClient({
* chain: optimism,
* transport: http(),
* })
*
* const receipt = await publicClientL2.getTransactionReceipt({ hash: '0x...' })
* await waitToProve(publicClientL1, {
* receipt,
* targetChain: optimism
* })
*/
export async function waitToProve(client, parameters) {
const { gameLimit, receipt } = parameters;
const [withdrawal] = getWithdrawals(receipt);
if (!withdrawal)
throw new ReceiptContainsNoWithdrawalsError({
hash: receipt.transactionHash,
});
const portalVersion = await getPortalVersion(client, parameters);
// Legacy (Portal < v3)
if (portalVersion.major < 3) {
const output = await waitForNextL2Output(client, {
...parameters,
l2BlockNumber: receipt.blockNumber,
});
return {
game: {
extraData: '0x',
index: output.outputIndex,
l2BlockNumber: output.l2BlockNumber,
metadata: '0x',
rootClaim: output.outputRoot,
timestamp: output.timestamp,
},
output,
withdrawal,
};
}
const game = await waitForNextGame(client, {
...parameters,
limit: gameLimit,
l2BlockNumber: receipt.blockNumber,
});
return {
game,
output: {
l2BlockNumber: game.l2BlockNumber,
outputIndex: game.index,
outputRoot: game.rootClaim,
timestamp: game.timestamp,
},
withdrawal,
};
}
//# sourceMappingURL=waitToProve.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"waitToProve.js","sourceRoot":"","sources":["../../../op-stack/actions/waitToProve.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,iCAAiC,EAAE,MAAM,yBAAyB,CAAA;AAG3E,OAAO,EAEL,cAAc,GACf,MAAM,4BAA4B,CAAA;AACnC,OAAO,EAEL,gBAAgB,GACjB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAGL,eAAe,GAChB,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EAIL,mBAAmB,GACpB,MAAM,0BAA0B,CAAA;AAqCjC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAK/B,MAAyC,EACzC,UAAuD;IAEvD,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,UAAU,CAAA;IAEzC,MAAM,CAAC,UAAU,CAAC,GAAG,cAAc,CAAC,OAAO,CAAC,CAAA;IAE5C,IAAI,CAAC,UAAU;QACb,MAAM,IAAI,iCAAiC,CAAC;YAC1C,IAAI,EAAE,OAAO,CAAC,eAAe;SAC9B,CAAC,CAAA;IAEJ,MAAM,aAAa,GAAG,MAAM,gBAAgB,CAC1C,MAAM,EACN,UAAwC,CACzC,CAAA;IAED,uBAAuB;IACvB,IAAI,aAAa,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,MAAM,EAAE;YAC/C,GAAG,UAAU;YACb,aAAa,EAAE,OAAO,CAAC,WAAW;SACF,CAAC,CAAA;QACnC,OAAO;YACL,IAAI,EAAE;gBACJ,SAAS,EAAE,IAAI;gBACf,KAAK,EAAE,MAAM,CAAC,WAAW;gBACzB,aAAa,EAAE,MAAM,CAAC,aAAa;gBACnC,QAAQ,EAAE,IAAI;gBACd,SAAS,EAAE,MAAM,CAAC,UAAU;gBAC5B,SAAS,EAAE,MAAM,CAAC,SAAS;aAC5B;YACD,MAAM;YACN,UAAU;SACX,CAAA;IACH,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC,MAAM,EAAE;QACzC,GAAG,UAAU;QACb,KAAK,EAAE,SAAS;QAChB,aAAa,EAAE,OAAO,CAAC,WAAW;KACN,CAAC,CAAA;IAC/B,OAAO;QACL,IAAI;QACJ,MAAM,EAAE;YACN,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,WAAW,EAAE,IAAI,CAAC,KAAK;YACvB,UAAU,EAAE,IAAI,CAAC,SAAS;YAC1B,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B;QACD,UAAU;KACX,CAAA;AACH,CAAC"}

10
node_modules/viem/_esm/op-stack/chainConfig.js generated vendored Normal file
View File

@@ -0,0 +1,10 @@
import { contracts } from './contracts.js';
import { formatters } from './formatters.js';
import { serializers } from './serializers.js';
export const chainConfig = {
blockTime: 2_000,
contracts,
formatters,
serializers,
};
//# sourceMappingURL=chainConfig.js.map

1
node_modules/viem/_esm/op-stack/chainConfig.js.map generated vendored Normal file
View File

@@ -0,0 +1 @@
{"version":3,"file":"chainConfig.js","sourceRoot":"","sources":["../../op-stack/chainConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAE9C,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,SAAS,EAAE,KAAK;IAChB,SAAS;IACT,UAAU;IACV,WAAW;CACH,CAAA"}

29
node_modules/viem/_esm/op-stack/chains.js generated vendored Normal file
View File

@@ -0,0 +1,29 @@
// biome-ignore lint/performance/noBarrelFile: entrypoint module
export { ancient8 } from '../chains/definitions/ancient8.js';
export { ancient8Sepolia } from '../chains/definitions/ancient8Sepolia.js';
export { base } from '../chains/definitions/base.js';
export { baseGoerli } from '../chains/definitions/baseGoerli.js';
export { baseSepolia } from '../chains/definitions/baseSepolia.js';
export { blast } from '../chains/definitions/blast.js';
export { fraxtal } from '../chains/definitions/fraxtal.js';
export { fraxtalTestnet } from '../chains/definitions/fraxtalTestnet.js';
export { inkSepolia } from '../chains/definitions/inkSepolia.js';
export { metalL2 } from '../chains/definitions/metalL2.js';
export { optimism } from '../chains/definitions/optimism.js';
export { optimismGoerli } from '../chains/definitions/optimismGoerli.js';
export { optimismSepolia } from '../chains/definitions/optimismSepolia.js';
export { pgn } from '../chains/definitions/pgn.js';
export { pgnTestnet } from '../chains/definitions/pgnTestnet.js';
export { shape } from '../chains/definitions/shape.js';
export { snax } from '../chains/definitions/snax.js';
export { snaxTestnet } from '../chains/definitions/snaxTestnet.js';
export { soneium } from '../chains/definitions/soneium.js';
export { soneiumMinato } from '../chains/definitions/soneiumMinato.js';
export { unichain } from '../chains/definitions/unichain.js';
export { unichainSepolia } from '../chains/definitions/unichainSepolia.js';
export { worldchain } from '../chains/definitions/worldchain.js';
export { worldchainSepolia } from '../chains/definitions/worldchainSepolia.js';
export { zora } from '../chains/definitions/zora.js';
export { zoraSepolia } from '../chains/definitions/zoraSepolia.js';
export { zoraTestnet } from '../chains/definitions/zoraTestnet.js';
//# sourceMappingURL=chains.js.map

1
node_modules/viem/_esm/op-stack/chains.js.map generated vendored Normal file
View File

@@ -0,0 +1 @@
{"version":3,"file":"chains.js","sourceRoot":"","sources":["../../op-stack/chains.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,OAAO,EAAE,QAAQ,EAAE,MAAM,mCAAmC,CAAA;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,0CAA0C,CAAA;AAC1E,OAAO,EAAE,IAAI,EAAE,MAAM,+BAA+B,CAAA;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,qCAAqC,CAAA;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAA;AAClE,OAAO,EAAE,KAAK,EAAE,MAAM,gCAAgC,CAAA;AACtD,OAAO,EAAE,OAAO,EAAE,MAAM,kCAAkC,CAAA;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAA;AACxE,OAAO,EAAE,UAAU,EAAE,MAAM,qCAAqC,CAAA;AAChE,OAAO,EAAE,OAAO,EAAE,MAAM,kCAAkC,CAAA;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,mCAAmC,CAAA;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAA;AACxE,OAAO,EAAE,eAAe,EAAE,MAAM,0CAA0C,CAAA;AAC1E,OAAO,EAAE,GAAG,EAAE,MAAM,8BAA8B,CAAA;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,qCAAqC,CAAA;AAChE,OAAO,EAAE,KAAK,EAAE,MAAM,gCAAgC,CAAA;AACtD,OAAO,EAAE,IAAI,EAAE,MAAM,+BAA+B,CAAA;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAA;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,kCAAkC,CAAA;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAA;AACtE,OAAO,EAAE,QAAQ,EAAE,MAAM,mCAAmC,CAAA;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,0CAA0C,CAAA;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,qCAAqC,CAAA;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,4CAA4C,CAAA;AAC9E,OAAO,EAAE,IAAI,EAAE,MAAM,+BAA+B,CAAA;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAA;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAA"}

17
node_modules/viem/_esm/op-stack/contracts.js generated vendored Normal file
View File

@@ -0,0 +1,17 @@
/**
* Predeploy contracts for OP Stack.
* @see https://github.com/ethereum-optimism/optimism/blob/develop/specs/predeploys.md
*/
export const contracts = {
gasPriceOracle: { address: '0x420000000000000000000000000000000000000F' },
l1Block: { address: '0x4200000000000000000000000000000000000015' },
l2CrossDomainMessenger: {
address: '0x4200000000000000000000000000000000000007',
},
l2Erc721Bridge: { address: '0x4200000000000000000000000000000000000014' },
l2StandardBridge: { address: '0x4200000000000000000000000000000000000010' },
l2ToL1MessagePasser: {
address: '0x4200000000000000000000000000000000000016',
},
};
//# sourceMappingURL=contracts.js.map

1
node_modules/viem/_esm/op-stack/contracts.js.map generated vendored Normal file
View File

@@ -0,0 +1 @@
{"version":3,"file":"contracts.js","sourceRoot":"","sources":["../../op-stack/contracts.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,cAAc,EAAE,EAAE,OAAO,EAAE,4CAA4C,EAAE;IACzE,OAAO,EAAE,EAAE,OAAO,EAAE,4CAA4C,EAAE;IAClE,sBAAsB,EAAE;QACtB,OAAO,EAAE,4CAA4C;KACtD;IACD,cAAc,EAAE,EAAE,OAAO,EAAE,4CAA4C,EAAE;IACzE,gBAAgB,EAAE,EAAE,OAAO,EAAE,4CAA4C,EAAE;IAC3E,mBAAmB,EAAE;QACnB,OAAO,EAAE,4CAA4C;KACtD;CACoC,CAAA"}

56
node_modules/viem/_esm/op-stack/decorators/publicL1.js generated vendored Normal file
View File

@@ -0,0 +1,56 @@
import { buildInitiateWithdrawal, } from '../actions/buildInitiateWithdrawal.js';
import { estimateDepositTransactionGas, } from '../actions/estimateDepositTransactionGas.js';
import { estimateFinalizeWithdrawalGas, } from '../actions/estimateFinalizeWithdrawalGas.js';
import { estimateProveWithdrawalGas, } from '../actions/estimateProveWithdrawalGas.js';
import { getGame, } from '../actions/getGame.js';
import { getGames, } from '../actions/getGames.js';
import { getL2Output, } from '../actions/getL2Output.js';
import { getPortalVersion, } from '../actions/getPortalVersion.js';
import { getTimeToFinalize, } from '../actions/getTimeToFinalize.js';
import { getTimeToNextGame, } from '../actions/getTimeToNextGame.js';
import { getTimeToNextL2Output, } from '../actions/getTimeToNextL2Output.js';
import { getTimeToProve, } from '../actions/getTimeToProve.js';
import { getWithdrawalStatus, } from '../actions/getWithdrawalStatus.js';
import { waitForNextGame, } from '../actions/waitForNextGame.js';
import { waitForNextL2Output, } from '../actions/waitForNextL2Output.js';
import { waitToFinalize, } from '../actions/waitToFinalize.js';
import { waitToProve, } from '../actions/waitToProve.js';
/**
* A suite of Public Actions for suited for development with Layer 2 (OP Stack) chains.
*
* - Docs: https://viem.sh/op-stack/client
*
* @example
* import { publicActionsL1 } from 'viem/op-stack'
* import { mainnet } from 'viem/chains'
* import { buildDepositTransaction } from 'viem/wallet'
*
* export const opStackPublicClientL1 = createWalletClient({
* chain: mainnet,
* transport: http(),
* }).extend(publicActionsL1())
*/
export function publicActionsL1() {
return (client) => {
return {
buildInitiateWithdrawal: (args) => buildInitiateWithdrawal(client, args),
estimateDepositTransactionGas: (args) => estimateDepositTransactionGas(client, args),
estimateFinalizeWithdrawalGas: (args) => estimateFinalizeWithdrawalGas(client, args),
estimateProveWithdrawalGas: (args) => estimateProveWithdrawalGas(client, args),
getGame: (args) => getGame(client, args),
getGames: (args) => getGames(client, args),
getL2Output: (args) => getL2Output(client, args),
getPortalVersion: (args) => getPortalVersion(client, args),
getTimeToFinalize: (args) => getTimeToFinalize(client, args),
getTimeToNextGame: (args) => getTimeToNextGame(client, args),
getTimeToNextL2Output: (args) => getTimeToNextL2Output(client, args),
getTimeToProve: (args) => getTimeToProve(client, args),
getWithdrawalStatus: (args) => getWithdrawalStatus(client, args),
waitForNextGame: (args) => waitForNextGame(client, args),
waitForNextL2Output: (args) => waitForNextL2Output(client, args),
waitToFinalize: (args) => waitToFinalize(client, args),
waitToProve: (args) => waitToProve(client, args),
};
};
}
//# sourceMappingURL=publicL1.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"publicL1.js","sourceRoot":"","sources":["../../../op-stack/decorators/publicL1.ts"],"names":[],"mappings":"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"}

48
node_modules/viem/_esm/op-stack/decorators/publicL2.js generated vendored Normal file
View File

@@ -0,0 +1,48 @@
import { buildDepositTransaction, } from '../actions/buildDepositTransaction.js';
import { buildProveWithdrawal, } from '../actions/buildProveWithdrawal.js';
import { estimateContractL1Fee, } from '../actions/estimateContractL1Fee.js';
import { estimateContractL1Gas, } from '../actions/estimateContractL1Gas.js';
import { estimateContractTotalFee, } from '../actions/estimateContractTotalFee.js';
import { estimateContractTotalGas, } from '../actions/estimateContractTotalGas.js';
import { estimateInitiateWithdrawalGas, } from '../actions/estimateInitiateWithdrawalGas.js';
import { estimateL1Fee, } from '../actions/estimateL1Fee.js';
import { estimateL1Gas, } from '../actions/estimateL1Gas.js';
import { estimateOperatorFee, } from '../actions/estimateOperatorFee.js';
import { estimateTotalFee, } from '../actions/estimateTotalFee.js';
import { estimateTotalGas, } from '../actions/estimateTotalGas.js';
import { getL1BaseFee, } from '../actions/getL1BaseFee.js';
/**
* A suite of Public Actions for suited for development with Layer 2 (OP Stack) chains.
*
* - Docs: https://viem.sh/op-stack/client
*
* @example
* import { publicActionsL2 } from 'viem/op-stack'
* import { optimism } from 'viem/chains'
* import { buildDepositTransaction } from 'viem/wallet'
*
* export const opStackPublicClientL2 = createPublicClient({
* chain: optimism,
* transport: http(),
* }).extend(publicActionsL2())
*/
export function publicActionsL2() {
return (client) => {
return {
buildDepositTransaction: (args) => buildDepositTransaction(client, args),
buildProveWithdrawal: (args) => buildProveWithdrawal(client, args),
estimateContractL1Fee: (args) => estimateContractL1Fee(client, args),
estimateContractL1Gas: (args) => estimateContractL1Gas(client, args),
estimateContractTotalFee: (args) => estimateContractTotalFee(client, args),
estimateContractTotalGas: (args) => estimateContractTotalGas(client, args),
estimateInitiateWithdrawalGas: (args) => estimateInitiateWithdrawalGas(client, args),
estimateL1Fee: (args) => estimateL1Fee(client, args),
getL1BaseFee: (args) => getL1BaseFee(client, args),
estimateL1Gas: (args) => estimateL1Gas(client, args),
estimateOperatorFee: (args) => estimateOperatorFee(client, args),
estimateTotalFee: (args) => estimateTotalFee(client, args),
estimateTotalGas: (args) => estimateTotalGas(client, args),
};
};
}
//# sourceMappingURL=publicL2.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"publicL2.js","sourceRoot":"","sources":["../../../op-stack/decorators/publicL2.ts"],"names":[],"mappings":"AASA,OAAO,EAGL,uBAAuB,GACxB,MAAM,uCAAuC,CAAA;AAC9C,OAAO,EAGL,oBAAoB,GACrB,MAAM,oCAAoC,CAAA;AAC3C,OAAO,EAGL,qBAAqB,GACtB,MAAM,qCAAqC,CAAA;AAC5C,OAAO,EAGL,qBAAqB,GACtB,MAAM,qCAAqC,CAAA;AAC5C,OAAO,EAGL,wBAAwB,GACzB,MAAM,wCAAwC,CAAA;AAC/C,OAAO,EAGL,wBAAwB,GACzB,MAAM,wCAAwC,CAAA;AAC/C,OAAO,EAGL,6BAA6B,GAC9B,MAAM,6CAA6C,CAAA;AACpD,OAAO,EAGL,aAAa,GACd,MAAM,6BAA6B,CAAA;AACpC,OAAO,EAGL,aAAa,GACd,MAAM,6BAA6B,CAAA;AACpC,OAAO,EAGL,mBAAmB,GACpB,MAAM,mCAAmC,CAAA;AAC1C,OAAO,EAGL,gBAAgB,GACjB,MAAM,gCAAgC,CAAA;AACvC,OAAO,EAGL,gBAAgB,GACjB,MAAM,gCAAgC,CAAA;AACvC,OAAO,EAGL,YAAY,GACb,MAAM,4BAA4B,CAAA;AAkbnC;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,eAAe;IAC7B,OAAO,CAKL,MAAyC,EACR,EAAE;QACnC,OAAO;YACL,uBAAuB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,uBAAuB,CAAC,MAAM,EAAE,IAAI,CAAC;YACxE,oBAAoB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,oBAAoB,CAAC,MAAM,EAAE,IAAI,CAAC;YAClE,qBAAqB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,qBAAqB,CAAC,MAAM,EAAE,IAAI,CAAC;YACpE,qBAAqB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,qBAAqB,CAAC,MAAM,EAAE,IAAI,CAAC;YACpE,wBAAwB,EAAE,CAAC,IAAI,EAAE,EAAE,CACjC,wBAAwB,CAAC,MAAM,EAAE,IAAI,CAAC;YACxC,wBAAwB,EAAE,CAAC,IAAI,EAAE,EAAE,CACjC,wBAAwB,CAAC,MAAM,EAAE,IAAI,CAAC;YACxC,6BAA6B,EAAE,CAAC,IAAI,EAAE,EAAE,CACtC,6BAA6B,CAAC,MAAM,EAAE,IAAI,CAAC;YAC7C,aAAa,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC;YACpD,YAAY,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC;YAClD,aAAa,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC;YACpD,mBAAmB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAAC;YAChE,gBAAgB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAAC;YAC1D,gBAAgB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAAC;SAC3D,CAAA;IACH,CAAC,CAAA;AACH,CAAC"}

30
node_modules/viem/_esm/op-stack/decorators/walletL1.js generated vendored Normal file
View File

@@ -0,0 +1,30 @@
import { depositTransaction, } from '../actions/depositTransaction.js';
import { finalizeWithdrawal, } from '../actions/finalizeWithdrawal.js';
import { proveWithdrawal, } from '../actions/proveWithdrawal.js';
/**
* A suite of Wallet Actions for suited for development with Layer 2 (OP Stack) chains.
*
* - Docs: https://viem.sh/op-stack/client
*
* @example
* import { createPublicClient, createWalletClient, http } from 'viem'
* import { mainnet } from 'viem/chains'
* import { walletActionsL1 } from 'viem/op-stack'
*
* const walletClient = createWalletClient({
* chain: mainnet,
* transport: http(),
* }).extend(walletActionsL1())
*
* const hash = await walletClient.depositTransaction({...})
*/
export function walletActionsL1() {
return (client) => {
return {
depositTransaction: (args) => depositTransaction(client, args),
finalizeWithdrawal: (args) => finalizeWithdrawal(client, args),
proveWithdrawal: (args) => proveWithdrawal(client, args),
};
};
}
//# sourceMappingURL=walletL1.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"walletL1.js","sourceRoot":"","sources":["../../../op-stack/decorators/walletL1.ts"],"names":[],"mappings":"AAIA,OAAO,EAGL,kBAAkB,GACnB,MAAM,kCAAkC,CAAA;AACzC,OAAO,EAGL,kBAAkB,GACnB,MAAM,kCAAkC,CAAA;AACzC,OAAO,EAGL,eAAe,GAChB,MAAM,+BAA+B,CAAA;AA0HtC;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,eAAe;IAC7B,OAAO,CAKL,MAAyC,EACR,EAAE;QACnC,OAAO;YACL,kBAAkB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,kBAAkB,CAAC,MAAM,EAAE,IAAI,CAAC;YAC9D,kBAAkB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,kBAAkB,CAAC,MAAM,EAAE,IAAI,CAAC;YAC9D,eAAe,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC;SACzD,CAAA;IACH,CAAC,CAAA;AACH,CAAC"}

26
node_modules/viem/_esm/op-stack/decorators/walletL2.js generated vendored Normal file
View File

@@ -0,0 +1,26 @@
import { initiateWithdrawal, } from '../actions/initiateWithdrawal.js';
/**
* A suite of Wallet Actions for suited for development with Layer 2 (OP Stack) chains.
*
* - Docs: https://viem.sh/op-stack/client
*
* @example
* import { createPublicClient, createWalletClient, http } from 'viem'
* import { mainnet } from 'viem/chains'
* import { walletActionsL1 } from 'viem/op-stack'
*
* const walletClient = createWalletClient({
* chain: mainnet,
* transport: http(),
* }).extend(walletActionsL1())
*
* const hash = await walletClient.depositTransaction({...})
*/
export function walletActionsL2() {
return (client) => {
return {
initiateWithdrawal: (args) => initiateWithdrawal(client, args),
};
};
}
//# sourceMappingURL=walletL2.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"walletL2.js","sourceRoot":"","sources":["../../../op-stack/decorators/walletL2.ts"],"names":[],"mappings":"AAIA,OAAO,EAGL,kBAAkB,GACnB,MAAM,kCAAkC,CAAA;AA+DzC;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,eAAe;IAC7B,OAAO,CAKL,MAAyC,EACR,EAAE;QACnC,OAAO;YACL,kBAAkB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,kBAAkB,CAAC,MAAM,EAAE,IAAI,CAAC;SAC/D,CAAA;IACH,CAAC,CAAA;AACH,CAAC"}

12
node_modules/viem/_esm/op-stack/errors/withdrawal.js generated vendored Normal file
View File

@@ -0,0 +1,12 @@
import { BaseError } from '../../errors/base.js';
export class GameNotFoundError extends BaseError {
constructor() {
super('Dispute game not found.', { name: 'GameNotFoundError' });
}
}
export class ReceiptContainsNoWithdrawalsError extends BaseError {
constructor({ hash }) {
super(`The provided transaction receipt with hash "${hash}" contains no withdrawals.`, { name: 'ReceiptContainsNoWithdrawalsError' });
}
}
//# sourceMappingURL=withdrawal.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"withdrawal.js","sourceRoot":"","sources":["../../../op-stack/errors/withdrawal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAMhD,MAAM,OAAO,iBAAkB,SAAQ,SAAS;IAC9C;QACE,KAAK,CAAC,yBAAyB,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC,CAAA;IACjE,CAAC;CACF;AAMD,MAAM,OAAO,iCAAkC,SAAQ,SAAS;IAC9D,YAAY,EAAE,IAAI,EAAiB;QACjC,KAAK,CACH,+CAA+C,IAAI,4BAA4B,EAC/E,EAAE,IAAI,EAAE,mCAAmC,EAAE,CAC9C,CAAA;IACH,CAAC;CACF"}

51
node_modules/viem/_esm/op-stack/formatters.js generated vendored Normal file
View File

@@ -0,0 +1,51 @@
import { hexToBigInt } from '../utils/encoding/fromHex.js';
import { defineBlock } from '../utils/formatters/block.js';
import { defineTransaction, formatTransaction, } from '../utils/formatters/transaction.js';
import { defineTransactionReceipt } from '../utils/formatters/transactionReceipt.js';
export const formatters = {
block: /*#__PURE__*/ defineBlock({
format(args) {
const transactions = args.transactions?.map((transaction) => {
if (typeof transaction === 'string')
return transaction;
const formatted = formatTransaction(transaction);
if (formatted.typeHex === '0x7e') {
formatted.isSystemTx = transaction.isSystemTx;
formatted.mint = transaction.mint
? hexToBigInt(transaction.mint)
: undefined;
formatted.sourceHash = transaction.sourceHash;
formatted.type = 'deposit';
}
return formatted;
});
return {
transactions,
stateRoot: args.stateRoot,
};
},
}),
transaction: /*#__PURE__*/ defineTransaction({
format(args) {
const transaction = {};
if (args.type === '0x7e') {
transaction.isSystemTx = args.isSystemTx;
transaction.mint = args.mint ? hexToBigInt(args.mint) : undefined;
transaction.sourceHash = args.sourceHash;
transaction.type = 'deposit';
}
return transaction;
},
}),
transactionReceipt: /*#__PURE__*/ defineTransactionReceipt({
format(args) {
return {
l1GasPrice: args.l1GasPrice ? hexToBigInt(args.l1GasPrice) : null,
l1GasUsed: args.l1GasUsed ? hexToBigInt(args.l1GasUsed) : null,
l1Fee: args.l1Fee ? hexToBigInt(args.l1Fee) : null,
l1FeeScalar: args.l1FeeScalar ? Number(args.l1FeeScalar) : null,
};
},
}),
};
//# sourceMappingURL=formatters.js.map

1
node_modules/viem/_esm/op-stack/formatters.js.map generated vendored Normal file
View File

@@ -0,0 +1 @@
{"version":3,"file":"formatters.js","sourceRoot":"","sources":["../../op-stack/formatters.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAA;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAA;AAC1D,OAAO,EACL,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,oCAAoC,CAAA;AAC3C,OAAO,EAAE,wBAAwB,EAAE,MAAM,2CAA2C,CAAA;AASpF,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,KAAK,EAAE,aAAa,CAAC,WAAW,CAAC;QAC/B,MAAM,CAAC,IAAqB;YAC1B,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE;gBAC1D,IAAI,OAAO,WAAW,KAAK,QAAQ;oBAAE,OAAO,WAAW,CAAA;gBACvD,MAAM,SAAS,GAAG,iBAAiB,CACjC,WAA6B,CACR,CAAA;gBACvB,IAAI,SAAS,CAAC,OAAO,KAAK,MAAM,EAAE,CAAC;oBACjC,SAAS,CAAC,UAAU,GAAG,WAAW,CAAC,UAAU,CAAA;oBAC7C,SAAS,CAAC,IAAI,GAAG,WAAW,CAAC,IAAI;wBAC/B,CAAC,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC;wBAC/B,CAAC,CAAC,SAAS,CAAA;oBACb,SAAS,CAAC,UAAU,GAAG,WAAW,CAAC,UAAU,CAAA;oBAC7C,SAAS,CAAC,IAAI,GAAG,SAAS,CAAA;gBAC5B,CAAC;gBACD,OAAO,SAAS,CAAA;YAClB,CAAC,CAAC,CAAA;YACF,OAAO;gBACL,YAAY;gBACZ,SAAS,EAAE,IAAI,CAAC,SAAS;aACV,CAAA;QACnB,CAAC;KACF,CAAC;IACF,WAAW,EAAE,aAAa,CAAC,iBAAiB,CAAC;QAC3C,MAAM,CAAC,IAA2B;YAChC,MAAM,WAAW,GAAG,EAAwB,CAAA;YAC5C,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBACzB,WAAW,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAA;gBACxC,WAAW,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;gBACjE,WAAW,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAA;gBACxC,WAAW,CAAC,IAAI,GAAG,SAAS,CAAA;YAC9B,CAAC;YACD,OAAO,WAAW,CAAA;QACpB,CAAC;KACF,CAAC;IACF,kBAAkB,EAAE,aAAa,CAAC,wBAAwB,CAAC;QACzD,MAAM,CAAC,IAAkC;YACvC,OAAO;gBACL,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI;gBACjE,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI;gBAC9D,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI;gBAClD,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI;aACnC,CAAA;QAChC,CAAC;KACF,CAAC;CACgC,CAAA"}

52
node_modules/viem/_esm/op-stack/index.js generated vendored Normal file
View File

@@ -0,0 +1,52 @@
// biome-ignore lint/performance/noBarrelFile: entrypoint module
export { buildDepositTransaction, } from './actions/buildDepositTransaction.js';
export { buildInitiateWithdrawal, } from './actions/buildInitiateWithdrawal.js';
export { buildProveWithdrawal, } from './actions/buildProveWithdrawal.js';
export { depositTransaction, } from './actions/depositTransaction.js';
export { estimateContractL1Fee, } from './actions/estimateContractL1Fee.js';
export { estimateContractL1Gas, } from './actions/estimateContractL1Gas.js';
export { estimateContractTotalFee, } from './actions/estimateContractTotalFee.js';
export { estimateContractTotalGas, } from './actions/estimateContractTotalGas.js';
export { estimateDepositTransactionGas, } from './actions/estimateDepositTransactionGas.js';
export { estimateFinalizeWithdrawalGas, } from './actions/estimateFinalizeWithdrawalGas.js';
export { estimateInitiateWithdrawalGas, } from './actions/estimateInitiateWithdrawalGas.js';
export { estimateL1Fee, } from './actions/estimateL1Fee.js';
export { estimateL1Gas, } from './actions/estimateL1Gas.js';
export { estimateOperatorFee, } from './actions/estimateOperatorFee.js';
export { estimateProveWithdrawalGas, } from './actions/estimateProveWithdrawalGas.js';
export { estimateTotalFee, } from './actions/estimateTotalFee.js';
export { estimateTotalGas, } from './actions/estimateTotalGas.js';
export { finalizeWithdrawal, } from './actions/finalizeWithdrawal.js';
export { getGame, } from './actions/getGame.js';
export { getGames, } from './actions/getGames.js';
export { getL1BaseFee, } from './actions/getL1BaseFee.js';
export { getL2Output, } from './actions/getL2Output.js';
export { getPortalVersion, } from './actions/getPortalVersion.js';
export { getTimeToFinalize, } from './actions/getTimeToFinalize.js';
export { getTimeToNextGame, } from './actions/getTimeToNextGame.js';
export { getTimeToNextL2Output, } from './actions/getTimeToNextL2Output.js';
export { getTimeToProve, } from './actions/getTimeToProve.js';
export { getWithdrawalStatus, } from './actions/getWithdrawalStatus.js';
export { initiateWithdrawal, } from './actions/initiateWithdrawal.js';
export { proveWithdrawal, } from './actions/proveWithdrawal.js';
export { waitForNextGame, } from './actions/waitForNextGame.js';
export { waitForNextL2Output, } from './actions/waitForNextL2Output.js';
export { waitToFinalize, } from './actions/waitToFinalize.js';
export { waitToProve, } from './actions/waitToProve.js';
export { chainConfig } from './chainConfig.js';
export * from './chains.js';
export { publicActionsL1, } from './decorators/publicL1.js';
export { publicActionsL2, } from './decorators/publicL2.js';
export { walletActionsL1, } from './decorators/walletL1.js';
export { walletActionsL2, } from './decorators/walletL2.js';
export { parseTransaction, } from './parsers.js';
export { serializers, serializeTransaction, } from './serializers.js';
export { extractTransactionDepositedLogs, } from './utils/extractTransactionDepositedLogs.js';
export { extractWithdrawalMessageLogs, } from './utils/extractWithdrawalMessageLogs.js';
export { getL2TransactionHash, } from './utils/getL2TransactionHash.js';
export { getL2TransactionHashes, } from './utils/getL2TransactionHashes.js';
export { getSourceHash, } from './utils/getSourceHash.js';
export { getWithdrawalHashStorageSlot, } from './utils/getWithdrawalHashStorageSlot.js';
export { getWithdrawals, } from './utils/getWithdrawals.js';
export { opaqueDataToDepositData, } from './utils/opaqueDataToDepositData.js';
//# sourceMappingURL=index.js.map

1
node_modules/viem/_esm/op-stack/index.js.map generated vendored Normal file
View File

@@ -0,0 +1 @@
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../op-stack/index.ts"],"names":[],"mappings":"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"}

51
node_modules/viem/_esm/op-stack/parsers.js generated vendored Normal file
View File

@@ -0,0 +1,51 @@
import { InvalidSerializedTransactionError } from '../errors/transaction.js';
import { isHex } from '../utils/data/isHex.js';
import { sliceHex } from '../utils/data/slice.js';
import { hexToBigInt, hexToBool } from '../utils/encoding/fromHex.js';
import { parseTransaction as parseTransaction_, toTransactionArray, } from '../utils/transaction/parseTransaction.js';
import { assertTransactionDeposit } from './serializers.js';
export function parseTransaction(serializedTransaction) {
const serializedType = sliceHex(serializedTransaction, 0, 1);
if (serializedType === '0x7e')
return parseTransactionDeposit(serializedTransaction);
return parseTransaction_(serializedTransaction);
}
function parseTransactionDeposit(serializedTransaction) {
const transactionArray = toTransactionArray(serializedTransaction);
const [sourceHash, from, to, mint, value, gas, isSystemTx, data] = transactionArray;
if (transactionArray.length !== 8 || !isHex(sourceHash) || !isHex(from))
throw new InvalidSerializedTransactionError({
attributes: {
sourceHash,
from,
gas,
to,
mint,
value,
isSystemTx,
data,
},
serializedTransaction,
type: 'deposit',
});
const transaction = {
sourceHash,
from,
type: 'deposit',
};
if (isHex(gas) && gas !== '0x')
transaction.gas = hexToBigInt(gas);
if (isHex(to) && to !== '0x')
transaction.to = to;
if (isHex(mint) && mint !== '0x')
transaction.mint = hexToBigInt(mint);
if (isHex(value) && value !== '0x')
transaction.value = hexToBigInt(value);
if (isHex(isSystemTx) && isSystemTx !== '0x')
transaction.isSystemTx = hexToBool(isSystemTx);
if (isHex(data) && data !== '0x')
transaction.data = data;
assertTransactionDeposit(transaction);
return transaction;
}
//# sourceMappingURL=parsers.js.map

1
node_modules/viem/_esm/op-stack/parsers.js.map generated vendored Normal file
View File

@@ -0,0 +1 @@
{"version":3,"file":"parsers.js","sourceRoot":"","sources":["../../op-stack/parsers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iCAAiC,EAAE,MAAM,0BAA0B,CAAA;AAE5E,OAAO,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAA;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAA;AACjD,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAA;AAErE,OAAO,EAGL,gBAAgB,IAAI,iBAAiB,EACrC,kBAAkB,GACnB,MAAM,0CAA0C,CAAA;AACjD,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAA;AAmB3D,MAAM,UAAU,gBAAgB,CAE9B,qBAAiC;IACjC,MAAM,cAAc,GAAG,QAAQ,CAAC,qBAAqB,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IAE5D,IAAI,cAAc,KAAK,MAAM;QAC3B,OAAO,uBAAuB,CAC5B,qBAAqD,CACZ,CAAA;IAE7C,OAAO,iBAAiB,CACtB,qBAAqB,CACoB,CAAA;AAC7C,CAAC;AAED,SAAS,uBAAuB,CAC9B,qBAAmD;IAEnD,MAAM,gBAAgB,GAAG,kBAAkB,CAAC,qBAAqB,CAAC,CAAA;IAElE,MAAM,CAAC,UAAU,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,CAAC,GAC9D,gBAAgB,CAAA;IAElB,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;QACrE,MAAM,IAAI,iCAAiC,CAAC;YAC1C,UAAU,EAAE;gBACV,UAAU;gBACV,IAAI;gBACJ,GAAG;gBACH,EAAE;gBACF,IAAI;gBACJ,KAAK;gBACL,UAAU;gBACV,IAAI;aACL;YACD,qBAAqB;YACrB,IAAI,EAAE,SAAS;SAChB,CAAC,CAAA;IAEJ,MAAM,WAAW,GAAmC;QAClD,UAAU;QACV,IAAI;QACJ,IAAI,EAAE,SAAS;KAChB,CAAA;IAED,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,IAAI;QAAE,WAAW,CAAC,GAAG,GAAG,WAAW,CAAC,GAAG,CAAC,CAAA;IAClE,IAAI,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,IAAI;QAAE,WAAW,CAAC,EAAE,GAAG,EAAE,CAAA;IACjD,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,KAAK,IAAI;QAAE,WAAW,CAAC,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAA;IACtE,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK,IAAI;QAAE,WAAW,CAAC,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,CAAA;IAC1E,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,UAAU,KAAK,IAAI;QAC1C,WAAW,CAAC,UAAU,GAAG,SAAS,CAAC,UAAU,CAAC,CAAA;IAChD,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,KAAK,IAAI;QAAE,WAAW,CAAC,IAAI,GAAG,IAAI,CAAA;IAEzD,wBAAwB,CAAC,WAAW,CAAC,CAAA;IAErC,OAAO,WAAW,CAAA;AACpB,CAAC"}

47
node_modules/viem/_esm/op-stack/serializers.js generated vendored Normal file
View File

@@ -0,0 +1,47 @@
import { InvalidAddressError } from '../errors/address.js';
import { isAddress } from '../utils/address/isAddress.js';
import { concatHex } from '../utils/data/concat.js';
import { toHex } from '../utils/encoding/toHex.js';
import { toRlp } from '../utils/encoding/toRlp.js';
import { serializeTransaction as serializeTransaction_, } from '../utils/transaction/serializeTransaction.js';
export function serializeTransaction(transaction, signature) {
if (isDeposit(transaction))
return serializeTransactionDeposit(transaction);
return serializeTransaction_(transaction, signature);
}
export const serializers = {
transaction: serializeTransaction,
};
function serializeTransactionDeposit(transaction) {
assertTransactionDeposit(transaction);
const { sourceHash, data, from, gas, isSystemTx, mint, to, value } = transaction;
const serializedTransaction = [
sourceHash,
from,
to ?? '0x',
mint ? toHex(mint) : '0x',
value ? toHex(value) : '0x',
gas ? toHex(gas) : '0x',
isSystemTx ? '0x1' : '0x',
data ?? '0x',
];
return concatHex([
'0x7e',
toRlp(serializedTransaction),
]);
}
function isDeposit(transaction) {
if (transaction.type === 'deposit')
return true;
if (typeof transaction.sourceHash !== 'undefined')
return true;
return false;
}
export function assertTransactionDeposit(transaction) {
const { from, to } = transaction;
if (from && !isAddress(from))
throw new InvalidAddressError({ address: from });
if (to && !isAddress(to))
throw new InvalidAddressError({ address: to });
}
//# sourceMappingURL=serializers.js.map

1
node_modules/viem/_esm/op-stack/serializers.js.map generated vendored Normal file
View File

@@ -0,0 +1 @@
{"version":3,"file":"serializers.js","sourceRoot":"","sources":["../../op-stack/serializers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AAM1D,OAAO,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAA;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAA;AAClD,OAAO,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAA;AAClD,OAAO,EAEL,oBAAoB,IAAI,qBAAqB,GAC9C,MAAM,8CAA8C,CAAA;AAerD,MAAM,UAAU,oBAAoB,CAClC,WAA2C,EAC3C,SAAqB;IAErB,IAAI,SAAS,CAAC,WAAW,CAAC;QAAE,OAAO,2BAA2B,CAAC,WAAW,CAAC,CAAA;IAC3E,OAAO,qBAAqB,CAC1B,WAAsC,EACtC,SAAS,CACV,CAAA;AACH,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,WAAW,EAAE,oBAAoB;CACE,CAAA;AAOrC,SAAS,2BAA2B,CAClC,WAA2C;IAE3C,wBAAwB,CAAC,WAAW,CAAC,CAAA;IAErC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,GAChE,WAAW,CAAA;IAEb,MAAM,qBAAqB,GAAU;QACnC,UAAU;QACV,IAAI;QACJ,EAAE,IAAI,IAAI;QACV,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI;QACzB,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI;QAC3B,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI;QACvB,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;QACzB,IAAI,IAAI,IAAI;KACb,CAAA;IAED,OAAO,SAAS,CAAC;QACf,MAAM;QACN,KAAK,CAAC,qBAAqB,CAAC;KAC7B,CAA0C,CAAA;AAC7C,CAAC;AAED,SAAS,SAAS,CAChB,WAA2C;IAE3C,IAAI,WAAW,CAAC,IAAI,KAAK,SAAS;QAAE,OAAO,IAAI,CAAA;IAC/C,IAAI,OAAO,WAAW,CAAC,UAAU,KAAK,WAAW;QAAE,OAAO,IAAI,CAAA;IAC9D,OAAO,KAAK,CAAA;AACd,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,WAA2C;IAE3C,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,WAAW,CAAA;IAChC,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,mBAAmB,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;IAC9E,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QAAE,MAAM,IAAI,mBAAmB,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAA;AAC1E,CAAC"}

2
node_modules/viem/_esm/op-stack/types/block.js generated vendored Normal file
View File

@@ -0,0 +1,2 @@
export {};
//# sourceMappingURL=block.js.map

1
node_modules/viem/_esm/op-stack/types/block.js.map generated vendored Normal file
View File

@@ -0,0 +1 @@
{"version":3,"file":"block.js","sourceRoot":"","sources":["../../../op-stack/types/block.ts"],"names":[],"mappings":""}

2
node_modules/viem/_esm/op-stack/types/chain.js generated vendored Normal file
View File

@@ -0,0 +1,2 @@
export {};
//# sourceMappingURL=chain.js.map

1
node_modules/viem/_esm/op-stack/types/chain.js.map generated vendored Normal file
View File

@@ -0,0 +1 @@
{"version":3,"file":"chain.js","sourceRoot":"","sources":["../../../op-stack/types/chain.ts"],"names":[],"mappings":""}

2
node_modules/viem/_esm/op-stack/types/contract.js generated vendored Normal file
View File

@@ -0,0 +1,2 @@
export {};
//# sourceMappingURL=contract.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"contract.js","sourceRoot":"","sources":["../../../op-stack/types/contract.ts"],"names":[],"mappings":""}

Some files were not shown because too many files have changed in this diff Show More