agentcard 0.0.22 → 0.0.24
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/src/commands/3ds.d.ts +1 -0
- package/dist/src/commands/3ds.js +45 -0
- package/dist/src/commands/3ds.js.map +1 -0
- package/dist/src/commands/setup.js +43 -6
- package/dist/src/commands/setup.js.map +1 -1
- package/dist/src/commands/signup.js +1 -1
- package/dist/src/commands/signup.js.map +1 -1
- package/dist/src/commands/wallet/balance.d.ts +1 -0
- package/dist/src/commands/wallet/balance.js +19 -0
- package/dist/src/commands/wallet/balance.js.map +1 -0
- package/dist/src/commands/wallet/fetch.d.ts +8 -0
- package/dist/src/commands/wallet/fetch.js +147 -0
- package/dist/src/commands/wallet/fetch.js.map +1 -0
- package/dist/src/commands/wallet/info.d.ts +1 -0
- package/dist/src/commands/wallet/info.js +29 -0
- package/dist/src/commands/wallet/info.js.map +1 -0
- package/dist/src/commands/wallet/send.d.ts +6 -0
- package/dist/src/commands/wallet/send.js +80 -0
- package/dist/src/commands/wallet/send.js.map +1 -0
- package/dist/src/commands/whoami.js +12 -0
- package/dist/src/commands/whoami.js.map +1 -1
- package/dist/src/index.js +38 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/lib/api.d.ts +7 -0
- package/dist/src/lib/api.js +28 -2
- package/dist/src/lib/api.js.map +1 -1
- package/dist/src/lib/policy-intent.d.ts +13 -0
- package/dist/src/lib/policy-intent.js +95 -0
- package/dist/src/lib/policy-intent.js.map +1 -0
- package/dist/src/lib/privy.d.ts +19 -0
- package/dist/src/lib/privy.js +214 -0
- package/dist/src/lib/privy.js.map +1 -0
- package/dist/src/lib/smart-wallet.d.ts +13 -0
- package/dist/src/lib/smart-wallet.js +90 -0
- package/dist/src/lib/smart-wallet.js.map +1 -0
- package/dist/src/lib/usdc.d.ts +11088 -0
- package/dist/src/lib/usdc.js +42 -0
- package/dist/src/lib/usdc.js.map +1 -0
- package/package.json +7 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function threeDS(): Promise<void>;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import ora from "ora";
|
|
3
|
+
import { get } from "../lib/api.js";
|
|
4
|
+
function formatAge(receivedAt) {
|
|
5
|
+
const timestamp = new Date(receivedAt).getTime();
|
|
6
|
+
if (!Number.isFinite(timestamp))
|
|
7
|
+
return "";
|
|
8
|
+
const seconds = Math.max(0, Math.floor((Date.now() - timestamp) / 1000));
|
|
9
|
+
if (seconds < 10)
|
|
10
|
+
return "just now";
|
|
11
|
+
if (seconds < 60)
|
|
12
|
+
return `${seconds}s ago`;
|
|
13
|
+
const minutes = Math.floor(seconds / 60);
|
|
14
|
+
return `${minutes}m ago`;
|
|
15
|
+
}
|
|
16
|
+
export async function threeDS() {
|
|
17
|
+
const spinner = ora("Fetching recent 3DS codes...").start();
|
|
18
|
+
let res;
|
|
19
|
+
try {
|
|
20
|
+
res = await get("/api/3ds-codes");
|
|
21
|
+
}
|
|
22
|
+
catch (err) {
|
|
23
|
+
spinner.fail(`Failed to fetch 3DS codes: ${err instanceof Error ? err.message : "Unknown error"}`);
|
|
24
|
+
process.exit(1);
|
|
25
|
+
}
|
|
26
|
+
spinner.stop();
|
|
27
|
+
const codes = res.codes ?? [];
|
|
28
|
+
console.log("");
|
|
29
|
+
console.log(chalk.bold(" Recent 3DS codes"));
|
|
30
|
+
console.log(chalk.dim(" ───────────────────────"));
|
|
31
|
+
if (codes.length === 0) {
|
|
32
|
+
console.log(chalk.yellow(" No recent 3DS codes."));
|
|
33
|
+
console.log("");
|
|
34
|
+
console.log(chalk.dim(" Make sure checkout requested a 3DS challenge. Codes usually appear here within a few seconds."));
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
for (const item of codes) {
|
|
38
|
+
const amount = `USD ${item.amount.toFixed(2)}`;
|
|
39
|
+
const age = formatAge(item.receivedAt);
|
|
40
|
+
console.log(` ${chalk.white(item.code)} ${chalk.green(amount.padEnd(10))} ${chalk.dim(age)}`);
|
|
41
|
+
}
|
|
42
|
+
console.log("");
|
|
43
|
+
console.log(chalk.dim(" No match? Re-run `agentcard 3ds` after checkout sends the challenge."));
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=3ds.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"3ds.js","sourceRoot":"","sources":["../../../src/commands/3ds.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AAapC,SAAS,SAAS,CAAC,UAAkB;IACnC,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,CAAC;IACjD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC;QAAE,OAAO,EAAE,CAAC;IAE3C,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IACzE,IAAI,OAAO,GAAG,EAAE;QAAE,OAAO,UAAU,CAAC;IACpC,IAAI,OAAO,GAAG,EAAE;QAAE,OAAO,GAAG,OAAO,OAAO,CAAC;IAE3C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IACzC,OAAO,GAAG,OAAO,OAAO,CAAC;AAC3B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO;IAC3B,MAAM,OAAO,GAAG,GAAG,CAAC,8BAA8B,CAAC,CAAC,KAAK,EAAE,CAAC;IAE5D,IAAI,GAAyB,CAAC;IAC9B,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,GAAG,CAAuB,gBAAgB,CAAC,CAAC;IAC1D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CACV,8BAA8B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CACrF,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,CAAC,IAAI,EAAE,CAAC;IAEf,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;IAC9B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC;IAC9C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC,CAAC;IAEpD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,wBAAwB,CAAC,CAAC,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CACP,iGAAiG,CAClG,CACF,CAAC;QACF,OAAO;IACT,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/C,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACvC,OAAO,CAAC,GAAG,CACT,KAAK,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CACpF,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CACP,wEAAwE,CACzE,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -3,9 +3,25 @@ import open from "open";
|
|
|
3
3
|
import ora from "ora";
|
|
4
4
|
import inquirer from "inquirer";
|
|
5
5
|
import { del, get, patch, post } from "../lib/api.js";
|
|
6
|
+
import { ensureDelegated } from "../lib/smart-wallet.js";
|
|
6
7
|
const POLL_INTERVAL = 2000;
|
|
7
8
|
const PM_TIMEOUT = 5 * 60 * 1000;
|
|
8
9
|
const E164 = /^\+[1-9]\d{1,14}$/;
|
|
10
|
+
async function provisionWallet() {
|
|
11
|
+
const spinner = ora("Setting up wallet on Base...").start();
|
|
12
|
+
try {
|
|
13
|
+
const res = await post("/api/wallet/setup");
|
|
14
|
+
// 7702-delegate immediately so x402's sign-only flow has 1271 code at the
|
|
15
|
+
// address (the merchant's facilitator submits, never our wallet, so this
|
|
16
|
+
// is the only chance we get to put code there). Idempotent — short-circuits
|
|
17
|
+
// if already delegated.
|
|
18
|
+
await ensureDelegated();
|
|
19
|
+
spinner.succeed(chalk.green(`Wallet ready: ${res.address}`));
|
|
20
|
+
}
|
|
21
|
+
catch (err) {
|
|
22
|
+
spinner.warn(`Couldn't set up wallet: ${err instanceof Error ? err.message : "Unknown error"}. Re-run \`agentcard setup\` to retry.`);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
9
25
|
async function provisionAgentEmail() {
|
|
10
26
|
const spinner = ora("Provisioning agent email...").start();
|
|
11
27
|
try {
|
|
@@ -17,8 +33,8 @@ async function provisionAgentEmail() {
|
|
|
17
33
|
}
|
|
18
34
|
}
|
|
19
35
|
function renderStatus(me) {
|
|
20
|
-
const line = (label, value
|
|
21
|
-
const v = value ?
|
|
36
|
+
const line = (label, value) => {
|
|
37
|
+
const v = value ? value : chalk.yellow("(missing)");
|
|
22
38
|
return ` ${chalk.bold(label.padEnd(14))} ${v}`;
|
|
23
39
|
};
|
|
24
40
|
const pm = me.paymentMethod;
|
|
@@ -32,6 +48,7 @@ function renderStatus(me) {
|
|
|
32
48
|
console.log(line("Phone:", me.phoneNumber));
|
|
33
49
|
console.log(line("Payment:", pmStr));
|
|
34
50
|
console.log(line("Agent email:", me.agentEmail));
|
|
51
|
+
console.log(line("Base wallet:", me.walletAddress));
|
|
35
52
|
console.log(" " + "─".repeat(44) + "\n");
|
|
36
53
|
}
|
|
37
54
|
async function promptIfMissing(fieldLabel, current, validator, interactive) {
|
|
@@ -110,13 +127,15 @@ export async function setup(opts) {
|
|
|
110
127
|
!!me.lastName &&
|
|
111
128
|
!!me.phoneNumber &&
|
|
112
129
|
!!me.paymentMethod &&
|
|
113
|
-
!!me.agentEmail
|
|
130
|
+
!!me.agentEmail &&
|
|
131
|
+
!!me.walletAddress;
|
|
114
132
|
if (fullyConfigured && noFlagsGiven && !opts.reset) {
|
|
115
133
|
console.log(chalk.green(`You're all set. Spend limit: $${(me.spendLimitCents / 100).toFixed(2)}.`));
|
|
116
|
-
|
|
134
|
+
printHints({ includeReset: true });
|
|
117
135
|
return;
|
|
118
136
|
}
|
|
119
|
-
//
|
|
137
|
+
// Profile fields are for our records and agent email provisioning. Stripe
|
|
138
|
+
// cardholders use AgentCard's issuing identity for checkout details.
|
|
120
139
|
const first = (opts.firstName ?? "").trim() ||
|
|
121
140
|
(await promptIfMissing("First name", me.firstName, (v) => v.trim().length > 0 || "Required", interactive));
|
|
122
141
|
const last = (opts.lastName ?? "").trim() ||
|
|
@@ -135,6 +154,10 @@ export async function setup(opts) {
|
|
|
135
154
|
console.error(chalk.red(`Missing required fields. Run interactively, or pass: ${missingNow.join(" ")}`));
|
|
136
155
|
process.exit(1);
|
|
137
156
|
}
|
|
157
|
+
if (!E164.test(phone)) {
|
|
158
|
+
console.error(chalk.red("Phone must include the country code with a + prefix, e.g. +14155551234"));
|
|
159
|
+
process.exit(1);
|
|
160
|
+
}
|
|
138
161
|
if (first !== me.firstName || last !== me.lastName || phone !== me.phoneNumber) {
|
|
139
162
|
const saving = ora("Saving profile...").start();
|
|
140
163
|
try {
|
|
@@ -159,8 +182,22 @@ export async function setup(opts) {
|
|
|
159
182
|
console.log(chalk.bold("\nAgent email"));
|
|
160
183
|
await provisionAgentEmail();
|
|
161
184
|
}
|
|
185
|
+
console.log(chalk.bold("\nWallet"));
|
|
186
|
+
await provisionWallet();
|
|
162
187
|
console.log("");
|
|
163
188
|
console.log(chalk.green(`Setup complete. Spend limit: $${(me.spendLimitCents / 100).toFixed(2)}.`));
|
|
164
|
-
|
|
189
|
+
printHints({ includeReset: false });
|
|
190
|
+
}
|
|
191
|
+
function printHints(opts) {
|
|
192
|
+
const lines = [
|
|
193
|
+
"Issue a single-use card: agentcard request new --amount <dollars>",
|
|
194
|
+
"Pay an x402 endpoint: agentcard wallet fetch <url>",
|
|
195
|
+
"Update your spend limit: agentcard limit --amount <dollars>",
|
|
196
|
+
];
|
|
197
|
+
if (opts.includeReset) {
|
|
198
|
+
lines.push("Reset your profile: agentcard setup --reset");
|
|
199
|
+
}
|
|
200
|
+
for (const l of lines)
|
|
201
|
+
console.log(chalk.dim(` ${l}`));
|
|
165
202
|
}
|
|
166
203
|
//# sourceMappingURL=setup.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../src/commands/setup.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../src/commands/setup.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,7 +8,7 @@ const API_URL = process.env.AGENTCARD_API_URL || "https://agentcard.ai";
|
|
|
8
8
|
const POLL_INTERVAL = 2000;
|
|
9
9
|
const TIMEOUT = 5 * 60 * 1000;
|
|
10
10
|
function formatTerms(appUrl) {
|
|
11
|
-
return `By using AgentCard you acknowledge this is a beta service governed by
|
|
11
|
+
return `AgentCard provides virtual cards designed for use by AI agents. By using AgentCard, you acknowledge that this is a beta service governed by the following terms: ${appUrl}/terms.`;
|
|
12
12
|
}
|
|
13
13
|
export async function signup(opts) {
|
|
14
14
|
console.log(chalk.dim(formatTerms(API_URL)));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signup.js","sourceRoot":"","sources":["../../../src/commands/signup.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,sBAAsB,CAAC;AACxE,MAAM,aAAa,GAAG,IAAI,CAAC;AAC3B,MAAM,OAAO,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AAmB9B,SAAS,WAAW,CAAC,MAAc;IACjC,OAAO,
|
|
1
|
+
{"version":3,"file":"signup.js","sourceRoot":"","sources":["../../../src/commands/signup.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,sBAAsB,CAAC;AACxE,MAAM,aAAa,GAAG,IAAI,CAAC;AAC3B,MAAM,OAAO,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AAmB9B,SAAS,WAAW,CAAC,MAAc;IACjC,OAAO,oKAAoK,MAAM,SAAS,CAAC;AAC7L,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,IAAwB;IACnD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAE7C,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IAEvB,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC;YAC3B,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE;SAC5D,CAAC,CAAC;QACH,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IACxB,CAAC;IAED,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAC;QAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;IAClC,MAAM,IAAI,CAAC,qBAAqB,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAE9D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,yBAAyB,KAAK,KAAK,CAAC,CAAC,CAAC;IAC7D,MAAM,WAAW,GAAG,GAAG,OAAO,4BAA4B,KAAK,EAAE,CAAC;IAClE,IAAI,CAAC;QACH,MAAM,IAAI,CACR,8BAA8B,EAC9B,EAAE,KAAK,EAAE,WAAW,EAAE,EACtB,EAAE,IAAI,EAAE,KAAK,EAAE,CAChB,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC,CAAC;QACzE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC,CAAC;IAE/D,MAAM,OAAO,GAAG,GAAG,CAAC,+BAA+B,CAAC,CAAC,KAAK,EAAE,CAAC;IAC7D,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC;IAEtC,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC7B,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC;QAEnE,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,GAAG,CACtB,4BAA4B,KAAK,EAAE,EACnC,EAAE,IAAI,EAAE,KAAK,EAAE,CAChB,CAAC;YAEF,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;gBACjE,OAAO,CAAC,IAAI,EAAE,CAAC;gBACf,UAAU,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;gBAEzD,IAAI,EAAE,GAAsB,IAAI,CAAC;gBACjC,IAAI,CAAC;oBACH,EAAE,GAAG,MAAM,GAAG,CAAa,SAAS,CAAC,CAAC;gBACxC,CAAC;gBAAC,MAAM,CAAC;oBACP,wDAAwD;gBAC1D,CAAC;gBAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,gBAAgB,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;gBAE1D,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC;oBACf,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CACP,qDAAqD,CACtD,CACF,CAAC;oBACF,OAAO;gBACT,CAAC;gBAED,IACE,CAAC,EAAE;oBACH,CAAC,EAAE,CAAC,SAAS;oBACb,CAAC,EAAE,CAAC,QAAQ;oBACZ,CAAC,EAAE,CAAC,WAAW;oBACf,CAAC,EAAE,CAAC,aAAa,EACjB,CAAC;oBACD,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CAAC,qEAAqE,CAAC,CACpF,CAAC;gBACJ,CAAC;qBAAM,CAAC;oBACN,MAAM,KAAK,GACT,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE;wBAC9C,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;oBAClC,MAAM,gBAAgB,GAAG,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACnE,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CACP,YAAY,EAAE,CAAC,SAAS,IAAI,EAAE,CAAC,QAAQ,KAAK,EAAE,CAAC,WAAW,KAAK,KAAK,cAAc,EAAE,CAAC,aAAa,CAAC,KAAK,GAAG,gBAAgB,GAAG,CAC/H,CACF,CAAC;oBACF,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CACP,mHAAmH,CACpH,CACF,CAAC;gBACJ,CAAC;gBACD,OAAO;YACT,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,8BAA8B;QAChC,CAAC;IACH,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;IAC5D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function walletBalance(): Promise<void>;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { get } from "../../lib/api.js";
|
|
3
|
+
import { formatUsdc, getUsdcBalance } from "../../lib/usdc.js";
|
|
4
|
+
export async function walletBalance() {
|
|
5
|
+
try {
|
|
6
|
+
const me = await get("/api/me");
|
|
7
|
+
if (!me.walletAddress) {
|
|
8
|
+
console.error(chalk.red("Wallet not provisioned. Run `agentcard setup` first."));
|
|
9
|
+
process.exit(1);
|
|
10
|
+
}
|
|
11
|
+
const bal = await getUsdcBalance(me.walletAddress);
|
|
12
|
+
console.log(formatUsdc(bal));
|
|
13
|
+
}
|
|
14
|
+
catch (err) {
|
|
15
|
+
console.error(chalk.red(`Couldn't load wallet balance: ${err instanceof Error ? err.message : String(err)}`));
|
|
16
|
+
process.exit(1);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=balance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"balance.js","sourceRoot":"","sources":["../../../../src/commands/wallet/balance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAM/D,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,MAAM,GAAG,CAAK,SAAS,CAAC,CAAC;QACpC,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;YACtB,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAClE,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,cAAc,CAAC,EAAE,CAAC,aAA8B,CAAC,CAAC;QACpE,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CACP,iCAAiC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CACpF,CACF,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { x402Client, x402HTTPClient, wrapFetchWithPayment, } from "@x402/fetch";
|
|
3
|
+
import { ExactEvmScheme } from "@x402/evm/exact/client";
|
|
4
|
+
import { ensureWalletReady } from "../../lib/privy.js";
|
|
5
|
+
import { getX402Signer } from "../../lib/smart-wallet.js";
|
|
6
|
+
import { parseUsdc } from "../../lib/usdc.js";
|
|
7
|
+
import { post, ApiError } from "../../lib/api.js";
|
|
8
|
+
// Backend tracking is best-effort — never let a logging failure poison the
|
|
9
|
+
// user's actual fetch result.
|
|
10
|
+
async function track(payload) {
|
|
11
|
+
try {
|
|
12
|
+
await post("/api/wallet/track", payload);
|
|
13
|
+
}
|
|
14
|
+
catch (err) {
|
|
15
|
+
if (process.env.AGENTCARD_DEBUG) {
|
|
16
|
+
console.error(chalk.dim(`[track] failed: ${err instanceof Error ? err.message : String(err)}`));
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
// `agentcard wallet fetch <url> [--method GET] [--header K:V] [--data BODY] [--max-cost <usdc>]`
|
|
21
|
+
//
|
|
22
|
+
// Wraps native fetch with x402 payment handling. If the endpoint returns 402
|
|
23
|
+
// with x402 payment requirements, this auto-pays via the user's wallet
|
|
24
|
+
// (sponsored gas, USDC on Base) and retries. The body of the final response
|
|
25
|
+
// is printed to stdout.
|
|
26
|
+
export async function walletFetch(url, opts) {
|
|
27
|
+
if (!url) {
|
|
28
|
+
console.error(chalk.red("Usage: agentcard wallet fetch <url>"));
|
|
29
|
+
process.exit(1);
|
|
30
|
+
}
|
|
31
|
+
await ensureWalletReady();
|
|
32
|
+
const maxCostAtomic = opts.maxCost ? parseUsdc(opts.maxCost) : null;
|
|
33
|
+
const headers = {};
|
|
34
|
+
for (const h of opts.header ?? []) {
|
|
35
|
+
const idx = h.indexOf(":");
|
|
36
|
+
if (idx <= 0) {
|
|
37
|
+
console.error(chalk.red(`Invalid header: ${h} (expected "Key: Value")`));
|
|
38
|
+
process.exit(1);
|
|
39
|
+
}
|
|
40
|
+
headers[h.slice(0, idx).trim()] = h.slice(idx + 1).trim();
|
|
41
|
+
}
|
|
42
|
+
const init = {
|
|
43
|
+
method: opts.method ?? "GET",
|
|
44
|
+
headers,
|
|
45
|
+
};
|
|
46
|
+
if (opts.data)
|
|
47
|
+
init.body = opts.data;
|
|
48
|
+
// Populated by the onAfterPaymentCreation hook below when a payment is
|
|
49
|
+
// signed. Null when the endpoint didn't require payment. Held in an object
|
|
50
|
+
// so TS doesn't narrow the closure assignment to `never`.
|
|
51
|
+
const captured = { req: null };
|
|
52
|
+
try {
|
|
53
|
+
const signer = await getX402Signer();
|
|
54
|
+
const client = new x402Client();
|
|
55
|
+
client.register("eip155:8453", new ExactEvmScheme(signer));
|
|
56
|
+
client.onAfterPaymentCreation(async (ctx) => {
|
|
57
|
+
captured.req = ctx.selectedRequirements;
|
|
58
|
+
});
|
|
59
|
+
// Hard ceiling on per-request payment, enforced before signing. If every
|
|
60
|
+
// requirement exceeds the cap the policy returns empty and the wrapped
|
|
61
|
+
// fetch throws — caught below and surfaced as `fetch failed: ...`.
|
|
62
|
+
if (maxCostAtomic !== null) {
|
|
63
|
+
const cap = maxCostAtomic;
|
|
64
|
+
client.registerPolicy((_v, reqs) => reqs.filter((r) => BigInt(r.amount) <= cap));
|
|
65
|
+
}
|
|
66
|
+
const fetchWithPay = wrapFetchWithPayment(globalThis.fetch, client);
|
|
67
|
+
const res = await fetchWithPay(url, init);
|
|
68
|
+
const body = await res.text();
|
|
69
|
+
// Decode payment receipt from response header, if present. The server
|
|
70
|
+
// only sets x-payment-response when settlement actually ran, so a missing
|
|
71
|
+
// header means "no payment was required" — not an error.
|
|
72
|
+
let settle = null;
|
|
73
|
+
if (res.headers.get("x-payment-response")) {
|
|
74
|
+
try {
|
|
75
|
+
const s = new x402HTTPClient(client).getPaymentSettleResponse((n) => res.headers.get(n));
|
|
76
|
+
settle = {
|
|
77
|
+
transaction: s.transaction ?? null,
|
|
78
|
+
payer: s.payer ?? null,
|
|
79
|
+
errorReason: s.errorReason ?? null,
|
|
80
|
+
errorMessage: s.errorMessage ?? null,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
// ignore decode failure; tracking is best-effort
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
await track({
|
|
88
|
+
url,
|
|
89
|
+
success: res.ok && (settle ? !settle.errorReason : true),
|
|
90
|
+
httpStatus: res.status,
|
|
91
|
+
payment: captured.req
|
|
92
|
+
? {
|
|
93
|
+
network: captured.req.network,
|
|
94
|
+
asset: captured.req.asset,
|
|
95
|
+
amountAtomic: captured.req.amount,
|
|
96
|
+
payTo: captured.req.payTo,
|
|
97
|
+
}
|
|
98
|
+
: null,
|
|
99
|
+
settle,
|
|
100
|
+
});
|
|
101
|
+
if (!res.ok)
|
|
102
|
+
console.error(chalk.red(`HTTP ${res.status}`));
|
|
103
|
+
if (settle?.errorReason) {
|
|
104
|
+
console.error(chalk.red(`payment settlement failed: ${settle.errorReason}` +
|
|
105
|
+
(settle.errorMessage ? ` — ${settle.errorMessage}` : "")));
|
|
106
|
+
}
|
|
107
|
+
process.stdout.write(body);
|
|
108
|
+
if (!res.ok || settle?.errorReason)
|
|
109
|
+
process.exit(2);
|
|
110
|
+
}
|
|
111
|
+
catch (err) {
|
|
112
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
113
|
+
await track({
|
|
114
|
+
url,
|
|
115
|
+
success: false,
|
|
116
|
+
httpStatus: 0,
|
|
117
|
+
payment: captured.req
|
|
118
|
+
? {
|
|
119
|
+
network: captured.req.network,
|
|
120
|
+
asset: captured.req.asset,
|
|
121
|
+
amountAtomic: captured.req.amount,
|
|
122
|
+
payTo: captured.req.payTo,
|
|
123
|
+
}
|
|
124
|
+
: null,
|
|
125
|
+
settle: {
|
|
126
|
+
transaction: null,
|
|
127
|
+
payer: null,
|
|
128
|
+
errorReason: "client_error",
|
|
129
|
+
errorMessage: message,
|
|
130
|
+
},
|
|
131
|
+
});
|
|
132
|
+
console.error(chalk.red(`fetch failed: ${message}`));
|
|
133
|
+
if (err instanceof ApiError && err.body && typeof err.body === "object") {
|
|
134
|
+
const b = err.body;
|
|
135
|
+
if (typeof b.spendLimitCents === "number" &&
|
|
136
|
+
typeof b.spentCents === "number" &&
|
|
137
|
+
typeof b.requestedCents === "number") {
|
|
138
|
+
const fmt = (c) => `$${(c / 100).toFixed(2)}`;
|
|
139
|
+
console.error(chalk.dim(` limit: ${fmt(b.spendLimitCents)}, ` +
|
|
140
|
+
`spent: ${fmt(b.spentCents)}, ` +
|
|
141
|
+
`this request: ${fmt(b.requestedCents)}`));
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
process.exit(1);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=fetch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch.js","sourceRoot":"","sources":["../../../../src/commands/wallet/fetch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function walletInfo(): Promise<void>;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import ora from "ora";
|
|
3
|
+
import { get } from "../../lib/api.js";
|
|
4
|
+
import { formatUsdc, getUsdcBalance } from "../../lib/usdc.js";
|
|
5
|
+
export async function walletInfo() {
|
|
6
|
+
const spinner = ora("Loading wallet…").start();
|
|
7
|
+
try {
|
|
8
|
+
const me = await get("/api/me");
|
|
9
|
+
if (!me.walletAddress) {
|
|
10
|
+
spinner.fail("Wallet not provisioned. Run `agentcard setup` first.");
|
|
11
|
+
process.exit(1);
|
|
12
|
+
}
|
|
13
|
+
const address = me.walletAddress;
|
|
14
|
+
const balance = await getUsdcBalance(address);
|
|
15
|
+
spinner.stop();
|
|
16
|
+
console.log(chalk.bold("\n Wallet"));
|
|
17
|
+
console.log(" " + "─".repeat(44));
|
|
18
|
+
console.log(` ${chalk.bold("Address:".padEnd(14))} ${address}`);
|
|
19
|
+
console.log(` ${chalk.bold("USDC:".padEnd(14))} ${formatUsdc(balance)}`);
|
|
20
|
+
console.log(` ${chalk.bold("Network:".padEnd(14))} Base`);
|
|
21
|
+
console.log(" " + "─".repeat(44));
|
|
22
|
+
console.log(chalk.dim(`\n Fund it: send USDC on Base to ${address}\n https://basescan.org/address/${address}\n`));
|
|
23
|
+
}
|
|
24
|
+
catch (err) {
|
|
25
|
+
spinner.fail(`Couldn't load wallet: ${err instanceof Error ? err.message : String(err)}`);
|
|
26
|
+
process.exit(1);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=info.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"info.js","sourceRoot":"","sources":["../../../../src/commands/wallet/info.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAM/D,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,MAAM,OAAO,GAAG,GAAG,CAAC,iBAAiB,CAAC,CAAC,KAAK,EAAE,CAAC;IAC/C,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,MAAM,GAAG,CAAK,SAAS,CAAC,CAAC;QACpC,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;YACtB,OAAO,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC;YACrE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,MAAM,OAAO,GAAG,EAAE,CAAC,aAA8B,CAAC;QAClD,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC;QAC9C,OAAO,CAAC,IAAI,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC;QACjE,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC1E,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;QAC3D,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QACnC,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CACP,qCAAqC,OAAO,oCAAoC,OAAO,IAAI,CAC5F,CACF,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CACV,yBAAyB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAC5E,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import ora from "ora";
|
|
3
|
+
import { isAddress } from "viem";
|
|
4
|
+
import { ensureWalletReady } from "../../lib/privy.js";
|
|
5
|
+
import { getSmartWalletClient } from "../../lib/smart-wallet.js";
|
|
6
|
+
import { withPreparedUserOps, } from "../../lib/policy-intent.js";
|
|
7
|
+
import { USDC_BASE, encodeUsdcTransfer, parseUsdc } from "../../lib/usdc.js";
|
|
8
|
+
export async function walletSend(opts) {
|
|
9
|
+
const to = opts.to?.trim();
|
|
10
|
+
const amount = opts.amount?.trim();
|
|
11
|
+
if (!to || !amount) {
|
|
12
|
+
console.error(chalk.red("Both --to <address> and --amount <usdc> are required"));
|
|
13
|
+
process.exit(1);
|
|
14
|
+
}
|
|
15
|
+
if (!isAddress(to)) {
|
|
16
|
+
console.error(chalk.red(`Invalid recipient: ${to}`));
|
|
17
|
+
process.exit(1);
|
|
18
|
+
}
|
|
19
|
+
let atomic;
|
|
20
|
+
try {
|
|
21
|
+
atomic = parseUsdc(amount);
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
console.error(chalk.red(`Invalid amount: ${amount}`));
|
|
25
|
+
process.exit(1);
|
|
26
|
+
}
|
|
27
|
+
if (atomic <= 0n) {
|
|
28
|
+
console.error(chalk.red("Amount must be positive"));
|
|
29
|
+
process.exit(1);
|
|
30
|
+
}
|
|
31
|
+
await ensureWalletReady();
|
|
32
|
+
// Manually orchestrate prepare → sign → send so we can register the prepared
|
|
33
|
+
// userOp before the signing step. The backend at /api/wallet/rpc rejects
|
|
34
|
+
// secp256k1_sign without an intent; the registry binds expected hash → userOp
|
|
35
|
+
// so when the smart wallet client asks our LocalAccount to sign, we pass the
|
|
36
|
+
// userOp through for policy-check + spend-limit enforcement.
|
|
37
|
+
const sendSpinner = ora(`Sending ${amount} USDC to ${to}…`).start();
|
|
38
|
+
try {
|
|
39
|
+
const client = await getSmartWalletClient();
|
|
40
|
+
const data = encodeUsdcTransfer(to, atomic);
|
|
41
|
+
const prepared = await client.prepareCalls({
|
|
42
|
+
calls: [{ to: USDC_BASE, value: 0n, data }],
|
|
43
|
+
});
|
|
44
|
+
// prepareCalls returns one of:
|
|
45
|
+
// - "user-operation-v070" — single userOp (post-bootstrap)
|
|
46
|
+
// - "array" — bootstrap path with [authorization, user-operation-v070]
|
|
47
|
+
// For the array case we still register every userOp inside; the
|
|
48
|
+
// authorization step uses signAuthorization (not signMessage) and is
|
|
49
|
+
// handled by the policy's eth_sign7702Authorization branch directly.
|
|
50
|
+
const registeredOps = prepared.type === "user-operation-v070"
|
|
51
|
+
? [prepared.data]
|
|
52
|
+
: prepared.type === "array"
|
|
53
|
+
? prepared.data
|
|
54
|
+
.filter((item) => item.type === "user-operation-v070")
|
|
55
|
+
.map((item) => item.data)
|
|
56
|
+
: (() => {
|
|
57
|
+
throw new Error(`unsupported prepared call type: ${prepared.type}`);
|
|
58
|
+
})();
|
|
59
|
+
const signedAndSent = await withPreparedUserOps(registeredOps, async () => {
|
|
60
|
+
const signed = await client.signPreparedCalls(prepared);
|
|
61
|
+
return client.sendPreparedCalls(signed);
|
|
62
|
+
});
|
|
63
|
+
const result = await client.waitForCallsStatus({ id: signedAndSent.id });
|
|
64
|
+
sendSpinner.stop();
|
|
65
|
+
if (result.status !== "success") {
|
|
66
|
+
console.error(chalk.red(`Send failed (status: ${result.status})`));
|
|
67
|
+
process.exit(1);
|
|
68
|
+
}
|
|
69
|
+
const txHash = result.receipts?.[0]?.transactionHash;
|
|
70
|
+
console.log(chalk.green(`✓ Sent ${amount} USDC to ${to}`));
|
|
71
|
+
if (txHash) {
|
|
72
|
+
console.log(chalk.dim(` https://basescan.org/tx/${txHash}`));
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
catch (err) {
|
|
76
|
+
sendSpinner.fail(`Send failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
77
|
+
process.exit(1);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=send.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"send.js","sourceRoot":"","sources":["../../../../src/commands/wallet/send.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import chalk from "chalk";
|
|
2
2
|
import { get } from "../lib/api.js";
|
|
3
3
|
import { getConfig } from "../lib/config.js";
|
|
4
|
+
import { formatUsdc, getUsdcBalance } from "../lib/usdc.js";
|
|
4
5
|
export async function whoami() {
|
|
5
6
|
const config = getConfig();
|
|
6
7
|
if (!config.token) {
|
|
@@ -13,6 +14,17 @@ export async function whoami() {
|
|
|
13
14
|
if (result.agentEmail) {
|
|
14
15
|
console.log(` ${chalk.bold("Agent email:")} ${result.agentEmail}`);
|
|
15
16
|
}
|
|
17
|
+
if (result.walletAddress) {
|
|
18
|
+
let balance = "(unknown)";
|
|
19
|
+
try {
|
|
20
|
+
const bal = await getUsdcBalance(result.walletAddress);
|
|
21
|
+
balance = `${formatUsdc(bal)} USDC`;
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
/* RPC unavailable — fall through with placeholder */
|
|
25
|
+
}
|
|
26
|
+
console.log(` ${chalk.bold("Wallet:")} ${result.walletAddress} (Base, ${balance})`);
|
|
27
|
+
}
|
|
16
28
|
}
|
|
17
29
|
catch {
|
|
18
30
|
console.error(chalk.red("Failed to verify session. Try `agentcard signup` again."));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../../src/commands/whoami.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../../src/commands/whoami.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAQ5D,MAAM,CAAC,KAAK,UAAU,MAAM;IAC1B,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,uDAAuD,CAAC,CAAC,CAAC;QACnF,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,GAAG,CAAa,SAAS,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QAC/D,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;QACtE,CAAC;QACD,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;YACzB,IAAI,OAAO,GAAG,WAAW,CAAC;YAC1B,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,aAA8B,CAAC,CAAC;gBACxE,OAAO,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC;YACtC,CAAC;YAAC,MAAM,CAAC;gBACP,qDAAqD;YACvD,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,MAAM,CAAC,aAAa,WAAW,OAAO,GAAG,CAAC,CAAC;QAC5F,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAC,CAAC;IACtF,CAAC;AACH,CAAC"}
|