More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 53 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Deposit | 19189380 | 308 days ago | IN | 0.012107 ETH | 0.00130716 | ||||
Deposit | 18625456 | 387 days ago | IN | 5.6 ETH | 0.00081215 | ||||
Deposit | 18625435 | 387 days ago | IN | 5.5 ETH | 0.00092448 | ||||
Deposit | 18392893 | 420 days ago | IN | 1.9 ETH | 0.00070393 | ||||
Deposit | 18196050 | 447 days ago | IN | 1 ETH | 0.00020062 | ||||
Deposit | 18193003 | 448 days ago | IN | 1 ETH | 0.00024628 | ||||
Deposit | 17903346 | 488 days ago | IN | 0.5 ETH | 0.00052897 | ||||
Deposit | 17903339 | 488 days ago | IN | 0.5 ETH | 0.00033213 | ||||
Deposit | 17744633 | 511 days ago | IN | 32 ETH | 0.00069564 | ||||
Deposit | 17656705 | 523 days ago | IN | 1.1 ETH | 0.00054375 | ||||
Deposit | 17656691 | 523 days ago | IN | 1.1 ETH | 0.00071047 | ||||
Deposit | 17539893 | 539 days ago | IN | 0.671209 ETH | 0.00041317 | ||||
Deposit | 17484761 | 547 days ago | IN | 0.1 ETH | 0.00049362 | ||||
Deposit | 17362061 | 564 days ago | IN | 1.5 ETH | 0.00095912 | ||||
Deposit | 17036191 | 610 days ago | IN | 10 ETH | 0.00082274 | ||||
Deposit | 17029077 | 612 days ago | IN | 22 ETH | 0.00319717 | ||||
Deposit | 16995342 | 616 days ago | IN | 13 ETH | 0.00364077 | ||||
Deposit | 16989443 | 617 days ago | IN | 0.8 ETH | 0.00364242 | ||||
Deposit | 16988334 | 617 days ago | IN | 0.02 ETH | 0.00466061 | ||||
Deposit | 16973055 | 619 days ago | IN | 35 ETH | 0.00280405 | ||||
Deposit | 16920936 | 627 days ago | IN | 0.05 ETH | 0.0049534 | ||||
Deposit | 16823881 | 640 days ago | IN | 19.9788 ETH | 0.00286018 | ||||
Deposit | 16773377 | 648 days ago | IN | 1.27 ETH | 0.00438948 | ||||
Deposit | 16761710 | 649 days ago | IN | 8.495685 ETH | 0.00269082 | ||||
Deposit | 16761668 | 649 days ago | IN | 1.182631 ETH | 0.00333026 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
17030705 | 611 days ago | 93 ETH | ||||
17030705 | 611 days ago | 93 ETH | ||||
17030678 | 611 days ago | 3 ETH | ||||
17030678 | 611 days ago | 3 ETH | ||||
17029077 | 612 days ago | 22 ETH | ||||
17024852 | 612 days ago | 0.41828017 ETH | ||||
17024852 | 612 days ago | 0.41828017 ETH | ||||
17006671 | 615 days ago | 0.41183895 ETH | ||||
17006671 | 615 days ago | 0.41183895 ETH | ||||
17000784 | 616 days ago | 0.42156343 ETH | ||||
17000784 | 616 days ago | 0.42156343 ETH | ||||
16995342 | 616 days ago | 13 ETH | ||||
16989443 | 617 days ago | 0.8 ETH | ||||
16988334 | 617 days ago | 0.02 ETH | ||||
16984686 | 618 days ago | 0.41469219 ETH | ||||
16984686 | 618 days ago | 0.41469219 ETH | ||||
16973055 | 619 days ago | 35 ETH | ||||
16955995 | 622 days ago | 0.41408884 ETH | ||||
16955995 | 622 days ago | 0.41408884 ETH | ||||
16920936 | 627 days ago | 0.05 ETH | ||||
16920099 | 627 days ago | 0.45991326 ETH | ||||
16920099 | 627 days ago | 0.45991326 ETH | ||||
16905335 | 629 days ago | 0.40692261 ETH | ||||
16905335 | 629 days ago | 0.40692261 ETH | ||||
16880921 | 632 days ago | 0.53542774 ETH |
Loading...
Loading
Contract Name:
StafiUserDeposit
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; // SPDX-License-Identifier: GPL-3.0-only import "@openzeppelin/contracts/math/SafeMath.sol"; import "../StafiBase.sol"; import "../interfaces/IStafiEther.sol"; import "../interfaces/IStafiEtherWithdrawer.sol"; import "../interfaces/deposit/IStafiUserDeposit.sol"; import "../interfaces/pool/IStafiStakingPool.sol"; import "../interfaces/pool/IStafiStakingPoolQueue.sol"; import "../interfaces/token/IRETHToken.sol"; import "../interfaces/node/IStafiSuperNode.sol"; import "../interfaces/node/IStafiLightNode.sol"; // Accepts user deposits and mints rETH; handles assignment of deposited ETH to pools contract StafiUserDeposit is StafiBase, IStafiUserDeposit, IStafiEtherWithdrawer { // Libs using SafeMath for uint256; // Events event DepositReceived(address indexed from, uint256 amount, uint256 time); event DepositRecycled(address indexed from, uint256 amount, uint256 time); event DepositAssigned(address indexed stakingPool, uint256 amount, uint256 time); event ExcessWithdrawn(address indexed to, uint256 amount, uint256 time); // Construct constructor(address _stafiStorageAddress) StafiBase(_stafiStorageAddress) { version = 1; // Initialize settings on deployment if (!getBoolS("settings.user.deposit.init")) { // Apply settings setDepositEnabled(true); setAssignDepositsEnabled(true); setMinimumDeposit(0.01 ether); // setMaximumDepositPoolSize(100000 ether); setMaximumDepositAssignments(2); // Settings initialized setBoolS("settings.user.deposit.init", true); } } // Current deposit pool balance function getBalance() override public view returns (uint256) { IStafiEther stafiEther = IStafiEther(getContractAddress("stafiEther")); return stafiEther.balanceOf(address(this)); } // Excess deposit pool balance (in excess of stakingPool queue capacity) function getExcessBalance() override public view returns (uint256) { // Get stakingPool queue capacity IStafiStakingPoolQueue stafiStakingPoolQueue = IStafiStakingPoolQueue(getContractAddress("stafiStakingPoolQueue")); uint256 stakingPoolCapacity = stafiStakingPoolQueue.getEffectiveCapacity(); // Calculate and return uint256 balance = getBalance(); if (stakingPoolCapacity >= balance) { return 0; } else { return balance.sub(stakingPoolCapacity); } } // Receive a ether withdrawal // Only accepts calls from the StafiEther contract function receiveEtherWithdrawal() override external payable onlyLatestContract("stafiUserDeposit", address(this)) onlyLatestContract("stafiEther", msg.sender) {} // Accept a deposit from a user function deposit() override external payable onlyLatestContract("stafiUserDeposit", address(this)) { // Check deposit settings require(getDepositEnabled(), "Deposits into Stafi are currently disabled"); require(msg.value >= getMinimumDeposit(), "The deposited amount is less than the minimum deposit size"); // require(getBalance().add(msg.value) <= getMaximumDepositPoolSize(), "The deposit pool size after depositing exceeds the maximum size"); // Load contracts IRETHToken rETHToken = IRETHToken(getContractAddress("rETHToken")); // Mint rETH to user account rETHToken.userMint(msg.value, msg.sender); // Emit deposit received event emit DepositReceived(msg.sender, msg.value, block.timestamp); // Process deposit processDeposit(); } // Recycle a deposit from a dissolved stakingPool // Only accepts calls from registered stakingPools function recycleDissolvedDeposit() override external payable onlyLatestContract("stafiUserDeposit", address(this)) onlyRegisteredStakingPool(msg.sender) { // Emit deposit recycled event emit DepositRecycled(msg.sender, msg.value, block.timestamp); // Process deposit processDeposit(); } // Recycle a deposit from a withdrawn stakingPool function recycleWithdrawnDeposit() override external payable onlyLatestContract("stafiUserDeposit", address(this)) onlyLatestContract("stafiNetworkWithdrawal", msg.sender) { // Emit deposit recycled event emit DepositRecycled(msg.sender, msg.value, block.timestamp); // Process deposit processDeposit(); } // Recycle a deposit from fee collector function recycleDistributorDeposit() override external payable onlyLatestContract("stafiUserDeposit", address(this)) onlyLatestContract("stafiDistributor", msg.sender) { // Emit deposit recycled event emit DepositRecycled(msg.sender, msg.value, block.timestamp); // Process deposit processDeposit(); } // Process a deposit function processDeposit() private { // Load contracts IStafiEther stafiEther = IStafiEther(getContractAddress("stafiEther")); // Transfer ETH to stafiEther stafiEther.depositEther{value: msg.value}(); // Assign deposits if enabled assignDeposits(); } // Assign deposits to available stakingPools function assignDeposits() override public onlyLatestContract("stafiUserDeposit", address(this)) { // Check deposit settings require(getAssignDepositsEnabled(), "Deposit assignments are currently disabled"); // Load contracts IStafiStakingPoolQueue stafiStakingPoolQueue = IStafiStakingPoolQueue(getContractAddress("stafiStakingPoolQueue")); IStafiEther stafiEther = IStafiEther(getContractAddress("stafiEther")); // Assign deposits uint256 maximumDepositAssignments = getMaximumDepositAssignments(); for (uint256 i = 0; i < maximumDepositAssignments; ++i) { // Get & check next available staking pool capacity uint256 stakingPoolCapacity = stafiStakingPoolQueue.getNextCapacity(); if (stakingPoolCapacity == 0 || getBalance() < stakingPoolCapacity) { break; } // Dequeue next available staking pool address stakingPoolAddress = stafiStakingPoolQueue.dequeueStakingPool(); IStafiStakingPool stakingPool = IStafiStakingPool(stakingPoolAddress); // Withdraw ETH from stafiEther stafiEther.withdrawEther(stakingPoolCapacity); // Assign deposit to staking pool stakingPool.userDeposit{value: stakingPoolCapacity}(); // Emit deposit assigned event emit DepositAssigned(stakingPoolAddress, stakingPoolCapacity, block.timestamp); } } // Withdraw excess deposit pool balance for rETH collateral function withdrawExcessBalance(uint256 _amount) override external onlyLatestContract("stafiUserDeposit", address(this)) onlyLatestContract("rETHToken", msg.sender) { // Load contracts IRETHToken rETHToken = IRETHToken(getContractAddress("rETHToken")); IStafiEther stafiEther = IStafiEther(getContractAddress("stafiEther")); // Check amount require(_amount <= getExcessBalance(), "Insufficient excess balance for withdrawal"); // Withdraw ETH from vault stafiEther.withdrawEther(_amount); // Transfer to rETH contract rETHToken.depositExcess{value: _amount}(); // Emit excess withdrawn event emit ExcessWithdrawn(msg.sender, _amount, block.timestamp); } // Withdraw excess deposit pool balance for super node function withdrawExcessBalanceForSuperNode(uint256 _amount) override external onlyLatestContract("stafiUserDeposit", address(this)) onlyLatestContract("stafiSuperNode", msg.sender) { // Load contracts IStafiSuperNode superNode = IStafiSuperNode(getContractAddress("stafiSuperNode")); IStafiEther stafiEther = IStafiEther(getContractAddress("stafiEther")); // Check amount require(_amount <= getExcessBalance(), "Insufficient balance for withdrawal"); // Withdraw ETH from vault stafiEther.withdrawEther(_amount); // Transfer to superNode contract superNode.depositEth{value: _amount}(); // Emit excess withdrawn event emit ExcessWithdrawn(msg.sender, _amount, block.timestamp); } // Withdraw excess deposit pool balance for light node function withdrawExcessBalanceForLightNode(uint256 _amount) override external onlyLatestContract("stafiUserDeposit", address(this)) onlyLatestContract("stafiLightNode", msg.sender) { // Load contracts IStafiLightNode lightNode = IStafiLightNode(getContractAddress("stafiLightNode")); IStafiEther stafiEther = IStafiEther(getContractAddress("stafiEther")); // Check amount require(_amount <= getExcessBalance(), "Insufficient balance for withdrawal"); // Withdraw ETH from vault stafiEther.withdrawEther(_amount); // Transfer to superNode contract lightNode.depositEth{value: _amount}(); // Emit excess withdrawn event emit ExcessWithdrawn(msg.sender, _amount, block.timestamp); } // Deposits currently enabled function getDepositEnabled() public view returns (bool) { return getBoolS("settings.deposit.enabled"); } function setDepositEnabled(bool _value) public onlySuperUser { setBoolS("settings.deposit.enabled", _value); } // Deposit assignments currently enabled function getAssignDepositsEnabled() public view returns (bool) { return getBoolS("settings.deposit.assign.enabled"); } function setAssignDepositsEnabled(bool _value) public onlySuperUser { setBoolS("settings.deposit.assign.enabled", _value); } // Minimum deposit size function getMinimumDeposit() public view returns (uint256) { return getUintS("settings.deposit.minimum"); } function setMinimumDeposit(uint256 _value) public onlySuperUser { setUintS("settings.deposit.minimum", _value); } // The maximum size of the deposit pool // function getMaximumDepositPoolSize() public view returns (uint256) { // return getUintS("settings.deposit.pool.maximum"); // } // function setMaximumDepositPoolSize(uint256 _value) public onlySuperUser { // setUintS("settings.deposit.pool.maximum", _value); // } // The maximum number of deposit assignments to perform at once function getMaximumDepositAssignments() public view returns (uint256) { return getUintS("settings.deposit.assign.maximum"); } function setMaximumDepositAssignments(uint256 _value) public onlySuperUser { setUintS("settings.deposit.assign.maximum", _value); } }
// 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 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; // 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 IStafiEtherWithdrawer { function receiveEtherWithdrawal() external payable; }
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 import "../../types/DepositType.sol"; import "../../types/StakingPoolStatus.sol"; interface IStafiStakingPool { function initialise(address _nodeAddress, DepositType _depositType) external; function getStatus() external view returns (StakingPoolStatus); function getStatusBlock() external view returns (uint256); function getStatusTime() external view returns (uint256); function getWithdrawalCredentialsMatch() external view returns (bool); function getDepositType() external view returns (DepositType); function getNodeAddress() external view returns (address); function getNodeFee() external view returns (uint256); function getNodeDepositBalance() external view returns (uint256); function getNodeRefundBalance() external view returns (uint256); function getNodeDepositAssigned() external view returns (bool); function getNodeCommonlyRefunded() external view returns (bool); function getNodeTrustedRefunded() external view returns (bool); function getUserDepositBalance() external view returns (uint256); function getUserDepositAssigned() external view returns (bool); function getUserDepositAssignedTime() external view returns (uint256); function getPlatformDepositBalance() external view returns (uint256); function nodeDeposit(bytes calldata _validatorPubkey, bytes calldata _validatorSignature, bytes32 _depositDataRoot) external payable; function userDeposit() external payable; function stake(bytes calldata _validatorSignature, bytes32 _depositDataRoot) external; function refund() external; function dissolve() external; function close() external; function voteWithdrawCredentials() external; }
pragma solidity 0.7.6; // SPDX-License-Identifier: GPL-3.0-only import "../../types/DepositType.sol"; interface IStafiStakingPoolQueue { function getTotalLength() external view returns (uint256); function getLength(DepositType _depositType) external view returns (uint256); function getTotalCapacity() external view returns (uint256); function getEffectiveCapacity() external view returns (uint256); function getNextCapacity() external view returns (uint256); function enqueueStakingPool(DepositType _depositType, address _stakingPool) external; function dequeueStakingPool() external returns (address); function removeStakingPool() external; }
pragma solidity 0.7.6; // SPDX-License-Identifier: GPL-3.0-only interface IRETHToken { function getEthValue(uint256 _rethAmount) external view returns (uint256); function getRethValue(uint256 _ethAmount) external view returns (uint256); function getExchangeRate() external view returns (uint256); function getTotalCollateral() external view returns (uint256); function getCollateralRate() external view returns (uint256); function depositRewards() external payable; function depositExcess() external payable; function userMint(uint256 _ethAmount, address _to) external; function userBurn(uint256 _rethAmount) external; }
pragma solidity 0.7.6; pragma abicoder v2; // SPDX-License-Identifier: GPL-3.0-only interface IStafiSuperNode { function depositEth() external payable; function deposit(bytes[] calldata _validatorPubkeys, bytes[] calldata _validatorSignatures, bytes32[] calldata _depositDataRoots) external; function stake(bytes[] calldata _validatorPubkeys, bytes[] calldata _validatorSignatures, bytes32[] calldata _depositDataRoots) external; function getSuperNodePubkeyCount(address _nodeAddress) external view returns (uint256); function getSuperNodePubkeyAt(address _nodeAddress, uint256 _index) external view returns (bytes memory); function getSuperNodePubkeyStatus(bytes calldata _validatorPubkey) external view returns (uint256); function voteWithdrawCredentials(bytes[] calldata _pubkey, bool[] calldata _match) external; }
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 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; }
pragma solidity 0.7.6; // SPDX-License-Identifier: GPL-3.0-only // Represents the type of deposits enum DepositType { None, // Marks an invalid deposit type FOUR, // Require 4 ETH from the node operator to be matched with 28 ETH from user deposits EIGHT, // Require 8 ETH from the node operator to be matched with 24 ETH from user deposits TWELVE, // Require 12 ETH from the node operator to be matched with 20 ETH from user deposits SIXTEEN, // Require 16 ETH from the node operator to be matched with 16 ETH from user deposits Empty // Require 0 ETH from the node operator to be matched with 32 ETH from user deposits (trusted nodes only) }
pragma solidity 0.7.6; // SPDX-License-Identifier: GPL-3.0-only // Represents a stakingpool's status within the network enum StakingPoolStatus { Initialized, // The stakingpool has been initialized and is awaiting a deposit of user ETH Prelaunch, // The stakingpool has enough ETH to begin staking and is awaiting launch by the node Staking, // The stakingpool is currently staking Withdrawn, // The stakingpool has been withdrawn from by the node Dissolved // The stakingpool has been dissolved and its user deposited ETH has been returned to the deposit pool }
{ "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":true,"internalType":"address","name":"stakingPool","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"DepositAssigned","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":"DepositReceived","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":"DepositRecycled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"ExcessWithdrawn","type":"event"},{"inputs":[],"name":"assignDeposits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"getAssignDepositsEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDepositEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getExcessBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaximumDepositAssignments","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMinimumDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"receiveEtherWithdrawal","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"recycleDissolvedDeposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"recycleDistributorDeposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"recycleWithdrawnDeposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bool","name":"_value","type":"bool"}],"name":"setAssignDepositsEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_value","type":"bool"}],"name":"setDepositEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"setMaximumDepositAssignments","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"setMinimumDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawExcessBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawExcessBalanceForLightNode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawExcessBalanceForSuperNode","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405260008060016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200005257600080fd5b506040516200461538038062004615833981810160405260208110156200007857600080fd5b81019080805190602001909291905050508080600060016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505060016000806101000a81548160ff021916908360ff1602179055506200012d6040518060400160405280601a81526020017f73657474696e67732e757365722e6465706f7369742e696e6974000000000000815250620001d060201b60201c565b620001c957620001446001620002fc60201b60201c565b6200015660016200044f60201b60201c565b6200016e662386f26fc10000620005a260201b60201c565b620001806002620006f560201b60201c565b620001c86040518060400160405280601a81526020017f73657474696e67732e757365722e6465706f7369742e696e697400000000000081525060016200084860201b60201c565b5b5062000bf6565b60008060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637ae1cfca836040516020018082805190602001908083835b6020831062000248578051825260208201915060208101905060208303925062000223565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052805190602001206040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015620002b857600080fd5b505afa158015620002cd573d6000803e3d6000fd5b505050506040513d6020811015620002e457600080fd5b81019080805190602001909291905050509050919050565b620003436040518060400160405280600581526020017f6f776e6572000000000000000000000000000000000000000000000000000000815250336200095860201b60201c565b80620003925750620003916040518060400160405280600581526020017f61646d696e000000000000000000000000000000000000000000000000000000815250336200095860201b60201c565b5b62000405576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4163636f756e74206973206e6f7420612073757065722075736572000000000081525060200191505060405180910390fd5b6200044c6040518060400160405280601881526020017f73657474696e67732e6465706f7369742e656e61626c65640000000000000000815250826200084860201b60201c565b50565b620004966040518060400160405280600581526020017f6f776e6572000000000000000000000000000000000000000000000000000000815250336200095860201b60201c565b80620004e55750620004e46040518060400160405280600581526020017f61646d696e000000000000000000000000000000000000000000000000000000815250336200095860201b60201c565b5b62000558576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4163636f756e74206973206e6f7420612073757065722075736572000000000081525060200191505060405180910390fd5b6200059f6040518060400160405280601f81526020017f73657474696e67732e6465706f7369742e61737369676e2e656e61626c656400815250826200084860201b60201c565b50565b620005e96040518060400160405280600581526020017f6f776e6572000000000000000000000000000000000000000000000000000000815250336200095860201b60201c565b80620006385750620006376040518060400160405280600581526020017f61646d696e000000000000000000000000000000000000000000000000000000815250336200095860201b60201c565b5b620006ab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4163636f756e74206973206e6f7420612073757065722075736572000000000081525060200191505060405180910390fd5b620006f26040518060400160405280601881526020017f73657474696e67732e6465706f7369742e6d696e696d756d00000000000000008152508262000a2f60201b60201c565b50565b6200073c6040518060400160405280600581526020017f6f776e6572000000000000000000000000000000000000000000000000000000815250336200095860201b60201c565b806200078b57506200078a6040518060400160405280600581526020017f61646d696e000000000000000000000000000000000000000000000000000000815250336200095860201b60201c565b5b620007fe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4163636f756e74206973206e6f7420612073757065722075736572000000000081525060200191505060405180910390fd5b620008456040518060400160405280601f81526020017f73657474696e67732e6465706f7369742e61737369676e2e6d6178696d756d008152508262000a2f60201b60201c565b50565b600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663abfdcced836040516020018082805190602001908083835b60208310620008bf57805182526020820191506020810190506020830392506200089a565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040518363ffffffff1660e01b815260040180838152602001821515815260200192505050600060405180830381600087803b1580156200093b57600080fd5b505af115801562000950573d6000803e3d6000fd5b505050505050565b600062000a27838360405160200180807f6163636573732e726f6c65000000000000000000000000000000000000000000815250600b0183805190602001908083835b60208310620009c057805182526020820191506020810190506020830392506200099b565b6001836020036101000a0380198251168184511680821785525050505050509050018273ffffffffffffffffffffffffffffffffffffffff1660601b8152601401925050506040516020818303038152906040528051906020012062000b3d60201b60201c565b905092915050565b600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e2a4853a836040516020018082805190602001908083835b6020831062000aa6578051825260208201915060208101905060208303925062000a81565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040518363ffffffff1660e01b81526004018083815260200182815260200192505050600060405180830381600087803b15801562000b2057600080fd5b505af115801562000b35573d6000803e3d6000fd5b505050505050565b60008060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637ae1cfca836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801562000bb257600080fd5b505afa15801562000bc7573d6000803e3d6000fd5b505050506040513d602081101562000bde57600080fd5b81019080805190602001909291905050509050919050565b613a0f8062000c066000396000f3fe60806040526004361061011f5760003560e01c806363a5db9e116100a0578063888b042f11610064578063888b042f1461038d578063cc88c3c8146103b8578063d0e30db0146103f3578063e44ad24c146103fd578063e78ec42e146104075761011f565b806363a5db9e146102d65780636ada78471461031157806372f5158d1461033e5780637c697e74146103485780638554913b146103525761011f565b80633fa9c18d116100e75780633fa9c18d146101c657806347fa434a1461020157806354fd4d501461022e5780635b17d04b1461025c5780635cb17a90146102995761011f565b8063035cf142146101245780630a019eaf1461014f57806312065fe01461015957806327c8f193146101845780633b474a651461019b575b600080fd5b34801561013057600080fd5b50610139610442565b6040518082815260200191505060405180910390f35b610157610487565b005b34801561016557600080fd5b5061016e61077f565b6040518082815260200191505060405180910390f35b34801561019057600080fd5b5061019961086a565b005b3480156101a757600080fd5b506101b0610d44565b6040518082815260200191505060405180910390f35b3480156101d257600080fd5b506101ff600480360360208110156101e957600080fd5b8101908080359060200190929190505050610d89565b005b34801561020d57600080fd5b50610216610ec2565b60405180821515815260200191505060405180910390f35b34801561023a57600080fd5b50610243610f07565b604051808260ff16815260200191505060405180910390f35b34801561026857600080fd5b506102976004803603602081101561027f57600080fd5b81019080803515159060200190929190505050610f18565b005b3480156102a557600080fd5b506102d4600480360360208110156102bc57600080fd5b81019080803515159060200190929190505050611051565b005b3480156102e257600080fd5b5061030f600480360360208110156102f957600080fd5b810190808035906020019092919050505061118a565b005b34801561031d57600080fd5b5061032661168b565b60405180821515815260200191505060405180910390f35b6103466116d0565b005b61035061198f565b005b34801561035e57600080fd5b5061038b6004803603602081101561037557600080fd5b8101908080359060200190929190505050611ce5565b005b34801561039957600080fd5b506103a26121e6565b6040518082815260200191505060405180910390f35b3480156103c457600080fd5b506103f1600480360360208110156103db57600080fd5b81019080803590602001909291905050506122e9565b005b6103fb6127ea565b005b610405612b4e565b005b34801561041357600080fd5b506104406004803603602081101561042a57600080fd5b8101908080359060200190929190505050612ea4565b005b60006104826040518060400160405280601881526020017f73657474696e67732e6465706f7369742e6d696e696d756d0000000000000000815250612fdd565b905090565b6040518060400160405280601081526020017f7374616669557365724465706f73697400000000000000000000000000000000815250306105608260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b6020831061052057805182526020820191506020810190506020830392506104fd565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120613104565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610600576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b6040518060400160405280600a81526020017f7374616669457468657200000000000000000000000000000000000000000000815250336106d98260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b602083106106995780518252602082019150602081019050602083039250610676565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120613104565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610779576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b50505050565b6000806107c06040518060400160405280600a81526020017f73746166694574686572000000000000000000000000000000000000000000008152506131ba565b90508073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561082957600080fd5b505afa15801561083d573d6000803e3d6000fd5b505050506040513d602081101561085357600080fd5b810190808051906020019092919050505091505090565b6040518060400160405280601081526020017f7374616669557365724465706f73697400000000000000000000000000000000815250306109438260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b6020831061090357805182526020820191506020810190506020830392506108e0565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120613104565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146109e3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b6109eb610ec2565b610a40576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a81526020018061395c602a913960400191505060405180910390fd5b6000610a806040518060400160405280601581526020017f73746166695374616b696e67506f6f6c517565756500000000000000000000008152506131ba565b90506000610ac26040518060400160405280600a81526020017f73746166694574686572000000000000000000000000000000000000000000008152506131ba565b90506000610ace610d44565b905060005b81811015610d3c5760008473ffffffffffffffffffffffffffffffffffffffff1663516123056040518163ffffffff1660e01b815260040160206040518083038186803b158015610b2357600080fd5b505afa158015610b37573d6000803e3d6000fd5b505050506040513d6020811015610b4d57600080fd5b810190808051906020019092919050505090506000811480610b75575080610b7361077f565b105b15610b805750610d3c565b60008573ffffffffffffffffffffffffffffffffffffffff16639a9580616040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610bca57600080fd5b505af1158015610bde573d6000803e3d6000fd5b505050506040513d6020811015610bf457600080fd5b8101908080519060200190929190505050905060008190508573ffffffffffffffffffffffffffffffffffffffff16633bed33ce846040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610c5f57600080fd5b505af1158015610c73573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff166348146113846040518263ffffffff1660e01b81526004016000604051808303818588803b158015610cbf57600080fd5b505af1158015610cd3573d6000803e3d6000fd5b50505050508173ffffffffffffffffffffffffffffffffffffffff167fa1811054b7d96716259cff0d366c2f6405951e0efe00c8db3e237cbf77fe7be98442604051808381526020018281526020019250505060405180910390a2505050806001019050610ad3565b505050505050565b6000610d846040518060400160405280601f81526020017f73657474696e67732e6465706f7369742e61737369676e2e6d6178696d756d00815250612fdd565b905090565b610dc86040518060400160405280600581526020017f6f776e65720000000000000000000000000000000000000000000000000000008152503361330d565b80610e0e5750610e0d6040518060400160405280600581526020017f61646d696e0000000000000000000000000000000000000000000000000000008152503361330d565b5b610e80576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4163636f756e74206973206e6f7420612073757065722075736572000000000081525060200191505060405180910390fd5b610ebf6040518060400160405280601f81526020017f73657474696e67732e6465706f7369742e61737369676e2e6d6178696d756d00815250826133da565b50565b6000610f026040518060400160405280601f81526020017f73657474696e67732e6465706f7369742e61737369676e2e656e61626c6564008152506134e4565b905090565b60008054906101000a900460ff1681565b610f576040518060400160405280600581526020017f6f776e65720000000000000000000000000000000000000000000000000000008152503361330d565b80610f9d5750610f9c6040518060400160405280600581526020017f61646d696e0000000000000000000000000000000000000000000000000000008152503361330d565b5b61100f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4163636f756e74206973206e6f7420612073757065722075736572000000000081525060200191505060405180910390fd5b61104e6040518060400160405280601881526020017f73657474696e67732e6465706f7369742e656e61626c656400000000000000008152508261360b565b50565b6110906040518060400160405280600581526020017f6f776e65720000000000000000000000000000000000000000000000000000008152503361330d565b806110d657506110d56040518060400160405280600581526020017f61646d696e0000000000000000000000000000000000000000000000000000008152503361330d565b5b611148576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4163636f756e74206973206e6f7420612073757065722075736572000000000081525060200191505060405180910390fd5b6111876040518060400160405280601f81526020017f73657474696e67732e6465706f7369742e61737369676e2e656e61626c6564008152508261360b565b50565b6040518060400160405280601081526020017f7374616669557365724465706f73697400000000000000000000000000000000815250306112638260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b602083106112235780518252602082019150602081019050602083039250611200565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120613104565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611303576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b6040518060400160405280600981526020017f72455448546f6b656e0000000000000000000000000000000000000000000000815250336113dc8260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b6020831061139c5780518252602082019150602081019050602083039250611379565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120613104565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461147c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b60006114bc6040518060400160405280600981526020017f72455448546f6b656e00000000000000000000000000000000000000000000008152506131ba565b905060006114fe6040518060400160405280600a81526020017f73746166694574686572000000000000000000000000000000000000000000008152506131ba565b90506115086121e6565b871115611560576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806139b0602a913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16633bed33ce886040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156115b357600080fd5b505af11580156115c7573d6000803e3d6000fd5b505050508173ffffffffffffffffffffffffffffffffffffffff16636c985a88886040518263ffffffff1660e01b81526004016000604051808303818588803b15801561161357600080fd5b505af1158015611627573d6000803e3d6000fd5b50505050503373ffffffffffffffffffffffffffffffffffffffff167f992f462cfb62e164bd03bf07baf2cffce83fbd9370cae10635842b20200121208842604051808381526020018281526020019250505060405180910390a250505050505050565b60006116cb6040518060400160405280601881526020017f73657474696e67732e6465706f7369742e656e61626c656400000000000000008152506134e4565b905090565b6040518060400160405280601081526020017f7374616669557365724465706f73697400000000000000000000000000000000815250306117a98260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b602083106117695780518252602082019150602081019050602083039250611746565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120613104565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611849576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b336118ba8160405160200180807f7374616b696e67706f6f6c2e65786973747300000000000000000000000000008152506012018273ffffffffffffffffffffffffffffffffffffffff1660601b815260140191505060405160208183030381529060405280519060200120613717565b61192c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f496e76616c6964207374616b696e6720706f6f6c00000000000000000000000081525060200191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167f3a6614e80d02b57255cbb1f8305fbeca53d7e05a4b779d4062791966085129253442604051808381526020018281526020019250505060405180910390a261198a6137cd565b505050565b6040518060400160405280601081526020017f7374616669557365724465706f7369740000000000000000000000000000000081525030611a688260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b60208310611a285780518252602082019150602081019050602083039250611a05565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120613104565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611b08576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b6040518060400160405280601081526020017f73746166694469737472696275746f720000000000000000000000000000000081525033611be18260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b60208310611ba15780518252602082019150602081019050602083039250611b7e565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120613104565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611c81576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167f3a6614e80d02b57255cbb1f8305fbeca53d7e05a4b779d4062791966085129253442604051808381526020018281526020019250505060405180910390a2611cdf6137cd565b50505050565b6040518060400160405280601081526020017f7374616669557365724465706f7369740000000000000000000000000000000081525030611dbe8260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b60208310611d7e5780518252602082019150602081019050602083039250611d5b565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120613104565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611e5e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b6040518060400160405280600e81526020017f737461666953757065724e6f646500000000000000000000000000000000000081525033611f378260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b60208310611ef75780518252602082019150602081019050602083039250611ed4565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120613104565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611fd7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b60006120176040518060400160405280600e81526020017f737461666953757065724e6f64650000000000000000000000000000000000008152506131ba565b905060006120596040518060400160405280600a81526020017f73746166694574686572000000000000000000000000000000000000000000008152506131ba565b90506120636121e6565b8711156120bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806139396023913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16633bed33ce886040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561210e57600080fd5b505af1158015612122573d6000803e3d6000fd5b505050508173ffffffffffffffffffffffffffffffffffffffff1663439370b1886040518263ffffffff1660e01b81526004016000604051808303818588803b15801561216e57600080fd5b505af1158015612182573d6000803e3d6000fd5b50505050503373ffffffffffffffffffffffffffffffffffffffff167f992f462cfb62e164bd03bf07baf2cffce83fbd9370cae10635842b20200121208842604051808381526020018281526020019250505060405180910390a250505050505050565b6000806122276040518060400160405280601581526020017f73746166695374616b696e67506f6f6c517565756500000000000000000000008152506131ba565b905060008173ffffffffffffffffffffffffffffffffffffffff1663e60b40bf6040518163ffffffff1660e01b815260040160206040518083038186803b15801561227157600080fd5b505afa158015612285573d6000803e3d6000fd5b505050506040513d602081101561229b57600080fd5b8101908080519060200190929190505050905060006122b861077f565b90508082106122cd57600093505050506122e6565b6122e0828261387b90919063ffffffff16565b93505050505b90565b6040518060400160405280601081526020017f7374616669557365724465706f73697400000000000000000000000000000000815250306123c28260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b60208310612382578051825260208201915060208101905060208303925061235f565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120613104565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612462576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b6040518060400160405280600e81526020017f73746166694c696768744e6f64650000000000000000000000000000000000008152503361253b8260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b602083106124fb57805182526020820191506020810190506020830392506124d8565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120613104565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146125db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b600061261b6040518060400160405280600e81526020017f73746166694c696768744e6f64650000000000000000000000000000000000008152506131ba565b9050600061265d6040518060400160405280600a81526020017f73746166694574686572000000000000000000000000000000000000000000008152506131ba565b90506126676121e6565b8711156126bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806139396023913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16633bed33ce886040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561271257600080fd5b505af1158015612726573d6000803e3d6000fd5b505050508173ffffffffffffffffffffffffffffffffffffffff1663439370b1886040518263ffffffff1660e01b81526004016000604051808303818588803b15801561277257600080fd5b505af1158015612786573d6000803e3d6000fd5b50505050503373ffffffffffffffffffffffffffffffffffffffff167f992f462cfb62e164bd03bf07baf2cffce83fbd9370cae10635842b20200121208842604051808381526020018281526020019250505060405180910390a250505050505050565b6040518060400160405280601081526020017f7374616669557365724465706f73697400000000000000000000000000000000815250306128c38260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b602083106128835780518252602082019150602081019050602083039250612860565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120613104565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612963576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b61296b61168b565b6129c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180613986602a913960400191505060405180910390fd5b6129c8610442565b341015612a20576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a8152602001806138ff603a913960400191505060405180910390fd5b6000612a606040518060400160405280600981526020017f72455448546f6b656e00000000000000000000000000000000000000000000008152506131ba565b90508073ffffffffffffffffffffffffffffffffffffffff1663bff3a9f834336040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050600060405180830381600087803b158015612ad357600080fd5b505af1158015612ae7573d6000803e3d6000fd5b505050503373ffffffffffffffffffffffffffffffffffffffff167f7aa1a8eb998c779420645fc14513bf058edb347d95c2fc2e6845bdc22f8886313442604051808381526020018281526020019250505060405180910390a2612b496137cd565b505050565b6040518060400160405280601081526020017f7374616669557365724465706f7369740000000000000000000000000000000081525030612c278260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b60208310612be75780518252602082019150602081019050602083039250612bc4565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120613104565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612cc7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b6040518060400160405280601681526020017f73746166694e6574776f726b5769746864726177616c0000000000000000000081525033612da08260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b60208310612d605780518252602082019150602081019050602083039250612d3d565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120613104565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612e40576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167f3a6614e80d02b57255cbb1f8305fbeca53d7e05a4b779d4062791966085129253442604051808381526020018281526020019250505060405180910390a2612e9e6137cd565b50505050565b612ee36040518060400160405280600581526020017f6f776e65720000000000000000000000000000000000000000000000000000008152503361330d565b80612f295750612f286040518060400160405280600581526020017f61646d696e0000000000000000000000000000000000000000000000000000008152503361330d565b5b612f9b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4163636f756e74206973206e6f7420612073757065722075736572000000000081525060200191505060405180910390fd5b612fda6040518060400160405280601881526020017f73657474696e67732e6465706f7369742e6d696e696d756d0000000000000000815250826133da565b50565b60008060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bd02d0f5836040516020018082805190602001908083835b602083106130535780518252602082019150602081019050602083039250613030565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052805190602001206040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156130c257600080fd5b505afa1580156130d6573d6000803e3d6000fd5b505050506040513d60208110156130ec57600080fd5b81019080805190602001909291905050509050919050565b60008060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166321f8a721836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561317857600080fd5b505afa15801561318c573d6000803e3d6000fd5b505050506040513d60208110156131a257600080fd5b81019080805190602001909291905050509050919050565b60008061325f8360405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b6020831061321f57805182526020820191506020810190506020830392506131fc565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120613104565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613304576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f436f6e7472616374206e6f7420666f756e64000000000000000000000000000081525060200191505060405180910390fd5b80915050919050565b60006133d2838360405160200180807f6163636573732e726f6c65000000000000000000000000000000000000000000815250600b0183805190602001908083835b60208310613372578051825260208201915060208101905060208303925061334f565b6001836020036101000a0380198251168184511680821785525050505050509050018273ffffffffffffffffffffffffffffffffffffffff1660601b81526014019250505060405160208183030381529060405280519060200120613717565b905092915050565b600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e2a4853a836040516020018082805190602001908083835b6020831061344f578051825260208201915060208101905060208303925061342c565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040518363ffffffff1660e01b81526004018083815260200182815260200192505050600060405180830381600087803b1580156134c857600080fd5b505af11580156134dc573d6000803e3d6000fd5b505050505050565b60008060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637ae1cfca836040516020018082805190602001908083835b6020831061355a5780518252602082019150602081019050602083039250613537565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052805190602001206040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156135c957600080fd5b505afa1580156135dd573d6000803e3d6000fd5b505050506040513d60208110156135f357600080fd5b81019080805190602001909291905050509050919050565b600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663abfdcced836040516020018082805190602001908083835b60208310613680578051825260208201915060208101905060208303925061365d565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040518363ffffffff1660e01b815260040180838152602001821515815260200192505050600060405180830381600087803b1580156136fb57600080fd5b505af115801561370f573d6000803e3d6000fd5b505050505050565b60008060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637ae1cfca836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561378b57600080fd5b505afa15801561379f573d6000803e3d6000fd5b505050506040513d60208110156137b557600080fd5b81019080805190602001909291905050509050919050565b600061380d6040518060400160405280600a81526020017f73746166694574686572000000000000000000000000000000000000000000008152506131ba565b90508073ffffffffffffffffffffffffffffffffffffffff166398ea5fca346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561385757600080fd5b505af115801561386b573d6000803e3d6000fd5b505050505061387861086a565b50565b6000828211156138f3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525060200191505060405180910390fd5b81830390509291505056fe546865206465706f736974656420616d6f756e74206973206c657373207468616e20746865206d696e696d756d206465706f7369742073697a65496e73756666696369656e742062616c616e636520666f72207769746864726177616c4465706f7369742061737369676e6d656e7473206172652063757272656e746c792064697361626c65644465706f7369747320696e746f205374616669206172652063757272656e746c792064697361626c6564496e73756666696369656e74206578636573732062616c616e636520666f72207769746864726177616ca26469706673582212200db792dc4d5bef86f5144863de07319addd6af254ec907e2c3acb4d072c0080b64736f6c634300070600330000000000000000000000006c2f7b6110a37b3b0fbdd811876be368df02e8b0
Deployed Bytecode
0x60806040526004361061011f5760003560e01c806363a5db9e116100a0578063888b042f11610064578063888b042f1461038d578063cc88c3c8146103b8578063d0e30db0146103f3578063e44ad24c146103fd578063e78ec42e146104075761011f565b806363a5db9e146102d65780636ada78471461031157806372f5158d1461033e5780637c697e74146103485780638554913b146103525761011f565b80633fa9c18d116100e75780633fa9c18d146101c657806347fa434a1461020157806354fd4d501461022e5780635b17d04b1461025c5780635cb17a90146102995761011f565b8063035cf142146101245780630a019eaf1461014f57806312065fe01461015957806327c8f193146101845780633b474a651461019b575b600080fd5b34801561013057600080fd5b50610139610442565b6040518082815260200191505060405180910390f35b610157610487565b005b34801561016557600080fd5b5061016e61077f565b6040518082815260200191505060405180910390f35b34801561019057600080fd5b5061019961086a565b005b3480156101a757600080fd5b506101b0610d44565b6040518082815260200191505060405180910390f35b3480156101d257600080fd5b506101ff600480360360208110156101e957600080fd5b8101908080359060200190929190505050610d89565b005b34801561020d57600080fd5b50610216610ec2565b60405180821515815260200191505060405180910390f35b34801561023a57600080fd5b50610243610f07565b604051808260ff16815260200191505060405180910390f35b34801561026857600080fd5b506102976004803603602081101561027f57600080fd5b81019080803515159060200190929190505050610f18565b005b3480156102a557600080fd5b506102d4600480360360208110156102bc57600080fd5b81019080803515159060200190929190505050611051565b005b3480156102e257600080fd5b5061030f600480360360208110156102f957600080fd5b810190808035906020019092919050505061118a565b005b34801561031d57600080fd5b5061032661168b565b60405180821515815260200191505060405180910390f35b6103466116d0565b005b61035061198f565b005b34801561035e57600080fd5b5061038b6004803603602081101561037557600080fd5b8101908080359060200190929190505050611ce5565b005b34801561039957600080fd5b506103a26121e6565b6040518082815260200191505060405180910390f35b3480156103c457600080fd5b506103f1600480360360208110156103db57600080fd5b81019080803590602001909291905050506122e9565b005b6103fb6127ea565b005b610405612b4e565b005b34801561041357600080fd5b506104406004803603602081101561042a57600080fd5b8101908080359060200190929190505050612ea4565b005b60006104826040518060400160405280601881526020017f73657474696e67732e6465706f7369742e6d696e696d756d0000000000000000815250612fdd565b905090565b6040518060400160405280601081526020017f7374616669557365724465706f73697400000000000000000000000000000000815250306105608260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b6020831061052057805182526020820191506020810190506020830392506104fd565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120613104565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610600576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b6040518060400160405280600a81526020017f7374616669457468657200000000000000000000000000000000000000000000815250336106d98260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b602083106106995780518252602082019150602081019050602083039250610676565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120613104565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610779576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b50505050565b6000806107c06040518060400160405280600a81526020017f73746166694574686572000000000000000000000000000000000000000000008152506131ba565b90508073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561082957600080fd5b505afa15801561083d573d6000803e3d6000fd5b505050506040513d602081101561085357600080fd5b810190808051906020019092919050505091505090565b6040518060400160405280601081526020017f7374616669557365724465706f73697400000000000000000000000000000000815250306109438260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b6020831061090357805182526020820191506020810190506020830392506108e0565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120613104565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146109e3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b6109eb610ec2565b610a40576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a81526020018061395c602a913960400191505060405180910390fd5b6000610a806040518060400160405280601581526020017f73746166695374616b696e67506f6f6c517565756500000000000000000000008152506131ba565b90506000610ac26040518060400160405280600a81526020017f73746166694574686572000000000000000000000000000000000000000000008152506131ba565b90506000610ace610d44565b905060005b81811015610d3c5760008473ffffffffffffffffffffffffffffffffffffffff1663516123056040518163ffffffff1660e01b815260040160206040518083038186803b158015610b2357600080fd5b505afa158015610b37573d6000803e3d6000fd5b505050506040513d6020811015610b4d57600080fd5b810190808051906020019092919050505090506000811480610b75575080610b7361077f565b105b15610b805750610d3c565b60008573ffffffffffffffffffffffffffffffffffffffff16639a9580616040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610bca57600080fd5b505af1158015610bde573d6000803e3d6000fd5b505050506040513d6020811015610bf457600080fd5b8101908080519060200190929190505050905060008190508573ffffffffffffffffffffffffffffffffffffffff16633bed33ce846040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610c5f57600080fd5b505af1158015610c73573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff166348146113846040518263ffffffff1660e01b81526004016000604051808303818588803b158015610cbf57600080fd5b505af1158015610cd3573d6000803e3d6000fd5b50505050508173ffffffffffffffffffffffffffffffffffffffff167fa1811054b7d96716259cff0d366c2f6405951e0efe00c8db3e237cbf77fe7be98442604051808381526020018281526020019250505060405180910390a2505050806001019050610ad3565b505050505050565b6000610d846040518060400160405280601f81526020017f73657474696e67732e6465706f7369742e61737369676e2e6d6178696d756d00815250612fdd565b905090565b610dc86040518060400160405280600581526020017f6f776e65720000000000000000000000000000000000000000000000000000008152503361330d565b80610e0e5750610e0d6040518060400160405280600581526020017f61646d696e0000000000000000000000000000000000000000000000000000008152503361330d565b5b610e80576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4163636f756e74206973206e6f7420612073757065722075736572000000000081525060200191505060405180910390fd5b610ebf6040518060400160405280601f81526020017f73657474696e67732e6465706f7369742e61737369676e2e6d6178696d756d00815250826133da565b50565b6000610f026040518060400160405280601f81526020017f73657474696e67732e6465706f7369742e61737369676e2e656e61626c6564008152506134e4565b905090565b60008054906101000a900460ff1681565b610f576040518060400160405280600581526020017f6f776e65720000000000000000000000000000000000000000000000000000008152503361330d565b80610f9d5750610f9c6040518060400160405280600581526020017f61646d696e0000000000000000000000000000000000000000000000000000008152503361330d565b5b61100f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4163636f756e74206973206e6f7420612073757065722075736572000000000081525060200191505060405180910390fd5b61104e6040518060400160405280601881526020017f73657474696e67732e6465706f7369742e656e61626c656400000000000000008152508261360b565b50565b6110906040518060400160405280600581526020017f6f776e65720000000000000000000000000000000000000000000000000000008152503361330d565b806110d657506110d56040518060400160405280600581526020017f61646d696e0000000000000000000000000000000000000000000000000000008152503361330d565b5b611148576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4163636f756e74206973206e6f7420612073757065722075736572000000000081525060200191505060405180910390fd5b6111876040518060400160405280601f81526020017f73657474696e67732e6465706f7369742e61737369676e2e656e61626c6564008152508261360b565b50565b6040518060400160405280601081526020017f7374616669557365724465706f73697400000000000000000000000000000000815250306112638260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b602083106112235780518252602082019150602081019050602083039250611200565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120613104565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611303576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b6040518060400160405280600981526020017f72455448546f6b656e0000000000000000000000000000000000000000000000815250336113dc8260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b6020831061139c5780518252602082019150602081019050602083039250611379565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120613104565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461147c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b60006114bc6040518060400160405280600981526020017f72455448546f6b656e00000000000000000000000000000000000000000000008152506131ba565b905060006114fe6040518060400160405280600a81526020017f73746166694574686572000000000000000000000000000000000000000000008152506131ba565b90506115086121e6565b871115611560576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806139b0602a913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16633bed33ce886040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156115b357600080fd5b505af11580156115c7573d6000803e3d6000fd5b505050508173ffffffffffffffffffffffffffffffffffffffff16636c985a88886040518263ffffffff1660e01b81526004016000604051808303818588803b15801561161357600080fd5b505af1158015611627573d6000803e3d6000fd5b50505050503373ffffffffffffffffffffffffffffffffffffffff167f992f462cfb62e164bd03bf07baf2cffce83fbd9370cae10635842b20200121208842604051808381526020018281526020019250505060405180910390a250505050505050565b60006116cb6040518060400160405280601881526020017f73657474696e67732e6465706f7369742e656e61626c656400000000000000008152506134e4565b905090565b6040518060400160405280601081526020017f7374616669557365724465706f73697400000000000000000000000000000000815250306117a98260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b602083106117695780518252602082019150602081019050602083039250611746565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120613104565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611849576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b336118ba8160405160200180807f7374616b696e67706f6f6c2e65786973747300000000000000000000000000008152506012018273ffffffffffffffffffffffffffffffffffffffff1660601b815260140191505060405160208183030381529060405280519060200120613717565b61192c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f496e76616c6964207374616b696e6720706f6f6c00000000000000000000000081525060200191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167f3a6614e80d02b57255cbb1f8305fbeca53d7e05a4b779d4062791966085129253442604051808381526020018281526020019250505060405180910390a261198a6137cd565b505050565b6040518060400160405280601081526020017f7374616669557365724465706f7369740000000000000000000000000000000081525030611a688260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b60208310611a285780518252602082019150602081019050602083039250611a05565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120613104565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611b08576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b6040518060400160405280601081526020017f73746166694469737472696275746f720000000000000000000000000000000081525033611be18260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b60208310611ba15780518252602082019150602081019050602083039250611b7e565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120613104565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611c81576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167f3a6614e80d02b57255cbb1f8305fbeca53d7e05a4b779d4062791966085129253442604051808381526020018281526020019250505060405180910390a2611cdf6137cd565b50505050565b6040518060400160405280601081526020017f7374616669557365724465706f7369740000000000000000000000000000000081525030611dbe8260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b60208310611d7e5780518252602082019150602081019050602083039250611d5b565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120613104565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611e5e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b6040518060400160405280600e81526020017f737461666953757065724e6f646500000000000000000000000000000000000081525033611f378260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b60208310611ef75780518252602082019150602081019050602083039250611ed4565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120613104565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611fd7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b60006120176040518060400160405280600e81526020017f737461666953757065724e6f64650000000000000000000000000000000000008152506131ba565b905060006120596040518060400160405280600a81526020017f73746166694574686572000000000000000000000000000000000000000000008152506131ba565b90506120636121e6565b8711156120bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806139396023913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16633bed33ce886040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561210e57600080fd5b505af1158015612122573d6000803e3d6000fd5b505050508173ffffffffffffffffffffffffffffffffffffffff1663439370b1886040518263ffffffff1660e01b81526004016000604051808303818588803b15801561216e57600080fd5b505af1158015612182573d6000803e3d6000fd5b50505050503373ffffffffffffffffffffffffffffffffffffffff167f992f462cfb62e164bd03bf07baf2cffce83fbd9370cae10635842b20200121208842604051808381526020018281526020019250505060405180910390a250505050505050565b6000806122276040518060400160405280601581526020017f73746166695374616b696e67506f6f6c517565756500000000000000000000008152506131ba565b905060008173ffffffffffffffffffffffffffffffffffffffff1663e60b40bf6040518163ffffffff1660e01b815260040160206040518083038186803b15801561227157600080fd5b505afa158015612285573d6000803e3d6000fd5b505050506040513d602081101561229b57600080fd5b8101908080519060200190929190505050905060006122b861077f565b90508082106122cd57600093505050506122e6565b6122e0828261387b90919063ffffffff16565b93505050505b90565b6040518060400160405280601081526020017f7374616669557365724465706f73697400000000000000000000000000000000815250306123c28260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b60208310612382578051825260208201915060208101905060208303925061235f565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120613104565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612462576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b6040518060400160405280600e81526020017f73746166694c696768744e6f64650000000000000000000000000000000000008152503361253b8260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b602083106124fb57805182526020820191506020810190506020830392506124d8565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120613104565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146125db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b600061261b6040518060400160405280600e81526020017f73746166694c696768744e6f64650000000000000000000000000000000000008152506131ba565b9050600061265d6040518060400160405280600a81526020017f73746166694574686572000000000000000000000000000000000000000000008152506131ba565b90506126676121e6565b8711156126bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806139396023913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16633bed33ce886040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561271257600080fd5b505af1158015612726573d6000803e3d6000fd5b505050508173ffffffffffffffffffffffffffffffffffffffff1663439370b1886040518263ffffffff1660e01b81526004016000604051808303818588803b15801561277257600080fd5b505af1158015612786573d6000803e3d6000fd5b50505050503373ffffffffffffffffffffffffffffffffffffffff167f992f462cfb62e164bd03bf07baf2cffce83fbd9370cae10635842b20200121208842604051808381526020018281526020019250505060405180910390a250505050505050565b6040518060400160405280601081526020017f7374616669557365724465706f73697400000000000000000000000000000000815250306128c38260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b602083106128835780518252602082019150602081019050602083039250612860565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120613104565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612963576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b61296b61168b565b6129c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180613986602a913960400191505060405180910390fd5b6129c8610442565b341015612a20576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a8152602001806138ff603a913960400191505060405180910390fd5b6000612a606040518060400160405280600981526020017f72455448546f6b656e00000000000000000000000000000000000000000000008152506131ba565b90508073ffffffffffffffffffffffffffffffffffffffff1663bff3a9f834336040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050600060405180830381600087803b158015612ad357600080fd5b505af1158015612ae7573d6000803e3d6000fd5b505050503373ffffffffffffffffffffffffffffffffffffffff167f7aa1a8eb998c779420645fc14513bf058edb347d95c2fc2e6845bdc22f8886313442604051808381526020018281526020019250505060405180910390a2612b496137cd565b505050565b6040518060400160405280601081526020017f7374616669557365724465706f7369740000000000000000000000000000000081525030612c278260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b60208310612be75780518252602082019150602081019050602083039250612bc4565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120613104565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612cc7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b6040518060400160405280601681526020017f73746166694e6574776f726b5769746864726177616c0000000000000000000081525033612da08260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b60208310612d605780518252602082019150602081019050602083039250612d3d565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120613104565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612e40576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167f3a6614e80d02b57255cbb1f8305fbeca53d7e05a4b779d4062791966085129253442604051808381526020018281526020019250505060405180910390a2612e9e6137cd565b50505050565b612ee36040518060400160405280600581526020017f6f776e65720000000000000000000000000000000000000000000000000000008152503361330d565b80612f295750612f286040518060400160405280600581526020017f61646d696e0000000000000000000000000000000000000000000000000000008152503361330d565b5b612f9b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4163636f756e74206973206e6f7420612073757065722075736572000000000081525060200191505060405180910390fd5b612fda6040518060400160405280601881526020017f73657474696e67732e6465706f7369742e6d696e696d756d0000000000000000815250826133da565b50565b60008060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bd02d0f5836040516020018082805190602001908083835b602083106130535780518252602082019150602081019050602083039250613030565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052805190602001206040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156130c257600080fd5b505afa1580156130d6573d6000803e3d6000fd5b505050506040513d60208110156130ec57600080fd5b81019080805190602001909291905050509050919050565b60008060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166321f8a721836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561317857600080fd5b505afa15801561318c573d6000803e3d6000fd5b505050506040513d60208110156131a257600080fd5b81019080805190602001909291905050509050919050565b60008061325f8360405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b6020831061321f57805182526020820191506020810190506020830392506131fc565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120613104565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613304576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f436f6e7472616374206e6f7420666f756e64000000000000000000000000000081525060200191505060405180910390fd5b80915050919050565b60006133d2838360405160200180807f6163636573732e726f6c65000000000000000000000000000000000000000000815250600b0183805190602001908083835b60208310613372578051825260208201915060208101905060208303925061334f565b6001836020036101000a0380198251168184511680821785525050505050509050018273ffffffffffffffffffffffffffffffffffffffff1660601b81526014019250505060405160208183030381529060405280519060200120613717565b905092915050565b600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e2a4853a836040516020018082805190602001908083835b6020831061344f578051825260208201915060208101905060208303925061342c565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040518363ffffffff1660e01b81526004018083815260200182815260200192505050600060405180830381600087803b1580156134c857600080fd5b505af11580156134dc573d6000803e3d6000fd5b505050505050565b60008060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637ae1cfca836040516020018082805190602001908083835b6020831061355a5780518252602082019150602081019050602083039250613537565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052805190602001206040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156135c957600080fd5b505afa1580156135dd573d6000803e3d6000fd5b505050506040513d60208110156135f357600080fd5b81019080805190602001909291905050509050919050565b600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663abfdcced836040516020018082805190602001908083835b60208310613680578051825260208201915060208101905060208303925061365d565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040518363ffffffff1660e01b815260040180838152602001821515815260200192505050600060405180830381600087803b1580156136fb57600080fd5b505af115801561370f573d6000803e3d6000fd5b505050505050565b60008060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637ae1cfca836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561378b57600080fd5b505afa15801561379f573d6000803e3d6000fd5b505050506040513d60208110156137b557600080fd5b81019080805190602001909291905050509050919050565b600061380d6040518060400160405280600a81526020017f73746166694574686572000000000000000000000000000000000000000000008152506131ba565b90508073ffffffffffffffffffffffffffffffffffffffff166398ea5fca346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561385757600080fd5b505af115801561386b573d6000803e3d6000fd5b505050505061387861086a565b50565b6000828211156138f3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525060200191505060405180910390fd5b81830390509291505056fe546865206465706f736974656420616d6f756e74206973206c657373207468616e20746865206d696e696d756d206465706f7369742073697a65496e73756666696369656e742062616c616e636520666f72207769746864726177616c4465706f7369742061737369676e6d656e7473206172652063757272656e746c792064697361626c65644465706f7369747320696e746f205374616669206172652063757272656e746c792064697361626c6564496e73756666696369656e74206578636573732062616c616e636520666f72207769746864726177616ca26469706673582212200db792dc4d5bef86f5144863de07319addd6af254ec907e2c3acb4d072c0080b64736f6c63430007060033
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
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.