UNPKG

viem

Version:

TypeScript Interface for Ethereum

517 lines (513 loc) • 18 kB
import type { Abi, Address } from 'abitype' import type { Client } from '../../clients/createClient.js' import type { Transport } from '../../clients/transports/createTransport.js' import type { Account } from '../../types/account.js' import type { Chain } from '../../types/chain.js' import type { ContractFunctionArgs, ContractFunctionName, } from '../../types/contract.js' import { type BuildDepositTransactionParameters, type BuildDepositTransactionReturnType, buildDepositTransaction, } from '../actions/buildDepositTransaction.js' import { type BuildProveWithdrawalParameters, type BuildProveWithdrawalReturnType, buildProveWithdrawal, } from '../actions/buildProveWithdrawal.js' import { type EstimateContractL1FeeParameters, type EstimateContractL1FeeReturnType, estimateContractL1Fee, } from '../actions/estimateContractL1Fee.js' import { type EstimateContractL1GasParameters, type EstimateContractL1GasReturnType, estimateContractL1Gas, } from '../actions/estimateContractL1Gas.js' import { type EstimateContractTotalFeeParameters, type EstimateContractTotalFeeReturnType, estimateContractTotalFee, } from '../actions/estimateContractTotalFee.js' import { type EstimateContractTotalGasParameters, type EstimateContractTotalGasReturnType, estimateContractTotalGas, } from '../actions/estimateContractTotalGas.js' import { type EstimateInitiateWithdrawalGasParameters, type EstimateInitiateWithdrawalGasReturnType, estimateInitiateWithdrawalGas, } from '../actions/estimateInitiateWithdrawalGas.js' import { type EstimateL1FeeParameters, type EstimateL1FeeReturnType, estimateL1Fee, } from '../actions/estimateL1Fee.js' import { type EstimateL1GasParameters, type EstimateL1GasReturnType, estimateL1Gas, } from '../actions/estimateL1Gas.js' import { type EstimateTotalFeeParameters, type EstimateTotalFeeReturnType, estimateTotalFee, } from '../actions/estimateTotalFee.js' import { type EstimateTotalGasParameters, type EstimateTotalGasReturnType, estimateTotalGas, } from '../actions/estimateTotalGas.js' import { type GetL1BaseFeeParameters, type GetL1BaseFeeReturnType, getL1BaseFee, } from '../actions/getL1BaseFee.js' export type PublicActionsL2< chain extends Chain | undefined = Chain | undefined, account extends Account | undefined = Account | undefined, > = { /** * 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' * * const client = createWalletClient({ * chain: base, * transport: http(), * }).extend(publicActionsL2()) * * const args = await client.buildDepositTransaction({ * account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', * to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8', * value: parseEther('1'), * }) */ buildDepositTransaction: < chainOverride extends Chain | undefined = undefined, accountOverride extends Account | Address | undefined = undefined, >( parameters: BuildDepositTransactionParameters< chain, account, chainOverride, accountOverride >, ) => Promise<BuildDepositTransactionReturnType<account, accountOverride>> /** * 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 { publicActionsL2 } from 'viem/op-stack' * * const publicClientL2 = createPublicClient({ * chain: optimism, * transport: http(), * }).extend(publicActionsL2()) * * const args = await publicClientL2.buildProveWithdrawal({ * output: { ... }, * withdrawal: { ... }, * }) */ buildProveWithdrawal: < chainOverride extends Chain | undefined = undefined, accountOverride extends Account | Address | undefined = undefined, >( parameters: BuildProveWithdrawalParameters< chain, account, chainOverride, accountOverride >, ) => Promise< BuildProveWithdrawalReturnType< chain, account, chainOverride, accountOverride > > /** * 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 { publicActionsL2 } from 'viem/op-stack' * * const client = createPublicClient({ * chain: optimism, * transport: http(), * }).extend(publicActionsL2()) * * const l1Fee = await client.estimateContractL1Fee({ * address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2', * abi: parseAbi(['function mint() public']), * functionName: 'mint', * account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266', * }) */ estimateContractL1Fee: < const abi extends Abi | readonly unknown[], functionName extends ContractFunctionName<abi, 'nonpayable' | 'payable'>, args extends ContractFunctionArgs<abi, 'pure' | 'view', functionName>, chainOverride extends Chain | undefined = undefined, >( parameters: EstimateContractL1FeeParameters< abi, functionName, args, chain, account, chainOverride >, ) => Promise<EstimateContractL1FeeReturnType> /** * 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 { publicActionsL2 } from 'viem/op-stack' * * const client = createPublicClient({ * chain: optimism, * transport: http(), * }).extend(publicActionsL2()) * * const l1Gas = await client.estimateContractL1Gas({ * address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2', * abi: parseAbi(['function mint() public']), * functionName: 'mint', * account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266', * }) */ estimateContractL1Gas: < const abi extends Abi | readonly unknown[], functionName extends ContractFunctionName<abi, 'nonpayable' | 'payable'>, args extends ContractFunctionArgs<abi, 'pure' | 'view', functionName>, chainOverride extends Chain | undefined = undefined, >( parameters: EstimateContractL1GasParameters< abi, functionName, args, chain, account, chainOverride >, ) => Promise<EstimateContractL1GasReturnType> /** * Estimates the L1 + 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 { publicActionsL2 } from 'viem/op-stack' * * const client = createPublicClient({ * chain: optimism, * transport: http(), * }).extend(publicActionsL2()) * * const totalFee = await client.estimateContractTotalFee({ * address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2', * abi: parseAbi(['function mint() public']), * functionName: 'mint', * account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266', * }) */ estimateContractTotalFee: < const abi extends Abi | readonly unknown[], functionName extends ContractFunctionName<abi, 'nonpayable' | 'payable'>, args extends ContractFunctionArgs<abi, 'pure' | 'view', functionName>, chainOverride extends Chain | undefined = undefined, >( parameters: EstimateContractTotalFeeParameters< abi, functionName, args, chain, account, chainOverride >, ) => Promise<EstimateContractTotalFeeReturnType> /** * 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 { publicActionsL2 } from 'viem/op-stack' * * const client = createPublicClient({ * chain: optimism, * transport: http(), * }).extend(publicActionsL2()) * * const totalGas = await client.estimateContractTotalGas({ * address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2', * abi: parseAbi(['function mint() public']), * functionName: 'mint', * account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266', * }) */ estimateContractTotalGas: < const abi extends Abi | readonly unknown[], functionName extends ContractFunctionName<abi, 'nonpayable' | 'payable'>, args extends ContractFunctionArgs<abi, 'pure' | 'view', functionName>, chainOverride extends Chain | undefined = undefined, >( parameters: EstimateContractTotalGasParameters< abi, functionName, args, chain, account, chainOverride >, ) => Promise<EstimateContractTotalGasReturnType> /** * 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 The gas required. {@link EstimateInitiateWithdrawalGasReturnType} * * @example * import { createPublicClient, http, parseEther } from 'viem' * import { base, mainnet } from 'viem/chains' * import { publicActionsL2 } from 'viem/op-stack' * * const client = createPublicClient({ * chain: mainnet, * transport: http(), * }).extend(publicActionsL2()) * * const hash = await client.estimateInitiateWithdrawalGas({ * account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', * request: { * gas: 21_000n, * to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8', * value: parseEther('1'), * }, * }) */ estimateInitiateWithdrawalGas: < chainOverride extends Chain | undefined = undefined, >( parameters: EstimateInitiateWithdrawalGasParameters< chain, account, chainOverride >, ) => Promise<EstimateInitiateWithdrawalGasReturnType> /** * 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 { publicActionsL2 } from 'viem/op-stack' * * const client = createPublicClient({ * chain: optimism, * transport: http(), * }).extend(publicActionsL2()) * * const l1Fee = await client.estimateL1Fee({ * account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', * to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8', * value: parseEther('1'), * }) */ estimateL1Fee: <chainOverride extends Chain | undefined = undefined>( parameters: EstimateL1FeeParameters<chain, account, chainOverride>, ) => Promise<EstimateL1FeeReturnType> /** * Get the L1 basefee * * @param client - Client to use * @param parameters - {@link GetL1BaseFeeParameters} * @returns The fee (in wei). {@link GetL1BaseFeeReturnType} * * @example * import { createPublicClient, http, parseEther } from 'viem' * import { optimism } from 'viem/chains' * import { publicActionsL2 } from 'viem/op-stack' * * const client = createPublicClient({ * chain: optimism, * transport: http(), * }).extend(publicActionsL2()) * * const l1BaseFee = await client.getL1BaseFee() */ getL1BaseFee: <chainOverride extends Chain | undefined = undefined>( parameters?: GetL1BaseFeeParameters<chain, chainOverride> | undefined, ) => Promise<GetL1BaseFeeReturnType> /** * Estimates the amount of 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 { publicActionsL2 } from 'viem/op-stack' * * const client = createPublicClient({ * chain: optimism, * transport: http(), * }).extend(publicActionsL2()) * * const l1Gas = await client.estimateL1Gas({ * account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', * to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8', * value: parseEther('1'), * }) */ estimateL1Gas: <chainOverride extends Chain | undefined = undefined>( parameters: EstimateL1GasParameters<chain, account, chainOverride>, ) => Promise<EstimateL1GasReturnType> /** * Estimates the L1 data fee + L2 fee to execute an L2 transaction. * * @param client - Client to use * @param parameters - {@link EstimateTotalFeeParameters} * @returns The gas estimate. {@link EstimateTotalFeeReturnType} * * @example * import { createPublicClient, http, parseEther } from 'viem' * import { optimism } from 'viem/chains' * import { publicActionsL2 } from 'viem/op-stack' * * const client = createPublicClient({ * chain: optimism, * transport: http(), * }).extend(publicActionsL2()) * * const totalFee = await client.estimateTotalFee({ * account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', * to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8', * value: parseEther('1'), * }) */ estimateTotalFee: <chainOverride extends Chain | undefined = undefined>( parameters: EstimateTotalFeeParameters<chain, account, chainOverride>, ) => Promise<EstimateTotalFeeReturnType> /** * Estimates the total amount of combined 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 { publicActionsL2 } from 'viem/op-stack' * * const client = createPublicClient({ * chain: optimism, * transport: http(), * }).extend(publicActionsL2()) * * const totalGas = await client.estimateTotalGas({ * account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', * to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8', * value: parseEther('1'), * }) */ estimateTotalGas: <chainOverride extends Chain | undefined = undefined>( parameters: EstimateTotalGasParameters<chain, account, chainOverride>, ) => Promise<EstimateTotalGasReturnType> } /** * 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 < transport extends Transport, chain extends Chain | undefined = Chain | undefined, account extends Account | undefined = Account | undefined, >( client: Client<transport, chain, account>, ): PublicActionsL2<chain, account> => { 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), estimateTotalFee: (args) => estimateTotalFee(client, args), estimateTotalGas: (args) => estimateTotalGas(client, args), } } }