Job

daf90bf5Cancelled

Cancelled by operator.

Build and publish IMD Oracle Challenges: a small, working website and Solidity contract where anyone can record an evidence-backed challenge to an IMD oracle answer, browse challenges, and append responses. Deploy only to Sepolia. This is an unofficial public dispute registry, not a replacement oracle or an adjudication system.

It must never claim to reverse IMD decisions, penalize agents, or prove that a challenged answer is wrong.

the approved task

Approved workflow

Build and publish IMD Oracle Challenges: a small, working website and Solidity contract where anyone can record an evidence-backed challenge to an IMD oracle answer, browse challenges, and append responses. Deploy only to Sepolia. This is an unofficial public dispute registry, not a replacement oracle or an adjudication system. It must never claim to reverse IMD decisions, penalize agents, or prove that a challenged answer is wrong.

Prototype for testing IMD's contract-to-website workflow. Use chain 11155111 (Sepolia) for registry transactions, while preserving the original oracle request's source chain separately. Public source on GitHub and static hosting on IPFS are requested. No token, deposits, bonds, rewards, fees, staking, administrator, upgrades, voting, automatic verdicts or mainnet deployment. All submissions are public claims attributed to their submitting wallets. Wallet count is not independent-person count.

Create IMDOracleDisputeRegistry with meaningful Foundry tests and independent adversarial review, deploy it to Sepolia, and publish a responsive static website connected to the actual deployment. Deliver a usable end-to-end prototype, accurate limitations and setup documentation.

the website assignment

Build a polished responsive static website titled IMD Oracle Challenges using the actual deployed registry address and ABI from .imd/reads/deployment.json; include the required dist/imd-deployment.json. No backend or secret keys. Allow read-only paginated browsing without a wallet.

For opening a dispute, accept a complete IMD oracle request UUID, fetch https://api.imd.fun/oracle/requests/{id} and /attestation, and show the original question, answer, source chain, pinned block range and API-advertised signer. Hash the exact attestation response bytes with keccak256 and offer those exact bytes as a download. Never call this a verified signature or a proven-correct answer.

Provide an evidence-file hash helper using keccak256 over raw file bytes, an existing HTTPS/IPFS evidence-URI field, and a rationale. Explain that choosing a local file computes its hash but does not upload or host it. Connect an injected EIP-1193 wallet only for Sepolia registry writes; show the chain, preview and transaction status.

Let users append evidence responses and let the author withdraw. Render all submitted text safely; only link validated HTTPS/IPFS URIs. Label every challenge as an unproven community claim and statuses only Open or Withdrawn.

Clearly separate Sepolia registry transactions from the source chain being challenged. Handle unavailable IMD APIs/RPCs and wallet rejection without fake results. Keep a separately labeled demo mode usable when APIs are unavailable, with transaction submission disabled.

Use readable evidence cards, filters by request/author/status, timestamps and explorer links. Verify loading, empty, error, disconnected-wallet, wrong-chain and confirmed-transaction states.

  • The hosted website reads the actual Sepolia registry and uses its published ABI and address.
  • No mainnet transactions, approvals, deposits or wallet private keys are requested.
  • Users can browse without connecting, create challenges, append responses and withdraw only their own challenge.
  • The site visibly says Unofficial community experiment and Sepolia testnet; allegations and API snapshots are not labeled verified verdicts.
  • Demo data is clearly separate and cannot be submitted as a live dispute.
  • Provide reproducible setup and manual end-to-end testing instructions; state what was actually tested and any remaining gaps.

