@coinbase/agentkit 0.10.0 → 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 +195 -23
- package/dist/action-providers/across/acrossActionProvider.js +3 -3
- 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/cdpApiActionProvider.d.ts +3 -12
- package/dist/action-providers/cdp/cdpApiActionProvider.js +2 -81
- package/dist/action-providers/cdp/cdpApiActionProvider.test.js +0 -125
- package/dist/action-providers/cdp/cdpEvmWalletActionProvider.d.ts +18 -3
- package/dist/action-providers/cdp/cdpEvmWalletActionProvider.js +224 -23
- package/dist/action-providers/cdp/cdpEvmWalletActionProvider.test.js +280 -0
- package/dist/action-providers/cdp/cdpSmartWalletActionProvider.d.ts +17 -2
- package/dist/action-providers/cdp/cdpSmartWalletActionProvider.js +224 -18
- package/dist/action-providers/cdp/cdpSmartWalletActionProvider.test.js +267 -1
- package/dist/action-providers/cdp/schemas.d.ts +12 -12
- package/dist/action-providers/cdp/schemas.js +17 -5
- package/dist/action-providers/cdp/swapUtils.d.ts +23 -0
- package/dist/action-providers/cdp/swapUtils.js +106 -0
- package/dist/action-providers/clanker/clankerActionProvider.d.ts +43 -0
- package/dist/action-providers/clanker/clankerActionProvider.js +130 -0
- package/dist/action-providers/clanker/clankerActionProvider.test.d.ts +4 -0
- package/dist/action-providers/clanker/clankerActionProvider.test.js +119 -0
- package/dist/action-providers/clanker/index.d.ts +2 -0
- package/dist/action-providers/clanker/index.js +18 -0
- package/dist/action-providers/clanker/schemas.d.ts +56 -0
- package/dist/action-providers/clanker/schemas.js +47 -0
- package/dist/action-providers/clanker/utils.d.ts +9 -0
- package/dist/action-providers/clanker/utils.js +23 -0
- package/dist/action-providers/compound/constants.d.ts +1 -1
- package/dist/action-providers/compound/constants.js +2 -2
- package/dist/action-providers/erc20/constants.d.ts +35 -135
- package/dist/action-providers/erc20/constants.js +37 -189
- package/dist/action-providers/erc20/erc20ActionProvider.d.ts +9 -1
- package/dist/action-providers/erc20/erc20ActionProvider.js +87 -35
- package/dist/action-providers/erc20/erc20ActionProvider.test.js +115 -52
- package/dist/action-providers/erc20/schemas.d.ts +25 -12
- package/dist/action-providers/erc20/schemas.js +34 -6
- package/dist/action-providers/erc20/utils.d.ts +19 -0
- package/dist/action-providers/erc20/utils.js +54 -0
- 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 +42 -21
- package/dist/action-providers/flaunch/constants.js +113 -38
- package/dist/action-providers/flaunch/flaunchActionProvider.d.ts +4 -43
- package/dist/action-providers/flaunch/flaunchActionProvider.js +133 -209
- package/dist/action-providers/flaunch/flaunchActionProvider.test.js +113 -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 +4 -0
- package/dist/action-providers/index.js +4 -0
- package/dist/action-providers/jupiter/schemas.d.ts +1 -1
- package/dist/action-providers/moonwell/schemas.d.ts +2 -2
- package/dist/action-providers/morpho/morphoActionProvider.js +5 -5
- package/dist/action-providers/morpho/schemas.d.ts +2 -2
- package/dist/action-providers/pyth/pythActionProvider.d.ts +2 -2
- package/dist/action-providers/pyth/pythActionProvider.js +83 -26
- package/dist/action-providers/pyth/pythActionProvider.test.js +179 -23
- package/dist/action-providers/pyth/schemas.d.ts +6 -0
- package/dist/action-providers/pyth/schemas.js +9 -1
- package/dist/action-providers/superfluid/constants.d.ts +814 -0
- package/dist/action-providers/superfluid/constants.js +2826 -0
- package/dist/action-providers/superfluid/graphQueries/endpoints.d.ts +2 -0
- package/dist/action-providers/superfluid/graphQueries/endpoints.js +5 -0
- package/dist/action-providers/superfluid/graphQueries/queries.d.ts +1 -0
- package/dist/action-providers/superfluid/graphQueries/queries.js +35 -0
- package/dist/action-providers/superfluid/graphQueries/superfluidGraphQueries.d.ts +8 -0
- package/dist/action-providers/superfluid/graphQueries/superfluidGraphQueries.js +24 -0
- package/dist/action-providers/superfluid/graphQueries/types.d.ts +27 -0
- package/dist/action-providers/superfluid/graphQueries/types.js +2 -0
- package/dist/action-providers/superfluid/index.d.ts +7 -0
- package/dist/action-providers/superfluid/index.js +23 -0
- package/dist/action-providers/superfluid/schemas.d.ts +86 -0
- package/dist/action-providers/superfluid/schemas.js +103 -0
- package/dist/action-providers/superfluid/superfluidActionProvider.d.ts +20 -0
- package/dist/action-providers/superfluid/superfluidActionProvider.js +36 -0
- package/dist/action-providers/superfluid/superfluidPoolActionProvider.d.ts +46 -0
- package/dist/action-providers/superfluid/superfluidPoolActionProvider.js +143 -0
- package/dist/action-providers/superfluid/superfluidPoolActionProvider.test.d.ts +1 -0
- package/dist/action-providers/superfluid/superfluidPoolActionProvider.test.js +92 -0
- package/dist/action-providers/superfluid/superfluidQueryActionProvider.d.ts +27 -0
- package/dist/action-providers/superfluid/superfluidQueryActionProvider.js +71 -0
- package/dist/action-providers/superfluid/superfluidQueryActionProvider.test.d.ts +1 -0
- package/dist/action-providers/superfluid/superfluidQueryActionProvider.test.js +57 -0
- package/dist/action-providers/superfluid/superfluidStreamActionProvider.d.ts +56 -0
- package/dist/action-providers/superfluid/superfluidStreamActionProvider.js +191 -0
- package/dist/action-providers/superfluid/superfluidStreamActionProvider.test.d.ts +1 -0
- package/dist/action-providers/superfluid/superfluidStreamActionProvider.test.js +80 -0
- package/dist/action-providers/superfluid/superfluidSuperTokenCreatorActionProvider.d.ts +30 -0
- package/dist/action-providers/superfluid/superfluidSuperTokenCreatorActionProvider.js +109 -0
- package/dist/action-providers/superfluid/superfluidSuperTokenCreatorActionProvider.test.d.ts +1 -0
- package/dist/action-providers/superfluid/superfluidSuperTokenCreatorActionProvider.test.js +75 -0
- package/dist/action-providers/superfluid/superfluidWrapperActionProvider.d.ts +32 -0
- package/dist/action-providers/superfluid/superfluidWrapperActionProvider.js +101 -0
- package/dist/action-providers/superfluid/superfluidWrapperActionProvider.test.d.ts +1 -0
- package/dist/action-providers/superfluid/superfluidWrapperActionProvider.test.js +85 -0
- package/dist/action-providers/superfluid/utils/parseLogs.d.ts +19 -0
- package/dist/action-providers/superfluid/utils/parseLogs.js +81 -0
- package/dist/action-providers/truemarkets/truemarketsActionProvider.d.ts +4 -16
- package/dist/action-providers/truemarkets/truemarketsActionProvider.js +20 -41
- package/dist/action-providers/truemarkets/truemarketsActionProvider.test.js +11 -33
- package/dist/action-providers/wallet/walletActionProvider.js +24 -10
- package/dist/action-providers/wallet/walletActionProvider.test.js +6 -2
- 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/action-providers/zeroX/index.d.ts +1 -0
- package/dist/action-providers/zeroX/index.js +17 -0
- package/dist/action-providers/zeroX/schemas.d.ts +51 -0
- package/dist/action-providers/zeroX/schemas.js +82 -0
- package/dist/action-providers/zeroX/utils.d.ts +23 -0
- package/dist/action-providers/zeroX/utils.js +106 -0
- package/dist/action-providers/zeroX/zeroXActionProvider.d.ts +57 -0
- package/dist/action-providers/zeroX/zeroXActionProvider.js +407 -0
- package/dist/action-providers/zeroX/zeroXActionProvider.test.d.ts +1 -0
- package/dist/action-providers/zeroX/zeroXActionProvider.test.js +445 -0
- package/dist/utils.d.ts +10 -0
- package/dist/utils.js +43 -13
- package/dist/wallet-providers/cdpEvmWalletProvider.d.ts +27 -2
- package/dist/wallet-providers/cdpEvmWalletProvider.js +54 -36
- package/dist/wallet-providers/cdpEvmWalletProvider.test.js +7 -0
- package/dist/wallet-providers/cdpShared.d.ts +5 -0
- package/dist/wallet-providers/cdpSmartWalletProvider.d.ts +29 -3
- package/dist/wallet-providers/cdpSmartWalletProvider.js +66 -25
- package/dist/wallet-providers/cdpSmartWalletProvider.test.js +6 -10
- package/dist/wallet-providers/cdpSolanaWalletProvider.d.ts +1 -1
- package/dist/wallet-providers/cdpSolanaWalletProvider.js +7 -7
- package/dist/wallet-providers/cdpSolanaWalletProvider.test.js +15 -12
- package/dist/wallet-providers/evmWalletProvider.d.ts +13 -2
- package/dist/wallet-providers/evmWalletProvider.js +4 -0
- package/dist/wallet-providers/legacyCdpSmartWalletProvider.d.ts +18 -2
- package/dist/wallet-providers/legacyCdpSmartWalletProvider.js +23 -2
- package/dist/wallet-providers/legacyCdpWalletProvider.d.ts +19 -2
- package/dist/wallet-providers/legacyCdpWalletProvider.js +27 -2
- package/dist/wallet-providers/legacyCdpWalletProvider.test.js +6 -0
- package/dist/wallet-providers/privyEvmDelegatedEmbeddedWalletProvider.d.ts +17 -2
- package/dist/wallet-providers/privyEvmDelegatedEmbeddedWalletProvider.js +39 -3
- package/dist/wallet-providers/privyEvmDelegatedEmbeddedWalletProvider.test.js +1 -1
- package/dist/wallet-providers/privyEvmWalletProvider.d.ts +2 -0
- package/dist/wallet-providers/privyEvmWalletProvider.js +2 -1
- package/dist/wallet-providers/privyEvmWalletProvider.test.js +12 -1
- package/dist/wallet-providers/solanaKeypairWalletProvider.d.ts +1 -1
- package/dist/wallet-providers/solanaKeypairWalletProvider.js +3 -4
- package/dist/wallet-providers/solanaKeypairWalletProvider.test.js +4 -2
- package/dist/wallet-providers/viemWalletProvider.d.ts +20 -3
- package/dist/wallet-providers/viemWalletProvider.js +33 -4
- package/dist/wallet-providers/viemWalletProvider.test.js +27 -6
- package/dist/wallet-providers/walletProvider.d.ts +1 -1
- package/dist/wallet-providers/zeroDevWalletProvider.d.ts +17 -2
- package/dist/wallet-providers/zeroDevWalletProvider.js +26 -5
- package/dist/wallet-providers/zeroDevWalletProvider.test.js +12 -2
- package/package.json +8 -4
|
@@ -10,7 +10,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
|
|
|
10
10
|
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
11
11
|
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
12
12
|
};
|
|
13
|
-
var
|
|
13
|
+
var _CdpEvmWalletProvider_publicClient, _CdpEvmWalletProvider_serverAccount, _CdpEvmWalletProvider_cdp, _CdpEvmWalletProvider_network;
|
|
14
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
15
|
exports.CdpEvmWalletProvider = void 0;
|
|
16
16
|
const cdp_sdk_1 = require("@coinbase/cdp-sdk");
|
|
@@ -28,7 +28,6 @@ class CdpEvmWalletProvider extends evmWalletProvider_1.EvmWalletProvider {
|
|
|
28
28
|
*/
|
|
29
29
|
constructor(config) {
|
|
30
30
|
super();
|
|
31
|
-
_CdpEvmWalletProvider_instances.add(this);
|
|
32
31
|
_CdpEvmWalletProvider_publicClient.set(this, void 0);
|
|
33
32
|
_CdpEvmWalletProvider_serverAccount.set(this, void 0);
|
|
34
33
|
_CdpEvmWalletProvider_cdp.set(this, void 0);
|
|
@@ -67,9 +66,10 @@ class CdpEvmWalletProvider extends evmWalletProvider_1.EvmWalletProvider {
|
|
|
67
66
|
const serverAccount = await (config.address
|
|
68
67
|
? cdpClient.evm.getAccount({ address: config.address })
|
|
69
68
|
: cdpClient.evm.createAccount({ idempotencyKey }));
|
|
69
|
+
const rpcUrl = config.rpcUrl || process.env.RPC_URL;
|
|
70
70
|
const publicClient = (0, viem_1.createPublicClient)({
|
|
71
71
|
chain: network_1.NETWORK_ID_TO_VIEM_CHAIN[networkId],
|
|
72
|
-
transport: (0, viem_1.http)(),
|
|
72
|
+
transport: rpcUrl ? (0, viem_1.http)(rpcUrl) : (0, viem_1.http)(),
|
|
73
73
|
});
|
|
74
74
|
return new CdpEvmWalletProvider({
|
|
75
75
|
publicClient,
|
|
@@ -89,6 +89,15 @@ class CdpEvmWalletProvider extends evmWalletProvider_1.EvmWalletProvider {
|
|
|
89
89
|
address: __classPrivateFieldGet(this, _CdpEvmWalletProvider_serverAccount, "f").address,
|
|
90
90
|
};
|
|
91
91
|
}
|
|
92
|
+
/**
|
|
93
|
+
* Signs a raw hash.
|
|
94
|
+
*
|
|
95
|
+
* @param hash - The hash to sign.
|
|
96
|
+
* @returns The signed hash.
|
|
97
|
+
*/
|
|
98
|
+
async sign(hash) {
|
|
99
|
+
return __classPrivateFieldGet(this, _CdpEvmWalletProvider_serverAccount, "f").sign({ hash });
|
|
100
|
+
}
|
|
92
101
|
/**
|
|
93
102
|
* Signs a message.
|
|
94
103
|
*
|
|
@@ -129,30 +138,14 @@ class CdpEvmWalletProvider extends evmWalletProvider_1.EvmWalletProvider {
|
|
|
129
138
|
* @returns The hash of the transaction.
|
|
130
139
|
*/
|
|
131
140
|
async sendTransaction(transaction) {
|
|
132
|
-
const txWithGasParams = {
|
|
133
|
-
...transaction,
|
|
134
|
-
chainId: __classPrivateFieldGet(this, _CdpEvmWalletProvider_network, "f").chainId,
|
|
135
|
-
};
|
|
136
|
-
if (!txWithGasParams.maxFeePerGas && !txWithGasParams.gasPrice) {
|
|
137
|
-
const feeData = await __classPrivateFieldGet(this, _CdpEvmWalletProvider_publicClient, "f").estimateFeesPerGas();
|
|
138
|
-
txWithGasParams.maxFeePerGas = feeData.maxFeePerGas;
|
|
139
|
-
txWithGasParams.maxPriorityFeePerGas = feeData.maxPriorityFeePerGas;
|
|
140
|
-
}
|
|
141
|
-
if (!txWithGasParams.gas) {
|
|
142
|
-
try {
|
|
143
|
-
txWithGasParams.gas = await __classPrivateFieldGet(this, _CdpEvmWalletProvider_publicClient, "f").estimateGas({
|
|
144
|
-
account: __classPrivateFieldGet(this, _CdpEvmWalletProvider_serverAccount, "f").address,
|
|
145
|
-
...txWithGasParams,
|
|
146
|
-
});
|
|
147
|
-
}
|
|
148
|
-
catch (error) {
|
|
149
|
-
console.warn("Failed to estimate gas, continuing without gas estimation", error);
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
141
|
const result = await __classPrivateFieldGet(this, _CdpEvmWalletProvider_cdp, "f").evm.sendTransaction({
|
|
153
142
|
address: __classPrivateFieldGet(this, _CdpEvmWalletProvider_serverAccount, "f").address,
|
|
154
|
-
transaction:
|
|
155
|
-
|
|
143
|
+
transaction: {
|
|
144
|
+
to: transaction.to,
|
|
145
|
+
value: transaction.value ? BigInt(transaction.value.toString()) : 0n,
|
|
146
|
+
data: transaction.data || "0x",
|
|
147
|
+
},
|
|
148
|
+
network: this.getCdpSdkNetwork(),
|
|
156
149
|
});
|
|
157
150
|
return result.transactionHash;
|
|
158
151
|
}
|
|
@@ -188,6 +181,14 @@ class CdpEvmWalletProvider extends evmWalletProvider_1.EvmWalletProvider {
|
|
|
188
181
|
getClient() {
|
|
189
182
|
return __classPrivateFieldGet(this, _CdpEvmWalletProvider_cdp, "f");
|
|
190
183
|
}
|
|
184
|
+
/**
|
|
185
|
+
* Gets the Viem PublicClient used for read-only operations.
|
|
186
|
+
*
|
|
187
|
+
* @returns The Viem PublicClient instance used for read-only operations.
|
|
188
|
+
*/
|
|
189
|
+
getPublicClient() {
|
|
190
|
+
return __classPrivateFieldGet(this, _CdpEvmWalletProvider_publicClient, "f");
|
|
191
|
+
}
|
|
191
192
|
/**
|
|
192
193
|
* Gets the balance of the wallet.
|
|
193
194
|
*
|
|
@@ -219,7 +220,7 @@ class CdpEvmWalletProvider extends evmWalletProvider_1.EvmWalletProvider {
|
|
|
219
220
|
* Transfer the native asset of the network.
|
|
220
221
|
*
|
|
221
222
|
* @param to - The destination address.
|
|
222
|
-
* @param value - The amount to transfer in Wei.
|
|
223
|
+
* @param value - The amount to transfer in atomic units (Wei).
|
|
223
224
|
* @returns The transaction hash.
|
|
224
225
|
*/
|
|
225
226
|
async nativeTransfer(to, value) {
|
|
@@ -229,15 +230,32 @@ class CdpEvmWalletProvider extends evmWalletProvider_1.EvmWalletProvider {
|
|
|
229
230
|
data: "0x",
|
|
230
231
|
});
|
|
231
232
|
}
|
|
233
|
+
/**
|
|
234
|
+
* Converts the internal network ID to the format expected by the CDP SDK.
|
|
235
|
+
*
|
|
236
|
+
* @returns The network ID in CDP SDK format
|
|
237
|
+
* @throws Error if the network is not supported
|
|
238
|
+
*/
|
|
239
|
+
getCdpSdkNetwork() {
|
|
240
|
+
switch (__classPrivateFieldGet(this, _CdpEvmWalletProvider_network, "f").networkId) {
|
|
241
|
+
case "base-sepolia":
|
|
242
|
+
return "base-sepolia";
|
|
243
|
+
case "base-mainnet":
|
|
244
|
+
return "base";
|
|
245
|
+
case "ethereum-mainnet":
|
|
246
|
+
return "ethereum";
|
|
247
|
+
case "ethereum-sepolia":
|
|
248
|
+
return "ethereum-sepolia";
|
|
249
|
+
case "polygon-mainnet":
|
|
250
|
+
return "polygon";
|
|
251
|
+
case "arbitrum-mainnet":
|
|
252
|
+
return "arbitrum";
|
|
253
|
+
case "optimism-mainnet":
|
|
254
|
+
return "optimism";
|
|
255
|
+
default:
|
|
256
|
+
throw new Error(`Unsupported network for CDP SDK: ${__classPrivateFieldGet(this, _CdpEvmWalletProvider_network, "f").networkId}`);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
232
259
|
}
|
|
233
260
|
exports.CdpEvmWalletProvider = CdpEvmWalletProvider;
|
|
234
|
-
_CdpEvmWalletProvider_publicClient = new WeakMap(), _CdpEvmWalletProvider_serverAccount = new WeakMap(), _CdpEvmWalletProvider_cdp = new WeakMap(), _CdpEvmWalletProvider_network = new WeakMap()
|
|
235
|
-
switch (__classPrivateFieldGet(this, _CdpEvmWalletProvider_network, "f").networkId) {
|
|
236
|
-
case "base-sepolia":
|
|
237
|
-
return "base-sepolia";
|
|
238
|
-
case "base-mainnet":
|
|
239
|
-
return "base";
|
|
240
|
-
default:
|
|
241
|
-
throw new Error(`Unsupported network: ${__classPrivateFieldGet(this, _CdpEvmWalletProvider_network, "f").networkId}`);
|
|
242
|
-
}
|
|
243
|
-
};
|
|
261
|
+
_CdpEvmWalletProvider_publicClient = new WeakMap(), _CdpEvmWalletProvider_serverAccount = new WeakMap(), _CdpEvmWalletProvider_cdp = new WeakMap(), _CdpEvmWalletProvider_network = new WeakMap();
|
|
@@ -114,6 +114,7 @@ describe("CdpEvmWalletProvider", () => {
|
|
|
114
114
|
});
|
|
115
115
|
mockServerAccount = {
|
|
116
116
|
address: MOCK_ADDRESS,
|
|
117
|
+
sign: jest.fn().mockResolvedValue(MOCK_SIGNATURE),
|
|
117
118
|
signMessage: jest.fn().mockResolvedValue(MOCK_SIGNATURE),
|
|
118
119
|
signTypedData: jest.fn().mockResolvedValue(MOCK_SIGNATURE),
|
|
119
120
|
};
|
|
@@ -214,6 +215,12 @@ describe("CdpEvmWalletProvider", () => {
|
|
|
214
215
|
// signing operation tests
|
|
215
216
|
// =========================================================
|
|
216
217
|
describe("signing operations", () => {
|
|
218
|
+
it("should sign a hash", async () => {
|
|
219
|
+
const testHash = "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef";
|
|
220
|
+
const signature = await provider.sign(testHash);
|
|
221
|
+
expect(mockServerAccount.sign).toHaveBeenCalledWith({ hash: testHash });
|
|
222
|
+
expect(signature).toBe(MOCK_SIGNATURE);
|
|
223
|
+
});
|
|
217
224
|
it("should sign messages", async () => {
|
|
218
225
|
const signature = await provider.signMessage("Hello, world!");
|
|
219
226
|
expect(mockServerAccount.signMessage).toHaveBeenCalledWith({ message: "Hello, world!" });
|
|
@@ -30,6 +30,11 @@ export interface CdpWalletProviderConfig extends CdpProviderConfig {
|
|
|
30
30
|
* The idempotency key of the wallet. Only used when creating a new account.
|
|
31
31
|
*/
|
|
32
32
|
idempotencyKey?: string;
|
|
33
|
+
/**
|
|
34
|
+
* Optional RPC URL for Viem public client HTTP transport.
|
|
35
|
+
* Falls back to process.env.RPC_URL when not provided.
|
|
36
|
+
*/
|
|
37
|
+
rpcUrl?: string;
|
|
33
38
|
}
|
|
34
39
|
export interface CdpSmartWalletProviderConfig extends CdpWalletProviderConfig {
|
|
35
40
|
/**
|
|
@@ -1,14 +1,19 @@
|
|
|
1
|
-
import { CdpClient, EvmSmartAccount } from "@coinbase/cdp-sdk";
|
|
2
|
-
import { Abi, Address, ContractFunctionArgs, ContractFunctionName, Hex, ReadContractParameters, ReadContractReturnType, TransactionRequest } from "viem";
|
|
1
|
+
import { CdpClient, EvmSmartAccount, EvmServerAccount } from "@coinbase/cdp-sdk";
|
|
2
|
+
import { Abi, Address, ContractFunctionArgs, ContractFunctionName, Hex, PublicClient, ReadContractParameters, ReadContractReturnType, TransactionRequest, LocalAccount } from "viem";
|
|
3
3
|
import { Network } from "../network";
|
|
4
4
|
import { EvmWalletProvider } from "./evmWalletProvider";
|
|
5
5
|
import { WalletProviderWithClient, CdpSmartWalletProviderConfig } from "./cdpShared";
|
|
6
|
+
/**
|
|
7
|
+
* Supported network types for CDP SDK smart wallet operations
|
|
8
|
+
*/
|
|
9
|
+
type CdpSmartWalletNetwork = "base" | "base-sepolia" | "ethereum" | "ethereum-sepolia" | "polygon" | "arbitrum" | "optimism";
|
|
6
10
|
/**
|
|
7
11
|
* A wallet provider that uses the Coinbase CDP SDK smart wallets.
|
|
8
12
|
*/
|
|
9
13
|
export declare class CdpSmartWalletProvider extends EvmWalletProvider implements WalletProviderWithClient {
|
|
10
14
|
#private;
|
|
11
15
|
smartAccount: EvmSmartAccount;
|
|
16
|
+
ownerAccount: LocalAccount | EvmServerAccount;
|
|
12
17
|
/**
|
|
13
18
|
* Constructs a new CdpSmartWalletProvider.
|
|
14
19
|
*
|
|
@@ -33,6 +38,13 @@ export declare class CdpSmartWalletProvider extends EvmWalletProvider implements
|
|
|
33
38
|
address: Address;
|
|
34
39
|
ownerAddress: Address;
|
|
35
40
|
}>;
|
|
41
|
+
/**
|
|
42
|
+
* Signs a raw hash using the owner account.
|
|
43
|
+
*
|
|
44
|
+
* @param _hash - The hash to sign.
|
|
45
|
+
* @returns The signed hash.
|
|
46
|
+
*/
|
|
47
|
+
sign(_hash: Hex): Promise<Hex>;
|
|
36
48
|
/**
|
|
37
49
|
* Signs a message using the owner account.
|
|
38
50
|
*
|
|
@@ -91,6 +103,12 @@ export declare class CdpSmartWalletProvider extends EvmWalletProvider implements
|
|
|
91
103
|
* @returns The paymaster URL if configured, undefined otherwise.
|
|
92
104
|
*/
|
|
93
105
|
getPaymasterUrl(): string | undefined;
|
|
106
|
+
/**
|
|
107
|
+
* Gets the Viem PublicClient used for read-only operations.
|
|
108
|
+
*
|
|
109
|
+
* @returns The Viem PublicClient instance used for read-only operations.
|
|
110
|
+
*/
|
|
111
|
+
getPublicClient(): PublicClient;
|
|
94
112
|
/**
|
|
95
113
|
* Gets the balance of the smart wallet.
|
|
96
114
|
*
|
|
@@ -115,8 +133,16 @@ export declare class CdpSmartWalletProvider extends EvmWalletProvider implements
|
|
|
115
133
|
* Transfer the native asset of the network using smart wallet.
|
|
116
134
|
*
|
|
117
135
|
* @param to - The destination address.
|
|
118
|
-
* @param value - The amount to transfer in Wei.
|
|
136
|
+
* @param value - The amount to transfer in atomic units (Wei).
|
|
119
137
|
* @returns The user operation hash.
|
|
120
138
|
*/
|
|
121
139
|
nativeTransfer(to: Address, value: string): Promise<Hex>;
|
|
140
|
+
/**
|
|
141
|
+
* Converts the internal network ID to the format expected by the CDP SDK.
|
|
142
|
+
*
|
|
143
|
+
* @returns The network ID in CDP SDK format
|
|
144
|
+
* @throws Error if the network is not supported
|
|
145
|
+
*/
|
|
146
|
+
getCdpSdkNetwork(): CdpSmartWalletNetwork;
|
|
122
147
|
}
|
|
148
|
+
export {};
|
|
@@ -10,7 +10,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
|
|
|
10
10
|
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
11
11
|
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
12
12
|
};
|
|
13
|
-
var
|
|
13
|
+
var _CdpSmartWalletProvider_publicClient, _CdpSmartWalletProvider_cdp, _CdpSmartWalletProvider_network, _CdpSmartWalletProvider_paymasterUrl;
|
|
14
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
15
|
exports.CdpSmartWalletProvider = void 0;
|
|
16
16
|
const cdp_sdk_1 = require("@coinbase/cdp-sdk");
|
|
@@ -28,14 +28,12 @@ class CdpSmartWalletProvider extends evmWalletProvider_1.EvmWalletProvider {
|
|
|
28
28
|
*/
|
|
29
29
|
constructor(config) {
|
|
30
30
|
super();
|
|
31
|
-
_CdpSmartWalletProvider_instances.add(this);
|
|
32
31
|
_CdpSmartWalletProvider_publicClient.set(this, void 0);
|
|
33
|
-
_CdpSmartWalletProvider_ownerAccount.set(this, void 0);
|
|
34
32
|
_CdpSmartWalletProvider_cdp.set(this, void 0);
|
|
35
33
|
_CdpSmartWalletProvider_network.set(this, void 0);
|
|
36
34
|
_CdpSmartWalletProvider_paymasterUrl.set(this, void 0);
|
|
37
35
|
this.smartAccount = config.smartAccount;
|
|
38
|
-
|
|
36
|
+
this.ownerAccount = config.ownerAccount;
|
|
39
37
|
__classPrivateFieldSet(this, _CdpSmartWalletProvider_cdp, config.cdp, "f");
|
|
40
38
|
__classPrivateFieldSet(this, _CdpSmartWalletProvider_publicClient, config.publicClient, "f");
|
|
41
39
|
__classPrivateFieldSet(this, _CdpSmartWalletProvider_network, config.network, "f");
|
|
@@ -58,10 +56,6 @@ class CdpSmartWalletProvider extends evmWalletProvider_1.EvmWalletProvider {
|
|
|
58
56
|
throw new Error("Missing required environment variables. CDP_API_KEY_ID, CDP_API_KEY_SECRET, CDP_WALLET_SECRET are required.");
|
|
59
57
|
}
|
|
60
58
|
const networkId = config.networkId || process.env.NETWORK_ID || "base-sepolia";
|
|
61
|
-
// Smart wallets are currently only supported on Base networks
|
|
62
|
-
if (!networkId.startsWith("base-")) {
|
|
63
|
-
throw new Error(`Smart wallets are only supported on Base networks. Got: ${networkId}`);
|
|
64
|
-
}
|
|
65
59
|
const network = {
|
|
66
60
|
protocolFamily: "evm",
|
|
67
61
|
chainId: network_1.NETWORK_ID_TO_CHAIN_ID[networkId],
|
|
@@ -92,9 +86,10 @@ class CdpSmartWalletProvider extends evmWalletProvider_1.EvmWalletProvider {
|
|
|
92
86
|
: cdpClient.evm.createSmartAccount({
|
|
93
87
|
owner: ownerAccount,
|
|
94
88
|
}));
|
|
89
|
+
const rpcUrl = config.rpcUrl || process.env.RPC_URL;
|
|
95
90
|
const publicClient = (0, viem_1.createPublicClient)({
|
|
96
91
|
chain: network_1.NETWORK_ID_TO_VIEM_CHAIN[networkId],
|
|
97
|
-
transport: (0, viem_1.http)(),
|
|
92
|
+
transport: rpcUrl ? (0, viem_1.http)(rpcUrl) : (0, viem_1.http)(),
|
|
98
93
|
});
|
|
99
94
|
return new CdpSmartWalletProvider({
|
|
100
95
|
publicClient,
|
|
@@ -114,9 +109,21 @@ class CdpSmartWalletProvider extends evmWalletProvider_1.EvmWalletProvider {
|
|
|
114
109
|
return {
|
|
115
110
|
name: this.smartAccount.name,
|
|
116
111
|
address: this.smartAccount.address,
|
|
117
|
-
ownerAddress:
|
|
112
|
+
ownerAddress: this.ownerAccount.address,
|
|
118
113
|
};
|
|
119
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
|
+
}
|
|
120
127
|
/**
|
|
121
128
|
* Signs a message using the owner account.
|
|
122
129
|
*
|
|
@@ -124,7 +131,7 @@ class CdpSmartWalletProvider extends evmWalletProvider_1.EvmWalletProvider {
|
|
|
124
131
|
* @returns The signed message.
|
|
125
132
|
*/
|
|
126
133
|
async signMessage(_message) {
|
|
127
|
-
|
|
134
|
+
return this.ownerAccount.signMessage({ message: _message });
|
|
128
135
|
}
|
|
129
136
|
/**
|
|
130
137
|
* Signs a typed data object using the owner account.
|
|
@@ -140,7 +147,7 @@ class CdpSmartWalletProvider extends evmWalletProvider_1.EvmWalletProvider {
|
|
|
140
147
|
types,
|
|
141
148
|
primaryType,
|
|
142
149
|
message,
|
|
143
|
-
network:
|
|
150
|
+
network: this.getCdpSdkNetwork(),
|
|
144
151
|
});
|
|
145
152
|
}
|
|
146
153
|
/**
|
|
@@ -168,7 +175,7 @@ class CdpSmartWalletProvider extends evmWalletProvider_1.EvmWalletProvider {
|
|
|
168
175
|
];
|
|
169
176
|
const userOperation = await __classPrivateFieldGet(this, _CdpSmartWalletProvider_cdp, "f").evm.sendUserOperation({
|
|
170
177
|
smartAccount: this.smartAccount,
|
|
171
|
-
network:
|
|
178
|
+
network: this.getCdpSdkNetwork(),
|
|
172
179
|
calls,
|
|
173
180
|
paymasterUrl: __classPrivateFieldGet(this, _CdpSmartWalletProvider_paymasterUrl, "f"),
|
|
174
181
|
});
|
|
@@ -214,6 +221,14 @@ class CdpSmartWalletProvider extends evmWalletProvider_1.EvmWalletProvider {
|
|
|
214
221
|
getPaymasterUrl() {
|
|
215
222
|
return __classPrivateFieldGet(this, _CdpSmartWalletProvider_paymasterUrl, "f");
|
|
216
223
|
}
|
|
224
|
+
/**
|
|
225
|
+
* Gets the Viem PublicClient used for read-only operations.
|
|
226
|
+
*
|
|
227
|
+
* @returns The Viem PublicClient instance used for read-only operations.
|
|
228
|
+
*/
|
|
229
|
+
getPublicClient() {
|
|
230
|
+
return __classPrivateFieldGet(this, _CdpSmartWalletProvider_publicClient, "f");
|
|
231
|
+
}
|
|
217
232
|
/**
|
|
218
233
|
* Gets the balance of the smart wallet.
|
|
219
234
|
*
|
|
@@ -233,10 +248,19 @@ class CdpSmartWalletProvider extends evmWalletProvider_1.EvmWalletProvider {
|
|
|
233
248
|
// For smart wallets, we need to wait for the user operation to be confirmed
|
|
234
249
|
// This is a simplified implementation - in practice you might want to poll
|
|
235
250
|
// the CDP API for user operation status
|
|
236
|
-
|
|
251
|
+
const receipt = await __classPrivateFieldGet(this, _CdpSmartWalletProvider_cdp, "f").evm.waitForUserOperation({
|
|
237
252
|
smartAccountAddress: this.smartAccount.address,
|
|
238
253
|
userOpHash,
|
|
239
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;
|
|
240
264
|
}
|
|
241
265
|
/**
|
|
242
266
|
* Reads a contract.
|
|
@@ -251,7 +275,7 @@ class CdpSmartWalletProvider extends evmWalletProvider_1.EvmWalletProvider {
|
|
|
251
275
|
* Transfer the native asset of the network using smart wallet.
|
|
252
276
|
*
|
|
253
277
|
* @param to - The destination address.
|
|
254
|
-
* @param value - The amount to transfer in Wei.
|
|
278
|
+
* @param value - The amount to transfer in atomic units (Wei).
|
|
255
279
|
* @returns The user operation hash.
|
|
256
280
|
*/
|
|
257
281
|
async nativeTransfer(to, value) {
|
|
@@ -261,15 +285,32 @@ class CdpSmartWalletProvider extends evmWalletProvider_1.EvmWalletProvider {
|
|
|
261
285
|
data: "0x",
|
|
262
286
|
});
|
|
263
287
|
}
|
|
288
|
+
/**
|
|
289
|
+
* Converts the internal network ID to the format expected by the CDP SDK.
|
|
290
|
+
*
|
|
291
|
+
* @returns The network ID in CDP SDK format
|
|
292
|
+
* @throws Error if the network is not supported
|
|
293
|
+
*/
|
|
294
|
+
getCdpSdkNetwork() {
|
|
295
|
+
switch (__classPrivateFieldGet(this, _CdpSmartWalletProvider_network, "f").networkId) {
|
|
296
|
+
case "base-sepolia":
|
|
297
|
+
return "base-sepolia";
|
|
298
|
+
case "base-mainnet":
|
|
299
|
+
return "base";
|
|
300
|
+
case "ethereum-mainnet":
|
|
301
|
+
return "ethereum";
|
|
302
|
+
case "ethereum-sepolia":
|
|
303
|
+
return "ethereum-sepolia";
|
|
304
|
+
case "polygon-mainnet":
|
|
305
|
+
return "polygon";
|
|
306
|
+
case "arbitrum-mainnet":
|
|
307
|
+
return "arbitrum";
|
|
308
|
+
case "optimism-mainnet":
|
|
309
|
+
return "optimism";
|
|
310
|
+
default:
|
|
311
|
+
throw new Error(`Unsupported network for smart wallets: ${__classPrivateFieldGet(this, _CdpSmartWalletProvider_network, "f").networkId}`);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
264
314
|
}
|
|
265
315
|
exports.CdpSmartWalletProvider = CdpSmartWalletProvider;
|
|
266
|
-
_CdpSmartWalletProvider_publicClient = new WeakMap(),
|
|
267
|
-
switch (__classPrivateFieldGet(this, _CdpSmartWalletProvider_network, "f").networkId) {
|
|
268
|
-
case "base-sepolia":
|
|
269
|
-
return "base-sepolia";
|
|
270
|
-
case "base-mainnet":
|
|
271
|
-
return "base";
|
|
272
|
-
default:
|
|
273
|
-
throw new Error(`Unsupported network for smart wallets: ${__classPrivateFieldGet(this, _CdpSmartWalletProvider_network, "f").networkId}`);
|
|
274
|
-
}
|
|
275
|
-
};
|
|
316
|
+
_CdpSmartWalletProvider_publicClient = new WeakMap(), _CdpSmartWalletProvider_cdp = new WeakMap(), _CdpSmartWalletProvider_network = new WeakMap(), _CdpSmartWalletProvider_paymasterUrl = new WeakMap();
|
|
@@ -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 = {
|
|
@@ -113,7 +113,7 @@ export declare class CdpSolanaWalletProvider extends SvmWalletProvider implement
|
|
|
113
113
|
* Transfer SOL from the wallet to another address
|
|
114
114
|
*
|
|
115
115
|
* @param to - The base58 encoded address to transfer the SOL to
|
|
116
|
-
* @param value - The amount
|
|
116
|
+
* @param value - The amount to transfer in atomic units (Lamports)
|
|
117
117
|
* @returns The signature
|
|
118
118
|
*/
|
|
119
119
|
nativeTransfer(to: string, value: string): Promise<string>;
|
|
@@ -147,12 +147,13 @@ class CdpSolanaWalletProvider extends svmWalletProvider_1.SvmWalletProvider {
|
|
|
147
147
|
async signTransaction(transaction) {
|
|
148
148
|
const serializedTransaction = transaction.serialize();
|
|
149
149
|
const encodedSerializedTransaction = Buffer.from(serializedTransaction).toString("base64");
|
|
150
|
-
const
|
|
150
|
+
const signedTransactionResponse = await __classPrivateFieldGet(this, _CdpSolanaWalletProvider_cdp, "f").solana.signTransaction({
|
|
151
151
|
transaction: encodedSerializedTransaction,
|
|
152
152
|
address: __classPrivateFieldGet(this, _CdpSolanaWalletProvider_serverAccount, "f").address,
|
|
153
153
|
});
|
|
154
|
-
|
|
155
|
-
|
|
154
|
+
const signedTransactionBytes = Buffer.from(signedTransactionResponse.signedTransaction, "base64");
|
|
155
|
+
const signedTransaction = web3_js_1.VersionedTransaction.deserialize(signedTransactionBytes);
|
|
156
|
+
return signedTransaction;
|
|
156
157
|
}
|
|
157
158
|
/**
|
|
158
159
|
* Send a transaction
|
|
@@ -219,16 +220,15 @@ class CdpSolanaWalletProvider extends svmWalletProvider_1.SvmWalletProvider {
|
|
|
219
220
|
* Transfer SOL from the wallet to another address
|
|
220
221
|
*
|
|
221
222
|
* @param to - The base58 encoded address to transfer the SOL to
|
|
222
|
-
* @param value - The amount
|
|
223
|
+
* @param value - The amount to transfer in atomic units (Lamports)
|
|
223
224
|
* @returns The signature
|
|
224
225
|
*/
|
|
225
226
|
async nativeTransfer(to, value) {
|
|
226
227
|
const initialBalance = await this.getBalance();
|
|
227
|
-
const
|
|
228
|
-
const lamports = BigInt(Math.floor(solAmount * web3_js_1.LAMPORTS_PER_SOL));
|
|
228
|
+
const lamports = BigInt(value);
|
|
229
229
|
// Check if we have enough balance (including estimated fees)
|
|
230
230
|
if (initialBalance < lamports + BigInt(5000)) {
|
|
231
|
-
throw new Error(`Insufficient balance. Have ${Number(initialBalance)
|
|
231
|
+
throw new Error(`Insufficient balance. Have ${Number(initialBalance)} lamports, need ${Number(lamports) + 5000} lamports (including fees)`);
|
|
232
232
|
}
|
|
233
233
|
const toPubkey = new web3_js_1.PublicKey(to);
|
|
234
234
|
const instructions = [
|
|
@@ -29,13 +29,16 @@ jest.mock("@solana/web3.js", () => {
|
|
|
29
29
|
};
|
|
30
30
|
const MockPublicKey = jest.fn(() => mockPublicKey);
|
|
31
31
|
MockPublicKey.prototype = mockPublicKey;
|
|
32
|
+
const mockVersionedTransaction = {
|
|
33
|
+
serialize: jest.fn(() => Buffer.from("mock-serialized-tx")),
|
|
34
|
+
addSignature: jest.fn(),
|
|
35
|
+
};
|
|
36
|
+
const MockVersionedTransaction = jest.fn(() => mockVersionedTransaction);
|
|
37
|
+
MockVersionedTransaction.deserialize = jest.fn(() => mockVersionedTransaction);
|
|
32
38
|
return {
|
|
33
39
|
Connection: jest.fn(() => mockConnection),
|
|
34
40
|
PublicKey: MockPublicKey,
|
|
35
|
-
VersionedTransaction:
|
|
36
|
-
serialize: jest.fn(() => Buffer.from("mock-serialized-tx")),
|
|
37
|
-
addSignature: jest.fn(),
|
|
38
|
-
})),
|
|
41
|
+
VersionedTransaction: MockVersionedTransaction,
|
|
39
42
|
MessageV0: {
|
|
40
43
|
compile: jest.fn(),
|
|
41
44
|
},
|
|
@@ -69,9 +72,9 @@ jest.mock("@coinbase/cdp-sdk", () => {
|
|
|
69
72
|
address: MOCK_ADDRESS,
|
|
70
73
|
signTransaction: jest.fn().mockResolvedValue({ signature: MOCK_SIGNATURE }),
|
|
71
74
|
}));
|
|
72
|
-
const mockSignTransaction = jest
|
|
73
|
-
.
|
|
74
|
-
|
|
75
|
+
const mockSignTransaction = jest.fn().mockImplementation(async () => ({
|
|
76
|
+
signedTransaction: Buffer.from("mock-signed-transaction").toString("base64"),
|
|
77
|
+
}));
|
|
75
78
|
const mockSolanaClient = {
|
|
76
79
|
createAccount: mockCreateAccount,
|
|
77
80
|
getAccount: jest.fn(),
|
|
@@ -122,9 +125,9 @@ describe("CdpSolanaWalletProvider", () => {
|
|
|
122
125
|
};
|
|
123
126
|
// Set up the mock server account for the provider
|
|
124
127
|
mockCdpClient.solana.createAccount.mockResolvedValue(mockServerAccount);
|
|
125
|
-
mockCdpClient.solana.signTransaction = jest
|
|
126
|
-
.
|
|
127
|
-
|
|
128
|
+
mockCdpClient.solana.signTransaction = jest.fn().mockResolvedValue({
|
|
129
|
+
signedTransaction: Buffer.from("mock-signed-transaction").toString("base64"),
|
|
130
|
+
});
|
|
128
131
|
mockConnection.getBalance.mockResolvedValue(Number(MOCK_BALANCE));
|
|
129
132
|
mockConnection.getLatestBlockhash.mockResolvedValue({
|
|
130
133
|
blockhash: "test-blockhash",
|
|
@@ -285,7 +288,7 @@ describe("CdpSolanaWalletProvider", () => {
|
|
|
285
288
|
describe("native transfer", () => {
|
|
286
289
|
it("should transfer SOL", async () => {
|
|
287
290
|
const toAddress = "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin";
|
|
288
|
-
const amount = "
|
|
291
|
+
const amount = "1000000000"; // 1 SOL in lamports
|
|
289
292
|
// Set a balance that's high enough to cover the transfer + fees
|
|
290
293
|
mockConnection.getBalance.mockResolvedValueOnce(Number(2000000000n)); // 2 SOL
|
|
291
294
|
const signature = await provider.nativeTransfer(toAddress, amount);
|
|
@@ -295,7 +298,7 @@ describe("CdpSolanaWalletProvider", () => {
|
|
|
295
298
|
it("should handle insufficient balance", async () => {
|
|
296
299
|
mockConnection.getBalance.mockResolvedValueOnce(Number(1000000n)); // 0.001 SOL
|
|
297
300
|
const toAddress = "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin";
|
|
298
|
-
const amount = "
|
|
301
|
+
const amount = "1000000000"; // 1 SOL in lamports
|
|
299
302
|
await expect(provider.nativeTransfer(toAddress, amount)).rejects.toThrow("Insufficient balance");
|
|
300
303
|
});
|
|
301
304
|
it("should handle invalid address", async () => {
|
|
@@ -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
|
*
|
|
@@ -54,4 +61,8 @@ export declare abstract class EvmWalletProvider extends WalletProvider {
|
|
|
54
61
|
* @returns The response from the contract.
|
|
55
62
|
*/
|
|
56
63
|
abstract readContract<const abi extends Abi | readonly unknown[], functionName extends ContractFunctionName<abi, "pure" | "view">, const args extends ContractFunctionArgs<abi, "pure" | "view", functionName>>(params: ReadContractParameters<abi, functionName, args>): Promise<ReadContractReturnType<abi, functionName, args>>;
|
|
64
|
+
/**
|
|
65
|
+
* Get the underlying Viem PublicClient for read-only blockchain operations.
|
|
66
|
+
*/
|
|
67
|
+
abstract getPublicClient(): PublicClient;
|
|
57
68
|
}
|
|
@@ -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
|
},
|