@coinbase/agentkit 0.1.0

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.
Files changed (148) hide show
  1. package/README.md +305 -0
  2. package/dist/action-providers/actionDecorator.d.ts +69 -0
  3. package/dist/action-providers/actionDecorator.js +96 -0
  4. package/dist/action-providers/actionProvider.d.ts +48 -0
  5. package/dist/action-providers/actionProvider.js +62 -0
  6. package/dist/action-providers/basename/basenameActionProvider.d.ts +30 -0
  7. package/dist/action-providers/basename/basenameActionProvider.js +109 -0
  8. package/dist/action-providers/basename/basenameActionProvider.test.d.ts +1 -0
  9. package/dist/action-providers/basename/basenameActionProvider.test.js +146 -0
  10. package/dist/action-providers/basename/constants.d.ts +52 -0
  11. package/dist/action-providers/basename/constants.js +81 -0
  12. package/dist/action-providers/basename/index.d.ts +2 -0
  13. package/dist/action-providers/basename/index.js +18 -0
  14. package/dist/action-providers/basename/schemas.d.ts +14 -0
  15. package/dist/action-providers/basename/schemas.js +14 -0
  16. package/dist/action-providers/cdp/cdpApiActionProvider.d.ts +41 -0
  17. package/dist/action-providers/cdp/cdpApiActionProvider.js +111 -0
  18. package/dist/action-providers/cdp/cdpApiActionProvider.test.d.ts +1 -0
  19. package/dist/action-providers/cdp/cdpApiActionProvider.test.js +134 -0
  20. package/dist/action-providers/cdp/cdpWalletActionProvider.d.ts +58 -0
  21. package/dist/action-providers/cdp/cdpWalletActionProvider.js +218 -0
  22. package/dist/action-providers/cdp/cdpWalletActionProvider.test.d.ts +1 -0
  23. package/dist/action-providers/cdp/cdpWalletActionProvider.test.js +259 -0
  24. package/dist/action-providers/cdp/constants.d.ts +31 -0
  25. package/dist/action-providers/cdp/constants.js +34 -0
  26. package/dist/action-providers/cdp/index.d.ts +3 -0
  27. package/dist/action-providers/cdp/index.js +19 -0
  28. package/dist/action-providers/cdp/schemas.d.ts +91 -0
  29. package/dist/action-providers/cdp/schemas.js +77 -0
  30. package/dist/action-providers/customActionProvider.d.ts +30 -0
  31. package/dist/action-providers/customActionProvider.js +66 -0
  32. package/dist/action-providers/erc20/constants.d.ts +135 -0
  33. package/dist/action-providers/erc20/constants.js +191 -0
  34. package/dist/action-providers/erc20/erc20ActionProvider.d.ts +38 -0
  35. package/dist/action-providers/erc20/erc20ActionProvider.js +118 -0
  36. package/dist/action-providers/erc20/erc20ActionProvider.test.d.ts +1 -0
  37. package/dist/action-providers/erc20/erc20ActionProvider.test.js +117 -0
  38. package/dist/action-providers/erc20/index.d.ts +1 -0
  39. package/dist/action-providers/erc20/index.js +17 -0
  40. package/dist/action-providers/erc20/schemas.d.ts +27 -0
  41. package/dist/action-providers/erc20/schemas.js +26 -0
  42. package/dist/action-providers/erc721/constants.d.ts +236 -0
  43. package/dist/action-providers/erc721/constants.js +301 -0
  44. package/dist/action-providers/erc721/erc721ActionProvider.d.ts +46 -0
  45. package/dist/action-providers/erc721/erc721ActionProvider.js +164 -0
  46. package/dist/action-providers/erc721/erc721ActionProvider.test.d.ts +1 -0
  47. package/dist/action-providers/erc721/erc721ActionProvider.test.js +137 -0
  48. package/dist/action-providers/erc721/index.d.ts +1 -0
  49. package/dist/action-providers/erc721/index.js +17 -0
  50. package/dist/action-providers/erc721/schemas.d.ts +46 -0
  51. package/dist/action-providers/erc721/schemas.js +44 -0
  52. package/dist/action-providers/farcaster/farcasterActionProvider.d.ts +57 -0
  53. package/dist/action-providers/farcaster/farcasterActionProvider.js +142 -0
  54. package/dist/action-providers/farcaster/farcasterActionProvider.test.d.ts +1 -0
  55. package/dist/action-providers/farcaster/farcasterActionProvider.test.js +143 -0
  56. package/dist/action-providers/farcaster/index.d.ts +2 -0
  57. package/dist/action-providers/farcaster/index.js +18 -0
  58. package/dist/action-providers/farcaster/schemas.d.ts +15 -0
  59. package/dist/action-providers/farcaster/schemas.js +20 -0
  60. package/dist/action-providers/index.d.ts +13 -0
  61. package/dist/action-providers/index.js +29 -0
  62. package/dist/action-providers/morpho/constants.d.ts +16 -0
  63. package/dist/action-providers/morpho/constants.js +27 -0
  64. package/dist/action-providers/morpho/index.d.ts +2 -0
  65. package/dist/action-providers/morpho/index.js +18 -0
  66. package/dist/action-providers/morpho/morphoActionProvider.d.ts +39 -0
  67. package/dist/action-providers/morpho/morphoActionProvider.js +147 -0
  68. package/dist/action-providers/morpho/morphoActionProvider.test.d.ts +1 -0
  69. package/dist/action-providers/morpho/morphoActionProvider.test.js +126 -0
  70. package/dist/action-providers/morpho/schemas.d.ts +36 -0
  71. package/dist/action-providers/morpho/schemas.js +47 -0
  72. package/dist/action-providers/pyth/index.d.ts +2 -0
  73. package/dist/action-providers/pyth/index.js +18 -0
  74. package/dist/action-providers/pyth/pythActionProvider.d.ts +33 -0
  75. package/dist/action-providers/pyth/pythActionProvider.js +121 -0
  76. package/dist/action-providers/pyth/schemas.d.ts +21 -0
  77. package/dist/action-providers/pyth/schemas.js +20 -0
  78. package/dist/action-providers/twitter/index.d.ts +2 -0
  79. package/dist/action-providers/twitter/index.js +18 -0
  80. package/dist/action-providers/twitter/schemas.d.ts +38 -0
  81. package/dist/action-providers/twitter/schemas.js +44 -0
  82. package/dist/action-providers/twitter/twitterActionProvider.d.ts +82 -0
  83. package/dist/action-providers/twitter/twitterActionProvider.js +204 -0
  84. package/dist/action-providers/twitter/twitterActionProvider.test.d.ts +1 -0
  85. package/dist/action-providers/twitter/twitterActionProvider.test.js +185 -0
  86. package/dist/action-providers/wallet/index.d.ts +1 -0
  87. package/dist/action-providers/wallet/index.js +17 -0
  88. package/dist/action-providers/wallet/schemas.d.ts +19 -0
  89. package/dist/action-providers/wallet/schemas.js +19 -0
  90. package/dist/action-providers/wallet/walletActionProvider.d.ts +44 -0
  91. package/dist/action-providers/wallet/walletActionProvider.js +127 -0
  92. package/dist/action-providers/wallet/walletActionProvider.test.d.ts +1 -0
  93. package/dist/action-providers/wallet/walletActionProvider.test.js +116 -0
  94. package/dist/action-providers/weth/constants.d.ts +19 -0
  95. package/dist/action-providers/weth/constants.js +29 -0
  96. package/dist/action-providers/weth/index.d.ts +1 -0
  97. package/dist/action-providers/weth/index.js +17 -0
  98. package/dist/action-providers/weth/schemas.d.ts +8 -0
  99. package/dist/action-providers/weth/schemas.js +10 -0
  100. package/dist/action-providers/weth/wethActionProvider.d.ts +30 -0
  101. package/dist/action-providers/weth/wethActionProvider.js +89 -0
  102. package/dist/action-providers/weth/wethActionProvider.test.d.ts +1 -0
  103. package/dist/action-providers/weth/wethActionProvider.test.js +92 -0
  104. package/dist/action-providers/wow/constants.d.ts +15 -0
  105. package/dist/action-providers/wow/constants.js +844 -0
  106. package/dist/action-providers/wow/index.d.ts +2 -0
  107. package/dist/action-providers/wow/index.js +18 -0
  108. package/dist/action-providers/wow/schemas.d.ts +43 -0
  109. package/dist/action-providers/wow/schemas.js +47 -0
  110. package/dist/action-providers/wow/uniswap/constants.d.ts +3 -0
  111. package/dist/action-providers/wow/uniswap/constants.js +100 -0
  112. package/dist/action-providers/wow/uniswap/utils.d.ts +82 -0
  113. package/dist/action-providers/wow/uniswap/utils.js +226 -0
  114. package/dist/action-providers/wow/utils.d.ts +27 -0
  115. package/dist/action-providers/wow/utils.js +63 -0
  116. package/dist/action-providers/wow/wowActionProvider.d.ts +46 -0
  117. package/dist/action-providers/wow/wowActionProvider.js +223 -0
  118. package/dist/action-providers/wow/wowActionProvider.test.d.ts +1 -0
  119. package/dist/action-providers/wow/wowActionProvider.test.js +287 -0
  120. package/dist/agentkit.d.ts +45 -0
  121. package/dist/agentkit.js +60 -0
  122. package/dist/analytics/index.d.ts +1 -0
  123. package/dist/analytics/index.js +17 -0
  124. package/dist/analytics/sendAnalyticsEvent.d.ts +31 -0
  125. package/dist/analytics/sendAnalyticsEvent.js +51 -0
  126. package/dist/index.d.ts +3 -0
  127. package/dist/index.js +22 -0
  128. package/dist/network/index.d.ts +1 -0
  129. package/dist/network/index.js +17 -0
  130. package/dist/network/network.d.ts +13 -0
  131. package/dist/network/network.js +41 -0
  132. package/dist/network/types.d.ts +17 -0
  133. package/dist/network/types.js +2 -0
  134. package/dist/utils.d.ts +11 -0
  135. package/dist/utils.js +43 -0
  136. package/dist/utils.test.d.ts +1 -0
  137. package/dist/utils.test.js +50 -0
  138. package/dist/wallet-providers/cdpWalletProvider.d.ts +218 -0
  139. package/dist/wallet-providers/cdpWalletProvider.js +362 -0
  140. package/dist/wallet-providers/evmWalletProvider.d.ts +51 -0
  141. package/dist/wallet-providers/evmWalletProvider.js +14 -0
  142. package/dist/wallet-providers/index.d.ts +4 -0
  143. package/dist/wallet-providers/index.js +20 -0
  144. package/dist/wallet-providers/viemWalletProvider.d.ts +89 -0
  145. package/dist/wallet-providers/viemWalletProvider.js +187 -0
  146. package/dist/wallet-providers/walletProvider.d.ts +48 -0
  147. package/dist/wallet-providers/walletProvider.js +41 -0
  148. package/package.json +65 -0
