Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 978 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Burn B Token | 21514402 | 4 days ago | IN | 0 ETH | 0.00074939 | ||||
Burn B Token | 21473205 | 10 days ago | IN | 0 ETH | 0.00233933 | ||||
Burn B Token | 21473017 | 10 days ago | IN | 0 ETH | 0.00285191 | ||||
Burn B Token | 21441309 | 14 days ago | IN | 0 ETH | 0.00180106 | ||||
Burn B Token | 21419350 | 18 days ago | IN | 0 ETH | 0.0023475 | ||||
Burn B Token | 21336670 | 29 days ago | IN | 0 ETH | 0.0051211 | ||||
Burn B Token | 21196954 | 49 days ago | IN | 0 ETH | 0.00296354 | ||||
Burn B Token | 21186218 | 50 days ago | IN | 0 ETH | 0.00654828 | ||||
Burn B Token | 21176152 | 51 days ago | IN | 0 ETH | 0.00469149 | ||||
Redeem | 21106814 | 61 days ago | IN | 0 ETH | 0.00072338 | ||||
Pledge | 21099670 | 62 days ago | IN | 0 ETH | 0.00069724 | ||||
Burn B Token | 21027194 | 72 days ago | IN | 0 ETH | 0.00221088 | ||||
Redeem | 21027119 | 72 days ago | IN | 0 ETH | 0.00223329 | ||||
Burn B Token | 20667020 | 123 days ago | IN | 0 ETH | 0.00037993 | ||||
Redeem | 20583331 | 134 days ago | IN | 0 ETH | 0.00020952 | ||||
Burn B Token | 20465907 | 151 days ago | IN | 0 ETH | 0.00080205 | ||||
Redeem | 20315344 | 172 days ago | IN | 0 ETH | 0.00135063 | ||||
Pledge | 19858783 | 235 days ago | IN | 0 ETH | 0.00041227 | ||||
Pledge | 19858758 | 235 days ago | IN | 0 ETH | 0.00072894 | ||||
Burn B Token | 19827241 | 240 days ago | IN | 0 ETH | 0.00097184 | ||||
Burn B Token | 19789369 | 245 days ago | IN | 0 ETH | 0.00105168 | ||||
Burn B Token | 19726184 | 254 days ago | IN | 0 ETH | 0.00353092 | ||||
Burn B Token | 19706995 | 257 days ago | IN | 0 ETH | 0.00118452 | ||||
Burn B Token | 19699587 | 258 days ago | IN | 0 ETH | 0.00155436 | ||||
Burn B Token | 19666443 | 262 days ago | IN | 0 ETH | 0.00196276 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
BoringDAOV2
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.6.12; import "./interface/IBoringDAO.sol"; import "@openzeppelin/contracts/access/AccessControl.sol"; import "@openzeppelin/contracts/utils/Pausable.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/math/SafeMath.sol"; import "./interface/IAddressResolver.sol"; import "./interface/ITunnel.sol"; import "./ParamBook.sol"; import "./lib/SafeDecimalMath.sol"; import "./interface/IMintProposal.sol"; import "./interface/IOracle.sol"; import "./interface/ITrusteeFeePool.sol"; /** @notice The BoringDAO contract is the entrance to the entire system, providing the functions of pledge BOR, redeem BOR, mint bBTC, and destroy bBTC */ contract BoringDAOV2 is AccessControl, IBoringDAO, Pausable { using SafeDecimalMath for uint256; using SafeMath for uint256; uint256 public amountByMint=12250000e18; bytes32 public constant MONITOR_ROLE = "MONITOR_ROLE "; bytes32 public constant GOV_ROLE = "GOV_ROLE"; // bor => boring bytes32 public constant BOR = "BORING"; bytes32 public constant PARAM_BOOK = "ParamBook"; bytes32 public constant MINT_PROPOSAL = "MintProposal"; bytes32 public constant ORACLE = "Oracle"; bytes32 public constant TRUSTEE_FEE_POOL = "TrusteeFeePool"; bytes32 public constant OTOKEN = "oToken"; bytes32 public constant TUNNEL_MINT_FEE_RATE = "mint_fee"; bytes32 public constant NETWORK_FEE = "network_fee"; IAddressResolver public addrReso; // tunnels ITunnelV2[] public tunnels; uint256 public mintCap; address public mine; // The user may not provide the Ethereum address or the format of the Ethereum address is wrong when mint. // this is for a transaction mapping(string=>bool) public approveFlag; uint public reductionAmount=100000000e18; mapping(bytes32=>uint) public minMintAmount; constructor(IAddressResolver _addrReso, uint _mintCap, address _mine) public { // set up resolver addrReso = _addrReso; mintCap = _mintCap; mine = _mine; _setupRole(DEFAULT_ADMIN_ROLE, msg.sender); _setupRole(MONITOR_ROLE, msg.sender); } function tunnel(bytes32 tunnelKey) internal view returns (ITunnel) { return ITunnel(addrReso.key2address(tunnelKey)); } function otoken(bytes32 _tunnelKey) internal view returns (IERC20) { return IERC20(addrReso.requireKKAddrs(_tunnelKey, OTOKEN, "oToken not exist")); } function borERC20() internal view returns (IERC20) { return IERC20(addrReso.key2address(BOR)); } function paramBook() internal view returns (ParamBook) { return ParamBook(addrReso.key2address(PARAM_BOOK)); } function mintProposal() internal view returns (IMintProposal) { return IMintProposal(addrReso.key2address(MINT_PROPOSAL)); } function oracle() internal view returns (IOracle) { return IOracle(addrReso.key2address(ORACLE)); } // trustee fee pool key function trusteeFeePool(bytes32 _tunnelKey) internal view returns (ITrusteeFeePool) { return ITrusteeFeePool(addrReso.requireKKAddrs(_tunnelKey, TRUSTEE_FEE_POOL, "BoringDAO::TrusteeFeePool is address(0)")); } // trustee fee pool key => tfpk function addTrustee(address account, bytes32 _tunnelKey) public onlyAdmin { _setupRole(_tunnelKey, account); trusteeFeePool(_tunnelKey).enter(account); } function addTrustees(address[] memory accounts, bytes32 _tunnelKey) external onlyAdmin{ for (uint256 i = 0; i < accounts.length; i++) { addTrustee(accounts[i], _tunnelKey); } } function removeTrustee(address account, bytes32 _tunnelKey) public onlyAdmin { revokeRole(_tunnelKey, account); trusteeFeePool(_tunnelKey).exit(account); } function setMine(address _mine) public onlyAdmin { mine = _mine; } function setMintCap(uint256 amount) public onlyAdmin { mintCap = amount; } function setMinMintAmount(bytes32 _tunnelKey, uint _amount) public onlyAdmin { minMintAmount[_tunnelKey] = _amount; } /** @notice tunnelKey is byte32("symbol"), eg. bytes32("BTC") */ function pledge(bytes32 _tunnelKey, uint256 _amount) public override whenNotPaused whenContractExist(_tunnelKey) { require( borERC20().allowance(msg.sender, address(this)) >= _amount, "not allow enough boring" ); borERC20().transferFrom( msg.sender, address(tunnel(_tunnelKey)), _amount ); tunnel(_tunnelKey).pledge(msg.sender, _amount); } /** @notice redeem bor from tunnel */ function redeem(bytes32 _tunnelKey, uint256 _amount) public override whenNotPaused whenContractExist(_tunnelKey) { tunnel(_tunnelKey).redeem(msg.sender, _amount); } function burnBToken(bytes32 _tunnelKey, uint256 amount, string memory assetAddress) public override whenNotPaused whenContractExist(_tunnelKey) whenTunnelNotPause(_tunnelKey) { tunnel(_tunnelKey).burn(msg.sender, amount, assetAddress); } /** @notice trustee will call the function to approve mint bToken @param _txid the transaction id of bitcoin @param _amount the amount to mint, 1BTC = 1bBTC = 1*10**18 weibBTC @param to mint to the address */ function approveMint( bytes32 _tunnelKey, string memory _txid, uint256 _amount, address to, string memory assetAddress ) public override whenNotPaused whenTunnelNotPause(_tunnelKey) onlyTrustee(_tunnelKey) shouldMoreThan(_tunnelKey, _amount){ if(to == address(0)) { if (approveFlag[_txid] == false) { approveFlag[_txid] = true; emit ETHAddressNotExist(_tunnelKey, _txid, _amount, to, msg.sender, assetAddress); } return; } uint256 trusteeCount = getRoleMemberCount(_tunnelKey); bool shouldMint = mintProposal().approve( _tunnelKey, _txid, _amount, to, msg.sender, trusteeCount ); if (!shouldMint) { return; } uint256 canIssueAmount = tunnel(_tunnelKey).canIssueAmount(); if (_amount.add(otoken(_tunnelKey).totalSupply()) > canIssueAmount) { emit NotEnoughPledgeValue( _tunnelKey, _txid, _amount, to, msg.sender, assetAddress ); return; } // fee calculate in tunnel tunnel(_tunnelKey).issue(to, _amount); uint borMintAmount = calculateMintBORAmount(_tunnelKey, _amount); if(borMintAmount != 0) { amountByMint = amountByMint.add(borMintAmount); borERC20().transferFrom(mine, to, borMintAmount); } emit ApproveMintSuccess(_tunnelKey, _txid, _amount, to, assetAddress); } function calculateMintBORAmount(bytes32 _tunnelKey, uint _amount) public view returns (uint) { if (amountByMint >= mintCap || _amount == 0) { return 0; } uint256 assetPrice = oracle().getPrice(_tunnelKey); uint256 borPrice = oracle().getPrice(BOR); uint256 reductionTimes = amountByMint.div(reductionAmount); uint256 mintFeeRate = paramBook().params2( _tunnelKey, TUNNEL_MINT_FEE_RATE ); // for decimal calculation, so mul 1e18 uint256 reductionFactor = (4**reductionTimes).mul(1e18).div(5**reductionTimes); uint networkFee = paramBook().params2(_tunnelKey, NETWORK_FEE); uint baseAmount = _amount.multiplyDecimalRound(mintFeeRate).mul(2).add(networkFee); uint borAmount = assetPrice.multiplyDecimalRound(baseAmount).multiplyDecimalRound(reductionFactor).divideDecimalRound(borPrice); if (amountByMint.add(borAmount) >= mintCap) { borAmount = mintCap.sub(amountByMint); } return borAmount; } function pause() public onlyMonitor{ _pause(); } function unpause() public onlyMonitor{ _unpause(); } modifier onlyTrustee(bytes32 _tunnelKey) { require(hasRole(_tunnelKey, msg.sender), "Caller is not trustee"); _; } modifier onlyAdmin { require(hasRole(DEFAULT_ADMIN_ROLE, msg.sender), "BoringDAO::caller is not admin"); _; } modifier onlyMonitor { require( hasRole(MONITOR_ROLE, msg.sender), "Caller is not monitor" ); _; } modifier whenContractExist(bytes32 key) { require( addrReso.key2address(key) != address(0), "Contract not exist" ); _; } modifier whenTunnelNotPause(bytes32 _tunnelKey) { address tunnelAddress = addrReso.requireAndKey2Address(_tunnelKey, "tunnel not exist"); require(IPaused(tunnelAddress).paused() == false, "tunnel is paused"); _; } modifier shouldMoreThan(bytes32 _tunnelKey, uint amount) { require(amount >= minMintAmount[_tunnelKey], "Mint Amount should more than min amount"); _; } event NotEnoughPledgeValue( bytes32 indexed _tunnelKey, string indexed _txid, uint256 _amount, address to, address trustee, string assetAddress ); event ApproveMintSuccess( bytes32 _tunnelKey, string _txid, uint256 _amount, address to, string assetAddress ); event ETHAddressNotExist( bytes32 _tunnelKey, string _txid, uint256 _amount, address to, address trustee, string assetAddress ); event NotEnoughMintAmount( bytes32 indexed _tunnelKey, string indexed _txid, uint256 _amount, address to, address trustee, string assetAddress ); } interface IPaused { function paused() external view returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.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 GSN 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 payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { 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.6.0; import "../utils/EnumerableSet.sol"; import "../utils/Address.sol"; import "../GSN/Context.sol"; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context { using EnumerableSet for EnumerableSet.AddressSet; using Address for address; struct RoleData { EnumerableSet.AddressSet members; bytes32 adminRole; } mapping (bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view returns (bool) { return _roles[role].members.contains(account); } /** * @dev Returns the number of accounts that have `role`. Can be used * together with {getRoleMember} to enumerate all bearers of a role. */ function getRoleMemberCount(bytes32 role) public view returns (uint256) { return _roles[role].members.length(); } /** * @dev Returns one of the accounts that have `role`. `index` must be a * value between 0 and {getRoleMemberCount}, non-inclusive. * * Role bearers are not sorted in any particular way, and their ordering may * change at any point. * * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure * you perform all queries on the same block. See the following * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] * for more information. */ function getRoleMember(bytes32 role, uint256 index) public view returns (address) { return _roles[role].members.at(index); } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) public virtual { require(hasRole(_roles[role].adminRole, _msgSender()), "AccessControl: sender must be an admin to grant"); _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) public virtual { require(hasRole(_roles[role].adminRole, _msgSender()), "AccessControl: sender must be an admin to revoke"); _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) public virtual { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { emit RoleAdminChanged(role, _roles[role].adminRole, adminRole); _roles[role].adminRole = adminRole; } function _grantRole(bytes32 role, address account) private { if (_roles[role].members.add(account)) { emit RoleGranted(role, account, _msgSender()); } } function _revokeRole(bytes32 role, address account) private { if (_roles[role].members.remove(account)) { emit RoleRevoked(role, account, _msgSender()); } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.0; import "../GSN/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @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) { // 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 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts 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 mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message 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, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.2; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return _functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); return _functionCallWithValue(target, data, value, errorMessage); } function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) { require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: weiValue }(data); if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.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.0.0, only sets of type `address` (`AddressSet`) and `uint256` * (`UintSet`) are supported. */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping (bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { require(set._values.length > index, "EnumerableSet: index out of bounds"); return set._values[index]; } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(value))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(value))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(value))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint256(_at(set._inner, index))); } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.0; import "../GSN/Context.sol"; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor () internal { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!_paused, "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(_paused, "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.12; import "@openzeppelin/contracts/access/Ownable.sol"; contract ParamBook is Ownable { mapping(bytes32 => uint256) public params; mapping(bytes32 => mapping(bytes32 => uint256)) public params2; function setParams(bytes32 name, uint256 value) public onlyOwner { params[name] = value; } function setMultiParams(bytes32[] memory names, uint[] memory values) public onlyOwner { require(names.length == values.length, "ParamBook::setMultiParams:param length not match"); for (uint i=0; i < names.length; i++ ) { params[names[i]] = values[i]; } } function setParams2( bytes32 name1, bytes32 name2, uint256 value ) public onlyOwner { params2[name1][name2] = value; } function setMultiParams2(bytes32[] memory names1, bytes32[] memory names2, uint[] memory values) public onlyOwner { require(names1.length == names2.length, "ParamBook::setMultiParams2:param length not match"); require(names1.length == values.length, "ParamBook::setMultiParams2:param length not match"); for(uint i=0; i < names1.length; i++) { params2[names1[i]][names2[i]] = values[i]; } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.12; interface IAddressResolver { function key2address(bytes32 key) external view returns(address); function address2key(address addr) external view returns(bytes32); function requireAndKey2Address(bytes32 name, string calldata reason) external view returns(address); function setAddress(bytes32 key, address addr) external; function setMultiAddress(bytes32[] memory keys, address[] memory addrs) external; function setKkAddr(bytes32 k1, bytes32 k2, address addr) external; function setMultiKKAddr(bytes32[] memory k1s, bytes32[] memory k2s, address[] memory addrs) external; function kk2addr(bytes32 k1, bytes32 k2) external view returns(address); function requireKKAddrs(bytes32 k1, bytes32 k2, string calldata reason) external view returns(address); }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.12; interface IBoringDAO { // function openTunnel(bytes32 tunnelKey) external; function pledge(bytes32 tunnelKey, uint _amount) external; function redeem(bytes32 tunnelKey, uint _amount) external; function approveMint(bytes32 tunnelKey, string memory _txid, uint _amount, address account, string memory assetAddress) external; function burnBToken(bytes32 _tunnelKey, uint _amount, string memory assetAddress) external; // function getTrustee(uint index) external view returns(address); // function getTrusteeCount() external view returns(uint); }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.12; interface IMintProposal { function approve( bytes32 _tunnelKey, string memory _txid, uint256 _amount, address to, address trustee, uint256 trusteeCount ) external returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.12; interface IOracle { function setPrice(bytes32 _symbol, uint _price) external; function getPrice(bytes32 _symbol) external view returns (uint); }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.12; interface ITrusteeFeePool { function exit(address account) external; function enter(address account) external; function notifyReward(uint reward) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.12; interface ITunnel { function pledge(address account, uint amount) external; function redeem(address account, uint amount) external; function issue(address account, uint amount) external; function burn(address account, uint amount, string memory assetAddress) external; function totalValuePledge() external view returns(uint); function canIssueAmount() external view returns(uint); function oTokenKey() external view returns(bytes32); } interface ITunnelV2 { function pledge(address account, uint amount) external; function redeem(address account, uint amount) external; function issue(address account, uint amount) external; function burn(address account, uint amount, string memory assetAddress) external; function totalValuePledge() external view returns(uint); function canIssueAmount() external view returns(uint); } interface ITunnelTVL { function totalTVL() external view returns(uint); }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.8; // Libraries import "@openzeppelin/contracts/math/SafeMath.sol"; // https://docs.synthetix.io/contracts/SafeDecimalMath library SafeDecimalMath { using SafeMath for uint; /* Number of decimal places in the representations. */ uint8 public constant decimals = 18; uint8 public constant highPrecisionDecimals = 27; /* The number representing 1.0. */ uint public constant UNIT = 10**uint(decimals); /* The number representing 1.0 for higher fidelity numbers. */ uint public constant PRECISE_UNIT = 10**uint(highPrecisionDecimals); uint private constant UNIT_TO_HIGH_PRECISION_CONVERSION_FACTOR = 10**uint(highPrecisionDecimals - decimals); /** * @return Provides an interface to UNIT. */ function unit() external pure returns (uint) { return UNIT; } /** * @return Provides an interface to PRECISE_UNIT. */ function preciseUnit() external pure returns (uint) { return PRECISE_UNIT; } /** * @return The result of multiplying x and y, interpreting the operands as fixed-point * decimals. * * @dev A unit factor is divided out after the product of x and y is evaluated, * so that product must be less than 2**256. As this is an integer division, * the internal division always rounds down. This helps save on gas. Rounding * is more expensive on gas. */ function multiplyDecimal(uint x, uint y) internal pure returns (uint) { /* Divide by UNIT to remove the extra factor introduced by the product. */ return x.mul(y) / UNIT; } /** * @return The result of safely multiplying x and y, interpreting the operands * as fixed-point decimals of the specified precision unit. * * @dev The operands should be in the form of a the specified unit factor which will be * divided out after the product of x and y is evaluated, so that product must be * less than 2**256. * * Unlike multiplyDecimal, this function rounds the result to the nearest increment. * Rounding is useful when you need to retain fidelity for small decimal numbers * (eg. small fractions or percentages). */ function _multiplyDecimalRound( uint x, uint y, uint precisionUnit ) private pure returns (uint) { /* Divide by UNIT to remove the extra factor introduced by the product. */ uint quotientTimesTen = x.mul(y) / (precisionUnit / 10); if (quotientTimesTen % 10 >= 5) { quotientTimesTen += 10; } return quotientTimesTen / 10; } /** * @return The result of safely multiplying x and y, interpreting the operands * as fixed-point decimals of a precise unit. * * @dev The operands should be in the precise unit factor which will be * divided out after the product of x and y is evaluated, so that product must be * less than 2**256. * * Unlike multiplyDecimal, this function rounds the result to the nearest increment. * Rounding is useful when you need to retain fidelity for small decimal numbers * (eg. small fractions or percentages). */ function multiplyDecimalRoundPrecise(uint x, uint y) internal pure returns (uint) { return _multiplyDecimalRound(x, y, PRECISE_UNIT); } /** * @return The result of safely multiplying x and y, interpreting the operands * as fixed-point decimals of a standard unit. * * @dev The operands should be in the standard unit factor which will be * divided out after the product of x and y is evaluated, so that product must be * less than 2**256. * * Unlike multiplyDecimal, this function rounds the result to the nearest increment. * Rounding is useful when you need to retain fidelity for small decimal numbers * (eg. small fractions or percentages). */ function multiplyDecimalRound(uint x, uint y) internal pure returns (uint) { return _multiplyDecimalRound(x, y, UNIT); } /** * @return The result of safely dividing x and y. The return value is a high * precision decimal. * * @dev y is divided after the product of x and the standard precision unit * is evaluated, so the product of x and UNIT must be less than 2**256. As * this is an integer division, the result is always rounded down. * This helps save on gas. Rounding is more expensive on gas. */ function divideDecimal(uint x, uint y) internal pure returns (uint) { /* Reintroduce the UNIT factor that will be divided out by y. */ return x.mul(UNIT).div(y); } /** * @return The result of safely dividing x and y. The return value is as a rounded * decimal in the precision unit specified in the parameter. * * @dev y is divided after the product of x and the specified precision unit * is evaluated, so the product of x and the specified precision unit must * be less than 2**256. The result is rounded to the nearest increment. */ function _divideDecimalRound( uint x, uint y, uint precisionUnit ) private pure returns (uint) { uint resultTimesTen = x.mul(precisionUnit * 10).div(y); if (resultTimesTen % 10 >= 5) { resultTimesTen += 10; } return resultTimesTen / 10; } /** * @return The result of safely dividing x and y. The return value is as a rounded * standard precision decimal. * * @dev y is divided after the product of x and the standard precision unit * is evaluated, so the product of x and the standard precision unit must * be less than 2**256. The result is rounded to the nearest increment. */ function divideDecimalRound(uint x, uint y) internal pure returns (uint) { return _divideDecimalRound(x, y, UNIT); } /** * @return The result of safely dividing x and y. The return value is as a rounded * high precision decimal. * * @dev y is divided after the product of x and the high precision unit * is evaluated, so the product of x and the high precision unit must * be less than 2**256. The result is rounded to the nearest increment. */ function divideDecimalRoundPrecise(uint x, uint y) internal pure returns (uint) { return _divideDecimalRound(x, y, PRECISE_UNIT); } /** * @dev Convert a standard decimal representation to a high precision one. */ function decimalToPreciseDecimal(uint i) internal pure returns (uint) { return i.mul(UNIT_TO_HIGH_PRECISION_CONVERSION_FACTOR); } /** * @dev Convert a high precision decimal to a standard decimal representation. */ function preciseDecimalToDecimal(uint i) internal pure returns (uint) { uint quotientTimesTen = i / (UNIT_TO_HIGH_PRECISION_CONVERSION_FACTOR / 10); if (quotientTimesTen % 10 >= 5) { quotientTimesTen += 10; } return quotientTimesTen / 10; } }
{ "evmVersion": "istanbul", "libraries": {}, "metadata": { "bytecodeHash": "ipfs", "useLiteralContent": true }, "optimizer": { "enabled": true, "runs": 200 }, "remappings": [], "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IAddressResolver","name":"_addrReso","type":"address"},{"internalType":"uint256","name":"_mintCap","type":"uint256"},{"internalType":"address","name":"_mine","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"_tunnelKey","type":"bytes32"},{"indexed":false,"internalType":"string","name":"_txid","type":"string"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"string","name":"assetAddress","type":"string"}],"name":"ApproveMintSuccess","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"_tunnelKey","type":"bytes32"},{"indexed":false,"internalType":"string","name":"_txid","type":"string"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"address","name":"trustee","type":"address"},{"indexed":false,"internalType":"string","name":"assetAddress","type":"string"}],"name":"ETHAddressNotExist","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"_tunnelKey","type":"bytes32"},{"indexed":true,"internalType":"string","name":"_txid","type":"string"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"address","name":"trustee","type":"address"},{"indexed":false,"internalType":"string","name":"assetAddress","type":"string"}],"name":"NotEnoughMintAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"_tunnelKey","type":"bytes32"},{"indexed":true,"internalType":"string","name":"_txid","type":"string"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"address","name":"trustee","type":"address"},{"indexed":false,"internalType":"string","name":"assetAddress","type":"string"}],"name":"NotEnoughPledgeValue","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"BOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GOV_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_PROPOSAL","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MONITOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NETWORK_FEE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ORACLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OTOKEN","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PARAM_BOOK","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TRUSTEE_FEE_POOL","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TUNNEL_MINT_FEE_RATE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"_tunnelKey","type":"bytes32"}],"name":"addTrustee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"bytes32","name":"_tunnelKey","type":"bytes32"}],"name":"addTrustees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"addrReso","outputs":[{"internalType":"contract IAddressResolver","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"amountByMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"approveFlag","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_tunnelKey","type":"bytes32"},{"internalType":"string","name":"_txid","type":"string"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"string","name":"assetAddress","type":"string"}],"name":"approveMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_tunnelKey","type":"bytes32"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"assetAddress","type":"string"}],"name":"burnBToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_tunnelKey","type":"bytes32"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"calculateMintBORAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"minMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mine","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_tunnelKey","type":"bytes32"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"pledge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_tunnelKey","type":"bytes32"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"redeem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reductionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"_tunnelKey","type":"bytes32"}],"name":"removeTrustee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_tunnelKey","type":"bytes32"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setMinMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_mine","type":"address"}],"name":"setMine","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMintCap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tunnels","outputs":[{"internalType":"contract ITunnelV2","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526a0a2209d4a54e5ef44000006002556a52b7d2dcc80cd2e40000006008553480156200002f57600080fd5b506040516200317c3803806200317c833981810160405260608110156200005557600080fd5b50805160208201516040909201516001805460ff19169055600380546001600160a01b038085166001600160a01b03199283161790925560058590556006805492841692909116919091179055909190620000b2600033620000d7565b620000ce6c026a7a724aa27a92fa927a6229609d1b33620000d7565b505050620001eb565b620000e38282620000e7565b5050565b6000828152602081815260409091206200010c9183906200246f62000160821b17901c565b15620000e3576200011c62000180565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b600062000177836001600160a01b03841662000184565b90505b92915050565b3390565b6000620001928383620001d3565b620001ca575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556200017a565b5060006200017a565b60009081526001919091016020526040902054151590565b612f8180620001fb6000396000f3fe608060405234801561001057600080fd5b50600436106102475760003560e01c8063820392581161013b578063ab282bba116100b8578063d547741f1161007c578063d547741f1461083e578063e34bc6f31461086a578063e9514afa14610872578063f395ae5c1461089e578063f7dd57b0146108ca57610247565b8063ab282bba146107d1578063b429ca20146107f4578063b536818a14610811578063c544df0c14610819578063ca15c8731461082157610247565b806399f4b251116100ff57806399f4b251146106665780639be5c0241461066e578063a217fddf14610676578063a4e7be711461067e578063a5ef26151461072157610247565b806382039258146105e45780638456cb59146106075780639010d07c1461060f57806391d1485414610632578063929a2a081461065e57610247565b80634070a0c9116101c95780635fc5f4de1161018d5780635fc5f4de14610464578063673da1541461046c5780636b3bc2441461048f57806376c71ca1146105d45780637fe4ac44146105dc57610247565b80634070a0c91461040c5780634d9b47e2146104295780635247480c146104315780635c797551146104545780635c975abb1461045c57610247565b80633611cad5116102105780633611cad51461038f57806336568abe146103975780633719bc6a146103c357806338013f02146103fc5780633f4ba83a1461040457610247565b80621333a71461024c5780631c12526514610274578063248a9ca31461032c57806326abdad41461035b5780632f2ff15d14610363575b600080fd5b6102726004803603602081101561026257600080fd5b50356001600160a01b03166108d2565b005b6103186004803603602081101561028a57600080fd5b810190602081018135600160201b8111156102a457600080fd5b8201836020820111156102b657600080fd5b803590602001918460018302840111600160201b831117156102d757600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061093e945050505050565b604080519115158252519081900360200190f35b6103496004803603602081101561034257600080fd5b503561095e565b60408051918252519081900360200190f35b610349610973565b6102726004803603604081101561037957600080fd5b50803590602001356001600160a01b0316610980565b6103496109ec565b610272600480360360408110156103ad57600080fd5b50803590602001356001600160a01b03166109f2565b6103e0600480360360208110156103d957600080fd5b5035610a53565b604080516001600160a01b039092168252519081900360200190f35b610349610a7a565b610272610a87565b6102726004803603602081101561042257600080fd5b5035610af4565b610349610b43565b6102726004803603604081101561044757600080fd5b5080359060200135610b57565b6103e0610bb3565b610318610bc2565b610349610bcb565b6102726004803603604081101561048257600080fd5b5080359060200135610be0565b610272600480360360a08110156104a557600080fd5b81359190810190604081016020820135600160201b8111156104c657600080fd5b8201836020820111156104d857600080fd5b803590602001918460018302840111600160201b831117156104f957600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092958435956001600160a01b0360208701351695919450925060608101915060400135600160201b81111561056057600080fd5b82018360208201111561057257600080fd5b803590602001918460018302840111600160201b8311171561059357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610d75945050505050565b610349611798565b61034961179e565b610272600480360360408110156105fa57600080fd5b50803590602001356117b1565b610272611aa4565b6103e06004803603604081101561062557600080fd5b5080359060200135611b0f565b6103186004803603604081101561064857600080fd5b50803590602001356001600160a01b0316611b30565b610349611b48565b6103e0611b4e565b610349611b5d565b610349611b6f565b6102726004803603604081101561069457600080fd5b810190602081018135600160201b8111156106ae57600080fd5b8201836020820111156106c057600080fd5b803590602001918460208302840111600160201b831117156106e157600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505091359250611b74915050565b6102726004803603606081101561073757600080fd5b813591602081013591810190606081016040820135600160201b81111561075d57600080fd5b82018360208201111561076f57600080fd5b803590602001918460018302840111600160201b8311171561079057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611bf4945050505050565b610349600480360360408110156107e757600080fd5b5080359060200135611f43565b6103496004803603602081101561080a57600080fd5b5035612240565b610349612252565b610349612261565b6103496004803603602081101561083757600080fd5b503561226e565b6102726004803603604081101561085457600080fd5b50803590602001356001600160a01b0316612285565b6103496122de565b6102726004803603604081101561088857600080fd5b506001600160a01b0381351690602001356122ee565b610272600480360360408110156108b457600080fd5b506001600160a01b0381351690602001356123b5565b610349612460565b6108dd600033611b30565b61091c576040805162461bcd60e51b815260206004820152601e6024820152600080516020612efd833981519152604482015290519081900360640190fd5b600680546001600160a01b0319166001600160a01b0392909216919091179055565b805160208183018101805160078252928201919093012091525460ff1681565b60009081526020819052604090206002015490565b65424f52494e4760d01b81565b6000828152602081905260409020600201546109a39061099e612484565b611b30565b6109de5760405162461bcd60e51b815260040180806020018281038252602f815260200180612e2f602f913960400191505060405180910390fd5b6109e88282612488565b5050565b60085481565b6109fa612484565b6001600160a01b0316816001600160a01b031614610a495760405162461bcd60e51b815260040180806020018281038252602f815260200180612f1d602f913960400191505060405180910390fd5b6109e882826124f1565b60048181548110610a6057fe5b6000918252602090912001546001600160a01b0316905081565b654f7261636c6560d01b81565b610aa16c026a7a724aa27a92fa927a6229609d1b33611b30565b610aea576040805162461bcd60e51b815260206004820152601560248201527421b0b63632b91034b9903737ba1036b7b734ba37b960591b604482015290519081900360640190fd5b610af261255a565b565b610aff600033611b30565b610b3e576040805162461bcd60e51b815260206004820152601e6024820152600080516020612efd833981519152604482015290519081900360640190fd5b600555565b6c026a7a724aa27a92fa927a6229609d1b81565b610b62600033611b30565b610ba1576040805162461bcd60e51b815260206004820152601e6024820152600080516020612efd833981519152604482015290519081900360640190fd5b60009182526009602052604090912055565b6003546001600160a01b031681565b60015460ff1690565b6d151c9d5cdd1959519959541bdbdb60921b81565b60015460ff1615610c2b576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6003546040805163130852b360e11b815260048101859052905184926000926001600160a01b0390911691632610a56691602480820192602092909190829003018186803b158015610c7c57600080fd5b505afa158015610c90573d6000803e3d6000fd5b505050506040513d6020811015610ca657600080fd5b50516001600160a01b03161415610cf9576040805162461bcd60e51b815260206004820152601260248201527110dbdb9d1c9858dd081b9bdd08195e1a5cdd60721b604482015290519081900360640190fd5b610d02836125f8565b6001600160a01b0316631e9a695033846040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015610d5857600080fd5b505af1158015610d6c573d6000803e3d6000fd5b50505050505050565b60015460ff1615610dc0576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b60035460408051635da2251d60e11b81526004810188905260248101829052601060448201526f1d1d5b9b995b081b9bdd08195e1a5cdd60821b6064820152905187926000926001600160a01b039091169163bb444a3a91608480820192602092909190829003018186803b158015610e3857600080fd5b505afa158015610e4c573d6000803e3d6000fd5b505050506040513d6020811015610e6257600080fd5b505160408051635c975abb60e01b815290519192506001600160a01b03831691635c975abb91600480820192602092909190829003018186803b158015610ea857600080fd5b505afa158015610ebc573d6000803e3d6000fd5b505050506040513d6020811015610ed257600080fd5b505115610f19576040805162461bcd60e51b815260206004820152601060248201526f1d1d5b9b995b081a5cc81c185d5cd95960821b604482015290519081900360640190fd5b86610f248133611b30565b610f6d576040805162461bcd60e51b815260206004820152601560248201527443616c6c6572206973206e6f74207472757374656560581b604482015290519081900360640190fd5b60008881526009602052604090205488908790811015610fbe5760405162461bcd60e51b8152600401808060200182810382526027815260200180612e856027913960400191505060405180910390fd5b6001600160a01b0387166111ed576007896040518082805190602001908083835b60208310610ffe5780518252601f199092019160209182019101610fdf565b51815160209384036101000a600019018019909216911617905292019485525060405193849003019092205460ff16151591506111e8905057600160078a6040518082805190602001908083835b6020831061106b5780518252601f19909201916020918201910161104c565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060006101000a81548160ff0219169083151502179055507f4bc1997b63d05a364fe5d5d78b4deae806531ad47732917eecde4becb88b86d88a8a8a8a338b6040518087815260200180602001868152602001856001600160a01b03168152602001846001600160a01b0316815260200180602001838103835288818151815260200191508051906020019080838360005b8381101561114757818101518382015260200161112f565b50505050905090810190601f1680156111745780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b838110156111a757818101518382015260200161118f565b50505050905090810190601f1680156111d45780820380516001836020036101000a031916815260200191505b509850505050505050505060405180910390a15b61178c565b60006111f88b61226e565b90506000611204612676565b6001600160a01b031663f99021a28d8d8d8d33886040518763ffffffff1660e01b81526004018087815260200180602001868152602001856001600160a01b03168152602001846001600160a01b03168152602001838152602001828103825287818151815260200191508051906020019080838360005b8381101561129457818101518382015260200161127c565b50505050905090810190601f1680156112c15780820380516001836020036101000a031916815260200191505b50975050505050505050602060405180830381600087803b1580156112e557600080fd5b505af11580156112f9573d6000803e3d6000fd5b505050506040513d602081101561130f57600080fd5b505190508061131f57505061178c565b600061132a8d6125f8565b6001600160a01b0316633c69e26b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561136257600080fd5b505afa158015611376573d6000803e3d6000fd5b505050506040513d602081101561138c57600080fd5b505190508061140861139d8f612701565b6001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156113d557600080fd5b505afa1580156113e9573d6000803e3d6000fd5b505050506040513d60208110156113ff57600080fd5b50518d90612783565b1115611537578b6040518082805190602001908083835b6020831061143e5780518252601f19909201916020918201910161141f565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390208d7ff5ab3d402a4845f0bfb050bdce018a06672cc3a7f4161e69dc114b2c43cd1eab8d8d338e60405180858152602001846001600160a01b03168152602001836001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b838110156114f25781810151838201526020016114da565b50505050905090810190601f16801561151f5780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a350505061178c565b6115408d6125f8565b6001600160a01b031663867904b48b8d6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561159657600080fd5b505af11580156115aa573d6000803e3d6000fd5b5050505060006115ba8e8d611f43565b90508015611666576002546115cf9082612783565b6002556115da6127dd565b600654604080516323b872dd60e01b81526001600160a01b0392831660048201528e8316602482015260448101859052905192909116916323b872dd916064808201926020929091908290030181600087803b15801561163957600080fd5b505af115801561164d573d6000803e3d6000fd5b505050506040513d602081101561166357600080fd5b50505b7fbf356171c0bbd785947f0936380f7bacc26c740c41ee8d68bfbd27a3225dbf458e8e8e8e8e6040518086815260200180602001858152602001846001600160a01b0316815260200180602001838103835287818151815260200191508051906020019080838360005b838110156116e85781810151838201526020016116d0565b50505050905090810190601f1680156117155780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b83811015611748578181015183820152602001611730565b50505050905090810190601f1680156117755780820380516001836020036101000a031916815260200191505b5097505050505050505060405180910390a1505050505b50505050505050505050565b60055481565b6b135a5b9d141c9bdc1bdcd85b60a21b81565b60015460ff16156117fc576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6003546040805163130852b360e11b815260048101859052905184926000926001600160a01b0390911691632610a56691602480820192602092909190829003018186803b15801561184d57600080fd5b505afa158015611861573d6000803e3d6000fd5b505050506040513d602081101561187757600080fd5b50516001600160a01b031614156118ca576040805162461bcd60e51b815260206004820152601260248201527110dbdb9d1c9858dd081b9bdd08195e1a5cdd60721b604482015290519081900360640190fd5b816118d36127dd565b60408051636eb1769f60e11b815233600482015230602482015290516001600160a01b03929092169163dd62ed3e91604480820192602092909190829003018186803b15801561192257600080fd5b505afa158015611936573d6000803e3d6000fd5b505050506040513d602081101561194c57600080fd5b505110156119a1576040805162461bcd60e51b815260206004820152601760248201527f6e6f7420616c6c6f7720656e6f75676820626f72696e67000000000000000000604482015290519081900360640190fd5b6119a96127dd565b6001600160a01b03166323b872dd336119c1866125f8565b856040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050602060405180830381600087803b158015611a1857600080fd5b505af1158015611a2c573d6000803e3d6000fd5b505050506040513d6020811015611a4257600080fd5b50611a4e9050836125f8565b6001600160a01b031663743b345233846040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015610d5857600080fd5b611abe6c026a7a724aa27a92fa927a6229609d1b33611b30565b611b07576040805162461bcd60e51b815260206004820152601560248201527421b0b63632b91034b9903737ba1036b7b734ba37b960591b604482015290519081900360640190fd5b610af2612831565b6000828152602081905260408120611b2790836128b1565b90505b92915050565b6000828152602081905260408120611b2790836128bd565b60025481565b6006546001600160a01b031681565b6a6e6574776f726b5f66656560a81b81565b600081565b611b7f600033611b30565b611bbe576040805162461bcd60e51b815260206004820152601e6024820152600080516020612efd833981519152604482015290519081900360640190fd5b60005b8251811015611bef57611be7838281518110611bd957fe5b6020026020010151836123b5565b600101611bc1565b505050565b60015460ff1615611c3f576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6003546040805163130852b360e11b815260048101869052905185926000926001600160a01b0390911691632610a56691602480820192602092909190829003018186803b158015611c9057600080fd5b505afa158015611ca4573d6000803e3d6000fd5b505050506040513d6020811015611cba57600080fd5b50516001600160a01b03161415611d0d576040805162461bcd60e51b815260206004820152601260248201527110dbdb9d1c9858dd081b9bdd08195e1a5cdd60721b604482015290519081900360640190fd5b60035460408051635da2251d60e11b81526004810187905260248101829052601060448201526f1d1d5b9b995b081b9bdd08195e1a5cdd60821b6064820152905186926000926001600160a01b039091169163bb444a3a91608480820192602092909190829003018186803b158015611d8557600080fd5b505afa158015611d99573d6000803e3d6000fd5b505050506040513d6020811015611daf57600080fd5b505160408051635c975abb60e01b815290519192506001600160a01b03831691635c975abb91600480820192602092909190829003018186803b158015611df557600080fd5b505afa158015611e09573d6000803e3d6000fd5b505050506040513d6020811015611e1f57600080fd5b505115611e66576040805162461bcd60e51b815260206004820152601060248201526f1d1d5b9b995b081a5cc81c185d5cd95960821b604482015290519081900360640190fd5b611e6f866125f8565b6001600160a01b03166315f570dc3387876040518463ffffffff1660e01b815260040180846001600160a01b0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611ee1578181015183820152602001611ec9565b50505050905090810190601f168015611f0e5780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b158015611f2f57600080fd5b505af115801561178c573d6000803e3d6000fd5b6000600554600254101580611f56575081155b15611f6357506000611b2a565b6000611f6d6128d2565b6001600160a01b03166331d98b3f856040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015611fb057600080fd5b505afa158015611fc4573d6000803e3d6000fd5b505050506040513d6020811015611fda57600080fd5b505190506000611fe86128d2565b6001600160a01b03166331d98b3f65424f52494e4760d01b6040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561203457600080fd5b505afa158015612048573d6000803e3d6000fd5b505050506040513d602081101561205e57600080fd5b505160085460025491925060009161207591612926565b90506000612081612968565b6001600160a01b031663171800cc88676d696e745f66656560c01b6040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b1580156120d757600080fd5b505afa1580156120eb573d6000803e3d6000fd5b505050506040513d602081101561210157600080fd5b50519050600061212b600584900a612125600486900a670de0b6b3a76400006129bf565b90612926565b90506000612137612968565b6001600160a01b031663171800cc8a6a6e6574776f726b5f66656560a81b6040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b15801561219057600080fd5b505afa1580156121a4573d6000803e3d6000fd5b505050506040513d60208110156121ba57600080fd5b5051905060006121df826121d960026121d38d89612a18565b906129bf565b90612783565b90506000612201876121fb866121f58c87612a18565b90612a18565b90612a2d565b905060055461221b8260025461278390919063ffffffff16565b106122325760025460055461222f91612a42565b90505b9a9950505050505050505050565b60096020526000908152604090205481565b67474f565f524f4c4560c01b81565b6537aa37b5b2b760d11b81565b6000818152602081905260408120611b2a90612a84565b6000828152602081905260409020600201546122a39061099e612484565b610a495760405162461bcd60e51b8152600401808060200182810382526030815260200180612eac6030913960400191505060405180910390fd5b68506172616d426f6f6b60b81b81565b6122f9600033611b30565b612338576040805162461bcd60e51b815260206004820152601e6024820152600080516020612efd833981519152604482015290519081900360640190fd5b6123428183612285565b61234b81612a8f565b6001600160a01b031663b42652e9836040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b15801561239957600080fd5b505af11580156123ad573d6000803e3d6000fd5b505050505050565b6123c0600033611b30565b6123ff576040805162461bcd60e51b815260206004820152601e6024820152600080516020612efd833981519152604482015290519081900360640190fd5b61240981836109de565b61241281612a8f565b6001600160a01b031663d014c01f836040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b15801561239957600080fd5b676d696e745f66656560c01b81565b6000611b27836001600160a01b038416612b14565b3390565b60008281526020819052604090206124a0908261246f565b156109e8576124ad612484565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b60008281526020819052604090206125099082612b5e565b156109e857612516612484565b6001600160a01b0316816001600160a01b0316837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45050565b60015460ff166125a8576040805162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015290519081900360640190fd5b6001805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6125db612484565b604080516001600160a01b039092168252519081900360200190a1565b6003546040805163130852b360e11b81526004810184905290516000926001600160a01b031691632610a566916024808301926020929190829003018186803b15801561264457600080fd5b505afa158015612658573d6000803e3d6000fd5b505050506040513d602081101561266e57600080fd5b505192915050565b6003546040805163130852b360e11b81526b135a5b9d141c9bdc1bdcd85b60a21b600482015290516000926001600160a01b031691632610a566916024808301926020929190829003018186803b1580156126d057600080fd5b505afa1580156126e4573d6000803e3d6000fd5b505050506040513d60208110156126fa57600080fd5b5051905090565b600354604080516305ad37e160e11b8152600481018490526537aa37b5b2b760d11b602482015260606044820152601060648201526f1bd51bdad95b881b9bdd08195e1a5cdd60821b608482015290516000926001600160a01b031691630b5a6fc29160a4808301926020929190829003018186803b15801561264457600080fd5b600082820183811015611b27576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6003546040805163130852b360e11b815265424f52494e4760d01b600482015290516000926001600160a01b031691632610a566916024808301926020929190829003018186803b1580156126d057600080fd5b60015460ff161561287c576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6001805460ff1916811790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586125db612484565b6000611b278383612b73565b6000611b27836001600160a01b038416612bd7565b6003546040805163130852b360e11b8152654f7261636c6560d01b600482015290516000926001600160a01b031691632610a566916024808301926020929190829003018186803b1580156126d057600080fd5b6000611b2783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612bef565b6003546040805163130852b360e11b815268506172616d426f6f6b60b81b600482015290516000926001600160a01b031691632610a566916024808301926020929190829003018186803b1580156126d057600080fd5b6000826129ce57506000611b2a565b828202828482816129db57fe5b0414611b275760405162461bcd60e51b8152600401808060200182810382526021815260200180612edc6021913960400191505060405180910390fd5b6000611b278383670de0b6b3a7640000612c91565b6000611b278383670de0b6b3a7640000612cc8565b6000611b2783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612ce8565b6000611b2a82612d42565b6003546040516305ad37e160e11b8152600481018381526d151c9d5cdd1959519959541bdbdb60921b602483018190526060604484019081526027606485018190526000956001600160a01b031694630b5a6fc2948894939092909160840190612e5e8239604001935050505060206040518083038186803b15801561264457600080fd5b6000612b208383612bd7565b612b5657508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155611b2a565b506000611b2a565b6000611b27836001600160a01b038416612d46565b81546000908210612bb55760405162461bcd60e51b8152600401808060200182810382526022815260200180612e0d6022913960400191505060405180910390fd5b826000018281548110612bc457fe5b9060005260206000200154905092915050565b60009081526001919091016020526040902054151590565b60008183612c7b5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612c40578181015183820152602001612c28565b50505050905090810190601f168015612c6d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581612c8757fe5b0495945050505050565b600080600a8304612ca286866129bf565b81612ca957fe5b0490506005600a825b0610612cbc57600a015b600a9004949350505050565b600080612cdc8461212587600a87026129bf565b90506005600a82612cb2565b60008184841115612d3a5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315612c40578181015183820152602001612c28565b505050900390565b5490565b60008181526001830160205260408120548015612e025783546000198083019190810190600090879083908110612d7957fe5b9060005260206000200154905080876000018481548110612d9657fe5b600091825260208083209091019290925582815260018981019092526040902090840190558654879080612dc657fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050611b2a565b6000915050611b2a56fe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e6473416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e2061646d696e20746f206772616e74426f72696e6744414f3a3a54727573746565466565506f6f6c20697320616464726573732830294d696e7420416d6f756e742073686f756c64206d6f7265207468616e206d696e20616d6f756e74416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e2061646d696e20746f207265766f6b65536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77426f72696e6744414f3a3a63616c6c6572206973206e6f742061646d696e0000416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636520726f6c657320666f722073656c66a2646970667358221220f495e6c04f5a0695e158a7d423b50cffe417a1857158fce0bd6da9c9e8d4095b64736f6c634300060c0033000000000000000000000000ce61e08c01fb6e1ca1bb4d0acf4eb1d5fe66bf79000000000000000000000000000000000000000001a5dcb365fc4166be00000000000000000000000000000067ee188ee1319cdac271553e7b8faaed2fbc52cc
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102475760003560e01c8063820392581161013b578063ab282bba116100b8578063d547741f1161007c578063d547741f1461083e578063e34bc6f31461086a578063e9514afa14610872578063f395ae5c1461089e578063f7dd57b0146108ca57610247565b8063ab282bba146107d1578063b429ca20146107f4578063b536818a14610811578063c544df0c14610819578063ca15c8731461082157610247565b806399f4b251116100ff57806399f4b251146106665780639be5c0241461066e578063a217fddf14610676578063a4e7be711461067e578063a5ef26151461072157610247565b806382039258146105e45780638456cb59146106075780639010d07c1461060f57806391d1485414610632578063929a2a081461065e57610247565b80634070a0c9116101c95780635fc5f4de1161018d5780635fc5f4de14610464578063673da1541461046c5780636b3bc2441461048f57806376c71ca1146105d45780637fe4ac44146105dc57610247565b80634070a0c91461040c5780634d9b47e2146104295780635247480c146104315780635c797551146104545780635c975abb1461045c57610247565b80633611cad5116102105780633611cad51461038f57806336568abe146103975780633719bc6a146103c357806338013f02146103fc5780633f4ba83a1461040457610247565b80621333a71461024c5780631c12526514610274578063248a9ca31461032c57806326abdad41461035b5780632f2ff15d14610363575b600080fd5b6102726004803603602081101561026257600080fd5b50356001600160a01b03166108d2565b005b6103186004803603602081101561028a57600080fd5b810190602081018135600160201b8111156102a457600080fd5b8201836020820111156102b657600080fd5b803590602001918460018302840111600160201b831117156102d757600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061093e945050505050565b604080519115158252519081900360200190f35b6103496004803603602081101561034257600080fd5b503561095e565b60408051918252519081900360200190f35b610349610973565b6102726004803603604081101561037957600080fd5b50803590602001356001600160a01b0316610980565b6103496109ec565b610272600480360360408110156103ad57600080fd5b50803590602001356001600160a01b03166109f2565b6103e0600480360360208110156103d957600080fd5b5035610a53565b604080516001600160a01b039092168252519081900360200190f35b610349610a7a565b610272610a87565b6102726004803603602081101561042257600080fd5b5035610af4565b610349610b43565b6102726004803603604081101561044757600080fd5b5080359060200135610b57565b6103e0610bb3565b610318610bc2565b610349610bcb565b6102726004803603604081101561048257600080fd5b5080359060200135610be0565b610272600480360360a08110156104a557600080fd5b81359190810190604081016020820135600160201b8111156104c657600080fd5b8201836020820111156104d857600080fd5b803590602001918460018302840111600160201b831117156104f957600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092958435956001600160a01b0360208701351695919450925060608101915060400135600160201b81111561056057600080fd5b82018360208201111561057257600080fd5b803590602001918460018302840111600160201b8311171561059357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610d75945050505050565b610349611798565b61034961179e565b610272600480360360408110156105fa57600080fd5b50803590602001356117b1565b610272611aa4565b6103e06004803603604081101561062557600080fd5b5080359060200135611b0f565b6103186004803603604081101561064857600080fd5b50803590602001356001600160a01b0316611b30565b610349611b48565b6103e0611b4e565b610349611b5d565b610349611b6f565b6102726004803603604081101561069457600080fd5b810190602081018135600160201b8111156106ae57600080fd5b8201836020820111156106c057600080fd5b803590602001918460208302840111600160201b831117156106e157600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505091359250611b74915050565b6102726004803603606081101561073757600080fd5b813591602081013591810190606081016040820135600160201b81111561075d57600080fd5b82018360208201111561076f57600080fd5b803590602001918460018302840111600160201b8311171561079057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611bf4945050505050565b610349600480360360408110156107e757600080fd5b5080359060200135611f43565b6103496004803603602081101561080a57600080fd5b5035612240565b610349612252565b610349612261565b6103496004803603602081101561083757600080fd5b503561226e565b6102726004803603604081101561085457600080fd5b50803590602001356001600160a01b0316612285565b6103496122de565b6102726004803603604081101561088857600080fd5b506001600160a01b0381351690602001356122ee565b610272600480360360408110156108b457600080fd5b506001600160a01b0381351690602001356123b5565b610349612460565b6108dd600033611b30565b61091c576040805162461bcd60e51b815260206004820152601e6024820152600080516020612efd833981519152604482015290519081900360640190fd5b600680546001600160a01b0319166001600160a01b0392909216919091179055565b805160208183018101805160078252928201919093012091525460ff1681565b60009081526020819052604090206002015490565b65424f52494e4760d01b81565b6000828152602081905260409020600201546109a39061099e612484565b611b30565b6109de5760405162461bcd60e51b815260040180806020018281038252602f815260200180612e2f602f913960400191505060405180910390fd5b6109e88282612488565b5050565b60085481565b6109fa612484565b6001600160a01b0316816001600160a01b031614610a495760405162461bcd60e51b815260040180806020018281038252602f815260200180612f1d602f913960400191505060405180910390fd5b6109e882826124f1565b60048181548110610a6057fe5b6000918252602090912001546001600160a01b0316905081565b654f7261636c6560d01b81565b610aa16c026a7a724aa27a92fa927a6229609d1b33611b30565b610aea576040805162461bcd60e51b815260206004820152601560248201527421b0b63632b91034b9903737ba1036b7b734ba37b960591b604482015290519081900360640190fd5b610af261255a565b565b610aff600033611b30565b610b3e576040805162461bcd60e51b815260206004820152601e6024820152600080516020612efd833981519152604482015290519081900360640190fd5b600555565b6c026a7a724aa27a92fa927a6229609d1b81565b610b62600033611b30565b610ba1576040805162461bcd60e51b815260206004820152601e6024820152600080516020612efd833981519152604482015290519081900360640190fd5b60009182526009602052604090912055565b6003546001600160a01b031681565b60015460ff1690565b6d151c9d5cdd1959519959541bdbdb60921b81565b60015460ff1615610c2b576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6003546040805163130852b360e11b815260048101859052905184926000926001600160a01b0390911691632610a56691602480820192602092909190829003018186803b158015610c7c57600080fd5b505afa158015610c90573d6000803e3d6000fd5b505050506040513d6020811015610ca657600080fd5b50516001600160a01b03161415610cf9576040805162461bcd60e51b815260206004820152601260248201527110dbdb9d1c9858dd081b9bdd08195e1a5cdd60721b604482015290519081900360640190fd5b610d02836125f8565b6001600160a01b0316631e9a695033846040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015610d5857600080fd5b505af1158015610d6c573d6000803e3d6000fd5b50505050505050565b60015460ff1615610dc0576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b60035460408051635da2251d60e11b81526004810188905260248101829052601060448201526f1d1d5b9b995b081b9bdd08195e1a5cdd60821b6064820152905187926000926001600160a01b039091169163bb444a3a91608480820192602092909190829003018186803b158015610e3857600080fd5b505afa158015610e4c573d6000803e3d6000fd5b505050506040513d6020811015610e6257600080fd5b505160408051635c975abb60e01b815290519192506001600160a01b03831691635c975abb91600480820192602092909190829003018186803b158015610ea857600080fd5b505afa158015610ebc573d6000803e3d6000fd5b505050506040513d6020811015610ed257600080fd5b505115610f19576040805162461bcd60e51b815260206004820152601060248201526f1d1d5b9b995b081a5cc81c185d5cd95960821b604482015290519081900360640190fd5b86610f248133611b30565b610f6d576040805162461bcd60e51b815260206004820152601560248201527443616c6c6572206973206e6f74207472757374656560581b604482015290519081900360640190fd5b60008881526009602052604090205488908790811015610fbe5760405162461bcd60e51b8152600401808060200182810382526027815260200180612e856027913960400191505060405180910390fd5b6001600160a01b0387166111ed576007896040518082805190602001908083835b60208310610ffe5780518252601f199092019160209182019101610fdf565b51815160209384036101000a600019018019909216911617905292019485525060405193849003019092205460ff16151591506111e8905057600160078a6040518082805190602001908083835b6020831061106b5780518252601f19909201916020918201910161104c565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060006101000a81548160ff0219169083151502179055507f4bc1997b63d05a364fe5d5d78b4deae806531ad47732917eecde4becb88b86d88a8a8a8a338b6040518087815260200180602001868152602001856001600160a01b03168152602001846001600160a01b0316815260200180602001838103835288818151815260200191508051906020019080838360005b8381101561114757818101518382015260200161112f565b50505050905090810190601f1680156111745780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b838110156111a757818101518382015260200161118f565b50505050905090810190601f1680156111d45780820380516001836020036101000a031916815260200191505b509850505050505050505060405180910390a15b61178c565b60006111f88b61226e565b90506000611204612676565b6001600160a01b031663f99021a28d8d8d8d33886040518763ffffffff1660e01b81526004018087815260200180602001868152602001856001600160a01b03168152602001846001600160a01b03168152602001838152602001828103825287818151815260200191508051906020019080838360005b8381101561129457818101518382015260200161127c565b50505050905090810190601f1680156112c15780820380516001836020036101000a031916815260200191505b50975050505050505050602060405180830381600087803b1580156112e557600080fd5b505af11580156112f9573d6000803e3d6000fd5b505050506040513d602081101561130f57600080fd5b505190508061131f57505061178c565b600061132a8d6125f8565b6001600160a01b0316633c69e26b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561136257600080fd5b505afa158015611376573d6000803e3d6000fd5b505050506040513d602081101561138c57600080fd5b505190508061140861139d8f612701565b6001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156113d557600080fd5b505afa1580156113e9573d6000803e3d6000fd5b505050506040513d60208110156113ff57600080fd5b50518d90612783565b1115611537578b6040518082805190602001908083835b6020831061143e5780518252601f19909201916020918201910161141f565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390208d7ff5ab3d402a4845f0bfb050bdce018a06672cc3a7f4161e69dc114b2c43cd1eab8d8d338e60405180858152602001846001600160a01b03168152602001836001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b838110156114f25781810151838201526020016114da565b50505050905090810190601f16801561151f5780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a350505061178c565b6115408d6125f8565b6001600160a01b031663867904b48b8d6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561159657600080fd5b505af11580156115aa573d6000803e3d6000fd5b5050505060006115ba8e8d611f43565b90508015611666576002546115cf9082612783565b6002556115da6127dd565b600654604080516323b872dd60e01b81526001600160a01b0392831660048201528e8316602482015260448101859052905192909116916323b872dd916064808201926020929091908290030181600087803b15801561163957600080fd5b505af115801561164d573d6000803e3d6000fd5b505050506040513d602081101561166357600080fd5b50505b7fbf356171c0bbd785947f0936380f7bacc26c740c41ee8d68bfbd27a3225dbf458e8e8e8e8e6040518086815260200180602001858152602001846001600160a01b0316815260200180602001838103835287818151815260200191508051906020019080838360005b838110156116e85781810151838201526020016116d0565b50505050905090810190601f1680156117155780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b83811015611748578181015183820152602001611730565b50505050905090810190601f1680156117755780820380516001836020036101000a031916815260200191505b5097505050505050505060405180910390a1505050505b50505050505050505050565b60055481565b6b135a5b9d141c9bdc1bdcd85b60a21b81565b60015460ff16156117fc576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6003546040805163130852b360e11b815260048101859052905184926000926001600160a01b0390911691632610a56691602480820192602092909190829003018186803b15801561184d57600080fd5b505afa158015611861573d6000803e3d6000fd5b505050506040513d602081101561187757600080fd5b50516001600160a01b031614156118ca576040805162461bcd60e51b815260206004820152601260248201527110dbdb9d1c9858dd081b9bdd08195e1a5cdd60721b604482015290519081900360640190fd5b816118d36127dd565b60408051636eb1769f60e11b815233600482015230602482015290516001600160a01b03929092169163dd62ed3e91604480820192602092909190829003018186803b15801561192257600080fd5b505afa158015611936573d6000803e3d6000fd5b505050506040513d602081101561194c57600080fd5b505110156119a1576040805162461bcd60e51b815260206004820152601760248201527f6e6f7420616c6c6f7720656e6f75676820626f72696e67000000000000000000604482015290519081900360640190fd5b6119a96127dd565b6001600160a01b03166323b872dd336119c1866125f8565b856040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050602060405180830381600087803b158015611a1857600080fd5b505af1158015611a2c573d6000803e3d6000fd5b505050506040513d6020811015611a4257600080fd5b50611a4e9050836125f8565b6001600160a01b031663743b345233846040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015610d5857600080fd5b611abe6c026a7a724aa27a92fa927a6229609d1b33611b30565b611b07576040805162461bcd60e51b815260206004820152601560248201527421b0b63632b91034b9903737ba1036b7b734ba37b960591b604482015290519081900360640190fd5b610af2612831565b6000828152602081905260408120611b2790836128b1565b90505b92915050565b6000828152602081905260408120611b2790836128bd565b60025481565b6006546001600160a01b031681565b6a6e6574776f726b5f66656560a81b81565b600081565b611b7f600033611b30565b611bbe576040805162461bcd60e51b815260206004820152601e6024820152600080516020612efd833981519152604482015290519081900360640190fd5b60005b8251811015611bef57611be7838281518110611bd957fe5b6020026020010151836123b5565b600101611bc1565b505050565b60015460ff1615611c3f576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6003546040805163130852b360e11b815260048101869052905185926000926001600160a01b0390911691632610a56691602480820192602092909190829003018186803b158015611c9057600080fd5b505afa158015611ca4573d6000803e3d6000fd5b505050506040513d6020811015611cba57600080fd5b50516001600160a01b03161415611d0d576040805162461bcd60e51b815260206004820152601260248201527110dbdb9d1c9858dd081b9bdd08195e1a5cdd60721b604482015290519081900360640190fd5b60035460408051635da2251d60e11b81526004810187905260248101829052601060448201526f1d1d5b9b995b081b9bdd08195e1a5cdd60821b6064820152905186926000926001600160a01b039091169163bb444a3a91608480820192602092909190829003018186803b158015611d8557600080fd5b505afa158015611d99573d6000803e3d6000fd5b505050506040513d6020811015611daf57600080fd5b505160408051635c975abb60e01b815290519192506001600160a01b03831691635c975abb91600480820192602092909190829003018186803b158015611df557600080fd5b505afa158015611e09573d6000803e3d6000fd5b505050506040513d6020811015611e1f57600080fd5b505115611e66576040805162461bcd60e51b815260206004820152601060248201526f1d1d5b9b995b081a5cc81c185d5cd95960821b604482015290519081900360640190fd5b611e6f866125f8565b6001600160a01b03166315f570dc3387876040518463ffffffff1660e01b815260040180846001600160a01b0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611ee1578181015183820152602001611ec9565b50505050905090810190601f168015611f0e5780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b158015611f2f57600080fd5b505af115801561178c573d6000803e3d6000fd5b6000600554600254101580611f56575081155b15611f6357506000611b2a565b6000611f6d6128d2565b6001600160a01b03166331d98b3f856040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015611fb057600080fd5b505afa158015611fc4573d6000803e3d6000fd5b505050506040513d6020811015611fda57600080fd5b505190506000611fe86128d2565b6001600160a01b03166331d98b3f65424f52494e4760d01b6040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561203457600080fd5b505afa158015612048573d6000803e3d6000fd5b505050506040513d602081101561205e57600080fd5b505160085460025491925060009161207591612926565b90506000612081612968565b6001600160a01b031663171800cc88676d696e745f66656560c01b6040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b1580156120d757600080fd5b505afa1580156120eb573d6000803e3d6000fd5b505050506040513d602081101561210157600080fd5b50519050600061212b600584900a612125600486900a670de0b6b3a76400006129bf565b90612926565b90506000612137612968565b6001600160a01b031663171800cc8a6a6e6574776f726b5f66656560a81b6040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b15801561219057600080fd5b505afa1580156121a4573d6000803e3d6000fd5b505050506040513d60208110156121ba57600080fd5b5051905060006121df826121d960026121d38d89612a18565b906129bf565b90612783565b90506000612201876121fb866121f58c87612a18565b90612a18565b90612a2d565b905060055461221b8260025461278390919063ffffffff16565b106122325760025460055461222f91612a42565b90505b9a9950505050505050505050565b60096020526000908152604090205481565b67474f565f524f4c4560c01b81565b6537aa37b5b2b760d11b81565b6000818152602081905260408120611b2a90612a84565b6000828152602081905260409020600201546122a39061099e612484565b610a495760405162461bcd60e51b8152600401808060200182810382526030815260200180612eac6030913960400191505060405180910390fd5b68506172616d426f6f6b60b81b81565b6122f9600033611b30565b612338576040805162461bcd60e51b815260206004820152601e6024820152600080516020612efd833981519152604482015290519081900360640190fd5b6123428183612285565b61234b81612a8f565b6001600160a01b031663b42652e9836040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b15801561239957600080fd5b505af11580156123ad573d6000803e3d6000fd5b505050505050565b6123c0600033611b30565b6123ff576040805162461bcd60e51b815260206004820152601e6024820152600080516020612efd833981519152604482015290519081900360640190fd5b61240981836109de565b61241281612a8f565b6001600160a01b031663d014c01f836040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b15801561239957600080fd5b676d696e745f66656560c01b81565b6000611b27836001600160a01b038416612b14565b3390565b60008281526020819052604090206124a0908261246f565b156109e8576124ad612484565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b60008281526020819052604090206125099082612b5e565b156109e857612516612484565b6001600160a01b0316816001600160a01b0316837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45050565b60015460ff166125a8576040805162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015290519081900360640190fd5b6001805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6125db612484565b604080516001600160a01b039092168252519081900360200190a1565b6003546040805163130852b360e11b81526004810184905290516000926001600160a01b031691632610a566916024808301926020929190829003018186803b15801561264457600080fd5b505afa158015612658573d6000803e3d6000fd5b505050506040513d602081101561266e57600080fd5b505192915050565b6003546040805163130852b360e11b81526b135a5b9d141c9bdc1bdcd85b60a21b600482015290516000926001600160a01b031691632610a566916024808301926020929190829003018186803b1580156126d057600080fd5b505afa1580156126e4573d6000803e3d6000fd5b505050506040513d60208110156126fa57600080fd5b5051905090565b600354604080516305ad37e160e11b8152600481018490526537aa37b5b2b760d11b602482015260606044820152601060648201526f1bd51bdad95b881b9bdd08195e1a5cdd60821b608482015290516000926001600160a01b031691630b5a6fc29160a4808301926020929190829003018186803b15801561264457600080fd5b600082820183811015611b27576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6003546040805163130852b360e11b815265424f52494e4760d01b600482015290516000926001600160a01b031691632610a566916024808301926020929190829003018186803b1580156126d057600080fd5b60015460ff161561287c576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6001805460ff1916811790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586125db612484565b6000611b278383612b73565b6000611b27836001600160a01b038416612bd7565b6003546040805163130852b360e11b8152654f7261636c6560d01b600482015290516000926001600160a01b031691632610a566916024808301926020929190829003018186803b1580156126d057600080fd5b6000611b2783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612bef565b6003546040805163130852b360e11b815268506172616d426f6f6b60b81b600482015290516000926001600160a01b031691632610a566916024808301926020929190829003018186803b1580156126d057600080fd5b6000826129ce57506000611b2a565b828202828482816129db57fe5b0414611b275760405162461bcd60e51b8152600401808060200182810382526021815260200180612edc6021913960400191505060405180910390fd5b6000611b278383670de0b6b3a7640000612c91565b6000611b278383670de0b6b3a7640000612cc8565b6000611b2783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612ce8565b6000611b2a82612d42565b6003546040516305ad37e160e11b8152600481018381526d151c9d5cdd1959519959541bdbdb60921b602483018190526060604484019081526027606485018190526000956001600160a01b031694630b5a6fc2948894939092909160840190612e5e8239604001935050505060206040518083038186803b15801561264457600080fd5b6000612b208383612bd7565b612b5657508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155611b2a565b506000611b2a565b6000611b27836001600160a01b038416612d46565b81546000908210612bb55760405162461bcd60e51b8152600401808060200182810382526022815260200180612e0d6022913960400191505060405180910390fd5b826000018281548110612bc457fe5b9060005260206000200154905092915050565b60009081526001919091016020526040902054151590565b60008183612c7b5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612c40578181015183820152602001612c28565b50505050905090810190601f168015612c6d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581612c8757fe5b0495945050505050565b600080600a8304612ca286866129bf565b81612ca957fe5b0490506005600a825b0610612cbc57600a015b600a9004949350505050565b600080612cdc8461212587600a87026129bf565b90506005600a82612cb2565b60008184841115612d3a5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315612c40578181015183820152602001612c28565b505050900390565b5490565b60008181526001830160205260408120548015612e025783546000198083019190810190600090879083908110612d7957fe5b9060005260206000200154905080876000018481548110612d9657fe5b600091825260208083209091019290925582815260018981019092526040902090840190558654879080612dc657fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050611b2a565b6000915050611b2a56fe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e6473416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e2061646d696e20746f206772616e74426f72696e6744414f3a3a54727573746565466565506f6f6c20697320616464726573732830294d696e7420416d6f756e742073686f756c64206d6f7265207468616e206d696e20616d6f756e74416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e2061646d696e20746f207265766f6b65536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77426f72696e6744414f3a3a63616c6c6572206973206e6f742061646d696e0000416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636520726f6c657320666f722073656c66a2646970667358221220f495e6c04f5a0695e158a7d423b50cffe417a1857158fce0bd6da9c9e8d4095b64736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000ce61e08c01fb6e1ca1bb4d0acf4eb1d5fe66bf79000000000000000000000000000000000000000001a5dcb365fc4166be00000000000000000000000000000067ee188ee1319cdac271553e7b8faaed2fbc52cc
-----Decoded View---------------
Arg [0] : _addrReso (address): 0xCE61e08C01fb6E1ca1BB4d0ACF4eB1D5Fe66bF79
Arg [1] : _mintCap (uint256): 510000000000000000000000000
Arg [2] : _mine (address): 0x67Ee188Ee1319CDAc271553e7b8FAAed2fBC52CC
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000ce61e08c01fb6e1ca1bb4d0acf4eb1d5fe66bf79
Arg [1] : 000000000000000000000000000000000000000001a5dcb365fc4166be000000
Arg [2] : 00000000000000000000000067ee188ee1319cdac271553e7b8faaed2fbc52cc
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 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.