Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 42 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Stake | 16777076 | 699 days ago | IN | 0 ETH | 0.01992345 | ||||
Stake | 16776882 | 699 days ago | IN | 0 ETH | 0.02036985 | ||||
Vote Withdraw Cr... | 16776817 | 699 days ago | IN | 0 ETH | 0.00576072 | ||||
Deposit | 16776810 | 699 days ago | IN | 24 ETH | 0.03448372 | ||||
Stake | 16731715 | 705 days ago | IN | 0 ETH | 0.00555879 | ||||
Vote Withdraw Cr... | 16731711 | 705 days ago | IN | 0 ETH | 0.0024107 | ||||
Deposit | 16731704 | 705 days ago | IN | 4 ETH | 0.00529814 | ||||
Stake | 16729086 | 705 days ago | IN | 0 ETH | 0.01170897 | ||||
Vote Withdraw Cr... | 16729081 | 705 days ago | IN | 0 ETH | 0.00848457 | ||||
Deposit | 16729074 | 705 days ago | IN | 12 ETH | 0.01922427 | ||||
Stake | 16725819 | 706 days ago | IN | 0 ETH | 0.00628933 | ||||
Vote Withdraw Cr... | 16725814 | 706 days ago | IN | 0 ETH | 0.00289855 | ||||
Deposit | 16725806 | 706 days ago | IN | 4 ETH | 0.00633191 | ||||
Stake | 16720543 | 707 days ago | IN | 0 ETH | 0.0097868 | ||||
Vote Withdraw Cr... | 16720534 | 707 days ago | IN | 0 ETH | 0.00639751 | ||||
Deposit | 16720526 | 707 days ago | IN | 8 ETH | 0.01480206 | ||||
Stake | 16621781 | 721 days ago | IN | 0 ETH | 0.00902736 | ||||
Vote Withdraw Cr... | 16621771 | 721 days ago | IN | 0 ETH | 0.0042022 | ||||
Deposit | 16621678 | 721 days ago | IN | 4 ETH | 0.00917174 | ||||
Stake | 16311701 | 764 days ago | IN | 0 ETH | 0.00410519 | ||||
Vote Withdraw Cr... | 16311693 | 764 days ago | IN | 0 ETH | 0.00194083 | ||||
Deposit | 16311686 | 764 days ago | IN | 4 ETH | 0.00410773 | ||||
Stake | 15838862 | 830 days ago | IN | 0 ETH | 0.00369018 | ||||
Vote Withdraw Cr... | 15838857 | 830 days ago | IN | 0 ETH | 0.00168067 | ||||
Deposit | 15838848 | 830 days ago | IN | 4 ETH | 0.00383796 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
16777076 | 699 days ago | 20 ETH | ||||
16777076 | 699 days ago | 20 ETH | ||||
16776882 | 699 days ago | 20 ETH | ||||
16776882 | 699 days ago | 20 ETH | ||||
16776810 | 699 days ago | 12 ETH | ||||
16776810 | 699 days ago | 12 ETH | ||||
16731715 | 705 days ago | 28 ETH | ||||
16731715 | 705 days ago | 28 ETH | ||||
16731704 | 705 days ago | 4 ETH | ||||
16729086 | 705 days ago | 28 ETH | ||||
16729086 | 705 days ago | 28 ETH | ||||
16729086 | 705 days ago | 28 ETH | ||||
16729086 | 705 days ago | 84 ETH | ||||
16729074 | 705 days ago | 4 ETH | ||||
16729074 | 705 days ago | 4 ETH | ||||
16729074 | 705 days ago | 4 ETH | ||||
16725819 | 706 days ago | 28 ETH | ||||
16725819 | 706 days ago | 28 ETH | ||||
16725806 | 706 days ago | 4 ETH | ||||
16720543 | 707 days ago | 28 ETH | ||||
16720543 | 707 days ago | 28 ETH | ||||
16720543 | 707 days ago | 56 ETH | ||||
16720526 | 707 days ago | 4 ETH | ||||
16720526 | 707 days ago | 4 ETH | ||||
16621781 | 721 days ago | 28 ETH |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
StafiLightNode
Compiler Version
v0.7.6+commit.7338295f
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
pragma solidity 0.7.6; pragma abicoder v2; // SPDX-License-Identifier: GPL-3.0-only import "../StafiBase.sol"; import "../interfaces/node/IStafiLightNode.sol"; import "../interfaces/node/IStafiNodeManager.sol"; import "../interfaces/deposit/IStafiUserDeposit.sol"; import "../interfaces/eth/IDepositContract.sol"; import "../interfaces/settings/IStafiNetworkSettings.sol"; import "../interfaces/storage/IPubkeySetStorage.sol"; import "@openzeppelin/contracts/math/SafeMath.sol"; import "../interfaces/IStafiEtherWithdrawer.sol"; import "../interfaces/IStafiEther.sol"; contract StafiLightNode is StafiBase, IStafiLightNode, IStafiEtherWithdrawer { // Libs using SafeMath for uint256; event EtherDeposited(address indexed from, uint256 amount, uint256 time); event Deposited(address node, bytes pubkey, bytes validatorSignature, uint256 amount); event Staked(address node, bytes pubkey); event OffBoarded(address node, bytes pubkey); event SetPubkeyStatus(bytes pubkey, uint256 status); uint256 public constant PUBKEY_STATUS_UNINITIAL = 0; uint256 public constant PUBKEY_STATUS_INITIAL = 1; uint256 public constant PUBKEY_STATUS_MATCH = 2; uint256 public constant PUBKEY_STATUS_STAKING = 3; uint256 public constant PUBKEY_STATUS_UNMATCH = 4; uint256 public constant PUBKEY_STATUS_OFFBOARD = 5; uint256 public constant PUBKEY_STATUS_CANWITHDRAW = 6; // can withdraw node deposit amount after offboard uint256 public constant PUBKEY_STATUS_WITHDRAWED = 7; // Construct constructor(address _stafiStorageAddress) StafiBase(_stafiStorageAddress) { version = 1; } // Receive a ether withdrawal // Only accepts calls from the StafiEther contract function receiveEtherWithdrawal() override external payable onlyLatestContract("stafiLightNode", address(this)) onlyLatestContract("stafiEther", msg.sender) {} // Deposit ETH from deposit pool // Only accepts calls from the StafiUserDeposit contract function depositEth() override external payable onlyLatestContract("stafiUserDeposit", msg.sender) { // Emit ether deposited event emit EtherDeposited(msg.sender, msg.value, block.timestamp); } function EthDeposit() private view returns (IDepositContract) { return IDepositContract(getContractAddress("ethDeposit")); } function StafiNetworkSettings() private view returns (IStafiNetworkSettings) { return IStafiNetworkSettings(getContractAddress("stafiNetworkSettings")); } function PubkeySetStorage() public view returns (IPubkeySetStorage) { return IPubkeySetStorage(getContractAddress("pubkeySetStorage")); } // Get the number of pubkeys owned by a light node function getLightNodePubkeyCount(address _nodeAddress) override public view returns (uint256) { return PubkeySetStorage().getCount(keccak256(abi.encodePacked("lightNode.pubkeys.index", _nodeAddress))); } // Get a light node pubkey by index function getLightNodePubkeyAt(address _nodeAddress, uint256 _index) override public view returns (bytes memory) { return PubkeySetStorage().getItem(keccak256(abi.encodePacked("lightNode.pubkeys.index", _nodeAddress)), _index); } // Get a light node pubkey status function getLightNodePubkeyStatus(bytes calldata _validatorPubkey) override public view returns (uint256) { return getUint(keccak256(abi.encodePacked("lightNode.pubkey.status", _validatorPubkey))); } // Set a light node pubkey status function _setLightNodePubkeyStatus(bytes calldata _validatorPubkey, uint256 _status) private { setUint(keccak256(abi.encodePacked("lightNode.pubkey.status", _validatorPubkey)), _status); emit SetPubkeyStatus(_validatorPubkey, _status); } function setLightNodePubkeyStatus(bytes calldata _validatorPubkey, uint256 _status) public onlySuperUser { _setLightNodePubkeyStatus(_validatorPubkey, _status); } // Node deposits currently amount function getCurrentNodeDepositAmount() public view returns (uint256) { return getUint("settings.node.deposit.amount"); } function getLightNodeDepositEnabled() public view returns (bool) { return getBoolS("settings.lightNode.deposit.enabled"); } function getPubkeyVoted(bytes calldata _validatorPubkey, address user) public view returns (bool) { return getBool(keccak256(abi.encodePacked("lightNode.memberVotes.", _validatorPubkey, user))); } function setLightNodeDepositEnabled(bool _value) public onlySuperUser { setBoolS("settings.lightNode.deposit.enabled", _value); } function deposit(bytes[] calldata _validatorPubkeys, bytes[] calldata _validatorSignatures, bytes32[] calldata _depositDataRoots) override external payable onlyLatestContract("stafiLightNode", address(this)) { require(getLightNodeDepositEnabled(), "light node deposits are currently disabled"); uint256 len = _validatorPubkeys.length; require(len == _validatorSignatures.length && len == _depositDataRoots.length, "params len err"); require(msg.value == len.mul(getCurrentNodeDepositAmount()), "msg value not match"); for (uint256 i = 0; i < len; i++) { _deposit(_validatorPubkeys[i], _validatorSignatures[i], _depositDataRoots[i]); } } function stake(bytes[] calldata _validatorPubkeys, bytes[] calldata _validatorSignatures, bytes32[] calldata _depositDataRoots) override external onlyLatestContract("stafiLightNode", address(this)) { require(_validatorPubkeys.length == _validatorSignatures.length && _validatorPubkeys.length == _depositDataRoots.length, "params len err"); // Load contracts IStafiUserDeposit stafiUserDeposit = IStafiUserDeposit(getContractAddress("stafiUserDeposit")); stafiUserDeposit.withdrawExcessBalanceForLightNode(_validatorPubkeys.length.mul(uint256(32 ether).sub(getCurrentNodeDepositAmount()))); for (uint256 i = 0; i < _validatorPubkeys.length; i++) { _stake(_validatorPubkeys[i], _validatorSignatures[i], _depositDataRoots[i]); } } function offBoard(bytes calldata _validatorPubkey) override external onlyLatestContract("stafiLightNode", address(this)) { setAndCheckNodePubkeyInOffBoard(_validatorPubkey); emit OffBoarded(msg.sender, _validatorPubkey); } function provideNodeDepositToken(bytes calldata _validatorPubkey) override external payable onlyLatestContract("stafiLightNode", address(this)) { require(msg.value == getCurrentNodeDepositAmount(), "msg value not match"); // check status require(getLightNodePubkeyStatus(_validatorPubkey) == PUBKEY_STATUS_OFFBOARD, "pubkey status unmatch"); IStafiEther stafiEther = IStafiEther(getContractAddress("stafiEther")); stafiEther.depositEther{value: msg.value}(); // set pubkey status _setLightNodePubkeyStatus(_validatorPubkey, PUBKEY_STATUS_CANWITHDRAW); } function withdrawNodeDepositToken(bytes calldata _validatorPubkey) override external onlyLatestContract("stafiLightNode", address(this)) { // check status require(getLightNodePubkeyStatus(_validatorPubkey) == PUBKEY_STATUS_CANWITHDRAW, "pubkey status unmatch"); // check owner require(PubkeySetStorage().getIndexOf(keccak256(abi.encodePacked("lightNode.pubkeys.index", msg.sender)), _validatorPubkey) >= 0, "not pubkey owner"); IStafiEther stafiEther = IStafiEther(getContractAddress("stafiEther")); stafiEther.withdrawEther(getCurrentNodeDepositAmount()); // set pubkey status _setLightNodePubkeyStatus(_validatorPubkey, PUBKEY_STATUS_WITHDRAWED); (bool success,) = (msg.sender).call{value: getCurrentNodeDepositAmount()}(""); require(success, "transferr failed"); } function _deposit(bytes calldata _validatorPubkey, bytes calldata _validatorSignature, bytes32 _depositDataRoot) private { setAndCheckNodePubkeyInDeposit(_validatorPubkey); // Send staking deposit to casper EthDeposit().deposit{value: getCurrentNodeDepositAmount()}(_validatorPubkey, StafiNetworkSettings().getWithdrawalCredentials(), _validatorSignature, _depositDataRoot); emit Deposited(msg.sender, _validatorPubkey, _validatorSignature, getCurrentNodeDepositAmount()); } function _stake(bytes calldata _validatorPubkey, bytes calldata _validatorSignature, bytes32 _depositDataRoot) private { setAndCheckNodePubkeyInStake(_validatorPubkey); // Send staking deposit to casper EthDeposit().deposit{value: uint256(32 ether).sub(getCurrentNodeDepositAmount())}(_validatorPubkey, StafiNetworkSettings().getWithdrawalCredentials(), _validatorSignature, _depositDataRoot); emit Staked(msg.sender, _validatorPubkey); } // Set and check a node's validator pubkey function setAndCheckNodePubkeyInDeposit(bytes calldata _pubkey) private { // check pubkey of stakingpools require(getAddress(keccak256(abi.encodePacked("validator.stakingpool", _pubkey))) == address(0x0), "stakingpool pubkey exists"); // check pubkey of superNodes require(getUint(keccak256(abi.encodePacked("superNode.pubkey.status", _pubkey))) == PUBKEY_STATUS_UNINITIAL, "super Node pubkey exists"); // check status require(getLightNodePubkeyStatus(_pubkey) == PUBKEY_STATUS_UNINITIAL, "pubkey status unmatch"); // set pubkey status _setLightNodePubkeyStatus(_pubkey, PUBKEY_STATUS_INITIAL); // add pubkey to set PubkeySetStorage().addItem(keccak256(abi.encodePacked("lightNode.pubkeys.index", msg.sender)), _pubkey); } // Set and check a node's validator pubkey function setAndCheckNodePubkeyInStake(bytes calldata _pubkey) private { // check status require(getLightNodePubkeyStatus(_pubkey) == PUBKEY_STATUS_MATCH, "pubkey status unmatch"); // check owner require(PubkeySetStorage().getIndexOf(keccak256(abi.encodePacked("lightNode.pubkeys.index", msg.sender)), _pubkey) >= 0, "not pubkey owner"); // set pubkey status _setLightNodePubkeyStatus(_pubkey, PUBKEY_STATUS_STAKING); } // Set and check a node's validator pubkey function setAndCheckNodePubkeyInOffBoard(bytes calldata _pubkey) private { // check status require(getLightNodePubkeyStatus(_pubkey) == PUBKEY_STATUS_MATCH, "pubkey status unmatch"); // check owner require(PubkeySetStorage().getIndexOf(keccak256(abi.encodePacked("lightNode.pubkeys.index", msg.sender)), _pubkey) >= 0, "not pubkey owner"); // set pubkey status _setLightNodePubkeyStatus(_pubkey, PUBKEY_STATUS_OFFBOARD); } // Only accepts calls from trusted (oracle) nodes function voteWithdrawCredentials(bytes[] calldata _pubkeys, bool[] calldata _matchs) override external onlyLatestContract("stafiLightNode", address(this)) onlyTrustedNode(msg.sender) { require(_pubkeys.length == _matchs.length, "params len err"); for (uint256 i = 0; i < _pubkeys.length; i++) { _voteWithdrawCredentials(_pubkeys[i], _matchs[i]); } } function _voteWithdrawCredentials(bytes calldata _pubkey, bool _match) private { // Check & update node vote status require(!getBool(keccak256(abi.encodePacked("lightNode.memberVotes.", _pubkey, msg.sender))), "Member has already voted to withdrawCredentials"); setBool(keccak256(abi.encodePacked("lightNode.memberVotes.", _pubkey, msg.sender)), true); // Increment votes count uint256 totalVotes = getUint(keccak256(abi.encodePacked("lightNode.totalVotes", _pubkey, _match))); totalVotes = totalVotes.add(1); setUint(keccak256(abi.encodePacked("lightNode.totalVotes", _pubkey, _match)), totalVotes); // Check count and set status uint256 calcBase = 1 ether; IStafiNodeManager stafiNodeManager = IStafiNodeManager(getContractAddress("stafiNodeManager")); if (getLightNodePubkeyStatus(_pubkey) == PUBKEY_STATUS_INITIAL && calcBase.mul(totalVotes) >= stafiNodeManager.getTrustedNodeCount().mul(StafiNetworkSettings().getNodeConsensusThreshold())) { _setLightNodePubkeyStatus(_pubkey, _match ? PUBKEY_STATUS_MATCH : PUBKEY_STATUS_UNMATCH); } } }
pragma solidity 0.7.6; // SPDX-License-Identifier: GPL-3.0-only import "./interfaces/storage/IStafiStorage.sol"; abstract contract StafiBase { // Version of the contract uint8 public version; // The main storage contract where primary persistant storage is maintained IStafiStorage stafiStorage = IStafiStorage(0); /** * @dev Throws if called by any sender that doesn't match a network contract */ modifier onlyLatestNetworkContract() { require(getBool(keccak256(abi.encodePacked("contract.exists", msg.sender))), "Invalid or outdated network contract"); _; } /** * @dev Throws if called by any sender that doesn't match one of the supplied contract or is the latest version of that contract */ modifier onlyLatestContract(string memory _contractName, address _contractAddress) { require(_contractAddress == getAddress(keccak256(abi.encodePacked("contract.address", _contractName))), "Invalid or outdated contract"); _; } /** * @dev Throws if called by any sender that isn't a trusted node */ modifier onlyTrustedNode(address _nodeAddress) { require(getBool(keccak256(abi.encodePacked("node.trusted", _nodeAddress))), "Invalid trusted node"); _; } /** * @dev Throws if called by any sender that isn't a super node */ modifier onlySuperNode(address _nodeAddress) { require(getBool(keccak256(abi.encodePacked("node.super", _nodeAddress))), "Invalid super node"); _; } /** * @dev Throws if called by any sender that isn't a registered staking pool */ modifier onlyRegisteredStakingPool(address _stakingPoolAddress) { require(getBool(keccak256(abi.encodePacked("stakingpool.exists", _stakingPoolAddress))), "Invalid staking pool"); _; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(roleHas("owner", msg.sender), "Account is not the owner"); _; } /** * @dev Modifier to scope access to admins */ modifier onlyAdmin() { require(roleHas("admin", msg.sender), "Account is not an admin"); _; } /** * @dev Modifier to scope access to admins */ modifier onlySuperUser() { require(roleHas("owner", msg.sender) || roleHas("admin", msg.sender), "Account is not a super user"); _; } /** * @dev Reverts if the address doesn't have this role */ modifier onlyRole(string memory _role) { require(roleHas(_role, msg.sender), "Account does not match the specified role"); _; } /// @dev Set the main Storage address constructor(address _stafiStorageAddress) { // Update the contract address stafiStorage = IStafiStorage(_stafiStorageAddress); } /// @dev Get the address of a network contract by name function getContractAddress(string memory _contractName) internal view returns (address) { // Get the current contract address address contractAddress = getAddress(keccak256(abi.encodePacked("contract.address", _contractName))); // Check it require(contractAddress != address(0x0), "Contract not found"); // Return return contractAddress; } /// @dev Get the name of a network contract by address function getContractName(address _contractAddress) internal view returns (string memory) { // Get the contract name string memory contractName = getString(keccak256(abi.encodePacked("contract.name", _contractAddress))); // Check it require(keccak256(abi.encodePacked(contractName)) != keccak256(abi.encodePacked("")), "Contract not found"); // Return return contractName; } /// @dev Storage get methods function getAddress(bytes32 _key) internal view returns (address) { return stafiStorage.getAddress(_key); } function getUint(bytes32 _key) internal view returns (uint256) { return stafiStorage.getUint(_key); } function getString(bytes32 _key) internal view returns (string memory) { return stafiStorage.getString(_key); } function getBytes(bytes32 _key) internal view returns (bytes memory) { return stafiStorage.getBytes(_key); } function getBool(bytes32 _key) internal view returns (bool) { return stafiStorage.getBool(_key); } function getInt(bytes32 _key) internal view returns (int256) { return stafiStorage.getInt(_key); } function getBytes32(bytes32 _key) internal view returns (bytes32) { return stafiStorage.getBytes32(_key); } function getAddressS(string memory _key) internal view returns (address) { return stafiStorage.getAddress(keccak256(abi.encodePacked(_key))); } function getUintS(string memory _key) internal view returns (uint256) { return stafiStorage.getUint(keccak256(abi.encodePacked(_key))); } function getStringS(string memory _key) internal view returns (string memory) { return stafiStorage.getString(keccak256(abi.encodePacked(_key))); } function getBytesS(string memory _key) internal view returns (bytes memory) { return stafiStorage.getBytes(keccak256(abi.encodePacked(_key))); } function getBoolS(string memory _key) internal view returns (bool) { return stafiStorage.getBool(keccak256(abi.encodePacked(_key))); } function getIntS(string memory _key) internal view returns (int256) { return stafiStorage.getInt(keccak256(abi.encodePacked(_key))); } function getBytes32S(string memory _key) internal view returns (bytes32) { return stafiStorage.getBytes32(keccak256(abi.encodePacked(_key))); } /// @dev Storage set methods function setAddress(bytes32 _key, address _value) internal { stafiStorage.setAddress(_key, _value); } function setUint(bytes32 _key, uint256 _value) internal { stafiStorage.setUint(_key, _value); } function setString(bytes32 _key, string memory _value) internal { stafiStorage.setString(_key, _value); } function setBytes(bytes32 _key, bytes memory _value) internal { stafiStorage.setBytes(_key, _value); } function setBool(bytes32 _key, bool _value) internal { stafiStorage.setBool(_key, _value); } function setInt(bytes32 _key, int256 _value) internal { stafiStorage.setInt(_key, _value); } function setBytes32(bytes32 _key, bytes32 _value) internal { stafiStorage.setBytes32(_key, _value); } function setAddressS(string memory _key, address _value) internal { stafiStorage.setAddress(keccak256(abi.encodePacked(_key)), _value); } function setUintS(string memory _key, uint256 _value) internal { stafiStorage.setUint(keccak256(abi.encodePacked(_key)), _value); } function setStringS(string memory _key, string memory _value) internal { stafiStorage.setString(keccak256(abi.encodePacked(_key)), _value); } function setBytesS(string memory _key, bytes memory _value) internal { stafiStorage.setBytes(keccak256(abi.encodePacked(_key)), _value); } function setBoolS(string memory _key, bool _value) internal { stafiStorage.setBool(keccak256(abi.encodePacked(_key)), _value); } function setIntS(string memory _key, int256 _value) internal { stafiStorage.setInt(keccak256(abi.encodePacked(_key)), _value); } function setBytes32S(string memory _key, bytes32 _value) internal { stafiStorage.setBytes32(keccak256(abi.encodePacked(_key)), _value); } /// @dev Storage delete methods function deleteAddress(bytes32 _key) internal { stafiStorage.deleteAddress(_key); } function deleteUint(bytes32 _key) internal { stafiStorage.deleteUint(_key); } function deleteString(bytes32 _key) internal { stafiStorage.deleteString(_key); } function deleteBytes(bytes32 _key) internal { stafiStorage.deleteBytes(_key); } function deleteBool(bytes32 _key) internal { stafiStorage.deleteBool(_key); } function deleteInt(bytes32 _key) internal { stafiStorage.deleteInt(_key); } function deleteBytes32(bytes32 _key) internal { stafiStorage.deleteBytes32(_key); } function deleteAddressS(string memory _key) internal { stafiStorage.deleteAddress(keccak256(abi.encodePacked(_key))); } function deleteUintS(string memory _key) internal { stafiStorage.deleteUint(keccak256(abi.encodePacked(_key))); } function deleteStringS(string memory _key) internal { stafiStorage.deleteString(keccak256(abi.encodePacked(_key))); } function deleteBytesS(string memory _key) internal { stafiStorage.deleteBytes(keccak256(abi.encodePacked(_key))); } function deleteBoolS(string memory _key) internal { stafiStorage.deleteBool(keccak256(abi.encodePacked(_key))); } function deleteIntS(string memory _key) internal { stafiStorage.deleteInt(keccak256(abi.encodePacked(_key))); } function deleteBytes32S(string memory _key) internal { stafiStorage.deleteBytes32(keccak256(abi.encodePacked(_key))); } /** * @dev Check if an address has this role */ function roleHas(string memory _role, address _address) internal view returns (bool) { return getBool(keccak256(abi.encodePacked("access.role", _role, _address))); } }
pragma solidity 0.7.6; pragma abicoder v2; // SPDX-License-Identifier: GPL-3.0-only interface IStafiLightNode { function depositEth() external payable; function deposit(bytes[] calldata _validatorPubkeys, bytes[] calldata _validatorSignatures, bytes32[] calldata _depositDataRoots) external payable; function stake(bytes[] calldata _validatorPubkeys, bytes[] calldata _validatorSignatures, bytes32[] calldata _depositDataRoots) external; function offBoard(bytes calldata _validatorPubkey) external; function provideNodeDepositToken(bytes calldata _validatorPubkey) external payable; function withdrawNodeDepositToken(bytes calldata _validatorPubkey) external; function getLightNodePubkeyCount(address _nodeAddress) external view returns (uint256); function getLightNodePubkeyAt(address _nodeAddress, uint256 _index) external view returns (bytes memory); function getLightNodePubkeyStatus(bytes calldata _validatorPubkey) external view returns (uint256); function voteWithdrawCredentials(bytes[] calldata _pubkey, bool[] calldata _match) external; }
pragma solidity 0.7.6; // SPDX-License-Identifier: GPL-3.0-only interface IStafiNodeManager { function getNodeCount() external view returns (uint256); function getNodeAt(uint256 _index) external view returns (address); function getTrustedNodeCount() external view returns (uint256); function getTrustedNodeAt(uint256 _index) external view returns (address); function getSuperNodeCount() external view returns (uint256); function getSuperNodeAt(uint256 _index) external view returns (address); function getNodeExists(address _nodeAddress) external view returns (bool); function getNodeTrusted(address _nodeAddress) external view returns (bool); function getSuperNodeExists(address _nodeAddress) external view returns (bool); function registerNode(address _nodeAddress) external; function setNodeTrusted(address _nodeAddress, bool _trusted) external; function setNodeSuper(address _nodeAddress, bool _super) external; }
pragma solidity 0.7.6; // SPDX-License-Identifier: GPL-3.0-only interface IStafiUserDeposit { function getBalance() external view returns (uint256); function getExcessBalance() external view returns (uint256); function deposit() external payable; function recycleDissolvedDeposit() external payable; function recycleWithdrawnDeposit() external payable; function recycleDistributorDeposit() external payable; function assignDeposits() external; function withdrawExcessBalance(uint256 _amount) external; function withdrawExcessBalanceForSuperNode(uint256 _amount) external; function withdrawExcessBalanceForLightNode(uint256 _amount) external; }
pragma solidity 0.7.6; // SPDX-License-Identifier: GPL-3.0-only interface IDepositContract { function deposit(bytes calldata _pubkey, bytes calldata _withdrawalCredentials, bytes calldata _signature, bytes32 _depositDataRoot) external payable; }
pragma solidity 0.7.6; // SPDX-License-Identifier: GPL-3.0-only interface IStafiNetworkSettings { function getNodeConsensusThreshold() external view returns (uint256); function getSubmitBalancesEnabled() external view returns (bool); function getProcessWithdrawalsEnabled() external view returns (bool); function getNodeFee() external view returns (uint256); function getPlatformFee() external view returns (uint256); function getNodeRefundRatio() external view returns (uint256); function getNodeTrustedRefundRatio() external view returns (uint256); function getWithdrawalCredentials() external view returns (bytes memory); function getSuperNodePubkeyLimit() external view returns (uint256); }
pragma solidity 0.7.6; // SPDX-License-Identifier: GPL-3.0-only interface IPubkeySetStorage { function getCount(bytes32 _key) external view returns (uint256); function getItem(bytes32 _key, uint256 _index) external view returns (bytes memory); function getIndexOf(bytes32 _key, bytes calldata _value) external view returns (int256); function addItem(bytes32 _key, bytes memory _value) external; function removeItem(bytes32 _key, bytes calldata _value) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b > a) return (false, 0); return (true, a - b); } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a / b); } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a % b); } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) return 0; uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: division by zero"); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: modulo by zero"); return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); return a - b; } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a % b; } }
pragma solidity 0.7.6; // SPDX-License-Identifier: GPL-3.0-only interface IStafiEtherWithdrawer { function receiveEtherWithdrawal() external payable; }
pragma solidity 0.7.6; // SPDX-License-Identifier: GPL-3.0-only interface IStafiEther { function balanceOf(address _contractAddress) external view returns (uint256); function depositEther() external payable; function withdrawEther(uint256 _amount) external; }
pragma solidity 0.7.6; // SPDX-License-Identifier: GPL-3.0-only interface IStafiStorage { // Getters function getAddress(bytes32 _key) external view returns (address); function getUint(bytes32 _key) external view returns (uint); function getString(bytes32 _key) external view returns (string memory); function getBytes(bytes32 _key) external view returns (bytes memory); function getBool(bytes32 _key) external view returns (bool); function getInt(bytes32 _key) external view returns (int); function getBytes32(bytes32 _key) external view returns (bytes32); // Setters function setAddress(bytes32 _key, address _value) external; function setUint(bytes32 _key, uint _value) external; function setString(bytes32 _key, string calldata _value) external; function setBytes(bytes32 _key, bytes calldata _value) external; function setBool(bytes32 _key, bool _value) external; function setInt(bytes32 _key, int _value) external; function setBytes32(bytes32 _key, bytes32 _value) external; // Deleters function deleteAddress(bytes32 _key) external; function deleteUint(bytes32 _key) external; function deleteString(bytes32 _key) external; function deleteBytes(bytes32 _key) external; function deleteBool(bytes32 _key) external; function deleteInt(bytes32 _key) external; function deleteBytes32(bytes32 _key) external; }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_stafiStorageAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"node","type":"address"},{"indexed":false,"internalType":"bytes","name":"pubkey","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"validatorSignature","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"EtherDeposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"node","type":"address"},{"indexed":false,"internalType":"bytes","name":"pubkey","type":"bytes"}],"name":"OffBoarded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes","name":"pubkey","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"status","type":"uint256"}],"name":"SetPubkeyStatus","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"node","type":"address"},{"indexed":false,"internalType":"bytes","name":"pubkey","type":"bytes"}],"name":"Staked","type":"event"},{"inputs":[],"name":"PUBKEY_STATUS_CANWITHDRAW","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBKEY_STATUS_INITIAL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBKEY_STATUS_MATCH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBKEY_STATUS_OFFBOARD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBKEY_STATUS_STAKING","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBKEY_STATUS_UNINITIAL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBKEY_STATUS_UNMATCH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBKEY_STATUS_WITHDRAWED","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PubkeySetStorage","outputs":[{"internalType":"contract IPubkeySetStorage","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"_validatorPubkeys","type":"bytes[]"},{"internalType":"bytes[]","name":"_validatorSignatures","type":"bytes[]"},{"internalType":"bytes32[]","name":"_depositDataRoots","type":"bytes32[]"}],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"depositEth","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"getCurrentNodeDepositAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLightNodeDepositEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_nodeAddress","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getLightNodePubkeyAt","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_nodeAddress","type":"address"}],"name":"getLightNodePubkeyCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_validatorPubkey","type":"bytes"}],"name":"getLightNodePubkeyStatus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_validatorPubkey","type":"bytes"},{"internalType":"address","name":"user","type":"address"}],"name":"getPubkeyVoted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_validatorPubkey","type":"bytes"}],"name":"offBoard","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_validatorPubkey","type":"bytes"}],"name":"provideNodeDepositToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"receiveEtherWithdrawal","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bool","name":"_value","type":"bool"}],"name":"setLightNodeDepositEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_validatorPubkey","type":"bytes"},{"internalType":"uint256","name":"_status","type":"uint256"}],"name":"setLightNodePubkeyStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"_validatorPubkeys","type":"bytes[]"},{"internalType":"bytes[]","name":"_validatorSignatures","type":"bytes[]"},{"internalType":"bytes32[]","name":"_depositDataRoots","type":"bytes32[]"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"_pubkeys","type":"bytes[]"},{"internalType":"bool[]","name":"_matchs","type":"bool[]"}],"name":"voteWithdrawCredentials","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_validatorPubkey","type":"bytes"}],"name":"withdrawNodeDepositToken","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405260008060016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200005257600080fd5b5060405162004a5638038062004a568339818101604052810190620000789190620000f4565b8080600060016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505060016000806101000a81548160ff021916908360ff160217905550506200016e565b600081519050620000ee8162000154565b92915050565b6000602082840312156200010757600080fd5b60006200011784828501620000dd565b91505092915050565b60006200012d8262000134565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6200015f8162000120565b81146200016b57600080fd5b50565b6148d8806200017e6000396000f3fe6080604052600436106101815760003560e01c806390d76417116100d1578063adf1d8d61161008a578063ca2b87af11610064578063ca2b87af14610522578063ccdf1d791461054b578063d46221f914610588578063eee1fa44146105a457610181565b8063adf1d8d614610491578063ae3e885a146104ba578063ba7fe814146104e557610181565b806390d76417146103815780639532e08a146103ac5780639630f63c146103d7578063a32cb34114610400578063a37212cb1461042b578063a4b4334b1461046857610181565b806340ce18a01161013e57806364f14dba1161011857806364f14dba146102d757806368d25fe81461030257806383f3f0861461032d57806384d9eb7c1461035857610181565b806340ce18a014610277578063439370b1146102a257806354fd4d50146102ac57610181565b806309ba5933146101865780630a019eaf146101b157806318582e28146101bb5780631e8bc826146101f85780633c4bc635146102235780633f25522d1461024c575b600080fd5b34801561019257600080fd5b5061019b6105c0565b6040516101a8919061450b565b60405180910390f35b6101b96105c5565b005b3480156101c757600080fd5b506101e260048036038101906101dd9190613a05565b6108bd565b6040516101ef919061428d565b60405180910390f35b34801561020457600080fd5b5061020d6108fb565b60405161021a919061450b565b60405180910390f35b34801561022f57600080fd5b5061024a600480360381019061024591906139c0565b610900565b005b34801561025857600080fd5b50610261610d3d565b60405161026e919061450b565b60405180910390f35b34801561028357600080fd5b5061028c610d42565b604051610299919061450b565b60405180910390f35b6102aa610d47565b005b3480156102b857600080fd5b506102c1610f14565b6040516102ce919061454f565b60405180910390f35b3480156102e357600080fd5b506102ec610f25565b6040516102f9919061450b565b60405180910390f35b34801561030e57600080fd5b50610317610f2a565b604051610324919061450b565b60405180910390f35b34801561033957600080fd5b50610342610f2f565b60405161034f919061450b565b60405180910390f35b34801561036457600080fd5b5061037f600480360381019061037a91906139c0565b610f5f565b005b34801561038d57600080fd5b50610396611123565b6040516103a391906143d0565b60405180910390f35b3480156103b857600080fd5b506103c1611168565b6040516103ce919061450b565b60405180910390f35b3480156103e357600080fd5b506103fe60048036038101906103f99190613a5d565b61116d565b005b34801561040c57600080fd5b50610415611274565b604051610422919061428d565b60405180910390f35b34801561043757600080fd5b50610452600480360381019061044d91906139c0565b61129c565b60405161045f919061450b565b60405180910390f35b34801561047457600080fd5b5061048f600480360381019061048a919061387e565b6112d7565b005b34801561049d57600080fd5b506104b860048036038101906104b39190613997565b6115e7565b005b3480156104c657600080fd5b506104cf611703565b6040516104dc919061450b565b60405180910390f35b3480156104f157600080fd5b5061050c60048036038101906105079190613842565b611708565b60405161051991906143ae565b60405180910390f35b34801561052e57600080fd5b50610549600480360381019061054491906138f3565b6117cf565b005b34801561055757600080fd5b50610572600480360381019061056d9190613819565b611b03565b60405161057f919061450b565b60405180910390f35b6105a2600480360381019061059d91906138f3565b611bc2565b005b6105be60048036038101906105b991906139c0565b611eb3565b005b600481565b6040518060400160405280600e81526020017f73746166694c696768744e6f64650000000000000000000000000000000000008152503061069e8260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b6020831061065e578051825260208201915060208101905060208303925061063b565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120612177565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461073e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b6040518060400160405280600a81526020017f7374616669457468657200000000000000000000000000000000000000000000815250336108178260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b602083106107d757805182526020820191506020810190506020830392506107b4565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120612177565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146108b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b50505050565b60006108f28484846040516020016108d7939291906140bc565b6040516020818303038152906040528051906020012061222d565b90509392505050565b600681565b6040518060400160405280600e81526020017f73746166694c696768744e6f6465000000000000000000000000000000000000815250306109d98260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b602083106109995780518252602082019150602081019050602083039250610976565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120612177565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a79576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b6006610a85858561129c565b14610ac5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610abc906144eb565b60405180910390fd5b6000610acf611123565b73ffffffffffffffffffffffffffffffffffffffff1663606aa8ca33604051602001610afb9190614170565b6040516020818303038152906040528051906020012087876040518463ffffffff1660e01b8152600401610b31939291906142c3565b60206040518083038186803b158015610b4957600080fd5b505afa158015610b5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b819190613af6565b1215610bc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb99061448b565b60405180910390fd5b6000610c026040518060400160405280600a81526020017f73746166694574686572000000000000000000000000000000000000000000008152506122e3565b90508073ffffffffffffffffffffffffffffffffffffffff16633bed33ce610c28610f2f565b6040518263ffffffff1660e01b8152600401610c44919061450b565b600060405180830381600087803b158015610c5e57600080fd5b505af1158015610c72573d6000803e3d6000fd5b50505050610c8285856007612436565b60003373ffffffffffffffffffffffffffffffffffffffff16610ca3610f2f565b604051610caf906141ef565b60006040518083038185875af1925050503d8060008114610cec576040519150601f19603f3d011682016040523d82523d6000602084013e610cf1565b606091505b5050905080610d35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2c9061446b565b60405180910390fd5b505050505050565b600081565b600381565b6040518060400160405280601081526020017f7374616669557365724465706f7369740000000000000000000000000000000081525033610e208260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b60208310610de05780518252602082019150602081019050602083039250610dbd565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120612177565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ec0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167fef51b4c870b8b0100eae2072e91db01222a303072af3728e58c9d4d2da33127f3442604051610f08929190614526565b60405180910390a25050565b60008054906101000a900460ff1681565b600281565b600781565b6000610f5a7f73657474696e67732e6e6f64652e6465706f7369742e616d6f756e74000000006124a8565b905090565b6040518060400160405280600e81526020017f73746166694c696768744e6f6465000000000000000000000000000000000000815250306110388260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b60208310610ff85780518252602082019150602081019050602083039250610fd5565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120612177565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146110d8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b6110e2848461255e565b7f9d5023d85497e8c264e3b053f8da9415f4db76eb5af3ecef3fe953fe9f98147033858560405161111593929190614204565b60405180910390a150505050565b60006111636040518060400160405280601081526020017f7075626b657953657453746f72616765000000000000000000000000000000008152506122e3565b905090565b600581565b6111ac6040518060400160405280600581526020017f6f776e6572000000000000000000000000000000000000000000000000000000815250336126b7565b806111f257506111f16040518060400160405280600581526020017f61646d696e000000000000000000000000000000000000000000000000000000815250336126b7565b5b611264576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4163636f756e74206973206e6f7420612073757065722075736572000000000081525060200191505060405180910390fd5b61126f838383612436565b505050565b600061129760405180606001604052806022815260200161488160229139612784565b905090565b60006112cf83836040516020016112b49291906141cb565b604051602081830303815290604052805190602001206124a8565b905092915050565b6040518060400160405280600e81526020017f73746166694c696768744e6f6465000000000000000000000000000000000000815250306113b08260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b60208310611370578051825260208201915060208101905060208303925061134d565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120612177565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611450576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b336114c18160405160200180807f6e6f64652e747275737465640000000000000000000000000000000000000000815250600c018273ffffffffffffffffffffffffffffffffffffffff1660601b81526014019150506040516020818303038152906040528051906020012061222d565b611533576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f496e76616c69642074727573746564206e6f646500000000000000000000000081525060200191505060405180910390fd5b84849050878790501461157b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611572906144ab565b60405180910390fd5b60005b878790508110156115dd576115d088888381811061159857fe5b90506020028101906115aa919061456a565b8888858181106115b657fe5b90506020020160208101906115cb9190613997565b6128ab565b808060010191505061157e565b5050505050505050565b6116266040518060400160405280600581526020017f6f776e6572000000000000000000000000000000000000000000000000000000815250336126b7565b8061166c575061166b6040518060400160405280600581526020017f61646d696e000000000000000000000000000000000000000000000000000000815250336126b7565b5b6116de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4163636f756e74206973206e6f7420612073757065722075736572000000000081525060200191505060405180910390fd5b6117006040518060600160405280602281526020016148816022913982612b88565b50565b600181565b6060611712611123565b73ffffffffffffffffffffffffffffffffffffffff1663f3358a3a8460405160200161173e919061414a565b60405160208183030381529060405280519060200120846040518363ffffffff1660e01b81526004016117729291906142f5565b60006040518083038186803b15801561178a57600080fd5b505afa15801561179e573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906117c79190613ab5565b905092915050565b6040518060400160405280600e81526020017f73746166694c696768744e6f6465000000000000000000000000000000000000815250306118a88260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b602083106118685780518252602082019150602081019050602083039250611845565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120612177565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611948576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b858590508888905014801561196257508383905088889050145b6119a1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611998906144ab565b60405180910390fd5b60006119e16040518060400160405280601081526020017f7374616669557365724465706f736974000000000000000000000000000000008152506122e3565b90508073ffffffffffffffffffffffffffffffffffffffff1663cc88c3c8611a37611a25611a0d610f2f565b6801bc16d674ec800000612c9490919063ffffffff16565b8c8c9050612d1790919063ffffffff16565b6040518263ffffffff1660e01b8152600401611a53919061450b565b600060405180830381600087803b158015611a6d57600080fd5b505af1158015611a81573d6000803e3d6000fd5b5050505060005b89899050811015611af757611aea8a8a83818110611aa257fe5b9050602002810190611ab4919061456a565b8a8a85818110611ac057fe5b9050602002810190611ad2919061456a565b8a8a87818110611ade57fe5b90506020020135612d9d565b8080600101915050611a88565b50505050505050505050565b6000611b0d611123565b73ffffffffffffffffffffffffffffffffffffffff1663c9d6fee983604051602001611b39919061414a565b604051602081830303815290604052805190602001206040518263ffffffff1660e01b8152600401611b6b91906142a8565b60206040518083038186803b158015611b8357600080fd5b505afa158015611b97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bbb9190613b1f565b9050919050565b6040518060400160405280600e81526020017f73746166694c696768744e6f646500000000000000000000000000000000000081525030611c9b8260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b60208310611c5b5780518252602082019150602081019050602083039250611c38565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120612177565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611d3b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b611d43611274565b611d82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d799061440b565b60405180910390fd5b60008888905090508686905081148015611d9e57508484905081145b611ddd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd4906144ab565b60405180910390fd5b611df7611de8610f2f565b82612d1790919063ffffffff16565b3414611e38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2f9061442b565b60405180910390fd5b60005b81811015611ea757611e9a8a8a83818110611e5257fe5b9050602002810190611e64919061456a565b8a8a85818110611e7057fe5b9050602002810190611e82919061456a565b8a8a87818110611e8e57fe5b90506020020135612f11565b8080600101915050611e3b565b50505050505050505050565b6040518060400160405280600e81526020017f73746166694c696768744e6f646500000000000000000000000000000000000081525030611f8c8260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b60208310611f4c5780518252602082019150602081019050602083039250611f29565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120612177565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461202c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b612034610f2f565b3414612075576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206c9061442b565b60405180910390fd5b6005612081858561129c565b146120c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b8906144eb565b60405180910390fd5b60006121016040518060400160405280600a81526020017f73746166694574686572000000000000000000000000000000000000000000008152506122e3565b90508073ffffffffffffffffffffffffffffffffffffffff166398ea5fca346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561214b57600080fd5b505af115801561215f573d6000803e3d6000fd5b505050505061217085856006612436565b5050505050565b60008060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166321f8a721836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156121eb57600080fd5b505afa1580156121ff573d6000803e3d6000fd5b505050506040513d602081101561221557600080fd5b81019080805190602001909291905050509050919050565b60008060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637ae1cfca836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156122a157600080fd5b505afa1580156122b5573d6000803e3d6000fd5b505050506040513d60208110156122cb57600080fd5b81019080805190602001909291905050509050919050565b6000806123888360405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b602083106123485780518252602082019150602081019050602083039250612325565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120612177565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561242d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f436f6e7472616374206e6f7420666f756e64000000000000000000000000000081525060200191505060405180910390fd5b80915050919050565b612468838360405160200161244c9291906141cb565b6040516020818303038152906040528051906020012082613077565b7fc581330a67ddadcf62d06e14db41c85bb45910369cedad649390e6dd2a9373c883838360405161249b9392919061437c565b60405180910390a1505050565b60008060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bd02d0f5836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561251c57600080fd5b505afa158015612530573d6000803e3d6000fd5b505050506040513d602081101561254657600080fd5b81019080805190602001909291905050509050919050565b600261256a838361129c565b146125aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125a1906144eb565b60405180910390fd5b60006125b4611123565b73ffffffffffffffffffffffffffffffffffffffff1663606aa8ca336040516020016125e09190614170565b6040516020818303038152906040528051906020012085856040518463ffffffff1660e01b8152600401612616939291906142c3565b60206040518083038186803b15801561262e57600080fd5b505afa158015612642573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126669190613af6565b12156126a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269e9061448b565b60405180910390fd5b6126b382826005612436565b5050565b600061277c838360405160200180807f6163636573732e726f6c65000000000000000000000000000000000000000000815250600b0183805190602001908083835b6020831061271c57805182526020820191506020810190506020830392506126f9565b6001836020036101000a0380198251168184511680821785525050505050509050018273ffffffffffffffffffffffffffffffffffffffff1660601b8152601401925050506040516020818303038152906040528051906020012061222d565b905092915050565b60008060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637ae1cfca836040516020018082805190602001908083835b602083106127fa57805182526020820191506020810190506020830392506127d7565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052805190602001206040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561286957600080fd5b505afa15801561287d573d6000803e3d6000fd5b505050506040513d602081101561289357600080fd5b81019080805190602001909291905050509050919050565b6128de8383336040516020016128c3939291906140f1565b6040516020818303038152906040528051906020012061222d565b1561291e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129159061444b565b60405180910390fd5b612953838333604051602001612936939291906140f1565b604051602081830303815290604052805190602001206001613110565b600061298884848460405160200161296d93929190614196565b604051602081830303815290604052805190602001206124a8565b905061299e6001826131ab90919063ffffffff16565b90506129d48484846040516020016129b893929190614196565b6040516020818303038152906040528051906020012082613077565b6000670de0b6b3a764000090506000612a216040518060400160405280601081526020017f73746166694e6f64654d616e61676572000000000000000000000000000000008152506122e3565b90506001612a2f878761129c565b148015612b615750612b4b612a42613233565b73ffffffffffffffffffffffffffffffffffffffff16631f66e8ed6040518163ffffffff1660e01b815260040160206040518083038186803b158015612a8757600080fd5b505afa158015612a9b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612abf9190613b1f565b8273ffffffffffffffffffffffffffffffffffffffff166366e3c0266040518163ffffffff1660e01b815260040160206040518083038186803b158015612b0557600080fd5b505afa158015612b19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b3d9190613b1f565b612d1790919063ffffffff16565b612b5e8484612d1790919063ffffffff16565b10155b15612b8057612b7f868686612b77576004612b7a565b60025b612436565b5b505050505050565b600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663abfdcced836040516020018082805190602001908083835b60208310612bfd5780518252602082019150602081019050602083039250612bda565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040518363ffffffff1660e01b815260040180838152602001821515815260200192505050600060405180830381600087803b158015612c7857600080fd5b505af1158015612c8c573d6000803e3d6000fd5b505050505050565b600082821115612d0c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525060200191505060405180910390fd5b818303905092915050565b600080831415612d2a5760009050612d97565b6000828402905082848281612d3b57fe5b0414612d92576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806148606021913960400191505060405180910390fd5b809150505b92915050565b612da78585613278565b612daf6133d1565b73ffffffffffffffffffffffffffffffffffffffff166322895118612ded612dd5610f2f565b6801bc16d674ec800000612c9490919063ffffffff16565b8787612df7613233565b73ffffffffffffffffffffffffffffffffffffffff1663563967156040518163ffffffff1660e01b815260040160006040518083038186803b158015612e3c57600080fd5b505afa158015612e50573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190612e799190613ab5565b8888886040518863ffffffff1660e01b8152600401612e9d9695949392919061431e565b6000604051808303818588803b158015612eb657600080fd5b505af1158015612eca573d6000803e3d6000fd5b50505050507fb384b282308c431ac3ea7756646550752d3f0dbfb418ef60bfeaf4edc9494815338686604051612f0293929190614204565b60405180910390a15050505050565b612f1b8585613416565b612f236133d1565b73ffffffffffffffffffffffffffffffffffffffff166322895118612f46610f2f565b8787612f50613233565b73ffffffffffffffffffffffffffffffffffffffff1663563967156040518163ffffffff1660e01b815260040160006040518083038186803b158015612f9557600080fd5b505afa158015612fa9573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190612fd29190613ab5565b8888886040518863ffffffff1660e01b8152600401612ff69695949392919061431e565b6000604051808303818588803b15801561300f57600080fd5b505af1158015613023573d6000803e3d6000fd5b50505050507f1fc33daf7f37b2e02f49dbee7b9707bddd7c8cef1f08deff23bff3d105e5aa723386868686613056610f2f565b60405161306896959493929190614236565b60405180910390a15050505050565b600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e2a4853a83836040518363ffffffff1660e01b81526004018083815260200182815260200192505050600060405180830381600087803b1580156130f457600080fd5b505af1158015613108573d6000803e3d6000fd5b505050505050565b600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663abfdcced83836040518363ffffffff1660e01b815260040180838152602001821515815260200192505050600060405180830381600087803b15801561318f57600080fd5b505af11580156131a3573d6000803e3d6000fd5b505050505050565b600080828401905083811015613229576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b60006132736040518060400160405280601481526020017f73746166694e6574776f726b53657474696e67730000000000000000000000008152506122e3565b905090565b6002613284838361129c565b146132c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132bb906144eb565b60405180910390fd5b60006132ce611123565b73ffffffffffffffffffffffffffffffffffffffff1663606aa8ca336040516020016132fa9190614170565b6040516020818303038152906040528051906020012085856040518463ffffffff1660e01b8152600401613330939291906142c3565b60206040518083038186803b15801561334857600080fd5b505afa15801561335c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133809190613af6565b12156133c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133b89061448b565b60405180910390fd5b6133cd82826003612436565b5050565b60006134116040518060400160405280600a81526020017f6574684465706f736974000000000000000000000000000000000000000000008152506122e3565b905090565b600073ffffffffffffffffffffffffffffffffffffffff1661345f8383604051602001613444929190614126565b60405160208183030381529060405280519060200120612177565b73ffffffffffffffffffffffffffffffffffffffff16146134b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134ac906144cb565b60405180910390fd5b60006134e883836040516020016134cd929190614098565b604051602081830303815290604052805190602001206124a8565b14613528576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161351f906143eb565b60405180910390fd5b6000613534838361129c565b14613574576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161356b906144eb565b60405180910390fd5b61358082826001612436565b613588611123565b73ffffffffffffffffffffffffffffffffffffffff16637ef16264336040516020016135b49190614170565b6040516020818303038152906040528051906020012084846040518463ffffffff1660e01b81526004016135ea939291906142c3565b600060405180830381600087803b15801561360457600080fd5b505af1158015613618573d6000803e3d6000fd5b505050505050565b600061363361362e846145f2565b6145c1565b90508281526020810184848401111561364b57600080fd5b613656848285614749565b509392505050565b60008135905061366d81614803565b92915050565b60008083601f84011261368557600080fd5b8235905067ffffffffffffffff81111561369e57600080fd5b6020830191508360208202830111156136b657600080fd5b9250929050565b60008083601f8401126136cf57600080fd5b8235905067ffffffffffffffff8111156136e857600080fd5b60208301915083602082028301111561370057600080fd5b9250929050565b60008083601f84011261371957600080fd5b8235905067ffffffffffffffff81111561373257600080fd5b60208301915083602082028301111561374a57600080fd5b9250929050565b6000813590506137608161481a565b92915050565b60008083601f84011261377857600080fd5b8235905067ffffffffffffffff81111561379157600080fd5b6020830191508360018202830111156137a957600080fd5b9250929050565b600082601f8301126137c157600080fd5b81516137d1848260208601613620565b91505092915050565b6000815190506137e981614831565b92915050565b6000813590506137fe81614848565b92915050565b60008151905061381381614848565b92915050565b60006020828403121561382b57600080fd5b60006138398482850161365e565b91505092915050565b6000806040838503121561385557600080fd5b60006138638582860161365e565b9250506020613874858286016137ef565b9150509250929050565b6000806000806040858703121561389457600080fd5b600085013567ffffffffffffffff8111156138ae57600080fd5b6138ba87828801613707565b9450945050602085013567ffffffffffffffff8111156138d957600080fd5b6138e587828801613673565b925092505092959194509250565b6000806000806000806060878903121561390c57600080fd5b600087013567ffffffffffffffff81111561392657600080fd5b61393289828a01613707565b9650965050602087013567ffffffffffffffff81111561395157600080fd5b61395d89828a01613707565b9450945050604087013567ffffffffffffffff81111561397c57600080fd5b61398889828a016136bd565b92509250509295509295509295565b6000602082840312156139a957600080fd5b60006139b784828501613751565b91505092915050565b600080602083850312156139d357600080fd5b600083013567ffffffffffffffff8111156139ed57600080fd5b6139f985828601613766565b92509250509250929050565b600080600060408486031215613a1a57600080fd5b600084013567ffffffffffffffff811115613a3457600080fd5b613a4086828701613766565b93509350506020613a538682870161365e565b9150509250925092565b600080600060408486031215613a7257600080fd5b600084013567ffffffffffffffff811115613a8c57600080fd5b613a9886828701613766565b93509350506020613aab868287016137ef565b9150509250925092565b600060208284031215613ac757600080fd5b600082015167ffffffffffffffff811115613ae157600080fd5b613aed848285016137b0565b91505092915050565b600060208284031215613b0857600080fd5b6000613b16848285016137da565b91505092915050565b600060208284031215613b3157600080fd5b6000613b3f84828501613804565b91505092915050565b613b51816146e0565b82525050565b613b68613b6382614677565b61478e565b82525050565b613b7f613b7a82614665565b61477c565b82525050565b613b8e81614689565b82525050565b613ba5613ba082614689565b6147a0565b82525050565b613bb481614695565b82525050565b6000613bc6838561462d565b9350613bd383858461473a565b613bdc836147d8565b840190509392505050565b6000613bf3838561463e565b9350613c0083858461473a565b82840190509392505050565b6000613c1782614622565b613c21818561462d565b9350613c31818560208601614749565b613c3a816147d8565b840191505092915050565b613c4e816146f2565b82525050565b6000613c6160178361465a565b91507f73757065724e6f64652e7075626b65792e7374617475730000000000000000006000830152601782019050919050565b6000613ca1601883614649565b91507f7375706572204e6f6465207075626b65792065786973747300000000000000006000830152602082019050919050565b6000613ce1602a83614649565b91507f6c69676874206e6f6465206465706f73697473206172652063757272656e746c60008301527f792064697361626c6564000000000000000000000000000000000000000000006020830152604082019050919050565b6000613d47601383614649565b91507f6d73672076616c7565206e6f74206d61746368000000000000000000000000006000830152602082019050919050565b6000613d8760168361465a565b91507f6c696768744e6f64652e6d656d626572566f7465732e000000000000000000006000830152601682019050919050565b6000613dc760158361465a565b91507f76616c696461746f722e7374616b696e67706f6f6c00000000000000000000006000830152601582019050919050565b6000613e0760178361465a565b91507f6c696768744e6f64652e7075626b6579732e696e6465780000000000000000006000830152601782019050919050565b6000613e4760148361465a565b91507f6c696768744e6f64652e746f74616c566f7465730000000000000000000000006000830152601482019050919050565b6000613e87602f83614649565b91507f4d656d6265722068617320616c726561647920766f74656420746f207769746860008301527f6472617743726564656e7469616c7300000000000000000000000000000000006020830152604082019050919050565b6000613eed601083614649565b91507f7472616e7366657272206661696c6564000000000000000000000000000000006000830152602082019050919050565b6000613f2d60178361465a565b91507f6c696768744e6f64652e7075626b65792e7374617475730000000000000000006000830152601782019050919050565b6000613f6d601083614649565b91507f6e6f74207075626b6579206f776e6572000000000000000000000000000000006000830152602082019050919050565b6000613fad60008361463e565b9150600082019050919050565b6000613fc7600e83614649565b91507f706172616d73206c656e206572720000000000000000000000000000000000006000830152602082019050919050565b6000614007601983614649565b91507f7374616b696e67706f6f6c207075626b657920657869737473000000000000006000830152602082019050919050565b6000614047601583614649565b91507f7075626b65792073746174757320756e6d6174636800000000000000000000006000830152602082019050919050565b614083816146c9565b82525050565b614092816146d3565b82525050565b60006140a382613c54565b91506140b0828486613be7565b91508190509392505050565b60006140c782613d7a565b91506140d4828587613be7565b91506140e08284613b6e565b601482019150819050949350505050565b60006140fc82613d7a565b9150614109828587613be7565b91506141158284613b57565b601482019150819050949350505050565b600061413182613dba565b915061413e828486613be7565b91508190509392505050565b600061415582613dfa565b91506141618284613b6e565b60148201915081905092915050565b600061417b82613dfa565b91506141878284613b57565b60148201915081905092915050565b60006141a182613e3a565b91506141ae828587613be7565b91506141ba8284613b94565b600182019150819050949350505050565b60006141d682613f20565b91506141e3828486613be7565b91508190509392505050565b60006141fa82613fa0565b9150819050919050565b60006040820190506142196000830186613b48565b818103602083015261422c818486613bba565b9050949350505050565b600060808201905061424b6000830189613b48565b818103602083015261425e818789613bba565b90508181036040830152614273818587613bba565b9050614282606083018461407a565b979650505050505050565b60006020820190506142a26000830184613b85565b92915050565b60006020820190506142bd6000830184613bab565b92915050565b60006040820190506142d86000830186613bab565b81810360208301526142eb818486613bba565b9050949350505050565b600060408201905061430a6000830185613bab565b614317602083018461407a565b9392505050565b6000608082019050818103600083015261433981888a613bba565b9050818103602083015261434d8187613c0c565b90508181036040830152614362818587613bba565b90506143716060830184613bab565b979650505050505050565b60006040820190508181036000830152614397818587613bba565b90506143a6602083018461407a565b949350505050565b600060208201905081810360008301526143c88184613c0c565b905092915050565b60006020820190506143e56000830184613c45565b92915050565b6000602082019050818103600083015261440481613c94565b9050919050565b6000602082019050818103600083015261442481613cd4565b9050919050565b6000602082019050818103600083015261444481613d3a565b9050919050565b6000602082019050818103600083015261446481613e7a565b9050919050565b6000602082019050818103600083015261448481613ee0565b9050919050565b600060208201905081810360008301526144a481613f60565b9050919050565b600060208201905081810360008301526144c481613fba565b9050919050565b600060208201905081810360008301526144e481613ffa565b9050919050565b600060208201905081810360008301526145048161403a565b9050919050565b6000602082019050614520600083018461407a565b92915050565b600060408201905061453b600083018561407a565b614548602083018461407a565b9392505050565b60006020820190506145646000830184614089565b92915050565b6000808335600160200384360303811261458357600080fd5b80840192508235915067ffffffffffffffff8211156145a157600080fd5b6020830192506001820236038313156145b957600080fd5b509250929050565b6000604051905081810181811067ffffffffffffffff821117156145e8576145e76147d6565b5b8060405250919050565b600067ffffffffffffffff82111561460d5761460c6147d6565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614670826146a9565b9050919050565b6000614682826146a9565b9050919050565b60008115159050919050565b6000819050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006146eb82614716565b9050919050565b60006146fd82614704565b9050919050565b600061470f826146a9565b9050919050565b600061472182614728565b9050919050565b6000614733826146a9565b9050919050565b82818337600083830152505050565b60005b8381101561476757808201518184015260208101905061474c565b83811115614776576000848401525b50505050565b6000614787826147b2565b9050919050565b6000614799826147b2565b9050919050565b60006147ab826147c4565b9050919050565b60006147bd826147f6565b9050919050565b60006147cf826147e9565b9050919050565bfe5b6000601f19601f8301169050919050565b60008160f81b9050919050565b60008160601b9050919050565b61480c81614665565b811461481757600080fd5b50565b61482381614689565b811461482e57600080fd5b50565b61483a8161469f565b811461484557600080fd5b50565b614851816146c9565b811461485c57600080fd5b5056fe536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7773657474696e67732e6c696768744e6f64652e6465706f7369742e656e61626c6564a26469706673582212209cb38c21ef04ab54d46868a3f1e309783e708907fd12050b15ff8375a37ab1d664736f6c634300070600330000000000000000000000006c2f7b6110a37b3b0fbdd811876be368df02e8b0
Deployed Bytecode
0x6080604052600436106101815760003560e01c806390d76417116100d1578063adf1d8d61161008a578063ca2b87af11610064578063ca2b87af14610522578063ccdf1d791461054b578063d46221f914610588578063eee1fa44146105a457610181565b8063adf1d8d614610491578063ae3e885a146104ba578063ba7fe814146104e557610181565b806390d76417146103815780639532e08a146103ac5780639630f63c146103d7578063a32cb34114610400578063a37212cb1461042b578063a4b4334b1461046857610181565b806340ce18a01161013e57806364f14dba1161011857806364f14dba146102d757806368d25fe81461030257806383f3f0861461032d57806384d9eb7c1461035857610181565b806340ce18a014610277578063439370b1146102a257806354fd4d50146102ac57610181565b806309ba5933146101865780630a019eaf146101b157806318582e28146101bb5780631e8bc826146101f85780633c4bc635146102235780633f25522d1461024c575b600080fd5b34801561019257600080fd5b5061019b6105c0565b6040516101a8919061450b565b60405180910390f35b6101b96105c5565b005b3480156101c757600080fd5b506101e260048036038101906101dd9190613a05565b6108bd565b6040516101ef919061428d565b60405180910390f35b34801561020457600080fd5b5061020d6108fb565b60405161021a919061450b565b60405180910390f35b34801561022f57600080fd5b5061024a600480360381019061024591906139c0565b610900565b005b34801561025857600080fd5b50610261610d3d565b60405161026e919061450b565b60405180910390f35b34801561028357600080fd5b5061028c610d42565b604051610299919061450b565b60405180910390f35b6102aa610d47565b005b3480156102b857600080fd5b506102c1610f14565b6040516102ce919061454f565b60405180910390f35b3480156102e357600080fd5b506102ec610f25565b6040516102f9919061450b565b60405180910390f35b34801561030e57600080fd5b50610317610f2a565b604051610324919061450b565b60405180910390f35b34801561033957600080fd5b50610342610f2f565b60405161034f919061450b565b60405180910390f35b34801561036457600080fd5b5061037f600480360381019061037a91906139c0565b610f5f565b005b34801561038d57600080fd5b50610396611123565b6040516103a391906143d0565b60405180910390f35b3480156103b857600080fd5b506103c1611168565b6040516103ce919061450b565b60405180910390f35b3480156103e357600080fd5b506103fe60048036038101906103f99190613a5d565b61116d565b005b34801561040c57600080fd5b50610415611274565b604051610422919061428d565b60405180910390f35b34801561043757600080fd5b50610452600480360381019061044d91906139c0565b61129c565b60405161045f919061450b565b60405180910390f35b34801561047457600080fd5b5061048f600480360381019061048a919061387e565b6112d7565b005b34801561049d57600080fd5b506104b860048036038101906104b39190613997565b6115e7565b005b3480156104c657600080fd5b506104cf611703565b6040516104dc919061450b565b60405180910390f35b3480156104f157600080fd5b5061050c60048036038101906105079190613842565b611708565b60405161051991906143ae565b60405180910390f35b34801561052e57600080fd5b50610549600480360381019061054491906138f3565b6117cf565b005b34801561055757600080fd5b50610572600480360381019061056d9190613819565b611b03565b60405161057f919061450b565b60405180910390f35b6105a2600480360381019061059d91906138f3565b611bc2565b005b6105be60048036038101906105b991906139c0565b611eb3565b005b600481565b6040518060400160405280600e81526020017f73746166694c696768744e6f64650000000000000000000000000000000000008152503061069e8260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b6020831061065e578051825260208201915060208101905060208303925061063b565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120612177565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461073e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b6040518060400160405280600a81526020017f7374616669457468657200000000000000000000000000000000000000000000815250336108178260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b602083106107d757805182526020820191506020810190506020830392506107b4565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120612177565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146108b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b50505050565b60006108f28484846040516020016108d7939291906140bc565b6040516020818303038152906040528051906020012061222d565b90509392505050565b600681565b6040518060400160405280600e81526020017f73746166694c696768744e6f6465000000000000000000000000000000000000815250306109d98260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b602083106109995780518252602082019150602081019050602083039250610976565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120612177565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a79576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b6006610a85858561129c565b14610ac5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610abc906144eb565b60405180910390fd5b6000610acf611123565b73ffffffffffffffffffffffffffffffffffffffff1663606aa8ca33604051602001610afb9190614170565b6040516020818303038152906040528051906020012087876040518463ffffffff1660e01b8152600401610b31939291906142c3565b60206040518083038186803b158015610b4957600080fd5b505afa158015610b5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b819190613af6565b1215610bc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb99061448b565b60405180910390fd5b6000610c026040518060400160405280600a81526020017f73746166694574686572000000000000000000000000000000000000000000008152506122e3565b90508073ffffffffffffffffffffffffffffffffffffffff16633bed33ce610c28610f2f565b6040518263ffffffff1660e01b8152600401610c44919061450b565b600060405180830381600087803b158015610c5e57600080fd5b505af1158015610c72573d6000803e3d6000fd5b50505050610c8285856007612436565b60003373ffffffffffffffffffffffffffffffffffffffff16610ca3610f2f565b604051610caf906141ef565b60006040518083038185875af1925050503d8060008114610cec576040519150601f19603f3d011682016040523d82523d6000602084013e610cf1565b606091505b5050905080610d35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2c9061446b565b60405180910390fd5b505050505050565b600081565b600381565b6040518060400160405280601081526020017f7374616669557365724465706f7369740000000000000000000000000000000081525033610e208260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b60208310610de05780518252602082019150602081019050602083039250610dbd565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120612177565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ec0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167fef51b4c870b8b0100eae2072e91db01222a303072af3728e58c9d4d2da33127f3442604051610f08929190614526565b60405180910390a25050565b60008054906101000a900460ff1681565b600281565b600781565b6000610f5a7f73657474696e67732e6e6f64652e6465706f7369742e616d6f756e74000000006124a8565b905090565b6040518060400160405280600e81526020017f73746166694c696768744e6f6465000000000000000000000000000000000000815250306110388260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b60208310610ff85780518252602082019150602081019050602083039250610fd5565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120612177565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146110d8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b6110e2848461255e565b7f9d5023d85497e8c264e3b053f8da9415f4db76eb5af3ecef3fe953fe9f98147033858560405161111593929190614204565b60405180910390a150505050565b60006111636040518060400160405280601081526020017f7075626b657953657453746f72616765000000000000000000000000000000008152506122e3565b905090565b600581565b6111ac6040518060400160405280600581526020017f6f776e6572000000000000000000000000000000000000000000000000000000815250336126b7565b806111f257506111f16040518060400160405280600581526020017f61646d696e000000000000000000000000000000000000000000000000000000815250336126b7565b5b611264576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4163636f756e74206973206e6f7420612073757065722075736572000000000081525060200191505060405180910390fd5b61126f838383612436565b505050565b600061129760405180606001604052806022815260200161488160229139612784565b905090565b60006112cf83836040516020016112b49291906141cb565b604051602081830303815290604052805190602001206124a8565b905092915050565b6040518060400160405280600e81526020017f73746166694c696768744e6f6465000000000000000000000000000000000000815250306113b08260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b60208310611370578051825260208201915060208101905060208303925061134d565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120612177565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611450576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b336114c18160405160200180807f6e6f64652e747275737465640000000000000000000000000000000000000000815250600c018273ffffffffffffffffffffffffffffffffffffffff1660601b81526014019150506040516020818303038152906040528051906020012061222d565b611533576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f496e76616c69642074727573746564206e6f646500000000000000000000000081525060200191505060405180910390fd5b84849050878790501461157b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611572906144ab565b60405180910390fd5b60005b878790508110156115dd576115d088888381811061159857fe5b90506020028101906115aa919061456a565b8888858181106115b657fe5b90506020020160208101906115cb9190613997565b6128ab565b808060010191505061157e565b5050505050505050565b6116266040518060400160405280600581526020017f6f776e6572000000000000000000000000000000000000000000000000000000815250336126b7565b8061166c575061166b6040518060400160405280600581526020017f61646d696e000000000000000000000000000000000000000000000000000000815250336126b7565b5b6116de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4163636f756e74206973206e6f7420612073757065722075736572000000000081525060200191505060405180910390fd5b6117006040518060600160405280602281526020016148816022913982612b88565b50565b600181565b6060611712611123565b73ffffffffffffffffffffffffffffffffffffffff1663f3358a3a8460405160200161173e919061414a565b60405160208183030381529060405280519060200120846040518363ffffffff1660e01b81526004016117729291906142f5565b60006040518083038186803b15801561178a57600080fd5b505afa15801561179e573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906117c79190613ab5565b905092915050565b6040518060400160405280600e81526020017f73746166694c696768744e6f6465000000000000000000000000000000000000815250306118a88260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b602083106118685780518252602082019150602081019050602083039250611845565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120612177565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611948576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b858590508888905014801561196257508383905088889050145b6119a1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611998906144ab565b60405180910390fd5b60006119e16040518060400160405280601081526020017f7374616669557365724465706f736974000000000000000000000000000000008152506122e3565b90508073ffffffffffffffffffffffffffffffffffffffff1663cc88c3c8611a37611a25611a0d610f2f565b6801bc16d674ec800000612c9490919063ffffffff16565b8c8c9050612d1790919063ffffffff16565b6040518263ffffffff1660e01b8152600401611a53919061450b565b600060405180830381600087803b158015611a6d57600080fd5b505af1158015611a81573d6000803e3d6000fd5b5050505060005b89899050811015611af757611aea8a8a83818110611aa257fe5b9050602002810190611ab4919061456a565b8a8a85818110611ac057fe5b9050602002810190611ad2919061456a565b8a8a87818110611ade57fe5b90506020020135612d9d565b8080600101915050611a88565b50505050505050505050565b6000611b0d611123565b73ffffffffffffffffffffffffffffffffffffffff1663c9d6fee983604051602001611b39919061414a565b604051602081830303815290604052805190602001206040518263ffffffff1660e01b8152600401611b6b91906142a8565b60206040518083038186803b158015611b8357600080fd5b505afa158015611b97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bbb9190613b1f565b9050919050565b6040518060400160405280600e81526020017f73746166694c696768744e6f646500000000000000000000000000000000000081525030611c9b8260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b60208310611c5b5780518252602082019150602081019050602083039250611c38565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120612177565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611d3b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b611d43611274565b611d82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d799061440b565b60405180910390fd5b60008888905090508686905081148015611d9e57508484905081145b611ddd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd4906144ab565b60405180910390fd5b611df7611de8610f2f565b82612d1790919063ffffffff16565b3414611e38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2f9061442b565b60405180910390fd5b60005b81811015611ea757611e9a8a8a83818110611e5257fe5b9050602002810190611e64919061456a565b8a8a85818110611e7057fe5b9050602002810190611e82919061456a565b8a8a87818110611e8e57fe5b90506020020135612f11565b8080600101915050611e3b565b50505050505050505050565b6040518060400160405280600e81526020017f73746166694c696768744e6f646500000000000000000000000000000000000081525030611f8c8260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b60208310611f4c5780518252602082019150602081019050602083039250611f29565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120612177565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461202c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b612034610f2f565b3414612075576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206c9061442b565b60405180910390fd5b6005612081858561129c565b146120c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b8906144eb565b60405180910390fd5b60006121016040518060400160405280600a81526020017f73746166694574686572000000000000000000000000000000000000000000008152506122e3565b90508073ffffffffffffffffffffffffffffffffffffffff166398ea5fca346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561214b57600080fd5b505af115801561215f573d6000803e3d6000fd5b505050505061217085856006612436565b5050505050565b60008060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166321f8a721836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156121eb57600080fd5b505afa1580156121ff573d6000803e3d6000fd5b505050506040513d602081101561221557600080fd5b81019080805190602001909291905050509050919050565b60008060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637ae1cfca836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156122a157600080fd5b505afa1580156122b5573d6000803e3d6000fd5b505050506040513d60208110156122cb57600080fd5b81019080805190602001909291905050509050919050565b6000806123888360405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b602083106123485780518252602082019150602081019050602083039250612325565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120612177565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561242d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f436f6e7472616374206e6f7420666f756e64000000000000000000000000000081525060200191505060405180910390fd5b80915050919050565b612468838360405160200161244c9291906141cb565b6040516020818303038152906040528051906020012082613077565b7fc581330a67ddadcf62d06e14db41c85bb45910369cedad649390e6dd2a9373c883838360405161249b9392919061437c565b60405180910390a1505050565b60008060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bd02d0f5836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561251c57600080fd5b505afa158015612530573d6000803e3d6000fd5b505050506040513d602081101561254657600080fd5b81019080805190602001909291905050509050919050565b600261256a838361129c565b146125aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125a1906144eb565b60405180910390fd5b60006125b4611123565b73ffffffffffffffffffffffffffffffffffffffff1663606aa8ca336040516020016125e09190614170565b6040516020818303038152906040528051906020012085856040518463ffffffff1660e01b8152600401612616939291906142c3565b60206040518083038186803b15801561262e57600080fd5b505afa158015612642573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126669190613af6565b12156126a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269e9061448b565b60405180910390fd5b6126b382826005612436565b5050565b600061277c838360405160200180807f6163636573732e726f6c65000000000000000000000000000000000000000000815250600b0183805190602001908083835b6020831061271c57805182526020820191506020810190506020830392506126f9565b6001836020036101000a0380198251168184511680821785525050505050509050018273ffffffffffffffffffffffffffffffffffffffff1660601b8152601401925050506040516020818303038152906040528051906020012061222d565b905092915050565b60008060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637ae1cfca836040516020018082805190602001908083835b602083106127fa57805182526020820191506020810190506020830392506127d7565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052805190602001206040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561286957600080fd5b505afa15801561287d573d6000803e3d6000fd5b505050506040513d602081101561289357600080fd5b81019080805190602001909291905050509050919050565b6128de8383336040516020016128c3939291906140f1565b6040516020818303038152906040528051906020012061222d565b1561291e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129159061444b565b60405180910390fd5b612953838333604051602001612936939291906140f1565b604051602081830303815290604052805190602001206001613110565b600061298884848460405160200161296d93929190614196565b604051602081830303815290604052805190602001206124a8565b905061299e6001826131ab90919063ffffffff16565b90506129d48484846040516020016129b893929190614196565b6040516020818303038152906040528051906020012082613077565b6000670de0b6b3a764000090506000612a216040518060400160405280601081526020017f73746166694e6f64654d616e61676572000000000000000000000000000000008152506122e3565b90506001612a2f878761129c565b148015612b615750612b4b612a42613233565b73ffffffffffffffffffffffffffffffffffffffff16631f66e8ed6040518163ffffffff1660e01b815260040160206040518083038186803b158015612a8757600080fd5b505afa158015612a9b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612abf9190613b1f565b8273ffffffffffffffffffffffffffffffffffffffff166366e3c0266040518163ffffffff1660e01b815260040160206040518083038186803b158015612b0557600080fd5b505afa158015612b19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b3d9190613b1f565b612d1790919063ffffffff16565b612b5e8484612d1790919063ffffffff16565b10155b15612b8057612b7f868686612b77576004612b7a565b60025b612436565b5b505050505050565b600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663abfdcced836040516020018082805190602001908083835b60208310612bfd5780518252602082019150602081019050602083039250612bda565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040518363ffffffff1660e01b815260040180838152602001821515815260200192505050600060405180830381600087803b158015612c7857600080fd5b505af1158015612c8c573d6000803e3d6000fd5b505050505050565b600082821115612d0c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525060200191505060405180910390fd5b818303905092915050565b600080831415612d2a5760009050612d97565b6000828402905082848281612d3b57fe5b0414612d92576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806148606021913960400191505060405180910390fd5b809150505b92915050565b612da78585613278565b612daf6133d1565b73ffffffffffffffffffffffffffffffffffffffff166322895118612ded612dd5610f2f565b6801bc16d674ec800000612c9490919063ffffffff16565b8787612df7613233565b73ffffffffffffffffffffffffffffffffffffffff1663563967156040518163ffffffff1660e01b815260040160006040518083038186803b158015612e3c57600080fd5b505afa158015612e50573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190612e799190613ab5565b8888886040518863ffffffff1660e01b8152600401612e9d9695949392919061431e565b6000604051808303818588803b158015612eb657600080fd5b505af1158015612eca573d6000803e3d6000fd5b50505050507fb384b282308c431ac3ea7756646550752d3f0dbfb418ef60bfeaf4edc9494815338686604051612f0293929190614204565b60405180910390a15050505050565b612f1b8585613416565b612f236133d1565b73ffffffffffffffffffffffffffffffffffffffff166322895118612f46610f2f565b8787612f50613233565b73ffffffffffffffffffffffffffffffffffffffff1663563967156040518163ffffffff1660e01b815260040160006040518083038186803b158015612f9557600080fd5b505afa158015612fa9573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190612fd29190613ab5565b8888886040518863ffffffff1660e01b8152600401612ff69695949392919061431e565b6000604051808303818588803b15801561300f57600080fd5b505af1158015613023573d6000803e3d6000fd5b50505050507f1fc33daf7f37b2e02f49dbee7b9707bddd7c8cef1f08deff23bff3d105e5aa723386868686613056610f2f565b60405161306896959493929190614236565b60405180910390a15050505050565b600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e2a4853a83836040518363ffffffff1660e01b81526004018083815260200182815260200192505050600060405180830381600087803b1580156130f457600080fd5b505af1158015613108573d6000803e3d6000fd5b505050505050565b600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663abfdcced83836040518363ffffffff1660e01b815260040180838152602001821515815260200192505050600060405180830381600087803b15801561318f57600080fd5b505af11580156131a3573d6000803e3d6000fd5b505050505050565b600080828401905083811015613229576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b60006132736040518060400160405280601481526020017f73746166694e6574776f726b53657474696e67730000000000000000000000008152506122e3565b905090565b6002613284838361129c565b146132c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132bb906144eb565b60405180910390fd5b60006132ce611123565b73ffffffffffffffffffffffffffffffffffffffff1663606aa8ca336040516020016132fa9190614170565b6040516020818303038152906040528051906020012085856040518463ffffffff1660e01b8152600401613330939291906142c3565b60206040518083038186803b15801561334857600080fd5b505afa15801561335c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133809190613af6565b12156133c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133b89061448b565b60405180910390fd5b6133cd82826003612436565b5050565b60006134116040518060400160405280600a81526020017f6574684465706f736974000000000000000000000000000000000000000000008152506122e3565b905090565b600073ffffffffffffffffffffffffffffffffffffffff1661345f8383604051602001613444929190614126565b60405160208183030381529060405280519060200120612177565b73ffffffffffffffffffffffffffffffffffffffff16146134b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134ac906144cb565b60405180910390fd5b60006134e883836040516020016134cd929190614098565b604051602081830303815290604052805190602001206124a8565b14613528576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161351f906143eb565b60405180910390fd5b6000613534838361129c565b14613574576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161356b906144eb565b60405180910390fd5b61358082826001612436565b613588611123565b73ffffffffffffffffffffffffffffffffffffffff16637ef16264336040516020016135b49190614170565b6040516020818303038152906040528051906020012084846040518463ffffffff1660e01b81526004016135ea939291906142c3565b600060405180830381600087803b15801561360457600080fd5b505af1158015613618573d6000803e3d6000fd5b505050505050565b600061363361362e846145f2565b6145c1565b90508281526020810184848401111561364b57600080fd5b613656848285614749565b509392505050565b60008135905061366d81614803565b92915050565b60008083601f84011261368557600080fd5b8235905067ffffffffffffffff81111561369e57600080fd5b6020830191508360208202830111156136b657600080fd5b9250929050565b60008083601f8401126136cf57600080fd5b8235905067ffffffffffffffff8111156136e857600080fd5b60208301915083602082028301111561370057600080fd5b9250929050565b60008083601f84011261371957600080fd5b8235905067ffffffffffffffff81111561373257600080fd5b60208301915083602082028301111561374a57600080fd5b9250929050565b6000813590506137608161481a565b92915050565b60008083601f84011261377857600080fd5b8235905067ffffffffffffffff81111561379157600080fd5b6020830191508360018202830111156137a957600080fd5b9250929050565b600082601f8301126137c157600080fd5b81516137d1848260208601613620565b91505092915050565b6000815190506137e981614831565b92915050565b6000813590506137fe81614848565b92915050565b60008151905061381381614848565b92915050565b60006020828403121561382b57600080fd5b60006138398482850161365e565b91505092915050565b6000806040838503121561385557600080fd5b60006138638582860161365e565b9250506020613874858286016137ef565b9150509250929050565b6000806000806040858703121561389457600080fd5b600085013567ffffffffffffffff8111156138ae57600080fd5b6138ba87828801613707565b9450945050602085013567ffffffffffffffff8111156138d957600080fd5b6138e587828801613673565b925092505092959194509250565b6000806000806000806060878903121561390c57600080fd5b600087013567ffffffffffffffff81111561392657600080fd5b61393289828a01613707565b9650965050602087013567ffffffffffffffff81111561395157600080fd5b61395d89828a01613707565b9450945050604087013567ffffffffffffffff81111561397c57600080fd5b61398889828a016136bd565b92509250509295509295509295565b6000602082840312156139a957600080fd5b60006139b784828501613751565b91505092915050565b600080602083850312156139d357600080fd5b600083013567ffffffffffffffff8111156139ed57600080fd5b6139f985828601613766565b92509250509250929050565b600080600060408486031215613a1a57600080fd5b600084013567ffffffffffffffff811115613a3457600080fd5b613a4086828701613766565b93509350506020613a538682870161365e565b9150509250925092565b600080600060408486031215613a7257600080fd5b600084013567ffffffffffffffff811115613a8c57600080fd5b613a9886828701613766565b93509350506020613aab868287016137ef565b9150509250925092565b600060208284031215613ac757600080fd5b600082015167ffffffffffffffff811115613ae157600080fd5b613aed848285016137b0565b91505092915050565b600060208284031215613b0857600080fd5b6000613b16848285016137da565b91505092915050565b600060208284031215613b3157600080fd5b6000613b3f84828501613804565b91505092915050565b613b51816146e0565b82525050565b613b68613b6382614677565b61478e565b82525050565b613b7f613b7a82614665565b61477c565b82525050565b613b8e81614689565b82525050565b613ba5613ba082614689565b6147a0565b82525050565b613bb481614695565b82525050565b6000613bc6838561462d565b9350613bd383858461473a565b613bdc836147d8565b840190509392505050565b6000613bf3838561463e565b9350613c0083858461473a565b82840190509392505050565b6000613c1782614622565b613c21818561462d565b9350613c31818560208601614749565b613c3a816147d8565b840191505092915050565b613c4e816146f2565b82525050565b6000613c6160178361465a565b91507f73757065724e6f64652e7075626b65792e7374617475730000000000000000006000830152601782019050919050565b6000613ca1601883614649565b91507f7375706572204e6f6465207075626b65792065786973747300000000000000006000830152602082019050919050565b6000613ce1602a83614649565b91507f6c69676874206e6f6465206465706f73697473206172652063757272656e746c60008301527f792064697361626c6564000000000000000000000000000000000000000000006020830152604082019050919050565b6000613d47601383614649565b91507f6d73672076616c7565206e6f74206d61746368000000000000000000000000006000830152602082019050919050565b6000613d8760168361465a565b91507f6c696768744e6f64652e6d656d626572566f7465732e000000000000000000006000830152601682019050919050565b6000613dc760158361465a565b91507f76616c696461746f722e7374616b696e67706f6f6c00000000000000000000006000830152601582019050919050565b6000613e0760178361465a565b91507f6c696768744e6f64652e7075626b6579732e696e6465780000000000000000006000830152601782019050919050565b6000613e4760148361465a565b91507f6c696768744e6f64652e746f74616c566f7465730000000000000000000000006000830152601482019050919050565b6000613e87602f83614649565b91507f4d656d6265722068617320616c726561647920766f74656420746f207769746860008301527f6472617743726564656e7469616c7300000000000000000000000000000000006020830152604082019050919050565b6000613eed601083614649565b91507f7472616e7366657272206661696c6564000000000000000000000000000000006000830152602082019050919050565b6000613f2d60178361465a565b91507f6c696768744e6f64652e7075626b65792e7374617475730000000000000000006000830152601782019050919050565b6000613f6d601083614649565b91507f6e6f74207075626b6579206f776e6572000000000000000000000000000000006000830152602082019050919050565b6000613fad60008361463e565b9150600082019050919050565b6000613fc7600e83614649565b91507f706172616d73206c656e206572720000000000000000000000000000000000006000830152602082019050919050565b6000614007601983614649565b91507f7374616b696e67706f6f6c207075626b657920657869737473000000000000006000830152602082019050919050565b6000614047601583614649565b91507f7075626b65792073746174757320756e6d6174636800000000000000000000006000830152602082019050919050565b614083816146c9565b82525050565b614092816146d3565b82525050565b60006140a382613c54565b91506140b0828486613be7565b91508190509392505050565b60006140c782613d7a565b91506140d4828587613be7565b91506140e08284613b6e565b601482019150819050949350505050565b60006140fc82613d7a565b9150614109828587613be7565b91506141158284613b57565b601482019150819050949350505050565b600061413182613dba565b915061413e828486613be7565b91508190509392505050565b600061415582613dfa565b91506141618284613b6e565b60148201915081905092915050565b600061417b82613dfa565b91506141878284613b57565b60148201915081905092915050565b60006141a182613e3a565b91506141ae828587613be7565b91506141ba8284613b94565b600182019150819050949350505050565b60006141d682613f20565b91506141e3828486613be7565b91508190509392505050565b60006141fa82613fa0565b9150819050919050565b60006040820190506142196000830186613b48565b818103602083015261422c818486613bba565b9050949350505050565b600060808201905061424b6000830189613b48565b818103602083015261425e818789613bba565b90508181036040830152614273818587613bba565b9050614282606083018461407a565b979650505050505050565b60006020820190506142a26000830184613b85565b92915050565b60006020820190506142bd6000830184613bab565b92915050565b60006040820190506142d86000830186613bab565b81810360208301526142eb818486613bba565b9050949350505050565b600060408201905061430a6000830185613bab565b614317602083018461407a565b9392505050565b6000608082019050818103600083015261433981888a613bba565b9050818103602083015261434d8187613c0c565b90508181036040830152614362818587613bba565b90506143716060830184613bab565b979650505050505050565b60006040820190508181036000830152614397818587613bba565b90506143a6602083018461407a565b949350505050565b600060208201905081810360008301526143c88184613c0c565b905092915050565b60006020820190506143e56000830184613c45565b92915050565b6000602082019050818103600083015261440481613c94565b9050919050565b6000602082019050818103600083015261442481613cd4565b9050919050565b6000602082019050818103600083015261444481613d3a565b9050919050565b6000602082019050818103600083015261446481613e7a565b9050919050565b6000602082019050818103600083015261448481613ee0565b9050919050565b600060208201905081810360008301526144a481613f60565b9050919050565b600060208201905081810360008301526144c481613fba565b9050919050565b600060208201905081810360008301526144e481613ffa565b9050919050565b600060208201905081810360008301526145048161403a565b9050919050565b6000602082019050614520600083018461407a565b92915050565b600060408201905061453b600083018561407a565b614548602083018461407a565b9392505050565b60006020820190506145646000830184614089565b92915050565b6000808335600160200384360303811261458357600080fd5b80840192508235915067ffffffffffffffff8211156145a157600080fd5b6020830192506001820236038313156145b957600080fd5b509250929050565b6000604051905081810181811067ffffffffffffffff821117156145e8576145e76147d6565b5b8060405250919050565b600067ffffffffffffffff82111561460d5761460c6147d6565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614670826146a9565b9050919050565b6000614682826146a9565b9050919050565b60008115159050919050565b6000819050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006146eb82614716565b9050919050565b60006146fd82614704565b9050919050565b600061470f826146a9565b9050919050565b600061472182614728565b9050919050565b6000614733826146a9565b9050919050565b82818337600083830152505050565b60005b8381101561476757808201518184015260208101905061474c565b83811115614776576000848401525b50505050565b6000614787826147b2565b9050919050565b6000614799826147b2565b9050919050565b60006147ab826147c4565b9050919050565b60006147bd826147f6565b9050919050565b60006147cf826147e9565b9050919050565bfe5b6000601f19601f8301169050919050565b60008160f81b9050919050565b60008160601b9050919050565b61480c81614665565b811461481757600080fd5b50565b61482381614689565b811461482e57600080fd5b50565b61483a8161469f565b811461484557600080fd5b50565b614851816146c9565b811461485c57600080fd5b5056fe536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7773657474696e67732e6c696768744e6f64652e6465706f7369742e656e61626c6564a26469706673582212209cb38c21ef04ab54d46868a3f1e309783e708907fd12050b15ff8375a37ab1d664736f6c63430007060033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000006c2f7b6110a37b3b0fbdd811876be368df02e8b0
-----Decoded View---------------
Arg [0] : _stafiStorageAddress (address): 0x6c2f7b6110a37b3B0fbdd811876be368df02E8B0
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000006c2f7b6110a37b3b0fbdd811876be368df02e8b0
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
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.