Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00Latest 25 from a total of 729 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Burn | 15485552 | 1276 days ago | IN | 0 ETH | 0.00338741 | ||||
| Burn | 14261123 | 1472 days ago | IN | 0 ETH | 0.00406262 | ||||
| Mint | 13483189 | 1593 days ago | IN | 0 ETH | 0.00822064 | ||||
| Burn | 13031430 | 1663 days ago | IN | 0 ETH | 0.00336663 | ||||
| Mint | 12974100 | 1672 days ago | IN | 0 ETH | 0.0051783 | ||||
| Burn | 12925081 | 1680 days ago | IN | 0 ETH | 0.00182054 | ||||
| Burn | 12914102 | 1682 days ago | IN | 0 ETH | 0.00176489 | ||||
| Burn | 12779827 | 1703 days ago | IN | 0 ETH | 0.0015079 | ||||
| Burn | 12763537 | 1705 days ago | IN | 0 ETH | 0.00077013 | ||||
| Burn | 12670842 | 1720 days ago | IN | 0 ETH | 0.00064383 | ||||
| Burn | 12660400 | 1721 days ago | IN | 0 ETH | 0.00225948 | ||||
| Mint | 12660371 | 1721 days ago | IN | 0 ETH | 0.00335994 | ||||
| Mint | 12660348 | 1721 days ago | IN | 0 ETH | 0.00472537 | ||||
| Burn | 12654728 | 1722 days ago | IN | 0 ETH | 0.00089832 | ||||
| Burn | 12644728 | 1724 days ago | IN | 0 ETH | 0.00077028 | ||||
| Burn | 12644605 | 1724 days ago | IN | 0 ETH | 0.00064178 | ||||
| Burn | 12637968 | 1725 days ago | IN | 0 ETH | 0.00083431 | ||||
| Mint | 12637853 | 1725 days ago | IN | 0 ETH | 0.00135034 | ||||
| Burn | 12634477 | 1725 days ago | IN | 0 ETH | 0.00160445 | ||||
| Burn | 12629885 | 1726 days ago | IN | 0 ETH | 0.00089849 | ||||
| Burn | 12625330 | 1727 days ago | IN | 0 ETH | 0.00064178 | ||||
| Burn | 12619963 | 1728 days ago | IN | 0 ETH | 0.00079166 | ||||
| Burn | 12588363 | 1733 days ago | IN | 0 ETH | 0.00102684 | ||||
| Burn | 12574240 | 1735 days ago | IN | 0 ETH | 0.00121938 | ||||
| Burn | 12564603 | 1736 days ago | IN | 0 ETH | 0.00295218 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
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
Contract ABI
API[{"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
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
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.