Skip to content
Thenar

Contracts

Every contract this protocol has deployed on Arc, what it does, and the surface that uses it. Addresses, code size, balances and the readings below are called at the moment this page is requested — nothing here is copied from a document.

Deployed 10Superseded 0Held on chain 1.705409 USDCReachable only here 0

Tasks, USDC escrow, trajectories, policies and licences. Records a run and pays for it in USDC in one call. submitTrajectoryFor is permissionless: anyone may pay the gas for someone else's run, because the verifier signature binds the task, the contributor, the hash and the score, so relaying moves who pays and forges nothing. createTaskWithAuthorization funds a task from a sponsor's EIP-3009 signature.

Arc Escrows Circle's native USDC at 0x3600…0000 and pulls a sponsor's funding with USDC's own receiveWithAuthorization, so a task can be funded by a signature and relayed with gas paid in the same USDC.

19,031 bytes1.705409 USDCcontracts/src/ThenarProtocol.solused by /hub, /station, /task, /run, /leaderboard, /portfolio, /post
Tasks
10
Paid runs
4
Policies
0
Escrow cap per task
100 USDC

The verifier's public record: every paid run is written to Arc's ERC-8004 Reputation Registry against the verifier's agent id (tag runVerdict, value = score, feedbackHash = the run id).

Arc Writes to the ERC-8004 Identity and Reputation registries Circle deployed on Arc.

2,984 bytes0 USDCcontracts/src/ThenarVerdicts.solused by /agents, /contracts, /run
Verifier agent (ERC-8004)
#2427
Verdicts
4
Written to the Reputation Registry
4
Mean verdict
87.78 / 100

Soulbound token naming a run's recorder. Conveys no rights over the data.

4,281 bytes0 USDCcontracts/src/TrajectoryCertificate.solused by /contracts, /run

A running total of work recorded, in a shape wallets already read. Cannot be transferred, sold or redeemed.

1,567 bytes0 USDCcontracts/src/ContributionRecord.solused by /contracts, /operator, /portfolio
Work recorded
0 CONTRIB

The corpus as shares. Only an operator admitted with a passkey can hold one; each paid run issues its share by score, and USDC dividends from corpus sales pay whoever held at a record date fixed in advance.

6,338 bytes0 USDCcontracts/src/CorpusShares.solused by /corpus-token, /station

Every corpus sale: x402, licence or Gateway, with the sha256 of the bytes served and the buyer's ERC-8004 agent id, so a buyer can check its copy on chain.

1,827 bytes0 USDCcontracts/src/SalesLog.solused by /agents, /api/agent/sales
Sales logged
3

One Merkle root per task over every accepted episode, committed by the verifier, every version kept.

2,044 bytes0 USDCcontracts/src/CorpusManifest.solused by /corpus, /api/task/{id}/manifest

What the audit keeper found when it rebuilt each task's root from the episodes this server serves and compared it with CorpusManifest: matches, grown, short or altered.

2,137 bytes0 USDCcontracts/src/CorpusAudit.solused by /corpus, /api/task/{id}/manifest

Corpus licences bought from Base or Ethereum: CCTP V2 burns the buyer's USDC to this contract, Chainlink CCIP carries the order, and it licenses the policy on the buyer's behalf.

Arc Arc's CCIP lane and CCTP domain 26: the dollars and the message arrive separately and are matched here.

10,701 bytes0 USDCcontracts/src/ccip/ThenarCcipReceiver.solused by /buy, /contracts
Licences bought over CCIP
0
Awaiting the CCTP mint
0 USDC
Held for buyers
0 USDC

Binds a secp256r1 public key to an address and verifies signatures through the P-256 precompile at 0x0100.

Arc Arc's P-256 precompile (EIP-7951) at 0x0100 checks a browser passkey's signature on chain.

1,814 bytes0 USDCcontracts/src/PasskeyRegistry.solused by /passkey
Every write, and what it cost

Every transaction sent to the protocol contract, from the Arc explorer’s index rather than from anything we store — including the ones that reverted, which a ledger of accepted runs by definition cannot show. The method is resolved from the selector against the deployed contract’s own compiler artifact rather than against the pruned ABI this interface calls — which is why submitTrajectoryFor and fundTask appear here by name. They are real functions of this contract that no page sends, made by scripts and other callers, and against the interface’s ABI they read as unrecognised selectors.

Arc's explorer returned 403 Everything above is read straight from the node and is unaffected.

Circle and Chainlink on Arc

The contracts Thenar calls but did not deploy: Circle’s USDC (the escrow and the gas), Arc’s Memo, the ERC-8004 registries, CCTP V2 and Gateway for moving USDC between chains, and Chainlink’s CCIP router. Deployment and current contract reads are shown here; completed flows and fork checks are documented separately. What each one does here →

Source for every entry is in this repository (contracts/src), verified on the Arc explorer at deployment. The ABI the app calls is generated from the compiler’s own artifacts by scripts/gen-abi.mjs, so it cannot describe a function the deployed contract does not have. /api/contract returns the protocol contract’s address, chain and full ABI.