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.
- package/LICENSE +373 -0
- package/README.md +104 -0
- package/dist/commands/balance.d.ts +5 -0
- package/dist/commands/balance.d.ts.map +1 -0
- package/dist/commands/balance.js +85 -0
- package/dist/commands/balance.js.map +1 -0
- package/dist/commands/faucet.d.ts +5 -0
- package/dist/commands/faucet.d.ts.map +1 -0
- package/dist/commands/faucet.js +41 -0
- package/dist/commands/faucet.js.map +1 -0
- package/dist/commands/list-conversions.d.ts +5 -0
- package/dist/commands/list-conversions.d.ts.map +1 -0
- package/dist/commands/list-conversions.js +60 -0
- package/dist/commands/list-conversions.js.map +1 -0
- package/dist/commands/list-tokens.d.ts +5 -0
- package/dist/commands/list-tokens.d.ts.map +1 -0
- package/dist/commands/list-tokens.js +43 -0
- package/dist/commands/list-tokens.js.map +1 -0
- package/dist/commands/receive.d.ts +5 -0
- package/dist/commands/receive.d.ts.map +1 -0
- package/dist/commands/receive.js +29 -0
- package/dist/commands/receive.js.map +1 -0
- package/dist/commands/send.d.ts +5 -0
- package/dist/commands/send.d.ts.map +1 -0
- package/dist/commands/send.js +78 -0
- package/dist/commands/send.js.map +1 -0
- package/dist/commands/swap.d.ts +5 -0
- package/dist/commands/swap.d.ts.map +1 -0
- package/dist/commands/swap.js +74 -0
- package/dist/commands/swap.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +60 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/account.d.ts +14 -0
- package/dist/lib/account.d.ts.map +1 -0
- package/dist/lib/account.js +22 -0
- package/dist/lib/account.js.map +1 -0
- package/dist/lib/faucet.d.ts +24 -0
- package/dist/lib/faucet.d.ts.map +1 -0
- package/dist/lib/faucet.js +108 -0
- package/dist/lib/faucet.js.map +1 -0
- package/dist/lib/fx-client.d.ts +56 -0
- package/dist/lib/fx-client.d.ts.map +1 -0
- package/dist/lib/fx-client.js +112 -0
- package/dist/lib/fx-client.js.map +1 -0
- 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":"AACA,OAAO,EAAE,8BAA8B,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAQrD,MAAM,CAAC,MAAM,OAAO,GAAW,0BAA0B,CAAC;AAC1D,MAAM,CAAC,MAAM,IAAI,GACf,qDAAqD,CAAC;AAExD,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,KAAU,EAAE,EAAE,CACpC,KAAK;KACF,UAAU,CAAC,OAAO,EAAE;IACnB,QAAQ,EAAE,uCAAuC;IACjD,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,gCAAgC,IAAI,CAAC,KAAK,KAAK,CAAC,CAAC;QAE7D,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,uCAAuC;QACvC,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,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAEtE,mBAAmB;QACnB,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAE/D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5D,OAAO,CAAC,GAAG,CAAC,4BAA4B,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;YACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChD,MAAM,YAAY,GAAG,WAAW;YAC9B,CAAC,CAAC,GAAG,WAAW,KAAK,IAAI,CAAC,KAAK,GAAG;YAClC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;QAEf,OAAO,CAAC,GAAG,CACT,WAAW,WAAW,CAAC,MAAM,gCAAgC,YAAY,GAAG,CAC7E,CAAC;QACF,WAAW,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,KAAK,EAAE,EAAE;YACxC,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YAC3C,MAAM,iBAAiB,GAAG,MAAM;gBAC9B,CAAC,CAAC,GAAG,MAAM,KAAK,UAAU,GAAG;gBAC7B,CAAC,CAAC,UAAU,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,KAAK,iBAAiB,EAAE,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CACX,4BAA4B,EAC5B,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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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":"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"}
|
|
@@ -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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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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":"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"}
|