From 01d4820c387852f312a621a7968347712590ea4a Mon Sep 17 00:00:00 2001 From: Vasile Gabriel Marian <56271768+VGabriel45@users.noreply.github.com> Date: Wed, 13 Mar 2024 10:24:46 +0200 Subject: [PATCH] feat: smart account client (#18) * feat: added simple smart account client --------- Co-authored-by: GabiDev --- bun.lockb | Bin 228023 -> 228752 bytes package.json | 5 +- src/account/utils/types.ts | 2 +- src/bundler/utils/types.ts | 129 +++++++++++++++++++++++++ src/client/createSmartAccountClient.ts | 93 ++++++++++++++++++ src/client/index.ts | 4 + src/index.ts | 2 + tests/account.test.ts | 13 +++ 8 files changed, 246 insertions(+), 2 deletions(-) create mode 100644 src/bundler/utils/types.ts create mode 100644 src/client/createSmartAccountClient.ts create mode 100644 src/client/index.ts diff --git a/bun.lockb b/bun.lockb index 74579e7ad9b6c56d5ebbff320e020ab6342c153f..0a917b119a79a437898086ca18a0276a900b5f3b 100755 GIT binary patch delta 45107 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 f_y%!o#lK96iUPo@434)JBA delta 44212 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 diff --git a/package.json b/package.json index 4199a5d78..87bb005d4 100644 --- a/package.json +++ b/package.json @@ -54,7 +54,7 @@ "build:cjs": "tsc --project ./tsconfig/tsconfig.cjs.json && tsc-alias -p ./tsconfig/tsconfig.cjs.json && echo > ./dist/_cjs/package.json '{\"type\":\"commonjs\"}'", "build:esm": "tsc --project ./tsconfig/tsconfig.esm.json && tsc-alias -p ./tsconfig/tsconfig.esm.json && echo > ./dist/_esm/package.json '{\"type\": \"module\",\"sideEffects\":false}'", "build:types": "tsc --project ./tsconfig/tsconfig.types.json && tsc-alias -p ./tsconfig/tsconfig.types.json", - "clean": "rimraf ./src/_esm ./src/_cjs ./src/_types ./src/tsconfig", + "clean": "rimraf ./dist/_esm ./dist/_cjs ./dist/_types ./src/tsconfig", "test": "vitest dev -c ./tests/vitest.config.ts", "test:ci": "CI=true vitest -c ./tests/vitest.config.ts --coverage", "size": "size-limit", @@ -91,5 +91,8 @@ "simple-git-hooks": { "pre-commit": "bun run format && bun run lint:fix", "commit-msg": "npx --no -- commitlint --edit ${1}" + }, + "dependencies": { + "permissionless": "^0.1.10" } } diff --git a/src/account/utils/types.ts b/src/account/utils/types.ts index cf0c5fb55..a6a5c98cc 100644 --- a/src/account/utils/types.ts +++ b/src/account/utils/types.ts @@ -90,7 +90,7 @@ export type BiconomySmartAccountConfig = { * @template TAbi - The type of the ABI. */ export type SmartAccount< - entryPoint extends ENTRYPOINT_ADDRESS_V07_TYPE, + entryPoint = ENTRYPOINT_ADDRESS_V07_TYPE, Name extends string = string, transport extends Transport = Transport, chain extends Chain | undefined = Chain | undefined, diff --git a/src/bundler/utils/types.ts b/src/bundler/utils/types.ts new file mode 100644 index 000000000..a6e60272b --- /dev/null +++ b/src/bundler/utils/types.ts @@ -0,0 +1,129 @@ +import type { Address, Hash, Hex } from "viem" +import type { PartialBy } from "viem/chains" +import type { ENTRYPOINT_ADDRESS_V07_TYPE } from "../../account/utils/types" + +export type UserOperationWithBigIntAsHex = { + sender: Address + nonce: Hex + factory: Address + factoryData: Hex + callData: Hex + callGasLimit: Hex + verificationGasLimit: Hex + preVerificationGas: Hex + maxFeePerGas: Hex + maxPriorityFeePerGas: Hex + paymaster: Address + paymasterVerificationGasLimit: Hex + paymasterPostOpGasLimit: Hex + paymasterData: Hex + signature: Hex + initCode?: never + paymasterAndData?: never +} + +export type BundlerRpcSchema = [ + { + Method: "eth_sendUserOperation" + Parameters: [ + userOperation: UserOperationWithBigIntAsHex, + entryPoint: entryPoint + ] + ReturnType: Hash + }, + { + Method: "eth_estimateUserOperationGas" + Parameters: [ + userOperation: PartialBy< + UserOperationWithBigIntAsHex, + | "callGasLimit" + | "preVerificationGas" + | "verificationGasLimit" + | "paymasterVerificationGasLimit" + | "paymasterPostOpGasLimit" + >, + entryPoint: entryPoint, + stateOverrides?: StateOverrides + ] + ReturnType: { + preVerificationGas: Hex + verificationGasLimit: Hex + callGasLimit?: Hex | null + paymasterVerificationGasLimit?: Hex | null + paymasterPostOpGasLimit?: Hex | null + } + }, + { + Method: "eth_supportedEntryPoints" + Parameters: [] + ReturnType: Address[] + }, + { + Method: "eth_chainId" + Parameters: [] + ReturnType: Hex + }, + { + Method: "eth_getUserOperationByHash" + Parameters: [hash: Hash] + ReturnType: { + userOperation: UserOperationWithBigIntAsHex + entryPoint: entryPoint + transactionHash: Hash + blockHash: Hash + blockNumber: Hex + } + }, + { + Method: "eth_getUserOperationReceipt" + Parameters: [hash: Hash] + ReturnType: UserOperationReceiptWithBigIntAsHex + } +] + +type UserOperationReceiptWithBigIntAsHex = { + userOpHash: Hash + sender: Address + nonce: Hex + actualGasUsed: Hex + actualGasCost: Hex + success: boolean + receipt: { + transactionHash: Hex + transactionIndex: Hex + blockHash: Hash + blockNumber: Hex + from: Address + to: Address | null + cumulativeGasUsed: Hex + status: "0x0" | "0x1" + gasUsed: Hex + contractAddress: Address | null + logsBloom: Hex + effectiveGasPrice: Hex + } + logs: { + data: Hex + blockNumber: Hex + blockHash: Hash + transactionHash: Hash + logIndex: Hex + transactionIndex: Hex + address: Address + topics: Hex[] + }[] +} + +export type StateOverrides = { + [x: string]: { + balance?: bigint | undefined + nonce?: bigint | number | undefined + code?: Hex | undefined + state?: { + [x: Hex]: Hex + } + stateDiff?: { + [x: Hex]: Hex + } + } +} diff --git a/src/client/createSmartAccountClient.ts b/src/client/createSmartAccountClient.ts new file mode 100644 index 000000000..9916f18da --- /dev/null +++ b/src/client/createSmartAccountClient.ts @@ -0,0 +1,93 @@ +import { + type SmartAccountActions, + type SmartAccountClientConfig, + smartAccountActions +} from "permissionless" + +import { type Chain, type Client, type Transport, createClient } from "viem" +import type { Prettify } from "viem/chains" + +import type { + ENTRYPOINT_ADDRESS_V07_TYPE, + SmartAccount +} from "../account/utils/types.js" +import type { BundlerRpcSchema } from "../bundler/utils/types.js" + +export type SmartAccountClient< + entryPoint extends ENTRYPOINT_ADDRESS_V07_TYPE, + transport extends Transport = Transport, + chain extends Chain | undefined = Chain | undefined, + account extends SmartAccount | undefined = + | SmartAccount + | undefined +> = Prettify< + Client< + transport, + chain, + account, + BundlerRpcSchema, + SmartAccountActions + > +> + +/** + * Creates a EIP-4337 compliant Bundler Client with a given [Transport](https://viem.sh/docs/clients/intro.html) configured for a [Chain](https://viem.sh/docs/clients/chains.html). + * + * - Docs: https://docs.pimlico.io/permissionless/reference/clients/smartAccountClient + * + * A Bundler Client is an interface to "erc 4337" [JSON-RPC API](https://eips.ethereum.org/EIPS/eip-4337#rpc-methods-eth-namespace) methods such as sending user operation, estimating gas for a user operation, get user operation receipt, etc through Bundler Actions. + * + * @param parameters - {@link WalletClientConfig} + * @returns A Bundler Client. {@link SmartAccountClient} + * + * @example + * import { createPublicClient, http } from 'viem' + * import { mainnet } from 'viem/chains' + * + * const smartAccountClient = createSmartAccountClient({ + * chain: mainnet, + * transport: http(BUNDLER_URL), + * }) + */ + +export function createSmartAccountClient< + TSmartAccount extends SmartAccount, + TTransport extends Transport = Transport, + TChain extends Chain = Chain +>( + parameters: SmartAccountClientConfig< + ENTRYPOINT_ADDRESS_V07_TYPE, + TTransport, + TChain, + TSmartAccount + > +): SmartAccountClient< + ENTRYPOINT_ADDRESS_V07_TYPE, + TTransport, + TChain, + TSmartAccount +> { + const { + key = "Account", + name = "Smart Account Client", + bundlerTransport + } = parameters + const client = createClient({ + ...parameters, + key, + name, + transport: bundlerTransport, + type: "smartAccountClient" + }) + + return client.extend( + smartAccountActions({ + middleware: parameters.middleware + }) + ) as SmartAccountClient< + ENTRYPOINT_ADDRESS_V07_TYPE, + TTransport, + TChain, + TSmartAccount + > +} diff --git a/src/client/index.ts b/src/client/index.ts new file mode 100644 index 000000000..8048caefa --- /dev/null +++ b/src/client/index.ts @@ -0,0 +1,4 @@ +export { + type SmartAccountClient, + createSmartAccountClient +} from "./createSmartAccountClient.js" diff --git a/src/index.ts b/src/index.ts index bfb629013..44daadaa2 100644 --- a/src/index.ts +++ b/src/index.ts @@ -3,4 +3,6 @@ export { walletClientToSmartAccountSigner } from "./account/index.js" +export { createSmartAccountClient } from "./client/index.js" + // TODO import from the rest of the files in the core package diff --git a/tests/account.test.ts b/tests/account.test.ts index 152750d30..0a6b9a460 100644 --- a/tests/account.test.ts +++ b/tests/account.test.ts @@ -1,3 +1,4 @@ +import { baseSepolia } from "viem/chains" import { beforeAll, describe, expect, test } from "vitest" import { @@ -19,6 +20,7 @@ import { DEFAULT_ECDSA_OWNERSHIP_MODULE } from "../src/account/utils/constants.j import { SignTransactionNotSupportedBySmartAccount } from "../src/account/utils/errors.js" import { getChain } from "../src/account/utils/helpers.js" import { extractChainIdFromBundlerUrl } from "../src/bundler/utils/helpers.js" +import { createSmartAccountClient } from "../src/client/createSmartAccountClient.js" describe("Biconomy Smart Account core tests", () => { let smartAccount: Awaited> @@ -49,6 +51,17 @@ describe("Biconomy Smart Account core tests", () => { }) }) + test("Should create a smart account client", async () => { + const smartAccountClient = createSmartAccountClient({ + account: smartAccount, + entryPoint: "0x0000000071727De22E5E9d8BAf0edAc6f37da032", + chain: baseSepolia, + bundlerTransport: http(bundlerUrl) + }) + + console.log(smartAccountClient, "CLIENT") + }) + test("Should get account address + nonce", async () => { const address = smartAccount.address console.log("Smart Account Address: ", address)