Training round
Pricing
Protocol
Bring dataOpen app

Contracts

Robinhood Chain, chain id 4663. Explorer: Blockscout.

ContractAddressRole
NodalPayouts0x406A19Cf933866e7087c4d4973D330F5350282e5x402 payTo, settlement, roots, claims (address reserved by the deployer's first deployment; not deployed yet)
NodalStake0xD3e4039c24F3BF964fb941601269fF535552E2e2Stake for vote weight and the USDG stake share
USDG0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168Settlement asset, EIP-3009
Deployer0x8E60F3e54509F8D8cc3e9E4501759C4A72830291Deploys and keeps the keeper role

NodalPayouts

settleBatch(Auth[] auths) returns (uint256 settled)
postRoot(bytes32 root, uint256 totalCumulative, string uri)     // keeper
claim(address account, uint256 cumulative, bytes32[] proof)
withdrawUnallocated(address to, uint256 amount)                 // owner, unallocated only
proposeKeeper(address) / applyKeeper()                          // owner, 24 h timelock
events: Settled, SettleFailed, RootPosted, Claimed

NodalStake

stake(uint256) / requestUnstake(uint256) / withdraw()            // 3 day cooldown
notifyReward(uint256)            // USDG, distributed pro rata to active stake
claimReward() / earned(address) / stakedOf(address)              // stakedOf = vote weight

Both contracts are covered by unit, fuzz and invariant tests, and by a fork run against the live USDG.