cards402 0.4.2 → 0.4.5
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/dist/commands/onboard.d.ts +11 -0
- package/dist/commands/onboard.d.ts.map +1 -1
- package/dist/commands/onboard.js +82 -8
- package/dist/commands/onboard.js.map +1 -1
- package/dist/commands/onboard.test.d.ts +2 -0
- package/dist/commands/onboard.test.d.ts.map +1 -0
- package/dist/commands/onboard.test.js +48 -0
- package/dist/commands/onboard.test.js.map +1 -0
- package/dist/commands/purchase.d.ts.map +1 -1
- package/dist/commands/purchase.js +77 -7
- package/dist/commands/purchase.js.map +1 -1
- package/dist/commands/wallet.d.ts.map +1 -1
- package/dist/commands/wallet.js +24 -8
- package/dist/commands/wallet.js.map +1 -1
- package/dist/config.d.ts +10 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js.map +1 -1
- package/package.json +7 -1
|
@@ -1,2 +1,13 @@
|
|
|
1
|
+
export { deriveDefaultWalletName as _deriveDefaultWalletName };
|
|
2
|
+
/**
|
|
3
|
+
* Derive a unique, deterministic wallet name from the agent label and
|
|
4
|
+
* claim code. Two different claims always produce different names, so
|
|
5
|
+
* running `cards402 onboard` multiple times on the same machine gives
|
|
6
|
+
* each agent its own OWS wallet file instead of silently reusing the
|
|
7
|
+
* previous agent's private keys. The claim-code suffix is what makes
|
|
8
|
+
* it unique; the label is just there to make the vault file readable
|
|
9
|
+
* on disk.
|
|
10
|
+
*/
|
|
11
|
+
declare function deriveDefaultWalletName(claim: string, label: string | null): string;
|
|
1
12
|
export declare function onboardCommand(argv: string[]): Promise<number>;
|
|
2
13
|
//# sourceMappingURL=onboard.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"onboard.d.ts","sourceRoot":"","sources":["../../src/commands/onboard.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"onboard.d.ts","sourceRoot":"","sources":["../../src/commands/onboard.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAE,uBAAuB,IAAI,wBAAwB,EAAE,CAAC;AAkE/D;;;;;;;;GAQG;AACH,iBAAS,uBAAuB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAgB5E;AAED,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA6IpE"}
|
package/dist/commands/onboard.js
CHANGED
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
// "Awaiting deposit" in their dashboard immediately.
|
|
13
13
|
// 5. Print the Stellar address + next steps.
|
|
14
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports._deriveDefaultWalletName = deriveDefaultWalletName;
|
|
15
16
|
exports.onboardCommand = onboardCommand;
|
|
16
17
|
const config_1 = require("../config");
|
|
17
18
|
const ows_1 = require("../ows");
|
|
@@ -36,12 +37,20 @@ function parseArgs(argv) {
|
|
|
36
37
|
out.apiBase = argv[++i];
|
|
37
38
|
else if (arg.startsWith('--api-base='))
|
|
38
39
|
out.apiBase = arg.slice('--api-base='.length);
|
|
40
|
+
else if (arg === '--vault-path')
|
|
41
|
+
out.vaultPath = argv[++i];
|
|
42
|
+
else if (arg.startsWith('--vault-path='))
|
|
43
|
+
out.vaultPath = arg.slice('--vault-path='.length);
|
|
44
|
+
else if (arg === '--passphrase-env')
|
|
45
|
+
out.passphraseEnv = argv[++i];
|
|
46
|
+
else if (arg.startsWith('--passphrase-env='))
|
|
47
|
+
out.passphraseEnv = arg.slice('--passphrase-env='.length);
|
|
39
48
|
}
|
|
40
49
|
return out;
|
|
41
50
|
}
|
|
42
51
|
function usage() {
|
|
43
52
|
process.stderr
|
|
44
|
-
.write(`Usage: cards402 onboard --claim <code> [--wallet-name <name>] [--api-base <url>]
|
|
53
|
+
.write(`Usage: cards402 onboard --claim <code> [--wallet-name <name>] [--vault-path <path>] [--passphrase-env <ENVNAME>] [--api-base <url>]
|
|
45
54
|
|
|
46
55
|
Exchanges a one-time claim code (from the cards402 dashboard) for an
|
|
47
56
|
api key, creates an OWS Stellar wallet, and registers its address with
|
|
@@ -52,12 +61,51 @@ is auto-loaded by the SDK on subsequent runs. You do NOT need to paste
|
|
|
52
61
|
the api key into any env var yourself.
|
|
53
62
|
|
|
54
63
|
Options:
|
|
55
|
-
--claim <code>
|
|
56
|
-
--wallet-name <name>
|
|
57
|
-
|
|
58
|
-
|
|
64
|
+
--claim <code> One-time claim code from the dashboard. Required.
|
|
65
|
+
--wallet-name <name> Name for the OWS wallet. If omitted, a unique
|
|
66
|
+
name is derived from the agent label + the
|
|
67
|
+
claim code so two separate agents on the same
|
|
68
|
+
machine can't accidentally share a wallet.
|
|
69
|
+
--vault-path <path> Override the default ~/.ows/wallets vault location.
|
|
70
|
+
USE THIS if you're running on ephemeral storage
|
|
71
|
+
(Lambda, Cloud Run, scratch containers) — point
|
|
72
|
+
it at a persistent volume. Lost vault = lost funds.
|
|
73
|
+
Persisted to config so subsequent purchase/wallet
|
|
74
|
+
commands use the same vault automatically.
|
|
75
|
+
--passphrase-env <ENVNAME> Name of the environment variable that holds the
|
|
76
|
+
OWS passphrase (e.g. CARDS402_OWS_PASSPHRASE). The
|
|
77
|
+
passphrase value is read from process.env at call
|
|
78
|
+
time; only the variable NAME is persisted to
|
|
79
|
+
~/.cards402/config.json, never the value itself.
|
|
80
|
+
--api-base <url> Override the default https://api.cards402.com/v1
|
|
81
|
+
-h, --help Show this message
|
|
59
82
|
`);
|
|
60
83
|
}
|
|
84
|
+
/**
|
|
85
|
+
* Derive a unique, deterministic wallet name from the agent label and
|
|
86
|
+
* claim code. Two different claims always produce different names, so
|
|
87
|
+
* running `cards402 onboard` multiple times on the same machine gives
|
|
88
|
+
* each agent its own OWS wallet file instead of silently reusing the
|
|
89
|
+
* previous agent's private keys. The claim-code suffix is what makes
|
|
90
|
+
* it unique; the label is just there to make the vault file readable
|
|
91
|
+
* on disk.
|
|
92
|
+
*/
|
|
93
|
+
function deriveDefaultWalletName(claim, label) {
|
|
94
|
+
// Strip the `c402_` prefix (if present), take the first 8 hex chars
|
|
95
|
+
// for a short-but-unique suffix. The claim code is cryptographically
|
|
96
|
+
// random — 8 hex chars = 32 bits, collision probability negligible
|
|
97
|
+
// at any realistic fleet size.
|
|
98
|
+
const raw = claim.replace(/^c402_/i, '');
|
|
99
|
+
const suffix = raw.slice(0, 8).toLowerCase();
|
|
100
|
+
// Slugify label: lowercase, replace non-alnum with -, collapse
|
|
101
|
+
// repeats, trim hyphens, cap length. Falls back to `agent` if empty.
|
|
102
|
+
const slug = (label ?? 'agent')
|
|
103
|
+
.toLowerCase()
|
|
104
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
105
|
+
.replace(/^-+|-+$/g, '')
|
|
106
|
+
.slice(0, 24) || 'agent';
|
|
107
|
+
return `cards402-${slug}-${suffix}`;
|
|
108
|
+
}
|
|
61
109
|
async function onboardCommand(argv) {
|
|
62
110
|
const args = parseArgs(argv);
|
|
63
111
|
if (args.help) {
|
|
@@ -70,7 +118,10 @@ async function onboardCommand(argv) {
|
|
|
70
118
|
return 2;
|
|
71
119
|
}
|
|
72
120
|
const apiBase = args.apiBase || process.env.CARDS402_BASE_URL || 'https://api.cards402.com/v1';
|
|
73
|
-
|
|
121
|
+
// We can't derive the default wallet name until AFTER the claim is
|
|
122
|
+
// redeemed (we need the label). So we start with the explicit
|
|
123
|
+
// --wallet-name override, and if it wasn't passed we compute a
|
|
124
|
+
// unique default after step 1.
|
|
74
125
|
// Step 1 — trade claim code for api key.
|
|
75
126
|
process.stdout.write('→ Claiming agent credentials…\n');
|
|
76
127
|
let claimResponse;
|
|
@@ -92,12 +143,31 @@ async function onboardCommand(argv) {
|
|
|
92
143
|
process.stderr.write(`error: network failure during claim: ${String(err)}\n`);
|
|
93
144
|
return 1;
|
|
94
145
|
}
|
|
146
|
+
// Resolve wallet name: explicit override wins, otherwise derive from
|
|
147
|
+
// the agent label + the claim code so every onboarding run produces
|
|
148
|
+
// a distinct wallet. This closes the "second agent inherited the
|
|
149
|
+
// first agent's wallet" bug where both claims used the static
|
|
150
|
+
// default 'cards402-agent' name.
|
|
151
|
+
const walletName = args.walletName || deriveDefaultWalletName(args.claim, claimResponse.label);
|
|
152
|
+
// F12: resolve passphrase from the named env var. Only the var NAME
|
|
153
|
+
// is persisted to config; the value never touches disk in cards402.
|
|
154
|
+
let passphrase;
|
|
155
|
+
if (args.passphraseEnv) {
|
|
156
|
+
passphrase = process.env[args.passphraseEnv];
|
|
157
|
+
if (!passphrase) {
|
|
158
|
+
process.stderr.write(`error: --passphrase-env ${args.passphraseEnv} is set but the env var is empty.\n` +
|
|
159
|
+
`Set ${args.passphraseEnv} to your chosen passphrase before running onboard.\n`);
|
|
160
|
+
return 2;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
95
163
|
// Step 2 — persist config so the SDK finds it on next run.
|
|
96
164
|
const { path: configPath } = (0, config_1.saveCards402Config)({
|
|
97
165
|
api_key: claimResponse.api_key,
|
|
98
166
|
api_url: claimResponse.api_url || apiBase,
|
|
99
167
|
webhook_secret: claimResponse.webhook_secret,
|
|
100
168
|
wallet_name: walletName,
|
|
169
|
+
vault_path: args.vaultPath,
|
|
170
|
+
passphrase_env: args.passphraseEnv,
|
|
101
171
|
created_at: new Date().toISOString(),
|
|
102
172
|
});
|
|
103
173
|
process.stdout.write(`✓ Credentials saved to ${configPath} (chmod 0600)\n`);
|
|
@@ -110,7 +180,7 @@ async function onboardCommand(argv) {
|
|
|
110
180
|
await client.reportStatus('initializing', { detail: 'creating wallet' }).catch(() => { });
|
|
111
181
|
let publicKey;
|
|
112
182
|
try {
|
|
113
|
-
const created = (0, ows_1.createOWSWallet)(walletName);
|
|
183
|
+
const created = (0, ows_1.createOWSWallet)(walletName, passphrase, args.vaultPath);
|
|
114
184
|
publicKey = created.publicKey;
|
|
115
185
|
}
|
|
116
186
|
catch (err) {
|
|
@@ -118,10 +188,14 @@ async function onboardCommand(argv) {
|
|
|
118
188
|
return 1;
|
|
119
189
|
}
|
|
120
190
|
process.stdout.write(`✓ Wallet "${walletName}" ready\n`);
|
|
191
|
+
if (args.vaultPath)
|
|
192
|
+
process.stdout.write(` vault: ${args.vaultPath}\n`);
|
|
193
|
+
if (args.passphraseEnv)
|
|
194
|
+
process.stdout.write(` passphrase: read from $${args.passphraseEnv}\n`);
|
|
121
195
|
// Step 4 — check balance (may 404 on an unactivated account; that's fine).
|
|
122
196
|
let balance = { xlm: '0', usdc: '0' };
|
|
123
197
|
try {
|
|
124
|
-
balance = await (0, ows_1.getOWSBalance)(walletName);
|
|
198
|
+
balance = await (0, ows_1.getOWSBalance)(walletName, args.vaultPath);
|
|
125
199
|
}
|
|
126
200
|
catch {
|
|
127
201
|
/* account not yet activated on-chain — normal on first run */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"onboard.js","sourceRoot":"","sources":["../../src/commands/onboard.ts"],"names":[],"mappings":";AAAA,4DAA4D;AAC5D,EAAE;AACF,4DAA4D;AAC5D,uEAAuE;AACvE,sDAAsD;AACtD,qEAAqE;AACrE,0DAA0D;AAC1D,oEAAoE;AACpE,2CAA2C;AAC3C,mEAAmE;AACnE,wDAAwD;AACxD,6CAA6C;;
|
|
1
|
+
{"version":3,"file":"onboard.js","sourceRoot":"","sources":["../../src/commands/onboard.ts"],"names":[],"mappings":";AAAA,4DAA4D;AAC5D,EAAE;AACF,4DAA4D;AAC5D,uEAAuE;AACvE,sDAAsD;AACtD,qEAAqE;AACrE,0DAA0D;AAC1D,oEAAoE;AACpE,2CAA2C;AAC3C,mEAAmE;AACnE,wDAAwD;AACxD,6CAA6C;;AAOT,2DAAwB;AA6F5D,wCA6IC;AA/OD,sCAA+C;AAC/C,gCAAwD;AACxD,sCAA2C;AAc3C,SAAS,SAAS,CAAC,IAAc;IAC/B,MAAM,GAAG,GAAgB,EAAE,CAAC;IAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,GAAG,KAAK,SAAS;YAAE,SAAS;QAChC,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI;YAAE,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;aACjD,IAAI,GAAG,KAAK,SAAS;YAAE,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;aAC7C,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC;YAAE,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;aACzE,IAAI,GAAG,KAAK,eAAe;YAAE,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;aACxD,IAAI,GAAG,CAAC,UAAU,CAAC,gBAAgB,CAAC;YAAE,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;aAC1F,IAAI,GAAG,KAAK,YAAY;YAAE,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;aAClD,IAAI,GAAG,CAAC,UAAU,CAAC,aAAa,CAAC;YAAE,GAAG,CAAC,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;aACjF,IAAI,GAAG,KAAK,cAAc;YAAE,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;aACtD,IAAI,GAAG,CAAC,UAAU,CAAC,eAAe,CAAC;YAAE,GAAG,CAAC,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;aACvF,IAAI,GAAG,KAAK,kBAAkB;YAAE,GAAG,CAAC,aAAa,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;aAC9D,IAAI,GAAG,CAAC,UAAU,CAAC,mBAAmB,CAAC;YAC1C,GAAG,CAAC,aAAa,GAAG,GAAG,CAAC,KAAK,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAC9D,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,KAAK;IACZ,OAAO,CAAC,MAAM;SACX,KAAK,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6BV,CAAC,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,uBAAuB,CAAC,KAAa,EAAE,KAAoB;IAClE,oEAAoE;IACpE,qEAAqE;IACrE,mEAAmE;IACnE,+BAA+B;IAC/B,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IAC7C,+DAA+D;IAC/D,qEAAqE;IACrE,MAAM,IAAI,GACR,CAAC,KAAK,IAAI,OAAO,CAAC;SACf,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;SACvB,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC;IAC7B,OAAO,YAAY,IAAI,IAAI,MAAM,EAAE,CAAC;AACtC,CAAC;AAEM,KAAK,UAAU,cAAc,CAAC,IAAc;IACjD,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAC7B,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,KAAK,EAAE,CAAC;QACR,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;QAC9D,KAAK,EAAE,CAAC;QACR,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,6BAA6B,CAAC;IAC/F,mEAAmE;IACnE,8DAA8D;IAC9D,+DAA+D;IAC/D,+BAA+B;IAE/B,yCAAyC;IACzC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACxD,IAAI,aAMH,CAAC;IACF,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,cAAc,EAAE;YAChD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;SAC3C,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAA4B,CAAC;QAC7E,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,6BAA6B,GAAG,CAAC,MAAM,MACpC,IAAI,CAAC,OAAkB,IAAK,IAAI,CAAC,KAAgB,IAAI,SACxD,IAAI,CACL,CAAC;YACF,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,0FAA0F,CAC3F,CAAC;YACF,OAAO,CAAC,CAAC;QACX,CAAC;QACD,aAAa,GAAG,IAAuC,CAAC;IAC1D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,wCAAwC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC9E,OAAO,CAAC,CAAC;IACX,CAAC;IAED,qEAAqE;IACrE,oEAAoE;IACpE,iEAAiE;IACjE,8DAA8D;IAC9D,iCAAiC;IACjC,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,uBAAuB,CAAC,IAAI,CAAC,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC;IAE/F,oEAAoE;IACpE,oEAAoE;IACpE,IAAI,UAA8B,CAAC;IACnC,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;QACvB,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC7C,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,2BAA2B,IAAI,CAAC,aAAa,qCAAqC;gBAChF,OAAO,IAAI,CAAC,aAAa,sDAAsD,CAClF,CAAC;YACF,OAAO,CAAC,CAAC;QACX,CAAC;IACH,CAAC;IAED,2DAA2D;IAC3D,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,IAAA,2BAAkB,EAAC;QAC9C,OAAO,EAAE,aAAa,CAAC,OAAO;QAC9B,OAAO,EAAE,aAAa,CAAC,OAAO,IAAI,OAAO;QACzC,cAAc,EAAE,aAAa,CAAC,cAAc;QAC5C,WAAW,EAAE,UAAU;QACvB,UAAU,EAAE,IAAI,CAAC,SAAS;QAC1B,cAAc,EAAE,IAAI,CAAC,aAAa;QAClC,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACrC,CAAC,CAAC;IACH,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,0BAA0B,UAAU,iBAAiB,CAAC,CAAC;IAE5E,2CAA2C;IAC3C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,IAAI,uBAAc,CAAC;QAChC,MAAM,EAAE,aAAa,CAAC,OAAO;QAC7B,OAAO,EAAE,aAAa,CAAC,OAAO,IAAI,OAAO;KAC1C,CAAC,CAAC;IACH,MAAM,MAAM,CAAC,YAAY,CAAC,cAAc,EAAE,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAEzF,IAAI,SAAiB,CAAC;IACtB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAA,qBAAe,EAAC,UAAU,EAAE,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QACxE,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;IAChC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,kCAAkC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CACvF,CAAC;QACF,OAAO,CAAC,CAAC;IACX,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,UAAU,WAAW,CAAC,CAAC;IACzD,IAAI,IAAI,CAAC,SAAS;QAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC;IACzE,IAAI,IAAI,CAAC,aAAa;QAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,4BAA4B,IAAI,CAAC,aAAa,IAAI,CAAC,CAAC;IAEjG,2EAA2E;IAC3E,IAAI,OAAO,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;IACtC,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,IAAA,mBAAa,EAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IAC5D,CAAC;IAAC,MAAM,CAAC;QACP,8DAA8D;IAChE,CAAC;IAED,oFAAoF;IACpF,MAAM,MAAM;SACT,YAAY,CAAC,kBAAkB,EAAE;QAChC,iBAAiB,EAAE,SAAS;QAC5B,MAAM,EAAE,OAAO,OAAO,CAAC,GAAG,SAAS,OAAO,CAAC,IAAI,EAAE;KAClD,CAAC;SACD,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAEnB,2CAA2C;IAC3C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC3B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gEAAgE,CAAC,CAAC;IACvF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAChD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gEAAgE,CAAC,CAAC;IACvF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,aAAa,CAAC,KAAK,IAAI,QAAQ,IAAI,CAAC,CAAC;IAC/E,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,SAAS,IAAI,CAAC,CAAC;IAC1D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;IAC3D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC;IAC5D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC3B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,uEAAuE,CAAC,CAAC;IAC9F,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,kFAAkF,CACnF,CAAC;IACF,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,iFAAiF,CAClF,CAAC;IACF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC3B,OAAO,CAAC,CAAC;AACX,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"onboard.test.d.ts","sourceRoot":"","sources":["../../src/commands/onboard.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Unit tests for the onboard command's wallet-name derivation. The
|
|
3
|
+
// helper is the load-bearing piece that fixes the "second agent reuses
|
|
4
|
+
// the first agent's OWS wallet" bug — the test exists to keep that
|
|
5
|
+
// behaviour locked in across future edits.
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
const vitest_1 = require("vitest");
|
|
8
|
+
const onboard_1 = require("./onboard");
|
|
9
|
+
(0, vitest_1.describe)('deriveDefaultWalletName', () => {
|
|
10
|
+
const claimA = 'c402_a1b2c3d4e5f607080910111213141516171819202122232425262728293031';
|
|
11
|
+
const claimB = 'c402_ff00112233445566778899aabbccddeeff00112233445566778899aabbccdd';
|
|
12
|
+
(0, vitest_1.it)('produces a name prefixed with cards402-', () => {
|
|
13
|
+
(0, vitest_1.expect)((0, onboard_1._deriveDefaultWalletName)(claimA, 'research-bot')).toMatch(/^cards402-/);
|
|
14
|
+
});
|
|
15
|
+
(0, vitest_1.it)('includes a slugified version of the label', () => {
|
|
16
|
+
(0, vitest_1.expect)((0, onboard_1._deriveDefaultWalletName)(claimA, 'Research Bot v2!')).toContain('research-bot-v2');
|
|
17
|
+
});
|
|
18
|
+
(0, vitest_1.it)('falls back to "agent" when the label is null', () => {
|
|
19
|
+
(0, vitest_1.expect)((0, onboard_1._deriveDefaultWalletName)(claimA, null)).toContain('agent');
|
|
20
|
+
});
|
|
21
|
+
(0, vitest_1.it)('falls back to "agent" when the label is empty', () => {
|
|
22
|
+
(0, vitest_1.expect)((0, onboard_1._deriveDefaultWalletName)(claimA, '')).toContain('agent');
|
|
23
|
+
});
|
|
24
|
+
(0, vitest_1.it)('produces different names for different claims — even with the same label', () => {
|
|
25
|
+
const a = (0, onboard_1._deriveDefaultWalletName)(claimA, 'research-bot');
|
|
26
|
+
const b = (0, onboard_1._deriveDefaultWalletName)(claimB, 'research-bot');
|
|
27
|
+
(0, vitest_1.expect)(a).not.toBe(b);
|
|
28
|
+
});
|
|
29
|
+
(0, vitest_1.it)('is deterministic — same inputs always yield the same name', () => {
|
|
30
|
+
(0, vitest_1.expect)((0, onboard_1._deriveDefaultWalletName)(claimA, 'research-bot')).toBe((0, onboard_1._deriveDefaultWalletName)(claimA, 'research-bot'));
|
|
31
|
+
});
|
|
32
|
+
(0, vitest_1.it)('accepts a claim without the c402_ prefix', () => {
|
|
33
|
+
const raw = (0, onboard_1._deriveDefaultWalletName)(claimA, 'x');
|
|
34
|
+
const noPrefix = (0, onboard_1._deriveDefaultWalletName)(claimA.replace(/^c402_/, ''), 'x');
|
|
35
|
+
(0, vitest_1.expect)(raw).toBe(noPrefix);
|
|
36
|
+
});
|
|
37
|
+
(0, vitest_1.it)('caps the label slug so a long label does not blow out the path', () => {
|
|
38
|
+
const long = 'a'.repeat(200);
|
|
39
|
+
const name = (0, onboard_1._deriveDefaultWalletName)(claimA, long);
|
|
40
|
+
// cards402- + slug (<=24) + - + 8-hex = ~42 chars max
|
|
41
|
+
(0, vitest_1.expect)(name.length).toBeLessThanOrEqual(48);
|
|
42
|
+
});
|
|
43
|
+
(0, vitest_1.it)('never contains characters unsafe for a filesystem vault path', () => {
|
|
44
|
+
const name = (0, onboard_1._deriveDefaultWalletName)(claimA, '../../evil/$(whoami)');
|
|
45
|
+
(0, vitest_1.expect)(name).toMatch(/^cards402-[a-z0-9-]+$/);
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
//# sourceMappingURL=onboard.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"onboard.test.js","sourceRoot":"","sources":["../../src/commands/onboard.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"purchase.d.ts","sourceRoot":"","sources":["../../src/commands/purchase.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"purchase.d.ts","sourceRoot":"","sources":["../../src/commands/purchase.ts"],"names":[],"mappings":"AAqIA,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAyIrE"}
|
|
@@ -79,6 +79,14 @@ function parseArgs(argv) {
|
|
|
79
79
|
out.walletName = argv[++i];
|
|
80
80
|
else if (arg.startsWith('--wallet-name='))
|
|
81
81
|
out.walletName = arg.slice('--wallet-name='.length);
|
|
82
|
+
else if (arg === '--vault-path')
|
|
83
|
+
out.vaultPath = argv[++i];
|
|
84
|
+
else if (arg.startsWith('--vault-path='))
|
|
85
|
+
out.vaultPath = arg.slice('--vault-path='.length);
|
|
86
|
+
else if (arg === '--passphrase-env')
|
|
87
|
+
out.passphraseEnv = argv[++i];
|
|
88
|
+
else if (arg.startsWith('--passphrase-env='))
|
|
89
|
+
out.passphraseEnv = arg.slice('--passphrase-env='.length);
|
|
82
90
|
else if (arg === '--resume')
|
|
83
91
|
out.resume = argv[++i];
|
|
84
92
|
else if (arg.startsWith('--resume='))
|
|
@@ -92,14 +100,21 @@ function usage() {
|
|
|
92
100
|
|
|
93
101
|
Buys a virtual Visa card for the given USD value using the credentials
|
|
94
102
|
and wallet set up by 'cards402 onboard'. Reads ~/.cards402/config.json
|
|
95
|
-
for the api key
|
|
103
|
+
for the api key, wallet name, vault path, and passphrase env var.
|
|
96
104
|
|
|
97
105
|
Options:
|
|
98
|
-
-a, --amount <USDC>
|
|
99
|
-
--asset xlm|usdc
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
106
|
+
-a, --amount <USDC> Card value in USD. Required for new purchases.
|
|
107
|
+
--asset xlm|usdc Which asset to pay with. Default: auto — picks
|
|
108
|
+
USDC if the wallet has enough USDC to cover the
|
|
109
|
+
order, otherwise pays in XLM. Pass an explicit
|
|
110
|
+
value to force one.
|
|
111
|
+
--wallet-name <name> Override the wallet name from config.json
|
|
112
|
+
--vault-path <path> Override the vault path from config.json
|
|
113
|
+
--passphrase-env <ENVNAME> Override the passphrase env var from config.json.
|
|
114
|
+
The passphrase value is read from process.env at
|
|
115
|
+
call time and never logged.
|
|
116
|
+
--resume <order-id> Resume a purchase that failed mid-flight. Omit --amount.
|
|
117
|
+
-h, --help Show this message
|
|
103
118
|
|
|
104
119
|
Examples:
|
|
105
120
|
cards402 purchase --amount 10 # $10 card paid in XLM
|
|
@@ -173,7 +188,60 @@ Your operator can mint a claim code from https://cards402.com/dashboard.
|
|
|
173
188
|
return 1;
|
|
174
189
|
}
|
|
175
190
|
const walletName = args.walletName || config.wallet_name || 'cards402-agent';
|
|
176
|
-
|
|
191
|
+
// F12: vault_path and passphrase_env both come from config first, then
|
|
192
|
+
// CLI overrides. The passphrase value is read from process.env at call
|
|
193
|
+
// time; only the env var NAME is ever stored in config.
|
|
194
|
+
const vaultPath = args.vaultPath ?? config.vault_path;
|
|
195
|
+
const passphraseEnv = args.passphraseEnv ?? config.passphrase_env;
|
|
196
|
+
const passphrase = passphraseEnv ? process.env[passphraseEnv] : undefined;
|
|
197
|
+
if (passphraseEnv && !passphrase) {
|
|
198
|
+
process.stderr.write(`error: --passphrase-env ${passphraseEnv} is set in config but the env var is empty.\n` +
|
|
199
|
+
`Set ${passphraseEnv} to your wallet passphrase before running purchase.\n`);
|
|
200
|
+
return 2;
|
|
201
|
+
}
|
|
202
|
+
// Resolve the payment asset. If the user didn't pass --asset we auto-pick
|
|
203
|
+
// based on what the wallet actually holds — agents that try to pay in an
|
|
204
|
+
// asset they have no balance for is the #1 failure mode in early piloting.
|
|
205
|
+
// Rule:
|
|
206
|
+
// - explicit --asset wins always
|
|
207
|
+
// - on resume, asset doesn't matter (the order is already paid or
|
|
208
|
+
// waiting for an existing payment)
|
|
209
|
+
// - otherwise: pick USDC if the wallet has enough USDC to cover the
|
|
210
|
+
// order, else pick XLM
|
|
211
|
+
let paymentAsset;
|
|
212
|
+
if (args.asset) {
|
|
213
|
+
paymentAsset = args.asset;
|
|
214
|
+
}
|
|
215
|
+
else if (args.resume) {
|
|
216
|
+
paymentAsset = 'xlm'; // unused on resume, any value is fine
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
219
|
+
try {
|
|
220
|
+
const bal = await (0, ows_1.getOWSBalance)(walletName, vaultPath);
|
|
221
|
+
const usdcBal = parseFloat(bal.usdc || '0');
|
|
222
|
+
const wantUsdc = parseFloat(args.amount || '0');
|
|
223
|
+
if (usdcBal >= wantUsdc && wantUsdc > 0) {
|
|
224
|
+
paymentAsset = 'usdc';
|
|
225
|
+
process.stdout.write(`→ Auto-picked USDC (wallet has ${usdcBal.toFixed(2)} USDC; covers $${wantUsdc.toFixed(2)})\n`);
|
|
226
|
+
}
|
|
227
|
+
else {
|
|
228
|
+
paymentAsset = 'xlm';
|
|
229
|
+
if (usdcBal > 0) {
|
|
230
|
+
process.stdout.write(`→ Auto-picked XLM (wallet has only ${usdcBal.toFixed(2)} USDC; needs $${wantUsdc.toFixed(2)})\n`);
|
|
231
|
+
}
|
|
232
|
+
else {
|
|
233
|
+
process.stdout.write(`→ Auto-picked XLM (no USDC in wallet)\n`);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
catch {
|
|
238
|
+
// Horizon down or unactivated wallet — fall back to XLM (no
|
|
239
|
+
// trustline required) and let payViaContractOWS surface the real
|
|
240
|
+
// error if the wallet really has nothing.
|
|
241
|
+
paymentAsset = 'xlm';
|
|
242
|
+
process.stdout.write(`→ Could not read balance from Horizon — defaulting to XLM. Pass --asset usdc to override.\n`);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
177
245
|
if (args.resume) {
|
|
178
246
|
process.stdout.write(`→ Resuming order ${args.resume}…\n`);
|
|
179
247
|
}
|
|
@@ -188,6 +256,8 @@ Your operator can mint a claim code from https://cards402.com/dashboard.
|
|
|
188
256
|
// amount is unused on resume but the type requires it; pass '0' safely.
|
|
189
257
|
amountUsdc: args.amount ?? '0',
|
|
190
258
|
paymentAsset,
|
|
259
|
+
passphrase,
|
|
260
|
+
vaultPath,
|
|
191
261
|
...(args.resume ? { resume: args.resume } : {}),
|
|
192
262
|
});
|
|
193
263
|
clearLastOrder();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"purchase.js","sourceRoot":"","sources":["../../src/commands/purchase.ts"],"names":[],"mappings":";AAAA,mEAAmE;AACnE,gEAAgE;AAChE,iEAAiE;AACjE,gEAAgE;AAChE,+CAA+C;AAC/C,EAAE;AACF,oEAAoE;AACpE,iEAAiE;AACjE,oBAAoB;AACpB,EAAE;AACF,uEAAuE;AACvE,uEAAuE;AACvE,+DAA+D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"purchase.js","sourceRoot":"","sources":["../../src/commands/purchase.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wallet.d.ts","sourceRoot":"","sources":["../../src/commands/wallet.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"wallet.d.ts","sourceRoot":"","sources":["../../src/commands/wallet.ts"],"names":[],"mappings":"AAiCA,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA+DnE"}
|
package/dist/commands/wallet.js
CHANGED
|
@@ -8,17 +8,31 @@ exports.walletCommand = walletCommand;
|
|
|
8
8
|
const config_1 = require("../config");
|
|
9
9
|
const ows_1 = require("../ows");
|
|
10
10
|
function usage() {
|
|
11
|
-
process.stderr
|
|
11
|
+
process.stderr
|
|
12
|
+
.write(`Usage: cards402 wallet <subcommand> [--vault-path <path>] [--name <walletname>]
|
|
12
13
|
|
|
13
14
|
Subcommands:
|
|
14
15
|
address Print the Stellar address for this agent's wallet
|
|
15
16
|
balance Print the wallet's XLM and USDC balances from Horizon
|
|
16
17
|
-h, --help Show this message
|
|
17
18
|
|
|
18
|
-
Both subcommands read ~/.cards402/config.json for the wallet name
|
|
19
|
-
you don't need to pass anything after 'cards402 onboard'.
|
|
19
|
+
Both subcommands read ~/.cards402/config.json for the wallet name and
|
|
20
|
+
vault path so you don't need to pass anything after 'cards402 onboard'.
|
|
21
|
+
Override either with --name=<walletname> / --vault-path=<path>.
|
|
20
22
|
`);
|
|
21
23
|
}
|
|
24
|
+
function parseFlag(rest, short) {
|
|
25
|
+
for (let i = 0; i < rest.length; i++) {
|
|
26
|
+
const arg = rest[i];
|
|
27
|
+
if (!arg)
|
|
28
|
+
continue;
|
|
29
|
+
if (arg === short)
|
|
30
|
+
return rest[i + 1];
|
|
31
|
+
if (arg.startsWith(`${short}=`))
|
|
32
|
+
return arg.slice(short.length + 1);
|
|
33
|
+
}
|
|
34
|
+
return undefined;
|
|
35
|
+
}
|
|
22
36
|
async function walletCommand(argv) {
|
|
23
37
|
const [sub, ...rest] = argv;
|
|
24
38
|
if (!sub || sub === '-h' || sub === '--help' || sub === 'help') {
|
|
@@ -30,10 +44,12 @@ async function walletCommand(argv) {
|
|
|
30
44
|
process.stderr.write("error: no cards402 config found. Run 'cards402 onboard --claim <code>' first.\n");
|
|
31
45
|
return 1;
|
|
32
46
|
}
|
|
33
|
-
const walletName = rest
|
|
47
|
+
const walletName = parseFlag(rest, '--name') || config.wallet_name || 'cards402-agent';
|
|
48
|
+
// F12: vault_path comes from config first, CLI flag overrides.
|
|
49
|
+
const vaultPath = parseFlag(rest, '--vault-path') || config.vault_path;
|
|
34
50
|
if (sub === 'address') {
|
|
35
51
|
try {
|
|
36
|
-
const publicKey = (0, ows_1.getOWSPublicKey)(walletName);
|
|
52
|
+
const publicKey = (0, ows_1.getOWSPublicKey)(walletName, vaultPath);
|
|
37
53
|
process.stdout.write(`${publicKey}\n`);
|
|
38
54
|
return 0;
|
|
39
55
|
}
|
|
@@ -44,8 +60,8 @@ async function walletCommand(argv) {
|
|
|
44
60
|
}
|
|
45
61
|
if (sub === 'balance') {
|
|
46
62
|
try {
|
|
47
|
-
const publicKey = (0, ows_1.getOWSPublicKey)(walletName);
|
|
48
|
-
const bal = await (0, ows_1.getOWSBalance)(walletName);
|
|
63
|
+
const publicKey = (0, ows_1.getOWSPublicKey)(walletName, vaultPath);
|
|
64
|
+
const bal = await (0, ows_1.getOWSBalance)(walletName, vaultPath);
|
|
49
65
|
process.stdout.write(`address: ${publicKey}\n`);
|
|
50
66
|
process.stdout.write(`xlm: ${bal.xlm}\n`);
|
|
51
67
|
process.stdout.write(`usdc: ${bal.usdc}\n`);
|
|
@@ -56,7 +72,7 @@ async function walletCommand(argv) {
|
|
|
56
72
|
// Horizon 404 on a brand-new unactivated wallet — show zeros.
|
|
57
73
|
if (msg.includes('Not Found') || msg.includes('404')) {
|
|
58
74
|
try {
|
|
59
|
-
const publicKey = (0, ows_1.getOWSPublicKey)(walletName);
|
|
75
|
+
const publicKey = (0, ows_1.getOWSPublicKey)(walletName, vaultPath);
|
|
60
76
|
process.stdout.write(`address: ${publicKey}\n`);
|
|
61
77
|
process.stdout.write(`xlm: 0 (unactivated — send >= 1 XLM)\n`);
|
|
62
78
|
process.stdout.write(`usdc: 0\n`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wallet.js","sourceRoot":"","sources":["../../src/commands/wallet.ts"],"names":[],"mappings":";AAAA,oEAAoE;AACpE,mEAAmE;AACnE,oEAAoE;AACpE,sBAAsB;;
|
|
1
|
+
{"version":3,"file":"wallet.js","sourceRoot":"","sources":["../../src/commands/wallet.ts"],"names":[],"mappings":";AAAA,oEAAoE;AACpE,mEAAmE;AACnE,oEAAoE;AACpE,sBAAsB;;AA8BtB,sCA+DC;AA3FD,sCAA+C;AAC/C,gCAAwD;AAExD,SAAS,KAAK;IACZ,OAAO,CAAC,MAAM;SACX,KAAK,CAAC;;;;;;;;;;CAUV,CAAC,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,IAAc,EAAE,KAAa;IAC9C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,CAAC,GAAG;YAAE,SAAS;QACnB,IAAI,GAAG,KAAK,KAAK;YAAE,OAAO,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACtC,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,KAAK,GAAG,CAAC;YAAE,OAAO,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACtE,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAEM,KAAK,UAAU,aAAa,CAAC,IAAc;IAChD,MAAM,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IAC5B,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QAC/D,KAAK,EAAE,CAAC;QACR,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACrB,CAAC;IAED,MAAM,MAAM,GAAG,IAAA,2BAAkB,GAAE,CAAC;IACpC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,iFAAiF,CAClF,CAAC;QACF,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,UAAU,GAAG,SAAS,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,WAAW,IAAI,gBAAgB,CAAC;IACvF,+DAA+D;IAC/D,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,EAAE,cAAc,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC;IAEvE,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtB,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,IAAA,qBAAe,EAAC,UAAU,EAAE,SAAS,CAAC,CAAC;YACzD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,SAAS,IAAI,CAAC,CAAC;YACvC,OAAO,CAAC,CAAC;QACX,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,kBAAkB,UAAU,gBAC1B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CACjD,IAAI,CACL,CAAC;YACF,OAAO,CAAC,CAAC;QACX,CAAC;IACH,CAAC;IAED,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtB,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,IAAA,qBAAe,EAAC,UAAU,EAAE,SAAS,CAAC,CAAC;YACzD,MAAM,GAAG,GAAG,MAAM,IAAA,mBAAa,EAAC,UAAU,EAAE,SAAS,CAAC,CAAC;YACvD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,SAAS,IAAI,CAAC,CAAC;YAChD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;YAC9C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC;YAC/C,OAAO,CAAC,CAAC;QACX,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,8DAA8D;YAC9D,IAAI,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBACrD,IAAI,CAAC;oBACH,MAAM,SAAS,GAAG,IAAA,qBAAe,EAAC,UAAU,EAAE,SAAS,CAAC,CAAC;oBACzD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,SAAS,IAAI,CAAC,CAAC;oBAChD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;oBACnE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;oBACrC,OAAO,CAAC,CAAC;gBACX,CAAC;gBAAC,MAAM,CAAC;oBACP,2BAA2B;gBAC7B,CAAC;YACH,CAAC;YACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;YACxC,OAAO,CAAC,CAAC;QACX,CAAC;IACH,CAAC;IAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qCAAqC,GAAG,KAAK,CAAC,CAAC;IACpE,KAAK,EAAE,CAAC;IACR,OAAO,CAAC,CAAC;AACX,CAAC"}
|
package/dist/config.d.ts
CHANGED
|
@@ -4,6 +4,16 @@ export interface Cards402Config {
|
|
|
4
4
|
webhook_secret?: string | null;
|
|
5
5
|
wallet_name?: string;
|
|
6
6
|
vault_path?: string;
|
|
7
|
+
/**
|
|
8
|
+
* Adversarial audit F12: the NAME of the environment variable that
|
|
9
|
+
* holds the OWS wallet passphrase, NOT the passphrase value itself.
|
|
10
|
+
* Subsequent CLI commands read this field, look up
|
|
11
|
+
* `process.env[passphrase_env]` at call time, and pass the value to
|
|
12
|
+
* the OWS layer. We never persist the passphrase value to disk —
|
|
13
|
+
* a config dump alone gives an attacker the api key but not the
|
|
14
|
+
* keys to the wallet vault.
|
|
15
|
+
*/
|
|
16
|
+
passphrase_env?: string;
|
|
7
17
|
created_at: string;
|
|
8
18
|
}
|
|
9
19
|
/**
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAUD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAS7E;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,cAAc,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAMhG;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,GAAE;IACJ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CACb,GACL;IAAE,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAe7D"}
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;;;;;OAQG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;CACpB;AAUD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAS7E;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,cAAc,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAMhG;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,GAAE;IACJ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CACb,GACL;IAAE,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAe7D"}
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";AAAA,sEAAsE;AACtE,sEAAsE;AACtE,uEAAuE;AACvE,EAAE;AACF,oEAAoE;AACpE,oEAAoE;AACpE,oEAAoE;AACpE,mEAAmE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";AAAA,sEAAsE;AACtE,sEAAsE;AACtE,uEAAuE;AACvE,EAAE;AACF,oEAAoE;AACpE,oEAAoE;AACpE,oEAAoE;AACpE,mEAAmE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqCnE,gDASC;AAMD,gDAMC;AAQD,gDAoBC;AApFD,uCAAyB;AACzB,2CAA6B;AAC7B,uCAAyB;AAqBzB,SAAS,gBAAgB;IACvB,OAAO,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAC;AACjF,CAAC;AAED,SAAS,iBAAiB;IACxB,OAAO,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,aAAa,CAAC,CAAC;AACtD,CAAC;AAED;;;GAGG;AACH,SAAgB,kBAAkB,CAAC,UAAmB;IACpD,MAAM,CAAC,GAAG,UAAU,IAAI,iBAAiB,EAAE,CAAC;IAC5C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QACvC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAmB,CAAC;IAC3C,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QAClE,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAgB,kBAAkB,CAAC,MAAsB,EAAE,UAAmB;IAC5E,MAAM,CAAC,GAAG,UAAU,IAAI,iBAAiB,EAAE,CAAC;IAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC5B,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACpD,EAAE,CAAC,aAAa,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACtE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;AACrB,CAAC;AAED;;;;;GAKG;AACH,SAAgB,kBAAkB,CAChC,OAGI,EAAE;IAEN,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC;IACzF,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QACjC,OAAO;YACL,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB;YACpC,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB;SACvD,CAAC;IACJ,CAAC;IACD,MAAM,GAAG,GAAG,kBAAkB,EAAE,CAAC;IACjC,IAAI,GAAG,EAAE,CAAC;QACR,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;IACvE,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;AACtD,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cards402",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.5",
|
|
4
4
|
"description": "Virtual Visa cards for AI agents — pay USDC or XLM on Stellar, get a card in ~60s",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -64,6 +64,12 @@
|
|
|
64
64
|
"@ctx.com/stellar-ows-core": "^1.3.0-stellar",
|
|
65
65
|
"@stellar/stellar-sdk": "^15.0.1"
|
|
66
66
|
},
|
|
67
|
+
"optionalDependencies": {
|
|
68
|
+
"@ctx.com/stellar-ows-core-linux-x64-gnu": "1.3.0-stellar",
|
|
69
|
+
"@ctx.com/stellar-ows-core-linux-arm64-gnu": "1.3.0-stellar",
|
|
70
|
+
"@ctx.com/stellar-ows-core-darwin-x64": "1.3.0-stellar",
|
|
71
|
+
"@ctx.com/stellar-ows-core-darwin-arm64": "1.3.0-stellar"
|
|
72
|
+
},
|
|
67
73
|
"devDependencies": {
|
|
68
74
|
"@types/node": "^22.0.0",
|
|
69
75
|
"@vitest/coverage-v8": "^4.1.3",
|