Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
- Contract name:
- PopAnchor
- Optimization enabled
- true
- Compiler version
- v0.8.26+commit.8a97fa7a
- Optimization runs
- 200
- EVM Version
- paris
- Verified at
- 2026-10-27T22:12:45.901255Z
Constructor Arguments
0x00000000000000000000000074197aeedf843ba4a72fc9cc0111905645b2ebe3
Arg [0] (<b>address</b>) : <a href="{#{address_path(@conn, :show, @address)}}">0x74197aeedf843ba4a72fc9cc0111905645b2ebe3</a>
PopAnchor.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.26;
/// @title PopAnchor — Merkle-root anchor for Zero Chill game runs and Proof of Play results.
/// @notice Holds no funds, has no upgrade path. Only `poster` can post roots; only `owner`
/// can rotate the poster or hand over ownership.
contract PopAnchor {
address public owner;
address public poster;
uint256 public seq;
mapping(uint8 => bytes32) private _latestRoot;
event RootPosted(
uint256 indexed seq,
bytes32 indexed root,
uint8 indexed kind,
uint64 windowStart,
uint64 windowEnd,
uint32 leafCount,
bytes32 prevRoot
);
event PosterChanged(address indexed previousPoster, address indexed newPoster);
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
error NotOwner();
error NotPoster();
error ZeroAddress();
error BadKind();
error BadWindow();
error EmptyRoot();
error PrevRootMismatch(bytes32 expected, bytes32 given);
constructor(address initialPoster) {
if (initialPoster == address(0)) revert ZeroAddress();
owner = msg.sender;
poster = initialPoster;
emit OwnershipTransferred(address(0), msg.sender);
emit PosterChanged(address(0), initialPoster);
}
/// @param kind 1 = game runs, 2 = PoP results, 3 = backfill
function postRoot(
bytes32 root,
uint64 windowStart,
uint64 windowEnd,
uint32 leafCount,
uint8 kind,
bytes32 prevRoot
) external {
if (msg.sender != poster) revert NotPoster();
if (kind < 1 || kind > 3) revert BadKind();
if (root == bytes32(0) || leafCount == 0) revert EmptyRoot();
if (windowEnd < windowStart) revert BadWindow();
bytes32 last = _latestRoot[kind];
if (prevRoot != last) revert PrevRootMismatch(last, prevRoot);
_latestRoot[kind] = root;
unchecked { seq += 1; }
emit RootPosted(seq, root, kind, windowStart, windowEnd, leafCount, prevRoot);
}
function latestRoot(uint8 kind) external view returns (bytes32) {
return _latestRoot[kind];
}
function setPoster(address newPoster) external {
if (msg.sender != owner) revert NotOwner();
if (newPoster == address(0)) revert ZeroAddress();
emit PosterChanged(poster, newPoster);
poster = newPoster;
}
function transferOwnership(address newOwner) external {
if (msg.sender != owner) revert NotOwner();
if (newOwner == address(0)) revert ZeroAddress();
emit OwnershipTransferred(owner, newOwner);
owner = newOwner;
}
}
Compiler Settings
{"outputSelection":{"*":{"*":["*"],"":["*"]}},"optimizer":{"runs":200,"enabled":true},"metadata":{"bytecodeHash":"ipfs"},"libraries":{},"evmVersion":"paris"}
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"initialPoster","internalType":"address"}]},{"type":"error","name":"BadKind","inputs":[]},{"type":"error","name":"BadWindow","inputs":[]},{"type":"error","name":"EmptyRoot","inputs":[]},{"type":"error","name":"NotOwner","inputs":[]},{"type":"error","name":"NotPoster","inputs":[]},{"type":"error","name":"PrevRootMismatch","inputs":[{"type":"bytes32","name":"expected","internalType":"bytes32"},{"type":"bytes32","name":"given","internalType":"bytes32"}]},{"type":"error","name":"ZeroAddress","inputs":[]},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"PosterChanged","inputs":[{"type":"address","name":"previousPoster","internalType":"address","indexed":true},{"type":"address","name":"newPoster","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"RootPosted","inputs":[{"type":"uint256","name":"seq","internalType":"uint256","indexed":true},{"type":"bytes32","name":"root","internalType":"bytes32","indexed":true},{"type":"uint8","name":"kind","internalType":"uint8","indexed":true},{"type":"uint64","name":"windowStart","internalType":"uint64","indexed":false},{"type":"uint64","name":"windowEnd","internalType":"uint64","indexed":false},{"type":"uint32","name":"leafCount","internalType":"uint32","indexed":false},{"type":"bytes32","name":"prevRoot","internalType":"bytes32","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"latestRoot","inputs":[{"type":"uint8","name":"kind","internalType":"uint8"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"postRoot","inputs":[{"type":"bytes32","name":"root","internalType":"bytes32"},{"type":"uint64","name":"windowStart","internalType":"uint64"},{"type":"uint64","name":"windowEnd","internalType":"uint64"},{"type":"uint32","name":"leafCount","internalType":"uint32"},{"type":"uint8","name":"kind","internalType":"uint8"},{"type":"bytes32","name":"prevRoot","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"poster","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"seq","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setPoster","inputs":[{"type":"address","name":"newPoster","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]}]
Contract Creation Code
0x608060405234801561001057600080fd5b5060405161066838038061066883398101604081905261002f916100e7565b6001600160a01b0381166100565760405163d92e233d60e01b815260040160405180910390fd5b60008054336001600160a01b031991821681178355600180549092166001600160a01b038516179091556040519091907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a36040516001600160a01b038216906000907f32487a31d5a41d672510a2a1aa50e214e52d5d25fd9a9e94dfa66f4349f8840f908290a350610117565b6000602082840312156100f957600080fd5b81516001600160a01b038116811461011057600080fd5b9392505050565b610542806101266000396000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c8063809597211161005b57806380959721146100c65780638da5cb5b146100f1578063ed4685ac14610104578063f2fde38b1461012757600080fd5b80634cbdaca0146100825780636857ab401461009757806373bbb71c146100b3575b600080fd5b61009561009036600461044e565b61013a565b005b6100a060025481565b6040519081526020015b60405180910390f35b6100956100c13660046104c1565b6102c5565b6001546100d9906001600160a01b031681565b6040516001600160a01b0390911681526020016100aa565b6000546100d9906001600160a01b031681565b6100a06101123660046104f1565b60ff1660009081526003602052604090205490565b6100956101353660046104c1565b610373565b6001546001600160a01b0316331461016557604051630edd024760e11b815260040160405180910390fd5b60018260ff16108061017a575060038260ff16115b156101985760405163015a1a6160e51b815260040160405180910390fd5b8515806101a9575063ffffffff8316155b156101c7576040516329e7276760e11b815260040160405180910390fd5b8467ffffffffffffffff168467ffffffffffffffff1610156101fc57604051632a0c9bb560e11b815260040160405180910390fd5b60ff821660009081526003602052604090205481811461023d57604051632a533a6d60e21b8152600481018290526024810183905260440160405180910390fd5b60ff83166000818152600360209081526040918290208a90556002805460010190819055825167ffffffffffffffff8b811682528a169281019290925263ffffffff8816828401526060820186905291518a92917f0a5ef99accb113919ce56c54260590c5e6b1da3393520d3634a9b87c3757c02f919081900360800190a450505050505050565b6000546001600160a01b031633146102f0576040516330cd747160e01b815260040160405180910390fd5b6001600160a01b0381166103175760405163d92e233d60e01b815260040160405180910390fd5b6001546040516001600160a01b038084169216907f32487a31d5a41d672510a2a1aa50e214e52d5d25fd9a9e94dfa66f4349f8840f90600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331461039e576040516330cd747160e01b815260040160405180910390fd5b6001600160a01b0381166103c55760405163d92e233d60e01b815260040160405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b803567ffffffffffffffff8116811461043857600080fd5b919050565b803560ff8116811461043857600080fd5b60008060008060008060c0878903121561046757600080fd5b8635955061047760208801610420565b945061048560408801610420565b9350606087013563ffffffff8116811461049e57600080fd5b92506104ac6080880161043d565b9598949750929591949360a090920135925050565b6000602082840312156104d357600080fd5b81356001600160a01b03811681146104ea57600080fd5b9392505050565b60006020828403121561050357600080fd5b6104ea8261043d56fea264697066735822122052a94d87552d561907998bb245ad6112883a497df7fd5867bbbef284a15f8b9c64736f6c634300081a003300000000000000000000000074197aeedf843ba4a72fc9cc0111905645b2ebe3
Deployed ByteCode
0x608060405234801561001057600080fd5b506004361061007d5760003560e01c8063809597211161005b57806380959721146100c65780638da5cb5b146100f1578063ed4685ac14610104578063f2fde38b1461012757600080fd5b80634cbdaca0146100825780636857ab401461009757806373bbb71c146100b3575b600080fd5b61009561009036600461044e565b61013a565b005b6100a060025481565b6040519081526020015b60405180910390f35b6100956100c13660046104c1565b6102c5565b6001546100d9906001600160a01b031681565b6040516001600160a01b0390911681526020016100aa565b6000546100d9906001600160a01b031681565b6100a06101123660046104f1565b60ff1660009081526003602052604090205490565b6100956101353660046104c1565b610373565b6001546001600160a01b0316331461016557604051630edd024760e11b815260040160405180910390fd5b60018260ff16108061017a575060038260ff16115b156101985760405163015a1a6160e51b815260040160405180910390fd5b8515806101a9575063ffffffff8316155b156101c7576040516329e7276760e11b815260040160405180910390fd5b8467ffffffffffffffff168467ffffffffffffffff1610156101fc57604051632a0c9bb560e11b815260040160405180910390fd5b60ff821660009081526003602052604090205481811461023d57604051632a533a6d60e21b8152600481018290526024810183905260440160405180910390fd5b60ff83166000818152600360209081526040918290208a90556002805460010190819055825167ffffffffffffffff8b811682528a169281019290925263ffffffff8816828401526060820186905291518a92917f0a5ef99accb113919ce56c54260590c5e6b1da3393520d3634a9b87c3757c02f919081900360800190a450505050505050565b6000546001600160a01b031633146102f0576040516330cd747160e01b815260040160405180910390fd5b6001600160a01b0381166103175760405163d92e233d60e01b815260040160405180910390fd5b6001546040516001600160a01b038084169216907f32487a31d5a41d672510a2a1aa50e214e52d5d25fd9a9e94dfa66f4349f8840f90600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331461039e576040516330cd747160e01b815260040160405180910390fd5b6001600160a01b0381166103c55760405163d92e233d60e01b815260040160405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b803567ffffffffffffffff8116811461043857600080fd5b919050565b803560ff8116811461043857600080fd5b60008060008060008060c0878903121561046757600080fd5b8635955061047760208801610420565b945061048560408801610420565b9350606087013563ffffffff8116811461049e57600080fd5b92506104ac6080880161043d565b9598949750929591949360a090920135925050565b6000602082840312156104d357600080fd5b81356001600160a01b03811681146104ea57600080fd5b9392505050565b60006020828403121561050357600080fd5b6104ea8261043d56fea264697066735822122052a94d87552d561907998bb245ad6112883a497df7fd5867bbbef284a15f8b9c64736f6c634300081a0033