尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
xorr — an AI agent that trades tokenized stocks on Solana, inside a permission you can revoke
Built for STOCKLANA. Tokenized US stocks trade around the clock
on Solana; nobody can watch a market all night. xorr lets an agent do it for you — without ever holding your money.
• Live app: https://xorr-solana.vercel.app (sign in with email; it runs against a hosted mainnet fork, so the money
is test money and every transaction is real on that fork)
• Executor health: https://executor-production-a672.up.railway.app/health
• Fork RPC: https://solana-fork-production.up.railway.app檢視完整 README ↗Built for STOCKLANA. Tokenized US stocks trade around the clock on Solana; nobody can watch a market all night. xorr lets an agent do it for you — without ever holding your money.
Since 2026-09-25 the hosted app runs on Solana mainnet with real money — no fork, no test tokens.
| App | https://xorr-solana.vercel.app (web) · iOS/Android v1.0.0 builds |
| Website | https://xorr.finance |
| Executor | https://executor-production-a672.up.railway.app/health — chain: solana-mainnet, Helius RPC, Pyth and Tessera feeds |
| Chain access from the app | the executor's /rpc relay (allowlisted methods; the RPC key stays on the server), falling back to a public node |
The bot's own accounts — each is public, and each can be checked on Solscan:
| Role | Address | What it can do |
|---|---|---|
| Delegate (the permission's key) | ACikuhfPnynwUs9yYzGmNybAdRK2AtfMLLovWzdkcSEL | move only what an owner approved to it, capped by the token program; revoked by the owner in one tap |
| Payer | 6usPSsycKfrcmEc8zxmRmjVvUCGu2Ygf89RHk7peauhc | pays network fees and the rent of a user's new token accounts |
| Venue vault | CZ1JQUm7CbTrvUimxzpZZAPRbe65d5SV2R91yjAa82i9 | holds USDC only for the instant of a routed buy; pays its own swap fees |
Mainnet transactions from the demo are listed in docs/MAINNET-LOG.md, each with its Solscan link.
ApproveChecked on your USDC for your daily cap × the days
it runs, plus a sell approval on each xStock, so a stop-loss can fire while you are away. xorr holds the daily cap and
the end date and enforces them on every trade; the chain enforces the total.createWithSeed). You fund it in one signature — create, transfer,
approve the bot on it — and from then on that agent trades from it alone: the chain stops it at what the account
holds, its sales and stop-losses pay back into it, and you can take the money back at any time. Its rules are
yours to set and the executor enforces them on every entry: the most per trade and per day, the only stocks it may
buy, whether it may enter while Nasdaq is shut, and the most its stop may sit under the fill.Revoke on every account that names the bot — the agents' wallets
included, so nothing can trade from that block on, stop-losses included — and it works with our server down. Resume
re-signs the same grant and re-approves every agent wallet.server/src/executor/place.ts) checks
the chain, the grant record, the daily cap, the issuer's transfer gates and a live quote before anything moves — and
refunds you if a swap does not fill.Equity.US.<TICKER>/USD feed, read straight off its Solana price account — and holds if they have come apart by
more than 1.2% in extended hours or 1.5% overnight. Checking a Jupiter pool price against a mark from the same
response would be one source grading its own homework.| Part | What it is |
|---|---|
| App | Expo (web + iOS/Android), Privy Solana embedded wallet — signs grant, revoke, sells and withdrawals |
| Executor | Hono + Postgres (server/): the grant record, guardAndSpend, the scheduler (agents, exits, recurring buys), Jupiter |
| Chain | Solana mainnet: USDC, xStocks (Token-2022), Tessera T-Tokens, Jupiter v6. (The reproducible proofs below run on a local solana-test-validator --clone of mainnet, so anyone can check them without money.) |
| Oracle | Pyth Equity.US.* price accounts on Solana mainnet (server/src/market/pyth.ts) — the independent Nasdaq print the off-hours guard measures against |
| Hosting | Railway (executor + Postgres), Helius RPC, Vercel (web and xorr.finance) |
The hard part of trading a tokenized equity is the fourteen hours a day the equity is not trading. The token keeps moving; the thing it represents does not. To know whether a pool price is still the share's price you need a second opinion from somebody who is not the pool.
Pyth is that, and it is already on chain — so the reference for a trade that settles on Solana is itself a Solana
account, one getMultipleAccounts away, with no key and no vendor relationship. Three details worth reading the code
for:
When Pyth has no usable mark — COIN, today — xorr falls back to the issuer's own mark and says so in the verdict, because "drifted 1.4% from Pyth's NVDA feed" and "drifted 1.4% from the issuer's own mark" are different claims.
The Stocklana claim is that an agent buys an xStock (a Token-2022 tokenized equity) through a
real Jupiter route, on-chain, inside a capped permission the owner can revoke. This section lets
you check that on your own machine in about ten minutes. You need no accounts and no API keys.
Each command below was run from a fresh git clone into an empty directory before it was written
here.
| version verified | why | |
|---|---|---|
| Node.js | 26.5 (needs ≥ 20.11 for import.meta.dirname) | runs the tools through tsx |
Solana CLI with solana-test-validator | 3.1.11 (Agave) | the fork, and solana confirm |
| PostgreSQL | 16 | only for step 4 (the executor's database) |
| Internet access | — | the fork clones accounts from mainnet, and prices come from Jupiter's live quote API |
Install the Solana CLI with sh -c "$(curl -sSfL https://release.anza.xyz/stable/install)", then put
its bin directory on your PATH.
Env var names. The proofs below need none of these set; the defaults are shown in brackets. You never have to paste in a secret.
FORK_RPC: where the fork listens [http://127.0.0.1:8899]. Set it if 8899 is already taken; everything below follows it.MAINNET_RPC: upstream the fork clones from [https://api.mainnet-beta.solana.com]. Set it to your own RPC if the public one rate-limits you.DATABASE_URL: Postgres for step 4 [postgres://$USER@localhost:5432/xorr].PROVE_USD: dollar size of the proof buy [100].XORR_KEY_DIR, XORR_KEY_PAYER, XORR_KEY_DELEGATE, XORR_KEY_DEV_OWNER, XORR_KEY_VENUE_VAULT: optional. If none is set, the fork uses deterministic development keypairs, so your addresses will match the ones below.git clone https://github.com/nickthelegend/xorr-solana.git && cd xorr-solana
npm install && (cd server && npm install)
export FORK_RPC=http://127.0.0.1:8899 # or any free port, e.g. :18899
npx tsx infra/solana-fork/fork-bootstrap.ts
This starts solana-test-validator on the port in FORK_RPC. The faucet and gossip ports shift
with it, so a second fork on the same machine does not collide. The validator clones these from
mainnet:
EPjFWdd…) and NVDAx mint (Xsc9qvG…, Token-2022)JUP6Lkb…) and Orca Whirlpool program (whirLb…)swap-instructions at boot (server/src/solana/routeAccounts.ts): every pool, vault, tick array, oracle, lookup
table and AMM program the routes touchThe bootstrap then airdrops SOL and funds the dev owner with 25,000 USDC and 10 NVDAx. It writes
.env.fork and exits, and the validator keeps running in the background. A passing run ends with:
Wrote <repo>/.env.fork successfully.
Fork bootstrap complete! Run tests with:
FORK_RPC=http://127.0.0.1:8899 CHAIN=1 npx vitest run src/solana/fork.chain.test.ts
To stop the fork later, run pkill -f "solana-test-validator.*--rpc-port ${FORK_RPC##*:}".
The two proof tools do not touch Postgres. The executor and the agent do, so you can bring the real schema up with:
createdb xorr
(cd server && DATABASE_URL=postgres://$USER@localhost:5432/xorr npm run migrate)
On a fresh database it prints applied <file> for each migration in server/src/db/migrations/.
We got 35 rows in schema_migrations and 30 tables. It records what it applied, so running it again
is free.
npx tsx tools/prove-solana-xstock-buy.ts
The tool makes a capped SPL approval, with the owner signing. It then sends a $100 USDC → NVDAx buy
through the executor's single spend path, guardAndSpend, with the delegate signing. Finally it
reads the transaction's own logs back from the ledger. A passing run prints the following. The
signatures, slots and prices are from our run and will differ in yours.
=== 1. Real mainnet state cloned onto the fork ===
NVDAx mint Xsc9qvGR1efVDFGLrVsmkzv3qi45LTBjeUKSPmx9qEh owner=TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb
Jupiter v6 (cloned) JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4 owner=BPFLoaderUpgradeab1e11111111111111111111111 (executable)
NVDAx multiplier 1.001701196801074
=== 2. Capped SPL approval (owner signs) ===
delegated cap 500 USDC
=== 4. guardAndSpend: BUY $100 NVDAx (delegate signs) ===
BUY SIGNATURE 3aheLFM37WDnqkFtJo1HCvBuGmEN21PBGEXV2QgQdWbywb8B6nmpxwCwgs82gRczXKStF8XoGdtUW1fxvS3q64Se
BUY SLOT 34
PRICE SOURCE live Jupiter v6 quote API (off-chain HTTP; no program invoked)
FILL PATH jupiter-route — Jupiter v6 invoked on-chain, CPI into the AMM
jupiter invoked true
route + AMM swap true / true
=== 6. After ===
USDC 24900 (-100.000000)
delegated cap left 400 USDC
=== 7. Reported fill vs on-chain delta ===
drift 1.6653345369377348e-16
All proofs held. Verify independently with:
solana confirm -v <signature> --url http://127.0.0.1:8899
Check two things. PRICE SOURCE is only ever a number fetched over HTTP. FILL PATH is
what happened on-chain, and it has two possible values:
jupiter-route: the Jupiter program ran and swapped against the pool's reserves.venue-vault: a label kept for fills recorded before 2026-09-24, when a failed route was settled by a maker account.
The executor no longer does that: a route that cannot execute fills nothing and the USDC goes back.The tool exits non-zero on anything other than jupiter-route. It also fails if the reported fill and the on-chain
balance change disagree after applying the Token-2022 Scaled-UI multiplier (step 7).
solana confirm -v <BUY SIGNATURE> --url $FORK_RPC
Status: Ok
Log Messages:
Program JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4 invoke [1]
Program log: Instruction: Route
Program whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc invoke [2]
Program log: Instruction: SwapV2
Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [3] ← USDC in (SPL Token)
Program log: Instruction: TransferChecked
Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb invoke [3] ← NVDAx out (Token-2022)
Program log: Instruction: TransferChecked
Program whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc success
...
Program JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4 success
JUP6Lkb… invoke [1] followed by Instruction: Route means the transaction's top-level
instruction is Jupiter v6's Route. It is the real mainnet program bytecode, cloned onto the fork.
whirLb… invoke [2] followed by Instruction: SwapV2 means Jupiter then made a cross-program
call into Orca Whirlpool, and Whirlpool swapped against the cloned USDC/NVDAx pool. The [3] lines
are the pool moving USDC in and NVDAx out. If a fill had gone through the venue vault instead, you
would see no JUP6Lkb… line at all, only a token TransferChecked.
(cd server && CHAIN=1 npx vitest run src/solana/fork.chain.test.ts) # 4 passed
npx tsx tools/prove-solana-deposit-withdraw.ts
The tool runs four parts:
--- 4. USER-SIGNED SPL TOKEN TRANSFER & AUDIT RECORDING ---
✔ User funded with SOL on the fork to pay its own fee
✔ Funded account is the ATA the app derives, not a second account
✔ Destination ATA exists and matches the derived address
Before — user: 200 USDC, dest: 0 USDC
✔ Created SPL Token transfer instruction
✔ Signer matches user wallet (non-custodial: user signs, not executor)
✔ Transaction is in the ledger, read back by signature
✔ Ledger records no error for the withdrawal
✔ Destination balance rose by exactly 50 USDC
✔ Source balance fell by exactly 50 USDC
✔ What left the source is what arrived at the destination
WITHDRAW SIGNATURE: 5zTaos5EAAkQPfzbvzZ3uAHL4c8AmcDfofzRSoD7nhPbj1qC5cvaR2YL14469GcTWRGNbifVFAtiLvUziPM6Ce2N
SLOT: 31
Amount: 50 USDC (50000000 raw units)
From: CvQHdBAL4rb7xXA8PE4K7xhk4bzbAydGsF7TF7FhNGZT
To: FF9XTb4fRDzWqL8aUL1KdSA4FLPTVo5oHd63Qsfdty35
After — user: 150 USDC, dest: 50 USDC
Verify: solana confirm -v <signature> --url http://127.0.0.1:8899
================================================================
ALL DEMO PROOFS PASSED (MoonPay Dev Sandbox + Solana Fork)
================================================================
Any failed check prints ✖ FAIL and the tool exits 1. Confirm the withdrawal the same way as in
step 6:
$ solana confirm -v <WITHDRAW SIGNATURE> --url $FORK_RPC
Account 0: srw- CvQHdBAL4rb7xXA8PE4K7xhk4bzbAydGsF7TF7FhNGZT (fee payer)
Status: Ok
Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [1]
Program log: Instruction: Transfer
Account 0 is both the fee payer and the only signer, and it is the user's address from From:
above, not the executor's. That is the non-custodial property, read straight off the transaction.
OPENROUTER_API_KEY. Each trade still names the setup and the
numbers behind it; with a key the sentence is written by a model.Revoke.npm test (2,600+ tests), npm run typecheck, npm run lint.cd server && npm test (1,350+ tests), npm run typecheck.npx vitest run server/src/solana/fork.chain.test.ts — capped delegation,
over-cap refusal, kill switch, and a Jupiter-routed buy and a sell of the owner's own shares.docs/TESTPLAN-SOLANA.md.PLAN.md.xorr started on Base (ETHOnline 2026, Base Build Camp). That build's README — its contracts, sponsors and screens — is
in docs/base/README-base.md. The Solana build hides every Base-only screen.