@@ -0,0 +1,223 @@
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.wowActionProvider = exports.WowActionProvider = void 0;
13
+ const zod_1 = require("zod");
14
+ const actionProvider_1 = require("../actionProvider");
15
+ const wallet_providers_1 = require("../../wallet-providers");
16
+ const actionDecorator_1 = require("../actionDecorator");
17
+ const constants_1 = require("./constants");
18
+ const utils_1 = require("./utils");
19
+ const utils_2 = require("./uniswap/utils");
20
+ const viem_1 = require("viem");
21
+ const schemas_1 = require("./schemas");
22
+ /**
23
+ * WowActionProvider is an action provider for Wow protocol interactions.
24
+ */
25
+ class WowActionProvider extends actionProvider_1.ActionProvider {
26
+ /**
27
+ * Constructor for the WowActionProvider class.
28
+ */
29
+ constructor() {
30
+ super("wow", []);
31
+ /**
32
+ * Checks if the Wow action provider supports the given network.
33
+ *
34
+ * @param network - The network to check.
35
+ * @returns True if the Wow action provider supports the network, false otherwise.
36
+ */
37
+ this.supportsNetwork = (network) => network.protocolFamily === "evm" && constants_1.SUPPORTED_NETWORKS.includes(network.networkId);
38
+ }
39
+ /**
40
+ * Buys a Zora Wow ERC20 memecoin with ETH.
41
+ *
42
+ * @param wallet - The wallet to create the token from.
43
+ * @param args - The input arguments for the action.
44
+ * @returns A message containing the token purchase details.
45
+ */
46
+ async buyToken(wallet, args) {
47
+ try {
48
+ const tokenQuote = await (0, utils_1.getBuyQuote)(wallet, args.contractAddress, args.amountEthInWei);
49
+ // Multiply by 99/100 and floor to get 99% of quote as minimum
50
+ const minTokens = BigInt(Math.floor(Number(tokenQuote) * 99)) / BigInt(100);
51
+ const hasGraduated = await (0, utils_2.getHasGraduated)(wallet, args.contractAddress);
52
+ const data = (0, viem_1.encodeFunctionData)({
53
+ abi: constants_1.WOW_ABI,
54
+ functionName: "buy",
55
+ args: [
56
+ wallet.getAddress(),
57
+ wallet.getAddress(),
58
+ "0x0000000000000000000000000000000000000000",
59
+ "",
60
+ hasGraduated ? 1n : 0n,
61
+ minTokens,
62
+ 0n,
63
+ ],
64
+ });
65
+ const txHash = await wallet.sendTransaction({
66
+ to: args.contractAddress,
67
+ data,
68
+ value: BigInt(args.amountEthInWei),
69
+ });
70
+ const receipt = await wallet.waitForTransactionReceipt(txHash);
71
+ return `Purchased WoW ERC20 memecoin with transaction hash: ${txHash}, and receipt:\n${JSON.stringify(receipt)}`;
72
+ }
73
+ catch (error) {
74
+ return `Error buying Zora Wow ERC20 memecoin: ${error}`;
75
+ }
76
+ }
77
+ /**
78
+ * Creates a Zora Wow ERC20 memecoin.
79
+ *
80
+ * @param wallet - The wallet to create the token from.
81
+ * @param args - The input arguments for the action.
82
+ * @returns A message containing the token creation details.
83
+ */
84
+ async createToken(wallet, args) {
85
+ const factoryAddress = (0, constants_1.getFactoryAddress)(wallet.getNetwork().networkId);
86
+ try {
87
+ const data = (0, viem_1.encodeFunctionData)({
88
+ abi: constants_1.WOW_FACTORY_ABI,
89
+ functionName: "deploy",
90
+ args: [
91
+ wallet.getAddress(),
92
+ "0x0000000000000000000000000000000000000000",
93
+ args.tokenUri || constants_1.GENERIC_TOKEN_METADATA_URI,
94
+ args.name,
95
+ args.symbol,
96
+ ],
97
+ });
98
+ const txHash = await wallet.sendTransaction({
99
+ to: factoryAddress,
100
+ data,
101
+ });
102
+ const receipt = await wallet.waitForTransactionReceipt(txHash);
103
+ return `Created WoW ERC20 memecoin ${args.name} with symbol ${args.symbol} on network ${wallet.getNetwork().networkId}.\nTransaction hash for the token creation: ${txHash}, and receipt:\n${JSON.stringify(receipt)}`;
104
+ }
105
+ catch (error) {
106
+ return `Error creating Zora Wow ERC20 memecoin: ${error}`;
107
+ }
108
+ }
109
+ /**
110
+ * Sells WOW tokens for ETH.
111
+ *
112
+ * @param wallet - The wallet to sell the tokens from.
113
+ * @param args - The input arguments for the action.
114
+ * @returns A message confirming the sale with the transaction hash.
115
+ */
116
+ async sellToken(wallet, args) {
117
+ try {
118
+ const ethQuote = await (0, utils_1.getSellQuote)(wallet, args.contractAddress, args.amountTokensInWei);
119
+ const hasGraduated = await (0, utils_2.getHasGraduated)(wallet, args.contractAddress);
120
+ // Multiply by 98/100 and floor to get 98% of quote as minimum
121
+ const minEth = BigInt(Math.floor(Number(ethQuote) * 98)) / BigInt(100);
122
+ const data = (0, viem_1.encodeFunctionData)({
123
+ abi: constants_1.WOW_ABI,
124
+ functionName: "sell",
125
+ args: [
126
+ BigInt(args.amountTokensInWei),
127
+ wallet.getAddress(),
128
+ "0x0000000000000000000000000000000000000000",
129
+ "",
130
+ hasGraduated ? 1n : 0n,
131
+ minEth,
132
+ 0n,
133
+ ],
134
+ });
135
+ const txHash = await wallet.sendTransaction({
136
+ to: args.contractAddress,
137
+ data,
138
+ });
139
+ const receipt = await wallet.waitForTransactionReceipt(txHash);
140
+ return `Sold WoW ERC20 memecoin with transaction hash: ${txHash}, and receipt:\n${JSON.stringify(receipt)}`;
141
+ }
142
+ catch (error) {
143
+ return `Error selling Zora Wow ERC20 memecoin: ${error}`;
144
+ }
145
+ }
146
+ }
147
+ exports.WowActionProvider = WowActionProvider;
148
+ __decorate([
149
+ (0, actionDecorator_1.CreateAction)({
150
+ name: "buy_token",
151
+ description: `
152
+ This tool can only be used to buy a Zora Wow ERC20 memecoin (also can be referred to as a bonding curve token) with ETH.
153
+ Do not use this tool for any other purpose, or trading other assets.
154
+
155
+ Inputs:
156
+ - WOW token contract address
157
+ - Address to receive the tokens
158
+ - Amount of ETH to spend (in wei)
159
+
160
+ Important notes:
161
+ - The amount is a string and cannot have any decimal points, since the unit of measurement is wei.
162
+ - Make sure to use the exact amount provided, and if there's any doubt, check by getting more information before continuing with the action.
163
+ - 1 wei = 0.000000000000000001 ETH
164
+ - Minimum purchase amount is 100000000000000 wei (0.0000001 ETH)
165
+ - Only supported on the following networks:
166
+ - Base Sepolia (ie, 'base-sepolia')
167
+ - Base Mainnet (ie, 'base', 'base-mainnet')`,
168
+ schema: schemas_1.WowBuyTokenInput,
169
+ }),
170
+ __metadata("design:type", Function),
171
+ __metadata("design:paramtypes", [wallet_providers_1.EvmWalletProvider, void 0]),
172
+ __metadata("design:returntype", Promise)
173
+ ], WowActionProvider.prototype, "buyToken", null);
174
+ __decorate([
175
+ (0, actionDecorator_1.CreateAction)({
176
+ name: "create_token",
177
+ description: `
178
+ This tool can only be used to create a Zora Wow ERC20 memecoin (also can be referred to as a bonding curve token) using the WoW factory.
179
+ Do not use this tool for any other purpose, or for creating other types of tokens.
180
+
181
+ Inputs:
182
+ - Token name (e.g. WowCoin)
183
+ - Token symbol (e.g. WOW)
184
+ - Token URI (optional) - Contains metadata about the token
185
+
186
+ Important notes:
187
+ - Uses a bonding curve - no upfront liquidity needed
188
+ - Only supported on the following networks:
189
+ - Base Sepolia (ie, 'base-sepolia')
190
+ - Base Mainnet (ie, 'base', 'base-mainnet')`,
191
+ schema: schemas_1.WowCreateTokenInput,
192
+ }),
193
+ __metadata("design:type", Function),
194
+ __metadata("design:paramtypes", [wallet_providers_1.EvmWalletProvider, void 0]),
195
+ __metadata("design:returntype", Promise)
196
+ ], WowActionProvider.prototype, "createToken", null);
197
+ __decorate([
198
+ (0, actionDecorator_1.CreateAction)({
199
+ name: "sell_token",
200
+ description: `
201
+ This tool can only be used to sell a Zora Wow ERC20 memecoin (also can be referred to as a bonding curve token) for ETH.
202
+ Do not use this tool for any other purpose, or trading other assets.
203
+
204
+ Inputs:
205
+ - WOW token contract address
206
+ - Amount of tokens to sell (in wei)
207
+
208
+ Important notes:
209
+ - The amount is a string and cannot have any decimal points, since the unit of measurement is wei.
210
+ - Make sure to use the exact amount provided, and if there's any doubt, check by getting more information before continuing with the action.
211
+ - 1 wei = 0.000000000000000001 ETH
212
+ - Minimum purchase amount is 100000000000000 wei (0.0000001 ETH)
213
+ - Only supported on the following networks:
214
+ - Base Sepolia (ie, 'base-sepolia')
215
+ - Base Mainnet (ie, 'base', 'base-mainnet')`,
216
+ schema: schemas_1.WowSellTokenInput,
217
+ }),
218
+ __metadata("design:type", Function),
219
+ __metadata("design:paramtypes", [wallet_providers_1.EvmWalletProvider, void 0]),
220
+ __metadata("design:returntype", Promise)
221
+ ], WowActionProvider.prototype, "sellToken", null);
222
+ const wowActionProvider = () => new WowActionProvider();
223
+ exports.wowActionProvider = wowActionProvider;
@@ -0,0 +1,287 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const viem_1 = require("viem");
4
+ const wowActionProvider_1 = require("./wowActionProvider");
5
+ const constants_1 = require("./constants");
6
+ const utils_1 = require("./utils");
7
+ const utils_2 = require("./uniswap/utils");
8
+ const schemas_1 = require("./schemas");
9
+ jest.mock("./utils", () => ({
10
+ getBuyQuote: jest.fn(),
11
+ getSellQuote: jest.fn(),
12
+ }));
13
+ jest.mock("./uniswap/utils", () => ({
14
+ getHasGraduated: jest.fn(),
15
+ }));
16
+ describe("WowActionProvider", () => {
17
+ const MOCK_CONTRACT_ADDRESS = "0x1234567890123456789012345678901234567890";
18
+ const INVALID_ADDRESS = "0xinvalid";
19
+ const MOCK_AMOUNT_ETH_IN_WEI = BigInt("100000000000000000");
20
+ const INVALID_WEI = "1.5"; // Wei amounts can't have decimals
21
+ const MOCK_AMOUNT_TOKENS_IN_WEI = BigInt("1000000000000000000");
22
+ const MOCK_NAME = "Test Token";
23
+ const MOCK_SYMBOL = "TEST";
24
+ const MOCK_URI = "ipfs://QmY1GqprFYvojCcUEKgqHeDj9uhZD9jmYGrQTfA9vAE78J";
25
+ const INVALID_URI = "not-a-url";
26
+ const MOCK_TX_HASH = "0xabcdef1234567890";
27
+ const MOCK_ADDRESS = "0x9876543210987654321098765432109876543210";
28
+ let provider;
29
+ let mockWallet;
30
+ beforeEach(() => {
31
+ mockWallet = {
32
+ getAddress: jest.fn().mockReturnValue(MOCK_ADDRESS),
33
+ getNetwork: jest.fn().mockReturnValue({ protocolFamily: "evm", networkId: "base-sepolia" }),
34
+ sendTransaction: jest.fn().mockResolvedValue(MOCK_TX_HASH),
35
+ waitForTransactionReceipt: jest.fn().mockResolvedValue({}),
36
+ readContract: jest.fn(),
37
+ };
38
+ provider = new wowActionProvider_1.WowActionProvider();
39
+ utils_1.getBuyQuote.mockResolvedValue("1000000000000000000");
40
+ utils_1.getSellQuote.mockResolvedValue("1000000000000000000");
41
+ utils_2.getHasGraduated.mockResolvedValue(true);
42
+ });
43
+ describe("Input Validation", () => {
44
+ describe("buyToken", () => {
45
+ it("should validate Ethereum addresses", () => {
46
+ const result = schemas_1.WowBuyTokenInput.safeParse({
47
+ contractAddress: INVALID_ADDRESS,
48
+ amountEthInWei: MOCK_AMOUNT_ETH_IN_WEI.toString(),
49
+ });
50
+ expect(result.success).toBe(false);
51
+ if (!result.success) {
52
+ expect(result.error.issues[0].message).toContain("Invalid address");
53
+ }
54
+ });
55
+ it("should validate wei amount format", () => {
56
+ const result = schemas_1.WowBuyTokenInput.safeParse({
57
+ contractAddress: MOCK_CONTRACT_ADDRESS,
58
+ amountEthInWei: INVALID_WEI,
59
+ });
60
+ expect(result.success).toBe(false);
61
+ if (!result.success) {
62
+ expect(result.error.issues[0].message).toBe("Must be a valid wei amount");
63
+ }
64
+ });
65
+ it("should accept valid input", () => {
66
+ const result = schemas_1.WowBuyTokenInput.safeParse({
67
+ contractAddress: MOCK_CONTRACT_ADDRESS,
68
+ amountEthInWei: MOCK_AMOUNT_ETH_IN_WEI.toString(),
69
+ });
70
+ expect(result.success).toBe(true);
71
+ });
72
+ });
73
+ describe("createToken", () => {
74
+ it("should require non-empty name", () => {
75
+ const result = schemas_1.WowCreateTokenInput.safeParse({
76
+ name: "",
77
+ symbol: MOCK_SYMBOL,
78
+ });
79
+ expect(result.success).toBe(false);
80
+ if (!result.success) {
81
+ expect(result.error.issues[0].code).toBe("too_small");
82
+ }
83
+ });
84
+ it("should require non-empty symbol", () => {
85
+ const result = schemas_1.WowCreateTokenInput.safeParse({
86
+ name: MOCK_NAME,
87
+ symbol: "",
88
+ });
89
+ expect(result.success).toBe(false);
90
+ if (!result.success) {
91
+ expect(result.error.issues[0].code).toBe("too_small");
92
+ }
93
+ });
94
+ it("should validate tokenUri format if provided", () => {
95
+ const result = schemas_1.WowCreateTokenInput.safeParse({
96
+ name: MOCK_NAME,
97
+ symbol: MOCK_SYMBOL,
98
+ tokenUri: INVALID_URI,
99
+ });
100
+ expect(result.success).toBe(false);
101
+ if (!result.success) {
102
+ expect(result.error.issues[0].code).toBe("invalid_string");
103
+ }
104
+ });
105
+ it("should accept valid input with proper URL", () => {
106
+ const result = schemas_1.WowCreateTokenInput.safeParse({
107
+ name: MOCK_NAME,
108
+ symbol: MOCK_SYMBOL,
109
+ tokenUri: MOCK_URI,
110
+ });
111
+ expect(result.success).toBe(true);
112
+ });
113
+ });
114
+ describe("sellToken", () => {
115
+ it("should validate Ethereum addresses", () => {
116
+ const result = schemas_1.WowSellTokenInput.safeParse({
117
+ contractAddress: INVALID_ADDRESS,
118
+ amountTokensInWei: MOCK_AMOUNT_TOKENS_IN_WEI.toString(),
119
+ });
120
+ expect(result.success).toBe(false);
121
+ if (!result.success) {
122
+ expect(result.error.issues[0].message).toContain("Invalid address");
123
+ }
124
+ });
125
+ it("should validate wei amount format", () => {
126
+ const result = schemas_1.WowSellTokenInput.safeParse({
127
+ contractAddress: MOCK_CONTRACT_ADDRESS,
128
+ amountTokensInWei: INVALID_WEI,
129
+ });
130
+ expect(result.success).toBe(false);
131
+ if (!result.success) {
132
+ expect(result.error.issues[0].message).toBe("Must be a valid wei amount");
133
+ }
134
+ });
135
+ it("should accept valid input", () => {
136
+ const result = schemas_1.WowSellTokenInput.safeParse({
137
+ contractAddress: MOCK_CONTRACT_ADDRESS,
138
+ amountTokensInWei: MOCK_AMOUNT_TOKENS_IN_WEI.toString(),
139
+ });
140
+ expect(result.success).toBe(true);
141
+ });
142
+ });
143
+ });
144
+ describe("supportsNetwork", () => {
145
+ it("should return true for supported networks", () => {
146
+ expect(provider.supportsNetwork({ protocolFamily: "evm", networkId: "base-mainnet" })).toBe(true);
147
+ });
148
+ it("should return false for unsupported networks", () => {
149
+ expect(provider.supportsNetwork({ protocolFamily: "evm", networkId: "base-sepolia" })).toBe(false);
150
+ expect(provider.supportsNetwork({ protocolFamily: "evm", networkId: "ethereum" })).toBe(false);
151
+ expect(provider.supportsNetwork({ protocolFamily: "bitcoin", networkId: "base-mainnet" })).toBe(false);
152
+ });
153
+ });
154
+ describe("buyToken", () => {
155
+ it("should successfully buy tokens", async () => {
156
+ const args = {
157
+ contractAddress: MOCK_CONTRACT_ADDRESS,
158
+ amountEthInWei: MOCK_AMOUNT_ETH_IN_WEI.toString(),
159
+ };
160
+ const response = await provider.buyToken(mockWallet, args);
161
+ expect(mockWallet.sendTransaction).toHaveBeenCalledWith({
162
+ to: MOCK_CONTRACT_ADDRESS,
163
+ data: (0, viem_1.encodeFunctionData)({
164
+ abi: constants_1.WOW_ABI,
165
+ functionName: "buy",
166
+ args: [
167
+ MOCK_ADDRESS,
168
+ MOCK_ADDRESS,
169
+ "0x0000000000000000000000000000000000000000",
170
+ "",
171
+ 1n,
172
+ BigInt(Math.floor(Number("1000000000000000000") * 99)) / BigInt(100),
173
+ 0n,
174
+ ],
175
+ }),
176
+ value: MOCK_AMOUNT_ETH_IN_WEI,
177
+ });
178
+ expect(response).toContain("Purchased WoW ERC20 memecoin");
179
+ expect(response).toContain(MOCK_TX_HASH);
180
+ });
181
+ it("should handle buy errors", async () => {
182
+ const args = {
183
+ contractAddress: MOCK_CONTRACT_ADDRESS,
184
+ amountEthInWei: MOCK_AMOUNT_ETH_IN_WEI.toString(),
185
+ };
186
+ const error = new Error("Buy failed");
187
+ mockWallet.sendTransaction.mockRejectedValue(error);
188
+ const response = await provider.buyToken(mockWallet, args);
189
+ expect(response).toContain(`Error buying Zora Wow ERC20 memecoin: ${error}`);
190
+ });
191
+ });
192
+ describe("createToken", () => {
193
+ it("should successfully create a token", async () => {
194
+ const args = {
195
+ name: MOCK_NAME,
196
+ symbol: MOCK_SYMBOL,
197
+ tokenUri: MOCK_URI,
198
+ };
199
+ const response = await provider.createToken(mockWallet, args);
200
+ expect(mockWallet.sendTransaction).toHaveBeenCalledWith({
201
+ to: expect.any(String),
202
+ data: (0, viem_1.encodeFunctionData)({
203
+ abi: constants_1.WOW_FACTORY_ABI,
204
+ functionName: "deploy",
205
+ args: [
206
+ MOCK_ADDRESS,
207
+ "0x0000000000000000000000000000000000000000",
208
+ MOCK_URI,
209
+ MOCK_NAME,
210
+ MOCK_SYMBOL,
211
+ ],
212
+ }),
213
+ });
214
+ expect(response).toContain(`Created WoW ERC20 memecoin ${MOCK_NAME}`);
215
+ expect(response).toContain(`with symbol ${MOCK_SYMBOL}`);
216
+ expect(response).toContain(MOCK_TX_HASH);
217
+ });
218
+ it("should use default token URI if not provided", async () => {
219
+ const args = {
220
+ name: MOCK_NAME,
221
+ symbol: MOCK_SYMBOL,
222
+ };
223
+ await provider.createToken(mockWallet, args);
224
+ expect(mockWallet.sendTransaction).toHaveBeenCalledWith({
225
+ to: expect.any(String),
226
+ data: (0, viem_1.encodeFunctionData)({
227
+ abi: constants_1.WOW_FACTORY_ABI,
228
+ functionName: "deploy",
229
+ args: [
230
+ MOCK_ADDRESS,
231
+ "0x0000000000000000000000000000000000000000",
232
+ constants_1.GENERIC_TOKEN_METADATA_URI,
233
+ MOCK_NAME,
234
+ MOCK_SYMBOL,
235
+ ],
236
+ }),
237
+ });
238
+ });
239
+ it("should handle create errors", async () => {
240
+ const args = {
241
+ name: MOCK_NAME,
242
+ symbol: MOCK_SYMBOL,
243
+ };
244
+ const error = new Error("Create failed");
245
+ mockWallet.sendTransaction.mockRejectedValue(error);
246
+ const response = await provider.createToken(mockWallet, args);
247
+ expect(response).toContain(`Error creating Zora Wow ERC20 memecoin: ${error}`);
248
+ });
249
+ });
250
+ describe("sellToken", () => {
251
+ it("should successfully sell tokens", async () => {
252
+ const args = {
253
+ contractAddress: MOCK_CONTRACT_ADDRESS,
254
+ amountTokensInWei: MOCK_AMOUNT_TOKENS_IN_WEI.toString(),
255
+ };
256
+ const response = await provider.sellToken(mockWallet, args);
257
+ expect(mockWallet.sendTransaction).toHaveBeenCalledWith({
258
+ to: MOCK_CONTRACT_ADDRESS,
259
+ data: (0, viem_1.encodeFunctionData)({
260
+ abi: constants_1.WOW_ABI,
261
+ functionName: "sell",
262
+ args: [
263
+ MOCK_AMOUNT_TOKENS_IN_WEI,
264
+ MOCK_ADDRESS,
265
+ "0x0000000000000000000000000000000000000000",
266
+ "",
267
+ 1n,
268
+ BigInt(Math.floor(Number("1000000000000000000") * 98)) / BigInt(100),
269
+ 0n,
270
+ ],
271
+ }),
272
+ });
273
+ expect(response).toContain("Sold WoW ERC20 memecoin");
274
+ expect(response).toContain(MOCK_TX_HASH);
275
+ });
276
+ it("should handle sell errors", async () => {
277
+ const args = {
278
+ contractAddress: MOCK_CONTRACT_ADDRESS,
279
+ amountTokensInWei: MOCK_AMOUNT_TOKENS_IN_WEI.toString(),
280
+ };
281
+ const error = new Error("Sell failed");
282
+ mockWallet.sendTransaction.mockRejectedValue(error);
283
+ const response = await provider.sellToken(mockWallet, args);
284
+ expect(response).toContain(`Error selling Zora Wow ERC20 memecoin: ${error}`);
285
+ });
286
+ });
287
+ });
@@ -0,0 +1,45 @@
1
+ import { WalletProvider } from "./wallet-providers";
2
+ import { Action, ActionProvider } from "./action-providers";
3
+ /**
4
+ * Configuration options for AgentKit
5
+ */
6
+ type AgentKitOptions = {
7
+ cdpApiKeyName?: string;
8
+ cdpApiKeyPrivateKey?: string;
9
+ walletProvider?: WalletProvider;
10
+ actionProviders?: ActionProvider[];
11
+ };
12
+ /**
13
+ * AgentKit
14
+ */
15
+ export declare class AgentKit {
16
+ private walletProvider;
17
+ private actionProviders;
18
+ /**
19
+ * Initializes a new AgentKit instance
20
+ *
21
+ * @param config - Configuration options for the AgentKit
22
+ * @param config.walletProvider - The wallet provider to use
23
+ * @param config.actionProviders - The action providers to use
24
+ * @param config.actions - The actions to use
25
+ */
26
+ private constructor();
27
+ /**
28
+ * Initializes a new AgentKit instance
29
+ *
30
+ * @param config - Configuration options for the AgentKit
31
+ * @param config.walletProvider - The wallet provider to use
32
+ * @param config.actionProviders - The action providers to use
33
+ * @param config.actions - The actions to use
34
+ *
35
+ * @returns A new AgentKit instance
36
+ */
37
+ static from(config?: AgentKitOptions): Promise<AgentKit>;
38
+ /**
39
+ * Returns the actions available to the AgentKit.
40
+ *
41
+ * @returns An array of actions
42
+ */
43
+ getActions(): Action[];
44
+ }
45
+ export {};
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AgentKit = void 0;
4
+ const wallet_providers_1 = require("./wallet-providers");
5
+ const action_providers_1 = require("./action-providers");
6
+ /**
7
+ * AgentKit
8
+ */
9
+ class AgentKit {
10
+ /**
11
+ * Initializes a new AgentKit instance
12
+ *
13
+ * @param config - Configuration options for the AgentKit
14
+ * @param config.walletProvider - The wallet provider to use
15
+ * @param config.actionProviders - The action providers to use
16
+ * @param config.actions - The actions to use
17
+ */
18
+ constructor(config) {
19
+ this.walletProvider = config.walletProvider;
20
+ this.actionProviders = config.actionProviders || [(0, action_providers_1.walletActionProvider)()];
21
+ }
22
+ /**
23
+ * Initializes a new AgentKit instance
24
+ *
25
+ * @param config - Configuration options for the AgentKit
26
+ * @param config.walletProvider - The wallet provider to use
27
+ * @param config.actionProviders - The action providers to use
28
+ * @param config.actions - The actions to use
29
+ *
30
+ * @returns A new AgentKit instance
31
+ */
32
+ static async from(config = { actionProviders: [(0, action_providers_1.walletActionProvider)()] }) {
33
+ let walletProvider = config.walletProvider;
34
+ if (!config.walletProvider) {
35
+ if (!config.cdpApiKeyName || !config.cdpApiKeyPrivateKey) {
36
+ throw new Error("cdpApiKeyName and cdpApiKeyPrivateKey are required if not providing a walletProvider");
37
+ }
38
+ walletProvider = await wallet_providers_1.CdpWalletProvider.configureWithWallet({
39
+ apiKeyName: config.cdpApiKeyName,
40
+ apiKeyPrivateKey: config.cdpApiKeyPrivateKey,
41
+ });
42
+ }
43
+ return new AgentKit({ ...config, walletProvider: walletProvider });
44
+ }
45
+ /**
46
+ * Returns the actions available to the AgentKit.
47
+ *
48
+ * @returns An array of actions
49
+ */
50
+ getActions() {
51
+ const actions = [];
52
+ for (const actionProvider of this.actionProviders) {
53
+ if (actionProvider.supportsNetwork(this.walletProvider.getNetwork())) {
54
+ actions.push(...actionProvider.getActions(this.walletProvider));
55
+ }
56
+ }
57
+ return actions;
58
+ }
59
+ }
60
+ exports.AgentKit = AgentKit;
@@ -0,0 +1 @@
1
+ export * from "./sendAnalyticsEvent";
@@ -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("./sendAnalyticsEvent"), exports);
@@ -0,0 +1,31 @@
1
+ /**
2
+ * The required data for an analytics event
3
+ *
4
+ * Accepts arbitrary additional fields
5
+ */
6
+ type RequiredEventData = {
7
+ /**
8
+ * The event that took place, e.g. initialize_wallet_provider, agent_action_invocation
9
+ */
10
+ action: string;
11
+ /**
12
+ * The component that the event took place in, e.g. wallet_provider, agent_action
13
+ */
14
+ component: string;
15
+ /**
16
+ * The name of the event. This should match the name in AEC
17
+ */
18
+ name: string;
19
+ /**
20
+ * The timestamp of the event. If not provided, the current time will be used.
21
+ */
22
+ timestamp?: number;
23
+ } & Record<string, string | undefined>;
24
+ /**
25
+ * Sends an analytics event to the default endpoint
26
+ *
27
+ * @param event - The event data containing required action, component and name fields
28
+ * @returns Promise that resolves when the event is sent
29
+ */
30
+ export declare function sendAnalyticsEvent(event: RequiredEventData): Promise<void>;
31
+ export {};