@xona-labs/xpay 0.2.5 → 0.2.6

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/index.js CHANGED
@@ -22,6 +22,8 @@ import { Guardrail } from "./guardrail/index.js";
22
22
  import { signersFromProfile, deriveKeysFromMnemonic } from "./profile/index.js";
23
23
  import { fetchReport } from "./report/index.js";
24
24
  import { transfer } from "./transfer/index.js";
25
+ import { findTokens } from "./token/index.js";
26
+ import { swap, swapQuote } from "./swap/index.js";
25
27
  export * from "./types.js";
26
28
  export * from "./signers/index.js";
27
29
  export * from "./tools/index.js";
@@ -37,6 +39,8 @@ export { discover } from "./discover/index.js";
37
39
  export { fetchPayAIResources } from "./discover/payai.js";
38
40
  export { fetchOrbitX402Resources } from "./discover/orbitx402.js";
39
41
  export { fetchAgencResources, fetchAgencListing, fetchAgencTask, listingToResource, isAgencResource, AGENC_SCHEME, } from "./agenc/api.js";
42
+ export { findTokens, resolveTradeToken, AmbiguousTokenError, NATIVE_SOL_MINT, } from "./token/index.js";
43
+ export { swap as swapTokens, swapQuote as quoteSwap, } from "./swap/index.js";
40
44
  /**
41
45
  * Create an xPay client.
42
46
  *
@@ -92,6 +96,13 @@ export function createXPay(options) {
92
96
  guardrail,
93
97
  magicBlockConfig: options.profile?.config.magicblock,
94
98
  }),
99
+ findTokens: (query, opts) => findTokens(query, {
100
+ endpoint: options.profile?.config.swap?.endpoint,
101
+ apiKey: options.profile?.config.swap?.apiKey,
102
+ ...opts,
103
+ }),
104
+ swapQuote: (args) => swapQuote({ ...args, wallet, config: options.profile?.config.swap }),
105
+ swap: (args) => swap({ ...args, wallet, guardrail, config: options.profile?.config.swap }),
95
106
  };
96
107
  }
97
108
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -93,6 +93,18 @@ export interface ProfileConfig {
93
93
  /** AgenC API base override (self-hosted indexer / tests). */
94
94
  endpoint?: string;
95
95
  };