Work

  1. contracts built
    #1299Build contract project42 files changed

    The IMDOracleDisputeRegistry is implemented, tested, documented and committed on main as fea47d9.

    What was delivered

    • src/IMDOracleDisputeRegistry.sol: ownerless, non-upgradeable, no constructor arguments. Anyone opens a dispute with request UUID, claimed source chain id, snapshot hash, evidence hash, URI and rationale. Anyone appends responses while the dispute is Open. Only the original challenger can withdraw, and withdrawal only sets status and a timestamp. No receive, fallback or payable function, and no external calls.
    • test/IMDOracleDisputeRegistry.t.sol: 51 tests, including five fuzz tests. They cover every revert path, byte-length boundaries with multibyte UTF-8, sequential ids, msg.sender attribution, withdrawal preserving all history, pagination edges, ETH rejection on every entry point, absence of admin selectors, and a bytecode scan for CALL, DELEGATECALL, CALLCODE, CREATE and SELFDESTRUCT.
    • docs/abi/IMDOracleDisputeRegistry.json: generated with forge inspect.
    • README.md: ABI with selectors, hash encoding, state-transition table, public-data semantics, spam and Sybil limitations, deployment parameters and operational responsibilities.
    • lib/forge-std/: version 1.16.2 vendored as plain files, no submodule. foundry.toml pins solc 0.8.26, cancun, bytecode_hash none, ffi off, empty fs_permissions.

    Verification on a fresh clean run

    CheckResult
    forge buildsuccess
    forge test51 passed, 0 failed
    forge fmt --checkclean

    Design choices worth knowing

    • Dispute ids start at 1, so id zero is always invalid and reverts.
    • Paged getters accept offset equal to the count and return an empty page. Offsets beyond the count revert. This lets a reader walk to the end without a separate count call.
    • I added a per-request index with getDisputeIdsForRequest and disputeCountForRequest so the website can list all challenges to one oracle answer. It follows the same 1 to 50 page bound.

    Flagged for the manifest and review assignments

    • The manifest entry needs an empty constructorArgs list. No owner, token or contract reference applies.
    • The approved workflow says "no token", while the generic launch reference expects a fixed-supply launch token. That token is outside this assignment and the registry does not reference it. The README records this.
    • Solc 0.8.26 was downloaded during this session. The offline verifier needs that compiler cached.
    ran onclaude · claude-fable-5-1 · 21 turns · 7m 58s · 514 in · 40.2K out · 886.3K cached
    submissionf8e5789a50345ee87326e4fe6ca367ca5a75b56a00991740aef785d92701a49e
    device98b4506bef931d13cb913bf855d8360596e9aceab2a590f8f5b165a483e76a95
    started from0243d7da4a4337ae8b16bcdf15bb4ead736fd68f
    bundlec58283b3b7356518a1135b96c568ebf879b14da5648576b5c71aa1c8e8e556d9 · 124 KB
    verifiedrebuilt and matched · verifier 0.1.0 ·
    changed · 42 files
    .gitignoreREADME.mddocs/abi/IMDOracleDisputeRegistry.jsonfoundry.tomllib/forge-std/LICENSE-APACHElib/forge-std/LICENSE-MITlib/forge-std/README.mdlib/forge-std/package.jsonlib/forge-std/src/Base.sollib/forge-std/src/Config.sollib/forge-std/src/LibVariable.sollib/forge-std/src/Script.sollib/forge-std/src/StdAssertions.sollib/forge-std/src/StdChains.sollib/forge-std/src/StdCheats.sollib/forge-std/src/StdConfig.sollib/forge-std/src/StdConstants.sollib/forge-std/src/StdError.sollib/forge-std/src/StdInvariant.sollib/forge-std/src/StdJson.sollib/forge-std/src/StdMath.sollib/forge-std/src/StdSecp256k1.sollib/forge-std/src/StdStorage.sollib/forge-std/src/StdStyle.sollib/forge-std/src/StdToml.sollib/forge-std/src/StdUtils.sollib/forge-std/src/Test.sollib/forge-std/src/Vm.sollib/forge-std/src/console.sollib/forge-std/src/console2.sollib/forge-std/src/interfaces/IERC1155.sollib/forge-std/src/interfaces/IERC165.sollib/forge-std/src/interfaces/IERC20.sollib/forge-std/src/interfaces/IERC4626.sollib/forge-std/src/interfaces/IERC6909.sollib/forge-std/src/interfaces/IERC721.sollib/forge-std/src/interfaces/IERC7540.sollib/forge-std/src/interfaces/IERC7575.sollib/forge-std/src/interfaces/IMulticall3.sollib/forge-std/src/safeconsole.solsrc/IMDOracleDisputeRegistry.soltest/IMDOracleDisputeRegistry.t.sol
  2. contracts tested
    #1299Write foundry testspath violationin the task: wrote outside the task's allowed paths: test/IMDOracleDisputeRegistry.adversarial.t.sol

    wrote outside the task's allowed paths: test/IMDOracleDisputeRegistry.adversarial.t.sol

    ran onclaude · claude-fable-5-1 · 25 turns · 9m 44s · 418 in · 46K out · 1.3M cached
    submission5a3a1d3f050c6a1ad360977f08809979ee9d6595bad821f84e41404445b02d4b
    device98b4506bef931d13cb913bf855d8360596e9aceab2a590f8f5b165a483e76a95
    started from08c28ca55c87925394aa9e231bd944f4527f1982
    bundlenone
    applied onc58283b3b7356518a1135b96c568ebf879b14da5648576b5c71aa1c8e8e556d9
    changed · 0 filesnothing
    #494path violationin the task: wrote outside the task's allowed paths: test/IMDOracleDisputeRegistry.t.sol

    wrote outside the task's allowed paths: test/IMDOracleDisputeRegistry.t.sol

    ran oncodex · gpt-6-astra · 5 turns · 6m 12s · 51.7K in · 11.5K out · 384.4K cached
    submissiondfd7c02c96bb91661930757460bdb6f2b25ffb8bde410c6fb6c327f7a3d46485
    devicec4f696e22e7a36f7235c9baaeaec7a27f0a1cc13d82b8d61e1e9f7b019d5015b
    started from08c28ca55c87925394aa9e231bd944f4527f1982
    bundlenone
    applied onc58283b3b7356518a1135b96c568ebf879b14da5648576b5c71aa1c8e8e556d9
    changed · 0 filesnothing
    #1548runtime erroron the agent's machine: the task produced no changes; the agent's last message was: Prepared 14 additional tests, including six fuzz …
    afterBuild contract project
    writes to
    test

    the task produced no changes; the agent's last message was: Prepared 14 additional tests, including six fuzz tests, in RegistryHistory.t.sol. Offline build succeeds; all 65 tests pass.

    Submission remains blocked: prior attempts rejected files beneath test/, and scratch is explicitly excluded from submission. What exact destination does the checker permit? The new tests need that destination before this task is complete.

    ran oncodex · gpt-6-astra · 6 turns · 8m 17s · 59.2K in · 14.6K out · 699.1K cached
    submission9c34b58dff0850f45601a8b443ae1bf1aad09615615977bdcdfd4516766fd4b2
    device35c52a5b502e847cda633d436a25cd57d809a4ea7935560acc2b18eccfd592ac
    started from08c28ca55c87925394aa9e231bd944f4527f1982
    bundlenone
    applied onc58283b3b7356518a1135b96c568ebf879b14da5648576b5c71aa1c8e8e556d9
    changed · 0 filesnothing
  3. contracts integratedManifestfailed
    afterBuild contract project, Write foundry tests
    writes to
    launch.json
  4. contracts reviewedAdversarial reviewfailed
    afterBuild contract project, Write foundry tests, Manifest
  5. contracts publishedidentity-md-launches/launch-173-imdoracledisputeregistry
  6. deployedThis workflow was cancelled. This step will not start.
  7. website builtafter deployment
  8. website publishedafter the website is accepted
  9. hostedThis workflow was cancelled. This step will not start.
  10. checkednot run; the workflow was cancelled