Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 169 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Convert | 14773230 | 934 days ago | IN | 0 ETH | 0.00462708 | ||||
Convert | 14773074 | 934 days ago | IN | 0 ETH | 0.00266783 | ||||
Convert | 13316881 | 1161 days ago | IN | 0 ETH | 0.00500755 | ||||
Convert | 13316812 | 1161 days ago | IN | 0 ETH | 0.00690788 | ||||
Convert | 13297500 | 1164 days ago | IN | 0 ETH | 0.00228804 | ||||
Convert | 13270269 | 1169 days ago | IN | 0 ETH | 0.00641181 | ||||
Convert | 13270210 | 1169 days ago | IN | 0 ETH | 0.00445222 | ||||
Convert | 13270210 | 1169 days ago | IN | 0 ETH | 0.00445222 | ||||
Convert | 13267155 | 1169 days ago | IN | 0 ETH | 0.00516715 | ||||
Convert | 13267152 | 1169 days ago | IN | 0 ETH | 0.00505198 | ||||
Convert | 13267024 | 1169 days ago | IN | 0 ETH | 0.00794276 | ||||
Convert | 13266429 | 1169 days ago | IN | 0 ETH | 0.00646637 | ||||
Convert | 13264380 | 1170 days ago | IN | 0 ETH | 0.0048773 | ||||
Convert | 13263046 | 1170 days ago | IN | 0 ETH | 0.01091812 | ||||
Convert | 13262948 | 1170 days ago | IN | 0 ETH | 0.00813049 | ||||
Convert | 13262896 | 1170 days ago | IN | 0 ETH | 0.005477 | ||||
Convert | 13262891 | 1170 days ago | IN | 0 ETH | 0.00551498 | ||||
Convert | 13262226 | 1170 days ago | IN | 0 ETH | 0.0020485 | ||||
Convert | 13262130 | 1170 days ago | IN | 0 ETH | 0.00411955 | ||||
Convert | 13261922 | 1170 days ago | IN | 0 ETH | 0.00298093 | ||||
Convert | 13259539 | 1170 days ago | IN | 0 ETH | 0.00355079 | ||||
Convert | 13259527 | 1170 days ago | IN | 0 ETH | 0.00371999 | ||||
Convert | 13258636 | 1170 days ago | IN | 0 ETH | 0.00662953 | ||||
Convert | 13029187 | 1206 days ago | IN | 0 ETH | 0.00185125 | ||||
Convert | 12974327 | 1214 days ago | IN | 0 ETH | 0.00407781 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
CUPMinter
Compiler Version
v0.8.1+commit.df193b15
Optimization Enabled:
Yes with 999999 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "@openzeppelin/contracts/utils/math/SafeMath.sol"; import "./Approvable.sol"; interface IERC20Short { function burnFrom(address account, uint256 amount) external; function mint(address to, uint256 amount) external; } contract CUPMinter is Approvable { using SafeMath for uint256; address private _cup; mapping(address => bool) private _tokens; struct Proposal { uint256 id; bool applied; address token; uint256 approvalsWeight; } Proposal[] private _proposals; mapping(address => mapping(uint256 => bool)) private _approvalsProposal; event NewProposal(uint256 indexed id, address indexed token); event VoteForProposal(uint256 indexed id, address indexed voter, uint256 voterWeight, uint256 approvalsWeight); event ProposalApplied(uint256 indexed id, address indexed token); constructor(uint256 weight, uint256 threshold) public { _setupApprover(_msgSender(), weight); _setupThreshold(threshold); } function convert(address token, uint256 amount) public { require(_tokens[token], "This token is not allowed to convert"); address msgSender = _msgSender(); IERC20Short(token).burnFrom(msgSender, amount); IERC20Short(cup()).mint(msgSender, amount); } function cup() public view returns (address) { return _cup; } function setCup(address token) public onlyApprover { require(token != address(0), "New CUP address is the zero address"); require(cup() == address(0), "The CUP address is already setted"); _cup = token; } function proposalsCount() public view returns (uint256) { return _proposals.length; } function getProposal(uint256 id) public view returns (Proposal memory) { return _proposals[id]; } function addProposal(address token) public onlyApprover returns (uint256) { uint256 id = _addNewProposal(token); _voteForProposal(id); return id; } function approveProposal(uint256 id) public onlyApprover { require(_proposals[id].applied == false, "Proposal has already applied"); require(_approvalsProposal[_msgSender()][id] == false, "Cannot approve transfer twice"); _voteForProposal(id); } function _addNewProposal(address token) private returns (uint256) { require(token != address(0), "Token is the zero address"); uint256 id = _proposals.length; _proposals.push(Proposal(id, false, token, 0)); emit NewProposal(id, token); return id; } function _voteForProposal(uint256 id) private { address msgSender = _msgSender(); _approvalsProposal[msgSender][id] = true; uint256 approverWeight = getApproverWeight(msgSender); _proposals[id].approvalsWeight = _proposals[id].approvalsWeight.add(approverWeight); emit VoteForProposal(id, msgSender, approverWeight, _proposals[id].approvalsWeight); if (_proposals[id].approvalsWeight >= getThreshold()) _applyProposal(id); } function _applyProposal(uint256 id) private { _tokens[_proposals[id].token] = true; _proposals[id].applied = true; emit ProposalApplied(id, _proposals[id].token); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; //pragma experimental ABIEncoderV2; import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; import "@openzeppelin/contracts/utils/math/SafeMath.sol"; import "@openzeppelin/contracts/utils/Context.sol"; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. */ abstract contract Approvable is Context { using EnumerableSet for EnumerableSet.AddressSet; using SafeMath for uint256; EnumerableSet.AddressSet _approvers; mapping(address => uint256) private _weights; uint256 private _totalWeight; uint256 private _threshold; struct GrantApprover { uint256 id; bool executed; address account; uint256 weight; uint256 approvalsWeight; } GrantApprover[] private _grantApprovers; mapping(address => mapping(uint256 => bool)) private _approvalsGrantApprover; struct ChangeApproverWeight { uint256 id; bool executed; address account; uint256 weight; uint256 approvalsWeight; } ChangeApproverWeight[] private _changeApproverWeights; mapping(address => mapping(uint256 => bool)) private _approvalsChangeApproverWeight; struct RevokeApprover { uint256 id; bool executed; address account; uint256 approvalsWeight; } RevokeApprover[] private _revokeApprovers; mapping(address => mapping(uint256 => bool)) private _approvalsRevokeApprover; struct ChangeThreshold { uint256 id; bool executed; uint256 threshold; uint256 approvalsWeight; } ChangeThreshold[] private _changeThresholds; mapping(address => mapping(uint256 => bool)) private _approvalsChangeThreshold; event NewGrantApprover(uint256 indexed id, address indexed account, uint256 weight); event VoteForGrantApprover(uint256 indexed id, address indexed voter, uint256 voterWeight, uint256 approvalsWeight); event ApproverGranted(address indexed account); event NewChangeApproverWeight(uint256 indexed id, address indexed account, uint256 weight); event VoteForChangeApproverWeight(uint256 indexed id, address indexed voter, uint256 voterWeight, uint256 approvalsWeight); event ApproverWeightChanged(address indexed account, uint256 oldWeight, uint256 newWeight); event NewRevokeApprover(uint256 indexed id, address indexed account); event VoteForRevokeApprover(uint256 indexed id, address indexed voter, uint256 voterWeight, uint256 approvalsWeight); event ApproverRevoked(address indexed account); event NewChangeThreshold(uint256 indexed id, uint256 threshold); event VoteForChangeThreshold(uint256 indexed id, address indexed voter, uint256 voterWeight, uint256 approvalsWeight); event ThresholdChanged(uint256 oldThreshold, uint256 newThreshold); event TotalWeightChanged(uint256 oldTotalWeight, uint256 newTotalWeight); function getThreshold() public view returns (uint256) { return _threshold; } function getTotalWeight() public view returns (uint256) { return _totalWeight; } function getApproversCount() public view returns (uint256) { return _approvers.length(); } function isApprover(address account) public view returns (bool) { return _approvers.contains(account); } function getApprover(uint256 index) public view returns (address) { return _approvers.at(index); } function getApproverWeight(address account) public view returns (uint256) { return _weights[account]; } // GrantApprovers function getGrantApproversCount() public view returns (uint256) { return _grantApprovers.length; } function getGrantApprover(uint256 id) public view returns (GrantApprover memory) { return _grantApprovers[id]; } // ChangeApproverWeights function getChangeApproverWeightsCount() public view returns (uint256) { return _changeApproverWeights.length; } function getChangeApproverWeight(uint256 id) public view returns (ChangeApproverWeight memory) { return _changeApproverWeights[id]; } // RevokeApprovers function getRevokeApproversCount() public view returns (uint256) { return _revokeApprovers.length; } function getRevokeApprover(uint256 id) public view returns (RevokeApprover memory) { return _revokeApprovers[id]; } // ChangeThresholds function getChangeThresholdsCount() public view returns (uint256) { return _changeThresholds.length; } function getChangeThreshold(uint256 id) public view returns (ChangeThreshold memory) { return _changeThresholds[id]; } // Grant Approver function grantApprover(address account, uint256 weight) public onlyApprover returns (uint256) { uint256 id = _addNewGrantApprover(account, weight); _voteForGrantApprover(id); return id; } function _addNewGrantApprover(address account, uint256 weight) private returns (uint256) { require(account != address(0), "Approvable: account is the zero address"); uint256 id = _grantApprovers.length; _grantApprovers.push(GrantApprover(id, false, account, weight, 0)); emit NewGrantApprover(id, account, weight); return id; } function _voteForGrantApprover(uint256 id) private returns (bool) { address msgSender = _msgSender(); _approvalsGrantApprover[msgSender][id] = true; _grantApprovers[id].approvalsWeight = _grantApprovers[id].approvalsWeight.add(_weights[msgSender]); emit VoteForGrantApprover(id, msgSender, _weights[msgSender], _grantApprovers[id].approvalsWeight); return true; } function _grantApprover(address account, uint256 weight) private returns (bool) { if (_approvers.add(account)) { _changeApproverWeight(account, weight); emit ApproverGranted(account); return true; } return false; } function _setupApprover(address account, uint256 weight) internal returns (bool) { return _grantApprover(account, weight); } function approveGrantApprover(uint256 id) public onlyApprover returns (bool) { require(_grantApprovers[id].executed == false, "Approvable: action has already executed"); require(_approvalsGrantApprover[_msgSender()][id] == false, "Approvable: Cannot approve action twice"); return _voteForGrantApprover(id); } function confirmGrantApprover(uint256 id) public returns (bool) { require(_grantApprovers[id].account == _msgSender(), "Approvable: only pending approver"); require(_grantApprovers[id].executed == false, "Approvable: action has already executed"); if (_grantApprovers[id].approvalsWeight >= _threshold) { _grantApprover(_grantApprovers[id].account, _grantApprovers[id].weight); _grantApprovers[id].executed = true; return true; } return false; } // Change Approver Weight function changeApproverWeight(address account, uint256 weight) public onlyApprover returns (uint256) { require(_totalWeight.sub(_weights[account]).add(weight) >= _threshold, "Approvable: The threshold is greater than new totalWeight"); uint256 id = _addNewChangeApproverWeight(account, weight); _voteForChangeApproverWeight(id); return id; } function _addNewChangeApproverWeight(address account, uint256 weight) private returns (uint256) { require(account != address(0), "Approvable: account is the zero address"); uint256 id = _changeApproverWeights.length; _changeApproverWeights.push(ChangeApproverWeight(id, false, account, weight, 0)); emit NewChangeApproverWeight(id, account, weight); return id; } function _voteForChangeApproverWeight(uint256 id) private returns (bool) { address msgSender = _msgSender(); _approvalsChangeApproverWeight[msgSender][id] = true; _changeApproverWeights[id].approvalsWeight = _changeApproverWeights[id].approvalsWeight.add(_weights[msgSender]); emit VoteForChangeApproverWeight(id, msgSender, _weights[msgSender], _changeApproverWeights[id].approvalsWeight); if (_changeApproverWeights[id].approvalsWeight >= _threshold) { _changeApproverWeight(_changeApproverWeights[id].account, _changeApproverWeights[id].weight); _changeApproverWeights[id].executed = true; } return true; } function _changeApproverWeight(address account, uint256 weight) private returns (bool) { uint256 newTotalWeight = _totalWeight.sub(_weights[account]).add(weight); require(newTotalWeight >= _threshold, "Approvable: The threshold is greater than new totalWeight"); _setTotalWeight(newTotalWeight); emit ApproverWeightChanged(account, _weights[account], weight); _weights[account] = weight; return true; } function approveChangeApproverWeight(uint256 id) public onlyApprover returns (bool) { require(_changeApproverWeights[id].executed == false, "Approvable: action has already executed"); require(_approvalsChangeApproverWeight[_msgSender()][id] == false, "Approvable: Cannot approve action twice"); return _voteForChangeApproverWeight(id); } // Revoke Approver function revokeApprover(address account) public onlyApprover returns (uint256) { require(_totalWeight.sub(_weights[account]) >= _threshold, "Approvable: The threshold is greater than new totalWeight"); uint256 id = _addNewRevokeApprover(account); _voteForRevokeApprover(id); return id; } function _addNewRevokeApprover(address account) private returns (uint256) { require(account != address(0), "Approvable: account is the zero address"); uint256 id = _revokeApprovers.length; _revokeApprovers.push(RevokeApprover(id, false, account, 0)); emit NewRevokeApprover(id, account); return id; } function _voteForRevokeApprover(uint256 id) private returns (bool) { address msgSender = _msgSender(); _approvalsRevokeApprover[msgSender][id] = true; _revokeApprovers[id].approvalsWeight = _revokeApprovers[id].approvalsWeight.add(_weights[msgSender]); emit VoteForRevokeApprover(id, msgSender, _weights[msgSender], _revokeApprovers[id].approvalsWeight); if (_revokeApprovers[id].approvalsWeight >= _threshold) { _revokeApprover(_revokeApprovers[id].account); _revokeApprovers[id].executed = true; } return true; } function _revokeApprover(address account) private returns (bool) { uint256 newTotalWeight = _totalWeight.sub(_weights[account]); require(newTotalWeight >= _threshold, "Approvable: The threshold is greater than new totalWeight"); if (_approvers.remove(account)) { _changeApproverWeight(account, 0); emit ApproverRevoked(account); return true; } return false; } function approveRevokeApprover(uint256 id) public onlyApprover returns (bool) { require(_revokeApprovers[id].executed == false, "Approvable: action has already executed"); require(_approvalsRevokeApprover[_msgSender()][id] == false, "Approvable: Cannot approve action twice"); return _voteForRevokeApprover(id); } function renounceApprover(address account) public returns (bool) { require(account == _msgSender(), "Approvable: can only renounce roles for self"); return _revokeApprover(account); } // Change Threshold function changeThreshold(uint256 threshold) public onlyApprover returns (uint256) { require(getTotalWeight() >= threshold, "Approvable: The new threshold is greater than totalWeight"); uint256 id = _addNewChangeThreshold(threshold); _voteForChangeThreshold(id); return id; } function _addNewChangeThreshold(uint256 threshold) private returns (uint256) { uint256 id = _changeThresholds.length; _changeThresholds.push(ChangeThreshold(id, false, threshold, 0)); emit NewChangeThreshold(id, threshold); return id; } function _voteForChangeThreshold(uint256 id) private returns (bool) { address msgSender = _msgSender(); _approvalsChangeThreshold[msgSender][id] = true; _changeThresholds[id].approvalsWeight = _changeThresholds[id].approvalsWeight.add(_weights[msgSender]); emit VoteForChangeThreshold(id, msgSender, _weights[msgSender], _changeThresholds[id].approvalsWeight); if (_changeThresholds[id].approvalsWeight >= _threshold) { _setThreshold(_changeThresholds[id].threshold); _changeThresholds[id].executed = true; } return true; } function approveChangeThreshold(uint256 id) public onlyApprover returns (bool) { require(_changeThresholds[id].executed == false, "Approvable: action has already executed"); require(_approvalsChangeThreshold[_msgSender()][id] == false, "Approvable: Cannot approve action twice"); return _voteForChangeThreshold(id); } function _setThreshold(uint256 threshold) private returns (bool) { require(getTotalWeight() >= threshold, "Approvable: The new threshold is greater than totalWeight"); emit ThresholdChanged(_threshold, threshold); _threshold = threshold; return true; } function _setupThreshold(uint256 threshold) internal returns (bool) { return _setThreshold(threshold); } // Total Weight function _setTotalWeight(uint256 totalWeight) private returns (bool) { emit TotalWeightChanged(_totalWeight, totalWeight); _totalWeight = totalWeight; return true; } modifier onlyApprover() { require(isApprover(_msgSender()), "Approvable: caller is not the approver"); _; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler * now has built in overflow checking. */ 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) { unchecked { 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) { unchecked { 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) { unchecked { // 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) { unchecked { 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) { unchecked { 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) { return a + b; } /** * @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) { 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) { return a * b; } /** * @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. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { 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) { 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) { unchecked { 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. * * 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). * * 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) { unchecked { 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) { unchecked { require(b > 0, errorMessage); return a % b; } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @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.3.0, sets of type `bytes32` (`Bytes32Set`), `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]; } // Bytes32Set struct Bytes32Set { 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(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, 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(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set 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(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, 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(uint160(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(uint160(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(uint160(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(uint160(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)); } }
{ "remappings": [], "optimizer": { "enabled": true, "runs": 999999 }, "evmVersion": "istanbul", "libraries": {}, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"uint256","name":"weight","type":"uint256"},{"internalType":"uint256","name":"threshold","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"ApproverGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"ApproverRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"oldWeight","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newWeight","type":"uint256"}],"name":"ApproverWeightChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"weight","type":"uint256"}],"name":"NewChangeApproverWeight","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"threshold","type":"uint256"}],"name":"NewChangeThreshold","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"weight","type":"uint256"}],"name":"NewGrantApprover","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"token","type":"address"}],"name":"NewProposal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"NewRevokeApprover","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"token","type":"address"}],"name":"ProposalApplied","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldThreshold","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newThreshold","type":"uint256"}],"name":"ThresholdChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldTotalWeight","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newTotalWeight","type":"uint256"}],"name":"TotalWeightChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"voter","type":"address"},{"indexed":false,"internalType":"uint256","name":"voterWeight","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"approvalsWeight","type":"uint256"}],"name":"VoteForChangeApproverWeight","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"voter","type":"address"},{"indexed":false,"internalType":"uint256","name":"voterWeight","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"approvalsWeight","type":"uint256"}],"name":"VoteForChangeThreshold","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"voter","type":"address"},{"indexed":false,"internalType":"uint256","name":"voterWeight","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"approvalsWeight","type":"uint256"}],"name":"VoteForGrantApprover","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"voter","type":"address"},{"indexed":false,"internalType":"uint256","name":"voterWeight","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"approvalsWeight","type":"uint256"}],"name":"VoteForProposal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"voter","type":"address"},{"indexed":false,"internalType":"uint256","name":"voterWeight","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"approvalsWeight","type":"uint256"}],"name":"VoteForRevokeApprover","type":"event"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"addProposal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"approveChangeApproverWeight","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"approveChangeThreshold","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"approveGrantApprover","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"approveProposal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"approveRevokeApprover","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"weight","type":"uint256"}],"name":"changeApproverWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"threshold","type":"uint256"}],"name":"changeThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"confirmGrantApprover","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"convert","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cup","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getApprover","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getApproverWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getApproversCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getChangeApproverWeight","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bool","name":"executed","type":"bool"},{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"weight","type":"uint256"},{"internalType":"uint256","name":"approvalsWeight","type":"uint256"}],"internalType":"struct Approvable.ChangeApproverWeight","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getChangeApproverWeightsCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getChangeThreshold","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bool","name":"executed","type":"bool"},{"internalType":"uint256","name":"threshold","type":"uint256"},{"internalType":"uint256","name":"approvalsWeight","type":"uint256"}],"internalType":"struct Approvable.ChangeThreshold","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getChangeThresholdsCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getGrantApprover","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bool","name":"executed","type":"bool"},{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"weight","type":"uint256"},{"internalType":"uint256","name":"approvalsWeight","type":"uint256"}],"internalType":"struct Approvable.GrantApprover","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getGrantApproversCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getProposal","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bool","name":"applied","type":"bool"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"approvalsWeight","type":"uint256"}],"internalType":"struct CUPMinter.Proposal","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getRevokeApprover","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bool","name":"executed","type":"bool"},{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"approvalsWeight","type":"uint256"}],"internalType":"struct Approvable.RevokeApprover","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRevokeApproversCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"weight","type":"uint256"}],"name":"grantApprover","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isApprover","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proposalsCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"renounceApprover","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"revokeApprover","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"setCup","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040516200409038038062004090833981016040819052620000349162000367565b62000049620000426200005e565b8362000062565b50620000558162000079565b5050506200049e565b3390565b600062000070838362000086565b90505b92915050565b60006200007382620000fc565b6000620000a38360006200017960201b6200169b1790919060201c565b15620000f357620000b5838362000190565b506040516001600160a01b038416907ff0ae6fd40737b5ce1fb2141bbf66a994ae5f330dc1d96514b0318ef4bdacd96790600090a250600162000073565b50600092915050565b6000816200010962000296565b1015620001335760405162461bcd60e51b81526004016200012a90620003e8565b60405180910390fd5b7f3164947cf0f49f08dd0cd80e671535b1e11590d347c55dcaa97ba3c24a96b33a600454836040516200016892919062000445565b60405180910390a150600455600190565b600062000070836001600160a01b0384166200029c565b600080620001ed83620001d960026000886001600160a01b03166001600160a01b0316815260200190815260200160002054600354620002eb60201b620016c41790919060201c565b620002f960201b620016d01790919060201c565b9050600454811015620002145760405162461bcd60e51b81526004016200012a906200038b565b6200021f8162000307565b506001600160a01b038416600081815260026020526040908190205490517f274b4c7584d3dcc2fda481d0e4025e95e7600d781f176fcac8f58098cfdb8b80916200026c91879062000445565b60405180910390a250506001600160a01b0391909116600090815260026020526040902055600190565b60035490565b6000620002aa83836200034f565b620002e25750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000073565b50600062000073565b60006200007082846200046e565b600062000070828462000453565b60007fabbc9adcab7e01850b9dc2a971c755d65c9edf702c4bf6d52c6bbe166407f577600354836040516200033e92919062000445565b60405180910390a150600355600190565b60009081526001919091016020526040902054151590565b600080604083850312156200037a578182fd5b505080516020909101519092909150565b60208082526039908201527f417070726f7661626c653a20546865207468726573686f6c642069732067726560408201527f61746572207468616e206e657720746f74616c57656967687400000000000000606082015260800190565b60208082526039908201527f417070726f7661626c653a20546865206e6577207468726573686f6c6420697360408201527f2067726561746572207468616e20746f74616c57656967687400000000000000606082015260800190565b918252602082015260400190565b6000821982111562000469576200046962000488565b500190565b60008282101562000483576200048362000488565b500390565b634e487b7160e01b600052601160045260246000fd5b613be280620004ae6000396000f3fe608060405234801561001057600080fd5b50600436106101e55760003560e01c806387fd3a431161010f578063a29b9e63116100a2578063c7f758a811610071578063c7f758a8146103ec578063cb7b8ee7146103ff578063dbc44d1814610412578063e75235b814610425576101e5565b8063a29b9e63146103ab578063a9ed484e146103be578063aa8a7eeb146103d1578063aca1638d146103d9576101e5565b80639be99d7e116100de5780639be99d7e146103755780639d9a402d1461037d5780639e9fb6ab14610385578063a02300f614610398576101e5565b806387fd3a43146103325780638d99a6d31461033a5780638dd255a01461034257806398951b5614610362576101e5565b806347c89187116101875780636d218e48116101565780636d218e48146102e65780637157e493146102f95780637f8b35bf1461030c578063839208711461031f576101e5565b806347c891871461028b57806367c6e39c146102ab578063694e80c3146102c05780636c222797146102d3576101e5565b806318d13ef7116101c357806318d13ef7146102305780631b284686146102435780633ad10beb146102635780633f30190f14610278576101e5565b806306aba0e1146101ea5780630a9f46ad146102085780631094ef0e14610210575b600080fd5b6101f261042d565b6040516101ff9190613b37565b60405180910390f35b6101f2610433565b61022361021e3660046134fd565b610439565b6040516101ff91906135e2565b6101f261023e3660046134ba565b610715565b6102566102513660046134fd565b6107e2565b6040516101ff9190613b29565b61026b610889565b6040516101ff919061359b565b6102236102863660046134fd565b6108a5565b61029e6102993660046134fd565b6109f9565b6040516101ff9190613aee565b6102be6102b93660046134d4565b610aaa565b005b6101f26102ce3660046134fd565b610c15565b6102236102e13660046134fd565b610caf565b6102236102f43660046134ba565b610dfd565b61026b6103073660046134fd565b610e09565b61022361031a3660046134ba565b610e15565b6101f261032d3660046134ba565b610e8c565b6101f2610ee5565b6101f2610eeb565b6103556103503660046134fd565b610ef1565b6040516101ff9190613afc565b6102be6103703660046134fd565b610f80565b6101f26110cf565b6101f26110d5565b61029e6103933660046134fd565b6110db565b6101f26103a63660046134d4565b61111d565b6101f26103b93660046134ba565b6111f8565b6101f26103cc3660046134d4565b611220565b6101f261127a565b6102be6103e73660046134ba565b61128b565b6102566103fa3660046134fd565b6113b7565b61022361040d3660046134fd565b6113f9565b6102236104203660046134fd565b611547565b6101f2611695565b60035490565b600f5490565b60006104436116dc565b73ffffffffffffffffffffffffffffffffffffffff1660058381548110610493577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000918252602090912060049091020160010154610100900473ffffffffffffffffffffffffffffffffffffffff1614610502576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f9906139d7565b60405180910390fd5b6005828154811061053c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600091825260209091206001600490920201015460ff161561058a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f990613a91565b600454600583815481106105c7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060040201600301541061070c5761069e6005838154811061061b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906004020160010160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660058481548110610687577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060040201600201546116e0565b506001600583815481106106db577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906004020160010160006101000a81548160ff02191690831515021790555060019050610710565b5060005b919050565b60006107226102f46116dc565b610758576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f9906137f5565b60045473ffffffffffffffffffffffffffffffffffffffff831660009081526002602052604090205460035461078d916116c4565b10156107c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f99061364a565b60006107d08361174e565b90506107db816118f0565b5092915050565b6107ea6133e5565b60098281548110610824577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60009182526020918290206040805160808101825260039390930290910180548352600181015460ff811615159484019490945261010090930473ffffffffffffffffffffffffffffffffffffffff1690820152600290910154606082015292915050565b600d5473ffffffffffffffffffffffffffffffffffffffff1690565b60006108b26102f46116dc565b6108e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f9906137f5565b60098281548110610922577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600091825260209091206001600390920201015460ff1615610970576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f990613a91565b600a600061097c6116dc565b73ffffffffffffffffffffffffffffffffffffffff1681526020808201929092526040908101600090812085825290925290205460ff16156109ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f990613761565b6109f3826118f0565b92915050565b610a01613425565b60078281548110610a3b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60009182526020918290206040805160a08101825260049390930290910180548352600181015460ff811615159484019490945261010090930473ffffffffffffffffffffffffffffffffffffffff169082015260028201546060820152600390910154608082015292915050565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600e602052604090205460ff16610b09576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f990613a34565b6000610b136116dc565b6040517f79cc679000000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff8416906379cc679090610b6a90849086906004016135bc565b600060405180830381600087803b158015610b8457600080fd5b505af1158015610b98573d6000803e3d6000fd5b50505050610ba4610889565b73ffffffffffffffffffffffffffffffffffffffff166340c10f1982846040518363ffffffff1660e01b8152600401610bde9291906135bc565b600060405180830381600087803b158015610bf857600080fd5b505af1158015610c0c573d6000803e3d6000fd5b50505050505050565b6000610c226102f46116dc565b610c58576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f9906137f5565b81610c6161042d565b1015610c99576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f9906138e6565b6000610ca483611c0a565b90506107db81611d45565b6000610cbc6102f46116dc565b610cf2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f9906137f5565b600b8281548110610d2c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600091825260209091206001600490920201015460ff1615610d7a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f990613a91565b600c6000610d866116dc565b73ffffffffffffffffffffffffffffffffffffffff1681526020808201929092526040908101600090812085825290925290205460ff1615610df4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f990613761565b6109f382611d45565b60006109f3818361206d565b60006109f3818361208f565b6000610e1f6116dc565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614610e83576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f9906136a7565b6109f38261209b565b6000610e996102f46116dc565b610ecf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f9906137f5565b6000610eda83612175565b90506109f381612317565b60075490565b60095490565b610ef961346c565b600b8281548110610f33577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600091825260209182902060408051608081018252600490930290910180548352600181015460ff1615159383019390935260028301549082015260039091015460608201529050919050565b610f8b6102f46116dc565b610fc1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f9906137f5565b600f8181548110610ffb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600091825260209091206001600390920201015460ff1615611049576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f990613852565b601060006110556116dc565b73ffffffffffffffffffffffffffffffffffffffff1681526020808201929092526040908101600090812084825290925290205460ff16156110c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f990613943565b6110cc81612317565b50565b60055490565b600b5490565b6110e3613425565b60058281548110610a3b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061112a6102f46116dc565b611160576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f9906137f5565b60045473ffffffffffffffffffffffffffffffffffffffff84166000908152600260205260409020546003546111a191859161119b916116c4565b906116d0565b10156111d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f99061364a565b60006111e58484612518565b90506111f0816126f9565b509392505050565b73ffffffffffffffffffffffffffffffffffffffff1660009081526002602052604090205490565b600061122d6102f46116dc565b611263576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f9906137f5565b600061126f8484612a23565b90506111f081612bf5565b60006112866000612dd7565b905090565b6112966102f46116dc565b6112cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f9906137f5565b73ffffffffffffffffffffffffffffffffffffffff8116611319576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f990613889565b6000611323610889565b73ffffffffffffffffffffffffffffffffffffffff1614611370576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f990613704565b600d80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6113bf6133e5565b600f8281548110610824577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006114066102f46116dc565b61143c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f9906137f5565b60078281548110611476577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600091825260209091206001600490920201015460ff16156114c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f990613a91565b600860006114d06116dc565b73ffffffffffffffffffffffffffffffffffffffff1681526020808201929092526040908101600090812085825290925290205460ff161561153e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f990613761565b6109f3826126f9565b60006115546102f46116dc565b61158a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f9906137f5565b600582815481106115c4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600091825260209091206001600490920201015460ff1615611612576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f990613a91565b6006600061161e6116dc565b73ffffffffffffffffffffffffffffffffffffffff1681526020808201929092526040908101600090812085825290925290205460ff161561168c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f990613761565b6109f382612bf5565b60045490565b60006116bd8373ffffffffffffffffffffffffffffffffffffffff8416612de2565b9392505050565b60006116bd8284613b66565b60006116bd8284613b4e565b3390565b60006116ec818461169b565b15611745576116fb8383612e2c565b5060405173ffffffffffffffffffffffffffffffffffffffff8416907ff0ae6fd40737b5ce1fb2141bbf66a994ae5f330dc1d96514b0318ef4bdacd96790600090a25060016109f3565b50600092915050565b600073ffffffffffffffffffffffffffffffffffffffff821661179d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f99061397a565b600980546040805160808101825282815260006020820181815273ffffffffffffffffffffffffffffffffffffffff80891684860181815260608601858152600189018a559885529451600388027f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af81019190915592517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7b0840180549651909316610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff9115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909716969096171694909417905594517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7b19095019490945590519192909183917f1d39206c8e3cd201c842c81ae9224e33082724e413c304ab6389e5481c46d21b91a392915050565b6000806118fb6116dc565b73ffffffffffffffffffffffffffffffffffffffff81166000818152600a60209081526040808320888452825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055928252600290522054600980549293506119bf928690811061199f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060030201600201546116d090919063ffffffff16565b600984815481106119f9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60009182526020808320600260039093020182019390935573ffffffffffffffffffffffffffffffffffffffff8416808352925260409020546009805486927fac75b371f7933ebd35b9aa47812296e8a5ad91693bb2555cf60936f0534cf4ed92909184908110611a93577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906003020160020154604051611ab3929190613b40565b60405180910390a360045460098481548110611af8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600302016002015410611c0157611b8360098481548110611b4c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906003020160010160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661209b565b50600160098481548110611bc0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000918252602090912060039091020160010180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169115159190911790555b50600192915050565b600b8054604080516080810182528281526000602082018181528284018781526060840183815260018701885596835292517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db9600487029081019190915590517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dba820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001691151591909117905591517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbb83015593517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbc909101555181907f12b35ad5b7e8a6cfd25ea301368d40ad7b8d4524abfd2e8a0dcf85b0188225f890611d37908690613b37565b60405180910390a292915050565b600080611d506116dc565b73ffffffffffffffffffffffffffffffffffffffff81166000818152600c60209081526040808320888452825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055928252600290522054600b8054929350611e149286908110611df4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060040201600301546116d090919063ffffffff16565b600b8481548110611e4e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060040201600301819055508073ffffffffffffffffffffffffffffffffffffffff16837f8e25f3df762afe3a2ae2bc7a362f8b6b3fd3732b211b6f8dcc7567030598e84b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600b8781548110611f16577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906004020160030154604051611f36929190613b40565b60405180910390a3600454600b8481548110611f7b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600402016003015410611c0157611fe6600b8481548110611fcf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906004020160020154612f3d565b506001600b8481548110612023577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60009182526020909120600490910201600190810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016921515929092179091559392505050565b60006116bd8373ffffffffffffffffffffffffffffffffffffffff8416612fc4565b60006116bd8383612fdc565b73ffffffffffffffffffffffffffffffffffffffff811660009081526002602052604081205460035482916120d091906116c4565b905060045481101561210e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f99061364a565b612119600084613068565b1561174557612129836000612e2c565b5060405173ffffffffffffffffffffffffffffffffffffffff8416907f3bb10f2bb5b56b26e5c3344dbe0cb08aedbcc3ab4c6efe07c6af4a363110788390600090a26001915050610710565b600073ffffffffffffffffffffffffffffffffffffffff82166121c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f9906137be565b600f80546040805160808101825282815260006020820181815273ffffffffffffffffffffffffffffffffffffffff80891684860181815260608601858152600189018a559885529451600388027f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac80281019190915592517f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac803840180549651909316610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff9115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909716969096171694909417905594517f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac8049095019490945590519192909183917f4a1fe915f1472308c702e9bb92fd3d7d9de39fc6398bff038bb57e4ccf63430e91a392915050565b60006123216116dc565b73ffffffffffffffffffffffffffffffffffffffff81166000908152601060209081526040808320868452909152812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055909150612386826111f8565b90506123c681600f858154811061199f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600f8481548110612400577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060030201600201819055508173ffffffffffffffffffffffffffffffffffffffff16837ff84c1372869777505c71774bb13e519483c806d164119279b870b77a3067208483600f8781548110612489577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060030201600201546040516124a9929190613b40565b60405180910390a36124b9611695565b600f84815481106124f3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600302016002015410612513576125138361308a565b505050565b600073ffffffffffffffffffffffffffffffffffffffff8316612567576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f99061397a565b600780546040805160a08101825282815260006020820181815273ffffffffffffffffffffffffffffffffffffffff808a16848601818152606086018b81526080870186815260018a018b55999095529451600488027fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68881019190915592517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c689840180549651909316610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff9115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909716969096171694909417905590517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68a82015593517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68b909401939093555190919082907f8f7bb76b3d1bab37c77523a5b9974c3aee5a37a2bf6c08e66e0919ee368dd002906126ea908790613b37565b60405180910390a39392505050565b6000806127046116dc565b73ffffffffffffffffffffffffffffffffffffffff81166000818152600860209081526040808320888452825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055928252600290522054600780549293506127a89286908110611df4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600784815481106127e2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060040201600301819055508073ffffffffffffffffffffffffffffffffffffffff16837f6a9e925d29b44724a0de11438eee7bc3deffcaa056b13621dc04b09716ddb03e600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600787815481106128aa577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060040201600301546040516128ca929190613b40565b60405180910390a36004546007848154811061290f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600402016003015410611c01576129e660078481548110612963577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906004020160010160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600785815481106129cf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906004020160020154612e2c565b50600160078481548110612023577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600073ffffffffffffffffffffffffffffffffffffffff8316612a72576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f99061397a565b600580546040805160a08101825282815260006020820181815273ffffffffffffffffffffffffffffffffffffffff808a16848601818152606086018b81526080870186815260018a018b55999095529451600488027f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db081019190915592517f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db1840180549651909316610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff9115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909716969096171694909417905590517f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db282015593517f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db3909401939093555190919082907f0ead3127d96e64c9483bc260b66e9876d37a97afded6cce4e15f0f9829a7b6e9906126ea908790613b37565b600080612c006116dc565b73ffffffffffffffffffffffffffffffffffffffff81166000818152600660209081526040808320888452825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905592825260029052205460058054929350612ca49286908110611df4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60058481548110612cde577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060040201600301819055508073ffffffffffffffffffffffffffffffffffffffff16837f09d269f611287207293fe95f8af8920c0aff4c3405977e0df82085459ca2905b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460058781548110612da6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906004020160030154604051612dc6929190613b40565b60405180910390a350600192915050565b60006109f382613233565b6000612dee8383612fc4565b612e24575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556109f3565b5060006109f3565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600260205260408120546003548291612e6791859161119b91906116c4565b9050600454811015612ea5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f99061364a565b612eae81613237565b5073ffffffffffffffffffffffffffffffffffffffff8416600081815260026020526040908190205490517f274b4c7584d3dcc2fda481d0e4025e95e7600d781f176fcac8f58098cfdb8b8091612f06918790613b40565b60405180910390a2505073ffffffffffffffffffffffffffffffffffffffff91909116600090815260026020526040902055600190565b600081612f4861042d565b1015612f80576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f9906138e6565b7f3164947cf0f49f08dd0cd80e671535b1e11590d347c55dcaa97ba3c24a96b33a60045483604051612fb3929190613b40565b60405180910390a150600455600190565b60009081526001919091016020526040902054151590565b81546000908210613019576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f9906135ed565b826000018281548110613055577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905092915050565b60006116bd8373ffffffffffffffffffffffffffffffffffffffff841661327d565b6001600e6000600f84815481106130ca577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60009182526020808320600160039093020182015473ffffffffffffffffffffffffffffffffffffffff6101009091041684528301939093526040909101902080549215157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090931692909217909155600f805483908110613175577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906003020160010160006101000a81548160ff021916908315150217905550600f81815481106131d7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600091825260208220600391909102016001015460405161010090910473ffffffffffffffffffffffffffffffffffffffff169183917ef5ff25e03a2523678350d5f0d11556f67e2501434eeb4e86820428ad42e1f79190a350565b5490565b60007fabbc9adcab7e01850b9dc2a971c755d65c9edf702c4bf6d52c6bbe166407f5776003548360405161326c929190613b40565b60405180910390a150600355600190565b600081815260018301602052604081205480156133db5760006132a1600183613b66565b85549091506000906132b590600190613b66565b905060008660000182815481106132f5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508087600001848154811061333f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600091825260209091200155613356836001613b4e565b6000828152600189016020526040902055865487908061339f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600190038181906000526020600020016000905590558660010160008781526020019081526020016000206000905560019450505050506109f3565b60009150506109f3565b604051806080016040528060008152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600081525090565b6040518060a0016040528060008152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081525090565b60405180608001604052806000815260200160001515815260200160008152602001600081525090565b803573ffffffffffffffffffffffffffffffffffffffff8116811461071057600080fd5b6000602082840312156134cb578081fd5b6116bd82613496565b600080604083850312156134e6578081fd5b6134ef83613496565b946020939093013593505050565b60006020828403121561350e578081fd5b5035919050565b8051825260208101511515602083015273ffffffffffffffffffffffffffffffffffffffff604082015116604083015260608101516060830152608081015160808301525050565b8051825260208101511515602083015273ffffffffffffffffffffffffffffffffffffffff6040820151166040830152606081015160608301525050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b901515815260200190565b60208082526022908201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60408201527f6473000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526039908201527f417070726f7661626c653a20546865207468726573686f6c642069732067726560408201527f61746572207468616e206e657720746f74616c57656967687400000000000000606082015260800190565b6020808252602c908201527f417070726f7661626c653a2063616e206f6e6c792072656e6f756e636520726f60408201527f6c657320666f722073656c660000000000000000000000000000000000000000606082015260800190565b60208082526021908201527f54686520435550206164647265737320697320616c726561647920736574746560408201527f6400000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526027908201527f417070726f7661626c653a2043616e6e6f7420617070726f766520616374696f60408201527f6e20747769636500000000000000000000000000000000000000000000000000606082015260800190565b60208082526019908201527f546f6b656e20697320746865207a65726f206164647265737300000000000000604082015260600190565b60208082526026908201527f417070726f7661626c653a2063616c6c6572206973206e6f742074686520617060408201527f70726f7665720000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601c908201527f50726f706f73616c2068617320616c7265616479206170706c69656400000000604082015260600190565b60208082526023908201527f4e657720435550206164647265737320697320746865207a65726f206164647260408201527f6573730000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526039908201527f417070726f7661626c653a20546865206e6577207468726573686f6c6420697360408201527f2067726561746572207468616e20746f74616c57656967687400000000000000606082015260800190565b6020808252601d908201527f43616e6e6f7420617070726f7665207472616e73666572207477696365000000604082015260600190565b60208082526027908201527f417070726f7661626c653a206163636f756e7420697320746865207a65726f2060408201527f6164647265737300000000000000000000000000000000000000000000000000606082015260800190565b60208082526021908201527f417070726f7661626c653a206f6e6c792070656e64696e6720617070726f766560408201527f7200000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526024908201527f5468697320746f6b656e206973206e6f7420616c6c6f77656420746f20636f6e60408201527f7665727400000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526027908201527f417070726f7661626c653a20616374696f6e2068617320616c7265616479206560408201527f7865637574656400000000000000000000000000000000000000000000000000606082015260800190565b60a081016109f38284613515565b81518152602080830151151590820152604080830151908201526060918201519181019190915260800190565b608081016109f3828461355d565b90815260200190565b918252602082015260400190565b60008219821115613b6157613b61613b7d565b500190565b600082821015613b7857613b78613b7d565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfea2646970667358221220547b4051cbaf50078487bc3dc382cc3c0a4f0254123564829ab43016abac67e664736f6c6343000801003300000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101e55760003560e01c806387fd3a431161010f578063a29b9e63116100a2578063c7f758a811610071578063c7f758a8146103ec578063cb7b8ee7146103ff578063dbc44d1814610412578063e75235b814610425576101e5565b8063a29b9e63146103ab578063a9ed484e146103be578063aa8a7eeb146103d1578063aca1638d146103d9576101e5565b80639be99d7e116100de5780639be99d7e146103755780639d9a402d1461037d5780639e9fb6ab14610385578063a02300f614610398576101e5565b806387fd3a43146103325780638d99a6d31461033a5780638dd255a01461034257806398951b5614610362576101e5565b806347c89187116101875780636d218e48116101565780636d218e48146102e65780637157e493146102f95780637f8b35bf1461030c578063839208711461031f576101e5565b806347c891871461028b57806367c6e39c146102ab578063694e80c3146102c05780636c222797146102d3576101e5565b806318d13ef7116101c357806318d13ef7146102305780631b284686146102435780633ad10beb146102635780633f30190f14610278576101e5565b806306aba0e1146101ea5780630a9f46ad146102085780631094ef0e14610210575b600080fd5b6101f261042d565b6040516101ff9190613b37565b60405180910390f35b6101f2610433565b61022361021e3660046134fd565b610439565b6040516101ff91906135e2565b6101f261023e3660046134ba565b610715565b6102566102513660046134fd565b6107e2565b6040516101ff9190613b29565b61026b610889565b6040516101ff919061359b565b6102236102863660046134fd565b6108a5565b61029e6102993660046134fd565b6109f9565b6040516101ff9190613aee565b6102be6102b93660046134d4565b610aaa565b005b6101f26102ce3660046134fd565b610c15565b6102236102e13660046134fd565b610caf565b6102236102f43660046134ba565b610dfd565b61026b6103073660046134fd565b610e09565b61022361031a3660046134ba565b610e15565b6101f261032d3660046134ba565b610e8c565b6101f2610ee5565b6101f2610eeb565b6103556103503660046134fd565b610ef1565b6040516101ff9190613afc565b6102be6103703660046134fd565b610f80565b6101f26110cf565b6101f26110d5565b61029e6103933660046134fd565b6110db565b6101f26103a63660046134d4565b61111d565b6101f26103b93660046134ba565b6111f8565b6101f26103cc3660046134d4565b611220565b6101f261127a565b6102be6103e73660046134ba565b61128b565b6102566103fa3660046134fd565b6113b7565b61022361040d3660046134fd565b6113f9565b6102236104203660046134fd565b611547565b6101f2611695565b60035490565b600f5490565b60006104436116dc565b73ffffffffffffffffffffffffffffffffffffffff1660058381548110610493577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000918252602090912060049091020160010154610100900473ffffffffffffffffffffffffffffffffffffffff1614610502576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f9906139d7565b60405180910390fd5b6005828154811061053c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600091825260209091206001600490920201015460ff161561058a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f990613a91565b600454600583815481106105c7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060040201600301541061070c5761069e6005838154811061061b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906004020160010160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660058481548110610687577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060040201600201546116e0565b506001600583815481106106db577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906004020160010160006101000a81548160ff02191690831515021790555060019050610710565b5060005b919050565b60006107226102f46116dc565b610758576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f9906137f5565b60045473ffffffffffffffffffffffffffffffffffffffff831660009081526002602052604090205460035461078d916116c4565b10156107c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f99061364a565b60006107d08361174e565b90506107db816118f0565b5092915050565b6107ea6133e5565b60098281548110610824577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60009182526020918290206040805160808101825260039390930290910180548352600181015460ff811615159484019490945261010090930473ffffffffffffffffffffffffffffffffffffffff1690820152600290910154606082015292915050565b600d5473ffffffffffffffffffffffffffffffffffffffff1690565b60006108b26102f46116dc565b6108e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f9906137f5565b60098281548110610922577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600091825260209091206001600390920201015460ff1615610970576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f990613a91565b600a600061097c6116dc565b73ffffffffffffffffffffffffffffffffffffffff1681526020808201929092526040908101600090812085825290925290205460ff16156109ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f990613761565b6109f3826118f0565b92915050565b610a01613425565b60078281548110610a3b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60009182526020918290206040805160a08101825260049390930290910180548352600181015460ff811615159484019490945261010090930473ffffffffffffffffffffffffffffffffffffffff169082015260028201546060820152600390910154608082015292915050565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600e602052604090205460ff16610b09576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f990613a34565b6000610b136116dc565b6040517f79cc679000000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff8416906379cc679090610b6a90849086906004016135bc565b600060405180830381600087803b158015610b8457600080fd5b505af1158015610b98573d6000803e3d6000fd5b50505050610ba4610889565b73ffffffffffffffffffffffffffffffffffffffff166340c10f1982846040518363ffffffff1660e01b8152600401610bde9291906135bc565b600060405180830381600087803b158015610bf857600080fd5b505af1158015610c0c573d6000803e3d6000fd5b50505050505050565b6000610c226102f46116dc565b610c58576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f9906137f5565b81610c6161042d565b1015610c99576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f9906138e6565b6000610ca483611c0a565b90506107db81611d45565b6000610cbc6102f46116dc565b610cf2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f9906137f5565b600b8281548110610d2c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600091825260209091206001600490920201015460ff1615610d7a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f990613a91565b600c6000610d866116dc565b73ffffffffffffffffffffffffffffffffffffffff1681526020808201929092526040908101600090812085825290925290205460ff1615610df4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f990613761565b6109f382611d45565b60006109f3818361206d565b60006109f3818361208f565b6000610e1f6116dc565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614610e83576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f9906136a7565b6109f38261209b565b6000610e996102f46116dc565b610ecf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f9906137f5565b6000610eda83612175565b90506109f381612317565b60075490565b60095490565b610ef961346c565b600b8281548110610f33577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600091825260209182902060408051608081018252600490930290910180548352600181015460ff1615159383019390935260028301549082015260039091015460608201529050919050565b610f8b6102f46116dc565b610fc1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f9906137f5565b600f8181548110610ffb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600091825260209091206001600390920201015460ff1615611049576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f990613852565b601060006110556116dc565b73ffffffffffffffffffffffffffffffffffffffff1681526020808201929092526040908101600090812084825290925290205460ff16156110c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f990613943565b6110cc81612317565b50565b60055490565b600b5490565b6110e3613425565b60058281548110610a3b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061112a6102f46116dc565b611160576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f9906137f5565b60045473ffffffffffffffffffffffffffffffffffffffff84166000908152600260205260409020546003546111a191859161119b916116c4565b906116d0565b10156111d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f99061364a565b60006111e58484612518565b90506111f0816126f9565b509392505050565b73ffffffffffffffffffffffffffffffffffffffff1660009081526002602052604090205490565b600061122d6102f46116dc565b611263576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f9906137f5565b600061126f8484612a23565b90506111f081612bf5565b60006112866000612dd7565b905090565b6112966102f46116dc565b6112cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f9906137f5565b73ffffffffffffffffffffffffffffffffffffffff8116611319576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f990613889565b6000611323610889565b73ffffffffffffffffffffffffffffffffffffffff1614611370576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f990613704565b600d80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6113bf6133e5565b600f8281548110610824577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006114066102f46116dc565b61143c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f9906137f5565b60078281548110611476577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600091825260209091206001600490920201015460ff16156114c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f990613a91565b600860006114d06116dc565b73ffffffffffffffffffffffffffffffffffffffff1681526020808201929092526040908101600090812085825290925290205460ff161561153e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f990613761565b6109f3826126f9565b60006115546102f46116dc565b61158a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f9906137f5565b600582815481106115c4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600091825260209091206001600490920201015460ff1615611612576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f990613a91565b6006600061161e6116dc565b73ffffffffffffffffffffffffffffffffffffffff1681526020808201929092526040908101600090812085825290925290205460ff161561168c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f990613761565b6109f382612bf5565b60045490565b60006116bd8373ffffffffffffffffffffffffffffffffffffffff8416612de2565b9392505050565b60006116bd8284613b66565b60006116bd8284613b4e565b3390565b60006116ec818461169b565b15611745576116fb8383612e2c565b5060405173ffffffffffffffffffffffffffffffffffffffff8416907ff0ae6fd40737b5ce1fb2141bbf66a994ae5f330dc1d96514b0318ef4bdacd96790600090a25060016109f3565b50600092915050565b600073ffffffffffffffffffffffffffffffffffffffff821661179d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f99061397a565b600980546040805160808101825282815260006020820181815273ffffffffffffffffffffffffffffffffffffffff80891684860181815260608601858152600189018a559885529451600388027f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af81019190915592517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7b0840180549651909316610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff9115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909716969096171694909417905594517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7b19095019490945590519192909183917f1d39206c8e3cd201c842c81ae9224e33082724e413c304ab6389e5481c46d21b91a392915050565b6000806118fb6116dc565b73ffffffffffffffffffffffffffffffffffffffff81166000818152600a60209081526040808320888452825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055928252600290522054600980549293506119bf928690811061199f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060030201600201546116d090919063ffffffff16565b600984815481106119f9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60009182526020808320600260039093020182019390935573ffffffffffffffffffffffffffffffffffffffff8416808352925260409020546009805486927fac75b371f7933ebd35b9aa47812296e8a5ad91693bb2555cf60936f0534cf4ed92909184908110611a93577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906003020160020154604051611ab3929190613b40565b60405180910390a360045460098481548110611af8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600302016002015410611c0157611b8360098481548110611b4c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906003020160010160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661209b565b50600160098481548110611bc0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000918252602090912060039091020160010180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169115159190911790555b50600192915050565b600b8054604080516080810182528281526000602082018181528284018781526060840183815260018701885596835292517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db9600487029081019190915590517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dba820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001691151591909117905591517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbb83015593517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbc909101555181907f12b35ad5b7e8a6cfd25ea301368d40ad7b8d4524abfd2e8a0dcf85b0188225f890611d37908690613b37565b60405180910390a292915050565b600080611d506116dc565b73ffffffffffffffffffffffffffffffffffffffff81166000818152600c60209081526040808320888452825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055928252600290522054600b8054929350611e149286908110611df4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060040201600301546116d090919063ffffffff16565b600b8481548110611e4e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060040201600301819055508073ffffffffffffffffffffffffffffffffffffffff16837f8e25f3df762afe3a2ae2bc7a362f8b6b3fd3732b211b6f8dcc7567030598e84b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600b8781548110611f16577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906004020160030154604051611f36929190613b40565b60405180910390a3600454600b8481548110611f7b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600402016003015410611c0157611fe6600b8481548110611fcf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906004020160020154612f3d565b506001600b8481548110612023577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60009182526020909120600490910201600190810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016921515929092179091559392505050565b60006116bd8373ffffffffffffffffffffffffffffffffffffffff8416612fc4565b60006116bd8383612fdc565b73ffffffffffffffffffffffffffffffffffffffff811660009081526002602052604081205460035482916120d091906116c4565b905060045481101561210e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f99061364a565b612119600084613068565b1561174557612129836000612e2c565b5060405173ffffffffffffffffffffffffffffffffffffffff8416907f3bb10f2bb5b56b26e5c3344dbe0cb08aedbcc3ab4c6efe07c6af4a363110788390600090a26001915050610710565b600073ffffffffffffffffffffffffffffffffffffffff82166121c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f9906137be565b600f80546040805160808101825282815260006020820181815273ffffffffffffffffffffffffffffffffffffffff80891684860181815260608601858152600189018a559885529451600388027f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac80281019190915592517f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac803840180549651909316610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff9115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909716969096171694909417905594517f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac8049095019490945590519192909183917f4a1fe915f1472308c702e9bb92fd3d7d9de39fc6398bff038bb57e4ccf63430e91a392915050565b60006123216116dc565b73ffffffffffffffffffffffffffffffffffffffff81166000908152601060209081526040808320868452909152812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055909150612386826111f8565b90506123c681600f858154811061199f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600f8481548110612400577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060030201600201819055508173ffffffffffffffffffffffffffffffffffffffff16837ff84c1372869777505c71774bb13e519483c806d164119279b870b77a3067208483600f8781548110612489577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060030201600201546040516124a9929190613b40565b60405180910390a36124b9611695565b600f84815481106124f3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600302016002015410612513576125138361308a565b505050565b600073ffffffffffffffffffffffffffffffffffffffff8316612567576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f99061397a565b600780546040805160a08101825282815260006020820181815273ffffffffffffffffffffffffffffffffffffffff808a16848601818152606086018b81526080870186815260018a018b55999095529451600488027fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68881019190915592517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c689840180549651909316610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff9115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909716969096171694909417905590517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68a82015593517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68b909401939093555190919082907f8f7bb76b3d1bab37c77523a5b9974c3aee5a37a2bf6c08e66e0919ee368dd002906126ea908790613b37565b60405180910390a39392505050565b6000806127046116dc565b73ffffffffffffffffffffffffffffffffffffffff81166000818152600860209081526040808320888452825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055928252600290522054600780549293506127a89286908110611df4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600784815481106127e2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060040201600301819055508073ffffffffffffffffffffffffffffffffffffffff16837f6a9e925d29b44724a0de11438eee7bc3deffcaa056b13621dc04b09716ddb03e600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600787815481106128aa577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060040201600301546040516128ca929190613b40565b60405180910390a36004546007848154811061290f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600402016003015410611c01576129e660078481548110612963577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906004020160010160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600785815481106129cf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906004020160020154612e2c565b50600160078481548110612023577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600073ffffffffffffffffffffffffffffffffffffffff8316612a72576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f99061397a565b600580546040805160a08101825282815260006020820181815273ffffffffffffffffffffffffffffffffffffffff808a16848601818152606086018b81526080870186815260018a018b55999095529451600488027f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db081019190915592517f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db1840180549651909316610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff9115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909716969096171694909417905590517f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db282015593517f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db3909401939093555190919082907f0ead3127d96e64c9483bc260b66e9876d37a97afded6cce4e15f0f9829a7b6e9906126ea908790613b37565b600080612c006116dc565b73ffffffffffffffffffffffffffffffffffffffff81166000818152600660209081526040808320888452825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905592825260029052205460058054929350612ca49286908110611df4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60058481548110612cde577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060040201600301819055508073ffffffffffffffffffffffffffffffffffffffff16837f09d269f611287207293fe95f8af8920c0aff4c3405977e0df82085459ca2905b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460058781548110612da6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906004020160030154604051612dc6929190613b40565b60405180910390a350600192915050565b60006109f382613233565b6000612dee8383612fc4565b612e24575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556109f3565b5060006109f3565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600260205260408120546003548291612e6791859161119b91906116c4565b9050600454811015612ea5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f99061364a565b612eae81613237565b5073ffffffffffffffffffffffffffffffffffffffff8416600081815260026020526040908190205490517f274b4c7584d3dcc2fda481d0e4025e95e7600d781f176fcac8f58098cfdb8b8091612f06918790613b40565b60405180910390a2505073ffffffffffffffffffffffffffffffffffffffff91909116600090815260026020526040902055600190565b600081612f4861042d565b1015612f80576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f9906138e6565b7f3164947cf0f49f08dd0cd80e671535b1e11590d347c55dcaa97ba3c24a96b33a60045483604051612fb3929190613b40565b60405180910390a150600455600190565b60009081526001919091016020526040902054151590565b81546000908210613019576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f9906135ed565b826000018281548110613055577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905092915050565b60006116bd8373ffffffffffffffffffffffffffffffffffffffff841661327d565b6001600e6000600f84815481106130ca577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60009182526020808320600160039093020182015473ffffffffffffffffffffffffffffffffffffffff6101009091041684528301939093526040909101902080549215157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090931692909217909155600f805483908110613175577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906003020160010160006101000a81548160ff021916908315150217905550600f81815481106131d7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600091825260208220600391909102016001015460405161010090910473ffffffffffffffffffffffffffffffffffffffff169183917ef5ff25e03a2523678350d5f0d11556f67e2501434eeb4e86820428ad42e1f79190a350565b5490565b60007fabbc9adcab7e01850b9dc2a971c755d65c9edf702c4bf6d52c6bbe166407f5776003548360405161326c929190613b40565b60405180910390a150600355600190565b600081815260018301602052604081205480156133db5760006132a1600183613b66565b85549091506000906132b590600190613b66565b905060008660000182815481106132f5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508087600001848154811061333f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600091825260209091200155613356836001613b4e565b6000828152600189016020526040902055865487908061339f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600190038181906000526020600020016000905590558660010160008781526020019081526020016000206000905560019450505050506109f3565b60009150506109f3565b604051806080016040528060008152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600081525090565b6040518060a0016040528060008152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081525090565b60405180608001604052806000815260200160001515815260200160008152602001600081525090565b803573ffffffffffffffffffffffffffffffffffffffff8116811461071057600080fd5b6000602082840312156134cb578081fd5b6116bd82613496565b600080604083850312156134e6578081fd5b6134ef83613496565b946020939093013593505050565b60006020828403121561350e578081fd5b5035919050565b8051825260208101511515602083015273ffffffffffffffffffffffffffffffffffffffff604082015116604083015260608101516060830152608081015160808301525050565b8051825260208101511515602083015273ffffffffffffffffffffffffffffffffffffffff6040820151166040830152606081015160608301525050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b901515815260200190565b60208082526022908201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60408201527f6473000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526039908201527f417070726f7661626c653a20546865207468726573686f6c642069732067726560408201527f61746572207468616e206e657720746f74616c57656967687400000000000000606082015260800190565b6020808252602c908201527f417070726f7661626c653a2063616e206f6e6c792072656e6f756e636520726f60408201527f6c657320666f722073656c660000000000000000000000000000000000000000606082015260800190565b60208082526021908201527f54686520435550206164647265737320697320616c726561647920736574746560408201527f6400000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526027908201527f417070726f7661626c653a2043616e6e6f7420617070726f766520616374696f60408201527f6e20747769636500000000000000000000000000000000000000000000000000606082015260800190565b60208082526019908201527f546f6b656e20697320746865207a65726f206164647265737300000000000000604082015260600190565b60208082526026908201527f417070726f7661626c653a2063616c6c6572206973206e6f742074686520617060408201527f70726f7665720000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601c908201527f50726f706f73616c2068617320616c7265616479206170706c69656400000000604082015260600190565b60208082526023908201527f4e657720435550206164647265737320697320746865207a65726f206164647260408201527f6573730000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526039908201527f417070726f7661626c653a20546865206e6577207468726573686f6c6420697360408201527f2067726561746572207468616e20746f74616c57656967687400000000000000606082015260800190565b6020808252601d908201527f43616e6e6f7420617070726f7665207472616e73666572207477696365000000604082015260600190565b60208082526027908201527f417070726f7661626c653a206163636f756e7420697320746865207a65726f2060408201527f6164647265737300000000000000000000000000000000000000000000000000606082015260800190565b60208082526021908201527f417070726f7661626c653a206f6e6c792070656e64696e6720617070726f766560408201527f7200000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526024908201527f5468697320746f6b656e206973206e6f7420616c6c6f77656420746f20636f6e60408201527f7665727400000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526027908201527f417070726f7661626c653a20616374696f6e2068617320616c7265616479206560408201527f7865637574656400000000000000000000000000000000000000000000000000606082015260800190565b60a081016109f38284613515565b81518152602080830151151590820152604080830151908201526060918201519181019190915260800190565b608081016109f3828461355d565b90815260200190565b918252602082015260400190565b60008219821115613b6157613b61613b7d565b500190565b600082821015613b7857613b78613b7d565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfea2646970667358221220547b4051cbaf50078487bc3dc382cc3c0a4f0254123564829ab43016abac67e664736f6c63430008010033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001
-----Decoded View---------------
Arg [0] : weight (uint256): 1
Arg [1] : threshold (uint256): 1
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000001
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 29 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.