@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
|
@@ -42,6 +42,11 @@ describe("Wrap Eth Action", () => {
|
|
|
42
42
|
beforeEach(async () => {
|
|
43
43
|
mockWallet = {
|
|
44
44
|
getAddress: jest.fn().mockReturnValue(MOCK_ADDRESS),
|
|
45
|
+
getNetwork: jest.fn().mockReturnValue({
|
|
46
|
+
protocolFamily: "evm",
|
|
47
|
+
networkId: "base-mainnet",
|
|
48
|
+
}),
|
|
49
|
+
getBalance: jest.fn().mockResolvedValue((0, viem_1.parseUnits)("20", 18)), // 20 ETH balance
|
|
45
50
|
sendTransaction: jest.fn(),
|
|
46
51
|
waitForTransactionReceipt: jest.fn(),
|
|
47
52
|
};
|
|
@@ -54,14 +59,14 @@ describe("Wrap Eth Action", () => {
|
|
|
54
59
|
mockWallet.sendTransaction.mockResolvedValue(hash);
|
|
55
60
|
const response = await actionProvider.wrapEth(mockWallet, args);
|
|
56
61
|
expect(mockWallet.sendTransaction).toHaveBeenCalledWith({
|
|
57
|
-
to:
|
|
62
|
+
to: (0, wethActionProvider_1.getWethAddress)({ protocolFamily: "evm", networkId: "base-mainnet" }),
|
|
58
63
|
data: (0, viem_1.encodeFunctionData)({
|
|
59
64
|
abi: constants_1.WETH_ABI,
|
|
60
65
|
functionName: "deposit",
|
|
61
66
|
}),
|
|
62
|
-
value:
|
|
67
|
+
value: (0, viem_1.parseUnits)(MOCK_AMOUNT, 18),
|
|
63
68
|
});
|
|
64
|
-
expect(response).toContain(`Wrapped ETH
|
|
69
|
+
expect(response).toContain(`Wrapped ${MOCK_AMOUNT} ETH to WETH. Transaction hash: ${hash}`);
|
|
65
70
|
});
|
|
66
71
|
it("should fail with an error", async () => {
|
|
67
72
|
const args = {
|
|
@@ -71,15 +76,25 @@ describe("Wrap Eth Action", () => {
|
|
|
71
76
|
mockWallet.sendTransaction.mockRejectedValue(error);
|
|
72
77
|
const response = await actionProvider.wrapEth(mockWallet, args);
|
|
73
78
|
expect(mockWallet.sendTransaction).toHaveBeenCalledWith({
|
|
74
|
-
to:
|
|
79
|
+
to: (0, wethActionProvider_1.getWethAddress)({ protocolFamily: "evm", networkId: "base-mainnet" }),
|
|
75
80
|
data: (0, viem_1.encodeFunctionData)({
|
|
76
81
|
abi: constants_1.WETH_ABI,
|
|
77
82
|
functionName: "deposit",
|
|
78
83
|
}),
|
|
79
|
-
value:
|
|
84
|
+
value: (0, viem_1.parseUnits)(MOCK_AMOUNT, 18),
|
|
80
85
|
});
|
|
81
86
|
expect(response).toContain(`Error wrapping ETH: ${error}`);
|
|
82
87
|
});
|
|
88
|
+
it("should fail with insufficient ETH balance", async () => {
|
|
89
|
+
const args = {
|
|
90
|
+
amountToWrap: MOCK_AMOUNT,
|
|
91
|
+
};
|
|
92
|
+
// Mock insufficient balance (less than 15 ETH)
|
|
93
|
+
mockWallet.getBalance.mockResolvedValue((0, viem_1.parseUnits)("10", 18));
|
|
94
|
+
const response = await actionProvider.wrapEth(mockWallet, args);
|
|
95
|
+
expect(mockWallet.sendTransaction).not.toHaveBeenCalled();
|
|
96
|
+
expect(response).toContain("Error: Insufficient ETH balance");
|
|
97
|
+
});
|
|
83
98
|
});
|
|
84
99
|
describe("Unwrap Eth Action", () => {
|
|
85
100
|
let mockWallet;
|
|
@@ -87,6 +102,11 @@ describe("Unwrap Eth Action", () => {
|
|
|
87
102
|
beforeEach(async () => {
|
|
88
103
|
mockWallet = {
|
|
89
104
|
getAddress: jest.fn().mockReturnValue(MOCK_ADDRESS),
|
|
105
|
+
getNetwork: jest.fn().mockReturnValue({
|
|
106
|
+
protocolFamily: "evm",
|
|
107
|
+
networkId: "base-mainnet",
|
|
108
|
+
}),
|
|
109
|
+
readContract: jest.fn().mockResolvedValue((0, viem_1.parseUnits)("20", 18)), // 20 WETH balance
|
|
90
110
|
sendTransaction: jest.fn(),
|
|
91
111
|
waitForTransactionReceipt: jest.fn(),
|
|
92
112
|
};
|
|
@@ -98,15 +118,21 @@ describe("Unwrap Eth Action", () => {
|
|
|
98
118
|
const hash = "0x1234567890123456789012345678901234567890";
|
|
99
119
|
mockWallet.sendTransaction.mockResolvedValue(hash);
|
|
100
120
|
const response = await actionProvider.unwrapEth(mockWallet, args);
|
|
121
|
+
expect(mockWallet.readContract).toHaveBeenCalledWith({
|
|
122
|
+
address: (0, wethActionProvider_1.getWethAddress)({ protocolFamily: "evm", networkId: "base-mainnet" }),
|
|
123
|
+
abi: viem_1.erc20Abi,
|
|
124
|
+
functionName: "balanceOf",
|
|
125
|
+
args: [MOCK_ADDRESS],
|
|
126
|
+
});
|
|
101
127
|
expect(mockWallet.sendTransaction).toHaveBeenCalledWith({
|
|
102
|
-
to:
|
|
128
|
+
to: (0, wethActionProvider_1.getWethAddress)({ protocolFamily: "evm", networkId: "base-mainnet" }),
|
|
103
129
|
data: (0, viem_1.encodeFunctionData)({
|
|
104
130
|
abi: constants_1.WETH_ABI,
|
|
105
131
|
functionName: "withdraw",
|
|
106
|
-
args: [
|
|
132
|
+
args: [(0, viem_1.parseUnits)(MOCK_AMOUNT, 18)],
|
|
107
133
|
}),
|
|
108
134
|
});
|
|
109
|
-
expect(response).toContain(`Unwrapped WETH
|
|
135
|
+
expect(response).toContain(`Unwrapped ${MOCK_AMOUNT} WETH to ETH. Transaction hash: ${hash}`);
|
|
110
136
|
});
|
|
111
137
|
it("should fail with an error", async () => {
|
|
112
138
|
const args = {
|
|
@@ -115,16 +141,32 @@ describe("Unwrap Eth Action", () => {
|
|
|
115
141
|
const error = new Error("Failed to unwrap WETH");
|
|
116
142
|
mockWallet.sendTransaction.mockRejectedValue(error);
|
|
117
143
|
const response = await actionProvider.unwrapEth(mockWallet, args);
|
|
144
|
+
expect(mockWallet.readContract).toHaveBeenCalledWith({
|
|
145
|
+
address: (0, wethActionProvider_1.getWethAddress)({ protocolFamily: "evm", networkId: "base-mainnet" }),
|
|
146
|
+
abi: viem_1.erc20Abi,
|
|
147
|
+
functionName: "balanceOf",
|
|
148
|
+
args: [MOCK_ADDRESS],
|
|
149
|
+
});
|
|
118
150
|
expect(mockWallet.sendTransaction).toHaveBeenCalledWith({
|
|
119
|
-
to:
|
|
151
|
+
to: (0, wethActionProvider_1.getWethAddress)({ protocolFamily: "evm", networkId: "base-mainnet" }),
|
|
120
152
|
data: (0, viem_1.encodeFunctionData)({
|
|
121
153
|
abi: constants_1.WETH_ABI,
|
|
122
154
|
functionName: "withdraw",
|
|
123
|
-
args: [
|
|
155
|
+
args: [(0, viem_1.parseUnits)(MOCK_AMOUNT, 18)],
|
|
124
156
|
}),
|
|
125
157
|
});
|
|
126
158
|
expect(response).toContain(`Error unwrapping WETH: ${error}`);
|
|
127
159
|
});
|
|
160
|
+
it("should fail with insufficient WETH balance", async () => {
|
|
161
|
+
const args = {
|
|
162
|
+
amountToUnwrap: MOCK_AMOUNT,
|
|
163
|
+
};
|
|
164
|
+
// Mock insufficient WETH balance (less than 15 WETH)
|
|
165
|
+
mockWallet.readContract.mockResolvedValue((0, viem_1.parseUnits)("10", 18));
|
|
166
|
+
const response = await actionProvider.unwrapEth(mockWallet, args);
|
|
167
|
+
expect(mockWallet.sendTransaction).not.toHaveBeenCalled();
|
|
168
|
+
expect(response).toContain("Error: Insufficient WETH balance");
|
|
169
|
+
});
|
|
128
170
|
});
|
|
129
171
|
describe("supportsNetwork", () => {
|
|
130
172
|
const actionProvider = (0, wethActionProvider_1.wethActionProvider)();
|
|
@@ -142,11 +184,18 @@ describe("supportsNetwork", () => {
|
|
|
142
184
|
});
|
|
143
185
|
expect(result).toBe(true);
|
|
144
186
|
});
|
|
145
|
-
it("should return
|
|
187
|
+
it("should return true for ethereum-mainnet", () => {
|
|
146
188
|
const result = actionProvider.supportsNetwork({
|
|
147
189
|
protocolFamily: "evm",
|
|
148
190
|
networkId: "ethereum-mainnet",
|
|
149
191
|
});
|
|
192
|
+
expect(result).toBe(true);
|
|
193
|
+
});
|
|
194
|
+
it("should return false for networks without WETH", () => {
|
|
195
|
+
const result = actionProvider.supportsNetwork({
|
|
196
|
+
protocolFamily: "evm",
|
|
197
|
+
networkId: "polygon-mainnet",
|
|
198
|
+
});
|
|
150
199
|
expect(result).toBe(false);
|
|
151
200
|
});
|
|
152
201
|
});
|
|
@@ -1,4 +1,11 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
+
export declare const ListX402ServicesSchema: z.ZodObject<{
|
|
3
|
+
maxUsdcPrice: z.ZodOptional<z.ZodNumber>;
|
|
4
|
+
}, "strip", z.ZodTypeAny, {
|
|
5
|
+
maxUsdcPrice?: number | undefined;
|
|
6
|
+
}, {
|
|
7
|
+
maxUsdcPrice?: number | undefined;
|
|
8
|
+
}>;
|
|
2
9
|
export declare const HttpRequestSchema: z.ZodObject<{
|
|
3
10
|
url: z.ZodString;
|
|
4
11
|
method: z.ZodDefault<z.ZodNullable<z.ZodEnum<["GET", "POST", "PUT", "DELETE", "PATCH"]>>>;
|
|
@@ -1,7 +1,17 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.DirectX402RequestSchema = exports.RetryWithX402Schema = exports.HttpRequestSchema = void 0;
|
|
3
|
+
exports.DirectX402RequestSchema = exports.RetryWithX402Schema = exports.HttpRequestSchema = exports.ListX402ServicesSchema = void 0;
|
|
4
4
|
const zod_1 = require("zod");
|
|
5
|
+
// Schema for listing x402 services
|
|
6
|
+
exports.ListX402ServicesSchema = zod_1.z
|
|
7
|
+
.object({
|
|
8
|
+
maxUsdcPrice: zod_1.z
|
|
9
|
+
.number()
|
|
10
|
+
.optional()
|
|
11
|
+
.describe("Optional maximum price in USDC whole units (e.g., 0.1 for 0.10 USDC). Only USDC payment options will be considered when this filter is applied."),
|
|
12
|
+
})
|
|
13
|
+
.strip()
|
|
14
|
+
.describe("Parameters for listing x402 services with optional filtering");
|
|
5
15
|
// Schema for initial HTTP request
|
|
6
16
|
exports.HttpRequestSchema = zod_1.z
|
|
7
17
|
.object({
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { Network } from "../../network";
|
|
2
|
+
import { AxiosError } from "axios";
|
|
3
|
+
import { WalletProvider } from "../../wallet-providers";
|
|
4
|
+
/**
|
|
5
|
+
* Supported network types for x402 protocol
|
|
6
|
+
*/
|
|
7
|
+
export type X402Network = "base" | "base-sepolia" | "solana" | "solana-devnet";
|
|
8
|
+
/**
|
|
9
|
+
* Converts the internal network ID to the format expected by the x402 protocol.
|
|
10
|
+
*
|
|
11
|
+
* @param network - The network to convert
|
|
12
|
+
* @returns The network ID in x402 format
|
|
13
|
+
* @throws Error if the network is not supported
|
|
14
|
+
*/
|
|
15
|
+
export declare function getX402Network(network: Network): X402Network | string | undefined;
|
|
16
|
+
/**
|
|
17
|
+
* Helper method to handle HTTP errors consistently.
|
|
18
|
+
*
|
|
19
|
+
* @param error - The axios error to handle
|
|
20
|
+
* @param url - The URL that was being accessed when the error occurred
|
|
21
|
+
* @returns A JSON string containing formatted error details
|
|
22
|
+
*/
|
|
23
|
+
export declare function handleHttpError(error: AxiosError, url: string): string;
|
|
24
|
+
/**
|
|
25
|
+
* Formats a payment option into a human-readable string.
|
|
26
|
+
*
|
|
27
|
+
* @param option - The payment option to format
|
|
28
|
+
* @param option.asset - The asset address or identifier
|
|
29
|
+
* @param option.maxAmountRequired - The maximum amount required for the payment
|
|
30
|
+
* @param option.network - The network identifier
|
|
31
|
+
* @param walletProvider - The wallet provider for token details lookup
|
|
32
|
+
* @returns A formatted string like "0.1 USDC on base"
|
|
33
|
+
*/
|
|
34
|
+
export declare function formatPaymentOption(option: {
|
|
35
|
+
asset: string;
|
|
36
|
+
maxAmountRequired: string;
|
|
37
|
+
network: string;
|
|
38
|
+
}, walletProvider: WalletProvider): Promise<string>;
|
|
39
|
+
/**
|
|
40
|
+
* Checks if an asset is USDC on any supported network.
|
|
41
|
+
*
|
|
42
|
+
* @param asset - The asset address or identifier
|
|
43
|
+
* @param walletProvider - The wallet provider for network context
|
|
44
|
+
* @returns True if the asset is USDC, false otherwise
|
|
45
|
+
*/
|
|
46
|
+
export declare function isUsdcAsset(asset: string, walletProvider: WalletProvider): boolean;
|
|
47
|
+
/**
|
|
48
|
+
* Converts whole units to atomic units for a given asset.
|
|
49
|
+
*
|
|
50
|
+
* @param wholeUnits - The amount in whole units (e.g., 0.1 for 0.1 USDC)
|
|
51
|
+
* @param asset - The asset address or identifier
|
|
52
|
+
* @param walletProvider - The wallet provider for token details lookup
|
|
53
|
+
* @returns The amount in atomic units as a string, or null if conversion fails
|
|
54
|
+
*/
|
|
55
|
+
export declare function convertWholeUnitsToAtomic(wholeUnits: number, asset: string, walletProvider: WalletProvider): Promise<string | null>;
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getX402Network = getX402Network;
|
|
4
|
+
exports.handleHttpError = handleHttpError;
|
|
5
|
+
exports.formatPaymentOption = formatPaymentOption;
|
|
6
|
+
exports.isUsdcAsset = isUsdcAsset;
|
|
7
|
+
exports.convertWholeUnitsToAtomic = convertWholeUnitsToAtomic;
|
|
8
|
+
const utils_1 = require("../erc20/utils");
|
|
9
|
+
const constants_1 = require("../erc20/constants");
|
|
10
|
+
const viem_1 = require("viem");
|
|
11
|
+
const wallet_providers_1 = require("../../wallet-providers");
|
|
12
|
+
/**
|
|
13
|
+
* USDC token addresses for Solana networks
|
|
14
|
+
*/
|
|
15
|
+
const SOLANA_USDC_ADDRESSES = {
|
|
16
|
+
"solana-devnet": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU",
|
|
17
|
+
"solana-mainnet": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Converts the internal network ID to the format expected by the x402 protocol.
|
|
21
|
+
*
|
|
22
|
+
* @param network - The network to convert
|
|
23
|
+
* @returns The network ID in x402 format
|
|
24
|
+
* @throws Error if the network is not supported
|
|
25
|
+
*/
|
|
26
|
+
function getX402Network(network) {
|
|
27
|
+
switch (network.networkId) {
|
|
28
|
+
case "base-mainnet":
|
|
29
|
+
return "base";
|
|
30
|
+
case "base-sepolia":
|
|
31
|
+
return "base-sepolia";
|
|
32
|
+
case "solana-mainnet":
|
|
33
|
+
return "solana";
|
|
34
|
+
case "solana-devnet":
|
|
35
|
+
return "solana-devnet";
|
|
36
|
+
default:
|
|
37
|
+
return network.networkId;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Helper method to handle HTTP errors consistently.
|
|
42
|
+
*
|
|
43
|
+
* @param error - The axios error to handle
|
|
44
|
+
* @param url - The URL that was being accessed when the error occurred
|
|
45
|
+
* @returns A JSON string containing formatted error details
|
|
46
|
+
*/
|
|
47
|
+
function handleHttpError(error, url) {
|
|
48
|
+
if (error.response) {
|
|
49
|
+
return JSON.stringify({
|
|
50
|
+
error: true,
|
|
51
|
+
message: `HTTP ${error.response.status} error when accessing ${url}`,
|
|
52
|
+
details: error.response.data?.error || error.response.statusText,
|
|
53
|
+
suggestion: "Check if the URL is correct and the API is available.",
|
|
54
|
+
}, null, 2);
|
|
55
|
+
}
|
|
56
|
+
if (error.request) {
|
|
57
|
+
return JSON.stringify({
|
|
58
|
+
error: true,
|
|
59
|
+
message: `Network error when accessing ${url}`,
|
|
60
|
+
details: error.message,
|
|
61
|
+
suggestion: "Check your internet connection and verify the API endpoint is accessible.",
|
|
62
|
+
}, null, 2);
|
|
63
|
+
}
|
|
64
|
+
return JSON.stringify({
|
|
65
|
+
error: true,
|
|
66
|
+
message: `Error making request to ${url}`,
|
|
67
|
+
details: error.message,
|
|
68
|
+
suggestion: "Please check the request parameters and try again.",
|
|
69
|
+
}, null, 2);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Formats a payment option into a human-readable string.
|
|
73
|
+
*
|
|
74
|
+
* @param option - The payment option to format
|
|
75
|
+
* @param option.asset - The asset address or identifier
|
|
76
|
+
* @param option.maxAmountRequired - The maximum amount required for the payment
|
|
77
|
+
* @param option.network - The network identifier
|
|
78
|
+
* @param walletProvider - The wallet provider for token details lookup
|
|
79
|
+
* @returns A formatted string like "0.1 USDC on base"
|
|
80
|
+
*/
|
|
81
|
+
async function formatPaymentOption(option, walletProvider) {
|
|
82
|
+
const { asset, maxAmountRequired, network } = option;
|
|
83
|
+
// Check if this is an EVM network and we can use ERC20 helpers
|
|
84
|
+
const walletNetwork = walletProvider.getNetwork();
|
|
85
|
+
const isEvmNetwork = walletNetwork.protocolFamily === "evm";
|
|
86
|
+
const isSvmNetwork = walletNetwork.protocolFamily === "svm";
|
|
87
|
+
if (isEvmNetwork && walletProvider instanceof wallet_providers_1.EvmWalletProvider) {
|
|
88
|
+
const networkId = walletNetwork.networkId;
|
|
89
|
+
const tokenSymbols = constants_1.TOKEN_ADDRESSES_BY_SYMBOLS[networkId];
|
|
90
|
+
if (tokenSymbols) {
|
|
91
|
+
for (const [symbol, address] of Object.entries(tokenSymbols)) {
|
|
92
|
+
if (asset.toLowerCase() === address.toLowerCase()) {
|
|
93
|
+
const decimals = symbol === "USDC" || symbol === "EURC" ? 6 : 18;
|
|
94
|
+
const formattedAmount = (0, viem_1.formatUnits)(BigInt(maxAmountRequired), decimals);
|
|
95
|
+
return `${formattedAmount} ${symbol} on ${network} network`;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
// Fall back to getTokenDetails for unknown tokens
|
|
100
|
+
try {
|
|
101
|
+
const tokenDetails = await (0, utils_1.getTokenDetails)(walletProvider, asset);
|
|
102
|
+
if (tokenDetails) {
|
|
103
|
+
const formattedAmount = (0, viem_1.formatUnits)(BigInt(maxAmountRequired), tokenDetails.decimals);
|
|
104
|
+
return `${formattedAmount} ${tokenDetails.name} on ${network} network`;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
// If we can't get token details, fall back to raw format
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
if (isSvmNetwork && walletProvider instanceof wallet_providers_1.SvmWalletProvider) {
|
|
112
|
+
// Check if the asset is USDC on Solana networks
|
|
113
|
+
const networkId = walletNetwork.networkId;
|
|
114
|
+
const usdcAddress = SOLANA_USDC_ADDRESSES[networkId];
|
|
115
|
+
if (usdcAddress && asset === usdcAddress) {
|
|
116
|
+
// USDC has 6 decimals on Solana
|
|
117
|
+
const formattedAmount = (0, viem_1.formatUnits)(BigInt(maxAmountRequired), 6);
|
|
118
|
+
return `${formattedAmount} USDC on ${network} network`;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
// Fallback to original format for non-EVM/SVM networks or when token details can't be fetched
|
|
122
|
+
return `${asset} ${maxAmountRequired} on ${network} network`;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Checks if an asset is USDC on any supported network.
|
|
126
|
+
*
|
|
127
|
+
* @param asset - The asset address or identifier
|
|
128
|
+
* @param walletProvider - The wallet provider for network context
|
|
129
|
+
* @returns True if the asset is USDC, false otherwise
|
|
130
|
+
*/
|
|
131
|
+
function isUsdcAsset(asset, walletProvider) {
|
|
132
|
+
const walletNetwork = walletProvider.getNetwork();
|
|
133
|
+
const isEvmNetwork = walletNetwork.protocolFamily === "evm";
|
|
134
|
+
const isSvmNetwork = walletNetwork.protocolFamily === "svm";
|
|
135
|
+
if (isEvmNetwork && walletProvider instanceof wallet_providers_1.EvmWalletProvider) {
|
|
136
|
+
const networkId = walletNetwork.networkId;
|
|
137
|
+
const tokenSymbols = constants_1.TOKEN_ADDRESSES_BY_SYMBOLS[networkId];
|
|
138
|
+
if (tokenSymbols && tokenSymbols.USDC) {
|
|
139
|
+
return asset.toLowerCase() === tokenSymbols.USDC.toLowerCase();
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
if (isSvmNetwork && walletProvider instanceof wallet_providers_1.SvmWalletProvider) {
|
|
143
|
+
const networkId = walletNetwork.networkId;
|
|
144
|
+
const usdcAddress = SOLANA_USDC_ADDRESSES[networkId];
|
|
145
|
+
if (usdcAddress) {
|
|
146
|
+
return asset === usdcAddress;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return false;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Converts whole units to atomic units for a given asset.
|
|
153
|
+
*
|
|
154
|
+
* @param wholeUnits - The amount in whole units (e.g., 0.1 for 0.1 USDC)
|
|
155
|
+
* @param asset - The asset address or identifier
|
|
156
|
+
* @param walletProvider - The wallet provider for token details lookup
|
|
157
|
+
* @returns The amount in atomic units as a string, or null if conversion fails
|
|
158
|
+
*/
|
|
159
|
+
async function convertWholeUnitsToAtomic(wholeUnits, asset, walletProvider) {
|
|
160
|
+
// Check if this is an EVM network and we can use ERC20 helpers
|
|
161
|
+
const walletNetwork = walletProvider.getNetwork();
|
|
162
|
+
const isEvmNetwork = walletNetwork.protocolFamily === "evm";
|
|
163
|
+
const isSvmNetwork = walletNetwork.protocolFamily === "svm";
|
|
164
|
+
if (isEvmNetwork && walletProvider instanceof wallet_providers_1.EvmWalletProvider) {
|
|
165
|
+
const networkId = walletNetwork.networkId;
|
|
166
|
+
const tokenSymbols = constants_1.TOKEN_ADDRESSES_BY_SYMBOLS[networkId];
|
|
167
|
+
if (tokenSymbols) {
|
|
168
|
+
for (const [symbol, address] of Object.entries(tokenSymbols)) {
|
|
169
|
+
if (asset.toLowerCase() === address.toLowerCase()) {
|
|
170
|
+
const decimals = symbol === "USDC" || symbol === "EURC" ? 6 : 18;
|
|
171
|
+
return (0, viem_1.parseUnits)(wholeUnits.toString(), decimals).toString();
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
// Fall back to getTokenDetails for unknown tokens
|
|
176
|
+
try {
|
|
177
|
+
const tokenDetails = await (0, utils_1.getTokenDetails)(walletProvider, asset);
|
|
178
|
+
if (tokenDetails) {
|
|
179
|
+
return (0, viem_1.parseUnits)(wholeUnits.toString(), tokenDetails.decimals).toString();
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
catch {
|
|
183
|
+
// If we can't get token details, fall back to assuming 18 decimals
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
if (isSvmNetwork && walletProvider instanceof wallet_providers_1.SvmWalletProvider) {
|
|
187
|
+
// Check if the asset is USDC on Solana networks
|
|
188
|
+
const networkId = walletNetwork.networkId;
|
|
189
|
+
const usdcAddress = SOLANA_USDC_ADDRESSES[networkId];
|
|
190
|
+
if (usdcAddress && asset === usdcAddress) {
|
|
191
|
+
// USDC has 6 decimals on Solana
|
|
192
|
+
return (0, viem_1.parseUnits)(wholeUnits.toString(), 6).toString();
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
// Fallback to 18 decimals for unknown tokens or non-EVM/SVM networks
|
|
196
|
+
return (0, viem_1.parseUnits)(wholeUnits.toString(), 18).toString();
|
|
197
|
+
}
|
|
@@ -1,17 +1,25 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { ActionProvider } from "../actionProvider";
|
|
3
3
|
import { Network } from "../../network";
|
|
4
|
-
import { HttpRequestSchema, RetryWithX402Schema, DirectX402RequestSchema } from "./schemas";
|
|
5
|
-
import {
|
|
4
|
+
import { HttpRequestSchema, RetryWithX402Schema, DirectX402RequestSchema, ListX402ServicesSchema } from "./schemas";
|
|
5
|
+
import { WalletProvider } from "../../wallet-providers";
|
|
6
6
|
/**
|
|
7
7
|
* X402ActionProvider provides actions for making HTTP requests, with optional x402 payment handling.
|
|
8
8
|
*/
|
|
9
|
-
export declare class X402ActionProvider extends ActionProvider<
|
|
9
|
+
export declare class X402ActionProvider extends ActionProvider<WalletProvider> {
|
|
10
10
|
/**
|
|
11
11
|
* Creates a new instance of X402ActionProvider.
|
|
12
12
|
* Initializes the provider with x402 capabilities.
|
|
13
13
|
*/
|
|
14
14
|
constructor();
|
|
15
|
+
/**
|
|
16
|
+
* Discovers available x402 services with optional filtering.
|
|
17
|
+
*
|
|
18
|
+
* @param walletProvider - The wallet provider to use for network filtering
|
|
19
|
+
* @param args - Optional filters: maxUsdcPrice
|
|
20
|
+
* @returns JSON string with the list of services (filtered by network and description)
|
|
21
|
+
*/
|
|
22
|
+
discoverX402Services(walletProvider: WalletProvider, args: z.infer<typeof ListX402ServicesSchema>): Promise<string>;
|
|
15
23
|
/**
|
|
16
24
|
* Makes a basic HTTP request to an API endpoint.
|
|
17
25
|
*
|
|
@@ -19,7 +27,7 @@ export declare class X402ActionProvider extends ActionProvider<EvmWalletProvider
|
|
|
19
27
|
* @param args - The request parameters including URL, method, headers, and body
|
|
20
28
|
* @returns A JSON string containing the response or error details
|
|
21
29
|
*/
|
|
22
|
-
makeHttpRequest(walletProvider:
|
|
30
|
+
makeHttpRequest(walletProvider: WalletProvider, args: z.infer<typeof HttpRequestSchema>): Promise<string>;
|
|
23
31
|
/**
|
|
24
32
|
* Retries a request with x402 payment after receiving a 402 response.
|
|
25
33
|
*
|
|
@@ -27,7 +35,7 @@ export declare class X402ActionProvider extends ActionProvider<EvmWalletProvider
|
|
|
27
35
|
* @param args - The request parameters including URL, method, headers, body, and payment option
|
|
28
36
|
* @returns A JSON string containing the response with payment details or error information
|
|
29
37
|
*/
|
|
30
|
-
retryWithX402(walletProvider:
|
|
38
|
+
retryWithX402(walletProvider: WalletProvider, args: z.infer<typeof RetryWithX402Schema>): Promise<string>;
|
|
31
39
|
/**
|
|
32
40
|
* Makes an HTTP request with automatic x402 payment handling.
|
|
33
41
|
*
|
|
@@ -35,7 +43,7 @@ export declare class X402ActionProvider extends ActionProvider<EvmWalletProvider
|
|
|
35
43
|
* @param args - The request parameters including URL, method, headers, and body
|
|
36
44
|
* @returns A JSON string containing the response with optional payment details or error information
|
|
37
45
|
*/
|
|
38
|
-
makeHttpRequestWithX402(walletProvider:
|
|
46
|
+
makeHttpRequestWithX402(walletProvider: WalletProvider, args: z.infer<typeof DirectX402RequestSchema>): Promise<string>;
|
|
39
47
|
/**
|
|
40
48
|
* Checks if the action provider supports the given network.
|
|
41
49
|
*
|
|
@@ -43,13 +51,5 @@ export declare class X402ActionProvider extends ActionProvider<EvmWalletProvider
|
|
|
43
51
|
* @returns True if the network is supported, false otherwise
|
|
44
52
|
*/
|
|
45
53
|
supportsNetwork: (network: Network) => boolean;
|
|
46
|
-
/**
|
|
47
|
-
* Helper method to handle HTTP errors consistently.
|
|
48
|
-
*
|
|
49
|
-
* @param error - The axios error to handle
|
|
50
|
-
* @param url - The URL that was being accessed when the error occurred
|
|
51
|
-
* @returns A JSON string containing formatted error details
|
|
52
|
-
*/
|
|
53
|
-
private handleHttpError;
|
|
54
54
|
}
|
|
55
55
|
export declare const x402ActionProvider: () => X402ActionProvider;
|