96
+ /**
97
+ * Native token-swap settings (Jupiter). Optional — swaps work keyless with
98
+ * sensible defaults.
99
+ */
100
+ swap?: {
101
+ /** Default max slippage in bps (50 = 0.5%). Unset → Jupiter dynamic slippage. */
102
+ slippageBps?: number;
103
+ /** Jupiter API key for higher rate limits. Falls back to env JUPITER_API_KEY. */
104
+ apiKey?: string;
105
+ /** Jupiter API base override. Falls back to env XPAY_JUPITER_ENDPOINT. */
106
+ endpoint?: string;
107
+ };
96
108
  /**
97
109
  * MagicBlock Private Ephemeral Rollup integration.
98
110
  * Platform-level config — set once by the xpay operator via `xpay magicblock configure`.
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/profile/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,gCAAgC;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,iEAAiE;IACjE,GAAG,EAAE,MAAM,CAAC;CACb;AAED,+CAA+C;AAC/C,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,CAAC,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,gBAAgB,CAAC;IAC5B,yEAAyE;IACzE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,+EAA+E;IAC/E,SAAS,CAAC,EAAE;QACV,MAAM,EAAE,aAAa,CAAC;QACtB,GAAG,EAAE;YAAE,IAAI,EAAE,QAAQ,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QACvE,EAAE,EAAE,MAAM,CAAC;QACX,UAAU,EAAE,MAAM,CAAC;QACnB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;CACH;AAED,+EAA+E;AAC/E,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,CAAC,CAAC;IACX,yCAAyC;IACzC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,8DAA8D;IAC9D,cAAc,EAAE,MAAM,CAAC;IACvB,6DAA6D;IAC7D,IAAI,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACvC,wEAAwE;IACxE,SAAS,CAAC,EAAE;QACV,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;QACxB,oBAAoB,CAAC,EAAE,MAAM,CAAC;KAC/B,CAAC;IACF;;;;OAIG;IACH,SAAS,CAAC,EAAE;QACV,OAAO,EAAE,OAAO,CAAC;KAClB,CAAC;IACF,gDAAgD;IAChD,IAAI,CAAC,EAAE;QACL,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IACF;;;;OAIG;IACH,IAAI,CAAC,EAAE;QACL,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IACF;;;;;;;OAOG;IACH,KAAK,CAAC,EAAE;QACN,OAAO,EAAE,OAAO,CAAC;KAClB,CAAC;IACF;;;OAGG;IACH,KAAK,CAAC,EAAE;QACN,6FAA6F;QAC7F,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,uFAAuF;QACvF,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,6DAA6D;QAC7D,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;IACF;;;;OAIG;IACH,UAAU,CAAC,EAAE;QACX,qDAAqD;QACrD,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,kDAAkD;QAClD,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,CAAC;CACH;AAED,0EAA0E;AAC1E,MAAM,WAAW,aAAa;IAC5B,sDAAsD;IACtD,IAAI,EAAE,MAAM,CAAC;IACb,8CAA8C;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,gBAAgB,CAAC;IAC5B,MAAM,EAAE,aAAa,CAAC;IACtB,oFAAoF;IACpF,QAAQ,EAAE,MAAM,CAAC;CAClB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/profile/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,gCAAgC;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,iEAAiE;IACjE,GAAG,EAAE,MAAM,CAAC;CACb;AAED,+CAA+C;AAC/C,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,CAAC,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,gBAAgB,CAAC;IAC5B,yEAAyE;IACzE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,+EAA+E;IAC/E,SAAS,CAAC,EAAE;QACV,MAAM,EAAE,aAAa,CAAC;QACtB,GAAG,EAAE;YAAE,IAAI,EAAE,QAAQ,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QACvE,EAAE,EAAE,MAAM,CAAC;QACX,UAAU,EAAE,MAAM,CAAC;QACnB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;CACH;AAED,+EAA+E;AAC/E,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,CAAC,CAAC;IACX,yCAAyC;IACzC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,8DAA8D;IAC9D,cAAc,EAAE,MAAM,CAAC;IACvB,6DAA6D;IAC7D,IAAI,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACvC,wEAAwE;IACxE,SAAS,CAAC,EAAE;QACV,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;QACxB,oBAAoB,CAAC,EAAE,MAAM,CAAC;KAC/B,CAAC;IACF;;;;OAIG;IACH,SAAS,CAAC,EAAE;QACV,OAAO,EAAE,OAAO,CAAC;KAClB,CAAC;IACF,gDAAgD;IAChD,IAAI,CAAC,EAAE;QACL,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IACF;;;;OAIG;IACH,IAAI,CAAC,EAAE;QACL,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IACF;;;;;;;OAOG;IACH,KAAK,CAAC,EAAE;QACN,OAAO,EAAE,OAAO,CAAC;KAClB,CAAC;IACF;;;OAGG;IACH,KAAK,CAAC,EAAE;QACN,6FAA6F;QAC7F,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,uFAAuF;QACvF,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,6DAA6D;QAC7D,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;IACF;;;OAGG;IACH,IAAI,CAAC,EAAE;QACL,iFAAiF;QACjF,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,iFAAiF;QACjF,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,0EAA0E;QAC1E,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;IACF;;;;OAIG;IACH,UAAU,CAAC,EAAE;QACX,qDAAqD;QACrD,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,kDAAkD;QAClD,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,CAAC;CACH;AAED,0EAA0E;AAC1E,MAAM,WAAW,aAAa;IAC5B,sDAAsD;IACtD,IAAI,EAAE,MAAM,CAAC;IACb,8CAA8C;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,gBAAgB,CAAC;IAC5B,MAAM,EAAE,aAAa,CAAC;IACtB,oFAAoF;IACpF,QAAQ,EAAE,MAAM,CAAC;CAClB"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Native Solana token swap — Jupiter Swap API v2 (order → sign → execute).
3
+ *
4
+ * Swaps happen inside the user's own xpay wallet (funds never leave it), but
5
+ * a swap is irreversible and puts wallet value at risk, so it runs through
6
+ * the same guardrail as payments and transfers — enforced *before* signing.
7
+ *
8
+ * Jupiter's meta-aggregator picks the router (metis / jupiterz / dflow /
9
+ * okx), returns an unsigned v0 transaction, and lands it via POST /execute —
10
+ * no RPC broadcast on our side.
11
+ *
12
+ * Complements the Sana-hosted `sana_swap` (API-key wallet): this path is
13
+ * keyless and uses the local wallet.
14
+ */
15
+ import type { Wallet } from "../wallet/index.js";
16
+ import type { Guardrail } from "../guardrail/index.js";
17
+ import { type TokenInfo } from "../token/index.js";
18
+ /** Swap settings — profile `config.swap`, overridable per call / via env. */
19
+ export interface SwapConfig {
20
+ /** Max slippage in bps (50 = 0.5%). Unset → Jupiter dynamic slippage. */
21
+ slippageBps?: number;
22
+ /** Jupiter API key for higher rate limits (env: JUPITER_API_KEY). */
23
+ apiKey?: string;
24
+ /** Jupiter API base override (env: XPAY_JUPITER_ENDPOINT). */
25
+ endpoint?: string;
26
+ }
27
+ export interface SwapArgs {
28
+ /** Human amount of the input token (e.g. 0.5). */
29
+ amount: number;
30
+ /** Input token: symbol (SOL, USDC, BONK, …) or mint address. */
31
+ from: string;
32
+ /** Output token: symbol or mint address. */
33
+ to: string;
34
+ slippageBps?: number;
35
+ wallet: Wallet;
36
+ guardrail: Guardrail;
37
+ config?: SwapConfig;
38
+ }
39
+ export interface SwapQuote {
40
+ from: TokenInfo;
41
+ to: TokenInfo;
42
+ /** Input in human units / atomic units. */
43
+ inAmount: number;
44
+ inAtoms: string;
45
+ /** Expected output before slippage, human / atomic. */
46
+ outAmount: number;
47
+ outAtoms: string;
48
+ /** Input-side USD value (Jupiter's estimate, else spot price fallback). */
49
+ usdValue?: number;
50
+ priceImpactPct?: number;
51
+ /** Winning router: metis, jupiterz, dflow, okx, … */
52
+ router: string;
53
+ /** Effective slippage for this order (Jupiter dynamic unless overridden). */
54
+ slippageBps?: number;
55
+ /** True when the output token is not Jupiter-verified — relay this warning. */
56
+ outputUnverified: boolean;
57
+ }
58
+ export interface SwapResult extends SwapQuote {
59
+ network: "solana";
60
+ txSig: string;
61
+ /** Actual totals from execution (include fees), human units. */
62
+ totalInAmount?: number;
63
+ totalOutAmount?: number;
64
+ }
65
+ /** Quote a swap without executing — no guardrail, no signing, no funds moved. */
66
+ export declare function swapQuote(args: Omit<SwapArgs, "guardrail">): Promise<SwapQuote>;
67
+ /** Execute a swap inside the wallet. Guardrail runs before signing. */
68
+ export declare function swap(args: SwapArgs): Promise<SwapResult>;
69
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/swap/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAKL,KAAK,SAAS,EACf,MAAM,mBAAmB,CAAC;AAK3B,6EAA6E;AAC7E,MAAM,WAAW,UAAU;IACzB,yEAAyE;IACzE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qEAAqE;IACrE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,QAAQ;IACvB,kDAAkD;IAClD,MAAM,EAAE,MAAM,CAAC;IACf,gEAAgE;IAChE,IAAI,EAAE,MAAM,CAAC;IACb,4CAA4C;IAC5C,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,SAAS,CAAC;IACrB,MAAM,CAAC,EAAE,UAAU,CAAC;CACrB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,SAAS,CAAC;IAChB,EAAE,EAAE,SAAS,CAAC;IACd,2CAA2C;IAC3C,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,uDAAuD;IACvD,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,qDAAqD;IACrD,MAAM,EAAE,MAAM,CAAC;IACf,6EAA6E;IAC7E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+EAA+E;IAC/E,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,UAAW,SAAQ,SAAS;IAC3C,OAAO,EAAE,QAAQ,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,gEAAgE;IAChE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,iFAAiF;AACjF,wBAAsB,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,CAGrF;AAED,uEAAuE;AACvE,wBAAsB,IAAI,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,CA4D9D"}
@@ -0,0 +1,171 @@
1
+ /**
2
+ * Native Solana token swap — Jupiter Swap API v2 (order → sign → execute).
3
+ *
4
+ * Swaps happen inside the user's own xpay wallet (funds never leave it), but
5
+ * a swap is irreversible and puts wallet value at risk, so it runs through
6
+ * the same guardrail as payments and transfers — enforced *before* signing.
7
+ *
8
+ * Jupiter's meta-aggregator picks the router (metis / jupiterz / dflow /
9
+ * okx), returns an unsigned v0 transaction, and lands it via POST /execute —
10
+ * no RPC broadcast on our side.
11
+ *
12
+ * Complements the Sana-hosted `sana_swap` (API-key wallet): this path is
13
+ * keyless and uses the local wallet.
14
+ */
15
+ import { PublicKey, VersionedTransaction } from "@solana/web3.js";
16
+ import { jupiterFetch, resolveTradeToken, NATIVE_SOL_MINT, } from "../token/index.js";
17
+ import { solUsdPrice } from "../agenc/price.js";
18
+ const DEFAULT_ENDPOINT = "https://api.jup.ag";
19
+ /** Quote a swap without executing — no guardrail, no signing, no funds moved. */
20
+ export async function swapQuote(args) {
21
+ const prepared = await prepare(args);
22
+ return prepared.quote;
23
+ }
24
+ /** Execute a swap inside the wallet. Guardrail runs before signing. */
25
+ export async function swap(args) {
26
+ // A quote's transaction embeds a recent blockhash, so always build a fresh
27
+ // order here rather than reusing one from an earlier swapQuote() display.
28
+ const { quote, order, signer, apiOpts } = await prepare(args);
29
+ // Guardrail *before* signing — same security boundary as pay/transfer.
30
+ const requirement = {
31
+ asset: quote.from.mint,
32
+ payTo: quote.to.mint,
33
+ amount: quote.inAtoms,
34
+ scheme: "swap",
35
+ network: "solana",
36
+ extra: {
37
+ usdEstimate: quote.usdValue,
38
+ fromSymbol: quote.from.symbol,
39
+ toSymbol: quote.to.symbol,
40
+ },
41
+ };
42
+ const resource = {
43
+ resource: `xpay://swap/${quote.from.symbol}-${quote.to.symbol}`,
44
+ type: "swap",
45
+ method: "POST",
46
+ accepts: [requirement],
47
+ };
48
+ await args.guardrail.check({ resource, requirement });
49
+ // Partial-sign the v0 transaction. The signer never exposes its Keypair —
50
+ // sign the serialized message and attach the signature (same pattern as
51
+ // the native-SOL transfer). Do NOT use tx.sign(): it needs a Keypair, and
52
+ // JupiterZ orders may get a market-maker co-signature at /execute, so only
53
+ // our own signature may be added here.
54
+ const tx = VersionedTransaction.deserialize(Buffer.from(order.transaction, "base64"));
55
+ const msgBytes = tx.message.serialize();
56
+ const sig = await signer.signMessage(msgBytes);
57
+ tx.addSignature(new PublicKey(signer.address), sig);
58
+ const signedTransaction = Buffer.from(tx.serialize()).toString("base64");
59
+ const endpoint = apiOpts.endpoint ?? DEFAULT_ENDPOINT;
60
+ const exec = (await jupiterFetch(new URL("/swap/v2/execute", endpoint).toString(), apiOpts.apiKey, {
61
+ method: "POST",
62
+ headers: { "content-type": "application/json" },
63
+ body: JSON.stringify({ signedTransaction, requestId: order.requestId }),
64
+ }));
65
+ if (exec.status !== "Success") {
66
+ const landed = exec.signature
67
+ ? ` The transaction may have landed and reverted — check https://solscan.io/tx/${exec.signature}`
68
+ : "";
69
+ throw new Error(`xpay.swap: execution failed (code ${exec.code ?? "?"}) — ${exec.error ?? "unknown error"}.${landed}`);
70
+ }
71
+ return {
72
+ ...quote,
73
+ network: "solana",
74
+ txSig: exec.signature ?? "",
75
+ totalInAmount: atomsToHuman(exec.totalInputAmount, quote.from.decimals),
76
+ totalOutAmount: atomsToHuman(exec.totalOutputAmount, quote.to.decimals),
77
+ };
78
+ }
79
+ async function prepare(args) {
80
+ if (!Number.isFinite(args.amount) || args.amount <= 0) {
81
+ throw new Error("xpay.swap: amount must be a positive number");
82
+ }
83
+ if (!args.wallet.has("solana")) {
84
+ throw new Error("xpay.swap: swaps are Solana-only — no Solana signer is configured");
85
+ }
86
+ const signer = args.wallet.signer("solana");
87
+ const apiOpts = {
88
+ endpoint: args.config?.endpoint,
89
+ apiKey: args.config?.apiKey,
90
+ };
91
+ const [from, to] = await Promise.all([
92
+ resolveTradeToken(args.from, apiOpts),
93
+ resolveTradeToken(args.to, apiOpts),
94
+ ]);
95
+ if (from.mint === to.mint) {
96
+ throw new Error(`xpay.swap: input and output are the same token (${from.symbol})`);
97
+ }
98
+ const inAtoms = BigInt(Math.round(args.amount * 10 ** from.decimals));
99
+ if (inAtoms === 0n) {
100
+ throw new Error(`xpay.swap: ${args.amount} ${from.symbol} is below the token's smallest unit (${from.decimals} decimals)`);
101
+ }
102
+ const endpoint = apiOpts.endpoint ?? process.env.XPAY_JUPITER_ENDPOINT ?? DEFAULT_ENDPOINT;
103
+ const apiKey = apiOpts.apiKey ?? process.env.JUPITER_API_KEY;
104
+ const slippageBps = args.slippageBps ?? args.config?.slippageBps;
105
+ const url = new URL("/swap/v2/order", endpoint);
106
+ url.searchParams.set("inputMint", from.mint);
107
+ url.searchParams.set("outputMint", to.mint);
108
+ url.searchParams.set("amount", inAtoms.toString());
109
+ url.searchParams.set("taker", signer.address);
110
+ if (slippageBps !== undefined)
111
+ url.searchParams.set("slippageBps", String(slippageBps));
112
+ const order = (await jupiterFetch(url.toString(), apiKey));
113
+ if (!order.transaction) {
114
+ // Verified failure shapes: errorCode 1 = wallet lacks the input amount;
115
+ // 2 = wallet lacks SOL for fees; 3 = wallet lacked SOL so Jupiter tried
116
+ // the gasless route, which has a ~$5 minimum. A top-level `error` with no
117
+ // code ("Failed to get quotes") notably happens when slippageBps is set
118
+ // on the keyless tier — dynamic slippage (omitting it) works.
119
+ let reason;
120
+ if (order.errorCode === 1) {
121
+ reason = `insufficient ${from.symbol} balance in the wallet`;
122
+ }
123
+ else if (order.errorCode === 2) {
124
+ reason = "insufficient SOL to cover network fees/rent";
125
+ }
126
+ else if (order.errorCode === 3) {
127
+ reason =
128
+ "swap is below the gasless route's ~$5 minimum. Jupiter routes gasless when the " +
129
+ "wallet lacks SOL for fees — fund the wallet with SOL, or swap a larger amount";
130
+ }
131
+ else if (order.error && slippageBps !== undefined) {
132
+ reason = `${order.error} — try again without an explicit slippage (Jupiter picks dynamic slippage)`;
133
+ }
134
+ else {
135
+ reason = order.errorMessage ?? order.error ?? "Jupiter could not build a swap transaction";
136
+ }
137
+ throw new Error(`xpay.swap: ${reason} (router ${order.router ?? "?"}, code ${order.errorCode ?? "?"})`);
138
+ }
139
+ // Input-side USD: Jupiter's own estimate, else token spot, else SOL feed.
140
+ let usdValue = numOrUndef(order.inUsdValue);
141
+ if (usdValue === undefined && from.usdPrice !== undefined)
142
+ usdValue = from.usdPrice * args.amount;
143
+ if (usdValue === undefined && from.mint === NATIVE_SOL_MINT) {
144
+ usdValue = await solUsdPrice().then((p) => p * args.amount).catch(() => undefined);
145
+ }
146
+ const outAtoms = order.outAmount ?? "0";
147
+ const quote = {
148
+ from,
149
+ to,
150
+ inAmount: args.amount,
151
+ inAtoms: inAtoms.toString(),
152
+ outAmount: atomsToHuman(outAtoms, to.decimals) ?? 0,
153
+ outAtoms,
154
+ usdValue,
155
+ priceImpactPct: numOrUndef(Number(order.priceImpactPct)),
156
+ router: order.router ?? "unknown",
157
+ slippageBps: order.slippageBps ?? slippageBps,
158
+ outputUnverified: !to.verified,
159
+ };
160
+ return { quote, order: order, signer, apiOpts: { endpoint, apiKey } };
161
+ }
162
+ function atomsToHuman(atoms, decimals) {
163
+ if (atoms === undefined)
164
+ return undefined;
165
+ const n = Number(atoms);
166
+ return Number.isFinite(n) ? n / 10 ** decimals : undefined;
167
+ }
168
+ function numOrUndef(v) {
169
+ return typeof v === "number" && Number.isFinite(v) ? v : undefined;
170
+ }
171
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/swap/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Solana token discovery — Jupiter Token API v2.
3
+ *
4
+ * Keyless read-only search by ticker, name, or mint address. Returns live
5
+ * market data (price, mcap, liquidity) plus Jupiter's verification flag —
6
+ * the main scam signal agents must check before swapping (anyone can mint a
7
+ * token reusing a real project's ticker).
8
+ */
9
+ /** Wrapped-SOL mint — Jupiter's sentinel for native SOL (wraps/unwraps automatically). */
10
+ export declare const NATIVE_SOL_MINT = "So11111111111111111111111111111111111111112";
11
+ export interface TokenInfo {
12
+ mint: string;
13
+ symbol: string;
14
+ name: string;
15
+ decimals: number;
16
+ /** Jupiter verification — unverified tokens can be scams reusing a real ticker. */
17
+ verified: boolean;
18
+ usdPrice?: number;
19
+ mcap?: number;
20
+ fdv?: number;
21
+ liquidity?: number;
22
+ holderCount?: number;
23
+ organicScore?: number;
24
+ tokenProgram?: string;
25
+ icon?: string;
26
+ }
27
+ export interface TokenApiOptions {
28
+ /** Jupiter API base. Default https://api.jup.ag (env: XPAY_JUPITER_ENDPOINT). */
29
+ endpoint?: string;
30
+ /** Optional Jupiter API key for higher rate limits (env: JUPITER_API_KEY). */
31
+ apiKey?: string;
32
+ }
33
+ /** Thrown when a bare ticker matches several plausible tokens — retry with the exact mint. */
34
+ export declare class AmbiguousTokenError extends Error {
35
+ readonly candidates: TokenInfo[];
36
+ constructor(input: string, candidates: TokenInfo[]);
37
+ }
38
+ /**
39
+ * Search tokens by ticker, name, or mint. Ranked verified-first, then by
40
+ * liquidity. Read-only — no wallet, no signing.
41
+ */
42
+ export declare function findTokens(query: string, opts?: TokenApiOptions & {
43
+ limit?: number;
44
+ }): Promise<TokenInfo[]>;
45
+ /**
46
+ * Deterministic single-token resolution for trading. Accepts a symbol or a
47
+ * mint address; never silently picks between plausible candidates — throws
48
+ * {@link AmbiguousTokenError} instead so the caller can pass the exact mint.
49
+ */
50
+ export declare function resolveTradeToken(input: string, opts?: TokenApiOptions): Promise<TokenInfo>;
51
+ /** GET with a 10s timeout and backoff retries on 429 (keyless bucket is small). */
52
+ export declare function jupiterFetch(url: string, apiKey?: string, init?: RequestInit): Promise<unknown>;
53
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/token/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAQH,0FAA0F;AAC1F,eAAO,MAAM,eAAe,gDAAgD,CAAC;AAE7E,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,mFAAmF;IACnF,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,iFAAiF;IACjF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,8EAA8E;IAC9E,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,8FAA8F;AAC9F,qBAAa,mBAAoB,SAAQ,KAAK;IAC5C,QAAQ,CAAC,UAAU,EAAE,SAAS,EAAE,CAAC;gBACrB,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE;CAUnD;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,KAAK,EAAE,MAAM,EACb,IAAI,GAAE,eAAe,GAAG;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GAC9C,OAAO,CAAC,SAAS,EAAE,CAAC,CAetB;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE,eAAoB,GAAG,OAAO,CAAC,SAAS,CAAC,CAoDrG;AAiDD,mFAAmF;AACnF,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CA2BrG"}
@@ -0,0 +1,168 @@
1
+ /**
2
+ * Solana token discovery — Jupiter Token API v2.
3
+ *
4
+ * Keyless read-only search by ticker, name, or mint address. Returns live
5
+ * market data (price, mcap, liquidity) plus Jupiter's verification flag —
6
+ * the main scam signal agents must check before swapping (anyone can mint a
7
+ * token reusing a real project's ticker).
8
+ */
9
+ import { Connection, PublicKey } from "@solana/web3.js";
10
+ import { getMint } from "@solana/spl-token";
11
+ import { SOLANA_TOKENS } from "../transfer/index.js";
12
+ const DEFAULT_ENDPOINT = "https://api.jup.ag";
13
+ /** Wrapped-SOL mint — Jupiter's sentinel for native SOL (wraps/unwraps automatically). */
14
+ export const NATIVE_SOL_MINT = "So11111111111111111111111111111111111111112";
15
+ /** Thrown when a bare ticker matches several plausible tokens — retry with the exact mint. */
16
+ export class AmbiguousTokenError extends Error {
17
+ candidates;
18
+ constructor(input, candidates) {
19
+ const list = candidates
20
+ .map((c) => ` ${c.symbol} (${c.name}) mint ${c.mint}${c.verified ? " [verified]" : " [UNVERIFIED]"} liquidity $${Math.round(c.liquidity ?? 0).toLocaleString()}`)
21
+ .join("\n");
22
+ super(`Token "${input}" is ambiguous — pass the exact mint address of the one you mean:\n${list}`);
23
+ this.name = "AmbiguousTokenError";
24
+ this.candidates = candidates;
25
+ }
26
+ }
27
+ /**
28
+ * Search tokens by ticker, name, or mint. Ranked verified-first, then by
29
+ * liquidity. Read-only — no wallet, no signing.
30
+ */
31
+ export async function findTokens(query, opts = {}) {
32
+ const raw = await searchJupiter(query, opts);
33
+ const limit = opts.limit ?? 10;
34
+ const seen = new Set();
35
+ const ranked = raw
36
+ .filter((t) => (seen.has(t.mint) ? false : (seen.add(t.mint), true)))
37
+ .sort((a, b) => {
38
+ if (a.verified !== b.verified)
39
+ return a.verified ? -1 : 1;
40
+ const liq = (b.liquidity ?? 0) - (a.liquidity ?? 0);
41
+ if (liq !== 0)
42
+ return liq;
43
+ return (b.organicScore ?? 0) - (a.organicScore ?? 0);
44
+ });
45
+ return ranked.slice(0, limit);
46
+ }
47
+ /**
48
+ * Deterministic single-token resolution for trading. Accepts a symbol or a
49
+ * mint address; never silently picks between plausible candidates — throws
50
+ * {@link AmbiguousTokenError} instead so the caller can pass the exact mint.
51
+ */
52
+ export async function resolveTradeToken(input, opts = {}) {
53
+ const key = input.toUpperCase().replace(/[-\s]/g, "");
54
+ // Native SOL / wSOL → Jupiter's wrapped-SOL sentinel, displayed as SOL.
55
+ if (key === "SOL" || key === "WSOL") {
56
+ const [info] = await searchJupiter(NATIVE_SOL_MINT, opts);
57
+ return { ...(info ?? fallbackToken(NATIVE_SOL_MINT, 9)), symbol: "SOL", verified: true };
58
+ }
59
+ // Well-known symbols pin to a canonical mint (avoids the ~20 lookalike
60
+ // "BONK"s Jupiter returns) — then still fetch live data by that mint.
61
+ const pinned = SOLANA_TOKENS[key] ?? Object.values(SOLANA_TOKENS).find((t) => t.symbol.toUpperCase() === key);
62
+ if (pinned) {
63
+ const [info] = await searchJupiter(pinned.mint, opts);
64
+ return info ?? { ...fallbackToken(pinned.mint, pinned.decimals), symbol: pinned.symbol, verified: true };
65
+ }
66
+ // Mint-shaped input → exact lookup; fall back to on-chain decimals for
67
+ // tokens Jupiter has never indexed.
68
+ if (/^[1-9A-HJ-NP-Za-km-z]{32,44}$/.test(input)) {
69
+ const matches = await searchJupiter(input, opts);
70
+ const exact = matches.find((t) => t.mint === input);
71
+ if (exact)
72
+ return exact;
73
+ return onChainToken(input);
74
+ }
75
+ // Unknown ticker → search; only exact-symbol, verified matches are eligible.
76
+ const results = await searchJupiter(input, opts);
77
+ const symbolMatches = results.filter((t) => t.symbol.toUpperCase() === key);
78
+ const verified = symbolMatches.filter((t) => t.verified);
79
+ if (verified.length === 1)
80
+ return verified[0];
81
+ if (verified.length > 1) {
82
+ // Auto-pick only when the leader dwarfs the runner-up in liquidity.
83
+ const sorted = [...verified].sort((a, b) => (b.liquidity ?? 0) - (a.liquidity ?? 0));
84
+ if ((sorted[0].liquidity ?? 0) >= 5 * (sorted[1].liquidity ?? 0) && (sorted[0].liquidity ?? 0) > 0) {
85
+ return sorted[0];
86
+ }
87
+ throw new AmbiguousTokenError(input, sorted.slice(0, 5));
88
+ }
89
+ if (symbolMatches.length > 0) {
90
+ // Only unverified candidates — never auto-trade those by ticker.
91
+ throw new AmbiguousTokenError(input, symbolMatches.sort((a, b) => (b.liquidity ?? 0) - (a.liquidity ?? 0)).slice(0, 5));
92
+ }
93
+ throw new Error(`Unknown token "${input}" — no exact ticker match on Jupiter. ` +
94
+ `Try \`xpay token find ${input}\` to search, or pass the mint address directly.`);
95
+ }
96
+ async function searchJupiter(query, opts) {
97
+ const endpoint = opts.endpoint ?? process.env.XPAY_JUPITER_ENDPOINT ?? DEFAULT_ENDPOINT;
98
+ const apiKey = opts.apiKey ?? process.env.JUPITER_API_KEY;
99
+ const url = new URL("/tokens/v2/search", endpoint);
100
+ url.searchParams.set("query", query);
101
+ const body = (await jupiterFetch(url.toString(), apiKey));
102
+ if (!Array.isArray(body))
103
+ return [];
104
+ return body
105
+ .filter((t) => t && typeof t.id === "string")
106
+ .map((t) => ({
107
+ mint: t.id,
108
+ symbol: t.symbol ?? t.id.slice(0, 6) + "…",
109
+ name: t.name ?? "",
110
+ decimals: t.decimals ?? 0,
111
+ verified: t.isVerified ?? false,
112
+ usdPrice: numOrUndef(t.usdPrice),
113
+ mcap: numOrUndef(t.mcap),
114
+ fdv: numOrUndef(t.fdv),
115
+ liquidity: numOrUndef(t.liquidity),
116
+ holderCount: numOrUndef(t.holderCount),
117
+ organicScore: numOrUndef(t.organicScore),
118
+ tokenProgram: t.tokenProgram,
119
+ icon: t.icon,
120
+ }));
121
+ }
122
+ /** GET with a 10s timeout and backoff retries on 429 (keyless bucket is small). */
123
+ export async function jupiterFetch(url, apiKey, init) {
124
+ const headers = {
125
+ accept: "application/json",
126
+ ...init?.headers,
127
+ };
128
+ if (apiKey)
129
+ headers["x-api-key"] = apiKey;
130
+ const MAX_RETRIES = 2;
131
+ for (let attempt = 0;; attempt++) {
132
+ const res = await fetch(url, { ...init, headers, signal: AbortSignal.timeout(10_000) });
133
+ if (res.status === 429 && attempt < MAX_RETRIES) {
134
+ await new Promise((r) => setTimeout(r, 1_500 * 2 ** attempt));
135
+ continue;
136
+ }
137
+ if (!res.ok) {
138
+ let reason = "";
139
+ try {
140
+ const body = (await res.json());
141
+ reason = body?.error ?? body?.errorMessage ?? "";
142
+ }
143
+ catch { /* no body */ }
144
+ throw new Error(`Jupiter API ${res.status} ${res.statusText}${reason ? ` — ${reason}` : ""}` +
145
+ (res.status === 429 ? " (rate-limited; set JUPITER_API_KEY for higher limits)" : ""));
146
+ }
147
+ return res.json();
148
+ }
149
+ }
150
+ function numOrUndef(v) {
151
+ return typeof v === "number" && Number.isFinite(v) ? v : undefined;
152
+ }
153
+ function fallbackToken(mint, decimals) {
154
+ return { mint, symbol: mint.slice(0, 6) + "…", name: "", decimals, verified: false };
155
+ }
156
+ /** Last resort for mints Jupiter has never indexed — decimals from chain, no price. */
157
+ async function onChainToken(mint) {
158
+ const rpc = process.env.XPAY_SOLANA_RPC ?? "https://solana-mainnet.g.alchemy.com/v2/Ug5mqBVIbSHoa8ZHgTUSJ";
159
+ try {
160
+ const conn = new Connection(rpc, "confirmed");
161
+ const info = await getMint(conn, new PublicKey(mint));
162
+ return fallbackToken(mint, info.decimals);
163
+ }
164
+ catch {
165
+ throw new Error(`Token mint ${mint} not found on Jupiter or on-chain — check the address.`);
166
+ }
167
+ }
168
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/token/index.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAKxC,MAAM,WAAW,UAAU,CAAC,IAAI;IAC9B,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;CAChF;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACvC;AAED,MAAM,WAAW,WAAW;IAC1B,kFAAkF;IAClF,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,yCAAyC;AACzC,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,GAAE,WAAgB,GAAG,UAAU,CAAC,aAAa,CAAC,CA0OvF;AAED,gFAAgF;AAChF,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI;;;;;;;;;qCA5PD,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC;EAyQ9E;AAED,sDAAsD;AACtD,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI;;;;;;;;qCA5QD,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC;EA0R9E"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAKxC,MAAM,WAAW,UAAU,CAAC,IAAI;IAC9B,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;CAChF;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACvC;AAED,MAAM,WAAW,WAAW;IAC1B,kFAAkF;IAClF,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,yCAAyC;AACzC,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,GAAE,WAAgB,GAAG,UAAU,CAAC,aAAa,CAAC,CA4RvF;AAED,gFAAgF;AAChF,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI;;;;;;;;;qCA9SD,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC;EA2T9E;AAED,sDAAsD;AACtD,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI;;;;;;;;qCA9TD,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC;EA4U9E"}