@coinbase/agentkit 0.10.2 → 0.10.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +89 -10
- package/dist/action-providers/across/acrossActionProvider.js +2 -4
- package/dist/action-providers/across/acrossActionProvider.test.js +10 -5
- package/dist/action-providers/baseAccount/baseAccountActionProvider.js +5 -7
- package/dist/action-providers/cdp/cdpApiActionProvider.js +7 -30
- package/dist/action-providers/cdp/cdpApiActionProvider.test.js +2 -8
- package/dist/action-providers/cdp/faucetUtils.d.ts +38 -0
- package/dist/action-providers/cdp/faucetUtils.js +81 -0
- package/dist/action-providers/clanker/schemas.d.ts +4 -4
- package/dist/action-providers/clanker/utils.d.ts +2 -1
- package/dist/action-providers/clanker/utils.js +2 -2
- 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/index.d.ts +4 -1
- package/dist/action-providers/index.js +4 -1
- package/dist/action-providers/jupiter/jupiterActionProvider.js +2 -2
- package/dist/action-providers/spl/splActionProvider.js +12 -13
- package/dist/action-providers/superfluid/graphQueries/superfluidGraphQueries.js +2 -2
- package/dist/action-providers/sushi/constants.d.ts +35 -0
- package/dist/action-providers/sushi/constants.js +7 -0
- package/dist/action-providers/sushi/index.d.ts +4 -0
- package/dist/action-providers/sushi/index.js +20 -0
- package/dist/action-providers/sushi/sushiDataActionProvider.d.ts +32 -0
- package/dist/action-providers/sushi/sushiDataActionProvider.js +113 -0
- package/dist/action-providers/sushi/sushiDataSchemas.d.ts +11 -0
- package/dist/action-providers/sushi/sushiDataSchemas.js +16 -0
- package/dist/action-providers/sushi/sushiRouterActionProvider.d.ts +40 -0
- package/dist/action-providers/sushi/sushiRouterActionProvider.js +386 -0
- package/dist/action-providers/sushi/sushiRouterActionProvider.test.d.ts +1 -0
- package/dist/action-providers/sushi/sushiRouterActionProvider.test.js +392 -0
- package/dist/action-providers/sushi/sushiRouterSchemas.d.ts +36 -0
- package/dist/action-providers/sushi/sushiRouterSchemas.js +55 -0
- package/dist/action-providers/vaultsfyi/constants.d.ts +8 -12
- package/dist/action-providers/vaultsfyi/constants.js +47 -13
- package/dist/action-providers/vaultsfyi/schemas.d.ts +120 -65
- package/dist/action-providers/vaultsfyi/schemas.js +72 -38
- package/dist/action-providers/vaultsfyi/sdk.d.ts +8 -0
- package/dist/action-providers/vaultsfyi/sdk.js +15 -0
- package/dist/action-providers/vaultsfyi/utils.d.ts +151 -55
- package/dist/action-providers/vaultsfyi/utils.js +29 -75
- package/dist/action-providers/vaultsfyi/vaultsfyiActionProvider.d.ts +55 -16
- package/dist/action-providers/vaultsfyi/vaultsfyiActionProvider.js +413 -217
- package/dist/action-providers/vaultsfyi/vaultsfyiActionProvider.test.js +509 -316
- package/dist/action-providers/wallet/walletActionProvider.js +1 -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/constants.d.ts +67 -0
- package/dist/action-providers/x402/constants.js +37 -0
- package/dist/action-providers/x402/schemas.d.ts +45 -5
- package/dist/action-providers/x402/schemas.js +81 -11
- package/dist/action-providers/x402/utils.d.ts +89 -14
- package/dist/action-providers/x402/utils.js +335 -31
- package/dist/action-providers/x402/x402ActionProvider.d.ts +21 -7
- package/dist/action-providers/x402/x402ActionProvider.js +250 -184
- package/dist/action-providers/x402/x402ActionProvider.test.js +240 -236
- 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/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/action-providers/zora/zoraActionProvider.js +4 -5
- package/dist/wallet-providers/cdpSmartWalletProvider.js +1 -3
- 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/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/package.json +11 -6
- package/dist/action-providers/vaultsfyi/api/actions.d.ts +0 -41
- package/dist/action-providers/vaultsfyi/api/actions.js +0 -28
- package/dist/action-providers/vaultsfyi/api/historicalData.d.ts +0 -31
- package/dist/action-providers/vaultsfyi/api/historicalData.js +0 -44
- package/dist/action-providers/vaultsfyi/api/types.d.ts +0 -34
- package/dist/action-providers/vaultsfyi/api/vaults.d.ts +0 -66
- package/dist/action-providers/vaultsfyi/api/vaults.js +0 -57
- /package/dist/action-providers/{vaultsfyi/api → yelay}/types.js +0 -0
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.ensoActionProvider = exports.EnsoActionProvider = void 0;
|
|
13
|
+
const zod_1 = require("zod");
|
|
14
|
+
const actionProvider_1 = require("../actionProvider");
|
|
15
|
+
const actionDecorator_1 = require("../actionDecorator");
|
|
16
|
+
const schemas_1 = require("./schemas");
|
|
17
|
+
const viem_1 = require("viem");
|
|
18
|
+
const wallet_providers_1 = require("../../wallet-providers");
|
|
19
|
+
const constants_1 = require("./constants");
|
|
20
|
+
const sdk_1 = require("@ensofinance/sdk");
|
|
21
|
+
/**
|
|
22
|
+
* EnsoActionProvider is an action provider for Enso.
|
|
23
|
+
*/
|
|
24
|
+
class EnsoActionProvider extends actionProvider_1.ActionProvider {
|
|
25
|
+
/**
|
|
26
|
+
* Constructor for the EnsoActionProvider
|
|
27
|
+
*
|
|
28
|
+
* @param params - The initialization parameters for the Enso action provider
|
|
29
|
+
*/
|
|
30
|
+
constructor(params = {}) {
|
|
31
|
+
super("enso", []);
|
|
32
|
+
/**
|
|
33
|
+
* Checks if the Enso action provider supports the given network.
|
|
34
|
+
*
|
|
35
|
+
* @param network - The network to check.
|
|
36
|
+
* @returns True if the Enso action provider supports the network, false otherwise.
|
|
37
|
+
*/
|
|
38
|
+
this.supportsNetwork = (network) => {
|
|
39
|
+
const chainIdCheck = network.chainId && constants_1.ENSO_SUPPORTED_NETWORKS.has(Number(network.chainId));
|
|
40
|
+
return Boolean(chainIdCheck);
|
|
41
|
+
};
|
|
42
|
+
this.ensoClient = new sdk_1.EnsoClient({ apiKey: params.apiKey || constants_1.ENSO_API_KEY });
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Finds the optimal route from a token to a token and executes it.
|
|
46
|
+
*
|
|
47
|
+
* @param walletProvider - The wallet to execute the transaction from.
|
|
48
|
+
* @param args - The input arguments for the action.
|
|
49
|
+
* @returns A message containing the token route details.
|
|
50
|
+
*/
|
|
51
|
+
async route(walletProvider, args) {
|
|
52
|
+
try {
|
|
53
|
+
const chainId = Number(walletProvider.getNetwork().chainId);
|
|
54
|
+
if (!chainId || !constants_1.ENSO_SUPPORTED_NETWORKS.has(chainId)) {
|
|
55
|
+
return `Network ${chainId} is not supported by Enso`;
|
|
56
|
+
}
|
|
57
|
+
const fromAddress = (0, viem_1.getAddress)(walletProvider.getAddress());
|
|
58
|
+
const tokenIn = (0, viem_1.getAddress)(args.tokenIn);
|
|
59
|
+
const tokenOut = (0, viem_1.getAddress)(args.tokenOut);
|
|
60
|
+
const tokenInResponse = await this.ensoClient.getTokenData({
|
|
61
|
+
address: tokenIn,
|
|
62
|
+
chainId,
|
|
63
|
+
});
|
|
64
|
+
if (tokenInResponse.data.length !== 1) {
|
|
65
|
+
throw `Could not find data for provided tokenIn`;
|
|
66
|
+
}
|
|
67
|
+
const tokenInData = tokenInResponse.data[0];
|
|
68
|
+
const amountIn = (0, viem_1.parseUnits)(args.amountIn, tokenInData.decimals).toString();
|
|
69
|
+
const params = {
|
|
70
|
+
chainId,
|
|
71
|
+
tokenIn: [tokenIn],
|
|
72
|
+
tokenOut: [tokenOut],
|
|
73
|
+
amountIn: [amountIn],
|
|
74
|
+
routingStrategy: "router",
|
|
75
|
+
fromAddress,
|
|
76
|
+
receiver: fromAddress,
|
|
77
|
+
spender: fromAddress,
|
|
78
|
+
};
|
|
79
|
+
if (args.slippage) {
|
|
80
|
+
params.slippage = args.slippage;
|
|
81
|
+
}
|
|
82
|
+
const routeData = await this.ensoClient.getRouteData(params);
|
|
83
|
+
if (!routeData.tx.data.startsWith(constants_1.ENSO_ROUTE_SINGLE_SIG)) {
|
|
84
|
+
return `Unsupported calldata returned from Enso API`;
|
|
85
|
+
}
|
|
86
|
+
// If the tokenIn is ERC20, do approve
|
|
87
|
+
if (args.tokenIn.toLowerCase() !== constants_1.ENSO_ETH.toLowerCase()) {
|
|
88
|
+
const approval = await this.ensoClient.getApprovalData({
|
|
89
|
+
chainId,
|
|
90
|
+
amount: amountIn,
|
|
91
|
+
fromAddress,
|
|
92
|
+
tokenAddress: (0, viem_1.getAddress)(args.tokenIn),
|
|
93
|
+
});
|
|
94
|
+
const hash = await walletProvider.sendTransaction({
|
|
95
|
+
to: approval.tx.to,
|
|
96
|
+
data: approval.tx.data,
|
|
97
|
+
});
|
|
98
|
+
await walletProvider.waitForTransactionReceipt(hash);
|
|
99
|
+
}
|
|
100
|
+
const hash = await walletProvider.sendTransaction({
|
|
101
|
+
to: routeData.tx.to,
|
|
102
|
+
value: BigInt(routeData.tx.value),
|
|
103
|
+
data: routeData.tx.data,
|
|
104
|
+
});
|
|
105
|
+
await walletProvider.waitForTransactionReceipt(hash);
|
|
106
|
+
return `Route executed successfully, transaction hash: ${hash}`;
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
return `Error routing token through Enso: ${error}`;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
exports.EnsoActionProvider = EnsoActionProvider;
|
|
114
|
+
__decorate([
|
|
115
|
+
(0, actionDecorator_1.CreateAction)({
|
|
116
|
+
name: "route",
|
|
117
|
+
description: `This tool will find the optimal route for entering or exiting any DeFi position or swapping any ERC20 tokens.`,
|
|
118
|
+
schema: schemas_1.EnsoRouteSchema,
|
|
119
|
+
}),
|
|
120
|
+
__metadata("design:type", Function),
|
|
121
|
+
__metadata("design:paramtypes", [wallet_providers_1.EvmWalletProvider, void 0]),
|
|
122
|
+
__metadata("design:returntype", Promise)
|
|
123
|
+
], EnsoActionProvider.prototype, "route", null);
|
|
124
|
+
const ensoActionProvider = () => new EnsoActionProvider();
|
|
125
|
+
exports.ensoActionProvider = ensoActionProvider;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const viem_1 = require("viem");
|
|
4
|
+
const ensoActionProvider_1 = require("./ensoActionProvider");
|
|
5
|
+
const schemas_1 = require("./schemas");
|
|
6
|
+
const MOCK_ADDRESS = "0x1234567890123456789012345678901234543210";
|
|
7
|
+
const ENSO_ROUTER_BASE = "0xF75584eF6673aD213a685a1B58Cc0330B8eA22Cf";
|
|
8
|
+
const WETH = "0x4200000000000000000000000000000000000006";
|
|
9
|
+
const USDC = "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913";
|
|
10
|
+
const mockGetTokenData = jest.fn();
|
|
11
|
+
const mockGetRouteData = jest.fn();
|
|
12
|
+
const mockGetApprovalData = jest.fn();
|
|
13
|
+
jest.mock("@ensofinance/sdk", () => {
|
|
14
|
+
return {
|
|
15
|
+
EnsoClient: jest.fn().mockImplementation(() => {
|
|
16
|
+
return {
|
|
17
|
+
getTokenData: mockGetTokenData,
|
|
18
|
+
getRouteData: mockGetRouteData,
|
|
19
|
+
getApprovalData: mockGetApprovalData,
|
|
20
|
+
};
|
|
21
|
+
}),
|
|
22
|
+
};
|
|
23
|
+
});
|
|
24
|
+
describe("Enso Route Schema", () => {
|
|
25
|
+
it("should successfully parse valid input", () => {
|
|
26
|
+
const validInput = {
|
|
27
|
+
tokenIn: USDC,
|
|
28
|
+
tokenOut: WETH,
|
|
29
|
+
amountIn: "100",
|
|
30
|
+
slippage: 50,
|
|
31
|
+
};
|
|
32
|
+
const result = schemas_1.EnsoRouteSchema.safeParse(validInput);
|
|
33
|
+
expect(result.success).toBe(true);
|
|
34
|
+
expect(result.data).toEqual(validInput);
|
|
35
|
+
});
|
|
36
|
+
it("should fail parsing empty input", () => {
|
|
37
|
+
const emptyInput = {};
|
|
38
|
+
const result = schemas_1.EnsoRouteSchema.safeParse(emptyInput);
|
|
39
|
+
expect(result.success).toBe(false);
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
describe("Enso Route Action", () => {
|
|
43
|
+
let mockWallet;
|
|
44
|
+
const actionProvider = (0, ensoActionProvider_1.ensoActionProvider)();
|
|
45
|
+
const args = {
|
|
46
|
+
tokenIn: USDC,
|
|
47
|
+
tokenOut: WETH,
|
|
48
|
+
amountIn: "100",
|
|
49
|
+
};
|
|
50
|
+
beforeEach(async () => {
|
|
51
|
+
jest.clearAllMocks();
|
|
52
|
+
// Set up default mock responses for EnsoClient methods for successful scenarios
|
|
53
|
+
mockGetTokenData.mockResolvedValue({
|
|
54
|
+
data: [
|
|
55
|
+
{
|
|
56
|
+
address: USDC,
|
|
57
|
+
decimals: 6,
|
|
58
|
+
symbol: "USDC",
|
|
59
|
+
},
|
|
60
|
+
],
|
|
61
|
+
});
|
|
62
|
+
mockGetRouteData.mockResolvedValue({
|
|
63
|
+
tx: {
|
|
64
|
+
to: ENSO_ROUTER_BASE,
|
|
65
|
+
value: "0",
|
|
66
|
+
data: "0xb94c3609000000000000000000000000f75584ef6673ad213a685a1b58cc0330b8ea22cf0000000000000000000000000000000000000000000000000000000005f5e100",
|
|
67
|
+
},
|
|
68
|
+
});
|
|
69
|
+
mockGetApprovalData.mockResolvedValue({
|
|
70
|
+
tx: {
|
|
71
|
+
to: USDC,
|
|
72
|
+
data: "0x095ea7b3000000000000000000000000f75584ef6673ad213a685a1b58cc0330b8ea22cf0000000000000000000000000000000000000000000000000000000005f5e100",
|
|
73
|
+
},
|
|
74
|
+
});
|
|
75
|
+
mockWallet = {
|
|
76
|
+
getAddress: jest.fn().mockReturnValue(MOCK_ADDRESS),
|
|
77
|
+
sendTransaction: jest.fn(),
|
|
78
|
+
waitForTransactionReceipt: jest.fn(),
|
|
79
|
+
getNetwork: jest.fn().mockReturnValue({ chainId: "8453" }),
|
|
80
|
+
};
|
|
81
|
+
});
|
|
82
|
+
it("should successfully respond", async () => {
|
|
83
|
+
const hash = "0x1234567890123456789012345678901234567890";
|
|
84
|
+
mockWallet.sendTransaction.mockResolvedValue(hash);
|
|
85
|
+
const response = await actionProvider.route(mockWallet, args);
|
|
86
|
+
// First transaction should be the approval
|
|
87
|
+
expect(mockWallet.sendTransaction).toHaveBeenNthCalledWith(1, // First call
|
|
88
|
+
expect.objectContaining({
|
|
89
|
+
to: (0, viem_1.getAddress)(args.tokenIn),
|
|
90
|
+
}));
|
|
91
|
+
// Second transaction should be the route execution
|
|
92
|
+
expect(mockWallet.sendTransaction).toHaveBeenNthCalledWith(2, // Second call
|
|
93
|
+
expect.objectContaining({
|
|
94
|
+
to: ENSO_ROUTER_BASE,
|
|
95
|
+
value: BigInt(0),
|
|
96
|
+
}));
|
|
97
|
+
expect(response).toContain(`Route executed successfully, transaction hash: ${hash}`);
|
|
98
|
+
});
|
|
99
|
+
it("should fail with an error", async () => {
|
|
100
|
+
const error = new Error("Failed to route through Enso");
|
|
101
|
+
mockWallet.sendTransaction.mockRejectedValue(error);
|
|
102
|
+
const response = await actionProvider.route(mockWallet, args);
|
|
103
|
+
// First transaction should be the approval
|
|
104
|
+
expect(mockWallet.sendTransaction).toHaveBeenNthCalledWith(1, // First call
|
|
105
|
+
expect.objectContaining({
|
|
106
|
+
to: (0, viem_1.getAddress)(args.tokenIn),
|
|
107
|
+
}));
|
|
108
|
+
expect(response).toContain(`Error routing token through Enso: ${error}`);
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
describe("supportsNetwork", () => {
|
|
112
|
+
const actionProvider = (0, ensoActionProvider_1.ensoActionProvider)();
|
|
113
|
+
it("should return false for base-mainnet (supported only with chainId)", () => {
|
|
114
|
+
const result = actionProvider.supportsNetwork({
|
|
115
|
+
protocolFamily: "evm",
|
|
116
|
+
networkId: "base-mainnet",
|
|
117
|
+
});
|
|
118
|
+
expect(result).toBe(false);
|
|
119
|
+
});
|
|
120
|
+
it("should return true for 8453 (base)", () => {
|
|
121
|
+
const result = actionProvider.supportsNetwork({
|
|
122
|
+
protocolFamily: "evm",
|
|
123
|
+
chainId: "8453",
|
|
124
|
+
});
|
|
125
|
+
expect(result).toBe(true);
|
|
126
|
+
});
|
|
127
|
+
it("should return false for base-sepolia", () => {
|
|
128
|
+
const result = actionProvider.supportsNetwork({
|
|
129
|
+
protocolFamily: "evm",
|
|
130
|
+
networkId: "base-sepolia",
|
|
131
|
+
});
|
|
132
|
+
expect(result).toBe(false);
|
|
133
|
+
});
|
|
134
|
+
it("should return true for 1 (mainnet)", () => {
|
|
135
|
+
const result = actionProvider.supportsNetwork({
|
|
136
|
+
protocolFamily: "evm",
|
|
137
|
+
chainId: "1",
|
|
138
|
+
});
|
|
139
|
+
expect(result).toBe(true);
|
|
140
|
+
});
|
|
141
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./ensoActionProvider";
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./ensoActionProvider"), exports);
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export interface EnsoActionProviderParams {
|
|
3
|
+
apiKey?: string;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Input schema for route action.
|
|
7
|
+
*/
|
|
8
|
+
export declare const EnsoRouteSchema: z.ZodObject<{
|
|
9
|
+
tokenIn: z.ZodString;
|
|
10
|
+
tokenOut: z.ZodString;
|
|
11
|
+
amountIn: z.ZodString;
|
|
12
|
+
slippage: z.ZodOptional<z.ZodNumber>;
|
|
13
|
+
}, "strip", z.ZodTypeAny, {
|
|
14
|
+
tokenIn: string;
|
|
15
|
+
tokenOut: string;
|
|
16
|
+
amountIn: string;
|
|
17
|
+
slippage?: number | undefined;
|
|
18
|
+
}, {
|
|
19
|
+
tokenIn: string;
|
|
20
|
+
tokenOut: string;
|
|
21
|
+
amountIn: string;
|
|
22
|
+
slippage?: number | undefined;
|
|
23
|
+
}>;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EnsoRouteSchema = void 0;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
/**
|
|
6
|
+
* Input schema for route action.
|
|
7
|
+
*/
|
|
8
|
+
exports.EnsoRouteSchema = zod_1.z
|
|
9
|
+
.object({
|
|
10
|
+
tokenIn: zod_1.z
|
|
11
|
+
.string()
|
|
12
|
+
.regex(/^0x[a-fA-F0-9]{40}$/, "Invalid Ethereum address format")
|
|
13
|
+
.describe("Address of the token to swap from. For ETH, use 0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"),
|
|
14
|
+
tokenOut: zod_1.z
|
|
15
|
+
.string()
|
|
16
|
+
.regex(/^0x[a-fA-F0-9]{40}$/, "Invalid Ethereum address format")
|
|
17
|
+
.describe("Address of the token to swap to, For ETH, use 0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"),
|
|
18
|
+
amountIn: zod_1.z.string().describe("Amount of tokenIn to swap in whole units (e.g. 100 USDC)"),
|
|
19
|
+
slippage: zod_1.z.number().optional().describe("Slippage in basis points (1/10000). Default - 50"),
|
|
20
|
+
})
|
|
21
|
+
.strip()
|
|
22
|
+
.describe("Instructions for routing through Enso API");
|
|
@@ -30,8 +30,10 @@ export declare const TOKEN_ADDRESSES_BY_SYMBOLS: {
|
|
|
30
30
|
};
|
|
31
31
|
readonly "arbitrum-mainnet": {
|
|
32
32
|
readonly USDC: "0xaf88d065e77c8cc2239327c5edb3a432268e5831";
|
|
33
|
+
readonly WETH: "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1";
|
|
33
34
|
};
|
|
34
35
|
readonly "optimism-mainnet": {
|
|
35
36
|
readonly USDC: "0x0b2c639c533813f4aa9d7837caf62653d097ff85";
|
|
37
|
+
readonly WETH: "0x4200000000000000000000000000000000000006";
|
|
36
38
|
};
|
|
37
39
|
};
|
|
@@ -43,8 +43,10 @@ exports.TOKEN_ADDRESSES_BY_SYMBOLS = {
|
|
|
43
43
|
},
|
|
44
44
|
"arbitrum-mainnet": {
|
|
45
45
|
USDC: "0xaf88d065e77c8cc2239327c5edb3a432268e5831",
|
|
46
|
+
WETH: "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",
|
|
46
47
|
},
|
|
47
48
|
"optimism-mainnet": {
|
|
48
49
|
USDC: "0x0b2c639c533813f4aa9d7837caf62653d097ff85",
|
|
50
|
+
WETH: "0x4200000000000000000000000000000000000006",
|
|
49
51
|
},
|
|
50
52
|
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { ActionProvider } from "../actionProvider";
|
|
3
3
|
import { Network } from "../../network";
|
|
4
|
-
import { GetBalanceSchema, TransferSchema, GetTokenAddressSchema } from "./schemas";
|
|
4
|
+
import { GetBalanceSchema, TransferSchema, GetTokenAddressSchema, ApproveSchema, AllowanceSchema } from "./schemas";
|
|
5
5
|
import { EvmWalletProvider } from "../../wallet-providers";
|
|
6
6
|
/**
|
|
7
7
|
* ERC20ActionProvider is an action provider for ERC20 tokens.
|
|
@@ -27,6 +27,22 @@ export declare class ERC20ActionProvider extends ActionProvider<EvmWalletProvide
|
|
|
27
27
|
* @returns A message containing the transfer details.
|
|
28
28
|
*/
|
|
29
29
|
transfer(walletProvider: EvmWalletProvider, args: z.infer<typeof TransferSchema>): Promise<string>;
|
|
30
|
+
/**
|
|
31
|
+
* Approves a spender to transfer a specified amount of tokens.
|
|
32
|
+
*
|
|
33
|
+
* @param walletProvider - The wallet provider to approve from.
|
|
34
|
+
* @param args - The input arguments for the action.
|
|
35
|
+
* @returns A message containing the approval details.
|
|
36
|
+
*/
|
|
37
|
+
approve(walletProvider: EvmWalletProvider, args: z.infer<typeof ApproveSchema>): Promise<string>;
|
|
38
|
+
/**
|
|
39
|
+
* Checks the allowance for a spender of an ERC20 token.
|
|
40
|
+
*
|
|
41
|
+
* @param walletProvider - The wallet provider to check the allowance from.
|
|
42
|
+
* @param args - The input arguments containing tokenAddress and spender.
|
|
43
|
+
* @returns A message containing the allowance amount for the spender.
|
|
44
|
+
*/
|
|
45
|
+
getAllowance(walletProvider: EvmWalletProvider, args: z.infer<typeof AllowanceSchema>): Promise<string>;
|
|
30
46
|
/**
|
|
31
47
|
* Gets the contract address for a token symbol on the current network.
|
|
32
48
|
*
|
|
@@ -117,6 +117,66 @@ class ERC20ActionProvider extends actionProvider_1.ActionProvider {
|
|
|
117
117
|
return `Error transferring the asset: ${error}`;
|
|
118
118
|
}
|
|
119
119
|
}
|
|
120
|
+
/**
|
|
121
|
+
* Approves a spender to transfer a specified amount of tokens.
|
|
122
|
+
*
|
|
123
|
+
* @param walletProvider - The wallet provider to approve from.
|
|
124
|
+
* @param args - The input arguments for the action.
|
|
125
|
+
* @returns A message containing the approval details.
|
|
126
|
+
*/
|
|
127
|
+
async approve(walletProvider, args) {
|
|
128
|
+
try {
|
|
129
|
+
// Get token details for better error messages and validation
|
|
130
|
+
const tokenAddress = (0, viem_1.getAddress)(args.tokenAddress);
|
|
131
|
+
const tokenDetails = await (0, utils_1.getTokenDetails)(walletProvider, args.tokenAddress);
|
|
132
|
+
if (!tokenDetails) {
|
|
133
|
+
return `Error: Could not fetch token details for ${args.tokenAddress}. Please verify the token address is correct.`;
|
|
134
|
+
}
|
|
135
|
+
// Convert amount to wei using token decimals
|
|
136
|
+
const amountInWei = (0, viem_1.parseUnits)(String(args.amount), tokenDetails.decimals);
|
|
137
|
+
const hash = await walletProvider.sendTransaction({
|
|
138
|
+
to: tokenAddress,
|
|
139
|
+
data: (0, viem_1.encodeFunctionData)({
|
|
140
|
+
abi: viem_1.erc20Abi,
|
|
141
|
+
functionName: "approve",
|
|
142
|
+
args: [args.spenderAddress, amountInWei],
|
|
143
|
+
}),
|
|
144
|
+
});
|
|
145
|
+
await walletProvider.waitForTransactionReceipt(hash);
|
|
146
|
+
return `Approved ${args.amount} ${tokenDetails.name} (${args.tokenAddress}) for spender ${args.spenderAddress}.\nTransaction hash: ${hash}`;
|
|
147
|
+
}
|
|
148
|
+
catch (error) {
|
|
149
|
+
return `Error approving tokens: ${error}`;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Checks the allowance for a spender of an ERC20 token.
|
|
154
|
+
*
|
|
155
|
+
* @param walletProvider - The wallet provider to check the allowance from.
|
|
156
|
+
* @param args - The input arguments containing tokenAddress and spender.
|
|
157
|
+
* @returns A message containing the allowance amount for the spender.
|
|
158
|
+
*/
|
|
159
|
+
async getAllowance(walletProvider, args) {
|
|
160
|
+
try {
|
|
161
|
+
// Get token details for proper formatting
|
|
162
|
+
const tokenDetails = await (0, utils_1.getTokenDetails)(walletProvider, args.tokenAddress);
|
|
163
|
+
if (!tokenDetails) {
|
|
164
|
+
return `Error: Could not fetch token details for ${args.tokenAddress}. Please verify the token address is correct.`;
|
|
165
|
+
}
|
|
166
|
+
const allowance = await walletProvider.readContract({
|
|
167
|
+
address: args.tokenAddress,
|
|
168
|
+
abi: viem_1.erc20Abi,
|
|
169
|
+
functionName: "allowance",
|
|
170
|
+
args: [walletProvider.getAddress(), args.spenderAddress],
|
|
171
|
+
});
|
|
172
|
+
// Format the allowance using token decimals
|
|
173
|
+
const formattedAllowance = (0, viem_1.formatUnits)(allowance, tokenDetails.decimals);
|
|
174
|
+
return `Allowance for ${args.spenderAddress} to spend ${tokenDetails.name} (${args.tokenAddress}) is ${formattedAllowance} tokens`;
|
|
175
|
+
}
|
|
176
|
+
catch (error) {
|
|
177
|
+
return `Error checking allowance: ${error}`;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
120
180
|
/**
|
|
121
181
|
* Gets the contract address for a token symbol on the current network.
|
|
122
182
|
*
|
|
@@ -166,7 +226,7 @@ __decorate([
|
|
|
166
226
|
It takes the following inputs:
|
|
167
227
|
- amount: The amount to transfer in whole units (e.g. 10.5 USDC)
|
|
168
228
|
- tokenAddress: The contract address of the token to transfer
|
|
169
|
-
- destinationAddress:
|
|
229
|
+
- destinationAddress: The address to send the funds to
|
|
170
230
|
Important notes:
|
|
171
231
|
- Never assume token or destination addresses, they have to be provided as inputs. If only token symbol is provided, use the get_token_address tool to get the token address first
|
|
172
232
|
`,
|
|
@@ -176,6 +236,48 @@ Important notes:
|
|
|
176
236
|
__metadata("design:paramtypes", [wallet_providers_1.EvmWalletProvider, void 0]),
|
|
177
237
|
__metadata("design:returntype", Promise)
|
|
178
238
|
], ERC20ActionProvider.prototype, "transfer", null);
|
|
239
|
+
__decorate([
|
|
240
|
+
(0, actionDecorator_1.CreateAction)({
|
|
241
|
+
name: "approve",
|
|
242
|
+
description: `
|
|
243
|
+
This tool will approve a spender to transfer ERC20 tokens from the wallet.
|
|
244
|
+
|
|
245
|
+
It takes the following inputs:
|
|
246
|
+
- amount: The amount to approve in whole units (e.g. 100 for 100 USDC)
|
|
247
|
+
- tokenAddress: The contract address of the token to approve
|
|
248
|
+
- spenderAddress: The spender address to approve
|
|
249
|
+
|
|
250
|
+
Important notes:
|
|
251
|
+
- This will overwrite any existing allowance
|
|
252
|
+
- To revoke an allowance, set the amount to 0
|
|
253
|
+
- Ensure you trust the spender address before approving
|
|
254
|
+
- Never assume token addresses, they have to be provided as inputs. If only token symbol is provided, use the get_token_address tool to get the token address first
|
|
255
|
+
`,
|
|
256
|
+
schema: schemas_1.ApproveSchema,
|
|
257
|
+
}),
|
|
258
|
+
__metadata("design:type", Function),
|
|
259
|
+
__metadata("design:paramtypes", [wallet_providers_1.EvmWalletProvider, void 0]),
|
|
260
|
+
__metadata("design:returntype", Promise)
|
|
261
|
+
], ERC20ActionProvider.prototype, "approve", null);
|
|
262
|
+
__decorate([
|
|
263
|
+
(0, actionDecorator_1.CreateAction)({
|
|
264
|
+
name: "get_allowance",
|
|
265
|
+
description: `
|
|
266
|
+
This tool will get the allowance amount for a spender of an ERC20 token.
|
|
267
|
+
|
|
268
|
+
It takes the following inputs:
|
|
269
|
+
- tokenAddress: The contract address of the token to check allowance for
|
|
270
|
+
- spenderAddress: The address to check allowance for
|
|
271
|
+
|
|
272
|
+
Important notes:
|
|
273
|
+
- Never assume token addresses, they have to be provided as inputs. If only token symbol is provided, use the get_token_address tool to get the token address first
|
|
274
|
+
`,
|
|
275
|
+
schema: schemas_1.AllowanceSchema,
|
|
276
|
+
}),
|
|
277
|
+
__metadata("design:type", Function),
|
|
278
|
+
__metadata("design:paramtypes", [wallet_providers_1.EvmWalletProvider, void 0]),
|
|
279
|
+
__metadata("design:returntype", Promise)
|
|
280
|
+
], ERC20ActionProvider.prototype, "getAllowance", null);
|
|
179
281
|
__decorate([
|
|
180
282
|
(0, actionDecorator_1.CreateAction)({
|
|
181
283
|
name: "get_erc20_token_address",
|