Oracle3
Open-source trading engine and MCP server for prediction markets. Fee-aware no-arbitrage trading across related contracts, live on Kalshi, Polymarket and Solana or on paper.
Compare autonomous financial agents on BNB Chain using onchain activity, reputation, performance, risk and live execution data.
FinanceTypeScript · JavaScriptGitHub @successajeOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Pokter - the decision layer for autonomous finance
Taken from the repository README
Loading the full README. The saved excerpt is shown below.
Choose what deserves your money.
A decision layer for autonomous finance on BNB Chain. Pokter helps you discover,
verify, compare and safely hire autonomous financial agents — using onchain
activity, attestations, live execution data and scoped, revocable permissions.
The walkthrough is linked rather than committed: a screen recording would
outweigh this entire repository many times over, and git keeps large blobs in
history permanently even after deletion.
A bug we found in a dependency, and how it endedRead the full README ↗Most agents never answer. These do.
The agent marketplace for BNB Chain that shows its work. Pokter calls every listed agent on a schedule, checks whether its answers are right, records whether it delivers paid work, and lets you hire it through BNB Chain's ERC-8183 escrow, where the agent is paid only when it delivers.
| Live app | https://pokter.xyz |
| X | https://x.com/usepokter |
| Walkthrough | https://youtu.be/KyuKia6RL9s |
Escrow settles on BNB Chain mainnet in real $U when the agent's signed
price names the mainnet token, and on BNB testnet in test tokens otherwise.
Each listing says which before anything is signed. NEXT_PUBLIC_ESCROW_CHAINS
decides which escrows are open; mainnet is opened only by listing it.
The ERC-8004 registry on BSC holds more than 300,000 agents. Finding one is not the hard part. Knowing which deserves your capital is.
An agent can have a polished description, a high reputation number and a working endpoint, and still be a poor place to put money. Worse, much of the registry is noise: bulk-minted clones sharing one description, agents whose declared endpoint is dead, and top-ranked entries carrying zero attestations.
One agent we measured advertises Venus liquidation protection in convincing technical detail, and has answered none of our probes.
Six rules, enforced in code rather than asserted in copy.
Every number traces to a source. Performance figures come from on-chain
attestations indexed via 8004scan, decoded from their feedback_uri into the
declared evaluator label, methodology, probe counts and the evaluator's own
disclosed defects. The evaluator's identity comes from the transaction sender,
never from a name written inside that document.
Each carries a provenance tag (onchain, attested, Pokter measured,
estimated, historical) that opens to the record behind it. Declared facts
and observed facts are never mixed.
If we cannot verify it, we say so. An agent with no attestations is marked
Not measured rather than given a filler score: a statement about our
coverage, not a verdict on the agent. The Pokter Score is computed only over
dimensions that carry real data, and its coverage travels with it. Returns and
drawdown are reported as not measured, because nobody publishes them and
inferring them from uptime would be fabrication.
We produce evidence, not just consume it. Few agents carry attestations, so Pokter measures agents itself. A scheduler inside the server sweeps about every ten minutes, probing a rotating batch of listed endpoints, and keeps the record, published in the same shape as third-party attestations, including the defects of our own method.
We do not count ourselves as independent. Our sweep runs through the same verdict logic as a third-party attestation, but feedback sent by a Pokter wallet or the agent owner is related evidence. A self-declared name cannot change that. The top tier needs two distinct, unrelated evaluator wallets, and by that standard no agent on BNB Chain is currently Proven. We would rather publish an empty top tier than award ourselves the corroboration.
Answering is not the same as being right. Health-factor agents are asked about real Venus borrowers and their answers compared with Pokter's own reading of the chain at the same moment. An answer on collateral factors instead of liquidation thresholds is shown as the cautious figure it is, not as a failure.
Taking a job is not the same as delivering it. Every agent's record shows paid jobs delivered and missed, including jobs left funded past their deadline that nobody reclaimed. Agents that let more jobs lapse than they deliver rank below the rest and never appear among the most reliable.
A price is evidence too: no registry field publishes what an agent charges, so sweeps ask for a quote, check that the signature recovers to the agent's registered wallet and is bound to the terms Pokter sent, and keep only that. Listings say plainly when an agent would not name a price.
Every agent also stands on one rung of what it has actually done through Pokter, earned in order and never assigned:
| Rung | Earned when |
|---|---|
| Answers | It answers Pokter's scheduled checks |
| Priced | It signs a price, with its registered wallet, that an open escrow can pay |
| Delivered | A paid job settled with the agent's own answer |
| Checked | It passed the latest correctness check for its category |
| Proven in use | Three settled jobs from three buyer wallets outside the team |
When an agent cannot be priced or hired, its page says why and links the part of the integration kit that fixes it, before anyone funds anything.
| Tier | What it means |
|---|---|
| Proven | Two distinct, unrelated evaluator wallets agree, over enough probes and a long enough window. Pokter is never one of them. |
| Emerging | Examined to the Proven bar on volume, window and rate, but corroborated by fewer independent measurers. |
| Observed | Measured, with real evidence, but not yet to the volume, window or rate the Proven bar asks for. |
| Not measured | Nothing has been measured. This states what Pokter lacks, not what the agent did. Hiring requires explicitly accepting the risk. |
| Failing | Measured, and failing its own measurers. Pokter does not recommend hiring it. |
An agent's tier is computed, never assigned. The page states which measurers counted and which published attestations could not be scored, so a tier can always be checked against the evidence that produced it.
Find
| Capability | Status |
|---|---|
| Discovery across five categories (rebalancing, grid trading, yield, health factor, token safety), with plain-language search | Live |
| A search nothing answers says why, and offers the request board with the words carried over | Live |
Header search (/ or ⌘K): agents by name or reference (56/367904), jobs by number, builders and agent wallets by address | Live |
| Cards show the image each agent registered on chain, read in one batch per network | Live |
| Evidence states, the Pokter Score and the published methodology | Live |
| Probes about every ten minutes in rotating batches, with 7- and 30-day track records | Live |
| Most reliable this week: ranked on probes, one agent per operator | Live; operators grouped by funding wallet once NODEREAL_API_KEY is set |
| Delivery record on every agent: delivered and missed paid jobs | Live |
| Health factor check against live Venus positions | Live; two agents per sweep |
| Correctness suites for grid trading, yield and token safety, and grading of paid deliveries | Live |
| Category rankings from settled escrow work | Live at /rankings |
| Every escrow job, misses included, split by real and test money and by who funded it | Live at /proof |
| A public log of what Pokter got wrong | Live at /corrections |
| A daily seal of Pokter's published claims, its hash anchored on chain | Live |
| Agent-signed price quotes, verified and bound to the terms | Live |
| Side-by-side comparison, free trials, follow an agent by email | Live |
| An MCP server, so AI assistants can search, vet and quote, prepare an unsigned hire for the buyer to fund, and track and check the delivery | Live at |
Hire and after
| Capability | Status |
|---|---|
| ERC-8183 hiring with a browser or passkey wallet | Verified on chain |
| Delivery for agents registered on mainnet: Pokter's seller carries the brief and delivers the agent's own answer, or nothing | Live |
| Workspace: jobs, receipts verified against the on-chain hash, settle, dispute, reclaim | Live |
| Requests: a buyer posts a signed brief, builders propose, the buyer chooses and hires | Live at /requests |
| Free Venus liquidation alerts by email, confirmed first and stoppable from every email | Live at /watch |
| Testnet hires offered only once a relayed brief is known to reach the agent | Live |
| Jobs follow the wallet: any device shows a wallet's hires | Live |
| Email when a job is delivered, with a preview or the full answer | Live; needs email configured |
| Signed reviews, publishable by the buyer to the ERC-8004 reputation registry | Live |
| Standing delegated wallet authority | Disabled until calldata constraints exist |
| Performance and risk scoring | Never, why |
Build and the campaign
| Capability | Status |
|---|---|
| Build: draft, check the endpoint, register on ERC-8004, manage | Live at /build |
| Integration kit: what an agent must declare, sign and deliver to be hireable | Live at /build/integration |
| Five house reference agents, one per category, each named "… by Pokter" with its own mark (Brinkwatch, Centreline, Cresthold, Gridloom, Touchstone) | Live |
| Outside evaluators: schema, starter script and a challenge list for independent measurement | Live at /evaluators |
| Adoption against BNB Chain's Set and Earn build targets | Live |
| Set and Earn tracker: a wallet's hires on every marketplace, from the escrow contracts | Live at /quest |
Everything below is on BSC testnet and independently verifiable. Session transactions are historical evidence of the integration; Pokter no longer creates new delegated sessions from the product.
| What | Transaction |
|---|---|
| Altana session granted + registered in KeyStore | 0x62a590ae… |
| Session revoked | 0x9eaf149e… |
| ERC-8183 job hired end-to-end from the product | 0x40b9fe98… |
| Escrow funded | 0x711855b9… |
| Live session granted from the product | 0x62b049db… |
| Live job hired and escrowed | 0x93385d57… |
| Public receipt submitted for live job #1336 | 0x775ced53… |
| Buyer verified and settled live job #1336 | 0xcecbf3fc… |
Both operator accounts are visible in the Altana Keystore explorer, and between them they show the whole lifecycle:
These transactions prove that sessions expire and can be revoked. They do not prove that the old target-and-selector policy was safe for financial execution.
Saying "a call outside the allowlist reverts" is worth nothing unless somebody
tries it. scripts/prove-enforcement.mts
grants a session scoped to a single contract and then makes two calls through
it — identical calldata, zero value, only the target differs:
| Call | Target | Result |
|---|---|---|
| In scope | PancakeSwap V3 Router | Accepted — 0x6e8cb539… |
| Out of scope | an address never granted | Rejected — UnauthorizedCall |
The rejection comes from the Altana account contract's validator, not from Pokter. The session, the calldata and the signer were the same in both cases.
The script refuses to call it a pass unless the in-scope call actually succeeded. An earlier run had both calls fail on a type error in the caller, which would have read as the allowlist working while proving nothing — the same mistake this product exists to prevent, so the test now has to distinguish the two failure modes.
The test proves that target and function restrictions are enforced on-chain. It also exposed why that is not enough: PancakeSwap swap, mint and collect calls carry recipient, asset, position and amount fields inside calldata. The current Altana permission schema cannot constrain those arguments. A permitted selector could therefore route proceeds to an address the user never approved.
Pokter now fails closed at three layers: the hire UI states that no standing
authority is created, the grant route refuses before reading grant parameters
or touching a signer — 403 to the public, since granting was always an
operator-funded demo action, and 409 even when that check passes — and
toSessionPermissions refuses every marketplace category. npm run audit:protocol checks every marketplace category so a raw protocol selector cannot be
reintroduced as an incidental refactor.
Delegation will remain disabled until an audited adapter or account validator can enforce the wallet as recipient, explicit asset and position allowlists, per-call amount bounds, aggregate spend bounds, expiry and revocation. The acceptance test is adversarial: an otherwise identical call with an attacker recipient, unapproved asset, unapproved position or excessive amount must revert on-chain.
Sponsor integrations are documented with their evidence and their limits in
docs/integrations/. The agent-versus-manual
comparison, including the task the agent lost, is in
docs/termix-agent-advantage.md and on
/agent-advantage.
/pool-check answers a question an LP has before delegating a
concentrated-liquidity position: will this agent pay for itself?
It reads the V3 pool live — fee tier, current tick, and the liquidity actually sitting at that tick — and prices what running an agent would cost: pool fees, price impact against real liquidity, gas, and the agent's own per-job fee. The output is a break-even: the improvement in fee capture the agent must deliver before hiring it leaves the LP better off.
The asymmetry is the point. The cost is computable, so it is computed exactly. The benefit is not — no agent publishes realised returns, and nothing on-chain attributes fee capture to a rebalance decision — so it is not guessed. A break-even is the honest form of the question, and unlike a forecast it is something an LP can hold an agent to after a month.
The same agent on a $25,000 position rebalancing eight times a month needs 1.70% on WBNB/USDT and 9.20% on CAKE/WBNB: a thinner pool and a five-times wider fee tier change the answer completely, which is exactly what an LP needs to know before delegating.
Stated here rather than discovered.
A signed price is checked against the escrow that would pay it. An agent pricing in mainnet $U is hired on the mainnet escrow; one pricing in testnet $U is hired on testnet. A price in a token no open escrow settles is shown as priced and not directly hireable, with the reason in plain words — the quote verifies and the money could never move, which is a failure worth naming rather than hiding behind a Hire button.
Delivery for mainnet agents depends on the agent taking a brief. Pokter's seller carries the buyer's brief to the agent's A2A endpoint and delivers its answer unchanged. An agent with no work skill, or one that answers only with a price, delivers nothing; the job lapses and the buyer reclaims the escrow.
Delegated wallet execution is disabled. A session can be restricted to a target and function, but not to the arguments inside it, so a permitted swap could pay an address the user never approved. Pokter commissions one escrowed job and creates no standing authority over the buyer's wallet.
Marketplace attribution is only what the record says. Every shortlisted marketplace settles through the same escrow, which does not record where a hire was made. The tracker names a marketplace only when a job's own record does, and says "not recorded" otherwise.
Only $U is payable. The escrows also support USDT, and an agent may sign a price in it, but Pokter funds jobs in $U alone, so a USDT price shows as priced and not hireable.
The passkey wallet is testnet only. A mainnet hire needs a browser wallet.
Agents outside the five categories are not measured. The sweep covers the categories and the top of the registry; any other agent's page can still say, from its own card, why it cannot be hired.
Some features need a NodeReal key. Funding-wallet grouping, wallet activity
and the on-chain capability check switch off without NODEREAL_API_KEY, and the
public BSC node limits how far back logs can be read.
Performance and risk are never scored. No agent publishes realised returns, and nothing on chain attributes profit or loss to an agent's decision. Both read not measured permanently, and the Pokter Score rescales across what is left.
Integration details, with exact errors, are in docs/integrations/.
Next.js 16 (App Router), React 19, Tailwind 4, wagmi and viem, the Altana SDK for passkey wallets and ERC-8183, and SQLite on a persistent volume.
src/app/
(site)/ every page: home, discover, agents/[chain]/[id], compare,
requests, workspace, build, watch, proof, rankings, corrections,
evaluators, set-and-earn, quest, account, developers, mcp
(flow)/ the hire flow: hire/[chain]/[id]
api/ routes; v1/ is the public read API, mcp/ the MCP server,
sweep/ the scheduled run, health/ the liveness check
house/ the five house reference agents' A2A endpoints
src/lib/
scan/ 8004scan client, server-only
agents/ classification into the five marketplace categories
search/ retrieval, filters, ordering and the reliability ranking
proof/ attestation decoding, verdicts, live endpoint probing
history/ probe store, track records, scheduled sweeps
score/ the Pokter Score
erc8183/ escrow: hire, quotes, the seller and courier, job index
assay/ correctness checks (health factor against Venus)
funding/ operator grouping by first funding wallet
quest/ escrow job index and Set and Earn progress
reviews/ signed reviews and ERC-8004 reputation publishing
notifications email: job updates, builder alerts, agent follows
wallet/ passkey and browser wallets, device-side records
briefs/ the request board: signed briefs, proposals, awards
hire/ quote failures, hire blockers, budgets
loan-watch/ Venus liquidation alerts
house/ the house reference agents
mcp/ the MCP tools and the inline agent card
seals/ the daily seal and its on-chain anchor
evaluators/ the outside measurement schema and starter
capability/ what agents' own wallets do on chain
alerts/ operator alerts (Telegram and email)
network/ escrows, chains and payment tokens
src/features/ page-level components by area
src/ui/ the design system's primitives
Design system, routes and decisions: docs/pokter2/README.md.
Manual testnet checks: docs/pokter2/TEST-PLAN.md.
npm install
npm run dev
Open http://localhost:4311. Browsing needs no keys.
Checks, the same ones the deploy runs:
npm run verify # lint, types, tests and the three audits
npm run verify:build # the same, then a production build
BASE_URL=http://localhost:4311 npm run smoke
The audits are audit:protocol (no raw protocol selector can be granted),
audit:rate-limit (every public route is rate limited) and
audit:notifications (every email sender checks consent). npm run audit:receipts re-verifies indexed jobs against the chain.
npm run smoke requests every public route and checks its status and content.
All optional for local browsing. Server-only unless marked public.
| Variable | Purpose |
|---|---|
SCAN_API_KEY | Raises the 8004scan rate limit from 30 to 3,000 requests a minute |
SWEEP_SECRET | Guards POST /api/sweep and the operator routes |
ALTANA_NETWORK | bnb-testnet for the site's default escrow network |
ALTANA_ADMIN_KEY | The seller and operator signer. It signs on mainnet for any purpose listed in ALTANA_MAINNET_OPERATOR_PURPOSES, so it is no longer a testnet-only key: hold the minimum it needs and rotate it the moment it may have been exposed |
POKTER_DEMO_WRITE_SECRET | Required by operator demo routes; they fail closed without it |
NEXT_PUBLIC_APP_URL | Public. The site origin, used in links, emails and redirects |
NEXT_PUBLIC_WALLETCONNECT_PROJECT_ID | Public. Enables mobile wallets via WalletConnect |
RESEND_API_KEY, NOTIFICATION_FROM_EMAIL | Enable email; NOTIFICATION_REPLY_TO optional |
NOTIFICATION_UNSUBSCRIBE_SECRET | Signs unsubscribe links; recommended, otherwise the Resend key is used |
NODEREAL_API_KEY | Enables grouping operators by funding wallet, wallet activity and the capability check (BSC mainnet) |
SWEEP_SCHEDULER | on runs the sweep inside the server about every ten minutes; production must have it on, and the deploy checks |
TELEGRAM_BOT_TOKEN, TELEGRAM_ALERT_CHAT_ID, OPERATOR_ALERT_EMAIL | Operator alerts: a new outside hire, a stuck job, a sweep that stopped |
SEAL_ANCHOR_CHAIN | Chain the daily seal is anchored on; default 56 |
POKTER_TRUSTED_CLIENT_IP_HEADER | The proxy header rate limits trust for the client address |
BSC_RPC_URL | Node for PancakeSwap pool reads |
SCAN_BASE_URL | Overrides the 8004scan API base |
NEXT_PUBLIC_ALTANA_NETWORK |
| Endpoint | Returns |
|---|---|
GET /api/v1 | The service description: every endpoint, category, verdict and query term |
GET /api/v1/agents, /api/v1/agents/{chain}/{id} | Agents with provenance on every field, and hireBlocker when one cannot be hired |
GET /api/v1/agents/verifier | Dependency-free script that checks returned identities and owners against ERC-8004 |
GET /api/v1/activity | Aggregate job figures; no wallet, email or task text |
GET /api/v1/evaluators/schema | The public measurement schema, example and on-chain identity rules |
GET /api/v1/evaluators/starter | Dependency-free evaluator script; prepares feedback but never signs or broadcasts |
GET /api/v1/evaluators/challenge | Mainnet agents ready for independent measurement, one per observable operator |
GET /api/v1/receipts, /api/v1/receipts/verifier | Every job commissioned through Pokter, and a dependency-free script that verifies each against ERC-8183 |
GET /api/v1/seals, /api/v1/seals/{hash}, /api/v1/seals/verifier | The daily seals of Pokter's claims, and a script that checks one against its on-chain anchor |
GET /api/v1/integration | The integration kit, machine-readable |
POST /api/mcp | The MCP server: search_agents, get_agent, get_quote, hire_link, prepare_brief, prepare_hire, job_status, check_delivery, integration_kit |
GET /api/health | Store durability, scheduler state, and whether the server is saturated |
GET /llms.txt | What an AI crawler should read first, with the provenance rules |
GET /api/jobs?client=0x… | The jobs one wallet funded through Pokter |
GET /api/jobs/{id} | One job, read from chain |
Pushing to main deploys. Pull requests run the same checks first
(verify.yml). The deploy workflow runs lint, types, tests, the three audits
and a webpack build, deploys to Fly.io (retrying once), then checks production
health, that the sweep scheduler is on, each escrow chain, the main routes'
copy, and robots, sitemap and canonical tags.
The SQLite stores live on a Fly volume, and the volume is the point: probe
history, jobs, deliverables, reviews, checks and subscriptions accumulate. A
marketplace whose evidence resets on every deploy is not one. Every *_DB_PATH
must point at the volume (/data/…, set in fly.toml and the Dockerfile).
The sweep runs inside the server about every ten minutes (SWEEP_SCHEDULER=on);
a scheduled GitHub workflow is the backup. Each run probes a batch of agents and
asks for quotes, then reconciles the job index, watches for new hires, retries
stuck deliveries, notices sellers and stuck jobs, sends job, builder, follower
and liquidation-alert emails, runs due correctness checks, grades paid
deliveries, indexes escrow jobs, seals the day's claims, and tests relays. The
whole run shares a 240-second budget with 40 seconds held for the critical
steps; each step reports its duration and outcome, so a slow or failing one is
named in the log rather than silently costing the steps after it.
Guarded operator endpoints use the bearer SWEEP_SECRET: POST /api/jobs/backfill
re-reads jobs from chain (a dry run unless "write": true), and
/api/reviews/moderate lists, hides or restores reported reviews without
deleting them.
Hiring once failed against @altananetwork/[email protected] with 0xc94463e3, which
nothing could decode. It was a stale ERC-8183 policy address for BSC testnet,
already fixed upstream in 0.9.0; our override is now inert and reports so at
runtime. Two findings from that investigation are still open upstream:
#87, exported ABIs
carry no error fragments, so custom errors cannot be decoded, and
#88, require() fails
with ERR_PACKAGE_PATH_NOT_EXPORTED. The second is why npm run sweep fails
under tsx locally; the /api/sweep route is unaffected.
If a feature cannot be proven, this codebase does not pretend it exists. If an integration fails, it is documented with the exact error. If data is unavailable, the interface says not enough verified data. If a transaction is testnet, it says testnet.
Two of the five score dimensions — performance and risk — are permanently marked not measured, and will stay that way until somebody publishes the data.
Pokter doesn't pretend to know what it can't know. We measure availability. We verify attestations. We track evidence. We don't manufacture performance.
The credibility of the product is part of the product.
MIT. See LICENSE.
/api/mcpllms.txt for AI crawlers, with the provenance rules for every figure | Live |
Public. Must agree with ALTANA_NETWORK; the server refuses to start otherwise |
NEXT_PUBLIC_PASSKEY_RP_ID | Public. The passkey relying-party id; a build arg |
BSC_MAINNET_RPC_URL | Overrides the public node used for Venus and escrow reads |
NEXT_PUBLIC_ESCROW_CHAINS | Which escrows hires may be funded on, e.g. 97,56. Unset means testnet only. A build arg, not a runtime value |
ALTANA_MAINNET_OPERATOR_PURPOSES | Comma-separated operator purposes allowed to sign on mainnet, e.g. evidence-agent. Nothing signs on mainnet without it |
*_DB_PATH | SQLite locations: PROBE, SESSION, JOB, DELIVERABLE, RATE_LIMIT, NOTIFICATION, REVIEW, BUILDER, FUNDER, ASSAY, QUEST, CONVERSION, SEAL, WALLET_ACTIVITY, CAPABILITY, FEEDBACK, BRIEF, PROFILE, MAINTENANCE, SATURATION. Default ./data/. A new store is registered in src/lib/health/stores.ts, the Dockerfile and fly.toml together |
GET /api/reviews/{chain}/{job}| A review as the exact document its on-chain rating hashes |
GET /quest?address=0x… | Set and Earn hire progress for any wallet |