@leashmarket/core 0.1.0

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 (106) hide show
  1. package/README.md +32 -0
  2. package/dist/agent/agent.d.ts +8 -0
  3. package/dist/agent/agent.d.ts.map +1 -0
  4. package/dist/agent/agent.js +14 -0
  5. package/dist/agent/agent.js.map +1 -0
  6. package/dist/agent/treasury-pda.d.ts +49 -0
  7. package/dist/agent/treasury-pda.d.ts.map +1 -0
  8. package/dist/agent/treasury-pda.js +55 -0
  9. package/dist/agent/treasury-pda.js.map +1 -0
  10. package/dist/explorer/index.d.ts +55 -0
  11. package/dist/explorer/index.d.ts.map +1 -0
  12. package/dist/explorer/index.js +95 -0
  13. package/dist/explorer/index.js.map +1 -0
  14. package/dist/fees/leash-fee.d.ts +248 -0
  15. package/dist/fees/leash-fee.d.ts.map +1 -0
  16. package/dist/fees/leash-fee.js +246 -0
  17. package/dist/fees/leash-fee.js.map +1 -0
  18. package/dist/format/index.d.ts +55 -0
  19. package/dist/format/index.d.ts.map +1 -0
  20. package/dist/format/index.js +130 -0
  21. package/dist/format/index.js.map +1 -0
  22. package/dist/index.d.ts +25 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +25 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/policy/evaluate.d.ts +17 -0
  27. package/dist/policy/evaluate.d.ts.map +1 -0
  28. package/dist/policy/evaluate.js +46 -0
  29. package/dist/policy/evaluate.js.map +1 -0
  30. package/dist/policy/state.d.ts +8 -0
  31. package/dist/policy/state.d.ts.map +1 -0
  32. package/dist/policy/state.js +2 -0
  33. package/dist/policy/state.js.map +1 -0
  34. package/dist/receipt/build.d.ts +5 -0
  35. package/dist/receipt/build.d.ts.map +1 -0
  36. package/dist/receipt/build.js +9 -0
  37. package/dist/receipt/build.js.map +1 -0
  38. package/dist/receipt/hash.d.ts +15 -0
  39. package/dist/receipt/hash.d.ts.map +1 -0
  40. package/dist/receipt/hash.js +40 -0
  41. package/dist/receipt/hash.js.map +1 -0
  42. package/dist/receipt/verify.d.ts +10 -0
  43. package/dist/receipt/verify.d.ts.map +1 -0
  44. package/dist/receipt/verify.js +36 -0
  45. package/dist/receipt/verify.js.map +1 -0
  46. package/dist/tokens/index.d.ts +86 -0
  47. package/dist/tokens/index.d.ts.map +1 -0
  48. package/dist/tokens/index.js +163 -0
  49. package/dist/tokens/index.js.map +1 -0
  50. package/dist/treasury/balance.d.ts +3 -0
  51. package/dist/treasury/balance.d.ts.map +1 -0
  52. package/dist/treasury/balance.js +13 -0
  53. package/dist/treasury/balance.js.map +1 -0
  54. package/dist/treasury/inspect-token-account.d.ts +46 -0
  55. package/dist/treasury/inspect-token-account.d.ts.map +1 -0
  56. package/dist/treasury/inspect-token-account.js +67 -0
  57. package/dist/treasury/inspect-token-account.js.map +1 -0
  58. package/dist/treasury/list-balances.d.ts +57 -0
  59. package/dist/treasury/list-balances.d.ts.map +1 -0
  60. package/dist/treasury/list-balances.js +115 -0
  61. package/dist/treasury/list-balances.js.map +1 -0
  62. package/dist/treasury/pause.d.ts +32 -0
  63. package/dist/treasury/pause.d.ts.map +1 -0
  64. package/dist/treasury/pause.js +40 -0
  65. package/dist/treasury/pause.js.map +1 -0
  66. package/dist/treasury/withdraw.d.ts +13 -0
  67. package/dist/treasury/withdraw.d.ts.map +1 -0
  68. package/dist/treasury/withdraw.js +4 -0
  69. package/dist/treasury/withdraw.js.map +1 -0
  70. package/dist/wallet/index.d.ts +3 -0
  71. package/dist/wallet/index.d.ts.map +1 -0
  72. package/dist/wallet/index.js +2 -0
  73. package/dist/wallet/index.js.map +1 -0
  74. package/dist/x402/client.d.ts +72 -0
  75. package/dist/x402/client.d.ts.map +1 -0
  76. package/dist/x402/client.js +94 -0
  77. package/dist/x402/client.js.map +1 -0
  78. package/dist/x402/delegate-scheme.d.ts +107 -0
  79. package/dist/x402/delegate-scheme.d.ts.map +1 -0
  80. package/dist/x402/delegate-scheme.js +268 -0
  81. package/dist/x402/delegate-scheme.js.map +1 -0
  82. package/dist/x402/discovery.d.ts +110 -0
  83. package/dist/x402/discovery.d.ts.map +1 -0
  84. package/dist/x402/discovery.js +213 -0
  85. package/dist/x402/discovery.js.map +1 -0
  86. package/dist/x402/envelope.d.ts +65 -0
  87. package/dist/x402/envelope.d.ts.map +1 -0
  88. package/dist/x402/envelope.js +67 -0
  89. package/dist/x402/envelope.js.map +1 -0
  90. package/dist/x402/facilitator.d.ts +45 -0
  91. package/dist/x402/facilitator.d.ts.map +1 -0
  92. package/dist/x402/facilitator.js +61 -0
  93. package/dist/x402/facilitator.js.map +1 -0
  94. package/dist/x402/headers.d.ts +51 -0
  95. package/dist/x402/headers.d.ts.map +1 -0
  96. package/dist/x402/headers.js +84 -0
  97. package/dist/x402/headers.js.map +1 -0
  98. package/dist/x402/parse.d.ts +20 -0
  99. package/dist/x402/parse.d.ts.map +1 -0
  100. package/dist/x402/parse.js +31 -0
  101. package/dist/x402/parse.js.map +1 -0
  102. package/dist/x402/webhook.d.ts +48 -0
  103. package/dist/x402/webhook.d.ts.map +1 -0
  104. package/dist/x402/webhook.js +88 -0
  105. package/dist/x402/webhook.js.map +1 -0
  106. package/package.json +46 -0
