@zerodev/sdk 4.0.26 → 4.0.27
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 +1 -693
- package/dist/cjs/kernel-zerodev/api/index.d.ts +2 -0
- package/dist/cjs/kernel-zerodev/api/index.js +18 -1
- package/dist/cjs/kernel-zerodev/api/index.js.map +1 -1
- package/dist/cjs/kernel-zerodev/owner/passkey/createPasskeyOwner.js.map +1 -1
- package/dist/cjs/kernel-zerodev/owner/passkey/exceptions.js +1 -1
- package/dist/cjs/kernel-zerodev/owner/passkey/exceptions.js.map +1 -1
- package/dist/cjs/kernel-zerodev/owner/passkey/getAutocompletePasskeyOwner.js +3 -3
- package/dist/cjs/kernel-zerodev/owner/passkey/getAutocompletePasskeyOwner.js.map +1 -1
- package/dist/cjs/kernel-zerodev/owner/passkey/getPasskeyOwner.d.ts +1 -1
- package/dist/cjs/kernel-zerodev/owner/passkey/getPasskeyOwner.js +4 -2
- package/dist/cjs/kernel-zerodev/owner/passkey/getPasskeyOwner.js.map +1 -1
- package/dist/cjs/kernel-zerodev/owner/passkey/index.d.ts +1 -1
- package/dist/cjs/kernel-zerodev/owner/passkey/index.js.map +1 -1
- package/dist/cjs/kernel-zerodev/owner/passkey/utils.js +2 -2
- package/dist/cjs/kernel-zerodev/owner/passkey/utils.js.map +1 -1
- package/dist/cjs/kernel-zerodev/provider.js +2 -2
- package/dist/cjs/kernel-zerodev/provider.js.map +1 -1
- package/dist/cjs/kernel-zerodev/validator/recovery-validator.d.ts +8 -5
- package/dist/cjs/kernel-zerodev/validator/recovery-validator.js +50 -9
- package/dist/cjs/kernel-zerodev/validator/recovery-validator.js.map +1 -1
- package/dist/cjs/kernel-zerodev/validator-provider/recovery-provider.js +20 -32
- package/dist/cjs/kernel-zerodev/validator-provider/recovery-provider.js.map +1 -1
- package/dist/esm/kernel-zerodev/api/index.d.ts +2 -0
- package/dist/esm/kernel-zerodev/api/index.js +16 -0
- package/dist/esm/kernel-zerodev/api/index.js.map +1 -1
- package/dist/esm/kernel-zerodev/owner/passkey/createPasskeyOwner.js.map +1 -1
- package/dist/esm/kernel-zerodev/owner/passkey/exceptions.js +1 -1
- package/dist/esm/kernel-zerodev/owner/passkey/exceptions.js.map +1 -1
- package/dist/esm/kernel-zerodev/owner/passkey/getAutocompletePasskeyOwner.js +3 -3
- package/dist/esm/kernel-zerodev/owner/passkey/getAutocompletePasskeyOwner.js.map +1 -1
- package/dist/esm/kernel-zerodev/owner/passkey/getPasskeyOwner.d.ts +1 -1
- package/dist/esm/kernel-zerodev/owner/passkey/getPasskeyOwner.js +4 -2
- package/dist/esm/kernel-zerodev/owner/passkey/getPasskeyOwner.js.map +1 -1
- package/dist/esm/kernel-zerodev/owner/passkey/index.d.ts +1 -1
- package/dist/esm/kernel-zerodev/owner/passkey/index.js +1 -1
- package/dist/esm/kernel-zerodev/owner/passkey/index.js.map +1 -1
- package/dist/esm/kernel-zerodev/owner/passkey/utils.js +2 -2
- package/dist/esm/kernel-zerodev/owner/passkey/utils.js.map +1 -1
- package/dist/esm/kernel-zerodev/provider.js +2 -2
- package/dist/esm/kernel-zerodev/provider.js.map +1 -1
- package/dist/esm/kernel-zerodev/validator/recovery-validator.d.ts +8 -5
- package/dist/esm/kernel-zerodev/validator/recovery-validator.js +52 -11
- package/dist/esm/kernel-zerodev/validator/recovery-validator.js.map +1 -1
- package/dist/esm/kernel-zerodev/validator-provider/recovery-provider.js +23 -32
- package/dist/esm/kernel-zerodev/validator-provider/recovery-provider.js.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/owner/passkey/exceptions.d.ts.map +1 -1
- package/dist/types/kernel-zerodev/owner/passkey/getAutocompletePasskeyOwner.d.ts.map +1 -1
- package/dist/types/kernel-zerodev/owner/passkey/getPasskeyOwner.d.ts +1 -1
- package/dist/types/kernel-zerodev/owner/passkey/getPasskeyOwner.d.ts.map +1 -1
- package/dist/types/kernel-zerodev/owner/passkey/index.d.ts +1 -1
- package/dist/types/kernel-zerodev/owner/passkey/utils.d.ts.map +1 -1
- package/dist/types/kernel-zerodev/validator/recovery-validator.d.ts +8 -5
- package/dist/types/kernel-zerodev/validator/recovery-validator.d.ts.map +1 -1
- package/dist/types/kernel-zerodev/validator-provider/recovery-provider.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/kernel-zerodev/api/index.ts +27 -0
- package/src/kernel-zerodev/owner/passkey/createPasskeyOwner.ts +4 -4
- package/src/kernel-zerodev/owner/passkey/exceptions.ts +2 -2
- package/src/kernel-zerodev/owner/passkey/getAutocompletePasskeyOwner.ts +11 -9
- package/src/kernel-zerodev/owner/passkey/getPasskeyOwner.ts +5 -3
- package/src/kernel-zerodev/owner/passkey/index.ts +1 -1
- package/src/kernel-zerodev/owner/passkey/utils.ts +11 -6
- package/src/kernel-zerodev/provider.ts +2 -2
- package/src/kernel-zerodev/validator/recovery-validator.ts +59 -12
- package/src/kernel-zerodev/validator-provider/recovery-provider.ts +38 -36
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../../src/kernel-zerodev/owner/passkey/utils.ts"],"names":[],"mappings":";AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAO5D,eAAO,MAAM,eAAe;;CAE3B,
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../../src/kernel-zerodev/owner/passkey/utils.ts"],"names":[],"mappings":";AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAO5D,eAAO,MAAM,eAAe;;CAE3B,CAAC;AAEF,wBAAgB,aAAa,SAG5B;AAED,eAAO,MAAM,SAAS,eAAe,CAAC;AAEtC,eAAO,MAAM,KAAK,KAAK,CAAC;AAExB,eAAO,MAAM,oBAAoB,QAAO,WAKvC,CAAC;AAEF,eAAO,MAAM,eAAe,cAAe,WAAW,KAAG,MAMxD,CAAC;AAEF,eAAO,MAAM,yBAAyB,QAC/B,MAAM,MACP,MAAM,YACA,MAAM,aACL,MAAM,gBACH,MAAM,4CAmDrB,CAAC;AAEF,eAAO,MAAM,WAAW,QACjB,MAAM,GAAG,UAAU,MACpB,MAAM,YACA,MAAM,aACL,MAAM,gBACH,MAAM,4CAWrB,CAAC;AAEF,eAAO,MAAM,aAAa,WAChB,mBAAmB,MACvB,MAAM,YACA,MAAM,aACL,MAAM,gBACH,MAAM,4CAYrB,CAAC;AAEF,eAAO,MAAM,cAAc,cACd,MAAM,SACV,MAAM,kCAWd,CAAC;AAGF,wBAAgB,uBAAuB,CAAC,eAAe,EAAE,MAAM,GAAG,WAAW,CAyB5E"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type Address, type Hex, type SmartAccountSigner, type UserOperationRequest, type SignTypedDataParams } from "@alchemy/aa-core";
|
|
2
2
|
import { KernelBaseValidator, type KernelBaseValidatorParams } from "./base.js";
|
|
3
|
-
import { type LocalAccount, type WalletClient, type Transport, type Chain, type Account } from "viem";
|
|
3
|
+
import { type LocalAccount, type WalletClient, type Transport, type Chain, type Account, type PublicClient } from "viem";
|
|
4
4
|
import type { EthereumProvider } from "./types.js";
|
|
5
5
|
interface WeightedGuardians {
|
|
6
6
|
[guardian: Address]: number;
|
|
@@ -10,9 +10,10 @@ export interface RecoveryValidatorParams extends KernelBaseValidatorParams {
|
|
|
10
10
|
threshold?: number;
|
|
11
11
|
delaySeconds?: number;
|
|
12
12
|
accountSigner?: SmartAccountSigner;
|
|
13
|
-
|
|
13
|
+
localAccountOrProvider?: LocalAccount<string> | EthereumProvider;
|
|
14
14
|
walletClient?: WalletClient<Transport, Chain>;
|
|
15
15
|
signatures?: Hex;
|
|
16
|
+
recoveryId?: string;
|
|
16
17
|
}
|
|
17
18
|
export type RecoveryConfig = Required<Pick<RecoveryValidatorParams, "guardians" | "threshold" | "delaySeconds">>;
|
|
18
19
|
export declare function isLocalAccount(account: any): account is LocalAccount<string>;
|
|
@@ -24,14 +25,15 @@ export declare class RecoveryValidator extends KernelBaseValidator {
|
|
|
24
25
|
protected threshold?: number;
|
|
25
26
|
protected delaySeconds: number;
|
|
26
27
|
protected accountSigner?: SmartAccountSigner;
|
|
27
|
-
protected
|
|
28
|
+
protected localAccountOrProvider?: LocalAccount<string> | EthereumProvider;
|
|
28
29
|
protected signatures?: Hex;
|
|
29
|
-
|
|
30
|
+
protected recoveryId?: string;
|
|
31
|
+
walletClient?: WalletClient<Transport, Chain, WalletClientAccountType<typeof this.localAccountOrProvider>>;
|
|
30
32
|
constructor(params: RecoveryValidatorParams);
|
|
31
33
|
static init(params: RecoveryValidatorParams): Promise<RecoveryValidator>;
|
|
32
34
|
getNonceKey(): bigint;
|
|
33
35
|
setRecoverySignatures(signatures: Hex): void;
|
|
34
|
-
getRecoverySignatures(): Hex | undefined
|
|
36
|
+
getRecoverySignatures(): Promise<Hex | undefined>;
|
|
35
37
|
getRecoveryConfig(): RecoveryConfig;
|
|
36
38
|
signer(): Promise<SmartAccountSigner>;
|
|
37
39
|
getEnableData(): Promise<Hex>;
|
|
@@ -41,6 +43,7 @@ export declare class RecoveryValidator extends KernelBaseValidator {
|
|
|
41
43
|
encodeApproveWithSig(callDataAndNonceHash: Hex, kernelAccountAddress: Address, sigs: Hex): Hex;
|
|
42
44
|
encodeVeto(callDataAndNonceHash: Hex): Hex;
|
|
43
45
|
encodeRecoveryAction(enableData: Hex, defaultValidatorAddress: Address): Hex;
|
|
46
|
+
static fetchRecoveryConfigFromContract(kernelAccountAddress: Address, publicClient: PublicClient<Transport, Chain>): Promise<RecoveryConfig>;
|
|
44
47
|
isPluginEnabled(kernelAccountAddress: Address, selector: Hex): Promise<boolean>;
|
|
45
48
|
isGuardiansEnabled(kernelAccountAddress: Address): Promise<boolean>;
|
|
46
49
|
getDummyUserOpSignature(): Promise<Hex>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recovery-validator.d.ts","sourceRoot":"","sources":["../../../../src/kernel-zerodev/validator/recovery-validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,OAAO,EACZ,KAAK,GAAG,EACR,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACzB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,mBAAmB,EAEnB,KAAK,yBAAyB,EAC/B,MAAM,WAAW,CAAC;AACnB,OAAO,EAML,KAAK,YAAY,EAEjB,KAAK,YAAY,EAGjB,KAAK,SAAS,EACd,KAAK,KAAK,EACV,KAAK,OAAO,
|
|
1
|
+
{"version":3,"file":"recovery-validator.d.ts","sourceRoot":"","sources":["../../../../src/kernel-zerodev/validator/recovery-validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recovery-provider.d.ts","sourceRoot":"","sources":["../../../../src/kernel-zerodev/validator-provider/recovery-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,KAAK,+BAA+B,EACrC,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,iBAAiB,EACjB,KAAK,cAAc,EACnB,KAAK,uBAAuB,EAC7B,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAEL,KAAK,OAAO,EACZ,KAAK,uBAAuB,EAC7B,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"recovery-provider.d.ts","sourceRoot":"","sources":["../../../../src/kernel-zerodev/validator-provider/recovery-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,KAAK,+BAA+B,EACrC,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,iBAAiB,EACjB,KAAK,cAAc,EACnB,KAAK,uBAAuB,EAC7B,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAEL,KAAK,OAAO,EACZ,KAAK,uBAAuB,EAC7B,MAAM,kBAAkB,CAAC;AAS1B,OAAO,EAIL,KAAK,GAAG,EAGR,KAAK,kBAAkB,EAGxB,MAAM,MAAM,CAAC;AAKd,MAAM,WAAW,sBACf,SAAQ,+BAA+B,CAAC,uBAAuB,CAAC;IAChE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,GAAG,CAAC;CAClB;AAED,qBAAa,gBAAiB,SAAQ,iBAAiB,CACrD,iBAAiB,EACjB,uBAAuB,CACxB;IACC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,GAAG,CAAC;gBACL,MAAM,EAAE,sBAAsB;WA4BtB,IAAI,CACtB,MAAM,EAAE,sBAAsB,GAC7B,OAAO,CAAC,gBAAgB,CAAC;IA2DtB,mBAAmB,IAAI,OAAO,CAAC,OAAO,CAAC;IAUvC,sBAAsB,CAAC,UAAU,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IAerD,cAAc,IAAI,OAAO,CAAC,uBAAuB,CAAC;IAkBlD,gBAAgB,CAAC,UAAU,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC;IAexD,uBAAuB,IAAI,MAAM;WAQnB,yBAAyB,CACrC,cAAc,EAAE,MAAM,GACrB,cAAc;IAMX,eAAe,CAAC,UAAU,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,kBAAkB,CAAC;IA+B9D,YAAY,CAAC,UAAU,CAAC,EAAE,GAAG;IAyB7B,sBAAsB,CAC1B,UAAU,CAAC,EAAE,GAAG,EAChB,IAAI,CAAC,EAAE,GAAG,GACT,OAAO,CAAC,kBAAkB,CAAC;IAqCxB,cAAc,CAAC,UAAU,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAqBlE,cAAc,CAAC,UAAU,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAqBxE,kBAAkB,oEAAiC;CACpD"}
|
package/package.json
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import axios from "axios";
|
|
2
2
|
import { BACKEND_URL } from "../constants.js";
|
|
3
|
+
import type { Hex } from "viem";
|
|
3
4
|
|
|
4
5
|
export const getChainId = async (
|
|
5
6
|
projectId: string,
|
|
@@ -39,6 +40,32 @@ export const getRecoveryData = async (recoveryId: string) => {
|
|
|
39
40
|
}
|
|
40
41
|
};
|
|
41
42
|
|
|
43
|
+
export const postRecoveryData = async (
|
|
44
|
+
enableData: Hex,
|
|
45
|
+
scwAddress: Hex,
|
|
46
|
+
recoveryConfig: string
|
|
47
|
+
): Promise<string | undefined> => {
|
|
48
|
+
try {
|
|
49
|
+
const {
|
|
50
|
+
data: { recoveryId },
|
|
51
|
+
} = await axios.post(
|
|
52
|
+
`${BACKEND_URL}/v1/recovery`,
|
|
53
|
+
{
|
|
54
|
+
enableData,
|
|
55
|
+
scwAddress,
|
|
56
|
+
recoveryConfig,
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
headers: { "Content-Type": "application/json" },
|
|
60
|
+
}
|
|
61
|
+
);
|
|
62
|
+
return recoveryId;
|
|
63
|
+
} catch (error) {
|
|
64
|
+
console.log(error);
|
|
65
|
+
return undefined;
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
|
|
42
69
|
export const setSignatures = async (recoveryId: string, signatures: string) => {
|
|
43
70
|
try {
|
|
44
71
|
const { data } = await axios.patch(
|
|
@@ -30,16 +30,16 @@ export async function createPasskeyOwner({
|
|
|
30
30
|
//@ts-expect-error
|
|
31
31
|
if (typeof window !== "undefined") {
|
|
32
32
|
const challenge = generateRandomBuffer();
|
|
33
|
-
let credentials = undefined
|
|
33
|
+
let credentials = undefined;
|
|
34
34
|
if (withCredentials) {
|
|
35
|
-
credentials = await getCredentials(projectId, name)
|
|
35
|
+
credentials = await getCredentials(projectId, name);
|
|
36
36
|
}
|
|
37
37
|
if (credentials && credentials?.length >= 64) {
|
|
38
|
-
throw new UsernameIsAlreadyUsed()
|
|
38
|
+
throw new UsernameIsAlreadyUsed();
|
|
39
39
|
}
|
|
40
40
|
|
|
41
41
|
try {
|
|
42
|
-
abortWebauthn()
|
|
42
|
+
abortWebauthn();
|
|
43
43
|
const attestation = await getWebAuthnAttestation({
|
|
44
44
|
publicKey: {
|
|
45
45
|
rp: {
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
export class UsernameIsAlreadyUsed extends Error {
|
|
2
|
-
|
|
3
|
-
}
|
|
2
|
+
message: string = "Username is already used.";
|
|
3
|
+
}
|
|
@@ -19,27 +19,29 @@ export async function getAutocompletePasskeyOwner({
|
|
|
19
19
|
name?: string;
|
|
20
20
|
apiUrl?: string;
|
|
21
21
|
}): Promise<SmartAccountSigner | undefined> {
|
|
22
|
-
|
|
23
|
-
if (!PublicKeyCredential?.isConditionalMediationAvailable ||
|
|
22
|
+
if (
|
|
24
23
|
//@ts-ignore
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
24
|
+
!PublicKeyCredential?.isConditionalMediationAvailable ||
|
|
25
|
+
//@ts-ignore
|
|
26
|
+
!PublicKeyCredential?.isConditionalMediationAvailable()
|
|
27
|
+
) {
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
28
30
|
|
|
29
31
|
//@ts-expect-error
|
|
30
32
|
if (typeof window !== "undefined") {
|
|
31
33
|
const challenge = generateRandomBuffer();
|
|
32
34
|
try {
|
|
33
|
-
abortWebauthn()
|
|
35
|
+
abortWebauthn();
|
|
34
36
|
const assertion = JSON.parse(
|
|
35
37
|
await getWebAuthnAssertion(base64UrlEncode(challenge), {
|
|
36
|
-
mediation:
|
|
38
|
+
mediation: "conditional",
|
|
37
39
|
publicKey: {
|
|
38
40
|
//@ts-expect-error
|
|
39
41
|
rpId: window.location.hostname,
|
|
40
42
|
userVerification: "required",
|
|
41
43
|
},
|
|
42
|
-
signal: abortController.controller.signal
|
|
44
|
+
signal: abortController.controller.signal,
|
|
43
45
|
})
|
|
44
46
|
);
|
|
45
47
|
const response = await axios.post(
|
|
@@ -50,7 +52,7 @@ export async function getAutocompletePasskeyOwner({
|
|
|
50
52
|
}
|
|
51
53
|
);
|
|
52
54
|
const { id, walletId, address } = await response.data;
|
|
53
|
-
console.log(
|
|
55
|
+
console.log("owner", id, walletId, address);
|
|
54
56
|
const owner: SmartAccountSigner = {
|
|
55
57
|
getAddress: async () => address,
|
|
56
58
|
signMessage: (msg) =>
|
|
@@ -15,7 +15,7 @@ export async function getPasskeyOwner({
|
|
|
15
15
|
projectId,
|
|
16
16
|
name,
|
|
17
17
|
apiUrl = API_URL,
|
|
18
|
-
withCredentials = false
|
|
18
|
+
withCredentials = false,
|
|
19
19
|
}: {
|
|
20
20
|
projectId: string;
|
|
21
21
|
name?: string;
|
|
@@ -26,14 +26,16 @@ export async function getPasskeyOwner({
|
|
|
26
26
|
if (typeof window !== "undefined") {
|
|
27
27
|
const challenge = generateRandomBuffer();
|
|
28
28
|
try {
|
|
29
|
-
abortWebauthn()
|
|
29
|
+
abortWebauthn();
|
|
30
30
|
const assertion = JSON.parse(
|
|
31
31
|
await getWebAuthnAssertion(base64UrlEncode(challenge), {
|
|
32
32
|
publicKey: {
|
|
33
33
|
//@ts-expect-error
|
|
34
34
|
rpId: window.location.hostname,
|
|
35
35
|
userVerification: "required",
|
|
36
|
-
allowCredentials: withCredentials
|
|
36
|
+
allowCredentials: withCredentials
|
|
37
|
+
? await getCredentials(projectId, name)
|
|
38
|
+
: undefined,
|
|
37
39
|
},
|
|
38
40
|
})
|
|
39
41
|
);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { abortWebauthn } from
|
|
1
|
+
export { abortWebauthn } from "./utils.js";
|
|
2
2
|
export { getPasskeyOwner } from "./getPasskeyOwner.js";
|
|
3
3
|
export { createPasskeyOwner } from "./createPasskeyOwner.js";
|
|
4
4
|
export { getAutocompletePasskeyOwner } from "./getAutocompletePasskeyOwner.js";
|
|
@@ -10,11 +10,11 @@ browserInit({
|
|
|
10
10
|
|
|
11
11
|
export const abortController = {
|
|
12
12
|
controller: new AbortController(),
|
|
13
|
-
}
|
|
13
|
+
};
|
|
14
14
|
|
|
15
15
|
export function abortWebauthn() {
|
|
16
|
-
abortController.controller.abort(
|
|
17
|
-
abortController.controller = new AbortController()
|
|
16
|
+
abortController.controller.abort("ZeroDev: Reset previous Webauthn request");
|
|
17
|
+
abortController.controller = new AbortController();
|
|
18
18
|
}
|
|
19
19
|
|
|
20
20
|
export const publicKey = "public-key";
|
|
@@ -44,7 +44,7 @@ export const signMessageImplementation = async (
|
|
|
44
44
|
credentialId: string,
|
|
45
45
|
apiUrl = API_URL
|
|
46
46
|
) => {
|
|
47
|
-
abortWebauthn()
|
|
47
|
+
abortWebauthn();
|
|
48
48
|
const signedRequest = await TurnkeyApi.signSignRawPayload(
|
|
49
49
|
{
|
|
50
50
|
body: {
|
|
@@ -131,8 +131,13 @@ export const signTypedData = async (
|
|
|
131
131
|
);
|
|
132
132
|
};
|
|
133
133
|
|
|
134
|
-
export const getCredentials = async (
|
|
135
|
-
|
|
134
|
+
export const getCredentials = async (
|
|
135
|
+
projectId: string,
|
|
136
|
+
name?: string,
|
|
137
|
+
apiUrl = API_URL
|
|
138
|
+
) => {
|
|
139
|
+
const url =
|
|
140
|
+
`${apiUrl}/projects/${projectId}/wallets` + (name ? `/${name}` : "");
|
|
136
141
|
const response = await axios.get(url);
|
|
137
142
|
const credentials = response.data;
|
|
138
143
|
return credentials.map((credential: string) => ({
|
|
@@ -331,13 +331,13 @@ export class ZeroDevProvider extends SmartAccountProvider<HttpTransport> {
|
|
|
331
331
|
throw new Error("account not connected!");
|
|
332
332
|
}
|
|
333
333
|
const [data, address] = params!;
|
|
334
|
-
if (address !== (await this.getAddress())) {
|
|
334
|
+
if (address.toLowerCase() !== (await this.getAddress()).toLowerCase()) {
|
|
335
335
|
throw new Error(
|
|
336
336
|
"cannot sign for address that is not the current account"
|
|
337
337
|
);
|
|
338
338
|
}
|
|
339
339
|
// @ts-ignore
|
|
340
|
-
return this.account.
|
|
340
|
+
return this.account.signMessageWith6492(data);
|
|
341
341
|
default:
|
|
342
342
|
// @ts-ignore
|
|
343
343
|
return this.rpcClient.request(args);
|
|
@@ -27,13 +27,15 @@ import {
|
|
|
27
27
|
type Account,
|
|
28
28
|
publicActions,
|
|
29
29
|
getFunctionSelector,
|
|
30
|
+
type PublicClient,
|
|
30
31
|
} from "viem";
|
|
31
32
|
import { WeightedValidatorAbi } from "../abis/WeightedValidatorAbi.js";
|
|
32
|
-
import { getChainId } from "../api/index.js";
|
|
33
|
+
import { getChainId, getRecoveryData } from "../api/index.js";
|
|
33
34
|
import {
|
|
34
35
|
CHAIN_ID_TO_NODE,
|
|
35
36
|
DUMMY_ECDSA_SIG,
|
|
36
37
|
RECOVERY_ACTION,
|
|
38
|
+
RECOVERY_VALIDATOR_ADDRESS,
|
|
37
39
|
} from "../constants.js";
|
|
38
40
|
import { KernelAccountAbi } from "../abis/KernelAccountAbi.js";
|
|
39
41
|
import { fixSignedData } from "../utils.js";
|
|
@@ -49,9 +51,10 @@ export interface RecoveryValidatorParams extends KernelBaseValidatorParams {
|
|
|
49
51
|
threshold?: number;
|
|
50
52
|
delaySeconds?: number;
|
|
51
53
|
accountSigner?: SmartAccountSigner;
|
|
52
|
-
|
|
54
|
+
localAccountOrProvider?: LocalAccount<string> | EthereumProvider;
|
|
53
55
|
walletClient?: WalletClient<Transport, Chain>;
|
|
54
56
|
signatures?: Hex;
|
|
57
|
+
recoveryId?: string;
|
|
55
58
|
}
|
|
56
59
|
|
|
57
60
|
export type RecoveryConfig = Required<
|
|
@@ -83,12 +86,13 @@ export class RecoveryValidator extends KernelBaseValidator {
|
|
|
83
86
|
protected threshold?: number;
|
|
84
87
|
protected delaySeconds: number;
|
|
85
88
|
protected accountSigner?: SmartAccountSigner;
|
|
86
|
-
protected
|
|
89
|
+
protected localAccountOrProvider?: LocalAccount<string> | EthereumProvider;
|
|
87
90
|
protected signatures?: Hex;
|
|
91
|
+
protected recoveryId?: string;
|
|
88
92
|
walletClient?: WalletClient<
|
|
89
93
|
Transport,
|
|
90
94
|
Chain,
|
|
91
|
-
WalletClientAccountType<typeof this.
|
|
95
|
+
WalletClientAccountType<typeof this.localAccountOrProvider>
|
|
92
96
|
>;
|
|
93
97
|
|
|
94
98
|
constructor(params: RecoveryValidatorParams) {
|
|
@@ -98,27 +102,28 @@ export class RecoveryValidator extends KernelBaseValidator {
|
|
|
98
102
|
this.delaySeconds = params.delaySeconds ?? 0;
|
|
99
103
|
this.accountSigner = params.accountSigner;
|
|
100
104
|
this.mode = params.mode ?? ValidatorMode.plugin;
|
|
101
|
-
this.
|
|
105
|
+
this.localAccountOrProvider = params.localAccountOrProvider;
|
|
102
106
|
this.signatures = params.signatures;
|
|
103
107
|
this.validAfter = params.validAfter ?? 0;
|
|
104
108
|
this.validUntil = params.validUntil ?? 0;
|
|
105
109
|
this.executor = params.executor ?? RECOVERY_ACTION;
|
|
106
110
|
this.selector = params.selector ?? recoverySelector;
|
|
107
|
-
|
|
111
|
+
this.recoveryId = params.recoveryId;
|
|
112
|
+
if (isLocalAccount(params.localAccountOrProvider)) {
|
|
108
113
|
this.walletClient = createWalletClient({
|
|
109
|
-
account: params.
|
|
114
|
+
account: params.localAccountOrProvider,
|
|
110
115
|
chain: this.chain ?? polygonMumbai,
|
|
111
116
|
transport: http(CHAIN_ID_TO_NODE[this.chain?.id ?? polygonMumbai.id]),
|
|
112
117
|
}).extend(publicActions);
|
|
113
|
-
} else if (isEthereumProvider(params.
|
|
118
|
+
} else if (isEthereumProvider(params.localAccountOrProvider)) {
|
|
114
119
|
this.walletClient = createWalletClient({
|
|
115
120
|
chain: this.chain ?? polygonMumbai,
|
|
116
|
-
transport: custom(params.
|
|
121
|
+
transport: custom(params.localAccountOrProvider),
|
|
117
122
|
}).extend(publicActions);
|
|
118
123
|
} else if (params.walletClient) {
|
|
119
124
|
this.walletClient = params.walletClient.extend(publicActions);
|
|
120
|
-
} else if (params.
|
|
121
|
-
throw Error("Incorrect
|
|
125
|
+
} else if (params.localAccountOrProvider) {
|
|
126
|
+
throw Error("Incorrect localAccountOrProvider type");
|
|
122
127
|
}
|
|
123
128
|
}
|
|
124
129
|
|
|
@@ -142,7 +147,11 @@ export class RecoveryValidator extends KernelBaseValidator {
|
|
|
142
147
|
this.signatures = signatures;
|
|
143
148
|
}
|
|
144
149
|
|
|
145
|
-
getRecoverySignatures(): Hex | undefined {
|
|
150
|
+
async getRecoverySignatures(): Promise<Hex | undefined> {
|
|
151
|
+
if (this.recoveryId) {
|
|
152
|
+
const { signatures } = await getRecoveryData(this.recoveryId);
|
|
153
|
+
this.setRecoverySignatures(signatures);
|
|
154
|
+
}
|
|
146
155
|
return this.signatures;
|
|
147
156
|
}
|
|
148
157
|
|
|
@@ -243,6 +252,44 @@ export class RecoveryValidator extends KernelBaseValidator {
|
|
|
243
252
|
});
|
|
244
253
|
}
|
|
245
254
|
|
|
255
|
+
static async fetchRecoveryConfigFromContract(
|
|
256
|
+
kernelAccountAddress: Address,
|
|
257
|
+
publicClient: PublicClient<Transport, Chain>
|
|
258
|
+
): Promise<RecoveryConfig> {
|
|
259
|
+
try {
|
|
260
|
+
const [, threshold, delaySeconds, firstGuardian] =
|
|
261
|
+
await publicClient.readContract({
|
|
262
|
+
abi: WeightedValidatorAbi,
|
|
263
|
+
address: RECOVERY_VALIDATOR_ADDRESS,
|
|
264
|
+
functionName: "weightedStorage",
|
|
265
|
+
args: [kernelAccountAddress],
|
|
266
|
+
});
|
|
267
|
+
|
|
268
|
+
const guardians: WeightedGuardians = {};
|
|
269
|
+
|
|
270
|
+
let nextGuardian = firstGuardian;
|
|
271
|
+
while (
|
|
272
|
+
nextGuardian.toLowerCase() !== kernelAccountAddress.toLowerCase()
|
|
273
|
+
) {
|
|
274
|
+
const guardianStorage = await publicClient.readContract({
|
|
275
|
+
abi: WeightedValidatorAbi,
|
|
276
|
+
address: RECOVERY_VALIDATOR_ADDRESS,
|
|
277
|
+
functionName: "guardian",
|
|
278
|
+
args: [nextGuardian, kernelAccountAddress],
|
|
279
|
+
});
|
|
280
|
+
guardians[nextGuardian] = guardianStorage[0];
|
|
281
|
+
nextGuardian = guardianStorage[1];
|
|
282
|
+
}
|
|
283
|
+
return {
|
|
284
|
+
threshold,
|
|
285
|
+
delaySeconds,
|
|
286
|
+
guardians,
|
|
287
|
+
};
|
|
288
|
+
} catch (error) {
|
|
289
|
+
throw Error("Failed to fetch config from contract");
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
|
|
246
293
|
async isPluginEnabled(
|
|
247
294
|
kernelAccountAddress: Address,
|
|
248
295
|
selector: Hex
|
|
@@ -12,9 +12,14 @@ import {
|
|
|
12
12
|
type Address,
|
|
13
13
|
type SendUserOperationResult,
|
|
14
14
|
} from "@alchemy/aa-core";
|
|
15
|
-
import {
|
|
15
|
+
import {
|
|
16
|
+
getChainId,
|
|
17
|
+
getRecoveryData,
|
|
18
|
+
postRecoveryData,
|
|
19
|
+
setSignatures,
|
|
20
|
+
} from "../api/index.js";
|
|
16
21
|
import { polygonMumbai } from "viem/chains";
|
|
17
|
-
import {
|
|
22
|
+
import { CHAIN_ID_TO_NODE, RECOVERY_VALIDATOR_ADDRESS } from "../constants.js";
|
|
18
23
|
import {
|
|
19
24
|
encodeAbiParameters,
|
|
20
25
|
encodeFunctionData,
|
|
@@ -23,11 +28,11 @@ import {
|
|
|
23
28
|
keccak256,
|
|
24
29
|
publicActions,
|
|
25
30
|
type TransactionReceipt,
|
|
26
|
-
|
|
31
|
+
createPublicClient,
|
|
32
|
+
http,
|
|
27
33
|
} from "viem";
|
|
28
34
|
import { RecoveryActionAbi } from "../abis/RecoveryActionAbi.js";
|
|
29
35
|
import { KernelAccountAbi } from "../abis/KernelAccountAbi.js";
|
|
30
|
-
import axios from "axios";
|
|
31
36
|
import { base64ToBytes, bytesToBase64 } from "../utils.js";
|
|
32
37
|
|
|
33
38
|
export interface RecoveryProviderParams
|
|
@@ -50,6 +55,7 @@ export class RecoveryProvider extends ValidatorProvider<
|
|
|
50
55
|
const validator = new RecoveryValidator({
|
|
51
56
|
projectId: params.projectId,
|
|
52
57
|
chain,
|
|
58
|
+
recoveryId: params.recoveryId,
|
|
53
59
|
validatorAddress:
|
|
54
60
|
params.opts?.validatorConfig?.validatorAddress ??
|
|
55
61
|
RECOVERY_VALIDATOR_ADDRESS,
|
|
@@ -92,6 +98,20 @@ export class RecoveryProvider extends ValidatorProvider<
|
|
|
92
98
|
recoveryConfig = RecoveryProvider.deserializeRecoveryConfig(
|
|
93
99
|
serializedRecoveryConfig
|
|
94
100
|
);
|
|
101
|
+
} else if (
|
|
102
|
+
params.opts?.accountConfig?.accountAddress &&
|
|
103
|
+
(!params.opts?.validatorConfig?.guardians ||
|
|
104
|
+
!Object.entries(params.opts?.validatorConfig?.guardians).length ||
|
|
105
|
+
params.opts.validatorConfig.threshold === undefined)
|
|
106
|
+
) {
|
|
107
|
+
const publicClient = createPublicClient({
|
|
108
|
+
transport: http(CHAIN_ID_TO_NODE[chain?.id ?? polygonMumbai.id]),
|
|
109
|
+
chain: chain ?? polygonMumbai,
|
|
110
|
+
});
|
|
111
|
+
recoveryConfig = await RecoveryValidator.fetchRecoveryConfigFromContract(
|
|
112
|
+
params.opts?.accountConfig?.accountAddress,
|
|
113
|
+
publicClient
|
|
114
|
+
);
|
|
95
115
|
}
|
|
96
116
|
const instance = new RecoveryProvider({
|
|
97
117
|
enableData,
|
|
@@ -160,28 +180,18 @@ export class RecoveryProvider extends ValidatorProvider<
|
|
|
160
180
|
}
|
|
161
181
|
|
|
162
182
|
async initiateRecovery(enableData: Hex): Promise<string> {
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
recoveryConfig: serializedConfig,
|
|
173
|
-
},
|
|
174
|
-
{
|
|
175
|
-
headers: { "Content-Type": "application/json" },
|
|
176
|
-
}
|
|
177
|
-
);
|
|
178
|
-
console.log(recoveryId);
|
|
179
|
-
this.enableData = enableData;
|
|
180
|
-
return recoveryId;
|
|
181
|
-
} catch (error) {
|
|
182
|
-
console.log(error);
|
|
183
|
+
const serializedConfig = this.serializeRecoveryConfig();
|
|
184
|
+
const recoveryId = await postRecoveryData(
|
|
185
|
+
enableData,
|
|
186
|
+
await this.getAddress(),
|
|
187
|
+
serializedConfig
|
|
188
|
+
);
|
|
189
|
+
console.log(recoveryId);
|
|
190
|
+
this.enableData = enableData;
|
|
191
|
+
if (!recoveryId) {
|
|
183
192
|
throw Error("Unable to generate the recoveryId");
|
|
184
193
|
}
|
|
194
|
+
return recoveryId;
|
|
185
195
|
}
|
|
186
196
|
|
|
187
197
|
serializeRecoveryConfig(): string {
|
|
@@ -246,20 +256,11 @@ export class RecoveryProvider extends ValidatorProvider<
|
|
|
246
256
|
const sig = await this.getValidator().signRecoveryHash(
|
|
247
257
|
callDataAndNonceHash
|
|
248
258
|
);
|
|
249
|
-
|
|
250
|
-
if (sigs) {
|
|
251
|
-
sigs =
|
|
252
|
-
sigs.toLowerCase().indexOf(sig.toLowerCase()) === -1
|
|
253
|
-
? concatHex([sigs, sig])
|
|
254
|
-
: sigs;
|
|
255
|
-
} else {
|
|
256
|
-
sigs = sig;
|
|
257
|
-
}
|
|
258
|
-
this.getValidator().setRecoverySignatures(sigs);
|
|
259
|
-
const { result } = await setSignatures(this.recoveryId, sigs);
|
|
259
|
+
const { result, data } = await setSignatures(this.recoveryId, sig);
|
|
260
260
|
if (result !== "success") {
|
|
261
261
|
throw Error("Failed to save the signatures");
|
|
262
262
|
}
|
|
263
|
+
this.getValidator().setRecoverySignatures(data.signatures);
|
|
263
264
|
} catch (error) {
|
|
264
265
|
console.log(error);
|
|
265
266
|
}
|
|
@@ -273,7 +274,8 @@ export class RecoveryProvider extends ValidatorProvider<
|
|
|
273
274
|
if (!fetchedEnableData) {
|
|
274
275
|
throw Error("Unable to fetch enable data for Recovery");
|
|
275
276
|
}
|
|
276
|
-
const signatures =
|
|
277
|
+
const signatures =
|
|
278
|
+
sigs ?? (await this.getValidator().getRecoverySignatures());
|
|
277
279
|
if (!signatures) {
|
|
278
280
|
throw Error("Signatures are not set");
|
|
279
281
|
}
|