@zerodev/sdk 4.0.2-alpha.25 → 4.0.2-passkey.0
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/dist/cjs/index.d.ts +1 -0
- package/dist/cjs/index.js +1 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/kernel-zerodev/owner/getCustodialOwner.d.ts +8 -0
- package/dist/cjs/kernel-zerodev/owner/getCustodialOwner.js +53 -0
- package/dist/cjs/kernel-zerodev/owner/getCustodialOwner.js.map +1 -0
- package/dist/cjs/kernel-zerodev/owner/getRPCProviderOwner.d.ts +2 -0
- package/dist/cjs/kernel-zerodev/owner/getRPCProviderOwner.js +15 -0
- package/dist/cjs/kernel-zerodev/owner/getRPCProviderOwner.js.map +1 -0
- package/dist/cjs/kernel-zerodev/owner/index.d.ts +2 -0
- package/dist/cjs/kernel-zerodev/owner/index.js +8 -0
- package/dist/cjs/kernel-zerodev/owner/index.js.map +1 -0
- package/dist/cjs/kernel-zerodev/owner/passkey/createPasskeyOwner.d.ts +7 -0
- package/dist/cjs/kernel-zerodev/owner/passkey/createPasskeyOwner.js +65 -0
- package/dist/cjs/kernel-zerodev/owner/passkey/createPasskeyOwner.js.map +1 -0
- package/dist/cjs/kernel-zerodev/owner/passkey/getOrCreatePasskeyOwner.d.ts +6 -0
- package/dist/cjs/kernel-zerodev/owner/passkey/getOrCreatePasskeyOwner.js +16 -0
- package/dist/cjs/kernel-zerodev/owner/passkey/getOrCreatePasskeyOwner.js.map +1 -0
- package/dist/cjs/kernel-zerodev/owner/passkey/getPasskeyOwner.d.ts +5 -0
- package/dist/cjs/kernel-zerodev/owner/passkey/getPasskeyOwner.js +41 -0
- package/dist/cjs/kernel-zerodev/owner/passkey/getPasskeyOwner.js.map +1 -0
- package/dist/cjs/kernel-zerodev/owner/passkey/index.d.ts +3 -0
- package/dist/cjs/kernel-zerodev/owner/passkey/index.js +10 -0
- package/dist/cjs/kernel-zerodev/owner/passkey/index.js.map +1 -0
- package/dist/cjs/kernel-zerodev/owner/passkey/types.d.ts +12 -0
- package/dist/cjs/kernel-zerodev/owner/passkey/types.js +3 -0
- package/dist/cjs/kernel-zerodev/owner/passkey/types.js.map +1 -0
- package/dist/cjs/kernel-zerodev/owner/passkey/utils.d.ts +11 -0
- package/dist/cjs/kernel-zerodev/owner/passkey/utils.js +105 -0
- package/dist/cjs/kernel-zerodev/owner/passkey/utils.js.map +1 -0
- package/dist/cjs/kernel-zerodev/utils.d.ts +0 -8
- package/dist/cjs/kernel-zerodev/utils.js +1 -60
- package/dist/cjs/kernel-zerodev/utils.js.map +1 -1
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/kernel-zerodev/owner/getCustodialOwner.d.ts +8 -0
- package/dist/esm/kernel-zerodev/owner/getCustodialOwner.js +46 -0
- package/dist/esm/kernel-zerodev/owner/getCustodialOwner.js.map +1 -0
- package/dist/esm/kernel-zerodev/owner/getRPCProviderOwner.d.ts +2 -0
- package/dist/esm/kernel-zerodev/owner/getRPCProviderOwner.js +12 -0
- package/dist/esm/kernel-zerodev/owner/getRPCProviderOwner.js.map +1 -0
- package/dist/esm/kernel-zerodev/owner/index.d.ts +2 -0
- package/dist/esm/kernel-zerodev/owner/index.js +3 -0
- package/dist/esm/kernel-zerodev/owner/index.js.map +1 -0
- package/dist/esm/kernel-zerodev/owner/passkey/createPasskeyOwner.d.ts +7 -0
- package/dist/esm/kernel-zerodev/owner/passkey/createPasskeyOwner.js +58 -0
- package/dist/esm/kernel-zerodev/owner/passkey/createPasskeyOwner.js.map +1 -0
- package/dist/esm/kernel-zerodev/owner/passkey/getOrCreatePasskeyOwner.d.ts +6 -0
- package/dist/esm/kernel-zerodev/owner/passkey/getOrCreatePasskeyOwner.js +12 -0
- package/dist/esm/kernel-zerodev/owner/passkey/getOrCreatePasskeyOwner.js.map +1 -0
- package/dist/esm/kernel-zerodev/owner/passkey/getPasskeyOwner.d.ts +5 -0
- package/dist/esm/kernel-zerodev/owner/passkey/getPasskeyOwner.js +34 -0
- package/dist/esm/kernel-zerodev/owner/passkey/getPasskeyOwner.js.map +1 -0
- package/dist/esm/kernel-zerodev/owner/passkey/index.d.ts +3 -0
- package/dist/esm/kernel-zerodev/owner/passkey/index.js +4 -0
- package/dist/esm/kernel-zerodev/owner/passkey/index.js.map +1 -0
- package/dist/esm/kernel-zerodev/owner/passkey/types.d.ts +12 -0
- package/dist/esm/kernel-zerodev/owner/passkey/types.js +2 -0
- package/dist/esm/kernel-zerodev/owner/passkey/types.js.map +1 -0
- package/dist/esm/kernel-zerodev/owner/passkey/utils.d.ts +11 -0
- package/dist/esm/kernel-zerodev/owner/passkey/utils.js +92 -0
- package/dist/esm/kernel-zerodev/owner/passkey/utils.js.map +1 -0
- package/dist/esm/kernel-zerodev/utils.d.ts +0 -8
- package/dist/esm/kernel-zerodev/utils.js +1 -55
- package/dist/esm/kernel-zerodev/utils.js.map +1 -1
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/kernel-zerodev/owner/getCustodialOwner.d.ts +9 -0
- package/dist/types/kernel-zerodev/owner/getCustodialOwner.d.ts.map +1 -0
- package/dist/types/kernel-zerodev/owner/getRPCProviderOwner.d.ts +3 -0
- package/dist/types/kernel-zerodev/owner/getRPCProviderOwner.d.ts.map +1 -0
- package/dist/types/kernel-zerodev/owner/index.d.ts +3 -0
- package/dist/types/kernel-zerodev/owner/index.d.ts.map +1 -0
- package/dist/types/kernel-zerodev/owner/passkey/createPasskeyOwner.d.ts +8 -0
- package/dist/types/kernel-zerodev/owner/passkey/createPasskeyOwner.d.ts.map +1 -0
- package/dist/types/kernel-zerodev/owner/passkey/getOrCreatePasskeyOwner.d.ts +7 -0
- package/dist/types/kernel-zerodev/owner/passkey/getOrCreatePasskeyOwner.d.ts.map +1 -0
- package/dist/types/kernel-zerodev/owner/passkey/getPasskeyOwner.d.ts +6 -0
- package/dist/types/kernel-zerodev/owner/passkey/getPasskeyOwner.d.ts.map +1 -0
- package/dist/types/kernel-zerodev/owner/passkey/index.d.ts +4 -0
- package/dist/types/kernel-zerodev/owner/passkey/index.d.ts.map +1 -0
- package/dist/types/kernel-zerodev/owner/passkey/types.d.ts +14 -0
- package/dist/types/kernel-zerodev/owner/passkey/types.d.ts.map +1 -0
- package/dist/types/kernel-zerodev/owner/passkey/utils.d.ts +12 -0
- package/dist/types/kernel-zerodev/owner/passkey/utils.d.ts.map +1 -0
- package/dist/types/kernel-zerodev/utils.d.ts +0 -8
- package/dist/types/kernel-zerodev/utils.d.ts.map +1 -1
- package/package.json +7 -1
- package/passkey/package.json +5 -0
- package/src/index.ts +3 -0
- package/src/kernel-zerodev/owner/getCustodialOwner.ts +74 -0
- package/src/kernel-zerodev/owner/getRPCProviderOwner.ts +22 -0
- package/src/kernel-zerodev/owner/index.ts +2 -0
- package/src/kernel-zerodev/owner/passkey/createPasskeyOwner.ts +98 -0
- package/src/kernel-zerodev/owner/passkey/getOrCreatePasskeyOwner.ts +22 -0
- package/src/kernel-zerodev/owner/passkey/getPasskeyOwner.ts +69 -0
- package/src/kernel-zerodev/owner/passkey/index.ts +3 -0
- package/src/kernel-zerodev/owner/passkey/types.ts +18 -0
- package/src/kernel-zerodev/owner/passkey/utils.ts +157 -0
- package/src/kernel-zerodev/utils.ts +1 -90
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/kernel-zerodev/utils.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n encodePacked,\n fromBytes,\n toBytes,\n type Hex,\n type WalletClient,\n toHex,\n} from \"viem\";\nimport type {\n SignTypedDataParams,\n SmartAccountSigner,\n UserOperationCallData,\n} from \"@alchemy/aa-core\";\nimport { Signer, type TypedDataField } from \"@ethersproject/abstract-signer\";\nimport { Wallet } from \"@ethersproject/wallet\";\nimport { Web3Provider, type ExternalProvider } from \"@ethersproject/providers\";\nimport { API_URL, gasTokenChainAddresses } from \"./constants.js\";\nimport type { SupportedGasToken } from \"./paymaster/types.js\";\nimport axios from \"axios\";\n\nexport type UserOperationCallDataWithDelegate = UserOperationCallData & {\n delegateCall?: boolean;\n};\n\nexport type BatchUserOperationCallDataWithDelegate =\n UserOperationCallDataWithDelegate[];\n\nconst encodeCall = (_tx: UserOperationCallDataWithDelegate): string => {\n const data = toBytes(_tx.data);\n const encoded = encodePacked(\n [\"uint8\", \"address\", \"uint256\", \"uint256\", \"bytes\"],\n [\n _tx.delegateCall ? 1 : 0,\n _tx.target,\n _tx.value || BigInt(0),\n BigInt(data.length),\n fromBytes(data, \"hex\"),\n ]\n );\n return encoded.slice(2);\n};\nexport const encodeMultiSend = (\n _txs: BatchUserOperationCallDataWithDelegate\n): Hex => {\n return (\"0x\" + _txs.map((tx) => encodeCall(tx)).join(\"\")) as Hex;\n};\n\nexport function getGasTokenAddress(\n gasToken: SupportedGasToken,\n chainId: number\n): Hex | undefined {\n if (gasToken === \"TEST_ERC20\") {\n return \"0x3870419Ba2BBf0127060bCB37f69A1b1C090992B\";\n }\n return gasTokenChainAddresses[gasToken][chainId] || undefined;\n}\n\nexport const convertWalletClientToAccountSigner = (\n client: WalletClient\n): SmartAccountSigner => {\n return {\n getAddress: async () =>\n Promise.resolve((await client.getAddresses())[0] as `0x${string}`),\n signMessage: async (message: Uint8Array | string) =>\n (await client.signMessage({\n account: client.account!,\n message:\n typeof message === \"string\"\n ? message\n : {\n raw: message,\n },\n })) as `0x${string}`,\n signTypedData: async (params: SignTypedDataParams) =>\n await client.signTypedData({ ...params, account: client.account! }),\n };\n};\n\nexport const isWallet = (signer: any): signer is Wallet =>\n signer && signer._signTypedData !== undefined;\n\nexport const convertEthersSignerToAccountSigner = (\n signer: Signer | Wallet\n): SmartAccountSigner => {\n return {\n getAddress: async () =>\n Promise.resolve((await signer.getAddress()) as `0x${string}`),\n signMessage: async (msg: Uint8Array | string) =>\n (await signer.signMessage(msg)) as `0x${string}`,\n signTypedData: async (params: SignTypedDataParams) => {\n if (!isWallet(signer)) {\n throw Error(\"signTypedData method not implemented in signer\");\n }\n return (await signer._signTypedData(\n params.domain!,\n params.types as unknown as Record<string, TypedDataField[]>,\n params.message\n )) as Hex;\n },\n };\n};\n\nexport function getRPCProviderOwner(web3Provider: any): SmartAccountSigner {\n const provider = new Web3Provider(web3Provider as ExternalProvider);\n const signer = provider.getSigner();\n\n return {\n getAddress: async () =>\n Promise.resolve((await signer.getAddress()) as `0x${string}`),\n signMessage: async (msg: Uint8Array | string) =>\n (await signer.signMessage(msg)) as `0x${string}`,\n signTypedData: async (params: SignTypedDataParams) =>\n (await signer._signTypedData(\n params.domain!,\n params.types as unknown as Record<string, TypedDataField[]>,\n params.message\n )) as Hex,\n };\n}\n\nexport async function getCustodialOwner(\n identifier: string,\n {\n custodialFilePath,\n privateKey,\n publicKey,\n keyId,\n apiUrl = API_URL,\n }: {\n privateKey?: string;\n publicKey?: string;\n keyId?: string;\n custodialFilePath?: string;\n apiUrl?: string;\n }\n): Promise<SmartAccountSigner | undefined> {\n if (custodialFilePath) {\n let fsModule;\n try {\n fsModule = require.resolve(\"fs\") && require(\"fs\");\n } catch (error) {\n console.log(\"FS module not available. Skipping FS operation...\");\n return;\n }\n const data = fsModule.readFileSync(custodialFilePath, \"utf8\");\n const values = data.split(\"\\n\");\n [privateKey, publicKey, keyId] = values;\n }\n let TurnkeySigner;\n try {\n TurnkeySigner =\n require.resolve(\"@turnkey/ethers\") &&\n require(\"@turnkey/ethers\").TurnkeySigner;\n } catch (error) {\n console.log(\n \"@turnkey/ethers module not available. Skipping FS operation...\"\n );\n return;\n }\n if (!privateKey || !publicKey || !keyId) {\n throw new Error(\n \"Must provide custodialFilePath or privateKey, publicKey, and keyId.\"\n );\n }\n\n const response = await axios.post(`${apiUrl}/wallets/${identifier}`, {\n keyId,\n });\n\n const turnkeySigner = new TurnkeySigner({\n apiPublicKey: publicKey,\n apiPrivateKey: privateKey,\n baseUrl: \"https://coordinator-beta.turnkey.io\",\n organizationId: keyId,\n privateKeyId: response.data.walletId,\n });\n return {\n getAddress: async () => (await turnkeySigner.getAddress()) as `0x${string}`,\n signMessage: async (msg: Uint8Array | string) =>\n (await turnkeySigner.signMessage(msg)) as `0x${string}`,\n signTypedData: async (params: SignTypedDataParams) =>\n (await turnkeySigner.signTypedData(\n params.domain,\n params.types,\n params.message\n )) as Hex,\n };\n}\n\nexport const randomHexString = (length: number): Hex =>\n toHex(\n Array.from({ length }, () =>\n Math.floor(Math.random() * 16).toString(16)\n ).join(\"\")\n );\n"]}
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/kernel-zerodev/utils.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n encodePacked,\n fromBytes,\n toBytes,\n type Hex,\n type WalletClient,\n toHex,\n} from \"viem\";\nimport type {\n SignTypedDataParams,\n SmartAccountSigner,\n UserOperationCallData,\n} from \"@alchemy/aa-core\";\nimport { Signer, type TypedDataField } from \"@ethersproject/abstract-signer\";\nimport { Wallet } from \"@ethersproject/wallet\";\nimport type { SupportedGasToken } from \"./paymaster/types.js\";\nimport { gasTokenChainAddresses } from \"./constants.js\";\n\nexport type UserOperationCallDataWithDelegate = UserOperationCallData & {\n delegateCall?: boolean;\n};\n\nexport type BatchUserOperationCallDataWithDelegate =\n UserOperationCallDataWithDelegate[];\n\nconst encodeCall = (_tx: UserOperationCallDataWithDelegate): string => {\n const data = toBytes(_tx.data);\n const encoded = encodePacked(\n [\"uint8\", \"address\", \"uint256\", \"uint256\", \"bytes\"],\n [\n _tx.delegateCall ? 1 : 0,\n _tx.target,\n _tx.value || BigInt(0),\n BigInt(data.length),\n fromBytes(data, \"hex\"),\n ]\n );\n return encoded.slice(2);\n};\nexport const encodeMultiSend = (\n _txs: BatchUserOperationCallDataWithDelegate\n): Hex => {\n return (\"0x\" + _txs.map((tx) => encodeCall(tx)).join(\"\")) as Hex;\n};\n\nexport function getGasTokenAddress(\n gasToken: SupportedGasToken,\n chainId: number\n): Hex | undefined {\n if (gasToken === \"TEST_ERC20\") {\n return \"0x3870419Ba2BBf0127060bCB37f69A1b1C090992B\";\n }\n return gasTokenChainAddresses[gasToken][chainId] || undefined;\n}\n\nexport const convertWalletClientToAccountSigner = (\n client: WalletClient\n): SmartAccountSigner => {\n return {\n getAddress: async () =>\n Promise.resolve((await client.getAddresses())[0] as `0x${string}`),\n signMessage: async (message: Uint8Array | string) =>\n (await client.signMessage({\n account: client.account!,\n message:\n typeof message === \"string\"\n ? message\n : {\n raw: message,\n },\n })) as `0x${string}`,\n signTypedData: async (params: SignTypedDataParams) =>\n await client.signTypedData({ ...params, account: client.account! }),\n };\n};\n\nexport const isWallet = (signer: any): signer is Wallet =>\n signer && signer._signTypedData !== undefined;\n\nexport const convertEthersSignerToAccountSigner = (\n signer: Signer | Wallet\n): SmartAccountSigner => {\n return {\n getAddress: async () =>\n Promise.resolve((await signer.getAddress()) as `0x${string}`),\n signMessage: async (msg: Uint8Array | string) =>\n (await signer.signMessage(msg)) as `0x${string}`,\n signTypedData: async (params: SignTypedDataParams) => {\n if (!isWallet(signer)) {\n throw Error(\"signTypedData method not implemented in signer\");\n }\n return (await signer._signTypedData(\n params.domain!,\n params.types as unknown as Record<string, TypedDataField[]>,\n params.message\n )) as Hex;\n },\n };\n};\n\nexport const randomHexString = (length: number): Hex =>\n toHex(\n Array.from({ length }, () =>\n Math.floor(Math.random() * 16).toString(16)\n ).join(\"\")\n );\n"]}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -18,4 +18,5 @@ export * from "./kernel-zerodev/utils.js";
|
|
|
18
18
|
export { getChainId } from "./kernel-zerodev/api/index.js";
|
|
19
19
|
export { ZeroDevEthersProvider } from "./kernel-zerodev/ethers-provider/ethers-provider.js";
|
|
20
20
|
export * as constants from "./kernel-zerodev/constants.js";
|
|
21
|
+
export * from "./kernel-zerodev/owner/index.js";
|
|
21
22
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAIA,cAAc,gCAAgC,CAAC;AAG/C,OAAO,EACL,aAAa,EACb,mBAAmB,GACpB,MAAM,oCAAoC,CAAC;AAC5C,cAAc,qCAAqC,CAAC;AACpD,mBAAmB,qCAAqC,CAAC;AACzD,YAAY,EAAE,oBAAoB,EAAE,MAAM,+CAA+C,CAAC;AAC1F,YAAY,EAAE,yBAAyB,EAAE,MAAM,qDAAqD,CAAC;AACrG,YAAY,EAAE,+BAA+B,EAAE,MAAM,4DAA4D,CAAC;AAClH,YAAY,EAAE,yBAAyB,EAAE,MAAM,oCAAoC,CAAC;AAGpF,OAAO,EAAE,iBAAiB,EAAE,MAAM,6CAA6C,CAAC;AAChF,YAAY,EACV,uBAAuB,EACvB,2BAA2B,EAC3B,+BAA+B,GAChC,MAAM,6CAA6C,CAAC;AACrD,mBAAmB,8CAA8C,CAAC;AAClE,cAAc,8CAA8C,CAAC;AAG7D,mBAAmB,qCAAqC,CAAC;AACzD,OAAO,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AACzE,YAAY,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AAC5E,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAG/D,cAAc,2BAA2B,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,qDAAqD,CAAC;AAE5F,OAAO,KAAK,SAAS,MAAM,+BAA+B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAIA,cAAc,gCAAgC,CAAC;AAG/C,OAAO,EACL,aAAa,EACb,mBAAmB,GACpB,MAAM,oCAAoC,CAAC;AAC5C,cAAc,qCAAqC,CAAC;AACpD,mBAAmB,qCAAqC,CAAC;AACzD,YAAY,EAAE,oBAAoB,EAAE,MAAM,+CAA+C,CAAC;AAC1F,YAAY,EAAE,yBAAyB,EAAE,MAAM,qDAAqD,CAAC;AACrG,YAAY,EAAE,+BAA+B,EAAE,MAAM,4DAA4D,CAAC;AAClH,YAAY,EAAE,yBAAyB,EAAE,MAAM,oCAAoC,CAAC;AAGpF,OAAO,EAAE,iBAAiB,EAAE,MAAM,6CAA6C,CAAC;AAChF,YAAY,EACV,uBAAuB,EACvB,2BAA2B,EAC3B,+BAA+B,GAChC,MAAM,6CAA6C,CAAC;AACrD,mBAAmB,8CAA8C,CAAC;AAClE,cAAc,8CAA8C,CAAC;AAG7D,mBAAmB,qCAAqC,CAAC;AACzD,OAAO,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AACzE,YAAY,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AAC5E,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAG/D,cAAc,2BAA2B,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,qDAAqD,CAAC;AAE5F,OAAO,KAAK,SAAS,MAAM,+BAA+B,CAAC;AAG3D,cAAc,iCAAiC,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { SmartAccountSigner } from "@alchemy/aa-core";
|
|
2
|
+
export declare function getCustodialOwner(identifier: string, { custodialFilePath, privateKey, publicKey, keyId, apiUrl, }: {
|
|
3
|
+
privateKey?: string;
|
|
4
|
+
publicKey?: string;
|
|
5
|
+
keyId?: string;
|
|
6
|
+
custodialFilePath?: string;
|
|
7
|
+
apiUrl?: string;
|
|
8
|
+
}): Promise<SmartAccountSigner | undefined>;
|
|
9
|
+
//# sourceMappingURL=getCustodialOwner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getCustodialOwner.d.ts","sourceRoot":"","sources":["../../../../src/kernel-zerodev/owner/getCustodialOwner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAM3D,wBAAsB,iBAAiB,CACrC,UAAU,EAAE,MAAM,EAClB,EACE,iBAAiB,EACjB,UAAU,EACV,SAAS,EACT,KAAK,EACL,MAAgB,GACjB,EAAE;IACD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GACA,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC,CAoDzC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getRPCProviderOwner.d.ts","sourceRoot":"","sources":["../../../../src/kernel-zerodev/owner/getRPCProviderOwner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAuB,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAKhF,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,GAAG,GAAG,kBAAkB,CAgBzE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/kernel-zerodev/owner/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { SmartAccountSigner } from "@alchemy/aa-core";
|
|
2
|
+
export declare function createPasskeyOwner({ name, projectId, fallback, apiUrl, }: {
|
|
3
|
+
name: string;
|
|
4
|
+
projectId: string;
|
|
5
|
+
fallback?: () => Promise<SmartAccountSigner | undefined>;
|
|
6
|
+
apiUrl?: string;
|
|
7
|
+
}): Promise<SmartAccountSigner | undefined>;
|
|
8
|
+
//# sourceMappingURL=createPasskeyOwner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createPasskeyOwner.d.ts","sourceRoot":"","sources":["../../../../../src/kernel-zerodev/owner/passkey/createPasskeyOwner.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAuB,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAYhF,wBAAsB,kBAAkB,CAAC,EACvC,IAAI,EACJ,SAAS,EACT,QAAQ,EACR,MAAgB,GACjB,EAAE;IACD,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC,CAAC;IACzD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC,CAyE1C"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { SmartAccountSigner } from "@alchemy/aa-core";
|
|
2
|
+
export declare function getOrCreatePasskeyOwner({ name, projectId, apiUrl, }: {
|
|
3
|
+
name: string;
|
|
4
|
+
projectId: string;
|
|
5
|
+
apiUrl?: string;
|
|
6
|
+
}): Promise<SmartAccountSigner | undefined>;
|
|
7
|
+
//# sourceMappingURL=getOrCreatePasskeyOwner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getOrCreatePasskeyOwner.d.ts","sourceRoot":"","sources":["../../../../../src/kernel-zerodev/owner/passkey/getOrCreatePasskeyOwner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAM3D,wBAAsB,uBAAuB,CAAC,EAC5C,IAAI,EACJ,SAAS,EACT,MAAgB,GACjB,EAAE;IACD,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC,CAO1C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getPasskeyOwner.d.ts","sourceRoot":"","sources":["../../../../../src/kernel-zerodev/owner/passkey/getPasskeyOwner.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAuB,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAUhF,wBAAsB,eAAe,CAAC,EACpC,SAAS,EACT,MAAgB,GACjB,EAAE;IACD,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC,CAkD1C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/kernel-zerodev/owner/passkey/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export type ByteArray = Uint8Array;
|
|
2
|
+
export type Hex = `0x${string}`;
|
|
3
|
+
export type Hash = `0x${string}`;
|
|
4
|
+
export type LogTopic = Hex | Hex[] | null;
|
|
5
|
+
export type SignableMessage = string | {
|
|
6
|
+
/** Raw data representation of the message. */
|
|
7
|
+
raw: Hex | ByteArray;
|
|
8
|
+
};
|
|
9
|
+
export type Signature = {
|
|
10
|
+
r: Hex;
|
|
11
|
+
s: Hex;
|
|
12
|
+
v: bigint;
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../src/kernel-zerodev/owner/passkey/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GAAG,UAAU,CAAC;AACnC,MAAM,MAAM,GAAG,GAAG,KAAK,MAAM,EAAE,CAAC;AAChC,MAAM,MAAM,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;AACjC,MAAM,MAAM,QAAQ,GAAG,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC;AAC1C,MAAM,MAAM,eAAe,GACvB,MAAM,GACN;IACE,8CAA8C;IAC9C,GAAG,EAAE,GAAG,GAAG,SAAS,CAAC;CACtB,CAAC;AACN,MAAM,MAAM,SAAS,GAAG;IAEtB,CAAC,EAAE,GAAG,CAAC;IAEP,CAAC,EAAE,GAAG,CAAC;IAEP,CAAC,EAAE,MAAM,CAAC;CACX,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Hex, Signature } from "./types.js";
|
|
2
|
+
import type { SignTypedDataParams } from "@alchemy/aa-core";
|
|
3
|
+
export declare const publicKey = "public-key";
|
|
4
|
+
export declare const es256 = -7;
|
|
5
|
+
export declare const generateRandomBuffer: () => ArrayBuffer;
|
|
6
|
+
export declare const base64UrlEncode: (challenge: ArrayBuffer) => string;
|
|
7
|
+
export declare function signatureToHex({ r, s, v }: Signature): Hex;
|
|
8
|
+
export declare const signMessage: (msg: string | Uint8Array, id: string, walletId: string, projectId: string, credentialId: string, apiUrl?: string) => Promise<`0x${string}`>;
|
|
9
|
+
export declare const signTypedData: (params: SignTypedDataParams, id: string, walletId: string, projectId: string, credentialId: string, apiUrl?: string) => Promise<`0x${string}`>;
|
|
10
|
+
export declare const getCredentials: (projectId: string, apiUrl?: string) => Promise<any>;
|
|
11
|
+
export declare function base64URLStringToBuffer(base64URLString: string): ArrayBuffer;
|
|
12
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../../src/kernel-zerodev/owner/passkey/utils.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEjD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAO5D,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;AAWF,wBAAgB,cAAc,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,SAAS,GAAG,GAAG,CAO1D;AAED,eAAO,MAAM,WAAW,QACjB,MAAM,GAAG,UAAU,MACpB,MAAM,YACA,MAAM,aACL,MAAM,gBACH,MAAM,4CA8CrB,CAAC;AAEF,eAAO,MAAM,aAAa,WAChB,mBAAmB,MACvB,MAAM,YACA,MAAM,aACL,MAAM,gBACH,MAAM,4CAYrB,CAAC;AAEF,eAAO,MAAM,cAAc,cAAqB,MAAM,kCAOrD,CAAC;AAGF,wBAAgB,uBAAuB,CAAC,eAAe,EAAE,MAAM,GAAG,WAAW,CAyB5E"}
|
|
@@ -12,13 +12,5 @@ export declare function getGasTokenAddress(gasToken: SupportedGasToken, chainId:
|
|
|
12
12
|
export declare const convertWalletClientToAccountSigner: (client: WalletClient) => SmartAccountSigner;
|
|
13
13
|
export declare const isWallet: (signer: any) => signer is Wallet;
|
|
14
14
|
export declare const convertEthersSignerToAccountSigner: (signer: Signer | Wallet) => SmartAccountSigner;
|
|
15
|
-
export declare function getRPCProviderOwner(web3Provider: any): SmartAccountSigner;
|
|
16
|
-
export declare function getCustodialOwner(identifier: string, { custodialFilePath, privateKey, publicKey, keyId, apiUrl, }: {
|
|
17
|
-
privateKey?: string;
|
|
18
|
-
publicKey?: string;
|
|
19
|
-
keyId?: string;
|
|
20
|
-
custodialFilePath?: string;
|
|
21
|
-
apiUrl?: string;
|
|
22
|
-
}): Promise<SmartAccountSigner | undefined>;
|
|
23
15
|
export declare const randomHexString: (length: number) => Hex;
|
|
24
16
|
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/kernel-zerodev/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,GAAG,EACR,KAAK,YAAY,EAElB,MAAM,MAAM,CAAC;AACd,OAAO,KAAK,EAEV,kBAAkB,EAClB,qBAAqB,EACtB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,MAAM,EAAuB,MAAM,gCAAgC,CAAC;AAC7E,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/kernel-zerodev/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,GAAG,EACR,KAAK,YAAY,EAElB,MAAM,MAAM,CAAC;AACd,OAAO,KAAK,EAEV,kBAAkB,EAClB,qBAAqB,EACtB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,MAAM,EAAuB,MAAM,gCAAgC,CAAC;AAC7E,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAG9D,MAAM,MAAM,iCAAiC,GAAG,qBAAqB,GAAG;IACtE,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,sCAAsC,GAChD,iCAAiC,EAAE,CAAC;AAgBtC,eAAO,MAAM,eAAe,oDAEzB,GAEF,CAAC;AAEF,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,iBAAiB,EAC3B,OAAO,EAAE,MAAM,GACd,GAAG,GAAG,SAAS,CAKjB;AAED,eAAO,MAAM,kCAAkC,WACrC,YAAY,KACnB,kBAiBF,CAAC;AAEF,eAAO,MAAM,QAAQ,WAAY,GAAG,qBACW,CAAC;AAEhD,eAAO,MAAM,kCAAkC,WACrC,MAAM,GAAG,MAAM,KACtB,kBAiBF,CAAC;AAEF,eAAO,MAAM,eAAe,WAAY,MAAM,KAAG,GAK9C,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zerodev/sdk",
|
|
3
|
-
"version": "4.0.2-
|
|
3
|
+
"version": "4.0.2-passkey.0",
|
|
4
4
|
"description": "A collection of ERC-4337 compliant smart contract account interfaces",
|
|
5
5
|
"author": "ZeroDev",
|
|
6
6
|
"license": "MIT",
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
"typings": "./dist/types/index.d.ts",
|
|
13
13
|
"sideEffects": false,
|
|
14
14
|
"files": [
|
|
15
|
+
"passkey",
|
|
15
16
|
"dist",
|
|
16
17
|
"src/**/*.ts",
|
|
17
18
|
"!dist/**/*.tsbuildinfo",
|
|
@@ -26,6 +27,11 @@
|
|
|
26
27
|
"import": "./dist/esm/index.js",
|
|
27
28
|
"default": "./dist/cjs/index.js"
|
|
28
29
|
},
|
|
30
|
+
"./passkey": {
|
|
31
|
+
"import": "./dist/esm/kernel-zerodev/owner/passkey/index.js",
|
|
32
|
+
"default": "./dist/cjs/kernel-zerodev/owner/passkey/index.js",
|
|
33
|
+
"types": "./dist/types/kernel-zerodev/owner/passkey/index.d.ts"
|
|
34
|
+
},
|
|
29
35
|
"./package.json": "./package.json"
|
|
30
36
|
},
|
|
31
37
|
"scripts": {
|
package/src/index.ts
CHANGED
|
@@ -38,3 +38,6 @@ export { getChainId } from "./kernel-zerodev/api/index.js";
|
|
|
38
38
|
export { ZeroDevEthersProvider } from "./kernel-zerodev/ethers-provider/ethers-provider.js";
|
|
39
39
|
|
|
40
40
|
export * as constants from "./kernel-zerodev/constants.js";
|
|
41
|
+
|
|
42
|
+
// Owner exports
|
|
43
|
+
export * from "./kernel-zerodev/owner/index.js";
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import type { SmartAccountSigner } from "@alchemy/aa-core";
|
|
2
|
+
import { API_URL } from "../constants.js";
|
|
3
|
+
import axios from "axios";
|
|
4
|
+
import type { Hex } from "viem";
|
|
5
|
+
import type { SignTypedDataParams } from "@alchemy/aa-core";
|
|
6
|
+
|
|
7
|
+
export async function getCustodialOwner(
|
|
8
|
+
identifier: string,
|
|
9
|
+
{
|
|
10
|
+
custodialFilePath,
|
|
11
|
+
privateKey,
|
|
12
|
+
publicKey,
|
|
13
|
+
keyId,
|
|
14
|
+
apiUrl = API_URL,
|
|
15
|
+
}: {
|
|
16
|
+
privateKey?: string;
|
|
17
|
+
publicKey?: string;
|
|
18
|
+
keyId?: string;
|
|
19
|
+
custodialFilePath?: string;
|
|
20
|
+
apiUrl?: string;
|
|
21
|
+
}
|
|
22
|
+
): Promise<SmartAccountSigner | undefined> {
|
|
23
|
+
if (custodialFilePath) {
|
|
24
|
+
let fsModule;
|
|
25
|
+
try {
|
|
26
|
+
fsModule = require.resolve("fs") && require("fs");
|
|
27
|
+
} catch (error) {
|
|
28
|
+
console.log("FS module not available. Skipping FS operation...");
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
const data = fsModule.readFileSync(custodialFilePath, "utf8");
|
|
32
|
+
const values = data.split("\n");
|
|
33
|
+
[privateKey, publicKey, keyId] = values;
|
|
34
|
+
}
|
|
35
|
+
let TurnkeySigner;
|
|
36
|
+
try {
|
|
37
|
+
TurnkeySigner =
|
|
38
|
+
require.resolve("@turnkey/ethers") &&
|
|
39
|
+
require("@turnkey/ethers").TurnkeySigner;
|
|
40
|
+
} catch (error) {
|
|
41
|
+
console.log(
|
|
42
|
+
"@turnkey/ethers module not available. Skipping FS operation..."
|
|
43
|
+
);
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
if (!privateKey || !publicKey || !keyId) {
|
|
47
|
+
throw new Error(
|
|
48
|
+
"Must provide custodialFilePath or privateKey, publicKey, and keyId."
|
|
49
|
+
);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const response = await axios.post(`${apiUrl}/wallets/${identifier}`, {
|
|
53
|
+
keyId,
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
const turnkeySigner = new TurnkeySigner({
|
|
57
|
+
apiPublicKey: publicKey,
|
|
58
|
+
apiPrivateKey: privateKey,
|
|
59
|
+
baseUrl: "https://coordinator-beta.turnkey.io",
|
|
60
|
+
organizationId: keyId,
|
|
61
|
+
privateKeyId: response.data.walletId,
|
|
62
|
+
});
|
|
63
|
+
return {
|
|
64
|
+
getAddress: async () => (await turnkeySigner.getAddress()) as `0x${string}`,
|
|
65
|
+
signMessage: async (msg: Uint8Array | string) =>
|
|
66
|
+
(await turnkeySigner.signMessage(msg)) as `0x${string}`,
|
|
67
|
+
signTypedData: async (params: SignTypedDataParams) =>
|
|
68
|
+
(await turnkeySigner.signTypedData(
|
|
69
|
+
params.domain,
|
|
70
|
+
params.types,
|
|
71
|
+
params.message
|
|
72
|
+
)) as Hex,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { SignTypedDataParams, SmartAccountSigner } from "@alchemy/aa-core";
|
|
2
|
+
import { Web3Provider, type ExternalProvider } from "@ethersproject/providers";
|
|
3
|
+
import { type TypedDataField } from "@ethersproject/abstract-signer";
|
|
4
|
+
import type { Hex } from "viem";
|
|
5
|
+
|
|
6
|
+
export function getRPCProviderOwner(web3Provider: any): SmartAccountSigner {
|
|
7
|
+
const provider = new Web3Provider(web3Provider as ExternalProvider);
|
|
8
|
+
const signer = provider.getSigner();
|
|
9
|
+
|
|
10
|
+
return {
|
|
11
|
+
getAddress: async () =>
|
|
12
|
+
Promise.resolve((await signer.getAddress()) as `0x${string}`),
|
|
13
|
+
signMessage: async (msg: Uint8Array | string) =>
|
|
14
|
+
(await signer.signMessage(msg)) as `0x${string}`,
|
|
15
|
+
signTypedData: async (params: SignTypedDataParams) =>
|
|
16
|
+
(await signer._signTypedData(
|
|
17
|
+
params.domain!,
|
|
18
|
+
params.types as unknown as Record<string, TypedDataField[]>,
|
|
19
|
+
params.message
|
|
20
|
+
)) as Hex,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { getWebAuthnAttestation } from "@turnkey/http";
|
|
2
|
+
import axios from "axios";
|
|
3
|
+
import type { SignTypedDataParams, SmartAccountSigner } from "@alchemy/aa-core";
|
|
4
|
+
import {
|
|
5
|
+
base64UrlEncode,
|
|
6
|
+
es256,
|
|
7
|
+
generateRandomBuffer,
|
|
8
|
+
getCredentials,
|
|
9
|
+
publicKey,
|
|
10
|
+
signMessage,
|
|
11
|
+
signTypedData,
|
|
12
|
+
} from "./utils.js";
|
|
13
|
+
import { API_URL } from "../../constants.js";
|
|
14
|
+
|
|
15
|
+
export async function createPasskeyOwner({
|
|
16
|
+
name,
|
|
17
|
+
projectId,
|
|
18
|
+
fallback,
|
|
19
|
+
apiUrl = API_URL,
|
|
20
|
+
}: {
|
|
21
|
+
name: string;
|
|
22
|
+
projectId: string;
|
|
23
|
+
fallback?: () => Promise<SmartAccountSigner | undefined>;
|
|
24
|
+
apiUrl?: string;
|
|
25
|
+
}): Promise<SmartAccountSigner | undefined> {
|
|
26
|
+
//@ts-expect-error
|
|
27
|
+
if (typeof window !== "undefined") {
|
|
28
|
+
const challenge = generateRandomBuffer();
|
|
29
|
+
try {
|
|
30
|
+
const attestation = await getWebAuthnAttestation({
|
|
31
|
+
publicKey: {
|
|
32
|
+
rp: {
|
|
33
|
+
//@ts-expect-error
|
|
34
|
+
id: window.location.hostname,
|
|
35
|
+
//@ts-expect-error
|
|
36
|
+
name: window.location.hostname,
|
|
37
|
+
},
|
|
38
|
+
authenticatorSelection: {
|
|
39
|
+
residentKey: "required", // or 'preferred', 'discouraged'
|
|
40
|
+
userVerification: "required",
|
|
41
|
+
},
|
|
42
|
+
excludeCredentials: await getCredentials(projectId),
|
|
43
|
+
extensions: { credProps: true },
|
|
44
|
+
challenge,
|
|
45
|
+
pubKeyCredParams: [
|
|
46
|
+
{
|
|
47
|
+
type: publicKey,
|
|
48
|
+
alg: es256,
|
|
49
|
+
},
|
|
50
|
+
],
|
|
51
|
+
user: {
|
|
52
|
+
id: Uint8Array.from(name, (c) => c.charCodeAt(0)),
|
|
53
|
+
name,
|
|
54
|
+
displayName: name,
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
});
|
|
58
|
+
const response = await axios.post(
|
|
59
|
+
`${apiUrl}/projects/${projectId}/wallets`,
|
|
60
|
+
{
|
|
61
|
+
challenge: base64UrlEncode(challenge),
|
|
62
|
+
name,
|
|
63
|
+
attestation,
|
|
64
|
+
}
|
|
65
|
+
);
|
|
66
|
+
const { id, walletId, address } = await response.data;
|
|
67
|
+
const owner: SmartAccountSigner = {
|
|
68
|
+
getAddress: async () => address,
|
|
69
|
+
signMessage: (msg) =>
|
|
70
|
+
signMessage(
|
|
71
|
+
msg,
|
|
72
|
+
id,
|
|
73
|
+
walletId,
|
|
74
|
+
projectId,
|
|
75
|
+
attestation.credentialId,
|
|
76
|
+
apiUrl
|
|
77
|
+
),
|
|
78
|
+
signTypedData: (params: SignTypedDataParams) =>
|
|
79
|
+
signTypedData(
|
|
80
|
+
params,
|
|
81
|
+
id,
|
|
82
|
+
walletId,
|
|
83
|
+
projectId,
|
|
84
|
+
attestation.credentialId,
|
|
85
|
+
apiUrl
|
|
86
|
+
),
|
|
87
|
+
};
|
|
88
|
+
return owner;
|
|
89
|
+
} catch (e) {
|
|
90
|
+
//@ts-expect-error
|
|
91
|
+
if (e instanceof DOMException && e.name === "InvalidStateError") {
|
|
92
|
+
if (fallback) return await fallback();
|
|
93
|
+
}
|
|
94
|
+
console.log(e);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { SmartAccountSigner } from "@alchemy/aa-core";
|
|
2
|
+
import { API_URL } from "../../constants.js";
|
|
3
|
+
// import { getPasskeyOwner } from "./getPasskeyOwner.js";
|
|
4
|
+
import { createPasskeyOwner } from "./createPasskeyOwner.js";
|
|
5
|
+
import { getPasskeyOwner } from "./getPasskeyOwner.js";
|
|
6
|
+
|
|
7
|
+
export async function getOrCreatePasskeyOwner({
|
|
8
|
+
name,
|
|
9
|
+
projectId,
|
|
10
|
+
apiUrl = API_URL,
|
|
11
|
+
}: {
|
|
12
|
+
name: string;
|
|
13
|
+
projectId: string;
|
|
14
|
+
apiUrl?: string;
|
|
15
|
+
}): Promise<SmartAccountSigner | undefined> {
|
|
16
|
+
return await createPasskeyOwner({
|
|
17
|
+
name,
|
|
18
|
+
projectId,
|
|
19
|
+
apiUrl,
|
|
20
|
+
fallback: () => getPasskeyOwner({ projectId, apiUrl }),
|
|
21
|
+
});
|
|
22
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { getWebAuthnAssertion } from "@turnkey/http/dist/webauthn";
|
|
2
|
+
import axios from "axios";
|
|
3
|
+
import type { SignTypedDataParams, SmartAccountSigner } from "@alchemy/aa-core";
|
|
4
|
+
import {
|
|
5
|
+
base64UrlEncode,
|
|
6
|
+
generateRandomBuffer,
|
|
7
|
+
getCredentials,
|
|
8
|
+
signMessage,
|
|
9
|
+
signTypedData,
|
|
10
|
+
} from "./utils.js";
|
|
11
|
+
import { API_URL } from "../../constants.js";
|
|
12
|
+
|
|
13
|
+
export async function getPasskeyOwner({
|
|
14
|
+
projectId,
|
|
15
|
+
apiUrl = API_URL,
|
|
16
|
+
}: {
|
|
17
|
+
projectId: string;
|
|
18
|
+
apiUrl?: string;
|
|
19
|
+
}): Promise<SmartAccountSigner | undefined> {
|
|
20
|
+
//@ts-expect-error
|
|
21
|
+
if (typeof window !== "undefined") {
|
|
22
|
+
const challenge = generateRandomBuffer();
|
|
23
|
+
try {
|
|
24
|
+
const assertion = JSON.parse(
|
|
25
|
+
await getWebAuthnAssertion(base64UrlEncode(challenge), {
|
|
26
|
+
publicKey: {
|
|
27
|
+
//@ts-expect-error
|
|
28
|
+
rpId: window.location.hostname,
|
|
29
|
+
userVerification: "required",
|
|
30
|
+
allowCredentials: await getCredentials(projectId),
|
|
31
|
+
},
|
|
32
|
+
})
|
|
33
|
+
);
|
|
34
|
+
const response = await axios.post(
|
|
35
|
+
`${apiUrl}/projects/${projectId}/wallets/${assertion.credentialId}`,
|
|
36
|
+
{
|
|
37
|
+
challenge: base64UrlEncode(challenge),
|
|
38
|
+
assertion,
|
|
39
|
+
}
|
|
40
|
+
);
|
|
41
|
+
const { id, walletId, address } = await response.data;
|
|
42
|
+
const owner: SmartAccountSigner = {
|
|
43
|
+
getAddress: async () => address,
|
|
44
|
+
signMessage: (msg) =>
|
|
45
|
+
signMessage(
|
|
46
|
+
msg,
|
|
47
|
+
id,
|
|
48
|
+
walletId,
|
|
49
|
+
projectId,
|
|
50
|
+
assertion.credentialId,
|
|
51
|
+
apiUrl
|
|
52
|
+
),
|
|
53
|
+
signTypedData: (params: SignTypedDataParams) =>
|
|
54
|
+
signTypedData(
|
|
55
|
+
params,
|
|
56
|
+
id,
|
|
57
|
+
walletId,
|
|
58
|
+
projectId,
|
|
59
|
+
assertion.credentialId,
|
|
60
|
+
apiUrl
|
|
61
|
+
),
|
|
62
|
+
};
|
|
63
|
+
return owner;
|
|
64
|
+
} catch (e) {
|
|
65
|
+
console.log(e);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export type ByteArray = Uint8Array;
|
|
2
|
+
export type Hex = `0x${string}`;
|
|
3
|
+
export type Hash = `0x${string}`;
|
|
4
|
+
export type LogTopic = Hex | Hex[] | null;
|
|
5
|
+
export type SignableMessage =
|
|
6
|
+
| string
|
|
7
|
+
| {
|
|
8
|
+
/** Raw data representation of the message. */
|
|
9
|
+
raw: Hex | ByteArray;
|
|
10
|
+
};
|
|
11
|
+
export type Signature = {
|
|
12
|
+
// TODO(v2): Make `bigint`
|
|
13
|
+
r: Hex;
|
|
14
|
+
// TODO(v2): Make `bigint`
|
|
15
|
+
s: Hex;
|
|
16
|
+
// TODO(v2): `v` to `recovery`
|
|
17
|
+
v: bigint;
|
|
18
|
+
};
|