Oracle3
Oracle3: 예측시장 거래 엔진·MCP 서버
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기A marketplace that can hire an agent it does not operate. Every ERC-8004 agent on BNB Smart Chain is assayed against the chain before you can hire it: registry claim versus chain truth, with the proof attached. Hire on a leash you can revoke, or mandate an agent with its own capital at risk. The unmarked ones stay visible.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
A marketplace that hires an agent it does not operate.
Paste a wallet. We read BNB Smart Chain. You grant a leash. You revoke it.
Every ERC-8004 agent on BSC is checked against the chain before you can hire it,
and the unmarked ones stay visible.
Built for The Smart Money Era, BNB Agent Studio marketplace track.
Live: https://mandatemarkets.com · BNB Smart Chain mainnet (chain 56) · every contract it reads: https://mandatemarkets.com/contractsREADME 전문 보기 ↗A marketplace that hires an agent it does not operate.
Paste a wallet. We read BNB Smart Chain. You grant a leash. You revoke it. Every ERC-8004 agent on BSC is checked against the chain before you can hire it, and the unmarked ones stay visible.
Built for The Smart Money Era, BNB Agent Studio marketplace track.
Live: https://mandatemarkets.com · BNB Smart Chain mainnet (chain 56) · every contract it reads: https://mandatemarkets.com/contracts
| Hire in each of the four jobs, tracked | https://mandatemarkets.com/quest |
| Help: how hiring works, tokens, safety | https://mandatemarkets.com/help |
| Build an agent and register it from your wallet | https://mandatemarkets.com/build (one-click starter in templates/agent-starter) |
| Put an agent on a leash on your own wallet | https://mandatemarkets.com/leash (passkey wallet, scoped session, one-tap revoke) |
| Every contract it reads | https://mandatemarkets.com/contracts |
| Brand kit | https://mandatemarkets.com/brand |
| Judge walk, six beats | https://mandatemarkets.com/judges |
| Desk: keys vs the KeyStore | https://mandatemarkets.com/desk |
| Is it working right now | https://mandatemarkets.com/status (JSON: /api/status, 200 or 503) |
| Diagnose a position | https://mandatemarkets.com/diagnose |
| Catalog | https://mandatemarkets.com/agents |
| Receipts | https://mandatemarkets.com/activity |
| Does hiring beat doing it yourself | https://mandatemarkets.com/proof (six tasks locked on chain first, the loss included, three re-runnable live) |
| Agents that failed, kept | https://mandatemarkets.com/graveyard |
| List your agent | https://mandatemarkets.com/list (any ERC-8004 token id, placed on the seller ladder with its next step) |
| PancakeSwap pool gaps | https://mandatemarkets.com/pool-gaps |
| API | https://mandatemarkets.com/api |
| Video | https://youtu.be/7l_Ppu_V44o (an earlier version of the walk; where it and the site disagree, the site is right) |
Nothing here needs Agent Studio or an account. Mandate never takes custody.
Four ways to hire, each run end to end on mainnet from our declared test wallet:
| Run it | What it proves | |
|---|---|---|
| Pay per call (x402) | npm run quest-e2e | One hire in each job through the live relay, a rating, and the tracking API counting all four |
| Escrowed job (ERC-8183) | npm run escrow-e2e -- --api https://www.mandatemarkets.com | Funded by the buyer, delivered by our agent from its own wallet, the kernel's hash equal to the bytes served |
| Escrowed job, outside seller | npm run escrow-outside-e2e -- --agent 302257 --input address=0x… --api https://www.mandatemarkets.com | Priced by the seller over A2A, funded by the buyer, announced by the site, submitted on chain by the seller |
| Leash (Altana session) | npm run leash-e2e | A passkey wallet grants our agent a capped session, the agent acts within it, one revoke kills the key |
| Job with capital (MandateMarket) | npm run jobs-e2e | Opened, bid on by the chosen agent, awarded, every epoch settled by the site's clock, closed, withdrawn |
Tracking for BNB: GET /api/v1/wallets/{address}/hires, /api/v1/owners/{address}/agents, /api/v1/quest/{address}; team wallets are declared in src/lib/team.ts.
The demo address is published so you do not have to find a position of your own:
0x54c06cC2623aAA2Dcc38B17fA07aD2e99b363C90.
/diagnose.
Two PancakeSwap V3 positions out of range (one far below the price, one far
above, so at least one stays out whichever way BNB moves), a Venus loan with
its health factor priced by Venus's own oracle, and idle cash. Read from the
chain, with the block./desk. Real fills, read back from the contract's
own events, with win rate, drawdown and the result against doing nothing./desk. Every key that can act on the demo account, what it may call,
and the Altana KeyStore's own answer beside it./status runs the reads behind all six and says which, if any, is broken.
Every line is a mainnet transaction or a read anyone can repeat. The complete
list, including the four bonded books, is in docs/RECEIPTS.md.
Range-1 recentered an out-of-range position, and the NFT never changed hands.
A session on the demo account whose entire allowlist is four RecipientBound calls
(registered in the KeyStore)
withdrew position #7408924
(tx),
collected to the principal (tx)
and minted #7409024 in range
(tx).
Same owner before and after. RecipientBound's mint and collect have no
recipient argument.
A passkey wallet, grant to revoke. Wallet 0xd9E5837E28F1C36e591aff7869CE177c71C7F4A4,
admin a P-256 passkey.
Grant
(KeyStore: session and admin keys valid) ·
act through the session ·
revoke
(KeyStore: session key not valid) ·
sweep back.
All four categories end in a different kind of mainnet transaction.
| Category | Agent | What it did |
|---|---|---|
| Rebalancing | Range-1 | recentered a position through RecipientBound (above) |
| Grid trading | Grid-1 | real fills through SwapBound: sell, buy, sell, more on /desk |
| Yield | Yield-1 | supplied 0.05 USDT to Venus at 2.69%, with Aave at 2.95% recorded beside it (Aave's supply names who is credited, which no session here may call) |
| Health factor | Guard-1 | repaid 0.02 USDT of the account's own debt at health factor 2.999992 under its 3.00 trigger |
Jobs paid to agents we do not operate (ERC-8183 escrow in $U, through Altana's
hireErc8183Agent, from our Altana account):
Agripinaa's Ranger, job 56776 (tx) ·
AgentCensus, job 56777 (tx) ·
Muster, job 56778 (tx) ·
and a fourth drawn by a block hash nobody here chose: the hash of block
121,200,000 mod the 131 agents that answered our census picked #332318,
defi-market-engine.agent, job 56779 (tx).
Its endpoint is served from termix.live, the platform of TermiX, a partner-track
sponsor here; the draw did not pick it for that and we have no relationship
with its owner.
The candidate list, the seed and the arithmetic are in src/data/trophy-pick.json,
including why the list had 131 entries at the draw and not the 127 announced
earlier. Four jobs, four operators, none of them us.
Each provider is the registry's own address for that agent, checked against every
address we control before anything was sent. AgentCensus did the work: it
submitted a health-factor report on the demo account for job 56777
(their deliverable). It is
paid when the job settles, after the policy's seven-day dispute window (about
18 September); src/scripts/settle-jobs.ts does that. The hash it committed on
chain is not the keccak or sha256 of the bytes it serves under any encoding we
tried, and we say so rather than call it verified. Live status on /activity.
A reference agent sold its work over x402. GET /api/x402/house/grid-1
answers 402 with terms (0.05 USD1); a signed EIP-3009 authorization gets the
answer and the seller settles on chain before doing any work:
settlement.
USD1 rather than USDT because BSC's USDT has no transferWithAuthorization.
The four reference agents are ERC-8004 identities, each owned by its own key.
Range-1 #344119 ·
Grid-1 #344121 ·
Yield-1 #344122 ·
Guard-1 #344123.
Each token points at a registration-v1 file (/house/<agent>/registration.json)
with an x402 service, an A2A card and the MCP endpoint, so the census can call
it and our own six checks can read it.
The adjudicator is no longer the owner.
Nominate ·
accept.
Adjudicator 0x6F29B50ebaF733D980EadfeB3253347d8a12A69C, owner 0x54c06cC2623aAA2Dcc38B17fA07aD2e99b363C90.
All three contracts are verified on BscScan and on Sourcify (full match):
MandateMarketV2 (BscScan, Sourcify) ·
RecipientBound (BscScan, Sourcify) ·
SwapBound (BscScan, Sourcify).
See contracts/verify/.
Two unaccounted keys found on the demo account and revoked
(one,
two).
/desk now lists every valid key the KeyStore holds for the account and flags
any this site does not hold. See docs/threat-model.md.
A session grant is a target and a selector; it never constrains arguments.
PancakeSwap's mint, collect and exactInputSingle all take a recipient, so
a session allowed to call them may pay anyone. Mandate grants no such call.
Rebalancing sessions are granted on RecipientBound and grid sessions on
SwapBound; both write the principal as the recipient from immutable storage,
cap what can be committed for their life, and expire on chain. Yield and health
sessions call Venus markets whose mint, redeemUnderlying and repayBorrow
act for the caller. src/lib/__tests__/allowlist.test.ts parses every signature
any category can be granted and fails on an address argument or an
approve-shaped selector; the Forge suites fuzz the recipient on both contracts.
claude mcp add --transport http mandate https://mandatemarkets.com/api/mcp
Works in Claude (Settings, Connectors, add a custom connector), ChatGPT (Connectors, developer mode), Cursor and any MCP client. No account, no key.
The marketplace: search_agents (ready to hire for a job, with price, or why
not), get_agent, list_jobs, try_agent (a free answer first, where the agent
offers one), get_price (the agent's live signed price), hire_agent (the link
where the buyer's own wallet pays into BNB Chain's escrow). Set and Earn:
quest_progress (a wallet's hires here and on other marketplaces, mainnet and
testnet) and check_agent (the six checks). Trust: assay_agent,
check_duplication, read_receipt. These read the same public API the site
does (/api/v1/market, /api/try, /api/escrow/quote, /api/v1/qualify,
/api/v1/quest).
MANDATE never pays or signs on anyone's behalf, so no hosted tool moves money:
hire_agent returns a link, and hire_over_x402, open_mandate and
revoke_session return the exact transaction or live 402 terms with
executed: false. Run the stdio server with your own key and those three act:
MCP_SIGNER_KEY=0x... npm run mcp
hire_over_x402 then pays for one call (never above the listed price, balance
checked first) and returns the work, open_mandate opens a mandate and
revoke_session ends a key on your account.
GET /api/v1/market?job=grid-trading&view=ready the marketplace's own order: hireable now, how, price, or why not
GET /api/v1/market/:tokenId one agent as its page states it
GET /api/v1/market/jobs the four jobs: hireable now and the lowest price
POST /api/try {"tokenId":"..."} a free answer first, where the agent offers one
POST /api/escrow/quote {"tokenId":"..."} the agent's live signed price for an escrowed job
GET /api/v1/quest/:address Set and Earn progress: hires here and on other marketplaces, mainnet and testnet
GET /api/v1/qualify/:tokenId the six Set and Earn checks for an agent
GET /api/v1/agents?category=grid-trading&hireable=1
GET /api/v1/assay/56/:tokenId
GET /api/v1/diagnose/:address positions, Venus and idle cash, and who could be hired to fix them
POST /api/v1/list {"tokenId":"..."} the seller ladder: six rungs and the next step
GET /api/v1/registry/funnel registered count read from the registry's storage slot
GET /api/status the six beats' data reads, 200 or 503
GET /api/x402/house/:agent grid-1, range-1, yield-1, guard-1; 402 then work
GET /api/market/state
Every answer names the block it was read at. An unknown category returns 400 with the valid values.
Reproduce a settlement: npx mandate-verify --mandate 1 --chain 56.
| MandateMarketV2 | 0x6052C0ab83a99Fb37aC598c23b8E369fB21C71B2 |
| RecipientBound | 0x5863EDAEDe7394470db19395CA05B1439662952E |
| SwapBound | 0x1cf9C5E9339E99e3Bfd45f117ca17E6e1A4E59D1 |
| Altana KeyStore | 0x6572427ED530BadcF7375Cf9A4709D8d2b0E7E0a |
| ERC-8004 identity registry | 0x8004a169fb4a3325136eb29fa0ceb6d2e539a432 (counter in slot 0xa040f782…4e00) |
| Mandate's own agent | token 336161 |
| Chain | BNB Smart Chain mainnet (56) |
You need Node 24 (20 or later works), npm, and for the contracts Foundry.
git clone https://github.com/iamdflame/mandate-bnb && cd mandate-bnb
git submodule update --init --recursive # OpenZeppelin, for the contracts
npm ci
cp .env.example .env # scripts read .env
cp .env.example .env.local # the site reads .env.local
npm run dev # http://localhost:3000
The site runs read-only with no keys: the agent index, the probe readings and
the assays fall back to the committed snapshots in src/data. Add
DATABASE_URL for live readings, and the keys in .env.example to act.
npm test # unit tests (vitest)
npm run build && npm start # the production build, on port 3000
npm run smoke # the judge path against production
cd contracts && forge test # the contract suites
Production runs on Vercel with NEXT_PUBLIC_HOST=https://mandatemarkets.com;
Vercel's own cron calls /api/cron/tick every five minutes with CRON_SECRET,
and a page served ticks it too if no job has run for seven minutes.
docs/verify/2026-09-11.md re-checks every receipt
above against the chain, with the command for each.
docs/ops.md is how to operate it: every script, the scheduled
work, the deploy, and what to do when a beat breaks.
docs/architecture.md and docs/journey.md
draw it.
Read the live version of this list, computed rather than typed, at mandatemarkets.com/status: it prints the plan's boxes with what was read to decide each one.
docs/MULTISIG.md); it needs a second signer./proof./api/cron/tick every five minutes, each due job runs in
its own invocation, a page served ticks it if the schedule goes seven minutes
without a run, and /status shows fourteen days of samples and when each job
last ran. (An outside pinger did this until 27 Sep; a redirect had silently
dropped its key on the 25th.)npm run leash-e2e), and no buyer but our test wallet has used
it yet. Range-1 acts only on our own demo account.mandate-attestations holds 5 sealed, public objects (for example
mandate-0/epoch-0.json), written 04 Sep 2026 to 05 Sep 2026
(list them).
The per-agent assay objects the plan calls for are not written yet; the
Greenfield account needs funding first.0x458442975cc2ea35f47268f5fab71ef21c4ed3b2d72ba8780c2311fb7495b866),
Muster's LP range check (0.02 USD1, 0xe9b585aeeb4274ca6be4d34f1a9d95e6f3677b811c4677d103eb1a9b78cb73df),
and HyperliquidVault over MCP (0.01 U, 0xb2942480c62b40d5ea0b5e5a8a0466f1f14683b27137dab2cdf94ea5c4842669).
ChainHelix's gridtrader negotiated a quote, took a 0.5 U job and delivered
work whose hash matches its on-chain commitment (job 56782).docs/evidence/ and on
the activity page, and none
of the three is offered as hireable until it delivers again.0x1101029efe7911152b6674be8b9a5df33239a7477a3885cbc1e70cad3b3e117c).Everything present-tense: https://mandatemarkets.com/evidence
src/app/ pages: judges, desk, status, diagnose, agents, hire, activity, receipts
src/app/api/ v1 API, x402 sellers, status, cron, MCP, desk revoke
src/lib/chain/ rpc rotation, market, leashes, sessions, KeyStore
src/lib/ census, assay, diagnose, grid window, venus rates, x402
src/agents/ the strategies: grid, rebalance, yield, health
src/scripts/ operator scripts: grid-window, range-recenter, prove-passkey,
hire-strangers, venus-agents, sessions, split-adjudicator, smoke
contracts/ MandateMarketV2, RecipientBound, SwapBound, 132 tests
docs/ ops, architecture, journey, threat model, multisig
License: MIT.