Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
TributaryRegistry
Compiler Version
v0.8.6+commit.11564f7e
Optimization Enabled:
Yes with 2000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity 0.8.6; import {ITributaryRegistry} from "../interface/ITributaryRegistry.sol"; import {Governable} from "../lib/Governable.sol"; /** * Allows a registrar contract to register a new proxy as a block * that directs Mirror Token distribution to a tributary. * Ensures that the tributary is an Mirror DAO, and that only a valid * "Mirror Economic Block" created by a registered registrar, can contribute ETH * to the treasury. Otherwise, anyone could send ETH to the treasury to mint Mirror tokens. * @author MirrorXYZ */ contract TributaryRegistry is Governable, ITributaryRegistry { // ============ Mutable Storage ============ // E.g. crowdfund factory. Can register producer => tributary. mapping(address => bool) allowedRegistrar; // E.g. crowdfund proxy => Mirror DAO. mapping(address => address) public override producerToTributary; // E.g. auctions house. Can send funds and specify tributary directly. mapping(address => bool) public override singletonProducer; // ============ Modifiers ============ modifier onlyRegistrar() { require(allowedRegistrar[msg.sender], "sender not registered"); _; } constructor(address owner_) Governable(owner_) {} // ============ Configuration ============ function addRegistrar(address registrar) public override onlyGovernance { allowedRegistrar[registrar] = true; } function removeRegistrar(address registrar) public override onlyGovernance { delete allowedRegistrar[registrar]; } function addSingletonProducer(address producer) public override onlyGovernance { singletonProducer[producer] = true; } function removeSingletonProducer(address producer) public override onlyGovernance { delete singletonProducer[producer]; } // ============ Tributary Configuration ============ /** * Register a producer's (crowdfund, edition etc) tributary. Can only be called * by an allowed registrar. */ function registerTributary(address producer, address tributary) public override onlyRegistrar { producerToTributary[producer] = tributary; } /** * Allows the current tributary to update to a new tributary. */ function changeTributary(address producer, address newTributary) public override onlyRegistrar { // Check that the sender of the transaction is the current tributary. require( msg.sender == producerToTributary[producer], "only for current tributary" ); // Allow the current tributary to update to a new tributary. producerToTributary[producer] = newTributary; } }
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity 0.8.6; interface ITributaryRegistry { function addRegistrar(address registrar) external; function removeRegistrar(address registrar) external; function addSingletonProducer(address producer) external; function removeSingletonProducer(address producer) external; function registerTributary(address producer, address tributary) external; function producerToTributary(address producer) external returns (address tributary); function singletonProducer(address producer) external returns (bool); function changeTributary(address producer, address newTributary) external; }
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity 0.8.6; import {Ownable} from "../lib/Ownable.sol"; import {IGovernable} from "../lib/interface/IGovernable.sol"; contract Governable is Ownable, IGovernable { // ============ Mutable Storage ============ // Mirror governance contract. address public override governor; // ============ Modifiers ============ modifier onlyGovernance() { require(isOwner() || isGovernor(), "caller is not governance"); _; } modifier onlyGovernor() { require(isGovernor(), "caller is not governor"); _; } // ============ Constructor ============ constructor(address owner_) Ownable(owner_) {} // ============ Administration ============ function changeGovernor(address governor_) public override onlyGovernance { governor = governor_; } // ============ Utility Functions ============ function isGovernor() public view override returns (bool) { return msg.sender == governor; } }
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity 0.8.6; contract Ownable { address public owner; address private nextOwner; event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); // modifiers modifier onlyOwner() { require(isOwner(), "caller is not the owner."); _; } modifier onlyNextOwner() { require(isNextOwner(), "current owner must set caller as next owner."); _; } /** * @dev Initialize contract by setting transaction submitter as initial owner. */ constructor(address owner_) { owner = owner_; emit OwnershipTransferred(address(0), owner); } /** * @dev Initiate ownership transfer by setting nextOwner. */ function transferOwnership(address nextOwner_) external onlyOwner { require(nextOwner_ != address(0), "Next owner is the zero address."); nextOwner = nextOwner_; } /** * @dev Cancel ownership transfer by deleting nextOwner. */ function cancelOwnershipTransfer() external onlyOwner { delete nextOwner; } /** * @dev Accepts ownership transfer by setting owner. */ function acceptOwnership() external onlyNextOwner { delete nextOwner; owner = msg.sender; emit OwnershipTransferred(owner, msg.sender); } /** * @dev Renounce ownership by setting owner to zero address. */ function renounceOwnership() external onlyOwner { owner = address(0); emit OwnershipTransferred(owner, address(0)); } /** * @dev Returns true if the caller is the current owner. */ function isOwner() public view returns (bool) { return msg.sender == owner; } /** * @dev Returns true if the caller is the next owner. */ function isNextOwner() public view returns (bool) { return msg.sender == nextOwner; } }
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity 0.8.6; interface IGovernable { function changeGovernor(address governor_) external; function isGovernor() external view returns (bool); function governor() external view returns (address); }
{ "optimizer": { "enabled": true, "runs": 2000 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"owner_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"registrar","type":"address"}],"name":"addRegistrar","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"producer","type":"address"}],"name":"addSingletonProducer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cancelOwnershipTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"governor_","type":"address"}],"name":"changeGovernor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"producer","type":"address"},{"internalType":"address","name":"newTributary","type":"address"}],"name":"changeTributary","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"governor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isGovernor","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isNextOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"producerToTributary","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"producer","type":"address"},{"internalType":"address","name":"tributary","type":"address"}],"name":"registerTributary","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"registrar","type":"address"}],"name":"removeRegistrar","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"producer","type":"address"}],"name":"removeSingletonProducer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"singletonProducer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"nextOwner_","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50604051610b43380380610b4383398101604081905261002f91610081565b600080546001600160a01b0319166001600160a01b038316908117825560405183928392917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35050506100b1565b60006020828403121561009357600080fd5b81516001600160a01b03811681146100aa57600080fd5b9392505050565b610a83806100c06000396000f3fe608060405234801561001057600080fd5b50600436106101365760003560e01c8063a5751856116100b2578063c7af335211610081578063ec72c34911610066578063ec72c34914610288578063ed459df21461029b578063f2fde38b146102ae57600080fd5b8063c7af335214610262578063e4c0aaf41461027557600080fd5b8063a5751856146101f0578063ad0a44a114610219578063af92a6931461023c578063ba904eed1461024f57600080fd5b8063715018a61161010957806379ba5097116100ee57806379ba5097146101b65780638da5cb5b146101be5780638f32d59b146101d157600080fd5b8063715018a61461019b578063756385e1146101a357600080fd5b80630c340a241461013b57806323452b9c1461016b57806325af854a146101755780633d2a6f7714610188575b600080fd5b60025461014e906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101736102c1565b005b610173610183366004610a1a565b61033f565b610173610196366004610a1a565b610442565b6101736104a1565b6101736101b13660046109f8565b610544565b6101736105d4565b60005461014e906001600160a01b031681565b6000546001600160a01b031633145b6040519015158152602001610162565b61014e6101fe3660046109f8565b6004602052600090815260409020546001600160a01b031681565b6101e06102273660046109f8565b60056020526000908152604090205460ff1681565b61017361024a3660046109f8565b6106a9565b61017361025d3660046109f8565b61073c565b6002546001600160a01b031633146101e0565b6101736102833660046109f8565b6107cc565b6101736102963660046109f8565b61086a565b6001546001600160a01b031633146101e0565b6101736102bc3660046109f8565b6108fd565b6000546001600160a01b031633146103205760405162461bcd60e51b815260206004820152601860248201527f63616c6c6572206973206e6f7420746865206f776e65722e000000000000000060448201526064015b60405180910390fd5b6001805473ffffffffffffffffffffffffffffffffffffffff19169055565b3360009081526003602052604090205460ff1661039e5760405162461bcd60e51b815260206004820152601560248201527f73656e646572206e6f74207265676973746572656400000000000000000000006044820152606401610317565b6001600160a01b038281166000908152600460205260409020541633146104075760405162461bcd60e51b815260206004820152601a60248201527f6f6e6c7920666f722063757272656e74207472696275746172790000000000006044820152606401610317565b6001600160a01b039182166000908152600460205260409020805473ffffffffffffffffffffffffffffffffffffffff191691909216179055565b3360009081526003602052604090205460ff166104075760405162461bcd60e51b815260206004820152601560248201527f73656e646572206e6f74207265676973746572656400000000000000000000006044820152606401610317565b6000546001600160a01b031633146104fb5760405162461bcd60e51b815260206004820152601860248201527f63616c6c6572206973206e6f7420746865206f776e65722e00000000000000006044820152606401610317565b6000805473ffffffffffffffffffffffffffffffffffffffff1916815560405181907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3565b6000546001600160a01b031633148061056757506002546001600160a01b031633145b6105b35760405162461bcd60e51b815260206004820152601860248201527f63616c6c6572206973206e6f7420676f7665726e616e636500000000000000006044820152606401610317565b6001600160a01b03166000908152600560205260409020805460ff19169055565b6001546001600160a01b031633146106545760405162461bcd60e51b815260206004820152602c60248201527f63757272656e74206f776e6572206d757374207365742063616c6c657220617360448201527f206e657874206f776e65722e00000000000000000000000000000000000000006064820152608401610317565b6001805473ffffffffffffffffffffffffffffffffffffffff19908116909155600080543392168217815560405182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3565b6000546001600160a01b03163314806106cc57506002546001600160a01b031633145b6107185760405162461bcd60e51b815260206004820152601860248201527f63616c6c6572206973206e6f7420676f7665726e616e636500000000000000006044820152606401610317565b6001600160a01b03166000908152600360205260409020805460ff19166001179055565b6000546001600160a01b031633148061075f57506002546001600160a01b031633145b6107ab5760405162461bcd60e51b815260206004820152601860248201527f63616c6c6572206973206e6f7420676f7665726e616e636500000000000000006044820152606401610317565b6001600160a01b03166000908152600360205260409020805460ff19169055565b6000546001600160a01b03163314806107ef57506002546001600160a01b031633145b61083b5760405162461bcd60e51b815260206004820152601860248201527f63616c6c6572206973206e6f7420676f7665726e616e636500000000000000006044820152606401610317565b6002805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6000546001600160a01b031633148061088d57506002546001600160a01b031633145b6108d95760405162461bcd60e51b815260206004820152601860248201527f63616c6c6572206973206e6f7420676f7665726e616e636500000000000000006044820152606401610317565b6001600160a01b03166000908152600560205260409020805460ff19166001179055565b6000546001600160a01b031633146109575760405162461bcd60e51b815260206004820152601860248201527f63616c6c6572206973206e6f7420746865206f776e65722e00000000000000006044820152606401610317565b6001600160a01b0381166109ad5760405162461bcd60e51b815260206004820152601f60248201527f4e657874206f776e657220697320746865207a65726f20616464726573732e006044820152606401610317565b6001805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b80356001600160a01b03811681146109f357600080fd5b919050565b600060208284031215610a0a57600080fd5b610a13826109dc565b9392505050565b60008060408385031215610a2d57600080fd5b610a36836109dc565b9150610a44602084016109dc565b9050925092905056fea2646970667358221220d5db156a461e177013fa1da236d42678e45eec31b260dbbff4565eb810b35c2864736f6c634300080600330000000000000000000000002330ee705ffd040bb0cba8cb7734dfe00e7c4b57
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101365760003560e01c8063a5751856116100b2578063c7af335211610081578063ec72c34911610066578063ec72c34914610288578063ed459df21461029b578063f2fde38b146102ae57600080fd5b8063c7af335214610262578063e4c0aaf41461027557600080fd5b8063a5751856146101f0578063ad0a44a114610219578063af92a6931461023c578063ba904eed1461024f57600080fd5b8063715018a61161010957806379ba5097116100ee57806379ba5097146101b65780638da5cb5b146101be5780638f32d59b146101d157600080fd5b8063715018a61461019b578063756385e1146101a357600080fd5b80630c340a241461013b57806323452b9c1461016b57806325af854a146101755780633d2a6f7714610188575b600080fd5b60025461014e906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101736102c1565b005b610173610183366004610a1a565b61033f565b610173610196366004610a1a565b610442565b6101736104a1565b6101736101b13660046109f8565b610544565b6101736105d4565b60005461014e906001600160a01b031681565b6000546001600160a01b031633145b6040519015158152602001610162565b61014e6101fe3660046109f8565b6004602052600090815260409020546001600160a01b031681565b6101e06102273660046109f8565b60056020526000908152604090205460ff1681565b61017361024a3660046109f8565b6106a9565b61017361025d3660046109f8565b61073c565b6002546001600160a01b031633146101e0565b6101736102833660046109f8565b6107cc565b6101736102963660046109f8565b61086a565b6001546001600160a01b031633146101e0565b6101736102bc3660046109f8565b6108fd565b6000546001600160a01b031633146103205760405162461bcd60e51b815260206004820152601860248201527f63616c6c6572206973206e6f7420746865206f776e65722e000000000000000060448201526064015b60405180910390fd5b6001805473ffffffffffffffffffffffffffffffffffffffff19169055565b3360009081526003602052604090205460ff1661039e5760405162461bcd60e51b815260206004820152601560248201527f73656e646572206e6f74207265676973746572656400000000000000000000006044820152606401610317565b6001600160a01b038281166000908152600460205260409020541633146104075760405162461bcd60e51b815260206004820152601a60248201527f6f6e6c7920666f722063757272656e74207472696275746172790000000000006044820152606401610317565b6001600160a01b039182166000908152600460205260409020805473ffffffffffffffffffffffffffffffffffffffff191691909216179055565b3360009081526003602052604090205460ff166104075760405162461bcd60e51b815260206004820152601560248201527f73656e646572206e6f74207265676973746572656400000000000000000000006044820152606401610317565b6000546001600160a01b031633146104fb5760405162461bcd60e51b815260206004820152601860248201527f63616c6c6572206973206e6f7420746865206f776e65722e00000000000000006044820152606401610317565b6000805473ffffffffffffffffffffffffffffffffffffffff1916815560405181907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3565b6000546001600160a01b031633148061056757506002546001600160a01b031633145b6105b35760405162461bcd60e51b815260206004820152601860248201527f63616c6c6572206973206e6f7420676f7665726e616e636500000000000000006044820152606401610317565b6001600160a01b03166000908152600560205260409020805460ff19169055565b6001546001600160a01b031633146106545760405162461bcd60e51b815260206004820152602c60248201527f63757272656e74206f776e6572206d757374207365742063616c6c657220617360448201527f206e657874206f776e65722e00000000000000000000000000000000000000006064820152608401610317565b6001805473ffffffffffffffffffffffffffffffffffffffff19908116909155600080543392168217815560405182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3565b6000546001600160a01b03163314806106cc57506002546001600160a01b031633145b6107185760405162461bcd60e51b815260206004820152601860248201527f63616c6c6572206973206e6f7420676f7665726e616e636500000000000000006044820152606401610317565b6001600160a01b03166000908152600360205260409020805460ff19166001179055565b6000546001600160a01b031633148061075f57506002546001600160a01b031633145b6107ab5760405162461bcd60e51b815260206004820152601860248201527f63616c6c6572206973206e6f7420676f7665726e616e636500000000000000006044820152606401610317565b6001600160a01b03166000908152600360205260409020805460ff19169055565b6000546001600160a01b03163314806107ef57506002546001600160a01b031633145b61083b5760405162461bcd60e51b815260206004820152601860248201527f63616c6c6572206973206e6f7420676f7665726e616e636500000000000000006044820152606401610317565b6002805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6000546001600160a01b031633148061088d57506002546001600160a01b031633145b6108d95760405162461bcd60e51b815260206004820152601860248201527f63616c6c6572206973206e6f7420676f7665726e616e636500000000000000006044820152606401610317565b6001600160a01b03166000908152600560205260409020805460ff19166001179055565b6000546001600160a01b031633146109575760405162461bcd60e51b815260206004820152601860248201527f63616c6c6572206973206e6f7420746865206f776e65722e00000000000000006044820152606401610317565b6001600160a01b0381166109ad5760405162461bcd60e51b815260206004820152601f60248201527f4e657874206f776e657220697320746865207a65726f20616464726573732e006044820152606401610317565b6001805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b80356001600160a01b03811681146109f357600080fd5b919050565b600060208284031215610a0a57600080fd5b610a13826109dc565b9392505050565b60008060408385031215610a2d57600080fd5b610a36836109dc565b9150610a44602084016109dc565b9050925092905056fea2646970667358221220d5db156a461e177013fa1da236d42678e45eec31b260dbbff4565eb810b35c2864736f6c63430008060033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000002330ee705ffd040bb0cba8cb7734dfe00e7c4b57
-----Decoded View---------------
Arg [0] : owner_ (address): 0x2330ee705fFD040bB0cbA8CB7734Dfe00E7C4b57
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000002330ee705ffd040bb0cba8cb7734dfe00e7c4b57
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.