Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 6 from a total of 6 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Change Admin | 10568265 | 1642 days ago | IN | 0 ETH | 0.00300752 | ||||
Set Minter | 10568263 | 1642 days ago | IN | 0 ETH | 0.00442891 | ||||
Set Minter | 10568261 | 1642 days ago | IN | 0 ETH | 0.00148773 | ||||
Batch Mint | 10568252 | 1642 days ago | IN | 0 ETH | 0.01002696 | ||||
Set Super Operat... | 10568243 | 1642 days ago | IN | 0 ETH | 0.00442773 | ||||
Add Gems | 10568231 | 1642 days ago | IN | 0 ETH | 0.01836343 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
ERC20GroupGem
Compiler Version
v0.6.5+commit.f956cc89
Contract Source Code (Solidity Standard Json-Input format)
pragma solidity 0.6.5; pragma experimental ABIEncoderV2; import "../BaseWithStorage/ERC20Group.sol"; contract ERC20GroupGem is ERC20Group { function addGems(ERC20SubToken[] calldata catalysts) external { require(msg.sender == _admin, "NOT_AUTHORIZED_ADMIN"); for (uint256 i = 0; i < catalysts.length; i++) { _addSubToken(catalysts[i]); } } constructor( address metaTransactionContract, address admin, address initialMinter ) public ERC20Group(metaTransactionContract, admin, initialMinter) {} }
pragma solidity 0.6.5; pragma experimental ABIEncoderV2; import "./ERC20SubToken.sol"; import "../contracts_common/src/Libraries/SafeMath.sol"; import "../contracts_common/src/Libraries/AddressUtils.sol"; import "../contracts_common/src/Libraries/ObjectLib32.sol"; import "../contracts_common/src/Libraries/BytesUtil.sol"; import "../contracts_common/src/BaseWithStorage/SuperOperators.sol"; import "../contracts_common/src/BaseWithStorage/MetaTransactionReceiver.sol"; contract ERC20Group is SuperOperators, MetaTransactionReceiver { uint256 internal constant MAX_UINT256 = ~uint256(0); /// @notice emitted when a new Token is added to the group. /// @param subToken the token added, its id will be its index in the array. event SubToken(ERC20SubToken subToken); /// @notice emitted when `owner` is allowing or disallowing `operator` to transfer tokens on its behalf. /// @param owner the address approving. /// @param operator the address being granted (or revoked) permission to transfer. /// @param approved whether the operator is granted transfer right or not. event ApprovalForAll(address indexed owner, address indexed operator, bool approved); event Minter(address minter, bool enabled); /// @notice Enable or disable the ability of `minter` to mint tokens /// @param minter address that will be given/removed minter right. /// @param enabled set whether the minter is enabled or disabled. function setMinter(address minter, bool enabled) external { require(msg.sender == _admin, "NOT_AUTHORIZED_ADMIN"); _setMinter(minter, enabled); } /// @notice check whether address `who` is given minter rights. /// @param who The address to query. /// @return whether the address has minter rights. function isMinter(address who) public view returns (bool) { return _minters[who]; } /// @dev mint more tokens of a specific subToken . /// @param to address receiving the tokens. /// @param id subToken id (also the index at which it was added). /// @param amount of token minted. function mint( address to, uint256 id, uint256 amount ) external { require(_minters[msg.sender], "NOT_AUTHORIZED_MINTER"); (uint256 bin, uint256 index) = id.getTokenBinIndex(); mapping(uint256 => uint256) storage toPack = _packedTokenBalance[to]; toPack[bin] = toPack[bin].updateTokenBalance(index, amount, ObjectLib32.Operations.ADD); _packedSupplies[bin] = _packedSupplies[bin].updateTokenBalance(index, amount, ObjectLib32.Operations.ADD); _erc20s[id].emitTransferEvent(address(0), to, amount); } /// @dev mint more tokens of a several subToken . /// @param to address receiving the tokens. /// @param ids subToken ids (also the index at which it was added). /// @param amounts for each token minted. function batchMint( address to, uint256[] calldata ids, uint256[] calldata amounts ) external { require(_minters[msg.sender], "NOT_AUTHORIZED_MINTER"); require(ids.length == amounts.length, "INVALID_INCONSISTENT_LENGTH"); _batchMint(to, ids, amounts); } function _batchMint( address to, uint256[] memory ids, uint256[] memory amounts ) internal { uint256 lastBin = MAX_UINT256; uint256 bal = 0; uint256 supply = 0; mapping(uint256 => uint256) storage toPack = _packedTokenBalance[to]; for (uint256 i = 0; i < ids.length; i++) { if (amounts[i] != 0) { (uint256 bin, uint256 index) = ids[i].getTokenBinIndex(); if (lastBin == MAX_UINT256) { lastBin = bin; bal = toPack[bin].updateTokenBalance(index, amounts[i], ObjectLib32.Operations.ADD); supply = _packedSupplies[bin].updateTokenBalance(index, amounts[i], ObjectLib32.Operations.ADD); } else { if (bin != lastBin) { toPack[lastBin] = bal; bal = toPack[bin]; _packedSupplies[lastBin] = supply; supply = _packedSupplies[bin]; lastBin = bin; } bal = bal.updateTokenBalance(index, amounts[i], ObjectLib32.Operations.ADD); supply = supply.updateTokenBalance(index, amounts[i], ObjectLib32.Operations.ADD); } _erc20s[ids[i]].emitTransferEvent(address(0), to, amounts[i]); } } if (lastBin != MAX_UINT256) { toPack[lastBin] = bal; _packedSupplies[lastBin] = supply; } } /// @notice return the current total supply of a specific subToken. /// @param id subToken id. /// @return supply current total number of tokens. function supplyOf(uint256 id) external view returns (uint256 supply) { (uint256 bin, uint256 index) = id.getTokenBinIndex(); return _packedSupplies[bin].getValueInBin(index); } /// @notice return the balance of a particular owner for a particular subToken. /// @param owner whose balance it is of. /// @param id subToken id. /// @return balance of the owner function balanceOf(address owner, uint256 id) public view returns (uint256 balance) { (uint256 bin, uint256 index) = id.getTokenBinIndex(); return _packedTokenBalance[owner][bin].getValueInBin(index); } /// @notice return the balances of a list of owners / subTokens. /// @param owners list of addresses to which we want to know the balance. /// @param ids list of subTokens's addresses. /// @return balances list of balances for each request. function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) external view returns (uint256[] memory balances) { require(owners.length == ids.length, "INVALID_INCONSISTENT_LENGTH"); balances = new uint256[](ids.length); for (uint256 i = 0; i < ids.length; i++) { balances[i] = balanceOf(owners[i], ids[i]); } } /// @notice transfer a number of subToken from one address to another. /// @param from owner to transfer from. /// @param to destination address that will receive the tokens. /// @param id subToken id. /// @param value amount of tokens to transfer. function singleTransferFrom( address from, address to, uint256 id, uint256 value ) external { require(to != address(0), "INVALID_TO_ZERO_ADDRESS"); ERC20SubToken erc20 = _erc20s[id]; require( from == msg.sender || msg.sender == address(erc20) || _metaTransactionContracts[msg.sender] || _superOperators[msg.sender] || _operatorsForAll[from][msg.sender], "NOT_AUTHORIZED" ); (uint256 bin, uint256 index) = id.getTokenBinIndex(); mapping(uint256 => uint256) storage fromPack = _packedTokenBalance[from]; mapping(uint256 => uint256) storage toPack = _packedTokenBalance[to]; fromPack[bin] = fromPack[bin].updateTokenBalance(index, value, ObjectLib32.Operations.SUB); toPack[bin] = toPack[bin].updateTokenBalance(index, value, ObjectLib32.Operations.ADD); erc20.emitTransferEvent(from, to, value); } /// @notice transfer a number of different subTokens from one address to another. /// @param from owner to transfer from. /// @param to destination address that will receive the tokens. /// @param ids list of subToken ids to transfer. /// @param values list of amount for eacg subTokens to transfer. function batchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata values ) external { require(ids.length == values.length, "INVALID_INCONSISTENT_LENGTH"); require(to != address(0), "INVALID_TO_ZERO_ADDRESS"); require( from == msg.sender || _superOperators[msg.sender] || _operatorsForAll[from][msg.sender] || _metaTransactionContracts[msg.sender], "NOT_AUTHORIZED" ); _batchTransferFrom(from, to, ids, values); } function _batchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory values ) internal { uint256 lastBin = MAX_UINT256; uint256 balFrom; uint256 balTo; mapping(uint256 => uint256) storage fromPack = _packedTokenBalance[from]; mapping(uint256 => uint256) storage toPack = _packedTokenBalance[to]; for (uint256 i = 0; i < ids.length; i++) { if (values[i] != 0) { (uint256 bin, uint256 index) = ids[i].getTokenBinIndex(); if (lastBin == MAX_UINT256) { lastBin = bin; balFrom = ObjectLib32.updateTokenBalance(fromPack[bin], index, values[i], ObjectLib32.Operations.SUB); balTo = ObjectLib32.updateTokenBalance(toPack[bin], index, values[i], ObjectLib32.Operations.ADD); } else { if (bin != lastBin) { fromPack[lastBin] = balFrom; toPack[lastBin] = balTo; balFrom = fromPack[bin]; balTo = toPack[bin]; lastBin = bin; } balFrom = balFrom.updateTokenBalance(index, values[i], ObjectLib32.Operations.SUB); balTo = balTo.updateTokenBalance(index, values[i], ObjectLib32.Operations.ADD); } ERC20SubToken erc20 = _erc20s[ids[i]]; erc20.emitTransferEvent(from, to, values[i]); } } if (lastBin != MAX_UINT256) { fromPack[lastBin] = balFrom; toPack[lastBin] = balTo; } } /// @notice grant or revoke the ability for an address to transfer token on behalf of another address. /// @param sender address granting/revoking the approval. /// @param operator address being granted/revoked ability to transfer. /// @param approved whether the operator is revoked or approved. function setApprovalForAllFor( address sender, address operator, bool approved ) external { require(msg.sender == sender || _metaTransactionContracts[msg.sender] || _superOperators[msg.sender], "NOT_AUTHORIZED"); _setApprovalForAll(sender, operator, approved); } /// @notice grant or revoke the ability for an address to transfer token on your behalf. /// @param operator address being granted/revoked ability to transfer. /// @param approved whether the operator is revoked or approved. function setApprovalForAll(address operator, bool approved) external { _setApprovalForAll(msg.sender, operator, approved); } /// @notice return whether an oeprator has the ability to transfer on behalf of another address. /// @param owner address who would have granted the rights. /// @param operator address being given the ability to transfer. /// @return isOperator whether the operator has approval rigths or not. function isApprovedForAll(address owner, address operator) external view returns (bool isOperator) { return _operatorsForAll[owner][operator] || _superOperators[operator]; } function isAuthorizedToTransfer(address owner, address sender) external view returns (bool) { return _metaTransactionContracts[sender] || _superOperators[sender] || _operatorsForAll[owner][sender]; } function isAuthorizedToApprove(address sender) external view returns (bool) { return _metaTransactionContracts[sender] || _superOperators[sender]; } function batchBurnFrom( address from, uint256[] calldata ids, uint256[] calldata amounts ) external { require(from != address(0), "INVALID_FROM_ZERO_ADDRESS"); require( from == msg.sender || _metaTransactionContracts[msg.sender] || _superOperators[msg.sender] || _operatorsForAll[from][msg.sender], "NOT_AUTHORIZED" ); _batchBurnFrom(from, ids, amounts); } /// @notice burn token for a specific owner and subToken. /// @param from fron which address the token are burned from. /// @param id subToken id. /// @param value amount of tokens to burn. function burnFrom( address from, uint256 id, uint256 value ) external { require( from == msg.sender || _superOperators[msg.sender] || _operatorsForAll[from][msg.sender] || _metaTransactionContracts[msg.sender], "NOT_AUTHORIZED" ); _burn(from, id, value); } /// @notice burn token for a specific subToken. /// @param id subToken id. /// @param value amount of tokens to burn. function burn(uint256 id, uint256 value) external { _burn(msg.sender, id, value); } // ///////////////// INTERNAL ////////////////////////// function _batchBurnFrom( address from, uint256[] memory ids, uint256[] memory amounts ) internal { uint256 balFrom = 0; uint256 supply = 0; uint256 lastBin = MAX_UINT256; mapping(uint256 => uint256) storage fromPack = _packedTokenBalance[from]; for (uint256 i = 0; i < ids.length; i++) { if (amounts[i] != 0) { (uint256 bin, uint256 index) = ids[i].getTokenBinIndex(); if (lastBin == MAX_UINT256) { lastBin = bin; balFrom = fromPack[bin].updateTokenBalance(index, amounts[i], ObjectLib32.Operations.SUB); supply = _packedSupplies[bin].updateTokenBalance(index, amounts[i], ObjectLib32.Operations.SUB); } else { if (bin != lastBin) { fromPack[lastBin] = balFrom; balFrom = fromPack[bin]; _packedSupplies[lastBin] = supply; supply = _packedSupplies[bin]; lastBin = bin; } balFrom = balFrom.updateTokenBalance(index, amounts[i], ObjectLib32.Operations.SUB); supply = supply.updateTokenBalance(index, amounts[i], ObjectLib32.Operations.SUB); } _erc20s[ids[i]].emitTransferEvent(from, address(0), amounts[i]); } } if (lastBin != MAX_UINT256) { fromPack[lastBin] = balFrom; _packedSupplies[lastBin] = supply; } } function _burn( address from, uint256 id, uint256 value ) internal { ERC20SubToken erc20 = _erc20s[id]; (uint256 bin, uint256 index) = id.getTokenBinIndex(); mapping(uint256 => uint256) storage fromPack = _packedTokenBalance[from]; fromPack[bin] = ObjectLib32.updateTokenBalance(fromPack[bin], index, value, ObjectLib32.Operations.SUB); _packedSupplies[bin] = ObjectLib32.updateTokenBalance(_packedSupplies[bin], index, value, ObjectLib32.Operations.SUB); erc20.emitTransferEvent(from, address(0), value); } function _addSubToken(ERC20SubToken subToken) internal returns (uint256 id) { id = _erc20s.length; require(subToken.groupAddress() == address(this), "INVALID_GROUP"); require(subToken.groupTokenId() == id, "INVALID_ID"); _erc20s.push(subToken); emit SubToken(subToken); } function _setApprovalForAll( address sender, address operator, bool approved ) internal { require(!_superOperators[operator], "INVALID_SUPER_OPERATOR"); _operatorsForAll[sender][operator] = approved; emit ApprovalForAll(sender, operator, approved); } function _setMinter(address minter, bool enabled) internal { _minters[minter] = enabled; emit Minter(minter, enabled); } // ///////////////// UTILITIES ///////////////////////// using AddressUtils for address; using ObjectLib32 for ObjectLib32.Operations; using ObjectLib32 for uint256; using SafeMath for uint256; // ////////////////// DATA /////////////////////////////// mapping(uint256 => uint256) internal _packedSupplies; mapping(address => mapping(uint256 => uint256)) internal _packedTokenBalance; mapping(address => mapping(address => bool)) internal _operatorsForAll; ERC20SubToken[] internal _erc20s; mapping(address => bool) internal _minters; // ////////////// CONSTRUCTOR //////////////////////////// struct SubTokenData { string name; string symbol; } constructor( address metaTransactionContract, address admin, address initialMinter ) internal { _admin = admin; _setMetaTransactionProcessor(metaTransactionContract, true); _setMinter(initialMinter, true); } }
pragma solidity 0.6.5; import "../contracts_common/src/Libraries/SafeMathWithRequire.sol"; import "../contracts_common/src/BaseWithStorage/SuperOperators.sol"; import "../contracts_common/src/BaseWithStorage/MetaTransactionReceiver.sol"; import "./ERC20Group.sol"; contract ERC20SubToken { // TODO add natspec, currently blocked by solidity compiler issue event Transfer(address indexed from, address indexed to, uint256 value); // TODO add natspec, currently blocked by solidity compiler issue event Approval(address indexed owner, address indexed spender, uint256 value); /// @notice A descriptive name for the tokens /// @return name of the tokens function name() public view returns (string memory) { return _name; } /// @notice An abbreviated name for the tokens /// @return symbol of the tokens function symbol() public view returns (string memory) { return _symbol; } /// @notice the tokenId in ERC20Group /// @return the tokenId in ERC20Group function groupTokenId() external view returns (uint256) { return _index; } /// @notice the ERC20Group address /// @return the address of the group function groupAddress() external view returns (address) { return address(_group); } function totalSupply() external view returns (uint256) { return _group.supplyOf(_index); } function balanceOf(address who) external view returns (uint256) { return _group.balanceOf(who, _index); } function decimals() external pure returns (uint8) { return uint8(0); } function transfer(address to, uint256 amount) external returns (bool success) { _transfer(msg.sender, to, amount); return true; } function transferFrom( address from, address to, uint256 amount ) external returns (bool success) { if (msg.sender != from && !_group.isAuthorizedToTransfer(from, msg.sender)) { uint256 allowance = _mAllowed[from][msg.sender]; if (allowance != ~uint256(0)) { // save gas when allowance is maximal by not reducing it (see https://github.com/ethereum/EIPs/issues/717) require(allowance >= amount, "NOT_AUTHOIZED_ALLOWANCE"); _mAllowed[from][msg.sender] = allowance - amount; } } _transfer(from, to, amount); return true; } function approve(address spender, uint256 amount) external returns (bool success) { _approveFor(msg.sender, spender, amount); return true; } function approveFor( address from, address spender, uint256 amount ) external returns (bool success) { require(msg.sender == from || _group.isAuthorizedToApprove(msg.sender), "NOT_AUTHORIZED"); _approveFor(from, spender, amount); return true; } function emitTransferEvent( address from, address to, uint256 amount ) external { require(msg.sender == address(_group), "NOT_AUTHORIZED_GROUP_ONLY"); emit Transfer(from, to, amount); } // /////////////////// INTERNAL //////////////////////// function _approveFor( address owner, address spender, uint256 amount ) internal { require(owner != address(0) && spender != address(0), "INVALID_FROM_OR_SPENDER"); _mAllowed[owner][spender] = amount; emit Approval(owner, spender, amount); } function allowance(address owner, address spender) external view returns (uint256 remaining) { return _mAllowed[owner][spender]; } function _transfer( address from, address to, uint256 amount ) internal { _group.singleTransferFrom(from, to, _index, amount); } // ///////////////////// UTILITIES /////////////////////// using SafeMathWithRequire for uint256; // //////////////////// CONSTRUCTOR ///////////////////// constructor( ERC20Group group, uint256 index, string memory tokenName, string memory tokenSymbol ) public { _group = group; _index = index; _name = tokenName; _symbol = tokenSymbol; } // ////////////////////// DATA /////////////////////////// ERC20Group internal immutable _group; uint256 internal immutable _index; mapping(address => mapping(address => uint256)) internal _mAllowed; string internal _name; string internal _symbol; }
pragma solidity ^0.6.0; contract Admin { address internal _admin; /// @dev emitted when the contract administrator is changed. /// @param oldAdmin address of the previous administrator. /// @param newAdmin address of the new administrator. event AdminChanged(address oldAdmin, address newAdmin); /// @dev gives the current administrator of this contract. /// @return the current administrator of this contract. function getAdmin() external view returns (address) { return _admin; } /// @dev change the administrator to be `newAdmin`. /// @param newAdmin address of the new administrator. function changeAdmin(address newAdmin) external { require(msg.sender == _admin, "only admin can change admin"); emit AdminChanged(_admin, newAdmin); _admin = newAdmin; } modifier onlyAdmin() { require(msg.sender == _admin, "only admin allowed"); _; } }
pragma solidity ^0.6.0; import "./Admin.sol"; contract MetaTransactionReceiver is Admin { mapping(address => bool) internal _metaTransactionContracts; /// @dev emiited when a meta transaction processor is enabled/disabled /// @param metaTransactionProcessor address that will be given/removed metaTransactionProcessor rights. /// @param enabled set whether the metaTransactionProcessor is enabled or disabled. event MetaTransactionProcessor(address metaTransactionProcessor, bool enabled); /// @dev Enable or disable the ability of `metaTransactionProcessor` to perform meta-tx (metaTransactionProcessor rights). /// @param metaTransactionProcessor address that will be given/removed metaTransactionProcessor rights. /// @param enabled set whether the metaTransactionProcessor is enabled or disabled. function setMetaTransactionProcessor(address metaTransactionProcessor, bool enabled) public { require(msg.sender == _admin, "only admin can setup metaTransactionProcessors"); _setMetaTransactionProcessor(metaTransactionProcessor, enabled); } function _setMetaTransactionProcessor(address metaTransactionProcessor, bool enabled) internal { _metaTransactionContracts[metaTransactionProcessor] = enabled; emit MetaTransactionProcessor(metaTransactionProcessor, enabled); } /// @dev check whether address `who` is given meta-transaction execution rights. /// @param who The address to query. /// @return whether the address has meta-transaction execution rights. function isMetaTransactionProcessor(address who) external view returns (bool) { return _metaTransactionContracts[who]; } }
pragma solidity ^0.6.0; import "./Admin.sol"; contract SuperOperators is Admin { mapping(address => bool) internal _superOperators; event SuperOperator(address superOperator, bool enabled); /// @notice Enable or disable the ability of `superOperator` to transfer tokens of all (superOperator rights). /// @param superOperator address that will be given/removed superOperator right. /// @param enabled set whether the superOperator is enabled or disabled. function setSuperOperator(address superOperator, bool enabled) external { require(msg.sender == _admin, "only admin is allowed to add super operators"); _superOperators[superOperator] = enabled; emit SuperOperator(superOperator, enabled); } /// @notice check whether address `who` is given superOperator rights. /// @param who The address to query. /// @return whether the address has superOperator rights. function isSuperOperator(address who) public view returns (bool) { return _superOperators[who]; } }
pragma solidity ^0.6.0; library AddressUtils { function toPayable(address _address) internal pure returns (address payable _payable) { return address(uint160(_address)); } function isContract(address addr) internal view returns (bool) { // for accounts without code, i.e. `keccak256('')`: bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; bytes32 codehash; // solium-disable-next-line security/no-inline-assembly assembly { codehash := extcodehash(addr) } return (codehash != 0x0 && codehash != accountHash); } }
pragma solidity ^0.6.0; library BytesUtil { function memcpy( uint256 dest, uint256 src, uint256 len ) internal pure { // Copy word-length chunks while possible for (; len >= 32; len -= 32) { assembly { mstore(dest, mload(src)) } dest += 32; src += 32; } // Copy remaining bytes uint256 mask = 256**(32 - len) - 1; assembly { let srcpart := and(mload(src), not(mask)) let destpart := and(mload(dest), mask) mstore(dest, or(destpart, srcpart)) } } function pointerToBytes(uint256 src, uint256 len) internal pure returns (bytes memory) { bytes memory ret = new bytes(len); uint256 retptr; assembly { retptr := add(ret, 32) } memcpy(retptr, src, len); return ret; } function addressToBytes(address a) internal pure returns (bytes memory b) { assembly { let m := mload(0x40) mstore(add(m, 20), xor(0x140000000000000000000000000000000000000000, a)) mstore(0x40, add(m, 52)) b := m } } function uint256ToBytes(uint256 a) internal pure returns (bytes memory b) { assembly { let m := mload(0x40) mstore(add(m, 32), a) mstore(0x40, add(m, 64)) b := m } } function doFirstParamEqualsAddress(bytes memory data, address _address) internal pure returns (bool) { if (data.length < (36 + 32)) { return false; } uint256 value; assembly { value := mload(add(data, 36)) } return value == uint256(_address); } function doParamEqualsUInt256( bytes memory data, uint256 i, uint256 value ) internal pure returns (bool) { if (data.length < (36 + (i + 1) * 32)) { return false; } uint256 offset = 36 + i * 32; uint256 valuePresent; assembly { valuePresent := mload(add(data, offset)) } return valuePresent == value; } function overrideFirst32BytesWithAddress(bytes memory data, address _address) internal pure returns (bytes memory) { uint256 dest; assembly { dest := add(data, 48) } // 48 = 32 (offset) + 4 (func sig) + 12 (address is only 20 bytes) bytes memory addressBytes = addressToBytes(_address); uint256 src; assembly { src := add(addressBytes, 32) } memcpy(dest, src, 20); return data; } function overrideFirstTwo32BytesWithAddressAndInt( bytes memory data, address _address, uint256 _value ) internal pure returns (bytes memory) { uint256 dest; uint256 src; assembly { dest := add(data, 48) } // 48 = 32 (offset) + 4 (func sig) + 12 (address is only 20 bytes) bytes memory bbytes = addressToBytes(_address); assembly { src := add(bbytes, 32) } memcpy(dest, src, 20); assembly { dest := add(data, 68) } // 48 = 32 (offset) + 4 (func sig) + 32 (next slot) bbytes = uint256ToBytes(_value); assembly { src := add(bbytes, 32) } memcpy(dest, src, 32); return data; } }
pragma solidity ^0.6.0; import "./SafeMathWithRequire.sol"; library ObjectLib32 { using SafeMathWithRequire for uint256; enum Operations {ADD, SUB, REPLACE} // Constants regarding bin or chunk sizes for balance packing uint256 constant TYPES_BITS_SIZE = 32; // Max size of each object uint256 constant TYPES_PER_UINT256 = 256 / TYPES_BITS_SIZE; // Number of types per uint256 // // Objects and Tokens Functions // /** * @dev Return the bin number and index within that bin where ID is * @param tokenId Object type * @return bin Bin number * @return index ID's index within that bin */ function getTokenBinIndex(uint256 tokenId) internal pure returns (uint256 bin, uint256 index) { bin = (tokenId * TYPES_BITS_SIZE) / 256; index = tokenId % TYPES_PER_UINT256; return (bin, index); } /** * @dev update the balance of a type provided in binBalances * @param binBalances Uint256 containing the balances of objects * @param index Index of the object in the provided bin * @param amount Value to update the type balance * @param operation Which operation to conduct : * Operations.REPLACE : Replace type balance with amount * Operations.ADD : ADD amount to type balance * Operations.SUB : Substract amount from type balance */ function updateTokenBalance( uint256 binBalances, uint256 index, uint256 amount, Operations operation ) internal pure returns (uint256 newBinBalance) { uint256 objectBalance = 0; if (operation == Operations.ADD) { objectBalance = getValueInBin(binBalances, index); newBinBalance = writeValueInBin(binBalances, index, objectBalance.add(amount)); } else if (operation == Operations.SUB) { objectBalance = getValueInBin(binBalances, index); require(objectBalance >= amount, "can't substract more than there is"); newBinBalance = writeValueInBin(binBalances, index, objectBalance.sub(amount)); } else if (operation == Operations.REPLACE) { newBinBalance = writeValueInBin(binBalances, index, amount); } else { revert("Invalid operation"); // Bad operation } return newBinBalance; } /* * @dev return value in binValue at position index * @param binValue uint256 containing the balances of TYPES_PER_UINT256 types * @param index index at which to retrieve value * @return Value at given index in bin */ function getValueInBin(uint256 binValue, uint256 index) internal pure returns (uint256) { // Mask to retrieve data for a given binData uint256 mask = (uint256(1) << TYPES_BITS_SIZE) - 1; // Shift amount uint256 rightShift = 256 - TYPES_BITS_SIZE * (index + 1); return (binValue >> rightShift) & mask; } /** * @dev return the updated binValue after writing amount at index * @param binValue uint256 containing the balances of TYPES_PER_UINT256 types * @param index Index at which to retrieve value * @param amount Value to store at index in bin * @return Value at given index in bin */ function writeValueInBin( uint256 binValue, uint256 index, uint256 amount ) internal pure returns (uint256) { require(amount < 2**TYPES_BITS_SIZE, "Amount to write in bin is too large"); // Mask to retrieve data for a given binData uint256 mask = (uint256(1) << TYPES_BITS_SIZE) - 1; // Shift amount uint256 leftShift = 256 - TYPES_BITS_SIZE * (index + 1); return (binValue & ~(mask << leftShift)) | (amount << leftShift); } }
pragma solidity ^0.6.0; /** * @title SafeMath * @dev Math operations with safety checks that throw on error */ library SafeMath { /** * @dev Multiplies two numbers, throws on overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256 c) { // Gas optimization: this is cheaper than asserting 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522 if (a == 0) { return 0; } c = a * b; assert(c / a == b); return c; } /** * @dev Integer division of two numbers, truncating the quotient. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { // assert(b > 0); // Solidity automatically throws when dividing by 0 // uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return a / b; } /** * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend). */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { assert(b <= a); return a - b; } /** * @dev Adds two numbers, throws on overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256 c) { c = a + b; assert(c >= a); return c; } }
pragma solidity ^0.6.0; /** * @title SafeMath * @dev Math operations with safety checks that revert */ library SafeMathWithRequire { /** * @dev Multiplies two numbers, throws on overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256 c) { // Gas optimization: this is cheaper than asserting 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522 if (a == 0) { return 0; } c = a * b; require(c / a == b, "overflow"); return c; } /** * @dev Integer division of two numbers, truncating the quotient. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { require(b != 0, "divbyzero"); // uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return a / b; } /** * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend). */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "undeflow"); return a - b; } /** * @dev Adds two numbers, throws on overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256 c) { c = a + b; require(c >= a, "overflow"); return c; } }
{ "evmVersion": "istanbul", "libraries": {}, "metadata": { "bytecodeHash": "ipfs", "useLiteralContent": true }, "optimizer": { "enabled": true, "runs": 2000 }, "remappings": [], "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"metaTransactionContract","type":"address"},{"internalType":"address","name":"admin","type":"address"},{"internalType":"address","name":"initialMinter","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"metaTransactionProcessor","type":"address"},{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"MetaTransactionProcessor","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"Minter","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"contract ERC20SubToken","name":"subToken","type":"address"}],"name":"SubToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"superOperator","type":"address"},{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SuperOperator","type":"event"},{"inputs":[{"internalType":"contract ERC20SubToken[]","name":"catalysts","type":"address[]"}],"name":"addGems","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"owners","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"balances","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"batchBurnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"batchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"batchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"changeAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"isOperator","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"isAuthorizedToApprove","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"sender","type":"address"}],"name":"isAuthorizedToTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"isMetaTransactionProcessor","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"isMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"isSuperOperator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAllFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"metaTransactionProcessor","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setMetaTransactionProcessor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"superOperator","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setSuperOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"singleTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"supplyOf","outputs":[{"internalType":"uint256","name":"supply","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604051620027aa380380620027aa83398101604081905262000034916200013d565b600080546001600160a01b0319166001600160a01b0384161790558282826200005f83600162000081565b620000758160016001600160e01b03620000e516565b505050505050620001c4565b6001600160a01b03821660009081526002602052604090819020805460ff1916831515179055517fb21eb88b4e33b3f1281830a7178d74d8aa73220416215726b68ae23d539515cb90620000d9908490849062000190565b60405180910390a15050565b6001600160a01b03821660009081526007602052604090819020805460ff1916831515179055517fff452b3b9159b024a9098f0058c63eccd90d36b3584608202800d662f962bb6090620000d9908490849062000190565b60008060006060848603121562000152578283fd5b83516200015f81620001ab565b60208501519093506200017281620001ab565b60408501519092506200018581620001ab565b809150509250925092565b6001600160a01b039290921682521515602082015260400190565b6001600160a01b0381168114620001c157600080fd5b50565b6125d680620001d46000396000f3fe608060405234801561001057600080fd5b50600436106101975760003560e01c80638f283970116100e3578063b390c0ab1161008c578063e985e9c511610066578063e985e9c51461035f578063eaa5125114610372578063eeb5a5d11461038557610197565b8063b390c0ab14610326578063cf456ae714610339578063dc5074af1461034c57610197565b8063aa271e1a116100bd578063aa271e1a146102ed578063ab1c2cf314610300578063ac9fe4211461031357610197565b80638f283970146102b4578063a22cb465146102c7578063a531e0fa146102da57610197565b80634e1273f411610145578063805349341161011f578063805349341461027b5780638806792f1461028e5780638a04af6a146102a157610197565b80634e1273f414610233578063654b748a146102535780636e9960c31461026657610197565b8063124d91e511610176578063124d91e5146101fa578063156e29f61461020d57806317fad7fc1461022057610197565b8062fdd58e1461019c5780630ca83480146101c55780630d70e29c146101da575b600080fd5b6101af6101aa366004611f2b565b610398565b6040516101bc919061257f565b60405180910390f35b6101d86101d3366004611e7a565b6103e8565b005b6101ed6101e8366004611d1d565b6104b4565b6040516101bc9190612135565b6101d8610208366004611f56565b61052a565b6101d861021b366004611f56565b6105c4565b6101d861022e366004611d55565b6106ff565b610246610241366004611f8a565b610845565b6040516101bc91906120f1565b6101ed610261366004611ce5565b610919565b61026e610937565b6040516101bc9190612084565b6101d8610289366004611e7a565b610946565b6101af61029c366004612033565b610a64565b6101d86102af366004611efa565b610a9e565b6101d86102c2366004611ce5565b610ad6565b6101d86102d5366004611efa565b610b81565b6101d86102e8366004611e35565b610b8c565b6101ed6102fb366004611ce5565b610d70565b6101d861030e366004611ff3565b610d8e565b6101d8610321366004611efa565b610df5565b6101d8610334366004612063565b610e81565b6101d8610347366004611efa565b610e8c565b6101ed61035a366004611ce5565b610ec0565b6101ed61036d366004611d1d565b610ede565b6101ed610380366004611ce5565b610f30565b6101d8610393366004611de7565b610f75565b60008060006103a684610fdc565b6001600160a01b038716600090815260046020908152604080832085845290915290205491935091506103df908263ffffffff610fed16565b95945050505050565b3360009081526007602052604090205460ff166104205760405162461bcd60e51b815260040161041790612548565b60405180910390fd5b82811461043f5760405162461bcd60e51b815260040161041790612177565b6104ad858585808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060408051602080890282810182019093528882529093508892508791829185019084908082843760009201919091525061100792505050565b5050505050565b6001600160a01b03811660009081526002602052604081205460ff16806104f357506001600160a01b03821660009081526001602052604090205460ff165b8061052357506001600160a01b0380841660009081526005602090815260408083209386168352929052205460ff165b9392505050565b6001600160a01b03831633148061055057503360009081526001602052604090205460ff165b8061057e57506001600160a01b038316600090815260056020908152604080832033845290915290205460ff165b8061059857503360009081526002602052604090205460ff165b6105b45760405162461bcd60e51b815260040161041790612511565b6105bf83838361126c565b505050565b3360009081526007602052604090205460ff166105f35760405162461bcd60e51b815260040161041790612548565b6000806105ff84610fdc565b6001600160a01b038716600090815260046020908152604080832085845291829052822054939550919350909161063f918490879063ffffffff61137616565b60008481526020838152604080832093909355600390529081205461066d918490879063ffffffff61137616565b600084815260036020526040902055600680548690811061068a57fe5b600091825260208220015460405163536a4ee560e11b81526001600160a01b039091169163a6d49dca916106c591908a908990600401612098565b600060405180830381600087803b1580156106df57600080fd5b505af11580156106f3573d6000803e3d6000fd5b50505050505050505050565b82811461071e5760405162461bcd60e51b815260040161041790612177565b6001600160a01b0385166107445760405162461bcd60e51b8152600401610417906121e5565b6001600160a01b03861633148061076a57503360009081526001602052604090205460ff165b8061079857506001600160a01b038616600090815260056020908152604080832033845290915290205460ff165b806107b257503360009081526002602052604090205460ff165b6107ce5760405162461bcd60e51b815260040161041790612511565b61083d868686868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808a0282810182019093528982529093508992508891829185019084908082843760009201919091525061144592505050565b505050505050565b60608382146108665760405162461bcd60e51b815260040161041790612177565b8167ffffffffffffffff8111801561087d57600080fd5b506040519080825280602002602001820160405280156108a7578160200160208202803683370190505b50905060005b82811015610910576108f18686838181106108c457fe5b90506020020160208101906108d99190611ce5565b8585848181106108e557fe5b90506020020135610398565b8282815181106108fd57fe5b60209081029190910101526001016108ad565b50949350505050565b6001600160a01b031660009081526001602052604090205460ff1690565b6000546001600160a01b031690565b6001600160a01b03851661096c5760405162461bcd60e51b81526004016104179061231e565b6001600160a01b03851633148061099257503360009081526002602052604090205460ff165b806109ac57503360009081526001602052604090205460ff165b806109da57506001600160a01b038516600090815260056020908152604080832033845290915290205460ff165b6109f65760405162461bcd60e51b815260040161041790612511565b6104ad858585808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060408051602080890282810182019093528882529093508892508791829185019084908082843760009201919091525061169292505050565b6000806000610a7284610fdc565b6000828152600360205260409020549193509150610a96908263ffffffff610fed16565b949350505050565b6000546001600160a01b03163314610ac85760405162461bcd60e51b815260040161041790612446565b610ad282826118d8565b5050565b6000546001600160a01b03163314610b005760405162461bcd60e51b8152600401610417906124a3565b6000546040517f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f91610b3f916001600160a01b039091169084906120bc565b60405180910390a1600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b610ad233838361192e565b6001600160a01b038316610bb25760405162461bcd60e51b8152600401610417906121e5565b600060068381548110610bc157fe5b6000918252602090912001546001600160a01b0390811691508516331480610bf15750336001600160a01b038216145b80610c0b57503360009081526002602052604090205460ff165b80610c2557503360009081526001602052604090205460ff165b80610c5357506001600160a01b038516600090815260056020908152604080832033845290915290205460ff165b610c6f5760405162461bcd60e51b815260040161041790612511565b600080610c7b85610fdc565b6001600160a01b03808a166000908152600460209081526040808320938c168352808320868452918490529091205493955091935091610cc4908488600163ffffffff61137616565b6000858152602084815260408083209390935583905290812054610cf1918590899063ffffffff61137616565b60008581526020839052604090819020919091555163536a4ee560e11b81526001600160a01b0386169063a6d49dca90610d33908c908c908b90600401612098565b600060405180830381600087803b158015610d4d57600080fd5b505af1158015610d61573d6000803e3d6000fd5b50505050505050505050505050565b6001600160a01b031660009081526007602052604090205460ff1690565b6000546001600160a01b03163314610db85760405162461bcd60e51b8152600401610417906122e7565b60005b818110156105bf57610dec838383818110610dd257fe5b9050602002016020810190610de79190611ce5565b6119d8565b50600101610dbb565b6000546001600160a01b03163314610e1f5760405162461bcd60e51b815260040161041790612355565b6001600160a01b03821660009081526001602052604090819020805460ff1916831515179055517f44f92d27abdf4cfb6a7d712c3af68f3be086d4ca747ab802c36f67d6790060d890610e7590849084906120d6565b60405180910390a15050565b610ad233838361126c565b6000546001600160a01b03163314610eb65760405162461bcd60e51b8152600401610417906122e7565b610ad28282611bb2565b6001600160a01b031660009081526002602052604090205460ff1690565b6001600160a01b03808316600090815260056020908152604080832093851683529290529081205460ff16806105235750506001600160a01b031660009081526001602052604090205460ff16919050565b6001600160a01b03811660009081526002602052604081205460ff1680610f6f57506001600160a01b03821660009081526001602052604090205460ff165b92915050565b336001600160a01b0384161480610f9b57503360009081526002602052604090205460ff165b80610fb557503360009081526001602052604090205460ff165b610fd15760405162461bcd60e51b815260040161041790612511565b6105bf83838361192e565b610100602082020491600790911690565b600181016020026101000382901c63ffffffff1692915050565b6001600160a01b038316600090815260046020526040812060001991908190815b865181101561123c5785818151811061103d57fe5b60200260200101516000146112345760008061106b89848151811061105e57fe5b6020026020010151610fdc565b915091506000198714156110f4578196506110b38189858151811061108c57fe5b6020908102919091018101516000868152918890526040822054929163ffffffff61137616565b95506110ed818985815181106110c557fe5b602090810291909101810151600086815260039092526040822054929163ffffffff61137616565b945061118c565b8682146111315760008781526020858152604080832098909855838252878220549882526003905286812095909555818552949093205492949385905b61115c8189858151811061114157fe5b6020026020010151600089611376909392919063ffffffff16565b95506111898189858151811061116e57fe5b6020026020010151600088611376909392919063ffffffff16565b94505b600689848151811061119a57fe5b6020026020010151815481106111ac57fe5b600091825260208220015489516001600160a01b039091169163a6d49dca918d908c90889081106111d957fe5b60200260200101516040518463ffffffff1660e01b81526004016111ff93929190612098565b600060405180830381600087803b15801561121957600080fd5b505af115801561122d573d6000803e3d6000fd5b5050505050505b600101611028565b50600019841461126357600084815260208281526040808320869055600390915290208290555b50505050505050565b60006006838154811061127b57fe5b60009182526020822001546001600160a01b031691508061129b85610fdc565b6001600160a01b03881660009081526004602090815260408083208584529182905290912054929450909250906112d59083876001611376565b600084815260208381526040808320939093556003905220546112fb9083876001611376565b60008481526003602052604080822092909255905163536a4ee560e11b81526001600160a01b0386169163a6d49dca9161133b918b918a90600401612098565b600060405180830381600087803b15801561135557600080fd5b505af1158015611369573d6000803e3d6000fd5b5050505050505050505050565b6000808083600281111561138657fe5b14156113b9576113968686610fed565b90506113b286866113ad848863ffffffff611c0816565b611c2b565b9150610910565b60018360028111156113c757fe5b141561140e576113d78686610fed565b9050838110156113f95760405162461bcd60e51b8152600401610417906123e9565b6113b286866113ad848863ffffffff611c7416565b600283600281111561141c57fe5b141561142d576113b2868686611c2b565b60405162461bcd60e51b8152600401610417906122b0565b6001600160a01b0380851660009081526004602052604080822092861682528120600019928291825b87518110156116615786818151811061148357fe5b6020026020010151600014611659576000806114a48a848151811061105e57fe5b91509150600019881415611522578197506114e785600084815260200190815260200160002054828b86815181106114d857fe5b60200260200101516001611376565b965061151b84600084815260200190815260200160002054828b868151811061150c57fe5b60200260200101516000611376565b955061159e565b87821461155e57600097885260208581526040808a20989098558481528789209690965581885284865286882054958490529590962054939486905b611589818a858151811061156e57fe5b602002602001015160018a611376909392919063ffffffff16565b965061159b818a858151811061114157fe5b95505b600060068b85815181106115ae57fe5b6020026020010151815481106115c057fe5b9060005260206000200160009054906101000a90046001600160a01b03169050806001600160a01b031663a6d49dca8e8e8d88815181106115fd57fe5b60200260200101516040518463ffffffff1660e01b815260040161162393929190612098565b600060405180830381600087803b15801561163d57600080fd5b505af1158015611651573d6000803e3d6000fd5b505050505050505b60010161146e565b506000198514611687576000858152602083815260408083208790559083905290208390555b505050505050505050565b6001600160a01b0383166000908152600460205260408120819060001990825b86518110156118ad578581815181106116c757fe5b60200260200101516000146118a5576000806116e889848151811061105e57fe5b9150915060001985141561177d578194506117368189858151811061170957fe5b6020026020010151600187600087815260200190815260200160002054611376909392919063ffffffff16565b96506117768189858151811061174857fe5b602002602001015160016003600087815260200190815260200160002054611376909392919063ffffffff16565b95506117fc565b8482146117bc57600085815260208581526040808320999099558382528882205496825260039052878120969096558186529590942054929492939283905b6117cc8189858151811061156e57fe5b96506117f9818985815181106117de57fe5b6020026020010151600189611376909392919063ffffffff16565b95505b600689848151811061180a57fe5b60200260200101518154811061181c57fe5b600091825260208220015489516001600160a01b039091169163a6d49dca918d91908c908890811061184a57fe5b60200260200101516040518463ffffffff1660e01b815260040161187093929190612098565b600060405180830381600087803b15801561188a57600080fd5b505af115801561189e573d6000803e3d6000fd5b5050505050505b6001016116b2565b5060001982146112635760009182526020908152604080832094909455600390529190912055505050565b6001600160a01b03821660009081526002602052604090819020805460ff1916831515179055517fb21eb88b4e33b3f1281830a7178d74d8aa73220416215726b68ae23d539515cb90610e7590849084906120d6565b6001600160a01b03821660009081526001602052604090205460ff16156119675760405162461bcd60e51b8152600401610417906121ae565b6001600160a01b0383811660008181526005602090815260408083209487168084529490915290819020805460ff1916851515179055517f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31906119cb908590612135565b60405180910390a3505050565b60006006805490509050306001600160a01b0316826001600160a01b0316638b7b59d06040518163ffffffff1660e01b815260040160206040518083038186803b158015611a2557600080fd5b505afa158015611a39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a5d9190611d01565b6001600160a01b031614611a835760405162461bcd60e51b815260040161041790612140565b80826001600160a01b031663b8f9260b6040518163ffffffff1660e01b815260040160206040518083038186803b158015611abd57600080fd5b505afa158015611ad1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611af5919061204b565b14611b125760405162461bcd60e51b8152600401610417906123b2565b600680546001810182556000919091527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0384161790556040517f2f334d8c412c0143e93911652cc34f5fcaae2f287a574eae9736d648f9b4363190611ba5908490612084565b60405180910390a1919050565b6001600160a01b03821660009081526007602052604090819020805460ff1916831515179055517fff452b3b9159b024a9098f0058c63eccd90d36b3584608202800d662f962bb6090610e7590849084906120d6565b81810182811015610f6f5760405162461bcd60e51b8152600401610417906124da565b60006401000000008210611c515760405162461bcd60e51b81526004016104179061221c565b5063ffffffff600183016020026101000390811b1984169082901b179392505050565b600082821115611c965760405162461bcd60e51b815260040161041790612279565b50900390565b60008083601f840112611cad578182fd5b50813567ffffffffffffffff811115611cc4578182fd5b6020830191508360208083028501011115611cde57600080fd5b9250929050565b600060208284031215611cf6578081fd5b813561052381612588565b600060208284031215611d12578081fd5b815161052381612588565b60008060408385031215611d2f578081fd5b8235611d3a81612588565b91506020830135611d4a81612588565b809150509250929050565b60008060008060008060808789031215611d6d578182fd5b8635611d7881612588565b95506020870135611d8881612588565b9450604087013567ffffffffffffffff80821115611da4578384fd5b611db08a838b01611c9c565b90965094506060890135915080821115611dc8578384fd5b50611dd589828a01611c9c565b979a9699509497509295939492505050565b600080600060608486031215611dfb578283fd5b8335611e0681612588565b92506020840135611e1681612588565b915060408401358015158114611e2a578182fd5b809150509250925092565b60008060008060808587031215611e4a578384fd5b8435611e5581612588565b93506020850135611e6581612588565b93969395505050506040820135916060013590565b600080600080600060608688031215611e91578081fd5b8535611e9c81612588565b9450602086013567ffffffffffffffff80821115611eb8578283fd5b611ec489838a01611c9c565b90965094506040880135915080821115611edc578283fd5b50611ee988828901611c9c565b969995985093965092949392505050565b60008060408385031215611f0c578182fd5b8235611f1781612588565b915060208301358015158114611d4a578182fd5b60008060408385031215611f3d578182fd5b8235611f4881612588565b946020939093013593505050565b600080600060608486031215611f6a578283fd5b8335611f7581612588565b95602085013595506040909401359392505050565b60008060008060408587031215611f9f578384fd5b843567ffffffffffffffff80821115611fb6578586fd5b611fc288838901611c9c565b90965094506020870135915080821115611fda578384fd5b50611fe787828801611c9c565b95989497509550505050565b60008060208385031215612005578182fd5b823567ffffffffffffffff81111561201b578283fd5b61202785828601611c9c565b90969095509350505050565b600060208284031215612044578081fd5b5035919050565b60006020828403121561205c578081fd5b5051919050565b60008060408385031215612075578182fd5b50508035926020909101359150565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039290921682521515602082015260400190565b6020808252825182820181905260009190848201906040850190845b818110156121295783518352928401929184019160010161210d565b50909695505050505050565b901515815260200190565b6020808252600d908201527f494e56414c49445f47524f555000000000000000000000000000000000000000604082015260600190565b6020808252601b908201527f494e56414c49445f494e434f4e53495354454e545f4c454e4754480000000000604082015260600190565b60208082526016908201527f494e56414c49445f53555045525f4f50455241544f5200000000000000000000604082015260600190565b60208082526017908201527f494e56414c49445f544f5f5a45524f5f41444452455353000000000000000000604082015260600190565b60208082526023908201527f416d6f756e7420746f20777269746520696e2062696e20697320746f6f206c6160408201527f7267650000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526008908201527f756e6465666c6f77000000000000000000000000000000000000000000000000604082015260600190565b60208082526011908201527f496e76616c6964206f7065726174696f6e000000000000000000000000000000604082015260600190565b60208082526014908201527f4e4f545f415554484f52495a45445f41444d494e000000000000000000000000604082015260600190565b60208082526019908201527f494e56414c49445f46524f4d5f5a45524f5f4144445245535300000000000000604082015260600190565b6020808252602c908201527f6f6e6c792061646d696e20697320616c6c6f77656420746f206164642073757060408201527f6572206f70657261746f72730000000000000000000000000000000000000000606082015260800190565b6020808252600a908201527f494e56414c49445f494400000000000000000000000000000000000000000000604082015260600190565b60208082526022908201527f63616e277420737562737472616374206d6f7265207468616e2074686572652060408201527f6973000000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252602e908201527f6f6e6c792061646d696e2063616e207365747570206d6574615472616e73616360408201527f74696f6e50726f636573736f7273000000000000000000000000000000000000606082015260800190565b6020808252601b908201527f6f6e6c792061646d696e2063616e206368616e67652061646d696e0000000000604082015260600190565b60208082526008908201527f6f766572666c6f77000000000000000000000000000000000000000000000000604082015260600190565b6020808252600e908201527f4e4f545f415554484f52495a4544000000000000000000000000000000000000604082015260600190565b60208082526015908201527f4e4f545f415554484f52495a45445f4d494e5445520000000000000000000000604082015260600190565b90815260200190565b6001600160a01b038116811461259d57600080fd5b5056fea2646970667358221220f5a29abfbe04b9aaa5dd32563f39c7895ab846b5e333cb62caf7999f1dea40b164736f6c634300060500330000000000000000000000003845badade8e6dff049820680d1f14bd3903a5d000000000000000000000000018dd4e0eb8699ea4fee238de41ecfb95e32272f800000000000000000000000018dd4e0eb8699ea4fee238de41ecfb95e32272f8
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101975760003560e01c80638f283970116100e3578063b390c0ab1161008c578063e985e9c511610066578063e985e9c51461035f578063eaa5125114610372578063eeb5a5d11461038557610197565b8063b390c0ab14610326578063cf456ae714610339578063dc5074af1461034c57610197565b8063aa271e1a116100bd578063aa271e1a146102ed578063ab1c2cf314610300578063ac9fe4211461031357610197565b80638f283970146102b4578063a22cb465146102c7578063a531e0fa146102da57610197565b80634e1273f411610145578063805349341161011f578063805349341461027b5780638806792f1461028e5780638a04af6a146102a157610197565b80634e1273f414610233578063654b748a146102535780636e9960c31461026657610197565b8063124d91e511610176578063124d91e5146101fa578063156e29f61461020d57806317fad7fc1461022057610197565b8062fdd58e1461019c5780630ca83480146101c55780630d70e29c146101da575b600080fd5b6101af6101aa366004611f2b565b610398565b6040516101bc919061257f565b60405180910390f35b6101d86101d3366004611e7a565b6103e8565b005b6101ed6101e8366004611d1d565b6104b4565b6040516101bc9190612135565b6101d8610208366004611f56565b61052a565b6101d861021b366004611f56565b6105c4565b6101d861022e366004611d55565b6106ff565b610246610241366004611f8a565b610845565b6040516101bc91906120f1565b6101ed610261366004611ce5565b610919565b61026e610937565b6040516101bc9190612084565b6101d8610289366004611e7a565b610946565b6101af61029c366004612033565b610a64565b6101d86102af366004611efa565b610a9e565b6101d86102c2366004611ce5565b610ad6565b6101d86102d5366004611efa565b610b81565b6101d86102e8366004611e35565b610b8c565b6101ed6102fb366004611ce5565b610d70565b6101d861030e366004611ff3565b610d8e565b6101d8610321366004611efa565b610df5565b6101d8610334366004612063565b610e81565b6101d8610347366004611efa565b610e8c565b6101ed61035a366004611ce5565b610ec0565b6101ed61036d366004611d1d565b610ede565b6101ed610380366004611ce5565b610f30565b6101d8610393366004611de7565b610f75565b60008060006103a684610fdc565b6001600160a01b038716600090815260046020908152604080832085845290915290205491935091506103df908263ffffffff610fed16565b95945050505050565b3360009081526007602052604090205460ff166104205760405162461bcd60e51b815260040161041790612548565b60405180910390fd5b82811461043f5760405162461bcd60e51b815260040161041790612177565b6104ad858585808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060408051602080890282810182019093528882529093508892508791829185019084908082843760009201919091525061100792505050565b5050505050565b6001600160a01b03811660009081526002602052604081205460ff16806104f357506001600160a01b03821660009081526001602052604090205460ff165b8061052357506001600160a01b0380841660009081526005602090815260408083209386168352929052205460ff165b9392505050565b6001600160a01b03831633148061055057503360009081526001602052604090205460ff165b8061057e57506001600160a01b038316600090815260056020908152604080832033845290915290205460ff165b8061059857503360009081526002602052604090205460ff165b6105b45760405162461bcd60e51b815260040161041790612511565b6105bf83838361126c565b505050565b3360009081526007602052604090205460ff166105f35760405162461bcd60e51b815260040161041790612548565b6000806105ff84610fdc565b6001600160a01b038716600090815260046020908152604080832085845291829052822054939550919350909161063f918490879063ffffffff61137616565b60008481526020838152604080832093909355600390529081205461066d918490879063ffffffff61137616565b600084815260036020526040902055600680548690811061068a57fe5b600091825260208220015460405163536a4ee560e11b81526001600160a01b039091169163a6d49dca916106c591908a908990600401612098565b600060405180830381600087803b1580156106df57600080fd5b505af11580156106f3573d6000803e3d6000fd5b50505050505050505050565b82811461071e5760405162461bcd60e51b815260040161041790612177565b6001600160a01b0385166107445760405162461bcd60e51b8152600401610417906121e5565b6001600160a01b03861633148061076a57503360009081526001602052604090205460ff165b8061079857506001600160a01b038616600090815260056020908152604080832033845290915290205460ff165b806107b257503360009081526002602052604090205460ff165b6107ce5760405162461bcd60e51b815260040161041790612511565b61083d868686868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808a0282810182019093528982529093508992508891829185019084908082843760009201919091525061144592505050565b505050505050565b60608382146108665760405162461bcd60e51b815260040161041790612177565b8167ffffffffffffffff8111801561087d57600080fd5b506040519080825280602002602001820160405280156108a7578160200160208202803683370190505b50905060005b82811015610910576108f18686838181106108c457fe5b90506020020160208101906108d99190611ce5565b8585848181106108e557fe5b90506020020135610398565b8282815181106108fd57fe5b60209081029190910101526001016108ad565b50949350505050565b6001600160a01b031660009081526001602052604090205460ff1690565b6000546001600160a01b031690565b6001600160a01b03851661096c5760405162461bcd60e51b81526004016104179061231e565b6001600160a01b03851633148061099257503360009081526002602052604090205460ff165b806109ac57503360009081526001602052604090205460ff165b806109da57506001600160a01b038516600090815260056020908152604080832033845290915290205460ff165b6109f65760405162461bcd60e51b815260040161041790612511565b6104ad858585808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060408051602080890282810182019093528882529093508892508791829185019084908082843760009201919091525061169292505050565b6000806000610a7284610fdc565b6000828152600360205260409020549193509150610a96908263ffffffff610fed16565b949350505050565b6000546001600160a01b03163314610ac85760405162461bcd60e51b815260040161041790612446565b610ad282826118d8565b5050565b6000546001600160a01b03163314610b005760405162461bcd60e51b8152600401610417906124a3565b6000546040517f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f91610b3f916001600160a01b039091169084906120bc565b60405180910390a1600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b610ad233838361192e565b6001600160a01b038316610bb25760405162461bcd60e51b8152600401610417906121e5565b600060068381548110610bc157fe5b6000918252602090912001546001600160a01b0390811691508516331480610bf15750336001600160a01b038216145b80610c0b57503360009081526002602052604090205460ff165b80610c2557503360009081526001602052604090205460ff165b80610c5357506001600160a01b038516600090815260056020908152604080832033845290915290205460ff165b610c6f5760405162461bcd60e51b815260040161041790612511565b600080610c7b85610fdc565b6001600160a01b03808a166000908152600460209081526040808320938c168352808320868452918490529091205493955091935091610cc4908488600163ffffffff61137616565b6000858152602084815260408083209390935583905290812054610cf1918590899063ffffffff61137616565b60008581526020839052604090819020919091555163536a4ee560e11b81526001600160a01b0386169063a6d49dca90610d33908c908c908b90600401612098565b600060405180830381600087803b158015610d4d57600080fd5b505af1158015610d61573d6000803e3d6000fd5b50505050505050505050505050565b6001600160a01b031660009081526007602052604090205460ff1690565b6000546001600160a01b03163314610db85760405162461bcd60e51b8152600401610417906122e7565b60005b818110156105bf57610dec838383818110610dd257fe5b9050602002016020810190610de79190611ce5565b6119d8565b50600101610dbb565b6000546001600160a01b03163314610e1f5760405162461bcd60e51b815260040161041790612355565b6001600160a01b03821660009081526001602052604090819020805460ff1916831515179055517f44f92d27abdf4cfb6a7d712c3af68f3be086d4ca747ab802c36f67d6790060d890610e7590849084906120d6565b60405180910390a15050565b610ad233838361126c565b6000546001600160a01b03163314610eb65760405162461bcd60e51b8152600401610417906122e7565b610ad28282611bb2565b6001600160a01b031660009081526002602052604090205460ff1690565b6001600160a01b03808316600090815260056020908152604080832093851683529290529081205460ff16806105235750506001600160a01b031660009081526001602052604090205460ff16919050565b6001600160a01b03811660009081526002602052604081205460ff1680610f6f57506001600160a01b03821660009081526001602052604090205460ff165b92915050565b336001600160a01b0384161480610f9b57503360009081526002602052604090205460ff165b80610fb557503360009081526001602052604090205460ff165b610fd15760405162461bcd60e51b815260040161041790612511565b6105bf83838361192e565b610100602082020491600790911690565b600181016020026101000382901c63ffffffff1692915050565b6001600160a01b038316600090815260046020526040812060001991908190815b865181101561123c5785818151811061103d57fe5b60200260200101516000146112345760008061106b89848151811061105e57fe5b6020026020010151610fdc565b915091506000198714156110f4578196506110b38189858151811061108c57fe5b6020908102919091018101516000868152918890526040822054929163ffffffff61137616565b95506110ed818985815181106110c557fe5b602090810291909101810151600086815260039092526040822054929163ffffffff61137616565b945061118c565b8682146111315760008781526020858152604080832098909855838252878220549882526003905286812095909555818552949093205492949385905b61115c8189858151811061114157fe5b6020026020010151600089611376909392919063ffffffff16565b95506111898189858151811061116e57fe5b6020026020010151600088611376909392919063ffffffff16565b94505b600689848151811061119a57fe5b6020026020010151815481106111ac57fe5b600091825260208220015489516001600160a01b039091169163a6d49dca918d908c90889081106111d957fe5b60200260200101516040518463ffffffff1660e01b81526004016111ff93929190612098565b600060405180830381600087803b15801561121957600080fd5b505af115801561122d573d6000803e3d6000fd5b5050505050505b600101611028565b50600019841461126357600084815260208281526040808320869055600390915290208290555b50505050505050565b60006006838154811061127b57fe5b60009182526020822001546001600160a01b031691508061129b85610fdc565b6001600160a01b03881660009081526004602090815260408083208584529182905290912054929450909250906112d59083876001611376565b600084815260208381526040808320939093556003905220546112fb9083876001611376565b60008481526003602052604080822092909255905163536a4ee560e11b81526001600160a01b0386169163a6d49dca9161133b918b918a90600401612098565b600060405180830381600087803b15801561135557600080fd5b505af1158015611369573d6000803e3d6000fd5b5050505050505050505050565b6000808083600281111561138657fe5b14156113b9576113968686610fed565b90506113b286866113ad848863ffffffff611c0816565b611c2b565b9150610910565b60018360028111156113c757fe5b141561140e576113d78686610fed565b9050838110156113f95760405162461bcd60e51b8152600401610417906123e9565b6113b286866113ad848863ffffffff611c7416565b600283600281111561141c57fe5b141561142d576113b2868686611c2b565b60405162461bcd60e51b8152600401610417906122b0565b6001600160a01b0380851660009081526004602052604080822092861682528120600019928291825b87518110156116615786818151811061148357fe5b6020026020010151600014611659576000806114a48a848151811061105e57fe5b91509150600019881415611522578197506114e785600084815260200190815260200160002054828b86815181106114d857fe5b60200260200101516001611376565b965061151b84600084815260200190815260200160002054828b868151811061150c57fe5b60200260200101516000611376565b955061159e565b87821461155e57600097885260208581526040808a20989098558481528789209690965581885284865286882054958490529590962054939486905b611589818a858151811061156e57fe5b602002602001015160018a611376909392919063ffffffff16565b965061159b818a858151811061114157fe5b95505b600060068b85815181106115ae57fe5b6020026020010151815481106115c057fe5b9060005260206000200160009054906101000a90046001600160a01b03169050806001600160a01b031663a6d49dca8e8e8d88815181106115fd57fe5b60200260200101516040518463ffffffff1660e01b815260040161162393929190612098565b600060405180830381600087803b15801561163d57600080fd5b505af1158015611651573d6000803e3d6000fd5b505050505050505b60010161146e565b506000198514611687576000858152602083815260408083208790559083905290208390555b505050505050505050565b6001600160a01b0383166000908152600460205260408120819060001990825b86518110156118ad578581815181106116c757fe5b60200260200101516000146118a5576000806116e889848151811061105e57fe5b9150915060001985141561177d578194506117368189858151811061170957fe5b6020026020010151600187600087815260200190815260200160002054611376909392919063ffffffff16565b96506117768189858151811061174857fe5b602002602001015160016003600087815260200190815260200160002054611376909392919063ffffffff16565b95506117fc565b8482146117bc57600085815260208581526040808320999099558382528882205496825260039052878120969096558186529590942054929492939283905b6117cc8189858151811061156e57fe5b96506117f9818985815181106117de57fe5b6020026020010151600189611376909392919063ffffffff16565b95505b600689848151811061180a57fe5b60200260200101518154811061181c57fe5b600091825260208220015489516001600160a01b039091169163a6d49dca918d91908c908890811061184a57fe5b60200260200101516040518463ffffffff1660e01b815260040161187093929190612098565b600060405180830381600087803b15801561188a57600080fd5b505af115801561189e573d6000803e3d6000fd5b5050505050505b6001016116b2565b5060001982146112635760009182526020908152604080832094909455600390529190912055505050565b6001600160a01b03821660009081526002602052604090819020805460ff1916831515179055517fb21eb88b4e33b3f1281830a7178d74d8aa73220416215726b68ae23d539515cb90610e7590849084906120d6565b6001600160a01b03821660009081526001602052604090205460ff16156119675760405162461bcd60e51b8152600401610417906121ae565b6001600160a01b0383811660008181526005602090815260408083209487168084529490915290819020805460ff1916851515179055517f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31906119cb908590612135565b60405180910390a3505050565b60006006805490509050306001600160a01b0316826001600160a01b0316638b7b59d06040518163ffffffff1660e01b815260040160206040518083038186803b158015611a2557600080fd5b505afa158015611a39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a5d9190611d01565b6001600160a01b031614611a835760405162461bcd60e51b815260040161041790612140565b80826001600160a01b031663b8f9260b6040518163ffffffff1660e01b815260040160206040518083038186803b158015611abd57600080fd5b505afa158015611ad1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611af5919061204b565b14611b125760405162461bcd60e51b8152600401610417906123b2565b600680546001810182556000919091527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0384161790556040517f2f334d8c412c0143e93911652cc34f5fcaae2f287a574eae9736d648f9b4363190611ba5908490612084565b60405180910390a1919050565b6001600160a01b03821660009081526007602052604090819020805460ff1916831515179055517fff452b3b9159b024a9098f0058c63eccd90d36b3584608202800d662f962bb6090610e7590849084906120d6565b81810182811015610f6f5760405162461bcd60e51b8152600401610417906124da565b60006401000000008210611c515760405162461bcd60e51b81526004016104179061221c565b5063ffffffff600183016020026101000390811b1984169082901b179392505050565b600082821115611c965760405162461bcd60e51b815260040161041790612279565b50900390565b60008083601f840112611cad578182fd5b50813567ffffffffffffffff811115611cc4578182fd5b6020830191508360208083028501011115611cde57600080fd5b9250929050565b600060208284031215611cf6578081fd5b813561052381612588565b600060208284031215611d12578081fd5b815161052381612588565b60008060408385031215611d2f578081fd5b8235611d3a81612588565b91506020830135611d4a81612588565b809150509250929050565b60008060008060008060808789031215611d6d578182fd5b8635611d7881612588565b95506020870135611d8881612588565b9450604087013567ffffffffffffffff80821115611da4578384fd5b611db08a838b01611c9c565b90965094506060890135915080821115611dc8578384fd5b50611dd589828a01611c9c565b979a9699509497509295939492505050565b600080600060608486031215611dfb578283fd5b8335611e0681612588565b92506020840135611e1681612588565b915060408401358015158114611e2a578182fd5b809150509250925092565b60008060008060808587031215611e4a578384fd5b8435611e5581612588565b93506020850135611e6581612588565b93969395505050506040820135916060013590565b600080600080600060608688031215611e91578081fd5b8535611e9c81612588565b9450602086013567ffffffffffffffff80821115611eb8578283fd5b611ec489838a01611c9c565b90965094506040880135915080821115611edc578283fd5b50611ee988828901611c9c565b969995985093965092949392505050565b60008060408385031215611f0c578182fd5b8235611f1781612588565b915060208301358015158114611d4a578182fd5b60008060408385031215611f3d578182fd5b8235611f4881612588565b946020939093013593505050565b600080600060608486031215611f6a578283fd5b8335611f7581612588565b95602085013595506040909401359392505050565b60008060008060408587031215611f9f578384fd5b843567ffffffffffffffff80821115611fb6578586fd5b611fc288838901611c9c565b90965094506020870135915080821115611fda578384fd5b50611fe787828801611c9c565b95989497509550505050565b60008060208385031215612005578182fd5b823567ffffffffffffffff81111561201b578283fd5b61202785828601611c9c565b90969095509350505050565b600060208284031215612044578081fd5b5035919050565b60006020828403121561205c578081fd5b5051919050565b60008060408385031215612075578182fd5b50508035926020909101359150565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039290921682521515602082015260400190565b6020808252825182820181905260009190848201906040850190845b818110156121295783518352928401929184019160010161210d565b50909695505050505050565b901515815260200190565b6020808252600d908201527f494e56414c49445f47524f555000000000000000000000000000000000000000604082015260600190565b6020808252601b908201527f494e56414c49445f494e434f4e53495354454e545f4c454e4754480000000000604082015260600190565b60208082526016908201527f494e56414c49445f53555045525f4f50455241544f5200000000000000000000604082015260600190565b60208082526017908201527f494e56414c49445f544f5f5a45524f5f41444452455353000000000000000000604082015260600190565b60208082526023908201527f416d6f756e7420746f20777269746520696e2062696e20697320746f6f206c6160408201527f7267650000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526008908201527f756e6465666c6f77000000000000000000000000000000000000000000000000604082015260600190565b60208082526011908201527f496e76616c6964206f7065726174696f6e000000000000000000000000000000604082015260600190565b60208082526014908201527f4e4f545f415554484f52495a45445f41444d494e000000000000000000000000604082015260600190565b60208082526019908201527f494e56414c49445f46524f4d5f5a45524f5f4144445245535300000000000000604082015260600190565b6020808252602c908201527f6f6e6c792061646d696e20697320616c6c6f77656420746f206164642073757060408201527f6572206f70657261746f72730000000000000000000000000000000000000000606082015260800190565b6020808252600a908201527f494e56414c49445f494400000000000000000000000000000000000000000000604082015260600190565b60208082526022908201527f63616e277420737562737472616374206d6f7265207468616e2074686572652060408201527f6973000000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252602e908201527f6f6e6c792061646d696e2063616e207365747570206d6574615472616e73616360408201527f74696f6e50726f636573736f7273000000000000000000000000000000000000606082015260800190565b6020808252601b908201527f6f6e6c792061646d696e2063616e206368616e67652061646d696e0000000000604082015260600190565b60208082526008908201527f6f766572666c6f77000000000000000000000000000000000000000000000000604082015260600190565b6020808252600e908201527f4e4f545f415554484f52495a4544000000000000000000000000000000000000604082015260600190565b60208082526015908201527f4e4f545f415554484f52495a45445f4d494e5445520000000000000000000000604082015260600190565b90815260200190565b6001600160a01b038116811461259d57600080fd5b5056fea2646970667358221220f5a29abfbe04b9aaa5dd32563f39c7895ab846b5e333cb62caf7999f1dea40b164736f6c63430006050033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000003845badade8e6dff049820680d1f14bd3903a5d000000000000000000000000018dd4e0eb8699ea4fee238de41ecfb95e32272f800000000000000000000000018dd4e0eb8699ea4fee238de41ecfb95e32272f8
-----Decoded View---------------
Arg [0] : metaTransactionContract (address): 0x3845badAde8e6dFF049820680d1F14bD3903a5d0
Arg [1] : admin (address): 0x18dd4e0eb8699eA4FeE238dE41ECfb95e32272f8
Arg [2] : initialMinter (address): 0x18dd4e0eb8699eA4FeE238dE41ECfb95e32272f8
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000003845badade8e6dff049820680d1f14bd3903a5d0
Arg [1] : 00000000000000000000000018dd4e0eb8699ea4fee238de41ecfb95e32272f8
Arg [2] : 00000000000000000000000018dd4e0eb8699ea4fee238de41ecfb95e32272f8
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.