Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
- Contract name:
- Announcements
- Optimization enabled
- false
- Compiler version
- v0.8.28+commit.7893614a
- EVM Version
- Verified at
- 2026-09-18T22:50:54.622680Z
Constructor Arguments
Announcements.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
/// @title Announcements — what the town's owner has to say, kept on chain.
/// @notice The one contract the owner has any say over, and the only say it gives them: posting an
/// announcement, and pinning one. Every player's own client reads the newest and shows it in
/// chat, with the pinned one, if there is one, above it; the Hall of Records reads the whole
/// list. Nothing is ever edited or removed -- a later announcement is how anything gets
/// corrected. Pinning only picks which one stays up.
/// @dev The owner is whoever deploys it, fixed for good: no transfer, no admin, nothing else to
/// own. Announcements are plain text, up to a few paragraphs.
contract Announcements {
address public immutable owner;
struct Announcement {
string text;
uint64 at; // block timestamp
}
Announcement[] private announcements;
/// The pinned announcement's index plus one; 0 when nothing is pinned.
uint256 private pinnedPlusOne;
uint256 public constant MAX_LENGTH = 2000;
event Announced(uint256 indexed index, string text, uint64 at);
event Pinned(uint256 indexed index);
event Unpinned(uint256 indexed index);
constructor() {
owner = msg.sender;
}
/// @notice Posts an announcement. The owner's alone.
function announce(string calldata text) external {
require(msg.sender == owner, "only the owner makes announcements");
uint256 length = bytes(text).length;
require(length > 0 && length <= MAX_LENGTH, "an announcement is 1 to 2000 bytes");
announcements.push(Announcement({ text: text, at: uint64(block.timestamp) }));
emit Announced(announcements.length - 1, text, uint64(block.timestamp));
}
/// @notice Keeps one announcement up above the newest, until another is pinned or it is unpinned.
function pin(uint256 index) external {
require(msg.sender == owner, "only the owner pins announcements");
require(index < announcements.length, "there is no such announcement");
pinnedPlusOne = index + 1;
emit Pinned(index);
}
/// @notice Takes the pinned announcement down. It stays in the list like every other.
function unpin() external {
require(msg.sender == owner, "only the owner pins announcements");
require(pinnedPlusOne != 0, "nothing is pinned");
uint256 index = pinnedPlusOne - 1;
pinnedPlusOne = 0;
emit Unpinned(index);
}
/// @notice Whether one is pinned, and which.
function pinned() external view returns (bool isPinned, uint256 index) {
if (pinnedPlusOne == 0) return (false, 0);
return (true, pinnedPlusOne - 1);
}
/// @notice How many there have ever been.
function count() external view returns (uint256) {
return announcements.length;
}
/// @notice One of them, oldest first from 0: its text and when it was posted.
function announcement(uint256 index) external view returns (string memory text, uint64 at) {
Announcement storage a = announcements[index];
return (a.text, a.at);
}
}
Compiler Settings
{"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","metadata"]}},"optimizer":{"runs":200,"enabled":true},"evmVersion":"shanghai"}
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[]},{"type":"event","name":"Announced","inputs":[{"type":"uint256","name":"index","internalType":"uint256","indexed":true},{"type":"string","name":"text","internalType":"string","indexed":false},{"type":"uint64","name":"at","internalType":"uint64","indexed":false}],"anonymous":false},{"type":"event","name":"Pinned","inputs":[{"type":"uint256","name":"index","internalType":"uint256","indexed":true}],"anonymous":false},{"type":"event","name":"Unpinned","inputs":[{"type":"uint256","name":"index","internalType":"uint256","indexed":true}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"MAX_LENGTH","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"announce","inputs":[{"type":"string","name":"text","internalType":"string"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"text","internalType":"string"},{"type":"uint64","name":"at","internalType":"uint64"}],"name":"announcement","inputs":[{"type":"uint256","name":"index","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"count","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"pin","inputs":[{"type":"uint256","name":"index","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"isPinned","internalType":"bool"},{"type":"uint256","name":"index","internalType":"uint256"}],"name":"pinned","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"unpin","inputs":[]}]
Contract Creation Code
0x60a0604052348015600e575f5ffd5b503360805260805161091461003f5f395f818160c5015281816102350152818161033c015261050e01526109145ff3fe608060405234801561000f575f5ffd5b5060043610610085575f3560e01c8063b2e8ef1a11610058578063b2e8ef1a14610108578063c3543eb41461011d578063ea0a52371461013c578063fbd5b4e11461014f575f5ffd5b806306661abd14610089578063355d080c1461009f5780638da5cb5b146100c0578063a6f9885c146100ff575b5f5ffd5b5f545b6040519081526020015b60405180910390f35b6100b26100ad3660046105d4565b610157565b6040516100969291906105eb565b6100e77f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610096565b61008c6107d081565b61011b6101163660046105d4565b61022a565b005b610125610306565b604080519215158352602083019190915201610096565b61011b61014a366004610647565b610331565b61011b610503565b60605f5f5f848154811061016d5761016d6106b5565b905f5260205f2090600202019050805f01816001015f9054906101000a900467ffffffffffffffff168180546101a2906106c9565b80601f01602080910402602001604051908101604052809291908181526020018280546101ce906106c9565b80156102195780601f106101f057610100808354040283529160200191610219565b820191905f5260205f20905b8154815290600101906020018083116101fc57829003601f168201915b505050505091509250925050915091565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461027b5760405162461bcd60e51b815260040161027290610701565b60405180910390fd5b5f5481106102cb5760405162461bcd60e51b815260206004820152601d60248201527f7468657265206973206e6f207375636820616e6e6f756e63656d656e740000006044820152606401610272565b6102d6816001610756565b60015560405181907fb64903528ebf1f4a978fdf1e1c9143752717fd769d1d8a3d4a7480662ca17ae6905f90a250565b5f5f6001545f0361031957505f91829150565b600180600154610329919061076f565b915091509091565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146103b45760405162461bcd60e51b815260206004820152602260248201527f6f6e6c7920746865206f776e6572206d616b657320616e6e6f756e63656d656e604482015261747360f01b6064820152608401610272565b8080158015906103c657506107d08111155b61041d5760405162461bcd60e51b815260206004820152602260248201527f616e20616e6e6f756e63656d656e74206973203120746f203230303020627974604482015261657360f01b6064820152608401610272565b6040805160606020601f8601819004028201810183529181018481525f9282919087908790819085018382808284375f92018290525093855250505067ffffffffffffffff4216602092830152835460018101855593815220815191926002020190819061048b90826107e2565b50602091909101516001918201805467ffffffffffffffff191667ffffffffffffffff9092169190911790555f546104c3919061076f565b7f09860f29a8a5c8cd29d072ef35deb766af5abf3ad5af5defc29641f77e9a9ae08484426040516104f69392919061089d565b60405180910390a2505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461054b5760405162461bcd60e51b815260040161027290610701565b6001545f036105905760405162461bcd60e51b81526020600482015260116024820152701b9bdd1a1a5b99c81a5cc81c1a5b9b9959607a1b6044820152606401610272565b5f6001805461059f919061076f565b5f600181905560405191925082917fb85c52b0f39b83725c131bc80760a8947aa15414a0675577938193cc482b24019190a250565b5f602082840312156105e4575f5ffd5b5035919050565b604081525f83518060408401525f5b8181101561061757602081870181015160608684010152016105fa565b505f606082850101526060601f19601f83011684010191505067ffffffffffffffff831660208301529392505050565b5f5f60208385031215610658575f5ffd5b823567ffffffffffffffff81111561066e575f5ffd5b8301601f8101851361067e575f5ffd5b803567ffffffffffffffff811115610694575f5ffd5b8560208284010111156106a5575f5ffd5b6020919091019590945092505050565b634e487b7160e01b5f52603260045260245ffd5b600181811c908216806106dd57607f821691505b6020821081036106fb57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526021908201527f6f6e6c7920746865206f776e65722070696e7320616e6e6f756e63656d656e746040820152607360f81b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561076957610769610742565b92915050565b8181038181111561076957610769610742565b634e487b7160e01b5f52604160045260245ffd5b601f8211156107dd57805f5260205f20601f840160051c810160208510156107bb5750805b601f840160051c820191505b818110156107da575f81556001016107c7565b50505b505050565b815167ffffffffffffffff8111156107fc576107fc610782565b6108108161080a84546106c9565b84610796565b6020601f821160018114610842575f831561082b5750848201515b5f19600385901b1c1916600184901b1784556107da565b5f84815260208120601f198516915b828110156108715787850151825560209485019460019092019101610851565b508482101561088e57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b60408152826040820152828460608301375f606084830101525f6060601f19601f860116830101905067ffffffffffffffff8316602083015294935050505056fea264697066735822122093186dc82d26937d0c7096f8570609ce523a8345ac39054902ae2555dbaa1d2d64736f6c634300081c0033
Deployed ByteCode
0x608060405234801561000f575f5ffd5b5060043610610085575f3560e01c8063b2e8ef1a11610058578063b2e8ef1a14610108578063c3543eb41461011d578063ea0a52371461013c578063fbd5b4e11461014f575f5ffd5b806306661abd14610089578063355d080c1461009f5780638da5cb5b146100c0578063a6f9885c146100ff575b5f5ffd5b5f545b6040519081526020015b60405180910390f35b6100b26100ad3660046105d4565b610157565b6040516100969291906105eb565b6100e77f000000000000000000000000c8cd89650f12b8b565ba89307e072c10579f6aa681565b6040516001600160a01b039091168152602001610096565b61008c6107d081565b61011b6101163660046105d4565b61022a565b005b610125610306565b604080519215158352602083019190915201610096565b61011b61014a366004610647565b610331565b61011b610503565b60605f5f5f848154811061016d5761016d6106b5565b905f5260205f2090600202019050805f01816001015f9054906101000a900467ffffffffffffffff168180546101a2906106c9565b80601f01602080910402602001604051908101604052809291908181526020018280546101ce906106c9565b80156102195780601f106101f057610100808354040283529160200191610219565b820191905f5260205f20905b8154815290600101906020018083116101fc57829003601f168201915b505050505091509250925050915091565b336001600160a01b037f000000000000000000000000c8cd89650f12b8b565ba89307e072c10579f6aa6161461027b5760405162461bcd60e51b815260040161027290610701565b60405180910390fd5b5f5481106102cb5760405162461bcd60e51b815260206004820152601d60248201527f7468657265206973206e6f207375636820616e6e6f756e63656d656e740000006044820152606401610272565b6102d6816001610756565b60015560405181907fb64903528ebf1f4a978fdf1e1c9143752717fd769d1d8a3d4a7480662ca17ae6905f90a250565b5f5f6001545f0361031957505f91829150565b600180600154610329919061076f565b915091509091565b336001600160a01b037f000000000000000000000000c8cd89650f12b8b565ba89307e072c10579f6aa616146103b45760405162461bcd60e51b815260206004820152602260248201527f6f6e6c7920746865206f776e6572206d616b657320616e6e6f756e63656d656e604482015261747360f01b6064820152608401610272565b8080158015906103c657506107d08111155b61041d5760405162461bcd60e51b815260206004820152602260248201527f616e20616e6e6f756e63656d656e74206973203120746f203230303020627974604482015261657360f01b6064820152608401610272565b6040805160606020601f8601819004028201810183529181018481525f9282919087908790819085018382808284375f92018290525093855250505067ffffffffffffffff4216602092830152835460018101855593815220815191926002020190819061048b90826107e2565b50602091909101516001918201805467ffffffffffffffff191667ffffffffffffffff9092169190911790555f546104c3919061076f565b7f09860f29a8a5c8cd29d072ef35deb766af5abf3ad5af5defc29641f77e9a9ae08484426040516104f69392919061089d565b60405180910390a2505050565b336001600160a01b037f000000000000000000000000c8cd89650f12b8b565ba89307e072c10579f6aa6161461054b5760405162461bcd60e51b815260040161027290610701565b6001545f036105905760405162461bcd60e51b81526020600482015260116024820152701b9bdd1a1a5b99c81a5cc81c1a5b9b9959607a1b6044820152606401610272565b5f6001805461059f919061076f565b5f600181905560405191925082917fb85c52b0f39b83725c131bc80760a8947aa15414a0675577938193cc482b24019190a250565b5f602082840312156105e4575f5ffd5b5035919050565b604081525f83518060408401525f5b8181101561061757602081870181015160608684010152016105fa565b505f606082850101526060601f19601f83011684010191505067ffffffffffffffff831660208301529392505050565b5f5f60208385031215610658575f5ffd5b823567ffffffffffffffff81111561066e575f5ffd5b8301601f8101851361067e575f5ffd5b803567ffffffffffffffff811115610694575f5ffd5b8560208284010111156106a5575f5ffd5b6020919091019590945092505050565b634e487b7160e01b5f52603260045260245ffd5b600181811c908216806106dd57607f821691505b6020821081036106fb57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526021908201527f6f6e6c7920746865206f776e65722070696e7320616e6e6f756e63656d656e746040820152607360f81b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561076957610769610742565b92915050565b8181038181111561076957610769610742565b634e487b7160e01b5f52604160045260245ffd5b601f8211156107dd57805f5260205f20601f840160051c810160208510156107bb5750805b601f840160051c820191505b818110156107da575f81556001016107c7565b50505b505050565b815167ffffffffffffffff8111156107fc576107fc610782565b6108108161080a84546106c9565b84610796565b6020601f821160018114610842575f831561082b5750848201515b5f19600385901b1c1916600184901b1784556107da565b5f84815260208120601f198516915b828110156108715787850151825560209485019460019092019101610851565b508482101561088e57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b60408152826040820152828460608301375f606084830101525f6060601f19601f860116830101905067ffffffffffffffff8316602083015294935050505056fea264697066735822122093186dc82d26937d0c7096f8570609ce523a8345ac39054902ae2555dbaa1d2d64736f6c634300081c0033