@zerodev/sdk 4.0.16 → 4.0.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +109 -0
- package/dist/cjs/kernel-zerodev/abis/RecoveryActionAbi.d.ts +15 -0
- package/dist/cjs/kernel-zerodev/abis/RecoveryActionAbi.js +24 -0
- package/dist/cjs/kernel-zerodev/abis/RecoveryActionAbi.js.map +1 -0
- package/dist/cjs/kernel-zerodev/abis/WeightedValidatorAbi.d.ts +296 -0
- package/dist/cjs/kernel-zerodev/abis/WeightedValidatorAbi.js +389 -0
- package/dist/cjs/kernel-zerodev/abis/WeightedValidatorAbi.js.map +1 -0
- package/dist/cjs/kernel-zerodev/account.d.ts +2 -0
- package/dist/cjs/kernel-zerodev/account.js +30 -0
- package/dist/cjs/kernel-zerodev/account.js.map +1 -1
- package/dist/cjs/kernel-zerodev/api/index.d.ts +2 -0
- package/dist/cjs/kernel-zerodev/api/index.js +28 -1
- package/dist/cjs/kernel-zerodev/api/index.js.map +1 -1
- package/dist/cjs/kernel-zerodev/constants.d.ts +2 -0
- package/dist/cjs/kernel-zerodev/constants.js +3 -1
- package/dist/cjs/kernel-zerodev/constants.js.map +1 -1
- package/dist/cjs/kernel-zerodev/ethers-provider/account-signer.d.ts +1 -1
- package/dist/cjs/kernel-zerodev/owner/passkey/utils.js +1 -1
- package/dist/cjs/kernel-zerodev/owner/passkey/utils.js.map +1 -1
- package/dist/cjs/kernel-zerodev/provider.js.map +1 -1
- package/dist/cjs/kernel-zerodev/validator/base.d.ts +2 -0
- package/dist/cjs/kernel-zerodev/validator/base.js +9 -0
- package/dist/cjs/kernel-zerodev/validator/base.js.map +1 -1
- package/dist/cjs/kernel-zerodev/validator/index.d.ts +2 -1
- package/dist/cjs/kernel-zerodev/validator/index.js +4 -1
- package/dist/cjs/kernel-zerodev/validator/index.js.map +1 -1
- package/dist/cjs/kernel-zerodev/validator/recovery-validator.d.ts +52 -0
- package/dist/cjs/kernel-zerodev/validator/recovery-validator.js +298 -0
- package/dist/cjs/kernel-zerodev/validator/recovery-validator.js.map +1 -0
- package/dist/cjs/kernel-zerodev/validator/session-key-validator.d.ts +1 -1
- package/dist/cjs/kernel-zerodev/validator/session-key-validator.js +14 -1
- package/dist/cjs/kernel-zerodev/validator/session-key-validator.js.map +1 -1
- package/dist/cjs/kernel-zerodev/validator/types.d.ts +7 -1
- package/dist/cjs/kernel-zerodev/validator/types.js.map +1 -1
- package/dist/cjs/kernel-zerodev/validator-provider/base.d.ts +2 -2
- package/dist/cjs/kernel-zerodev/validator-provider/base.js +7 -3
- package/dist/cjs/kernel-zerodev/validator-provider/base.js.map +1 -1
- package/dist/cjs/kernel-zerodev/validator-provider/ecdsa-provider.d.ts +1 -1
- package/dist/cjs/kernel-zerodev/validator-provider/erc165-session-key-provider.d.ts +1 -1
- package/dist/cjs/kernel-zerodev/validator-provider/index.d.ts +2 -1
- package/dist/cjs/kernel-zerodev/validator-provider/index.js +4 -1
- package/dist/cjs/kernel-zerodev/validator-provider/index.js.map +1 -1
- package/dist/cjs/kernel-zerodev/validator-provider/kill-switch-provider.d.ts +1 -1
- package/dist/cjs/kernel-zerodev/validator-provider/recovery-provider.d.ts +26 -0
- package/dist/cjs/kernel-zerodev/validator-provider/recovery-provider.js +278 -0
- package/dist/cjs/kernel-zerodev/validator-provider/recovery-provider.js.map +1 -0
- package/dist/cjs/kernel-zerodev/validator-provider/session-key-provider.d.ts +1 -1
- package/dist/cjs/kernel-zerodev/validator-provider/types.d.ts +3 -0
- package/dist/cjs/kernel-zerodev/validator-provider/types.js.map +1 -1
- package/dist/esm/kernel-zerodev/abis/RecoveryActionAbi.d.ts +15 -0
- package/dist/esm/kernel-zerodev/abis/RecoveryActionAbi.js +21 -0
- package/dist/esm/kernel-zerodev/abis/RecoveryActionAbi.js.map +1 -0
- package/dist/esm/kernel-zerodev/abis/WeightedValidatorAbi.d.ts +296 -0
- package/dist/esm/kernel-zerodev/abis/WeightedValidatorAbi.js +386 -0
- package/dist/esm/kernel-zerodev/abis/WeightedValidatorAbi.js.map +1 -0
- package/dist/esm/kernel-zerodev/account.d.ts +2 -0
- package/dist/esm/kernel-zerodev/account.js +30 -0
- package/dist/esm/kernel-zerodev/account.js.map +1 -1
- package/dist/esm/kernel-zerodev/api/index.d.ts +2 -0
- package/dist/esm/kernel-zerodev/api/index.js +25 -0
- package/dist/esm/kernel-zerodev/api/index.js.map +1 -1
- package/dist/esm/kernel-zerodev/constants.d.ts +2 -0
- package/dist/esm/kernel-zerodev/constants.js +2 -0
- package/dist/esm/kernel-zerodev/constants.js.map +1 -1
- package/dist/esm/kernel-zerodev/ethers-provider/account-signer.d.ts +1 -1
- package/dist/esm/kernel-zerodev/owner/passkey/utils.js +1 -1
- package/dist/esm/kernel-zerodev/owner/passkey/utils.js.map +1 -1
- package/dist/esm/kernel-zerodev/provider.js.map +1 -1
- package/dist/esm/kernel-zerodev/validator/base.d.ts +2 -0
- package/dist/esm/kernel-zerodev/validator/base.js +9 -0
- package/dist/esm/kernel-zerodev/validator/base.js.map +1 -1
- package/dist/esm/kernel-zerodev/validator/index.d.ts +2 -1
- package/dist/esm/kernel-zerodev/validator/index.js +3 -1
- package/dist/esm/kernel-zerodev/validator/index.js.map +1 -1
- package/dist/esm/kernel-zerodev/validator/recovery-validator.d.ts +52 -0
- package/dist/esm/kernel-zerodev/validator/recovery-validator.js +292 -0
- package/dist/esm/kernel-zerodev/validator/recovery-validator.js.map +1 -0
- package/dist/esm/kernel-zerodev/validator/session-key-validator.d.ts +1 -1
- package/dist/esm/kernel-zerodev/validator/session-key-validator.js +14 -1
- package/dist/esm/kernel-zerodev/validator/session-key-validator.js.map +1 -1
- package/dist/esm/kernel-zerodev/validator/types.d.ts +7 -1
- package/dist/esm/kernel-zerodev/validator/types.js.map +1 -1
- package/dist/esm/kernel-zerodev/validator-provider/base.d.ts +2 -2
- package/dist/esm/kernel-zerodev/validator-provider/base.js +7 -3
- package/dist/esm/kernel-zerodev/validator-provider/base.js.map +1 -1
- package/dist/esm/kernel-zerodev/validator-provider/ecdsa-provider.d.ts +1 -1
- package/dist/esm/kernel-zerodev/validator-provider/erc165-session-key-provider.d.ts +1 -1
- package/dist/esm/kernel-zerodev/validator-provider/index.d.ts +2 -1
- package/dist/esm/kernel-zerodev/validator-provider/index.js +3 -1
- package/dist/esm/kernel-zerodev/validator-provider/index.js.map +1 -1
- package/dist/esm/kernel-zerodev/validator-provider/kill-switch-provider.d.ts +1 -1
- package/dist/esm/kernel-zerodev/validator-provider/recovery-provider.d.ts +26 -0
- package/dist/esm/kernel-zerodev/validator-provider/recovery-provider.js +271 -0
- package/dist/esm/kernel-zerodev/validator-provider/recovery-provider.js.map +1 -0
- package/dist/esm/kernel-zerodev/validator-provider/session-key-provider.d.ts +1 -1
- package/dist/esm/kernel-zerodev/validator-provider/types.d.ts +3 -0
- package/dist/esm/kernel-zerodev/validator-provider/types.js.map +1 -1
- package/dist/types/kernel-zerodev/abis/RecoveryActionAbi.d.ts +16 -0
- package/dist/types/kernel-zerodev/abis/RecoveryActionAbi.d.ts.map +1 -0
- package/dist/types/kernel-zerodev/abis/WeightedValidatorAbi.d.ts +297 -0
- package/dist/types/kernel-zerodev/abis/WeightedValidatorAbi.d.ts.map +1 -0
- package/dist/types/kernel-zerodev/account.d.ts +2 -0
- package/dist/types/kernel-zerodev/account.d.ts.map +1 -1
- package/dist/types/kernel-zerodev/api/index.d.ts +2 -0
- package/dist/types/kernel-zerodev/api/index.d.ts.map +1 -1
- package/dist/types/kernel-zerodev/constants.d.ts +2 -0
- package/dist/types/kernel-zerodev/constants.d.ts.map +1 -1
- package/dist/types/kernel-zerodev/ethers-provider/account-signer.d.ts +1 -1
- package/dist/types/kernel-zerodev/ethers-provider/account-signer.d.ts.map +1 -1
- package/dist/types/kernel-zerodev/validator/base.d.ts +2 -0
- package/dist/types/kernel-zerodev/validator/base.d.ts.map +1 -1
- package/dist/types/kernel-zerodev/validator/index.d.ts +2 -1
- package/dist/types/kernel-zerodev/validator/index.d.ts.map +1 -1
- package/dist/types/kernel-zerodev/validator/recovery-validator.d.ts +53 -0
- package/dist/types/kernel-zerodev/validator/recovery-validator.d.ts.map +1 -0
- package/dist/types/kernel-zerodev/validator/session-key-validator.d.ts +1 -1
- package/dist/types/kernel-zerodev/validator/session-key-validator.d.ts.map +1 -1
- package/dist/types/kernel-zerodev/validator/types.d.ts +7 -1
- package/dist/types/kernel-zerodev/validator/types.d.ts.map +1 -1
- package/dist/types/kernel-zerodev/validator-provider/base.d.ts +2 -2
- package/dist/types/kernel-zerodev/validator-provider/base.d.ts.map +1 -1
- package/dist/types/kernel-zerodev/validator-provider/ecdsa-provider.d.ts +1 -1
- package/dist/types/kernel-zerodev/validator-provider/ecdsa-provider.d.ts.map +1 -1
- package/dist/types/kernel-zerodev/validator-provider/erc165-session-key-provider.d.ts +1 -1
- package/dist/types/kernel-zerodev/validator-provider/erc165-session-key-provider.d.ts.map +1 -1
- package/dist/types/kernel-zerodev/validator-provider/index.d.ts +2 -1
- package/dist/types/kernel-zerodev/validator-provider/index.d.ts.map +1 -1
- package/dist/types/kernel-zerodev/validator-provider/kill-switch-provider.d.ts +1 -1
- package/dist/types/kernel-zerodev/validator-provider/kill-switch-provider.d.ts.map +1 -1
- package/dist/types/kernel-zerodev/validator-provider/recovery-provider.d.ts +27 -0
- package/dist/types/kernel-zerodev/validator-provider/recovery-provider.d.ts.map +1 -0
- package/dist/types/kernel-zerodev/validator-provider/session-key-provider.d.ts +1 -1
- package/dist/types/kernel-zerodev/validator-provider/session-key-provider.d.ts.map +1 -1
- package/dist/types/kernel-zerodev/validator-provider/types.d.ts +3 -0
- package/dist/types/kernel-zerodev/validator-provider/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/kernel-zerodev/abis/RecoveryActionAbi.ts +20 -0
- package/src/kernel-zerodev/abis/WeightedValidatorAbi.ts +385 -0
- package/src/kernel-zerodev/account.ts +33 -0
- package/src/kernel-zerodev/api/index.ts +32 -0
- package/src/kernel-zerodev/constants.ts +3 -0
- package/src/kernel-zerodev/owner/passkey/utils.ts +2 -2
- package/src/kernel-zerodev/provider.ts +1 -1
- package/src/kernel-zerodev/validator/base.ts +11 -0
- package/src/kernel-zerodev/validator/index.ts +3 -0
- package/src/kernel-zerodev/validator/recovery-validator.ts +366 -0
- package/src/kernel-zerodev/validator/session-key-validator.ts +17 -4
- package/src/kernel-zerodev/validator/types.ts +10 -1
- package/src/kernel-zerodev/validator-provider/base.ts +7 -3
- package/src/kernel-zerodev/validator-provider/index.ts +3 -0
- package/src/kernel-zerodev/validator-provider/recovery-provider.ts +350 -0
- package/src/kernel-zerodev/validator-provider/types.ts +6 -0
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { ECDSAValidator } from "./ecdsa-validator.js";
|
|
2
2
|
import { ERC165SessionKeyValidator } from "./erc165-session-key-validator.js";
|
|
3
3
|
import { KillSwitchValidator } from "./kill-switch-validator.js";
|
|
4
|
+
import { RecoveryValidator } from "./recovery-validator.js";
|
|
4
5
|
import { SessionKeyValidator } from "./session-key-validator.js";
|
|
5
6
|
import type { ValidatorMap } from "./types.js";
|
|
6
7
|
|
|
@@ -9,6 +10,7 @@ export const Validators: ValidatorMap = {
|
|
|
9
10
|
KILL_SWITCH: KillSwitchValidator,
|
|
10
11
|
ERC165_SESSION_KEY: ERC165SessionKeyValidator,
|
|
11
12
|
SESSION_KEY: SessionKeyValidator,
|
|
13
|
+
RECOVERY: RecoveryValidator,
|
|
12
14
|
};
|
|
13
15
|
|
|
14
16
|
export {
|
|
@@ -16,4 +18,5 @@ export {
|
|
|
16
18
|
KillSwitchValidator,
|
|
17
19
|
ERC165SessionKeyValidator,
|
|
18
20
|
SessionKeyValidator,
|
|
21
|
+
RecoveryValidator,
|
|
19
22
|
};
|
|
@@ -0,0 +1,366 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getChain,
|
|
3
|
+
type Address,
|
|
4
|
+
type Hex,
|
|
5
|
+
type SmartAccountSigner,
|
|
6
|
+
type UserOperationRequest,
|
|
7
|
+
type SignTypedDataParams,
|
|
8
|
+
} from "@alchemy/aa-core";
|
|
9
|
+
import {
|
|
10
|
+
KernelBaseValidator,
|
|
11
|
+
ValidatorMode,
|
|
12
|
+
type KernelBaseValidatorParams,
|
|
13
|
+
} from "./base.js";
|
|
14
|
+
import {
|
|
15
|
+
concatHex,
|
|
16
|
+
encodeAbiParameters,
|
|
17
|
+
encodeFunctionData,
|
|
18
|
+
getContract,
|
|
19
|
+
parseAbiParameters,
|
|
20
|
+
type LocalAccount,
|
|
21
|
+
createWalletClient,
|
|
22
|
+
type WalletClient,
|
|
23
|
+
http,
|
|
24
|
+
custom,
|
|
25
|
+
type Transport,
|
|
26
|
+
type Chain,
|
|
27
|
+
type Account,
|
|
28
|
+
publicActions,
|
|
29
|
+
getFunctionSelector,
|
|
30
|
+
} from "viem";
|
|
31
|
+
import { WeightedValidatorAbi } from "../abis/WeightedValidatorAbi.js";
|
|
32
|
+
import { getChainId } from "../api/index.js";
|
|
33
|
+
import {
|
|
34
|
+
CHAIN_ID_TO_NODE,
|
|
35
|
+
DUMMY_ECDSA_SIG,
|
|
36
|
+
RECOVERY_ACTION,
|
|
37
|
+
} from "../constants.js";
|
|
38
|
+
import { KernelAccountAbi } from "../abis/KernelAccountAbi.js";
|
|
39
|
+
import { fixSignedData } from "../utils.js";
|
|
40
|
+
import type { EthereumProvider } from "./types.js";
|
|
41
|
+
import { polygonMumbai } from "viem/chains";
|
|
42
|
+
import { RecoveryActionAbi } from "../abis/RecoveryActionAbi.js";
|
|
43
|
+
|
|
44
|
+
interface WeightedGuardians {
|
|
45
|
+
[guardian: Address]: number;
|
|
46
|
+
}
|
|
47
|
+
export interface RecoveryValidatorParams extends KernelBaseValidatorParams {
|
|
48
|
+
guardians?: WeightedGuardians;
|
|
49
|
+
threshold?: number;
|
|
50
|
+
delaySeconds?: number;
|
|
51
|
+
accountSigner?: SmartAccountSigner;
|
|
52
|
+
guardianAccountOrProvider?: LocalAccount<string> | EthereumProvider;
|
|
53
|
+
walletClient?: WalletClient<Transport, Chain>;
|
|
54
|
+
signatures?: Hex;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export type RecoveryConfig = Required<
|
|
58
|
+
Pick<RecoveryValidatorParams, "guardians" | "threshold" | "delaySeconds">
|
|
59
|
+
>;
|
|
60
|
+
|
|
61
|
+
export function isLocalAccount(account: any): account is LocalAccount<string> {
|
|
62
|
+
return account && account.signTransaction !== undefined;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export function isEthereumProvider(
|
|
66
|
+
provider: any
|
|
67
|
+
): provider is EthereumProvider {
|
|
68
|
+
return provider && provider.request !== undefined;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
type WalletClientAccountType<T> = T extends LocalAccount<string>
|
|
72
|
+
? Account
|
|
73
|
+
: T extends EthereumProvider
|
|
74
|
+
? undefined
|
|
75
|
+
: never;
|
|
76
|
+
|
|
77
|
+
export const recoverySelector = getFunctionSelector(
|
|
78
|
+
"doRecovery(address, bytes)"
|
|
79
|
+
);
|
|
80
|
+
|
|
81
|
+
export class RecoveryValidator extends KernelBaseValidator {
|
|
82
|
+
protected guardians?: WeightedGuardians;
|
|
83
|
+
protected threshold?: number;
|
|
84
|
+
protected delaySeconds: number;
|
|
85
|
+
protected accountSigner?: SmartAccountSigner;
|
|
86
|
+
protected guardianAccountOrProvider?: LocalAccount<string> | EthereumProvider;
|
|
87
|
+
protected signatures?: Hex;
|
|
88
|
+
walletClient?: WalletClient<
|
|
89
|
+
Transport,
|
|
90
|
+
Chain,
|
|
91
|
+
WalletClientAccountType<typeof this.guardianAccountOrProvider>
|
|
92
|
+
>;
|
|
93
|
+
|
|
94
|
+
constructor(params: RecoveryValidatorParams) {
|
|
95
|
+
super(params);
|
|
96
|
+
this.guardians = params.guardians;
|
|
97
|
+
this.threshold = params.threshold;
|
|
98
|
+
this.delaySeconds = params.delaySeconds ?? 0;
|
|
99
|
+
this.accountSigner = params.accountSigner;
|
|
100
|
+
this.mode = params.mode ?? ValidatorMode.plugin;
|
|
101
|
+
this.guardianAccountOrProvider = params.guardianAccountOrProvider;
|
|
102
|
+
this.signatures = params.signatures;
|
|
103
|
+
this.validAfter = params.validAfter ?? 0;
|
|
104
|
+
this.validUntil = params.validUntil ?? 0;
|
|
105
|
+
this.executor = params.executor ?? RECOVERY_ACTION;
|
|
106
|
+
this.selector = params.selector ?? recoverySelector;
|
|
107
|
+
if (isLocalAccount(params.guardianAccountOrProvider)) {
|
|
108
|
+
this.walletClient = createWalletClient({
|
|
109
|
+
account: params.guardianAccountOrProvider,
|
|
110
|
+
chain: this.chain ?? polygonMumbai,
|
|
111
|
+
transport: http(CHAIN_ID_TO_NODE[this.chain?.id ?? polygonMumbai.id]),
|
|
112
|
+
}).extend(publicActions);
|
|
113
|
+
} else if (isEthereumProvider(params.guardianAccountOrProvider)) {
|
|
114
|
+
this.walletClient = createWalletClient({
|
|
115
|
+
chain: this.chain ?? polygonMumbai,
|
|
116
|
+
transport: custom(params.guardianAccountOrProvider),
|
|
117
|
+
}).extend(publicActions);
|
|
118
|
+
} else if (params.walletClient) {
|
|
119
|
+
this.walletClient = params.walletClient.extend(publicActions);
|
|
120
|
+
} else if (params.guardianAccountOrProvider) {
|
|
121
|
+
throw Error("Incorrect guardianAccountOrProvider type");
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
public static async init(
|
|
126
|
+
params: RecoveryValidatorParams
|
|
127
|
+
): Promise<RecoveryValidator> {
|
|
128
|
+
const chainId = await getChainId(params.projectId);
|
|
129
|
+
if (!chainId) {
|
|
130
|
+
throw new Error("ChainId not found");
|
|
131
|
+
}
|
|
132
|
+
const chain = getChain(chainId);
|
|
133
|
+
const instance = new RecoveryValidator({ ...params, chain });
|
|
134
|
+
return instance;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
getNonceKey(): bigint {
|
|
138
|
+
return BigInt(this.validatorAddress);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
setRecoverySignatures(signatures: Hex) {
|
|
142
|
+
this.signatures = signatures;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
getRecoverySignatures(): Hex | undefined {
|
|
146
|
+
return this.signatures;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
getRecoveryConfig(): RecoveryConfig {
|
|
150
|
+
if (
|
|
151
|
+
this.guardians === undefined ||
|
|
152
|
+
!this.threshold ||
|
|
153
|
+
Object.entries(this.guardians).length !== this.threshold
|
|
154
|
+
) {
|
|
155
|
+
throw Error("Recovery config unintialised");
|
|
156
|
+
}
|
|
157
|
+
return {
|
|
158
|
+
guardians: this.guardians,
|
|
159
|
+
threshold: this.threshold,
|
|
160
|
+
delaySeconds: this.delaySeconds,
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
async signer(): Promise<SmartAccountSigner> {
|
|
165
|
+
if (!this.accountSigner) {
|
|
166
|
+
throw Error("AccountSigner not set");
|
|
167
|
+
}
|
|
168
|
+
return await Promise.resolve(this.accountSigner);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
async getEnableData(): Promise<Hex> {
|
|
172
|
+
if (
|
|
173
|
+
this.guardians === undefined ||
|
|
174
|
+
!this.threshold ||
|
|
175
|
+
Object.entries(this.guardians).length !== this.threshold
|
|
176
|
+
) {
|
|
177
|
+
throw Error("Recovery config unintialised");
|
|
178
|
+
}
|
|
179
|
+
return encodeAbiParameters(
|
|
180
|
+
parseAbiParameters(
|
|
181
|
+
"address[] guardians, uint24[] weights, uint24 threshold, uint48 delay"
|
|
182
|
+
),
|
|
183
|
+
[
|
|
184
|
+
Object.keys(this.guardians) as Address[],
|
|
185
|
+
Object.values(this.guardians),
|
|
186
|
+
this.threshold,
|
|
187
|
+
this.delaySeconds,
|
|
188
|
+
]
|
|
189
|
+
);
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
encodeEnable(recoveryData: Hex): Hex {
|
|
193
|
+
return encodeFunctionData({
|
|
194
|
+
abi: WeightedValidatorAbi,
|
|
195
|
+
functionName: "enable",
|
|
196
|
+
args: [recoveryData],
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
encodeDisable(disableData: Hex = "0x"): Hex {
|
|
201
|
+
return encodeFunctionData({
|
|
202
|
+
abi: WeightedValidatorAbi,
|
|
203
|
+
functionName: "disable",
|
|
204
|
+
args: [disableData],
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
encodeApprove(callDataAndNonceHash: Hex, kernelAccountAddress: Address): Hex {
|
|
209
|
+
return encodeFunctionData({
|
|
210
|
+
abi: WeightedValidatorAbi,
|
|
211
|
+
functionName: "approve",
|
|
212
|
+
args: [callDataAndNonceHash, kernelAccountAddress],
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
encodeApproveWithSig(
|
|
217
|
+
callDataAndNonceHash: Hex,
|
|
218
|
+
kernelAccountAddress: Address,
|
|
219
|
+
sigs: Hex
|
|
220
|
+
): Hex {
|
|
221
|
+
return encodeFunctionData({
|
|
222
|
+
abi: WeightedValidatorAbi,
|
|
223
|
+
functionName: "approveWithSig",
|
|
224
|
+
args: [callDataAndNonceHash, kernelAccountAddress, sigs],
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
encodeVeto(callDataAndNonceHash: Hex): Hex {
|
|
229
|
+
return encodeFunctionData({
|
|
230
|
+
abi: WeightedValidatorAbi,
|
|
231
|
+
functionName: "veto",
|
|
232
|
+
args: [callDataAndNonceHash],
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
encodeRecoveryAction(enableData: Hex, defaultValidatorAddress: Address): Hex {
|
|
237
|
+
return encodeFunctionData({
|
|
238
|
+
abi: RecoveryActionAbi,
|
|
239
|
+
functionName: "doRecovery",
|
|
240
|
+
args: [defaultValidatorAddress, enableData],
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
async isPluginEnabled(
|
|
245
|
+
kernelAccountAddress: Address,
|
|
246
|
+
selector: Hex
|
|
247
|
+
): Promise<boolean> {
|
|
248
|
+
if (
|
|
249
|
+
this.guardians === undefined ||
|
|
250
|
+
!this.threshold ||
|
|
251
|
+
Object.entries(this.guardians).length !== this.threshold
|
|
252
|
+
) {
|
|
253
|
+
throw Error("Recovery config unintialised");
|
|
254
|
+
}
|
|
255
|
+
if (!this.publicClient) {
|
|
256
|
+
throw new Error("Validator uninitialized: PublicClient missing");
|
|
257
|
+
}
|
|
258
|
+
try {
|
|
259
|
+
const kernel = getContract({
|
|
260
|
+
abi: KernelAccountAbi,
|
|
261
|
+
address: kernelAccountAddress,
|
|
262
|
+
publicClient: this.publicClient,
|
|
263
|
+
});
|
|
264
|
+
const execDetail = await kernel.read.getExecution([selector]);
|
|
265
|
+
const enableData = await this.publicClient.readContract({
|
|
266
|
+
abi: WeightedValidatorAbi,
|
|
267
|
+
address: this.validatorAddress,
|
|
268
|
+
functionName: "weightedStorage",
|
|
269
|
+
args: [kernelAccountAddress],
|
|
270
|
+
});
|
|
271
|
+
|
|
272
|
+
return (
|
|
273
|
+
execDetail.validator.toLowerCase() ===
|
|
274
|
+
this.validatorAddress.toLowerCase() &&
|
|
275
|
+
enableData[0] ===
|
|
276
|
+
Object.values(this.guardians).reduce((a, c) => a + c, 0) &&
|
|
277
|
+
enableData[1] === this.threshold &&
|
|
278
|
+
enableData[2] === this.delaySeconds &&
|
|
279
|
+
this.isGuardiansEnabled(kernelAccountAddress)
|
|
280
|
+
);
|
|
281
|
+
} catch (error) {
|
|
282
|
+
return false;
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
async isGuardiansEnabled(kernelAccountAddress: Address): Promise<boolean> {
|
|
287
|
+
if (
|
|
288
|
+
this.guardians === undefined ||
|
|
289
|
+
!this.threshold ||
|
|
290
|
+
Object.entries(this.guardians).length !== this.threshold
|
|
291
|
+
) {
|
|
292
|
+
throw Error("Recovery config unintialised");
|
|
293
|
+
}
|
|
294
|
+
const weightedValidator = getContract({
|
|
295
|
+
abi: WeightedValidatorAbi,
|
|
296
|
+
address: this.validatorAddress,
|
|
297
|
+
publicClient: this.publicClient,
|
|
298
|
+
});
|
|
299
|
+
for (const [addr, weight] of Object.entries(this.guardians)) {
|
|
300
|
+
const result = await weightedValidator.read.guardian([
|
|
301
|
+
addr as Address,
|
|
302
|
+
kernelAccountAddress,
|
|
303
|
+
]);
|
|
304
|
+
if (result[0] !== weight) {
|
|
305
|
+
return false;
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
return true;
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
async getDummyUserOpSignature(): Promise<Hex> {
|
|
312
|
+
let dummySignature: Hex = "0x";
|
|
313
|
+
if (this.signatures) {
|
|
314
|
+
const totalSigs = this.signatures.substring(2).length / 130;
|
|
315
|
+
for (let i = 0; i < totalSigs; i++) {
|
|
316
|
+
dummySignature = concatHex([dummySignature, DUMMY_ECDSA_SIG]);
|
|
317
|
+
}
|
|
318
|
+
// Hack - Fix this to not send original signatures
|
|
319
|
+
return this.signatures;
|
|
320
|
+
}
|
|
321
|
+
return DUMMY_ECDSA_SIG;
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
async signMessage(message: string | Uint8Array): Promise<Hex> {
|
|
325
|
+
if (!this.accountSigner) {
|
|
326
|
+
throw Error("AccountSigner not set");
|
|
327
|
+
}
|
|
328
|
+
return await this.accountSigner.signMessage(message);
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
async signTypedData(params: SignTypedDataParams): Promise<Hex> {
|
|
332
|
+
if (!this.accountSigner) {
|
|
333
|
+
throw Error("AccountSigner not set");
|
|
334
|
+
}
|
|
335
|
+
return fixSignedData(await this.accountSigner.signTypedData(params));
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
async signRecoveryHash(recoveryHash: Hex): Promise<Hex> {
|
|
339
|
+
if (!this.chain) {
|
|
340
|
+
throw new Error("Validator uninitialized");
|
|
341
|
+
}
|
|
342
|
+
const signer = await this.signer();
|
|
343
|
+
return await signer.signTypedData({
|
|
344
|
+
domain: {
|
|
345
|
+
name: "WeightedECDSAValidator",
|
|
346
|
+
version: "1",
|
|
347
|
+
chainId: this.chain.id,
|
|
348
|
+
verifyingContract: this.validatorAddress,
|
|
349
|
+
},
|
|
350
|
+
types: {
|
|
351
|
+
Approve: [{ name: "callDataAndNonceHash", type: "bytes32" }],
|
|
352
|
+
},
|
|
353
|
+
message: {
|
|
354
|
+
callDataAndNonceHash: recoveryHash,
|
|
355
|
+
},
|
|
356
|
+
primaryType: "Approve",
|
|
357
|
+
});
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
async signUserOp(_userOp: UserOperationRequest): Promise<Hex> {
|
|
361
|
+
if (!this.chain) {
|
|
362
|
+
throw new Error("Validator uninitialized");
|
|
363
|
+
}
|
|
364
|
+
return this.signatures ?? DUMMY_ECDSA_SIG;
|
|
365
|
+
}
|
|
366
|
+
}
|
|
@@ -35,6 +35,13 @@ import type { Operation } from "../provider.js";
|
|
|
35
35
|
import { getChainId } from "../api/index.js";
|
|
36
36
|
import { fixSignedData } from "../utils.js";
|
|
37
37
|
|
|
38
|
+
// We need to be able to serialize bigint to transmit session key over
|
|
39
|
+
// the network.
|
|
40
|
+
// Using this trick: https://github.com/GoogleChromeLabs/jsbi/issues/30#issuecomment-1006086291
|
|
41
|
+
(BigInt.prototype as any).toJSON = function () {
|
|
42
|
+
return this.toString();
|
|
43
|
+
};
|
|
44
|
+
|
|
38
45
|
export interface SessionKeyValidatorParams extends KernelBaseValidatorParams {
|
|
39
46
|
sessionKey: SmartAccountSigner;
|
|
40
47
|
sessionKeyData: SessionKeyData;
|
|
@@ -67,7 +74,7 @@ export interface ParamRules {
|
|
|
67
74
|
|
|
68
75
|
export interface Permission {
|
|
69
76
|
target: Address;
|
|
70
|
-
valueLimit:
|
|
77
|
+
valueLimit: bigint;
|
|
71
78
|
sig: Hex;
|
|
72
79
|
rules: ParamRules[];
|
|
73
80
|
operation: Operation;
|
|
@@ -163,9 +170,15 @@ export class SessionKeyValidator extends KernelBaseValidator {
|
|
|
163
170
|
|
|
164
171
|
if (!valueLimitPermissions.length) return undefined;
|
|
165
172
|
|
|
166
|
-
const sortedPermissions = valueLimitPermissions.sort(
|
|
167
|
-
(
|
|
168
|
-
|
|
173
|
+
const sortedPermissions = valueLimitPermissions.sort((a, b) => {
|
|
174
|
+
if (b.valueLimit > a.valueLimit) {
|
|
175
|
+
return 1;
|
|
176
|
+
} else if (b.valueLimit < a.valueLimit) {
|
|
177
|
+
return -1;
|
|
178
|
+
} else {
|
|
179
|
+
return 0;
|
|
180
|
+
}
|
|
181
|
+
});
|
|
169
182
|
|
|
170
183
|
return this.findPermissionByRule(sortedPermissions, args[2]);
|
|
171
184
|
} catch (error) {
|
|
@@ -11,6 +11,10 @@ import type {
|
|
|
11
11
|
KillSwitchValidator,
|
|
12
12
|
KillSwitchValidatorParams,
|
|
13
13
|
} from "./kill-switch-validator.js";
|
|
14
|
+
import type {
|
|
15
|
+
RecoveryValidator,
|
|
16
|
+
RecoveryValidatorParams,
|
|
17
|
+
} from "./recovery-validator.js";
|
|
14
18
|
import type {
|
|
15
19
|
SessionKeyValidator,
|
|
16
20
|
SessionKeyValidatorParams,
|
|
@@ -24,13 +28,15 @@ export type SupportedValidators =
|
|
|
24
28
|
| "ECDSA"
|
|
25
29
|
| "KILL_SWITCH"
|
|
26
30
|
| "ERC165_SESSION_KEY"
|
|
27
|
-
| "SESSION_KEY"
|
|
31
|
+
| "SESSION_KEY"
|
|
32
|
+
| "RECOVERY";
|
|
28
33
|
|
|
29
34
|
export type ValidatorTypeMap = {
|
|
30
35
|
ECDSA: ECDSAValidator;
|
|
31
36
|
KILL_SWITCH: KillSwitchValidator;
|
|
32
37
|
ERC165_SESSION_KEY: ERC165SessionKeyValidator;
|
|
33
38
|
SESSION_KEY: SessionKeyValidator;
|
|
39
|
+
RECOVERY: RecoveryValidator;
|
|
34
40
|
};
|
|
35
41
|
|
|
36
42
|
export type ValidatorParamsMap = {
|
|
@@ -38,6 +44,7 @@ export type ValidatorParamsMap = {
|
|
|
38
44
|
KILL_SWITCH: KillSwitchValidatorParams;
|
|
39
45
|
ERC165_SESSION_KEY: ERC165SessionKeyValidatorParams;
|
|
40
46
|
SESSION_KEY: SessionKeyValidatorParams;
|
|
47
|
+
RECOVERY: RecoveryValidatorParams;
|
|
41
48
|
};
|
|
42
49
|
|
|
43
50
|
export type ValidatorMap = {
|
|
@@ -46,4 +53,6 @@ export type ValidatorMap = {
|
|
|
46
53
|
) => ValidatorTypeMap[V];
|
|
47
54
|
};
|
|
48
55
|
|
|
56
|
+
export type EthereumProvider = { request(...args: any): Promise<any> };
|
|
57
|
+
|
|
49
58
|
export type { ParamRules, Permission, SessionKeyData, SessionKeyParams };
|
|
@@ -74,6 +74,7 @@ export abstract class ValidatorProvider<
|
|
|
74
74
|
projectId: params.projectId,
|
|
75
75
|
bundlerProvider,
|
|
76
76
|
});
|
|
77
|
+
this.defaultProvider = params.defaultProvider;
|
|
77
78
|
this.connect(
|
|
78
79
|
() =>
|
|
79
80
|
new KernelSmartContractAccount({
|
|
@@ -117,7 +118,7 @@ export abstract class ValidatorProvider<
|
|
|
117
118
|
return await this.account.validator.encodeEnable(enableData);
|
|
118
119
|
};
|
|
119
120
|
|
|
120
|
-
getEncodedDisableData = async (disableData: Hex): Promise<Hex> => {
|
|
121
|
+
getEncodedDisableData = async (disableData: Hex = "0x"): Promise<Hex> => {
|
|
121
122
|
if (!isKernelAccount(this.account) || !this.account.validator) {
|
|
122
123
|
throw new Error(
|
|
123
124
|
"ValidatorProvider: account with validator is not set, did you call all connects first?"
|
|
@@ -143,7 +144,7 @@ export abstract class ValidatorProvider<
|
|
|
143
144
|
};
|
|
144
145
|
|
|
145
146
|
sendDisableUserOperation = async (
|
|
146
|
-
disableData: Hex
|
|
147
|
+
disableData: Hex = "0x"
|
|
147
148
|
): Promise<SendUserOperationResult> => {
|
|
148
149
|
const encodedDisableData = await this.getEncodedDisableData(disableData);
|
|
149
150
|
if (!isKernelAccount(this.account) || !this.account.validator) {
|
|
@@ -151,8 +152,11 @@ export abstract class ValidatorProvider<
|
|
|
151
152
|
"ValidatorProvider: account with validator is not set, did you call all connects first?"
|
|
152
153
|
);
|
|
153
154
|
}
|
|
155
|
+
if (!this.defaultProvider) {
|
|
156
|
+
throw Error("Default Validator provider unintialized");
|
|
157
|
+
}
|
|
154
158
|
|
|
155
|
-
return await this.sendUserOperation({
|
|
159
|
+
return await this.defaultProvider.sendUserOperation({
|
|
156
160
|
target: this.account.validator.validatorAddress,
|
|
157
161
|
data: encodedDisableData,
|
|
158
162
|
});
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { ECDSAProvider } from "./ecdsa-provider.js";
|
|
2
2
|
import { ERC165SessionKeyProvider } from "./erc165-session-key-provider.js";
|
|
3
3
|
import { KillSwitchProvider } from "./kill-switch-provider.js";
|
|
4
|
+
import { RecoveryProvider } from "./recovery-provider.js";
|
|
4
5
|
import { SessionKeyProvider } from "./session-key-provider.js";
|
|
5
6
|
import type { ValidatorProviderMap } from "./types.js";
|
|
6
7
|
|
|
@@ -9,6 +10,7 @@ export const ValidatorProviders: ValidatorProviderMap = {
|
|
|
9
10
|
KILL_SWITCH: KillSwitchProvider,
|
|
10
11
|
ERC165_SESSION_KEY: ERC165SessionKeyProvider,
|
|
11
12
|
SESSION_KEY: SessionKeyProvider,
|
|
13
|
+
RECOVERY: RecoveryProvider,
|
|
12
14
|
};
|
|
13
15
|
|
|
14
16
|
export {
|
|
@@ -16,4 +18,5 @@ export {
|
|
|
16
18
|
KillSwitchProvider,
|
|
17
19
|
ERC165SessionKeyProvider,
|
|
18
20
|
SessionKeyProvider,
|
|
21
|
+
RecoveryProvider,
|
|
19
22
|
};
|