@coinbase/agentkit 0.10.1 → 0.10.2
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 +137 -40
- package/dist/action-providers/across/schemas.d.ts +1 -1
- package/dist/action-providers/baseAccount/baseAccountActionProvider.d.ts +46 -0
- package/dist/action-providers/baseAccount/baseAccountActionProvider.js +404 -0
- package/dist/action-providers/baseAccount/baseAccountActionProvider.test.d.ts +1 -0
- package/dist/action-providers/baseAccount/baseAccountActionProvider.test.js +325 -0
- package/dist/action-providers/baseAccount/index.d.ts +2 -0
- package/dist/action-providers/baseAccount/index.js +18 -0
- package/dist/action-providers/baseAccount/schemas.d.ts +43 -0
- package/dist/action-providers/baseAccount/schemas.js +62 -0
- package/dist/action-providers/baseAccount/types.d.ts +17 -0
- package/dist/action-providers/baseAccount/types.js +2 -0
- package/dist/action-providers/baseAccount/utils.d.ts +14 -0
- package/dist/action-providers/baseAccount/utils.js +57 -0
- package/dist/action-providers/cdp/cdpEvmWalletActionProvider.js +2 -1
- package/dist/action-providers/cdp/cdpEvmWalletActionProvider.test.js +3 -1
- package/dist/action-providers/cdp/cdpSmartWalletActionProvider.js +2 -1
- package/dist/action-providers/cdp/cdpSmartWalletActionProvider.test.js +3 -1
- package/dist/action-providers/cdp/swapUtils.d.ts +0 -9
- package/dist/action-providers/cdp/swapUtils.js +0 -36
- package/dist/action-providers/clanker/schemas.d.ts +2 -2
- package/dist/action-providers/flaunch/client_utils.d.ts +25 -0
- package/dist/action-providers/flaunch/client_utils.js +62 -0
- package/dist/action-providers/flaunch/constants.d.ts +41 -20
- package/dist/action-providers/flaunch/constants.js +111 -36
- package/dist/action-providers/flaunch/flaunchActionProvider.d.ts +4 -43
- package/dist/action-providers/flaunch/flaunchActionProvider.js +132 -200
- package/dist/action-providers/flaunch/flaunchActionProvider.test.js +108 -13
- package/dist/action-providers/flaunch/metadata_utils.d.ts +12 -0
- package/dist/action-providers/flaunch/metadata_utils.js +216 -0
- package/dist/action-providers/flaunch/schemas.d.ts +39 -3
- package/dist/action-providers/flaunch/schemas.js +62 -10
- package/dist/action-providers/flaunch/{utils.d.ts → swap_utils.d.ts} +17 -19
- package/dist/action-providers/flaunch/{utils.js → swap_utils.js} +137 -172
- package/dist/action-providers/index.d.ts +1 -0
- package/dist/action-providers/index.js +1 -0
- package/dist/action-providers/pyth/pythActionProvider.d.ts +2 -2
- package/dist/action-providers/pyth/pythActionProvider.js +83 -31
- package/dist/action-providers/pyth/pythActionProvider.test.js +178 -26
- package/dist/action-providers/pyth/schemas.d.ts +6 -0
- package/dist/action-providers/pyth/schemas.js +9 -1
- package/dist/action-providers/superfluid/superfluidSuperTokenCreatorActionProvider.js +5 -4
- package/dist/action-providers/superfluid/utils/parseLogs.d.ts +2 -1
- package/dist/action-providers/superfluid/utils/parseLogs.js +6 -3
- package/dist/action-providers/wallet/walletActionProvider.js +3 -0
- package/dist/action-providers/x402/schemas.d.ts +7 -0
- package/dist/action-providers/x402/schemas.js +11 -1
- package/dist/action-providers/x402/utils.d.ts +55 -0
- package/dist/action-providers/x402/utils.js +160 -0
- package/dist/action-providers/x402/x402ActionProvider.d.ts +9 -9
- package/dist/action-providers/x402/x402ActionProvider.js +158 -39
- package/dist/action-providers/x402/x402ActionProvider.test.js +116 -10
- package/dist/utils.d.ts +10 -0
- package/dist/utils.js +43 -13
- package/dist/wallet-providers/cdpEvmWalletProvider.d.ts +7 -0
- package/dist/wallet-providers/cdpEvmWalletProvider.js +14 -21
- package/dist/wallet-providers/cdpEvmWalletProvider.test.js +7 -0
- package/dist/wallet-providers/cdpSmartWalletProvider.d.ts +7 -0
- package/dist/wallet-providers/cdpSmartWalletProvider.js +23 -6
- package/dist/wallet-providers/cdpSmartWalletProvider.test.js +6 -10
- package/dist/wallet-providers/evmWalletProvider.d.ts +9 -2
- package/dist/wallet-providers/evmWalletProvider.js +4 -0
- package/dist/wallet-providers/legacyCdpSmartWalletProvider.d.ts +9 -0
- package/dist/wallet-providers/legacyCdpSmartWalletProvider.js +11 -0
- package/dist/wallet-providers/legacyCdpWalletProvider.d.ts +7 -0
- package/dist/wallet-providers/legacyCdpWalletProvider.js +16 -0
- package/dist/wallet-providers/legacyCdpWalletProvider.test.js +6 -0
- package/dist/wallet-providers/privyEvmDelegatedEmbeddedWalletProvider.d.ts +7 -0
- package/dist/wallet-providers/privyEvmDelegatedEmbeddedWalletProvider.js +27 -0
- package/dist/wallet-providers/privyEvmWalletProvider.test.js +11 -0
- package/dist/wallet-providers/viemWalletProvider.d.ts +8 -1
- package/dist/wallet-providers/viemWalletProvider.js +21 -1
- package/dist/wallet-providers/viemWalletProvider.test.js +21 -1
- package/dist/wallet-providers/zeroDevWalletProvider.d.ts +7 -0
- package/dist/wallet-providers/zeroDevWalletProvider.js +12 -0
- package/dist/wallet-providers/zeroDevWalletProvider.test.js +10 -0
- package/package.json +6 -4
|
@@ -56,10 +56,6 @@ class CdpSmartWalletProvider extends evmWalletProvider_1.EvmWalletProvider {
|
|
|
56
56
|
throw new Error("Missing required environment variables. CDP_API_KEY_ID, CDP_API_KEY_SECRET, CDP_WALLET_SECRET are required.");
|
|
57
57
|
}
|
|
58
58
|
const networkId = config.networkId || process.env.NETWORK_ID || "base-sepolia";
|
|
59
|
-
// Smart wallets are currently only supported on Base networks
|
|
60
|
-
if (!networkId.startsWith("base-")) {
|
|
61
|
-
throw new Error(`Smart wallets are only supported on Base networks. Got: ${networkId}`);
|
|
62
|
-
}
|
|
63
59
|
const network = {
|
|
64
60
|
protocolFamily: "evm",
|
|
65
61
|
chainId: network_1.NETWORK_ID_TO_CHAIN_ID[networkId],
|
|
@@ -116,6 +112,18 @@ class CdpSmartWalletProvider extends evmWalletProvider_1.EvmWalletProvider {
|
|
|
116
112
|
ownerAddress: this.ownerAccount.address,
|
|
117
113
|
};
|
|
118
114
|
}
|
|
115
|
+
/**
|
|
116
|
+
* Signs a raw hash using the owner account.
|
|
117
|
+
*
|
|
118
|
+
* @param _hash - The hash to sign.
|
|
119
|
+
* @returns The signed hash.
|
|
120
|
+
*/
|
|
121
|
+
async sign(_hash) {
|
|
122
|
+
if (!this.ownerAccount.sign) {
|
|
123
|
+
throw new Error("Owner account does not support raw hash signing");
|
|
124
|
+
}
|
|
125
|
+
return this.ownerAccount.sign({ hash: _hash });
|
|
126
|
+
}
|
|
119
127
|
/**
|
|
120
128
|
* Signs a message using the owner account.
|
|
121
129
|
*
|
|
@@ -123,7 +131,7 @@ class CdpSmartWalletProvider extends evmWalletProvider_1.EvmWalletProvider {
|
|
|
123
131
|
* @returns The signed message.
|
|
124
132
|
*/
|
|
125
133
|
async signMessage(_message) {
|
|
126
|
-
|
|
134
|
+
return this.ownerAccount.signMessage({ message: _message });
|
|
127
135
|
}
|
|
128
136
|
/**
|
|
129
137
|
* Signs a typed data object using the owner account.
|
|
@@ -240,10 +248,19 @@ class CdpSmartWalletProvider extends evmWalletProvider_1.EvmWalletProvider {
|
|
|
240
248
|
// For smart wallets, we need to wait for the user operation to be confirmed
|
|
241
249
|
// This is a simplified implementation - in practice you might want to poll
|
|
242
250
|
// the CDP API for user operation status
|
|
243
|
-
|
|
251
|
+
const receipt = await __classPrivateFieldGet(this, _CdpSmartWalletProvider_cdp, "f").evm.waitForUserOperation({
|
|
244
252
|
smartAccountAddress: this.smartAccount.address,
|
|
245
253
|
userOpHash,
|
|
246
254
|
});
|
|
255
|
+
// Append transaction logs if available
|
|
256
|
+
if (receipt.status === "complete") {
|
|
257
|
+
const receiptTx = await __classPrivateFieldGet(this, _CdpSmartWalletProvider_publicClient, "f").getTransactionReceipt({
|
|
258
|
+
hash: receipt.transactionHash,
|
|
259
|
+
});
|
|
260
|
+
if (receiptTx.logs)
|
|
261
|
+
return { ...receipt, logs: receiptTx.logs };
|
|
262
|
+
}
|
|
263
|
+
return receipt;
|
|
247
264
|
}
|
|
248
265
|
/**
|
|
249
266
|
* Reads a contract.
|
|
@@ -109,6 +109,7 @@ describe("CdpSmartWalletProvider", () => {
|
|
|
109
109
|
});
|
|
110
110
|
mockOwnerAccount = {
|
|
111
111
|
address: MOCK_ADDRESS,
|
|
112
|
+
sign: jest.fn().mockResolvedValue(MOCK_SIGNATURE),
|
|
112
113
|
signMessage: jest.fn().mockResolvedValue(MOCK_SIGNATURE),
|
|
113
114
|
signTypedData: jest.fn().mockResolvedValue(MOCK_SIGNATURE),
|
|
114
115
|
};
|
|
@@ -141,14 +142,6 @@ describe("CdpSmartWalletProvider", () => {
|
|
|
141
142
|
expect(provider.getAddress()).toBe(MOCK_SMART_ADDRESS);
|
|
142
143
|
expect(provider.getNetwork()).toEqual(MOCK_NETWORK);
|
|
143
144
|
});
|
|
144
|
-
it("should throw error for non-Base networks", async () => {
|
|
145
|
-
await expect(cdpSmartWalletProvider_1.CdpSmartWalletProvider.configureWithWallet({
|
|
146
|
-
apiKeyId: "test-key-id",
|
|
147
|
-
apiKeySecret: "test-key-secret",
|
|
148
|
-
walletSecret: "test-wallet-secret",
|
|
149
|
-
networkId: "ethereum-sepolia",
|
|
150
|
-
})).rejects.toThrow("Smart wallets are only supported on Base networks");
|
|
151
|
-
});
|
|
152
145
|
it("should create smart account with name", async () => {
|
|
153
146
|
await cdpSmartWalletProvider_1.CdpSmartWalletProvider.configureWithWallet({
|
|
154
147
|
apiKeyId: "test-key-id",
|
|
@@ -188,8 +181,11 @@ describe("CdpSmartWalletProvider", () => {
|
|
|
188
181
|
// signing operation tests
|
|
189
182
|
// =========================================================
|
|
190
183
|
describe("signing operations", () => {
|
|
191
|
-
it("should
|
|
192
|
-
|
|
184
|
+
it("should sign a hash using owner account", async () => {
|
|
185
|
+
const testHash = "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef";
|
|
186
|
+
const signature = await provider.sign(testHash);
|
|
187
|
+
expect(mockOwnerAccount.sign).toHaveBeenCalledWith({ hash: testHash });
|
|
188
|
+
expect(signature).toBe(MOCK_SIGNATURE);
|
|
193
189
|
});
|
|
194
190
|
it("should sign typed data using smart account", async () => {
|
|
195
191
|
const typedData = {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { WalletProvider } from "./walletProvider";
|
|
2
|
-
import { TransactionRequest, ReadContractParameters, ReadContractReturnType, ContractFunctionName, Abi, ContractFunctionArgs,
|
|
2
|
+
import { TransactionRequest, ReadContractParameters, ReadContractReturnType, ContractFunctionName, Abi, ContractFunctionArgs, PublicClient, LocalAccount } from "viem";
|
|
3
3
|
/**
|
|
4
4
|
* EvmWalletProvider is the abstract base class for all EVM wallet providers.
|
|
5
5
|
*
|
|
@@ -11,7 +11,14 @@ export declare abstract class EvmWalletProvider extends WalletProvider {
|
|
|
11
11
|
*
|
|
12
12
|
* @returns The signer.
|
|
13
13
|
*/
|
|
14
|
-
toSigner():
|
|
14
|
+
toSigner(): LocalAccount;
|
|
15
|
+
/**
|
|
16
|
+
* Sign a raw hash.
|
|
17
|
+
*
|
|
18
|
+
* @param hash - The hash to sign.
|
|
19
|
+
* @returns The signed hash.
|
|
20
|
+
*/
|
|
21
|
+
abstract sign(hash: `0x${string}`): Promise<`0x${string}`>;
|
|
15
22
|
/**
|
|
16
23
|
* Sign a message.
|
|
17
24
|
*
|
|
@@ -18,7 +18,11 @@ class EvmWalletProvider extends walletProvider_1.WalletProvider {
|
|
|
18
18
|
*/
|
|
19
19
|
toSigner() {
|
|
20
20
|
return (0, accounts_1.toAccount)({
|
|
21
|
+
type: "local",
|
|
21
22
|
address: this.getAddress(),
|
|
23
|
+
sign: async ({ hash }) => {
|
|
24
|
+
return this.sign(hash);
|
|
25
|
+
},
|
|
22
26
|
signMessage: async ({ message }) => {
|
|
23
27
|
return this.signMessage(message);
|
|
24
28
|
},
|
|
@@ -47,6 +47,15 @@ export declare class LegacyCdpSmartWalletProvider extends EvmWalletProvider {
|
|
|
47
47
|
* ```
|
|
48
48
|
*/
|
|
49
49
|
static configureWithWallet(config: ConfigureLegacyCdpSmartWalletOptions): Promise<LegacyCdpSmartWalletProvider>;
|
|
50
|
+
/**
|
|
51
|
+
* Stub for hash signing
|
|
52
|
+
*
|
|
53
|
+
* @throws as signing hashes is not implemented for SmartWallets.
|
|
54
|
+
*
|
|
55
|
+
* @param _ - The hash to sign.
|
|
56
|
+
* @returns The signed hash.
|
|
57
|
+
*/
|
|
58
|
+
sign(_: `0x${string}`): Promise<Hex>;
|
|
50
59
|
/**
|
|
51
60
|
* Stub for message signing
|
|
52
61
|
*
|
|
@@ -111,6 +111,17 @@ class LegacyCdpSmartWalletProvider extends evmWalletProvider_1.EvmWalletProvider
|
|
|
111
111
|
});
|
|
112
112
|
return legacyCdpSmartWalletProvider;
|
|
113
113
|
}
|
|
114
|
+
/**
|
|
115
|
+
* Stub for hash signing
|
|
116
|
+
*
|
|
117
|
+
* @throws as signing hashes is not implemented for SmartWallets.
|
|
118
|
+
*
|
|
119
|
+
* @param _ - The hash to sign.
|
|
120
|
+
* @returns The signed hash.
|
|
121
|
+
*/
|
|
122
|
+
async sign(_) {
|
|
123
|
+
throw new Error("Not implemented");
|
|
124
|
+
}
|
|
114
125
|
/**
|
|
115
126
|
* Stub for message signing
|
|
116
127
|
*
|
|
@@ -89,6 +89,13 @@ export declare class LegacyCdpWalletProvider extends EvmWalletProvider {
|
|
|
89
89
|
* @throws Error if required environment variables are missing or wallet initialization fails
|
|
90
90
|
*/
|
|
91
91
|
static configureWithWallet(config?: ConfigureLegacyCdpAgentkitWithWalletOptions): Promise<LegacyCdpWalletProvider>;
|
|
92
|
+
/**
|
|
93
|
+
* Signs a raw hash.
|
|
94
|
+
*
|
|
95
|
+
* @param hash - The hash to sign.
|
|
96
|
+
* @returns The signed hash.
|
|
97
|
+
*/
|
|
98
|
+
sign(hash: `0x${string}`): Promise<`0x${string}`>;
|
|
92
99
|
/**
|
|
93
100
|
* Signs a message.
|
|
94
101
|
*
|
|
@@ -106,6 +106,22 @@ class LegacyCdpWalletProvider extends evmWalletProvider_1.EvmWalletProvider {
|
|
|
106
106
|
});
|
|
107
107
|
return cdpWalletProvider;
|
|
108
108
|
}
|
|
109
|
+
/**
|
|
110
|
+
* Signs a raw hash.
|
|
111
|
+
*
|
|
112
|
+
* @param hash - The hash to sign.
|
|
113
|
+
* @returns The signed hash.
|
|
114
|
+
*/
|
|
115
|
+
async sign(hash) {
|
|
116
|
+
if (!__classPrivateFieldGet(this, _LegacyCdpWalletProvider_cdpWallet, "f")) {
|
|
117
|
+
throw new Error("Wallet not initialized");
|
|
118
|
+
}
|
|
119
|
+
const payload = await __classPrivateFieldGet(this, _LegacyCdpWalletProvider_cdpWallet, "f").createPayloadSignature(hash);
|
|
120
|
+
if (payload.getStatus() === "pending" && payload?.wait) {
|
|
121
|
+
await payload.wait(); // needed for Server-Signers
|
|
122
|
+
}
|
|
123
|
+
return payload.getSignature();
|
|
124
|
+
}
|
|
109
125
|
/**
|
|
110
126
|
* Signs a message.
|
|
111
127
|
*
|
|
@@ -268,6 +268,12 @@ describe("LegacyCdpWalletProvider", () => {
|
|
|
268
268
|
// signing operation tests
|
|
269
269
|
// =========================================================
|
|
270
270
|
describe("signing operations", () => {
|
|
271
|
+
it("should sign a hash", async () => {
|
|
272
|
+
const testHash = "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef";
|
|
273
|
+
const signature = await provider.sign(testHash);
|
|
274
|
+
expect(mockWalletObj.createPayloadSignature).toHaveBeenCalledWith(testHash);
|
|
275
|
+
expect(signature).toBe(MOCK_SIGNATURE);
|
|
276
|
+
});
|
|
271
277
|
it("should sign messages", async () => {
|
|
272
278
|
const signature = await provider.signMessage("Hello, world!");
|
|
273
279
|
expect(mockWalletObj.createPayloadSignature).toHaveBeenCalled();
|
|
@@ -78,6 +78,13 @@ export declare class PrivyEvmDelegatedEmbeddedWalletProvider extends WalletProvi
|
|
|
78
78
|
* @returns The balance of the wallet in wei
|
|
79
79
|
*/
|
|
80
80
|
getBalance(): Promise<bigint>;
|
|
81
|
+
/**
|
|
82
|
+
* Signs a raw hash.
|
|
83
|
+
*
|
|
84
|
+
* @param hash - The hash to sign.
|
|
85
|
+
* @returns The signed hash.
|
|
86
|
+
*/
|
|
87
|
+
sign(hash: `0x${string}`): Promise<Hex>;
|
|
81
88
|
/**
|
|
82
89
|
* Signs a message.
|
|
83
90
|
*
|
|
@@ -170,6 +170,33 @@ class PrivyEvmDelegatedEmbeddedWalletProvider extends walletProvider_1.WalletPro
|
|
|
170
170
|
throw new Error("Error getting balance");
|
|
171
171
|
}
|
|
172
172
|
}
|
|
173
|
+
/**
|
|
174
|
+
* Signs a raw hash.
|
|
175
|
+
*
|
|
176
|
+
* @param hash - The hash to sign.
|
|
177
|
+
* @returns The signed hash.
|
|
178
|
+
*/
|
|
179
|
+
async sign(hash) {
|
|
180
|
+
const body = {
|
|
181
|
+
address: __classPrivateFieldGet(this, _PrivyEvmDelegatedEmbeddedWalletProvider_address, "f"),
|
|
182
|
+
chain_type: "ethereum",
|
|
183
|
+
method: "personal_sign",
|
|
184
|
+
params: {
|
|
185
|
+
message: hash,
|
|
186
|
+
encoding: "hex",
|
|
187
|
+
},
|
|
188
|
+
};
|
|
189
|
+
try {
|
|
190
|
+
const response = await this.executePrivyRequest(body);
|
|
191
|
+
return response.data?.signature;
|
|
192
|
+
}
|
|
193
|
+
catch (error) {
|
|
194
|
+
if (error instanceof Error) {
|
|
195
|
+
throw new Error(`Hash signing failed: ${error.message}`);
|
|
196
|
+
}
|
|
197
|
+
throw new Error("Hash signing failed");
|
|
198
|
+
}
|
|
199
|
+
}
|
|
173
200
|
/**
|
|
174
201
|
* Signs a message.
|
|
175
202
|
*
|
|
@@ -14,6 +14,10 @@ const MOCK_TRANSACTION_HASH = "0xef01";
|
|
|
14
14
|
const MOCK_SIGNATURE_HASH_1 = "0x1234";
|
|
15
15
|
const MOCK_SIGNATURE_HASH_2 = "0x5678";
|
|
16
16
|
const MOCK_SIGNATURE_HASH_3 = "0xabcd";
|
|
17
|
+
const MOCK_HASH_SIGNATURE = "0xhash";
|
|
18
|
+
jest.mock("../analytics", () => ({
|
|
19
|
+
sendAnalyticsEvent: jest.fn().mockImplementation(() => Promise.resolve()),
|
|
20
|
+
}));
|
|
17
21
|
jest.mock("@privy-io/server-auth", () => ({
|
|
18
22
|
PrivyClient: jest.fn().mockImplementation(() => ({
|
|
19
23
|
appId: "mock-app-id",
|
|
@@ -65,6 +69,7 @@ jest.mock("@privy-io/server-auth/viem", () => ({
|
|
|
65
69
|
createViemAccount: jest.fn().mockResolvedValue({
|
|
66
70
|
address: "0x742d35Cc6634C0532925a3b844Bc454e4438f44e",
|
|
67
71
|
type: "local",
|
|
72
|
+
sign: jest.fn().mockResolvedValue("0xhash"),
|
|
68
73
|
signMessage: jest.fn().mockResolvedValue("0x1234"),
|
|
69
74
|
signTypedData: jest.fn().mockResolvedValue("0x5678"),
|
|
70
75
|
signTransaction: jest.fn().mockResolvedValue("0xabcd"),
|
|
@@ -120,6 +125,7 @@ jest.mock("viem", () => {
|
|
|
120
125
|
createWalletClient: jest.fn().mockReturnValue({
|
|
121
126
|
account: {
|
|
122
127
|
address: "0x742d35Cc6634C0532925a3b844Bc454e4438f44e",
|
|
128
|
+
sign: jest.fn().mockResolvedValue("0xhash"),
|
|
123
129
|
},
|
|
124
130
|
chain: {
|
|
125
131
|
id: 1,
|
|
@@ -214,6 +220,11 @@ describe("PrivyEvmWalletProvider", () => {
|
|
|
214
220
|
it("should get the provider name", () => {
|
|
215
221
|
expect(provider.getName()).toBe("privy_evm_wallet_provider");
|
|
216
222
|
});
|
|
223
|
+
it("should sign a hash", async () => {
|
|
224
|
+
const testHash = "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef";
|
|
225
|
+
const result = await provider.sign(testHash);
|
|
226
|
+
expect(result).toBe(MOCK_HASH_SIGNATURE);
|
|
227
|
+
});
|
|
217
228
|
it("should sign a message", async () => {
|
|
218
229
|
const result = await provider.signMessage("Hello, world!");
|
|
219
230
|
expect(result).toBe(MOCK_SIGNATURE_HASH_1);
|
|
@@ -30,13 +30,20 @@ export declare class ViemWalletProvider extends EvmWalletProvider {
|
|
|
30
30
|
* @param gasConfig - Configuration for gas multipliers.
|
|
31
31
|
*/
|
|
32
32
|
constructor(walletClient: ViemWalletClient, gasConfig?: ViemWalletProviderGasConfig);
|
|
33
|
+
/**
|
|
34
|
+
* Signs a raw hash.
|
|
35
|
+
*
|
|
36
|
+
* @param hash - The hash to sign.
|
|
37
|
+
* @returns The signed hash.
|
|
38
|
+
*/
|
|
39
|
+
sign(hash: `0x${string}`): Promise<`0x${string}`>;
|
|
33
40
|
/**
|
|
34
41
|
* Signs a message.
|
|
35
42
|
*
|
|
36
43
|
* @param message - The message to sign.
|
|
37
44
|
* @returns The signed message.
|
|
38
45
|
*/
|
|
39
|
-
signMessage(message: string): Promise<`0x${string}`>;
|
|
46
|
+
signMessage(message: string | Uint8Array): Promise<`0x${string}`>;
|
|
40
47
|
/**
|
|
41
48
|
* Signs a typed data object.
|
|
42
49
|
*
|
|
@@ -44,6 +44,22 @@ class ViemWalletProvider extends evmWalletProvider_1.EvmWalletProvider {
|
|
|
44
44
|
__classPrivateFieldSet(this, _ViemWalletProvider_gasLimitMultiplier, Math.max(gasConfig?.gasLimitMultiplier ?? 1.2, 1), "f");
|
|
45
45
|
__classPrivateFieldSet(this, _ViemWalletProvider_feePerGasMultiplier, Math.max(gasConfig?.feePerGasMultiplier ?? 1, 1), "f");
|
|
46
46
|
}
|
|
47
|
+
/**
|
|
48
|
+
* Signs a raw hash.
|
|
49
|
+
*
|
|
50
|
+
* @param hash - The hash to sign.
|
|
51
|
+
* @returns The signed hash.
|
|
52
|
+
*/
|
|
53
|
+
async sign(hash) {
|
|
54
|
+
const account = __classPrivateFieldGet(this, _ViemWalletProvider_walletClient, "f").account;
|
|
55
|
+
if (!account) {
|
|
56
|
+
throw new Error("Account not found");
|
|
57
|
+
}
|
|
58
|
+
if (!account.sign) {
|
|
59
|
+
throw new Error("Account does not support raw hash signing");
|
|
60
|
+
}
|
|
61
|
+
return account.sign({ hash });
|
|
62
|
+
}
|
|
47
63
|
/**
|
|
48
64
|
* Signs a message.
|
|
49
65
|
*
|
|
@@ -55,7 +71,11 @@ class ViemWalletProvider extends evmWalletProvider_1.EvmWalletProvider {
|
|
|
55
71
|
if (!account) {
|
|
56
72
|
throw new Error("Account not found");
|
|
57
73
|
}
|
|
58
|
-
|
|
74
|
+
const _message = typeof message === "string" ? ((0, viem_1.isHex)(message) ? message : (0, viem_1.toHex)(message)) : message;
|
|
75
|
+
return __classPrivateFieldGet(this, _ViemWalletProvider_walletClient, "f").signMessage({
|
|
76
|
+
account,
|
|
77
|
+
message: { raw: _message },
|
|
78
|
+
});
|
|
59
79
|
}
|
|
60
80
|
/**
|
|
61
81
|
* Signs a typed data object.
|
|
@@ -104,6 +104,8 @@ jest.mock("viem", () => {
|
|
|
104
104
|
fromHex: jest.fn(),
|
|
105
105
|
formatEther: jest.fn(),
|
|
106
106
|
privateKeyToAccount: jest.fn(),
|
|
107
|
+
isHex: jest.fn(value => typeof value === "string" && value.startsWith("0x")),
|
|
108
|
+
toHex: jest.fn(value => `0x${value}`),
|
|
107
109
|
};
|
|
108
110
|
});
|
|
109
111
|
jest.mock("viem/accounts", () => {
|
|
@@ -119,6 +121,7 @@ describe("ViemWalletProvider", () => {
|
|
|
119
121
|
jest.clearAllMocks();
|
|
120
122
|
const mockAccount = {
|
|
121
123
|
address: MOCK_ADDRESS,
|
|
124
|
+
sign: jest.fn().mockResolvedValue(MOCK_SIGNATURE),
|
|
122
125
|
};
|
|
123
126
|
mockPublicClient = {
|
|
124
127
|
chain: MOCK_CHAIN,
|
|
@@ -209,11 +212,28 @@ describe("ViemWalletProvider", () => {
|
|
|
209
212
|
});
|
|
210
213
|
});
|
|
211
214
|
describe("signing operations", () => {
|
|
215
|
+
it("should sign a hash", async () => {
|
|
216
|
+
const testHash = "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef";
|
|
217
|
+
const signature = await provider.sign(testHash);
|
|
218
|
+
expect(mockWalletClient.account?.sign).toHaveBeenCalledWith({
|
|
219
|
+
hash: testHash,
|
|
220
|
+
});
|
|
221
|
+
expect(signature).toBe(MOCK_SIGNATURE);
|
|
222
|
+
});
|
|
212
223
|
it("should sign a message", async () => {
|
|
213
224
|
const signature = await provider.signMessage(MOCK_MESSAGE);
|
|
214
225
|
expect(mockWalletClient.signMessage).toHaveBeenCalledWith({
|
|
215
226
|
account: mockWalletClient.account,
|
|
216
|
-
message: MOCK_MESSAGE,
|
|
227
|
+
message: { raw: `0x${MOCK_MESSAGE}` },
|
|
228
|
+
});
|
|
229
|
+
expect(signature).toBe(MOCK_SIGNATURE);
|
|
230
|
+
});
|
|
231
|
+
it("should sign a hex message", async () => {
|
|
232
|
+
const hexMessage = "0x48656c6c6f2c20576f726c6421"; // "Hello, World!" in hex
|
|
233
|
+
const signature = await provider.signMessage(hexMessage);
|
|
234
|
+
expect(mockWalletClient.signMessage).toHaveBeenCalledWith({
|
|
235
|
+
account: mockWalletClient.account,
|
|
236
|
+
message: { raw: hexMessage },
|
|
217
237
|
});
|
|
218
238
|
expect(signature).toBe(MOCK_SIGNATURE);
|
|
219
239
|
});
|
|
@@ -53,6 +53,13 @@ export declare class ZeroDevWalletProvider extends EvmWalletProvider {
|
|
|
53
53
|
* @returns A Promise that resolves to a new ZeroDevWalletProvider instance.
|
|
54
54
|
*/
|
|
55
55
|
static configureWithWallet(config: ZeroDevWalletProviderConfig): Promise<ZeroDevWalletProvider>;
|
|
56
|
+
/**
|
|
57
|
+
* Signs a raw hash using the Kernel account.
|
|
58
|
+
*
|
|
59
|
+
* @param hash - The hash to sign.
|
|
60
|
+
* @returns The signed hash.
|
|
61
|
+
*/
|
|
62
|
+
sign(hash: `0x${string}`): Promise<Hex>;
|
|
56
63
|
/**
|
|
57
64
|
* Signs a message using the Kernel account.
|
|
58
65
|
*
|
|
@@ -105,6 +105,18 @@ class ZeroDevWalletProvider extends evmWalletProvider_1.EvmWalletProvider {
|
|
|
105
105
|
});
|
|
106
106
|
return new ZeroDevWalletProvider(config, kernelAccount, intentClient);
|
|
107
107
|
}
|
|
108
|
+
/**
|
|
109
|
+
* Signs a raw hash using the Kernel account.
|
|
110
|
+
*
|
|
111
|
+
* @param hash - The hash to sign.
|
|
112
|
+
* @returns The signed hash.
|
|
113
|
+
*/
|
|
114
|
+
async sign(hash) {
|
|
115
|
+
if (!__classPrivateFieldGet(this, _ZeroDevWalletProvider_kernelAccount, "f").sign) {
|
|
116
|
+
throw new Error("Kernel account does not support raw hash signing");
|
|
117
|
+
}
|
|
118
|
+
return __classPrivateFieldGet(this, _ZeroDevWalletProvider_kernelAccount, "f").sign({ hash });
|
|
119
|
+
}
|
|
108
120
|
/**
|
|
109
121
|
* Signs a message using the Kernel account.
|
|
110
122
|
*
|
|
@@ -65,6 +65,7 @@ jest.mock("../analytics", () => ({
|
|
|
65
65
|
// =========================================================
|
|
66
66
|
const mockKernelAccount = {
|
|
67
67
|
address: MOCK_ADDRESS,
|
|
68
|
+
sign: jest.fn(),
|
|
68
69
|
signMessage: jest.fn(),
|
|
69
70
|
signTypedData: jest.fn(),
|
|
70
71
|
};
|
|
@@ -101,6 +102,7 @@ describe("ZeroDevWalletProvider", () => {
|
|
|
101
102
|
transactionHash: MOCK_TRANSACTION_HASH,
|
|
102
103
|
});
|
|
103
104
|
mockPublicClient.getBalance.mockResolvedValue(BigInt(1000000000000000000));
|
|
105
|
+
mockKernelAccount.sign.mockResolvedValue(MOCK_SIGNATURE);
|
|
104
106
|
mockKernelAccount.signMessage.mockResolvedValue(MOCK_SIGNATURE);
|
|
105
107
|
mockKernelAccount.signTypedData.mockResolvedValue(MOCK_SIGNATURE);
|
|
106
108
|
// Mock Intent Client behavior
|
|
@@ -193,6 +195,14 @@ describe("ZeroDevWalletProvider", () => {
|
|
|
193
195
|
// Signing Operations Tests
|
|
194
196
|
// =========================================================
|
|
195
197
|
describe("signing operations", () => {
|
|
198
|
+
it("should sign a hash", async () => {
|
|
199
|
+
const testHash = "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef";
|
|
200
|
+
const signature = await provider.sign(testHash);
|
|
201
|
+
expect(mockKernelAccount.sign).toHaveBeenCalledWith({
|
|
202
|
+
hash: testHash,
|
|
203
|
+
});
|
|
204
|
+
expect(signature).toBe(MOCK_SIGNATURE);
|
|
205
|
+
});
|
|
196
206
|
it("should sign messages", async () => {
|
|
197
207
|
const message = "Hello, world!";
|
|
198
208
|
const signature = await provider.signMessage(message);
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@coinbase/agentkit",
|
|
3
3
|
"description": "Coinbase AgentKit core primitives",
|
|
4
4
|
"repository": "https://github.com/coinbase/agentkit",
|
|
5
|
-
"version": "0.10.
|
|
5
|
+
"version": "0.10.2",
|
|
6
6
|
"author": "Coinbase Inc.",
|
|
7
7
|
"license": "Apache-2.0",
|
|
8
8
|
"main": "dist/index.js",
|
|
@@ -24,8 +24,10 @@
|
|
|
24
24
|
"dependencies": {
|
|
25
25
|
"@across-protocol/app-sdk": "^0.2.0",
|
|
26
26
|
"@alloralabs/allora-sdk": "^0.1.0",
|
|
27
|
-
"@
|
|
27
|
+
"@base-org/account": "^2.2.0",
|
|
28
|
+
"@coinbase/cdp-sdk": "^1.38.0",
|
|
28
29
|
"@coinbase/coinbase-sdk": "^0.20.0",
|
|
30
|
+
"@coinbase/x402": "^0.6.3",
|
|
29
31
|
"@jup-ag/api": "^6.0.39",
|
|
30
32
|
"@privy-io/public-api": "2.18.5",
|
|
31
33
|
"@privy-io/server-auth": "1.18.4",
|
|
@@ -47,8 +49,8 @@
|
|
|
47
49
|
"reflect-metadata": "^0.2.2",
|
|
48
50
|
"twitter-api-v2": "^1.18.2",
|
|
49
51
|
"viem": "^2.22.16",
|
|
50
|
-
"x402": "^0.
|
|
51
|
-
"x402-axios": "^0.
|
|
52
|
+
"x402": "^0.6.0",
|
|
53
|
+
"x402-axios": "^0.6.0",
|
|
52
54
|
"zod": "^3.23.8"
|
|
53
55
|
},
|
|
54
56
|
"devDependencies": {
|