Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file modified bun.lockb
Binary file not shown.
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
"@size-limit/esbuild-why": "^9.0.0",
"@size-limit/preset-small-lib": "^9.0.0",
"@types/semver": "^7.5.8",
"bun-types": "latest",
"ethers": "5",
"rimraf": "^5.0.1",
"simple-git-hooks": "^2.9.0",
Expand Down
14 changes: 7 additions & 7 deletions packages/core/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ export {
type SponsorUserOperationParameters,
type SponsorUserOperationReturnType
} from "./actions/paymaster/sponsorUserOperation.js"
export { type SmartAccountClientConfig } from "./clients/kernelAccountClient.js"
export type { SmartAccountClientConfig } from "./clients/kernelAccountClient.js"
export {
zerodevPaymasterActions,
type ZeroDevPaymasterClientActions,
Expand All @@ -40,12 +40,12 @@ export {
type CreateKernelMigrationAccountParameters
} from "./accounts/kernel/createKernelMigrationAccount.js"
export { createFallbackKernelAccountClient } from "./clients/fallbackKernelAccountClient.js"
export {
type KernelValidator,
type KernelValidatorHook,
type ZeroDevPaymasterRpcSchema,
type KernelPluginManager,
type Action
export type {
KernelValidator,
KernelValidatorHook,
ZeroDevPaymasterRpcSchema,
KernelPluginManager,
Action
} from "./types/kernel.js"
export { KernelAccountAbi } from "./accounts/kernel/abi/KernelAccountAbi.js"
export { KernelFactoryAbi } from "./accounts/kernel/abi/KernelFactoryAbi.js"
Expand Down
350 changes: 350 additions & 0 deletions packages/test/v0.7/permissionValidator.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,9 @@ import {
getAbiItem,
hashMessage,
hashTypedData,
hexToBytes,
pad,
parseAbi,
parseEther,
toFunctionSelector,
zeroAddress
Expand Down Expand Up @@ -1229,6 +1232,353 @@ describe("Permission kernel Account", () => {
TEST_TIMEOUT
)

test(
"Smart account client send transaction with CallPolicy V0.0.5",
async () => {
const callPolicy = toCallPolicy({
policyVersion: CallPolicyVersion.V0_0_5,
permissions: [
{
abi: TEST_ERC20Abi,
target: Test_ERC20Address,
functionName: "transfer",
args: [
{
condition: ParamCondition.EQUAL,
value: owner.address
},
null
]
}
]
})

const permissionSmartAccountClient = await getKernelAccountClient({
account: await getSignerToPermissionKernelAccount([callPolicy]),
paymaster: zeroDevPaymaster
})

await mintToAccount(
permissionSmartAccountClient.account.address,
100000000n
)

const amountToTransfer = 10000n
const transferData = encodeFunctionData({
abi: TEST_ERC20Abi,
functionName: "transfer",
args: [owner.address, amountToTransfer]
})

const balanceOfReceipientBefore = await publicClient.readContract({
abi: TEST_ERC20Abi,
address: Test_ERC20Address,
functionName: "balanceOf",
args: [owner.address]
})

console.log("balanceOfReceipientBefore", balanceOfReceipientBefore)

const response = await permissionSmartAccountClient.sendTransaction(
{
to: Test_ERC20Address,
data: transferData
}
)

console.log("Transaction hash:", response)

const balanceOfReceipientAfter = await publicClient.readContract({
abi: TEST_ERC20Abi,
address: Test_ERC20Address,
functionName: "balanceOf",
args: [owner.address]
})

console.log("balanceOfReceipientAfter", balanceOfReceipientAfter)

expect(balanceOfReceipientAfter).toBe(
balanceOfReceipientBefore + amountToTransfer
)
},
TEST_TIMEOUT
)

test(
"Smart account client send transaction with SLICE_EQUAL condition with bytes",
async () => {
const testAbi = parseAbi(["function test(bytes data) public"])

const callPolicy = toCallPolicy({
policyVersion: CallPolicyVersion.V0_0_5,
permissions: [
{
abi: testAbi,
target: zeroAddress,
functionName: "test",
args: [
{
condition: ParamCondition.SLICE_EQUAL,
value: "0xff",
start: 1,
length: 1
}
]
}
]
})

const permissionSmartAccountClient = await getKernelAccountClient({
account: await getSignerToPermissionKernelAccount([callPolicy]),
paymaster: zeroDevPaymaster
})

const callData = encodeFunctionData({
abi: testAbi,
functionName: "test",
args: ["0x00ff"]
})

const response = await permissionSmartAccountClient.sendTransaction(
{
to: zeroAddress,
data: callData
}
)

console.log("Transaction hash:", response)
},
TEST_TIMEOUT
)

test(
"Smart account client send transaction with SLICE_EQUAL condition with string",
async () => {
const testAbi = parseAbi([
"function test(string calldata data) public"
])

const callPolicy = toCallPolicy({
policyVersion: CallPolicyVersion.V0_0_5,
permissions: [
{
abi: testAbi,
target: zeroAddress,
functionName: "test",
args: [
{
condition: ParamCondition.SLICE_EQUAL,
value: "kernel",
start: 2,
length: 6
}
]
}
]
})

const permissionSmartAccountClient = await getKernelAccountClient({
account: await getSignerToPermissionKernelAccount([callPolicy]),
paymaster: zeroDevPaymaster
})

const callData = encodeFunctionData({
abi: testAbi,
functionName: "test",
args: ["0xkernel"]
})

const response = await permissionSmartAccountClient.sendTransaction(
{
to: zeroAddress,
data: callData
}
)

console.log("Transaction hash:", response)
},
TEST_TIMEOUT
)

test(
"Smart account client send transaction with SLICE_EQUAL condition with hex string",
async () => {
const testAbi = parseAbi([
"function test(string calldata data) public"
])

const callPolicy = toCallPolicy({
policyVersion: CallPolicyVersion.V0_0_5,
permissions: [
{
abi: testAbi,
target: zeroAddress,
functionName: "test",
args: [
{
condition: ParamCondition.SLICE_EQUAL,
value: "0xffff",
start: 0,
length: 6
}
]
}
]
})

const permissionSmartAccountClient = await getKernelAccountClient({
account: await getSignerToPermissionKernelAccount([callPolicy]),
paymaster: zeroDevPaymaster
})

const callData = encodeFunctionData({
abi: testAbi,
functionName: "test",
args: ["0xffff00"]
})

const response = await permissionSmartAccountClient.sendTransaction(
{
to: zeroAddress,
data: callData
}
)

console.log("Transaction hash:", response)
},
TEST_TIMEOUT
)

test(
"should fail with Smart account client send transaction with SLICE_EQUAL condition",
async () => {
const testAbi = parseAbi(["function test(bytes data) public"])

const callPolicy = toCallPolicy({
policyVersion: CallPolicyVersion.V0_0_5,
permissions: [
{
abi: testAbi,
target: zeroAddress,
functionName: "test",
args: [
{
condition: ParamCondition.SLICE_EQUAL,
value: "0xff",
start: 1,
length: 1
}
]
}
]
})

const permissionSmartAccountClient = await getKernelAccountClient({
account: await getSignerToPermissionKernelAccount([callPolicy]),
paymaster: zeroDevPaymaster
})

const invalidCallData = encodeFunctionData({
abi: testAbi,
functionName: "test",
args: ["0x00ee"]
})

await expect(
permissionSmartAccountClient.sendTransaction({
to: zeroAddress,
data: invalidCallData
})
).rejects.toThrow()
},
TEST_TIMEOUT
)

test(
"should fail with SLICE_EQUAL condition, start and length not provided",
async () => {
const testAbi = parseAbi(["function test(bytes data) public"])

expect(() =>
toCallPolicy({
policyVersion: CallPolicyVersion.V0_0_5,
permissions: [
{
abi: testAbi,
target: zeroAddress,
functionName: "test",
args: [
{
condition: ParamCondition.SLICE_EQUAL,
value: "0xff"
}
]
}
]
})
).toThrow("start and length are required for SLICE_EQUAL condition")
},
TEST_TIMEOUT
)

test(
"should fail with SLICE_EQUAL condition, value is not equal to the given length",
async () => {
const testAbi = parseAbi(["function test(bytes data) public"])

expect(() =>
toCallPolicy({
policyVersion: CallPolicyVersion.V0_0_5,
permissions: [
{
abi: testAbi,
target: zeroAddress,
functionName: "test",
args: [
{
condition: ParamCondition.SLICE_EQUAL,
value: "0x00ff",
start: 1,
length: 1
}
]
}
]
})
).toThrow("Value length is not equal to the given length")
},
TEST_TIMEOUT
)

test(
"should fail with SLICE_EQUAL condition, value is too short",
async () => {
const testAbi = parseAbi(["function test(bytes data) public"])

expect(() =>
toCallPolicy({
policyVersion: CallPolicyVersion.V0_0_5,
permissions: [
{
abi: testAbi,
target: zeroAddress,
functionName: "test",
args: [
{
condition: ParamCondition.SLICE_EQUAL,
value: "0xffff",
start: 1,
length: 2
}
]
}
]
})
).toThrow("Value is too short for the given start and length")
},
TEST_TIMEOUT
)

test(
"Smart account client send transaction with serialization/deserialization",
async () => {
Expand Down
Loading