diff --git a/package.json b/package.json index 855e553..fe91cbd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "userop", - "version": "0.4.0-beta.2", + "version": "0.4.0-beta.3", "description": "A simple JS library for building ERC-4337 UserOperations.", "types": "./dist/index.d.ts", "main": "./dist/index.js", @@ -23,17 +23,21 @@ "@types/jest": "^29.5.12", "eslint": "^8.57.0", "eslint-config-prettier": "^9.1.0", + "ethers": "^6.11.1", "jest": "^29.7.0", "nock": "^13.5.4", "prettier": "3.2.5", "rimraf": "^5.0.5", "ts-jest": "^29.1.2", "typescript": "^5.4.2", - "typescript-eslint": "^7.3.1" + "typescript-eslint": "^7.3.1", + "viem": "^2.9.12" }, "dependencies": { - "abitype": "^1.0.0", + "abitype": "^1.0.0" + }, + "peerDependencies": { "ethers": "^6.11.1", - "viem": "^2.7.19" + "viem": "^2.9.12" } } diff --git a/src/v06/account/commonConfigs/simpleAccount.ts b/src/v06/account/commonConfigs/simpleAccount.ts index 538b004..d4ef996 100644 --- a/src/v06/account/commonConfigs/simpleAccount.ts +++ b/src/v06/account/commonConfigs/simpleAccount.ts @@ -13,31 +13,20 @@ import { RequestSignature } from "../hooks"; const FACTORY_ADDRESS = "0x9406Cc6185a346906296840746125a0E44976454"; -type SimpleAccountArgsWithViemEOA = [ +export function base( ethClient: PublicClient | JsonRpcProvider, - eoa: E, -]; -type SimpleAccountArgsWithViemEOANoHoist = [ - ethClient: PublicClient | JsonRpcProvider, - eoa: E, + eoa: WalletClient, account: Account, -]; -type SimpleAccountArgsWithEthersSigner = [ +): RequiredAccountOpts; +export function base( ethClient: PublicClient | JsonRpcProvider, - eoa: E, -]; - -export const base = ( - ...args: E extends WalletClient - ? E["account"] extends Account - ? SimpleAccountArgsWithViemEOA - : SimpleAccountArgsWithViemEOANoHoist - : E extends Signer - ? SimpleAccountArgsWithEthersSigner - : never -): RequiredAccountOpts => { - const [ethClient, eoa, account] = args; - + eoa: WalletClient | Signer, +): RequiredAccountOpts; +export function base( + ethClient: PublicClient | JsonRpcProvider, + eoa: Signer | WalletClient, + account?: Account, +): RequiredAccountOpts { return { accountAbi: AccountAbi, factoryAbi: FactoryAbi, @@ -58,10 +47,13 @@ export const base = ( requestSignature: "getAddresses" in eoa ? account !== undefined - ? RequestSignature.withViemWalletClient(eoa, account) + ? RequestSignature.withViemWalletClient( + eoa as WalletClient, + account, + ) : RequestSignature.withViemWalletClient( eoa as WalletClient, ) : RequestSignature.withEthersSigner(eoa), }; -}; +} diff --git a/src/v06/account/hooks/requestSignature/viem.ts b/src/v06/account/hooks/requestSignature/viem.ts index 24b523c..87b092e 100644 --- a/src/v06/account/hooks/requestSignature/viem.ts +++ b/src/v06/account/hooks/requestSignature/viem.ts @@ -2,11 +2,17 @@ import { WalletClient, Account, Transport, Chain } from "viem"; import { privateKeyToAccount, generatePrivateKey } from "viem/accounts"; import { RequestSignatureFunc } from "../types"; -export const withViemWalletClient = ( - ...args: W["account"] extends Account - ? [client: W] - : [client: W, account: Account] -): RequestSignatureFunc => { +export function withViemWalletClient( + client: WalletClient, + account: Account, +): RequestSignatureFunc; +export function withViemWalletClient( + client: WalletClient, +): RequestSignatureFunc; +export function withViemWalletClient( + client: WalletClient, + account?: Account, +): RequestSignatureFunc { const dummy = privateKeyToAccount(generatePrivateKey()); return async (type, message) => { switch (type) { @@ -15,7 +21,6 @@ export const withViemWalletClient = ( } case "final": { - const [client, account] = args; if (account) { return client.signMessage({ account, message: { raw: message } }); } @@ -27,4 +32,4 @@ export const withViemWalletClient = ( } } }; -}; +} diff --git a/src/v06/account/instance.ts b/src/v06/account/instance.ts index 6b65ede..c0fadb0 100644 --- a/src/v06/account/instance.ts +++ b/src/v06/account/instance.ts @@ -9,11 +9,10 @@ import { concat, encodeFunctionData, PublicClient, - BaseError, - ContractFunctionRevertedError, RpcStateOverride, Hex, zeroAddress, + isAddress, } from "viem"; import { JsonRpcProvider, Contract } from "ethers"; import { @@ -213,20 +212,15 @@ export class Instance { functionName: "getSenderAddress", args: [await this.getInitCode()], }); - } catch (error) { - if (error instanceof BaseError) { - const revertError = error.walk( - (err) => err instanceof ContractFunctionRevertedError, - ); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + } catch (error: any) { + const metaMessage = error?.metaMessages?.[1]; + if (typeof metaMessage !== "string") throw error; - if (revertError instanceof ContractFunctionRevertedError) { - this.sender = revertError.data?.args?.[0] as Address; - } else { - throw error; - } - } else { - throw error; - } + const addr = metaMessage.trim().slice(1, -1); + if (!isAddress(addr)) throw error; + + this.sender = addr; } } diff --git a/yarn.lock b/yarn.lock index 99454c4..40de4b3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -899,9 +899,9 @@ integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== "@scure/base@~1.1.0", "@scure/base@~1.1.2": - version "1.1.5" - resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.5.tgz#1d85d17269fe97694b9c592552dd9e5e33552157" - integrity sha512-Brj9FiG2W1MRQSTB212YVPRrcbjkv48FoZi/u4l/zds/ieRrqsh7aUf6CLwkAq61oKXr/ZlTzlY66gLIj3TFTQ== + version "1.1.6" + resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.6.tgz#8ce5d304b436e4c84f896e0550c83e4d88cb917d" + integrity sha512-ok9AWwhcgYuGG3Zfhyqg+zwl+Wn5uE+dwC0NV/2qQkx4dABbb/bx96vWu8NSj+BNjjSjno+JRYRjle1jV08k3g== "@scure/bip32@1.3.2": version "1.3.2" @@ -3335,10 +3335,10 @@ v8-to-istanbul@^9.0.1: "@types/istanbul-lib-coverage" "^2.0.1" convert-source-map "^1.6.0" -viem@^2.7.19: - version "2.7.19" - resolved "https://registry.yarnpkg.com/viem/-/viem-2.7.19.tgz#fa6bd8f46df2f0332e5ca6d116772dff6f161a72" - integrity sha512-UOMeqy+8p2709ra2j9HEOL1NfjsXZzlJ8gwR6YO/zXH8KIZvyzW07t4iQARF5+ShVZ/7+/1ec8oPjVi1M//33A== +viem@^2.9.12: + version "2.9.12" + resolved "https://registry.yarnpkg.com/viem/-/viem-2.9.12.tgz#27a865f8bd95dc1de7931bbcad485bf561dc1027" + integrity sha512-wxeFgcdEbf9+CYGGS2NrxlbhZQc3kNDArEjFtI7jAMttcQSHle9KFps+kRa35poARi1LKS2MtAa9ODPloNRlcw== dependencies: "@adraffy/ens-normalize" "1.10.0" "@noble/curves" "1.2.0"