Contract Overview
Balance:
0 AVAX
AVAX Value:
$0.00
My Name Tag:
Not Available, login to update
Txn Hash | Method |
Block
|
From
|
To
|
Value | [Txn Fee] | |||
---|---|---|---|---|---|---|---|---|---|
0x926dca680ef3a20218c41f0d700eccb14094bbbbf88877cf1137f1ad0cbb5704 | 0x611e5361 | 18986870 | 168 days 22 hrs ago | Yield Yak: Deployer | IN | Create: GeodeUtils | 0 AVAX | 0.057079209 |
[ Download CSV Export ]
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
GeodeUtils
Compiler Version
v0.8.7+commit.e28d00a7
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity =0.8.7; import "./DataStoreLib.sol"; /** * @title GeodeUtils library * @notice Exclusively contains functions responsible for administration of Geode Portal, * including functions related to "limited upgradability" with Senate & proposals. * @dev Contracts relying on this library must initialize GeodeUtils.Universe * @dev ALL "fee" variables are limited by FEE_DENOMINATOR = 100% * @dev Admin functions are already protected. * Note that this library contains both functions called by users(ID) and admins(GOVERNANCE, SENATE ) * Note refer to DataStoreUtils before reviewing */ library GeodeUtils { using DataStoreUtils for DataStoreUtils.DataStore; event OperationFeeUpdated(uint256 newFee); event MaxOperationFeeUpdated(uint256 newMaxFee); event ControllerChanged(uint256 id, address newCONTROLLER); event Proposed( uint256 id, address _CONTROLLER, uint256 _type, uint256 _duration ); event ProposalApproved(uint256 id); event NewElectorType(uint256 _type); event Vote(uint256 proposalId, uint256 electorId); event NewSenate(address senate, uint256 senate_expire_timestamp); /** * @notice Proposal basically refers to give the control of an ID to a CONTROLLER. * * @notice A Proposal has 4 specs: * @param TYPE: separates the proposals and related functionality between different ID types. * * RESERVED TYPES on GeodeUtils: * * * TYPE 0: inactive * * * TYPE 1: Senate: controls state of governance, contract updates and other members of A Universe * * * TYPE 2: Upgrade: address of the implementation for desired contract upgrade * * * TYPE 3: **gap** : formally it represented the admin contract, however since UUPS is being used as a upgrade path, * this TYPE is now reserved to make it easier for secondary contracts to add their own type. * * @param name: id is created by keccak(name) * * @param CONTROLLER: the address that refers to the change that is proposed by given proposal ID. * * This slot can be given the control of an id to a user, a new implementation contract, a new Senate etc. * * @param deadline: refers to last timestamp until a proposal expires, limited by MAX_PROPOSAL_DURATION * * Expired proposals can not be approved by Senate * * Expired proposals can be overriden by new proposals **/ struct Proposal { address CONTROLLER; uint256 TYPE; uint256 deadline; bytes name; } /** * @notice Universe is A blockchain. In this case, it defines Avalanche * @param GOVERNANCE a community that works to improve the core product and ensures its adoption in the DeFi ecosystem * Suggests updates, such as new planets, operators, contract upgrades and new Senate, on the Ecosystem _without any permissions to force them_ * @param SENATE An address that controls the state of governance, updates and other users in the Geode Ecosystem * Note SENATE is proposed by Governance and voted by all planets, if 2/3 approves. * @param OPERATION_FEE operation fee of the given contract, acquired by GOVERNANCE. Limited by MAX_OPERATION_FEE * @param MAX_OPERATION_FEE set by SENATE, limited by FEE_DENOMINATOR * @param FEE_DENOMINATOR represents 100% * @param SENATE_EXPIRE_TIMESTAMP refers to the last timestamp that SENATE can continue operating. Enforces a new election, limited by MAX_SENATE_PERIOD * @param approvedUpgrade only 1(one) implementation contract can be "approved" at any given time. @dev Should set to address(0) after every upgrade * @param _electorCount increased when a new id is added with _electorTypes[id] == true * @param _electorTypes only given types can vote @dev must only be used at upgrades. * @param _proposalForId proposals are kept seperately instead of setting the parameters of id in DATASTORE, and then setting it's type; to allowe surpassing type checks to save gas cost **/ struct Universe { address SENATE; address GOVERNANCE; uint256 OPERATION_FEE; uint256 MAX_OPERATION_FEE; uint256 FEE_DENOMINATOR; uint256 SENATE_EXPIRE_TIMESTAMP; address approvedUpgrade; uint256 _electorCount; mapping(uint256 => bool) _electorTypes; mapping(uint256 => Proposal) _proposalForId; } uint32 public constant MIN_PROPOSAL_DURATION = 1 days; uint32 public constant MAX_PROPOSAL_DURATION = 1 weeks; uint32 public constant MAX_SENATE_PERIOD = 730 days; // 2 years modifier onlySenate(Universe storage self) { require(msg.sender == self.SENATE, "GeodeUtils: SENATE role needed"); require( block.timestamp < self.SENATE_EXPIRE_TIMESTAMP, "GeodeUtils: SENATE not active" ); _; } /** * ** UNIVERSE GETTERS ** **/ /// @return the address of SENATE function getSenate(Universe storage self) public view returns (address) { return self.SENATE; } /// @return the address of GOVERNANCE function getGovernance(Universe storage self) public view returns (address) { return self.GOVERNANCE; } /// @notice MAX_OPERATION_FEE must limit OPERATION_FEE even if MAX is changed /// @return active OPERATION_FEE; limited by MAX_OPERATION_FEE function getOperationFee(Universe storage self) public view returns (uint256) { return self.OPERATION_FEE > self.MAX_OPERATION_FEE ? self.MAX_OPERATION_FEE : self.OPERATION_FEE; } /// @return MAX_OPERATION_FEE function getMaxOperationFee(Universe storage self) public view returns (uint256) { return self.MAX_OPERATION_FEE; } /// @return the expiration date of current SENATE as a timestamp function getSenateExpireTimestamp(Universe storage self) public view returns (uint256) { return self.SENATE_EXPIRE_TIMESTAMP; } /** * ** UNIVERSE SETTERS ** */ /// @return true if the operation was succesful, might be helpful when governance rights are distributed /// @dev can not set a fee more than MAX /// @dev no need to check FEE_DENOMINATOR function setOperationFee(Universe storage self, uint256 _newFee) external returns (bool) { require(_newFee <= self.MAX_OPERATION_FEE, "GeodeUtils: fee more than MAX"); self.OPERATION_FEE = _newFee; emit OperationFeeUpdated(_newFee); return true; } /// @return true if the operation was succesful /// @dev can not set a fee more than FEE_DENOMINATOR (100%) function setMaxOperationFee(Universe storage self, uint256 _newMaxFee) external onlySenate(self) returns (bool) { require( _newMaxFee <= self.FEE_DENOMINATOR, "GeodeUtils: fee more than 100%" ); self.MAX_OPERATION_FEE = _newMaxFee; emit MaxOperationFeeUpdated(_newMaxFee); return true; } /** @notice only the current CONTROLLER can change @dev this operation can not be reverted by old CONTROLLER @dev in case the current controller wants to remove the need to upgrade to NO Controller they should provide smt like 0x0..dead */ function changeIdCONTROLLER( DataStoreUtils.DataStore storage _DATASTORE, uint256 id, address newCONTROLLER ) external { require( newCONTROLLER != address(0), "GeodeUtils: CONTROLLER can not be zero" ); require( _DATASTORE.readAddressForId(id, "CONTROLLER") == msg.sender, "GeodeUtils: not CONTROLLER of given id" ); _DATASTORE.writeAddressForId(id, "CONTROLLER", newCONTROLLER); emit ControllerChanged(id, newCONTROLLER); } /** * ** PROPOSALS ** */ /** * CONTROLLER Proposals */ function getProposal(Universe storage self, uint256 id) external view returns (Proposal memory) { return self._proposalForId[id]; } /** * @notice to ensure the flexibility of Governance-less upgrades in the future, Anyone can create a Proposal. * @notice a proposal can be overriden if: expired OR approved. DATASTORE(id) will not be overriden until the proposal is approved. * @dev refer to structure of Proposal for explanations of params */ function newProposal( Universe storage self, address _CONTROLLER, uint256 _type, uint256 _duration, bytes calldata _name ) external { require( _duration >= MIN_PROPOSAL_DURATION, "GeodeUtils: duration should be higher than min value" ); require(_duration <= MAX_PROPOSAL_DURATION, "GeodeUtils: duration exceeds"); uint256 id = uint256(keccak256(abi.encodePacked(_name))); require( self._proposalForId[id].deadline < block.timestamp, "GeodeUtils: name already proposed" ); self._proposalForId[id] = Proposal({ CONTROLLER: _CONTROLLER, TYPE: _type, deadline: block.timestamp + _duration, name: _name }); emit Proposed(id, _CONTROLLER, _type, _duration); } /** * @notice type specific changes for reserved_types(1,2,3) are implemented here, * any other addition should take place in Portal, as not related * @param id given ID proposal that has been approved by Senate * @dev Senate should not be able to approve expired proposals * @dev Senate should not be able to approve SENATE proposals :) */ function approveProposal( Universe storage self, DataStoreUtils.DataStore storage _DATASTORE, uint256 id ) external onlySenate(self) { require( self._proposalForId[id].deadline > block.timestamp, "GeodeUtils: proposal expired" ); require( self._proposalForId[id].TYPE != 1, "GeodeUtils: Senate can not approve Senate Proposal" ); _DATASTORE.writeBytesForId(id, "name", self._proposalForId[id].name); _DATASTORE.writeAddressForId( id, "CONTROLLER", self._proposalForId[id].CONTROLLER ); _DATASTORE.writeUintForId(id, "TYPE", self._proposalForId[id].TYPE); _DATASTORE.allIdsByType[self._proposalForId[id].TYPE].push(id); if (self._proposalForId[id].TYPE == 2) { self.approvedUpgrade = self._proposalForId[id].CONTROLLER; } self._proposalForId[id].deadline = block.timestamp; if (self._electorTypes[_DATASTORE.readUintForId(id, "TYPE")]) self._electorCount += 1; emit ProposalApproved(id); } /** * SENATE Proposals */ /** * @notice only selected types can vote for senate * @param _type selected type * @param _isElector true if selected _type can vote for senate from now on * @dev can not set with the same value again, preventing double increment/decrements */ function setElectorType( Universe storage self, DataStoreUtils.DataStore storage _DATASTORE, uint256 _type, bool _isElector ) external { require( self._electorTypes[_type] != _isElector, "GeodeUtils: type already _isElector" ); require( _type != 0 && _type != 1 && _type != 2 && _type != 3, "GeodeUtils: 0, Senate, Upgrade, ProxyAdmin cannot be elector!" ); self._electorTypes[_type] = _isElector; if (_isElector) { self._electorCount += _DATASTORE.allIdsByType[_type].length; } else { self._electorCount -= _DATASTORE.allIdsByType[_type].length; } emit NewElectorType(_type); } /** * @notice Proposed CONTROLLER is the new Senate after 2/3 of the electors are approved * NOTE mathematically, min 4 elector is needed for (c+1)*2/3 to work properly * @notice id can not vote if: *- approved already *- not its type is not elector *- not proposal is expired *- not senate proposal * @param electorId should have the voting rights, msg.sender should be the CONTROLLER of given ID * @dev pins id as "voted" when approved * @dev increases "approvalCount" of proposalId by 1 when approved */ function approveSenate( Universe storage self, DataStoreUtils.DataStore storage _DATASTORE, uint256 proposalId, uint256 electorId ) external { require( self._proposalForId[proposalId].TYPE == 1, "GeodeUtils: NOT Senate Proposal" ); require( self._proposalForId[proposalId].deadline >= block.timestamp, "GeodeUtils: proposal expired" ); require( _DATASTORE.readAddressForId(electorId, "CONTROLLER") == msg.sender, "GeodeUtils: msg.sender should be CONTROLLER of given electorId!" ); require( self._electorTypes[_DATASTORE.readUintForId(electorId, "TYPE")], "GeodeUtils: NOT an elector" ); require( _DATASTORE.readUintForId( proposalId, bytes32(keccak256(abi.encodePacked(electorId, "voted"))) ) == 0, " GeodeUtils: already approved" ); _DATASTORE.writeUintForId( proposalId, bytes32(keccak256(abi.encodePacked(electorId, "voted"))), 1 ); emit Vote(proposalId, electorId); _DATASTORE.writeUintForId( proposalId, "approvalCount", _DATASTORE.readUintForId(proposalId, "approvalCount") + 1 ); if ( _DATASTORE.readUintForId(proposalId, "approvalCount") >= ((self._electorCount + 1) * 2) / 3 ) { self.SENATE = self._proposalForId[proposalId].CONTROLLER; self._proposalForId[proposalId].deadline = block.timestamp; self.SENATE_EXPIRE_TIMESTAMP = block.timestamp + MAX_SENATE_PERIOD; // 2 years emit NewSenate(self.SENATE, self.SENATE_EXPIRE_TIMESTAMP); } } /** * @notice Get if it is allowed to change a specific contract with the current version. * @return True if it is allowed by senate and false if not. * @dev address(0) should return false **/ function isUpgradeAllowed( Universe storage self, address proposed_implementation ) external view returns (bool) { return self.approvedUpgrade != address(0) && self.approvedUpgrade == proposed_implementation; } }
// SPDX-License-Identifier: MIT pragma solidity =0.8.7; /** * @title Storage Management library for dynamic structs based on data types * * DataStoreUtils is a storage management tool designed to create a safe and scalable * storage layout with the help of ids and keys. * Mainly focusing on upgradable contracts with multiple user types to create a * sustainable development environment. * * In summary, extra gas cost that would be saved with Storage packing are * ignored to create upgradable structs. * * IDs are the representation of a user with any given key as properties. * Type for ID is not mandatory, not all IDs should have an explicit type. * Thus there is no checks of types or keys. * * @notice distinct id and key pairs return different storage slots * */ library DataStoreUtils { /** * @notice Main Struct for reading and writing data to storage for given id+key pairs * @param allIdsByType optional categorization for given ID, requires direct access, type => id[] * @param uintData keccak(id, key) => returns uint256 * @param bytesData keccak(id, key) => returns bytes * @param addressData keccak(id, key) => returns address * NOTE any other storage type can be expressed as bytes */ struct DataStore { mapping(uint256 => uint256[]) allIdsByType; mapping(bytes32 => uint256) uintData; mapping(bytes32 => bytes) bytesData; mapping(bytes32 => address) addressData; } /** * **DATA GETTERS ** **/ function readUintForId( DataStore storage self, uint256 _id, bytes32 _key ) public view returns (uint256 data) { data = self.uintData[keccak256(abi.encodePacked(_id, _key))]; } function readBytesForId( DataStore storage self, uint256 _id, bytes32 _key ) public view returns (bytes memory data) { data = self.bytesData[keccak256(abi.encodePacked(_id, _key))]; } function readAddressForId( DataStore storage self, uint256 _id, bytes32 _key ) public view returns (address data) { data = self.addressData[keccak256(abi.encodePacked(_id, _key))]; } /** * **DATA SETTERS ** **/ function writeUintForId( DataStore storage self, uint256 _id, bytes32 _key, uint256 data ) public { self.uintData[keccak256(abi.encodePacked(_id, _key))] = data; } function writeBytesForId( DataStore storage self, uint256 _id, bytes32 _key, bytes memory data ) public { self.bytesData[keccak256(abi.encodePacked(_id, _key))] = data; } function writeAddressForId( DataStore storage self, uint256 _id, bytes32 _key, address data ) public { self.addressData[keccak256(abi.encodePacked(_id, _key))] = data; } }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "metadata": { "useLiteralContent": true }, "libraries": { "contracts/Portal/utils/DataStoreLib.sol": { "DataStoreUtils": "0xc7332d9abef755c42b4df9d9db09beef15f8f9fb" } } }
[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"address","name":"newCONTROLLER","type":"address"}],"name":"ControllerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newMaxFee","type":"uint256"}],"name":"MaxOperationFeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_type","type":"uint256"}],"name":"NewElectorType","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"senate","type":"address"},{"indexed":false,"internalType":"uint256","name":"senate_expire_timestamp","type":"uint256"}],"name":"NewSenate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newFee","type":"uint256"}],"name":"OperationFeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"}],"name":"ProposalApproved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"address","name":"_CONTROLLER","type":"address"},{"indexed":false,"internalType":"uint256","name":"_type","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_duration","type":"uint256"}],"name":"Proposed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"electorId","type":"uint256"}],"name":"Vote","type":"event"},{"inputs":[],"name":"MAX_PROPOSAL_DURATION","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SENATE_PERIOD","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_PROPOSAL_DURATION","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
611e5361003a600b82828239805160001a60731461002d57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106101155760003560e01c806353803de4116100ac578063b21f21881161007b578063b21f2188146102a1578063bd968216146102ac578063d115f195146102b6578063f00d779d146102d6578063fe70c9aa146102f457600080fd5b806353803de41461023a5780635fff75171461024f578063833520141461026f578063944ee22d1461028257600080fd5b80633c197afe116100e85780633c197afe146101a457806343dbfc05146101c75780634b61f9fe146101e75780634e9130821461020757600080fd5b80630bf249b81461011a5780630bf8c88e1461013c578063105835b01461015c5780633680b4071461017c575b600080fd5b81801561012657600080fd5b5061013a6101353660046119b8565b610314565b005b81801561014857600080fd5b5061013a610157366004611a3a565b610534565b81801561016857600080fd5b5061013a610177366004611b07565b6107b3565b61018f61018a366004611a0a565b61097a565b60405190151581526020015b60405180910390f35b6101b96101b23660046119f1565b6003015490565b60405190815260200161019b565b8180156101d357600080fd5b5061018f6101e2366004611b7f565b6109af565b8180156101f357600080fd5b5061013a610202366004611adb565b610af8565b6102226102153660046119f1565b546001600160a01b031690565b6040516001600160a01b03909116815260200161019b565b6101b96102483660046119f1565b6005015490565b81801561025b57600080fd5b5061013a61026a366004611b4d565b610faa565b6101b961027d3660046119f1565b61172b565b61028c6201518081565b60405163ffffffff909116815260200161019b565b61028c6303c2670081565b61028c62093a8081565b6102c96102c4366004611b7f565b611752565b60405161019b9190611cc1565b6102226102e43660046119f1565b600101546001600160a01b031690565b81801561030057600080fd5b5061018f61030f366004611b7f565b611869565b6001600160a01b03811661037e5760405162461bcd60e51b815260206004820152602660248201527f47656f64655574696c733a20434f4e54524f4c4c45522063616e206e6f74206260448201526565207a65726f60d01b60648201526084015b60405180910390fd5b604051630143c90b60e71b815260048101849052602481018390526921a7a72a2927a62622a960b11b6044820152339073c7332d9abef755c42b4df9d9db09beef15f8f9fb9063a1e485809060640160206040518083038186803b1580156103e557600080fd5b505af41580156103f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061041d919061199b565b6001600160a01b0316146104825760405162461bcd60e51b815260206004820152602660248201527f47656f64655574696c733a206e6f7420434f4e54524f4c4c4552206f662067696044820152651d995b881a5960d21b6064820152608401610375565b60405163dff34ff160e01b815273c7332d9abef755c42b4df9d9db09beef15f8f9fb9063dff34ff1906104bd90869086908690600401611c8f565b60006040518083038186803b1580156104d557600080fd5b505af41580156104e9573d6000803e3d6000fd5b5050604080518581526001600160a01b03851660208201527ff0d0c255199b45799d6fd3623dce5e99a7cb09d662754eff92d8d0e73a537f0a935001905060405180910390a1505050565b620151808310156105a45760405162461bcd60e51b815260206004820152603460248201527f47656f64655574696c733a206475726174696f6e2073686f756c6420626520686044820152736967686572207468616e206d696e2076616c756560601b6064820152608401610375565b62093a808311156105f75760405162461bcd60e51b815260206004820152601c60248201527f47656f64655574696c733a206475726174696f6e2065786365656473000000006044820152606401610375565b6000828260405160200161060c929190611bba565b60408051601f198184030181529181528151602092830120600081815260098b0190935291206002015490915042116106915760405162461bcd60e51b815260206004820152602160248201527f47656f64655574696c733a206e616d6520616c72656164792070726f706f73656044820152601960fa1b6064820152608401610375565b6040518060800160405280876001600160a01b0316815260200186815260200185426106bd9190611d44565b815260200184848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525093909452505083815260098a016020908152604091829020845181546001600160a01b0319166001600160a01b03909116178155848201516001820155918401516002830155606084015180519293506107579260038501929190910190611902565b5050604080518381526001600160a01b0389166020820152908101879052606081018690527fb56e333cd6082a862942820ad6871b5a17d922a7506ff536fc0830784a46b2c6915060800160405180910390a150505050505050565b600082815260088501602052604090205460ff16151581151514156108265760405162461bcd60e51b815260206004820152602360248201527f47656f64655574696c733a207479706520616c7265616479205f6973456c65636044820152623a37b960e91b6064820152608401610375565b8115801590610836575081600114155b8015610843575081600214155b8015610850575081600314155b6108c25760405162461bcd60e51b815260206004820152603d60248201527f47656f64655574696c733a20302c2053656e6174652c20557067726164652c2060448201527f50726f787941646d696e2063616e6e6f7420626520656c6563746f72210000006064820152608401610375565b60008281526008850160205260409020805460ff19168215801591909117909155610916576000828152602084905260408120546007860180549192909161090b908490611d44565b909155506109409050565b6000828152602084905260408120546007860180549192909161093a908490611d9d565b90915550505b6040518281527f0f38b759dc57634790a94ef0592a9330e1e884cab0d4b6427e8c9bc6beabad90906020015b60405180910390a150505050565b60068201546000906001600160a01b0316158015906109a8575060068301546001600160a01b038381169116145b9392505050565b815460009083906001600160a01b03163314610a0d5760405162461bcd60e51b815260206004820152601e60248201527f47656f64655574696c733a2053454e41544520726f6c65206e656564656400006044820152606401610375565b80600501544210610a605760405162461bcd60e51b815260206004820152601d60248201527f47656f64655574696c733a2053454e415445206e6f74206163746976650000006044820152606401610375565b8360040154831115610ab45760405162461bcd60e51b815260206004820152601e60248201527f47656f64655574696c733a20666565206d6f7265207468616e203130302500006044820152606401610375565b600384018390556040518381527f6375dc670be4b258879f3cfb65ade243a534088c4b7474f291ed54499edacb819060200160405180910390a15060019392505050565b825483906001600160a01b03163314610b535760405162461bcd60e51b815260206004820152601e60248201527f47656f64655574696c733a2053454e41544520726f6c65206e656564656400006044820152606401610375565b80600501544210610ba65760405162461bcd60e51b815260206004820152601d60248201527f47656f64655574696c733a2053454e415445206e6f74206163746976650000006044820152606401610375565b60008281526009850160205260409020600201544210610c085760405162461bcd60e51b815260206004820152601c60248201527f47656f64655574696c733a2070726f706f73616c2065787069726564000000006044820152606401610375565b600082815260098501602052604090206001908101541415610c875760405162461bcd60e51b815260206004820152603260248201527f47656f64655574696c733a2053656e6174652063616e206e6f7420617070726f6044820152711d994814d95b985d1948141c9bdc1bdcd85b60721b6064820152608401610375565b6000828152600985016020526040908190209051630eee4dd960e41b815273c7332d9abef755c42b4df9d9db09beef15f8f9fb9163eee4dd9091610cd5918791879160030190600401611bca565b60006040518083038186803b158015610ced57600080fd5b505af4158015610d01573d6000803e3d6000fd5b50505060008381526009860160205260409081902054905163dff34ff160e01b815273c7332d9abef755c42b4df9d9db09beef15f8f9fb925063dff34ff191610d5c91879187916001600160a01b0390911690600401611c8f565b60006040518083038186803b158015610d7457600080fd5b505af4158015610d88573d6000803e3d6000fd5b5050506000838152600986016020526040908190206001015490516223bfa960ea1b81526004810186905260248101859052635459504560e01b6044820152606481019190915273c7332d9abef755c42b4df9d9db09beef15f8f9fb9150638efea4009060840160006040518083038186803b158015610e0757600080fd5b505af4158015610e1b573d6000803e3d6000fd5b5050506000838152600986016020818152604080842060019081018054865289845291852080549182018155855282852001879055928690525254600214159050610e935760008281526009850160205260409020546006850180546001600160a01b0319166001600160a01b039092169190911790555b6000828152600985016020526040808220426002909101555163f237bab360e01b81526004810185905260248101849052635459504560e01b604482015260088601919073c7332d9abef755c42b4df9d9db09beef15f8f9fb9063f237bab39060640160206040518083038186803b158015610f0e57600080fd5b505af4158015610f22573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f469190611ba1565b815260208101919091526040016000205460ff1615610f7a576001846007016000828254610f749190611d44565b90915550505b6040518281527f28ec9e38ba73636ceb2f6c1574136f83bd46284a3c74734b711bf45e12f8d9299060200161096c565b600082815260098501602052604090206001908101541461100d5760405162461bcd60e51b815260206004820152601f60248201527f47656f64655574696c733a204e4f542053656e6174652050726f706f73616c006044820152606401610375565b60008281526009850160205260409020600201544211156110705760405162461bcd60e51b815260206004820152601c60248201527f47656f64655574696c733a2070726f706f73616c2065787069726564000000006044820152606401610375565b604051630143c90b60e71b815260048101849052602481018290526921a7a72a2927a62622a960b11b6044820152339073c7332d9abef755c42b4df9d9db09beef15f8f9fb9063a1e485809060640160206040518083038186803b1580156110d757600080fd5b505af41580156110eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061110f919061199b565b6001600160a01b03161461118b5760405162461bcd60e51b815260206004820152603f60248201527f47656f64655574696c733a206d73672e73656e6465722073686f756c6420626560448201527f20434f4e54524f4c4c4552206f6620676976656e20656c6563746f72496421006064820152608401610375565b60405163f237bab360e01b81526004810184905260248101829052635459504560e01b6044820152600885019060009073c7332d9abef755c42b4df9d9db09beef15f8f9fb9063f237bab39060640160206040518083038186803b1580156111f257600080fd5b505af4158015611206573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122a9190611ba1565b815260208101919091526040016000205460ff1661128a5760405162461bcd60e51b815260206004820152601a60248201527f47656f64655574696c733a204e4f5420616e20656c6563746f720000000000006044820152606401610375565b8273c7332d9abef755c42b4df9d9db09beef15f8f9fb63f237bab3909184846040516020016112c9918152641d9bdd195960da1b602082015260250190565b604051602081830303815290604052805190602001206040518463ffffffff1660e01b815260040161130e939291909283526020830191909152604082015260600190565b60206040518083038186803b15801561132657600080fd5b505af415801561133a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061135e9190611ba1565b156113ab5760405162461bcd60e51b815260206004820152601d60248201527f2047656f64655574696c733a20616c726561647920617070726f7665640000006044820152606401610375565b8273c7332d9abef755c42b4df9d9db09beef15f8f9fb638efea400909184846040516020016113ea918152641d9bdd195960da1b602082015260250190565b6040516020818303038152906040528051906020012060016040518563ffffffff1660e01b8152600401611437949392919093845260208401929092526040830152606082015260800190565b60006040518083038186803b15801561144f57600080fd5b505af4158015611463573d6000803e3d6000fd5b505060408051858152602081018590527f33952ef907843fd2ddd118a92dd935debf65b72965a557a364ea08deffca032f935001905060405180910390a160405163f237bab360e01b815260048101849052602481018390526c185c1c1c9bdd985b10dbdd5b9d609a1b604482015273c7332d9abef755c42b4df9d9db09beef15f8f9fb90638efea4009085908590849063f237bab39060640160206040518083038186803b15801561151557600080fd5b505af4158015611529573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061154d9190611ba1565b611558906001611d44565b6040516001600160e01b031960e086901b168152600481019390935260248301919091526c185c1c1c9bdd985b10dbdd5b9d609a1b6044830152606482015260840160006040518083038186803b1580156115b257600080fd5b505af41580156115c6573d6000803e3d6000fd5b505050506003846007015460016115dd9190611d44565b6115e8906002611d7e565b6115f29190611d5c565b60405163f237bab360e01b815260048101859052602481018490526c185c1c1c9bdd985b10dbdd5b9d609a1b604482015273c7332d9abef755c42b4df9d9db09beef15f8f9fb9063f237bab39060640160206040518083038186803b15801561165a57600080fd5b505af415801561166e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116929190611ba1565b106117255760008281526009850160205260409020805485546001600160a01b0319166001600160a01b039091161785554260029091018190556116db906303c2670090611d44565b600585018190558454604080516001600160a01b03909216825260208201929092527f3f34afe456fb5b36c04b5d1e2ef0750086747ac542262fbf14a0b1aae5fd7ee8910161096c565b50505050565b6000816003015482600201541161174657816002015461174c565b81600301545b92915050565b611786604051806080016040528060006001600160a01b031681526020016000815260200160008152602001606081525090565b6000828152600984016020908152604091829020825160808101845281546001600160a01b031681526001820154928101929092526002810154928201929092526003820180549192916060840191906117df90611db4565b80601f016020809104026020016040519081016040528092919081815260200182805461180b90611db4565b80156118585780601f1061182d57610100808354040283529160200191611858565b820191906000526020600020905b81548152906001019060200180831161183b57829003601f168201915b505050505081525050905092915050565b600082600301548211156118bf5760405162461bcd60e51b815260206004820152601d60248201527f47656f64655574696c733a20666565206d6f7265207468616e204d41580000006044820152606401610375565b600283018290556040518281527fdc0a11b3afd9d2b87730bfe9e9101cd69a837b27ae7237f688776960dcb609d29060200160405180910390a150600192915050565b82805461190e90611db4565b90600052602060002090601f0160209004810192826119305760008555611976565b82601f1061194957805160ff1916838001178555611976565b82800160010185558215611976579182015b8281111561197657825182559160200191906001019061195b565b50611982929150611986565b5090565b5b808211156119825760008155600101611987565b6000602082840312156119ad57600080fd5b81516109a881611e05565b6000806000606084860312156119cd57600080fd5b833592506020840135915060408401356119e681611e05565b809150509250925092565b600060208284031215611a0357600080fd5b5035919050565b60008060408385031215611a1d57600080fd5b823591506020830135611a2f81611e05565b809150509250929050565b60008060008060008060a08789031215611a5357600080fd5b863595506020870135611a6581611e05565b94506040870135935060608701359250608087013567ffffffffffffffff80821115611a9057600080fd5b818901915089601f830112611aa457600080fd5b813581811115611ab357600080fd5b8a6020828501011115611ac557600080fd5b6020830194508093505050509295509295509295565b600080600060608486031215611af057600080fd5b505081359360208301359350604090920135919050565b60008060008060808587031215611b1d57600080fd5b84359350602085013592506040850135915060608501358015158114611b4257600080fd5b939692955090935050565b60008060008060808587031215611b6357600080fd5b5050823594602084013594506040840135936060013592509050565b60008060408385031215611b9257600080fd5b50508035926020909101359150565b600060208284031215611bb357600080fd5b5051919050565b8183823760009101908152919050565b838152600060208481840152636e616d6560e01b6040840152608060608401526000845481600182811c915080831680611c0557607f831692505b858310811415611c2357634e487b7160e01b85526022600452602485fd5b6080880183905260a08801818015611c425760018114611c5357611c7e565b60ff19861682528782019650611c7e565b60008b81526020902060005b86811015611c7857815484820152908501908901611c5f565b83019750505b50949b9a5050505050505050505050565b92835260208301919091526921a7a72a2927a62622a960b11b60408301526001600160a01b0316606082015260800190565b6000602080835260018060a01b038451168184015280840151604084015260408401516060840152606084015160808085015280518060a086015260005b81811015611d1b5782810184015186820160c001528301611cff565b81811115611d2d57600060c083880101525b50601f01601f19169390930160c001949350505050565b60008219821115611d5757611d57611def565b500190565b600082611d7957634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615611d9857611d98611def565b500290565b600082821015611daf57611daf611def565b500390565b600181811c90821680611dc857607f821691505b60208210811415611de957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0381168114611e1a57600080fd5b5056fea264697066735822122001927a56348a2feb56b3928f8f088312922d9f9fbc9d463c0eb32baabd02429a64736f6c63430008070033
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.