keecli 1.0.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 (47) hide show
  1. package/LICENSE +373 -0
  2. package/README.md +104 -0
  3. package/dist/commands/balance.d.ts +5 -0
  4. package/dist/commands/balance.d.ts.map +1 -0
  5. package/dist/commands/balance.js +85 -0
  6. package/dist/commands/balance.js.map +1 -0
  7. package/dist/commands/faucet.d.ts +5 -0
  8. package/dist/commands/faucet.d.ts.map +1 -0
  9. package/dist/commands/faucet.js +41 -0
  10. package/dist/commands/faucet.js.map +1 -0
  11. package/dist/commands/list-conversions.d.ts +5 -0
  12. package/dist/commands/list-conversions.d.ts.map +1 -0
  13. package/dist/commands/list-conversions.js +60 -0
  14. package/dist/commands/list-conversions.js.map +1 -0
  15. package/dist/commands/list-tokens.d.ts +5 -0
  16. package/dist/commands/list-tokens.d.ts.map +1 -0
  17. package/dist/commands/list-tokens.js +43 -0
  18. package/dist/commands/list-tokens.js.map +1 -0
  19. package/dist/commands/receive.d.ts +5 -0
  20. package/dist/commands/receive.d.ts.map +1 -0
  21. package/dist/commands/receive.js +29 -0
  22. package/dist/commands/receive.js.map +1 -0
  23. package/dist/commands/send.d.ts +5 -0
  24. package/dist/commands/send.d.ts.map +1 -0
  25. package/dist/commands/send.js +78 -0
  26. package/dist/commands/send.js.map +1 -0
  27. package/dist/commands/swap.d.ts +5 -0
  28. package/dist/commands/swap.d.ts.map +1 -0
  29. package/dist/commands/swap.js +74 -0
  30. package/dist/commands/swap.js.map +1 -0
  31. package/dist/index.d.ts +3 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +60 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/lib/account.d.ts +14 -0
  36. package/dist/lib/account.d.ts.map +1 -0
  37. package/dist/lib/account.js +22 -0
  38. package/dist/lib/account.js.map +1 -0
  39. package/dist/lib/faucet.d.ts +24 -0
  40. package/dist/lib/faucet.d.ts.map +1 -0
  41. package/dist/lib/faucet.js +108 -0
  42. package/dist/lib/faucet.js.map +1 -0
  43. package/dist/lib/fx-client.d.ts +56 -0
  44. package/dist/lib/fx-client.d.ts.map +1 -0
  45. package/dist/lib/fx-client.js +112 -0
  46. package/dist/lib/fx-client.js.map +1 -0
  47. package/package.json +52 -0
