Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 729 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Burn | 15485552 | 843 days ago | IN | 0 ETH | 0.00338741 | ||||
Burn | 14261123 | 1039 days ago | IN | 0 ETH | 0.00406262 | ||||
Mint | 13483189 | 1160 days ago | IN | 0 ETH | 0.00822064 | ||||
Burn | 13031430 | 1230 days ago | IN | 0 ETH | 0.00336663 | ||||
Mint | 12974100 | 1239 days ago | IN | 0 ETH | 0.0051783 | ||||
Burn | 12925081 | 1247 days ago | IN | 0 ETH | 0.00182054 | ||||
Burn | 12914102 | 1248 days ago | IN | 0 ETH | 0.00176489 | ||||
Burn | 12779827 | 1269 days ago | IN | 0 ETH | 0.0015079 | ||||
Burn | 12763537 | 1272 days ago | IN | 0 ETH | 0.00077013 | ||||
Burn | 12670842 | 1286 days ago | IN | 0 ETH | 0.00064383 | ||||
Burn | 12660400 | 1288 days ago | IN | 0 ETH | 0.00225948 | ||||
Mint | 12660371 | 1288 days ago | IN | 0 ETH | 0.00335994 | ||||
Mint | 12660348 | 1288 days ago | IN | 0 ETH | 0.00472537 | ||||
Burn | 12654728 | 1289 days ago | IN | 0 ETH | 0.00089832 | ||||
Burn | 12644728 | 1291 days ago | IN | 0 ETH | 0.00077028 | ||||
Burn | 12644605 | 1291 days ago | IN | 0 ETH | 0.00064178 | ||||
Burn | 12637968 | 1292 days ago | IN | 0 ETH | 0.00083431 | ||||
Mint | 12637853 | 1292 days ago | IN | 0 ETH | 0.00135034 | ||||
Burn | 12634477 | 1292 days ago | IN | 0 ETH | 0.00160445 | ||||
Burn | 12629885 | 1293 days ago | IN | 0 ETH | 0.00089849 | ||||
Burn | 12625330 | 1294 days ago | IN | 0 ETH | 0.00064178 | ||||
Burn | 12619963 | 1294 days ago | IN | 0 ETH | 0.00079166 | ||||
Burn | 12588363 | 1299 days ago | IN | 0 ETH | 0.00102684 | ||||
Burn | 12574240 | 1301 days ago | IN | 0 ETH | 0.00121938 | ||||
Burn | 12564603 | 1303 days ago | IN | 0 ETH | 0.00295218 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
BearnTokenGateway
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-11-28 */ // SPDX-License-Identifier: MIT pragma solidity 0.6.12; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { // Check the signature length if (signature.length != 65) { revert("ECDSA: invalid signature length"); } // Divide the signature in r, s and v variables bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. // solhint-disable-next-line no-inline-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { revert("ECDSA: invalid signature 's' value"); } if (v != 27 && v != 28) { revert("ECDSA: invalid signature 'v' value"); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); require(signer != address(0), "ECDSA: invalid signature"); return signer; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * replicates the behavior of the * https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign[`eth_sign`] * JSON-RPC method. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } } library String { /// @notice Convert a uint value to its decimal string representation // solium-disable-next-line security/no-assign-params function fromUint(uint _i) internal pure returns (string memory) { if (_i == 0) { return "0"; } uint j = _i; uint len; while (j != 0) { len++; j /= 10; } bytes memory bstr = new bytes(len); uint k = len - 1; while (_i != 0) { bstr[k--] = bytes1(uint8(48 + (_i % 10))); _i /= 10; } return string(bstr); } /// @notice Convert a bytes32 value to its hex string representation. function fromBytes32(bytes32 _value) internal pure returns (string memory) { bytes memory alphabet = "0123456789abcdef"; bytes memory str = new bytes(32 * 2 + 2); str[0] = "0"; str[1] = "x"; for (uint i = 0; i < 32; i++) { str[2 + i * 2] = alphabet[uint(uint8(_value[i] >> 4))]; str[3 + i * 2] = alphabet[uint(uint8(_value[i] & 0x0f))]; } return string(str); } /// @notice Convert an address to its hex string representation. function fromAddress(address _addr) internal pure returns (string memory) { bytes32 value = bytes32(uint(_addr)); bytes memory alphabet = "0123456789abcdef"; bytes memory str = new bytes(20 * 2 + 2); str[0] = "0"; str[1] = "x"; for (uint i = 0; i < 20; i++) { str[2 + i * 2] = alphabet[uint(uint8(value[i + 12] >> 4))]; str[3 + i * 2] = alphabet[uint(uint8(value[i + 12] & 0x0f))]; } return string(str); } /// @notice Append eight strings. function add8( string memory a, string memory b, string memory c, string memory d, string memory e, string memory f, string memory g, string memory h ) internal pure returns (string memory) { return string(abi.encodePacked(a, b, c, d, e, f, g, h)); } } /* * @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; } } /** * @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; } } /** * @title Initializable * * @dev Helper contract to support initializer functions. To use it, replace * the constructor with a function that has the `initializer` modifier. * WARNING: Unlike constructors, initializer functions must be manually * invoked. This applies both to deploying an Initializable contract, as well * as extending an Initializable contract via inheritance. * WARNING: When used with inheritance, manual care must be taken to not invoke * a parent initializer twice, or ensure that all initializers are idempotent, * because this is not dealt with automatically as with constructors. */ contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private initializing; /** * @dev Modifier to use in the initializer function of a contract. */ modifier initializer() { require(initializing || isConstructor() || !initialized, "Contract instance has already been initialized"); bool isTopLevelCall = !initializing; if (isTopLevelCall) { initializing = true; initialized = true; } _; if (isTopLevelCall) { initializing = false; } } /// @dev Returns true if and only if the function is running in the constructor function isConstructor() private view returns (bool) { // extcodesize checks the size of the code stored in an address, and // address returns the current address. Since the code is still not // deployed when running a constructor, any checks on its code size will // yield zero, making it an effective way to detect if a contract is // under construction or not. address self = address(this); uint256 cs; assembly { cs := extcodesize(self) } return cs == 0; } // Reserved storage space to allow for layout changes in the future. uint256[50] private ______gap; } /* * @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. */ contract ContextUpgradeSafe is Initializable { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. function __Context_init() internal initializer { __Context_init_unchained(); } function __Context_init_unchained() internal initializer { } 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; } uint256[50] private __gap; } /** * @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); } /** * @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) { // Solidity only automatically asserts when dividing by 0 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; } } /** * @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 Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20MinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin guidelines: functions revert instead * of returning `false` on failure. This behavior is nonetheless conventional * and does not conflict with the expectations of ERC20 applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20UpgradeSafe is Initializable, ContextUpgradeSafe, IERC20 { using SafeMath for uint256; using Address for address; mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; uint8 private _decimals; /** * @dev Sets the values for {name} and {symbol}, initializes {decimals} with * a default value of 18. * * To select a different value for {decimals}, use {_setupDecimals}. * * All three of these values are immutable: they can only be set once during * construction. */ function __ERC20_init(string memory name, string memory symbol) internal initializer { __Context_init_unchained(); __ERC20_init_unchained(name, symbol); } function __ERC20_init_unchained(string memory name, string memory symbol) internal initializer { _name = name; _symbol = symbol; _decimals = 18; } /** * @dev Returns the name of the token. */ function name() public view returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is * called. * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view returns (uint8) { return _decimals; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}; * * Requirements: * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) { _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer(address sender, address recipient, uint256 amount) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance"); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements * * - `to` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance"); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens. * * This is internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Sets {decimals} to a value other than the default one of 18. * * WARNING: This function should only be called from the constructor. Most * applications that interact with token contracts will not expect * {decimals} to ever change, and may work incorrectly if it does. */ function _setupDecimals(uint8 decimals_) internal { _decimals = decimals_; } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be to transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { } uint256[44] private __gap; } contract ERC20WithPermit is Initializable, ERC20UpgradeSafe { using SafeMath for uint; mapping(address => uint) public nonces; // If the token is redeployed, the version is increased to prevent a permit // signature being used on both token instances. string public version; // --- EIP712 niceties --- bytes32 public DOMAIN_SEPARATOR; // PERMIT_TYPEHASH is the value returned from // keccak256("Permit(address holder,address spender,uint nonce,uint expiry,bool allowed)") bytes32 public constant PERMIT_TYPEHASH = 0xea2aa0a1be11a07ed86d755c93467f4f82362b452371d1ba94d1715123511acb; function initialize( uint _chainId, string memory _version, string memory _name, string memory _symbol, uint8 _decimals ) public initializer { __ERC20_init(_name, _symbol); _setupDecimals(_decimals); version = _version; DOMAIN_SEPARATOR = keccak256( abi.encode( keccak256( "EIP712Domain(string name,string version,uint chainId,address verifyingContract)" ), keccak256(bytes(name())), keccak256(bytes(version)), _chainId, address(this) ) ); } // --- Approve by signature --- function permit( address holder, address spender, uint nonce, uint expiry, bool allowed, uint8 v, bytes32 r, bytes32 s ) external { bytes32 digest = keccak256( abi.encodePacked( "\x19\x01", DOMAIN_SEPARATOR, keccak256( abi.encode( PERMIT_TYPEHASH, holder, spender, nonce, expiry, allowed ) ) ) ); require(holder != address(0), "ERC20WithRate: address must not be 0x0"); require( holder == ecrecover(digest, v, r, s), "ERC20WithRate: invalid signature" ); require( expiry == 0 || now <= expiry, "ERC20WithRate: permit has expired" ); require(nonce == nonces[holder]++, "ERC20WithRate: invalid nonce"); uint amount = allowed ? uint(-1) : 0; _approve(holder, spender, amount); } } /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. // A Solidity high level call has three parts: // 1. The target address is checked to verify it contains contract code // 2. The call itself is made, and success asserted // 3. The return value is decoded, which in turn checks the size of the returned data. // solhint-disable-next-line max-line-length require(address(token).isContract(), "SafeERC20: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = address(token).call(data); require(success, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } /** * @title Claimable * @dev Extension for the Ownable contract, where the ownership needs to be claimed. * This allows the new owner to accept the transfer. */ contract Claimable is Initializable { address private _owner; address public pendingOwner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); function initialize(address _nextOwner) public virtual initializer { _owner = _nextOwner; } /** * @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 == msg.sender, "Ownable: caller is not the owner"); _; } modifier onlyPendingOwner() { require( msg.sender == pendingOwner, "Claimable: caller is not the pending owner" ); _; } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public onlyOwner { require( newOwner != pendingOwner, "Claimable: invalid new owner" ); pendingOwner = newOwner; } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function _transferOwnership(address newOwner) internal { emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } function claimOwnership() public onlyPendingOwner { _transferOwnership(pendingOwner); delete pendingOwner; } } contract CanReclaimTokens is Claimable { using SafeERC20 for ERC20UpgradeSafe; mapping(address => bool) private recoverableTokensBlacklist; function initialize(address _nextOwner) public override initializer { Claimable.initialize(_nextOwner); } function blacklistRecoverableToken(address _token) public onlyOwner { recoverableTokensBlacklist[_token] = true; } /// @notice Allow the owner of the contract to recover funds accidentally /// sent to the contract. To withdraw ETH, the token should be set to `0x0`. function recoverTokens(address _token) external onlyOwner { require( !recoverableTokensBlacklist[_token], "CanReclaimTokens: token is not recoverable" ); if (_token == address(0x0)) { msg.sender.transfer(address(this).balance); } else { ERC20UpgradeSafe(_token).safeTransfer( msg.sender, ERC20UpgradeSafe(_token).balanceOf(address(this)) ); } } } /** * @dev Wrapped BFI on Ethereum * * Read more about its tokenomic here: https://bearn-defi.medium.com/bearn-fi-introduction-9e65f6395dfc * * Total 12,500 BFI issued (minted) on Ethereum: * - 500 BFIE for initial supply (Uniswap and Value Liquid) * - 3000 BFIE for UNIv2 BFIE-ETH (50/50) mining incentive (4 months) * - 7000 BFIE for ValueLiquid VLP BFIE-VALUE (70/30) mining incentive (18 months) * - 2000 BFIE reserve for public mint (from BFI Bsc) */ contract BearnTokenERC20 is ERC20WithPermit, CanReclaimTokens { uint public cap = 12500 ether; function initialize( uint _chainId, address _nextOwner, string memory _version, string memory _name, string memory _symbol, uint8 _decimals ) public initializer { __ERC20_init(_name, _symbol); _setupDecimals(_decimals); ERC20WithPermit.initialize( _chainId, _version, _name, _symbol, _decimals ); CanReclaimTokens.initialize(_nextOwner); _mint(msg.sender, cap.sub(2000 ether)); // first mint to setup liquidity } // Can be called by only Gateway function mint(address _to, uint _amount) external onlyOwner { _mint(_to, _amount); } // Can be called by only Gateway function burn(uint _amount) external onlyOwner { _burn(msg.sender, _amount); } function transfer(address recipient, uint amount) public override returns (bool) { require( recipient != address(this), "BEARN ERC20UpgradeSafe: can't transfer to token address" ); return super.transfer(recipient, amount); } function transferFrom(address sender, address recipient, uint amount) public override returns (bool) { require( recipient != address(this), "BEARN ERC20UpgradeSafe: can't transfer to stoken address" ); return super.transferFrom(sender, recipient, amount); } /** * @dev See {ERC20-_beforeTokenTransfer}. * * Requirements: * * - minted tokens must not cause the total supply to go over the cap. */ function _beforeTokenTransfer(address from, address to, uint amount) internal virtual override { super._beforeTokenTransfer(from, to, amount); if (from == address(0)) { // When minting tokens require(totalSupply().add(amount) <= cap, "ERC20Capped: cap exceeded"); } } } contract GatewayState { uint constant BIPS_DENOMINATOR = 10000; uint public minimumBurnAmount; /// @notice Each Gateway is tied to a specific BearnTokenERC20 token. BearnTokenERC20 public token; /// @notice The mintAuthority is an address that can sign mint requests. address public mintAuthority; /// @dev feeRecipient is assumed to be an address (or a contract) that can /// accept erc20 payments it cannot be 0x0. /// @notice When tokens are mint or burnt, a portion of the tokens are /// forwarded to a fee recipient. address public feeRecipient; /// @notice The mint fee in bips. uint16 public mintFee; /// @notice The burn fee in bips. uint16 public burnFee; /// @notice Each signature can only be seen once. mapping(bytes32 => bool) public status; // LogMint and LogBurn contain a unique `n` that identifies // the mint or burn event. uint public nextN = 0; } /// @notice Gateway handles verifying mint and burn requests. A mintAuthority /// approves new assets to be minted by providing a digital signature. An ownernpm /// of an asset can request for it to be burnt. contract BearnTokenGateway is CanReclaimTokens, GatewayState { using SafeMath for uint; event LogMintAuthorityUpdated(address indexed _newMintAuthority); event LogMint( address indexed _to, uint _amount, uint indexed _n, bytes32 indexed _signedMessageHash ); event LogBurn( bytes _to, uint _amount, uint indexed _n, bytes indexed _indexedTo ); /// @notice Only allow the Darknode Payment contract. modifier onlyOwnerOrMintAuthority() { require( msg.sender == mintAuthority || msg.sender == owner(), "Gateway: caller is not the owner or mint authority" ); _; } /// @param _token The BearnTokenERC20 this Gateway is responsible for. /// @param _feeRecipient The recipient of burning and minting fees. /// @param _mintAuthority The address of the key that can sign mint /// requests. /// @param _mintFee The amount subtracted each mint request and /// forwarded to the feeRecipient. In BIPS. /// @param _burnFee The amount subtracted each burn request and /// forwarded to the feeRecipient. In BIPS. function initialize( BearnTokenERC20 _token, address _feeRecipient, address _mintAuthority, uint16 _mintFee, uint16 _burnFee, uint _minimumBurnAmount ) public initializer { CanReclaimTokens.initialize(msg.sender); minimumBurnAmount = _minimumBurnAmount; token = _token; mintFee = _mintFee; burnFee = _burnFee; updateMintAuthority(_mintAuthority); updateFeeRecipient(_feeRecipient); } // Public functions //////////////////////////////////////////////////////// /// @notice Claims ownership of the token passed in to the constructor. /// `transferStoreOwnership` must have previously been called. /// Anyone can call this function. function claimTokenOwnership() public { token.claimOwnership(); } /// @notice Allow the owner to update the owner of the BearnTokenERC20 token. function transferTokenOwnership(BearnTokenGateway _nextTokenOwner) public onlyOwner { token.transferOwnership(address(_nextTokenOwner)); _nextTokenOwner.claimTokenOwnership(); } /// @notice Allow the owner to update the fee recipient. /// /// @param _nextMintAuthority The address to start paying fees to. function updateMintAuthority(address _nextMintAuthority) public onlyOwnerOrMintAuthority { // The mint authority should not be set to 0, which is the result // returned by ecrecover for an invalid signature. require( _nextMintAuthority != address(0), "Gateway: mintAuthority cannot be set to address zero" ); mintAuthority = _nextMintAuthority; emit LogMintAuthorityUpdated(mintAuthority); } /// @notice Allow the owner to update the minimum burn amount. /// /// @param _minimumBurnAmount The new min burn amount. function updateMinimumBurnAmount(uint _minimumBurnAmount) public onlyOwner { minimumBurnAmount = _minimumBurnAmount; } /// @notice Allow the owner to update the fee recipient. /// /// @param _nextFeeRecipient The address to start paying fees to. function updateFeeRecipient(address _nextFeeRecipient) public onlyOwner { // 'mint' and 'burn' will fail if the feeRecipient is 0x0 require( _nextFeeRecipient != address(0x0), "Gateway: fee recipient cannot be 0x0" ); feeRecipient = _nextFeeRecipient; } /// @notice Allow the owner to update the 'mint' fee. /// /// @param _nextMintFee The new fee for minting and burning. function updateMintFee(uint16 _nextMintFee) public onlyOwner { mintFee = _nextMintFee; } /// @notice Allow the owner to update the burn fee. /// /// @param _nextBurnFee The new fee for minting and burning. function updateBurnFee(uint16 _nextBurnFee) public onlyOwner { burnFee = _nextBurnFee; } function mint( string calldata _symbol, address _recipient, uint _amount, bytes32 _nHash, bytes calldata _sig ) external { bytes32 payloadHash = keccak256(abi.encode(_symbol, _recipient)); // Verify signature bytes32 signedMessageHash = hashForSignature( _symbol, _recipient, _amount, msg.sender, _nHash ); require( status[signedMessageHash] == false, "Gateway: nonce hash already spent" ); if (!verifySignature(signedMessageHash, _sig)) { // Return a detailed string containing the hash and recovered // signer. This is somewhat costly but is only run in the revert // branch. revert( String.add8( "Gateway: invalid signature. pHash: ", String.fromBytes32(payloadHash), ", amount: ", String.fromUint(_amount), ", msg.sender: ", String.fromAddress(msg.sender), ", _nHash: ", String.fromBytes32(_nHash) ) ); } status[signedMessageHash] = true; // Mint `amount - fee` for the recipient and mint `fee` for the minter uint absoluteFee = _amount.mul(mintFee).div( BIPS_DENOMINATOR ); uint receivedAmount = _amount.sub( absoluteFee, "Gateway: fee exceeds amount" ); // Mint amount minus the fee token.mint(_recipient, receivedAmount); // Mint the fee token.mint(feeRecipient, absoluteFee); emit LogMint( _recipient, receivedAmount, nextN, signedMessageHash ); nextN += 1; } /// @notice burn destroys tokens after taking a fee for the `_feeRecipient`, /// allowing the associated assets to be released on their native /// chain. /// /// @param _to The address to receive the un-bridged asset. The format of /// this address should be of the destination chain. /// For example, when burning to Bitcoin, _to should be a /// Bitcoin address. /// @param _amount The amount of the token being burnt, in its /// smallest value. (e.g. satoshis for BTC) function burn(bytes calldata _to, uint _amount) external { // function burn(bytes memory _to, uint _amount) public returns (uint) { require( token.transferFrom(msg.sender, address(this), _amount), "token transfer failed" ); // The recipient must not be empty. Better validation is possible, // but would need to be customized for each destination ledger. require(_to.length != 0, "Gateway: to address is empty"); // Calculate fee, subtract it from amount being burnt. uint fee = _amount.mul(burnFee).div(BIPS_DENOMINATOR); uint amountAfterFee = _amount.sub( fee, "Gateway: fee exceeds amount" ); // Burn the whole amount, and then re-mint the fee. token.burn(_amount); token.mint(feeRecipient, fee); require( // Must be strictly greater, to that the release transaction is of // at least one unit. amountAfterFee > minimumBurnAmount, "Gateway: amount is less than the minimum burn amount" ); emit LogBurn(_to, amountAfterFee, nextN, _to); nextN += 1; } /// @notice verifySignature checks the the provided signature matches the provided /// parameters. function verifySignature(bytes32 _signedMessageHash, bytes memory _sig) public view returns (bool) { bytes32 ethSignedMessageHash = ECDSA.toEthSignedMessageHash(_signedMessageHash); address signer = ECDSA.recover(ethSignedMessageHash, _sig); return mintAuthority == signer; } /// @notice hashForSignature hashes the parameters so that they can be signed. function hashForSignature( string memory _symbol, address _recipient, uint _amount, address _caller, bytes32 _nHash ) public view returns (bytes32) { bytes32 payloadHash = keccak256(abi.encode(_symbol, _recipient)); return keccak256(abi.encode(payloadHash, _amount, address(token), _caller, _nHash)); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes","name":"_to","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_n","type":"uint256"},{"indexed":true,"internalType":"bytes","name":"_indexedTo","type":"bytes"}],"name":"LogBurn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_n","type":"uint256"},{"indexed":true,"internalType":"bytes32","name":"_signedMessageHash","type":"bytes32"}],"name":"LogMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_newMintAuthority","type":"address"}],"name":"LogMintAuthorityUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"blacklistRecoverableToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_to","type":"bytes"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burnFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimTokenOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_caller","type":"address"},{"internalType":"bytes32","name":"_nHash","type":"bytes32"}],"name":"hashForSignature","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract BearnTokenERC20","name":"_token","type":"address"},{"internalType":"address","name":"_feeRecipient","type":"address"},{"internalType":"address","name":"_mintAuthority","type":"address"},{"internalType":"uint16","name":"_mintFee","type":"uint16"},{"internalType":"uint16","name":"_burnFee","type":"uint16"},{"internalType":"uint256","name":"_minimumBurnAmount","type":"uint256"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_nextOwner","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"minimumBurnAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes32","name":"_nHash","type":"bytes32"},{"internalType":"bytes","name":"_sig","type":"bytes"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintAuthority","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"recoverTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"status","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract BearnTokenERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract BearnTokenGateway","name":"_nextTokenOwner","type":"address"}],"name":"transferTokenOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_nextBurnFee","type":"uint16"}],"name":"updateBurnFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_nextFeeRecipient","type":"address"}],"name":"updateFeeRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minimumBurnAmount","type":"uint256"}],"name":"updateMinimumBurnAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_nextMintAuthority","type":"address"}],"name":"updateMintAuthority","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_nextMintFee","type":"uint16"}],"name":"updateMintFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_signedMessageHash","type":"bytes32"},{"internalType":"bytes","name":"_sig","type":"bytes"}],"name":"verifySignature","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040526000603b5534801561001557600080fd5b50613804806100256000396000f3fe608060405234801561001057600080fd5b50600436106101b95760003560e01c806377f61403116100f9578063daca6f7811610097578063f2fde38b11610071578063f2fde38b1461071f578063f65d901c14610752578063fc0c546a14610785578063fce589d81461078d576101b9565b8063daca6f7814610637578063e30c3978146106e4578063f160d369146106ec576101b9565b806394c238ac116100d357806394c238ac14610597578063a2999beb1461059f578063aa4df9ad146105fc578063c4d66de814610604576101b9565b806377f614031461049d5780638da5cb5b146105875780639340b21e1461058f576101b9565b80633a521b8d1161016657806352ad0d5e1161014057806352ad0d5e1461034657806359c9176c146103775780635cc66106146103985780636d8b1875146103b9576101b9565b80633a521b8d146102f0578063469048401461030d5780634e71e0c81461033e576101b9565b806316114acd1161019757806316114acd1461021a57806321e6b53d1461024d57806338463cff14610280576101b9565b80630130a33b146101be57806310731a65146101f357806313966db5146101fb575b600080fd5b6101f1600480360360208110156101d457600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610795565b005b6101f1610923565b6102036109a7565b6040805161ffff9092168252519081900360200190f35b6101f16004803603602081101561023057600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166109c9565b6101f16004803603602081101561026357600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610bd3565b6101f16004803603604081101561029657600080fd5b8101906020810181356401000000008111156102b157600080fd5b8201836020820111156102c357600080fd5b803590602001918460018302840111640100000000831117156102e557600080fd5b919350915035610d48565b6101f16004803603602081101561030657600080fd5b5035611189565b610315611214565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6101f1611230565b6103636004803603602081101561035c57600080fd5b50356112ec565b604080519115158252519081900360200190f35b6101f16004803603602081101561038d57600080fd5b503561ffff16611301565b6101f1600480360360208110156103ae57600080fd5b503561ffff166113d6565b61048b600480360360a08110156103cf57600080fd5b8101906020810181356401000000008111156103ea57600080fd5b8201836020820111156103fc57600080fd5b8035906020019184600183028401116401000000008311171561041e57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505073ffffffffffffffffffffffffffffffffffffffff833581169450602084013593604081013590911692506060013590506114a9565b60408051918252519081900360200190f35b6101f1600480360360a08110156104b357600080fd5b8101906020810181356401000000008111156104ce57600080fd5b8201836020820111156104e057600080fd5b8035906020019184600183028401116401000000008311171561050257600080fd5b9193909273ffffffffffffffffffffffffffffffffffffffff83351692602081013592604082013592909160808101906060013564010000000081111561054857600080fd5b82018360208201111561055a57600080fd5b8035906020019184600183028401116401000000008311171561057c57600080fd5b5090925090506115d1565b610315611b0c565b610315611b28565b61048b611b44565b6101f1600480360360c08110156105b557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101358216916040820135169061ffff606082013581169160808101359091169060a00135611b4a565b61048b611d50565b6101f16004803603602081101561061a57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611d56565b6103636004803603604081101561064d57600080fd5b8135919081019060408101602082013564010000000081111561066f57600080fd5b82018360208201111561068157600080fd5b803590602001918460018302840111640100000000831117156106a357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611e74945050505050565b610315611eb7565b6101f16004803603602081101561070257600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611ed3565b6101f16004803603602081101561073557600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661200c565b6101f16004803603602081101561076857600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612163565b610315612238565b610203612254565b60385473ffffffffffffffffffffffffffffffffffffffff163314806107ed57506107be611b0c565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610842576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806136096032913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81166108ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260348152602001806136916034913960400191505060405180910390fd5b603880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691909117918290556040519116907ff0f08e606c1dd3a2c220ada53422fd9fe0aa75614b27db0549f649de3ad2072a90600090a250565b603760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634e71e0c86040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561098d57600080fd5b505af11580156109a1573d6000803e3d6000fd5b50505050565b60395474010000000000000000000000000000000000000000900461ffff1681565b60335473ffffffffffffffffffffffffffffffffffffffff163314610a4f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811660009081526035602052604090205460ff1615610ace576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806135df602a913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116610b1b5760405133904780156108fc02916000818181858888f19350505050158015610b15573d6000803e3d6000fd5b50610bd0565b610bd0338273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610b8657600080fd5b505afa158015610b9a573d6000803e3d6000fd5b505050506040513d6020811015610bb057600080fd5b505173ffffffffffffffffffffffffffffffffffffffff84169190612278565b50565b60335473ffffffffffffffffffffffffffffffffffffffff163314610c5957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b603754604080517ff2fde38b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301529151919092169163f2fde38b91602480830192600092919082900301818387803b158015610ccd57600080fd5b505af1158015610ce1573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff166310731a656040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610d2d57600080fd5b505af1158015610d41573d6000803e3d6000fd5b5050505050565b603754604080517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101849052905173ffffffffffffffffffffffffffffffffffffffff909216916323b872dd916064808201926020929091908290030181600087803b158015610dc857600080fd5b505af1158015610ddc573d6000803e3d6000fd5b505050506040513d6020811015610df257600080fd5b5051610e5f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f746f6b656e207472616e73666572206661696c65640000000000000000000000604482015290519081900360640190fd5b81610ecb57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f476174657761793a20746f206164647265737320697320656d70747900000000604482015290519081900360640190fd5b603954600090610f089061271090610f02908590760100000000000000000000000000000000000000000000900461ffff1661230a565b90612384565b90506000610f56826040518060400160405280601b81526020017f476174657761793a20666565206578636565647320616d6f756e740000000000815250856123c69092919063ffffffff16565b603754604080517f42966c6800000000000000000000000000000000000000000000000000000000815260048101879052905192935073ffffffffffffffffffffffffffffffffffffffff909116916342966c689160248082019260009290919082900301818387803b158015610fcc57600080fd5b505af1158015610fe0573d6000803e3d6000fd5b5050603754603954604080517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff92831660048201526024810188905290519190921693506340c10f199250604480830192600092919082900301818387803b15801561106257600080fd5b505af1158015611076573d6000803e3d6000fd5b5050505060365481116110d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603481526020018061363b6034913960400191505060405180910390fd5b84846040518083838082843760408051939091018390038320603b54602085018990528285529184018b9052955093507f1619fc95050ffb8c94c9077c82b3e1ebbf8d571b6234241c55ba0aaf40da019e9250899189915086908060608101858580828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016909201829003965090945050505050a35050603b80546001019055505050565b60335473ffffffffffffffffffffffffffffffffffffffff16331461120f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b603655565b60395473ffffffffffffffffffffffffffffffffffffffff1681565b60345473ffffffffffffffffffffffffffffffffffffffff1633146112a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a81526020018061375a602a913960400191505060405180910390fd5b6034546112c29073ffffffffffffffffffffffffffffffffffffffff1661243a565b603480547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b603a6020526000908152604090205460ff1681565b60335473ffffffffffffffffffffffffffffffffffffffff16331461138757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6039805461ffff909216760100000000000000000000000000000000000000000000027fffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffff909216919091179055565b60335473ffffffffffffffffffffffffffffffffffffffff16331461145c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6039805461ffff90921674010000000000000000000000000000000000000000027fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff909216919091179055565b600080868660405160200180806020018373ffffffffffffffffffffffffffffffffffffffff168152602001828103825284818151815260200191508051906020019080838360005b8381101561150a5781810151838201526020016114f2565b50505050905090810190601f1680156115375780820380516001836020036101000a031916815260200191505b50604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120603754828501919091528284018d905273ffffffffffffffffffffffffffffffffffffffff90811660608501528b16608084015260a08084018b90528251808503909101815260c090930190915281519101209550505050505095945050505050565b600087878760405160200180806020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281038252858582818152602001925080828437600081840152601f19601f820116905080830192505050945050505050604051602081830303815290604052805190602001209050600061168d89898080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508b92508a9150339050896114a9565b6000818152603a602052604090205490915060ff16156116f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806137846021913960400191505060405180910390fd5b6117388185858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611e7492505050565b6118c1576118236040518060600160405280602381526020016135bc60239139611761846124c8565b6040518060400160405280600a81526020017f2c20616d6f756e743a20000000000000000000000000000000000000000000008152506117a08a6126f3565b6040518060400160405280600e81526020017f2c206d73672e73656e6465723a200000000000000000000000000000000000008152506117df3361281d565b6040518060400160405280600a81526020017f2c205f6e486173683a200000000000000000000000000000000000000000000081525061181e8d6124c8565b612a5a565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561188657818101518382015260200161186e565b50505050905090810190601f1680156118b35780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b6000818152603a6020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905560395461192b9061271090610f02908a9061ffff740100000000000000000000000000000000000000009091041661230a565b90506000611979826040518060400160405280601b81526020017f476174657761793a20666565206578636565647320616d6f756e7400000000008152508a6123c69092919063ffffffff16565b603754604080517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8d811660048301526024820185905291519394509116916340c10f199160448082019260009290919082900301818387803b1580156119f657600080fd5b505af1158015611a0a573d6000803e3d6000fd5b5050603754603954604080517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff92831660048201526024810188905290519190921693506340c10f199250604480830192600092919082900301818387803b158015611a8c57600080fd5b505af1158015611aa0573d6000803e3d6000fd5b5050505082603b548a73ffffffffffffffffffffffffffffffffffffffff167fa58ba939eb08dab7eaf8ad09c16e7405ee88e5153e15da62d5481296a9f727fa846040518082815260200191505060405180910390a45050603b80546001019055505050505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff1690565b60385473ffffffffffffffffffffffffffffffffffffffff1681565b60365481565b600054610100900460ff1680611b635750611b63612e99565b80611b71575060005460ff16155b611bc6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e81526020018061372c602e913960400191505060405180910390fd5b600054610100900460ff16158015611c2c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116610100171660011790555b611c3533611d56565b60368290556037805473ffffffffffffffffffffffffffffffffffffffff89167fffffffffffffffffffffffff00000000000000000000000000000000000000009091161790556039805461ffff858116760100000000000000000000000000000000000000000000027fffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffff91881674010000000000000000000000000000000000000000027fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff9093169290921716179055611d0f85610795565b611d1886611ed3565b8015611d4757600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690555b50505050505050565b603b5481565b600054610100900460ff1680611d6f5750611d6f612e99565b80611d7d575060005460ff16155b611dd2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e81526020018061372c602e913960400191505060405180910390fd5b600054610100900460ff16158015611e3857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116610100171660011790555b611e4182612e9f565b8015611e7057600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690555b5050565b600080611e8084612ff3565b90506000611e8e8285613044565b60385473ffffffffffffffffffffffffffffffffffffffff908116911614925050505b92915050565b60345473ffffffffffffffffffffffffffffffffffffffff1681565b60335473ffffffffffffffffffffffffffffffffffffffff163314611f5957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116611fc5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806136e76024913960400191505060405180910390fd5b603980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60335473ffffffffffffffffffffffffffffffffffffffff16331461209257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60345473ffffffffffffffffffffffffffffffffffffffff8281169116141561211c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f436c61696d61626c653a20696e76616c6964206e6577206f776e657200000000604482015290519081900360640190fd5b603480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60335473ffffffffffffffffffffffffffffffffffffffff1633146121e957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff16600090815260356020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b60375473ffffffffffffffffffffffffffffffffffffffff1681565b603954760100000000000000000000000000000000000000000000900461ffff1681565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526123059084906132c2565b505050565b60008261231957506000611eb1565b8282028284828161232657fe5b041461237d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061370b6021913960400191505060405180910390fd5b9392505050565b600061237d83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613500565b60008184841115612432576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181815283516024840152835190928392604490910191908501908083836000831561188657818101518382015260200161186e565b505050900390565b60335460405173ffffffffffffffffffffffffffffffffffffffff8084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b604080518082018252601081527f3031323334353637383961626364656600000000000000000000000000000000602082015281516042808252608082019093526060928391906020820181803683370190505090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061254c57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106125a957fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060005b60208110156126e9578260048683602081106125f357fe5b1a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916901c60f81c60ff168151811061262b57fe5b602001015160f81c60f81b82826002026002018151811061264857fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508285826020811061268457fe5b825191901a600f1690811061269557fe5b602001015160f81c60f81b8282600202600301815181106126b257fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506001016125db565b509150505b919050565b606081612734575060408051808201909152600181527f300000000000000000000000000000000000000000000000000000000000000060208201526126ee565b8160005b811561274c57600101600a82049150612738565b60608167ffffffffffffffff8111801561276557600080fd5b506040519080825280601f01601f191660200182016040528015612790576020820181803683370190505b5090507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82015b851561281457600a860660300160f81b828280600190039350815181106127da57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a860495506127b7565b50949350505050565b604080518082018252601081527f303132333435363738396162636465660000000000000000000000000000000060208201528151602a808252606082810190945273ffffffffffffffffffffffffffffffffffffffff8516929184916020820181803683370190505090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106128b757fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061291457fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060005b6014811015612814578260048583600c016020811061296157fe5b1a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916901c60f81c60ff168151811061299957fe5b602001015160f81c60f81b8282600202600201815181106129b657fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350828482600c01602081106129f557fe5b825191901a600f16908110612a0657fe5b602001015160f81c60f81b828260020260030181518110612a2357fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600101612946565b606088888888888888886040516020018089805190602001908083835b60208310612ab457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612a77565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790528b5191909301928b0191508083835b60208310612b3857805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612afb565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790528a5191909301928a0191508083835b60208310612bbc57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612b7f565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905289519190930192890191508083835b60208310612c4057805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612c03565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905288519190930192880191508083835b60208310612cc457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612c87565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905287519190930192870191508083835b60208310612d4857805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612d0b565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905286519190930192860191508083835b60208310612dcc57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612d8f565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905285519190930192850191508083835b60208310612e5057805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612e13565b6001836020036101000a03801982511681845116808217855250505050505090500198505050505050505050604051602081830303815290604052905098975050505050505050565b303b1590565b600054610100900460ff1680612eb85750612eb8612e99565b80612ec6575060005460ff16155b612f1b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e81526020018061372c602e913960400191505060405180910390fd5b600054610100900460ff16158015612f8157600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116610100171660011790555b603380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84161790558015611e7057600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690555050565b604080517f19457468657265756d205369676e6564204d6573736167653a0a333200000000602080830191909152603c8083019490945282518083039094018452605c909101909152815191012090565b600081516041146130b657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015290519081900360640190fd5b60208201516040830151606084015160001a7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0821115613141576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602281526020018061366f6022913960400191505060405180910390fd5b8060ff16601b1415801561315957508060ff16601c14155b156131af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806136c56022913960400191505060405180910390fd5b600060018783868660405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa15801561320b573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166132b857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015290519081900360640190fd5b9695505050505050565b6132e18273ffffffffffffffffffffffffffffffffffffffff1661357f565b61334c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b600060608373ffffffffffffffffffffffffffffffffffffffff16836040518082805190602001908083835b602083106133b557805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613378565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613417576040519150601f19603f3d011682016040523d82523d6000602084013e61341c565b606091505b50915091508161348d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b8051156109a1578080602001905160208110156134a957600080fd5b50516109a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806137a5602a913960400191505060405180910390fd5b60008183613569576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181815283516024840152835190928392604490910191908501908083836000831561188657818101518382015260200161186e565b50600083858161357557fe5b0495945050505050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708181148015906135b357508115155b94935050505056fe476174657761793a20696e76616c6964207369676e61747572652e2070486173683a2043616e5265636c61696d546f6b656e733a20746f6b656e206973206e6f74207265636f76657261626c65476174657761793a2063616c6c6572206973206e6f7420746865206f776e6572206f72206d696e7420617574686f72697479476174657761793a20616d6f756e74206973206c657373207468616e20746865206d696e696d756d206275726e20616d6f756e7445434453413a20696e76616c6964207369676e6174757265202773272076616c7565476174657761793a206d696e74417574686f726974792063616e6e6f742062652073657420746f2061646472657373207a65726f45434453413a20696e76616c6964207369676e6174757265202776272076616c7565476174657761793a2066656520726563697069656e742063616e6e6f7420626520307830536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a6564436c61696d61626c653a2063616c6c6572206973206e6f74207468652070656e64696e67206f776e6572476174657761793a206e6f6e6365206861736820616c7265616479207370656e745361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220003cb21f50850313539fb2fa014f60e88ee8392e26fce4f892ca1df15cc840e964736f6c634300060c0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101b95760003560e01c806377f61403116100f9578063daca6f7811610097578063f2fde38b11610071578063f2fde38b1461071f578063f65d901c14610752578063fc0c546a14610785578063fce589d81461078d576101b9565b8063daca6f7814610637578063e30c3978146106e4578063f160d369146106ec576101b9565b806394c238ac116100d357806394c238ac14610597578063a2999beb1461059f578063aa4df9ad146105fc578063c4d66de814610604576101b9565b806377f614031461049d5780638da5cb5b146105875780639340b21e1461058f576101b9565b80633a521b8d1161016657806352ad0d5e1161014057806352ad0d5e1461034657806359c9176c146103775780635cc66106146103985780636d8b1875146103b9576101b9565b80633a521b8d146102f0578063469048401461030d5780634e71e0c81461033e576101b9565b806316114acd1161019757806316114acd1461021a57806321e6b53d1461024d57806338463cff14610280576101b9565b80630130a33b146101be57806310731a65146101f357806313966db5146101fb575b600080fd5b6101f1600480360360208110156101d457600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610795565b005b6101f1610923565b6102036109a7565b6040805161ffff9092168252519081900360200190f35b6101f16004803603602081101561023057600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166109c9565b6101f16004803603602081101561026357600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610bd3565b6101f16004803603604081101561029657600080fd5b8101906020810181356401000000008111156102b157600080fd5b8201836020820111156102c357600080fd5b803590602001918460018302840111640100000000831117156102e557600080fd5b919350915035610d48565b6101f16004803603602081101561030657600080fd5b5035611189565b610315611214565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6101f1611230565b6103636004803603602081101561035c57600080fd5b50356112ec565b604080519115158252519081900360200190f35b6101f16004803603602081101561038d57600080fd5b503561ffff16611301565b6101f1600480360360208110156103ae57600080fd5b503561ffff166113d6565b61048b600480360360a08110156103cf57600080fd5b8101906020810181356401000000008111156103ea57600080fd5b8201836020820111156103fc57600080fd5b8035906020019184600183028401116401000000008311171561041e57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505073ffffffffffffffffffffffffffffffffffffffff833581169450602084013593604081013590911692506060013590506114a9565b60408051918252519081900360200190f35b6101f1600480360360a08110156104b357600080fd5b8101906020810181356401000000008111156104ce57600080fd5b8201836020820111156104e057600080fd5b8035906020019184600183028401116401000000008311171561050257600080fd5b9193909273ffffffffffffffffffffffffffffffffffffffff83351692602081013592604082013592909160808101906060013564010000000081111561054857600080fd5b82018360208201111561055a57600080fd5b8035906020019184600183028401116401000000008311171561057c57600080fd5b5090925090506115d1565b610315611b0c565b610315611b28565b61048b611b44565b6101f1600480360360c08110156105b557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101358216916040820135169061ffff606082013581169160808101359091169060a00135611b4a565b61048b611d50565b6101f16004803603602081101561061a57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611d56565b6103636004803603604081101561064d57600080fd5b8135919081019060408101602082013564010000000081111561066f57600080fd5b82018360208201111561068157600080fd5b803590602001918460018302840111640100000000831117156106a357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611e74945050505050565b610315611eb7565b6101f16004803603602081101561070257600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611ed3565b6101f16004803603602081101561073557600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661200c565b6101f16004803603602081101561076857600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612163565b610315612238565b610203612254565b60385473ffffffffffffffffffffffffffffffffffffffff163314806107ed57506107be611b0c565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610842576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806136096032913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81166108ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260348152602001806136916034913960400191505060405180910390fd5b603880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691909117918290556040519116907ff0f08e606c1dd3a2c220ada53422fd9fe0aa75614b27db0549f649de3ad2072a90600090a250565b603760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634e71e0c86040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561098d57600080fd5b505af11580156109a1573d6000803e3d6000fd5b50505050565b60395474010000000000000000000000000000000000000000900461ffff1681565b60335473ffffffffffffffffffffffffffffffffffffffff163314610a4f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811660009081526035602052604090205460ff1615610ace576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806135df602a913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116610b1b5760405133904780156108fc02916000818181858888f19350505050158015610b15573d6000803e3d6000fd5b50610bd0565b610bd0338273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610b8657600080fd5b505afa158015610b9a573d6000803e3d6000fd5b505050506040513d6020811015610bb057600080fd5b505173ffffffffffffffffffffffffffffffffffffffff84169190612278565b50565b60335473ffffffffffffffffffffffffffffffffffffffff163314610c5957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b603754604080517ff2fde38b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301529151919092169163f2fde38b91602480830192600092919082900301818387803b158015610ccd57600080fd5b505af1158015610ce1573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff166310731a656040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610d2d57600080fd5b505af1158015610d41573d6000803e3d6000fd5b5050505050565b603754604080517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101849052905173ffffffffffffffffffffffffffffffffffffffff909216916323b872dd916064808201926020929091908290030181600087803b158015610dc857600080fd5b505af1158015610ddc573d6000803e3d6000fd5b505050506040513d6020811015610df257600080fd5b5051610e5f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f746f6b656e207472616e73666572206661696c65640000000000000000000000604482015290519081900360640190fd5b81610ecb57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f476174657761793a20746f206164647265737320697320656d70747900000000604482015290519081900360640190fd5b603954600090610f089061271090610f02908590760100000000000000000000000000000000000000000000900461ffff1661230a565b90612384565b90506000610f56826040518060400160405280601b81526020017f476174657761793a20666565206578636565647320616d6f756e740000000000815250856123c69092919063ffffffff16565b603754604080517f42966c6800000000000000000000000000000000000000000000000000000000815260048101879052905192935073ffffffffffffffffffffffffffffffffffffffff909116916342966c689160248082019260009290919082900301818387803b158015610fcc57600080fd5b505af1158015610fe0573d6000803e3d6000fd5b5050603754603954604080517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff92831660048201526024810188905290519190921693506340c10f199250604480830192600092919082900301818387803b15801561106257600080fd5b505af1158015611076573d6000803e3d6000fd5b5050505060365481116110d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603481526020018061363b6034913960400191505060405180910390fd5b84846040518083838082843760408051939091018390038320603b54602085018990528285529184018b9052955093507f1619fc95050ffb8c94c9077c82b3e1ebbf8d571b6234241c55ba0aaf40da019e9250899189915086908060608101858580828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016909201829003965090945050505050a35050603b80546001019055505050565b60335473ffffffffffffffffffffffffffffffffffffffff16331461120f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b603655565b60395473ffffffffffffffffffffffffffffffffffffffff1681565b60345473ffffffffffffffffffffffffffffffffffffffff1633146112a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a81526020018061375a602a913960400191505060405180910390fd5b6034546112c29073ffffffffffffffffffffffffffffffffffffffff1661243a565b603480547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b603a6020526000908152604090205460ff1681565b60335473ffffffffffffffffffffffffffffffffffffffff16331461138757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6039805461ffff909216760100000000000000000000000000000000000000000000027fffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffff909216919091179055565b60335473ffffffffffffffffffffffffffffffffffffffff16331461145c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6039805461ffff90921674010000000000000000000000000000000000000000027fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff909216919091179055565b600080868660405160200180806020018373ffffffffffffffffffffffffffffffffffffffff168152602001828103825284818151815260200191508051906020019080838360005b8381101561150a5781810151838201526020016114f2565b50505050905090810190601f1680156115375780820380516001836020036101000a031916815260200191505b50604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120603754828501919091528284018d905273ffffffffffffffffffffffffffffffffffffffff90811660608501528b16608084015260a08084018b90528251808503909101815260c090930190915281519101209550505050505095945050505050565b600087878760405160200180806020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281038252858582818152602001925080828437600081840152601f19601f820116905080830192505050945050505050604051602081830303815290604052805190602001209050600061168d89898080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508b92508a9150339050896114a9565b6000818152603a602052604090205490915060ff16156116f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806137846021913960400191505060405180910390fd5b6117388185858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611e7492505050565b6118c1576118236040518060600160405280602381526020016135bc60239139611761846124c8565b6040518060400160405280600a81526020017f2c20616d6f756e743a20000000000000000000000000000000000000000000008152506117a08a6126f3565b6040518060400160405280600e81526020017f2c206d73672e73656e6465723a200000000000000000000000000000000000008152506117df3361281d565b6040518060400160405280600a81526020017f2c205f6e486173683a200000000000000000000000000000000000000000000081525061181e8d6124c8565b612a5a565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561188657818101518382015260200161186e565b50505050905090810190601f1680156118b35780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b6000818152603a6020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905560395461192b9061271090610f02908a9061ffff740100000000000000000000000000000000000000009091041661230a565b90506000611979826040518060400160405280601b81526020017f476174657761793a20666565206578636565647320616d6f756e7400000000008152508a6123c69092919063ffffffff16565b603754604080517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8d811660048301526024820185905291519394509116916340c10f199160448082019260009290919082900301818387803b1580156119f657600080fd5b505af1158015611a0a573d6000803e3d6000fd5b5050603754603954604080517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff92831660048201526024810188905290519190921693506340c10f199250604480830192600092919082900301818387803b158015611a8c57600080fd5b505af1158015611aa0573d6000803e3d6000fd5b5050505082603b548a73ffffffffffffffffffffffffffffffffffffffff167fa58ba939eb08dab7eaf8ad09c16e7405ee88e5153e15da62d5481296a9f727fa846040518082815260200191505060405180910390a45050603b80546001019055505050505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff1690565b60385473ffffffffffffffffffffffffffffffffffffffff1681565b60365481565b600054610100900460ff1680611b635750611b63612e99565b80611b71575060005460ff16155b611bc6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e81526020018061372c602e913960400191505060405180910390fd5b600054610100900460ff16158015611c2c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116610100171660011790555b611c3533611d56565b60368290556037805473ffffffffffffffffffffffffffffffffffffffff89167fffffffffffffffffffffffff00000000000000000000000000000000000000009091161790556039805461ffff858116760100000000000000000000000000000000000000000000027fffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffff91881674010000000000000000000000000000000000000000027fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff9093169290921716179055611d0f85610795565b611d1886611ed3565b8015611d4757600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690555b50505050505050565b603b5481565b600054610100900460ff1680611d6f5750611d6f612e99565b80611d7d575060005460ff16155b611dd2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e81526020018061372c602e913960400191505060405180910390fd5b600054610100900460ff16158015611e3857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116610100171660011790555b611e4182612e9f565b8015611e7057600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690555b5050565b600080611e8084612ff3565b90506000611e8e8285613044565b60385473ffffffffffffffffffffffffffffffffffffffff908116911614925050505b92915050565b60345473ffffffffffffffffffffffffffffffffffffffff1681565b60335473ffffffffffffffffffffffffffffffffffffffff163314611f5957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116611fc5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806136e76024913960400191505060405180910390fd5b603980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60335473ffffffffffffffffffffffffffffffffffffffff16331461209257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60345473ffffffffffffffffffffffffffffffffffffffff8281169116141561211c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f436c61696d61626c653a20696e76616c6964206e6577206f776e657200000000604482015290519081900360640190fd5b603480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60335473ffffffffffffffffffffffffffffffffffffffff1633146121e957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff16600090815260356020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b60375473ffffffffffffffffffffffffffffffffffffffff1681565b603954760100000000000000000000000000000000000000000000900461ffff1681565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526123059084906132c2565b505050565b60008261231957506000611eb1565b8282028284828161232657fe5b041461237d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061370b6021913960400191505060405180910390fd5b9392505050565b600061237d83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613500565b60008184841115612432576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181815283516024840152835190928392604490910191908501908083836000831561188657818101518382015260200161186e565b505050900390565b60335460405173ffffffffffffffffffffffffffffffffffffffff8084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b604080518082018252601081527f3031323334353637383961626364656600000000000000000000000000000000602082015281516042808252608082019093526060928391906020820181803683370190505090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061254c57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106125a957fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060005b60208110156126e9578260048683602081106125f357fe5b1a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916901c60f81c60ff168151811061262b57fe5b602001015160f81c60f81b82826002026002018151811061264857fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508285826020811061268457fe5b825191901a600f1690811061269557fe5b602001015160f81c60f81b8282600202600301815181106126b257fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506001016125db565b509150505b919050565b606081612734575060408051808201909152600181527f300000000000000000000000000000000000000000000000000000000000000060208201526126ee565b8160005b811561274c57600101600a82049150612738565b60608167ffffffffffffffff8111801561276557600080fd5b506040519080825280601f01601f191660200182016040528015612790576020820181803683370190505b5090507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82015b851561281457600a860660300160f81b828280600190039350815181106127da57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a860495506127b7565b50949350505050565b604080518082018252601081527f303132333435363738396162636465660000000000000000000000000000000060208201528151602a808252606082810190945273ffffffffffffffffffffffffffffffffffffffff8516929184916020820181803683370190505090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106128b757fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061291457fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060005b6014811015612814578260048583600c016020811061296157fe5b1a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916901c60f81c60ff168151811061299957fe5b602001015160f81c60f81b8282600202600201815181106129b657fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350828482600c01602081106129f557fe5b825191901a600f16908110612a0657fe5b602001015160f81c60f81b828260020260030181518110612a2357fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600101612946565b606088888888888888886040516020018089805190602001908083835b60208310612ab457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612a77565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790528b5191909301928b0191508083835b60208310612b3857805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612afb565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790528a5191909301928a0191508083835b60208310612bbc57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612b7f565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905289519190930192890191508083835b60208310612c4057805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612c03565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905288519190930192880191508083835b60208310612cc457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612c87565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905287519190930192870191508083835b60208310612d4857805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612d0b565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905286519190930192860191508083835b60208310612dcc57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612d8f565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905285519190930192850191508083835b60208310612e5057805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612e13565b6001836020036101000a03801982511681845116808217855250505050505090500198505050505050505050604051602081830303815290604052905098975050505050505050565b303b1590565b600054610100900460ff1680612eb85750612eb8612e99565b80612ec6575060005460ff16155b612f1b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e81526020018061372c602e913960400191505060405180910390fd5b600054610100900460ff16158015612f8157600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116610100171660011790555b603380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84161790558015611e7057600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690555050565b604080517f19457468657265756d205369676e6564204d6573736167653a0a333200000000602080830191909152603c8083019490945282518083039094018452605c909101909152815191012090565b600081516041146130b657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015290519081900360640190fd5b60208201516040830151606084015160001a7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0821115613141576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602281526020018061366f6022913960400191505060405180910390fd5b8060ff16601b1415801561315957508060ff16601c14155b156131af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806136c56022913960400191505060405180910390fd5b600060018783868660405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa15801561320b573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166132b857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015290519081900360640190fd5b9695505050505050565b6132e18273ffffffffffffffffffffffffffffffffffffffff1661357f565b61334c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b600060608373ffffffffffffffffffffffffffffffffffffffff16836040518082805190602001908083835b602083106133b557805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613378565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613417576040519150601f19603f3d011682016040523d82523d6000602084013e61341c565b606091505b50915091508161348d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b8051156109a1578080602001905160208110156134a957600080fd5b50516109a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806137a5602a913960400191505060405180910390fd5b60008183613569576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181815283516024840152835190928392604490910191908501908083836000831561188657818101518382015260200161186e565b50600083858161357557fe5b0495945050505050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708181148015906135b357508115155b94935050505056fe476174657761793a20696e76616c6964207369676e61747572652e2070486173683a2043616e5265636c61696d546f6b656e733a20746f6b656e206973206e6f74207265636f76657261626c65476174657761793a2063616c6c6572206973206e6f7420746865206f776e6572206f72206d696e7420617574686f72697479476174657761793a20616d6f756e74206973206c657373207468616e20746865206d696e696d756d206275726e20616d6f756e7445434453413a20696e76616c6964207369676e6174757265202773272076616c7565476174657761793a206d696e74417574686f726974792063616e6e6f742062652073657420746f2061646472657373207a65726f45434453413a20696e76616c6964207369676e6174757265202776272076616c7565476174657761793a2066656520726563697069656e742063616e6e6f7420626520307830536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a6564436c61696d61626c653a2063616c6c6572206973206e6f74207468652070656e64696e67206f776e6572476174657761793a206e6f6e6365206861736820616c7265616479207370656e745361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220003cb21f50850313539fb2fa014f60e88ee8392e26fce4f892ca1df15cc840e964736f6c634300060c0033
Deployed Bytecode Sourcemap
47192:9005:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49764:491;;;;;;;;;;;;;;;;-1:-1:-1;49764:491:0;;;;:::i;:::-;;49228:79;;;:::i;46653:21::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;42916:478;;;;;;;;;;;;;;;;-1:-1:-1;42916:478:0;;;;:::i;49398:215::-;;;;;;;;;;;;;;;;-1:-1:-1;49398:215:0;;;;:::i;54052:1222::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54052:1222:0;-1:-1:-1;54052:1222:0;;:::i;50400:147::-;;;;;;;;;;;;;;;;-1:-1:-1;50400:147:0;;:::i;46578:27::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;42195:131;;;:::i;46807:38::-;;;;;;;;;;;;;;;;-1:-1:-1;46807:38:0;;:::i;:::-;;;;;;;;;;;;;;;;;;51403:102;;;;;;;;;;;;;;;;-1:-1:-1;51403:102:0;;;;:::i;51161:::-;;;;;;;;;;;;;;;;-1:-1:-1;51161:102:0;;;;:::i;55810:384::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55810:384:0;;-1:-1:-1;;55810:384:0;;;;;;-1:-1:-1;55810:384:0;;;;;;;;;;;;;-1:-1:-1;55810:384:0;;;;-1:-1:-1;55810:384:0;:::i;:::-;;;;;;;;;;;;;;;;51513:1966;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51513:1966:0;;-1:-1:-1;51513:1966:0;-1:-1:-1;51513:1966:0;:::i;41041:79::-;;;:::i;46297:28::-;;;:::i;46069:29::-;;;:::i;48441:510::-;;;;;;;;;;;;;;;;-1:-1:-1;48441:510:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;46951:21::-;;;:::i;42492:119::-;;;;;;;;;;;;;;;;-1:-1:-1;42492:119:0;;;;:::i;55391:327::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55391:327:0;;-1:-1:-1;55391:327:0;;-1:-1:-1;;;;;55391:327:0:i;40727:27::-;;;:::i;50697:322::-;;;;;;;;;;;;;;;;-1:-1:-1;50697:322:0;;;;:::i;41670:217::-;;;;;;;;;;;;;;;;-1:-1:-1;41670:217:0;;;;:::i;42619:128::-;;;;;;;;;;;;;;;;-1:-1:-1;42619:128:0;;;;:::i;46182:28::-;;;:::i;46722:21::-;;;:::i;49764:491::-;47799:13;;;;47785:10;:27;;:52;;;47830:7;:5;:7::i;:::-;47816:21;;:10;:21;;;47785:52;47763:152;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50036:32:::1;::::0;::::1;50014:134;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50159:13;:34:::0;;;::::1;;::::0;;::::1;::::0;;;::::1;::::0;;;;50209:38:::1;::::0;50233:13;::::1;::::0;50209:38:::1;::::0;-1:-1:-1;;50209:38:0::1;49764:491:::0;:::o;49228:79::-;49277:5;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49228:79::o;46653:21::-;;;;;;;;;:::o;42916:478::-;41253:6;;:20;:6;41263:10;41253:20;41245:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43008:34:::1;::::0;::::1;;::::0;;;:26:::1;:34;::::0;;;;;::::1;;43007:35;42985:127;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43129:22;::::0;::::1;43125:262;;43168:42;::::0;:10:::1;::::0;43188:21:::1;43168:42:::0;::::1;;;::::0;::::1;::::0;;;43188:21;43168:10;:42;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;43125:262;;;43243:132;43299:10;43328:6;43311:34;;;43354:4;43311:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;43311:49:0;43243:37:::1;::::0;::::1;::::0;:132;:37:::1;:132::i;:::-;42916:478:::0;:::o;49398:215::-;41253:6;;:20;:6;41263:10;41253:20;41245:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49508:5:::1;::::0;:49:::1;::::0;;;;;:5:::1;:49:::0;;::::1;;::::0;::::1;::::0;;;:5;;;::::1;::::0;:23:::1;::::0;:49;;;;;:5:::1;::::0;:49;;;;;;;:5;;:49;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;49568:15;:35;;;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;49398:215:::0;:::o;54052:1222::-;54232:5;;:54;;;;;;54251:10;54232:54;;;;54271:4;54232:54;;;;;;;;;;;;:5;;;;;:18;;:54;;;;;;;;;;;;;;;:5;;:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54232:54:0;54210:125;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54503:15;54495:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54651:7;;54628:8;;54639:42;;46057:5;;54639:20;;:7;;54651;;;;;54639:11;:20::i;:::-;:24;;:42::i;:::-;54628:53;;54692:19;54714:84;54740:3;54714:84;;;;;;;;;;;;;;;;;:7;:11;;:84;;;;;:::i;:::-;54872:5;;:19;;;;;;;;;;;;;;54692:106;;-1:-1:-1;54872:5:0;;;;;:10;;:19;;;;;:5;;:19;;;;;;;;:5;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;54902:5:0;;54913:12;;54902:29;;;;;;:5;54913:12;;;54902:29;;;;;;;;;;;;:5;;;;;-1:-1:-1;54902:10:0;;-1:-1:-1;54902:29:0;;;;;:5;;:29;;;;;;;:5;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55090:17;;55073:14;:34;54944:243;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55241:3;;55205:40;;;;;;;;;;;;;;;;;;;;;55234:5;;55205:40;;;;;;;;;;;;;;;;-1:-1:-1;55234:5:0;-1:-1:-1;55205:40:0;;-1:-1:-1;55213:3:0;;;;-1:-1:-1;55218:14:0;;55205:40;;;;55213:3;;;;55205:40;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55205:40:0;;-1:-1:-1;;;;;55205:40:0;-1:-1:-1;;55256:5:0;:10;;55265:1;55256:10;;;-1:-1:-1;;;54052:1222:0:o;50400:147::-;41253:6;;:20;:6;41263:10;41253:20;41245:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50501:17:::1;:38:::0;50400:147::o;46578:27::-;;;;;;:::o;42195:131::-;41413:12;;;;41399:10;:26;41377:118;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42275:12:::1;::::0;42256:32:::1;::::0;42275:12:::1;;42256:18;:32::i;:::-;42306:12;42299:19:::0;;;::::1;::::0;;42195:131::o;46807:38::-;;;;;;;;;;;;;;;:::o;51403:102::-;41253:6;;:20;:6;41263:10;41253:20;41245:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51475:7:::1;:22:::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;51403:102::o;51161:::-;41253:6;;:20;:6;41263:10;41253:20;41245:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51233:7:::1;:22:::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;51161:102::o;55810:384::-;55999:7;56019:19;56062:7;56071:10;56051:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56051:31:0;;;;;;;;;;;;;56041:42;;56051:31;56041:42;;;;56161:5;;56120:65;;;;;;;;;;;;;56161:5;;;;56120:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56110:76;;;;;;-1:-1:-1;;;;;;55810:384:0;;;;;;;:::o;51513:1966::-;51695:19;51738:7;;51747:10;51727:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51717:42;;;;;;51695:64;;51799:25;51827:142;51858:7;;51827:142;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51880:10:0;;-1:-1:-1;51905:7:0;;-1:-1:-1;51927:10:0;;-1:-1:-1;51952:6:0;51827:16;:142::i;:::-;52002:25;;;;:6;:25;;;;;;51799:170;;-1:-1:-1;52002:25:0;;:34;51980:117;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52113:40;52129:17;52148:4;;52113:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52113:15:0;;-1:-1:-1;;;52113:40:0:i;:::-;52108:693;;52372:402;;;;;;;;;;;;;;;;;;52466:31;52485:11;52466:18;:31::i;:::-;52372:402;;;;;;;;;;;;;;;;;52555:24;52571:7;52555:15;:24::i;:::-;52372:402;;;;;;;;;;;;;;;;;52641:30;52660:10;52641:18;:30::i;:::-;52372:402;;;;;;;;;;;;;;;;;52729:26;52748:6;52729:18;:26::i;:::-;52372:11;:402::i;:::-;52347:442;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52108:693;52811:25;;;;:6;:25;;;;;:32;;;;52839:4;52811:32;;;52967:7;;52955:66;;46057:5;;52955:20;;:7;;52967;;;;;;52955:11;:20::i;:66::-;52936:85;;53032:19;53054:92;53080:11;53054:92;;;;;;;;;;;;;;;;;:7;:11;;:92;;;;;:::i;:::-;53197:5;;:38;;;;;;:5;:38;;;;;;;;;;;;;;;53032:114;;-1:-1:-1;53197:5:0;;;:10;;:38;;;;;:5;;:38;;;;;;;;:5;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;53271:5:0;;53282:12;;53271:37;;;;;;:5;53282:12;;;53271:37;;;;;;;;;;;;:5;;;;;-1:-1:-1;53271:10:0;;-1:-1:-1;53271:37:0;;;;;:5;;:37;;;;;;;:5;;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53422:17;53402:5;;53348:10;53326:124;;;53373:14;53326:124;;;;;;;;;;;;;;;;;;-1:-1:-1;;53461:5:0;:10;;53470:1;53461:10;;;-1:-1:-1;;;;;;;;;51513:1966:0:o;41041:79::-;41106:6;;;;41041:79;:::o;46297:28::-;;;;;;:::o;46069:29::-;;;;:::o;48441:510::-;10017:12;;;;;;;;:31;;;10033:15;:13;:15::i;:::-;10017:47;;;-1:-1:-1;10053:11:0;;;;10052:12;10017:47;10009:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10124:19;10147:12;;;;;;10146:13;10166:83;;;;10195:12;:19;;10223:18;10195:19;;;;;;10223:18;10210:4;10223:18;;;10166:83;48682:39:::1;48710:10;48682:27;:39::i;:::-;48732:17;:38:::0;;;48781:5:::1;:14:::0;;::::1;::::0;::::1;::::0;;;::::1;;::::0;;48806:7:::1;:18:::0;;::::1;48835::::0;;::::1;::::0;::::1;::::0;48806;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;::::1;48835;;::::0;;48864:35:::1;48884:14:::0;48864:19:::1;:35::i;:::-;48910:33;48929:13;48910:18;:33::i;:::-;10271:14:::0;10267:57;;;10311:5;10296:20;;;;;;10267:57;48441:510;;;;;;;:::o;46951:21::-;;;;:::o;42492:119::-;10017:12;;;;;;;;:31;;;10033:15;:13;:15::i;:::-;10017:47;;;-1:-1:-1;10053:11:0;;;;10052:12;10017:47;10009:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10124:19;10147:12;;;;;;10146:13;10166:83;;;;10195:12;:19;;10223:18;10195:19;;;;;;10223:18;10210:4;10223:18;;;10166:83;42571:32:::1;42592:10;42571:20;:32::i;:::-;10271:14:::0;10267:57;;;10311:5;10296:20;;;;;;10267:57;42492:119;;:::o;55391:327::-;55499:4;55521:28;55552:48;55581:18;55552:28;:48::i;:::-;55521:79;;55611:14;55628:41;55642:20;55664:4;55628:13;:41::i;:::-;55687:13;;:23;:13;;;:23;;;;-1:-1:-1;;;55391:327:0;;;;;:::o;40727:27::-;;;;;;:::o;50697:322::-;41253:6;;:20;:6;41263:10;41253:20;41245:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50869:33:::1;::::0;::::1;50847:119;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50979:12;:32:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;50697:322::o;41670:217::-;41253:6;;:20;:6;41263:10;41253:20;41245:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41777:12:::1;::::0;::::1;41765:24:::0;;::::1;41777:12:::0;::::1;41765:24;;41743:102;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;41856:12;:23:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;41670:217::o;42619:128::-;41253:6;;:20;:6;41263:10;41253:20;41245:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42698:34:::1;;;::::0;;;:26:::1;:34;::::0;;;;:41;;;::::1;42735:4;42698:41;::::0;;42619:128::o;46182:28::-;;;;;;:::o;46722:21::-;;;;;;;;;:::o;37318:177::-;37428:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37451:23;37428:58;;;37401:86;;37421:5;;37401:19;:86::i;:::-;37318:177;;;:::o;17203:471::-;17261:7;17506:6;17502:47;;-1:-1:-1;17536:1:0;17529:8;;17502:47;17573:5;;;17577:1;17573;:5;:1;17597:5;;;;;:10;17589:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17665:1;17203:471;-1:-1:-1;;;17203:471:0:o;18142:132::-;18200:7;18227:39;18231:1;18234;18227:39;;;;;;;;;;;;;;;;;:3;:39::i;16760:192::-;16846:7;16882:12;16874:6;;;;16866:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;16918:5:0;;;16760:192::o;42042:145::-;42134:6;;42113:38;;;;;;;42134:6;;42113:38;;42134:6;;42113:38;42162:6;:17;;;;;;;;;;;;;;;42042:145::o;4460:456::-;4546:42;;;;;;;;;;;;;;;;4620:21;;4630:10;4620:21;;;;;;;;;4520:13;;;;4620:21;;;;;;;;;;;-1:-1:-1;4620:21:0;4601:40;;4652:12;:3;4656:1;4652:6;;;;;;;;;;;:12;;;;;;;;;;;4675;:3;4679:1;4675:6;;;;;;;;;;;:12;;;;;;;;;;;4703:6;4698:182;4719:2;4715:1;:6;4698:182;;;4760:8;4793:1;4780:6;4787:1;4780:9;;;;;;;;;;:14;;;;;4774:21;;4769:27;;4760:37;;;;;;;;;;;;;;;;4743:3;4751:1;4755;4751:5;4747:1;:9;4743:14;;;;;;;;;;;:54;;;;;;;;;;;4829:8;4849:6;4856:1;4849:9;;;;;;;4829:39;;4849:9;;;4861:4;4843:23;;4829:39;;;;;;;;;;;;;;4812:3;4820:1;4824;4820:5;4816:1;:9;4812:14;;;;;;;;;;;:56;;;;;;;;;;-1:-1:-1;4723:3:0;;4698:182;;;-1:-1:-1;4904:3:0;-1:-1:-1;;4460:456:0;;;;:::o;3905:472::-;3955:13;3985:7;3981:50;;-1:-1:-1;4009:10:0;;;;;;;;;;;;;;;;;;;3981:50;4050:2;4041:6;4082:69;4089:6;;4082:69;;4112:5;;4137:2;4132:7;;;;4082:69;;;4161:17;4191:3;4181:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4181:14:0;-1:-1:-1;4161:34:0;-1:-1:-1;4215:7:0;;;4233:107;4240:7;;4233:107;;4300:2;4295;:7;4289:2;:14;4276:29;;4264:4;4269:3;;;;;;;4264:9;;;;;;;;;;;:41;;;;;;;;;;-1:-1:-1;4326:2:0;4320:8;;;;4233:107;;;-1:-1:-1;4364:4:0;3905:472;-1:-1:-1;;;;3905:472:0:o;4994:510::-;5126:42;;;;;;;;;;;;;;;;5200:21;;5210:10;5200:21;;;5053:13;5200:21;;;;;;5103:11;;;;5126:42;5053:13;;5200:21;;;;;;;;;;-1:-1:-1;5200:21:0;5181:40;;5232:12;:3;5236:1;5232:6;;;;;;;;;;;:12;;;;;;;;;;;5255;:3;5259:1;5255:6;;;;;;;;;;;:12;;;;;;;;;;;5283:6;5278:190;5299:2;5295:1;:6;5278:190;;;5340:8;5377:1;5360:5;5366:1;5370:2;5366:6;5360:13;;;;;;;;;;:18;;;;;5354:25;;5349:31;;5340:41;;;;;;;;;;;;;;;;5323:3;5331:1;5335;5331:5;5327:1;:9;5323:14;;;;;;;;;;;:58;;;;;;;;;;;5413:8;5433:5;5439:1;5443:2;5439:6;5433:13;;;;;;;5413:43;;5433:13;;;5449:4;5427:27;;5413:43;;;;;;;;;;;;;;5396:3;5404:1;5408;5404:5;5400:1;:9;5396:14;;;;;;;;;;;:60;;;;;;;;;;-1:-1:-1;5303:3:0;;5278:190;;5551:341;5803:13;5860:1;5863;5866;5869;5872;5875;5878;5881;5843:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5843:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5843:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5843:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5843:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5843:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5843:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5843:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5829:55;;5551:341;;;;;;;;;;:::o;10418:508::-;10835:4;10881:17;10913:7;10418:508;:::o;40855:105::-;10017:12;;;;;;;;:31;;;10033:15;:13;:15::i;:::-;10017:47;;;-1:-1:-1;10053:11:0;;;;10052:12;10017:47;10009:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10124:19;10147:12;;;;;;10146:13;10166:83;;;;10195:12;:19;;10223:18;10195:19;;;;;;10223:18;10210:4;10223:18;;;10166:83;40933:6:::1;:19:::0;;;::::1;;::::0;::::1;;::::0;;10267:57;;;;10311:5;10296:20;;;;;;40855:105;;:::o;3473:269::-;3675:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3665:69;;;;;;3473:269::o;1089:2110::-;1167:7;1230:9;:16;1250:2;1230:22;1226:96;;1269:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1226:96;1683:4;1668:20;;1662:27;1729:4;1714:20;;1708:27;1783:4;1768:20;;1762:27;1391:9;1754:36;2713:66;2700:79;;2696:156;;;2796:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2696:156;2868:1;:7;;2873:2;2868:7;;:18;;;;;2879:1;:7;;2884:2;2879:7;;2868:18;2864:95;;;2903:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2864:95;3056:14;3073:24;3083:4;3089:1;3092;3095;3073:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;3073:24:0;;;;;;-1:-1:-1;;3116:20:0;;;3108:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3185:6;1089:2110;-1:-1:-1;;;;;;1089:2110:0:o;39362:1115::-;39967:27;39975:5;39967:25;;;:27::i;:::-;39959:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40104:12;40118:23;40153:5;40145:19;;40165:4;40145:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40103:67;;;;40189:7;40181:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40250:17;;:21;40246:224;;40392:10;40381:30;;;;;;;;;;;;;;;-1:-1:-1;40381:30:0;40373:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18762:345;18848:7;18950:12;18943:5;18935:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18974:9;18990:1;18986;:5;;;;;;;18762:345;-1:-1:-1;;;;;18762:345:0:o;21025:619::-;21085:4;21553:20;;21396:66;21593:23;;;;;;:42;;-1:-1:-1;21620:15:0;;;21593:42;21585:51;21025:619;-1:-1:-1;;;;21025:619:0:o
Swarm Source
ipfs://003cb21f50850313539fb2fa014f60e88ee8392e26fce4f892ca1df15cc840e9
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.