UNPKG

@fastlane-labs/shbundler-sdk

Version:

SDK for interacting with Fastlane's 4337 ShBundler

1 lines 9.68 kB
{"version":3,"sources":["../src/client.ts","../src/utils/gas.ts","../src/utils/networks.ts"],"sourcesContent":["import {\n createPublicClient,\n createWalletClient,\n http,\n type Address,\n type Chain,\n} from \"viem\";\nimport {\n createBundlerClient,\n createPaymasterClient,\n entryPoint07Address,\n entryPoint08Address,\n sendUserOperation as sendUserOperationViem,\n} from \"viem/account-abstraction\";\nimport {\n toSimpleSmartAccount,\n toSafeSmartAccount,\n} from \"permissionless/accounts\";\nimport { toAccount } from \"viem/accounts\";\nimport { createSmartAccountClient } from \"permissionless\";\n\nimport {\n ShBundlerClientOptions,\n ShBundlerFromSmartAccountOptions,\n ShBundlerSDK,\n SendUserOperationParams,\n} from \"./types\";\n\nimport { getUserOperationGasPrice } from \"./utils/gas\";\nimport { fetchNetworkDefaults } from \"./utils/networks\";\n\ntype SmartAccountInstance = Awaited<ReturnType<typeof toSimpleSmartAccount>> |\n Awaited<ReturnType<typeof toSafeSmartAccount>>;\n\nasync function buildShBundlerSDK({\n smartAccount,\n rpcUrl,\n chain,\n bundlerUrl,\n paymasterUrl,\n paymasterAddress,\n}: {\n smartAccount: SmartAccountInstance;\n rpcUrl: string;\n chain: Chain;\n bundlerUrl: string;\n paymasterUrl: string;\n paymasterAddress: Address;\n}): Promise<ShBundlerSDK> {\n const publicClient = createPublicClient({\n transport: http(rpcUrl),\n chain,\n });\n\n const walletClient = createWalletClient({\n transport: http(rpcUrl),\n account: smartAccount,\n });\n\n const paymasterClient = createPaymasterClient({\n transport: http(paymasterUrl),\n });\n\n let bundlerClient: ReturnType<typeof createBundlerClient>;\n\n bundlerClient = createBundlerClient({\n transport: http(bundlerUrl),\n name: \"shBundler\",\n account: smartAccount,\n client: publicClient,\n paymaster: paymasterClient,\n userOperation: {\n estimateFeesPerGas: async () => getUserOperationGasPrice(bundlerClient),\n },\n });\n\n const sendUserOperation = async ({\n to,\n data,\n chain,\n paymasterContext,\n }: SendUserOperationParams) => {\n const dynamicSmartAccountClient = createSmartAccountClient({\n client: publicClient,\n chain,\n bundlerTransport: http(bundlerUrl),\n account: smartAccount,\n userOperation: {\n estimateFeesPerGas: async () => getUserOperationGasPrice(bundlerClient),\n },\n paymaster: paymasterClient,\n paymasterContext,\n });\n\n return sendUserOperationViem(dynamicSmartAccountClient, {\n account: smartAccount,\n calls: [{ to, data }],\n });\n };\n\n return {\n publicClient,\n walletClient,\n smartAccount,\n paymasterClient,\n bundlerClient,\n sendUserOperation,\n };\n}\n\nexport async function createShBundlerClient(\n opts: ShBundlerClientOptions\n): Promise<ShBundlerSDK> {\n const {\n signer,\n rpcUrl,\n chain,\n bundlerUrl: inputBundlerUrl,\n paymasterUrl: inputPaymasterUrl,\n paymasterAddress: inputPaymasterAddress,\n entryPointVersion = \"0.8\",\n } = opts;\n\n if (!signer || !rpcUrl || !chain) {\n throw new Error(\"signer, rpcUrl, and chain are required\");\n }\n\n const publicClient = createPublicClient({\n transport: http(rpcUrl),\n chain,\n });\n\n const chainId = await publicClient.getChainId();\n\n const defaults = (await fetchNetworkDefaults(chainId)) || {};\n const bundlerUrl = inputBundlerUrl || defaults.bundlerUrl;\n const paymasterUrl = inputPaymasterUrl || defaults.paymasterUrl;\n const paymasterAddress = inputPaymasterAddress || defaults.paymasterAddress;\n\n if (!bundlerUrl || !paymasterUrl || !paymasterAddress) {\n throw new Error(\"Missing bundlerUrl, paymasterUrl, or paymasterAddress and no defaults found\");\n }\n\n const entryPointAddress =\n entryPointVersion === \"0.7\" ? entryPoint07Address : entryPoint08Address;\n\n const smartAccountSimple = await toSimpleSmartAccount({\n client: publicClient,\n entryPoint: {\n address: entryPointAddress,\n version: entryPointVersion,\n },\n owner: toAccount(signer),\n });\n\n const smartAccountV08MonadTestnet = await toSafeSmartAccount({\n client: publicClient as any,\n entryPoint: {\n address: entryPoint08Address,\n version: \"0.7\",\n },\n owners: [signer as any],\n version: \"1.4.1\",\n safe4337ModuleAddress: \"0x02b336F533F2de3F221540eF56583e9cb8E65203\",\n safeProxyFactoryAddress: \"0xd9d2Ba03a7754250FDD71333F444636471CACBC4\",\n safeSingletonAddress: \"0x639245e8476E03e789a244f279b5843b9633b2E7\",\n safeModuleSetupAddress: \"0x2dd68b007B46fBe91B9A7c3EDa5A7a1063cB5b47\",\n multiSendAddress: \"0x7B21BBDBdE8D01Df591fdc2dc0bE9956Dde1e16C\",\n multiSendCallOnlyAddress: \"0x32228dDEA8b9A2bd7f2d71A958fF241D79ca5eEC\",\n });\n\n const smartAccount: SmartAccountInstance =\n chainId !== 10143\n ? smartAccountSimple\n : entryPointVersion === \"0.7\"\n ? smartAccountSimple\n : smartAccountV08MonadTestnet;\n\n return buildShBundlerSDK({\n smartAccount,\n rpcUrl,\n chain,\n bundlerUrl,\n paymasterUrl,\n paymasterAddress,\n });\n}\n\nexport async function createShBundlerClientFromSmartAccount(\n opts: ShBundlerFromSmartAccountOptions\n): Promise<ShBundlerSDK> {\n const {\n smartAccount,\n rpcUrl,\n chain,\n bundlerUrl,\n paymasterUrl,\n paymasterAddress,\n } = opts;\n\n if (!rpcUrl || !chain || !bundlerUrl || !paymasterUrl || !paymasterAddress) {\n throw new Error(\"All fields are required to use a precomputed smartAccount\");\n }\n\n return buildShBundlerSDK({\n smartAccount,\n rpcUrl,\n chain,\n bundlerUrl,\n paymasterUrl,\n paymasterAddress,\n });\n}\n","import { BundlerClient } from \"viem/account-abstraction\";\nimport { GasPriceResult } from \"../types\";\nimport { hexToBigInt } from \"viem\";\n\nexport async function getUserOperationGasPrice(\n bundlerClient: BundlerClient\n): Promise<GasPriceResult> {\n const resultEncoded = await bundlerClient.request<any>({\n method: \"gas_getUserOperationGasPrice\",\n params: [],\n });\n\n return {\n maxFeePerGas: hexToBigInt(resultEncoded.standard.maxFeePerGas),\n maxPriorityFeePerGas: hexToBigInt(resultEncoded.standard.maxPriorityFeePerGas),\n };\n}\n","export async function fetchNetworkDefaults(chainId: number) {\n const url = \"https://raw.githubusercontent.com/FastLane-Labs/shbundler-sdk/main/configs/networks.json\";\n const res = await fetch(url);\n const data = await res.json();\n\n return data[chainId] || null;\n}"],"mappings":"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","names":["chain"]}