@zerodev/sdk 4.0.3 → 4.0.4
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 +8 -8
- package/dist/cjs/kernel-zerodev/owner/getRPCProviderOwner.js +1 -3
- package/dist/cjs/kernel-zerodev/owner/getRPCProviderOwner.js.map +1 -1
- package/dist/cjs/kernel-zerodev/utils.js +4 -7
- package/dist/cjs/kernel-zerodev/utils.js.map +1 -1
- package/dist/esm/kernel-zerodev/owner/getRPCProviderOwner.js +2 -3
- package/dist/esm/kernel-zerodev/owner/getRPCProviderOwner.js.map +1 -1
- package/dist/esm/kernel-zerodev/utils.js +5 -8
- package/dist/esm/kernel-zerodev/utils.js.map +1 -1
- package/dist/types/kernel-zerodev/owner/getRPCProviderOwner.d.ts.map +1 -1
- package/dist/types/kernel-zerodev/utils.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/kernel-zerodev/owner/getRPCProviderOwner.ts +9 -3
- package/src/kernel-zerodev/utils.ts +7 -6
package/README.md
CHANGED
|
@@ -9,13 +9,13 @@ Follow the instructions below to install the packages.
|
|
|
9
9
|
via `yarn`
|
|
10
10
|
|
|
11
11
|
```bash
|
|
12
|
-
yarn add @alchemy/aa-core @alchemy/aa-ethers @zerodevapp/sdk
|
|
12
|
+
yarn add @alchemy/aa-core @alchemy/aa-ethers @zerodevapp/sdk
|
|
13
13
|
```
|
|
14
14
|
|
|
15
15
|
via `npm`
|
|
16
16
|
|
|
17
17
|
```bash
|
|
18
|
-
npm i -s @alchemy/aa-core @alchemy/aa-ethers @zerodev/sdk
|
|
18
|
+
npm i -s @alchemy/aa-core @alchemy/aa-ethers @zerodev/sdk
|
|
19
19
|
```
|
|
20
20
|
|
|
21
21
|
## Example Usage to Interact with [Kernel Accounts](https://github.com/zerodevapp/kernel/blob/main/src/Kernel.sol)
|
|
@@ -23,7 +23,7 @@ npm i -s @alchemy/aa-core @alchemy/aa-ethers @zerodev/sdk@alpha
|
|
|
23
23
|
### Basic Usage
|
|
24
24
|
|
|
25
25
|
```ts
|
|
26
|
-
import { ECDSAValidator } from "@zerodev/sdk
|
|
26
|
+
import { ECDSAValidator } from "@zerodev/sdk";
|
|
27
27
|
import { PrivateKeySigner } from "@alchemy/aa-core";
|
|
28
28
|
|
|
29
29
|
// 1. define the EOA owner of the Smart Account
|
|
@@ -134,7 +134,7 @@ import { Wallet } from "@ethersproject/wallet";
|
|
|
134
134
|
import {
|
|
135
135
|
ZeroDevEthersProvider,
|
|
136
136
|
convertEthersSignerToAccountSigner,
|
|
137
|
-
} from "@zerodev/sdk
|
|
137
|
+
} from "@zerodev/sdk";
|
|
138
138
|
|
|
139
139
|
// 1. Create an ethers Wallet
|
|
140
140
|
const owner = Wallet.fromMnemonic(OWNER_MNEMONIC);
|
|
@@ -169,7 +169,7 @@ import { polygonMumbai } from "viem/chains";
|
|
|
169
169
|
import {
|
|
170
170
|
ECDSAProvider,
|
|
171
171
|
convertWalletClientToAccountSigner,
|
|
172
|
-
} from "@zerodev/sdk
|
|
172
|
+
} from "@zerodev/sdk";
|
|
173
173
|
|
|
174
174
|
// 1. Create a Viem Wallet Client using the custom transport
|
|
175
175
|
const client = createWalletClient({
|
|
@@ -194,7 +194,7 @@ const { hash } = await ecdsaProvider.sendUserOperation({
|
|
|
194
194
|
### Using [Magic](https://magic.link/)
|
|
195
195
|
|
|
196
196
|
```ts
|
|
197
|
-
import { ECDSAProvider, getRPCProviderOwner } from "@zerodev/sdk
|
|
197
|
+
import { ECDSAProvider, getRPCProviderOwner } from "@zerodev/sdk";
|
|
198
198
|
import { Magic } from "magic-sdk";
|
|
199
199
|
|
|
200
200
|
const magic = new Magic("MAGIC_API_KEY", {
|
|
@@ -210,7 +210,7 @@ let ecdsaProvider = await ECDSAProvider.init({
|
|
|
210
210
|
### Using [Web3Auth](https://web3auth.io/)
|
|
211
211
|
|
|
212
212
|
```ts
|
|
213
|
-
import { ECDSAProvider, getRPCProviderOwner } from "@zerodev/sdk
|
|
213
|
+
import { ECDSAProvider, getRPCProviderOwner } from "@zerodev/sdk";
|
|
214
214
|
import { Web3Auth } from "@web3auth/modal";
|
|
215
215
|
|
|
216
216
|
const web3auth = new Web3Auth({
|
|
@@ -234,7 +234,7 @@ let ecdsaProvider = await ECDSAProvider.init({
|
|
|
234
234
|
A designated guardian can "turn off" the account and set a new owner.
|
|
235
235
|
|
|
236
236
|
```ts
|
|
237
|
-
import { constants } from "@zerodev/sdk
|
|
237
|
+
import { constants } from "@zerodev/sdk";
|
|
238
238
|
// 1. Get the default ecdsa validator provider
|
|
239
239
|
const ecdsaProvider = await ECDSAProvider.init({
|
|
240
240
|
projectId, // zeroDev projectId
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.getRPCProviderOwner = void 0;
|
|
4
4
|
const providers_1 = require("@ethersproject/providers");
|
|
5
|
-
const viem_1 = require("viem");
|
|
6
5
|
const utils_js_1 = require("../utils.js");
|
|
7
6
|
function getRPCProviderOwner(web3Provider) {
|
|
8
7
|
const provider = new providers_1.Web3Provider(web3Provider);
|
|
@@ -11,8 +10,7 @@ function getRPCProviderOwner(web3Provider) {
|
|
|
11
10
|
getAddress: async () => Promise.resolve((await signer.getAddress())),
|
|
12
11
|
signMessage: async (msg) => (await signer.signMessage(msg)),
|
|
13
12
|
signTypedData: async (params) => {
|
|
14
|
-
|
|
15
|
-
return (0, utils_js_1.fixSignedData)((await signer.signMessage(hash)));
|
|
13
|
+
return (0, utils_js_1.fixSignedData)((await signer._signTypedData(params.domain, params.types, params.message)));
|
|
16
14
|
},
|
|
17
15
|
};
|
|
18
16
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getRPCProviderOwner.js","sourceRoot":"","sources":["../../../../src/kernel-zerodev/owner/getRPCProviderOwner.ts"],"names":[],"mappings":";;;AACA,wDAA+E;AAC/E
|
|
1
|
+
{"version":3,"file":"getRPCProviderOwner.js","sourceRoot":"","sources":["../../../../src/kernel-zerodev/owner/getRPCProviderOwner.ts"],"names":[],"mappings":";;;AACA,wDAA+E;AAC/E,0CAA4C;AAI5C,SAAgB,mBAAmB,CAAC,YAAiB;IACnD,MAAM,QAAQ,GAAG,IAAI,wBAAY,CAAC,YAAgC,CAAC,CAAC;IACpE,MAAM,MAAM,GAAG,QAAQ,CAAC,SAAS,EAAE,CAAC;IAEpC,OAAO;QACL,UAAU,EAAE,KAAK,IAAI,EAAE,CACrB,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,MAAM,CAAC,UAAU,EAAE,CAAkB,CAAC;QAC/D,WAAW,EAAE,KAAK,EAAE,GAAwB,EAAE,EAAE,CAC9C,CAAC,MAAM,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAkB;QAClD,aAAa,EAAE,KAAK,EAAE,MAA2B,EAAE,EAAE;YACnD,OAAO,IAAA,wBAAa,EAClB,CAAC,MAAM,MAAM,CAAC,cAAc,CAC1B,MAAM,CAAC,MAAO,EACd,MAAM,CAAC,KAAoD,EAC3D,MAAM,CAAC,OAAO,CACf,CAAQ,CACV,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC;AAnBD,kDAmBC","sourcesContent":["import type { SignTypedDataParams, SmartAccountSigner } from \"@alchemy/aa-core\";\nimport { Web3Provider, type ExternalProvider } from \"@ethersproject/providers\";\nimport { fixSignedData } from \"../utils.js\";\nimport type { Hex } from \"viem\";\nimport { type TypedDataField } from \"@ethersproject/abstract-signer\";\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 return fixSignedData(\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 };\n}\n"]}
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.fixSignedData = exports.randomHexString = exports.convertEthersSignerToAccountSigner = exports.isWallet = exports.convertWalletClientToAccountSigner = exports.getGasTokenAddress = exports.encodeMultiSend = void 0;
|
|
4
4
|
const viem_1 = require("viem");
|
|
5
|
-
const bytes_1 = require("@ethersproject/bytes");
|
|
6
5
|
const constants_js_1 = require("./constants.js");
|
|
7
6
|
const encodeCall = (_tx) => {
|
|
8
7
|
const data = (0, viem_1.toBytes)(_tx.data);
|
|
@@ -66,12 +65,10 @@ const fixSignedData = (sig) => {
|
|
|
66
65
|
throw new Error("Invalid signed data " + sig);
|
|
67
66
|
}
|
|
68
67
|
}
|
|
69
|
-
let { r, s, v } = (0,
|
|
70
|
-
if (v ===
|
|
71
|
-
v
|
|
72
|
-
|
|
73
|
-
v = 28;
|
|
74
|
-
const joined = (0, bytes_1.joinSignature)({ r, s, v });
|
|
68
|
+
let { r, s, v } = (0, viem_1.hexToSignature)(signature);
|
|
69
|
+
if (v === 0n || v === 1n)
|
|
70
|
+
v += 27n;
|
|
71
|
+
const joined = (0, viem_1.signatureToHex)({ r, s, v });
|
|
75
72
|
return joined;
|
|
76
73
|
};
|
|
77
74
|
exports.fixSignedData = fixSignedData;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/kernel-zerodev/utils.ts"],"names":[],"mappings":";;;AAAA,+
|
|
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 isHex,\n hexToSignature,\n signatureToHex,\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\nexport const fixSignedData = (sig: Hex): Hex => {\n let signature = sig;\n if (!isHex(signature)) {\n signature = `0x${signature}`;\n if (!isHex(signature)) {\n throw new Error(\"Invalid signed data \" + sig);\n }\n }\n\n let { r, s, v } = hexToSignature(signature);\n if (v === 0n || v === 1n) v += 27n;\n const joined = signatureToHex({ r, s, v });\n return joined;\n};\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Web3Provider } from "@ethersproject/providers";
|
|
2
|
-
import { hashTypedData } from "viem";
|
|
3
2
|
import { fixSignedData } from "../utils.js";
|
|
3
|
+
import {} from "@ethersproject/abstract-signer";
|
|
4
4
|
export function getRPCProviderOwner(web3Provider) {
|
|
5
5
|
const provider = new Web3Provider(web3Provider);
|
|
6
6
|
const signer = provider.getSigner();
|
|
@@ -8,8 +8,7 @@ export function getRPCProviderOwner(web3Provider) {
|
|
|
8
8
|
getAddress: async () => Promise.resolve((await signer.getAddress())),
|
|
9
9
|
signMessage: async (msg) => (await signer.signMessage(msg)),
|
|
10
10
|
signTypedData: async (params) => {
|
|
11
|
-
|
|
12
|
-
return fixSignedData((await signer.signMessage(hash)));
|
|
11
|
+
return fixSignedData((await signer._signTypedData(params.domain, params.types, params.message)));
|
|
13
12
|
},
|
|
14
13
|
};
|
|
15
14
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getRPCProviderOwner.js","sourceRoot":"","sources":["../../../../src/kernel-zerodev/owner/getRPCProviderOwner.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAyB,MAAM,0BAA0B,CAAC;AAC/E,OAAO,EAAE,aAAa,
|
|
1
|
+
{"version":3,"file":"getRPCProviderOwner.js","sourceRoot":"","sources":["../../../../src/kernel-zerodev/owner/getRPCProviderOwner.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAyB,MAAM,0BAA0B,CAAC;AAC/E,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EAAuB,MAAM,gCAAgC,CAAC;AAErE,MAAM,UAAU,mBAAmB,CAAC,YAAiB;IACnD,MAAM,QAAQ,GAAG,IAAI,YAAY,CAAC,YAAgC,CAAC,CAAC;IACpE,MAAM,MAAM,GAAG,QAAQ,CAAC,SAAS,EAAE,CAAC;IAEpC,OAAO;QACL,UAAU,EAAE,KAAK,IAAI,EAAE,CACrB,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,MAAM,CAAC,UAAU,EAAE,CAAkB,CAAC;QAC/D,WAAW,EAAE,KAAK,EAAE,GAAwB,EAAE,EAAE,CAC9C,CAAC,MAAM,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAkB;QAClD,aAAa,EAAE,KAAK,EAAE,MAA2B,EAAE,EAAE;YACnD,OAAO,aAAa,CAClB,CAAC,MAAM,MAAM,CAAC,cAAc,CAC1B,MAAM,CAAC,MAAO,EACd,MAAM,CAAC,KAAoD,EAC3D,MAAM,CAAC,OAAO,CACf,CAAQ,CACV,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["import type { SignTypedDataParams, SmartAccountSigner } from \"@alchemy/aa-core\";\nimport { Web3Provider, type ExternalProvider } from \"@ethersproject/providers\";\nimport { fixSignedData } from \"../utils.js\";\nimport type { Hex } from \"viem\";\nimport { type TypedDataField } from \"@ethersproject/abstract-signer\";\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 return fixSignedData(\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 };\n}\n"]}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import { encodePacked, fromBytes, toBytes, toHex, isHex, } from "viem";
|
|
1
|
+
import { encodePacked, fromBytes, toBytes, toHex, isHex, hexToSignature, signatureToHex, } from "viem";
|
|
2
2
|
import { Signer } from "@ethersproject/abstract-signer";
|
|
3
3
|
import { Wallet } from "@ethersproject/wallet";
|
|
4
|
-
import { splitSignature, joinSignature } from "@ethersproject/bytes";
|
|
5
4
|
import { gasTokenChainAddresses } from "./constants.js";
|
|
6
5
|
const encodeCall = (_tx) => {
|
|
7
6
|
const data = toBytes(_tx.data);
|
|
@@ -59,12 +58,10 @@ export const fixSignedData = (sig) => {
|
|
|
59
58
|
throw new Error("Invalid signed data " + sig);
|
|
60
59
|
}
|
|
61
60
|
}
|
|
62
|
-
let { r, s, v } =
|
|
63
|
-
if (v ===
|
|
64
|
-
v
|
|
65
|
-
|
|
66
|
-
v = 28;
|
|
67
|
-
const joined = joinSignature({ r, s, v });
|
|
61
|
+
let { r, s, v } = hexToSignature(signature);
|
|
62
|
+
if (v === 0n || v === 1n)
|
|
63
|
+
v += 27n;
|
|
64
|
+
const joined = signatureToHex({ r, s, v });
|
|
68
65
|
return joined;
|
|
69
66
|
};
|
|
70
67
|
//# sourceMappingURL=utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/kernel-zerodev/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,SAAS,EACT,OAAO,EAGP,KAAK,EACL,KAAK,
|
|
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 isHex,\n hexToSignature,\n signatureToHex,\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\nexport const fixSignedData = (sig: Hex): Hex => {\n let signature = sig;\n if (!isHex(signature)) {\n signature = `0x${signature}`;\n if (!isHex(signature)) {\n throw new Error(\"Invalid signed data \" + sig);\n }\n }\n\n let { r, s, v } = hexToSignature(signature);\n if (v === 0n || v === 1n) v += 27n;\n const joined = signatureToHex({ r, s, v });\n return joined;\n};\n"]}
|
|
@@ -1 +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;
|
|
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;AAMhF,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,GAAG,GAAG,kBAAkB,CAmBzE"}
|
|
@@ -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,
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/kernel-zerodev/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,GAAG,EACR,KAAK,YAAY,EAKlB,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;AAEJ,eAAO,MAAM,aAAa,QAAS,GAAG,KAAG,GAaxC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import type { SignTypedDataParams, SmartAccountSigner } from "@alchemy/aa-core";
|
|
2
2
|
import { Web3Provider, type ExternalProvider } from "@ethersproject/providers";
|
|
3
|
-
import { hashTypedData, type Hex } from "viem";
|
|
4
3
|
import { fixSignedData } from "../utils.js";
|
|
4
|
+
import type { Hex } from "viem";
|
|
5
|
+
import { type TypedDataField } from "@ethersproject/abstract-signer";
|
|
5
6
|
|
|
6
7
|
export function getRPCProviderOwner(web3Provider: any): SmartAccountSigner {
|
|
7
8
|
const provider = new Web3Provider(web3Provider as ExternalProvider);
|
|
@@ -13,8 +14,13 @@ export function getRPCProviderOwner(web3Provider: any): SmartAccountSigner {
|
|
|
13
14
|
signMessage: async (msg: Uint8Array | string) =>
|
|
14
15
|
(await signer.signMessage(msg)) as `0x${string}`,
|
|
15
16
|
signTypedData: async (params: SignTypedDataParams) => {
|
|
16
|
-
|
|
17
|
-
|
|
17
|
+
return fixSignedData(
|
|
18
|
+
(await signer._signTypedData(
|
|
19
|
+
params.domain!,
|
|
20
|
+
params.types as unknown as Record<string, TypedDataField[]>,
|
|
21
|
+
params.message
|
|
22
|
+
)) as Hex
|
|
23
|
+
);
|
|
18
24
|
},
|
|
19
25
|
};
|
|
20
26
|
}
|
|
@@ -6,6 +6,8 @@ import {
|
|
|
6
6
|
type WalletClient,
|
|
7
7
|
toHex,
|
|
8
8
|
isHex,
|
|
9
|
+
hexToSignature,
|
|
10
|
+
signatureToHex,
|
|
9
11
|
} from "viem";
|
|
10
12
|
import type {
|
|
11
13
|
SignTypedDataParams,
|
|
@@ -14,7 +16,6 @@ import type {
|
|
|
14
16
|
} from "@alchemy/aa-core";
|
|
15
17
|
import { Signer, type TypedDataField } from "@ethersproject/abstract-signer";
|
|
16
18
|
import { Wallet } from "@ethersproject/wallet";
|
|
17
|
-
import { splitSignature, joinSignature } from "@ethersproject/bytes";
|
|
18
19
|
import type { SupportedGasToken } from "./paymaster/types.js";
|
|
19
20
|
import { gasTokenChainAddresses } from "./constants.js";
|
|
20
21
|
|
|
@@ -115,9 +116,9 @@ export const fixSignedData = (sig: Hex): Hex => {
|
|
|
115
116
|
throw new Error("Invalid signed data " + sig);
|
|
116
117
|
}
|
|
117
118
|
}
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
if (v ===
|
|
121
|
-
const joined =
|
|
122
|
-
return joined
|
|
119
|
+
|
|
120
|
+
let { r, s, v } = hexToSignature(signature);
|
|
121
|
+
if (v === 0n || v === 1n) v += 27n;
|
|
122
|
+
const joined = signatureToHex({ r, s, v });
|
|
123
|
+
return joined;
|
|
123
124
|
};
|