Earlyout
Developers

Contracts, APIs and the public book.

Everything runs on Arc testnet (chain 5042002). USDC is 0x3600000000000000000000000000000000000000, 6 decimals.

Contracts

Deployed from Arc Studio, owned by the ops wallet.

ContractAddressRole
Vault0x7A40b36b…2e2319ERC-4626 vault over USDC: quote, sell, buy, settle, markImpaired
ClaimWrapper0xfc7E6ECF…115952deposit, depositAndSell, collect, redeem
ClaimToken0x39006ed8…61B090ERC-1155 claims, one id per fund and payout date
NavOracle0xCd55924a…c4A08bChainlink Runtime Environment (CRE) receiver: NAV, time, issuer status
FundRegistry0x63469718…83dCe4Listed funds and pricing terms
IssuerStub0x2b492aD3…516EbeStand-in issuer redemption desk
ACRED (stand-in)0xCd5DE841…1683E2Fund token, 90-day payout
ACREDd (demo)0x8d9FF934…76d06FFund token, 15-minute payout
Quote

Price a sale before it exists.

cast call 0x7A40b36b012DC19b1f42dd68C13F4daE312e2319 \
  "quoteFund(address,uint256)((uint8,string,uint256,uint64,uint16,uint16,uint16,uint16,uint256,uint256))" \
  0x8d9FF934E08DA9f8AEbF2280dAD218e8d176d06F 1000000000000000 \
  --rpc-url https://rpc.testnet.arc.io
# (verdict, reason, nav, navUpdatedAt, baseBps, utilBps, timeBps, creditBps, payout, capacityLeft)
HTTP API

Served by the app.

GET  /api/issuer-status?fund=0x...   {"status":"OK"} or {"status":"FAILED"}; the API CRE reads
GET  /api/book                       open claims and the fund directory, read from Arkiv
POST /api/nav/push                   carry the Chainlink NAV and issuer status to the oracle
POST /api/arkiv/sync                 index new Arc events into Arkiv
Oracle reports

One encoding for CRE and every other writer.

  1. Chainlink NAV feedThe fund's net asset value, on Ethereum mainnet.
  2. Issuer statusWhether the issuer is paying: OK or FAILED.
  3. Chainlink CRENodes read both, agree, and sign one report.
  4. NavOracle on ArcAccepts only signed reports from the forwarder.
  5. VaultPrices every sale from it, and halts on bad news.
  6. Arkiv bookEach sale is written to a public database.
report = abi.encode(address fund, uint256 nav, uint8 navDecimals, uint64 updatedAt, uint8 status)
// status 0 = OK, 1 = FAILED. Equal updatedAt accepted, older rejected, more than 5 minutes ahead rejected.
// The CRE workflow is in cre/nav-bridge: cron, mainnet feed read, issuer API, writeReport to arc-testnet.
Run it

Clone, test, query.

git clone https://github.com/ETH-Global-Mumbai-2026/earlyout
cd earlyout/contracts && forge install foundry-rs/forge-std OpenZeppelin/openzeppelin-contracts@v5.7.0 --no-git && forge test
cd ../web && pnpm install && pnpm arkiv:query
cd ../cre && cre workflow simulate ./nav-bridge --target staging-settings