tantk commited on
Commit
0d53e7e
·
0 Parent(s):

RenderGate: x402-powered headless rendering API on Stellar

Browse files
Files changed (10) hide show
  1. .env.example +4 -0
  2. .gitattributes +35 -0
  3. .gitignore +6 -0
  4. Dockerfile +26 -0
  5. README.md +228 -0
  6. demo-client.js +108 -0
  7. package-lock.json +2068 -0
  8. package.json +24 -0
  9. renderer.js +98 -0
  10. server.js +127 -0
.env.example ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ # Stellar testnet secret key (starts with S...)
2
+ STELLAR_PRIVATE_KEY=
3
+ # Stellar testnet public key to receive payments (starts with G...)
4
+ PAY_TO=
.gitattributes ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ *.7z filter=lfs diff=lfs merge=lfs -text
2
+ *.arrow filter=lfs diff=lfs merge=lfs -text
3
+ *.bin filter=lfs diff=lfs merge=lfs -text
4
+ *.bz2 filter=lfs diff=lfs merge=lfs -text
5
+ *.ckpt filter=lfs diff=lfs merge=lfs -text
6
+ *.ftz filter=lfs diff=lfs merge=lfs -text
7
+ *.gz filter=lfs diff=lfs merge=lfs -text
8
+ *.h5 filter=lfs diff=lfs merge=lfs -text
9
+ *.joblib filter=lfs diff=lfs merge=lfs -text
10
+ *.lfs.* filter=lfs diff=lfs merge=lfs -text
11
+ *.mlmodel filter=lfs diff=lfs merge=lfs -text
12
+ *.model filter=lfs diff=lfs merge=lfs -text
13
+ *.msgpack filter=lfs diff=lfs merge=lfs -text
14
+ *.npy filter=lfs diff=lfs merge=lfs -text
15
+ *.npz filter=lfs diff=lfs merge=lfs -text
16
+ *.onnx filter=lfs diff=lfs merge=lfs -text
17
+ *.ot filter=lfs diff=lfs merge=lfs -text
18
+ *.parquet filter=lfs diff=lfs merge=lfs -text
19
+ *.pb filter=lfs diff=lfs merge=lfs -text
20
+ *.pickle filter=lfs diff=lfs merge=lfs -text
21
+ *.pkl filter=lfs diff=lfs merge=lfs -text
22
+ *.pt filter=lfs diff=lfs merge=lfs -text
23
+ *.pth filter=lfs diff=lfs merge=lfs -text
24
+ *.rar filter=lfs diff=lfs merge=lfs -text
25
+ *.safetensors filter=lfs diff=lfs merge=lfs -text
26
+ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
27
+ *.tar.* filter=lfs diff=lfs merge=lfs -text
28
+ *.tar filter=lfs diff=lfs merge=lfs -text
29
+ *.tflite filter=lfs diff=lfs merge=lfs -text
30
+ *.tgz filter=lfs diff=lfs merge=lfs -text
31
+ *.wasm filter=lfs diff=lfs merge=lfs -text
32
+ *.xz filter=lfs diff=lfs merge=lfs -text
33
+ *.zip filter=lfs diff=lfs merge=lfs -text
34
+ *.zst filter=lfs diff=lfs merge=lfs -text
35
+ *tfevents* filter=lfs diff=lfs merge=lfs -text
.gitignore ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ node_modules/
2
+ .env
3
+ test_*.py
4
+ bench_*.py
5
+ __pycache__/
6
+ docs/superpowers/
Dockerfile ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ FROM node:22-slim
2
+
3
+ # Install Playwright system dependencies
4
+ RUN apt-get update && apt-get install -y \
5
+ libnss3 libatk1.0-0 libatk-bridge2.0-0 libcups2 libdrm2 \
6
+ libxkbcommon0 libxcomposite1 libxdamage1 libxfixes3 libxrandr2 \
7
+ libgbm1 libpango-1.0-0 libcairo2 libasound2 libatspi2.0-0 \
8
+ fonts-liberation fonts-noto-color-emoji \
9
+ && rm -rf /var/lib/apt/lists/*
10
+
11
+ WORKDIR /app
12
+
13
+ COPY package.json package-lock.json ./
14
+ RUN npm ci --omit=dev
15
+
16
+ # Install Playwright Chromium
17
+ RUN npx playwright install chromium
18
+
19
+ COPY server.js renderer.js ./
20
+
21
+ USER node
22
+ ENV PORT=7860
23
+
24
+ EXPOSE 7860
25
+
26
+ CMD ["node", "server.js"]
README.md ADDED
@@ -0,0 +1,228 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ title: RenderGate
3
+ emoji: 🔍
4
+ colorFrom: blue
5
+ colorTo: purple
6
+ sdk: docker
7
+ app_port: 7860
8
+ ---
9
+
10
+ # RenderGate
11
+
12
+ **Pay-per-render headless browser API, powered by x402 micropayments on Stellar.**
13
+
14
+ AI agents struggle with JavaScript-rendered websites — SPAs, Twitter/X, DeFi apps, and Cloudflare-protected sites all return empty HTML shells to standard HTTP fetch. RenderGate solves this with a headless browser rendering service that agents pay for per-request via x402 micropayments in USDC on Stellar.
15
+
16
+ **Live service:** https://tantk-rendergate.hf.space
17
+
18
+ ## How It Works
19
+
20
+ 1. Agent requests `GET /render?url=https://x.com/stellarorg`
21
+ 2. Server responds with **402 Payment Required** + Stellar payment instructions
22
+ 3. Agent signs a $0.001 USDC payment on Stellar testnet
23
+ 4. Server verifies payment via x402 facilitator, settles on-chain (~5s)
24
+ 5. Playwright renders the page with smart wait + scroll for lazy content
25
+ 6. Agent receives fully rendered content with title, text, and metadata
26
+
27
+ ## The Problem
28
+
29
+ ```
30
+ # Standard HTTP fetch on Twitter/X:
31
+ curl https://x.com/stellarorg
32
+ → Empty SPA shell. No tweets. No content.
33
+
34
+ # RenderGate ($0.001 USDC on Stellar):
35
+ → "Stellar @StellarOrg · 9,913 posts · 840K Followers"
36
+ → "Meridian is headed to Lisbon. October 28–29."
37
+ → "10 days until Stellar House. Who's joining us in CDMX?"
38
+ → Full tweets, engagement metrics, retweets, quoted content
39
+ ```
40
+
41
+ ## Tested Sites
42
+
43
+ All tested against the live deployed service at `tantk-rendergate.hf.space` with real Stellar testnet payments. Every request is a verifiable on-chain transaction.
44
+
45
+ ### Social Media
46
+
47
+ | Site | Render Time | Result |
48
+ |------|-------------|--------|
49
+ | x.com (Twitter profiles) | 8-11s | Full tweets, bios, follower counts, engagement metrics, retweets |
50
+ | linkedin.com (company pages) | 5.7s | Full profile, about, employees, locations |
51
+ | tiktok.com (profiles) | 5.4s | Profile metadata, follower counts (video content needs login) |
52
+ | instagram.com | 3.7s | Login wall only |
53
+
54
+ ### Crypto Exchanges
55
+
56
+ | Site | Render Time | Result |
57
+ |------|-------------|--------|
58
+ | coinbase.com/price | 4.9s | Full price page, charts, market data (21K chars) |
59
+ | okx.com/price | 6.6s | Full price page, live data |
60
+ | kraken.com/prices | 7.5s | Full price page, history, about |
61
+ | binance.com/price | — | Blocked (bot protection) |
62
+
63
+ ### Crypto Analytics & Data
64
+
65
+ | Site | Render Time | Result |
66
+ |------|-------------|--------|
67
+ | coingecko.com | 8.9s | Full token page, price, market cap, charts (37K chars) |
68
+ | coinmarketcap.com | 6.0s | Full token page, rankings, data |
69
+ | defillama.com | 3.6s | TVL, fees, revenue, protocol rankings |
70
+ | dexscreener.com | 5.7s | Live pair data — price, volume, liquidity, buy/sell ratio |
71
+ | stellar.expert | 4.5s | Block explorer, network stats |
72
+ | stellarchain.io | 4.7s | Explorer, price, assets |
73
+ | solscan.io | 4.4s | Solana explorer, analytics |
74
+ | etherscan.io | — | Blocked (Cloudflare challenge) |
75
+ | nansen.ai | 3.7s | Landing page content |
76
+ | messari.io | — | Blocked (Vercel security checkpoint) |
77
+
78
+ ### Crypto News
79
+
80
+ | Site | Render Time | Result |
81
+ |------|-------------|--------|
82
+ | cointelegraph.com | 4.2s | Headlines, prices, articles |
83
+ | decrypt.co | 4.0s | Full news feed, coin prices (14K chars) |
84
+ | blockworks.co | 7.4s | Analytics, prices, articles |
85
+ | theblock.co | 5.2s | News content (behind cookie wall) |
86
+
87
+ ### Stellar Ecosystem
88
+
89
+ | Site | Render Time | Result |
90
+ |------|-------------|--------|
91
+ | stellar.expert | 4.5s | Block explorer, network stats |
92
+ | stellarchain.io | 4.7s | Explorer, price, assets |
93
+ | dashboard.stellar.org | 4.4s | Live network status, stats (6.5K chars) |
94
+ | meridian.stellar.org | 7.2s | Conference details — Lisbon 2026 |
95
+ | stellarterm.com | 5.3s | DEX trading interface |
96
+ | stellarx.com | 5.4s | DEX, markets |
97
+ | lobstr.co | 4.2s | Wallet landing, trade features |
98
+ | soroswap.finance | 3.7s | Soroban DEX aggregator content |
99
+ | freighter.app | 3.2s | Wallet download page |
100
+ | scopuly.com | 6.3s | Full wallet/DEX interface |
101
+ | lumenswap.io | 3.6s | DEX landing page |
102
+
103
+ ### DeFi Apps
104
+
105
+ | Site | Render Time | Result |
106
+ |------|-------------|--------|
107
+ | app.uniswap.org | 7.3s | Live token prices, swap UI, TVL stats |
108
+ | aave.com | 3.4s | Full landing, product info |
109
+ | compound.finance | 3.1s | Market data, protocol stats |
110
+ | blur.io | 3.5s | NFT marketplace, collections, floor prices |
111
+
112
+ ### On-Chain Analytics
113
+
114
+ | Site | Render Time | Result |
115
+ |------|-------------|--------|
116
+ | tokenterminal.com | 5.1s | Stellar project page, metrics |
117
+ | artemis.xyz | 5.1s | Full analytics platform (26K chars) |
118
+ | flipsidecrypto.xyz | 3.9s | Data platform landing |
119
+
120
+ ### Developer Tools
121
+
122
+ | Site | Render Time | Result |
123
+ |------|-------------|--------|
124
+ | npmjs.com | 4.6s | Full package pages + README (Cloudflare-protected, works) |
125
+ | github.com (issues) | 6.3s | Full issue lists, content |
126
+ | dorahacks.io | 6.5s | Full SPA content — hackathon details, resources |
127
+
128
+ ### Blocked Sites
129
+
130
+ These sites block requests from data center IPs regardless of rendering — this is an IP reputation issue, not a rendering limitation.
131
+
132
+ | Site | Reason |
133
+ |------|--------|
134
+ | reddit.com | IP banned from HF's data center |
135
+ | producthunt.com | Cloudflare challenge |
136
+ | binance.com | Bot protection |
137
+ | etherscan.io | Cloudflare challenge |
138
+ | messari.io | Vercel security checkpoint |
139
+ | instagram.com | Requires login |
140
+ | medium.com | Server error (500) |
141
+ | opensea.io | Cloudflare challenge |
142
+ | dune.com | Cloudflare block |
143
+ | alchemy.com | Blocked |
144
+
145
+ Example transaction: [`5c898eb4...`](https://stellar.expert/explorer/testnet/tx/5c898eb489265c142baee086d502e25b87a5536e4386e5ccdf69edc2515c0ef6)
146
+
147
+ ## Using the Service
148
+
149
+ Any x402-compatible agent can use RenderGate with just the URL. No API keys, no accounts, no setup.
150
+
151
+ ```javascript
152
+ import { wrapFetchWithPayment } from "@x402/fetch";
153
+
154
+ // One line — the library handles 402 → pay → retry automatically
155
+ const response = await paidFetch(
156
+ "https://tantk-rendergate.hf.space/render?url=https://x.com/stellarorg"
157
+ );
158
+ const data = await response.json();
159
+ // { title: "Stellar (@StellarOrg) / X", content: "9,913 posts...", ... }
160
+ ```
161
+
162
+ That's it. The agent just needs:
163
+ - `@x402/fetch` + `@x402/stellar` (npm packages)
164
+ - A Stellar wallet with USDC
165
+ - Our URL
166
+
167
+ ## Try It
168
+
169
+ `demo-client.js` is included to test the service end-to-end. It walks through the x402 payment flow step by step.
170
+
171
+ ```bash
172
+ npm install
173
+ cp .env.example .env
174
+ # Add your Stellar testnet secret key (STELLAR_PRIVATE_KEY)
175
+ SERVER_URL=https://tantk-rendergate.hf.space node demo-client.js "https://x.com/stellarorg"
176
+ ```
177
+
178
+ You'll need a Stellar testnet wallet funded with USDC — generate one at [lab.stellar.org](https://lab.stellar.org/account/create), fund it, add a USDC trustline, and get testnet USDC from [faucet.circle.com](https://faucet.circle.com).
179
+
180
+ ## API
181
+
182
+ ### `GET /` (free)
183
+ Returns service info and usage instructions.
184
+
185
+ ### `GET /health` (free)
186
+ Health check.
187
+
188
+ ### `GET /render?url=<encoded_url>` (paid — $0.001 USDC)
189
+ Renders the URL with a headless browser and returns:
190
+ ```json
191
+ {
192
+ "title": "Stellar (@StellarOrg) / X",
193
+ "content": "9,913 posts... 840.1K Followers... Meridian is headed to Lisbon...",
194
+ "url": "https://x.com/stellarorg",
195
+ "renderedAt": "2026-04-13T06:59:12.395Z",
196
+ "renderTimeMs": 8071,
197
+ "payment": { "price": "$0.001", "network": "stellar:testnet" }
198
+ }
199
+ ```
200
+
201
+ ## Architecture
202
+
203
+ ```
204
+ Agent RenderGate Stellar
205
+ | | |
206
+ |--- GET /render?url= --->| |
207
+ |<-- 402 Payment Required -| |
208
+ | | |
209
+ |--- Sign USDC payment ---|------------------------->|
210
+ |--- GET + payment header->| |
211
+ | |--- verify via x402.org ->|
212
+ | |<-- settlement confirmed -|
213
+ | | |
214
+ | |--- Playwright render --->| (browser)
215
+ |<-- 200 + rendered JSON --| |
216
+ ```
217
+
218
+ ## Tech Stack
219
+
220
+ - **Payment:** x402 protocol on Stellar (USDC testnet)
221
+ - **Facilitator:** x402.org (OpenZeppelin-based, sponsored fees)
222
+ - **Rendering:** Playwright with Chromium (smart wait + scroll)
223
+ - **Server:** Express.js
224
+ - **Deployment:** Hugging Face Spaces (Docker)
225
+
226
+ ## Built For
227
+
228
+ [Stellar Hacks: Agents](https://dorahacks.io/hackathon/stellar-agents-x402-stripe-mpp) hackathon — exploring x402 micropayments for the agentic economy on Stellar.
demo-client.js ADDED
@@ -0,0 +1,108 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import "dotenv/config";
2
+ import { Transaction, TransactionBuilder } from "@stellar/stellar-sdk";
3
+ import { x402Client, x402HTTPClient } from "@x402/fetch";
4
+ import { createEd25519Signer, getNetworkPassphrase } from "@x402/stellar";
5
+ import { ExactStellarScheme } from "@x402/stellar/exact/client";
6
+
7
+ const STELLAR_PRIVATE_KEY = process.env.STELLAR_PRIVATE_KEY;
8
+ const SERVER_URL = process.env.SERVER_URL || "http://localhost:3001";
9
+ const NETWORK = "stellar:testnet";
10
+ const STELLAR_RPC_URL = "https://soroban-testnet.stellar.org";
11
+
12
+ if (!STELLAR_PRIVATE_KEY) {
13
+ console.error("ERROR: STELLAR_PRIVATE_KEY not set in .env");
14
+ process.exit(1);
15
+ }
16
+
17
+ const targetUrl = process.argv[2] || "https://x.com/stellarorg";
18
+
19
+ async function main() {
20
+ const renderEndpoint = `${SERVER_URL}/render?url=${encodeURIComponent(targetUrl)}`;
21
+
22
+ // Setup x402 client
23
+ const signer = createEd25519Signer(STELLAR_PRIVATE_KEY, NETWORK);
24
+ const rpcConfig = { url: STELLAR_RPC_URL };
25
+ const client = new x402Client().register(
26
+ "stellar:*",
27
+ new ExactStellarScheme(signer, rpcConfig),
28
+ );
29
+ const httpClient = new x402HTTPClient(client);
30
+
31
+ console.log(`Target URL: ${targetUrl}`);
32
+ console.log(`Render endpoint: ${renderEndpoint}`);
33
+ console.log(`Paying from: ${signer.address}`);
34
+
35
+ // Step 1: Request without payment — expect 402
36
+ console.log("\n--- Step 1: Request without payment ---");
37
+ const firstTry = await fetch(renderEndpoint);
38
+ console.log(`Response: ${firstTry.status} ${firstTry.statusText}`);
39
+
40
+ if (firstTry.status !== 402) {
41
+ console.log("No payment required! Response:", await firstTry.text());
42
+ return;
43
+ }
44
+
45
+ // Step 2: Extract payment requirements from 402 response
46
+ console.log("\n--- Step 2: Create payment ---");
47
+ const paymentRequired = httpClient.getPaymentRequiredResponse((name) =>
48
+ firstTry.headers.get(name),
49
+ );
50
+ console.log("Payment required:", JSON.stringify(paymentRequired, null, 2));
51
+
52
+ // Step 3: Create and configure payment payload
53
+ let paymentPayload = await client.createPaymentPayload(paymentRequired);
54
+ const networkPassphrase = getNetworkPassphrase(NETWORK);
55
+ const tx = new Transaction(
56
+ paymentPayload.payload.transaction,
57
+ networkPassphrase,
58
+ );
59
+ const sorobanData = tx.toEnvelope().v1()?.tx()?.ext()?.sorobanData();
60
+ if (sorobanData) {
61
+ paymentPayload = {
62
+ ...paymentPayload,
63
+ payload: {
64
+ ...paymentPayload.payload,
65
+ transaction: TransactionBuilder.cloneFrom(tx, {
66
+ fee: "1",
67
+ sorobanData,
68
+ networkPassphrase,
69
+ })
70
+ .build()
71
+ .toXDR(),
72
+ },
73
+ };
74
+ }
75
+
76
+ // Step 4: Send paid request
77
+ console.log("\n--- Step 3: Send paid request ---");
78
+ const paymentHeaders =
79
+ httpClient.encodePaymentSignatureHeader(paymentPayload);
80
+ const start = Date.now();
81
+ const paidResponse = await fetch(renderEndpoint, {
82
+ method: "GET",
83
+ headers: paymentHeaders,
84
+ });
85
+ const elapsed = Date.now() - start;
86
+
87
+ // Step 5: Show results
88
+ console.log(`\n--- Result (${elapsed}ms) ---`);
89
+ console.log(`Status: ${paidResponse.status}`);
90
+
91
+ const paymentResponse = httpClient.getPaymentSettleResponse((name) =>
92
+ paidResponse.headers.get(name),
93
+ );
94
+ if (paymentResponse) {
95
+ console.log("Settlement:", JSON.stringify(paymentResponse, null, 2));
96
+ }
97
+
98
+ const data = await paidResponse.json();
99
+ console.log(`\nTitle: ${data.title}`);
100
+ console.log(`Render time: ${data.renderTimeMs}ms`);
101
+ console.log(`Content length: ${data.content?.length} chars`);
102
+ console.log(`\nContent preview:\n${data.content?.substring(0, 600)}`);
103
+ }
104
+
105
+ main().catch((err) => {
106
+ console.error("Client error:", err);
107
+ process.exit(1);
108
+ });
package-lock.json ADDED
@@ -0,0 +1,2068 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "rendergate",
3
+ "version": "1.0.0",
4
+ "lockfileVersion": 3,
5
+ "requires": true,
6
+ "packages": {
7
+ "": {
8
+ "name": "rendergate",
9
+ "version": "1.0.0",
10
+ "license": "ISC",
11
+ "dependencies": {
12
+ "@stellar/stellar-sdk": "^15.0.1",
13
+ "@x402/core": "^2.9.0",
14
+ "@x402/express": "^2.9.0",
15
+ "@x402/fetch": "^2.9.0",
16
+ "@x402/stellar": "^2.9.0",
17
+ "dotenv": "^17.4.2",
18
+ "express": "^5.2.1",
19
+ "playwright": "^1.59.1"
20
+ }
21
+ },
22
+ "node_modules/@adraffy/ens-normalize": {
23
+ "version": "1.10.1",
24
+ "resolved": "https://registry.npmmirror.com/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz",
25
+ "integrity": "sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==",
26
+ "license": "MIT",
27
+ "peer": true
28
+ },
29
+ "node_modules/@noble/ciphers": {
30
+ "version": "1.3.0",
31
+ "resolved": "https://registry.npmmirror.com/@noble/ciphers/-/ciphers-1.3.0.tgz",
32
+ "integrity": "sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==",
33
+ "license": "MIT",
34
+ "engines": {
35
+ "node": "^14.21.3 || >=16"
36
+ },
37
+ "funding": {
38
+ "url": "https://paulmillr.com/funding/"
39
+ }
40
+ },
41
+ "node_modules/@noble/curves": {
42
+ "version": "1.9.7",
43
+ "resolved": "https://registry.npmmirror.com/@noble/curves/-/curves-1.9.7.tgz",
44
+ "integrity": "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==",
45
+ "license": "MIT",
46
+ "dependencies": {
47
+ "@noble/hashes": "1.8.0"
48
+ },
49
+ "engines": {
50
+ "node": "^14.21.3 || >=16"
51
+ },
52
+ "funding": {
53
+ "url": "https://paulmillr.com/funding/"
54
+ }
55
+ },
56
+ "node_modules/@noble/hashes": {
57
+ "version": "1.8.0",
58
+ "resolved": "https://registry.npmmirror.com/@noble/hashes/-/hashes-1.8.0.tgz",
59
+ "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==",
60
+ "license": "MIT",
61
+ "engines": {
62
+ "node": "^14.21.3 || >=16"
63
+ },
64
+ "funding": {
65
+ "url": "https://paulmillr.com/funding/"
66
+ }
67
+ },
68
+ "node_modules/@scure/base": {
69
+ "version": "1.2.6",
70
+ "resolved": "https://registry.npmmirror.com/@scure/base/-/base-1.2.6.tgz",
71
+ "integrity": "sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==",
72
+ "license": "MIT",
73
+ "funding": {
74
+ "url": "https://paulmillr.com/funding/"
75
+ }
76
+ },
77
+ "node_modules/@scure/bip32": {
78
+ "version": "1.7.0",
79
+ "resolved": "https://registry.npmmirror.com/@scure/bip32/-/bip32-1.7.0.tgz",
80
+ "integrity": "sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw==",
81
+ "license": "MIT",
82
+ "dependencies": {
83
+ "@noble/curves": "~1.9.0",
84
+ "@noble/hashes": "~1.8.0",
85
+ "@scure/base": "~1.2.5"
86
+ },
87
+ "funding": {
88
+ "url": "https://paulmillr.com/funding/"
89
+ }
90
+ },
91
+ "node_modules/@scure/bip39": {
92
+ "version": "1.6.0",
93
+ "resolved": "https://registry.npmmirror.com/@scure/bip39/-/bip39-1.6.0.tgz",
94
+ "integrity": "sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==",
95
+ "license": "MIT",
96
+ "dependencies": {
97
+ "@noble/hashes": "~1.8.0",
98
+ "@scure/base": "~1.2.5"
99
+ },
100
+ "funding": {
101
+ "url": "https://paulmillr.com/funding/"
102
+ }
103
+ },
104
+ "node_modules/@spruceid/siwe-parser": {
105
+ "version": "2.1.2",
106
+ "resolved": "https://registry.npmmirror.com/@spruceid/siwe-parser/-/siwe-parser-2.1.2.tgz",
107
+ "integrity": "sha512-d/r3S1LwJyMaRAKQ0awmo9whfXeE88Qt00vRj91q5uv5ATtWIQEGJ67Yr5eSZw5zp1/fZCXZYuEckt8lSkereQ==",
108
+ "license": "Apache-2.0",
109
+ "dependencies": {
110
+ "@noble/hashes": "^1.1.2",
111
+ "apg-js": "^4.3.0",
112
+ "uri-js": "^4.4.1",
113
+ "valid-url": "^1.0.9"
114
+ }
115
+ },
116
+ "node_modules/@stablelib/binary": {
117
+ "version": "1.0.1",
118
+ "resolved": "https://registry.npmmirror.com/@stablelib/binary/-/binary-1.0.1.tgz",
119
+ "integrity": "sha512-ClJWvmL6UBM/wjkvv/7m5VP3GMr9t0osr4yVgLZsLCOz4hGN9gIAFEqnJ0TsSMAN+n840nf2cHZnA5/KFqHC7Q==",
120
+ "license": "MIT",
121
+ "dependencies": {
122
+ "@stablelib/int": "^1.0.1"
123
+ }
124
+ },
125
+ "node_modules/@stablelib/int": {
126
+ "version": "1.0.1",
127
+ "resolved": "https://registry.npmmirror.com/@stablelib/int/-/int-1.0.1.tgz",
128
+ "integrity": "sha512-byr69X/sDtDiIjIV6m4roLVWnNNlRGzsvxw+agj8CIEazqWGOQp2dTYgQhtyVXV9wpO6WyXRQUzLV/JRNumT2w==",
129
+ "license": "MIT"
130
+ },
131
+ "node_modules/@stablelib/random": {
132
+ "version": "1.0.2",
133
+ "resolved": "https://registry.npmmirror.com/@stablelib/random/-/random-1.0.2.tgz",
134
+ "integrity": "sha512-rIsE83Xpb7clHPVRlBj8qNe5L8ISQOzjghYQm/dZ7VaM2KHYwMW5adjQjrzTZCchFnNCNhkwtnOBa9HTMJCI8w==",
135
+ "license": "MIT",
136
+ "dependencies": {
137
+ "@stablelib/binary": "^1.0.1",
138
+ "@stablelib/wipe": "^1.0.1"
139
+ }
140
+ },
141
+ "node_modules/@stablelib/wipe": {
142
+ "version": "1.0.1",
143
+ "resolved": "https://registry.npmmirror.com/@stablelib/wipe/-/wipe-1.0.1.tgz",
144
+ "integrity": "sha512-WfqfX/eXGiAd3RJe4VU2snh/ZPwtSjLG4ynQ/vYzvghTh7dHFcI1wl+nrkWG6lGhukOxOsUHfv8dUXr58D0ayg==",
145
+ "license": "MIT"
146
+ },
147
+ "node_modules/@stellar/js-xdr": {
148
+ "version": "4.0.0",
149
+ "resolved": "https://registry.npmmirror.com/@stellar/js-xdr/-/js-xdr-4.0.0.tgz",
150
+ "integrity": "sha512-+NmNa7Tk5BI5XFdy/6xGTqAN4J9a9KgCrCGhj2uEUTCBhLkch0M+QbKzNH8zEnejWe0p8w+0q5hUVX6L3OzoVA==",
151
+ "license": "Apache-2.0",
152
+ "engines": {
153
+ "node": ">=20.0.0",
154
+ "pnpm": ">=9.0.0"
155
+ }
156
+ },
157
+ "node_modules/@stellar/stellar-base": {
158
+ "version": "15.0.0",
159
+ "resolved": "https://registry.npmmirror.com/@stellar/stellar-base/-/stellar-base-15.0.0.tgz",
160
+ "integrity": "sha512-XQhxUr9BYiEcFcgc4oWcCMR9QJCny/GmmGsuwPKf/ieIcOeb5149KLHYx9mJCA0ea8QbucR2/GzV58QbXOTxQA==",
161
+ "license": "Apache-2.0",
162
+ "dependencies": {
163
+ "@noble/curves": "^1.9.7",
164
+ "@stellar/js-xdr": "^4.0.0",
165
+ "base32.js": "^0.1.0",
166
+ "bignumber.js": "^9.3.1",
167
+ "buffer": "^6.0.3",
168
+ "sha.js": "^2.4.12"
169
+ },
170
+ "engines": {
171
+ "node": ">=20.0.0"
172
+ }
173
+ },
174
+ "node_modules/@stellar/stellar-sdk": {
175
+ "version": "15.0.1",
176
+ "resolved": "https://registry.npmmirror.com/@stellar/stellar-sdk/-/stellar-sdk-15.0.1.tgz",
177
+ "integrity": "sha512-iZjWKXtfohsPh+CX9wRyQNIlXLeA9VyuQB6UMC7AFBD9XnR92eOjnlfeONzk/Bsrkk6+UPlpzSy2MuF+ydHP1A==",
178
+ "license": "Apache-2.0",
179
+ "dependencies": {
180
+ "@stellar/stellar-base": "^15.0.0",
181
+ "axios": "1.14.0",
182
+ "bignumber.js": "^9.3.1",
183
+ "commander": "^14.0.3",
184
+ "eventsource": "^2.0.2",
185
+ "feaxios": "^0.0.23",
186
+ "randombytes": "^2.1.0",
187
+ "toml": "^3.0.0",
188
+ "urijs": "^1.19.11"
189
+ },
190
+ "bin": {
191
+ "stellar-js": "bin/stellar-js"
192
+ },
193
+ "engines": {
194
+ "node": ">=20.0.0"
195
+ }
196
+ },
197
+ "node_modules/@types/node": {
198
+ "version": "22.7.5",
199
+ "resolved": "https://registry.npmmirror.com/@types/node/-/node-22.7.5.tgz",
200
+ "integrity": "sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==",
201
+ "license": "MIT",
202
+ "peer": true,
203
+ "dependencies": {
204
+ "undici-types": "~6.19.2"
205
+ }
206
+ },
207
+ "node_modules/@x402/core": {
208
+ "version": "2.9.0",
209
+ "resolved": "https://registry.npmmirror.com/@x402/core/-/core-2.9.0.tgz",
210
+ "integrity": "sha512-IqPITHYx6XHlgLPtparuKKwoB+3wQdgt0F+WUH1e3WHMeiWdp+xTtQDy+6yOKuObNFI1S1iVbQFz0GivR/Vv3w==",
211
+ "license": "Apache-2.0",
212
+ "dependencies": {
213
+ "zod": "^3.24.2"
214
+ }
215
+ },
216
+ "node_modules/@x402/express": {
217
+ "version": "2.9.0",
218
+ "resolved": "https://registry.npmmirror.com/@x402/express/-/express-2.9.0.tgz",
219
+ "integrity": "sha512-E236c188p7rkAILnzdd19FQZuTEOM9+DP/y/FG4B0oawiBXx5FGR5ez7EUKCG7V7FxXsGvMEjUFMJ0BjrQx8yw==",
220
+ "license": "Apache-2.0",
221
+ "dependencies": {
222
+ "@x402/core": "~2.9.0",
223
+ "@x402/extensions": "~2.9.0",
224
+ "viem": "^2.39.3",
225
+ "zod": "^3.24.2"
226
+ },
227
+ "peerDependencies": {
228
+ "@x402/paywall": "^2.9.0",
229
+ "express": "^4.0.0 || ^5.0.0"
230
+ },
231
+ "peerDependenciesMeta": {
232
+ "@x402/paywall": {
233
+ "optional": true
234
+ }
235
+ }
236
+ },
237
+ "node_modules/@x402/extensions": {
238
+ "version": "2.9.0",
239
+ "resolved": "https://registry.npmmirror.com/@x402/extensions/-/extensions-2.9.0.tgz",
240
+ "integrity": "sha512-Fk7MJFWSQtsRGGZcNpgwv8V6IG38USNciA5ImkF0InceWDfjMBq6b8GmksM+cVHAXQsMQYxw3HV8uhfwTPEGAQ==",
241
+ "license": "Apache-2.0",
242
+ "dependencies": {
243
+ "@noble/curves": "^1.9.0",
244
+ "@scure/base": "^1.2.6",
245
+ "@x402/core": "~2.9.0",
246
+ "ajv": "^8.17.1",
247
+ "jose": "^5.9.6",
248
+ "siwe": "^2.3.2",
249
+ "tweetnacl": "^1.0.3",
250
+ "viem": "^2.43.5",
251
+ "zod": "^3.24.2"
252
+ }
253
+ },
254
+ "node_modules/@x402/fetch": {
255
+ "version": "2.9.0",
256
+ "resolved": "https://registry.npmmirror.com/@x402/fetch/-/fetch-2.9.0.tgz",
257
+ "integrity": "sha512-/ocFWG5aTftCabW4CWXLZjafzTwkmW+c7u4lzXLegJ7F8Fkciw6yyzrQ+R4Rsm6F6TH0pGzo545Yc7n7z5UNlA==",
258
+ "license": "Apache-2.0",
259
+ "dependencies": {
260
+ "@x402/core": "~2.9.0",
261
+ "viem": "^2.39.3",
262
+ "zod": "^3.24.2"
263
+ }
264
+ },
265
+ "node_modules/@x402/stellar": {
266
+ "version": "2.9.0",
267
+ "resolved": "https://registry.npmmirror.com/@x402/stellar/-/stellar-2.9.0.tgz",
268
+ "integrity": "sha512-VZ77WugghMuSeCsvDpK4cKt5OyDXqAnH2IPBG/FbAvwAkOyhPCPHWK/Q33NbqKDIyV8W2xB/vg12Nj7UMp/qRQ==",
269
+ "license": "Apache-2.0",
270
+ "dependencies": {
271
+ "@stellar/stellar-sdk": "^14.6.1",
272
+ "@x402/core": "2.9.0"
273
+ }
274
+ },
275
+ "node_modules/@x402/stellar/node_modules/@stellar/js-xdr": {
276
+ "version": "3.1.2",
277
+ "resolved": "https://registry.npmmirror.com/@stellar/js-xdr/-/js-xdr-3.1.2.tgz",
278
+ "integrity": "sha512-VVolPL5goVEIsvuGqDc5uiKxV03lzfWdvYg1KikvwheDmTBO68CKDji3bAZ/kppZrx5iTA8z3Ld5yuytcvhvOQ==",
279
+ "license": "Apache-2.0"
280
+ },
281
+ "node_modules/@x402/stellar/node_modules/@stellar/stellar-base": {
282
+ "version": "14.1.0",
283
+ "resolved": "https://registry.npmmirror.com/@stellar/stellar-base/-/stellar-base-14.1.0.tgz",
284
+ "integrity": "sha512-A8kFli6QGy22SRF45IjgPAJfUNGjnI+R7g4DF5NZYVsD1kGf7B4ITyc4OPclLV9tqNI4/lXxafGEw0JEUbHixw==",
285
+ "license": "Apache-2.0",
286
+ "dependencies": {
287
+ "@noble/curves": "^1.9.6",
288
+ "@stellar/js-xdr": "^3.1.2",
289
+ "base32.js": "^0.1.0",
290
+ "bignumber.js": "^9.3.1",
291
+ "buffer": "^6.0.3",
292
+ "sha.js": "^2.4.12"
293
+ },
294
+ "engines": {
295
+ "node": ">=20.0.0"
296
+ }
297
+ },
298
+ "node_modules/@x402/stellar/node_modules/@stellar/stellar-sdk": {
299
+ "version": "14.6.1",
300
+ "resolved": "https://registry.npmmirror.com/@stellar/stellar-sdk/-/stellar-sdk-14.6.1.tgz",
301
+ "integrity": "sha512-A1rQWDLdUasXkMXnYSuhgep+3ZZzyuXJKdt5/KAIc0gkmSp906HTvUpbT4pu+bVr41tu0+J4Ugz9J4BQAGGytg==",
302
+ "license": "Apache-2.0",
303
+ "dependencies": {
304
+ "@stellar/stellar-base": "^14.1.0",
305
+ "axios": "^1.13.3",
306
+ "bignumber.js": "^9.3.1",
307
+ "commander": "^14.0.2",
308
+ "eventsource": "^2.0.2",
309
+ "feaxios": "^0.0.23",
310
+ "randombytes": "^2.1.0",
311
+ "toml": "^3.0.0",
312
+ "urijs": "^1.19.1"
313
+ },
314
+ "bin": {
315
+ "stellar-js": "bin/stellar-js"
316
+ },
317
+ "engines": {
318
+ "node": ">=20.0.0"
319
+ }
320
+ },
321
+ "node_modules/abitype": {
322
+ "version": "1.2.3",
323
+ "resolved": "https://registry.npmmirror.com/abitype/-/abitype-1.2.3.tgz",
324
+ "integrity": "sha512-Ofer5QUnuUdTFsBRwARMoWKOH1ND5ehwYhJ3OJ/BQO+StkwQjHw0XyVh4vDttzHB7QOFhPHa/o413PJ82gU/Tg==",
325
+ "license": "MIT",
326
+ "funding": {
327
+ "url": "https://github.com/sponsors/wevm"
328
+ },
329
+ "peerDependencies": {
330
+ "typescript": ">=5.0.4",
331
+ "zod": "^3.22.0 || ^4.0.0"
332
+ },
333
+ "peerDependenciesMeta": {
334
+ "typescript": {
335
+ "optional": true
336
+ },
337
+ "zod": {
338
+ "optional": true
339
+ }
340
+ }
341
+ },
342
+ "node_modules/accepts": {
343
+ "version": "2.0.0",
344
+ "resolved": "https://registry.npmmirror.com/accepts/-/accepts-2.0.0.tgz",
345
+ "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==",
346
+ "license": "MIT",
347
+ "dependencies": {
348
+ "mime-types": "^3.0.0",
349
+ "negotiator": "^1.0.0"
350
+ },
351
+ "engines": {
352
+ "node": ">= 0.6"
353
+ }
354
+ },
355
+ "node_modules/aes-js": {
356
+ "version": "4.0.0-beta.5",
357
+ "resolved": "https://registry.npmmirror.com/aes-js/-/aes-js-4.0.0-beta.5.tgz",
358
+ "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==",
359
+ "license": "MIT",
360
+ "peer": true
361
+ },
362
+ "node_modules/ajv": {
363
+ "version": "8.18.0",
364
+ "resolved": "https://registry.npmmirror.com/ajv/-/ajv-8.18.0.tgz",
365
+ "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==",
366
+ "license": "MIT",
367
+ "dependencies": {
368
+ "fast-deep-equal": "^3.1.3",
369
+ "fast-uri": "^3.0.1",
370
+ "json-schema-traverse": "^1.0.0",
371
+ "require-from-string": "^2.0.2"
372
+ },
373
+ "funding": {
374
+ "type": "github",
375
+ "url": "https://github.com/sponsors/epoberezkin"
376
+ }
377
+ },
378
+ "node_modules/apg-js": {
379
+ "version": "4.4.0",
380
+ "resolved": "https://registry.npmmirror.com/apg-js/-/apg-js-4.4.0.tgz",
381
+ "integrity": "sha512-fefmXFknJmtgtNEXfPwZKYkMFX4Fyeyz+fNF6JWp87biGOPslJbCBVU158zvKRZfHBKnJDy8CMM40oLFGkXT8Q==",
382
+ "license": "BSD-2-Clause"
383
+ },
384
+ "node_modules/asynckit": {
385
+ "version": "0.4.0",
386
+ "resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz",
387
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
388
+ "license": "MIT"
389
+ },
390
+ "node_modules/available-typed-arrays": {
391
+ "version": "1.0.7",
392
+ "resolved": "https://registry.npmmirror.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz",
393
+ "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==",
394
+ "license": "MIT",
395
+ "dependencies": {
396
+ "possible-typed-array-names": "^1.0.0"
397
+ },
398
+ "engines": {
399
+ "node": ">= 0.4"
400
+ },
401
+ "funding": {
402
+ "url": "https://github.com/sponsors/ljharb"
403
+ }
404
+ },
405
+ "node_modules/axios": {
406
+ "version": "1.14.0",
407
+ "resolved": "https://registry.npmmirror.com/axios/-/axios-1.14.0.tgz",
408
+ "integrity": "sha512-3Y8yrqLSwjuzpXuZ0oIYZ/XGgLwUIBU3uLvbcpb0pidD9ctpShJd43KSlEEkVQg6DS0G9NKyzOvBfUtDKEyHvQ==",
409
+ "license": "MIT",
410
+ "dependencies": {
411
+ "follow-redirects": "^1.15.11",
412
+ "form-data": "^4.0.5",
413
+ "proxy-from-env": "^2.1.0"
414
+ }
415
+ },
416
+ "node_modules/base32.js": {
417
+ "version": "0.1.0",
418
+ "resolved": "https://registry.npmmirror.com/base32.js/-/base32.js-0.1.0.tgz",
419
+ "integrity": "sha512-n3TkB02ixgBOhTvANakDb4xaMXnYUVkNoRFJjQflcqMQhyEKxEHdj3E6N8t8sUQ0mjH/3/JxzlXuz3ul/J90pQ==",
420
+ "license": "MIT",
421
+ "engines": {
422
+ "node": ">=0.12.0"
423
+ }
424
+ },
425
+ "node_modules/base64-js": {
426
+ "version": "1.5.1",
427
+ "resolved": "https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz",
428
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
429
+ "funding": [
430
+ {
431
+ "type": "github",
432
+ "url": "https://github.com/sponsors/feross"
433
+ },
434
+ {
435
+ "type": "patreon",
436
+ "url": "https://www.patreon.com/feross"
437
+ },
438
+ {
439
+ "type": "consulting",
440
+ "url": "https://feross.org/support"
441
+ }
442
+ ],
443
+ "license": "MIT"
444
+ },
445
+ "node_modules/bignumber.js": {
446
+ "version": "9.3.1",
447
+ "resolved": "https://registry.npmmirror.com/bignumber.js/-/bignumber.js-9.3.1.tgz",
448
+ "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==",
449
+ "license": "MIT",
450
+ "engines": {
451
+ "node": "*"
452
+ }
453
+ },
454
+ "node_modules/body-parser": {
455
+ "version": "2.2.2",
456
+ "resolved": "https://registry.npmmirror.com/body-parser/-/body-parser-2.2.2.tgz",
457
+ "integrity": "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==",
458
+ "license": "MIT",
459
+ "dependencies": {
460
+ "bytes": "^3.1.2",
461
+ "content-type": "^1.0.5",
462
+ "debug": "^4.4.3",
463
+ "http-errors": "^2.0.0",
464
+ "iconv-lite": "^0.7.0",
465
+ "on-finished": "^2.4.1",
466
+ "qs": "^6.14.1",
467
+ "raw-body": "^3.0.1",
468
+ "type-is": "^2.0.1"
469
+ },
470
+ "engines": {
471
+ "node": ">=18"
472
+ },
473
+ "funding": {
474
+ "type": "opencollective",
475
+ "url": "https://opencollective.com/express"
476
+ }
477
+ },
478
+ "node_modules/buffer": {
479
+ "version": "6.0.3",
480
+ "resolved": "https://registry.npmmirror.com/buffer/-/buffer-6.0.3.tgz",
481
+ "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==",
482
+ "funding": [
483
+ {
484
+ "type": "github",
485
+ "url": "https://github.com/sponsors/feross"
486
+ },
487
+ {
488
+ "type": "patreon",
489
+ "url": "https://www.patreon.com/feross"
490
+ },
491
+ {
492
+ "type": "consulting",
493
+ "url": "https://feross.org/support"
494
+ }
495
+ ],
496
+ "license": "MIT",
497
+ "dependencies": {
498
+ "base64-js": "^1.3.1",
499
+ "ieee754": "^1.2.1"
500
+ }
501
+ },
502
+ "node_modules/bytes": {
503
+ "version": "3.1.2",
504
+ "resolved": "https://registry.npmmirror.com/bytes/-/bytes-3.1.2.tgz",
505
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
506
+ "license": "MIT",
507
+ "engines": {
508
+ "node": ">= 0.8"
509
+ }
510
+ },
511
+ "node_modules/call-bind": {
512
+ "version": "1.0.9",
513
+ "resolved": "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.9.tgz",
514
+ "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==",
515
+ "license": "MIT",
516
+ "dependencies": {
517
+ "call-bind-apply-helpers": "^1.0.2",
518
+ "es-define-property": "^1.0.1",
519
+ "get-intrinsic": "^1.3.0",
520
+ "set-function-length": "^1.2.2"
521
+ },
522
+ "engines": {
523
+ "node": ">= 0.4"
524
+ },
525
+ "funding": {
526
+ "url": "https://github.com/sponsors/ljharb"
527
+ }
528
+ },
529
+ "node_modules/call-bind-apply-helpers": {
530
+ "version": "1.0.2",
531
+ "resolved": "https://registry.npmmirror.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
532
+ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
533
+ "license": "MIT",
534
+ "dependencies": {
535
+ "es-errors": "^1.3.0",
536
+ "function-bind": "^1.1.2"
537
+ },
538
+ "engines": {
539
+ "node": ">= 0.4"
540
+ }
541
+ },
542
+ "node_modules/call-bound": {
543
+ "version": "1.0.4",
544
+ "resolved": "https://registry.npmmirror.com/call-bound/-/call-bound-1.0.4.tgz",
545
+ "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
546
+ "license": "MIT",
547
+ "dependencies": {
548
+ "call-bind-apply-helpers": "^1.0.2",
549
+ "get-intrinsic": "^1.3.0"
550
+ },
551
+ "engines": {
552
+ "node": ">= 0.4"
553
+ },
554
+ "funding": {
555
+ "url": "https://github.com/sponsors/ljharb"
556
+ }
557
+ },
558
+ "node_modules/combined-stream": {
559
+ "version": "1.0.8",
560
+ "resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz",
561
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
562
+ "license": "MIT",
563
+ "dependencies": {
564
+ "delayed-stream": "~1.0.0"
565
+ },
566
+ "engines": {
567
+ "node": ">= 0.8"
568
+ }
569
+ },
570
+ "node_modules/commander": {
571
+ "version": "14.0.3",
572
+ "resolved": "https://registry.npmmirror.com/commander/-/commander-14.0.3.tgz",
573
+ "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==",
574
+ "license": "MIT",
575
+ "engines": {
576
+ "node": ">=20"
577
+ }
578
+ },
579
+ "node_modules/content-disposition": {
580
+ "version": "1.1.0",
581
+ "resolved": "https://registry.npmmirror.com/content-disposition/-/content-disposition-1.1.0.tgz",
582
+ "integrity": "sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==",
583
+ "license": "MIT",
584
+ "engines": {
585
+ "node": ">=18"
586
+ },
587
+ "funding": {
588
+ "type": "opencollective",
589
+ "url": "https://opencollective.com/express"
590
+ }
591
+ },
592
+ "node_modules/content-type": {
593
+ "version": "1.0.5",
594
+ "resolved": "https://registry.npmmirror.com/content-type/-/content-type-1.0.5.tgz",
595
+ "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
596
+ "license": "MIT",
597
+ "engines": {
598
+ "node": ">= 0.6"
599
+ }
600
+ },
601
+ "node_modules/cookie": {
602
+ "version": "0.7.2",
603
+ "resolved": "https://registry.npmmirror.com/cookie/-/cookie-0.7.2.tgz",
604
+ "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==",
605
+ "license": "MIT",
606
+ "engines": {
607
+ "node": ">= 0.6"
608
+ }
609
+ },
610
+ "node_modules/cookie-signature": {
611
+ "version": "1.2.2",
612
+ "resolved": "https://registry.npmmirror.com/cookie-signature/-/cookie-signature-1.2.2.tgz",
613
+ "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==",
614
+ "license": "MIT",
615
+ "engines": {
616
+ "node": ">=6.6.0"
617
+ }
618
+ },
619
+ "node_modules/debug": {
620
+ "version": "4.4.3",
621
+ "resolved": "https://registry.npmmirror.com/debug/-/debug-4.4.3.tgz",
622
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
623
+ "license": "MIT",
624
+ "dependencies": {
625
+ "ms": "^2.1.3"
626
+ },
627
+ "engines": {
628
+ "node": ">=6.0"
629
+ },
630
+ "peerDependenciesMeta": {
631
+ "supports-color": {
632
+ "optional": true
633
+ }
634
+ }
635
+ },
636
+ "node_modules/define-data-property": {
637
+ "version": "1.1.4",
638
+ "resolved": "https://registry.npmmirror.com/define-data-property/-/define-data-property-1.1.4.tgz",
639
+ "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
640
+ "license": "MIT",
641
+ "dependencies": {
642
+ "es-define-property": "^1.0.0",
643
+ "es-errors": "^1.3.0",
644
+ "gopd": "^1.0.1"
645
+ },
646
+ "engines": {
647
+ "node": ">= 0.4"
648
+ },
649
+ "funding": {
650
+ "url": "https://github.com/sponsors/ljharb"
651
+ }
652
+ },
653
+ "node_modules/delayed-stream": {
654
+ "version": "1.0.0",
655
+ "resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz",
656
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
657
+ "license": "MIT",
658
+ "engines": {
659
+ "node": ">=0.4.0"
660
+ }
661
+ },
662
+ "node_modules/depd": {
663
+ "version": "2.0.0",
664
+ "resolved": "https://registry.npmmirror.com/depd/-/depd-2.0.0.tgz",
665
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
666
+ "license": "MIT",
667
+ "engines": {
668
+ "node": ">= 0.8"
669
+ }
670
+ },
671
+ "node_modules/dotenv": {
672
+ "version": "17.4.2",
673
+ "resolved": "https://registry.npmmirror.com/dotenv/-/dotenv-17.4.2.tgz",
674
+ "integrity": "sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==",
675
+ "license": "BSD-2-Clause",
676
+ "engines": {
677
+ "node": ">=12"
678
+ },
679
+ "funding": {
680
+ "url": "https://dotenvx.com"
681
+ }
682
+ },
683
+ "node_modules/dunder-proto": {
684
+ "version": "1.0.1",
685
+ "resolved": "https://registry.npmmirror.com/dunder-proto/-/dunder-proto-1.0.1.tgz",
686
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
687
+ "license": "MIT",
688
+ "dependencies": {
689
+ "call-bind-apply-helpers": "^1.0.1",
690
+ "es-errors": "^1.3.0",
691
+ "gopd": "^1.2.0"
692
+ },
693
+ "engines": {
694
+ "node": ">= 0.4"
695
+ }
696
+ },
697
+ "node_modules/ee-first": {
698
+ "version": "1.1.1",
699
+ "resolved": "https://registry.npmmirror.com/ee-first/-/ee-first-1.1.1.tgz",
700
+ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
701
+ "license": "MIT"
702
+ },
703
+ "node_modules/encodeurl": {
704
+ "version": "2.0.0",
705
+ "resolved": "https://registry.npmmirror.com/encodeurl/-/encodeurl-2.0.0.tgz",
706
+ "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
707
+ "license": "MIT",
708
+ "engines": {
709
+ "node": ">= 0.8"
710
+ }
711
+ },
712
+ "node_modules/es-define-property": {
713
+ "version": "1.0.1",
714
+ "resolved": "https://registry.npmmirror.com/es-define-property/-/es-define-property-1.0.1.tgz",
715
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
716
+ "license": "MIT",
717
+ "engines": {
718
+ "node": ">= 0.4"
719
+ }
720
+ },
721
+ "node_modules/es-errors": {
722
+ "version": "1.3.0",
723
+ "resolved": "https://registry.npmmirror.com/es-errors/-/es-errors-1.3.0.tgz",
724
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
725
+ "license": "MIT",
726
+ "engines": {
727
+ "node": ">= 0.4"
728
+ }
729
+ },
730
+ "node_modules/es-object-atoms": {
731
+ "version": "1.1.1",
732
+ "resolved": "https://registry.npmmirror.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
733
+ "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
734
+ "license": "MIT",
735
+ "dependencies": {
736
+ "es-errors": "^1.3.0"
737
+ },
738
+ "engines": {
739
+ "node": ">= 0.4"
740
+ }
741
+ },
742
+ "node_modules/es-set-tostringtag": {
743
+ "version": "2.1.0",
744
+ "resolved": "https://registry.npmmirror.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
745
+ "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
746
+ "license": "MIT",
747
+ "dependencies": {
748
+ "es-errors": "^1.3.0",
749
+ "get-intrinsic": "^1.2.6",
750
+ "has-tostringtag": "^1.0.2",
751
+ "hasown": "^2.0.2"
752
+ },
753
+ "engines": {
754
+ "node": ">= 0.4"
755
+ }
756
+ },
757
+ "node_modules/escape-html": {
758
+ "version": "1.0.3",
759
+ "resolved": "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz",
760
+ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
761
+ "license": "MIT"
762
+ },
763
+ "node_modules/etag": {
764
+ "version": "1.8.1",
765
+ "resolved": "https://registry.npmmirror.com/etag/-/etag-1.8.1.tgz",
766
+ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
767
+ "license": "MIT",
768
+ "engines": {
769
+ "node": ">= 0.6"
770
+ }
771
+ },
772
+ "node_modules/ethers": {
773
+ "version": "6.16.0",
774
+ "resolved": "https://registry.npmmirror.com/ethers/-/ethers-6.16.0.tgz",
775
+ "integrity": "sha512-U1wulmetNymijEhpSEQ7Ct/P/Jw9/e7R1j5XIbPRydgV2DjLVMsULDlNksq3RQnFgKoLlZf88ijYtWEXcPa07A==",
776
+ "funding": [
777
+ {
778
+ "type": "individual",
779
+ "url": "https://github.com/sponsors/ethers-io/"
780
+ },
781
+ {
782
+ "type": "individual",
783
+ "url": "https://www.buymeacoffee.com/ricmoo"
784
+ }
785
+ ],
786
+ "license": "MIT",
787
+ "peer": true,
788
+ "dependencies": {
789
+ "@adraffy/ens-normalize": "1.10.1",
790
+ "@noble/curves": "1.2.0",
791
+ "@noble/hashes": "1.3.2",
792
+ "@types/node": "22.7.5",
793
+ "aes-js": "4.0.0-beta.5",
794
+ "tslib": "2.7.0",
795
+ "ws": "8.17.1"
796
+ },
797
+ "engines": {
798
+ "node": ">=14.0.0"
799
+ }
800
+ },
801
+ "node_modules/ethers/node_modules/@noble/curves": {
802
+ "version": "1.2.0",
803
+ "resolved": "https://registry.npmmirror.com/@noble/curves/-/curves-1.2.0.tgz",
804
+ "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==",
805
+ "license": "MIT",
806
+ "peer": true,
807
+ "dependencies": {
808
+ "@noble/hashes": "1.3.2"
809
+ },
810
+ "funding": {
811
+ "url": "https://paulmillr.com/funding/"
812
+ }
813
+ },
814
+ "node_modules/ethers/node_modules/@noble/hashes": {
815
+ "version": "1.3.2",
816
+ "resolved": "https://registry.npmmirror.com/@noble/hashes/-/hashes-1.3.2.tgz",
817
+ "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==",
818
+ "license": "MIT",
819
+ "peer": true,
820
+ "engines": {
821
+ "node": ">= 16"
822
+ },
823
+ "funding": {
824
+ "url": "https://paulmillr.com/funding/"
825
+ }
826
+ },
827
+ "node_modules/eventemitter3": {
828
+ "version": "5.0.1",
829
+ "resolved": "https://registry.npmmirror.com/eventemitter3/-/eventemitter3-5.0.1.tgz",
830
+ "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==",
831
+ "license": "MIT"
832
+ },
833
+ "node_modules/eventsource": {
834
+ "version": "2.0.2",
835
+ "resolved": "https://registry.npmmirror.com/eventsource/-/eventsource-2.0.2.tgz",
836
+ "integrity": "sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==",
837
+ "license": "MIT",
838
+ "engines": {
839
+ "node": ">=12.0.0"
840
+ }
841
+ },
842
+ "node_modules/express": {
843
+ "version": "5.2.1",
844
+ "resolved": "https://registry.npmmirror.com/express/-/express-5.2.1.tgz",
845
+ "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==",
846
+ "license": "MIT",
847
+ "dependencies": {
848
+ "accepts": "^2.0.0",
849
+ "body-parser": "^2.2.1",
850
+ "content-disposition": "^1.0.0",
851
+ "content-type": "^1.0.5",
852
+ "cookie": "^0.7.1",
853
+ "cookie-signature": "^1.2.1",
854
+ "debug": "^4.4.0",
855
+ "depd": "^2.0.0",
856
+ "encodeurl": "^2.0.0",
857
+ "escape-html": "^1.0.3",
858
+ "etag": "^1.8.1",
859
+ "finalhandler": "^2.1.0",
860
+ "fresh": "^2.0.0",
861
+ "http-errors": "^2.0.0",
862
+ "merge-descriptors": "^2.0.0",
863
+ "mime-types": "^3.0.0",
864
+ "on-finished": "^2.4.1",
865
+ "once": "^1.4.0",
866
+ "parseurl": "^1.3.3",
867
+ "proxy-addr": "^2.0.7",
868
+ "qs": "^6.14.0",
869
+ "range-parser": "^1.2.1",
870
+ "router": "^2.2.0",
871
+ "send": "^1.1.0",
872
+ "serve-static": "^2.2.0",
873
+ "statuses": "^2.0.1",
874
+ "type-is": "^2.0.1",
875
+ "vary": "^1.1.2"
876
+ },
877
+ "engines": {
878
+ "node": ">= 18"
879
+ },
880
+ "funding": {
881
+ "type": "opencollective",
882
+ "url": "https://opencollective.com/express"
883
+ }
884
+ },
885
+ "node_modules/fast-deep-equal": {
886
+ "version": "3.1.3",
887
+ "resolved": "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
888
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
889
+ "license": "MIT"
890
+ },
891
+ "node_modules/fast-uri": {
892
+ "version": "3.1.0",
893
+ "resolved": "https://registry.npmmirror.com/fast-uri/-/fast-uri-3.1.0.tgz",
894
+ "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==",
895
+ "funding": [
896
+ {
897
+ "type": "github",
898
+ "url": "https://github.com/sponsors/fastify"
899
+ },
900
+ {
901
+ "type": "opencollective",
902
+ "url": "https://opencollective.com/fastify"
903
+ }
904
+ ],
905
+ "license": "BSD-3-Clause"
906
+ },
907
+ "node_modules/feaxios": {
908
+ "version": "0.0.23",
909
+ "resolved": "https://registry.npmmirror.com/feaxios/-/feaxios-0.0.23.tgz",
910
+ "integrity": "sha512-eghR0A21fvbkcQBgZuMfQhrXxJzC0GNUGC9fXhBge33D+mFDTwl0aJ35zoQQn575BhyjQitRc5N4f+L4cP708g==",
911
+ "license": "MIT",
912
+ "dependencies": {
913
+ "is-retry-allowed": "^3.0.0"
914
+ }
915
+ },
916
+ "node_modules/finalhandler": {
917
+ "version": "2.1.1",
918
+ "resolved": "https://registry.npmmirror.com/finalhandler/-/finalhandler-2.1.1.tgz",
919
+ "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==",
920
+ "license": "MIT",
921
+ "dependencies": {
922
+ "debug": "^4.4.0",
923
+ "encodeurl": "^2.0.0",
924
+ "escape-html": "^1.0.3",
925
+ "on-finished": "^2.4.1",
926
+ "parseurl": "^1.3.3",
927
+ "statuses": "^2.0.1"
928
+ },
929
+ "engines": {
930
+ "node": ">= 18.0.0"
931
+ },
932
+ "funding": {
933
+ "type": "opencollective",
934
+ "url": "https://opencollective.com/express"
935
+ }
936
+ },
937
+ "node_modules/follow-redirects": {
938
+ "version": "1.15.11",
939
+ "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.11.tgz",
940
+ "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==",
941
+ "funding": [
942
+ {
943
+ "type": "individual",
944
+ "url": "https://github.com/sponsors/RubenVerborgh"
945
+ }
946
+ ],
947
+ "license": "MIT",
948
+ "engines": {
949
+ "node": ">=4.0"
950
+ },
951
+ "peerDependenciesMeta": {
952
+ "debug": {
953
+ "optional": true
954
+ }
955
+ }
956
+ },
957
+ "node_modules/for-each": {
958
+ "version": "0.3.5",
959
+ "resolved": "https://registry.npmmirror.com/for-each/-/for-each-0.3.5.tgz",
960
+ "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==",
961
+ "license": "MIT",
962
+ "dependencies": {
963
+ "is-callable": "^1.2.7"
964
+ },
965
+ "engines": {
966
+ "node": ">= 0.4"
967
+ },
968
+ "funding": {
969
+ "url": "https://github.com/sponsors/ljharb"
970
+ }
971
+ },
972
+ "node_modules/form-data": {
973
+ "version": "4.0.5",
974
+ "resolved": "https://registry.npmmirror.com/form-data/-/form-data-4.0.5.tgz",
975
+ "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==",
976
+ "license": "MIT",
977
+ "dependencies": {
978
+ "asynckit": "^0.4.0",
979
+ "combined-stream": "^1.0.8",
980
+ "es-set-tostringtag": "^2.1.0",
981
+ "hasown": "^2.0.2",
982
+ "mime-types": "^2.1.12"
983
+ },
984
+ "engines": {
985
+ "node": ">= 6"
986
+ }
987
+ },
988
+ "node_modules/form-data/node_modules/mime-db": {
989
+ "version": "1.52.0",
990
+ "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz",
991
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
992
+ "license": "MIT",
993
+ "engines": {
994
+ "node": ">= 0.6"
995
+ }
996
+ },
997
+ "node_modules/form-data/node_modules/mime-types": {
998
+ "version": "2.1.35",
999
+ "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz",
1000
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
1001
+ "license": "MIT",
1002
+ "dependencies": {
1003
+ "mime-db": "1.52.0"
1004
+ },
1005
+ "engines": {
1006
+ "node": ">= 0.6"
1007
+ }
1008
+ },
1009
+ "node_modules/forwarded": {
1010
+ "version": "0.2.0",
1011
+ "resolved": "https://registry.npmmirror.com/forwarded/-/forwarded-0.2.0.tgz",
1012
+ "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
1013
+ "license": "MIT",
1014
+ "engines": {
1015
+ "node": ">= 0.6"
1016
+ }
1017
+ },
1018
+ "node_modules/fresh": {
1019
+ "version": "2.0.0",
1020
+ "resolved": "https://registry.npmmirror.com/fresh/-/fresh-2.0.0.tgz",
1021
+ "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==",
1022
+ "license": "MIT",
1023
+ "engines": {
1024
+ "node": ">= 0.8"
1025
+ }
1026
+ },
1027
+ "node_modules/fsevents": {
1028
+ "version": "2.3.2",
1029
+ "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.2.tgz",
1030
+ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
1031
+ "hasInstallScript": true,
1032
+ "license": "MIT",
1033
+ "optional": true,
1034
+ "os": [
1035
+ "darwin"
1036
+ ],
1037
+ "engines": {
1038
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
1039
+ }
1040
+ },
1041
+ "node_modules/function-bind": {
1042
+ "version": "1.1.2",
1043
+ "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz",
1044
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
1045
+ "license": "MIT",
1046
+ "funding": {
1047
+ "url": "https://github.com/sponsors/ljharb"
1048
+ }
1049
+ },
1050
+ "node_modules/get-intrinsic": {
1051
+ "version": "1.3.0",
1052
+ "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
1053
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
1054
+ "license": "MIT",
1055
+ "dependencies": {
1056
+ "call-bind-apply-helpers": "^1.0.2",
1057
+ "es-define-property": "^1.0.1",
1058
+ "es-errors": "^1.3.0",
1059
+ "es-object-atoms": "^1.1.1",
1060
+ "function-bind": "^1.1.2",
1061
+ "get-proto": "^1.0.1",
1062
+ "gopd": "^1.2.0",
1063
+ "has-symbols": "^1.1.0",
1064
+ "hasown": "^2.0.2",
1065
+ "math-intrinsics": "^1.1.0"
1066
+ },
1067
+ "engines": {
1068
+ "node": ">= 0.4"
1069
+ },
1070
+ "funding": {
1071
+ "url": "https://github.com/sponsors/ljharb"
1072
+ }
1073
+ },
1074
+ "node_modules/get-proto": {
1075
+ "version": "1.0.1",
1076
+ "resolved": "https://registry.npmmirror.com/get-proto/-/get-proto-1.0.1.tgz",
1077
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
1078
+ "license": "MIT",
1079
+ "dependencies": {
1080
+ "dunder-proto": "^1.0.1",
1081
+ "es-object-atoms": "^1.0.0"
1082
+ },
1083
+ "engines": {
1084
+ "node": ">= 0.4"
1085
+ }
1086
+ },
1087
+ "node_modules/gopd": {
1088
+ "version": "1.2.0",
1089
+ "resolved": "https://registry.npmmirror.com/gopd/-/gopd-1.2.0.tgz",
1090
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
1091
+ "license": "MIT",
1092
+ "engines": {
1093
+ "node": ">= 0.4"
1094
+ },
1095
+ "funding": {
1096
+ "url": "https://github.com/sponsors/ljharb"
1097
+ }
1098
+ },
1099
+ "node_modules/has-property-descriptors": {
1100
+ "version": "1.0.2",
1101
+ "resolved": "https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
1102
+ "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
1103
+ "license": "MIT",
1104
+ "dependencies": {
1105
+ "es-define-property": "^1.0.0"
1106
+ },
1107
+ "funding": {
1108
+ "url": "https://github.com/sponsors/ljharb"
1109
+ }
1110
+ },
1111
+ "node_modules/has-symbols": {
1112
+ "version": "1.1.0",
1113
+ "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.1.0.tgz",
1114
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
1115
+ "license": "MIT",
1116
+ "engines": {
1117
+ "node": ">= 0.4"
1118
+ },
1119
+ "funding": {
1120
+ "url": "https://github.com/sponsors/ljharb"
1121
+ }
1122
+ },
1123
+ "node_modules/has-tostringtag": {
1124
+ "version": "1.0.2",
1125
+ "resolved": "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
1126
+ "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
1127
+ "license": "MIT",
1128
+ "dependencies": {
1129
+ "has-symbols": "^1.0.3"
1130
+ },
1131
+ "engines": {
1132
+ "node": ">= 0.4"
1133
+ },
1134
+ "funding": {
1135
+ "url": "https://github.com/sponsors/ljharb"
1136
+ }
1137
+ },
1138
+ "node_modules/hasown": {
1139
+ "version": "2.0.2",
1140
+ "resolved": "https://registry.npmmirror.com/hasown/-/hasown-2.0.2.tgz",
1141
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
1142
+ "license": "MIT",
1143
+ "dependencies": {
1144
+ "function-bind": "^1.1.2"
1145
+ },
1146
+ "engines": {
1147
+ "node": ">= 0.4"
1148
+ }
1149
+ },
1150
+ "node_modules/http-errors": {
1151
+ "version": "2.0.1",
1152
+ "resolved": "https://registry.npmmirror.com/http-errors/-/http-errors-2.0.1.tgz",
1153
+ "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==",
1154
+ "license": "MIT",
1155
+ "dependencies": {
1156
+ "depd": "~2.0.0",
1157
+ "inherits": "~2.0.4",
1158
+ "setprototypeof": "~1.2.0",
1159
+ "statuses": "~2.0.2",
1160
+ "toidentifier": "~1.0.1"
1161
+ },
1162
+ "engines": {
1163
+ "node": ">= 0.8"
1164
+ },
1165
+ "funding": {
1166
+ "type": "opencollective",
1167
+ "url": "https://opencollective.com/express"
1168
+ }
1169
+ },
1170
+ "node_modules/iconv-lite": {
1171
+ "version": "0.7.2",
1172
+ "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.7.2.tgz",
1173
+ "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==",
1174
+ "license": "MIT",
1175
+ "dependencies": {
1176
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
1177
+ },
1178
+ "engines": {
1179
+ "node": ">=0.10.0"
1180
+ },
1181
+ "funding": {
1182
+ "type": "opencollective",
1183
+ "url": "https://opencollective.com/express"
1184
+ }
1185
+ },
1186
+ "node_modules/ieee754": {
1187
+ "version": "1.2.1",
1188
+ "resolved": "https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz",
1189
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
1190
+ "funding": [
1191
+ {
1192
+ "type": "github",
1193
+ "url": "https://github.com/sponsors/feross"
1194
+ },
1195
+ {
1196
+ "type": "patreon",
1197
+ "url": "https://www.patreon.com/feross"
1198
+ },
1199
+ {
1200
+ "type": "consulting",
1201
+ "url": "https://feross.org/support"
1202
+ }
1203
+ ],
1204
+ "license": "BSD-3-Clause"
1205
+ },
1206
+ "node_modules/inherits": {
1207
+ "version": "2.0.4",
1208
+ "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz",
1209
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
1210
+ "license": "ISC"
1211
+ },
1212
+ "node_modules/ipaddr.js": {
1213
+ "version": "1.9.1",
1214
+ "resolved": "https://registry.npmmirror.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
1215
+ "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
1216
+ "license": "MIT",
1217
+ "engines": {
1218
+ "node": ">= 0.10"
1219
+ }
1220
+ },
1221
+ "node_modules/is-callable": {
1222
+ "version": "1.2.7",
1223
+ "resolved": "https://registry.npmmirror.com/is-callable/-/is-callable-1.2.7.tgz",
1224
+ "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
1225
+ "license": "MIT",
1226
+ "engines": {
1227
+ "node": ">= 0.4"
1228
+ },
1229
+ "funding": {
1230
+ "url": "https://github.com/sponsors/ljharb"
1231
+ }
1232
+ },
1233
+ "node_modules/is-promise": {
1234
+ "version": "4.0.0",
1235
+ "resolved": "https://registry.npmmirror.com/is-promise/-/is-promise-4.0.0.tgz",
1236
+ "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==",
1237
+ "license": "MIT"
1238
+ },
1239
+ "node_modules/is-retry-allowed": {
1240
+ "version": "3.0.0",
1241
+ "resolved": "https://registry.npmmirror.com/is-retry-allowed/-/is-retry-allowed-3.0.0.tgz",
1242
+ "integrity": "sha512-9xH0xvoggby+u0uGF7cZXdrutWiBiaFG8ZT4YFPXL8NzkyAwX3AKGLeFQLvzDpM430+nDFBZ1LHkie/8ocL06A==",
1243
+ "license": "MIT",
1244
+ "engines": {
1245
+ "node": ">=12"
1246
+ },
1247
+ "funding": {
1248
+ "url": "https://github.com/sponsors/sindresorhus"
1249
+ }
1250
+ },
1251
+ "node_modules/is-typed-array": {
1252
+ "version": "1.1.15",
1253
+ "resolved": "https://registry.npmmirror.com/is-typed-array/-/is-typed-array-1.1.15.tgz",
1254
+ "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==",
1255
+ "license": "MIT",
1256
+ "dependencies": {
1257
+ "which-typed-array": "^1.1.16"
1258
+ },
1259
+ "engines": {
1260
+ "node": ">= 0.4"
1261
+ },
1262
+ "funding": {
1263
+ "url": "https://github.com/sponsors/ljharb"
1264
+ }
1265
+ },
1266
+ "node_modules/isarray": {
1267
+ "version": "2.0.5",
1268
+ "resolved": "https://registry.npmmirror.com/isarray/-/isarray-2.0.5.tgz",
1269
+ "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
1270
+ "license": "MIT"
1271
+ },
1272
+ "node_modules/isows": {
1273
+ "version": "1.0.7",
1274
+ "resolved": "https://registry.npmmirror.com/isows/-/isows-1.0.7.tgz",
1275
+ "integrity": "sha512-I1fSfDCZL5P0v33sVqeTDSpcstAg/N+wF5HS033mogOVIp4B+oHC7oOCsA3axAbBSGTJ8QubbNmnIRN/h8U7hg==",
1276
+ "funding": [
1277
+ {
1278
+ "type": "github",
1279
+ "url": "https://github.com/sponsors/wevm"
1280
+ }
1281
+ ],
1282
+ "license": "MIT",
1283
+ "peerDependencies": {
1284
+ "ws": "*"
1285
+ }
1286
+ },
1287
+ "node_modules/jose": {
1288
+ "version": "5.10.0",
1289
+ "resolved": "https://registry.npmmirror.com/jose/-/jose-5.10.0.tgz",
1290
+ "integrity": "sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg==",
1291
+ "license": "MIT",
1292
+ "funding": {
1293
+ "url": "https://github.com/sponsors/panva"
1294
+ }
1295
+ },
1296
+ "node_modules/json-schema-traverse": {
1297
+ "version": "1.0.0",
1298
+ "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
1299
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
1300
+ "license": "MIT"
1301
+ },
1302
+ "node_modules/math-intrinsics": {
1303
+ "version": "1.1.0",
1304
+ "resolved": "https://registry.npmmirror.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
1305
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
1306
+ "license": "MIT",
1307
+ "engines": {
1308
+ "node": ">= 0.4"
1309
+ }
1310
+ },
1311
+ "node_modules/media-typer": {
1312
+ "version": "1.1.0",
1313
+ "resolved": "https://registry.npmmirror.com/media-typer/-/media-typer-1.1.0.tgz",
1314
+ "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==",
1315
+ "license": "MIT",
1316
+ "engines": {
1317
+ "node": ">= 0.8"
1318
+ }
1319
+ },
1320
+ "node_modules/merge-descriptors": {
1321
+ "version": "2.0.0",
1322
+ "resolved": "https://registry.npmmirror.com/merge-descriptors/-/merge-descriptors-2.0.0.tgz",
1323
+ "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==",
1324
+ "license": "MIT",
1325
+ "engines": {
1326
+ "node": ">=18"
1327
+ },
1328
+ "funding": {
1329
+ "url": "https://github.com/sponsors/sindresorhus"
1330
+ }
1331
+ },
1332
+ "node_modules/mime-db": {
1333
+ "version": "1.54.0",
1334
+ "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.54.0.tgz",
1335
+ "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==",
1336
+ "license": "MIT",
1337
+ "engines": {
1338
+ "node": ">= 0.6"
1339
+ }
1340
+ },
1341
+ "node_modules/mime-types": {
1342
+ "version": "3.0.2",
1343
+ "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-3.0.2.tgz",
1344
+ "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==",
1345
+ "license": "MIT",
1346
+ "dependencies": {
1347
+ "mime-db": "^1.54.0"
1348
+ },
1349
+ "engines": {
1350
+ "node": ">=18"
1351
+ },
1352
+ "funding": {
1353
+ "type": "opencollective",
1354
+ "url": "https://opencollective.com/express"
1355
+ }
1356
+ },
1357
+ "node_modules/ms": {
1358
+ "version": "2.1.3",
1359
+ "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz",
1360
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
1361
+ "license": "MIT"
1362
+ },
1363
+ "node_modules/negotiator": {
1364
+ "version": "1.0.0",
1365
+ "resolved": "https://registry.npmmirror.com/negotiator/-/negotiator-1.0.0.tgz",
1366
+ "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==",
1367
+ "license": "MIT",
1368
+ "engines": {
1369
+ "node": ">= 0.6"
1370
+ }
1371
+ },
1372
+ "node_modules/object-inspect": {
1373
+ "version": "1.13.4",
1374
+ "resolved": "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.13.4.tgz",
1375
+ "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
1376
+ "license": "MIT",
1377
+ "engines": {
1378
+ "node": ">= 0.4"
1379
+ },
1380
+ "funding": {
1381
+ "url": "https://github.com/sponsors/ljharb"
1382
+ }
1383
+ },
1384
+ "node_modules/on-finished": {
1385
+ "version": "2.4.1",
1386
+ "resolved": "https://registry.npmmirror.com/on-finished/-/on-finished-2.4.1.tgz",
1387
+ "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
1388
+ "license": "MIT",
1389
+ "dependencies": {
1390
+ "ee-first": "1.1.1"
1391
+ },
1392
+ "engines": {
1393
+ "node": ">= 0.8"
1394
+ }
1395
+ },
1396
+ "node_modules/once": {
1397
+ "version": "1.4.0",
1398
+ "resolved": "https://registry.npmmirror.com/once/-/once-1.4.0.tgz",
1399
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
1400
+ "license": "ISC",
1401
+ "dependencies": {
1402
+ "wrappy": "1"
1403
+ }
1404
+ },
1405
+ "node_modules/ox": {
1406
+ "version": "0.14.15",
1407
+ "resolved": "https://registry.npmmirror.com/ox/-/ox-0.14.15.tgz",
1408
+ "integrity": "sha512-3TubCmbKen/cuZQzX0qDbOS5lojjdSZ90lqKxWIDWd5siuJ0IJBaTXMYs8eMPLcraqnOwGZazz3apHPGiRCkGQ==",
1409
+ "funding": [
1410
+ {
1411
+ "type": "github",
1412
+ "url": "https://github.com/sponsors/wevm"
1413
+ }
1414
+ ],
1415
+ "license": "MIT",
1416
+ "dependencies": {
1417
+ "@adraffy/ens-normalize": "^1.11.0",
1418
+ "@noble/ciphers": "^1.3.0",
1419
+ "@noble/curves": "1.9.1",
1420
+ "@noble/hashes": "^1.8.0",
1421
+ "@scure/bip32": "^1.7.0",
1422
+ "@scure/bip39": "^1.6.0",
1423
+ "abitype": "^1.2.3",
1424
+ "eventemitter3": "5.0.1"
1425
+ },
1426
+ "peerDependencies": {
1427
+ "typescript": ">=5.4.0"
1428
+ },
1429
+ "peerDependenciesMeta": {
1430
+ "typescript": {
1431
+ "optional": true
1432
+ }
1433
+ }
1434
+ },
1435
+ "node_modules/ox/node_modules/@adraffy/ens-normalize": {
1436
+ "version": "1.11.1",
1437
+ "resolved": "https://registry.npmmirror.com/@adraffy/ens-normalize/-/ens-normalize-1.11.1.tgz",
1438
+ "integrity": "sha512-nhCBV3quEgesuf7c7KYfperqSS14T8bYuvJ8PcLJp6znkZpFc0AuW4qBtr8eKVyPPe/8RSr7sglCWPU5eaxwKQ==",
1439
+ "license": "MIT"
1440
+ },
1441
+ "node_modules/ox/node_modules/@noble/curves": {
1442
+ "version": "1.9.1",
1443
+ "resolved": "https://registry.npmmirror.com/@noble/curves/-/curves-1.9.1.tgz",
1444
+ "integrity": "sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==",
1445
+ "license": "MIT",
1446
+ "dependencies": {
1447
+ "@noble/hashes": "1.8.0"
1448
+ },
1449
+ "engines": {
1450
+ "node": "^14.21.3 || >=16"
1451
+ },
1452
+ "funding": {
1453
+ "url": "https://paulmillr.com/funding/"
1454
+ }
1455
+ },
1456
+ "node_modules/parseurl": {
1457
+ "version": "1.3.3",
1458
+ "resolved": "https://registry.npmmirror.com/parseurl/-/parseurl-1.3.3.tgz",
1459
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
1460
+ "license": "MIT",
1461
+ "engines": {
1462
+ "node": ">= 0.8"
1463
+ }
1464
+ },
1465
+ "node_modules/path-to-regexp": {
1466
+ "version": "8.4.2",
1467
+ "resolved": "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-8.4.2.tgz",
1468
+ "integrity": "sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==",
1469
+ "license": "MIT",
1470
+ "funding": {
1471
+ "type": "opencollective",
1472
+ "url": "https://opencollective.com/express"
1473
+ }
1474
+ },
1475
+ "node_modules/playwright": {
1476
+ "version": "1.59.1",
1477
+ "resolved": "https://registry.npmmirror.com/playwright/-/playwright-1.59.1.tgz",
1478
+ "integrity": "sha512-C8oWjPR3F81yljW9o5OxcWzfh6avkVwDD2VYdwIGqTkl+OGFISgypqzfu7dOe4QNLL2aqcWBmI3PMtLIK233lw==",
1479
+ "license": "Apache-2.0",
1480
+ "dependencies": {
1481
+ "playwright-core": "1.59.1"
1482
+ },
1483
+ "bin": {
1484
+ "playwright": "cli.js"
1485
+ },
1486
+ "engines": {
1487
+ "node": ">=18"
1488
+ },
1489
+ "optionalDependencies": {
1490
+ "fsevents": "2.3.2"
1491
+ }
1492
+ },
1493
+ "node_modules/playwright-core": {
1494
+ "version": "1.59.1",
1495
+ "resolved": "https://registry.npmmirror.com/playwright-core/-/playwright-core-1.59.1.tgz",
1496
+ "integrity": "sha512-HBV/RJg81z5BiiZ9yPzIiClYV/QMsDCKUyogwH9p3MCP6IYjUFu/MActgYAvK0oWyV9NlwM3GLBjADyWgydVyg==",
1497
+ "license": "Apache-2.0",
1498
+ "bin": {
1499
+ "playwright-core": "cli.js"
1500
+ },
1501
+ "engines": {
1502
+ "node": ">=18"
1503
+ }
1504
+ },
1505
+ "node_modules/possible-typed-array-names": {
1506
+ "version": "1.1.0",
1507
+ "resolved": "https://registry.npmmirror.com/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz",
1508
+ "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==",
1509
+ "license": "MIT",
1510
+ "engines": {
1511
+ "node": ">= 0.4"
1512
+ }
1513
+ },
1514
+ "node_modules/proxy-addr": {
1515
+ "version": "2.0.7",
1516
+ "resolved": "https://registry.npmmirror.com/proxy-addr/-/proxy-addr-2.0.7.tgz",
1517
+ "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
1518
+ "license": "MIT",
1519
+ "dependencies": {
1520
+ "forwarded": "0.2.0",
1521
+ "ipaddr.js": "1.9.1"
1522
+ },
1523
+ "engines": {
1524
+ "node": ">= 0.10"
1525
+ }
1526
+ },
1527
+ "node_modules/proxy-from-env": {
1528
+ "version": "2.1.0",
1529
+ "resolved": "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-2.1.0.tgz",
1530
+ "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==",
1531
+ "license": "MIT",
1532
+ "engines": {
1533
+ "node": ">=10"
1534
+ }
1535
+ },
1536
+ "node_modules/punycode": {
1537
+ "version": "2.3.1",
1538
+ "resolved": "https://registry.npmmirror.com/punycode/-/punycode-2.3.1.tgz",
1539
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
1540
+ "license": "MIT",
1541
+ "engines": {
1542
+ "node": ">=6"
1543
+ }
1544
+ },
1545
+ "node_modules/qs": {
1546
+ "version": "6.15.1",
1547
+ "resolved": "https://registry.npmmirror.com/qs/-/qs-6.15.1.tgz",
1548
+ "integrity": "sha512-6YHEFRL9mfgcAvql/XhwTvf5jKcOiiupt2FiJxHkiX1z4j7WL8J/jRHYLluORvc1XxB5rV20KoeK00gVJamspg==",
1549
+ "license": "BSD-3-Clause",
1550
+ "dependencies": {
1551
+ "side-channel": "^1.1.0"
1552
+ },
1553
+ "engines": {
1554
+ "node": ">=0.6"
1555
+ },
1556
+ "funding": {
1557
+ "url": "https://github.com/sponsors/ljharb"
1558
+ }
1559
+ },
1560
+ "node_modules/randombytes": {
1561
+ "version": "2.1.0",
1562
+ "resolved": "https://registry.npmmirror.com/randombytes/-/randombytes-2.1.0.tgz",
1563
+ "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
1564
+ "license": "MIT",
1565
+ "dependencies": {
1566
+ "safe-buffer": "^5.1.0"
1567
+ }
1568
+ },
1569
+ "node_modules/range-parser": {
1570
+ "version": "1.2.1",
1571
+ "resolved": "https://registry.npmmirror.com/range-parser/-/range-parser-1.2.1.tgz",
1572
+ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
1573
+ "license": "MIT",
1574
+ "engines": {
1575
+ "node": ">= 0.6"
1576
+ }
1577
+ },
1578
+ "node_modules/raw-body": {
1579
+ "version": "3.0.2",
1580
+ "resolved": "https://registry.npmmirror.com/raw-body/-/raw-body-3.0.2.tgz",
1581
+ "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==",
1582
+ "license": "MIT",
1583
+ "dependencies": {
1584
+ "bytes": "~3.1.2",
1585
+ "http-errors": "~2.0.1",
1586
+ "iconv-lite": "~0.7.0",
1587
+ "unpipe": "~1.0.0"
1588
+ },
1589
+ "engines": {
1590
+ "node": ">= 0.10"
1591
+ }
1592
+ },
1593
+ "node_modules/require-from-string": {
1594
+ "version": "2.0.2",
1595
+ "resolved": "https://registry.npmmirror.com/require-from-string/-/require-from-string-2.0.2.tgz",
1596
+ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
1597
+ "license": "MIT",
1598
+ "engines": {
1599
+ "node": ">=0.10.0"
1600
+ }
1601
+ },
1602
+ "node_modules/router": {
1603
+ "version": "2.2.0",
1604
+ "resolved": "https://registry.npmmirror.com/router/-/router-2.2.0.tgz",
1605
+ "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==",
1606
+ "license": "MIT",
1607
+ "dependencies": {
1608
+ "debug": "^4.4.0",
1609
+ "depd": "^2.0.0",
1610
+ "is-promise": "^4.0.0",
1611
+ "parseurl": "^1.3.3",
1612
+ "path-to-regexp": "^8.0.0"
1613
+ },
1614
+ "engines": {
1615
+ "node": ">= 18"
1616
+ }
1617
+ },
1618
+ "node_modules/safe-buffer": {
1619
+ "version": "5.2.1",
1620
+ "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz",
1621
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
1622
+ "funding": [
1623
+ {
1624
+ "type": "github",
1625
+ "url": "https://github.com/sponsors/feross"
1626
+ },
1627
+ {
1628
+ "type": "patreon",
1629
+ "url": "https://www.patreon.com/feross"
1630
+ },
1631
+ {
1632
+ "type": "consulting",
1633
+ "url": "https://feross.org/support"
1634
+ }
1635
+ ],
1636
+ "license": "MIT"
1637
+ },
1638
+ "node_modules/safer-buffer": {
1639
+ "version": "2.1.2",
1640
+ "resolved": "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz",
1641
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
1642
+ "license": "MIT"
1643
+ },
1644
+ "node_modules/send": {
1645
+ "version": "1.2.1",
1646
+ "resolved": "https://registry.npmmirror.com/send/-/send-1.2.1.tgz",
1647
+ "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==",
1648
+ "license": "MIT",
1649
+ "dependencies": {
1650
+ "debug": "^4.4.3",
1651
+ "encodeurl": "^2.0.0",
1652
+ "escape-html": "^1.0.3",
1653
+ "etag": "^1.8.1",
1654
+ "fresh": "^2.0.0",
1655
+ "http-errors": "^2.0.1",
1656
+ "mime-types": "^3.0.2",
1657
+ "ms": "^2.1.3",
1658
+ "on-finished": "^2.4.1",
1659
+ "range-parser": "^1.2.1",
1660
+ "statuses": "^2.0.2"
1661
+ },
1662
+ "engines": {
1663
+ "node": ">= 18"
1664
+ },
1665
+ "funding": {
1666
+ "type": "opencollective",
1667
+ "url": "https://opencollective.com/express"
1668
+ }
1669
+ },
1670
+ "node_modules/serve-static": {
1671
+ "version": "2.2.1",
1672
+ "resolved": "https://registry.npmmirror.com/serve-static/-/serve-static-2.2.1.tgz",
1673
+ "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==",
1674
+ "license": "MIT",
1675
+ "dependencies": {
1676
+ "encodeurl": "^2.0.0",
1677
+ "escape-html": "^1.0.3",
1678
+ "parseurl": "^1.3.3",
1679
+ "send": "^1.2.0"
1680
+ },
1681
+ "engines": {
1682
+ "node": ">= 18"
1683
+ },
1684
+ "funding": {
1685
+ "type": "opencollective",
1686
+ "url": "https://opencollective.com/express"
1687
+ }
1688
+ },
1689
+ "node_modules/set-function-length": {
1690
+ "version": "1.2.2",
1691
+ "resolved": "https://registry.npmmirror.com/set-function-length/-/set-function-length-1.2.2.tgz",
1692
+ "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
1693
+ "license": "MIT",
1694
+ "dependencies": {
1695
+ "define-data-property": "^1.1.4",
1696
+ "es-errors": "^1.3.0",
1697
+ "function-bind": "^1.1.2",
1698
+ "get-intrinsic": "^1.2.4",
1699
+ "gopd": "^1.0.1",
1700
+ "has-property-descriptors": "^1.0.2"
1701
+ },
1702
+ "engines": {
1703
+ "node": ">= 0.4"
1704
+ }
1705
+ },
1706
+ "node_modules/setprototypeof": {
1707
+ "version": "1.2.0",
1708
+ "resolved": "https://registry.npmmirror.com/setprototypeof/-/setprototypeof-1.2.0.tgz",
1709
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
1710
+ "license": "ISC"
1711
+ },
1712
+ "node_modules/sha.js": {
1713
+ "version": "2.4.12",
1714
+ "resolved": "https://registry.npmmirror.com/sha.js/-/sha.js-2.4.12.tgz",
1715
+ "integrity": "sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==",
1716
+ "license": "(MIT AND BSD-3-Clause)",
1717
+ "dependencies": {
1718
+ "inherits": "^2.0.4",
1719
+ "safe-buffer": "^5.2.1",
1720
+ "to-buffer": "^1.2.0"
1721
+ },
1722
+ "bin": {
1723
+ "sha.js": "bin.js"
1724
+ },
1725
+ "engines": {
1726
+ "node": ">= 0.10"
1727
+ },
1728
+ "funding": {
1729
+ "url": "https://github.com/sponsors/ljharb"
1730
+ }
1731
+ },
1732
+ "node_modules/side-channel": {
1733
+ "version": "1.1.0",
1734
+ "resolved": "https://registry.npmmirror.com/side-channel/-/side-channel-1.1.0.tgz",
1735
+ "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
1736
+ "license": "MIT",
1737
+ "dependencies": {
1738
+ "es-errors": "^1.3.0",
1739
+ "object-inspect": "^1.13.3",
1740
+ "side-channel-list": "^1.0.0",
1741
+ "side-channel-map": "^1.0.1",
1742
+ "side-channel-weakmap": "^1.0.2"
1743
+ },
1744
+ "engines": {
1745
+ "node": ">= 0.4"
1746
+ },
1747
+ "funding": {
1748
+ "url": "https://github.com/sponsors/ljharb"
1749
+ }
1750
+ },
1751
+ "node_modules/side-channel-list": {
1752
+ "version": "1.0.1",
1753
+ "resolved": "https://registry.npmmirror.com/side-channel-list/-/side-channel-list-1.0.1.tgz",
1754
+ "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==",
1755
+ "license": "MIT",
1756
+ "dependencies": {
1757
+ "es-errors": "^1.3.0",
1758
+ "object-inspect": "^1.13.4"
1759
+ },
1760
+ "engines": {
1761
+ "node": ">= 0.4"
1762
+ },
1763
+ "funding": {
1764
+ "url": "https://github.com/sponsors/ljharb"
1765
+ }
1766
+ },
1767
+ "node_modules/side-channel-map": {
1768
+ "version": "1.0.1",
1769
+ "resolved": "https://registry.npmmirror.com/side-channel-map/-/side-channel-map-1.0.1.tgz",
1770
+ "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
1771
+ "license": "MIT",
1772
+ "dependencies": {
1773
+ "call-bound": "^1.0.2",
1774
+ "es-errors": "^1.3.0",
1775
+ "get-intrinsic": "^1.2.5",
1776
+ "object-inspect": "^1.13.3"
1777
+ },
1778
+ "engines": {
1779
+ "node": ">= 0.4"
1780
+ },
1781
+ "funding": {
1782
+ "url": "https://github.com/sponsors/ljharb"
1783
+ }
1784
+ },
1785
+ "node_modules/side-channel-weakmap": {
1786
+ "version": "1.0.2",
1787
+ "resolved": "https://registry.npmmirror.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
1788
+ "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
1789
+ "license": "MIT",
1790
+ "dependencies": {
1791
+ "call-bound": "^1.0.2",
1792
+ "es-errors": "^1.3.0",
1793
+ "get-intrinsic": "^1.2.5",
1794
+ "object-inspect": "^1.13.3",
1795
+ "side-channel-map": "^1.0.1"
1796
+ },
1797
+ "engines": {
1798
+ "node": ">= 0.4"
1799
+ },
1800
+ "funding": {
1801
+ "url": "https://github.com/sponsors/ljharb"
1802
+ }
1803
+ },
1804
+ "node_modules/siwe": {
1805
+ "version": "2.3.2",
1806
+ "resolved": "https://registry.npmmirror.com/siwe/-/siwe-2.3.2.tgz",
1807
+ "integrity": "sha512-aSf+6+Latyttbj5nMu6GF3doMfv2UYj83hhwZgUF20ky6fTS83uVhkQABdIVnEuS8y1bBdk7p6ltb9SmlhTTlA==",
1808
+ "license": "Apache-2.0",
1809
+ "dependencies": {
1810
+ "@spruceid/siwe-parser": "^2.1.2",
1811
+ "@stablelib/random": "^1.0.1",
1812
+ "uri-js": "^4.4.1",
1813
+ "valid-url": "^1.0.9"
1814
+ },
1815
+ "peerDependencies": {
1816
+ "ethers": "^5.6.8 || ^6.0.8"
1817
+ }
1818
+ },
1819
+ "node_modules/statuses": {
1820
+ "version": "2.0.2",
1821
+ "resolved": "https://registry.npmmirror.com/statuses/-/statuses-2.0.2.tgz",
1822
+ "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==",
1823
+ "license": "MIT",
1824
+ "engines": {
1825
+ "node": ">= 0.8"
1826
+ }
1827
+ },
1828
+ "node_modules/to-buffer": {
1829
+ "version": "1.2.2",
1830
+ "resolved": "https://registry.npmmirror.com/to-buffer/-/to-buffer-1.2.2.tgz",
1831
+ "integrity": "sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==",
1832
+ "license": "MIT",
1833
+ "dependencies": {
1834
+ "isarray": "^2.0.5",
1835
+ "safe-buffer": "^5.2.1",
1836
+ "typed-array-buffer": "^1.0.3"
1837
+ },
1838
+ "engines": {
1839
+ "node": ">= 0.4"
1840
+ }
1841
+ },
1842
+ "node_modules/toidentifier": {
1843
+ "version": "1.0.1",
1844
+ "resolved": "https://registry.npmmirror.com/toidentifier/-/toidentifier-1.0.1.tgz",
1845
+ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
1846
+ "license": "MIT",
1847
+ "engines": {
1848
+ "node": ">=0.6"
1849
+ }
1850
+ },
1851
+ "node_modules/toml": {
1852
+ "version": "3.0.0",
1853
+ "resolved": "https://registry.npmmirror.com/toml/-/toml-3.0.0.tgz",
1854
+ "integrity": "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==",
1855
+ "license": "MIT"
1856
+ },
1857
+ "node_modules/tslib": {
1858
+ "version": "2.7.0",
1859
+ "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.7.0.tgz",
1860
+ "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==",
1861
+ "license": "0BSD",
1862
+ "peer": true
1863
+ },
1864
+ "node_modules/tweetnacl": {
1865
+ "version": "1.0.3",
1866
+ "resolved": "https://registry.npmmirror.com/tweetnacl/-/tweetnacl-1.0.3.tgz",
1867
+ "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==",
1868
+ "license": "Unlicense"
1869
+ },
1870
+ "node_modules/type-is": {
1871
+ "version": "2.0.1",
1872
+ "resolved": "https://registry.npmmirror.com/type-is/-/type-is-2.0.1.tgz",
1873
+ "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==",
1874
+ "license": "MIT",
1875
+ "dependencies": {
1876
+ "content-type": "^1.0.5",
1877
+ "media-typer": "^1.1.0",
1878
+ "mime-types": "^3.0.0"
1879
+ },
1880
+ "engines": {
1881
+ "node": ">= 0.6"
1882
+ }
1883
+ },
1884
+ "node_modules/typed-array-buffer": {
1885
+ "version": "1.0.3",
1886
+ "resolved": "https://registry.npmmirror.com/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz",
1887
+ "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==",
1888
+ "license": "MIT",
1889
+ "dependencies": {
1890
+ "call-bound": "^1.0.3",
1891
+ "es-errors": "^1.3.0",
1892
+ "is-typed-array": "^1.1.14"
1893
+ },
1894
+ "engines": {
1895
+ "node": ">= 0.4"
1896
+ }
1897
+ },
1898
+ "node_modules/undici-types": {
1899
+ "version": "6.19.8",
1900
+ "resolved": "https://registry.npmmirror.com/undici-types/-/undici-types-6.19.8.tgz",
1901
+ "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==",
1902
+ "license": "MIT",
1903
+ "peer": true
1904
+ },
1905
+ "node_modules/unpipe": {
1906
+ "version": "1.0.0",
1907
+ "resolved": "https://registry.npmmirror.com/unpipe/-/unpipe-1.0.0.tgz",
1908
+ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
1909
+ "license": "MIT",
1910
+ "engines": {
1911
+ "node": ">= 0.8"
1912
+ }
1913
+ },
1914
+ "node_modules/uri-js": {
1915
+ "version": "4.4.1",
1916
+ "resolved": "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz",
1917
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
1918
+ "license": "BSD-2-Clause",
1919
+ "dependencies": {
1920
+ "punycode": "^2.1.0"
1921
+ }
1922
+ },
1923
+ "node_modules/urijs": {
1924
+ "version": "1.19.11",
1925
+ "resolved": "https://registry.npmmirror.com/urijs/-/urijs-1.19.11.tgz",
1926
+ "integrity": "sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ==",
1927
+ "license": "MIT"
1928
+ },
1929
+ "node_modules/valid-url": {
1930
+ "version": "1.0.9",
1931
+ "resolved": "https://registry.npmmirror.com/valid-url/-/valid-url-1.0.9.tgz",
1932
+ "integrity": "sha512-QQDsV8OnSf5Uc30CKSwG9lnhMPe6exHtTXLRYX8uMwKENy640pU+2BgBL0LRbDh/eYRahNCS7aewCx0wf3NYVA=="
1933
+ },
1934
+ "node_modules/vary": {
1935
+ "version": "1.1.2",
1936
+ "resolved": "https://registry.npmmirror.com/vary/-/vary-1.1.2.tgz",
1937
+ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
1938
+ "license": "MIT",
1939
+ "engines": {
1940
+ "node": ">= 0.8"
1941
+ }
1942
+ },
1943
+ "node_modules/viem": {
1944
+ "version": "2.47.14",
1945
+ "resolved": "https://registry.npmmirror.com/viem/-/viem-2.47.14.tgz",
1946
+ "integrity": "sha512-PHmJF1dfa9HEfrVshFXFkixzh/22Z3VFXN1omeFfjMoOFDGQkghsRdDW+KcE29gzM7KZ+MC04L+xpbm2G/kOkw==",
1947
+ "funding": [
1948
+ {
1949
+ "type": "github",
1950
+ "url": "https://github.com/sponsors/wevm"
1951
+ }
1952
+ ],
1953
+ "license": "MIT",
1954
+ "dependencies": {
1955
+ "@noble/curves": "1.9.1",
1956
+ "@noble/hashes": "1.8.0",
1957
+ "@scure/bip32": "1.7.0",
1958
+ "@scure/bip39": "1.6.0",
1959
+ "abitype": "1.2.3",
1960
+ "isows": "1.0.7",
1961
+ "ox": "0.14.15",
1962
+ "ws": "8.18.3"
1963
+ },
1964
+ "peerDependencies": {
1965
+ "typescript": ">=5.0.4"
1966
+ },
1967
+ "peerDependenciesMeta": {
1968
+ "typescript": {
1969
+ "optional": true
1970
+ }
1971
+ }
1972
+ },
1973
+ "node_modules/viem/node_modules/@noble/curves": {
1974
+ "version": "1.9.1",
1975
+ "resolved": "https://registry.npmmirror.com/@noble/curves/-/curves-1.9.1.tgz",
1976
+ "integrity": "sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==",
1977
+ "license": "MIT",
1978
+ "dependencies": {
1979
+ "@noble/hashes": "1.8.0"
1980
+ },
1981
+ "engines": {
1982
+ "node": "^14.21.3 || >=16"
1983
+ },
1984
+ "funding": {
1985
+ "url": "https://paulmillr.com/funding/"
1986
+ }
1987
+ },
1988
+ "node_modules/viem/node_modules/ws": {
1989
+ "version": "8.18.3",
1990
+ "resolved": "https://registry.npmmirror.com/ws/-/ws-8.18.3.tgz",
1991
+ "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==",
1992
+ "license": "MIT",
1993
+ "engines": {
1994
+ "node": ">=10.0.0"
1995
+ },
1996
+ "peerDependencies": {
1997
+ "bufferutil": "^4.0.1",
1998
+ "utf-8-validate": ">=5.0.2"
1999
+ },
2000
+ "peerDependenciesMeta": {
2001
+ "bufferutil": {
2002
+ "optional": true
2003
+ },
2004
+ "utf-8-validate": {
2005
+ "optional": true
2006
+ }
2007
+ }
2008
+ },
2009
+ "node_modules/which-typed-array": {
2010
+ "version": "1.1.20",
2011
+ "resolved": "https://registry.npmmirror.com/which-typed-array/-/which-typed-array-1.1.20.tgz",
2012
+ "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==",
2013
+ "license": "MIT",
2014
+ "dependencies": {
2015
+ "available-typed-arrays": "^1.0.7",
2016
+ "call-bind": "^1.0.8",
2017
+ "call-bound": "^1.0.4",
2018
+ "for-each": "^0.3.5",
2019
+ "get-proto": "^1.0.1",
2020
+ "gopd": "^1.2.0",
2021
+ "has-tostringtag": "^1.0.2"
2022
+ },
2023
+ "engines": {
2024
+ "node": ">= 0.4"
2025
+ },
2026
+ "funding": {
2027
+ "url": "https://github.com/sponsors/ljharb"
2028
+ }
2029
+ },
2030
+ "node_modules/wrappy": {
2031
+ "version": "1.0.2",
2032
+ "resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz",
2033
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
2034
+ "license": "ISC"
2035
+ },
2036
+ "node_modules/ws": {
2037
+ "version": "8.17.1",
2038
+ "resolved": "https://registry.npmmirror.com/ws/-/ws-8.17.1.tgz",
2039
+ "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==",
2040
+ "license": "MIT",
2041
+ "peer": true,
2042
+ "engines": {
2043
+ "node": ">=10.0.0"
2044
+ },
2045
+ "peerDependencies": {
2046
+ "bufferutil": "^4.0.1",
2047
+ "utf-8-validate": ">=5.0.2"
2048
+ },
2049
+ "peerDependenciesMeta": {
2050
+ "bufferutil": {
2051
+ "optional": true
2052
+ },
2053
+ "utf-8-validate": {
2054
+ "optional": true
2055
+ }
2056
+ }
2057
+ },
2058
+ "node_modules/zod": {
2059
+ "version": "3.25.76",
2060
+ "resolved": "https://registry.npmmirror.com/zod/-/zod-3.25.76.tgz",
2061
+ "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==",
2062
+ "license": "MIT",
2063
+ "funding": {
2064
+ "url": "https://github.com/sponsors/colinhacks"
2065
+ }
2066
+ }
2067
+ }
2068
+ }
package.json ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "rendergate",
3
+ "version": "1.0.0",
4
+ "description": "Pay-per-render headless browser API powered by x402 micropayments on Stellar",
5
+ "main": "server.js",
6
+ "scripts": {
7
+ "start": "node server.js",
8
+ "demo": "node demo-client.js"
9
+ },
10
+ "keywords": ["x402", "stellar", "render", "headless-browser", "micropayments"],
11
+ "author": "tantk",
12
+ "license": "MIT",
13
+ "type": "module",
14
+ "dependencies": {
15
+ "@stellar/stellar-sdk": "^15.0.1",
16
+ "@x402/core": "^2.9.0",
17
+ "@x402/express": "^2.9.0",
18
+ "@x402/fetch": "^2.9.0",
19
+ "@x402/stellar": "^2.9.0",
20
+ "dotenv": "^17.4.2",
21
+ "express": "^5.2.1",
22
+ "playwright": "^1.59.1"
23
+ }
24
+ }
renderer.js ADDED
@@ -0,0 +1,98 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { chromium } from "playwright";
2
+
3
+ const MAX_CONCURRENT = 3;
4
+ const MAX_CONTENT_LENGTH = 100_000;
5
+ let browserPromise = null;
6
+ let activeRenders = 0;
7
+
8
+ async function getBrowser() {
9
+ if (!browserPromise) {
10
+ browserPromise = chromium.launch({ headless: true }).catch((err) => {
11
+ browserPromise = null;
12
+ throw err;
13
+ });
14
+ }
15
+ return browserPromise;
16
+ }
17
+
18
+ export async function renderUrl(url, { timeout = 30000, scroll = true } = {}) {
19
+ if (activeRenders >= MAX_CONCURRENT) {
20
+ throw new Error("Too many concurrent renders, try again later");
21
+ }
22
+ activeRenders++;
23
+
24
+ let page;
25
+ try {
26
+ const b = await getBrowser();
27
+ page = await b.newPage();
28
+ } catch (err) {
29
+ activeRenders--;
30
+ browserPromise = null; // Reset on browser failure
31
+ throw new Error(`Browser launch failed: ${err.message}`);
32
+ }
33
+
34
+ try {
35
+ await page.setExtraHTTPHeaders({
36
+ "User-Agent":
37
+ "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
38
+ });
39
+
40
+ await page.goto(url, { waitUntil: "domcontentloaded", timeout });
41
+
42
+ // Smart wait: poll until content stabilizes
43
+ let prevLen = 0;
44
+ let stableCount = 0;
45
+ for (let i = 0; i < 20; i++) {
46
+ await page.waitForTimeout(250);
47
+ const curLen = await page.evaluate(() => document.body.innerText.length);
48
+ if (curLen === prevLen && curLen > 100) {
49
+ stableCount++;
50
+ if (stableCount >= 2) break;
51
+ } else {
52
+ stableCount = 0;
53
+ }
54
+ prevLen = curLen;
55
+ }
56
+
57
+ // Scroll to trigger lazy-loaded content
58
+ if (scroll) {
59
+ for (let i = 0; i < 3; i++) {
60
+ await page.evaluate(() => window.scrollBy(0, 1000));
61
+ await page.waitForTimeout(500);
62
+ }
63
+ await page.waitForTimeout(500);
64
+ }
65
+
66
+ const title = await page.title();
67
+ let content = await page.evaluate(() => {
68
+ const remove = document.querySelectorAll(
69
+ 'script, style, nav[aria-label="Footer"], [role="complementary"]',
70
+ );
71
+ remove.forEach((el) => el.remove());
72
+ return document.body.innerText;
73
+ });
74
+
75
+ if (content.length > MAX_CONTENT_LENGTH) {
76
+ content = content.slice(0, MAX_CONTENT_LENGTH);
77
+ }
78
+
79
+ return { title, content, url, renderedAt: new Date().toISOString() };
80
+ } catch (err) {
81
+ // If page interaction fails, browser may be dead
82
+ if (err.message?.includes("Target closed") || err.message?.includes("Browser closed")) {
83
+ browserPromise = null;
84
+ }
85
+ throw err;
86
+ } finally {
87
+ activeRenders--;
88
+ await page.close().catch(() => {});
89
+ }
90
+ }
91
+
92
+ export async function closeBrowser() {
93
+ if (browserPromise) {
94
+ const b = await browserPromise.catch(() => null);
95
+ if (b) await b.close().catch(() => {});
96
+ browserPromise = null;
97
+ }
98
+ }
server.js ADDED
@@ -0,0 +1,127 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import "dotenv/config";
2
+ import express from "express";
3
+ import { paymentMiddlewareFromConfig } from "@x402/express";
4
+ import { HTTPFacilitatorClient } from "@x402/core/server";
5
+ import { ExactStellarScheme } from "@x402/stellar/exact/server";
6
+ import { renderUrl, closeBrowser } from "./renderer.js";
7
+
8
+ const PORT = process.env.PORT || 3001;
9
+ const PRICE = "$0.001";
10
+ const NETWORK = "stellar:testnet";
11
+ const FACILITATOR_URL = "https://www.x402.org/facilitator";
12
+ const PAY_TO = process.env.PAY_TO;
13
+
14
+ if (!PAY_TO) {
15
+ console.error("ERROR: PAY_TO not set in .env");
16
+ process.exit(1);
17
+ }
18
+
19
+ function isAllowedUrl(urlStr) {
20
+ try {
21
+ const parsed = new URL(urlStr);
22
+ if (!["http:", "https:"].includes(parsed.protocol)) return false;
23
+ const blocked = ["localhost", "127.0.0.1", "0.0.0.0", "[::1]"];
24
+ if (blocked.includes(parsed.hostname)) return false;
25
+ // Block private/link-local IP ranges
26
+ const parts = parsed.hostname.split(".");
27
+ if (parts[0] === "10") return false;
28
+ if (parts[0] === "172" && +parts[1] >= 16 && +parts[1] <= 31) return false;
29
+ if (parts[0] === "192" && parts[1] === "168") return false;
30
+ if (parts[0] === "169" && parts[1] === "254") return false;
31
+ return true;
32
+ } catch {
33
+ return false;
34
+ }
35
+ }
36
+
37
+ const app = express();
38
+
39
+ // Info endpoint (free)
40
+ app.get("/", (_, res) =>
41
+ res.json({
42
+ service: "RenderGate",
43
+ description: "Pay-per-render headless browser API on Stellar x402",
44
+ price: PRICE,
45
+ network: NETWORK,
46
+ usage: "GET /render?url=<encoded_url>",
47
+ }),
48
+ );
49
+
50
+ // Health check (free)
51
+ app.get("/health", (_, res) => res.json({ status: "ok" }));
52
+
53
+ // URL validation — runs before payment to reject SSRF attempts early
54
+ app.use("/render", (req, res, next) => {
55
+ const url = req.query.url;
56
+ if (!url) return res.status(400).json({ error: "Missing ?url= parameter" });
57
+ let decoded;
58
+ try {
59
+ decoded = decodeURIComponent(url);
60
+ } catch {
61
+ return res.status(400).json({ error: "Malformed URL encoding" });
62
+ }
63
+ if (!isAllowedUrl(decoded)) {
64
+ return res
65
+ .status(400)
66
+ .json({ error: "URL not allowed — only public http/https URLs" });
67
+ }
68
+ req.decodedUrl = decoded;
69
+ next();
70
+ });
71
+
72
+ // x402 payment middleware — protects /render
73
+ app.use(
74
+ paymentMiddlewareFromConfig(
75
+ {
76
+ "GET /render": {
77
+ accepts: {
78
+ scheme: "exact",
79
+ price: PRICE,
80
+ network: NETWORK,
81
+ payTo: PAY_TO,
82
+ maxTimeoutSeconds: 60,
83
+ },
84
+ description: "Render a JS-heavy webpage and return extracted content",
85
+ },
86
+ },
87
+ new HTTPFacilitatorClient({ url: FACILITATOR_URL }),
88
+ [{ network: NETWORK, server: new ExactStellarScheme() }],
89
+ ),
90
+ );
91
+
92
+ // Protected render endpoint
93
+ app.get("/render", async (req, res) => {
94
+ const decoded = req.decodedUrl;
95
+
96
+ try {
97
+ console.log(`Rendering: ${decoded}`);
98
+ const start = Date.now();
99
+ const result = await renderUrl(decoded);
100
+ const elapsed = Date.now() - start;
101
+
102
+ res.json({
103
+ ...result,
104
+ renderTimeMs: elapsed,
105
+ payment: { price: PRICE, network: NETWORK },
106
+ });
107
+ } catch (err) {
108
+ console.error(`Render failed for ${decoded}:`, err.message);
109
+ if (err.message.includes("Too many concurrent")) {
110
+ return res.status(503).json({ error: err.message });
111
+ }
112
+ res.status(500).json({ error: "Render failed", message: err.message });
113
+ }
114
+ });
115
+
116
+ const server = app.listen(Number(PORT), () => {
117
+ console.log(`RenderGate listening on http://localhost:${PORT}`);
118
+ console.log(` Pay ${PRICE} USDC on ${NETWORK} per render`);
119
+ console.log(` Payments go to ${PAY_TO}`);
120
+ });
121
+
122
+ process.on("SIGTERM", async () => {
123
+ console.log("Shutting down...");
124
+ server.close();
125
+ await closeBrowser();
126
+ process.exit(0);
127
+ });