@xona-labs/xpay 0.1.23 → 0.1.25

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/dist/cli/bento.d.ts +23 -0
  3. package/dist/cli/bento.d.ts.map +1 -0
  4. package/dist/cli/bento.js +73 -0
  5. package/dist/cli/bento.js.map +1 -0
  6. package/dist/cli/index.js +20 -0
  7. package/dist/cli/index.js.map +1 -1
  8. package/dist/guardrail/index.d.ts +26 -2
  9. package/dist/guardrail/index.d.ts.map +1 -1
  10. package/dist/guardrail/index.js +90 -0
  11. package/dist/guardrail/index.js.map +1 -1
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js +11 -1
  14. package/dist/index.js.map +1 -1
  15. package/dist/profile/index.d.ts +8 -0
  16. package/dist/profile/index.d.ts.map +1 -1
  17. package/dist/profile/index.js +20 -0
  18. package/dist/profile/index.js.map +1 -1
  19. package/dist/profile/types.d.ts +11 -0
  20. package/dist/profile/types.d.ts.map +1 -1
  21. package/package.json +4 -1
  22. package/dist/cli/history.d.ts +0 -16
  23. package/dist/cli/history.d.ts.map +0 -1
  24. package/dist/cli/history.js +0 -59
  25. package/dist/cli/history.js.map +0 -1
  26. package/dist/cli/probe.d.ts +0 -11
  27. package/dist/cli/probe.d.ts.map +0 -1
  28. package/dist/cli/probe.js +0 -55
  29. package/dist/cli/probe.js.map +0 -1
  30. package/dist/history/evm.d.ts +0 -21
  31. package/dist/history/evm.d.ts.map +0 -1
  32. package/dist/history/evm.js +0 -118
  33. package/dist/history/evm.js.map +0 -1
  34. package/dist/history/index.d.ts +0 -19
  35. package/dist/history/index.d.ts.map +0 -1
  36. package/dist/history/index.js +0 -45
  37. package/dist/history/index.js.map +0 -1
  38. package/dist/history/solana.d.ts +0 -20
  39. package/dist/history/solana.d.ts.map +0 -1
  40. package/dist/history/solana.js +0 -96
  41. package/dist/history/solana.js.map +0 -1
  42. package/dist/history/types.d.ts +0 -26
  43. package/dist/history/types.d.ts.map +0 -1
  44. package/dist/history/types.js +0 -10
  45. package/dist/history/types.js.map +0 -1
  46. package/dist/probe/index.d.ts +0 -41
  47. package/dist/probe/index.d.ts.map +0 -1
  48. package/dist/probe/index.js +0 -80
  49. package/dist/probe/index.js.map +0 -1
