@zerodev/sdk
Version:
A utility library for working with ERC-4337
73 lines (69 loc) • 2.05 kB
text/typescript
// Copied from: https://github.com/pimlicolabs/permissionless.js/blob/main/packages/permissionless/actions/smartAccount/writeContract.ts
import {
type Abi,
type Chain,
type Client,
type ContractFunctionArgs,
type ContractFunctionName,
type EncodeFunctionDataParameters,
type Hash,
type SendTransactionParameters,
type Transport,
type WriteContractParameters,
encodeFunctionData
} from "viem"
import type { SmartAccount } from "viem/account-abstraction"
import { getAction } from "viem/utils"
import { sendTransaction } from "./sendTransaction.js"
export async function writeContract<
TChain extends Chain | undefined,
TAccount extends SmartAccount | undefined,
const TAbi extends Abi | readonly unknown[],
TFunctionName extends ContractFunctionName<
TAbi,
"nonpayable" | "payable"
> = ContractFunctionName<TAbi, "nonpayable" | "payable">,
TArgs extends ContractFunctionArgs<
TAbi,
"nonpayable" | "payable",
TFunctionName
> = ContractFunctionArgs<TAbi, "nonpayable" | "payable", TFunctionName>,
TChainOverride extends Chain | undefined = undefined
>(
client: Client<Transport, TChain, TAccount>,
{
abi,
address,
args,
dataSuffix,
functionName,
...request
}: WriteContractParameters<
TAbi,
TFunctionName,
TArgs,
TChain,
TAccount,
TChainOverride
>
): Promise<Hash> {
const data = encodeFunctionData<TAbi, TFunctionName>({
abi,
args,
functionName
} as EncodeFunctionDataParameters<TAbi, TFunctionName>)
const hash = await getAction(
client,
sendTransaction<TAccount, undefined, undefined>,
"sendTransaction"
)({
data: `${data}${dataSuffix ? dataSuffix.replace("0x", "") : ""}`,
to: address,
...request
} as unknown as SendTransactionParameters<
Chain | undefined,
TAccount,
undefined
>)
return hash
}