More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 40,041 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Transfer Ownersh... | 19762777 | 211 days ago | IN | 0 ETH | 0.00024529 | ||||
Withdraw | 19207279 | 289 days ago | IN | 0 ETH | 0.00059024 | ||||
Withdraw | 19206848 | 289 days ago | IN | 0 ETH | 0.00046679 | ||||
Claim Divs | 18882556 | 334 days ago | IN | 0 ETH | 0.00092061 | ||||
Claim Divs | 18882507 | 334 days ago | IN | 0 ETH | 0.00097467 | ||||
Withdraw | 18553358 | 380 days ago | IN | 0 ETH | 0.00072711 | ||||
Claim Divs | 18553167 | 380 days ago | IN | 0 ETH | 0.00066267 | ||||
Withdraw | 18553121 | 380 days ago | IN | 0 ETH | 0.00073227 | ||||
Withdraw | 18553084 | 380 days ago | IN | 0 ETH | 0.00048529 | ||||
Claim Divs | 17157401 | 576 days ago | IN | 0 ETH | 0.00246279 | ||||
Claim Divs | 17149850 | 577 days ago | IN | 0 ETH | 0.00268627 | ||||
Withdraw | 17141284 | 578 days ago | IN | 0 ETH | 0.00092007 | ||||
Claim Divs | 17025752 | 595 days ago | IN | 0 ETH | 0.00088242 | ||||
Claim Divs | 16828867 | 623 days ago | IN | 0 ETH | 0.00190395 | ||||
Claim Divs | 16828861 | 623 days ago | IN | 0 ETH | 0.00254546 | ||||
Claim Divs | 16783754 | 629 days ago | IN | 0 ETH | 0.0019633 | ||||
Claim Divs | 16783672 | 629 days ago | IN | 0 ETH | 0.00179996 | ||||
Claim Divs | 16782030 | 629 days ago | IN | 0 ETH | 0.0006872 | ||||
Claim Divs | 16782018 | 629 days ago | IN | 0 ETH | 0.00066266 | ||||
Withdraw | 16779109 | 630 days ago | IN | 0 ETH | 0.0014822 | ||||
Withdraw | 16779080 | 630 days ago | IN | 0 ETH | 0.00103062 | ||||
Withdraw | 16779069 | 630 days ago | IN | 0 ETH | 0.00167596 | ||||
Withdraw | 16779018 | 630 days ago | IN | 0 ETH | 0.00125891 | ||||
Withdraw | 16779014 | 630 days ago | IN | 0 ETH | 0.00114839 | ||||
Withdraw | 16778948 | 630 days ago | IN | 0 ETH | 0.00107526 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
YfDAIstaking
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)Audit Report
/** *Submitted for verification at Etherscan.io on 2020-10-08 */ pragma solidity 0.6.12; // SPDX-License-Identifier: BSD-3-Clause /** * @title SafeMath * @dev Math operations with safety checks that throw on error */ library SafeMath { function mul(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a * b; assert(a == 0 || c / a == b); return c; } function div(uint256 a, uint256 b) internal pure returns (uint256) { // assert(b > 0); // Solidity automatically throws when dividing by 0 uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } function sub(uint256 a, uint256 b) internal pure returns (uint256) { assert(b <= a); return a - b; } function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; assert(c >= a); return c; } } /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.0.0, only sets of type `address` (`AddressSet`) and `uint256` * (`UintSet`) are supported. */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping (bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { require(set._values.length > index, "EnumerableSet: index out of bounds"); return set._values[index]; } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(value))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(value))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(value))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint256(_at(set._inner, index))); } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } } /** * @title Ownable * @dev The Ownable contract has an owner address, and provides basic authorization control * functions, this simplifies the implementation of "user permissions". */ contract Ownable { address public owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev The Ownable constructor sets the original `owner` of the contract to the sender * account. */ constructor() public { owner = msg.sender; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(msg.sender == owner); _; } /** * @dev Allows the current owner to transfer control of the contract to a newOwner. * @param newOwner The address to transfer ownership to. */ function transferOwnership(address newOwner) onlyOwner public { require(newOwner != address(0)); emit OwnershipTransferred(owner, newOwner); owner = newOwner; } } interface Token { function transferFrom(address, address, uint) external returns (bool); function transfer(address, uint) external returns (bool); } contract YfDAIstaking is Ownable { using SafeMath for uint; using EnumerableSet for EnumerableSet.AddressSet; event RewardsTransferred(address holder, uint amount); // yfdai token contract address address public constant tokenAddress = 0xf4CD3d3Fda8d7Fd6C5a500203e38640A70Bf9577; // reward rate 72.00% per year uint public constant rewardRate = 7200; uint public constant rewardInterval = 365 days; // staking fee 1.50 percent uint public constant stakingFeeRate = 150; // unstaking fee 0.50 percent uint public constant unstakingFeeRate = 50; // unstaking possible after 72 hours uint public constant cliffTime = 72 hours; uint public totalClaimedRewards = 0; EnumerableSet.AddressSet private holders; mapping (address => uint) public depositedTokens; mapping (address => uint) public stakingTime; mapping (address => uint) public lastClaimedTime; mapping (address => uint) public totalEarnedTokens; function updateAccount(address account) private { uint pendingDivs = getPendingDivs(account); if (pendingDivs > 0) { require(Token(tokenAddress).transfer(account, pendingDivs), "Could not transfer tokens."); totalEarnedTokens[account] = totalEarnedTokens[account].add(pendingDivs); totalClaimedRewards = totalClaimedRewards.add(pendingDivs); emit RewardsTransferred(account, pendingDivs); } lastClaimedTime[account] = now; } function getPendingDivs(address _holder) public view returns (uint) { if (!holders.contains(_holder)) return 0; if (depositedTokens[_holder] == 0) return 0; uint timeDiff = now.sub(lastClaimedTime[_holder]); uint stakedAmount = depositedTokens[_holder]; uint pendingDivs = stakedAmount .mul(rewardRate) .mul(timeDiff) .div(rewardInterval) .div(1e4); return pendingDivs; } function getNumberOfHolders() public view returns (uint) { return holders.length(); } function deposit(uint amountToStake) public { require(amountToStake > 0, "Cannot deposit 0 Tokens"); require(Token(tokenAddress).transferFrom(msg.sender, address(this), amountToStake), "Insufficient Token Allowance"); updateAccount(msg.sender); uint fee = amountToStake.mul(stakingFeeRate).div(1e4); uint amountAfterFee = amountToStake.sub(fee); require(Token(tokenAddress).transfer(owner, fee), "Could not transfer deposit fee."); depositedTokens[msg.sender] = depositedTokens[msg.sender].add(amountAfterFee); if (!holders.contains(msg.sender)) { holders.add(msg.sender); stakingTime[msg.sender] = now; } } function withdraw(uint amountToWithdraw) public { require(depositedTokens[msg.sender] >= amountToWithdraw, "Invalid amount to withdraw"); require(now.sub(stakingTime[msg.sender]) > cliffTime, "You recently staked, please wait before withdrawing."); updateAccount(msg.sender); uint fee = amountToWithdraw.mul(unstakingFeeRate).div(1e4); uint amountAfterFee = amountToWithdraw.sub(fee); require(Token(tokenAddress).transfer(owner, fee), "Could not transfer withdraw fee."); require(Token(tokenAddress).transfer(msg.sender, amountAfterFee), "Could not transfer tokens."); depositedTokens[msg.sender] = depositedTokens[msg.sender].sub(amountToWithdraw); if (holders.contains(msg.sender) && depositedTokens[msg.sender] == 0) { holders.remove(msg.sender); } } function claimDivs() public { updateAccount(msg.sender); } function getStakersList(uint startIndex, uint endIndex) public view returns (address[] memory stakers, uint[] memory stakingTimestamps, uint[] memory lastClaimedTimeStamps, uint[] memory stakedTokens) { require (startIndex < endIndex); uint length = endIndex.sub(startIndex); address[] memory _stakers = new address[](length); uint[] memory _stakingTimestamps = new uint[](length); uint[] memory _lastClaimedTimeStamps = new uint[](length); uint[] memory _stakedTokens = new uint[](length); for (uint i = startIndex; i < endIndex; i = i.add(1)) { address staker = holders.at(i); uint listIndex = i.sub(startIndex); _stakers[listIndex] = staker; _stakingTimestamps[listIndex] = stakingTime[staker]; _lastClaimedTimeStamps[listIndex] = lastClaimedTime[staker]; _stakedTokens[listIndex] = depositedTokens[staker]; } return (_stakers, _stakingTimestamps, _lastClaimedTimeStamps, _stakedTokens); } uint private constant stakingAndDaoTokens = 5129e18; function getStakingAndDaoAmount() public view returns (uint) { if (totalClaimedRewards >= stakingAndDaoTokens) { return 0; } uint remaining = stakingAndDaoTokens.sub(totalClaimedRewards); return remaining; } // function to allow admin to claim *other* ERC20 tokens sent to this contract (by mistake) // Admin cannot transfer out YF-DAI from this smart contract function transferAnyERC20Tokens(address _tokenAddr, address _to, uint _amount) public onlyOwner { require (_tokenAddr != tokenAddress, "Cannot Transfer Out YF-DAI!"); Token(_tokenAddr).transfer(_to, _amount); } }
Contract Security Audit
- Blockchain Consilium - October 19th, 2020 - Security Audit Report
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"holder","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RewardsTransferred","type":"event"},{"inputs":[],"name":"claimDivs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cliffTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountToStake","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"depositedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfHolders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_holder","type":"address"}],"name":"getPendingDivs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"startIndex","type":"uint256"},{"internalType":"uint256","name":"endIndex","type":"uint256"}],"name":"getStakersList","outputs":[{"internalType":"address[]","name":"stakers","type":"address[]"},{"internalType":"uint256[]","name":"stakingTimestamps","type":"uint256[]"},{"internalType":"uint256[]","name":"lastClaimedTimeStamps","type":"uint256[]"},{"internalType":"uint256[]","name":"stakedTokens","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStakingAndDaoAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastClaimedTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardInterval","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingFeeRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stakingTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalClaimedRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalEarnedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddr","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"transferAnyERC20Tokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unstakingFeeRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountToWithdraw","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052600060015534801561001557600080fd5b50336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611fa6806100656000396000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c80637b0a47ee116100b8578063bec4de3f1161007c578063bec4de3f1461057b578063c326bf4f14610599578063d578ceab146105f1578063d816c7d51461060f578063f2fde38b1461062d578063f3f91fa01461067157610137565b80637b0a47ee1461046f5780638da5cb5b1461048d57806398896d10146104c15780639d76ea5814610519578063b6b55f251461054d57610137565b8063308feec3116100ff578063308feec314610315578063583d42fd146103335780635ef057be1461038b5780636270cd18146103a95780636a395ccb1461040157610137565b80630f1a64441461013c5780631911cf4a1461015a57806319aa70e7146102bf578063268cab49146102c95780632e1a7d4d146102e7575b600080fd5b6101446106c9565b6040518082815260200191505060405180910390f35b6101906004803603604081101561017057600080fd5b8101908080359060200190929190803590602001909291905050506106d0565b6040518080602001806020018060200180602001858103855289818151815260200191508051906020019060200280838360005b838110156101df5780820151818401526020810190506101c4565b50505050905001858103845288818151815260200191508051906020019060200280838360005b83811015610221578082015181840152602081019050610206565b50505050905001858103835287818151815260200191508051906020019060200280838360005b83811015610263578082015181840152602081019050610248565b50505050905001858103825286818151815260200191508051906020019060200280838360005b838110156102a557808201518184015260208101905061028a565b505050509050019850505050505050505060405180910390f35b6102c76109e9565b005b6102d16109f4565b6040518082815260200191505060405180910390f35b610313600480360360208110156102fd57600080fd5b8101908080359060200190929190505050610a3d565b005b61031d610f82565b6040518082815260200191505060405180910390f35b6103756004803603602081101561034957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610f93565b6040518082815260200191505060405180910390f35b610393610fab565b6040518082815260200191505060405180910390f35b6103eb600480360360208110156103bf57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610fb0565b6040518082815260200191505060405180910390f35b61046d6004803603606081101561041757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610fc8565b005b610477611188565b6040518082815260200191505060405180910390f35b61049561118e565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610503600480360360208110156104d757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506111b2565b6040518082815260200191505060405180910390f35b610521611321565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6105796004803603602081101561056357600080fd5b8101908080359060200190929190505050611339565b005b6105836117a9565b6040518082815260200191505060405180910390f35b6105db600480360360208110156105af57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506117b1565b6040518082815260200191505060405180910390f35b6105f96117c9565b6040518082815260200191505060405180910390f35b6106176117cf565b6040518082815260200191505060405180910390f35b61066f6004803603602081101561064357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506117d4565b005b6106b36004803603602081101561068757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611923565b6040518082815260200191505060405180910390f35b6203f48081565b6060806060808486106106e257600080fd5b60006106f7878761193b90919063ffffffff16565b905060608167ffffffffffffffff8111801561071257600080fd5b506040519080825280602002602001820160405280156107415781602001602082028036833780820191505090505b50905060608267ffffffffffffffff8111801561075d57600080fd5b5060405190808252806020026020018201604052801561078c5781602001602082028036833780820191505090505b50905060608367ffffffffffffffff811180156107a857600080fd5b506040519080825280602002602001820160405280156107d75781602001602082028036833780820191505090505b50905060608467ffffffffffffffff811180156107f357600080fd5b506040519080825280602002602001820160405280156108225781602001602082028036833780820191505090505b50905060008b90505b8a8110156109ce57600061084982600261195290919063ffffffff16565b905060006108608e8461193b90919063ffffffff16565b90508187828151811061086f57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548682815181106108f557fe5b602002602001018181525050600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205485828151811061094d57fe5b602002602001018181525050600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548482815181106109a557fe5b60200260200101818152505050506109c760018261196c90919063ffffffff16565b905061082b565b50838383839850985098509850505050505092959194509250565b6109f233611988565b565b60006901160b2c7564b284000060015410610a125760009050610a3a565b6000610a336001546901160b2c7564b284000061193b90919063ffffffff16565b9050809150505b90565b80600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610af2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f496e76616c696420616d6f756e7420746f20776974686472617700000000000081525060200191505060405180910390fd5b6203f480610b48600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020544261193b90919063ffffffff16565b11610b9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526034815260200180611f3d6034913960400191505060405180910390fd5b610ba733611988565b6000610bd1612710610bc3603285611c1e90919063ffffffff16565b611c4d90919063ffffffff16565b90506000610be8828461193b90919063ffffffff16565b905073f4cd3d3fda8d7fd6c5a500203e38640a70bf957773ffffffffffffffffffffffffffffffffffffffff1663a9059cbb60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015610c8f57600080fd5b505af1158015610ca3573d6000803e3d6000fd5b505050506040513d6020811015610cb957600080fd5b8101908080519060200190929190505050610d3c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f436f756c64206e6f74207472616e73666572207769746864726177206665652e81525060200191505060405180910390fd5b73f4cd3d3fda8d7fd6c5a500203e38640a70bf957773ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015610dc157600080fd5b505af1158015610dd5573d6000803e3d6000fd5b505050506040513d6020811015610deb57600080fd5b8101908080519060200190929190505050610e6e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f436f756c64206e6f74207472616e7366657220746f6b656e732e00000000000081525060200191505060405180910390fd5b610ec083600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461193b90919063ffffffff16565b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610f17336002611c6690919063ffffffff16565b8015610f6257506000600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054145b15610f7d57610f7b336002611c9690919063ffffffff16565b505b505050565b6000610f8e6002611cc6565b905090565b60056020528060005260406000206000915090505481565b609681565b60076020528060005260406000206000915090505481565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461102057600080fd5b73f4cd3d3fda8d7fd6c5a500203e38640a70bf957773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156110d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f43616e6e6f74205472616e73666572204f75742059462d44414921000000000081525060200191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561114757600080fd5b505af115801561115b573d6000803e3d6000fd5b505050506040513d602081101561117157600080fd5b810190808051906020019092919050505050505050565b611c2081565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006111c8826002611c6690919063ffffffff16565b6111d5576000905061131c565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541415611226576000905061131c565b600061127a600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020544261193b90919063ffffffff16565b90506000600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060006113136127106113056301e133806112f7876112e9611c2089611c1e90919063ffffffff16565b611c1e90919063ffffffff16565b611c4d90919063ffffffff16565b611c4d90919063ffffffff16565b90508093505050505b919050565b73f4cd3d3fda8d7fd6c5a500203e38640a70bf957781565b600081116113af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f43616e6e6f74206465706f736974203020546f6b656e7300000000000000000081525060200191505060405180910390fd5b73f4cd3d3fda8d7fd6c5a500203e38640a70bf957773ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b15801561145257600080fd5b505af1158015611466573d6000803e3d6000fd5b505050506040513d602081101561147c57600080fd5b81019080805190602001909291905050506114ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e73756666696369656e7420546f6b656e20416c6c6f77616e63650000000081525060200191505060405180910390fd5b61150833611988565b6000611532612710611524609685611c1e90919063ffffffff16565b611c4d90919063ffffffff16565b90506000611549828461193b90919063ffffffff16565b905073f4cd3d3fda8d7fd6c5a500203e38640a70bf957773ffffffffffffffffffffffffffffffffffffffff1663a9059cbb60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156115f057600080fd5b505af1158015611604573d6000803e3d6000fd5b505050506040513d602081101561161a57600080fd5b810190808051906020019092919050505061169d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f436f756c64206e6f74207472616e73666572206465706f736974206665652e0081525060200191505060405180910390fd5b6116ef81600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461196c90919063ffffffff16565b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611746336002611c6690919063ffffffff16565b6117a45761175e336002611cdb90919063ffffffff16565b5042600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b505050565b6301e1338081565b60046020528060005260406000206000915090505481565b60015481565b603281565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461182c57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561186657600080fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60066020528060005260406000206000915090505481565b60008282111561194757fe5b818303905092915050565b60006119618360000183611d0b565b60001c905092915050565b60008082840190508381101561197e57fe5b8091505092915050565b6000611993826111b2565b90506000811115611bd65773f4cd3d3fda8d7fd6c5a500203e38640a70bf957773ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015611a2357600080fd5b505af1158015611a37573d6000803e3d6000fd5b505050506040513d6020811015611a4d57600080fd5b8101908080519060200190929190505050611ad0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f436f756c64206e6f74207472616e7366657220746f6b656e732e00000000000081525060200191505060405180910390fd5b611b2281600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461196c90919063ffffffff16565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611b7a8160015461196c90919063ffffffff16565b6001819055507f586b2e63a21a7a4e1402e36f48ce10cb1ec94684fea254c186b76d1f98ecf1308282604051808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a15b42600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b60008082840290506000841480611c3d575082848281611c3a57fe5b04145b611c4357fe5b8091505092915050565b600080828481611c5957fe5b0490508091505092915050565b6000611c8e836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611d8e565b905092915050565b6000611cbe836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611db1565b905092915050565b6000611cd482600001611e99565b9050919050565b6000611d03836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611eaa565b905092915050565b600081836000018054905011611d6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180611f1b6022913960400191505060405180910390fd5b826000018281548110611d7b57fe5b9060005260206000200154905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b60008083600101600084815260200190815260200160002054905060008114611e8d5760006001820390506000600186600001805490500390506000866000018281548110611dfc57fe5b9060005260206000200154905080876000018481548110611e1957fe5b9060005260206000200181905550600183018760010160008381526020019081526020016000208190555086600001805480611e5157fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050611e93565b60009150505b92915050565b600081600001805490509050919050565b6000611eb68383611d8e565b611f0f578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050611f14565b600090505b9291505056fe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e6473596f7520726563656e746c79207374616b65642c20706c656173652077616974206265666f7265207769746864726177696e672ea26469706673582212203f490b4a15bc6545b47a1dab79332ffcc333ef365fc5f4094eae3e120d6f47e464736f6c634300060c0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101375760003560e01c80637b0a47ee116100b8578063bec4de3f1161007c578063bec4de3f1461057b578063c326bf4f14610599578063d578ceab146105f1578063d816c7d51461060f578063f2fde38b1461062d578063f3f91fa01461067157610137565b80637b0a47ee1461046f5780638da5cb5b1461048d57806398896d10146104c15780639d76ea5814610519578063b6b55f251461054d57610137565b8063308feec3116100ff578063308feec314610315578063583d42fd146103335780635ef057be1461038b5780636270cd18146103a95780636a395ccb1461040157610137565b80630f1a64441461013c5780631911cf4a1461015a57806319aa70e7146102bf578063268cab49146102c95780632e1a7d4d146102e7575b600080fd5b6101446106c9565b6040518082815260200191505060405180910390f35b6101906004803603604081101561017057600080fd5b8101908080359060200190929190803590602001909291905050506106d0565b6040518080602001806020018060200180602001858103855289818151815260200191508051906020019060200280838360005b838110156101df5780820151818401526020810190506101c4565b50505050905001858103845288818151815260200191508051906020019060200280838360005b83811015610221578082015181840152602081019050610206565b50505050905001858103835287818151815260200191508051906020019060200280838360005b83811015610263578082015181840152602081019050610248565b50505050905001858103825286818151815260200191508051906020019060200280838360005b838110156102a557808201518184015260208101905061028a565b505050509050019850505050505050505060405180910390f35b6102c76109e9565b005b6102d16109f4565b6040518082815260200191505060405180910390f35b610313600480360360208110156102fd57600080fd5b8101908080359060200190929190505050610a3d565b005b61031d610f82565b6040518082815260200191505060405180910390f35b6103756004803603602081101561034957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610f93565b6040518082815260200191505060405180910390f35b610393610fab565b6040518082815260200191505060405180910390f35b6103eb600480360360208110156103bf57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610fb0565b6040518082815260200191505060405180910390f35b61046d6004803603606081101561041757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610fc8565b005b610477611188565b6040518082815260200191505060405180910390f35b61049561118e565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610503600480360360208110156104d757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506111b2565b6040518082815260200191505060405180910390f35b610521611321565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6105796004803603602081101561056357600080fd5b8101908080359060200190929190505050611339565b005b6105836117a9565b6040518082815260200191505060405180910390f35b6105db600480360360208110156105af57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506117b1565b6040518082815260200191505060405180910390f35b6105f96117c9565b6040518082815260200191505060405180910390f35b6106176117cf565b6040518082815260200191505060405180910390f35b61066f6004803603602081101561064357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506117d4565b005b6106b36004803603602081101561068757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611923565b6040518082815260200191505060405180910390f35b6203f48081565b6060806060808486106106e257600080fd5b60006106f7878761193b90919063ffffffff16565b905060608167ffffffffffffffff8111801561071257600080fd5b506040519080825280602002602001820160405280156107415781602001602082028036833780820191505090505b50905060608267ffffffffffffffff8111801561075d57600080fd5b5060405190808252806020026020018201604052801561078c5781602001602082028036833780820191505090505b50905060608367ffffffffffffffff811180156107a857600080fd5b506040519080825280602002602001820160405280156107d75781602001602082028036833780820191505090505b50905060608467ffffffffffffffff811180156107f357600080fd5b506040519080825280602002602001820160405280156108225781602001602082028036833780820191505090505b50905060008b90505b8a8110156109ce57600061084982600261195290919063ffffffff16565b905060006108608e8461193b90919063ffffffff16565b90508187828151811061086f57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548682815181106108f557fe5b602002602001018181525050600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205485828151811061094d57fe5b602002602001018181525050600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548482815181106109a557fe5b60200260200101818152505050506109c760018261196c90919063ffffffff16565b905061082b565b50838383839850985098509850505050505092959194509250565b6109f233611988565b565b60006901160b2c7564b284000060015410610a125760009050610a3a565b6000610a336001546901160b2c7564b284000061193b90919063ffffffff16565b9050809150505b90565b80600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610af2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f496e76616c696420616d6f756e7420746f20776974686472617700000000000081525060200191505060405180910390fd5b6203f480610b48600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020544261193b90919063ffffffff16565b11610b9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526034815260200180611f3d6034913960400191505060405180910390fd5b610ba733611988565b6000610bd1612710610bc3603285611c1e90919063ffffffff16565b611c4d90919063ffffffff16565b90506000610be8828461193b90919063ffffffff16565b905073f4cd3d3fda8d7fd6c5a500203e38640a70bf957773ffffffffffffffffffffffffffffffffffffffff1663a9059cbb60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015610c8f57600080fd5b505af1158015610ca3573d6000803e3d6000fd5b505050506040513d6020811015610cb957600080fd5b8101908080519060200190929190505050610d3c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f436f756c64206e6f74207472616e73666572207769746864726177206665652e81525060200191505060405180910390fd5b73f4cd3d3fda8d7fd6c5a500203e38640a70bf957773ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015610dc157600080fd5b505af1158015610dd5573d6000803e3d6000fd5b505050506040513d6020811015610deb57600080fd5b8101908080519060200190929190505050610e6e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f436f756c64206e6f74207472616e7366657220746f6b656e732e00000000000081525060200191505060405180910390fd5b610ec083600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461193b90919063ffffffff16565b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610f17336002611c6690919063ffffffff16565b8015610f6257506000600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054145b15610f7d57610f7b336002611c9690919063ffffffff16565b505b505050565b6000610f8e6002611cc6565b905090565b60056020528060005260406000206000915090505481565b609681565b60076020528060005260406000206000915090505481565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461102057600080fd5b73f4cd3d3fda8d7fd6c5a500203e38640a70bf957773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156110d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f43616e6e6f74205472616e73666572204f75742059462d44414921000000000081525060200191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561114757600080fd5b505af115801561115b573d6000803e3d6000fd5b505050506040513d602081101561117157600080fd5b810190808051906020019092919050505050505050565b611c2081565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006111c8826002611c6690919063ffffffff16565b6111d5576000905061131c565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541415611226576000905061131c565b600061127a600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020544261193b90919063ffffffff16565b90506000600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060006113136127106113056301e133806112f7876112e9611c2089611c1e90919063ffffffff16565b611c1e90919063ffffffff16565b611c4d90919063ffffffff16565b611c4d90919063ffffffff16565b90508093505050505b919050565b73f4cd3d3fda8d7fd6c5a500203e38640a70bf957781565b600081116113af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f43616e6e6f74206465706f736974203020546f6b656e7300000000000000000081525060200191505060405180910390fd5b73f4cd3d3fda8d7fd6c5a500203e38640a70bf957773ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b15801561145257600080fd5b505af1158015611466573d6000803e3d6000fd5b505050506040513d602081101561147c57600080fd5b81019080805190602001909291905050506114ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e73756666696369656e7420546f6b656e20416c6c6f77616e63650000000081525060200191505060405180910390fd5b61150833611988565b6000611532612710611524609685611c1e90919063ffffffff16565b611c4d90919063ffffffff16565b90506000611549828461193b90919063ffffffff16565b905073f4cd3d3fda8d7fd6c5a500203e38640a70bf957773ffffffffffffffffffffffffffffffffffffffff1663a9059cbb60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156115f057600080fd5b505af1158015611604573d6000803e3d6000fd5b505050506040513d602081101561161a57600080fd5b810190808051906020019092919050505061169d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f436f756c64206e6f74207472616e73666572206465706f736974206665652e0081525060200191505060405180910390fd5b6116ef81600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461196c90919063ffffffff16565b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611746336002611c6690919063ffffffff16565b6117a45761175e336002611cdb90919063ffffffff16565b5042600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b505050565b6301e1338081565b60046020528060005260406000206000915090505481565b60015481565b603281565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461182c57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561186657600080fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60066020528060005260406000206000915090505481565b60008282111561194757fe5b818303905092915050565b60006119618360000183611d0b565b60001c905092915050565b60008082840190508381101561197e57fe5b8091505092915050565b6000611993826111b2565b90506000811115611bd65773f4cd3d3fda8d7fd6c5a500203e38640a70bf957773ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015611a2357600080fd5b505af1158015611a37573d6000803e3d6000fd5b505050506040513d6020811015611a4d57600080fd5b8101908080519060200190929190505050611ad0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f436f756c64206e6f74207472616e7366657220746f6b656e732e00000000000081525060200191505060405180910390fd5b611b2281600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461196c90919063ffffffff16565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611b7a8160015461196c90919063ffffffff16565b6001819055507f586b2e63a21a7a4e1402e36f48ce10cb1ec94684fea254c186b76d1f98ecf1308282604051808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a15b42600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b60008082840290506000841480611c3d575082848281611c3a57fe5b04145b611c4357fe5b8091505092915050565b600080828481611c5957fe5b0490508091505092915050565b6000611c8e836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611d8e565b905092915050565b6000611cbe836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611db1565b905092915050565b6000611cd482600001611e99565b9050919050565b6000611d03836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611eaa565b905092915050565b600081836000018054905011611d6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180611f1b6022913960400191505060405180910390fd5b826000018281548110611d7b57fe5b9060005260206000200154905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b60008083600101600084815260200190815260200160002054905060008114611e8d5760006001820390506000600186600001805490500390506000866000018281548110611dfc57fe5b9060005260206000200154905080876000018481548110611e1957fe5b9060005260206000200181905550600183018760010160008381526020019081526020016000208190555086600001805480611e5157fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050611e93565b60009150505b92915050565b600081600001805490509050919050565b6000611eb68383611d8e565b611f0f578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050611f14565b600090505b9291505056fe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e6473596f7520726563656e746c79207374616b65642c20706c656173652077616974206265666f7265207769746864726177696e672ea26469706673582212203f490b4a15bc6545b47a1dab79332ffcc333ef365fc5f4094eae3e120d6f47e464736f6c634300060c0033
Deployed Bytecode Sourcemap
10031:5995:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10718:41;;;:::i;:::-;;;;;;;;;;;;;;;;;;;14115:1157;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14031:72;;;:::i;:::-;;15354:261;;;:::i;:::-;;;;;;;;;;;;;;;;;;;13098:921;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;12210:99;;;:::i;:::-;;;;;;;;;;;;;;;;;;;10928:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;10532:41;;;:::i;:::-;;;;;;;;;;;;;;;;;;;11034:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;15790:233;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;10395:38;;;:::i;:::-;;;;;;;;;;;;;;;;;;;9062:20;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;11626:572;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;10265:81;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;12327:759;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;10440:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;10873:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;10772:35;;;:::i;:::-;;;;;;;;;;;;;;;;;;;10621:42;;;:::i;:::-;;;;;;;;;;;;;;;;;;;9681:178;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;10979:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;10718:41;10751:8;10718:41;:::o;14115:1157::-;14222:24;14262:31;14309:35;14359:26;14420:8;14407:10;:21;14398:31;;;;;;14450:11;14464:24;14477:10;14464:8;:12;;:24;;;;:::i;:::-;14450:38;;14499:25;14541:6;14527:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14499:49;;14559:32;14605:6;14594:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14559:53;;14623:36;14673:6;14662:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14623:57;;14691:27;14732:6;14721:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14691:48;;14765:6;14774:10;14765:19;;14760:408;14790:8;14786:1;:12;14760:408;;;14829:14;14846:13;14857:1;14846:7;:10;;:13;;;;:::i;:::-;14829:30;;14874:14;14891:17;14897:10;14891:1;:5;;:17;;;;:::i;:::-;14874:34;;14945:6;14923:8;14932:9;14923:19;;;;;;;;;;;;;:28;;;;;;;;;;;14998:11;:19;15010:6;14998:19;;;;;;;;;;;;;;;;14966:18;14985:9;14966:29;;;;;;;;;;;;;:51;;;;;15068:15;:23;15084:6;15068:23;;;;;;;;;;;;;;;;15032:22;15055:9;15032:33;;;;;;;;;;;;;:59;;;;;15133:15;:23;15149:6;15133:23;;;;;;;;;;;;;;;;15106:13;15120:9;15106:24;;;;;;;;;;;;;:50;;;;;14760:408;;14804:8;14810:1;14804;:5;;:8;;;;:::i;:::-;14800:12;;14760:408;;;;15196:8;15206:18;15226:22;15250:13;15188:76;;;;;;;;;;;;;14115:1157;;;;;;;:::o;14031:72::-;14070:25;14084:10;14070:13;:25::i;:::-;14031:72::o;15354:261::-;15409:4;15334:7;15430:19;;:42;15426:83;;15496:1;15489:8;;;;15426:83;15519:14;15536:44;15560:19;;15334:7;15536:23;;:44;;;;:::i;:::-;15519:61;;15598:9;15591:16;;;15354:261;;:::o;13098:921::-;13196:16;13165:15;:27;13181:10;13165:27;;;;;;;;;;;;;;;;:47;;13157:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10751:8;13272:32;13280:11;:23;13292:10;13280:23;;;;;;;;;;;;;;;;13272:3;:7;;:32;;;;:::i;:::-;:44;13264:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13394:25;13408:10;13394:13;:25::i;:::-;13440:8;13451:47;13494:3;13451:38;10661:2;13451:16;:20;;:38;;;;:::i;:::-;:42;;:47;;;;:::i;:::-;13440:58;;13509:19;13531:25;13552:3;13531:16;:20;;:25;;;;:::i;:::-;13509:47;;10304:42;13585:28;;;13614:5;;;;;;;;;;13621:3;13585:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13577:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10304:42;13681:28;;;13710:10;13722:14;13681:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13673:95;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13819:49;13851:16;13819:15;:27;13835:10;13819:27;;;;;;;;;;;;;;;;:31;;:49;;;;:::i;:::-;13789:15;:27;13805:10;13789:27;;;;;;;;;;;;;;;:79;;;;13893:28;13910:10;13893:7;:16;;:28;;;;:::i;:::-;:64;;;;;13956:1;13925:15;:27;13941:10;13925:27;;;;;;;;;;;;;;;;:32;13893:64;13889:123;;;13974:26;13989:10;13974:7;:14;;:26;;;;:::i;:::-;;13889:123;13098:921;;;:::o;12210:99::-;12261:4;12285:16;:7;:14;:16::i;:::-;12278:23;;12210:99;:::o;10928:44::-;;;;;;;;;;;;;;;;;:::o;10532:41::-;10570:3;10532:41;:::o;11034:50::-;;;;;;;;;;;;;;;;;:::o;15790:233::-;9492:5;;;;;;;;;;9478:19;;:10;:19;;;9470:28;;;;;;10304:42:::1;15906:26;;:10;:26;;;;15897:67;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;15981:10;15975:26;;;16002:3;16007:7;15975:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;15790:233:::0;;;:::o;10395:38::-;10429:4;10395:38;:::o;9062:20::-;;;;;;;;;;;;:::o;11626:572::-;11688:4;11710:25;11727:7;11710;:16;;:25;;;;:::i;:::-;11705:40;;11744:1;11737:8;;;;11705:40;11788:1;11760:15;:24;11776:7;11760:24;;;;;;;;;;;;;;;;:29;11756:43;;;11798:1;11791:8;;;;11756:43;11812:13;11828:33;11836:15;:24;11852:7;11836:24;;;;;;;;;;;;;;;;11828:3;:7;;:33;;;;:::i;:::-;11812:49;;11872:17;11892:15;:24;11908:7;11892:24;;;;;;;;;;;;;;;;11872:44;;11937:16;11956:191;12143:3;11956:152;10478:8;11956:102;12049:8;11956:58;10429:4;11956:12;:46;;:58;;;;:::i;:::-;:92;;:102;;;;:::i;:::-;:136;;:152;;;;:::i;:::-;:186;;:191;;;;:::i;:::-;11937:210;;12179:11;12172:18;;;;;11626:572;;;;:::o;10265:81::-;10304:42;10265:81;:::o;12327:759::-;12406:1;12390:13;:17;12382:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10304:42;12454:32;;;12487:10;12507:4;12514:13;12454:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12446:115;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12582:25;12596:10;12582:13;:25::i;:::-;12628:8;12639:42;12677:3;12639:33;10570:3;12639:13;:17;;:33;;;;:::i;:::-;:37;;:42;;;;:::i;:::-;12628:53;;12692:19;12714:22;12732:3;12714:13;:17;;:22;;;;:::i;:::-;12692:44;;10304:42;12755:28;;;12784:5;;;;;;;;;;12791:3;12755:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12747:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12882:47;12914:14;12882:15;:27;12898:10;12882:27;;;;;;;;;;;;;;;;:31;;:47;;;;:::i;:::-;12852:15;:27;12868:10;12852:27;;;;;;;;;;;;;;;:77;;;;12955:28;12972:10;12955:7;:16;;:28;;;;:::i;:::-;12950:129;;13000:23;13012:10;13000:7;:11;;:23;;;;:::i;:::-;;13064:3;13038:11;:23;13050:10;13038:23;;;;;;;;;;;;;;;:29;;;;12950:129;12327:759;;;:::o;10440:46::-;10478:8;10440:46;:::o;10873:48::-;;;;;;;;;;;;;;;;;:::o;10772:35::-;;;;:::o;10621:42::-;10661:2;10621:42;:::o;9681:178::-;9492:5;;;;;;;;;;9478:19;;:10;:19;;;9470:28;;;;;;9778:1:::1;9758:22;;:8;:22;;;;9750:31;;;::::0;::::1;;9821:8;9793:37;;9814:5;::::0;::::1;;;;;;;;9793:37;;;;;;;;;;;;9845:8;9837:5;::::0;:16:::1;;;;;;;;;;;;;;;;;;9681:178:::0;:::o;10979:48::-;;;;;;;;;;;;;;;;;:::o;616:113::-;674:7;702:1;697;:6;;690:14;;;;722:1;718;:5;711:12;;616:113;;;;:::o;7082:149::-;7156:7;7199:22;7203:3;:10;;7215:5;7199:3;:22::i;:::-;7191:31;;7176:47;;7082:149;;;;:::o;735:133::-;793:7;809:9;825:1;821;:5;809:17;;845:1;840;:6;;833:14;;;;861:1;854:8;;;735:133;;;;:::o;11097:517::-;11156:16;11175:23;11190:7;11175:14;:23::i;:::-;11156:42;;11227:1;11213:11;:15;11209:357;;;10304:42;11253:28;;;11282:7;11291:11;11253:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11245:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11378:43;11409:11;11378:17;:26;11396:7;11378:26;;;;;;;;;;;;;;;;:30;;:43;;;;:::i;:::-;11349:17;:26;11367:7;11349:26;;;;;;;;;;;;;;;:72;;;;11458:36;11482:11;11458:19;;:23;;:36;;;;:::i;:::-;11436:19;:58;;;;11514:40;11533:7;11542:11;11514:40;;;;;;;;;;;;;;;;;;;;;;;;;;11209:357;11603:3;11576:15;:24;11592:7;11576:24;;;;;;;;;;;;;;;:30;;;;11097:517;;:::o;187:147::-;245:7;261:9;277:1;273;:5;261:17;;297:1;292;:6;:20;;;;311:1;306;302;:5;;;;;;:10;292:20;285:28;;;;327:1;320:8;;;187:147;;;;:::o;340:270::-;398:7;489:9;505:1;501;:5;;;;;;489:17;;603:1;596:8;;;340:270;;;;:::o;6377:158::-;6457:4;6481:46;6491:3;:10;;6519:5;6511:14;;6503:23;;6481:9;:46::i;:::-;6474:53;;6377:158;;;;:::o;6142:149::-;6215:4;6239:44;6247:3;:10;;6275:5;6267:14;;6259:23;;6239:7;:44::i;:::-;6232:51;;6142:149;;;;:::o;6621:117::-;6684:7;6711:19;6719:3;:10;;6711:7;:19::i;:::-;6704:26;;6621:117;;;:::o;5823:143::-;5893:4;5917:41;5922:3;:10;;5950:5;5942:14;;5934:23;;5917:4;:41::i;:::-;5910:48;;5823:143;;;;:::o;5365:204::-;5432:7;5481:5;5460:3;:11;;:18;;;;:26;5452:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5543:3;:11;;5555:5;5543:18;;;;;;;;;;;;;;;;5536:25;;5365:204;;;;:::o;4697:129::-;4770:4;4817:1;4794:3;:12;;:19;4807:5;4794:19;;;;;;;;;;;;:24;;4787:31;;4697:129;;;;:::o;3067:1544::-;3133:4;3251:18;3272:3;:12;;:19;3285:5;3272:19;;;;;;;;;;;;3251:40;;3322:1;3308:10;:15;3304:1300;;3670:21;3707:1;3694:10;:14;3670:38;;3723:17;3764:1;3743:3;:11;;:18;;;;:22;3723:42;;4010:17;4030:3;:11;;4042:9;4030:22;;;;;;;;;;;;;;;;4010:42;;4176:9;4147:3;:11;;4159:13;4147:26;;;;;;;;;;;;;;;:38;;;;4295:1;4279:13;:17;4253:3;:12;;:23;4266:9;4253:23;;;;;;;;;;;:43;;;;4405:3;:11;;:17;;;;;;;;;;;;;;;;;;;;;;;;4500:3;:12;;:19;4513:5;4500:19;;;;;;;;;;;4493:26;;;4543:4;4536:11;;;;;;;;3304:1300;4587:5;4580:12;;;3067:1544;;;;;:::o;4912:109::-;4968:7;4995:3;:11;;:18;;;;4988:25;;4912:109;;;:::o;2477:414::-;2540:4;2562:21;2572:3;2577:5;2562:9;:21::i;:::-;2557:327;;2600:3;:11;;2617:5;2600:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2783:3;:11;;:18;;;;2761:3;:12;;:19;2774:5;2761:19;;;;;;;;;;;:40;;;;2823:4;2816:11;;;;2557:327;2867:5;2860:12;;2477:414;;;;;:::o
Swarm Source
ipfs://3f490b4a15bc6545b47a1dab79332ffcc333ef365fc5f4094eae3e120d6f47e4
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $23.38 | 0.00669585 | $0.1565 |
Loading...
Loading
[ 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.