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 4 from a total of 4 transactions
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
GatewayLogicV1
Compiler Version
v0.5.16+commit.9c3226ce
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-03-25 */ /** Deployed by Ren Project, https://renproject.io Commit hash: 9068f80 Repository: https://github.com/renproject/darknode-sol Issues: https://github.com/renproject/darknode-sol/issues Licenses @openzeppelin/contracts: (MIT) https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/LICENSE darknode-sol: (GNU GPL V3) https://github.com/renproject/darknode-sol/blob/master/LICENSE */ pragma solidity 0.5.16; contract Initializable { bool private initialized; bool private initializing; modifier initializer() { require(initializing || isConstructor() || !initialized, "Contract instance has already been initialized"); bool isTopLevelCall = !initializing; if (isTopLevelCall) { initializing = true; initialized = true; } _; if (isTopLevelCall) { initializing = false; } } function isConstructor() private view returns (bool) { address self = address(this); uint256 cs; assembly { cs := extcodesize(self) } return cs == 0; } uint256[50] private ______gap; } library SafeMath { function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; return c; } function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } library ECDSA { function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { if (signature.length != 65) { revert("ECDSA: signature length is invalid"); } bytes32 r; bytes32 s; uint8 v; assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { revert("ECDSA: signature.s is in the wrong range"); } if (v != 27 && v != 28) { revert("ECDSA: signature.v is in the wrong range"); } return ecrecover(hash, v, r, s); } function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } } contract Proxy { function () payable external { _fallback(); } function _implementation() internal view returns (address); function _delegate(address implementation) internal { assembly { calldatacopy(0, 0, calldatasize) let result := delegatecall(gas, implementation, 0, calldatasize, 0, 0) returndatacopy(0, 0, returndatasize) switch result case 0 { revert(0, returndatasize) } default { return(0, returndatasize) } } } function _willFallback() internal { } function _fallback() internal { _willFallback(); _delegate(_implementation()); } } library OpenZeppelinUpgradesAddress { function isContract(address account) internal view returns (bool) { uint256 size; assembly { size := extcodesize(account) } return size > 0; } } contract BaseUpgradeabilityProxy is Proxy { event Upgraded(address indexed implementation); bytes32 internal constant IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; function _implementation() internal view returns (address impl) { bytes32 slot = IMPLEMENTATION_SLOT; assembly { impl := sload(slot) } } function _upgradeTo(address newImplementation) internal { _setImplementation(newImplementation); emit Upgraded(newImplementation); } function _setImplementation(address newImplementation) internal { require(OpenZeppelinUpgradesAddress.isContract(newImplementation), "Cannot set a proxy implementation to a non-contract address"); bytes32 slot = IMPLEMENTATION_SLOT; assembly { sstore(slot, newImplementation) } } } contract UpgradeabilityProxy is BaseUpgradeabilityProxy { constructor(address _logic, bytes memory _data) public payable { assert(IMPLEMENTATION_SLOT == bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1)); _setImplementation(_logic); if(_data.length > 0) { (bool success,) = _logic.delegatecall(_data); require(success); } } } contract BaseAdminUpgradeabilityProxy is BaseUpgradeabilityProxy { event AdminChanged(address previousAdmin, address newAdmin); bytes32 internal constant ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103; modifier ifAdmin() { if (msg.sender == _admin()) { _; } else { _fallback(); } } function admin() external ifAdmin returns (address) { return _admin(); } function implementation() external ifAdmin returns (address) { return _implementation(); } function changeAdmin(address newAdmin) external ifAdmin { require(newAdmin != address(0), "Cannot change the admin of a proxy to the zero address"); emit AdminChanged(_admin(), newAdmin); _setAdmin(newAdmin); } function upgradeTo(address newImplementation) external ifAdmin { _upgradeTo(newImplementation); } function upgradeToAndCall(address newImplementation, bytes calldata data) payable external ifAdmin { _upgradeTo(newImplementation); (bool success,) = newImplementation.delegatecall(data); require(success); } function _admin() internal view returns (address adm) { bytes32 slot = ADMIN_SLOT; assembly { adm := sload(slot) } } function _setAdmin(address newAdmin) internal { bytes32 slot = ADMIN_SLOT; assembly { sstore(slot, newAdmin) } } function _willFallback() internal { require(msg.sender != _admin(), "Cannot call fallback function from the proxy admin"); super._willFallback(); } } contract InitializableUpgradeabilityProxy is BaseUpgradeabilityProxy { function initialize(address _logic, bytes memory _data) public payable { require(_implementation() == address(0)); assert(IMPLEMENTATION_SLOT == bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1)); _setImplementation(_logic); if(_data.length > 0) { (bool success,) = _logic.delegatecall(_data); require(success); } } } contract InitializableAdminUpgradeabilityProxy is BaseAdminUpgradeabilityProxy, InitializableUpgradeabilityProxy { function initialize(address _logic, address _admin, bytes memory _data) public payable { require(_implementation() == address(0)); InitializableUpgradeabilityProxy.initialize(_logic, _data); assert(ADMIN_SLOT == bytes32(uint256(keccak256('eip1967.proxy.admin')) - 1)); _setAdmin(_admin); } } contract Context is Initializable { constructor () internal { } function _msgSender() internal view returns (address payable) { return msg.sender; } function _msgData() internal view returns (bytes memory) { this; return msg.data; } } contract Ownable is Initializable, Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); function initialize(address sender) public initializer { _owner = sender; emit OwnershipTransferred(address(0), _owner); } function owner() public view returns (address) { return _owner; } modifier onlyOwner() { require(isOwner(), "Ownable: caller is not the owner"); _; } function isOwner() public view returns (bool) { return _msgSender() == _owner; } function renounceOwnership() public onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } function transferOwnership(address newOwner) public onlyOwner { _transferOwnership(newOwner); } function _transferOwnership(address newOwner) internal { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } uint256[50] private ______gap; } contract Claimable is Initializable, Ownable { address public pendingOwner; function initialize(address _nextOwner) public initializer { Ownable.initialize(_nextOwner); } modifier onlyPendingOwner() { require( _msgSender() == pendingOwner, "Claimable: caller is not the pending owner" ); _; } function transferOwnership(address newOwner) public onlyOwner { require( newOwner != owner() && newOwner != pendingOwner, "Claimable: invalid new owner" ); pendingOwner = newOwner; } function claimOwnership() public onlyPendingOwner { _transferOwnership(pendingOwner); delete pendingOwner; } } library String { function fromUint(uint256 _i) internal pure returns (string memory) { if (_i == 0) { return "0"; } uint256 j = _i; uint256 len; while (j != 0) { len++; j /= 10; } bytes memory bstr = new bytes(len); uint256 k = len - 1; while (_i != 0) { bstr[k--] = bytes1(uint8(48 + (_i % 10))); _i /= 10; } return string(bstr); } function fromBytes32(bytes32 _value) internal pure returns (string memory) { bytes memory alphabet = "0123456789abcdef"; bytes memory str = new bytes(32 * 2 + 2); str[0] = "0"; str[1] = "x"; for (uint256 i = 0; i < 32; i++) { str[2 + i * 2] = alphabet[uint256(uint8(_value[i] >> 4))]; str[3 + i * 2] = alphabet[uint256(uint8(_value[i] & 0x0f))]; } return string(str); } function fromAddress(address _addr) internal pure returns (string memory) { bytes32 value = bytes32(uint256(_addr)); bytes memory alphabet = "0123456789abcdef"; bytes memory str = new bytes(20 * 2 + 2); str[0] = "0"; str[1] = "x"; for (uint256 i = 0; i < 20; i++) { str[2 + i * 2] = alphabet[uint256(uint8(value[i + 12] >> 4))]; str[3 + i * 2] = alphabet[uint256(uint8(value[i + 12] & 0x0f))]; } return string(str); } function add8( string memory a, string memory b, string memory c, string memory d, string memory e, string memory f, string memory g, string memory h ) internal pure returns (string memory) { return string(abi.encodePacked(a, b, c, d, e, f, g, h)); } } interface IERC20 { function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function transfer(address recipient, uint256 amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); } contract ERC20 is Initializable, Context, IERC20 { using SafeMath for uint256; mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; uint256 private _totalSupply; function totalSupply() public view returns (uint256) { return _totalSupply; } function balanceOf(address account) public view returns (uint256) { return _balances[account]; } function transfer(address recipient, uint256 amount) public returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } function allowance(address owner, address spender) public view returns (uint256) { return _allowances[owner][spender]; } function approve(address spender, uint256 amount) public returns (bool) { _approve(_msgSender(), spender, amount); return true; } function transferFrom(address sender, address recipient, uint256 amount) public returns (bool) { _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } function increaseAllowance(address spender, uint256 addedValue) public returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } function _transfer(address sender, address recipient, uint256 amount) internal { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance"); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } function _mint(address account, uint256 amount) internal { require(account != address(0), "ERC20: mint to the zero address"); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(address(0), account, amount); } function _burn(address account, uint256 amount) internal { require(account != address(0), "ERC20: burn from the zero address"); _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance"); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); } function _approve(address owner, address spender, uint256 amount) internal { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } function _burnFrom(address account, uint256 amount) internal { _burn(account, amount); _approve(account, _msgSender(), _allowances[account][_msgSender()].sub(amount, "ERC20: burn amount exceeds allowance")); } uint256[50] private ______gap; } contract ERC20Detailed is Initializable, IERC20 { string private _name; string private _symbol; uint8 private _decimals; function initialize(string memory name, string memory symbol, uint8 decimals) public initializer { _name = name; _symbol = symbol; _decimals = decimals; } function name() public view returns (string memory) { return _name; } function symbol() public view returns (string memory) { return _symbol; } function decimals() public view returns (uint8) { return _decimals; } uint256[50] private ______gap; } library Address { function isContract(address account) internal view returns (bool) { bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; assembly { codehash := extcodehash(account) } return (codehash != 0x0 && codehash != accountHash); } function toPayable(address account) internal pure returns (address payable) { return address(uint160(account)); } function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call.value(amount)(""); require(success, "Address: unable to send value, recipient may have reverted"); } } library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } function safeApprove(IERC20 token, address spender, uint256 value) internal { require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function callOptionalReturn(IERC20 token, bytes memory data) private { require(address(token).isContract(), "SafeERC20: call to non-contract"); (bool success, bytes memory returndata) = address(token).call(data); require(success, "SafeERC20: low-level call failed"); if (returndata.length > 0) { require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } contract CanReclaimTokens is Claimable { using SafeERC20 for ERC20; mapping(address => bool) private recoverableTokensBlacklist; function initialize(address _nextOwner) public initializer { Claimable.initialize(_nextOwner); } function blacklistRecoverableToken(address _token) public onlyOwner { recoverableTokensBlacklist[_token] = true; } function recoverTokens(address _token) external onlyOwner { require( !recoverableTokensBlacklist[_token], "CanReclaimTokens: token is not recoverable" ); if (_token == address(0x0)) { msg.sender.transfer(address(this).balance); } else { ERC20(_token).safeTransfer( msg.sender, ERC20(_token).balanceOf(address(this)) ); } } } contract ERC20WithRate is Initializable, Ownable, ERC20 { using SafeMath for uint256; uint256 public constant _rateScale = 1e18; uint256 internal _rate; event LogRateChanged(uint256 indexed _rate); function initialize(address _nextOwner, uint256 _initialRate) public initializer { Ownable.initialize(_nextOwner); _setRate(_initialRate); } function setExchangeRate(uint256 _nextRate) public onlyOwner { _setRate(_nextRate); } function exchangeRateCurrent() public view returns (uint256) { require(_rate != 0, "ERC20WithRate: rate has not been initialized"); return _rate; } function _setRate(uint256 _nextRate) internal { require(_nextRate > 0, "ERC20WithRate: rate must be greater than zero"); _rate = _nextRate; } function balanceOfUnderlying(address _account) public view returns (uint256) { return toUnderlying(balanceOf(_account)); } function toUnderlying(uint256 _amount) public view returns (uint256) { return _amount.mul(_rate).div(_rateScale); } function fromUnderlying(uint256 _amountUnderlying) public view returns (uint256) { return _amountUnderlying.mul(_rateScale).div(_rate); } } contract ERC20WithPermit is Initializable, ERC20, ERC20Detailed { using SafeMath for uint256; mapping(address => uint256) public nonces; string public version; bytes32 public DOMAIN_SEPARATOR; bytes32 public constant PERMIT_TYPEHASH = 0xea2aa0a1be11a07ed86d755c93467f4f82362b452371d1ba94d1715123511acb; function initialize( uint256 _chainId, string memory _version, string memory _name, string memory _symbol, uint8 _decimals ) public initializer { ERC20Detailed.initialize(_name, _symbol, _decimals); version = _version; DOMAIN_SEPARATOR = keccak256( abi.encode( keccak256( "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)" ), keccak256(bytes(name())), keccak256(bytes(version)), _chainId, address(this) ) ); } function permit( address holder, address spender, uint256 nonce, uint256 expiry, bool allowed, uint8 v, bytes32 r, bytes32 s ) external { bytes32 digest = keccak256( abi.encodePacked( "\x19\x01", DOMAIN_SEPARATOR, keccak256( abi.encode( PERMIT_TYPEHASH, holder, spender, nonce, expiry, allowed ) ) ) ); require(holder != address(0), "ERC20WithRate: address must not be 0x0"); require( holder == ecrecover(digest, v, r, s), "ERC20WithRate: invalid signature" ); require( expiry == 0 || now <= expiry, "ERC20WithRate: permit has expired" ); require(nonce == nonces[holder]++, "ERC20WithRate: invalid nonce"); uint256 amount = allowed ? uint256(-1) : 0; _approve(holder, spender, amount); } } contract RenERC20LogicV1 is Initializable, ERC20, ERC20Detailed, ERC20WithRate, ERC20WithPermit, Claimable, CanReclaimTokens { function initialize( uint256 _chainId, address _nextOwner, uint256 _initialRate, string memory _version, string memory _name, string memory _symbol, uint8 _decimals ) public initializer { ERC20Detailed.initialize(_name, _symbol, _decimals); ERC20WithRate.initialize(_nextOwner, _initialRate); ERC20WithPermit.initialize( _chainId, _version, _name, _symbol, _decimals ); Claimable.initialize(_nextOwner); CanReclaimTokens.initialize(_nextOwner); } function mint(address _to, uint256 _amount) public onlyOwner { _mint(_to, _amount); } function burn(address _from, uint256 _amount) public onlyOwner { _burn(_from, _amount); } function transfer(address recipient, uint256 amount) public returns (bool) { require( recipient != address(this), "RenERC20: can't transfer to token address" ); return super.transfer(recipient, amount); } function transferFrom(address sender, address recipient, uint256 amount) public returns (bool) { require( recipient != address(this), "RenERC20: can't transfer to token address" ); return super.transferFrom(sender, recipient, amount); } } contract RenBTC is InitializableAdminUpgradeabilityProxy {} contract RenZEC is InitializableAdminUpgradeabilityProxy {} contract RenBCH is InitializableAdminUpgradeabilityProxy {} interface IMintGateway { function mint( bytes32 _pHash, uint256 _amount, bytes32 _nHash, bytes calldata _sig ) external returns (uint256); function mintFee() external view returns (uint256); } interface IBurnGateway { function burn(bytes calldata _to, uint256 _amountScaled) external returns (uint256); function burnFee() external view returns (uint256); } interface IGateway { function mint( bytes32 _pHash, uint256 _amount, bytes32 _nHash, bytes calldata _sig ) external returns (uint256); function mintFee() external view returns (uint256); function burn(bytes calldata _to, uint256 _amountScaled) external returns (uint256); function burnFee() external view returns (uint256); } contract GatewayStateV1 { uint256 constant BIPS_DENOMINATOR = 10000; uint256 public minimumBurnAmount; RenERC20LogicV1 public token; address public mintAuthority; address public feeRecipient; uint16 public mintFee; uint16 public burnFee; mapping(bytes32 => bool) public status; uint256 public nextN = 0; } contract GatewayLogicV1 is Initializable, Claimable, CanReclaimTokens, IGateway, GatewayStateV1 { using SafeMath for uint256; event LogMintAuthorityUpdated(address indexed _newMintAuthority); event LogMint( address indexed _to, uint256 _amount, uint256 indexed _n, bytes32 indexed _signedMessageHash ); event LogBurn( bytes _to, uint256 _amount, uint256 indexed _n, bytes indexed _indexedTo ); modifier onlyOwnerOrMintAuthority() { require( msg.sender == mintAuthority || msg.sender == owner(), "Gateway: caller is not the owner or mint authority" ); _; } function initialize( RenERC20LogicV1 _token, address _feeRecipient, address _mintAuthority, uint16 _mintFee, uint16 _burnFee, uint256 _minimumBurnAmount ) public initializer { Claimable.initialize(msg.sender); CanReclaimTokens.initialize(msg.sender); minimumBurnAmount = _minimumBurnAmount; token = _token; mintFee = _mintFee; burnFee = _burnFee; updateMintAuthority(_mintAuthority); updateFeeRecipient(_feeRecipient); } function claimTokenOwnership() public { token.claimOwnership(); } function transferTokenOwnership(GatewayLogicV1 _nextTokenOwner) public onlyOwner { token.transferOwnership(address(_nextTokenOwner)); _nextTokenOwner.claimTokenOwnership(); } function updateMintAuthority(address _nextMintAuthority) public onlyOwnerOrMintAuthority { require( _nextMintAuthority != address(0), "Gateway: mintAuthority cannot be set to address zero" ); mintAuthority = _nextMintAuthority; emit LogMintAuthorityUpdated(mintAuthority); } function updateMinimumBurnAmount(uint256 _minimumBurnAmount) public onlyOwner { minimumBurnAmount = _minimumBurnAmount; } function updateFeeRecipient(address _nextFeeRecipient) public onlyOwner { require( _nextFeeRecipient != address(0x0), "Gateway: fee recipient cannot be 0x0" ); feeRecipient = _nextFeeRecipient; } function updateMintFee(uint16 _nextMintFee) public onlyOwner { mintFee = _nextMintFee; } function updateBurnFee(uint16 _nextBurnFee) public onlyOwner { burnFee = _nextBurnFee; } function mint( bytes32 _pHash, uint256 _amountUnderlying, bytes32 _nHash, bytes memory _sig ) public returns (uint256) { bytes32 signedMessageHash = hashForSignature( _pHash, _amountUnderlying, msg.sender, _nHash ); require( status[signedMessageHash] == false, "Gateway: nonce hash already spent" ); if (!verifySignature(signedMessageHash, _sig)) { revert( String.add8( "Gateway: invalid signature. pHash: ", String.fromBytes32(_pHash), ", amount: ", String.fromUint(_amountUnderlying), ", msg.sender: ", String.fromAddress(msg.sender), ", _nHash: ", String.fromBytes32(_nHash) ) ); } status[signedMessageHash] = true; uint256 amountScaled = token.fromUnderlying(_amountUnderlying); uint256 absoluteFeeScaled = amountScaled.mul(mintFee).div( BIPS_DENOMINATOR ); uint256 receivedAmountScaled = amountScaled.sub( absoluteFeeScaled, "Gateway: fee exceeds amount" ); token.mint(msg.sender, receivedAmountScaled); token.mint(feeRecipient, absoluteFeeScaled); uint256 receivedAmountUnderlying = token.toUnderlying( receivedAmountScaled ); emit LogMint( msg.sender, receivedAmountUnderlying, nextN, signedMessageHash ); nextN += 1; return receivedAmountScaled; } function burn(bytes memory _to, uint256 _amount) public returns (uint256) { require(_to.length != 0, "Gateway: to address is empty"); uint256 fee = _amount.mul(burnFee).div(BIPS_DENOMINATOR); uint256 amountAfterFee = _amount.sub( fee, "Gateway: fee exceeds amount" ); uint256 amountAfterFeeUnderlying = token.toUnderlying(amountAfterFee); token.burn(msg.sender, _amount); token.mint(feeRecipient, fee); require( amountAfterFeeUnderlying > minimumBurnAmount, "Gateway: amount is less than the minimum burn amount" ); emit LogBurn(_to, amountAfterFeeUnderlying, nextN, _to); nextN += 1; return amountAfterFeeUnderlying; } function verifySignature(bytes32 _signedMessageHash, bytes memory _sig) public view returns (bool) { return mintAuthority == ECDSA.recover(_signedMessageHash, _sig); } function hashForSignature( bytes32 _pHash, uint256 _amount, address _to, bytes32 _nHash ) public view returns (bytes32) { return keccak256(abi.encode(_pHash, _amount, address(token), _to, _nHash)); } } contract BTCGateway is InitializableAdminUpgradeabilityProxy {} contract ZECGateway is InitializableAdminUpgradeabilityProxy {} contract BCHGateway is InitializableAdminUpgradeabilityProxy {}
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes","name":"_to","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_n","type":"uint256"},{"indexed":true,"internalType":"bytes","name":"_indexedTo","type":"bytes"}],"name":"LogBurn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_n","type":"uint256"},{"indexed":true,"internalType":"bytes32","name":"_signedMessageHash","type":"bytes32"}],"name":"LogMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_newMintAuthority","type":"address"}],"name":"LogMintAuthorityUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"constant":false,"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"blacklistRecoverableToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes","name":"_to","type":"bytes"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"burnFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"claimOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"claimTokenOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"feeRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"_pHash","type":"bytes32"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"bytes32","name":"_nHash","type":"bytes32"}],"name":"hashForSignature","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"contract RenERC20LogicV1","name":"_token","type":"address"},{"internalType":"address","name":"_feeRecipient","type":"address"},{"internalType":"address","name":"_mintAuthority","type":"address"},{"internalType":"uint16","name":"_mintFee","type":"uint16"},{"internalType":"uint16","name":"_burnFee","type":"uint16"},{"internalType":"uint256","name":"_minimumBurnAmount","type":"uint256"}],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_nextOwner","type":"address"}],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"minimumBurnAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"_pHash","type":"bytes32"},{"internalType":"uint256","name":"_amountUnderlying","type":"uint256"},{"internalType":"bytes32","name":"_nHash","type":"bytes32"},{"internalType":"bytes","name":"_sig","type":"bytes"}],"name":"mint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"mintAuthority","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"mintFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"nextN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"recoverTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"status","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"token","outputs":[{"internalType":"contract RenERC20LogicV1","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"contract GatewayLogicV1","name":"_nextTokenOwner","type":"address"}],"name":"transferTokenOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint16","name":"_nextBurnFee","type":"uint16"}],"name":"updateBurnFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_nextFeeRecipient","type":"address"}],"name":"updateFeeRecipient","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_minimumBurnAmount","type":"uint256"}],"name":"updateMinimumBurnAmount","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_nextMintAuthority","type":"address"}],"name":"updateMintAuthority","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint16","name":"_nextMintFee","type":"uint16"}],"name":"updateMintFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"_signedMessageHash","type":"bytes32"},{"internalType":"bytes","name":"_sig","type":"bytes"}],"name":"verifySignature","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040526000606d556129c5806100186000396000f3fe608060405234801561001057600080fd5b50600436106101cf5760003560e01c8063715018a611610104578063c4d66de8116100a2578063f2fde38b11610071578063f2fde38b14610657578063f65d901c1461067d578063fc0c546a146106a3578063fce589d8146106ab576101cf565b8063c4d66de814610556578063daca6f781461057c578063e30c397814610629578063f160d36914610631576101cf565b80639340b21e116100de5780639340b21e146104ee57806394c238ac146104f6578063a2999beb146104fe578063aa4df9ad1461054e576101cf565b8063715018a6146104d65780638da5cb5b146104de5780638f32d59b146104e6576101cf565b80633a521b8d116101715780635219a5661161014b5780635219a5661461042b57806352ad0d5e1461046357806359c9176c146104945780635cc66106146104b5576101cf565b80633a521b8d146103e257806346904840146103ff5780634e71e0c814610423576101cf565b8063159ab14d116101ad578063159ab14d1461022357806316114acd146102ee57806321e6b53d1461031457806338463cff1461033a576101cf565b80630130a33b146101d457806310731a65146101fc57806313966db514610204575b600080fd5b6101fa600480360360208110156101ea57600080fd5b50356001600160a01b03166106b3565b005b6101fa6107b4565b61020c61081e565b6040805161ffff9092168252519081900360200190f35b6102dc6004803603608081101561023957600080fd5b8135916020810135916040820135919081019060808101606082013564010000000081111561026757600080fd5b82018360208201111561027957600080fd5b8035906020019184600183028401116401000000008311171561029b57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061082f945050505050565b60408051918252519081900360200190f35b6101fa6004803603602081101561030457600080fd5b50356001600160a01b0316610c8d565b6101fa6004803603602081101561032a57600080fd5b50356001600160a01b0316610dfe565b6102dc6004803603604081101561035057600080fd5b81019060208101813564010000000081111561036b57600080fd5b82018360208201111561037d57600080fd5b8035906020019184600183028401116401000000008311171561039f57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505091359250610f01915050565b6101fa600480360360208110156103f857600080fd5b503561127d565b6104076112c9565b604080516001600160a01b039092168252519081900360200190f35b6101fa6112d8565b6102dc6004803603608081101561044157600080fd5b508035906020810135906001600160a01b036040820135169060600135611358565b6104806004803603602081101561047957600080fd5b50356113a8565b604080519115158252519081900360200190f35b6101fa600480360360208110156104aa57600080fd5b503561ffff166113bd565b6101fa600480360360208110156104cb57600080fd5b503561ffff16611426565b6101fa61148f565b610407611520565b61048061152f565b610407611555565b6102dc611564565b6101fa600480360360c081101561051457600080fd5b506001600160a01b03813581169160208101358216916040820135169061ffff606082013581169160808101359091169060a0013561156a565b6102dc61168a565b6101fa6004803603602081101561056c57600080fd5b50356001600160a01b0316611690565b6104806004803603604081101561059257600080fd5b813591908101906040810160208201356401000000008111156105b457600080fd5b8201836020820111156105c657600080fd5b803590602001918460018302840111640100000000831117156105e857600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061173c945050505050565b610407611760565b6101fa6004803603602081101561064757600080fd5b50356001600160a01b031661176f565b6101fa6004803603602081101561066d57600080fd5b50356001600160a01b031661181d565b6101fa6004803603602081101561069357600080fd5b50356001600160a01b031661190e565b610407611979565b61020c611988565b606a546001600160a01b03163314806106e457506106cf611520565b6001600160a01b0316336001600160a01b0316145b61071f5760405162461bcd60e51b815260040180806020018281038252603281526020018061277d6032913960400191505060405180910390fd5b6001600160a01b0381166107645760405162461bcd60e51b81526004018080602001828103825260348152602001806127e36034913960400191505060405180910390fd5b606a80546001600160a01b0319166001600160a01b0383811691909117918290556040519116907ff0f08e606c1dd3a2c220ada53422fd9fe0aa75614b27db0549f649de3ad2072a90600090a250565b606960009054906101000a90046001600160a01b03166001600160a01b0316634e71e0c86040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561080457600080fd5b505af1158015610818573d6000803e3d6000fd5b50505050565b606b54600160a01b900461ffff1681565b60008061083e86863387611358565b6000818152606c602052604090205490915060ff161561088f5760405162461bcd60e51b815260040180806020018281038252602181526020018061291e6021913960400191505060405180910390fd5b610899818461173c565b6109d35761094f604051806060016040528060238152602001612730602391396108c288611999565b6040518060400160405280600a8152602001690161030b6b7bab73a1d160b51b8152506108ee89611b07565b6040518060400160405280600e81526020016d0161036b9b39739b2b73232b91d160951b81525061091e33611bc8565b6040518060400160405280600a815260200169016102fb72430b9b41d160b51b81525061094a8c611999565b611d3b565b60405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610998578181015183820152602001610980565b50505050905090810190601f1680156109c55780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b6000818152606c60209081526040808320805460ff1916600117905560695481516350b9d97b60e11b8152600481018a905291516001600160a01b039091169263a173b2f69260248082019391829003018186803b158015610a3457600080fd5b505afa158015610a48573d6000803e3d6000fd5b505050506040513d6020811015610a5e57600080fd5b5051606b54909150600090610a939061271090610a87908590600160a01b900461ffff16611fb8565b9063ffffffff61201816565b90506000610ae1826040518060400160405280601b81526020017f476174657761793a20666565206578636565647320616d6f756e7400000000008152508561205a9092919063ffffffff16565b606954604080516340c10f1960e01b81523360048201526024810184905290519293506001600160a01b03909116916340c10f199160448082019260009290919082900301818387803b158015610b3757600080fd5b505af1158015610b4b573d6000803e3d6000fd5b5050606954606b54604080516340c10f1960e01b81526001600160a01b0392831660048201526024810188905290519190921693506340c10f199250604480830192600092919082900301818387803b158015610ba757600080fd5b505af1158015610bbb573d6000803e3d6000fd5b5050606954604080516375a1c7e160e11b8152600481018690529051600094506001600160a01b03909216925063eb438fc2916024808301926020929190829003018186803b158015610c0d57600080fd5b505afa158015610c21573d6000803e3d6000fd5b505050506040513d6020811015610c3757600080fd5b5051606d54604080518381529051929350879233917fa58ba939eb08dab7eaf8ad09c16e7405ee88e5153e15da62d5481296a9f727fa919081900360200190a450606d8054600101905598975050505050505050565b610c9561152f565b610cd4576040805162461bcd60e51b81526020600482018190526024820152600080516020612884833981519152604482015290519081900360640190fd5b6001600160a01b03811660009081526067602052604090205460ff1615610d2c5760405162461bcd60e51b815260040180806020018281038252602a815260200180612753602a913960400191505060405180910390fd5b6001600160a01b038116610d6c5760405133904780156108fc02916000818181858888f19350505050158015610d66573d6000803e3d6000fd5b50610dfb565b604080516370a0823160e01b81523060048201529051610dfb9133916001600160a01b038516916370a08231916024808301926020929190829003018186803b158015610db857600080fd5b505afa158015610dcc573d6000803e3d6000fd5b505050506040513d6020811015610de257600080fd5b50516001600160a01b038416919063ffffffff6120b416565b50565b610e0661152f565b610e45576040805162461bcd60e51b81526020600482018190526024820152600080516020612884833981519152604482015290519081900360640190fd5b6069546040805163f2fde38b60e01b81526001600160a01b0384811660048301529151919092169163f2fde38b91602480830192600092919082900301818387803b158015610e9357600080fd5b505af1158015610ea7573d6000803e3d6000fd5b50505050806001600160a01b03166310731a656040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610ee657600080fd5b505af1158015610efa573d6000803e3d6000fd5b5050505050565b6000825160001415610f5a576040805162461bcd60e51b815260206004820152601c60248201527f476174657761793a20746f206164647265737320697320656d70747900000000604482015290519081900360640190fd5b606b54600090610f7e9061271090610a87908690600160b01b900461ffff16611fb8565b90506000610fcc826040518060400160405280601b81526020017f476174657761793a20666565206578636565647320616d6f756e7400000000008152508661205a9092919063ffffffff16565b606954604080516375a1c7e160e11b81526004810184905290519293506000926001600160a01b039092169163eb438fc291602480820192602092909190829003018186803b15801561101e57600080fd5b505afa158015611032573d6000803e3d6000fd5b505050506040513d602081101561104857600080fd5b505160695460408051632770a7eb60e21b81523360048201526024810189905290519293506001600160a01b0390911691639dc29fac9160448082019260009290919082900301818387803b1580156110a057600080fd5b505af11580156110b4573d6000803e3d6000fd5b5050606954606b54604080516340c10f1960e01b81526001600160a01b0392831660048201526024810189905290519190921693506340c10f199250604480830192600092919082900301818387803b15801561111057600080fd5b505af1158015611124573d6000803e3d6000fd5b5050505060685481116111685760405162461bcd60e51b81526004018080602001828103825260348152602001806127af6034913960400191505060405180910390fd5b856040518082805190602001908083835b602083106111985780518252601f199092019160209182019101611179565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020606d547f1619fc95050ffb8c94c9077c82b3e1ebbf8d571b6234241c55ba0aaf40da019e88846040518080602001838152602001828103825284818151815260200191508051906020019080838360005b8381101561122e578181015183820152602001611216565b50505050905090810190601f16801561125b5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a3606d80546001019055925050505b92915050565b61128561152f565b6112c4576040805162461bcd60e51b81526020600482018190526024820152600080516020612884833981519152604482015290519081900360640190fd5b606855565b606b546001600160a01b031681565b6066546001600160a01b03166112ec61210b565b6001600160a01b0316146113315760405162461bcd60e51b815260040180806020018281038252602a8152602001806128d2602a913960400191505060405180910390fd5b606654611346906001600160a01b031661210f565b606680546001600160a01b0319169055565b60695460408051602080820197909752808201959095526001600160a01b0391821660608601529216608084015260a0808401919091528151808403909101815260c09092019052805191012090565b606c6020526000908152604090205460ff1681565b6113c561152f565b611404576040805162461bcd60e51b81526020600482018190526024820152600080516020612884833981519152604482015290519081900360640190fd5b606b805461ffff909216600160b01b0261ffff60b01b19909216919091179055565b61142e61152f565b61146d576040805162461bcd60e51b81526020600482018190526024820152600080516020612884833981519152604482015290519081900360640190fd5b606b805461ffff909216600160a01b0261ffff60a01b19909216919091179055565b61149761152f565b6114d6576040805162461bcd60e51b81526020600482018190526024820152600080516020612884833981519152604482015290519081900360640190fd5b6033546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380546001600160a01b0319169055565b6033546001600160a01b031690565b6033546000906001600160a01b031661154661210b565b6001600160a01b031614905090565b606a546001600160a01b031681565b60685481565b600054610100900460ff168061158357506115836121b0565b80611591575060005460ff16155b6115cc5760405162461bcd60e51b815260040180806020018281038252602e8152602001806128a4602e913960400191505060405180910390fd5b600054610100900460ff161580156115f7576000805460ff1961ff0019909116610100171660011790555b611600336121b6565b61160933611690565b6068829055606980546001600160a01b0389166001600160a01b0319909116179055606b805461ffff858116600160b01b0261ffff60b01b19918816600160a01b0261ffff60a01b199093169290921716179055611666856106b3565b61166f8661176f565b8015611681576000805461ff00191690555b50505050505050565b606d5481565b600054610100900460ff16806116a957506116a96121b0565b806116b7575060005460ff16155b6116f25760405162461bcd60e51b815260040180806020018281038252602e8152602001806128a4602e913960400191505060405180910390fd5b600054610100900460ff1615801561171d576000805460ff1961ff0019909116610100171660011790555b611726826121b6565b8015611738576000805461ff00191690555b5050565b6000611748838361224c565b606a546001600160a01b039182169116149392505050565b6066546001600160a01b031681565b61177761152f565b6117b6576040805162461bcd60e51b81526020600482018190526024820152600080516020612884833981519152604482015290519081900360640190fd5b6001600160a01b0381166117fb5760405162461bcd60e51b815260040180806020018281038252602481526020018061283f6024913960400191505060405180910390fd5b606b80546001600160a01b0319166001600160a01b0392909216919091179055565b61182561152f565b611864576040805162461bcd60e51b81526020600482018190526024820152600080516020612884833981519152604482015290519081900360640190fd5b61186c611520565b6001600160a01b0316816001600160a01b03161415801561189b57506066546001600160a01b03828116911614155b6118ec576040805162461bcd60e51b815260206004820152601c60248201527f436c61696d61626c653a20696e76616c6964206e6577206f776e657200000000604482015290519081900360640190fd5b606680546001600160a01b0319166001600160a01b0392909216919091179055565b61191661152f565b611955576040805162461bcd60e51b81526020600482018190526024820152600080516020612884833981519152604482015290519081900360640190fd5b6001600160a01b03166000908152606760205260409020805460ff19166001179055565b6069546001600160a01b031681565b606b54600160b01b900461ffff1681565b604080518082018252601081526f181899199a1a9b1b9c1cb0b131b232b360811b60208201528151604280825260808201909352606092839190602082018180388339019050509050600360fc1b816000815181106119f457fe5b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110611a1d57fe5b60200101906001600160f81b031916908160001a90535060005b6020811015611afd57826004868360208110611a4f57fe5b1a60f81b6001600160f81b031916901c60f81c60ff1681518110611a6f57fe5b602001015160f81c60f81b828260020260020181518110611a8c57fe5b60200101906001600160f81b031916908160001a90535082858260208110611ab057fe5b825191901a600f16908110611ac157fe5b602001015160f81c60f81b828260020260030181518110611ade57fe5b60200101906001600160f81b031916908160001a905350600101611a37565b509150505b919050565b606081611b2c57506040805180820190915260018152600360fc1b6020820152611b02565b8160005b8115611b4457600101600a82049150611b30565b6060816040519080825280601f01601f191660200182016040528015611b71576020820181803883390190505b50905060001982015b8515611bbf57600a860660300160f81b82828060019003935081518110611b9d57fe5b60200101906001600160f81b031916908160001a905350600a86049550611b7a565b50949350505050565b604080518082018252601081526f181899199a1a9b1b9c1cb0b131b232b360811b60208201528151602a80825260608281019094526001600160a01b03851692918491602082018180388339019050509050600360fc1b81600081518110611c2c57fe5b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110611c5557fe5b60200101906001600160f81b031916908160001a90535060005b6014811015611bbf578260048583600c0160208110611c8a57fe5b1a60f81b6001600160f81b031916901c60f81c60ff1681518110611caa57fe5b602001015160f81c60f81b828260020260020181518110611cc757fe5b60200101906001600160f81b031916908160001a905350828482600c0160208110611cee57fe5b825191901a600f16908110611cff57fe5b602001015160f81c60f81b828260020260030181518110611d1c57fe5b60200101906001600160f81b031916908160001a905350600101611c6f565b606088888888888888886040516020018089805190602001908083835b60208310611d775780518252601f199092019160209182019101611d58565b51815160209384036101000a60001901801990921691161790528b5191909301928b0191508083835b60208310611dbf5780518252601f199092019160209182019101611da0565b51815160209384036101000a60001901801990921691161790528a5191909301928a0191508083835b60208310611e075780518252601f199092019160209182019101611de8565b51815160209384036101000a600019018019909216911617905289519190930192890191508083835b60208310611e4f5780518252601f199092019160209182019101611e30565b51815160209384036101000a600019018019909216911617905288519190930192880191508083835b60208310611e975780518252601f199092019160209182019101611e78565b51815160209384036101000a600019018019909216911617905287519190930192870191508083835b60208310611edf5780518252601f199092019160209182019101611ec0565b51815160209384036101000a600019018019909216911617905286519190930192860191508083835b60208310611f275780518252601f199092019160209182019101611f08565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b60208310611f6f5780518252601f199092019160209182019101611f50565b6001836020036101000a03801982511681845116808217855250505050505090500198505050505050505050604051602081830303815290604052905098975050505050505050565b600082611fc757506000611277565b82820282848281611fd457fe5b04146120115760405162461bcd60e51b81526004018080602001828103825260218152602001806128636021913960400191505060405180910390fd5b9392505050565b600061201183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506123bf565b600081848411156120ac5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610998578181015183820152602001610980565b505050900390565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052612106908490612424565b505050565b3390565b6001600160a01b0381166121545760405162461bcd60e51b815260040180806020018281038252602681526020018061270a6026913960400191505060405180910390fd5b6033546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380546001600160a01b0319166001600160a01b0392909216919091179055565b303b1590565b600054610100900460ff16806121cf57506121cf6121b0565b806121dd575060005460ff16155b6122185760405162461bcd60e51b815260040180806020018281038252602e8152602001806128a4602e913960400191505060405180910390fd5b600054610100900460ff16158015612243576000805460ff1961ff0019909116610100171660011790555b611726826125dc565b6000815160411461228e5760405162461bcd60e51b81526004018080602001828103825260228152602001806128fc6022913960400191505060405180910390fd5b60208201516040830151606084015160001a7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08211156122ff5760405162461bcd60e51b815260040180806020018281038252602881526020018061293f6028913960400191505060405180910390fd5b8060ff16601b1415801561231757508060ff16601c14155b156123535760405162461bcd60e51b81526004018080602001828103825260288152602001806128176028913960400191505060405180910390fd5b6040805160008152602080820180845289905260ff8416828401526060820186905260808201859052915160019260a0808401939192601f1981019281900390910190855afa1580156123aa573d6000803e3d6000fd5b5050604051601f190151979650505050505050565b6000818361240e5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610998578181015183820152602001610980565b50600083858161241a57fe5b0495945050505050565b612436826001600160a01b03166126cd565b612487576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b602083106124c55780518252601f1990920191602091820191016124a6565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612527576040519150601f19603f3d011682016040523d82523d6000602084013e61252c565b606091505b509150915081612583576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b8051156108185780806020019051602081101561259f57600080fd5b50516108185760405162461bcd60e51b815260040180806020018281038252602a815260200180612967602a913960400191505060405180910390fd5b600054610100900460ff16806125f557506125f56121b0565b80612603575060005460ff16155b61263e5760405162461bcd60e51b815260040180806020018281038252602e8152602001806128a4602e913960400191505060405180910390fd5b600054610100900460ff16158015612669576000805460ff1961ff0019909116610100171660011790555b603380546001600160a01b0319166001600160a01b0384811691909117918290556040519116906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a38015611738576000805461ff00191690555050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081158015906127015750808214155b94935050505056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373476174657761793a20696e76616c6964207369676e61747572652e2070486173683a2043616e5265636c61696d546f6b656e733a20746f6b656e206973206e6f74207265636f76657261626c65476174657761793a2063616c6c6572206973206e6f7420746865206f776e6572206f72206d696e7420617574686f72697479476174657761793a20616d6f756e74206973206c657373207468616e20746865206d696e696d756d206275726e20616d6f756e74476174657761793a206d696e74417574686f726974792063616e6e6f742062652073657420746f2061646472657373207a65726f45434453413a207369676e61747572652e7620697320696e207468652077726f6e672072616e6765476174657761793a2066656520726563697069656e742063616e6e6f7420626520307830536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a6564436c61696d61626c653a2063616c6c6572206973206e6f74207468652070656e64696e67206f776e657245434453413a207369676e6174757265206c656e67746820697320696e76616c6964476174657761793a206e6f6e6365206861736820616c7265616479207370656e7445434453413a207369676e61747572652e7320697320696e207468652077726f6e672072616e67655361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a265627a7a72315820a382da80064078bf2e75abc57b45a4f13e860cb3d41caeab9dd51e476bce30b764736f6c63430005100032
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101cf5760003560e01c8063715018a611610104578063c4d66de8116100a2578063f2fde38b11610071578063f2fde38b14610657578063f65d901c1461067d578063fc0c546a146106a3578063fce589d8146106ab576101cf565b8063c4d66de814610556578063daca6f781461057c578063e30c397814610629578063f160d36914610631576101cf565b80639340b21e116100de5780639340b21e146104ee57806394c238ac146104f6578063a2999beb146104fe578063aa4df9ad1461054e576101cf565b8063715018a6146104d65780638da5cb5b146104de5780638f32d59b146104e6576101cf565b80633a521b8d116101715780635219a5661161014b5780635219a5661461042b57806352ad0d5e1461046357806359c9176c146104945780635cc66106146104b5576101cf565b80633a521b8d146103e257806346904840146103ff5780634e71e0c814610423576101cf565b8063159ab14d116101ad578063159ab14d1461022357806316114acd146102ee57806321e6b53d1461031457806338463cff1461033a576101cf565b80630130a33b146101d457806310731a65146101fc57806313966db514610204575b600080fd5b6101fa600480360360208110156101ea57600080fd5b50356001600160a01b03166106b3565b005b6101fa6107b4565b61020c61081e565b6040805161ffff9092168252519081900360200190f35b6102dc6004803603608081101561023957600080fd5b8135916020810135916040820135919081019060808101606082013564010000000081111561026757600080fd5b82018360208201111561027957600080fd5b8035906020019184600183028401116401000000008311171561029b57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061082f945050505050565b60408051918252519081900360200190f35b6101fa6004803603602081101561030457600080fd5b50356001600160a01b0316610c8d565b6101fa6004803603602081101561032a57600080fd5b50356001600160a01b0316610dfe565b6102dc6004803603604081101561035057600080fd5b81019060208101813564010000000081111561036b57600080fd5b82018360208201111561037d57600080fd5b8035906020019184600183028401116401000000008311171561039f57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505091359250610f01915050565b6101fa600480360360208110156103f857600080fd5b503561127d565b6104076112c9565b604080516001600160a01b039092168252519081900360200190f35b6101fa6112d8565b6102dc6004803603608081101561044157600080fd5b508035906020810135906001600160a01b036040820135169060600135611358565b6104806004803603602081101561047957600080fd5b50356113a8565b604080519115158252519081900360200190f35b6101fa600480360360208110156104aa57600080fd5b503561ffff166113bd565b6101fa600480360360208110156104cb57600080fd5b503561ffff16611426565b6101fa61148f565b610407611520565b61048061152f565b610407611555565b6102dc611564565b6101fa600480360360c081101561051457600080fd5b506001600160a01b03813581169160208101358216916040820135169061ffff606082013581169160808101359091169060a0013561156a565b6102dc61168a565b6101fa6004803603602081101561056c57600080fd5b50356001600160a01b0316611690565b6104806004803603604081101561059257600080fd5b813591908101906040810160208201356401000000008111156105b457600080fd5b8201836020820111156105c657600080fd5b803590602001918460018302840111640100000000831117156105e857600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061173c945050505050565b610407611760565b6101fa6004803603602081101561064757600080fd5b50356001600160a01b031661176f565b6101fa6004803603602081101561066d57600080fd5b50356001600160a01b031661181d565b6101fa6004803603602081101561069357600080fd5b50356001600160a01b031661190e565b610407611979565b61020c611988565b606a546001600160a01b03163314806106e457506106cf611520565b6001600160a01b0316336001600160a01b0316145b61071f5760405162461bcd60e51b815260040180806020018281038252603281526020018061277d6032913960400191505060405180910390fd5b6001600160a01b0381166107645760405162461bcd60e51b81526004018080602001828103825260348152602001806127e36034913960400191505060405180910390fd5b606a80546001600160a01b0319166001600160a01b0383811691909117918290556040519116907ff0f08e606c1dd3a2c220ada53422fd9fe0aa75614b27db0549f649de3ad2072a90600090a250565b606960009054906101000a90046001600160a01b03166001600160a01b0316634e71e0c86040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561080457600080fd5b505af1158015610818573d6000803e3d6000fd5b50505050565b606b54600160a01b900461ffff1681565b60008061083e86863387611358565b6000818152606c602052604090205490915060ff161561088f5760405162461bcd60e51b815260040180806020018281038252602181526020018061291e6021913960400191505060405180910390fd5b610899818461173c565b6109d35761094f604051806060016040528060238152602001612730602391396108c288611999565b6040518060400160405280600a8152602001690161030b6b7bab73a1d160b51b8152506108ee89611b07565b6040518060400160405280600e81526020016d0161036b9b39739b2b73232b91d160951b81525061091e33611bc8565b6040518060400160405280600a815260200169016102fb72430b9b41d160b51b81525061094a8c611999565b611d3b565b60405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610998578181015183820152602001610980565b50505050905090810190601f1680156109c55780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b6000818152606c60209081526040808320805460ff1916600117905560695481516350b9d97b60e11b8152600481018a905291516001600160a01b039091169263a173b2f69260248082019391829003018186803b158015610a3457600080fd5b505afa158015610a48573d6000803e3d6000fd5b505050506040513d6020811015610a5e57600080fd5b5051606b54909150600090610a939061271090610a87908590600160a01b900461ffff16611fb8565b9063ffffffff61201816565b90506000610ae1826040518060400160405280601b81526020017f476174657761793a20666565206578636565647320616d6f756e7400000000008152508561205a9092919063ffffffff16565b606954604080516340c10f1960e01b81523360048201526024810184905290519293506001600160a01b03909116916340c10f199160448082019260009290919082900301818387803b158015610b3757600080fd5b505af1158015610b4b573d6000803e3d6000fd5b5050606954606b54604080516340c10f1960e01b81526001600160a01b0392831660048201526024810188905290519190921693506340c10f199250604480830192600092919082900301818387803b158015610ba757600080fd5b505af1158015610bbb573d6000803e3d6000fd5b5050606954604080516375a1c7e160e11b8152600481018690529051600094506001600160a01b03909216925063eb438fc2916024808301926020929190829003018186803b158015610c0d57600080fd5b505afa158015610c21573d6000803e3d6000fd5b505050506040513d6020811015610c3757600080fd5b5051606d54604080518381529051929350879233917fa58ba939eb08dab7eaf8ad09c16e7405ee88e5153e15da62d5481296a9f727fa919081900360200190a450606d8054600101905598975050505050505050565b610c9561152f565b610cd4576040805162461bcd60e51b81526020600482018190526024820152600080516020612884833981519152604482015290519081900360640190fd5b6001600160a01b03811660009081526067602052604090205460ff1615610d2c5760405162461bcd60e51b815260040180806020018281038252602a815260200180612753602a913960400191505060405180910390fd5b6001600160a01b038116610d6c5760405133904780156108fc02916000818181858888f19350505050158015610d66573d6000803e3d6000fd5b50610dfb565b604080516370a0823160e01b81523060048201529051610dfb9133916001600160a01b038516916370a08231916024808301926020929190829003018186803b158015610db857600080fd5b505afa158015610dcc573d6000803e3d6000fd5b505050506040513d6020811015610de257600080fd5b50516001600160a01b038416919063ffffffff6120b416565b50565b610e0661152f565b610e45576040805162461bcd60e51b81526020600482018190526024820152600080516020612884833981519152604482015290519081900360640190fd5b6069546040805163f2fde38b60e01b81526001600160a01b0384811660048301529151919092169163f2fde38b91602480830192600092919082900301818387803b158015610e9357600080fd5b505af1158015610ea7573d6000803e3d6000fd5b50505050806001600160a01b03166310731a656040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610ee657600080fd5b505af1158015610efa573d6000803e3d6000fd5b5050505050565b6000825160001415610f5a576040805162461bcd60e51b815260206004820152601c60248201527f476174657761793a20746f206164647265737320697320656d70747900000000604482015290519081900360640190fd5b606b54600090610f7e9061271090610a87908690600160b01b900461ffff16611fb8565b90506000610fcc826040518060400160405280601b81526020017f476174657761793a20666565206578636565647320616d6f756e7400000000008152508661205a9092919063ffffffff16565b606954604080516375a1c7e160e11b81526004810184905290519293506000926001600160a01b039092169163eb438fc291602480820192602092909190829003018186803b15801561101e57600080fd5b505afa158015611032573d6000803e3d6000fd5b505050506040513d602081101561104857600080fd5b505160695460408051632770a7eb60e21b81523360048201526024810189905290519293506001600160a01b0390911691639dc29fac9160448082019260009290919082900301818387803b1580156110a057600080fd5b505af11580156110b4573d6000803e3d6000fd5b5050606954606b54604080516340c10f1960e01b81526001600160a01b0392831660048201526024810189905290519190921693506340c10f199250604480830192600092919082900301818387803b15801561111057600080fd5b505af1158015611124573d6000803e3d6000fd5b5050505060685481116111685760405162461bcd60e51b81526004018080602001828103825260348152602001806127af6034913960400191505060405180910390fd5b856040518082805190602001908083835b602083106111985780518252601f199092019160209182019101611179565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020606d547f1619fc95050ffb8c94c9077c82b3e1ebbf8d571b6234241c55ba0aaf40da019e88846040518080602001838152602001828103825284818151815260200191508051906020019080838360005b8381101561122e578181015183820152602001611216565b50505050905090810190601f16801561125b5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a3606d80546001019055925050505b92915050565b61128561152f565b6112c4576040805162461bcd60e51b81526020600482018190526024820152600080516020612884833981519152604482015290519081900360640190fd5b606855565b606b546001600160a01b031681565b6066546001600160a01b03166112ec61210b565b6001600160a01b0316146113315760405162461bcd60e51b815260040180806020018281038252602a8152602001806128d2602a913960400191505060405180910390fd5b606654611346906001600160a01b031661210f565b606680546001600160a01b0319169055565b60695460408051602080820197909752808201959095526001600160a01b0391821660608601529216608084015260a0808401919091528151808403909101815260c09092019052805191012090565b606c6020526000908152604090205460ff1681565b6113c561152f565b611404576040805162461bcd60e51b81526020600482018190526024820152600080516020612884833981519152604482015290519081900360640190fd5b606b805461ffff909216600160b01b0261ffff60b01b19909216919091179055565b61142e61152f565b61146d576040805162461bcd60e51b81526020600482018190526024820152600080516020612884833981519152604482015290519081900360640190fd5b606b805461ffff909216600160a01b0261ffff60a01b19909216919091179055565b61149761152f565b6114d6576040805162461bcd60e51b81526020600482018190526024820152600080516020612884833981519152604482015290519081900360640190fd5b6033546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380546001600160a01b0319169055565b6033546001600160a01b031690565b6033546000906001600160a01b031661154661210b565b6001600160a01b031614905090565b606a546001600160a01b031681565b60685481565b600054610100900460ff168061158357506115836121b0565b80611591575060005460ff16155b6115cc5760405162461bcd60e51b815260040180806020018281038252602e8152602001806128a4602e913960400191505060405180910390fd5b600054610100900460ff161580156115f7576000805460ff1961ff0019909116610100171660011790555b611600336121b6565b61160933611690565b6068829055606980546001600160a01b0389166001600160a01b0319909116179055606b805461ffff858116600160b01b0261ffff60b01b19918816600160a01b0261ffff60a01b199093169290921716179055611666856106b3565b61166f8661176f565b8015611681576000805461ff00191690555b50505050505050565b606d5481565b600054610100900460ff16806116a957506116a96121b0565b806116b7575060005460ff16155b6116f25760405162461bcd60e51b815260040180806020018281038252602e8152602001806128a4602e913960400191505060405180910390fd5b600054610100900460ff1615801561171d576000805460ff1961ff0019909116610100171660011790555b611726826121b6565b8015611738576000805461ff00191690555b5050565b6000611748838361224c565b606a546001600160a01b039182169116149392505050565b6066546001600160a01b031681565b61177761152f565b6117b6576040805162461bcd60e51b81526020600482018190526024820152600080516020612884833981519152604482015290519081900360640190fd5b6001600160a01b0381166117fb5760405162461bcd60e51b815260040180806020018281038252602481526020018061283f6024913960400191505060405180910390fd5b606b80546001600160a01b0319166001600160a01b0392909216919091179055565b61182561152f565b611864576040805162461bcd60e51b81526020600482018190526024820152600080516020612884833981519152604482015290519081900360640190fd5b61186c611520565b6001600160a01b0316816001600160a01b03161415801561189b57506066546001600160a01b03828116911614155b6118ec576040805162461bcd60e51b815260206004820152601c60248201527f436c61696d61626c653a20696e76616c6964206e6577206f776e657200000000604482015290519081900360640190fd5b606680546001600160a01b0319166001600160a01b0392909216919091179055565b61191661152f565b611955576040805162461bcd60e51b81526020600482018190526024820152600080516020612884833981519152604482015290519081900360640190fd5b6001600160a01b03166000908152606760205260409020805460ff19166001179055565b6069546001600160a01b031681565b606b54600160b01b900461ffff1681565b604080518082018252601081526f181899199a1a9b1b9c1cb0b131b232b360811b60208201528151604280825260808201909352606092839190602082018180388339019050509050600360fc1b816000815181106119f457fe5b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110611a1d57fe5b60200101906001600160f81b031916908160001a90535060005b6020811015611afd57826004868360208110611a4f57fe5b1a60f81b6001600160f81b031916901c60f81c60ff1681518110611a6f57fe5b602001015160f81c60f81b828260020260020181518110611a8c57fe5b60200101906001600160f81b031916908160001a90535082858260208110611ab057fe5b825191901a600f16908110611ac157fe5b602001015160f81c60f81b828260020260030181518110611ade57fe5b60200101906001600160f81b031916908160001a905350600101611a37565b509150505b919050565b606081611b2c57506040805180820190915260018152600360fc1b6020820152611b02565b8160005b8115611b4457600101600a82049150611b30565b6060816040519080825280601f01601f191660200182016040528015611b71576020820181803883390190505b50905060001982015b8515611bbf57600a860660300160f81b82828060019003935081518110611b9d57fe5b60200101906001600160f81b031916908160001a905350600a86049550611b7a565b50949350505050565b604080518082018252601081526f181899199a1a9b1b9c1cb0b131b232b360811b60208201528151602a80825260608281019094526001600160a01b03851692918491602082018180388339019050509050600360fc1b81600081518110611c2c57fe5b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110611c5557fe5b60200101906001600160f81b031916908160001a90535060005b6014811015611bbf578260048583600c0160208110611c8a57fe5b1a60f81b6001600160f81b031916901c60f81c60ff1681518110611caa57fe5b602001015160f81c60f81b828260020260020181518110611cc757fe5b60200101906001600160f81b031916908160001a905350828482600c0160208110611cee57fe5b825191901a600f16908110611cff57fe5b602001015160f81c60f81b828260020260030181518110611d1c57fe5b60200101906001600160f81b031916908160001a905350600101611c6f565b606088888888888888886040516020018089805190602001908083835b60208310611d775780518252601f199092019160209182019101611d58565b51815160209384036101000a60001901801990921691161790528b5191909301928b0191508083835b60208310611dbf5780518252601f199092019160209182019101611da0565b51815160209384036101000a60001901801990921691161790528a5191909301928a0191508083835b60208310611e075780518252601f199092019160209182019101611de8565b51815160209384036101000a600019018019909216911617905289519190930192890191508083835b60208310611e4f5780518252601f199092019160209182019101611e30565b51815160209384036101000a600019018019909216911617905288519190930192880191508083835b60208310611e975780518252601f199092019160209182019101611e78565b51815160209384036101000a600019018019909216911617905287519190930192870191508083835b60208310611edf5780518252601f199092019160209182019101611ec0565b51815160209384036101000a600019018019909216911617905286519190930192860191508083835b60208310611f275780518252601f199092019160209182019101611f08565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b60208310611f6f5780518252601f199092019160209182019101611f50565b6001836020036101000a03801982511681845116808217855250505050505090500198505050505050505050604051602081830303815290604052905098975050505050505050565b600082611fc757506000611277565b82820282848281611fd457fe5b04146120115760405162461bcd60e51b81526004018080602001828103825260218152602001806128636021913960400191505060405180910390fd5b9392505050565b600061201183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506123bf565b600081848411156120ac5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610998578181015183820152602001610980565b505050900390565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052612106908490612424565b505050565b3390565b6001600160a01b0381166121545760405162461bcd60e51b815260040180806020018281038252602681526020018061270a6026913960400191505060405180910390fd5b6033546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380546001600160a01b0319166001600160a01b0392909216919091179055565b303b1590565b600054610100900460ff16806121cf57506121cf6121b0565b806121dd575060005460ff16155b6122185760405162461bcd60e51b815260040180806020018281038252602e8152602001806128a4602e913960400191505060405180910390fd5b600054610100900460ff16158015612243576000805460ff1961ff0019909116610100171660011790555b611726826125dc565b6000815160411461228e5760405162461bcd60e51b81526004018080602001828103825260228152602001806128fc6022913960400191505060405180910390fd5b60208201516040830151606084015160001a7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08211156122ff5760405162461bcd60e51b815260040180806020018281038252602881526020018061293f6028913960400191505060405180910390fd5b8060ff16601b1415801561231757508060ff16601c14155b156123535760405162461bcd60e51b81526004018080602001828103825260288152602001806128176028913960400191505060405180910390fd5b6040805160008152602080820180845289905260ff8416828401526060820186905260808201859052915160019260a0808401939192601f1981019281900390910190855afa1580156123aa573d6000803e3d6000fd5b5050604051601f190151979650505050505050565b6000818361240e5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610998578181015183820152602001610980565b50600083858161241a57fe5b0495945050505050565b612436826001600160a01b03166126cd565b612487576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b602083106124c55780518252601f1990920191602091820191016124a6565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612527576040519150601f19603f3d011682016040523d82523d6000602084013e61252c565b606091505b509150915081612583576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b8051156108185780806020019051602081101561259f57600080fd5b50516108185760405162461bcd60e51b815260040180806020018281038252602a815260200180612967602a913960400191505060405180910390fd5b600054610100900460ff16806125f557506125f56121b0565b80612603575060005460ff16155b61263e5760405162461bcd60e51b815260040180806020018281038252602e8152602001806128a4602e913960400191505060405180910390fd5b600054610100900460ff16158015612669576000805460ff1961ff0019909116610100171660011790555b603380546001600160a01b0319166001600160a01b0384811691909117918290556040519116906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a38015611738576000805461ff00191690555050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081158015906127015750808214155b94935050505056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373476174657761793a20696e76616c6964207369676e61747572652e2070486173683a2043616e5265636c61696d546f6b656e733a20746f6b656e206973206e6f74207265636f76657261626c65476174657761793a2063616c6c6572206973206e6f7420746865206f776e6572206f72206d696e7420617574686f72697479476174657761793a20616d6f756e74206973206c657373207468616e20746865206d696e696d756d206275726e20616d6f756e74476174657761793a206d696e74417574686f726974792063616e6e6f742062652073657420746f2061646472657373207a65726f45434453413a207369676e61747572652e7620697320696e207468652077726f6e672072616e6765476174657761793a2066656520726563697069656e742063616e6e6f7420626520307830536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a6564436c61696d61626c653a2063616c6c6572206973206e6f74207468652070656e64696e67206f776e657245434453413a207369676e6174757265206c656e67746820697320696e76616c6964476174657761793a206e6f6e6365206861736820616c7265616479207370656e7445434453413a207369676e61747572652e7320697320696e207468652077726f6e672072616e67655361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a265627a7a72315820a382da80064078bf2e75abc57b45a4f13e860cb3d41caeab9dd51e476bce30b764736f6c63430005100032
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 25 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.