@@ -0,0 +1,268 @@
1
+ /**
2
+ * x402 SVM payment scheme variants used by Leash buyers. Both schemes
3
+ * are wire-compatible with the upstream `@x402/svm` Exact scheme but
4
+ * append the **Leash protocol fee leg** when the seller's
5
+ * `paymentRequirements.extra['leash.fee']` block is present.
6
+ *
7
+ * Two variants are exported:
8
+ *
9
+ * - {@link LeashExactSvmScheme} — the buyer signs as the **owner** of
10
+ * the source ATA. Drop-in replacement for the vanilla
11
+ * `@x402/svm` `ExactSvmScheme`; the only difference is the optional
12
+ * fee leg.
13
+ *
14
+ * - {@link LeashDelegateExactSvmScheme} — the source ATA is provided
15
+ * externally (e.g. an agent treasury PDA's USDC ATA) and the buyer
16
+ * signs as the **SPL delegate** of that account. Used by Leash
17
+ * agents whose Privy embedded wallet is the delegate of a treasury
18
+ * it doesn't own.
19
+ *
20
+ * Transaction shape (with fee leg + auto-provisioning of destination ATAs):
21
+ *
22
+ * ix[0] SetComputeUnitLimit
23
+ * ix[1] SetComputeUnitPrice
24
+ * ix[2] CreateAssociatedTokenAccountIdempotent (seller `payTo` ATA; payer = facilitator)
25
+ * ix[3] CreateAssociatedTokenAccountIdempotent (fee vault ATA; payer = facilitator)
26
+ * ix[4] TransferChecked (seller leg, amount = paymentRequirements.amount)
27
+ * ix[5] TransferChecked (fee leg, amount = extra['leash.fee'].feeAtomic)
28
+ * ix[6] Memo
29
+ *
30
+ * Idempotent creates are always emitted so first-time settlements on a
31
+ * fresh mint (e.g. devnet USDG) succeed without an out-of-band ATA-init.
32
+ * The facilitator skips any leading idempotent ATA creates whose target
33
+ * matches the seller-`payTo` or fee-vault ATA.
34
+ *
35
+ * When `extra['leash.fee']` is absent (vanilla x402 seller, no Leash
36
+ * facilitator), the fee leg is skipped and the transaction degrades to
37
+ * the upstream 4-instruction shape: `[setLimit, setPrice, transfer, memo]`.
38
+ *
39
+ * Both legs share the same authority + source ATA, so a single signature
40
+ * covers both. Atomicity is guaranteed by Solana's all-or-nothing
41
+ * transaction semantics — either the seller AND treasury get paid, or
42
+ * neither does.
43
+ */
44
+ import { address as toAddress } from '@solana/kit';
45
+ import { appendTransactionMessageInstructions, createTransactionMessage, getBase64EncodedWireTransaction, partiallySignTransactionMessageWithSigners, pipe, prependTransactionMessageInstruction, setTransactionMessageFeePayer, setTransactionMessageLifetimeUsingBlockhash, } from '@solana/kit';
46
+ import { getSetComputeUnitLimitInstruction, setTransactionMessageComputeUnitPrice, } from '@solana-program/compute-budget';
47
+ import { fetchMint, findAssociatedTokenPda, getCreateAssociatedTokenIdempotentInstruction, getTransferCheckedInstruction, TOKEN_2022_PROGRAM_ADDRESS, } from '@solana-program/token-2022';
48
+ import { TOKEN_PROGRAM_ADDRESS } from '@solana-program/token';
49
+ import { createRpcClient, MAX_MEMO_BYTES, MEMO_PROGRAM_ADDRESS } from '@x402/svm';
50
+ import { computeLeashFeeForRequirements, parseLeashFeeExtra } from '../fees/leash-fee.js';
51
+ /** Map x402 `paymentRequirements.network` (CAIP-2) to fee-module network. */
52
+ function tokenNetworkFromPaymentNetwork(network) {
53
+ const lower = network.toLowerCase();
54
+ if (lower === 'solana-mainnet' || lower.startsWith('solana:5eykt4u'))
55
+ return 'mainnet';
56
+ return 'devnet';
57
+ }
58
+ const DEFAULT_COMPUTE_UNIT_LIMIT = 200_000;
59
+ const DEFAULT_COMPUTE_UNIT_PRICE_MICROLAMPORTS = 10_000;
60
+ /**
61
+ * SVM client implementation of the x402 "exact" scheme that signs as a
62
+ * **delegate** of an externally owned source ATA. Wire-compatible with
63
+ * the vanilla `ExactSvmScheme` plus the Leash protocol fee leg.
64
+ *
65
+ * @example
66
+ * ```ts
67
+ * import { x402Client } from '@x402/core/client';
68
+ * import { LeashDelegateExactSvmScheme } from '@leashmarket/core';
69
+ *
70
+ * const client = new x402Client();
71
+ * client.register('solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1XkXr8aBmpfk5', new LeashDelegateExactSvmScheme({
72
+ * signer: privySigner,
73
+ * sourceTokenAccount: agentUsdcAta,
74
+ * }));
75
+ * ```
76
+ */
77
+ export class LeashDelegateExactSvmScheme {
78
+ scheme = 'exact';
79
+ signer;
80
+ sourceTokenAccount;
81
+ rpcUrl;
82
+ constructor(options) {
83
+ this.signer = options.signer;
84
+ this.sourceTokenAccount =
85
+ typeof options.sourceTokenAccount === 'string'
86
+ ? toAddress(options.sourceTokenAccount)
87
+ : options.sourceTokenAccount;
88
+ this.rpcUrl = options.rpcUrl;
89
+ }
90
+ async createPaymentPayload(x402Version, paymentRequirements) {
91
+ return buildLeashPaymentPayload({
92
+ x402Version,
93
+ paymentRequirements,
94
+ signer: this.signer,
95
+ sourceTokenAccount: this.sourceTokenAccount,
96
+ ...(this.rpcUrl ? { rpcUrl: this.rpcUrl } : {}),
97
+ });
98
+ }
99
+ }
100
+ /**
101
+ * SVM client implementation of the x402 "exact" scheme where the buyer
102
+ * signs as the **owner** of the source ATA (i.e. their own wallet).
103
+ * Replaces the upstream `@x402/svm` `ExactSvmScheme` for Leash buyers
104
+ * who want the Leash protocol fee leg appended whenever the seller
105
+ * advertises one.
106
+ *
107
+ * Falls back to the upstream wire shape when no fee block is present,
108
+ * so this scheme can be used unconditionally — calling code does not
109
+ * need to branch based on the seller's facilitator.
110
+ */
111
+ export class LeashExactSvmScheme {
112
+ scheme = 'exact';
113
+ signer;
114
+ rpcUrl;
115
+ constructor(options) {
116
+ this.signer = options.signer;
117
+ this.rpcUrl = options.rpcUrl;
118
+ }
119
+ async createPaymentPayload(x402Version, paymentRequirements) {
120
+ return buildLeashPaymentPayload({
121
+ x402Version,
122
+ paymentRequirements,
123
+ signer: this.signer,
124
+ sourceTokenAccount: null, // derive from signer.address
125
+ ...(this.rpcUrl ? { rpcUrl: this.rpcUrl } : {}),
126
+ });
127
+ }
128
+ }
129
+ /**
130
+ * Shared payload builder used by both Leash schemes. Walks the seller's
131
+ * `paymentRequirements`, fetches the mint to learn its token program +
132
+ * decimals, builds the seller `TransferChecked` leg, optionally appends
133
+ * the Leash fee leg, and signs the resulting transaction as the buyer.
134
+ *
135
+ * The fee leg is built using the seller-supplied `extra['leash.fee']`
136
+ * block as the source of truth (so the buyer doesn't have to care about
137
+ * which env vars the seller ran with). The facilitator independently
138
+ * recomputes everything in `verify`, so a tampered seller can't trick
139
+ * the buyer into overpaying — the worst case is a `verify` failure.
140
+ */
141
+ async function buildLeashPaymentPayload(args) {
142
+ const { x402Version, paymentRequirements, signer, sourceTokenAccount } = args;
143
+ const rpc = createRpcClient(paymentRequirements.network, args.rpcUrl);
144
+ const tokenMint = await fetchMint(rpc, paymentRequirements.asset);
145
+ const tokenProgramAddress = tokenMint.programAddress;
146
+ if (tokenProgramAddress.toString() !== TOKEN_PROGRAM_ADDRESS.toString() &&
147
+ tokenProgramAddress.toString() !== TOKEN_2022_PROGRAM_ADDRESS.toString()) {
148
+ throw new Error('Asset was not created by a known token program');
149
+ }
150
+ // Resolve source ATA: explicit (delegate mode) or derived (owner mode).
151
+ let source;
152
+ if (sourceTokenAccount) {
153
+ source = sourceTokenAccount;
154
+ }
155
+ else {
156
+ const [ownerAta] = await findAssociatedTokenPda({
157
+ mint: paymentRequirements.asset,
158
+ owner: signer.address,
159
+ tokenProgram: tokenProgramAddress,
160
+ });
161
+ source = ownerAta;
162
+ }
163
+ const [destinationATA] = await findAssociatedTokenPda({
164
+ mint: paymentRequirements.asset,
165
+ owner: paymentRequirements.payTo,
166
+ tokenProgram: tokenProgramAddress,
167
+ });
168
+ const transferIx = getTransferCheckedInstruction({
169
+ source,
170
+ mint: paymentRequirements.asset,
171
+ destination: destinationATA,
172
+ authority: signer,
173
+ amount: BigInt(paymentRequirements.amount),
174
+ decimals: tokenMint.data.decimals,
175
+ }, { programAddress: tokenProgramAddress });
176
+ // Build the optional fee leg. The wire shape only carries (bps,
177
+ // feeAuthority); we recompute (feeAtomic, feeDestination) here from
178
+ // the same inputs the facilitator uses, so both sides agree without
179
+ // the seller having to pre-derive an ATA. If the seller tampers with
180
+ // bps or feeAuthority, the facilitator's independent recomputation
181
+ // rejects the transaction at verify time.
182
+ const feeExtra = parseLeashFeeExtra((paymentRequirements.extra ?? null));
183
+ const tokenProgramKind = tokenProgramAddress.toString() === TOKEN_2022_PROGRAM_ADDRESS.toString()
184
+ ? 'spl-token-2022'
185
+ : 'spl-token';
186
+ const resolvedFee = await computeLeashFeeForRequirements({
187
+ network: tokenNetworkFromPaymentNetwork(paymentRequirements.network),
188
+ asset: paymentRequirements.asset,
189
+ tokenProgram: tokenProgramKind,
190
+ amount: paymentRequirements.amount,
191
+ extra: feeExtra,
192
+ });
193
+ const feeIx = resolvedFee && resolvedFee.feeAtomic > 0n
194
+ ? getTransferCheckedInstruction({
195
+ source,
196
+ mint: paymentRequirements.asset,
197
+ destination: resolvedFee.feeDestination,
198
+ authority: signer,
199
+ amount: resolvedFee.feeAtomic,
200
+ decimals: tokenMint.data.decimals,
201
+ }, { programAddress: tokenProgramAddress })
202
+ : null;
203
+ const feePayer = paymentRequirements.extra?.feePayer;
204
+ if (!feePayer) {
205
+ throw new Error('feePayer is required in paymentRequirements.extra for SVM transactions');
206
+ }
207
+ /** Create-ATA helper types `payer` as a signer; the facilitator co-signs later. */
208
+ const feePayerSigner = feePayer;
209
+ /**
210
+ * Ensure the seller `payTo` ATA exists before `TransferChecked`. New
211
+ * stables (devnet USDG, etc.) frequently land on a wallet that has
212
+ * never received that mint, so the seller ATA hasn't been created.
213
+ * Idempotent — a no-op (small CU cost) when it already exists.
214
+ */
215
+ const provisionSellerAtaIx = getCreateAssociatedTokenIdempotentInstruction({
216
+ payer: feePayerSigner,
217
+ ata: destinationATA,
218
+ owner: paymentRequirements.payTo,
219
+ mint: paymentRequirements.asset,
220
+ tokenProgram: tokenProgramAddress,
221
+ });
222
+ /** Ensures the fee vault ATA exists before the second `TransferChecked`. */
223
+ const provisionFeeVaultAtaIx = resolvedFee && resolvedFee.feeAtomic > 0n
224
+ ? getCreateAssociatedTokenIdempotentInstruction({
225
+ payer: feePayerSigner,
226
+ ata: resolvedFee.feeDestination,
227
+ owner: resolvedFee.feeAuthority,
228
+ mint: paymentRequirements.asset,
229
+ tokenProgram: tokenProgramAddress,
230
+ })
231
+ : null;
232
+ const { value: latestBlockhash } = await rpc.getLatestBlockhash().send();
233
+ const sellerMemo = paymentRequirements.extra?.memo;
234
+ let memoData;
235
+ if (sellerMemo) {
236
+ memoData = new TextEncoder().encode(sellerMemo);
237
+ if (memoData.byteLength > MAX_MEMO_BYTES) {
238
+ throw new Error(`extra.memo exceeds maximum ${MAX_MEMO_BYTES} bytes`);
239
+ }
240
+ }
241
+ else {
242
+ const nonce = crypto.getRandomValues(new Uint8Array(16));
243
+ memoData = new TextEncoder().encode(Array.from(nonce)
244
+ .map((b) => b.toString(16).padStart(2, '0'))
245
+ .join(''));
246
+ }
247
+ const memoIx = {
248
+ programAddress: MEMO_PROGRAM_ADDRESS,
249
+ accounts: [],
250
+ data: memoData,
251
+ };
252
+ // Order: [setLimit, setPrice, sellerAtaCreate, feeAtaCreate?, transferIx, feeIx?, memoIx].
253
+ // ATA creates are paid for by the facilitator (`feePayer`) so a fresh
254
+ // mint settles first try without the buyer pre-funding rent.
255
+ const trailingIxs = feeIx
256
+ ? provisionFeeVaultAtaIx
257
+ ? [provisionSellerAtaIx, provisionFeeVaultAtaIx, transferIx, feeIx, memoIx]
258
+ : [provisionSellerAtaIx, transferIx, feeIx, memoIx]
259
+ : [provisionSellerAtaIx, transferIx, memoIx];
260
+ const tx = pipe(createTransactionMessage({ version: 0 }), (t) => setTransactionMessageComputeUnitPrice(DEFAULT_COMPUTE_UNIT_PRICE_MICROLAMPORTS, t), (t) => setTransactionMessageFeePayer(feePayer, t), (t) => prependTransactionMessageInstruction(getSetComputeUnitLimitInstruction({ units: DEFAULT_COMPUTE_UNIT_LIMIT }), t), (t) => appendTransactionMessageInstructions(trailingIxs, t), (t) => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, t));
261
+ const signedTransaction = await partiallySignTransactionMessageWithSigners(tx);
262
+ const base64EncodedWireTransaction = getBase64EncodedWireTransaction(signedTransaction);
263
+ return {
264
+ x402Version,
265
+ payload: { transaction: base64EncodedWireTransaction },
266
+ };
267
+ }
268
+ //# sourceMappingURL=delegate-scheme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delegate-scheme.js","sourceRoot":"","sources":["../../src/x402/delegate-scheme.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,110 @@
1
+ export type PaymentLinkMetaEndpoint = {
2
+ id: string;
3
+ label: string;
4
+ description: string | null;
5
+ method: 'GET' | 'POST';
6
+ url: string;
7
+ price: string;
8
+ /** Primary settlement currency (USDC by default). */
9
+ currency: 'USDC' | 'USDT' | 'USDG';
10
+ /**
11
+ * Other stablecoins this endpoint accepts at the equivalent dollar
12
+ * amount. Empty array when the endpoint is single-currency.
13
+ */
14
+ accepts_currencies: ReadonlyArray<'USDC' | 'USDT' | 'USDG'>;
15
+ network: string;
16
+ owner_agent: string;
17
+ payTo: string | null;
18
+ response: {
19
+ status: number;
20
+ mimeType: string;
21
+ body_kind: 'json' | 'text';
22
+ };
23
+ hooks: {
24
+ wrap_receipt: boolean;
25
+ webhook_url: string | null;
26
+ };
27
+ created_at: string;
28
+ updated_at: string;
29
+ };
30
+ export type PaymentLinkMeta = {
31
+ ok: true;
32
+ kind: 'leash.payment-link';
33
+ docs?: string;
34
+ note?: string;
35
+ endpoint: PaymentLinkMetaEndpoint;
36
+ facilitator?: string | null;
37
+ explorer?: {
38
+ agent?: string;
39
+ };
40
+ };
41
+ /**
42
+ * Inputs for {@link buildPaymentLinkMeta} — the producer-side builder used by
43
+ * the Leash web app's `/x/<id>` route. Keeping the builder in `@leashmarket/core`
44
+ * means producer and consumer share one TypeScript shape, so any change to
45
+ * the discovery contract becomes a typecheck error in both places.
46
+ */
47
+ export type BuildPaymentLinkMetaInput = {
48
+ endpoint: {
49
+ id: string;
50
+ label: string;
51
+ description?: string | null;
52
+ method: 'GET' | 'POST';
53
+ price: string;
54
+ /** Primary settlement currency. Defaults to `'USDC'` when omitted. */
55
+ currency?: 'USDC' | 'USDT' | 'USDG';
56
+ /** Additional accepted stablecoins. Defaults to `[]` when omitted. */
57
+ accepts_currencies?: ReadonlyArray<'USDC' | 'USDT' | 'USDG'>;
58
+ network: string;
59
+ owner_agent: string;
60
+ response: {
61
+ status: number;
62
+ mimeType: string;
63
+ /** Pass `body` so we can derive `body_kind` from its runtime type. */
64
+ body: unknown;
65
+ };
66
+ webhook_url?: string | null;
67
+ wrap_receipt: boolean;
68
+ created_at: string;
69
+ updated_at: string;
70
+ };
71
+ /** Origin used to construct absolute URLs (e.g. `https://leash.app`). */
72
+ origin: string;
73
+ /** Asset Signer PDA the seller pays to (best-effort; can be null). */
74
+ payTo: string | null;
75
+ /** Optional facilitator URL recorded on the descriptor. */
76
+ facilitator?: string | null;
77
+ /** Optional docs URL exposed in the payload. */
78
+ docsUrl?: string | null;
79
+ };
80
+ /**
81
+ * Construct a typed {@link PaymentLinkMeta} payload to be returned by the
82
+ * web app's `/x/<id>` GET discovery handler.
83
+ *
84
+ * This is the producer-side counterpart to {@link fetchPaymentLinkMeta}.
85
+ * Both sides share the same TS types, so the wire contract stays in sync.
86
+ */
87
+ export declare function buildPaymentLinkMeta(input: BuildPaymentLinkMetaInput): PaymentLinkMeta;
88
+ type FetchLike = (input: string | URL | Request, init?: RequestInit) => Promise<Response>;
89
+ export type FetchPaymentLinkMetaOptions = {
90
+ /** Optional fetch override (defaults to global fetch). */
91
+ fetch?: FetchLike;
92
+ /** Extra init headers/timeouts/etc when dialing the discovery endpoint. */
93
+ init?: RequestInit;
94
+ };
95
+ /**
96
+ * Resolve a payment-link metadata descriptor from a Leash web host.
97
+ *
98
+ * This is a typed wrapper around the browser-friendly `GET /x/<id>` discovery
99
+ * surface implemented by the playground app route (`apps/playground/app/x/[id]/route.ts`).
100
+ *
101
+ * Overloads:
102
+ * 1) `fetchPaymentLinkMeta("https://host/x/abc123")`
103
+ * 2) `fetchPaymentLinkMeta("https://host", "abc123")`
104
+ *
105
+ * Throws on non-2xx responses, invalid JSON, or payloads that don't match the
106
+ * expected `kind: "leash.payment-link"` contract.
107
+ */
108
+ export declare function fetchPaymentLinkMeta(urlOrBase: string | URL, idOrOpts?: string | FetchPaymentLinkMetaOptions, maybeOpts?: FetchPaymentLinkMetaOptions): Promise<PaymentLinkMeta>;
109
+ export {};
110
+ //# sourceMappingURL=discovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../src/x402/discovery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,213 @@
1
+ /**
2
+ * Construct a typed {@link PaymentLinkMeta} payload to be returned by the
3
+ * web app's `/x/<id>` GET discovery handler.
4
+ *
5
+ * This is the producer-side counterpart to {@link fetchPaymentLinkMeta}.
6
+ * Both sides share the same TS types, so the wire contract stays in sync.
7
+ */
8
+ export function buildPaymentLinkMeta(input) {
9
+ const { endpoint, origin, payTo, facilitator, docsUrl } = input;
10
+ const linkUrl = `${origin}/x/${endpoint.id}`;
11
+ const meta = {
12
+ ok: true,
13
+ kind: 'leash.payment-link',
14
+ ...(docsUrl ? { docs: docsUrl } : {}),
15
+ note: `Send ${endpoint.method} ${linkUrl} with an x402 client (e.g. @leashmarket/buyer-kit) to pay this link. This GET surface is metadata-only — no payment is taken.`,
16
+ endpoint: {
17
+ id: endpoint.id,
18
+ label: endpoint.label,
19
+ description: endpoint.description ?? null,
20
+ method: endpoint.method,
21
+ url: linkUrl,
22
+ price: endpoint.price,
23
+ currency: endpoint.currency ?? 'USDC',
24
+ accepts_currencies: endpoint.accepts_currencies ?? [],
25
+ network: endpoint.network,
26
+ owner_agent: endpoint.owner_agent,
27
+ payTo,
28
+ response: {
29
+ status: endpoint.response.status,
30
+ mimeType: endpoint.response.mimeType,
31
+ body_kind: typeof endpoint.response.body === 'string' ? 'text' : 'json',
32
+ },
33
+ hooks: {
34
+ wrap_receipt: endpoint.wrap_receipt,
35
+ webhook_url: endpoint.webhook_url ?? null,
36
+ },
37
+ created_at: endpoint.created_at,
38
+ updated_at: endpoint.updated_at,
39
+ },
40
+ ...(facilitator ? { facilitator } : {}),
41
+ explorer: {
42
+ agent: `${origin}/agents/${endpoint.owner_agent}`,
43
+ },
44
+ };
45
+ return meta;
46
+ }
47
+ /**
48
+ * Resolve a payment-link metadata descriptor from a Leash web host.
49
+ *
50
+ * This is a typed wrapper around the browser-friendly `GET /x/<id>` discovery
51
+ * surface implemented by the playground app route (`apps/playground/app/x/[id]/route.ts`).
52
+ *
53
+ * Overloads:
54
+ * 1) `fetchPaymentLinkMeta("https://host/x/abc123")`
55
+ * 2) `fetchPaymentLinkMeta("https://host", "abc123")`
56
+ *
57
+ * Throws on non-2xx responses, invalid JSON, or payloads that don't match the
58
+ * expected `kind: "leash.payment-link"` contract.
59
+ */
60
+ export async function fetchPaymentLinkMeta(urlOrBase, idOrOpts, maybeOpts) {
61
+ const id = typeof idOrOpts === 'string' ? idOrOpts : null;
62
+ const opts = (typeof idOrOpts === 'string' ? maybeOpts : idOrOpts) ?? {};
63
+ const fetchImpl = opts.fetch ?? globalThis.fetch;
64
+ const target = buildTargetUrl(urlOrBase, id);
65
+ const res = await fetchImpl(target, opts.init);
66
+ if (!res.ok) {
67
+ const body = await res.text().catch(() => '');
68
+ throw new Error(`payment-link discovery failed (${res.status} ${res.statusText}) for ${target}: ${body || 'empty response'}`);
69
+ }
70
+ let json;
71
+ try {
72
+ json = await res.json();
73
+ }
74
+ catch (err) {
75
+ throw new Error(`payment-link discovery returned non-JSON for ${target}: ${err.message}`);
76
+ }
77
+ return parsePaymentLinkMeta(json, target.toString());
78
+ }
79
+ function buildTargetUrl(urlOrBase, id) {
80
+ const raw = typeof urlOrBase === 'string' ? urlOrBase : urlOrBase.toString();
81
+ const base = new URL(raw);
82
+ if (!id)
83
+ return base;
84
+ const cleanBasePath = base.pathname.replace(/\/+$/, '');
85
+ const encoded = encodeURIComponent(id);
86
+ base.pathname = `${cleanBasePath}/x/${encoded}`;
87
+ return base;
88
+ }
89
+ function parsePaymentLinkMeta(input, source) {
90
+ if (!input || typeof input !== 'object') {
91
+ throw new Error(`invalid payment-link metadata from ${source}: body is not an object`);
92
+ }
93
+ const obj = input;
94
+ if (obj.ok !== true || obj.kind !== 'leash.payment-link') {
95
+ throw new Error(`invalid payment-link metadata from ${source}: expected { ok: true, kind: "leash.payment-link" }`);
96
+ }
97
+ const endpointRaw = obj.endpoint;
98
+ if (!endpointRaw || typeof endpointRaw !== 'object') {
99
+ throw new Error(`invalid payment-link metadata from ${source}: missing endpoint object`);
100
+ }
101
+ const endpointObj = endpointRaw;
102
+ const method = endpointObj.method;
103
+ if (method !== 'GET' && method !== 'POST') {
104
+ throw new Error(`invalid payment-link metadata from ${source}: endpoint.method must be GET|POST`);
105
+ }
106
+ return {
107
+ ok: true,
108
+ kind: 'leash.payment-link',
109
+ ...(typeof obj.docs === 'string' ? { docs: obj.docs } : {}),
110
+ ...(typeof obj.note === 'string' ? { note: obj.note } : {}),
111
+ endpoint: {
112
+ id: asString(endpointObj.id, 'endpoint.id', source),
113
+ label: asString(endpointObj.label, 'endpoint.label', source),
114
+ description: endpointObj.description == null
115
+ ? null
116
+ : asString(endpointObj.description, 'endpoint.description', source),
117
+ method,
118
+ url: asString(endpointObj.url, 'endpoint.url', source),
119
+ price: asString(endpointObj.price, 'endpoint.price', source),
120
+ currency: parseCurrency(endpointObj.currency, 'endpoint.currency', source),
121
+ accepts_currencies: parseAcceptsCurrencies(endpointObj.accepts_currencies, source),
122
+ network: asString(endpointObj.network, 'endpoint.network', source),
123
+ owner_agent: asString(endpointObj.owner_agent, 'endpoint.owner_agent', source),
124
+ payTo: endpointObj.payTo == null ? null : asString(endpointObj.payTo, 'endpoint.payTo', source),
125
+ response: parseResponse(endpointObj.response, source),
126
+ hooks: parseHooks(endpointObj.hooks, source),
127
+ created_at: asString(endpointObj.created_at, 'endpoint.created_at', source),
128
+ updated_at: asString(endpointObj.updated_at, 'endpoint.updated_at', source),
129
+ },
130
+ ...(obj.facilitator == null
131
+ ? {}
132
+ : { facilitator: asString(obj.facilitator, 'facilitator', source) }),
133
+ ...(obj.explorer && typeof obj.explorer === 'object'
134
+ ? {
135
+ explorer: {
136
+ ...(typeof obj.explorer.agent === 'string'
137
+ ? { agent: obj.explorer.agent }
138
+ : {}),
139
+ },
140
+ }
141
+ : {}),
142
+ };
143
+ }
144
+ function parseResponse(input, source) {
145
+ if (!input || typeof input !== 'object') {
146
+ throw new Error(`invalid payment-link metadata from ${source}: endpoint.response missing`);
147
+ }
148
+ const obj = input;
149
+ const bodyKind = obj.body_kind;
150
+ if (bodyKind !== 'json' && bodyKind !== 'text') {
151
+ throw new Error(`invalid payment-link metadata from ${source}: endpoint.response.body_kind must be "json" or "text"`);
152
+ }
153
+ const status = obj.status;
154
+ if (typeof status !== 'number' || !Number.isInteger(status)) {
155
+ throw new Error(`invalid payment-link metadata from ${source}: endpoint.response.status must be int`);
156
+ }
157
+ return {
158
+ status,
159
+ mimeType: asString(obj.mimeType, 'endpoint.response.mimeType', source),
160
+ body_kind: bodyKind,
161
+ };
162
+ }
163
+ function parseHooks(input, source) {
164
+ if (!input || typeof input !== 'object') {
165
+ throw new Error(`invalid payment-link metadata from ${source}: endpoint.hooks missing`);
166
+ }
167
+ const obj = input;
168
+ return {
169
+ wrap_receipt: asBoolean(obj.wrap_receipt, 'endpoint.hooks.wrap_receipt', source),
170
+ webhook_url: obj.webhook_url == null
171
+ ? null
172
+ : asString(obj.webhook_url, 'endpoint.hooks.webhook_url', source),
173
+ };
174
+ }
175
+ function asString(value, field, source) {
176
+ if (typeof value !== 'string' || value.length === 0) {
177
+ throw new Error(`invalid payment-link metadata from ${source}: ${field} must be non-empty string`);
178
+ }
179
+ return value;
180
+ }
181
+ function asBoolean(value, field, source) {
182
+ if (typeof value !== 'boolean') {
183
+ throw new Error(`invalid payment-link metadata from ${source}: ${field} must be boolean`);
184
+ }
185
+ return value;
186
+ }
187
+ const KNOWN_DISCOVERY_CURRENCIES = ['USDC', 'USDT', 'USDG'];
188
+ /**
189
+ * Parse a currency tag from a discovery payload. Defaults to `'USDC'` when
190
+ * the field is missing so older `/x/<id>` responses (pre multi-currency)
191
+ * still parse cleanly.
192
+ */
193
+ function parseCurrency(value, field, source) {
194
+ if (value == null)
195
+ return 'USDC';
196
+ if (typeof value !== 'string') {
197
+ throw new Error(`invalid payment-link metadata from ${source}: ${field} must be a string`);
198
+ }
199
+ const upper = value.toUpperCase();
200
+ if (!KNOWN_DISCOVERY_CURRENCIES.includes(upper)) {
201
+ throw new Error(`invalid payment-link metadata from ${source}: ${field} must be one of ${KNOWN_DISCOVERY_CURRENCIES.join(', ')}`);
202
+ }
203
+ return upper;
204
+ }
205
+ function parseAcceptsCurrencies(value, source) {
206
+ if (value == null)
207
+ return [];
208
+ if (!Array.isArray(value)) {
209
+ throw new Error(`invalid payment-link metadata from ${source}: endpoint.accepts_currencies must be an array`);
210
+ }
211
+ return value.map((entry, idx) => parseCurrency(entry, `endpoint.accepts_currencies[${idx}]`, source));
212
+ }
213
+ //# sourceMappingURL=discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.js","sourceRoot":"","sources":["../../src/x402/discovery.ts"],"names":[],"mappings":"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"}