Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: to ConfigId helper #127

Open
wants to merge 11 commits into
base: main
Choose a base branch
from
6 changes: 6 additions & 0 deletions src/module/smart-sessions/policies/types.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
import { Hex, Address } from 'viem'

export enum PolicyType {
Action = 'Action',
ERC1271 = 'ERC1271',
UserOp = 'UserOp',
}

export type Policy = {
policy: Address
address: Address
Expand Down
85 changes: 85 additions & 0 deletions src/module/smart-sessions/policies/utils.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
import { keccak256, encodePacked, Hex, Address } from 'viem'
import { PolicyType } from './types'

type ConfigId = Hex
type PermissionId = Hex
type ActionId = Hex
type ActionPolicyId = Hex
type Erc1271PolicyId = Hex
type UserOpPolicyId = Hex
type FunctionSelector = Hex

function toActionPolicyId(
permissionId: PermissionId,
actionId: ActionId,
): ActionPolicyId {
return keccak256(
encodePacked(['bytes32', 'bytes32'], [permissionId, actionId]),
) as ActionPolicyId
}

function toErc1271PolicyId(permissionId: PermissionId): Erc1271PolicyId {
return keccak256(
encodePacked(['string', 'bytes32'], ['ERC1271: ', permissionId]),
) as Erc1271PolicyId
}

function toUserOpPolicyId(permissionId: PermissionId): UserOpPolicyId {
return permissionId as UserOpPolicyId
}

export function toActionId(
target: Address,
functionSelector: FunctionSelector,
): ActionId {
return keccak256(
encodePacked(['address', 'bytes4'], [target, functionSelector]),
)
}

function toConfigId(
policyId: ActionPolicyId | Erc1271PolicyId | UserOpPolicyId,
account: Address,
): ConfigId {
return keccak256(
encodePacked(['address', 'bytes32'], [account, policyId]),
) as ConfigId
}

export function getConfigId(
permissionId: PermissionId,
policyType: PolicyType,
account: Address,
actionId?: ActionId,
actionTarget?: Address,
functionSelector?: FunctionSelector,
): ConfigId {
switch (policyType) {
case PolicyType.Action:
actionId =
actionId ??
(actionTarget && functionSelector
? toActionId(actionTarget, functionSelector)
: (() => {
throw new Error(
'Either ActionId or ActionTarget and FunctionSelector are required for Action Policy',
)
})())
return toConfigId(
toActionPolicyId(permissionId, actionId) as ActionPolicyId,
account,
)
case PolicyType.ERC1271:
return toConfigId(
toErc1271PolicyId(permissionId) as Erc1271PolicyId,
account,
)
case PolicyType.UserOp:
return toConfigId(
toUserOpPolicyId(permissionId) as UserOpPolicyId,
account,
)
default:
throw new Error('Unknown Policy Type')
}
}
4 changes: 2 additions & 2 deletions test/unit/module/ownableValidator/ownableValidator.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ describe('Ownable Validator Module', () => {
account,
client,
})
expect(allOwners.length).toEqual(0)
expect(allOwners.length).toEqual(1)
})

it('should return ownable validator threshold', async () => {
Expand All @@ -89,6 +89,6 @@ describe('Ownable Validator Module', () => {
account,
})

expect(threshold).toEqual(0)
expect(threshold).toEqual(1)
})
})