Polygon Sponsored slots available. Book your slot here!
Overview
POL Balance
POL Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 31 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw | 51356330 | 489 days ago | IN | 0 POL | 0.03227796 | ||||
Withdraw | 36046592 | 879 days ago | IN | 0 POL | 0.00261733 | ||||
Withdraw | 35069305 | 903 days ago | IN | 0 POL | 0.00651471 | ||||
Air Drop | 34256029 | 923 days ago | IN | 0 POL | 0.30354997 | ||||
Air Drop | 34254585 | 923 days ago | IN | 0 POL | 0.0314844 | ||||
Set Racing Contr... | 34249296 | 923 days ago | IN | 0 POL | 0.00138249 | ||||
Withdraw | 34092633 | 927 days ago | IN | 0 POL | 0.00211091 | ||||
Withdraw | 34079928 | 927 days ago | IN | 0 POL | 0.00197898 | ||||
Withdraw | 34059400 | 928 days ago | IN | 0 POL | 0.0025067 | ||||
Withdraw | 34058725 | 928 days ago | IN | 0 POL | 0.0023752 | ||||
Withdraw | 34058237 | 928 days ago | IN | 0 POL | 0.00303498 | ||||
Withdraw | 33743220 | 936 days ago | IN | 0 POL | 0.00263864 | ||||
Withdraw | 33699941 | 937 days ago | IN | 0 POL | 0.00323233 | ||||
Withdraw | 33685720 | 937 days ago | IN | 0 POL | 0.00349556 | ||||
Withdraw | 33673447 | 937 days ago | IN | 0 POL | 0.00324467 | ||||
Withdraw | 33673003 | 937 days ago | IN | 0 POL | 0.00262705 | ||||
Withdraw | 33672727 | 937 days ago | IN | 0 POL | 0.00319115 | ||||
Withdraw | 33671135 | 937 days ago | IN | 0 POL | 0.0071729 | ||||
Air Drop | 28549855 | 1068 days ago | IN | 0 POL | 0.03160067 | ||||
Air Drop | 27054415 | 1106 days ago | IN | 0 POL | 0.03130971 | ||||
Air Drop | 27049817 | 1106 days ago | IN | 0 POL | 0.03530834 | ||||
Air Drop | 27048993 | 1106 days ago | IN | 0 POL | 0.29097769 | ||||
Air Drop | 25717844 | 1141 days ago | IN | 0 POL | 0.07401892 | ||||
Air Drop | 25461607 | 1148 days ago | IN | 0 POL | 0.70080775 | ||||
Air Drop | 25461560 | 1148 days ago | IN | 0 POL | 0.00215065 |
Latest 1 internal transaction
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
25459259 | 1148 days ago | Contract Creation | 0 POL |
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
FxMintableERC20ChildTunnel
Compiler Version
v0.8.1+commit.df193b15
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import {FxBaseChildTunnel} from "../../tunnel/FxBaseChildTunnel.sol"; import {Create2} from "../../lib/Create2.sol"; import {Ownable} from "../../lib/Ownable.sol"; import {FxERC20} from "../../wof_token/poly_wof_token.sol"; /** * @title FxMintableERC20ChildTunnel */ contract FxMintableERC20ChildTunnel is Ownable, FxBaseChildTunnel, Create2 { bytes32 public constant DEPOSIT = keccak256("DEPOSIT"); bytes32 public constant SYNC = keccak256("SYNC"); // event for token maping event TokenMapped(address indexed rootToken, address indexed childToken); event ClaimedUpdated(address _owner, uint256 _amount); // root to child token mapping(address => address) public rootToChildToken; // child token template address public childTokenTemplate; // root token tempalte code hash bytes32 public rootTokenTemplateCodeHash; bool public airDropComplete; address public deployer; //Claimable tokens mapping(address => uint256) public claimable; uint256 public maxSupply = 912500000; address public _garageContract; address public _racingContract; constructor( address _fxChild, address _childTokenTemplate, address _rootTokenTemplate ) FxBaseChildTunnel(_fxChild) { childTokenTemplate = _childTokenTemplate; require(_isContract(_childTokenTemplate), "Token template is not contract"); // compute root token template code hash rootTokenTemplateCodeHash = keccak256(minimalProxyCreationCode(_rootTokenTemplate)); deployer = msg.sender; } // deploy child token with unique id function deployChildToken( uint256 uniqueId, string memory name, string memory symbol, uint8 decimals ) public onlyOwner returns (address) { // deploy new child token using unique id bytes32 childSalt = keccak256(abi.encodePacked(uniqueId)); address childToken = createClone(childSalt, childTokenTemplate); // compute root token address before deployment using create2 bytes32 rootSalt = keccak256(abi.encodePacked(childToken)); address rootToken = computedCreate2Address(rootSalt, rootTokenTemplateCodeHash, fxRootTunnel); // check if mapping is already there require(rootToChildToken[rootToken] == address(0x0), "FxMintableERC20ChildTunnel: ALREADY_MAPPED"); rootToChildToken[rootToken] = childToken; emit TokenMapped(rootToken, childToken); // initialize child token with all parameters FxERC20(childToken).initialize(address(this), rootToken, name, symbol, decimals); } //To mint tokens on child chain function mintToken(address childToken, uint256 amount) public { FxERC20 childTokenContract = FxERC20(childToken); // child token contract will have root token address rootToken = childTokenContract.connectedToken(); // validate root and child token mapping require( childToken != address(0x0) && rootToken != address(0x0) && childToken == rootToChildToken[rootToken], "FxERC20ChildTunnel: NO_MAPPED_TOKEN" ); require(amount <= getClaimable(msg.sender), "You do not have this much"); //mint token childTokenContract.mint(msg.sender, amount); claimable[msg.sender] = claimable[msg.sender] - amount; } function withdraw(address childToken, uint256 amount) public { FxERC20 childTokenContract = FxERC20(childToken); // child token contract will have root token address rootToken = childTokenContract.connectedToken(); // validate root and child token mapping require( childToken != address(0x0) && rootToken != address(0x0) && childToken == rootToChildToken[rootToken], "FxERC20ChildTunnel: NO_MAPPED_TOKEN" ); // withdraw tokens childTokenContract.burn(msg.sender, amount); // name, symbol and decimals FxERC20 rootTokenContract = FxERC20(childToken); string memory name = rootTokenContract.name(); string memory symbol = rootTokenContract.symbol(); uint8 decimals = rootTokenContract.decimals(); bytes memory metaData = abi.encode(name, symbol, decimals); // send message to root regarding token burn _sendMessageToRoot(abi.encode(rootToken, childToken, msg.sender, amount, metaData)); } // // Internal functions // function _processMessageFromRoot( uint256, address sender, bytes memory data ) internal override validateSender(sender) { // decode incoming data (bytes32 syncType, bytes memory syncData) = abi.decode(data, (bytes32, bytes)); if (syncType == DEPOSIT) { _syncDeposit(syncData); } if (syncType == SYNC) { _processData(syncData); } else { revert("FxERC20ChildTunnel: INVALID_SYNC_TYPE"); } } function _syncDeposit(bytes memory syncData) internal { (address rootToken, address depositor, address to, uint256 amount, bytes memory depositData) = abi.decode( syncData, (address, address, address, uint256, bytes) ); address childToken = rootToChildToken[rootToken]; // deposit tokens FxERC20 childTokenContract = FxERC20(childToken); childTokenContract.mint(to, amount); // call `onTokenTranfer` on `to` with limit and ignore error if (_isContract(to)) { uint256 txGas = 2000000; bool success = false; bytes memory data = abi.encodeWithSignature( "onTokenTransfer(address,address,address,address,uint256,bytes)", rootToken, childToken, depositor, to, amount, depositData ); // solium-disable-next-line security/no-inline-assembly assembly { success := call(txGas, to, 0, add(data, 0x20), mload(data), 0, 0) } } } // check if address is contract function _isContract(address _addr) private view returns (bool) { uint32 size; assembly { size := extcodesize(_addr) } return (size > 0); } // // CUSTOM FUNCTIONS ERC20 // function setRacingContract(address _contractAddress) public onlyOwner { _racingContract = _contractAddress; } function setGarageContract(address contractAddress) public onlyOwner { _garageContract = contractAddress; } //PROCESS CLAIMABLE DATA function _processData(bytes memory data) internal { (address childToken, address _address, uint256 amount) = abi.decode(data, (address, address, uint256)); claimable[_address] = amount; FxERC20 childTokenContract = FxERC20(childToken); // child token contract will have root token address rootToken = childTokenContract.connectedToken(); // validate root and child token mapping require( childToken != address(0x0) && rootToken != address(0x0) && childToken == rootToChildToken[rootToken], "FxERC20ChildTunnel: NO_MAPPED_TOKEN" ); childTokenContract.mint(_address, amount); } function getClaimable(address _address) public view returns (uint256) { return claimable[_address]; } function addClaimable(address _address, uint256 _amount) public { require(msg.sender == _racingContract, "Not permitted"); claimable[_address] = claimable[_address] + _amount; } function useTokens( address _from, uint256 _amount, address childToken ) external { require(msg.sender == address(_garageContract) || msg.sender == address(_racingContract), "Not allowed"); FxERC20 childTokenContract = FxERC20(childToken); childTokenContract.transferFrom(_from, msg.sender, _amount); } function burnTokens( address _from, uint256 _amount, address childToken ) external { require(msg.sender == address(_garageContract) || msg.sender == address(_racingContract), "Not allowed"); FxERC20 childTokenContract = FxERC20(childToken); childTokenContract.burn(_from, _amount); } function setAirDropped() public onlyOwner { airDropComplete = true; } struct Rewardees { address owner; uint256 amount; } function airDrop(Rewardees[] memory _array, address childToken) public onlyOwner { require(airDropComplete != true, "Airdrop completed"); for (uint256 i = 0; i < _array.length; i++) { FxERC20 childTokenContract = FxERC20(childToken); // child token contract will have root token address rootToken = childTokenContract.connectedToken(); // validate root and child token mapping require( childToken != address(0x0) && rootToken != address(0x0) && childToken == rootToChildToken[rootToken], "FxERC20ChildTunnel: NO_MAPPED_TOKEN" ); //mint token childTokenContract.mint(_array[i].owner, _array[i].amount); } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; // IFxMessageProcessor represents interface to process message interface IFxMessageProcessor { function processMessageFromRoot( uint256 stateId, address rootMessageSender, bytes calldata data ) external; } /** * @notice Mock child tunnel contract to receive and send message from L2 */ abstract contract FxBaseChildTunnel is IFxMessageProcessor { // MessageTunnel on L1 will get data from this event event MessageSent(bytes message); // fx child address public fxChild; // fx root tunnel address public fxRootTunnel; constructor(address _fxChild) { fxChild = _fxChild; } // Sender must be fxRootTunnel in case of ERC20 tunnel modifier validateSender(address sender) { require(sender == fxRootTunnel, "FxBaseChildTunnel: INVALID_SENDER_FROM_ROOT"); _; } // set fxRootTunnel if not set already function setFxRootTunnel(address _fxRootTunnel) external virtual { require(fxRootTunnel == address(0x0), "FxBaseChildTunnel: ROOT_TUNNEL_ALREADY_SET"); fxRootTunnel = _fxRootTunnel; } function processMessageFromRoot( uint256 stateId, address rootMessageSender, bytes calldata data ) external override { require(msg.sender == fxChild, "FxBaseChildTunnel: INVALID_SENDER"); _processMessageFromRoot(stateId, rootMessageSender, data); } /** * @notice Emit message that can be received on Root Tunnel * @dev Call the internal function when need to emit message * @param message bytes message that will be sent to Root Tunnel * some message examples - * abi.encode(tokenId); * abi.encode(tokenId, tokenMetadata); * abi.encode(messageType, messageData); */ function _sendMessageToRoot(bytes memory message) internal { emit MessageSent(message); } /** * @notice Process message received from Root Tunnel * @dev function needs to be implemented to handle message as per requirement * This is called by onStateReceive function. * Since it is called via a system call, any event will not be emitted during its execution. * @param stateId unique state id * @param sender root message sender * @param message bytes message that was sent from Root Tunnel */ function _processMessageFromRoot( uint256 stateId, address sender, bytes memory message ) internal virtual; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; // Create2 adds common methods for minimal proxy with create2 abstract contract Create2 { // creates clone using minimal proxy function createClone(bytes32 _salt, address _target) internal returns (address _result) { bytes20 _targetBytes = bytes20(_target); assembly { let clone := mload(0x40) mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000) mstore(add(clone, 0x14), _targetBytes) mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000) _result := create2(0, clone, 0x37, _salt) } require(_result != address(0), "Create2: Failed on minimal deploy"); } // get minimal proxy creation code function minimalProxyCreationCode(address logic) internal pure returns (bytes memory) { bytes10 creation = 0x3d602d80600a3d3981f3; bytes10 prefix = 0x363d3d373d3d3d363d73; bytes20 targetBytes = bytes20(logic); bytes15 suffix = 0x5af43d82803e903d91602b57fd5bf3; return abi.encodePacked(creation, prefix, targetBytes, suffix); } // get computed create2 address function computedCreate2Address( bytes32 salt, bytes32 bytecodeHash, address deployer ) public pure returns (address) { bytes32 _data = keccak256(abi.encodePacked(bytes1(0xff), deployer, salt, bytecodeHash)); return address(uint160(uint256(_data))); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @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 { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { address msgSender = msg.sender; _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 == msg.sender, "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; } }
pragma solidity ^0.8.0; import "@openzeppelin/contracts/utils/math/SafeMath.sol"; import {ERC20} from "../lib/ERC20.sol"; import {IFxERC20} from "../tokens/IFxERC20.sol"; interface ITunnelContract { function getClaimable(address _address) external view returns (uint256); } contract FxERC20 is IFxERC20, ERC20 { using SafeMath for uint256; address internal _fxManager; address internal _connectedToken; mapping(address => uint256) public rewards; function initialize( address fxManager_, address connectedToken_, string memory name_, string memory symbol_, uint8 decimals_ ) public override { require(_fxManager == address(0x0) && _connectedToken == address(0x0), "Token is already initialized"); _fxManager = fxManager_; _connectedToken = connectedToken_; // setup meta data setupMetaData(name_, symbol_, decimals_); } // fxManager rturns fx manager function fxManager() public view override returns (address) { return _fxManager; } // connectedToken returns root token function connectedToken() public view override returns (address) { return _connectedToken; } // setup name, symbol and decimals function setupMetaData( string memory _name, string memory _symbol, uint8 _decimals ) public { require(msg.sender == _fxManager, "Invalid sender"); _setupMetaData(_name, _symbol, _decimals); } function mint(address user, uint256 amount) public override { require(msg.sender == _fxManager, "Invalid sender"); _mint(user, amount); } function burn(address user, uint256 amount) public override { require(msg.sender == _fxManager, "Invalid sender"); _burn(user, amount); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (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 substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import {IERC20} from "./IERC20.sol"; import {SafeMath} from "./SafeMath.sol"; /** * @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 {ERC20PresetMinterPauser}. * * 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 ERC20 is IERC20 { using SafeMath for uint256; 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 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(msg.sender, 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(msg.sender, 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, msg.sender, _allowances[sender][msg.sender].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(msg.sender, spender, _allowances[msg.sender][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( msg.sender, spender, _allowances[msg.sender][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 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); } function _setupMetaData( string memory name_, string memory symbol_, uint8 decimals_ ) internal virtual { _name = name_; _symbol = symbol_; _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 {} }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import {IERC20} from "../lib/IERC20.sol"; interface IFxERC20 is IERC20 { function fxManager() external returns (address); function connectedToken() external returns (address); function initialize( address _fxManager, address _connectedToken, string memory _name, string memory _symbol, uint8 _decimals ) external; function mint(address user, uint256 amount) external; function burn(address user, uint256 amount) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_fxChild","type":"address"},{"internalType":"address","name":"_childTokenTemplate","type":"address"},{"internalType":"address","name":"_rootTokenTemplate","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"ClaimedUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes","name":"message","type":"bytes"}],"name":"MessageSent","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":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"}],"name":"TokenMapped","type":"event"},{"inputs":[],"name":"DEPOSIT","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SYNC","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_garageContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_racingContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"addClaimable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct FxMintableERC20ChildTunnel.Rewardees[]","name":"_array","type":"tuple[]"},{"internalType":"address","name":"childToken","type":"address"}],"name":"airDrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"airDropComplete","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"childToken","type":"address"}],"name":"burnTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"childTokenTemplate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"salt","type":"bytes32"},{"internalType":"bytes32","name":"bytecodeHash","type":"bytes32"},{"internalType":"address","name":"deployer","type":"address"}],"name":"computedCreate2Address","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"uniqueId","type":"uint256"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint8","name":"decimals","type":"uint8"}],"name":"deployChildToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deployer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fxChild","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fxRootTunnel","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"getClaimable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"childToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mintToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"stateId","type":"uint256"},{"internalType":"address","name":"rootMessageSender","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"processMessageFromRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rootToChildToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rootTokenTemplateCodeHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"setAirDropped","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_fxRootTunnel","type":"address"}],"name":"setFxRootTunnel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"}],"name":"setGarageContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contractAddress","type":"address"}],"name":"setRacingContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"childToken","type":"address"}],"name":"useTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"childToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052633663a5206008553480156200001957600080fd5b5060405162002435380380620024358339810160408190526200003c91620001a9565b600080546001600160a01b031916339081178255604051859282917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600180546001600160a01b03199081166001600160a01b039384161790915560048054909116918416919091179055620000b78262000115565b620000df5760405162461bcd60e51b8152600401620000d6906200022f565b60405180910390fd5b620000ea8162000125565b8051602090910120600555505060068054610100600160a81b03191633610100021790555062000266565b63ffffffff813b1615155b919050565b604051606090693d602d80600a3d3981f360b01b9069363d3d373d3d3d363d7360b01b9084841b906e5af43d82803e903d91602b57fd5bf360881b9062000177908590859085908590602001620001f2565b604051602081830303815290604052945050505050919050565b80516001600160a01b03811681146200012057600080fd5b600080600060608486031215620001be578283fd5b620001c98462000191565b9250620001d96020850162000191565b9150620001e96040850162000191565b90509250925092565b6001600160b01b0319948516815292909316600a8301526001600160601b03191660148201526001600160881b0319909116602882015260370190565b6020808252601e908201527f546f6b656e2074656d706c617465206973206e6f7420636f6e74726163740000604082015260600190565b6121bf80620002766000396000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c80639a7c4b7111610104578063d5abeb01116100a2578063f1657a6811610071578063f1657a681461037b578063f2fde38b14610383578063f3fef3a314610396578063ffeb2e16146103a9576101da565b8063d5abeb0114610350578063d5f3948814610358578063d81c8e5214610360578063ea60c7c414610368576101da565b8063a583024b116100de578063a583024b14610318578063b68ad1e41461032b578063ca778b5b14610333578063cbd599591461033b576101da565b80639a7c4b71146102ea578063a3984fec146102fd578063a47a65d814610305576101da565b80634b9785051161017c5780637e12edb31161014b5780637e12edb3146102bf5780637f1e9cb0146102c757806388837094146102cf5780638da5cb5b146102e2576101da565b80634b9785051461027e578063715018a6146102915780637337957f1461029957806379c65068146102ac576101da565b806310d29783116101b857806310d29783146102305780631b78233514610243578063402914f514610256578063450d11f014610276576101da565b806301f1d031146101df5780630c243484146102085780630e8daa5b1461021d575b600080fd5b6101f26101ed366004611aa0565b6103b1565b6040516101ff9190611bc4565b60405180910390f35b61021b6102163660046116f3565b61057a565b005b61021b61022b366004611818565b6105c6565b61021b61023e366004611818565b61066d565b61021b610251366004611859565b610737565b6102696102643660046116f3565b610943565b6040516101ff9190611bbb565b6101f2610955565b61021b61028c3660046116f3565b610964565b61021b6109b0565b6101f26102a736600461195c565b610a24565b61021b6102ba3660046117ed565b610a65565b6101f2610bfc565b6101f2610c0b565b61021b6102dd3660046116f3565b610c1a565b6101f2610c65565b61021b6102f8366004611a1c565b610c74565b610269610ce5565b61021b6103133660046117ed565b610ceb565b6102696103263660046116f3565b610d59565b6101f2610d78565b6101f2610d87565b610343610d96565b6040516101ff9190611cfe565b610269610d9f565b6101f2610da5565b610269610db9565b6101f26103763660046116f3565b610ddd565b610269610df8565b61021b6103913660046116f3565b610e1c565b61021b6103a43660046117ed565b610ec7565b61021b6111d4565b600080546001600160a01b031633146103e55760405162461bcd60e51b81526004016103dc90611f7c565b60405180910390fd5b6000856040516020016103f89190611bbb565b60408051601f19818403018152919052805160209091012060045490915060009061042d9083906001600160a01b031661120d565b90506000816040516020016104429190611b65565b60408051601f19818403018152919052805160209091012060055460025491925060009161047a9184916001600160a01b0316610a24565b6001600160a01b0380821660009081526003602052604090205491925016156104b55760405162461bcd60e51b81526004016103dc90611dcd565b6001600160a01b0381811660008181526003602052604080822080546001600160a01b0319169488169485179055517f85920d35e6c72f6b2affffa04298b0cecfeba86e4a9f407df661f1cb8ab5e6179190a3604051638420ce9960e01b81526001600160a01b03841690638420ce999061053c90309085908d908d908d90600401611c6d565b600060405180830381600087803b15801561055657600080fd5b505af115801561056a573d6000803e3d6000fd5b5050505050505050949350505050565b6000546001600160a01b031633146105a45760405162461bcd60e51b81526004016103dc90611f7c565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6009546001600160a01b03163314806105e95750600a546001600160a01b031633145b6106055760405162461bcd60e51b81526004016103dc90611f57565b604051632770a7eb60e21b815281906001600160a01b03821690639dc29fac906106359087908790600401611ce5565b600060405180830381600087803b15801561064f57600080fd5b505af1158015610663573d6000803e3d6000fd5b5050505050505050565b6009546001600160a01b03163314806106905750600a546001600160a01b031633145b6106ac5760405162461bcd60e51b81526004016103dc90611f57565b6040516323b872dd60e01b815281906001600160a01b038216906323b872dd906106de90879033908890600401611cc1565b602060405180830381600087803b1580156106f857600080fd5b505af115801561070c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610730919061193c565b5050505050565b6000546001600160a01b031633146107615760405162461bcd60e51b81526004016103dc90611f7c565b60065460ff161515600114156107895760405162461bcd60e51b81526004016103dc90611ff2565b60005b825181101561093e5760008290506000816001600160a01b0316630a8a49146040518163ffffffff1660e01b815260040160206040518083038186803b1580156107d557600080fd5b505afa1580156107e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061080d919061170f565b90506001600160a01b0384161580159061082f57506001600160a01b03811615155b801561085757506001600160a01b038082166000908152600360205260409020548582169116145b6108735760405162461bcd60e51b81526004016103dc90611f14565b816001600160a01b03166340c10f198685815181106108a257634e487b7160e01b600052603260045260246000fd5b6020026020010151600001518786815181106108ce57634e487b7160e01b600052603260045260246000fd5b6020026020010151602001516040518363ffffffff1660e01b81526004016108f7929190611ce5565b600060405180830381600087803b15801561091157600080fd5b505af1158015610925573d6000803e3d6000fd5b50505050505080806109369061211b565b91505061078c565b505050565b60076020526000908152604090205481565b6001546001600160a01b031681565b6000546001600160a01b0316331461098e5760405162461bcd60e51b81526004016103dc90611f7c565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146109da5760405162461bcd60e51b81526004016103dc90611f7c565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b60008060ff60f81b838686604051602001610a429493929190611b82565b60408051601f1981840301815291905280516020909101209150505b9392505050565b60008290506000816001600160a01b0316630a8a49146040518163ffffffff1660e01b815260040160206040518083038186803b158015610aa557600080fd5b505afa158015610ab9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610add919061170f565b90506001600160a01b03841615801590610aff57506001600160a01b03811615155b8015610b2757506001600160a01b038082166000908152600360205260409020548582169116145b610b435760405162461bcd60e51b81526004016103dc90611f14565b610b4c33610d59565b831115610b6b5760405162461bcd60e51b81526004016103dc90611d96565b6040516340c10f1960e01b81526001600160a01b038316906340c10f1990610b999033908790600401611ce5565b600060405180830381600087803b158015610bb357600080fd5b505af1158015610bc7573d6000803e3d6000fd5b505033600090815260076020526040902054610be692508591506120d8565b3360009081526007602052604090205550505050565b600a546001600160a01b031681565b6002546001600160a01b031681565b6002546001600160a01b031615610c435760405162461bcd60e51b81526004016103dc9061201d565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031690565b6001546001600160a01b03163314610c9e5760405162461bcd60e51b81526004016103dc90611d55565b610cdf848484848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061128892505050565b50505050565b60055481565b600a546001600160a01b03163314610d155760405162461bcd60e51b81526004016103dc90611eed565b6001600160a01b038216600090815260076020526040902054610d399082906120c0565b6001600160a01b0390921660009081526007602052604090209190915550565b6001600160a01b0381166000908152600760205260409020545b919050565b6004546001600160a01b031681565b6009546001600160a01b031681565b60065460ff1681565b60085481565b60065461010090046001600160a01b031681565b7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82181565b6003602052600090815260409020546001600160a01b031681565b7fb315b1c453afa77f572b70d8db3a2d95af7ae5762e61053246a03efc14acaa8281565b6000546001600160a01b03163314610e465760405162461bcd60e51b81526004016103dc90611f7c565b6001600160a01b038116610e6c5760405162461bcd60e51b81526004016103dc90611e62565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60008290506000816001600160a01b0316630a8a49146040518163ffffffff1660e01b815260040160206040518083038186803b158015610f0757600080fd5b505afa158015610f1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f3f919061170f565b90506001600160a01b03841615801590610f6157506001600160a01b03811615155b8015610f8957506001600160a01b038082166000908152600360205260409020548582169116145b610fa55760405162461bcd60e51b81526004016103dc90611f14565b604051632770a7eb60e21b81526001600160a01b03831690639dc29fac90610fd39033908790600401611ce5565b600060405180830381600087803b158015610fed57600080fd5b505af1158015611001573d6000803e3d6000fd5b5050505060008490506000816001600160a01b03166306fdde036040518163ffffffff1660e01b815260040160006040518083038186803b15801561104557600080fd5b505afa158015611059573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261108191908101906119ce565b90506000826001600160a01b03166395d89b416040518163ffffffff1660e01b815260040160006040518083038186803b1580156110be57600080fd5b505afa1580156110d2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526110fa91908101906119ce565b90506000836001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561113757600080fd5b505afa15801561114b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116f9190611b1d565b9050600083838360405160200161118893929190611d1c565b60405160208183030381529060405290506111c9868a338b856040516020016111b5959493929190611c27565b604051602081830303815290604052611359565b505050505050505050565b6000546001600160a01b031633146111fe5760405162461bcd60e51b81526004016103dc90611f7c565b6006805460ff19166001179055565b6000808260601b9050604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81528160148201526e5af43d82803e903d91602b57fd5bf360881b6028820152846037826000f59250506001600160a01b0382166112815760405162461bcd60e51b81526004016103dc90611fb1565b5092915050565b60025482906001600160a01b038083169116146112b75760405162461bcd60e51b81526004016103dc90611e17565b600080838060200190518101906112ce9190611989565b915091507f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f8218214156113035761130381611393565b7fb315b1c453afa77f572b70d8db3a2d95af7ae5762e61053246a03efc14acaa8282141561133957611334816114ad565b611351565b60405162461bcd60e51b81526004016103dc90611ea8565b505050505050565b7f8c5261668696ce22758910d05bab8f186d6eb247ceac2af2e82c7dc17669b036816040516113889190611d09565b60405180910390a150565b6000806000806000858060200190518101906113af919061172b565b6001600160a01b03808616600090815260036020526040908190205490516340c10f1960e01b8152969b5094995092975090955093501690819081906340c10f19906114019088908890600401611ce5565b600060405180830381600087803b15801561141b57600080fd5b505af115801561142f573d6000803e3d6000fd5b5050505061143c8561163c565b15610663576000621e8480905060008089858a8a8a8a60405160240161146796959493929190611bd8565b60408051601f198184030181529190526020810180516001600160e01b0316630b32406160e11b17815281519192506000918291828c88f1505050505050505050505050565b6000806000838060200190518101906114c691906117ab565b9250925092508060076000846001600160a01b03166001600160a01b031681526020019081526020016000208190555060008390506000816001600160a01b0316630a8a49146040518163ffffffff1660e01b815260040160206040518083038186803b15801561153657600080fd5b505afa15801561154a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061156e919061170f565b90506001600160a01b0385161580159061159057506001600160a01b03811615155b80156115b857506001600160a01b038082166000908152600360205260409020548682169116145b6115d45760405162461bcd60e51b81526004016103dc90611f14565b6040516340c10f1960e01b81526001600160a01b038316906340c10f19906116029087908790600401611ce5565b600060405180830381600087803b15801561161c57600080fd5b505af1158015611630573d6000803e3d6000fd5b50505050505050505050565b3b63ffffffff16151590565b600061165b61165684612098565b612067565b905082815283838301111561166f57600080fd5b610a5e8360208301846120ef565b8035610d7381612162565b600082601f830112611698578081fd5b610a5e83835160208501611648565b600082601f8301126116b7578081fd5b81356116c561165682612098565b8181528460208386010111156116d9578283fd5b816020850160208301379081016020019190915292915050565b600060208284031215611704578081fd5b8135610a5e81612162565b600060208284031215611720578081fd5b8151610a5e81612162565b600080600080600060a08688031215611742578081fd5b855161174d81612162565b602087015190955061175e81612162565b604087015190945061176f81612162565b60608701516080880151919450925067ffffffffffffffff811115611792578182fd5b61179e88828901611688565b9150509295509295909350565b6000806000606084860312156117bf578283fd5b83516117ca81612162565b60208501519093506117db81612162565b80925050604084015190509250925092565b600080604083850312156117ff578182fd5b823561180a81612162565b946020939093013593505050565b60008060006060848603121561182c578081fd5b833561183781612162565b925060208401359150604084013561184e81612162565b809150509250925092565b600080604080848603121561186c578283fd5b833567ffffffffffffffff80821115611883578485fd5b818601915086601f830112611896578485fd5b81356020828211156118aa576118aa61214c565b6118b78182840201612067565b8281528181019350848201868402860183018b10156118d4578889fd5b8895505b838610156119205786818c0312156118ee578889fd5b6118f787612067565b813561190281612162565b815281840135848201528552600195909501949382019386016118d8565b50965061192e88820161167d565b955050505050509250929050565b60006020828403121561194d578081fd5b81518015158114610a5e578182fd5b600080600060608486031215611970578081fd5b8335925060208401359150604084013561184e81612162565b6000806040838503121561199b578182fd5b82519150602083015167ffffffffffffffff8111156119b8578182fd5b6119c485828601611688565b9150509250929050565b6000602082840312156119df578081fd5b815167ffffffffffffffff8111156119f5578182fd5b8201601f81018413611a05578182fd5b611a1484825160208401611648565b949350505050565b60008060008060608587031215611a31578182fd5b843593506020850135611a4381612162565b9250604085013567ffffffffffffffff80821115611a5f578384fd5b818701915087601f830112611a72578384fd5b813581811115611a80578485fd5b886020828501011115611a91578485fd5b95989497505060200194505050565b60008060008060808587031215611ab5578182fd5b84359350602085013567ffffffffffffffff80821115611ad3578384fd5b611adf888389016116a7565b94506040870135915080821115611af4578384fd5b50611b01878288016116a7565b9250506060850135611b128161217a565b939692955090935050565b600060208284031215611b2e578081fd5b8151610a5e8161217a565b60008151808452611b518160208601602086016120ef565b601f01601f19169290920160200192915050565b60609190911b6bffffffffffffffffffffffff1916815260140190565b6001600160f81b031994909416845260609290921b6bffffffffffffffffffffffff191660018401526015830152603582015260550190565b90815260200190565b6001600160a01b0391909116815260200190565b6001600160a01b03878116825286811660208301528581166040830152841660608201526080810183905260c060a08201819052600090611c1b90830184611b39565b98975050505050505050565b6001600160a01b0386811682528581166020830152841660408201526060810183905260a060808201819052600090611c6290830184611b39565b979650505050505050565b6001600160a01b0386811682528516602082015260a060408201819052600090611c9990830186611b39565b8281036060840152611cab8186611b39565b91505060ff831660808301529695505050505050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b600060208252610a5e6020830184611b39565b600060608252611d2f6060830186611b39565b8281036020840152611d418186611b39565b91505060ff83166040830152949350505050565b60208082526021908201527f4678426173654368696c6454756e6e656c3a20494e56414c49445f53454e44456040820152602960f91b606082015260800190565b60208082526019908201527f596f7520646f206e6f7420686176652074686973206d75636800000000000000604082015260600190565b6020808252602a908201527f46784d696e7461626c6545524332304368696c6454756e6e656c3a20414c524560408201526910511657d3505414115160b21b606082015260800190565b6020808252602b908201527f4678426173654368696c6454756e6e656c3a20494e56414c49445f53454e444560408201526a1497d19493d357d493d3d560aa1b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526025908201527f467845524332304368696c6454756e6e656c3a20494e56414c49445f53594e436040820152645f5459504560d81b606082015260800190565b6020808252600d908201526c139bdd081c195c9b5a5d1d1959609a1b604082015260600190565b60208082526023908201527f467845524332304368696c6454756e6e656c3a204e4f5f4d41505045445f544f60408201526225a2a760e91b606082015260800190565b6020808252600b908201526a139bdd08185b1b1bddd95960aa1b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526021908201527f437265617465323a204661696c6564206f6e206d696e696d616c206465706c6f6040820152607960f81b606082015260800190565b602080825260119082015270105a5c991c9bdc0818dbdb5c1b195d1959607a1b604082015260600190565b6020808252602a908201527f4678426173654368696c6454756e6e656c3a20524f4f545f54554e4e454c5f4160408201526913149150511657d4d15560b21b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff811182821017156120905761209061214c565b604052919050565b600067ffffffffffffffff8211156120b2576120b261214c565b50601f01601f191660200190565b600082198211156120d3576120d3612136565b500190565b6000828210156120ea576120ea612136565b500390565b60005b8381101561210a5781810151838201526020016120f2565b83811115610cdf5750506000910152565b600060001982141561212f5761212f612136565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461217757600080fd5b50565b60ff8116811461217757600080fdfea26469706673582212203df6e006efaaaf41afd302e5cab5f0ff2e7fa0a69dcbd7d6626d6cda271c8e5464736f6c634300080100330000000000000000000000008397259c983751daf40400790063935a11afa28a000000000000000000000000c0f1cd75f356f66eaf45d6fce2dc84037e61ae7b000000000000000000000000e080ad51e65c05934d9304bdb1cfaac62fcbb480
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101da5760003560e01c80639a7c4b7111610104578063d5abeb01116100a2578063f1657a6811610071578063f1657a681461037b578063f2fde38b14610383578063f3fef3a314610396578063ffeb2e16146103a9576101da565b8063d5abeb0114610350578063d5f3948814610358578063d81c8e5214610360578063ea60c7c414610368576101da565b8063a583024b116100de578063a583024b14610318578063b68ad1e41461032b578063ca778b5b14610333578063cbd599591461033b576101da565b80639a7c4b71146102ea578063a3984fec146102fd578063a47a65d814610305576101da565b80634b9785051161017c5780637e12edb31161014b5780637e12edb3146102bf5780637f1e9cb0146102c757806388837094146102cf5780638da5cb5b146102e2576101da565b80634b9785051461027e578063715018a6146102915780637337957f1461029957806379c65068146102ac576101da565b806310d29783116101b857806310d29783146102305780631b78233514610243578063402914f514610256578063450d11f014610276576101da565b806301f1d031146101df5780630c243484146102085780630e8daa5b1461021d575b600080fd5b6101f26101ed366004611aa0565b6103b1565b6040516101ff9190611bc4565b60405180910390f35b61021b6102163660046116f3565b61057a565b005b61021b61022b366004611818565b6105c6565b61021b61023e366004611818565b61066d565b61021b610251366004611859565b610737565b6102696102643660046116f3565b610943565b6040516101ff9190611bbb565b6101f2610955565b61021b61028c3660046116f3565b610964565b61021b6109b0565b6101f26102a736600461195c565b610a24565b61021b6102ba3660046117ed565b610a65565b6101f2610bfc565b6101f2610c0b565b61021b6102dd3660046116f3565b610c1a565b6101f2610c65565b61021b6102f8366004611a1c565b610c74565b610269610ce5565b61021b6103133660046117ed565b610ceb565b6102696103263660046116f3565b610d59565b6101f2610d78565b6101f2610d87565b610343610d96565b6040516101ff9190611cfe565b610269610d9f565b6101f2610da5565b610269610db9565b6101f26103763660046116f3565b610ddd565b610269610df8565b61021b6103913660046116f3565b610e1c565b61021b6103a43660046117ed565b610ec7565b61021b6111d4565b600080546001600160a01b031633146103e55760405162461bcd60e51b81526004016103dc90611f7c565b60405180910390fd5b6000856040516020016103f89190611bbb565b60408051601f19818403018152919052805160209091012060045490915060009061042d9083906001600160a01b031661120d565b90506000816040516020016104429190611b65565b60408051601f19818403018152919052805160209091012060055460025491925060009161047a9184916001600160a01b0316610a24565b6001600160a01b0380821660009081526003602052604090205491925016156104b55760405162461bcd60e51b81526004016103dc90611dcd565b6001600160a01b0381811660008181526003602052604080822080546001600160a01b0319169488169485179055517f85920d35e6c72f6b2affffa04298b0cecfeba86e4a9f407df661f1cb8ab5e6179190a3604051638420ce9960e01b81526001600160a01b03841690638420ce999061053c90309085908d908d908d90600401611c6d565b600060405180830381600087803b15801561055657600080fd5b505af115801561056a573d6000803e3d6000fd5b5050505050505050949350505050565b6000546001600160a01b031633146105a45760405162461bcd60e51b81526004016103dc90611f7c565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6009546001600160a01b03163314806105e95750600a546001600160a01b031633145b6106055760405162461bcd60e51b81526004016103dc90611f57565b604051632770a7eb60e21b815281906001600160a01b03821690639dc29fac906106359087908790600401611ce5565b600060405180830381600087803b15801561064f57600080fd5b505af1158015610663573d6000803e3d6000fd5b5050505050505050565b6009546001600160a01b03163314806106905750600a546001600160a01b031633145b6106ac5760405162461bcd60e51b81526004016103dc90611f57565b6040516323b872dd60e01b815281906001600160a01b038216906323b872dd906106de90879033908890600401611cc1565b602060405180830381600087803b1580156106f857600080fd5b505af115801561070c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610730919061193c565b5050505050565b6000546001600160a01b031633146107615760405162461bcd60e51b81526004016103dc90611f7c565b60065460ff161515600114156107895760405162461bcd60e51b81526004016103dc90611ff2565b60005b825181101561093e5760008290506000816001600160a01b0316630a8a49146040518163ffffffff1660e01b815260040160206040518083038186803b1580156107d557600080fd5b505afa1580156107e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061080d919061170f565b90506001600160a01b0384161580159061082f57506001600160a01b03811615155b801561085757506001600160a01b038082166000908152600360205260409020548582169116145b6108735760405162461bcd60e51b81526004016103dc90611f14565b816001600160a01b03166340c10f198685815181106108a257634e487b7160e01b600052603260045260246000fd5b6020026020010151600001518786815181106108ce57634e487b7160e01b600052603260045260246000fd5b6020026020010151602001516040518363ffffffff1660e01b81526004016108f7929190611ce5565b600060405180830381600087803b15801561091157600080fd5b505af1158015610925573d6000803e3d6000fd5b50505050505080806109369061211b565b91505061078c565b505050565b60076020526000908152604090205481565b6001546001600160a01b031681565b6000546001600160a01b0316331461098e5760405162461bcd60e51b81526004016103dc90611f7c565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146109da5760405162461bcd60e51b81526004016103dc90611f7c565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b60008060ff60f81b838686604051602001610a429493929190611b82565b60408051601f1981840301815291905280516020909101209150505b9392505050565b60008290506000816001600160a01b0316630a8a49146040518163ffffffff1660e01b815260040160206040518083038186803b158015610aa557600080fd5b505afa158015610ab9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610add919061170f565b90506001600160a01b03841615801590610aff57506001600160a01b03811615155b8015610b2757506001600160a01b038082166000908152600360205260409020548582169116145b610b435760405162461bcd60e51b81526004016103dc90611f14565b610b4c33610d59565b831115610b6b5760405162461bcd60e51b81526004016103dc90611d96565b6040516340c10f1960e01b81526001600160a01b038316906340c10f1990610b999033908790600401611ce5565b600060405180830381600087803b158015610bb357600080fd5b505af1158015610bc7573d6000803e3d6000fd5b505033600090815260076020526040902054610be692508591506120d8565b3360009081526007602052604090205550505050565b600a546001600160a01b031681565b6002546001600160a01b031681565b6002546001600160a01b031615610c435760405162461bcd60e51b81526004016103dc9061201d565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031690565b6001546001600160a01b03163314610c9e5760405162461bcd60e51b81526004016103dc90611d55565b610cdf848484848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061128892505050565b50505050565b60055481565b600a546001600160a01b03163314610d155760405162461bcd60e51b81526004016103dc90611eed565b6001600160a01b038216600090815260076020526040902054610d399082906120c0565b6001600160a01b0390921660009081526007602052604090209190915550565b6001600160a01b0381166000908152600760205260409020545b919050565b6004546001600160a01b031681565b6009546001600160a01b031681565b60065460ff1681565b60085481565b60065461010090046001600160a01b031681565b7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82181565b6003602052600090815260409020546001600160a01b031681565b7fb315b1c453afa77f572b70d8db3a2d95af7ae5762e61053246a03efc14acaa8281565b6000546001600160a01b03163314610e465760405162461bcd60e51b81526004016103dc90611f7c565b6001600160a01b038116610e6c5760405162461bcd60e51b81526004016103dc90611e62565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60008290506000816001600160a01b0316630a8a49146040518163ffffffff1660e01b815260040160206040518083038186803b158015610f0757600080fd5b505afa158015610f1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f3f919061170f565b90506001600160a01b03841615801590610f6157506001600160a01b03811615155b8015610f8957506001600160a01b038082166000908152600360205260409020548582169116145b610fa55760405162461bcd60e51b81526004016103dc90611f14565b604051632770a7eb60e21b81526001600160a01b03831690639dc29fac90610fd39033908790600401611ce5565b600060405180830381600087803b158015610fed57600080fd5b505af1158015611001573d6000803e3d6000fd5b5050505060008490506000816001600160a01b03166306fdde036040518163ffffffff1660e01b815260040160006040518083038186803b15801561104557600080fd5b505afa158015611059573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261108191908101906119ce565b90506000826001600160a01b03166395d89b416040518163ffffffff1660e01b815260040160006040518083038186803b1580156110be57600080fd5b505afa1580156110d2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526110fa91908101906119ce565b90506000836001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561113757600080fd5b505afa15801561114b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116f9190611b1d565b9050600083838360405160200161118893929190611d1c565b60405160208183030381529060405290506111c9868a338b856040516020016111b5959493929190611c27565b604051602081830303815290604052611359565b505050505050505050565b6000546001600160a01b031633146111fe5760405162461bcd60e51b81526004016103dc90611f7c565b6006805460ff19166001179055565b6000808260601b9050604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81528160148201526e5af43d82803e903d91602b57fd5bf360881b6028820152846037826000f59250506001600160a01b0382166112815760405162461bcd60e51b81526004016103dc90611fb1565b5092915050565b60025482906001600160a01b038083169116146112b75760405162461bcd60e51b81526004016103dc90611e17565b600080838060200190518101906112ce9190611989565b915091507f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f8218214156113035761130381611393565b7fb315b1c453afa77f572b70d8db3a2d95af7ae5762e61053246a03efc14acaa8282141561133957611334816114ad565b611351565b60405162461bcd60e51b81526004016103dc90611ea8565b505050505050565b7f8c5261668696ce22758910d05bab8f186d6eb247ceac2af2e82c7dc17669b036816040516113889190611d09565b60405180910390a150565b6000806000806000858060200190518101906113af919061172b565b6001600160a01b03808616600090815260036020526040908190205490516340c10f1960e01b8152969b5094995092975090955093501690819081906340c10f19906114019088908890600401611ce5565b600060405180830381600087803b15801561141b57600080fd5b505af115801561142f573d6000803e3d6000fd5b5050505061143c8561163c565b15610663576000621e8480905060008089858a8a8a8a60405160240161146796959493929190611bd8565b60408051601f198184030181529190526020810180516001600160e01b0316630b32406160e11b17815281519192506000918291828c88f1505050505050505050505050565b6000806000838060200190518101906114c691906117ab565b9250925092508060076000846001600160a01b03166001600160a01b031681526020019081526020016000208190555060008390506000816001600160a01b0316630a8a49146040518163ffffffff1660e01b815260040160206040518083038186803b15801561153657600080fd5b505afa15801561154a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061156e919061170f565b90506001600160a01b0385161580159061159057506001600160a01b03811615155b80156115b857506001600160a01b038082166000908152600360205260409020548682169116145b6115d45760405162461bcd60e51b81526004016103dc90611f14565b6040516340c10f1960e01b81526001600160a01b038316906340c10f19906116029087908790600401611ce5565b600060405180830381600087803b15801561161c57600080fd5b505af1158015611630573d6000803e3d6000fd5b50505050505050505050565b3b63ffffffff16151590565b600061165b61165684612098565b612067565b905082815283838301111561166f57600080fd5b610a5e8360208301846120ef565b8035610d7381612162565b600082601f830112611698578081fd5b610a5e83835160208501611648565b600082601f8301126116b7578081fd5b81356116c561165682612098565b8181528460208386010111156116d9578283fd5b816020850160208301379081016020019190915292915050565b600060208284031215611704578081fd5b8135610a5e81612162565b600060208284031215611720578081fd5b8151610a5e81612162565b600080600080600060a08688031215611742578081fd5b855161174d81612162565b602087015190955061175e81612162565b604087015190945061176f81612162565b60608701516080880151919450925067ffffffffffffffff811115611792578182fd5b61179e88828901611688565b9150509295509295909350565b6000806000606084860312156117bf578283fd5b83516117ca81612162565b60208501519093506117db81612162565b80925050604084015190509250925092565b600080604083850312156117ff578182fd5b823561180a81612162565b946020939093013593505050565b60008060006060848603121561182c578081fd5b833561183781612162565b925060208401359150604084013561184e81612162565b809150509250925092565b600080604080848603121561186c578283fd5b833567ffffffffffffffff80821115611883578485fd5b818601915086601f830112611896578485fd5b81356020828211156118aa576118aa61214c565b6118b78182840201612067565b8281528181019350848201868402860183018b10156118d4578889fd5b8895505b838610156119205786818c0312156118ee578889fd5b6118f787612067565b813561190281612162565b815281840135848201528552600195909501949382019386016118d8565b50965061192e88820161167d565b955050505050509250929050565b60006020828403121561194d578081fd5b81518015158114610a5e578182fd5b600080600060608486031215611970578081fd5b8335925060208401359150604084013561184e81612162565b6000806040838503121561199b578182fd5b82519150602083015167ffffffffffffffff8111156119b8578182fd5b6119c485828601611688565b9150509250929050565b6000602082840312156119df578081fd5b815167ffffffffffffffff8111156119f5578182fd5b8201601f81018413611a05578182fd5b611a1484825160208401611648565b949350505050565b60008060008060608587031215611a31578182fd5b843593506020850135611a4381612162565b9250604085013567ffffffffffffffff80821115611a5f578384fd5b818701915087601f830112611a72578384fd5b813581811115611a80578485fd5b886020828501011115611a91578485fd5b95989497505060200194505050565b60008060008060808587031215611ab5578182fd5b84359350602085013567ffffffffffffffff80821115611ad3578384fd5b611adf888389016116a7565b94506040870135915080821115611af4578384fd5b50611b01878288016116a7565b9250506060850135611b128161217a565b939692955090935050565b600060208284031215611b2e578081fd5b8151610a5e8161217a565b60008151808452611b518160208601602086016120ef565b601f01601f19169290920160200192915050565b60609190911b6bffffffffffffffffffffffff1916815260140190565b6001600160f81b031994909416845260609290921b6bffffffffffffffffffffffff191660018401526015830152603582015260550190565b90815260200190565b6001600160a01b0391909116815260200190565b6001600160a01b03878116825286811660208301528581166040830152841660608201526080810183905260c060a08201819052600090611c1b90830184611b39565b98975050505050505050565b6001600160a01b0386811682528581166020830152841660408201526060810183905260a060808201819052600090611c6290830184611b39565b979650505050505050565b6001600160a01b0386811682528516602082015260a060408201819052600090611c9990830186611b39565b8281036060840152611cab8186611b39565b91505060ff831660808301529695505050505050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b600060208252610a5e6020830184611b39565b600060608252611d2f6060830186611b39565b8281036020840152611d418186611b39565b91505060ff83166040830152949350505050565b60208082526021908201527f4678426173654368696c6454756e6e656c3a20494e56414c49445f53454e44456040820152602960f91b606082015260800190565b60208082526019908201527f596f7520646f206e6f7420686176652074686973206d75636800000000000000604082015260600190565b6020808252602a908201527f46784d696e7461626c6545524332304368696c6454756e6e656c3a20414c524560408201526910511657d3505414115160b21b606082015260800190565b6020808252602b908201527f4678426173654368696c6454756e6e656c3a20494e56414c49445f53454e444560408201526a1497d19493d357d493d3d560aa1b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526025908201527f467845524332304368696c6454756e6e656c3a20494e56414c49445f53594e436040820152645f5459504560d81b606082015260800190565b6020808252600d908201526c139bdd081c195c9b5a5d1d1959609a1b604082015260600190565b60208082526023908201527f467845524332304368696c6454756e6e656c3a204e4f5f4d41505045445f544f60408201526225a2a760e91b606082015260800190565b6020808252600b908201526a139bdd08185b1b1bddd95960aa1b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526021908201527f437265617465323a204661696c6564206f6e206d696e696d616c206465706c6f6040820152607960f81b606082015260800190565b602080825260119082015270105a5c991c9bdc0818dbdb5c1b195d1959607a1b604082015260600190565b6020808252602a908201527f4678426173654368696c6454756e6e656c3a20524f4f545f54554e4e454c5f4160408201526913149150511657d4d15560b21b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff811182821017156120905761209061214c565b604052919050565b600067ffffffffffffffff8211156120b2576120b261214c565b50601f01601f191660200190565b600082198211156120d3576120d3612136565b500190565b6000828210156120ea576120ea612136565b500390565b60005b8381101561210a5781810151838201526020016120f2565b83811115610cdf5750506000910152565b600060001982141561212f5761212f612136565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461217757600080fd5b50565b60ff8116811461217757600080fdfea26469706673582212203df6e006efaaaf41afd302e5cab5f0ff2e7fa0a69dcbd7d6626d6cda271c8e5464736f6c63430008010033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000008397259c983751daf40400790063935a11afa28a000000000000000000000000c0f1cd75f356f66eaf45d6fce2dc84037e61ae7b000000000000000000000000e080ad51e65c05934d9304bdb1cfaac62fcbb480
-----Decoded View---------------
Arg [0] : _fxChild (address): 0x8397259c983751DAf40400790063935a11afa28a
Arg [1] : _childTokenTemplate (address): 0xC0f1Cd75f356f66eAf45d6fCe2dc84037E61AE7B
Arg [2] : _rootTokenTemplate (address): 0xe080aD51E65C05934d9304Bdb1Cfaac62fcbB480
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000008397259c983751daf40400790063935a11afa28a
Arg [1] : 000000000000000000000000c0f1cd75f356f66eaf45d6fce2dc84037e61ae7b
Arg [2] : 000000000000000000000000e080ad51e65c05934d9304bdb1cfaac62fcbb480
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ 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.