neutron-cli 0.2.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +82 -32
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +7 -14
- package/dist/client.js.map +1 -1
- package/dist/commands/address.d.ts +3 -0
- package/dist/commands/address.d.ts.map +1 -0
- package/dist/commands/address.js +74 -0
- package/dist/commands/address.js.map +1 -0
- package/dist/commands/fiat.d.ts +3 -0
- package/dist/commands/fiat.d.ts.map +1 -0
- package/dist/commands/fiat.js +121 -0
- package/dist/commands/fiat.js.map +1 -0
- package/dist/commands/send.d.ts.map +1 -1
- package/dist/commands/send.js +87 -11
- package/dist/commands/send.js.map +1 -1
- package/dist/commands/swap.d.ts +3 -0
- package/dist/commands/swap.d.ts.map +1 -0
- package/dist/commands/swap.js +76 -0
- package/dist/commands/swap.js.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -18,38 +18,32 @@ neutron-cli rate
|
|
|
18
18
|
|
|
19
19
|
> **Note:** If you just want to try it without installing, use `npx neutron-cli --help`. But for regular use, global install is recommended.
|
|
20
20
|
|
|
21
|
-
##
|
|
21
|
+
## Setup
|
|
22
22
|
|
|
23
|
-
|
|
23
|
+
First time you run any command, you'll be prompted for your credentials:
|
|
24
24
|
|
|
25
|
-
```bash
|
|
26
|
-
export NEUTRON_API_KEY=your_api_key
|
|
27
|
-
export NEUTRON_API_SECRET=your_api_secret
|
|
28
25
|
```
|
|
26
|
+
⚡ Welcome to Neutron CLI
|
|
27
|
+
Get your API key at: https://portal.neutron.me
|
|
29
28
|
|
|
30
|
-
|
|
29
|
+
API Key: ****************
|
|
30
|
+
API Secret: ****************
|
|
31
31
|
|
|
32
|
-
|
|
33
|
-
{
|
|
34
|
-
"apiKey": "your_api_key",
|
|
35
|
-
"apiSecret": "your_api_secret"
|
|
36
|
-
}
|
|
32
|
+
✅ Credentials saved to ~/.neutron/config.json
|
|
37
33
|
```
|
|
38
34
|
|
|
39
|
-
|
|
35
|
+
Credentials are stored in `~/.neutron/config.json` with `600` permissions (private to you). You'll never be prompted again.
|
|
40
36
|
|
|
41
37
|
## Commands
|
|
42
38
|
|
|
43
39
|
### Verify credentials
|
|
44
40
|
```bash
|
|
45
41
|
neutron-cli auth
|
|
46
|
-
neutron-cli auth --pretty
|
|
47
42
|
```
|
|
48
43
|
|
|
49
44
|
### Check balances
|
|
50
45
|
```bash
|
|
51
46
|
neutron-cli balance
|
|
52
|
-
neutron-cli balance --pretty
|
|
53
47
|
```
|
|
54
48
|
|
|
55
49
|
### Create a Lightning invoice
|
|
@@ -58,11 +52,64 @@ neutron-cli invoice --amount 5000
|
|
|
58
52
|
neutron-cli invoice --amount 5000 --memo "order #123"
|
|
59
53
|
```
|
|
60
54
|
|
|
61
|
-
### Send a payment
|
|
55
|
+
### Send a payment — auto-detects payment type
|
|
62
56
|
```bash
|
|
57
|
+
# Lightning (BOLT11 invoice)
|
|
63
58
|
neutron-cli send --to lnbc50u1p... --amount 5000
|
|
59
|
+
|
|
60
|
+
# Bitcoin on-chain (auto-detected from address format)
|
|
61
|
+
neutron-cli send --to 1A1zP1eP5QGefi2DMPTfTL5SLmv7Divf... --amount 5000
|
|
62
|
+
|
|
63
|
+
# USDT on TRON (auto-detected from T... address)
|
|
64
|
+
neutron-cli send --to TQn9Y2khEsLJW1ChVWFMSMeRDow5KcbLSE --amount 10 --currency USDT
|
|
65
|
+
|
|
66
|
+
# USDT on ETH (auto-detected from 0x... address)
|
|
67
|
+
neutron-cli send --to 0xAbC123... --amount 10 --currency USDT
|
|
64
68
|
```
|
|
65
69
|
|
|
70
|
+
> `send` automatically detects the payment type from the destination address — no flags needed:
|
|
71
|
+
> - `lnbc...` → Lightning
|
|
72
|
+
> - `1...`, `3...`, `bc1...` → Bitcoin on-chain
|
|
73
|
+
> - `T...` → USDT on TRON
|
|
74
|
+
> - `0x...` → USDT on Ethereum
|
|
75
|
+
|
|
76
|
+
### Get deposit addresses
|
|
77
|
+
```bash
|
|
78
|
+
neutron-cli address btc # Bitcoin on-chain deposit address
|
|
79
|
+
neutron-cli address usdt # USDT on TRON (default)
|
|
80
|
+
neutron-cli address usdt --chain ETH # USDT on Ethereum
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### Swap currencies
|
|
84
|
+
```bash
|
|
85
|
+
neutron-cli swap --from BTC --to USDT --amount 1000 # BTC → USDT (amount in sats)
|
|
86
|
+
neutron-cli swap --from USDT --to BTC --amount 10 # USDT → BTC
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### Fiat payouts
|
|
90
|
+
```bash
|
|
91
|
+
# List banks for a country
|
|
92
|
+
neutron-cli fiat institutions --country VN
|
|
93
|
+
|
|
94
|
+
# Send fiat payout (KYC required)
|
|
95
|
+
neutron-cli fiat payout \
|
|
96
|
+
--amount 0.001 \
|
|
97
|
+
--from BTC \
|
|
98
|
+
--to VND \
|
|
99
|
+
--method vnd-instant \
|
|
100
|
+
--bank-account 0123456789 \
|
|
101
|
+
--bank-code 970422 \
|
|
102
|
+
--recipient "LE VAN A" \
|
|
103
|
+
--country VN
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
> Fiat payouts require KYC verification. If not verified, you'll see:
|
|
107
|
+
> ```
|
|
108
|
+
> ⚠️ Fiat payouts require KYC verification.
|
|
109
|
+
> Complete KYC at: https://portal.neutron.me
|
|
110
|
+
> (Bitcoin, USDT, and Lightning don't require KYC)
|
|
111
|
+
> ```
|
|
112
|
+
|
|
66
113
|
### Transactions
|
|
67
114
|
```bash
|
|
68
115
|
neutron-cli tx get txn_abc123
|
|
@@ -83,44 +130,47 @@ neutron-cli webhook list
|
|
|
83
130
|
neutron-cli webhook delete wh_abc123
|
|
84
131
|
```
|
|
85
132
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
133
|
+
### Manage config
|
|
134
|
+
```bash
|
|
135
|
+
neutron-cli config init # set up credentials
|
|
136
|
+
neutron-cli config show # show current credentials (masked)
|
|
137
|
+
neutron-cli config test # test credentials against API
|
|
138
|
+
```
|
|
89
139
|
|
|
90
|
-
|
|
91
|
-
|
|
140
|
+
### Update
|
|
141
|
+
```bash
|
|
142
|
+
neutron-cli update # update to latest version
|
|
92
143
|
```
|
|
93
144
|
|
|
94
|
-
|
|
145
|
+
## Output
|
|
146
|
+
|
|
147
|
+
TUI (colored, human-readable) is the default. Add `--json` for machine-readable output:
|
|
95
148
|
|
|
96
149
|
```bash
|
|
97
|
-
neutron-cli balance --
|
|
98
|
-
#
|
|
99
|
-
# BTC 50,000 sats (Main)
|
|
150
|
+
neutron-cli balance --json
|
|
151
|
+
# {"ok":true,"data":{"wallets":[...]}}
|
|
100
152
|
```
|
|
101
153
|
|
|
102
154
|
Errors go to stderr with exit code 1:
|
|
103
|
-
|
|
104
155
|
```json
|
|
105
156
|
{"error":"Missing credentials","code":"AUTH_MISSING"}
|
|
106
157
|
```
|
|
107
158
|
|
|
108
159
|
## For AI Agents
|
|
109
160
|
|
|
110
|
-
Any AI agent with bash/exec access can use Neutron immediately:
|
|
161
|
+
Any AI agent with bash/exec access can use Neutron immediately — no MCP setup required:
|
|
111
162
|
|
|
112
163
|
```bash
|
|
113
|
-
# Set credentials once
|
|
114
164
|
export NEUTRON_API_KEY=...
|
|
115
165
|
export NEUTRON_API_SECRET=...
|
|
116
166
|
|
|
117
|
-
|
|
118
|
-
neutron-cli
|
|
119
|
-
neutron-cli
|
|
120
|
-
neutron-cli
|
|
167
|
+
neutron-cli invoice --amount 1000 --memo "agent payment" --json
|
|
168
|
+
neutron-cli tx list --limit 5 --json
|
|
169
|
+
neutron-cli rate --currency usd --json
|
|
170
|
+
neutron-cli send --to lnbc... --amount 1000 --json
|
|
121
171
|
```
|
|
122
172
|
|
|
123
|
-
|
|
173
|
+
Works with Claude Code, Codex, and any agent that can run shell commands.
|
|
124
174
|
|
|
125
175
|
## Links
|
|
126
176
|
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAMtC,UAAU,MAAM;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAoED,wBAAsB,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,CAYlD;AAID,wBAAsB,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC,CAMlD"}
|
package/dist/client.js
CHANGED
|
@@ -3,7 +3,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.loadConfig = loadConfig;
|
|
4
4
|
exports.getClient = getClient;
|
|
5
5
|
const fs_1 = require("fs");
|
|
6
|
-
const readline_1 = require("readline");
|
|
7
6
|
const os_1 = require("os");
|
|
8
7
|
const path_1 = require("path");
|
|
9
8
|
const neutron_sdk_1 = require("neutron-sdk");
|
|
@@ -31,7 +30,7 @@ function saveConfigFile(cfg) {
|
|
|
31
30
|
(0, fs_1.chmodSync)(CONFIG_PATH, 0o600);
|
|
32
31
|
(0, fs_1.chmodSync)(CONFIG_DIR, 0o700);
|
|
33
32
|
}
|
|
34
|
-
function
|
|
33
|
+
function promptMasked(question) {
|
|
35
34
|
return new Promise((resolve) => {
|
|
36
35
|
process.stdout.write(question);
|
|
37
36
|
let input = "";
|
|
@@ -46,13 +45,13 @@ function promptHidden(question) {
|
|
|
46
45
|
resolve(input);
|
|
47
46
|
}
|
|
48
47
|
else if (ch === "\u0003") {
|
|
48
|
+
process.stdout.write("\n");
|
|
49
49
|
process.exit();
|
|
50
50
|
}
|
|
51
|
-
else if (ch === "\u007f") {
|
|
52
|
-
|
|
51
|
+
else if (ch === "\u007f" || ch === "\b") {
|
|
52
|
+
// backspace — silently remove last char, no visual change
|
|
53
|
+
if (input.length > 0)
|
|
53
54
|
input = input.slice(0, -1);
|
|
54
|
-
process.stdout.write("\b \b");
|
|
55
|
-
}
|
|
56
55
|
}
|
|
57
56
|
else {
|
|
58
57
|
input += ch;
|
|
@@ -62,22 +61,16 @@ function promptHidden(question) {
|
|
|
62
61
|
process.stdin.on("data", handler);
|
|
63
62
|
});
|
|
64
63
|
}
|
|
65
|
-
function promptLine(question) {
|
|
66
|
-
return new Promise((resolve) => {
|
|
67
|
-
const rl = (0, readline_1.createInterface)({ input: process.stdin, output: process.stdout });
|
|
68
|
-
rl.question(question, (ans) => { rl.close(); resolve(ans.trim()); });
|
|
69
|
-
});
|
|
70
|
-
}
|
|
71
64
|
async function runFirstTimeSetup() {
|
|
72
65
|
console.log("\n" + output_js_1.chalk.bold.cyan("⚡ Welcome to Neutron CLI"));
|
|
73
66
|
console.log(output_js_1.chalk.dim(" No credentials found. Let's set them up.\n"));
|
|
74
67
|
console.log(output_js_1.chalk.dim(" Get your API key at: ") + output_js_1.chalk.cyan.underline("https://portal.neutron.me") + "\n");
|
|
75
|
-
const apiKey = await
|
|
68
|
+
const apiKey = await promptMasked(output_js_1.chalk.bold(" API Key: "));
|
|
76
69
|
if (!apiKey) {
|
|
77
70
|
console.error(output_js_1.chalk.red(" API key is required."));
|
|
78
71
|
process.exit(1);
|
|
79
72
|
}
|
|
80
|
-
const apiSecret = await
|
|
73
|
+
const apiSecret = await promptMasked(output_js_1.chalk.bold(" API Secret: "));
|
|
81
74
|
if (!apiSecret) {
|
|
82
75
|
console.error(output_js_1.chalk.red(" API secret is required."));
|
|
83
76
|
process.exit(1);
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"address.d.ts","sourceRoot":"","sources":["../../src/commands/address.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoEtD"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerAddress = registerAddress;
|
|
4
|
+
const client_js_1 = require("../client.js");
|
|
5
|
+
const output_js_1 = require("../output.js");
|
|
6
|
+
function registerAddress(program) {
|
|
7
|
+
const addressCmd = program
|
|
8
|
+
.command("address")
|
|
9
|
+
.description("Get deposit addresses for your account");
|
|
10
|
+
addressCmd
|
|
11
|
+
.command("btc")
|
|
12
|
+
.description("Get your Bitcoin on-chain deposit address")
|
|
13
|
+
.option("--json", "Output raw JSON (for scripts/agents)")
|
|
14
|
+
.action(async (opts) => {
|
|
15
|
+
try {
|
|
16
|
+
const client = await (0, client_js_1.getClient)();
|
|
17
|
+
const spinner = (0, output_js_1.isPretty)(opts) ? (0, output_js_1.spin)("Fetching BTC address...") : null;
|
|
18
|
+
const result = await client.account.btcAddress();
|
|
19
|
+
spinner?.succeed(output_js_1.chalk.green("Address loaded"));
|
|
20
|
+
if ((0, output_js_1.isPretty)(opts)) {
|
|
21
|
+
(0, output_js_1.header)("Bitcoin Deposit Address (On-chain)");
|
|
22
|
+
(0, output_js_1.kv)("Address:", output_js_1.chalk.bold.yellow(result.address));
|
|
23
|
+
(0, output_js_1.kv)("Network:", "Bitcoin Mainnet");
|
|
24
|
+
console.log();
|
|
25
|
+
console.log(output_js_1.chalk.dim(" 💡 This is a static, reusable address for your account."));
|
|
26
|
+
console.log(output_js_1.chalk.dim(" Scan or paste into any Bitcoin wallet to deposit."));
|
|
27
|
+
console.log();
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
(0, output_js_1.ok)({ address: result.address, network: "BTC" });
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
catch (e) {
|
|
34
|
+
(0, output_js_1.fail)(e?.message ?? "Failed to fetch BTC address", "ADDRESS_ERROR");
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
addressCmd
|
|
38
|
+
.command("usdt")
|
|
39
|
+
.description("Get your USDT deposit address")
|
|
40
|
+
.option("--chain <chain>", "Blockchain network (TRON or ETH)", "TRON")
|
|
41
|
+
.option("--json", "Output raw JSON (for scripts/agents)")
|
|
42
|
+
.action(async (opts) => {
|
|
43
|
+
try {
|
|
44
|
+
const chain = opts.chain.toUpperCase();
|
|
45
|
+
if (chain !== "TRON" && chain !== "ETH") {
|
|
46
|
+
(0, output_js_1.fail)(`Invalid chain "${opts.chain}". Use TRON or ETH.`, "INVALID_CHAIN");
|
|
47
|
+
}
|
|
48
|
+
const client = await (0, client_js_1.getClient)();
|
|
49
|
+
const spinner = (0, output_js_1.isPretty)(opts) ? (0, output_js_1.spin)(`Fetching USDT address (${chain})...`) : null;
|
|
50
|
+
const result = await client.account.usdtAddress(chain);
|
|
51
|
+
spinner?.succeed(output_js_1.chalk.green("Address loaded"));
|
|
52
|
+
if ((0, output_js_1.isPretty)(opts)) {
|
|
53
|
+
(0, output_js_1.header)(`USDT Deposit Address (${result.chain})`);
|
|
54
|
+
(0, output_js_1.kv)("Address:", output_js_1.chalk.bold.yellow(result.address));
|
|
55
|
+
(0, output_js_1.kv)("Network:", result.chain);
|
|
56
|
+
(0, output_js_1.kv)("Currency:", "USDT (Tether)");
|
|
57
|
+
console.log();
|
|
58
|
+
const feeNote = result.chain === "TRON"
|
|
59
|
+
? "💡 TRON recommended — low fees and fast confirmations."
|
|
60
|
+
: "💡 ETH network — higher gas fees, use for large amounts only.";
|
|
61
|
+
console.log(output_js_1.chalk.dim(` ${feeNote}`));
|
|
62
|
+
console.log(output_js_1.chalk.dim(" This is a static, reusable address for your account."));
|
|
63
|
+
console.log();
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
(0, output_js_1.ok)({ address: result.address, chain: result.chain, currency: "USDT" });
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
catch (e) {
|
|
70
|
+
(0, output_js_1.fail)(e?.message ?? "Failed to fetch USDT address", "ADDRESS_ERROR");
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=address.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"address.js","sourceRoot":"","sources":["../../src/commands/address.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fiat.d.ts","sourceRoot":"","sources":["../../src/commands/fiat.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAsHnD"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerFiat = registerFiat;
|
|
4
|
+
const client_js_1 = require("../client.js");
|
|
5
|
+
const output_js_1 = require("../output.js");
|
|
6
|
+
const KYC_PORTAL_URL = "https://portal.neutron.me";
|
|
7
|
+
function registerFiat(program) {
|
|
8
|
+
const fiatCmd = program
|
|
9
|
+
.command("fiat")
|
|
10
|
+
.description("Fiat payout operations");
|
|
11
|
+
fiatCmd
|
|
12
|
+
.command("institutions")
|
|
13
|
+
.description("List banks and financial institutions for a country")
|
|
14
|
+
.requiredOption("--country <code>", "Country code (e.g., VN, PH, TH)")
|
|
15
|
+
.option("--json", "Output raw JSON (for scripts/agents)")
|
|
16
|
+
.action(async (opts) => {
|
|
17
|
+
try {
|
|
18
|
+
const country = opts.country.toUpperCase();
|
|
19
|
+
const client = await (0, client_js_1.getClient)();
|
|
20
|
+
const spinner = (0, output_js_1.isPretty)(opts) ? (0, output_js_1.spin)(`Fetching banks for ${country}...`) : null;
|
|
21
|
+
const institutions = await client.fiat.institutions(country);
|
|
22
|
+
spinner?.succeed(output_js_1.chalk.green(`Found ${institutions.length} institutions`));
|
|
23
|
+
if ((0, output_js_1.isPretty)(opts)) {
|
|
24
|
+
(0, output_js_1.header)(`Banks & Institutions (${country})`);
|
|
25
|
+
if (institutions.length === 0) {
|
|
26
|
+
console.log(output_js_1.chalk.dim(" No institutions found for this country."));
|
|
27
|
+
console.log();
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
const table = new output_js_1.Table({
|
|
31
|
+
head: [output_js_1.chalk.cyan("Code"), output_js_1.chalk.cyan("Name")],
|
|
32
|
+
style: { head: [], border: ["dim"] },
|
|
33
|
+
});
|
|
34
|
+
for (const inst of institutions) {
|
|
35
|
+
table.push([output_js_1.chalk.bold(inst.code), inst.name]);
|
|
36
|
+
}
|
|
37
|
+
console.log(table.toString());
|
|
38
|
+
console.log(output_js_1.chalk.dim(`\n Use the code with: neutron-cli fiat payout --bank-code <code>\n`));
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
(0, output_js_1.ok)({ country, institutions });
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
catch (e) {
|
|
45
|
+
(0, output_js_1.fail)(e?.message ?? "Failed to fetch institutions", "FIAT_ERROR");
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
fiatCmd
|
|
49
|
+
.command("payout")
|
|
50
|
+
.description("Create a fiat payout to a bank account")
|
|
51
|
+
.requiredOption("--amount <btc>", "Amount in BTC (e.g., 0.001)")
|
|
52
|
+
.requiredOption("--from <currency>", "Source currency (e.g., BTC)")
|
|
53
|
+
.requiredOption("--to <currency>", "Destination fiat currency (e.g., VND)")
|
|
54
|
+
.requiredOption("--method <method>", "Payment method (e.g., vnd-instant)")
|
|
55
|
+
.requiredOption("--bank-account <number>", "Bank account number")
|
|
56
|
+
.requiredOption("--bank-code <code>", "Bank/institution code")
|
|
57
|
+
.requiredOption("--recipient <name>", "Recipient legal full name")
|
|
58
|
+
.requiredOption("--country <code>", "Recipient country code (e.g., VN)")
|
|
59
|
+
.option("--json", "Output raw JSON (for scripts/agents)")
|
|
60
|
+
.action(async (opts) => {
|
|
61
|
+
try {
|
|
62
|
+
const client = await (0, client_js_1.getClient)();
|
|
63
|
+
const spinner = (0, output_js_1.isPretty)(opts) ? (0, output_js_1.spin)("Checking account...") : null;
|
|
64
|
+
// KYC check — fiat payouts require verification
|
|
65
|
+
const account = await client.account.get();
|
|
66
|
+
const kycStatus = account.kycStatus ?? account.accountStatus ?? account.kycVerified ?? account.status;
|
|
67
|
+
// KYC is verified if status is "verified" or similar positive states
|
|
68
|
+
const isKycVerified = kycStatus === "verified" || kycStatus === "kyc_verified" || kycStatus === "active";
|
|
69
|
+
if (!isKycVerified) {
|
|
70
|
+
spinner?.stop();
|
|
71
|
+
console.log();
|
|
72
|
+
(0, output_js_1.warn)("Fiat payouts require KYC verification.");
|
|
73
|
+
console.log(output_js_1.chalk.dim(" Please complete KYC at: ") + output_js_1.chalk.cyan.underline(KYC_PORTAL_URL));
|
|
74
|
+
console.log(output_js_1.chalk.dim(" (Bitcoin, USDT, and Lightning payments don't require KYC)"));
|
|
75
|
+
console.log();
|
|
76
|
+
process.exit(1);
|
|
77
|
+
}
|
|
78
|
+
if (spinner)
|
|
79
|
+
spinner.text = "Creating payout...";
|
|
80
|
+
const sourceAmount = parseFloat(opts.amount);
|
|
81
|
+
const sourceCcy = opts.from.toUpperCase();
|
|
82
|
+
const destCcy = opts.to.toUpperCase();
|
|
83
|
+
const destMethod = opts.method.toLowerCase();
|
|
84
|
+
const countryCode = opts.country.toUpperCase();
|
|
85
|
+
const txn = await client.fiat.payout({
|
|
86
|
+
sourceCcy,
|
|
87
|
+
sourceAmount,
|
|
88
|
+
destCcy,
|
|
89
|
+
destMethod,
|
|
90
|
+
bankAcctNum: opts.bankAccount,
|
|
91
|
+
institutionCode: opts.bankCode,
|
|
92
|
+
recipientName: opts.recipient,
|
|
93
|
+
countryCode,
|
|
94
|
+
});
|
|
95
|
+
const txnId = txn.txnId ?? txn.id;
|
|
96
|
+
if (spinner)
|
|
97
|
+
spinner.text = "Confirming payout...";
|
|
98
|
+
const confirmed = await client.transactions.confirm(txnId);
|
|
99
|
+
spinner?.succeed(output_js_1.chalk.green("Payout submitted"));
|
|
100
|
+
if ((0, output_js_1.isPretty)(opts)) {
|
|
101
|
+
(0, output_js_1.header)("Fiat Payout Submitted");
|
|
102
|
+
(0, output_js_1.kv)("Transaction ID:", output_js_1.chalk.bold(txnId));
|
|
103
|
+
(0, output_js_1.kv)("Status:", output_js_1.chalk.green(confirmed.txnState ?? confirmed.status ?? "Processing"));
|
|
104
|
+
(0, output_js_1.kv)("Amount Sent:", output_js_1.chalk.yellow(`${sourceAmount} ${sourceCcy}`));
|
|
105
|
+
if (txn.fxRate) {
|
|
106
|
+
(0, output_js_1.kv)("Exchange Rate:", txn.fxRate.toString());
|
|
107
|
+
}
|
|
108
|
+
(0, output_js_1.kv)("Destination:", `${destCcy} → ${opts.recipient}`);
|
|
109
|
+
(0, output_js_1.kv)("Bank:", opts.bankCode);
|
|
110
|
+
console.log();
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
(0, output_js_1.ok)({ txnId, status: confirmed.txnState ?? confirmed.status, transaction: confirmed });
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
catch (e) {
|
|
117
|
+
(0, output_js_1.fail)(e?.message ?? "Fiat payout failed", "PAYOUT_ERROR");
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=fiat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fiat.js","sourceRoot":"","sources":["../../src/commands/fiat.ts"],"names":[],"mappings":";;AAMA,oCAsHC;AA3HD,4CAAyC;AACzC,4CAAwF;AAExF,MAAM,cAAc,GAAG,2BAA2B,CAAC;AAEnD,SAAgB,YAAY,CAAC,OAAgB;IAC3C,MAAM,OAAO,GAAG,OAAO;SACpB,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,wBAAwB,CAAC,CAAC;IAEzC,OAAO;SACJ,OAAO,CAAC,cAAc,CAAC;SACvB,WAAW,CAAC,qDAAqD,CAAC;SAClE,cAAc,CAAC,kBAAkB,EAAE,iCAAiC,CAAC;SACrE,MAAM,CAAC,QAAQ,EAAE,sCAAsC,CAAC;SACxD,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;YAC3C,MAAM,MAAM,GAAG,MAAM,IAAA,qBAAS,GAAE,CAAC;YACjC,MAAM,OAAO,GAAG,IAAA,oBAAQ,EAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAA,gBAAI,EAAC,sBAAsB,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YACjF,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YAC7D,OAAO,EAAE,OAAO,CAAC,iBAAK,CAAC,KAAK,CAAC,SAAS,YAAY,CAAC,MAAM,eAAe,CAAC,CAAC,CAAC;YAE3E,IAAI,IAAA,oBAAQ,EAAC,IAAI,CAAC,EAAE,CAAC;gBACnB,IAAA,kBAAM,EAAC,yBAAyB,OAAO,GAAG,CAAC,CAAC;gBAC5C,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC9B,OAAO,CAAC,GAAG,CAAC,iBAAK,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC,CAAC;oBACpE,OAAO,CAAC,GAAG,EAAE,CAAC;oBACd,OAAO;gBACT,CAAC;gBACD,MAAM,KAAK,GAAG,IAAI,iBAAK,CAAC;oBACtB,IAAI,EAAE,CAAC,iBAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,iBAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBAC9C,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE;iBACrC,CAAC,CAAC;gBACH,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;oBAChC,KAAK,CAAC,IAAI,CAAC,CAAC,iBAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;gBACjD,CAAC;gBACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;gBAC9B,OAAO,CAAC,GAAG,CAAC,iBAAK,CAAC,GAAG,CAAC,qEAAqE,CAAC,CAAC,CAAC;YAChG,CAAC;iBAAM,CAAC;gBACN,IAAA,cAAE,EAAC,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,IAAA,gBAAI,EAAC,CAAC,EAAE,OAAO,IAAI,8BAA8B,EAAE,YAAY,CAAC,CAAC;QACnE,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,wCAAwC,CAAC;SACrD,cAAc,CAAC,gBAAgB,EAAE,6BAA6B,CAAC;SAC/D,cAAc,CAAC,mBAAmB,EAAE,6BAA6B,CAAC;SAClE,cAAc,CAAC,iBAAiB,EAAE,uCAAuC,CAAC;SAC1E,cAAc,CAAC,mBAAmB,EAAE,oCAAoC,CAAC;SACzE,cAAc,CAAC,yBAAyB,EAAE,qBAAqB,CAAC;SAChE,cAAc,CAAC,oBAAoB,EAAE,uBAAuB,CAAC;SAC7D,cAAc,CAAC,oBAAoB,EAAE,2BAA2B,CAAC;SACjE,cAAc,CAAC,kBAAkB,EAAE,mCAAmC,CAAC;SACvE,MAAM,CAAC,QAAQ,EAAE,sCAAsC,CAAC;SACxD,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAA,qBAAS,GAAE,CAAC;YACjC,MAAM,OAAO,GAAG,IAAA,oBAAQ,EAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAA,gBAAI,EAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAEpE,gDAAgD;YAChD,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,GAAG,EAAS,CAAC;YAClD,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,aAAa,IAAI,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC;YAEtG,qEAAqE;YACrE,MAAM,aAAa,GAAG,SAAS,KAAK,UAAU,IAAI,SAAS,KAAK,cAAc,IAAI,SAAS,KAAK,QAAQ,CAAC;YAEzG,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnB,OAAO,EAAE,IAAI,EAAE,CAAC;gBAChB,OAAO,CAAC,GAAG,EAAE,CAAC;gBACd,IAAA,gBAAI,EAAC,wCAAwC,CAAC,CAAC;gBAC/C,OAAO,CAAC,GAAG,CAAC,iBAAK,CAAC,GAAG,CAAC,6BAA6B,CAAC,GAAG,iBAAK,CAAC,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,CAAC;gBAC7F,OAAO,CAAC,GAAG,CAAC,iBAAK,CAAC,GAAG,CAAC,8DAA8D,CAAC,CAAC,CAAC;gBACvF,OAAO,CAAC,GAAG,EAAE,CAAC;gBACd,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,IAAI,OAAO;gBAAE,OAAO,CAAC,IAAI,GAAG,oBAAoB,CAAC;YACjD,MAAM,YAAY,GAAG,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC7C,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC;YACtC,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;YAC7C,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;YAE/C,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;gBACnC,SAAS;gBACT,YAAY;gBACZ,OAAO;gBACP,UAAU;gBACV,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,eAAe,EAAE,IAAI,CAAC,QAAQ;gBAC9B,aAAa,EAAE,IAAI,CAAC,SAAS;gBAC7B,WAAW;aACZ,CAAQ,CAAC;YAEV,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,EAAE,CAAC;YAElC,IAAI,OAAO;gBAAE,OAAO,CAAC,IAAI,GAAG,sBAAsB,CAAC;YACnD,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,CAAQ,CAAC;YAClE,OAAO,EAAE,OAAO,CAAC,iBAAK,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,CAAC;YAElD,IAAI,IAAA,oBAAQ,EAAC,IAAI,CAAC,EAAE,CAAC;gBACnB,IAAA,kBAAM,EAAC,uBAAuB,CAAC,CAAC;gBAChC,IAAA,cAAE,EAAC,iBAAiB,EAAE,iBAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;gBACzC,IAAA,cAAE,EAAC,SAAS,EAAE,iBAAK,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,IAAI,SAAS,CAAC,MAAM,IAAI,YAAY,CAAC,CAAC,CAAC;gBACnF,IAAA,cAAE,EAAC,cAAc,EAAE,iBAAK,CAAC,MAAM,CAAC,GAAG,YAAY,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC;gBACjE,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;oBACf,IAAA,cAAE,EAAC,gBAAgB,EAAE,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;gBAC9C,CAAC;gBACD,IAAA,cAAE,EAAC,cAAc,EAAE,GAAG,OAAO,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;gBACrD,IAAA,cAAE,EAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC3B,OAAO,CAAC,GAAG,EAAE,CAAC;YAChB,CAAC;iBAAM,CAAC;gBACN,IAAA,cAAE,EAAC,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,QAAQ,IAAI,SAAS,CAAC,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC;YACxF,CAAC;QACH,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,IAAA,gBAAI,EAAC,CAAC,EAAE,OAAO,IAAI,oBAAoB,EAAE,cAAc,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"send.d.ts","sourceRoot":"","sources":["../../src/commands/send.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"send.d.ts","sourceRoot":"","sources":["../../src/commands/send.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkCpC,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA8FnD"}
|
package/dist/commands/send.js
CHANGED
|
@@ -3,31 +3,107 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.registerSend = registerSend;
|
|
4
4
|
const client_js_1 = require("../client.js");
|
|
5
5
|
const output_js_1 = require("../output.js");
|
|
6
|
+
/** Detect payment type from the destination address/invoice */
|
|
7
|
+
function detectPaymentType(to) {
|
|
8
|
+
const normalized = to.trim().toLowerCase();
|
|
9
|
+
// Lightning invoice
|
|
10
|
+
if (normalized.startsWith("lnbc") || normalized.startsWith("lntb")) {
|
|
11
|
+
return { method: "lightning", ccy: "BTC" };
|
|
12
|
+
}
|
|
13
|
+
// Bitcoin on-chain addresses
|
|
14
|
+
// Legacy (1...), P2SH (3...), Bech32/Bech32m (bc1...)
|
|
15
|
+
if (/^1[a-km-zA-HJ-NP-Z1-9]{25,34}$/.test(to) ||
|
|
16
|
+
/^3[a-km-zA-HJ-NP-Z1-9]{25,34}$/.test(to) ||
|
|
17
|
+
/^bc1[ac-hj-np-zAC-HJ-NP-Z02-9]{8,87}$/i.test(to)) {
|
|
18
|
+
return { method: "on-chain", ccy: "BTC" };
|
|
19
|
+
}
|
|
20
|
+
// USDT on TRON (T...) or ETH (0x...) - will be validated by currency flag
|
|
21
|
+
if (/^T[A-Za-z1-9]{33}$/.test(to)) {
|
|
22
|
+
return { method: "tron", ccy: "USDT" };
|
|
23
|
+
}
|
|
24
|
+
if (/^0x[a-fA-F0-9]{40}$/.test(to)) {
|
|
25
|
+
return { method: "eth", ccy: "USDT" };
|
|
26
|
+
}
|
|
27
|
+
// Unknown format
|
|
28
|
+
return { method: "unknown", ccy: "UNKNOWN" };
|
|
29
|
+
}
|
|
6
30
|
function registerSend(program) {
|
|
7
31
|
program
|
|
8
32
|
.command("send")
|
|
9
|
-
.description("Send a Lightning
|
|
10
|
-
.requiredOption("--to <
|
|
11
|
-
.requiredOption("--amount <
|
|
12
|
-
.option("--currency <currency>", "Source wallet currency", "btc")
|
|
33
|
+
.description("Send a payment (Lightning, BTC on-chain, or USDT)")
|
|
34
|
+
.requiredOption("--to <address>", "Destination address or Lightning invoice")
|
|
35
|
+
.requiredOption("--amount <number>", "Amount (sats for BTC/ Lightning, units for USDT)")
|
|
36
|
+
.option("--currency <currency>", "Source wallet currency (default: auto-detect)", "btc")
|
|
37
|
+
.option("--chain <chain>", "Chain for USDT (TRON or ETH)", "TRON")
|
|
13
38
|
.option("--json", "Output raw JSON (for scripts/agents)")
|
|
14
39
|
.action(async (opts) => {
|
|
15
40
|
try {
|
|
41
|
+
const to = opts.to.trim();
|
|
42
|
+
const amount = parseFloat(opts.amount);
|
|
43
|
+
const detected = detectPaymentType(to);
|
|
44
|
+
// Validate detection
|
|
45
|
+
if (detected.method === "unknown") {
|
|
46
|
+
(0, output_js_1.fail)(`Unrecognized address format: "${to.substring(0, 20)}..."\n` +
|
|
47
|
+
` Supported formats:\n` +
|
|
48
|
+
` - Lightning: lnbc...\n` +
|
|
49
|
+
` - BTC on-chain: 1..., 3..., bc1...\n` +
|
|
50
|
+
` - USDT (TRON): T...\n` +
|
|
51
|
+
` - USDT (ETH): 0x...`, "INVALID_ADDRESS");
|
|
52
|
+
}
|
|
16
53
|
const client = await (0, client_js_1.getClient)();
|
|
17
|
-
const spinner = (0, output_js_1.isPretty)(opts) ? (0, output_js_1.spin)(
|
|
54
|
+
const spinner = (0, output_js_1.isPretty)(opts) ? (0, output_js_1.spin)(`Preparing ${detected.method} payment...`) : null;
|
|
55
|
+
// Build transaction based on payment type
|
|
56
|
+
let sourceCcy = opts.currency.toUpperCase();
|
|
57
|
+
let destReq;
|
|
58
|
+
let sourceAmount = amount;
|
|
59
|
+
if (detected.method === "lightning") {
|
|
60
|
+
// Lightning payment
|
|
61
|
+
sourceAmount = sourceCcy === "BTC" ? amount / 1e8 : amount;
|
|
62
|
+
destReq = {
|
|
63
|
+
ccy: "BTC",
|
|
64
|
+
method: "lightning",
|
|
65
|
+
reqDetails: { paymentRequest: to }
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
else if (detected.method === "on-chain") {
|
|
69
|
+
// BTC on-chain
|
|
70
|
+
sourceCcy = "BTC";
|
|
71
|
+
sourceAmount = amount / 1e8; // Convert sats to BTC
|
|
72
|
+
destReq = {
|
|
73
|
+
ccy: "BTC",
|
|
74
|
+
method: "on-chain",
|
|
75
|
+
reqDetails: { address: to }
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
else if (detected.method === "tron" || detected.method === "eth") {
|
|
79
|
+
// USDT on TRON or ETH
|
|
80
|
+
sourceCcy = "USDT";
|
|
81
|
+
destReq = {
|
|
82
|
+
ccy: "USDT",
|
|
83
|
+
method: detected.method,
|
|
84
|
+
reqDetails: { address: to }
|
|
85
|
+
};
|
|
86
|
+
}
|
|
18
87
|
const txn = await client.transactions.create({
|
|
19
|
-
sourceReq: { ccy:
|
|
20
|
-
destReq
|
|
88
|
+
sourceReq: { ccy: sourceCcy, method: "neutronpay", amtRequested: sourceAmount },
|
|
89
|
+
destReq,
|
|
21
90
|
});
|
|
91
|
+
const txnId = txn.txnId ?? txn.id;
|
|
22
92
|
if (spinner)
|
|
23
93
|
spinner.text = "Confirming payment...";
|
|
24
|
-
const confirmed = await client.transactions.confirm(
|
|
94
|
+
const confirmed = await client.transactions.confirm(txnId);
|
|
25
95
|
spinner?.succeed(output_js_1.chalk.green("Payment sent"));
|
|
26
96
|
if ((0, output_js_1.isPretty)(opts)) {
|
|
27
97
|
(0, output_js_1.header)("Payment Sent");
|
|
28
|
-
(0, output_js_1.kv)("ID:", confirmed.txnId ?? confirmed.id ??
|
|
29
|
-
|
|
30
|
-
|
|
98
|
+
(0, output_js_1.kv)("ID:", confirmed.txnId ?? confirmed.id ?? txnId);
|
|
99
|
+
// Format amount display
|
|
100
|
+
const amtDisplay = detected.ccy === "BTC"
|
|
101
|
+
? `${amount.toLocaleString()} sats`
|
|
102
|
+
: `${amount.toLocaleString()} ${detected.ccy}`;
|
|
103
|
+
(0, output_js_1.kv)("Amount:", output_js_1.chalk.yellow(amtDisplay));
|
|
104
|
+
(0, output_js_1.kv)("Method:", detected.method);
|
|
105
|
+
(0, output_js_1.kv)("To:", to.length > 40 ? to.substring(0, 40) + "..." : to);
|
|
106
|
+
(0, output_js_1.kv)("Status:", output_js_1.chalk.green(confirmed.txnState ?? confirmed.status ?? "Sent"));
|
|
31
107
|
console.log();
|
|
32
108
|
}
|
|
33
109
|
else {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"send.js","sourceRoot":"","sources":["../../src/commands/send.ts"],"names":[],"mappings":";;
|
|
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,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA4EnD"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerSwap = registerSwap;
|
|
4
|
+
const client_js_1 = require("../client.js");
|
|
5
|
+
const output_js_1 = require("../output.js");
|
|
6
|
+
function registerSwap(program) {
|
|
7
|
+
program
|
|
8
|
+
.command("swap")
|
|
9
|
+
.description("Convert between currencies (BTC ↔ USDT)")
|
|
10
|
+
.requiredOption("--from <currency>", "Source currency (e.g., BTC, USDT)")
|
|
11
|
+
.requiredOption("--to <currency>", "Destination currency (e.g., USDT, BTC)")
|
|
12
|
+
.requiredOption("--amount <number>", "Amount in source units (sats for BTC, units for USDT)")
|
|
13
|
+
.option("--json", "Output raw JSON (for scripts/agents)")
|
|
14
|
+
.action(async (opts) => {
|
|
15
|
+
try {
|
|
16
|
+
const sourceCcy = opts.from.toUpperCase();
|
|
17
|
+
const destCcy = opts.to.toUpperCase();
|
|
18
|
+
const amount = parseFloat(opts.amount);
|
|
19
|
+
if (sourceCcy === destCcy) {
|
|
20
|
+
(0, output_js_1.fail)("Source and destination currencies must be different", "SWAP_ERROR");
|
|
21
|
+
}
|
|
22
|
+
// For BTC, amount is in satoshis; convert to BTC for API
|
|
23
|
+
const sourceAmount = sourceCcy === "BTC" ? amount / 1e8 : amount;
|
|
24
|
+
const client = await (0, client_js_1.getClient)();
|
|
25
|
+
const spinner = (0, output_js_1.isPretty)(opts) ? (0, output_js_1.spin)(`Creating ${sourceCcy} → ${destCcy} swap...`) : null;
|
|
26
|
+
const txn = await client.transactions.create({
|
|
27
|
+
sourceReq: { ccy: sourceCcy, method: "neutronpay", amtRequested: sourceAmount },
|
|
28
|
+
destReq: { ccy: destCcy, method: "neutronpay" },
|
|
29
|
+
});
|
|
30
|
+
const txnId = txn.txnId ?? txn.id;
|
|
31
|
+
const fxRate = txn.fxRate;
|
|
32
|
+
if (spinner)
|
|
33
|
+
spinner.text = "Confirming swap...";
|
|
34
|
+
const confirmed = await client.transactions.confirm(txnId);
|
|
35
|
+
spinner?.succeed(output_js_1.chalk.green("Swap completed"));
|
|
36
|
+
if ((0, output_js_1.isPretty)(opts)) {
|
|
37
|
+
(0, output_js_1.header)("Currency Swap Completed");
|
|
38
|
+
(0, output_js_1.kv)("Transaction ID:", output_js_1.chalk.bold(txnId));
|
|
39
|
+
(0, output_js_1.kv)("Status:", output_js_1.chalk.green(confirmed.txnState ?? confirmed.status ?? "Completed"));
|
|
40
|
+
// Display amounts nicely
|
|
41
|
+
const srcDisplay = sourceCcy === "BTC"
|
|
42
|
+
? `${amount.toLocaleString()} sats`
|
|
43
|
+
: `${amount.toLocaleString()} ${sourceCcy}`;
|
|
44
|
+
(0, output_js_1.kv)("Amount Sent:", output_js_1.chalk.yellow(srcDisplay));
|
|
45
|
+
if (fxRate) {
|
|
46
|
+
(0, output_js_1.kv)("Exchange Rate:", `${fxRate} ${sourceCcy}/${destCcy}`);
|
|
47
|
+
}
|
|
48
|
+
// Calculate received amount if we have the rate
|
|
49
|
+
if (fxRate && sourceCcy === "BTC" && destCcy === "USDT") {
|
|
50
|
+
const received = (amount / 1e8) * fxRate;
|
|
51
|
+
(0, output_js_1.kv)("Amount Received:", output_js_1.chalk.green(`${received.toLocaleString(undefined, { maximumFractionDigits: 2 })} ${destCcy}`));
|
|
52
|
+
}
|
|
53
|
+
else if (fxRate && sourceCcy === "USDT" && destCcy === "BTC") {
|
|
54
|
+
const received = (amount / fxRate) * 1e8;
|
|
55
|
+
(0, output_js_1.kv)("Amount Received:", output_js_1.chalk.green(`${Math.floor(received).toLocaleString()} sats`));
|
|
56
|
+
}
|
|
57
|
+
console.log();
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
(0, output_js_1.ok)({
|
|
61
|
+
txnId,
|
|
62
|
+
status: confirmed.txnState ?? confirmed.status,
|
|
63
|
+
sourceCcy,
|
|
64
|
+
destCcy,
|
|
65
|
+
sourceAmount: amount,
|
|
66
|
+
fxRate,
|
|
67
|
+
transaction: confirmed
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
catch (e) {
|
|
72
|
+
(0, output_js_1.fail)(e?.message ?? "Swap failed", "SWAP_ERROR");
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
//# 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.js
CHANGED
|
@@ -12,6 +12,9 @@ const rate_js_1 = require("./commands/rate.js");
|
|
|
12
12
|
const webhook_js_1 = require("./commands/webhook.js");
|
|
13
13
|
const update_js_1 = require("./commands/update.js");
|
|
14
14
|
const config_js_1 = require("./commands/config.js");
|
|
15
|
+
const address_js_1 = require("./commands/address.js");
|
|
16
|
+
const fiat_js_1 = require("./commands/fiat.js");
|
|
17
|
+
const swap_js_1 = require("./commands/swap.js");
|
|
15
18
|
const program = new commander_1.Command();
|
|
16
19
|
program
|
|
17
20
|
.name("neutron-cli")
|
|
@@ -26,6 +29,9 @@ program
|
|
|
26
29
|
(0, rate_js_1.registerRate)(program);
|
|
27
30
|
(0, webhook_js_1.registerWebhook)(program);
|
|
28
31
|
(0, update_js_1.registerUpdate)(program);
|
|
32
|
+
(0, address_js_1.registerAddress)(program);
|
|
33
|
+
(0, fiat_js_1.registerFiat)(program);
|
|
34
|
+
(0, swap_js_1.registerSwap)(program);
|
|
29
35
|
(0, update_check_js_1.checkForUpdate)(); // non-blocking, fires in background
|
|
30
36
|
program.parseAsync(process.argv).catch((e) => {
|
|
31
37
|
process.stderr.write(JSON.stringify({ error: e?.message ?? "Unknown error", code: "FATAL" }) + "\n");
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AACA,yCAAoC;AACpC,uDAAmD;AACnD,gDAAkD;AAClD,sDAAwD;AACxD,sDAAwD;AACxD,gDAAkD;AAClD,4CAA8C;AAC9C,gDAAkD;AAClD,sDAAwD;AACxD,oDAAsD;AACtD,oDAAsD;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AACA,yCAAoC;AACpC,uDAAmD;AACnD,gDAAkD;AAClD,sDAAwD;AACxD,sDAAwD;AACxD,gDAAkD;AAClD,4CAA8C;AAC9C,gDAAkD;AAClD,sDAAwD;AACxD,oDAAsD;AACtD,oDAAsD;AACtD,sDAAwD;AACxD,gDAAkD;AAClD,gDAAkD;AAElD,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,aAAa,CAAC;KACnB,WAAW,CAAC,iEAAiE,CAAC;KAC9E,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,OAAO,CAAC,CAAC;AAE/C,IAAA,0BAAc,EAAC,OAAO,CAAC,CAAC;AACxB,IAAA,sBAAY,EAAC,OAAO,CAAC,CAAC;AACtB,IAAA,4BAAe,EAAC,OAAO,CAAC,CAAC;AACzB,IAAA,4BAAe,EAAC,OAAO,CAAC,CAAC;AACzB,IAAA,sBAAY,EAAC,OAAO,CAAC,CAAC;AACtB,IAAA,kBAAU,EAAC,OAAO,CAAC,CAAC;AACpB,IAAA,sBAAY,EAAC,OAAO,CAAC,CAAC;AACtB,IAAA,4BAAe,EAAC,OAAO,CAAC,CAAC;AACzB,IAAA,0BAAc,EAAC,OAAO,CAAC,CAAC;AACxB,IAAA,4BAAe,EAAC,OAAO,CAAC,CAAC;AACzB,IAAA,sBAAY,EAAC,OAAO,CAAC,CAAC;AACtB,IAAA,sBAAY,EAAC,OAAO,CAAC,CAAC;AAEtB,IAAA,gCAAc,GAAE,CAAC,CAAC,oCAAoC;AAEtD,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;IAC3C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,IAAI,eAAe,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;IACrG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|