@@ -0,0 +1,60 @@
1
+ import { createUserClientFromPassphrase } from "../lib/account.js";
2
+ import { createFXClient } from "../lib/fx-client.js";
3
+ export const command = "list-conversions <token>";
4
+ export const desc = "List all possible conversions from a specific token";
5
+ export const builder = (yargs) => yargs
6
+ .positional("token", {
7
+ describe: "Source token to find conversions from",
8
+ type: "string",
9
+ demandOption: true,
10
+ })
11
+ .options({
12
+ passphrase: {
13
+ type: "string",
14
+ demandOption: true,
15
+ describe: "User passphrase for authentication",
16
+ alias: "p",
17
+ },
18
+ resolver: {
19
+ type: "string",
20
+ demandOption: false,
21
+ describe: "Resolver account public key string (uses default if not provided)",
22
+ alias: "r",
23
+ },
24
+ });
25
+ export const handler = async (argv) => {
26
+ try {
27
+ console.log(`Discovering conversions from ${argv.token}...`);
28
+ // Create user client from passphrase
29
+ const userClient = await createUserClientFromPassphrase(argv.passphrase);
30
+ // Create FX client
31
+ const fxClient = createFXClient(argv.resolver, userClient);
32
+ // Get token registry for ticker lookup
33
+ const tokens = await fxClient.listTokens();
34
+ const tokenLookup = new Map(tokens.map((t) => [t.token, t.currency]));
35
+ // List conversions
36
+ const conversions = await fxClient.listConversions(argv.token);
37
+ if (!Array.isArray(conversions) || conversions.length === 0) {
38
+ console.log(`No conversions found for ${argv.token}`);
39
+ process.exit(0);
40
+ }
41
+ const inputTicker = tokenLookup.get(argv.token);
42
+ const displayToken = inputTicker
43
+ ? `${inputTicker} (${argv.token})`
44
+ : argv.token;
45
+ console.log(`\nFound ${conversions.length} possible conversion(s) from ${displayToken}:`);
46
+ conversions.forEach((conversion, index) => {
47
+ const ticker = tokenLookup.get(conversion);
48
+ const displayConversion = ticker
49
+ ? `${ticker} (${conversion})`
50
+ : conversion;
51
+ console.log(`${index + 1}. ${displayConversion}`);
52
+ });
53
+ process.exit(0);
54
+ }
55
+ catch (error) {
56
+ console.error("Error listing conversions:", error instanceof Error ? error.message : error);
57
+ process.exit(1);
58
+ }
59
+ };
60
+ //# sourceMappingURL=list-conversions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-conversions.js","sourceRoot":"","sources":["../../src/commands/list-conversions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare const command: string;
2
+ export declare const desc: string;
3
+ export declare const builder: (yargs: any) => any;
4
+ export declare const handler: (argv: any) => Promise<void>;
5
+ //# sourceMappingURL=list-tokens.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-tokens.d.ts","sourceRoot":"","sources":["../../src/commands/list-tokens.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,OAAO,EAAE,MAAsB,CAAC;AAC7C,eAAO,MAAM,IAAI,EAAE,MAAsD,CAAC;AAE1E,eAAO,MAAM,OAAO,GAAI,OAAO,GAAG,QAe9B,CAAC;AAEL,eAAO,MAAM,OAAO,GAAU,MAAM,GAAG,KAAG,OAAO,CAAC,IAAI,CA8BrD,CAAC"}
@@ -0,0 +1,43 @@
1
+ import { createUserClientFromPassphrase } from "../lib/account.js";
2
+ import { createFXClient } from "../lib/fx-client.js";
3
+ export const command = "list-tokens";
4
+ export const desc = "List all available tokens from the resolver";
5
+ export const builder = (yargs) => yargs.options({
6
+ passphrase: {
7
+ type: "string",
8
+ demandOption: true,
9
+ describe: "User passphrase for authentication",
10
+ alias: "p",
11
+ },
12
+ resolver: {
13
+ type: "string",
14
+ demandOption: false,
15
+ describe: "Resolver account public key string (uses default if not provided)",
16
+ alias: "r",
17
+ },
18
+ });
19
+ export const handler = async (argv) => {
20
+ try {
21
+ console.log("Discovering available tokens...");
22
+ // Create user client from passphrase
23
+ const userClient = await createUserClientFromPassphrase(argv.passphrase);
24
+ // Create FX client
25
+ const fxClient = createFXClient(argv.resolver, userClient);
26
+ // List tokens
27
+ const tokens = await fxClient.listTokens();
28
+ if (tokens.length === 0) {
29
+ console.log("No tokens found");
30
+ process.exit(0);
31
+ }
32
+ console.log(`\nFound ${tokens.length} token(s):`);
33
+ tokens.forEach((token, index) => {
34
+ console.log(`${index + 1}. ${token.currency} (${token.token})`);
35
+ });
36
+ process.exit(0);
37
+ }
38
+ catch (error) {
39
+ console.error("Error listing tokens:", error instanceof Error ? error.message : error);
40
+ process.exit(1);
41
+ }
42
+ };
43
+ //# sourceMappingURL=list-tokens.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-tokens.js","sourceRoot":"","sources":["../../src/commands/list-tokens.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,8BAA8B,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAOrD,MAAM,CAAC,MAAM,OAAO,GAAW,aAAa,CAAC;AAC7C,MAAM,CAAC,MAAM,IAAI,GAAW,6CAA6C,CAAC;AAE1E,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,KAAU,EAAE,EAAE,CACpC,KAAK,CAAC,OAAO,CAAC;IACZ,UAAU,EAAE;QACV,IAAI,EAAE,QAAQ;QACd,YAAY,EAAE,IAAI;QAClB,QAAQ,EAAE,oCAAoC;QAC9C,KAAK,EAAE,GAAG;KACX;IACD,QAAQ,EAAE;QACR,IAAI,EAAE,QAAQ;QACd,YAAY,EAAE,KAAK;QACnB,QAAQ,EACN,mEAAmE;QACrE,KAAK,EAAE,GAAG;KACX;CACF,CAAC,CAAC;AAEL,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,EAAE,IAAS,EAAiB,EAAE;IACxD,IAAI,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;QAE/C,qCAAqC;QACrC,MAAM,UAAU,GAAG,MAAM,8BAA8B,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAEzE,mBAAmB;QACnB,MAAM,QAAQ,GAAG,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAE3D,cAAc;QACd,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAC;QAE3C,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;YAC/B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,WAAW,MAAM,CAAC,MAAM,YAAY,CAAC,CAAC;QAClD,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;YAC9B,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,KAAK,KAAK,CAAC,QAAQ,KAAK,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CACX,uBAAuB,EACvB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAC/C,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare const command: string;
2
+ export declare const desc: string;
3
+ export declare const builder: (yargs: any) => any;
4
+ export declare const handler: (argv: any) => Promise<void>;
5
+ //# sourceMappingURL=receive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"receive.d.ts","sourceRoot":"","sources":["../../src/commands/receive.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,OAAO,EAAE,MAAkB,CAAC;AACzC,eAAO,MAAM,IAAI,EAAE,MAAsD,CAAC;AAE1E,eAAO,MAAM,OAAO,GAAI,OAAO,GAAG,QAQ9B,CAAC;AAEL,eAAO,MAAM,OAAO,GAAU,MAAM,GAAG,KAAG,OAAO,CAAC,IAAI,CAsBrD,CAAC"}
@@ -0,0 +1,29 @@
1
+ import { createUserClientFromPassphrase } from "../lib/account.js";
2
+ export const command = "receive";
3
+ export const desc = "Show your account address to receive tokens";
4
+ export const builder = (yargs) => yargs.options({
5
+ passphrase: {
6
+ type: "string",
7
+ demandOption: true,
8
+ describe: "User passphrase for authentication",
9
+ alias: "p",
10
+ },
11
+ });
12
+ export const handler = async (argv) => {
13
+ try {
14
+ console.log("Getting your account address...");
15
+ // Create user client from passphrase
16
+ const userClient = await createUserClientFromPassphrase(argv.passphrase);
17
+ // Get the account address
18
+ const accountAddress = userClient.account.publicKeyString.get();
19
+ console.log(`\nYour account address:`);
20
+ console.log(`${accountAddress}`);
21
+ console.log(`\nShare this address to receive tokens.`);
22
+ process.exit(0);
23
+ }
24
+ catch (error) {
25
+ console.error("Error getting account address:", error instanceof Error ? error.message : error);
26
+ process.exit(1);
27
+ }
28
+ };
29
+ //# sourceMappingURL=receive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"receive.js","sourceRoot":"","sources":["../../src/commands/receive.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,8BAA8B,EAAE,MAAM,mBAAmB,CAAC;AAMnE,MAAM,CAAC,MAAM,OAAO,GAAW,SAAS,CAAC;AACzC,MAAM,CAAC,MAAM,IAAI,GAAW,6CAA6C,CAAC;AAE1E,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,KAAU,EAAE,EAAE,CACpC,KAAK,CAAC,OAAO,CAAC;IACZ,UAAU,EAAE;QACV,IAAI,EAAE,QAAQ;QACd,YAAY,EAAE,IAAI;QAClB,QAAQ,EAAE,oCAAoC;QAC9C,KAAK,EAAE,GAAG;KACX;CACF,CAAC,CAAC;AAEL,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,EAAE,IAAS,EAAiB,EAAE;IACxD,IAAI,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;QAE/C,qCAAqC;QACrC,MAAM,UAAU,GAAG,MAAM,8BAA8B,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAEzE,0BAA0B;QAC1B,MAAM,cAAc,GAAG,UAAU,CAAC,OAAO,CAAC,eAAe,CAAC,GAAG,EAAE,CAAC;QAEhE,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,GAAG,cAAc,EAAE,CAAC,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;QAEvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CACX,gCAAgC,EAChC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAC/C,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare const command: string;
2
+ export declare const desc: string;
3
+ export declare const builder: (yargs: any) => any;
4
+ export declare const handler: (argv: any) => Promise<void>;
5
+ //# sourceMappingURL=send.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"send.d.ts","sourceRoot":"","sources":["../../src/commands/send.ts"],"names":[],"mappings":"AAaA,eAAO,MAAM,OAAO,EAAE,MAA4C,CAAC;AACnE,eAAO,MAAM,IAAI,EAAE,MAAyC,CAAC;AAE7D,eAAO,MAAM,OAAO,GAAI,OAAO,GAAG,QA+B5B,CAAC;AAEP,eAAO,MAAM,OAAO,GAAU,MAAM,GAAG,KAAG,OAAO,CAAC,IAAI,CAuDrD,CAAC"}
@@ -0,0 +1,78 @@
1
+ import { createUserClientFromPassphrase } from "../lib/account.js";
2
+ import { createFXClient } from "../lib/fx-client.js";
3
+ import * as KeetaNet from "@keetanetwork/keetanet-client";
4
+ export const command = "send <token> <recipient> <amount>";
5
+ export const desc = "Send tokens to another account";
6
+ export const builder = (yargs) => yargs
7
+ .positional("token", {
8
+ describe: "Token ticker or address to send",
9
+ type: "string",
10
+ demandOption: true,
11
+ })
12
+ .positional("recipient", {
13
+ describe: "Recipient account address",
14
+ type: "string",
15
+ demandOption: true,
16
+ })
17
+ .positional("amount", {
18
+ describe: "Amount to send (in raw units)",
19
+ type: "string",
20
+ demandOption: true,
21
+ })
22
+ .options({
23
+ passphrase: {
24
+ type: "string",
25
+ demandOption: true,
26
+ describe: "User passphrase for authentication",
27
+ alias: "p",
28
+ },
29
+ resolver: {
30
+ type: "string",
31
+ demandOption: false,
32
+ describe: "Resolver account public key string (uses default if not provided)",
33
+ alias: "r",
34
+ },
35
+ });
36
+ export const handler = async (argv) => {
37
+ try {
38
+ console.log(`Sending ${argv.amount} ${argv.token} to ${argv.recipient}...`);
39
+ // Create user client from passphrase
40
+ const userClient = await createUserClientFromPassphrase(argv.passphrase);
41
+ // Create FX client for token registry lookup
42
+ const fxClient = createFXClient(argv.resolver, userClient);
43
+ // Get token registry to resolve ticker to address if needed
44
+ const tokens = await fxClient.listTokens();
45
+ const tokenLookup = new Map(tokens.map((t) => [t.currency, t.token]));
46
+ const reverseLookup = new Map(tokens.map((t) => [t.token, t.currency]));
47
+ // Resolve token ticker to address if needed
48
+ let tokenAddress = argv.token;
49
+ let displayToken = argv.token;
50
+ if (tokenLookup.has(argv.token)) {
51
+ // Input is a ticker, resolve to address
52
+ tokenAddress = tokenLookup.get(argv.token);
53
+ displayToken = `${argv.token} (${tokenAddress})`;
54
+ }
55
+ else if (reverseLookup.has(argv.token)) {
56
+ // Input is already an address, get ticker if available
57
+ const ticker = reverseLookup.get(argv.token);
58
+ displayToken = ticker ? `${ticker} (${tokenAddress})` : tokenAddress;
59
+ }
60
+ console.log(` Token: ${displayToken}`);
61
+ console.log(` Amount: ${argv.amount}`);
62
+ console.log(` Recipient: ${argv.recipient}`);
63
+ // Convert amount to BigInt
64
+ const amount = BigInt(argv.amount);
65
+ // Create recipient account object
66
+ const recipientAccount = KeetaNet.lib.Account.fromPublicKeyString(argv.recipient);
67
+ // Send tokens directly
68
+ console.log("Sending transaction...");
69
+ await userClient.send(recipientAccount, amount, tokenAddress);
70
+ console.log("Transfer completed successfully!");
71
+ process.exit(0);
72
+ }
73
+ catch (error) {
74
+ console.error("Error sending tokens:", error instanceof Error ? error.message : error);
75
+ process.exit(1);
76
+ }
77
+ };
78
+ //# sourceMappingURL=send.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"send.js","sourceRoot":"","sources":["../../src/commands/send.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,8BAA8B,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,QAAQ,MAAM,+BAA+B,CAAC;AAU1D,MAAM,CAAC,MAAM,OAAO,GAAW,mCAAmC,CAAC;AACnE,MAAM,CAAC,MAAM,IAAI,GAAW,gCAAgC,CAAC;AAE7D,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,KAAU,EAAE,EAAE,CACpC,KAAK;KACF,UAAU,CAAC,OAAO,EAAE;IACnB,QAAQ,EAAE,iCAAiC;IAC3C,IAAI,EAAE,QAAQ;IACd,YAAY,EAAE,IAAI;CACnB,CAAC;KACD,UAAU,CAAC,WAAW,EAAE;IACvB,QAAQ,EAAE,2BAA2B;IACrC,IAAI,EAAE,QAAQ;IACd,YAAY,EAAE,IAAI;CACnB,CAAC;KACD,UAAU,CAAC,QAAQ,EAAE;IACpB,QAAQ,EAAE,+BAA+B;IACzC,IAAI,EAAE,QAAQ;IACd,YAAY,EAAE,IAAI;CACnB,CAAC;KACD,OAAO,CAAC;IACP,UAAU,EAAE;QACV,IAAI,EAAE,QAAQ;QACd,YAAY,EAAE,IAAI;QAClB,QAAQ,EAAE,oCAAoC;QAC9C,KAAK,EAAE,GAAG;KACX;IACD,QAAQ,EAAE;QACR,IAAI,EAAE,QAAQ;QACd,YAAY,EAAE,KAAK;QACnB,QAAQ,EACN,mEAAmE;QACrE,KAAK,EAAE,GAAG;KACX;CACF,CAAC,CAAC;AAEP,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,EAAE,IAAS,EAAiB,EAAE;IACxD,IAAI,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,OAAO,IAAI,CAAC,SAAS,KAAK,CAAC,CAAC;QAE5E,qCAAqC;QACrC,MAAM,UAAU,GAAG,MAAM,8BAA8B,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAEzE,6CAA6C;QAC7C,MAAM,QAAQ,GAAG,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAE3D,4DAA4D;QAC5D,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAC;QAC3C,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACtE,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAExE,4CAA4C;QAC5C,IAAI,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC;QAC9B,IAAI,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC;QAE9B,IAAI,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAChC,wCAAwC;YACxC,YAAY,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAE,CAAC;YAC5C,YAAY,GAAG,GAAG,IAAI,CAAC,KAAK,KAAK,YAAY,GAAG,CAAC;QACnD,CAAC;aAAM,IAAI,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACzC,uDAAuD;YACvD,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC7C,YAAY,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,KAAK,YAAY,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC;QACvE,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,aAAa,YAAY,EAAE,CAAC,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;QAE/C,2BAA2B;QAC3B,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAEnC,kCAAkC;QAClC,MAAM,gBAAgB,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,mBAAmB,CAC/D,IAAI,CAAC,SAAS,CACf,CAAC;QAEF,uBAAuB;QACvB,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;QACtC,MAAM,UAAU,CAAC,IAAI,CAAC,gBAAgB,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;QAE9D,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;QAEhD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CACX,uBAAuB,EACvB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAC/C,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare const command: string;
2
+ export declare const desc: string;
3
+ export declare const builder: (yargs: any) => any;
4
+ export declare const handler: (argv: any) => Promise<void>;
5
+ //# sourceMappingURL=swap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"swap.d.ts","sourceRoot":"","sources":["../../src/commands/swap.ts"],"names":[],"mappings":"AAaA,eAAO,MAAM,OAAO,EAAE,MAAe,CAAC;AACtC,eAAO,MAAM,IAAI,EAAE,MAA+B,CAAC;AAEnD,eAAO,MAAM,OAAO,GAAI,OAAO,GAAG,QAwC9B,CAAC;AAEL,eAAO,MAAM,OAAO,GAAU,MAAM,GAAG,KAAG,OAAO,CAAC,IAAI,CAwCrD,CAAC"}
@@ -0,0 +1,74 @@
1
+ import { createUserClientFromPassphrase } from "../lib/account.js";
2
+ import { createFXClient } from "../lib/fx-client.js";
3
+ export const command = "swap";
4
+ export const desc = "Execute a token swap";
5
+ export const builder = (yargs) => yargs.options({
6
+ passphrase: {
7
+ type: "string",
8
+ demandOption: true,
9
+ describe: "User passphrase for authentication",
10
+ alias: "p",
11
+ },
12
+ resolver: {
13
+ type: "string",
14
+ demandOption: false,
15
+ describe: "Resolver account public key string (uses default if not provided)",
16
+ alias: "r",
17
+ },
18
+ from: {
19
+ type: "string",
20
+ demandOption: true,
21
+ describe: "Source token to swap from",
22
+ alias: "f",
23
+ },
24
+ to: {
25
+ type: "string",
26
+ demandOption: true,
27
+ describe: "Target token to swap to",
28
+ alias: "t",
29
+ },
30
+ amount: {
31
+ type: "string",
32
+ demandOption: true,
33
+ describe: "Amount to swap (can be in source or target token units)",
34
+ alias: "a",
35
+ },
36
+ affinity: {
37
+ type: "string",
38
+ choices: ["from", "to"],
39
+ default: "from",
40
+ describe: "Whether the amount is specified in source (from) or target (to) token units",
41
+ },
42
+ });
43
+ export const handler = async (argv) => {
44
+ try {
45
+ console.log(`Preparing to swap ${argv.amount} ${argv.affinity === "from" ? argv.from : argv.to}...`);
46
+ console.log(` From: ${argv.from}`);
47
+ console.log(` To: ${argv.to}`);
48
+ console.log(` Amount: ${argv.amount} (${argv.affinity} token units)`);
49
+ // Create user client from passphrase
50
+ console.log("\nAuthenticating...");
51
+ const userClient = await createUserClientFromPassphrase(argv.passphrase);
52
+ console.log(" User authenticated");
53
+ // Create FX client
54
+ console.log("Connecting to FX service...");
55
+ const fxClient = createFXClient(argv.resolver, userClient);
56
+ console.log(" Connected to FX service");
57
+ // Execute the swap
58
+ const result = await fxClient.executeSwap({
59
+ from: argv.from,
60
+ to: argv.to,
61
+ amount: argv.amount,
62
+ affinity: argv.affinity,
63
+ });
64
+ console.log("\nSwap completed successfully!");
65
+ console.log(` Exchange ID: ${result.exchangeID}`);
66
+ console.log(` Final conversion: ${result.estimate.convertedAmount} ${argv.to}`);
67
+ process.exit(0);
68
+ }
69
+ catch (error) {
70
+ console.error("\nSwap failed:", error instanceof Error ? error.message : error);
71
+ process.exit(1);
72
+ }
73
+ };
74
+ //# sourceMappingURL=swap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"swap.js","sourceRoot":"","sources":["../../src/commands/swap.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,60 @@
1
+ #!/usr/bin/env node
2
+ import yargs from "yargs";
3
+ import { hideBin } from "yargs/helpers";
4
+ // Import commands
5
+ import * as listTokens from "./commands/list-tokens.js";
6
+ import * as listConversions from "./commands/list-conversions.js";
7
+ import * as swap from "./commands/swap.js";
8
+ import * as faucet from "./commands/faucet.js";
9
+ import * as balance from "./commands/balance.js";
10
+ import * as send from "./commands/send.js";
11
+ import * as receive from "./commands/receive.js";
12
+ async function main() {
13
+ const cli = yargs(hideBin(process.argv))
14
+ .scriptName("keecli")
15
+ .usage("$0 <command> [options]")
16
+ .version("1.0.0")
17
+ .help("h")
18
+ .alias("h", "help")
19
+ .demandCommand(1, "You must specify a command")
20
+ .strict()
21
+ .env("KEECLI")
22
+ .wrap(Math.min(120, process.stdout.columns || 80));
23
+ // Register commands
24
+ cli
25
+ .command(listTokens)
26
+ .command(listConversions)
27
+ .command(swap)
28
+ .command(faucet)
29
+ .command(balance)
30
+ .command(send)
31
+ .command(receive);
32
+ // Add examples
33
+ cli
34
+ .example('$0 list-tokens -p "my passphrase"', "List all available tokens (uses default resolver)")
35
+ .example('$0 list-tokens -p "my passphrase" -r "0x06..."', "List all available tokens with custom resolver")
36
+ .example('$0 list-conversions -p "my passphrase" -t "$TOKEN_A"', "List conversions from TOKEN_A")
37
+ .example('$0 swap -p "my passphrase" -f "$TOKEN_A" -t "$TOKEN_B" -a "1000"', "Swap 1000 TOKEN_A to TOKEN_B")
38
+ .example('$0 faucet -p "my passphrase"', "Request test tokens from faucet")
39
+ .example('$0 balance -p "my passphrase"', "Show account balances for all tokens")
40
+ .example('$0 send USDC recipient_address 1000 -p "my passphrase"', "Send 1000 USDC tokens to recipient")
41
+ .example('$0 receive -p "my passphrase"', "Show your account address to receive tokens");
42
+ // Parse and execute
43
+ await cli.parse();
44
+ }
45
+ // Handle unhandled promise rejections
46
+ process.on("unhandledRejection", (reason, promise) => {
47
+ console.error("Error: Unhandled Rejection at:", promise, "reason:", reason);
48
+ process.exit(1);
49
+ });
50
+ // Handle uncaught exceptions
51
+ process.on("uncaughtException", (error) => {
52
+ console.error("Error: Uncaught Exception:", error);
53
+ process.exit(1);
54
+ });
55
+ // Run the CLI
56
+ main().catch((error) => {
57
+ console.error("Error: CLI Error:", error);
58
+ process.exit(1);
59
+ });
60
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAExC,kBAAkB;AAClB,OAAO,KAAK,UAAU,MAAM,2BAA2B,CAAC;AACxD,OAAO,KAAK,eAAe,MAAM,gCAAgC,CAAC;AAClE,OAAO,KAAK,IAAI,MAAM,oBAAoB,CAAC;AAC3C,OAAO,KAAK,MAAM,MAAM,sBAAsB,CAAC;AAC/C,OAAO,KAAK,OAAO,MAAM,uBAAuB,CAAC;AACjD,OAAO,KAAK,IAAI,MAAM,oBAAoB,CAAC;AAC3C,OAAO,KAAK,OAAO,MAAM,uBAAuB,CAAC;AAEjD,KAAK,UAAU,IAAI;IACjB,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;SACrC,UAAU,CAAC,QAAQ,CAAC;SACpB,KAAK,CAAC,wBAAwB,CAAC;SAC/B,OAAO,CAAC,OAAO,CAAC;SAChB,IAAI,CAAC,GAAG,CAAC;SACT,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC;SAClB,aAAa,CAAC,CAAC,EAAE,4BAA4B,CAAC;SAC9C,MAAM,EAAE;SACR,GAAG,CAAC,QAAQ,CAAC;SACb,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;IAErD,oBAAoB;IACpB,GAAG;SACA,OAAO,CAAC,UAAU,CAAC;SACnB,OAAO,CAAC,eAAe,CAAC;SACxB,OAAO,CAAC,IAAI,CAAC;SACb,OAAO,CAAC,MAAM,CAAC;SACf,OAAO,CAAC,OAAO,CAAC;SAChB,OAAO,CAAC,IAAI,CAAC;SACb,OAAO,CAAC,OAAO,CAAC,CAAC;IAEpB,eAAe;IACf,GAAG;SACA,OAAO,CACN,mCAAmC,EACnC,mDAAmD,CACpD;SACA,OAAO,CACN,gDAAgD,EAChD,gDAAgD,CACjD;SACA,OAAO,CACN,sDAAsD,EACtD,+BAA+B,CAChC;SACA,OAAO,CACN,kEAAkE,EAClE,8BAA8B,CAC/B;SACA,OAAO,CAAC,8BAA8B,EAAE,iCAAiC,CAAC;SAC1E,OAAO,CACN,+BAA+B,EAC/B,sCAAsC,CACvC;SACA,OAAO,CACN,wDAAwD,EACxD,oCAAoC,CACrC;SACA,OAAO,CACN,+BAA+B,EAC/B,6CAA6C,CAC9C,CAAC;IAEJ,oBAAoB;IACpB,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC;AACpB,CAAC;AAED,sCAAsC;AACtC,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE;IACnD,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;IAC5E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,6BAA6B;AAC7B,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,KAAK,EAAE,EAAE;IACxC,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC;IACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,cAAc;AACd,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC;IAC1C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,14 @@
1
+ import * as KeetaNet from "@keetanetwork/keetanet-client";
2
+ /**
3
+ * Create a user client from passphrase and network
4
+ */
5
+ export declare function createUserClientFromPassphrase(passphrase: string, network?: "test" | "main" | "staging" | "dev"): Promise<KeetaNet.UserClient>;
6
+ /**
7
+ * Create an account from a public key string (for resolver accounts)
8
+ */
9
+ export declare function createAccountFromPublicKey(publicKeyString: string): any;
10
+ /**
11
+ * Get account address as string
12
+ */
13
+ export declare function getAccountAddress(account: any): string;
14
+ //# sourceMappingURL=account.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account.d.ts","sourceRoot":"","sources":["../../src/lib/account.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,+BAA+B,CAAC;AAE1D;;GAEG;AACH,wBAAsB,8BAA8B,CAClD,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,KAAc,GACpD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAI9B;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,eAAe,EAAE,MAAM,GAAG,GAAG,CAEvE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,GAAG,GAAG,MAAM,CAEtD"}
@@ -0,0 +1,22 @@
1
+ import * as KeetaNet from "@keetanetwork/keetanet-client";
2
+ /**
3
+ * Create a user client from passphrase and network
4
+ */
5
+ export async function createUserClientFromPassphrase(passphrase, network = "test") {
6
+ const seed = await KeetaNet.lib.Account.seedFromPassphrase(passphrase);
7
+ const account = KeetaNet.lib.Account.fromSeed(seed, 0);
8
+ return KeetaNet.UserClient.fromNetwork(network, account);
9
+ }
10
+ /**
11
+ * Create an account from a public key string (for resolver accounts)
12
+ */
13
+ export function createAccountFromPublicKey(publicKeyString) {
14
+ return KeetaNet.lib.Account.fromPublicKeyString(publicKeyString);
15
+ }
16
+ /**
17
+ * Get account address as string
18
+ */
19
+ export function getAccountAddress(account) {
20
+ return account.address;
21
+ }
22
+ //# sourceMappingURL=account.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account.js","sourceRoot":"","sources":["../../src/lib/account.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,+BAA+B,CAAC;AAE1D;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,8BAA8B,CAClD,UAAkB,EAClB,UAA+C,MAAM;IAErD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC;IACvE,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACvD,OAAO,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AAC3D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,0BAA0B,CAAC,eAAuB;IAChE,OAAO,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,mBAAmB,CAAC,eAAe,CAAC,CAAC;AACnE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAY;IAC5C,OAAO,OAAO,CAAC,OAAO,CAAC;AACzB,CAAC"}
@@ -0,0 +1,24 @@
1
+ import * as KeetaNet from "@keetanetwork/keetanet-client";
2
+ /**
3
+ * Simple KeetaNet Test Faucet Utility
4
+ *
5
+ * Static methods to request 10 test tokens for gas fees and optionally wait for them to arrive.
6
+ */
7
+ export declare class FaucetClient {
8
+ /**
9
+ * Make a single faucet request for 10 tokens
10
+ */
11
+ static requestTokens(account: InstanceType<typeof KeetaNet.lib.Account>): Promise<{
12
+ success: boolean;
13
+ message: string;
14
+ }>;
15
+ /**
16
+ * Request tokens and wait for balance to increase
17
+ */
18
+ static requestAndWaitForTokens(userClient: KeetaNet.UserClient, account: InstanceType<typeof KeetaNet.lib.Account>): Promise<{
19
+ success: boolean;
20
+ message: string;
21
+ received?: bigint;
22
+ }>;
23
+ }
24
+ //# sourceMappingURL=faucet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"faucet.d.ts","sourceRoot":"","sources":["../../src/lib/faucet.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,+BAA+B,CAAC;AAS1D;;;;GAIG;AACH,qBAAa,YAAY;IACvB;;OAEG;WACU,aAAa,CACxB,OAAO,EAAE,YAAY,CAAC,OAAO,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,GACjD,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAoDjD;;OAEG;WACU,uBAAuB,CAClC,UAAU,EAAE,QAAQ,CAAC,UAAU,EAC/B,OAAO,EAAE,YAAY,CAAC,OAAO,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,GACjD,OAAO,CAAC;QACT,OAAO,EAAE,OAAO,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;CAiDH"}
@@ -0,0 +1,108 @@
1
+ import https from "https";
2
+ import { URLSearchParams } from "url";
3
+ const FAUCET_URL = "https://faucet.test.keeta.com/";
4
+ const FAUCET_AMOUNT = 10; // Always request 10 tokens
5
+ const POLL_INTERVAL_MS = 2000; // 2 seconds between balance checks
6
+ const MAX_POLL_ATTEMPTS = 30; // Maximum 60 seconds of polling
7
+ /**
8
+ * Simple KeetaNet Test Faucet Utility
9
+ *
10
+ * Static methods to request 10 test tokens for gas fees and optionally wait for them to arrive.
11
+ */
12
+ export class FaucetClient {
13
+ /**
14
+ * Make a single faucet request for 10 tokens
15
+ */
16
+ static async requestTokens(account) {
17
+ const address = account.publicKeyString.get();
18
+ return new Promise((resolve) => {
19
+ const postData = new URLSearchParams({
20
+ address: address,
21
+ amount: FAUCET_AMOUNT.toString(),
22
+ }).toString();
23
+ const options = {
24
+ hostname: "faucet.test.keeta.com",
25
+ port: 443,
26
+ path: "/",
27
+ method: "POST",
28
+ headers: {
29
+ "Content-Type": "application/x-www-form-urlencoded",
30
+ "Content-Length": Buffer.byteLength(postData),
31
+ // "User-Agent": "KeetaNet-FX-Faucet/1.0",
32
+ },
33
+ };
34
+ const req = https.request(options, (res) => {
35
+ // We only care about the HTTP status, ignore response body
36
+ const success = res.statusCode !== undefined &&
37
+ res.statusCode >= 200 &&
38
+ res.statusCode < 300;
39
+ // Consume the response body to prevent memory leaks
40
+ res.on("data", () => { });
41
+ res.on("end", () => {
42
+ resolve({
43
+ success,
44
+ message: success
45
+ ? `Successfully requested ${FAUCET_AMOUNT} tokens for ${address}`
46
+ : `Faucet request failed with status ${res.statusCode}`,
47
+ });
48
+ });
49
+ });
50
+ req.on("error", (error) => {
51
+ resolve({
52
+ success: false,
53
+ message: `Network error: ${error.message}`,
54
+ });
55
+ });
56
+ req.write(postData);
57
+ req.end();
58
+ });
59
+ }
60
+ /**
61
+ * Request tokens and wait for balance to increase
62
+ */
63
+ static async requestAndWaitForTokens(userClient, account) {
64
+ const address = account.publicKeyString.get();
65
+ // Get initial balance
66
+ let initialBalance;
67
+ try {
68
+ initialBalance = await userClient.balance(userClient.baseToken);
69
+ }
70
+ catch (error) {
71
+ return {
72
+ success: false,
73
+ message: `Failed to get initial balance: ${error instanceof Error ? error.message : "Unknown error"}`,
74
+ };
75
+ }
76
+ // Request tokens
77
+ const requestResult = await this.requestTokens(account);
78
+ if (!requestResult.success) {
79
+ return requestResult;
80
+ }
81
+ // Wait for balance to increase
82
+ console.log(`⏳ Waiting for tokens to arrive at ${address}...`);
83
+ let attempts = 0;
84
+ while (attempts < MAX_POLL_ATTEMPTS) {
85
+ await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL_MS));
86
+ attempts++;
87
+ try {
88
+ const currentBalance = await userClient.balance(userClient.baseToken);
89
+ const increase = currentBalance - initialBalance;
90
+ if (increase > 0n) {
91
+ return {
92
+ success: true,
93
+ message: `Successfully received ${increase} KTA tokens`,
94
+ received: increase,
95
+ };
96
+ }
97
+ }
98
+ catch (error) {
99
+ // Continue polling even if balance check fails
100
+ }
101
+ }
102
+ return {
103
+ success: false,
104
+ message: `Timeout waiting for funds after ${(MAX_POLL_ATTEMPTS * POLL_INTERVAL_MS) / 1000} seconds`,
105
+ };
106
+ }
107
+ }
108
+ //# sourceMappingURL=faucet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"faucet.js","sourceRoot":"","sources":["../../src/lib/faucet.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,MAAM,KAAK,CAAC;AAEtC,MAAM,UAAU,GAAG,gCAAgC,CAAC;AACpD,MAAM,aAAa,GAAG,EAAE,CAAC,CAAC,2BAA2B;AACrD,MAAM,gBAAgB,GAAG,IAAI,CAAC,CAAC,mCAAmC;AAClE,MAAM,iBAAiB,GAAG,EAAE,CAAC,CAAC,gCAAgC;AAE9D;;;;GAIG;AACH,MAAM,OAAO,YAAY;IACvB;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,aAAa,CACxB,OAAkD;QAElD,MAAM,OAAO,GAAG,OAAO,CAAC,eAAe,CAAC,GAAG,EAAE,CAAC;QAE9C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,MAAM,QAAQ,GAAG,IAAI,eAAe,CAAC;gBACnC,OAAO,EAAE,OAAO;gBAChB,MAAM,EAAE,aAAa,CAAC,QAAQ,EAAE;aACjC,CAAC,CAAC,QAAQ,EAAE,CAAC;YAEd,MAAM,OAAO,GAAG;gBACd,QAAQ,EAAE,uBAAuB;gBACjC,IAAI,EAAE,GAAG;gBACT,IAAI,EAAE,GAAG;gBACT,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,cAAc,EAAE,mCAAmC;oBACnD,gBAAgB,EAAE,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC;oBAC7C,0CAA0C;iBAC3C;aACF,CAAC;YAEF,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;gBACzC,2DAA2D;gBAC3D,MAAM,OAAO,GACX,GAAG,CAAC,UAAU,KAAK,SAAS;oBAC5B,GAAG,CAAC,UAAU,IAAI,GAAG;oBACrB,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;gBAEvB,oDAAoD;gBACpD,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;gBACzB,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;oBACjB,OAAO,CAAC;wBACN,OAAO;wBACP,OAAO,EAAE,OAAO;4BACd,CAAC,CAAC,0BAA0B,aAAa,eAAe,OAAO,EAAE;4BACjE,CAAC,CAAC,qCAAqC,GAAG,CAAC,UAAU,EAAE;qBAC1D,CAAC,CAAC;gBACL,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;gBACxB,OAAO,CAAC;oBACN,OAAO,EAAE,KAAK;oBACd,OAAO,EAAE,kBAAkB,KAAK,CAAC,OAAO,EAAE;iBAC3C,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACpB,GAAG,CAAC,GAAG,EAAE,CAAC;QACZ,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAClC,UAA+B,EAC/B,OAAkD;QAMlD,MAAM,OAAO,GAAG,OAAO,CAAC,eAAe,CAAC,GAAG,EAAE,CAAC;QAE9C,sBAAsB;QACtB,IAAI,cAAsB,CAAC;QAC3B,IAAI,CAAC;YACH,cAAc,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QAClE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,kCAAkC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE;aACtG,CAAC;QACJ,CAAC;QAED,iBAAiB;QACjB,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QACxD,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;YAC3B,OAAO,aAAa,CAAC;QACvB,CAAC;QAED,+BAA+B;QAC/B,OAAO,CAAC,GAAG,CAAC,qCAAqC,OAAO,KAAK,CAAC,CAAC;QAC/D,IAAI,QAAQ,GAAG,CAAC,CAAC;QAEjB,OAAO,QAAQ,GAAG,iBAAiB,EAAE,CAAC;YACpC,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC,CAAC;YACtE,QAAQ,EAAE,CAAC;YAEX,IAAI,CAAC;gBACH,MAAM,cAAc,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;gBACtE,MAAM,QAAQ,GAAG,cAAc,GAAG,cAAc,CAAC;gBAEjD,IAAI,QAAQ,GAAG,EAAE,EAAE,CAAC;oBAClB,OAAO;wBACL,OAAO,EAAE,IAAI;wBACb,OAAO,EAAE,yBAAyB,QAAQ,aAAa;wBACvD,QAAQ,EAAE,QAAQ;qBACnB,CAAC;gBACJ,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,+CAA+C;YACjD,CAAC;QACH,CAAC;QAED,OAAO;YACL,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,mCAAmC,CAAC,iBAAiB,GAAG,gBAAgB,CAAC,GAAG,IAAI,UAAU;SACpG,CAAC;IACJ,CAAC;CACF"}