@getclave/permissionless
Version:
A utility library for working with ERC-4337
237 lines (200 loc) • 7.09 kB
text/typescript
import { isHash, zeroAddress } from "viem"
import {
type UserOperation,
entryPoint06Address,
entryPoint07Address,
entryPoint08Address
} from "viem/account-abstraction"
import { describe, expect } from "vitest"
import { testWithRpc } from "../../../permissionless-test/src/testWithRpc"
import {
getBundlerClient,
getPimlicoClient,
getSimpleAccountClient
} from "../../../permissionless-test/src/utils"
import { sponsorUserOperation } from "./sponsorUserOperation"
describe("sponsorUserOperation", () => {
testWithRpc("sponsorUserOperation_V06", async ({ rpc }) => {
const { altoRpc, paymasterRpc } = rpc
const bundlerClient = getPimlicoClient({
entryPointVersion: "0.6",
altoRpc: altoRpc
})
const simpleAccountClient = getBundlerClient({
account: await getSimpleAccountClient({
...rpc,
entryPoint: {
version: "0.6"
}
}),
entryPoint: {
version: "0.6"
},
...rpc
})
const preparedUserOp = await simpleAccountClient.prepareUserOperation({
calls: [
{
to: zeroAddress,
data: "0x",
value: 0n
}
]
})
const paymasterClient = getPimlicoClient({
entryPointVersion: "0.6",
altoRpc: paymasterRpc
})
const sponsorResult = await sponsorUserOperation(paymasterClient, {
userOperation: preparedUserOp,
entryPoint: {
address: entryPoint06Address,
version: "0.6"
}
})
const finalUserOp = {
...preparedUserOp,
...sponsorResult
}
const account = simpleAccountClient.account
finalUserOp.signature = await account.signUserOperation(finalUserOp)
const opHash = await simpleAccountClient.sendUserOperation(finalUserOp)
expect(isHash(opHash)).toBe(true)
const userOperationReceipt =
await bundlerClient.waitForUserOperationReceipt({
hash: opHash,
timeout: 100000
})
expect(userOperationReceipt).not.toBeNull()
expect(userOperationReceipt?.userOpHash).toBe(opHash)
expect(userOperationReceipt?.receipt.transactionHash).toBeTruthy()
const receipt = await bundlerClient.getUserOperationReceipt({
hash: opHash
})
expect(receipt?.receipt.transactionHash).toBe(
userOperationReceipt?.receipt.transactionHash
)
})
testWithRpc("sponsorUserOperation_V07", async ({ rpc }) => {
const { altoRpc, paymasterRpc } = rpc
const bundlerClient = getPimlicoClient({
entryPointVersion: "0.7",
altoRpc: altoRpc
})
const simpleAccountClient = getBundlerClient({
account: await getSimpleAccountClient({
...rpc,
entryPoint: {
version: "0.7"
}
}),
entryPoint: {
version: "0.7"
},
...rpc
})
const preparedUserOp = await simpleAccountClient.prepareUserOperation({
calls: [
{
to: zeroAddress,
data: "0x",
value: 0n
}
]
})
const paymasterClient = getPimlicoClient({
entryPointVersion: "0.7",
altoRpc: paymasterRpc
})
const sponsorResult = await sponsorUserOperation(paymasterClient, {
userOperation: preparedUserOp,
entryPoint: {
address: entryPoint07Address,
version: "0.7"
}
})
const finalUserOp = {
...preparedUserOp,
...sponsorResult
}
const account = simpleAccountClient.account
finalUserOp.signature = await account.signUserOperation(finalUserOp)
const opHash = await simpleAccountClient.sendUserOperation(finalUserOp)
expect(isHash(opHash)).toBe(true)
const userOperationReceipt =
await bundlerClient.waitForUserOperationReceipt({
hash: opHash,
timeout: 100000
})
expect(userOperationReceipt).not.toBeNull()
expect(userOperationReceipt?.userOpHash).toBe(opHash)
expect(userOperationReceipt?.receipt.transactionHash).toBeTruthy()
const receipt = await bundlerClient.getUserOperationReceipt({
hash: opHash
})
expect(receipt?.receipt.transactionHash).toBe(
userOperationReceipt?.receipt.transactionHash
)
})
testWithRpc("sponsorUserOperation_V08", async ({ rpc }) => {
const { altoRpc, paymasterRpc } = rpc
const bundlerClient = getPimlicoClient({
entryPointVersion: "0.8",
altoRpc: altoRpc
})
const simpleAccountClient = getBundlerClient({
account: await getSimpleAccountClient({
...rpc,
entryPoint: {
version: "0.8"
}
}),
entryPoint: {
version: "0.8"
},
...rpc
})
const preparedUserOp = (await simpleAccountClient.prepareUserOperation({
calls: [
{
to: zeroAddress,
data: "0x",
value: 0n
}
]
})) as UserOperation<"0.8">
const paymasterClient = getPimlicoClient({
entryPointVersion: "0.8",
altoRpc: paymasterRpc
})
const sponsorResult = await sponsorUserOperation(paymasterClient, {
userOperation: preparedUserOp,
entryPoint: {
address: entryPoint08Address,
version: "0.8"
}
})
const finalUserOp = {
...preparedUserOp,
...sponsorResult
}
const account = simpleAccountClient.account
finalUserOp.signature = await account.signUserOperation(finalUserOp)
const opHash = await simpleAccountClient.sendUserOperation(finalUserOp)
expect(isHash(opHash)).toBe(true)
const userOperationReceipt =
await bundlerClient.waitForUserOperationReceipt({
hash: opHash,
timeout: 100000
})
expect(userOperationReceipt).not.toBeNull()
expect(userOperationReceipt?.userOpHash).toBe(opHash)
expect(userOperationReceipt?.receipt.transactionHash).toBeTruthy()
const receipt = await bundlerClient.getUserOperationReceipt({
hash: opHash
})
expect(receipt?.receipt.transactionHash).toBe(
userOperationReceipt?.receipt.transactionHash
)
})
})