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.
Fund open-source work in fixed milestones, verify commit-pinned evidence and release each tranche through GenLayer consensus.
FinancePython · TypeScriptGitHub @moltaphetOnlineOwner 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
Loading the full README. The saved excerpt is shown below.
LexiTreasury funds open-source work through one repository-qualified milestone
grant flow. Repository activity, project tiers, the DAO constitution, a repository
payout assertion, and audit attestations decide whether a grant may enter the treasury
funding stage. A funded grant then releases fixed milestone tranches only after
commit-pinned evidence is reviewed by GenLayer consensus.Read the full README ↗LexiTreasury funds open-source work through one repository-qualified milestone grant flow. Repository activity, project tiers, the DAO constitution, a repository payout assertion, and audit attestations decide whether a grant may enter the treasury funding stage. A funded grant then releases fixed milestone tranches only after commit-pinned evidence is reviewed by GenLayer consensus.
contracts/lexitreasury.py is the only contract source
and active application contract. The former standalone milestone contract was
merged here and removed. There is no legacy product mode, proposal selector, or
second app connection.
The one-shot proposal API is deprecated in the active ABI. Its relevant policy and
security behavior remain integrated into grant evaluation: commit and contributor
tiers, structural quality, OSI license checks, DAO constitution evaluation,
hash-bound attestations submitted by registered auditor wallets, and a repository
write-access-holder payout assertion. A qualified grant must fit its tier cap in full. The contract rejects an
over-cap plan rather than silently trimming precommitted tranche amounts; its
applicant can create a new plan with lower amounts. Grant funding remains backed
by the owner-managed payable reserve, and recipients still withdraw released
claimable balances through withdraw().
The historical StudioNet contract at
0xBE623B407Cbc54C84Dcba97c6040E7b8469F17cf is preserved in
deployments/archive/studionet-legacy.json.
The archived source revision is recorded there for history; the current source
path now contains the unified contract. The old code has no authorized upgrader,
upgrade entrypoint, or upgradeable root storage, so it cannot be upgraded in place.
The unified Studio Dev deployment is now active. Its address, network, and Explorer
URL are recorded in the single active deployment configuration linked below. The
old StudioNet deployment is not a second active app path, and its records are not
migrated automatically.
DRAFT --repository evaluation--> APPROVED or REJECTED
| |
| applicant cancels | treasury owner funds full plan from reserve
v v
CANCELLED FUNDED / IN_PROGRESS
|
recipient submits current milestone
v
SUBMITTED
consensus adjudication
/ \
APPROVED REJECTED
| retry up to 3
owner or recipient |
releases tranche 3 rejects / deadline
| v
next milestone READY REFUNDABLE
| |
COMPLETED permissionless refund
v
REFUNDED
DRAFT for retry. Malformed or oversized responses are definitive input errors,
not transient network failures. A root Contents
response at GitHub's 1,000-entry cap is checked against the default branch's
recursive Git Trees result (bounded to 100,000 entries and 8 MiB). A truncated or
over-budget tree produces a definitive, actionable incomplete-scan error; no
quality score is recorded and the grant remains DRAFT. The user must reduce the
scan size or contact the treasury owner for manual review before retrying.
Evaluation does not reserve funds.| Field | Value |
|---|---|
| Network | GenLayer Studio Next, chain ID 61997 |
| Contract | 0x755D77CF9878872246220cc1Cd745c47ebd5cB44 |
| Deploy tx | 0xdce62e487ca4aa226164cca6cdb12798d12c8d329e0ec65712ffe1e30f1d4516 (consensus ACCEPTED) |
| Deployer / owner | 0x6ec5cb7469a661b8e23b4867359893a25116ea19 (lexitreasury_v5_deployer) |
| Source SHA-256 | d6c54aa68dc93207294b0df7177b5f492bcd2bdaf195804343bb9462b820f17a |
| Deployed | 2026-10-02T09:41:57Z |
Recorded in deployments/studio-next.json. The
deployed contract's get_accounting() returns is_solvent. The explorer URL formats are unverified. Earlier deployments are superseded (see
superseded_deployments in the record): 0x75b1… still had the removed demo flag, and
0x4Ca6… used gl.vm.get_timestamp(), which the Studio Next runner rejects, so
create_grant failed on-chain; the contract now reads gl.message.raw["datetime"].
fund_grant stamps funded_at on each
milestone. A commit is rejected when its author or committer date predates
funded_at or cannot be parsed. The GitHub API author.login must equal the
grant's verified maintainer login; the spoofable git config name and email are
ignored. Dates are still chosen by the committer, so this blocks replaying old
commits, not date forgery by the maintainer account.ERR_FORKED_REPO_UNSUPPORTED.submitted_at
is recorded). After a 7-day grace window an unreviewed submission may be expired
and refunded, so honest applicants are not timed out by slow adjudication and
escrow cannot be locked forever.UserError text is extracted via data, then
message, then args[0], then str() on both leader and validators, so identical
errors reach the same consensus verdict.get_accounting() exposes contract_balance,
total_liabilities and is_solvent. Liabilities include grant escrow, which a
reserve-plus-claimable check would miss.Produced by scripts/interact_live.py against Studio Next (chain ID 61997) on contract
0x755D77CF9878872246220cc1Cd745c47ebd5cB44 and recorded in
deployments/studio-next.json. Every row below
finished with consensus MAJORITY_AGREE and VM result FINISHED_WITH_RETURN; the
grant repository is moltaphet/LexiTreasury and the grant owner and recipient are the
same account.
| Step | Contract call | Tx | Result |
|---|---|---|---|
| 0 | deploy (new contract) | 0xdce62e48…1d4516 | ACCEPTED |
| 1 | deposit (4 GEN) | 0x5c4c5cff…7387e6 | treasury balance 4 GEN |
| 2a | create_grant (grant_1) | 0xa755b265…8a35bb | executed |
| 3a | evaluate_grant (grant_1) | 0x8b342396…0e4df0 | consensus REJECTED: the original constitution required milestone terms the evaluator cannot see |
| 2b | update_constitution | 0x2fe483ba…c35a6e | milestone clause moved out of the LLM-evaluated policy |
| 2 | create_grant (grant_2, 2 milestones, 3 GEN) | 0x049b7e91…522a60 | executed |
| 3 | evaluate_grant (grant_2) | 0x7684611f…50dc16 | consensus |
Final on-chain accounting: contract balance 2 GEN = reserve 1 GEN + grant escrow 1 GEN
is_solvent: true, 2 GEN released and withdrawn.Notes on what this does and does not show:
funded_at freshness rule specifically. The author-login rule was not
exercised live (covered by direct tests only).gl.vm.get_timestamp() fails on the Studio Next runner, so create_grant could not
succeed; the contract now reads gl.message.raw["datetime"] and direct tests no
longer stub the clock call.frontend/config/studio-dev-deployment.json now carry./tx/<hash>) were not verified in a browser.The app uses one active deployment record:
frontend/config/studio-dev-deployment.json.
It supplies the active contract address, constructor values, Studio Dev RPC,
chain ID, and Studio Next Explorer base. Contract reads, writes, wallet network
settings, and the app's contract Explorer link consume this record; the app builds
the address-specific link from the configured Explorer base and contract address.
The contract has no demo payout path. Eligibility always requires a repository-controlled payout assertion manifest, which anyone with repository write access can change and which does not prove personal approval by the GitHub owner.
| Setting | Value |
|---|---|
| Network | GenLayer Studio Dev / Studio Next preview (release candidate) |
| RPC | https://studio-dev.genlayer.com/api |
| Chain ID | 61997 |
| Explorer | Studio Next preview; address link is built from the active deployment record |
| Runner | 5jycge4q8k23462jtb0b9fyey1s9qz928sz2nbrd9mg4sxqg2qng |
| JS SDK | [email protected] |
| Python client | genlayer-py==0.19.0rc2 |
| Direct test suite | genlayer-test==0.30.0rc2 |
| GenLayer CLI | 0.40.0-rc2 |
These are release-candidate versions. Studio Dev may reset, which can remove test deployments and transactions. Configuration, wallet network selection, and documentation target Studio Dev only. The frontend estimates current per-write fees, submits the transaction with the fee quote, waits for finalization, and checks the SDK success result. A submitted hash alone is not treated as success.
Frontend:
cd frontend
npm install
npm run dev
Contract tools and direct tests use an isolated Python environment:
python3 -m venv .venv
source .venv/bin/activate
python -m pip install -r requirements-studio-dev.txt
genvm-lint check contracts/lexitreasury.py --json
python run_tests.py tests/direct/test_milestone_lifecycle.py -v
Frontend checks:
cd frontend
npm test -- --runInBand
npm run test:integration -- --runInBand
npm run lint
npx tsc --noEmit
npm run build
npm run test:e2e
Direct tests use local execution with mocked GitHub and LLM calls. They do not deploy or submit network transactions. Any future network test must target Studio Dev only. Review the v0.6 migration guide and current GenLayer documentation before selecting updated SDK, CLI, runner, or test versions. Studio Dev is an RC preview and may reset; the active StudioNet archive remains historical and is not used by the app.
The original proposal-only core suite still collects 118 skipped tests because its assertions call entrypoints and state views removed from the active ABI. Its case-by-case disposition and exact replacement test names are in the final scenario audit. The adversarial, consensus, and treasury lifecycle suites were rewritten against the grant state machine and are active. The summary coverage map links the full audit. Skipped legacy assertions are not counted as passing coverage.
author.login equals the
grant's verified maintainer login (the git config name and email are
attacker-controlled and are ignored), and (b) both the author and committer dates
are on or after the milestone's funded_at block timestamp, so a pre-existing
commit cannot be replayed as new work. Limitation: git dates are set by whoever
creates the commit, so this stops replaying existing history but does not stop
someone who controls the maintainer account from forging a date. Organisation-owned
repositories, whose owner login is an organisation, cannot currently satisfy the
author binding.ERR_FORKED_REPO_UNSUPPORTED)
because they inherit upstream history and metrics. The demo payout bypass
(allow_demo_owner_payout) was removed entirely.Content-Length allows early
rejection when provided, while the local byte check occurs after the SDK has
received the body.Content-Length before parsing and checks received bytes when that header
is absent or invalid. The GenLayer web API exposes the response after receiving it,
so the body limit bounds parsing and consensus work but cannot prevent the SDK from
first receiving an oversized body.commit.author.login == maintainer_login. Repositories owned by
GitHub Organizations (where owner is an org entity, not an individual author)
require individual maintainer binding and will be expanded in V3.funded_at check stops replaying
existing history but not a maintainer who forges a date.withdraw() to transfer claimable funds. Anyone may mark
an overdue unapproved milestone refundable and trigger the refund. Refund returns
only unearned escrow to the treasury reserve; earned/released tranches remain
claimable and are not clawed back.contract native balance >= reserve + grant escrow + claimable escrow. Funding moves reserve to grant escrow; release moves grant
escrow to claimable escrow; withdrawal pays claimable escrow; refund moves
unearned grant escrow back to reserve. The contract checks each state transition
and balance bucket. get_accounting() reports contract_balance,
total_liabilities (reserve + grant escrow + claimable escrow) and
is_solvent = contract_balance >= total_liabilities. Grant escrow is included
because funded-but-unreleased tranches are still owed; a check against reserve and
claimable escrow alone would report a contract holding too little as solvent.| 4 | fund_grant | 0x1f98ac94…4c13a0 | 3 GEN moved to grant escrow |
| 5 | submit_evidence (commit bd167a8, authored after funding) | 0x7295f65a…d57d4b | milestone SUBMITTED |
| 6 | adjudicate | 0x120cee17…d59106 | consensus APPROVE / CRITERIA_MET |
| 7a | release_tranche | 0x7ab2b47c…9ad7c6 | 2 GEN to claimable |
| 7b | withdraw | 0xd726e393…5e1187 | 2 GEN paid out |
| 8a | submit_evidence (commit ea64d58, before funding) | 0x47c1d12a…61043e | SUBMITTED |
| 8b | adjudicate | 0xae205781…192c90 | REJECTED / EVIDENCE_INCOMPLETE: response exceeds the review limit (size gate fired first) |
| 9a | submit_evidence (commit 10acd19, before funding) | 0x58e8de8b…e86d1e | SUBMITTED |
| 9b | adjudicate | 0xcd3b9fab…41163a | REJECTED / EVIDENCE_INCOMPLETE: commit predates grant funding |