Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 5 from a total of 5 transactions
Loading...
Loading
Contract Name:
ForestCredit
Compiler Version
v0.8.8+commit.dddeac2f
Optimization Enabled:
Yes with 1000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
pragma solidity ^0.8.7; // SPDX-License-Identifier: MIT import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; import "@openzeppelin/contracts/utils/math/SafeMath.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "./Roles.sol"; import "./IERC1404.sol"; contract ForestCredit is IERC20, IERC1404, IERC20Metadata, Ownable { /** * 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. */ using SafeMath for uint256; /** * Library for managing addresses assigned to a Role. */ using Roles for Roles.Role; Roles.Role _transferblock; Roles.Role _kyc; mapping(address => uint256) private _balances; mapping(uint8 => string) private _restrictionCodes; mapping(uint8 => string) private _burnCodes; mapping(uint8 => string) private _mintCodes; mapping(uint8 => string) private _blockCodes; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; uint8 private constant CODE_TYPE_RESTRICTION = 1; uint8 private constant CODE_TYPE_BURN = 2; uint8 private constant CODE_TYPE_MINT = 3; uint8 private constant CODE_TYPE_BLOCK = 4; uint8 private constant NO_RESTRICTIONS = 0; uint8 private constant FROM_NOT_IN_KYC_ROLE = 1; uint8 private constant TO_NOT_IN_KYC_ROLE = 2; uint8 private constant FROM_IN_TRANSFERBLOCK_ROLE = 3; uint8 private constant TO_IN_TRANSFERBLOCK_ROLE = 4; uint8 private constant NOT_ENOUGH_FUNDS = 5; constructor(string memory name, string memory symbol) { _name = name; _symbol = symbol; _restrictionCodes[0] = "NO_RESTRICTIONS"; _restrictionCodes[1] = "FROM_NOT_IN_KYC_ROLE"; _restrictionCodes[2] = "TO_NOT_IN_KYC_ROLE"; _restrictionCodes[3] = "FROM_IN_TRANSFERBLOCK_ROLE"; _restrictionCodes[4] = "TO_IN_TRANSFERBLOCK_ROLE"; _restrictionCodes[5] = "NOT_ENOUGH_FUNDS"; _mintCodes[0] = "SALE"; _mintCodes[1] = "REPLACE_TOKENS"; _mintCodes[2] = "OTHER"; _burnCodes[0] = "REPLACE_TOKENS"; _burnCodes[1] = "TECHNICAL_ISSUE"; _burnCodes[2] = "OTHER"; _blockCodes[0] = "KYC_ISSUE"; _blockCodes[1] = "MAINTENANCE"; _blockCodes[2] = "OTHER"; } /** * Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256) { return _totalSupply; } /** * Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256) { return _balances[account]; } /** * 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) { _transfer(_msgSender(), recipient, amount); return true; } /** * 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) { return _allowances[owner][spender]; } /** * Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * 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) { _transfer(sender, recipient, amount); _approve( sender, _msgSender(), _allowances[sender][_msgSender()].sub( amount, "ERC20: transfer amount exceeds allowance" ) ); return true; } /** * Atomically increases the allowance granted to `spender` by the caller. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) external returns (bool) { _approve( _msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue) ); return true; } /** * Atomically decreases the allowance granted to `spender` by the caller. * * 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) external returns (bool) { _approve( _msgSender(), spender, _allowances[_msgSender()][spender].sub( subtractedValue, "ERC20: decreased allowance below zero" ) ); return true; } /** * Moves tokens `amount` from `sender` to `recipient`. * * 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 { require(sender != address(0), "ERC20: transfer from the zero address"); require( recipient != address(0), "ERC20: transfer to the zero address" ); require( detectTransferRestriction(sender, recipient, amount) == NO_RESTRICTIONS, cat( _name, ": Transferrestriction detected please call detectTransferRestriction(address from, address to, uint256 value) for detailed information" ) ); _balances[sender] = _balances[sender].sub( amount, "ERC20: transfer amount exceeds balance" ); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } /** * Concatenate Strings with an optimized Method. * * Requirements * * - `a` a String * - `b` a String */ function cat(string memory a, string memory b) internal pure returns (string memory) { return string(abi.encodePacked(a, b)); } /** * 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 onlyOwner { require(account != address(0), "ERC20: mint to the zero address"); require(_kyc.has(account), cat(_name, ": address is not in kyc list")); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(address(0), account, amount); } /** * 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 onlyOwner { require(account != address(0), "ERC20: burn from the zero address"); _balances[account] = _balances[account].sub( amount, "ERC20: burn amount exceeds balance" ); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); } /** * Sets `amount` as the allowance of `spender` over the `owner`s tokens. * * 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 { 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); } /** * Destroys `amount` tokens from `account`. * * See {_burn}. */ function burn( address account, uint256 amount, uint8 code ) external onlyOwner { require( codeExist(code, CODE_TYPE_BURN), cat(_name, ": The code does not exist") ); _burn(account, amount); emit Burn(account, amount, code); } /** * Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Mint} event with `from` set to the zero address. * * Requirements * * - `to` cannot be the zero address. */ function mintTo( address account, uint256 amount, uint8 code ) external onlyOwner { require( codeExist(code, CODE_TYPE_MINT), cat(_name, ": The code does not exist") ); _mint(account, amount); emit Mint(account, amount, code); } /** * Returns a human-readable message for a given restrictioncode */ function messageForTransferRestriction(uint8 restrictionCode) external view returns (string memory) { require( codeExist(restrictionCode, CODE_TYPE_RESTRICTION), cat(_name, ": The code does not exist") ); return _restrictionCodes[restrictionCode]; } /** * Returns a human-readable message for a given burncode */ function messageForBurnCode(uint8 burnCode) external view returns (string memory) { require( codeExist(burnCode, CODE_TYPE_BURN), cat(_name, ": The code does not exist") ); return _burnCodes[burnCode]; } /** * Returns a human-readable message for a given mintcode */ function messageForMintCode(uint8 mintCode) external view returns (string memory) { require( codeExist(mintCode, CODE_TYPE_MINT), cat(_name, ": The code does not exist") ); return _mintCodes[mintCode]; } /** * Returns a human-readable message for a given blockcode */ function messageForBlockCode(uint8 blockCode) external view returns (string memory) { require( codeExist(blockCode, CODE_TYPE_BLOCK), cat(_name, ": The code does not exist") ); return _blockCodes[blockCode]; } /** * Detects if a transfer will be reverted and if so returns an appropriate reference code */ function detectTransferRestriction( address from, address to, uint256 value ) public view returns (uint8) { if (!_kyc.has(from)) { return FROM_NOT_IN_KYC_ROLE; } else if (!_kyc.has(to)) { return TO_NOT_IN_KYC_ROLE; } else if (_transferblock.has(from)) { return FROM_IN_TRANSFERBLOCK_ROLE; } else if (_transferblock.has(to)) { return TO_IN_TRANSFERBLOCK_ROLE; } else if (_balances[from] < value) { return NOT_ENOUGH_FUNDS; } else { return NO_RESTRICTIONS; } } /** * Mark a List of `address` with the kyc Role */ function addUserListToKycRole(address[] calldata whitelistedAddresses) external onlyOwner { for (uint256 i = 0; i < whitelistedAddresses.length; i++) { _kyc.add(whitelistedAddresses[i]); } } /** * Remove the Role kyc from an `address` */ function removeUserFromKycRole(address whitelistedAddress) external onlyOwner { require( _balances[whitelistedAddress] == 0, cat( _name, ": To remove someone from the whitelist the balance have to be 0" ) ); _kyc.remove(whitelistedAddress); } /** * Add the Role `transferblock` to an `address` */ function addTransferBlock(address blockedAddress, uint8 code) external onlyOwner { require( codeExist(code, CODE_TYPE_BLOCK), cat(_name, ": The code does not exist") ); _transferblock.add(blockedAddress); emit Block(blockedAddress, code); } /** * Remove the Role `transferblock` from an `address` */ function removeTransferblock(address unblockAddress, uint8 code) external onlyOwner { require( codeExist(code, CODE_TYPE_BLOCK), cat(_name, ": The code does not exist") ); _transferblock.remove(unblockAddress); emit Unblock(unblockAddress, code); } /** * Add a new `restrictionCode` with a related `codeText` to the available `_restrictionCodes` */ function setRestrictionCode(uint8 code, string calldata codeText) external onlyOwner { require( !codeExist(code, CODE_TYPE_RESTRICTION), cat(_name, ": The code already exists") ); require( code > 100, "ERC1404: Codes till 100 are reserverd for the SmartContract internals" ); _restrictionCodes[code] = codeText; } /** * Add a new `burncode` with a related `codeText` to the available `_burnCodes` */ function setBurnCode(uint8 code, string calldata codeText) external onlyOwner { require( !codeExist(code, CODE_TYPE_BURN), cat(_name, ": The code already exists") ); require( code > 100, "ERC1404: Codes till 100 are reserverd for the SmartContract internals" ); _burnCodes[code] = codeText; } /** * Add a new `mintcode` with a related `codeText` to the available `_mintCodes` */ function setMintCode(uint8 code, string calldata codeText) external onlyOwner { require( !codeExist(code, CODE_TYPE_MINT), cat(_name, ": The code already exists") ); require( code > 100, "ERC1404: Codes till 100 are reserverd for the SmartContract internals" ); _mintCodes[code] = codeText; } /** * Add a new `blockcode` with a related `codeText` to the available `_blockCodes` */ function setBlockCode(uint8 code, string calldata codeText) external onlyOwner { require( !codeExist(code, CODE_TYPE_BLOCK), cat(_name, ": The code already exists") ); require( code > 100, "ERC1404: Codes till 100 are reserverd for the SmartContract internals" ); _blockCodes[code] = codeText; } /** * Remove a `restrictioncode` from the available `_restrictionCodes` */ function removeRestrictionCode(uint8 restrictionCode) external onlyOwner { require( codeExist(restrictionCode, CODE_TYPE_RESTRICTION), cat(_name, ": The code does not exist") ); require( restrictionCode > 100, "ERC1404: Codes till 100 are reserverd for the SmartContract internals" ); delete _restrictionCodes[restrictionCode]; } /** * Remove a `burncode` from the available `_burnCodes` */ function removeBurnCode(uint8 code) external onlyOwner { require( codeExist(code, CODE_TYPE_BURN), cat(_name, ": The code does not exist") ); require( code > 100, "ERC1404: Codes till 100 are reserverd for the SmartContract internals" ); delete _burnCodes[code]; } /** * Remove a `mintcode` from the available `_mintCodes` */ function removeMintCode(uint8 code) external onlyOwner { require( codeExist(code, CODE_TYPE_MINT), cat(_name, ": The code does not exist") ); require( code > 100, "ERC1404: Codes till 100 are reserverd for the SmartContract internals" ); delete _mintCodes[code]; } /** * Remove a `blockcode` from the available `_blockCodes` */ function removeBlockCode(uint8 code) external onlyOwner { require( codeExist(code, CODE_TYPE_BLOCK), cat(_name, ": The code does not exist") ); require( code > 100, "ERC1404: Codes till 100 are reserverd for the SmartContract internals" ); delete _blockCodes[code]; } /** * Check if the given Code exists */ function codeExist(uint8 code, uint8 codeType) internal view returns (bool) { bytes memory memString; if (codeType == CODE_TYPE_RESTRICTION) { memString = bytes(_restrictionCodes[code]); } else if (codeType == CODE_TYPE_BURN) { memString = bytes(_burnCodes[code]); } else if (codeType == CODE_TYPE_MINT) { memString = bytes(_mintCodes[code]); } else if (codeType == CODE_TYPE_BLOCK) { memString = bytes(_blockCodes[code]); } if (memString.length == 0) { return false; } else { return true; } } 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 this function is * overridden; * * 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 pure returns (uint8) { return 18; } /** * Emitted when `value` tokens are burned from one account (`from`) */ event Burn(address indexed from, uint256 value, uint8 code); /** * Emitted when `value` tokens are minted to a account (`to`) */ event Mint(address indexed to, uint256 value, uint8 code); /** * Emitted when `blockAddress` is blocked for transfers for a reason (`code`) */ event Block(address indexed blockAddress, uint8 code); /** * Emitted when `unblockAddress` is no more blocked for transfers for a reason (`code`) */ event Unblock(address indexed unblockAddress, uint8 code); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @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 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 `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, 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 `from` to `to` 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 from, address to, uint256 amount ) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; import "../IERC20.sol"; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract 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() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual 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 { _transferOwnership(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"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
pragma solidity ^0.8.7; // SPDX-License-Identifier: MIT /** * @title Roles * @dev Library for managing addresses assigned to a Role. */ library Roles { struct Role { mapping(address => bool) bearer; } /** * @dev give an account access to this role */ function add(Role storage role, address account) internal { require(account != address(0)); require(!has(role, account)); role.bearer[account] = true; } /** * @dev remove an account's access to this role */ function remove(Role storage role, address account) internal { require(account != address(0)); require(has(role, account)); role.bearer[account] = false; } /** * @dev check if an account has this role * @return bool */ function has(Role storage role, address account) internal view returns (bool) { require(account != address(0)); return role.bearer[account]; } }
pragma solidity ^0.8.7; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; // SPDX-License-Identifier: MIT interface IERC1404 { /// @notice Detects if a transfer will be reverted and if so returns an appropriate reference code /// @param from Sending address /// @param to Receiving address /// @param value Amount of tokens being transferred /// @return Code by which to reference message for rejection reasoning function detectTransferRestriction( address from, address to, uint256 value ) external view returns (uint8); /// @notice Returns a human-readable message for a given restriction code /// @param restrictionCode Identifier for looking up a message /// @return Text showing the restriction's reasoning function messageForTransferRestriction(uint8 restrictionCode) external view returns (string memory); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
{ "optimizer": { "enabled": true, "runs": 1000 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"blockAddress","type":"address"},{"indexed":false,"internalType":"uint8","name":"code","type":"uint8"}],"name":"Block","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"uint8","name":"code","type":"uint8"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"uint8","name":"code","type":"uint8"}],"name":"Mint","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"unblockAddress","type":"address"},{"indexed":false,"internalType":"uint8","name":"code","type":"uint8"}],"name":"Unblock","type":"event"},{"inputs":[{"internalType":"address","name":"blockedAddress","type":"address"},{"internalType":"uint8","name":"code","type":"uint8"}],"name":"addTransferBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"whitelistedAddresses","type":"address[]"}],"name":"addUserListToKycRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint8","name":"code","type":"uint8"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"detectTransferRestriction","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"blockCode","type":"uint8"}],"name":"messageForBlockCode","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"burnCode","type":"uint8"}],"name":"messageForBurnCode","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"mintCode","type":"uint8"}],"name":"messageForMintCode","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"restrictionCode","type":"uint8"}],"name":"messageForTransferRestriction","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint8","name":"code","type":"uint8"}],"name":"mintTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"code","type":"uint8"}],"name":"removeBlockCode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"code","type":"uint8"}],"name":"removeBurnCode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"code","type":"uint8"}],"name":"removeMintCode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"restrictionCode","type":"uint8"}],"name":"removeRestrictionCode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"unblockAddress","type":"address"},{"internalType":"uint8","name":"code","type":"uint8"}],"name":"removeTransferblock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"whitelistedAddress","type":"address"}],"name":"removeUserFromKycRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"code","type":"uint8"},{"internalType":"string","name":"codeText","type":"string"}],"name":"setBlockCode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"code","type":"uint8"},{"internalType":"string","name":"codeText","type":"string"}],"name":"setBurnCode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"code","type":"uint8"},{"internalType":"string","name":"codeText","type":"string"}],"name":"setMintCode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"code","type":"uint8"},{"internalType":"string","name":"codeText","type":"string"}],"name":"setRestrictionCode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040516200337a3803806200337a8339810160408190526200003491620007ea565b6200003f3362000627565b81516200005490600a90602085019062000677565b5080516200006a90600b90602084019062000677565b5060408051808201909152600f81526e4e4f5f5245535452494354494f4e5360881b602080830191825260008052600490529051620000cb917f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ec9162000677565b5060408051808201909152601481527f46524f4d5f4e4f545f494e5f4b59435f524f4c45000000000000000000000000602080830191825260016000526004905290516200013b917fabd6e7cb50984ff9c2f3e18a2660c3353dadf4e3291deeb275dae2cd1e44fe059162000677565b50604080518082019091526012815271544f5f4e4f545f494e5f4b59435f524f4c4560701b60208083019182526002600052600490529051620001a0917f91da3fd0782e51c6b3986e9e672fd566868e71f3dbc2d6c2cd6fbb3e361af2a79162000677565b5060408051808201909152601a81527f46524f4d5f494e5f5452414e53464552424c4f434b5f524f4c450000000000006020808301918252600360005260049052905162000210917f2e174c10e159ea99b867ce3205125c24a42d128804e4070ed6fcc8cc98166aa09162000677565b5060408051808201909152601881527f544f5f494e5f5452414e53464552424c4f434b5f524f4c4500000000000000006020808301918252600460008190529052905162000280917f1a1e6821cde7d0159c0d293177871e09677b4e42307c7db3ba94f8648a5a050f9162000677565b5060408051808201909152601081526f4e4f545f454e4f5547485f46554e445360801b60208083019182526005600052600490529051620002e3917f04cde762ef08b6b6c5ded8e8c4c0b3f4e5c9ad7342c88fcc93681b4588b73f059162000677565b5060408051808201909152600481526353414c4560e01b60208083019182526000805260069052905162000339917f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f89162000677565b5060408051808201909152600e81526d5245504c4143455f544f4b454e5360901b602080830191825260016000526006905290516200039a917f3e5fec24aa4dc4e5aee2e025e51e1392c72a2500577559fae9665c6d52bd6a319162000677565b5060408051808201909152600581526427aa2422a960d91b60208083019182526002600052600690529051620003f2917f8819ef417987f8ae7a81f42cdfb18815282fe989326fbff903d13cf0e03ace299162000677565b5060408051808201909152600e81526d5245504c4143455f544f4b454e5360901b60208083019182526000805260059052905162000452917f05b8ccbb9d4d8fb16ea74ce3c29a41f1b461fbdaff4714a0d9a8eb05499746bc9162000677565b5060408051808201909152600f81526e544543484e4943414c5f495353554560881b60208083019182526001600052600590529051620004b4917f1471eb6eb2c5e789fc3de43f8ce62938c7d1836ec861730447e2ada8fd81017b9162000677565b506040805180820190915260058082526427aa2422a960d91b602080840191825260026000529190915290516200050d917f89832631fb3c3307a103ba2c84ab569c64d6182a18893dcd163f0f1c2090733a9162000677565b506040805180820190915260098152684b59435f495353554560b81b60208083019182526000805260079052905162000568917f6d5257204ebe7d88fd91ae87941cb2dd9d8062b64ae5a2bd2d28ec40b9fbf6df9162000677565b5060408051808201909152600b81526a4d41494e54454e414e434560a81b60208083019182526001600052600790529051620005c6917fb39221ace053465ec3453ce2b36430bd138b997ecea25c1043da0c366812b8289162000677565b5060408051808201909152600581526427aa2422a960d91b602080830191825260026000526007905290516200061e917fb7c774451310d1be4108bc180d1b52823cb0ee0274a6c0081bcaf94f115fb96d9162000677565b50505062000891565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b828054620006859062000854565b90600052602060002090601f016020900481019282620006a95760008555620006f4565b82601f10620006c457805160ff1916838001178555620006f4565b82800160010185558215620006f4579182015b82811115620006f4578251825591602001919060010190620006d7565b506200070292915062000706565b5090565b5b8082111562000702576000815560010162000707565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200074557600080fd5b81516001600160401b03808211156200076257620007626200071d565b604051601f8301601f19908116603f011681019082821181831017156200078d576200078d6200071d565b81604052838152602092508683858801011115620007aa57600080fd5b600091505b83821015620007ce5785820183015181830184015290820190620007af565b83821115620007e05760008385830101525b9695505050505050565b60008060408385031215620007fe57600080fd5b82516001600160401b03808211156200081657600080fd5b620008248683870162000733565b935060208501519150808211156200083b57600080fd5b506200084a8582860162000733565b9150509250929050565b600181811c908216806200086957607f821691505b602082108114156200088b57634e487b7160e01b600052602260045260246000fd5b50919050565b612ad980620008a16000396000f3fe608060405234801561001057600080fd5b506004361061020b5760003560e01c8063857e6d901161012a578063af92fe5d116100bd578063dd62ed3e1161008c578063f2fde38b11610071578063f2fde38b14610496578063f4f411e3146104a9578063fd20cfdd146104bc57600080fd5b8063dd62ed3e1461044a578063e81890ce1461048357600080fd5b8063af92fe5d146103fe578063c5c4d3a214610411578063d4ce141514610424578063db78c53a1461043757600080fd5b80639bfe0351116100f95780639bfe0351146103b2578063a457c2d7146103c5578063a9059cbb146103d8578063aaf7881e146103eb57600080fd5b8063857e6d90146103695780638da5cb5b1461037c57806395d89b4114610397578063991697dd1461039f57600080fd5b806323b872dd116101a25780635a41aad2116101715780635a41aad21461031257806370a0823114610325578063715018a61461034e5780637f4ab1dd1461035657600080fd5b806323b872dd146102c4578063313ce567146102d757806339509351146102ec57806355a3a81b146102ff57600080fd5b806313a5854e116101de57806313a5854e1461027957806313f84a451461028c57806318160ddd1461029f5780632241328b146102b157600080fd5b806306fdde031461021057806308118fd41461022e5780630881bbb914610243578063095ea7b314610256575b600080fd5b6102186104cf565b60405161022591906125bc565b60405180910390f35b61024161023c36600461260b565b610561565b005b610241610251366004612637565b6106a5565b6102696102643660046126ba565b61088b565b6040519015158152602001610225565b6102416102873660046126e4565b6108a2565b61021861029a3660046126e4565b610a7f565b6009545b604051908152602001610225565b6102416102bf3660046126ff565b610b5d565b6102696102d236600461273b565b610c35565b60125b60405160ff9091168152602001610225565b6102696102fa3660046126ba565b610c9f565b61024161030d3660046126e4565b610cd5565b6102186103203660046126e4565b610df9565b6102a361033336600461260b565b6001600160a01b031660009081526003602052604090205490565b610241610e52565b6102186103643660046126e4565b610ea6565b610241610377366004612637565b610eff565b6000546040516001600160a01b039091168152602001610225565b610218611026565b6102416103ad366004612637565b611035565b6102416103c0366004612637565b61115c565b6102696103d33660046126ba565b611283565b6102696103e63660046126ba565b6112d2565b6102186103f93660046126e4565b6112df565b61024161040c366004612777565b611338565b61024161041f3660046126e4565b61140b565b6102da61043236600461273b565b61152f565b6102416104453660046127aa565b6115bf565b6102a361045836600461281f565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205490565b6102416104913660046126e4565b61165b565b6102416104a436600461260b565b61177f565b6102416104b7366004612777565b61184c565b6102416104ca3660046126ff565b611917565b6060600a80546104de90612849565b80601f016020809104026020016040519081016040528092919081815260200182805461050a90612849565b80156105575780601f1061052c57610100808354040283529160200191610557565b820191906000526020600020905b81548152906001019060200180831161053a57829003601f168201915b5050505050905090565b6000546001600160a01b031633146105ae5760405162461bcd60e51b81526020600482018190526024820152600080516020612a5f83398151915260448201526064015b60405180910390fd5b6001600160a01b038116600090815260036020526040902054600a805491159161067891906105dc90612849565b80601f016020809104026020016040519081016040528092919081815260200182805461060890612849565b80156106555780601f1061062a57610100808354040283529160200191610655565b820191906000526020600020905b81548152906001019060200180831161063857829003601f168201915b50505050506040518060600160405280603f815260200161294c603f91396119e6565b906106965760405162461bcd60e51b81526004016105a591906125bc565b506106a2600282611a12565b50565b6000546001600160a01b031633146106ed5760405162461bcd60e51b81526020600482018190526024820152600080516020612a5f83398151915260448201526064016105a5565b6106f8836003611a5a565b156107c2600a805461070990612849565b80601f016020809104026020016040519081016040528092919081815260200182805461073590612849565b80156107825780601f1061075757610100808354040283529160200191610782565b820191906000526020600020905b81548152906001019060200180831161076557829003601f168201915b50505050506040518060400160405280601981526020017f3a2054686520636f646520616c726561647920657869737473000000000000008152506119e6565b906107e05760405162461bcd60e51b81526004016105a591906125bc565b5060648360ff16116108685760405162461bcd60e51b815260206004820152604560248201527f455243313430343a20436f6465732074696c6c2031303020617265207265736560448201527f727665726420666f722074686520536d617274436f6e747261637420696e7465606482015264726e616c7360d81b608482015260a4016105a5565b60ff831660009081526006602052604090206108859083836124c1565b50505050565b6000610898338484611c22565b5060015b92915050565b6000546001600160a01b031633146108ea5760405162461bcd60e51b81526020600482018190526024820152600080516020612a5f83398151915260448201526064016105a5565b6108f5816004611a5a565b6109be600a805461090590612849565b80601f016020809104026020016040519081016040528092919081815260200182805461093190612849565b801561097e5780601f106109535761010080835404028352916020019161097e565b820191906000526020600020905b81548152906001019060200180831161096157829003601f168201915b50505050506040518060400160405280601981526020017f3a2054686520636f646520646f6573206e6f74206578697374000000000000008152506119e6565b906109dc5760405162461bcd60e51b81526004016105a591906125bc565b5060648160ff1611610a645760405162461bcd60e51b815260206004820152604560248201527f455243313430343a20436f6465732074696c6c2031303020617265207265736560448201527f727665726420666f722074686520536d617274436f6e747261637420696e7465606482015264726e616c7360d81b608482015260a4016105a5565b60ff811660009081526007602052604081206106a291612545565b6060610a8c826003611a5a565b610a9c600a805461090590612849565b90610aba5760405162461bcd60e51b81526004016105a591906125bc565b5060ff821660009081526006602052604090208054610ad890612849565b80601f0160208091040260200160405190810160405280929190818152602001828054610b0490612849565b8015610b515780601f10610b2657610100808354040283529160200191610b51565b820191906000526020600020905b815481529060010190602001808311610b3457829003601f168201915b50505050509050919050565b6000546001600160a01b03163314610ba55760405162461bcd60e51b81526020600482018190526024820152600080516020612a5f83398151915260448201526064016105a5565b610bb0816002611a5a565b610bc0600a805461090590612849565b90610bde5760405162461bcd60e51b81526004016105a591906125bc565b50610be98383611d7b565b6040805183815260ff831660208201526001600160a01b038516917f55eee3060c5b26cb8b25640c0ac7284dca63b649106677825a2c7e9566fdc16e91015b60405180910390a2505050565b6000610c42848484611eeb565b610c948433610c8f85604051806060016040528060288152602001612a37602891396001600160a01b038a166000908152600860209081526040808320338452909152902054919061217f565b611c22565b5060015b9392505050565b3360008181526008602090815260408083206001600160a01b03871684529091528120549091610898918590610c8f90866121ab565b6000546001600160a01b03163314610d1d5760405162461bcd60e51b81526020600482018190526024820152600080516020612a5f83398151915260448201526064016105a5565b610d28816001611a5a565b610d38600a805461090590612849565b90610d565760405162461bcd60e51b81526004016105a591906125bc565b5060648160ff1611610dde5760405162461bcd60e51b815260206004820152604560248201527f455243313430343a20436f6465732074696c6c2031303020617265207265736560448201527f727665726420666f722074686520536d617274436f6e747261637420696e7465606482015264726e616c7360d81b608482015260a4016105a5565b60ff811660009081526004602052604081206106a291612545565b6060610e06826002611a5a565b610e16600a805461090590612849565b90610e345760405162461bcd60e51b81526004016105a591906125bc565b5060ff821660009081526005602052604090208054610ad890612849565b6000546001600160a01b03163314610e9a5760405162461bcd60e51b81526020600482018190526024820152600080516020612a5f83398151915260448201526064016105a5565b610ea460006121b7565b565b6060610eb3826001611a5a565b610ec3600a805461090590612849565b90610ee15760405162461bcd60e51b81526004016105a591906125bc565b5060ff821660009081526004602052604090208054610ad890612849565b6000546001600160a01b03163314610f475760405162461bcd60e51b81526020600482018190526024820152600080516020612a5f83398151915260448201526064016105a5565b610f52836001611a5a565b15610f63600a805461070990612849565b90610f815760405162461bcd60e51b81526004016105a591906125bc565b5060648360ff16116110095760405162461bcd60e51b815260206004820152604560248201527f455243313430343a20436f6465732074696c6c2031303020617265207265736560448201527f727665726420666f722074686520536d617274436f6e747261637420696e7465606482015264726e616c7360d81b608482015260a4016105a5565b60ff831660009081526004602052604090206108859083836124c1565b6060600b80546104de90612849565b6000546001600160a01b0316331461107d5760405162461bcd60e51b81526020600482018190526024820152600080516020612a5f83398151915260448201526064016105a5565b611088836002611a5a565b15611099600a805461070990612849565b906110b75760405162461bcd60e51b81526004016105a591906125bc565b5060648360ff161161113f5760405162461bcd60e51b815260206004820152604560248201527f455243313430343a20436f6465732074696c6c2031303020617265207265736560448201527f727665726420666f722074686520536d617274436f6e747261637420696e7465606482015264726e616c7360d81b608482015260a4016105a5565b60ff831660009081526005602052604090206108859083836124c1565b6000546001600160a01b031633146111a45760405162461bcd60e51b81526020600482018190526024820152600080516020612a5f83398151915260448201526064016105a5565b6111af836004611a5a565b156111c0600a805461070990612849565b906111de5760405162461bcd60e51b81526004016105a591906125bc565b5060648360ff16116112665760405162461bcd60e51b815260206004820152604560248201527f455243313430343a20436f6465732074696c6c2031303020617265207265736560448201527f727665726420666f722074686520536d617274436f6e747261637420696e7465606482015264726e616c7360d81b608482015260a4016105a5565b60ff831660009081526007602052604090206108859083836124c1565b60006108983384610c8f85604051806060016040528060258152602001612a7f602591393360009081526008602090815260408083206001600160a01b038d168452909152902054919061217f565b6000610898338484611eeb565b60606112ec826004611a5a565b6112fc600a805461090590612849565b9061131a5760405162461bcd60e51b81526004016105a591906125bc565b5060ff821660009081526007602052604090208054610ad890612849565b6000546001600160a01b031633146113805760405162461bcd60e51b81526020600482018190526024820152600080516020612a5f83398151915260448201526064016105a5565b61138b816004611a5a565b61139b600a805461090590612849565b906113b95760405162461bcd60e51b81526004016105a591906125bc565b506113c5600183611a12565b60405160ff821681526001600160a01b038316907f1c4ad7034997b7148ba9f710932d46d6d6efff4afd21e9731abf4451be902bf2906020015b60405180910390a25050565b6000546001600160a01b031633146114535760405162461bcd60e51b81526020600482018190526024820152600080516020612a5f83398151915260448201526064016105a5565b61145e816003611a5a565b61146e600a805461090590612849565b9061148c5760405162461bcd60e51b81526004016105a591906125bc565b5060648160ff16116115145760405162461bcd60e51b815260206004820152604560248201527f455243313430343a20436f6465732074696c6c2031303020617265207265736560448201527f727665726420666f722074686520536d617274436f6e747261637420696e7465606482015264726e616c7360d81b608482015260a4016105a5565b60ff811660009081526006602052604081206106a291612545565b600061153c60028561221f565b61154857506001610c98565b61155360028461221f565b61155f57506002610c98565b61156a60018561221f565b1561157757506003610c98565b61158260018461221f565b1561158f57506004610c98565b6001600160a01b0384166000908152600360205260409020548211156115b757506005610c98565b506000610c98565b6000546001600160a01b031633146116075760405162461bcd60e51b81526020600482018190526024820152600080516020612a5f83398151915260448201526064016105a5565b60005b818110156116565761164483838381811061162757611627612884565b905060200201602081019061163c919061260b565b600290612254565b8061164e816128b0565b91505061160a565b505050565b6000546001600160a01b031633146116a35760405162461bcd60e51b81526020600482018190526024820152600080516020612a5f83398151915260448201526064016105a5565b6116ae816002611a5a565b6116be600a805461090590612849565b906116dc5760405162461bcd60e51b81526004016105a591906125bc565b5060648160ff16116117645760405162461bcd60e51b815260206004820152604560248201527f455243313430343a20436f6465732074696c6c2031303020617265207265736560448201527f727665726420666f722074686520536d617274436f6e747261637420696e7465606482015264726e616c7360d81b608482015260a4016105a5565b60ff811660009081526005602052604081206106a291612545565b6000546001600160a01b031633146117c75760405162461bcd60e51b81526020600482018190526024820152600080516020612a5f83398151915260448201526064016105a5565b6001600160a01b0381166118435760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016105a5565b6106a2816121b7565b6000546001600160a01b031633146118945760405162461bcd60e51b81526020600482018190526024820152600080516020612a5f83398151915260448201526064016105a5565b61189f816004611a5a565b6118af600a805461090590612849565b906118cd5760405162461bcd60e51b81526004016105a591906125bc565b506118d9600183612254565b60405160ff821681526001600160a01b038316907f919e3dd5d3bfd72e817c243f80bc0a74ddf1f953a7c97b1d6298aaa4a8e3de64906020016113ff565b6000546001600160a01b0316331461195f5760405162461bcd60e51b81526020600482018190526024820152600080516020612a5f83398151915260448201526064016105a5565b61196a816003611a5a565b61197a600a805461090590612849565b906119985760405162461bcd60e51b81526004016105a591906125bc565b506119a383836122a0565b6040805183815260ff831660208201526001600160a01b038516917f29600984795369456176b31dad545cb35585021faea93dcc568a467a737ad4259101610c28565b606082826040516020016119fb9291906128cb565b604051602081830303815290604052905092915050565b6001600160a01b038116611a2557600080fd5b611a2f828261221f565b611a3857600080fd5b6001600160a01b0316600090815260209190915260409020805460ff19169055565b6000606060ff831660011415611b0c5760ff841660009081526004602052604090208054611a8790612849565b80601f0160208091040260200160405190810160405280929190818152602001828054611ab390612849565b8015611b005780601f10611ad557610100808354040283529160200191611b00565b820191906000526020600020905b815481529060010190602001808311611ae357829003601f168201915b50505050509050611c08565b60ff831660021415611b355760ff841660009081526005602052604090208054611a8790612849565b60ff831660031415611b5e5760ff841660009081526006602052604090208054611a8790612849565b60ff831660041415611c085760ff841660009081526007602052604090208054611b8790612849565b80601f0160208091040260200160405190810160405280929190818152602001828054611bb390612849565b8015611c005780601f10611bd557610100808354040283529160200191611c00565b820191906000526020600020905b815481529060010190602001808311611be357829003601f168201915b505050505090505b8051611c1857600091505061089c565b600191505061089c565b6001600160a01b038316611c9d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016105a5565b6001600160a01b038216611d195760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f737300000000000000000000000000000000000000000000000000000000000060648201526084016105a5565b6001600160a01b0383811660008181526008602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6000546001600160a01b03163314611dc35760405162461bcd60e51b81526020600482018190526024820152600080516020612a5f83398151915260448201526064016105a5565b6001600160a01b038216611e3f5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f730000000000000000000000000000000000000000000000000000000000000060648201526084016105a5565b611e7c8160405180606001604052806022815260200161292a602291396001600160a01b038516600090815260036020526040902054919061217f565b6001600160a01b038316600090815260036020526040902055600954611ea290826124b5565b6009556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a35050565b6001600160a01b038316611f675760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016105a5565b6001600160a01b038216611fe35760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f657373000000000000000000000000000000000000000000000000000000000060648201526084016105a5565b6000611ff084848461152f565b60ff16146120a0600a805461200490612849565b80601f016020809104026020016040519081016040528092919081815260200182805461203090612849565b801561207d5780601f106120525761010080835404028352916020019161207d565b820191906000526020600020905b81548152906001019060200180831161206057829003601f168201915b50505050506040518060c00160405280608681526020016129b1608691396119e6565b906120be5760405162461bcd60e51b81526004016105a591906125bc565b506120fc8160405180606001604052806026815260200161298b602691396001600160a01b038616600090815260036020526040902054919061217f565b6001600160a01b03808516600090815260036020526040808220939093559084168152205461212b90826121ab565b6001600160a01b0380841660008181526003602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611d6e9085815260200190565b600081848411156121a35760405162461bcd60e51b81526004016105a591906125bc565b505050900390565b6000610c9882846128fa565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006001600160a01b03821661223457600080fd5b506001600160a01b03166000908152602091909152604090205460ff1690565b6001600160a01b03811661226757600080fd5b612271828261221f565b1561227b57600080fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b6000546001600160a01b031633146122e85760405162461bcd60e51b81526020600482018190526024820152600080516020612a5f83398151915260448201526064016105a5565b6001600160a01b03821661233e5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016105a5565b61234960028361221f565b612412600a805461235990612849565b80601f016020809104026020016040519081016040528092919081815260200182805461238590612849565b80156123d25780601f106123a7576101008083540402835291602001916123d2565b820191906000526020600020905b8154815290600101906020018083116123b557829003601f168201915b50505050506040518060400160405280601c81526020017f3a2061646472657373206973206e6f7420696e206b7963206c697374000000008152506119e6565b906124305760405162461bcd60e51b81526004016105a591906125bc565b5060095461243e90826121ab565b6009556001600160a01b03821660009081526003602052604090205461246490826121ab565b6001600160a01b0383166000818152600360205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611edf9085815260200190565b6000610c988284612912565b8280546124cd90612849565b90600052602060002090601f0160209004810192826124ef5760008555612535565b82601f106125085782800160ff19823516178555612535565b82800160010185558215612535579182015b8281111561253557823582559160200191906001019061251a565b5061254192915061257b565b5090565b50805461255190612849565b6000825580601f10612561575050565b601f0160209004906000526020600020908101906106a291905b5b80821115612541576000815560010161257c565b60005b838110156125ab578181015183820152602001612593565b838111156108855750506000910152565b60208152600082518060208401526125db816040850160208701612590565b601f01601f19169190910160400192915050565b80356001600160a01b038116811461260657600080fd5b919050565b60006020828403121561261d57600080fd5b610c98826125ef565b803560ff8116811461260657600080fd5b60008060006040848603121561264c57600080fd5b61265584612626565b9250602084013567ffffffffffffffff8082111561267257600080fd5b818601915086601f83011261268657600080fd5b81358181111561269557600080fd5b8760208285010111156126a757600080fd5b6020830194508093505050509250925092565b600080604083850312156126cd57600080fd5b6126d6836125ef565b946020939093013593505050565b6000602082840312156126f657600080fd5b610c9882612626565b60008060006060848603121561271457600080fd5b61271d846125ef565b92506020840135915061273260408501612626565b90509250925092565b60008060006060848603121561275057600080fd5b612759846125ef565b9250612767602085016125ef565b9150604084013590509250925092565b6000806040838503121561278a57600080fd5b612793836125ef565b91506127a160208401612626565b90509250929050565b600080602083850312156127bd57600080fd5b823567ffffffffffffffff808211156127d557600080fd5b818501915085601f8301126127e957600080fd5b8135818111156127f857600080fd5b8660208260051b850101111561280d57600080fd5b60209290920196919550909350505050565b6000806040838503121561283257600080fd5b61283b836125ef565b91506127a1602084016125ef565b600181811c9082168061285d57607f821691505b6020821081141561287e57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006000198214156128c4576128c461289a565b5060010190565b600083516128dd818460208801612590565b8351908301906128f1818360208801612590565b01949350505050565b6000821982111561290d5761290d61289a565b500190565b6000828210156129245761292461289a565b50039056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e63653a20546f2072656d6f766520736f6d656f6e652066726f6d207468652077686974656c697374207468652062616c616e6365206861766520746f206265203045524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63653a205472616e736665727265737472696374696f6e20646574656374656420706c656173652063616c6c206465746563745472616e736665725265737472696374696f6e28616464726573732066726f6d2c206164647265737320746f2c2075696e743235362076616c75652920666f722064657461696c656420696e666f726d6174696f6e45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657245524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212200b8f48b750d179025cbeedf71952d58cc31ec266be53b388d5626fc330dd90c364736f6c6343000808003300000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000d466f72657374204372656469740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000054652535443000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061020b5760003560e01c8063857e6d901161012a578063af92fe5d116100bd578063dd62ed3e1161008c578063f2fde38b11610071578063f2fde38b14610496578063f4f411e3146104a9578063fd20cfdd146104bc57600080fd5b8063dd62ed3e1461044a578063e81890ce1461048357600080fd5b8063af92fe5d146103fe578063c5c4d3a214610411578063d4ce141514610424578063db78c53a1461043757600080fd5b80639bfe0351116100f95780639bfe0351146103b2578063a457c2d7146103c5578063a9059cbb146103d8578063aaf7881e146103eb57600080fd5b8063857e6d90146103695780638da5cb5b1461037c57806395d89b4114610397578063991697dd1461039f57600080fd5b806323b872dd116101a25780635a41aad2116101715780635a41aad21461031257806370a0823114610325578063715018a61461034e5780637f4ab1dd1461035657600080fd5b806323b872dd146102c4578063313ce567146102d757806339509351146102ec57806355a3a81b146102ff57600080fd5b806313a5854e116101de57806313a5854e1461027957806313f84a451461028c57806318160ddd1461029f5780632241328b146102b157600080fd5b806306fdde031461021057806308118fd41461022e5780630881bbb914610243578063095ea7b314610256575b600080fd5b6102186104cf565b60405161022591906125bc565b60405180910390f35b61024161023c36600461260b565b610561565b005b610241610251366004612637565b6106a5565b6102696102643660046126ba565b61088b565b6040519015158152602001610225565b6102416102873660046126e4565b6108a2565b61021861029a3660046126e4565b610a7f565b6009545b604051908152602001610225565b6102416102bf3660046126ff565b610b5d565b6102696102d236600461273b565b610c35565b60125b60405160ff9091168152602001610225565b6102696102fa3660046126ba565b610c9f565b61024161030d3660046126e4565b610cd5565b6102186103203660046126e4565b610df9565b6102a361033336600461260b565b6001600160a01b031660009081526003602052604090205490565b610241610e52565b6102186103643660046126e4565b610ea6565b610241610377366004612637565b610eff565b6000546040516001600160a01b039091168152602001610225565b610218611026565b6102416103ad366004612637565b611035565b6102416103c0366004612637565b61115c565b6102696103d33660046126ba565b611283565b6102696103e63660046126ba565b6112d2565b6102186103f93660046126e4565b6112df565b61024161040c366004612777565b611338565b61024161041f3660046126e4565b61140b565b6102da61043236600461273b565b61152f565b6102416104453660046127aa565b6115bf565b6102a361045836600461281f565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205490565b6102416104913660046126e4565b61165b565b6102416104a436600461260b565b61177f565b6102416104b7366004612777565b61184c565b6102416104ca3660046126ff565b611917565b6060600a80546104de90612849565b80601f016020809104026020016040519081016040528092919081815260200182805461050a90612849565b80156105575780601f1061052c57610100808354040283529160200191610557565b820191906000526020600020905b81548152906001019060200180831161053a57829003601f168201915b5050505050905090565b6000546001600160a01b031633146105ae5760405162461bcd60e51b81526020600482018190526024820152600080516020612a5f83398151915260448201526064015b60405180910390fd5b6001600160a01b038116600090815260036020526040902054600a805491159161067891906105dc90612849565b80601f016020809104026020016040519081016040528092919081815260200182805461060890612849565b80156106555780601f1061062a57610100808354040283529160200191610655565b820191906000526020600020905b81548152906001019060200180831161063857829003601f168201915b50505050506040518060600160405280603f815260200161294c603f91396119e6565b906106965760405162461bcd60e51b81526004016105a591906125bc565b506106a2600282611a12565b50565b6000546001600160a01b031633146106ed5760405162461bcd60e51b81526020600482018190526024820152600080516020612a5f83398151915260448201526064016105a5565b6106f8836003611a5a565b156107c2600a805461070990612849565b80601f016020809104026020016040519081016040528092919081815260200182805461073590612849565b80156107825780601f1061075757610100808354040283529160200191610782565b820191906000526020600020905b81548152906001019060200180831161076557829003601f168201915b50505050506040518060400160405280601981526020017f3a2054686520636f646520616c726561647920657869737473000000000000008152506119e6565b906107e05760405162461bcd60e51b81526004016105a591906125bc565b5060648360ff16116108685760405162461bcd60e51b815260206004820152604560248201527f455243313430343a20436f6465732074696c6c2031303020617265207265736560448201527f727665726420666f722074686520536d617274436f6e747261637420696e7465606482015264726e616c7360d81b608482015260a4016105a5565b60ff831660009081526006602052604090206108859083836124c1565b50505050565b6000610898338484611c22565b5060015b92915050565b6000546001600160a01b031633146108ea5760405162461bcd60e51b81526020600482018190526024820152600080516020612a5f83398151915260448201526064016105a5565b6108f5816004611a5a565b6109be600a805461090590612849565b80601f016020809104026020016040519081016040528092919081815260200182805461093190612849565b801561097e5780601f106109535761010080835404028352916020019161097e565b820191906000526020600020905b81548152906001019060200180831161096157829003601f168201915b50505050506040518060400160405280601981526020017f3a2054686520636f646520646f6573206e6f74206578697374000000000000008152506119e6565b906109dc5760405162461bcd60e51b81526004016105a591906125bc565b5060648160ff1611610a645760405162461bcd60e51b815260206004820152604560248201527f455243313430343a20436f6465732074696c6c2031303020617265207265736560448201527f727665726420666f722074686520536d617274436f6e747261637420696e7465606482015264726e616c7360d81b608482015260a4016105a5565b60ff811660009081526007602052604081206106a291612545565b6060610a8c826003611a5a565b610a9c600a805461090590612849565b90610aba5760405162461bcd60e51b81526004016105a591906125bc565b5060ff821660009081526006602052604090208054610ad890612849565b80601f0160208091040260200160405190810160405280929190818152602001828054610b0490612849565b8015610b515780601f10610b2657610100808354040283529160200191610b51565b820191906000526020600020905b815481529060010190602001808311610b3457829003601f168201915b50505050509050919050565b6000546001600160a01b03163314610ba55760405162461bcd60e51b81526020600482018190526024820152600080516020612a5f83398151915260448201526064016105a5565b610bb0816002611a5a565b610bc0600a805461090590612849565b90610bde5760405162461bcd60e51b81526004016105a591906125bc565b50610be98383611d7b565b6040805183815260ff831660208201526001600160a01b038516917f55eee3060c5b26cb8b25640c0ac7284dca63b649106677825a2c7e9566fdc16e91015b60405180910390a2505050565b6000610c42848484611eeb565b610c948433610c8f85604051806060016040528060288152602001612a37602891396001600160a01b038a166000908152600860209081526040808320338452909152902054919061217f565b611c22565b5060015b9392505050565b3360008181526008602090815260408083206001600160a01b03871684529091528120549091610898918590610c8f90866121ab565b6000546001600160a01b03163314610d1d5760405162461bcd60e51b81526020600482018190526024820152600080516020612a5f83398151915260448201526064016105a5565b610d28816001611a5a565b610d38600a805461090590612849565b90610d565760405162461bcd60e51b81526004016105a591906125bc565b5060648160ff1611610dde5760405162461bcd60e51b815260206004820152604560248201527f455243313430343a20436f6465732074696c6c2031303020617265207265736560448201527f727665726420666f722074686520536d617274436f6e747261637420696e7465606482015264726e616c7360d81b608482015260a4016105a5565b60ff811660009081526004602052604081206106a291612545565b6060610e06826002611a5a565b610e16600a805461090590612849565b90610e345760405162461bcd60e51b81526004016105a591906125bc565b5060ff821660009081526005602052604090208054610ad890612849565b6000546001600160a01b03163314610e9a5760405162461bcd60e51b81526020600482018190526024820152600080516020612a5f83398151915260448201526064016105a5565b610ea460006121b7565b565b6060610eb3826001611a5a565b610ec3600a805461090590612849565b90610ee15760405162461bcd60e51b81526004016105a591906125bc565b5060ff821660009081526004602052604090208054610ad890612849565b6000546001600160a01b03163314610f475760405162461bcd60e51b81526020600482018190526024820152600080516020612a5f83398151915260448201526064016105a5565b610f52836001611a5a565b15610f63600a805461070990612849565b90610f815760405162461bcd60e51b81526004016105a591906125bc565b5060648360ff16116110095760405162461bcd60e51b815260206004820152604560248201527f455243313430343a20436f6465732074696c6c2031303020617265207265736560448201527f727665726420666f722074686520536d617274436f6e747261637420696e7465606482015264726e616c7360d81b608482015260a4016105a5565b60ff831660009081526004602052604090206108859083836124c1565b6060600b80546104de90612849565b6000546001600160a01b0316331461107d5760405162461bcd60e51b81526020600482018190526024820152600080516020612a5f83398151915260448201526064016105a5565b611088836002611a5a565b15611099600a805461070990612849565b906110b75760405162461bcd60e51b81526004016105a591906125bc565b5060648360ff161161113f5760405162461bcd60e51b815260206004820152604560248201527f455243313430343a20436f6465732074696c6c2031303020617265207265736560448201527f727665726420666f722074686520536d617274436f6e747261637420696e7465606482015264726e616c7360d81b608482015260a4016105a5565b60ff831660009081526005602052604090206108859083836124c1565b6000546001600160a01b031633146111a45760405162461bcd60e51b81526020600482018190526024820152600080516020612a5f83398151915260448201526064016105a5565b6111af836004611a5a565b156111c0600a805461070990612849565b906111de5760405162461bcd60e51b81526004016105a591906125bc565b5060648360ff16116112665760405162461bcd60e51b815260206004820152604560248201527f455243313430343a20436f6465732074696c6c2031303020617265207265736560448201527f727665726420666f722074686520536d617274436f6e747261637420696e7465606482015264726e616c7360d81b608482015260a4016105a5565b60ff831660009081526007602052604090206108859083836124c1565b60006108983384610c8f85604051806060016040528060258152602001612a7f602591393360009081526008602090815260408083206001600160a01b038d168452909152902054919061217f565b6000610898338484611eeb565b60606112ec826004611a5a565b6112fc600a805461090590612849565b9061131a5760405162461bcd60e51b81526004016105a591906125bc565b5060ff821660009081526007602052604090208054610ad890612849565b6000546001600160a01b031633146113805760405162461bcd60e51b81526020600482018190526024820152600080516020612a5f83398151915260448201526064016105a5565b61138b816004611a5a565b61139b600a805461090590612849565b906113b95760405162461bcd60e51b81526004016105a591906125bc565b506113c5600183611a12565b60405160ff821681526001600160a01b038316907f1c4ad7034997b7148ba9f710932d46d6d6efff4afd21e9731abf4451be902bf2906020015b60405180910390a25050565b6000546001600160a01b031633146114535760405162461bcd60e51b81526020600482018190526024820152600080516020612a5f83398151915260448201526064016105a5565b61145e816003611a5a565b61146e600a805461090590612849565b9061148c5760405162461bcd60e51b81526004016105a591906125bc565b5060648160ff16116115145760405162461bcd60e51b815260206004820152604560248201527f455243313430343a20436f6465732074696c6c2031303020617265207265736560448201527f727665726420666f722074686520536d617274436f6e747261637420696e7465606482015264726e616c7360d81b608482015260a4016105a5565b60ff811660009081526006602052604081206106a291612545565b600061153c60028561221f565b61154857506001610c98565b61155360028461221f565b61155f57506002610c98565b61156a60018561221f565b1561157757506003610c98565b61158260018461221f565b1561158f57506004610c98565b6001600160a01b0384166000908152600360205260409020548211156115b757506005610c98565b506000610c98565b6000546001600160a01b031633146116075760405162461bcd60e51b81526020600482018190526024820152600080516020612a5f83398151915260448201526064016105a5565b60005b818110156116565761164483838381811061162757611627612884565b905060200201602081019061163c919061260b565b600290612254565b8061164e816128b0565b91505061160a565b505050565b6000546001600160a01b031633146116a35760405162461bcd60e51b81526020600482018190526024820152600080516020612a5f83398151915260448201526064016105a5565b6116ae816002611a5a565b6116be600a805461090590612849565b906116dc5760405162461bcd60e51b81526004016105a591906125bc565b5060648160ff16116117645760405162461bcd60e51b815260206004820152604560248201527f455243313430343a20436f6465732074696c6c2031303020617265207265736560448201527f727665726420666f722074686520536d617274436f6e747261637420696e7465606482015264726e616c7360d81b608482015260a4016105a5565b60ff811660009081526005602052604081206106a291612545565b6000546001600160a01b031633146117c75760405162461bcd60e51b81526020600482018190526024820152600080516020612a5f83398151915260448201526064016105a5565b6001600160a01b0381166118435760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016105a5565b6106a2816121b7565b6000546001600160a01b031633146118945760405162461bcd60e51b81526020600482018190526024820152600080516020612a5f83398151915260448201526064016105a5565b61189f816004611a5a565b6118af600a805461090590612849565b906118cd5760405162461bcd60e51b81526004016105a591906125bc565b506118d9600183612254565b60405160ff821681526001600160a01b038316907f919e3dd5d3bfd72e817c243f80bc0a74ddf1f953a7c97b1d6298aaa4a8e3de64906020016113ff565b6000546001600160a01b0316331461195f5760405162461bcd60e51b81526020600482018190526024820152600080516020612a5f83398151915260448201526064016105a5565b61196a816003611a5a565b61197a600a805461090590612849565b906119985760405162461bcd60e51b81526004016105a591906125bc565b506119a383836122a0565b6040805183815260ff831660208201526001600160a01b038516917f29600984795369456176b31dad545cb35585021faea93dcc568a467a737ad4259101610c28565b606082826040516020016119fb9291906128cb565b604051602081830303815290604052905092915050565b6001600160a01b038116611a2557600080fd5b611a2f828261221f565b611a3857600080fd5b6001600160a01b0316600090815260209190915260409020805460ff19169055565b6000606060ff831660011415611b0c5760ff841660009081526004602052604090208054611a8790612849565b80601f0160208091040260200160405190810160405280929190818152602001828054611ab390612849565b8015611b005780601f10611ad557610100808354040283529160200191611b00565b820191906000526020600020905b815481529060010190602001808311611ae357829003601f168201915b50505050509050611c08565b60ff831660021415611b355760ff841660009081526005602052604090208054611a8790612849565b60ff831660031415611b5e5760ff841660009081526006602052604090208054611a8790612849565b60ff831660041415611c085760ff841660009081526007602052604090208054611b8790612849565b80601f0160208091040260200160405190810160405280929190818152602001828054611bb390612849565b8015611c005780601f10611bd557610100808354040283529160200191611c00565b820191906000526020600020905b815481529060010190602001808311611be357829003601f168201915b505050505090505b8051611c1857600091505061089c565b600191505061089c565b6001600160a01b038316611c9d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016105a5565b6001600160a01b038216611d195760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f737300000000000000000000000000000000000000000000000000000000000060648201526084016105a5565b6001600160a01b0383811660008181526008602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6000546001600160a01b03163314611dc35760405162461bcd60e51b81526020600482018190526024820152600080516020612a5f83398151915260448201526064016105a5565b6001600160a01b038216611e3f5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f730000000000000000000000000000000000000000000000000000000000000060648201526084016105a5565b611e7c8160405180606001604052806022815260200161292a602291396001600160a01b038516600090815260036020526040902054919061217f565b6001600160a01b038316600090815260036020526040902055600954611ea290826124b5565b6009556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a35050565b6001600160a01b038316611f675760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016105a5565b6001600160a01b038216611fe35760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f657373000000000000000000000000000000000000000000000000000000000060648201526084016105a5565b6000611ff084848461152f565b60ff16146120a0600a805461200490612849565b80601f016020809104026020016040519081016040528092919081815260200182805461203090612849565b801561207d5780601f106120525761010080835404028352916020019161207d565b820191906000526020600020905b81548152906001019060200180831161206057829003601f168201915b50505050506040518060c00160405280608681526020016129b1608691396119e6565b906120be5760405162461bcd60e51b81526004016105a591906125bc565b506120fc8160405180606001604052806026815260200161298b602691396001600160a01b038616600090815260036020526040902054919061217f565b6001600160a01b03808516600090815260036020526040808220939093559084168152205461212b90826121ab565b6001600160a01b0380841660008181526003602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611d6e9085815260200190565b600081848411156121a35760405162461bcd60e51b81526004016105a591906125bc565b505050900390565b6000610c9882846128fa565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006001600160a01b03821661223457600080fd5b506001600160a01b03166000908152602091909152604090205460ff1690565b6001600160a01b03811661226757600080fd5b612271828261221f565b1561227b57600080fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b6000546001600160a01b031633146122e85760405162461bcd60e51b81526020600482018190526024820152600080516020612a5f83398151915260448201526064016105a5565b6001600160a01b03821661233e5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016105a5565b61234960028361221f565b612412600a805461235990612849565b80601f016020809104026020016040519081016040528092919081815260200182805461238590612849565b80156123d25780601f106123a7576101008083540402835291602001916123d2565b820191906000526020600020905b8154815290600101906020018083116123b557829003601f168201915b50505050506040518060400160405280601c81526020017f3a2061646472657373206973206e6f7420696e206b7963206c697374000000008152506119e6565b906124305760405162461bcd60e51b81526004016105a591906125bc565b5060095461243e90826121ab565b6009556001600160a01b03821660009081526003602052604090205461246490826121ab565b6001600160a01b0383166000818152600360205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611edf9085815260200190565b6000610c988284612912565b8280546124cd90612849565b90600052602060002090601f0160209004810192826124ef5760008555612535565b82601f106125085782800160ff19823516178555612535565b82800160010185558215612535579182015b8281111561253557823582559160200191906001019061251a565b5061254192915061257b565b5090565b50805461255190612849565b6000825580601f10612561575050565b601f0160209004906000526020600020908101906106a291905b5b80821115612541576000815560010161257c565b60005b838110156125ab578181015183820152602001612593565b838111156108855750506000910152565b60208152600082518060208401526125db816040850160208701612590565b601f01601f19169190910160400192915050565b80356001600160a01b038116811461260657600080fd5b919050565b60006020828403121561261d57600080fd5b610c98826125ef565b803560ff8116811461260657600080fd5b60008060006040848603121561264c57600080fd5b61265584612626565b9250602084013567ffffffffffffffff8082111561267257600080fd5b818601915086601f83011261268657600080fd5b81358181111561269557600080fd5b8760208285010111156126a757600080fd5b6020830194508093505050509250925092565b600080604083850312156126cd57600080fd5b6126d6836125ef565b946020939093013593505050565b6000602082840312156126f657600080fd5b610c9882612626565b60008060006060848603121561271457600080fd5b61271d846125ef565b92506020840135915061273260408501612626565b90509250925092565b60008060006060848603121561275057600080fd5b612759846125ef565b9250612767602085016125ef565b9150604084013590509250925092565b6000806040838503121561278a57600080fd5b612793836125ef565b91506127a160208401612626565b90509250929050565b600080602083850312156127bd57600080fd5b823567ffffffffffffffff808211156127d557600080fd5b818501915085601f8301126127e957600080fd5b8135818111156127f857600080fd5b8660208260051b850101111561280d57600080fd5b60209290920196919550909350505050565b6000806040838503121561283257600080fd5b61283b836125ef565b91506127a1602084016125ef565b600181811c9082168061285d57607f821691505b6020821081141561287e57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006000198214156128c4576128c461289a565b5060010190565b600083516128dd818460208801612590565b8351908301906128f1818360208801612590565b01949350505050565b6000821982111561290d5761290d61289a565b500190565b6000828210156129245761292461289a565b50039056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e63653a20546f2072656d6f766520736f6d656f6e652066726f6d207468652077686974656c697374207468652062616c616e6365206861766520746f206265203045524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63653a205472616e736665727265737472696374696f6e20646574656374656420706c656173652063616c6c206465746563745472616e736665725265737472696374696f6e28616464726573732066726f6d2c206164647265737320746f2c2075696e743235362076616c75652920666f722064657461696c656420696e666f726d6174696f6e45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657245524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212200b8f48b750d179025cbeedf71952d58cc31ec266be53b388d5626fc330dd90c364736f6c63430008080033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000d466f72657374204372656469740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000054652535443000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : name (string): Forest Credit
Arg [1] : symbol (string): FRSTC
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 000000000000000000000000000000000000000000000000000000000000000d
Arg [3] : 466f726573742043726564697400000000000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [5] : 4652535443000000000000000000000000000000000000000000000000000000
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.