create-message-kit 1.2.19 → 1.2.21

Sign up to get free protection for your applications and to get access to all the features.
package/index.js CHANGED
@@ -7,7 +7,7 @@ import { default as fs } from "fs-extra";
7
7
  import { isCancel } from "@clack/prompts";
8
8
  import { detect } from "detect-package-manager";
9
9
  import pc from "picocolors";
10
- const defVersion = "1.2.19";
10
+ const defVersion = "1.2.21";
11
11
  const __dirname = dirname(fileURLToPath(import.meta.url));
12
12
 
13
13
  // Read package.json to get the version
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-message-kit",
3
- "version": "1.2.19",
3
+ "version": "1.2.21",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "main": "index.js",
@@ -5,7 +5,7 @@ import { LearnWeb3Client, Network } from "../plugins/learnweb3.js";
5
5
 
6
6
  export const registerSkill: Skill[] = [
7
7
  {
8
- skill: "/drip [network] [address]",
8
+ skill: "drip",
9
9
  handler: handler,
10
10
  examples: [
11
11
  "/drip base_sepolia 0x123456789",
@@ -4,7 +4,7 @@ import { baseUrl } from "../index.js";
4
4
 
5
5
  export const registerSkill: Skill[] = [
6
6
  {
7
- skill: "/mint [collection] [token_id] [url]",
7
+ skill: "mint",
8
8
  examples: [
9
9
  "/mint 0x73a333cb82862d4f66f0154229755b184fb4f5b0 1",
10
10
  "/mint https://zora.co/collect/base/0x123456789/1...",
@@ -3,7 +3,7 @@ import type { Skill } from "@xmtp/message-kit";
3
3
 
4
4
  export const registerSkill: Skill[] = [
5
5
  {
6
- skill: "/pay [amount] [token] [username]",
6
+ skill: "pay",
7
7
  examples: ["/pay 10 vitalik.eth"],
8
8
  description:
9
9
  "Send a specified amount of a cryptocurrency to a destination address.",
@@ -4,7 +4,7 @@ import { baseUrl } from "../index.js";
4
4
 
5
5
  export const registerSkill: Skill[] = [
6
6
  {
7
- skill: "/swap [amount] [token_from] [token_to]",
7
+ skill: "swap",
8
8
  examples: ["/swap 10 usdc eth", "/swap 1 dai usdc"],
9
9
  handler: handler,
10
10
  description: "Exchange one type of cryptocurrency for another.",
@@ -39,7 +39,7 @@ export async function handler(context: XMTPContext) {
39
39
 
40
40
  if (!amount || !token_from || !token_to) {
41
41
  context.reply(
42
- "Missing required parameters. Please provide amount, token_from, and token_to."
42
+ "Missing required parameters. Please provide amount, token_from, and token_to.",
43
43
  );
44
44
  return;
45
45
  }
@@ -26,7 +26,7 @@ export const faucet: Skill[] = [
26
26
  },
27
27
  },
28
28
  {
29
- skill: "/networks",
29
+ skill: "networks",
30
30
  handler: handleFaucet,
31
31
  examples: ["/networks"],
32
32
  description: "Get the list of supported networks.",
@@ -2,6 +2,5 @@ KEY= # the private key of the wallet
2
2
  TEST_ENCRYPTION_KEY= # a different private key for encryption
3
3
  OPENAI_API_KEY= # the API key for OpenAI
4
4
  REDIS_CONNECTION_STRING= # the connection to the toss database in Redis
5
- COINBASE_API_REDIS_URL= # the API key for OpenAI
6
5
  COINBASE_API_KEY_NAME= # the API key name for Coinbase
7
6
  COINBASE_API_KEY_PRIVATE_KEY= # the private key for Coinbase
@@ -9,8 +9,7 @@ import {
9
9
  import { systemPrompt } from "./prompt.js";
10
10
  import { toss } from "./skills/toss.js";
11
11
  import fs from "fs";
12
- import { getWalletService } from "./plugins/redis.js";
13
- const walletServiceDB = await getWalletService();
12
+
14
13
  export const agent: Agent = {
15
14
  name: "Toss Bot",
16
15
  tag: "@toss",
@@ -29,5 +28,5 @@ run(
29
28
  fs.writeFileSync("example_prompt.md", prompt);
30
29
  await agentReply(context, prompt);
31
30
  },
32
- { agent, walletServiceDB },
31
+ { agent },
33
32
  );
@@ -1,12 +1,10 @@
1
1
  import { XMTPContext } from "@xmtp/message-kit";
2
2
  import { getRedisClient } from "./redis.js";
3
3
 
4
- const tossDBClient = await getRedisClient();
5
4
  interface Participant {
6
5
  response: string;
7
6
  name: string;
8
7
  address: string;
9
- agent_address: string;
10
8
  }
11
9
  export interface TossData {
12
10
  group_id: string;
@@ -18,9 +16,7 @@ export interface TossData {
18
16
  created_at: string;
19
17
  end_time: string;
20
18
  description: string;
21
- encrypted_participants: string[];
22
- participants?: Participant[];
23
- toss_wallet_address: string;
19
+ participants: Participant[];
24
20
  }
25
21
  export async function checkTossCorrect(
26
22
  context: XMTPContext,
@@ -29,9 +25,9 @@ export async function checkTossCorrect(
29
25
  message: {
30
26
  content: { previousMsg },
31
27
  },
32
- walletService,
33
28
  group,
34
29
  } = context;
30
+
35
31
  if (!group) {
36
32
  await context.reply("This command can only be used in a group.");
37
33
  return undefined;
@@ -47,15 +43,14 @@ export async function checkTossCorrect(
47
43
  );
48
44
  return undefined;
49
45
  }
50
- let encryptedKey = walletService.encrypt(toss_id);
51
- const tossDataString = await tossDBClient.get(`toss:${encryptedKey}`);
52
- const hexString = tossDataString?.replace(/"/g, "");
53
- let tossData = hexString ? walletService.decrypt(hexString) : null;
46
+ const tossDBClient = await getRedisClient();
47
+ const tossDataString = await tossDBClient.get(`toss:${toss_id}`);
48
+ let tossData = tossDataString ? JSON.parse(tossDataString) : null;
54
49
 
55
50
  if (typeof tossData === "string") {
56
51
  tossData = JSON.parse(tossData) as TossData;
57
52
  }
58
- console.log("tossData", tossData);
53
+
59
54
  if (!tossData) {
60
55
  await context.reply("Toss not found");
61
56
  return undefined;
@@ -66,14 +61,8 @@ export async function checkTossCorrect(
66
61
  await context.reply("This toss is not in this group.");
67
62
  return undefined;
68
63
  }
69
- tossData.participants = [];
70
- if (tossData.encrypted_participants?.length) {
71
- tossData.participants = tossData.encrypted_participants?.map((p: string) =>
72
- walletService.decrypt(p),
73
- );
74
- }
75
- const pool = tossData.amount * (tossData?.participants?.length || 0);
76
- return { ...tossData, toss_id, pool };
64
+
65
+ return { ...tossData, toss_id };
77
66
  }
78
67
 
79
68
  export function extractTossId(message: string): string | null {
@@ -1,18 +1,7 @@
1
1
  import { createClient } from "@redis/client";
2
- import type { RedisClientType } from "@redis/client";
3
-
4
- let redisClient: RedisClientType | null = null;
2
+ import { RedisClientType } from "@redis/client";
5
3
 
6
4
  export const getRedisClient = async () => {
7
- if (redisClient?.isOpen) {
8
- return redisClient;
9
- }
10
-
11
- if (!process.env.REDIS_CONNECTION_STRING) {
12
- throw new Error(
13
- "REDIS_CONNECTION_STRING not found in environment variables",
14
- );
15
- }
16
5
  const client = createClient({
17
6
  url: process.env.REDIS_CONNECTION_STRING,
18
7
  });
@@ -22,57 +11,5 @@ export const getRedisClient = async () => {
22
11
  });
23
12
 
24
13
  await client.connect();
25
- redisClient = client as RedisClientType;
26
- return client as RedisClientType;
27
- };
28
-
29
- let walletService: RedisClientType | null = null;
30
-
31
- export const getWalletService = async (): Promise<RedisClientType> => {
32
- if (walletService?.isOpen) {
33
- return walletService;
34
- }
35
-
36
- if (!process.env.COINBASE_API_REDIS_URL) {
37
- throw new Error(
38
- "COINBASE_API_REDIS_URL not found in environment variables",
39
- );
40
- }
41
-
42
- const client = createClient({
43
- url: process.env.COINBASE_API_REDIS_URL,
44
- });
45
-
46
- client.on("error", (error: Error) => {
47
- console.error("Toss wallet Redis client error:", error);
48
- });
49
-
50
- client.on("connect", () => {
51
- console.log("Connected to Toss Wallet Redis");
52
- });
53
- await client.connect();
54
- walletService = client as RedisClientType;
55
14
  return client as RedisClientType;
56
15
  };
57
-
58
- export async function updateField(
59
- client: RedisClientType,
60
- key: string,
61
- updateObject: any,
62
- ) {
63
- // Check if the key exists
64
- const data = await client.get(key);
65
-
66
- let updatedData;
67
- if (data) {
68
- // If the key exists, parse it and merge the updates
69
- const parsedData = JSON.parse(data);
70
- updatedData = { ...parsedData, ...updateObject };
71
- } else {
72
- // If the key doesn't exist, use the updateObject as the initial value
73
- updatedData = updateObject;
74
- }
75
-
76
- // Save the updated or new data back to Redis
77
- await client.set(key, JSON.stringify(updatedData));
78
- }
@@ -1,5 +1,4 @@
1
1
  import { Skill, XMTPContext, getUserInfo } from "@xmtp/message-kit";
2
- import { TimeoutError } from "@coinbase/coinbase-sdk";
3
2
  import { getRedisClient } from "../plugins/redis.js";
4
3
  import {
5
4
  checkTossCorrect,
@@ -11,11 +10,9 @@ import {
11
10
  DM_HELP_MESSAGE,
12
11
  } from "../plugins/helpers.js";
13
12
 
14
- const tossDBClient = await getRedisClient();
15
-
16
13
  export const toss: Skill[] = [
17
14
  {
18
- skill: "/end [option]",
15
+ skill: "end",
19
16
  description: "End a toss.",
20
17
  handler: handleEndToss,
21
18
  examples: ["/end yes", "/end no"],
@@ -26,14 +23,13 @@ export const toss: Skill[] = [
26
23
  },
27
24
  },
28
25
  {
29
- skill: "/create",
26
+ skill: "create",
30
27
  description: "Create an agent wallet.",
31
28
  handler: handleDM,
32
29
  examples: ["/create"],
33
- params: {},
34
30
  },
35
31
  {
36
- skill: "/fund [amount]",
32
+ skill: "fund",
37
33
  description: "Fund your account.",
38
34
  handler: handleDM,
39
35
  examples: ["/fund 10"],
@@ -44,7 +40,7 @@ export const toss: Skill[] = [
44
40
  },
45
41
  },
46
42
  {
47
- skill: "/withdraw [amount]",
43
+ skill: "withdraw",
48
44
  description: "Withdraw funds from your account.",
49
45
  handler: handleDM,
50
46
  examples: ["/withdraw 10"],
@@ -55,28 +51,25 @@ export const toss: Skill[] = [
55
51
  },
56
52
  },
57
53
  {
58
- skill: "/help",
54
+ skill: "help",
59
55
  description: "Get help with tossing.",
60
56
  handler: handleDM,
61
57
  examples: ["/help"],
62
- params: {},
63
58
  },
64
59
  {
65
- skill: "/cancel",
60
+ skill: "cancel",
66
61
  description: "Cancel a toss.",
67
62
  handler: handleCancelToss,
68
63
  examples: ["/cancel"],
69
- params: {},
70
64
  },
71
65
  {
72
- skill: "/balance",
66
+ skill: "balance",
73
67
  description: "Check your balance.",
74
68
  handler: handleDM,
75
69
  examples: ["/balance"],
76
- params: {},
77
70
  },
78
71
  {
79
- skill: "/join [response]",
72
+ skill: "join",
80
73
  description: "Join a toss.",
81
74
  params: {
82
75
  response: {
@@ -87,15 +80,13 @@ export const toss: Skill[] = [
87
80
  examples: ["/join yes", "/join no"],
88
81
  },
89
82
  {
90
- skill: "/status",
83
+ skill: "status",
91
84
  description: "Check the status of the toss.",
92
85
  handler: handleTossStatus,
93
86
  examples: ["/status"],
94
- params: {},
95
87
  },
96
88
  {
97
- skill:
98
- "/toss [description] [options (separated by comma)] [amount] [judge(optional)] [endTime(optional)]",
89
+ skill: "toss",
99
90
  description:
100
91
  "Create a toss with a description, options, amount and judge(optional).",
101
92
  handler: handleTossCreation,
@@ -120,9 +111,11 @@ export const toss: Skill[] = [
120
111
  },
121
112
  judge: {
122
113
  type: "username",
114
+ optional: true,
123
115
  },
124
116
  endTime: {
125
117
  type: "quoted",
118
+ optional: true,
126
119
  },
127
120
  },
128
121
  },
@@ -142,12 +135,17 @@ export async function handleTossCreation(context: XMTPContext) {
142
135
  return;
143
136
  }
144
137
 
138
+ const tossDBClient = await getRedisClient();
145
139
  if (params.description && params.options && !isNaN(Number(params.amount))) {
146
140
  const keys = await tossDBClient.keys("*");
147
141
  let tossId = keys.length + 1;
148
- const createdTossWallet = await walletService.createTempWallet(
149
- tossId.toString(),
142
+ const isCreated = await walletService.createWallet(
143
+ tossId + ":" + sender.address,
150
144
  );
145
+ if (!isCreated) {
146
+ await context.reply("Failed to create toss wallet");
147
+ return;
148
+ }
151
149
 
152
150
  let tossData: TossData = {
153
151
  toss_id: tossId.toString(),
@@ -163,20 +161,14 @@ export async function handleTossCreation(context: XMTPContext) {
163
161
  end_time: params.endTime
164
162
  ? new Date(params.endTime).toLocaleString()
165
163
  : new Date(Date.now() + 24 * 60 * 60 * 1000).toLocaleString(),
166
- encrypted_participants: [],
167
164
  participants: [],
168
- toss_wallet_address: createdTossWallet?.address,
169
165
  };
170
- await tossDBClient.set(
171
- "toss:" + walletService.encrypt(tossId.toString()),
172
- walletService.encrypt(tossData),
173
- );
174
-
166
+ await tossDBClient.set("toss:" + tossId, JSON.stringify(tossData));
175
167
  if (tossId !== undefined) {
176
168
  await context.send(generateTossMessage(tossData));
177
169
  } else {
178
170
  await context.reply(
179
- `An error occurred while creating the toss. ${JSON.stringify(tossId)}`,
171
+ `An error occurred while creating the toss. ${tossId}`,
180
172
  );
181
173
  }
182
174
  }
@@ -188,7 +180,7 @@ export async function handleJoinToss(context: XMTPContext) {
188
180
  return;
189
181
  }
190
182
 
191
- const { toss_id, participants, encrypted_participants, amount } = tossData;
183
+ const { toss_id, participants, amount, admin_address } = tossData;
192
184
 
193
185
  const {
194
186
  message: {
@@ -197,55 +189,34 @@ export async function handleJoinToss(context: XMTPContext) {
197
189
  params: { response },
198
190
  },
199
191
  },
200
- group,
201
192
  walletService,
202
193
  } = context;
203
194
 
195
+ const tossDBClient = await getRedisClient();
204
196
  if (participants?.some((p) => p.address === sender.address)) {
205
197
  await context.reply("You have already joined this toss.");
206
198
  return;
207
199
  }
208
-
209
- const tossWallet = await walletService.getTempWallet(toss_id);
210
- if (!tossWallet) {
211
- await context.reply("Toss wallet not found");
212
- return;
213
- }
200
+ //Create wallet for sender
201
+ await walletService.createWallet(sender.address);
214
202
  const balance = await walletService.checkBalance(sender.address);
215
-
216
- if (balance < amount) {
217
- await context.send("You need to fund your account. Check your DMs:");
218
- await walletService.requestFunds(context, amount);
219
- return;
220
- }
203
+ if (balance < amount) return walletService.requestFunds(amount);
221
204
 
222
205
  try {
223
- const senderWallet = await walletService.getUserWallet(sender.address);
224
- if (!senderWallet) {
225
- await context.reply("Sender wallet not found");
226
- return;
227
- }
228
- const transfer = await walletService.transfer(
229
- senderWallet,
230
- tossWallet,
231
- amount,
232
- );
233
- console.log("Transfer:", transfer.getTransactionHash());
234
- const encryptedParticipant = walletService.encrypt({
206
+ let tempWalletID = toss_id + ":" + admin_address;
207
+ await walletService.transfer(sender.address, tempWalletID, amount);
208
+ const participant = {
235
209
  address: sender.address,
236
- agent_address: senderWallet.address,
237
210
  response: response,
238
211
  name:
239
212
  (await context.getUserInfo(sender.address))?.preferredName ??
240
213
  sender.address,
241
- });
242
- encrypted_participants.push(encryptedParticipant as string);
214
+ };
215
+ participants.push(participant);
243
216
 
244
217
  await tossDBClient.set(
245
- `toss:${walletService.encrypt(toss_id)}`,
246
- walletService.encrypt(
247
- JSON.stringify({ ...tossData, encrypted_participants }),
248
- ),
218
+ `toss:${toss_id}`,
219
+ JSON.stringify({ ...tossData, participants }),
249
220
  );
250
221
 
251
222
  await context.reply("Successfully joined the toss!");
@@ -275,58 +246,38 @@ export async function handleEndToss(context: XMTPContext) {
275
246
  walletService,
276
247
  } = context;
277
248
 
249
+ const tossDBClient = await getRedisClient();
278
250
  if (participants?.length === 0) {
279
251
  await context.reply("No participants for this toss.");
280
252
  return;
281
253
  } else if (admin_address.toLowerCase() !== sender.address.toLowerCase()) {
282
- await context.reply("Only the admin can end the toss.");
283
- return;
284
- } else if (
285
- !options
286
- .split(",")
287
- .map((o) => o.toLowerCase())
288
- .includes(option.toLowerCase())
289
- ) {
290
- await context.reply("Invalid option selected.");
254
+ await context.reply("Only the admin can cancel the toss.");
291
255
  return;
292
256
  }
293
- const { winners, losers } = await extractWinners(participants ?? [], option);
294
257
 
295
- if (winners.length === 0) {
296
- await context.reply("No winners for this toss.");
258
+ let tempWalletID = toss_id + ":" + admin_address;
259
+ const balance = await walletService.checkBalance(tempWalletID);
260
+ const fundsNeeded = tossData.amount * participants?.length;
261
+ if (balance < fundsNeeded) {
262
+ await context.reply(
263
+ `Toss wallet does not have enough funds ${fundsNeeded}, has ${balance}`,
264
+ );
297
265
  return;
298
266
  }
299
267
 
268
+ //Winners
269
+
270
+ const { winners, losers } = await extractWinners(participants, option);
271
+
300
272
  const prize =
301
273
  (tossData.amount * (participants?.length ?? 0)) / (winners.length ?? 1);
302
274
 
303
275
  try {
304
276
  for (const winner of winners) {
305
- const tossWallet = await walletService.getTempWallet(toss_id);
306
-
307
- if (!tossWallet) {
308
- await context.reply("Toss wallet not found");
309
- return;
310
- }
311
- const winnerWallet = await walletService.getUserWallet(
312
- winner.address,
313
- winner.address,
314
- );
315
- if (!winnerWallet) {
316
- await context.reply("Winner wallet not found");
317
- return;
318
- }
319
- const transfer = await walletService.transfer(
320
- tossWallet,
321
- winnerWallet,
322
- prize,
323
- );
324
- console.log("Transfer:", transfer.getTransactionHash());
277
+ await walletService.transfer(tempWalletID, winner.address, prize);
325
278
  await tossDBClient.set(
326
- `toss:${walletService.encrypt(toss_id)}`,
327
- walletService.encrypt(
328
- JSON.stringify({ ...tossData, status: "closed" }),
329
- ),
279
+ `toss:${toss_id}`,
280
+ JSON.stringify({ ...tossData, status: "closed" }),
330
281
  );
331
282
  }
332
283
  // Clean up
@@ -355,6 +306,7 @@ export async function handleCancelToss(context: XMTPContext) {
355
306
  walletService,
356
307
  } = context;
357
308
 
309
+ const tossDBClient = await getRedisClient();
358
310
  if (participants?.length === 0) {
359
311
  await context.reply("No participants for this toss.");
360
312
  return;
@@ -363,31 +315,26 @@ export async function handleCancelToss(context: XMTPContext) {
363
315
  return;
364
316
  }
365
317
 
366
- for (const participant of participants ?? []) {
318
+ let tempWalletID = toss_id + ":" + admin_address;
319
+ const balance = await walletService.checkBalance(tempWalletID);
320
+ const fundsNeeded = tossData.amount * participants?.length;
321
+ if (balance < fundsNeeded) {
322
+ await context.reply(
323
+ `Toss wallet does not have enough funds ${fundsNeeded}, has ${balance}`,
324
+ );
325
+ return;
326
+ }
327
+ for (const participant of participants) {
367
328
  try {
368
- const tossWallet = await walletService.getTempWallet(toss_id);
369
-
370
- if (!tossWallet) {
371
- await context.reply("Toss wallet not found");
372
- return;
373
- }
374
-
375
- const participantWallet = await walletService.getUserWallet(
376
- participant.address,
329
+ await walletService.transfer(tempWalletID, participant.address, amount);
330
+ } catch (error) {
331
+ console.error(
332
+ `Failed to send prize to ${participant.address} agent wallet:`,
333
+ error,
377
334
  );
378
- if (!participantWallet) {
379
- await context.reply("Participant wallet not found");
380
- return;
381
- }
382
- const transfer = await walletService.transfer(
383
- tossWallet,
384
- participantWallet,
385
- amount,
335
+ await context.reply(
336
+ `Failed to send prize to ${participant.address} agent wallet`,
386
337
  );
387
- console.log("Transfer:", transfer.getTransactionHash());
388
- } catch (error) {
389
- console.error(`Failed to send prize to ${participant.address}:`, error);
390
- await context.reply(`Failed to send prize to ${participant.address}`);
391
338
  }
392
339
  }
393
340
 
@@ -395,8 +342,8 @@ export async function handleCancelToss(context: XMTPContext) {
395
342
  //await walletService.deleteTempWallet(tossWalletRedis, tossId.toString());
396
343
 
397
344
  await tossDBClient.set(
398
- `toss:${walletService.encrypt(toss_id)}`,
399
- walletService.encrypt(JSON.stringify({ ...tossData, status: "cancelled" })),
345
+ `toss:${toss_id}`,
346
+ JSON.stringify({ ...tossData, status: "cancelled" }),
400
347
  );
401
348
 
402
349
  await context.reply(
@@ -430,20 +377,17 @@ export async function handleDM(context: XMTPContext) {
430
377
  if (skill === "help") {
431
378
  await context.send(DM_HELP_MESSAGE);
432
379
  } else if (skill === "create") {
433
- const walletExist = await walletService.getUserWallet(sender.address);
380
+ const walletExist = await walletService.getWallet(sender.address);
434
381
  if (walletExist) {
435
382
  await context.reply("You already have an agent wallet.");
436
383
  return;
437
384
  }
438
- const userWallet = await walletService.createUserWallet(sender.address);
439
- await context.reply(
440
- `Your agent wallet address is ${userWallet.address}\nBalance: $${await walletService.checkBalance(sender.address)}`,
441
- );
385
+ await walletService.createWallet(sender.address);
442
386
  } else if (skill === "balance") {
443
- const userWallet = await walletService.getUserWallet(sender.address);
387
+ const userWallet = await walletService.getWallet(sender.address);
444
388
 
445
389
  context.sendTo(
446
- `Your agent wallet address is ${userWallet?.address}\nBalance: $${await walletService.checkBalance(sender.address)}`,
390
+ `Your agent wallet for address is ${sender.address}\nBalance: $${await walletService.checkBalance(sender.address)}`,
447
391
  [sender.address],
448
392
  );
449
393
  } else if (skill === "fund") {
@@ -453,8 +397,7 @@ export async function handleDM(context: XMTPContext) {
453
397
  return;
454
398
  } else if (amount) {
455
399
  if (amount + balance <= 10) {
456
- await walletService.requestFunds(context, Number(amount));
457
- return;
400
+ return walletService.requestFunds(Number(amount));
458
401
  } else {
459
402
  await context.send("Wrong amount. Max 10 USDC.");
460
403
  return;
@@ -470,7 +413,7 @@ export async function handleDM(context: XMTPContext) {
470
413
  `Please specify the amount of USDC to prefund (1 to ${10 - balance}):`,
471
414
  options,
472
415
  );
473
- await walletService.requestFunds(context, Number(response));
416
+ return walletService.requestFunds(Number(response));
474
417
  } else if (skill === "withdraw") {
475
418
  const balance = await walletService.checkBalance(sender.address);
476
419
  if (balance === 0) {
@@ -484,6 +427,6 @@ export async function handleDM(context: XMTPContext) {
484
427
  `Please specify the amount of USDC to withdraw (1 to ${balance}):`,
485
428
  options,
486
429
  );
487
- await walletService.withdrawFunds(sender.address, Number(response));
430
+ await walletService.withdrawFunds(Number(response));
488
431
  }
489
432
  }