@@ -1,16 +0,0 @@
1
- /**
2
- * `xpay history` — recent USDC activity across all configured networks.
3
- *
4
- * Public-RPC powered by default. EVM scans a recent block window
5
- * (~100k blocks ≈ 2 days on Base); pass --evm-window to widen.
6
- */
7
- export interface HistoryCmdOptions {
8
- profile?: string;
9
- passphrase?: string;
10
- network?: string;
11
- limit?: string;
12
- evmWindow?: string;
13
- json?: boolean;
14
- }
15
- export declare function runHistory(opts: HistoryCmdOptions): Promise<void>;
16
- //# sourceMappingURL=history.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../../src/cli/history.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CA4DvE"}
@@ -1,59 +0,0 @@
1
- /**
2
- * `xpay history` — recent USDC activity across all configured networks.
3
- *
4
- * Public-RPC powered by default. EVM scans a recent block window
5
- * (~100k blocks ≈ 2 days on Base); pass --evm-window to widen.
6
- */
7
- import chalk from "chalk";
8
- import { createXPay } from "../index.js";
9
- import { unlockActive, shortAddress, timeAgo, formatUsd } from "./common.js";
10
- export async function runHistory(opts) {
11
- const profile = await unlockActive(opts);
12
- const xpay = createXPay({ profile });
13
- const limit = opts.limit ? Number(opts.limit) : 25;
14
- const networks = opts.network ? [opts.network] : undefined;
15
- const evmBlockWindow = opts.evmWindow ? Number(opts.evmWindow) : undefined;
16
- const t0 = Date.now();
17
- let entries;
18
- try {
19
- entries = await xpay.history({ limit, networks, evmBlockWindow });
20
- }
21
- catch (err) {
22
- console.error(chalk.red(`✗ ${err.message}`));
23
- process.exit(1);
24
- }
25
- const elapsed = Date.now() - t0;
26
- if (opts.json) {
27
- process.stdout.write(JSON.stringify(entries, null, 2) + "\n");
28
- return;
29
- }
30
- if (entries.length === 0) {
31
- console.log(chalk.yellow("No USDC activity in the scanned window."));
32
- console.log(chalk.dim("Tip: widen the EVM window with --evm-window 500000, or run `xpay balance`."));
33
- return;
34
- }
35
- console.log("");
36
- console.log(chalk.dim(`${entries.length} entr${entries.length === 1 ? "y" : "ies"} (${elapsed}ms)`));
37
- console.log("");
38
- // Header
39
- console.log(chalk.dim(" TIME".padEnd(12) +
40
- "NETWORK".padEnd(10) +
41
- "DIR".padEnd(10) +
42
- "AMOUNT".padEnd(14) +
43
- "COUNTERPARTY".padEnd(18) +
44
- "TX"));
45
- for (const e of entries) {
46
- const dir = e.direction === "send" ? chalk.red("→ send") : chalk.green("← recv");
47
- const amount = formatUsd(e.amountUsdc).padEnd(20); // padEnd ignores ANSI codes
48
- console.log(" " +
49
- timeAgo(e.timestamp).padEnd(12) +
50
- chalk.cyan(e.network.padEnd(10)) +
51
- dir.padEnd(18) + // padEnd ignores ANSI
52
- formatUsd(e.amountUsdc).padEnd(20) +
53
- chalk.white(shortAddress(e.counterparty, 6, 6).padEnd(18)) +
54
- chalk.dim(shortAddress(e.signature, 6, 6)));
55
- void amount;
56
- }
57
- console.log("");
58
- }
59
- //# sourceMappingURL=history.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"history.js","sourceRoot":"","sources":["../../src/cli/history.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAW7E,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAuB;IACtD,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC;IACzC,MAAM,IAAI,GAAG,UAAU,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;IAErC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC3D,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAE3E,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACtB,IAAI,OAAO,CAAC;IACZ,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC,CAAC;IACpE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAM,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;IAEhC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QAC9D,OAAO;IACT,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,yCAAyC,CAAC,CAAC,CAAC;QACrE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,4EAA4E,CAAC,CAAC,CAAC;QACrG,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,QAAQ,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,KAAK,OAAO,KAAK,CAAC,CAAC,CAAC;IACrG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,SAAS;IACT,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CACP,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACjB,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;QACpB,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;QAChB,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACnB,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;QACzB,IAAI,CACP,CACF,CAAC;IAEF,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,GAAG,GAAG,CAAC,CAAC,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACjF,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,4BAA4B;QAC/E,OAAO,CAAC,GAAG,CACT,IAAI;YACF,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;YAC/B,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAChC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,sBAAsB;YACvC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;YAClC,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC1D,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAC7C,CAAC;QACF,KAAK,MAAM,CAAC;IACd,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC"}
@@ -1,11 +0,0 @@
1
- /**
2
- * `xpay probe <url>` — verify a resource returns a valid x402 402 (no payment).
3
- */
4
- export interface ProbeCmdOptions {
5
- method?: string;
6
- body?: string;
7
- json?: boolean;
8
- timeout?: string;
9
- }
10
- export declare function runProbe(url: string, opts: ProbeCmdOptions): Promise<void>;
11
- //# sourceMappingURL=probe.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"probe.d.ts","sourceRoot":"","sources":["../../src/cli/probe.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CA8ChF"}
package/dist/cli/probe.js DELETED
@@ -1,55 +0,0 @@
1
- /**
2
- * `xpay probe <url>` — verify a resource returns a valid x402 402 (no payment).
3
- */
4
- import chalk from "chalk";
5
- import { probe } from "../probe/index.js";
6
- export async function runProbe(url, opts) {
7
- if (!url) {
8
- console.error(chalk.red("usage: xpay probe <url> [--method POST] [--body '{...}']"));
9
- process.exit(1);
10
- }
11
- let body;
12
- if (opts.body) {
13
- try {
14
- body = JSON.parse(opts.body);
15
- }
16
- catch {
17
- console.error(chalk.red("✗ --body must be valid JSON"));
18
- process.exit(1);
19
- }
20
- }
21
- const result = await probe(url, {
22
- method: opts.method,
23
- body,
24
- timeoutMs: opts.timeout ? Number(opts.timeout) : undefined,
25
- });
26
- if (opts.json) {
27
- process.stdout.write(JSON.stringify(result, null, 2) + "\n");
28
- return;
29
- }
30
- console.log("");
31
- if (result.ok) {
32
- console.log(chalk.green(`✔ valid x402 endpoint`) + chalk.dim(` (${result.elapsedMs}ms)`));
33
- }
34
- else {
35
- console.log(chalk.red(`✗ not a valid x402 endpoint`) + chalk.dim(` (${result.elapsedMs}ms)`));
36
- }
37
- console.log(` url ${result.url}`);
38
- console.log(` status ${result.status}`);
39
- if (result.x402Version)
40
- console.log(` x402 v${result.x402Version}`);
41
- if (result.source)
42
- console.log(` source ${result.source}`);
43
- if (result.networks.length)
44
- console.log(` networks ${result.networks.join(", ")}`);
45
- if (result.accepts.length) {
46
- for (const a of result.accepts) {
47
- const price = a.amount ? `$${(Number(a.amount) / 1_000_000).toFixed(4)}` : "?";
48
- console.log(` ${chalk.green(price)} → ${chalk.dim(a.payTo)} on ${a.network}`);
49
- }
50
- }
51
- if (result.error)
52
- console.log(` ${chalk.red("error")} ${result.error}`);
53
- console.log("");
54
- }
55
- //# sourceMappingURL=probe.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"probe.js","sourceRoot":"","sources":["../../src/cli/probe.ts"],"names":[],"mappings":"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"}
@@ -1,21 +0,0 @@
1
- /**
2
- * EVM USDC history via ERC-20 Transfer event logs.
3
- *
4
- * Strategy: scan a recent block window for `Transfer` events on the USDC
5
- * contract where `from` or `to` is the wallet. Public RPCs typically allow a
6
- * window of ~5k–10k blocks per `eth_getLogs` call; we paginate if needed.
7
- *
8
- * Good enough for the v1 history view. For production / large windows, swap
9
- * the RPC for an indexer (Basescan/Alchemy/Covalent) by passing `rpcUrl`.
10
- */
11
- import type { HistoryEntry } from "./types.js";
12
- import type { Network } from "../types.js";
13
- export interface EvmHistoryOptions {
14
- address: string;
15
- network: Network;
16
- limit?: number;
17
- blockWindow?: number;
18
- rpcUrl?: string;
19
- }
20
- export declare function fetchEvmHistory(opts: EvmHistoryOptions): Promise<HistoryEntry[]>;
21
- //# sourceMappingURL=evm.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"evm.d.ts","sourceRoot":"","sources":["../../src/history/evm.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAsB3C,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAID,wBAAsB,eAAe,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAyFtF"}
@@ -1,118 +0,0 @@
1
- /**
2
- * EVM USDC history via ERC-20 Transfer event logs.
3
- *
4
- * Strategy: scan a recent block window for `Transfer` events on the USDC
5
- * contract where `from` or `to` is the wallet. Public RPCs typically allow a
6
- * window of ~5k–10k blocks per `eth_getLogs` call; we paginate if needed.
7
- *
8
- * Good enough for the v1 history view. For production / large windows, swap
9
- * the RPC for an indexer (Basescan/Alchemy/Covalent) by passing `rpcUrl`.
10
- */
11
- import { Contract, JsonRpcProvider, ZeroAddress, hexlify, toBeHex, zeroPadValue } from "ethers";
12
- const USDC_CONTRACTS = {
13
- base: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
14
- ethereum: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
15
- arbitrum: "0xaf88d065e77c8cC2239327C5EDb3A432268e5831",
16
- optimism: "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85",
17
- };
18
- const DEFAULT_RPCS = {
19
- base: "https://mainnet.base.org",
20
- ethereum: "https://eth.llamarpc.com",
21
- arbitrum: "https://arb1.arbitrum.io/rpc",
22
- optimism: "https://mainnet.optimism.io",
23
- };
24
- /** Window (in blocks) scanned for transfer history. ~2 days at 2s block times. */
25
- const DEFAULT_BLOCK_WINDOW = 100_000;
26
- /** Public RPCs commonly cap getLogs at 10k blocks. Stay under it. */
27
- const MAX_LOG_RANGE = 9_500;
28
- const TRANSFER_TOPIC = "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef";
29
- const TRANSFER_IFACE = ["event Transfer(address indexed from, address indexed to, uint256 value)"];
30
- export async function fetchEvmHistory(opts) {
31
- const usdc = USDC_CONTRACTS[opts.network];
32
- const rpc = opts.rpcUrl ?? DEFAULT_RPCS[opts.network];
33
- if (!usdc || !rpc) {
34
- throw new Error(`fetchEvmHistory: no USDC contract / RPC for network "${opts.network}"`);
35
- }
36
- const provider = new JsonRpcProvider(rpc);
37
- const latest = await provider.getBlockNumber();
38
- const from = Math.max(0, latest - (opts.blockWindow ?? DEFAULT_BLOCK_WINDOW));
39
- const padded = zeroPadValue(opts.address, 32);
40
- /** Chunked getLogs — public RPCs cap range, so we walk backwards in MAX_LOG_RANGE
41
- * windows and stop early once we have enough hits for the requested limit. */
42
- async function chunkedLogs(topics) {
43
- const all = [];
44
- let end = latest;
45
- while (end > from) {
46
- const start = Math.max(from, end - MAX_LOG_RANGE);
47
- try {
48
- const batch = await provider.getLogs({
49
- address: usdc,
50
- topics,
51
- fromBlock: start,
52
- toBlock: end,
53
- });
54
- all.push(...batch);
55
- }
56
- catch (err) {
57
- // Tolerate per-chunk failures (rate limits) — keep what we have.
58
- // eslint-disable-next-line no-console
59
- console.warn(`[xpay] evm history chunk ${start}-${end} failed:`, err.message);
60
- }
61
- if (opts.limit && all.length >= opts.limit)
62
- break;
63
- end = start - 1;
64
- }
65
- return all;
66
- }
67
- const [outgoing, incoming] = await Promise.all([
68
- chunkedLogs([TRANSFER_TOPIC, padded, null]),
69
- chunkedLogs([TRANSFER_TOPIC, null, padded]),
70
- ]);
71
- const erc20 = new Contract(usdc, TRANSFER_IFACE, provider);
72
- const logs = [...outgoing, ...incoming];
73
- const seen = new Set();
74
- // Pull block timestamps for each unique block in the result.
75
- const blockNumbers = [...new Set(logs.map((l) => l.blockNumber))];
76
- const blocks = new Map();
77
- await Promise.all(blockNumbers.map(async (bn) => {
78
- try {
79
- const b = await provider.getBlock(bn);
80
- if (b?.timestamp)
81
- blocks.set(bn, b.timestamp * 1000);
82
- }
83
- catch {
84
- /* skip */
85
- }
86
- }));
87
- const out = [];
88
- for (const log of logs) {
89
- const key = `${log.transactionHash}:${log.index}`;
90
- if (seen.has(key))
91
- continue;
92
- seen.add(key);
93
- const parsed = erc20.interface.parseLog({ topics: [...log.topics], data: log.data });
94
- if (!parsed)
95
- continue;
96
- const fromAddr = parsed.args[0].toLowerCase();
97
- const toAddr = parsed.args[1].toLowerCase();
98
- const value = parsed.args[2];
99
- const isSend = fromAddr === opts.address.toLowerCase();
100
- out.push({
101
- timestamp: blocks.get(log.blockNumber) ?? null,
102
- network: opts.network,
103
- signature: log.transactionHash,
104
- direction: isSend ? "send" : "receive",
105
- counterparty: isSend ? toAddr : fromAddr,
106
- amountUsdc: Number(value) / 1_000_000,
107
- });
108
- }
109
- out.sort((a, b) => (b.timestamp ?? 0) - (a.timestamp ?? 0));
110
- if (opts.limit)
111
- return out.slice(0, opts.limit);
112
- return out;
113
- }
114
- // hint to tree-shakers: keep this import live (used in JSDoc only otherwise)
115
- void hexlify;
116
- void toBeHex;
117
- void ZeroAddress;
118
- //# sourceMappingURL=evm.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"evm.js","sourceRoot":"","sources":["../../src/history/evm.ts"],"names":[],"mappings":"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"}
@@ -1,19 +0,0 @@
1
- /**
2
- * Unified history — merges Solana + EVM USDC activity into a single sorted feed.
3
- */
4
- import type { Network } from "../types.js";
5
- import type { Wallet } from "../wallet/index.js";
6
- import type { HistoryEntry } from "./types.js";
7
- export * from "./types.js";
8
- export interface HistoryOptions {
9
- /** Restrict to specific networks. Defaults to all the wallet supports. */
10
- networks?: Network[];
11
- /** Max entries to return (after merge + sort). */
12
- limit?: number;
13
- /** Per-network block window for EVM scans. */
14
- evmBlockWindow?: number;
15
- /** Per-network RPC overrides. */
16
- rpcs?: Partial<Record<Network, string>>;
17
- }
18
- export declare function getHistory(wallet: Wallet, opts?: HistoryOptions): Promise<HistoryEntry[]>;
19
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/history/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAGjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,cAAc,YAAY,CAAC;AAE3B,MAAM,WAAW,cAAc;IAC7B,0EAA0E;IAC1E,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;IACrB,kDAAkD;IAClD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8CAA8C;IAC9C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iCAAiC;IACjC,IAAI,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;CACzC;AAID,wBAAsB,UAAU,CAC9B,MAAM,EAAE,MAAM,EACd,IAAI,GAAE,cAAmB,GACxB,OAAO,CAAC,YAAY,EAAE,CAAC,CAqCzB"}
@@ -1,45 +0,0 @@
1
- /**
2
- * Unified history — merges Solana + EVM USDC activity into a single sorted feed.
3
- */
4
- import { fetchSolanaHistory } from "./solana.js";
5
- import { fetchEvmHistory } from "./evm.js";
6
- export * from "./types.js";
7
- const EVM_NETWORKS = ["base", "ethereum", "arbitrum", "optimism"];
8
- export async function getHistory(wallet, opts = {}) {
9
- const networks = opts.networks ?? wallet.networks;
10
- const perNetwork = Math.max(opts.limit ?? 25, 25);
11
- const results = await Promise.all(networks.map(async (net) => {
12
- if (!wallet.has(net))
13
- return [];
14
- const address = wallet.address(net);
15
- try {
16
- if (net === "solana") {
17
- return await fetchSolanaHistory({
18
- address,
19
- limit: perNetwork,
20
- rpcUrl: opts.rpcs?.solana,
21
- });
22
- }
23
- if (EVM_NETWORKS.includes(net)) {
24
- return await fetchEvmHistory({
25
- address,
26
- network: net,
27
- limit: perNetwork,
28
- blockWindow: opts.evmBlockWindow,
29
- rpcUrl: opts.rpcs?.[net],
30
- });
31
- }
32
- }
33
- catch (err) {
34
- // One bad network shouldn't kill history. Log and continue.
35
- // eslint-disable-next-line no-console
36
- console.warn(`[xpay] history fetch failed for ${net}:`, err.message);
37
- }
38
- return [];
39
- }));
40
- const merged = results.flat().sort((a, b) => (b.timestamp ?? 0) - (a.timestamp ?? 0));
41
- if (opts.limit)
42
- return merged.slice(0, opts.limit);
43
- return merged;
44
- }
45
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/history/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAG3C,cAAc,YAAY,CAAC;AAa3B,MAAM,YAAY,GAAc,CAAC,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;AAE7E,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,MAAc,EACd,OAAuB,EAAE;IAEzB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC;IAClD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IAElD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACzB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,OAAO,EAAE,CAAC;QAChC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACpC,IAAI,CAAC;YACH,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;gBACrB,OAAO,MAAM,kBAAkB,CAAC;oBAC9B,OAAO;oBACP,KAAK,EAAE,UAAU;oBACjB,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM;iBAC1B,CAAC,CAAC;YACL,CAAC;YACD,IAAI,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC/B,OAAO,MAAM,eAAe,CAAC;oBAC3B,OAAO;oBACP,OAAO,EAAE,GAAG;oBACZ,KAAK,EAAE,UAAU;oBACjB,WAAW,EAAE,IAAI,CAAC,cAAc;oBAChC,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC;iBACzB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,4DAA4D;YAC5D,sCAAsC;YACtC,OAAO,CAAC,IAAI,CAAC,mCAAmC,GAAG,GAAG,EAAG,GAAa,CAAC,OAAO,CAAC,CAAC;QAClF,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC,CACH,CAAC;IAEF,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC;IACtF,IAAI,IAAI,CAAC,KAAK;QAAE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IACnD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -1,20 +0,0 @@
1
- /**
2
- * Solana USDC history via standard JSON-RPC.
3
- *
4
- * Strategy:
5
- * 1. `getSignaturesForAddress` on the wallet's USDC associated token account
6
- * (ATA), not the wallet itself — token-program txs are addressed to the
7
- * ATA, not the owner.
8
- * 2. `getParsedTransactions` (batched) to extract amounts + counterparties.
9
- *
10
- * Works on free public RPC for small `limit` values. For prod scale, drop in
11
- * a Helius / Triton RPC via the `rpcUrl` arg.
12
- */
13
- import type { HistoryEntry } from "./types.js";
14
- export interface SolanaHistoryOptions {
15
- address: string;
16
- limit?: number;
17
- rpcUrl?: string;
18
- }
19
- export declare function fetchSolanaHistory(opts: SolanaHistoryOptions): Promise<HistoryEntry[]>;
20
- //# sourceMappingURL=solana.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"solana.d.ts","sourceRoot":"","sources":["../../src/history/solana.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AASH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAK/C,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CA8B5F"}
@@ -1,96 +0,0 @@
1
- /**
2
- * Solana USDC history via standard JSON-RPC.
3
- *
4
- * Strategy:
5
- * 1. `getSignaturesForAddress` on the wallet's USDC associated token account
6
- * (ATA), not the wallet itself — token-program txs are addressed to the
7
- * ATA, not the owner.
8
- * 2. `getParsedTransactions` (batched) to extract amounts + counterparties.
9
- *
10
- * Works on free public RPC for small `limit` values. For prod scale, drop in
11
- * a Helius / Triton RPC via the `rpcUrl` arg.
12
- */
13
- import { Connection, PublicKey, } from "@solana/web3.js";
14
- import { getAssociatedTokenAddress } from "@solana/spl-token";
15
- const USDC_MINT = "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v";
16
- const DEFAULT_RPC = "https://api.mainnet-beta.solana.com";
17
- export async function fetchSolanaHistory(opts) {
18
- const limit = Math.min(opts.limit ?? 25, 1000);
19
- const connection = new Connection(opts.rpcUrl ?? DEFAULT_RPC, "confirmed");
20
- const owner = new PublicKey(opts.address);
21
- const ata = await getAssociatedTokenAddress(new PublicKey(USDC_MINT), owner);
22
- const sigs = await connection.getSignaturesForAddress(ata, { limit });
23
- if (sigs.length === 0)
24
- return [];
25
- // Batch-fetch all parsed txs in a single RPC call to avoid rate-limiting on
26
- // public endpoints. getParsedTransactions accepts up to 1000 signatures.
27
- const parsed = await connection
28
- .getParsedTransactions(sigs.map((s) => s.signature), { maxSupportedTransactionVersion: 0 })
29
- .catch(() => sigs.map(() => null));
30
- const out = [];
31
- for (let i = 0; i < sigs.length; i++) {
32
- const sig = sigs[i];
33
- const tx = parsed[i];
34
- const entry = extractTransferEntry(tx, sig.signature, opts.address);
35
- if (!entry)
36
- continue;
37
- entry.timestamp = sig.blockTime ? sig.blockTime * 1000 : null;
38
- entry.status = sig.err ? "failed" : sig.confirmationStatus ?? "confirmed";
39
- out.push(entry);
40
- }
41
- return out;
42
- }
43
- function extractTransferEntry(tx, signature, ownerAddress) {
44
- if (!tx?.meta || tx.meta.err) {
45
- // Still emit failed tx so users can see them.
46
- return tx
47
- ? {
48
- timestamp: null,
49
- network: "solana",
50
- signature,
51
- direction: "send",
52
- counterparty: "",
53
- amountUsdc: 0,
54
- }
55
- : null;
56
- }
57
- for (const ix of tx.transaction.message.instructions) {
58
- const parsed = ix;
59
- if (parsed.program !== "spl-token")
60
- continue;
61
- const info = parsed.parsed?.info;
62
- if (!info)
63
- continue;
64
- const type = parsed.parsed?.type;
65
- if (type !== "transfer" && type !== "transferChecked")
66
- continue;
67
- // For SPL transfers we need to map source/dest token accounts back to owners.
68
- // The pre/post token balances expose this cleanly.
69
- const owners = (tx.meta.postTokenBalances ?? []).reduce((acc, b) => {
70
- if (b.owner)
71
- acc[b.accountIndex] = b.owner;
72
- return acc;
73
- }, {});
74
- const sourceIdx = tx.transaction.message.accountKeys.findIndex((k) => k.pubkey.toBase58() === info.source);
75
- const destIdx = tx.transaction.message.accountKeys.findIndex((k) => k.pubkey.toBase58() === info.destination);
76
- const sourceOwner = sourceIdx >= 0 ? owners[sourceIdx] ?? info.source : info.source;
77
- const destOwner = destIdx >= 0 ? owners[destIdx] ?? info.destination : info.destination;
78
- const isSend = info.authority === ownerAddress || sourceOwner === ownerAddress;
79
- const isReceive = destOwner === ownerAddress;
80
- if (!isSend && !isReceive)
81
- continue;
82
- const rawAmount = info.tokenAmount?.amount ?? info.amount ?? "0";
83
- const decimals = info.tokenAmount?.decimals ?? 6;
84
- const amount = Number(rawAmount) / 10 ** decimals;
85
- return {
86
- timestamp: null, // filled in by caller
87
- network: "solana",
88
- signature,
89
- direction: isSend ? "send" : "receive",
90
- counterparty: isSend ? destOwner ?? "" : sourceOwner ?? "",
91
- amountUsdc: amount,
92
- };
93
- }
94
- return null;
95
- }
96
- //# sourceMappingURL=solana.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"solana.js","sourceRoot":"","sources":["../../src/history/solana.ts"],"names":[],"mappings":"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"}
@@ -1,26 +0,0 @@
1
- /**
2
- * Unified history shape across networks. One entry per USDC transfer in or
3
- * out of the wallet.
4
- *
5
- * v1 only surfaces USDC because that's what xPay actually transacts in
6
- * (x402 is USDC-denominated). Future versions can extend `asset` to other
7
- * tokens or even non-fungible payments.
8
- */
9
- import type { Network } from "../types.js";
10
- export interface HistoryEntry {
11
- /** Unix ms timestamp the tx was confirmed (best-effort). */
12
- timestamp: number | null;
13
- /** Network the tx happened on. */
14
- network: Network;
15
- /** Settlement signature / tx hash. */
16
- signature: string;
17
- /** "send" when wallet was the sender, "receive" when the receiver. */
18
- direction: "send" | "receive";
19
- /** Other side of the transfer. */
20
- counterparty: string;
21
- /** Human USDC amount (positive, with 6-decimal precision). */
22
- amountUsdc: number;
23
- /** "confirmed" / "finalized" / "failed" — best-effort, may be undefined. */
24
- status?: string;
25
- }
26
- //# sourceMappingURL=types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/history/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,WAAW,YAAY;IAC3B,4DAA4D;IAC5D,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,kCAAkC;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,sCAAsC;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,sEAAsE;IACtE,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,kCAAkC;IAClC,YAAY,EAAE,MAAM,CAAC;IACrB,8DAA8D;IAC9D,UAAU,EAAE,MAAM,CAAC;IACnB,4EAA4E;IAC5E,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB"}
@@ -1,10 +0,0 @@
1
- /**
2
- * Unified history shape across networks. One entry per USDC transfer in or
3
- * out of the wallet.
4
- *
5
- * v1 only surfaces USDC because that's what xPay actually transacts in
6
- * (x402 is USDC-denominated). Future versions can extend `asset` to other
7
- * tokens or even non-fungible payments.
8
- */
9
- export {};
10
- //# sourceMappingURL=types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/history/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
@@ -1,41 +0,0 @@
1
- /**
2
- * Probe / verify a resource — does it actually return a valid x402 challenge?
3
- *
4
- * Read-only: it calls the endpoint WITHOUT paying, expects a 402, and validates
5
- * the payment-requirements schema (x402 v1 or v2). No wallet needed. Use it to
6
- * health-check discovered services before routing real traffic to them.
7
- */
8
- import type { PaymentRequirement, Resource } from "../types.js";
9
- export interface ProbeResult {
10
- url: string;
11
- /** True when the endpoint returned 402 with a parseable accepts[]. */
12
- ok: boolean;
13
- /** HTTP status (0 = network error / timeout). */
14
- status: number;
15
- /** Detected x402 version (1 = legacy/bare array, 2 = enveloped), if determinable. */
16
- x402Version?: number;
17
- /** Where the requirements were found: "body" or "header". */
18
- source?: "body" | "header";
19
- /** Parsed payment requirements from the 402 challenge. */
20
- accepts: PaymentRequirement[];
21
- /** Distinct networks the resource accepts. */
22
- networks: string[];
23
- /** Round-trip time in ms. */
24
- elapsedMs: number;
25
- /** Human-readable reason when `ok` is false. */
26
- error?: string;
27
- }
28
- export interface ProbeOptions {
29
- /** Override the method. Defaults to the Resource's method, or GET for a bare URL. */
30
- method?: string;
31
- /** Body to send (POST endpoints often need one to reach the 402 gate). */
32
- body?: unknown;
33
- headers?: Record<string, string>;
34
- /** Abort after this many ms (default 8000). */
35
- timeoutMs?: number;
36
- fetch?: typeof fetch;
37
- }
38
- export declare function probe(target: string | Resource, opts?: ProbeOptions): Promise<ProbeResult>;
39
- /** Probe many resources in parallel. Handy for filtering discover() output. */
40
- export declare function probeAll(targets: (string | Resource)[], opts?: ProbeOptions): Promise<ProbeResult[]>;
41
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/probe/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAGhE,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,sEAAsE;IACtE,EAAE,EAAE,OAAO,CAAC;IACZ,iDAAiD;IACjD,MAAM,EAAE,MAAM,CAAC;IACf,qFAAqF;IACrF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,6DAA6D;IAC7D,MAAM,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;IAC3B,0DAA0D;IAC1D,OAAO,EAAE,kBAAkB,EAAE,CAAC;IAC9B,8CAA8C;IAC9C,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,6BAA6B;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,gDAAgD;IAChD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,qFAAqF;IACrF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,0EAA0E;IAC1E,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,+CAA+C;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CACtB;AAED,wBAAsB,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,EAAE,IAAI,GAAE,YAAiB,GAAG,OAAO,CAAC,WAAW,CAAC,CAqEpG;AAED,+EAA+E;AAC/E,wBAAsB,QAAQ,CAC5B,OAAO,EAAE,CAAC,MAAM,GAAG,QAAQ,CAAC,EAAE,EAC9B,IAAI,GAAE,YAAiB,GACtB,OAAO,CAAC,WAAW,EAAE,CAAC,CAExB"}