@coinbase/agentkit 0.10.1 → 0.10.3
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 +179 -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/cdpApiActionProvider.js +7 -30
- package/dist/action-providers/cdp/cdpApiActionProvider.test.js +2 -8
- 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/faucetUtils.d.ts +38 -0
- package/dist/action-providers/cdp/faucetUtils.js +81 -0
- 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 +6 -6
- package/dist/action-providers/enso/constants.d.ts +4 -0
- package/dist/action-providers/enso/constants.js +10 -0
- package/dist/action-providers/enso/ensoActionProvider.d.ts +34 -0
- package/dist/action-providers/enso/ensoActionProvider.js +125 -0
- package/dist/action-providers/enso/ensoActionProvider.test.d.ts +1 -0
- package/dist/action-providers/enso/ensoActionProvider.test.js +141 -0
- package/dist/action-providers/enso/index.d.ts +1 -0
- package/dist/action-providers/enso/index.js +17 -0
- package/dist/action-providers/enso/schemas.d.ts +23 -0
- package/dist/action-providers/enso/schemas.js +22 -0
- package/dist/action-providers/erc20/constants.d.ts +2 -0
- package/dist/action-providers/erc20/constants.js +2 -0
- package/dist/action-providers/erc20/erc20ActionProvider.d.ts +17 -1
- package/dist/action-providers/erc20/erc20ActionProvider.js +103 -1
- package/dist/action-providers/erc20/erc20ActionProvider.test.js +201 -0
- package/dist/action-providers/erc20/schemas.d.ts +29 -0
- package/dist/action-providers/erc20/schemas.js +34 -1
- 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 +4 -1
- package/dist/action-providers/index.js +4 -1
- 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 +4 -1
- package/dist/action-providers/weth/constants.d.ts +0 -1
- package/dist/action-providers/weth/constants.js +1 -2
- package/dist/action-providers/weth/schemas.js +6 -2
- package/dist/action-providers/weth/wethActionProvider.d.ts +7 -0
- package/dist/action-providers/weth/wethActionProvider.js +57 -32
- package/dist/action-providers/weth/wethActionProvider.test.js +60 -11
- 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 +197 -0
- package/dist/action-providers/x402/x402ActionProvider.d.ts +14 -14
- package/dist/action-providers/x402/x402ActionProvider.js +179 -45
- package/dist/action-providers/x402/x402ActionProvider.test.js +162 -12
- package/dist/action-providers/yelay/constants.d.ts +64 -0
- package/dist/action-providers/yelay/constants.js +137 -0
- package/dist/action-providers/yelay/index.d.ts +2 -0
- package/dist/action-providers/yelay/index.js +18 -0
- package/dist/action-providers/yelay/schemas.d.ts +47 -0
- package/dist/action-providers/yelay/schemas.js +59 -0
- package/dist/action-providers/yelay/types.d.ts +24 -0
- package/dist/action-providers/yelay/types.js +2 -0
- package/dist/action-providers/yelay/yelayActionProvider.d.ts +70 -0
- package/dist/action-providers/yelay/yelayActionProvider.js +329 -0
- package/dist/action-providers/yelay/yelayActionProvider.test.d.ts +1 -0
- package/dist/action-providers/yelay/yelayActionProvider.test.js +302 -0
- 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 -8
- package/dist/wallet-providers/cdpSmartWalletProvider.test.js +6 -10
- package/dist/wallet-providers/cdpSolanaWalletProvider.d.ts +14 -0
- package/dist/wallet-providers/cdpSolanaWalletProvider.js +39 -3
- package/dist/wallet-providers/cdpSolanaWalletProvider.test.js +16 -0
- 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/privySvmWalletProvider.d.ts +14 -0
- package/dist/wallet-providers/privySvmWalletProvider.js +17 -0
- package/dist/wallet-providers/privySvmWalletProvider.test.js +10 -0
- package/dist/wallet-providers/solanaKeypairWalletProvider.d.ts +14 -0
- package/dist/wallet-providers/solanaKeypairWalletProvider.js +17 -0
- package/dist/wallet-providers/svmWalletProvider.d.ts +34 -0
- package/dist/wallet-providers/svmWalletProvider.js +43 -0
- package/dist/wallet-providers/svmWalletProvider.test.js +10 -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 +8 -4
package/dist/utils.js
CHANGED
|
@@ -2,19 +2,9 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.approve = approve;
|
|
4
4
|
exports.applyGasMultiplier = applyGasMultiplier;
|
|
5
|
+
exports.retryWithExponentialBackoff = retryWithExponentialBackoff;
|
|
5
6
|
const viem_1 = require("viem");
|
|
6
|
-
const
|
|
7
|
-
{
|
|
8
|
-
inputs: [
|
|
9
|
-
{ name: "spender", type: "address" },
|
|
10
|
-
{ name: "amount", type: "uint256" },
|
|
11
|
-
],
|
|
12
|
-
name: "approve",
|
|
13
|
-
outputs: [{ name: "", type: "bool" }],
|
|
14
|
-
stateMutability: "nonpayable",
|
|
15
|
-
type: "function",
|
|
16
|
-
},
|
|
17
|
-
];
|
|
7
|
+
const viem_2 = require("viem");
|
|
18
8
|
/**
|
|
19
9
|
* Approves a spender to spend tokens on behalf of the owner
|
|
20
10
|
*
|
|
@@ -27,7 +17,7 @@ const ERC20_ABI = [
|
|
|
27
17
|
async function approve(wallet, tokenAddress, spenderAddress, amount) {
|
|
28
18
|
try {
|
|
29
19
|
const data = (0, viem_1.encodeFunctionData)({
|
|
30
|
-
abi:
|
|
20
|
+
abi: viem_2.erc20Abi,
|
|
31
21
|
functionName: "approve",
|
|
32
22
|
args: [spenderAddress, amount],
|
|
33
23
|
});
|
|
@@ -55,3 +45,43 @@ async function approve(wallet, tokenAddress, spenderAddress, amount) {
|
|
|
55
45
|
function applyGasMultiplier(gas, multiplier) {
|
|
56
46
|
return BigInt(Math.round(Number(gas) * multiplier));
|
|
57
47
|
}
|
|
48
|
+
/**
|
|
49
|
+
* Utility function to sleep for a given number of milliseconds
|
|
50
|
+
*
|
|
51
|
+
* @param ms - Number of milliseconds to sleep
|
|
52
|
+
* @returns Promise that resolves after the specified delay
|
|
53
|
+
*/
|
|
54
|
+
const sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms));
|
|
55
|
+
/**
|
|
56
|
+
* Retry function with exponential backoff
|
|
57
|
+
*
|
|
58
|
+
* @param fn - The function to retry
|
|
59
|
+
* @param maxRetries - Maximum number of retries (default: 3)
|
|
60
|
+
* @param baseDelay - Base delay in milliseconds for retries (default: 1000)
|
|
61
|
+
* @param initialDelay - Initial delay before the first attempt in milliseconds (default: 0)
|
|
62
|
+
* @returns Promise that resolves with the function result or rejects with the last error
|
|
63
|
+
*/
|
|
64
|
+
async function retryWithExponentialBackoff(fn, maxRetries = 3, baseDelay = 1000, initialDelay = 0) {
|
|
65
|
+
let lastError;
|
|
66
|
+
// Wait before the first attempt if initialDelay is specified
|
|
67
|
+
if (initialDelay > 0) {
|
|
68
|
+
await sleep(initialDelay);
|
|
69
|
+
}
|
|
70
|
+
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
71
|
+
try {
|
|
72
|
+
return await fn();
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
lastError = error;
|
|
76
|
+
// If this was the last attempt, throw the error
|
|
77
|
+
if (attempt === maxRetries) {
|
|
78
|
+
throw lastError;
|
|
79
|
+
}
|
|
80
|
+
// Wait after failed attempt with exponential backoff
|
|
81
|
+
// Calculate delay with exponential backoff: baseDelay * 2^attempt
|
|
82
|
+
const delay = baseDelay * Math.pow(2, attempt);
|
|
83
|
+
await sleep(delay);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
throw lastError;
|
|
87
|
+
}
|
|
@@ -35,6 +35,13 @@ export declare class CdpEvmWalletProvider extends EvmWalletProvider implements W
|
|
|
35
35
|
name: string | undefined;
|
|
36
36
|
address: `0x${string}`;
|
|
37
37
|
}>;
|
|
38
|
+
/**
|
|
39
|
+
* Signs a raw hash.
|
|
40
|
+
*
|
|
41
|
+
* @param hash - The hash to sign.
|
|
42
|
+
* @returns The signed hash.
|
|
43
|
+
*/
|
|
44
|
+
sign(hash: `0x${string}`): Promise<Hex>;
|
|
38
45
|
/**
|
|
39
46
|
* Signs a message.
|
|
40
47
|
*
|
|
@@ -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,29 +138,13 @@ 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:
|
|
143
|
+
transaction: {
|
|
144
|
+
to: transaction.to,
|
|
145
|
+
value: transaction.value ? BigInt(transaction.value.toString()) : 0n,
|
|
146
|
+
data: transaction.data || "0x",
|
|
147
|
+
},
|
|
155
148
|
network: this.getCdpSdkNetwork(),
|
|
156
149
|
});
|
|
157
150
|
return result.transactionHash;
|
|
@@ -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!" });
|
|
@@ -38,6 +38,13 @@ export declare class CdpSmartWalletProvider extends EvmWalletProvider implements
|
|
|
38
38
|
address: Address;
|
|
39
39
|
ownerAddress: Address;
|
|
40
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>;
|
|
41
48
|
/**
|
|
42
49
|
* Signs a message using the owner account.
|
|
43
50
|
*
|
|
@@ -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.
|
|
@@ -238,12 +246,19 @@ class CdpSmartWalletProvider extends evmWalletProvider_1.EvmWalletProvider {
|
|
|
238
246
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
239
247
|
async waitForTransactionReceipt(userOpHash) {
|
|
240
248
|
// For smart wallets, we need to wait for the user operation to be confirmed
|
|
241
|
-
|
|
242
|
-
// the CDP API for user operation status
|
|
243
|
-
return __classPrivateFieldGet(this, _CdpSmartWalletProvider_cdp, "f").evm.waitForUserOperation({
|
|
249
|
+
const receipt = await __classPrivateFieldGet(this, _CdpSmartWalletProvider_cdp, "f").evm.waitForUserOperation({
|
|
244
250
|
smartAccountAddress: this.smartAccount.address,
|
|
245
251
|
userOpHash,
|
|
246
252
|
});
|
|
253
|
+
// Append transaction logs if available
|
|
254
|
+
if (receipt.status === "complete") {
|
|
255
|
+
const receiptTx = await __classPrivateFieldGet(this, _CdpSmartWalletProvider_publicClient, "f").waitForTransactionReceipt({
|
|
256
|
+
hash: receipt.transactionHash,
|
|
257
|
+
});
|
|
258
|
+
if (receiptTx.logs)
|
|
259
|
+
return { ...receipt, logs: receiptTx.logs };
|
|
260
|
+
}
|
|
261
|
+
return receipt;
|
|
247
262
|
}
|
|
248
263
|
/**
|
|
249
264
|
* 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,4 +1,5 @@
|
|
|
1
1
|
import { CdpClient } from "@coinbase/cdp-sdk";
|
|
2
|
+
import type { KeyPairSigner } from "@solana/kit";
|
|
2
3
|
import { Connection, PublicKey, RpcResponseAndContext, SignatureResult, SignatureStatus, SignatureStatusConfig, VersionedTransaction } from "@solana/web3.js";
|
|
3
4
|
import { Network } from "../network";
|
|
4
5
|
import { WalletProviderWithClient, CdpWalletProviderConfig } from "./cdpShared";
|
|
@@ -109,6 +110,13 @@ export declare class CdpSolanaWalletProvider extends SvmWalletProvider implement
|
|
|
109
110
|
* @returns The CDP client.
|
|
110
111
|
*/
|
|
111
112
|
getClient(): CdpClient;
|
|
113
|
+
/**
|
|
114
|
+
* Sign a message.
|
|
115
|
+
*
|
|
116
|
+
* @param message - The message to sign as a Uint8Array
|
|
117
|
+
* @returns The signature as a Uint8Array
|
|
118
|
+
*/
|
|
119
|
+
signMessage(message: Uint8Array): Promise<Uint8Array>;
|
|
112
120
|
/**
|
|
113
121
|
* Transfer SOL from the wallet to another address
|
|
114
122
|
*
|
|
@@ -117,4 +125,10 @@ export declare class CdpSolanaWalletProvider extends SvmWalletProvider implement
|
|
|
117
125
|
* @returns The signature
|
|
118
126
|
*/
|
|
119
127
|
nativeTransfer(to: string, value: string): Promise<string>;
|
|
128
|
+
/**
|
|
129
|
+
* Get the keypair signer for this wallet.
|
|
130
|
+
*
|
|
131
|
+
* @returns The KeyPairSigner
|
|
132
|
+
*/
|
|
133
|
+
getKeyPairSigner(): Promise<KeyPairSigner>;
|
|
120
134
|
}
|
|
@@ -10,11 +10,15 @@ 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 __importDefault = (this && this.__importDefault) || function (mod) {
|
|
14
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
15
|
+
};
|
|
16
|
+
var _CdpSolanaWalletProvider_connection, _CdpSolanaWalletProvider_cdp, _CdpSolanaWalletProvider_network, _CdpSolanaWalletProvider_serverAccount;
|
|
14
17
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
18
|
exports.CdpSolanaWalletProvider = void 0;
|
|
16
19
|
const cdp_sdk_1 = require("@coinbase/cdp-sdk");
|
|
17
20
|
const web3_js_1 = require("@solana/web3.js");
|
|
21
|
+
const bs58_1 = __importDefault(require("bs58"));
|
|
18
22
|
const svm_1 = require("../network/svm");
|
|
19
23
|
const svmWalletProvider_1 = require("./svmWalletProvider");
|
|
20
24
|
/**
|
|
@@ -29,9 +33,9 @@ class CdpSolanaWalletProvider extends svmWalletProvider_1.SvmWalletProvider {
|
|
|
29
33
|
constructor(config) {
|
|
30
34
|
super();
|
|
31
35
|
_CdpSolanaWalletProvider_connection.set(this, void 0);
|
|
32
|
-
_CdpSolanaWalletProvider_serverAccount.set(this, void 0);
|
|
33
36
|
_CdpSolanaWalletProvider_cdp.set(this, void 0);
|
|
34
37
|
_CdpSolanaWalletProvider_network.set(this, void 0);
|
|
38
|
+
_CdpSolanaWalletProvider_serverAccount.set(this, void 0);
|
|
35
39
|
__classPrivateFieldSet(this, _CdpSolanaWalletProvider_serverAccount, config.serverAccount, "f");
|
|
36
40
|
__classPrivateFieldSet(this, _CdpSolanaWalletProvider_cdp, config.cdp, "f");
|
|
37
41
|
__classPrivateFieldSet(this, _CdpSolanaWalletProvider_connection, config.connection, "f");
|
|
@@ -216,6 +220,23 @@ class CdpSolanaWalletProvider extends svmWalletProvider_1.SvmWalletProvider {
|
|
|
216
220
|
getClient() {
|
|
217
221
|
return __classPrivateFieldGet(this, _CdpSolanaWalletProvider_cdp, "f");
|
|
218
222
|
}
|
|
223
|
+
/**
|
|
224
|
+
* Sign a message.
|
|
225
|
+
*
|
|
226
|
+
* @param message - The message to sign as a Uint8Array
|
|
227
|
+
* @returns The signature as a Uint8Array
|
|
228
|
+
*/
|
|
229
|
+
async signMessage(message) {
|
|
230
|
+
// Convert Uint8Array to string for CDP SDK
|
|
231
|
+
const messageString = Buffer.from(message).toString("utf8");
|
|
232
|
+
const { signature } = await __classPrivateFieldGet(this, _CdpSolanaWalletProvider_cdp, "f").solana.signMessage({
|
|
233
|
+
address: __classPrivateFieldGet(this, _CdpSolanaWalletProvider_serverAccount, "f").address,
|
|
234
|
+
message: messageString,
|
|
235
|
+
});
|
|
236
|
+
// Convert signature string back to Uint8Array
|
|
237
|
+
// CDP returns signature as a hex string, convert to bytes
|
|
238
|
+
return new Uint8Array(Buffer.from(signature, "hex"));
|
|
239
|
+
}
|
|
219
240
|
/**
|
|
220
241
|
* Transfer SOL from the wallet to another address
|
|
221
242
|
*
|
|
@@ -253,6 +274,21 @@ class CdpSolanaWalletProvider extends svmWalletProvider_1.SvmWalletProvider {
|
|
|
253
274
|
await this.waitForSignatureResult(signature);
|
|
254
275
|
return signature;
|
|
255
276
|
}
|
|
277
|
+
/**
|
|
278
|
+
* Get the keypair signer for this wallet.
|
|
279
|
+
*
|
|
280
|
+
* @returns The KeyPairSigner
|
|
281
|
+
*/
|
|
282
|
+
async getKeyPairSigner() {
|
|
283
|
+
// Export the private key from CDP
|
|
284
|
+
const exportedPrivateKey = await __classPrivateFieldGet(this, _CdpSolanaWalletProvider_cdp, "f").solana.exportAccount({
|
|
285
|
+
address: __classPrivateFieldGet(this, _CdpSolanaWalletProvider_serverAccount, "f").address,
|
|
286
|
+
});
|
|
287
|
+
// Decode the base58 encoded private key to get the full 64-byte key
|
|
288
|
+
const fullKeyBytes = bs58_1.default.decode(exportedPrivateKey);
|
|
289
|
+
// Create and return the KeyPairSigner using the full key bytes
|
|
290
|
+
return (0, svmWalletProvider_1.createSignerFromBytes)(fullKeyBytes);
|
|
291
|
+
}
|
|
256
292
|
}
|
|
257
293
|
exports.CdpSolanaWalletProvider = CdpSolanaWalletProvider;
|
|
258
|
-
_CdpSolanaWalletProvider_connection = new WeakMap(),
|
|
294
|
+
_CdpSolanaWalletProvider_connection = new WeakMap(), _CdpSolanaWalletProvider_cdp = new WeakMap(), _CdpSolanaWalletProvider_network = new WeakMap(), _CdpSolanaWalletProvider_serverAccount = new WeakMap();
|
|
@@ -307,4 +307,20 @@ describe("CdpSolanaWalletProvider", () => {
|
|
|
307
307
|
await expect(provider.nativeTransfer(invalidAddress, amount)).rejects.toThrow();
|
|
308
308
|
});
|
|
309
309
|
});
|
|
310
|
+
// =========================================================
|
|
311
|
+
// KeyPairSigner tests
|
|
312
|
+
// =========================================================
|
|
313
|
+
describe("KeyPairSigner", () => {
|
|
314
|
+
it("should handle errors when getting KeyPairSigner", async () => {
|
|
315
|
+
// Mock exportAccount to throw an error
|
|
316
|
+
mockCdpClient.solana.exportAccount = jest.fn().mockRejectedValue(new Error("Export failed"));
|
|
317
|
+
await expect(provider.getKeyPairSigner()).rejects.toThrow("Export failed");
|
|
318
|
+
});
|
|
319
|
+
it("should handle errors gracefully in isKeyPairSigner", async () => {
|
|
320
|
+
// Mock exportAccount to throw an error
|
|
321
|
+
mockCdpClient.solana.exportAccount = jest.fn().mockRejectedValue(new Error("Export failed"));
|
|
322
|
+
const isValid = await provider.isKeyPairSigner();
|
|
323
|
+
expect(isValid).toBe(false);
|
|
324
|
+
});
|
|
325
|
+
});
|
|
310
326
|
});
|
|
@@ -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);
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { KeyPairSigner } from "@solana/kit";
|
|
1
2
|
import { SvmWalletProvider } from "./svmWalletProvider";
|
|
2
3
|
import { RpcResponseAndContext, SignatureStatus, VersionedTransaction, Connection, PublicKey, SignatureResult } from "@solana/web3.js";
|
|
3
4
|
import { Network } from "../network/types";
|
|
@@ -127,4 +128,17 @@ export declare class PrivySvmWalletProvider extends SvmWalletProvider {
|
|
|
127
128
|
* @returns The public key.
|
|
128
129
|
*/
|
|
129
130
|
getPublicKey(): PublicKey;
|
|
131
|
+
/**
|
|
132
|
+
* Sign a message.
|
|
133
|
+
*
|
|
134
|
+
* @param _ - The message to sign as a Uint8Array (unused)
|
|
135
|
+
* @returns Never - throws an error as message signing is not supported yet
|
|
136
|
+
*/
|
|
137
|
+
signMessage(_: Uint8Array): Promise<Uint8Array>;
|
|
138
|
+
/**
|
|
139
|
+
* Get the keypair signer for this wallet.
|
|
140
|
+
*
|
|
141
|
+
* @returns The KeyPairSigner
|
|
142
|
+
*/
|
|
143
|
+
getKeyPairSigner(): Promise<KeyPairSigner>;
|
|
130
144
|
}
|