Contract Overview
My Name Tag:
Not Available, login to update
[ Download CSV Export ]
Contract Name:
Wiki
Compiler Version
v0.8.15+commit.e14f2714
Optimization Enabled:
Yes with 20000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: AGPL-3.0 pragma solidity ^0.8.13; import {Owned} from "solmate/auth/Owned.sol"; import {IValidator} from "./Validator/IValidator.sol"; /// @title Wiki /// @author kesar.eth /// @notice A contract to publish wikis contract Wiki is Owned { /// ----------------------------------------------------------------------- /// Errors /// ----------------------------------------------------------------------- error WikiNotValid(); error InvalidSignature(); error DeadlineExpired(); /// ----------------------------------------------------------------------- /// Events /// ----------------------------------------------------------------------- event Posted(address indexed _from, string _ipfs); /// ----------------------------------------------------------------------- /// Storage variables /// ----------------------------------------------------------------------- /// @notice contract that validates if wiki should be pushed IValidator private validator; /// ----------------------------------------------------------------------- /// Immutable parameters /// ----------------------------------------------------------------------- /// @dev keccak256("SignedPost(string ipfs,address user,uint256 deadline)") bytes32 private constant SIGNED_POST_TYPEHASH = 0x2786d465b1ae76a678938e05e206e58472f266dfa9f8534a71c3e35dc91efb45; /// @notice the EIP-712 domain separator bytes32 private immutable EIP_712_DOMAIN_SEPARATOR = keccak256( abi.encode( keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), keccak256(bytes("EP")), keccak256(bytes("1")), _chainID(), address(this) ) ); /// ----------------------------------------------------------------------- /// Constructor /// ----------------------------------------------------------------------- constructor(address _validator) Owned(msg.sender) { validator = IValidator(_validator); } /// @notice Set a validator for wikis /// @param _validator validator contract address function setValidator(IValidator _validator) onlyOwner external { validator = _validator; } /// ----------------------------------------------------------------------- /// External functions /// ----------------------------------------------------------------------- /// @notice Post IPFS hash /// @param ipfs The IPFS Hash function post(string calldata ipfs) external { if (validator.validate(msg.sender, ipfs) == false) { revert WikiNotValid(); } emit Posted(msg.sender, ipfs); } /// @notice Post IPFS hash given an EIP-712 signature /// @param ipfs The IPFS Hash /// @param _user The user to approve the module for /// @param _deadline The deadline at which point the given signature expires /// @param _v The 129th byte and chain ID of the signature /// @param _r The first 64 bytes of the signature /// @param _s Bytes 64-128 of the signature function postBySig( string calldata ipfs, address _user, uint256 _deadline, uint8 _v, bytes32 _r, bytes32 _s ) external { if (_deadline < block.timestamp) { revert DeadlineExpired(); } bytes32 digest = keccak256( abi.encodePacked( "\x19\x01", EIP_712_DOMAIN_SEPARATOR, keccak256(abi.encode(SIGNED_POST_TYPEHASH, keccak256(bytes(ipfs)), _user, _deadline)) ) ); address recoveredAddress = ecrecover(digest, _v, _r, _s); if (recoveredAddress == address(0) || recoveredAddress != _user) { revert InvalidSignature(); } if (validator.validate(_user, ipfs) == false) { revert WikiNotValid(); } emit Posted(recoveredAddress, ipfs); } /// ----------------------------------------------------------------------- /// Internal functions /// ----------------------------------------------------------------------- function _chainID() private view returns (uint256 id) { assembly { id := chainid() } } /// ----------------------------------------------------------------------- /// Getters /// ----------------------------------------------------------------------- /// @notice DOMAIN_SEPARATOR to generate signatures function DOMAIN_SEPARATOR() public view virtual returns (bytes32) { return EIP_712_DOMAIN_SEPARATOR; } }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity >=0.8.0; /// @notice Simple single owner authorization mixin. /// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/auth/Owned.sol) abstract contract Owned { /*////////////////////////////////////////////////////////////// EVENTS //////////////////////////////////////////////////////////////*/ event OwnerUpdated(address indexed user, address indexed newOwner); /*////////////////////////////////////////////////////////////// OWNERSHIP STORAGE //////////////////////////////////////////////////////////////*/ address public owner; modifier onlyOwner() virtual { require(msg.sender == owner, "UNAUTHORIZED"); _; } /*////////////////////////////////////////////////////////////// CONSTRUCTOR //////////////////////////////////////////////////////////////*/ constructor(address _owner) { owner = _owner; emit OwnerUpdated(address(0), _owner); } /*////////////////////////////////////////////////////////////// OWNERSHIP LOGIC //////////////////////////////////////////////////////////////*/ function setOwner(address newOwner) public virtual onlyOwner { owner = newOwner; emit OwnerUpdated(msg.sender, newOwner); } }
// SPDX-License-Identifier: AGPL-3.0 pragma solidity ^0.8.13; interface IValidator { function validate(address _user, string calldata _ipfs) external returns (bool); }
{ "remappings": [ "ds-test/=lib/solmate/lib/ds-test/src/", "forge-std/=lib/forge-std/src/", "script/=script/", "solmate/=lib/solmate/src/", "src/=src/", "test/=test/", "src/=src/", "test/=test/", "script/=script/" ], "optimizer": { "enabled": true, "runs": 20000 }, "metadata": { "bytecodeHash": "ipfs" }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "evmVersion": "london", "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_validator","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"DeadlineExpired","type":"error"},{"inputs":[],"name":"InvalidSignature","type":"error"},{"inputs":[],"name":"WikiNotValid","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":false,"internalType":"string","name":"_ipfs","type":"string"}],"name":"Posted","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"ipfs","type":"string"}],"name":"post","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"ipfs","type":"string"},{"internalType":"address","name":"_user","type":"address"},{"internalType":"uint256","name":"_deadline","type":"uint256"},{"internalType":"uint8","name":"_v","type":"uint8"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"}],"name":"postBySig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IValidator","name":"_validator","type":"address"}],"name":"setValidator","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
600260a090815261045560f41b60c052600160e052603160f81b610100527f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6101409081527f16f6ad7fa6efe3b84293a20d7904dbf7bd3f5760a006a41dc24d6d73faae81af610160527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc661018052466101a052306101c0526101208290526101e0604052206080523480156100b457600080fd5b50604051610bab380380610bab8339810160408190526100d391610139565b600080546001600160a01b031916339081178255604051909182917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d76908290a350600180546001600160a01b0319166001600160a01b0392909216919091179055610169565b60006020828403121561014b57600080fd5b81516001600160a01b038116811461016257600080fd5b9392505050565b608051610a2161018a6000396000818160a401526104650152610a216000f3fe608060405234801561001057600080fd5b50600436106100725760003560e01c80638da5cb5b116100505780638da5cb5b146100d25780638ee93cf314610117578063ed53ddb91461012a57600080fd5b80631327d3d81461007757806313af40351461008c5780633644e5151461009f575b600080fd5b61008a6100853660046107e0565b61013d565b005b61008a61009a3660046107e0565b61020a565b6040517f000000000000000000000000000000000000000000000000000000000000000081526020015b60405180910390f35b6000546100f29073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100c9565b61008a61012536600461084d565b6102fb565b61008a61013836600461088f565b610427565b60005473ffffffffffffffffffffffffffffffffffffffff1633146101c3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064015b60405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60005473ffffffffffffffffffffffffffffffffffffffff16331461028b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016101ba565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081178255604051909133917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d769190a350565b6001546040517f7dccd04d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690637dccd04d9061035590339086908690600401610964565b6020604051808303816000875af1158015610374573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610398919061099d565b15156000036103d3576040517fae9ebd3900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167f0fe877471cb763db81561ce83d01be57b6699361a3febbc7a0cdfb18df66246b838360405161041b9291906109bf565b60405180910390a25050565b42841015610461576040517f1ab7da6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000007f2786d465b1ae76a678938e05e206e58472f266dfa9f8534a71c3e35dc91efb4560001b89896040516104b89291906109db565b60408051918290038220602083019390935281019190915273ffffffffffffffffffffffffffffffffffffffff881660608201526080810187905260a0016040516020818303038152906040528051906020012060405160200161054e9291907f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff88169284019290925260608301869052608083018590529092509060019060a0016020604051602081039080840390855afa1580156105d7573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116158061065157508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b15610688576040517f8baa579f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001546040517f7dccd04d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690637dccd04d906106e2908a908d908d90600401610964565b6020604051808303816000875af1158015610701573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610725919061099d565b1515600003610760576040517fae9ebd3900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff167f0fe877471cb763db81561ce83d01be57b6699361a3febbc7a0cdfb18df66246b8a8a6040516107a89291906109bf565b60405180910390a2505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff811681146107dd57600080fd5b50565b6000602082840312156107f257600080fd5b81356107fd816107bb565b9392505050565b60008083601f84011261081657600080fd5b50813567ffffffffffffffff81111561082e57600080fd5b60208301915083602082850101111561084657600080fd5b9250929050565b6000806020838503121561086057600080fd5b823567ffffffffffffffff81111561087757600080fd5b61088385828601610804565b90969095509350505050565b600080600080600080600060c0888a0312156108aa57600080fd5b873567ffffffffffffffff8111156108c157600080fd5b6108cd8a828b01610804565b90985096505060208801356108e1816107bb565b945060408801359350606088013560ff811681146108fe57600080fd5b969995985093969295946080840135945060a09093013592915050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8416815260406020820152600061099460408301848661091b565b95945050505050565b6000602082840312156109af57600080fd5b815180151581146107fd57600080fd5b6020815260006109d360208301848661091b565b949350505050565b818382376000910190815291905056fea264697066735822122052ef180e812f6d45fbbecaadf80b28938a6e7aa8d1045e4162174bdf14dfc73464736f6c634300080f003300000000000000000000000078b2ddef6d2530523d85c3ad20ee1c556d08d2ef
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000078b2ddef6d2530523d85c3ad20ee1c556d08d2ef
-----Decoded View---------------
Arg [0] : _validator (address): 0x78b2ddef6d2530523d85c3ad20ee1c556d08d2ef
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000078b2ddef6d2530523d85c3ad20ee1c556d08d2ef
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.