Overview
APE Balance
0 APE
APE Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Init | 6748122 | 10 days ago | IN | 0 APE | 0.0159362 |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
Gambler
Compiler Version
v0.8.27+commit.40a35a09
Optimization Enabled:
Yes with 10000 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.27; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If EIP-1153 (transient storage) is available on the chain you're deploying at, * consider using {ReentrancyGuardTransient} instead. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant NOT_ENTERED = 1; uint256 private constant ENTERED = 2; uint256 private _status; /** * @dev Unauthorized reentrant call. */ error ReentrancyGuardReentrantCall(); constructor() { _status = NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be NOT_ENTERED if (_status == ENTERED) { revert ReentrancyGuardReentrantCall(); } // Any calls to nonReentrant after this point will fail _status = ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = NOT_ENTERED; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == ENTERED; } } /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } 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) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } 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) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } 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; } function percentageOf(uint a, uint b) internal pure returns (uint256) { require(b > 0); return a * b / 100; } function percentageOf10000(uint a, uint b) internal pure returns (uint256) { require(b > 0); return a * b / 10000; } } interface IToken { 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); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint); function mint(address to, uint256 amount) external; function burn(uint256 amount) external; event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); } interface INft { event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); event ApprovalForAll(address indexed owner, address indexed operator, bool approved); function balanceOf(address owner) external view returns (uint256 balance); function ownerOf(uint256 tokenId) external view returns (address owner); function transferFrom( address from, address to, uint256 tokenId ) external; function approve(address to, uint256 tokenId) external; function setApprovalForAll(address operator, bool _approved) external; function getApproved(uint256 tokenId) external view returns (address operator); function isApprovedForAll(address owner, address operator) external view returns (bool); } library TransferHelper { function safeApprove( address token, address to, uint256 value ) internal { // bytes4(keccak256(bytes('approve(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value)); require( success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper::safeApprove: approve failed' ); } function safeTransfer( address token, address to, uint256 value ) internal { // bytes4(keccak256(bytes('transfer(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value)); require( success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper::safeTransfer: transfer failed' ); } function safeTransferFrom( address token, address from, address to, uint256 value ) internal { // bytes4(keccak256(bytes('transferFrom(address,address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value)); require( success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper::transferFrom: transferFrom failed' ); } function safeTransferETH(address to, uint256 value) internal { (bool success, ) = to.call{value: value}(new bytes(0)); require(success, 'TransferHelper::safeTransferETH: ETH transfer failed'); } function deposit(address _weth, uint256 _value) internal { (bool success, ) = _weth.call{value: _value}(new bytes(0)); require(success, 'TransferHelper::safeTransferETH: ETH transfer failed'); } function withdraw(address _weth, uint256 _value) internal { (bool success, bytes memory data) = _weth.call(abi.encodeWithSelector(0x2e1a7d4d, _value)); require( success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper::withdraw: withdraw failed' ); } } interface IProtocol { function calculate(address erc20, uint256 revenue, bool native) external view returns(uint, address[] memory, uint[] memory); } contract BaseProtocol is Ownable, ReentrancyGuard { address public feeProtocol; bool public paused; mapping(address => bool) caller; modifier whenNotPaused() { require(!paused, "paused"); _; } modifier onlyCaller() { require(owner() == msg.sender || caller[msg.sender], "not auth"); _; } function pause(bool enable) onlyOwner external { paused = enable; } function addCaller(address[] memory executor) onlyOwner public { for (uint256 i = 0; i < executor.length; i++) { caller[executor[i]] = true; } } function removeCaller(address[] memory executor) onlyOwner public { for (uint256 i = 0; i < executor.length; i++) { caller[executor[i]] = false; } } function changeProtocol(address newProtocol) onlyOwner public { require(address(0) != feeProtocol, "not zero address"); feeProtocol = newProtocol; } } contract Gambler is BaseProtocol { using SafeMath for uint; bytes32 ROOM_1 = 0x0000000000000000000000000000000000000000000000000000000000000001; bytes32 ROOM_2 = 0x0000000000000000000000000000000000000000000000000000000000000002; bytes32 ROOM_3 = 0x0000000000000000000000000000000000000000000000000000000000000003; bytes32 ROOM_4 = 0x0000000000000000000000000000000000000000000000000000000000000004; bytes32 ROOM_5 = 0x0000000000000000000000000000000000000000000000000000000000000005; bytes32 ROOM_6 = 0x0000000000000000000000000000000000000000000000000000000000000006; uint ROOM_SIZE = 6; struct Pool { bytes32 uid; uint256 price; uint256 size; bool native; } struct Entry { uint256 currentSize; uint256 randomness; } mapping(bytes32 => Pool) rooms; mapping(bytes32 => mapping(uint256 => address)) participant; mapping(bytes32 => Entry) participantEntry; bool public initiated; address public baseToken; address public baseNFT; uint256 public baseBalance; event LogWinner(address executor, bytes32 room, address winner, uint amount, bool native, uint date); event LogCancel(address executor, bytes32 room, uint date); constructor() { } function init(address[] memory executor, address protocol, address erc20, address erc721, uint256 balance) onlyOwner external { require(!initiated, "already initiated"); feeProtocol = protocol; baseToken = erc20; baseNFT = erc721; baseBalance = balance; addCaller(executor); uint decimals = 10 ** IToken(baseToken).decimals(); rooms[ROOM_1] = Pool(ROOM_1, 100 * decimals, 10, false); rooms[ROOM_2] = Pool(ROOM_2, 2500 * decimals, 10, false); rooms[ROOM_3] = Pool(ROOM_3, 10000 * decimals, 10, false); rooms[ROOM_4] = Pool(ROOM_4, 1 ether, 10, true); rooms[ROOM_5] = Pool(ROOM_5, 25 ether, 10, true); rooms[ROOM_6] = Pool(ROOM_6, 100 ether, 10, true); initiated = true; } function setBaseBalance(uint newBalance) onlyOwner external { baseBalance = newBalance; } function setRoom(bytes32[] memory ids, uint[] memory price, uint[] memory size) onlyOwner external { for (uint256 i = 0; i < ids.length; i++) { require(ids[i] == rooms[ids[i]].uid, "room not found"); require(participantEntry[ids[i]].currentSize == 0, "already entered"); rooms[ids[i]] = Pool(ids[i], price[i], size[i], rooms[ids[i]].native); } } function participants(bytes32 roomId) external view returns(Pool memory data, address erc20, uint256 total, uint256 prize, uint256 currentSize, address[] memory users) { data = rooms[roomId]; erc20 = data.native ? address(0) : baseToken; total = data.size * data.price; (prize,, ) = IProtocol(feeProtocol).calculate(erc20, total, data.native); currentSize = participantEntry[roomId].currentSize; users = new address[](currentSize); for (uint256 i = 0; i < currentSize; i++) { users[i] = participant[roomId][i]; } } function getRooms() external view returns(Pool[] memory data) { data = new Pool[](ROOM_SIZE); for (uint256 i = 0; i < ROOM_SIZE; i++) { data[i] = rooms[bytes32(i+1)]; } return data; } function enroll(bytes32 roomId) nonReentrant whenNotPaused external payable { Pool memory pool = rooms[roomId]; if(pool.native) { require(pool.price == msg.value, "insufficient balance"); } else { IToken(baseToken).transferFrom(msg.sender, address(this), pool.price); } require(INft(baseNFT).balanceOf(msg.sender) >= baseBalance, "not enough nft"); uint index = participantEntry[roomId].currentSize; require(roomId == pool.uid, "room not found"); require(index < pool.size, "reached"); require(participant[roomId][index] == address(0), "already entered"); participant[roomId][index] = msg.sender; participantEntry[roomId].currentSize += 1; participantEntry[roomId].randomness = _random(participantEntry[roomId].randomness, block.prevrandao); } function pickWinner(bytes32 roomId, uint seed) onlyCaller nonReentrant external { require(roomId == rooms[roomId].uid, "room not found"); require(participantEntry[roomId].currentSize == rooms[roomId].size, "not yet"); address winner = _randomWinner(roomId, seed); uint totalAmount = rooms[roomId].size * rooms[roomId].price; uint prize = _split(totalAmount, rooms[roomId].native); if(rooms[roomId].native) { TransferHelper.safeTransferETH(winner, prize); } else { TransferHelper.safeTransfer(baseToken, winner, prize); } for (uint256 i = 0; i < rooms[roomId].size; i++) { delete participant[roomId][i]; } delete participantEntry[roomId]; emit LogWinner(msg.sender, roomId, winner, prize, rooms[roomId].native, block.timestamp); } function cancel(bytes32 roomId) onlyCaller nonReentrant external { require(roomId == rooms[roomId].uid, "room not found"); uint currentSize = participantEntry[roomId].currentSize; bool native = rooms[roomId].native; require(currentSize > 0, "room empty"); uint amount = rooms[roomId].price; for (uint256 i = 0; i < currentSize; i++) { address to = participant[roomId][i]; if(native) { TransferHelper.safeTransferETH(to, amount); } else { TransferHelper.safeTransfer(baseToken, to, amount); } delete participant[roomId][i]; } delete participantEntry[roomId]; emit LogCancel(msg.sender, roomId, block.timestamp); } function _split(uint256 revenue, bool native) private returns(uint) { address erc20 = native ? address(0) : baseToken; (uint balance, address[] memory to, uint[] memory amount) = IProtocol(feeProtocol).calculate(erc20, revenue, native); for (uint256 i = 0; i < to.length; i++) { if(to[i] == address(0) || amount[i] <= 0) { continue; } if(native) { TransferHelper.safeTransferETH(to[i], amount[i]); } else { TransferHelper.safeTransfer(erc20, to[i], amount[i]); } } return balance; } function _randomWinner(bytes32 roomId, uint seed) private view returns(address) { uint min = 0; uint max = rooms[roomId].size - 1; uint winnerIndex = _random(seed, participantEntry[roomId].randomness) % (max - min + 1) + min; address winner = participant[roomId][winnerIndex]; return winner; } function _random(uint seed, uint seed1) private view returns(uint256) { return uint(keccak256(abi.encodePacked(seed, seed1, msg.sender, blockhash(block.number - 1), block.timestamp))); } fallback() external payable { revert("not accepted"); } receive() external payable { revert("not accepted"); } }
{ "optimizer": { "enabled": true, "runs": 10000 }, "evmVersion": "paris", "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"executor","type":"address"},{"indexed":false,"internalType":"bytes32","name":"room","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"date","type":"uint256"}],"name":"LogCancel","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"executor","type":"address"},{"indexed":false,"internalType":"bytes32","name":"room","type":"bytes32"},{"indexed":false,"internalType":"address","name":"winner","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bool","name":"native","type":"bool"},{"indexed":false,"internalType":"uint256","name":"date","type":"uint256"}],"name":"LogWinner","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"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"address[]","name":"executor","type":"address[]"}],"name":"addCaller","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"baseBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseNFT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"roomId","type":"bytes32"}],"name":"cancel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newProtocol","type":"address"}],"name":"changeProtocol","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"roomId","type":"bytes32"}],"name":"enroll","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"feeProtocol","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRooms","outputs":[{"components":[{"internalType":"bytes32","name":"uid","type":"bytes32"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"size","type":"uint256"},{"internalType":"bool","name":"native","type":"bool"}],"internalType":"struct Gambler.Pool[]","name":"data","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"executor","type":"address[]"},{"internalType":"address","name":"protocol","type":"address"},{"internalType":"address","name":"erc20","type":"address"},{"internalType":"address","name":"erc721","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initiated","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"roomId","type":"bytes32"}],"name":"participants","outputs":[{"components":[{"internalType":"bytes32","name":"uid","type":"bytes32"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"size","type":"uint256"},{"internalType":"bool","name":"native","type":"bool"}],"internalType":"struct Gambler.Pool","name":"data","type":"tuple"},{"internalType":"address","name":"erc20","type":"address"},{"internalType":"uint256","name":"total","type":"uint256"},{"internalType":"uint256","name":"prize","type":"uint256"},{"internalType":"uint256","name":"currentSize","type":"uint256"},{"internalType":"address[]","name":"users","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"enable","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"roomId","type":"bytes32"},{"internalType":"uint256","name":"seed","type":"uint256"}],"name":"pickWinner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"executor","type":"address[]"}],"name":"removeCaller","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"setBaseBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"ids","type":"bytes32[]"},{"internalType":"uint256[]","name":"price","type":"uint256[]"},{"internalType":"uint256[]","name":"size","type":"uint256[]"}],"name":"setRoom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040526001600490815560026005908155600360069081556007929092556008556009819055600a55348015603557600080fd5b50603d336045565b600180556095565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b612bf0806100a46000396000f3fe60806040526004361061016e5760003560e01c80635c975abb116100cb5780638da5cb5b1161007f578063c55dae6311610059578063c55dae631461047f578063d08f6a6b146104a4578063f2fde38b146104c6576101c0565b80638da5cb5b146104275780639f11853614610445578063c4d252f51461045f576101c0565b8063687fff22116100b0578063687fff22146103df5780636f4072d1146103ff578063715018a614610412576101c0565b80635c975abb1461036b578063653e0f7f146103ad576101c0565b806344003549116101225780634dd76ebe116101075780634dd76ebe146102f3578063527eb4bc1461031357806353d742c71461034b576101c0565b806344003549146102b35780634cb08599146102d3576101c0565b80631966cdbe116101535780631966cdbe1461024a578063311109db1461026a57806338bde7911461028a576101c0565b806302329a29146102085780630ab2c0061461022a576101c0565b366101c05760405162461bcd60e51b815260206004820152600c60248201527f6e6f74206163636570746564000000000000000000000000000000000000000060448201526064015b60405180910390fd5b60405162461bcd60e51b815260206004820152600c60248201527f6e6f74206163636570746564000000000000000000000000000000000000000060448201526064016101b7565b34801561021457600080fd5b50610228610223366004612364565b6104e6565b005b34801561023657600080fd5b506102286102453660046124b5565b61058a565b34801561025657600080fd5b50610228610265366004612532565b6109b5565b34801561027657600080fd5b50610228610285366004612554565b610c9e565b34801561029657600080fd5b506102a060105481565b6040519081526020015b60405180910390f35b3480156102bf57600080fd5b506102286102ce366004612554565b610d56565b3480156102df57600080fd5b506102286102ee366004612591565b610e0e565b3480156102ff57600080fd5b5061022861030e3660046125aa565b610e6d565b34801561031f57600080fd5b50600254610333906001600160a01b031681565b6040516001600160a01b0390911681526020016102aa565b34801561035757600080fd5b50610228610366366004612625565b610f5c565b34801561037757600080fd5b5060025461039d9074010000000000000000000000000000000000000000900460ff1681565b60405190151581526020016102aa565b3480156103b957600080fd5b506103cd6103c8366004612591565b6111f5565b6040516102aa96959493929190612712565b3480156103eb57600080fd5b50600f54610333906001600160a01b031681565b61022861040d366004612591565b61141d565b34801561041e57600080fd5b50610228611869565b34801561043357600080fd5b506000546001600160a01b0316610333565b34801561045157600080fd5b50600e5461039d9060ff1681565b34801561046b57600080fd5b5061022861047a366004612591565b6118cf565b34801561048b57600080fd5b50600e546103339061010090046001600160a01b031681565b3480156104b057600080fd5b506104b9611b41565b6040516102aa91906127b4565b3480156104d257600080fd5b506102286104e13660046125aa565b611c5d565b6000546001600160a01b031633146105405760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016101b7565b6002805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b6000546001600160a01b031633146105e45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016101b7565b600e5460ff16156106375760405162461bcd60e51b815260206004820152601160248201527f616c726561647920696e6974696174656400000000000000000000000000000060448201526064016101b7565b600280546001600160a01b038087167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255600e8054868416610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff909116179055600f80549285169290911691909117905560108190556106bf85610d56565b6000600e60019054906101000a90046001600160a01b03166001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610714573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107389190612825565b61074390600a612990565b905060405180608001604052806004548152602001826064610765919061299c565b8152600a602080830191909152600060409283018190526004548152600b8252829020835181558382015160018201558383015160028201556060909301516003909301805460ff19169315159390931790925580516080810190915260055481529081016107d6836109c461299c565b8152600a602080830191909152600060409283018190526005548152600b8252829020835181558382015160018201558383015160028201556060909301516003909301805460ff19169315159390931790925580516080810190915260065481529081016108478361271061299c565b8152600a6020808301829052600060409384018190526006548152600b8083528482208651815586840151600182810191909155878701516002808401919091556060988901516003938401805491151560ff19928316179055885160808082018b52600754808352670de0b6b3a7640000838b01908152838d018c8152848f01888152928b52898c528d8b209451855590518488015551838601555191860180549215159284169290921790915589518082018b5260085480825268015af1d78b58c40000828b01908152828d018c8152838f01888152928b52898c528d8b2093518455905183880155518286015551908601805491151591841691909117905589519081018a5260095480825268056bc75e2d63100000828a01908152828c019a8b529b82018581529088529590975297909420945185559651848801559351918301919091555191018054911515918316919091179055600e80549091169091179055505050505050565b336109c86000546001600160a01b031690565b6001600160a01b031614806109ec57503360009081526003602052604090205460ff165b610a385760405162461bcd60e51b815260206004820152600860248201527f6e6f74206175746800000000000000000000000000000000000000000000000060448201526064016101b7565b610a40611d3c565b6000828152600b60205260409020548214610a9d5760405162461bcd60e51b815260206004820152600e60248201527f726f6f6d206e6f7420666f756e6400000000000000000000000000000000000060448201526064016101b7565b6000828152600b6020908152604080832060020154600d9092529091205414610b085760405162461bcd60e51b815260206004820152600760248201527f6e6f74207965740000000000000000000000000000000000000000000000000060448201526064016101b7565b6000610b148383611d7f565b6000848152600b6020526040812060018101546002909101549293509091610b3c919061299c565b6000858152600b602052604081206003015491925090610b6090839060ff16611e1a565b6000868152600b602052604090206003015490915060ff1615610b8c57610b878382611ffe565b610ba8565b600e54610ba89061010090046001600160a01b031684836120e6565b60005b6000868152600b6020526040902060020154811015610c0b576000868152600c60209081526040808320848452909152902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055600101610bab565b506000858152600d60209081526040808320838155600101839055600b8252918290206003015482513381529182018890526001600160a01b038616828401526060820184905260ff16151560808201524260a082015290517f011fd5bd96921cf092266465a7bad36acf4a1260044a0e2e3df779c2e526d5839181900360c00190a1505050610c9a60018055565b5050565b6000546001600160a01b03163314610cf85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016101b7565b60005b8151811015610c9a57600060036000848481518110610d1c57610d1c6129b3565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055600101610cfb565b6000546001600160a01b03163314610db05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016101b7565b60005b8151811015610c9a57600160036000848481518110610dd457610dd46129b3565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055600101610db3565b6000546001600160a01b03163314610e685760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016101b7565b601055565b6000546001600160a01b03163314610ec75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016101b7565b6002546001600160a01b0316600003610f225760405162461bcd60e51b815260206004820152601060248201527f6e6f74207a65726f20616464726573730000000000000000000000000000000060448201526064016101b7565b600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6000546001600160a01b03163314610fb65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016101b7565b60005b83518110156111ef57600b6000858381518110610fd857610fd86129b3565b6020026020010151815260200190815260200160002060000154848281518110611004576110046129b3565b6020026020010151146110595760405162461bcd60e51b815260206004820152600e60248201527f726f6f6d206e6f7420666f756e6400000000000000000000000000000000000060448201526064016101b7565b600d600085838151811061106f5761106f6129b3565b60200260200101518152602001908152602001600020600001546000146110d85760405162461bcd60e51b815260206004820152600f60248201527f616c726561647920656e7465726564000000000000000000000000000000000060448201526064016101b7565b60405180608001604052808583815181106110f5576110f56129b3565b60200260200101518152602001848381518110611114576111146129b3565b60200260200101518152602001838381518110611133576111336129b3565b60200260200101518152602001600b6000878581518110611156576111566129b3565b6020026020010151815260200190815260200160002060030160009054906101000a900460ff161515815250600b6000868481518110611198576111986129b3565b602090810291909101810151825281810192909252604090810160002083518155918301516001808401919091559083015160028301556060909201516003909101805460ff191691151591909117905501610fb9565b50505050565b6040805160808082018352600080835260208084018290528385018290526060938401829052858252600b8152848220855193840186528054845260018101549184019190915260028101549483019490945260039093015460ff16151581830181905290929182918291829161127c57600e5461010090046001600160a01b031661127f565b60005b945085602001518660400151611295919061299c565b60025460608801516040517fa17134b70000000000000000000000000000000000000000000000000000000081526001600160a01b038981166004830152602482018590529115156044820152929650169063a17134b790606401600060405180830381865afa15801561130d573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526113539190810190612a40565b50506000888152600d602052604090205490935091508167ffffffffffffffff81111561138257611382612388565b6040519080825280602002602001820160405280156113ab578160200160208202803683370190505b50905060005b82811015611413576000888152600c6020908152604080832084845290915290205482516001600160a01b03909116908390839081106113f3576113f36129b3565b6001600160a01b03909216602092830291909101909101526001016113b1565b5091939550919395565b611425611d3c565b60025474010000000000000000000000000000000000000000900460ff16156114905760405162461bcd60e51b815260206004820152600660248201527f706175736564000000000000000000000000000000000000000000000000000060448201526064016101b7565b6000818152600b602090815260409182902082516080810184528154815260018201549281019290925260028101549282019290925260039091015460ff161580156060830152611533573481602001511461152e5760405162461bcd60e51b815260206004820152601460248201527f696e73756666696369656e742062616c616e636500000000000000000000000060448201526064016101b7565b6115d3565b600e5460208201516040517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101919091526101009091046001600160a01b0316906323b872dd906064016020604051808303816000875af11580156115ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115d19190612b0d565b505b601054600f546040517f70a082310000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015611637573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061165b9190612825565b10156116a95760405162461bcd60e51b815260206004820152600e60248201527f6e6f7420656e6f756768206e667400000000000000000000000000000000000060448201526064016101b7565b6000828152600d6020526040902054815183146117085760405162461bcd60e51b815260206004820152600e60248201527f726f6f6d206e6f7420666f756e6400000000000000000000000000000000000060448201526064016101b7565b8160400151811061175b5760405162461bcd60e51b815260206004820152600760248201527f726561636865640000000000000000000000000000000000000000000000000060448201526064016101b7565b6000838152600c602090815260408083208484529091529020546001600160a01b0316156117cb5760405162461bcd60e51b815260206004820152600f60248201527f616c726561647920656e7465726564000000000000000000000000000000000060448201526064016101b7565b6000838152600c60209081526040808320848452825280832080547fffffffffffffffffffffffff00000000000000000000000000000000000000001633179055858352600d9091528120805460019290611827908490612b2a565b90915550506000838152600d60205260409020600101546118489044612255565b6000848152600d602052604090206001015550611866905060018055565b50565b6000546001600160a01b031633146118c35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016101b7565b6118cd60006122ee565b565b336118e26000546001600160a01b031690565b6001600160a01b0316148061190657503360009081526003602052604090205460ff165b6119525760405162461bcd60e51b815260206004820152600860248201527f6e6f74206175746800000000000000000000000000000000000000000000000060448201526064016101b7565b61195a611d3c565b6000818152600b602052604090205481146119b75760405162461bcd60e51b815260206004820152600e60248201527f726f6f6d206e6f7420666f756e6400000000000000000000000000000000000060448201526064016101b7565b6000818152600d6020908152604080832054600b9092529091206003015460ff1681611a255760405162461bcd60e51b815260206004820152600a60248201527f726f6f6d20656d7074790000000000000000000000000000000000000000000060448201526064016101b7565b6000838152600b6020526040812060010154905b83811015611add576000858152600c602090815260408083208484529091529020546001600160a01b03168315611a7957611a748184611ffe565b611a95565b600e54611a959061010090046001600160a01b031682856120e6565b506000858152600c60209081526040808320848452909152902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055600101611a39565b506000848152600d60209081526040808320838155600101929092558151338152908101869052428183015290517f80cbfccdf000bf697891059727332894c6b6fa2090916c79b81127ce49bcad5e9181900360600190a150505061186660018055565b6060600a5467ffffffffffffffff811115611b5e57611b5e612388565b604051908082528060200260200182016040528015611bce57816020015b6040805160808101825260008082526020808301829052928201819052606082015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909201910181611b7c5790505b50905060005b600a54811015611c5957600b6000611bed836001612b2a565b815260208082019290925260409081016000208151608081018352815481526001820154938101939093526002810154918301919091526003015460ff16151560608201528251839083908110611c4657611c466129b3565b6020908102919091010152600101611bd4565b5090565b6000546001600160a01b03163314611cb75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016101b7565b6001600160a01b038116611d335760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016101b7565b611866816122ee565b600260015403611d78576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600155565b6000828152600b602052604081206002015481908190611da190600190612b3d565b9050600082611db08184612b3d565b611dbb906001612b2a565b6000888152600d6020526040902060010154611dd8908890612255565b611de29190612b50565b611dec9190612b2a565b6000878152600c6020908152604080832093835292905220546001600160a01b031693505050505b92915050565b60008082611e3857600e5461010090046001600160a01b0316611e3b565b60005b6002546040517fa17134b70000000000000000000000000000000000000000000000000000000081526001600160a01b0380841660048301526024820188905286151560448301529293506000928392839291169063a17134b790606401600060405180830381865afa158015611eb6573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611efc9190810190612a40565b92509250925060005b8251811015611ff25760006001600160a01b0316838281518110611f2b57611f2b6129b3565b60200260200101516001600160a01b03161480611f6257506000828281518110611f5757611f576129b3565b602002602001015111155b611fea578615611fad57611fa8838281518110611f8157611f816129b3565b6020026020010151838381518110611f9b57611f9b6129b3565b6020026020010151611ffe565b611fea565b611fea85848381518110611fc357611fc36129b3565b6020026020010151848481518110611fdd57611fdd6129b3565b60200260200101516120e6565b600101611f05565b50919695505050505050565b604080516000808252602082019092526001600160a01b0384169083906040516120289190612b8b565b60006040518083038185875af1925050503d8060008114612065576040519150601f19603f3d011682016040523d82523d6000602084013e61206a565b606091505b50509050806120e15760405162461bcd60e51b815260206004820152603460248201527f5472616e7366657248656c7065723a3a736166655472616e736665724554483a60448201527f20455448207472616e73666572206661696c656400000000000000000000000060648201526084016101b7565b505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905291516000928392908716916121709190612b8b565b6000604051808303816000865af19150503d80600081146121ad576040519150601f19603f3d011682016040523d82523d6000602084013e6121b2565b606091505b50915091508180156121dc5750805115806121dc5750808060200190518101906121dc9190612b0d565b61224e5760405162461bcd60e51b815260206004820152602d60248201527f5472616e7366657248656c7065723a3a736166655472616e736665723a20747260448201527f616e73666572206661696c65640000000000000000000000000000000000000060648201526084016101b7565b5050505050565b6000828233612265600143612b3d565b6040805160208101959095528401929092527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606091821b169083015240607482015242609482015260b401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101209392505050565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b801515811461186657600080fd5b60006020828403121561237657600080fd5b813561238181612356565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156123fe576123fe612388565b604052919050565b600067ffffffffffffffff82111561242057612420612388565b5060051b60200190565b6001600160a01b038116811461186657600080fd5b600082601f83011261245057600080fd5b813561246361245e82612406565b6123b7565b8082825260208201915060208360051b86010192508583111561248557600080fd5b602085015b838110156124ab57803561249d8161242a565b83526020928301920161248a565b5095945050505050565b600080600080600060a086880312156124cd57600080fd5b853567ffffffffffffffff8111156124e457600080fd5b6124f08882890161243f565b95505060208601356125018161242a565b935060408601356125118161242a565b925060608601356125218161242a565b949793965091946080013592915050565b6000806040838503121561254557600080fd5b50508035926020909101359150565b60006020828403121561256657600080fd5b813567ffffffffffffffff81111561257d57600080fd5b6125898482850161243f565b949350505050565b6000602082840312156125a357600080fd5b5035919050565b6000602082840312156125bc57600080fd5b81356123818161242a565b600082601f8301126125d857600080fd5b81356125e661245e82612406565b8082825260208201915060208360051b86010192508583111561260857600080fd5b602085015b838110156124ab57803583526020928301920161260d565b60008060006060848603121561263a57600080fd5b833567ffffffffffffffff81111561265157600080fd5b8401601f8101861361266257600080fd5b803561267061245e82612406565b8082825260208201915060208360051b85010192508883111561269257600080fd5b6020840193505b828410156126b4578335825260209384019390910190612699565b9550505050602084013567ffffffffffffffff8111156126d357600080fd5b6126df868287016125c7565b925050604084013567ffffffffffffffff8111156126fc57600080fd5b612708868287016125c7565b9150509250925092565b865181526020808801519082015260408088015190820152606080880151151590820152600061012082016001600160a01b03881660808401528660a08401528560c08401528460e08401526101206101008401528084518083526101408501915060208601925060005b818110156127a45783516001600160a01b031683526020938401939092019160010161277d565b50909a9950505050505050505050565b602080825282518282018190526000918401906040840190835b8181101561281a576128048385518051825260208101516020830152604081015160408301526060810151151560608301525050565b60209390930192608092909201916001016127ce565b509095945050505050565b60006020828403121561283757600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6001815b60018411156128a85780850481111561288c5761288c61283e565b600184161561289a57908102905b60019390931c928002612871565b935093915050565b6000826128bf57506001611e14565b816128cc57506000611e14565b81600181146128e257600281146128ec57612908565b6001915050611e14565b60ff8411156128fd576128fd61283e565b50506001821b611e14565b5060208310610133831016604e8410600b841016171561292b575081810a611e14565b6129567fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848461286d565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156129885761298861283e565b029392505050565b600061238183836128b0565b8082028115828204841417611e1457611e1461283e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082601f8301126129f357600080fd5b8151612a0161245e82612406565b8082825260208201915060208360051b860101925085831115612a2357600080fd5b602085015b838110156124ab578051835260209283019201612a28565b600080600060608486031215612a5557600080fd5b8351602085015190935067ffffffffffffffff811115612a7457600080fd5b8401601f81018613612a8557600080fd5b8051612a9361245e82612406565b8082825260208201915060208360051b850101925088831115612ab557600080fd5b6020840193505b82841015612ae0578351612acf8161242a565b825260209384019390910190612abc565b80955050505050604084015167ffffffffffffffff811115612b0157600080fd5b612708868287016129e2565b600060208284031215612b1f57600080fd5b815161238181612356565b80820180821115611e1457611e1461283e565b81810381811115611e1457611e1461283e565b600082612b86577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500690565b6000825160005b81811015612bac5760208186018101518583015201612b92565b50600092019182525091905056fea26469706673582212203894e38b5927d0c07ca3b610245446691fbbdf1f323f650a63f8003ddc64109d64736f6c634300081b0033
Deployed Bytecode
0x60806040526004361061016e5760003560e01c80635c975abb116100cb5780638da5cb5b1161007f578063c55dae6311610059578063c55dae631461047f578063d08f6a6b146104a4578063f2fde38b146104c6576101c0565b80638da5cb5b146104275780639f11853614610445578063c4d252f51461045f576101c0565b8063687fff22116100b0578063687fff22146103df5780636f4072d1146103ff578063715018a614610412576101c0565b80635c975abb1461036b578063653e0f7f146103ad576101c0565b806344003549116101225780634dd76ebe116101075780634dd76ebe146102f3578063527eb4bc1461031357806353d742c71461034b576101c0565b806344003549146102b35780634cb08599146102d3576101c0565b80631966cdbe116101535780631966cdbe1461024a578063311109db1461026a57806338bde7911461028a576101c0565b806302329a29146102085780630ab2c0061461022a576101c0565b366101c05760405162461bcd60e51b815260206004820152600c60248201527f6e6f74206163636570746564000000000000000000000000000000000000000060448201526064015b60405180910390fd5b60405162461bcd60e51b815260206004820152600c60248201527f6e6f74206163636570746564000000000000000000000000000000000000000060448201526064016101b7565b34801561021457600080fd5b50610228610223366004612364565b6104e6565b005b34801561023657600080fd5b506102286102453660046124b5565b61058a565b34801561025657600080fd5b50610228610265366004612532565b6109b5565b34801561027657600080fd5b50610228610285366004612554565b610c9e565b34801561029657600080fd5b506102a060105481565b6040519081526020015b60405180910390f35b3480156102bf57600080fd5b506102286102ce366004612554565b610d56565b3480156102df57600080fd5b506102286102ee366004612591565b610e0e565b3480156102ff57600080fd5b5061022861030e3660046125aa565b610e6d565b34801561031f57600080fd5b50600254610333906001600160a01b031681565b6040516001600160a01b0390911681526020016102aa565b34801561035757600080fd5b50610228610366366004612625565b610f5c565b34801561037757600080fd5b5060025461039d9074010000000000000000000000000000000000000000900460ff1681565b60405190151581526020016102aa565b3480156103b957600080fd5b506103cd6103c8366004612591565b6111f5565b6040516102aa96959493929190612712565b3480156103eb57600080fd5b50600f54610333906001600160a01b031681565b61022861040d366004612591565b61141d565b34801561041e57600080fd5b50610228611869565b34801561043357600080fd5b506000546001600160a01b0316610333565b34801561045157600080fd5b50600e5461039d9060ff1681565b34801561046b57600080fd5b5061022861047a366004612591565b6118cf565b34801561048b57600080fd5b50600e546103339061010090046001600160a01b031681565b3480156104b057600080fd5b506104b9611b41565b6040516102aa91906127b4565b3480156104d257600080fd5b506102286104e13660046125aa565b611c5d565b6000546001600160a01b031633146105405760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016101b7565b6002805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b6000546001600160a01b031633146105e45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016101b7565b600e5460ff16156106375760405162461bcd60e51b815260206004820152601160248201527f616c726561647920696e6974696174656400000000000000000000000000000060448201526064016101b7565b600280546001600160a01b038087167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255600e8054868416610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff909116179055600f80549285169290911691909117905560108190556106bf85610d56565b6000600e60019054906101000a90046001600160a01b03166001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610714573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107389190612825565b61074390600a612990565b905060405180608001604052806004548152602001826064610765919061299c565b8152600a602080830191909152600060409283018190526004548152600b8252829020835181558382015160018201558383015160028201556060909301516003909301805460ff19169315159390931790925580516080810190915260055481529081016107d6836109c461299c565b8152600a602080830191909152600060409283018190526005548152600b8252829020835181558382015160018201558383015160028201556060909301516003909301805460ff19169315159390931790925580516080810190915260065481529081016108478361271061299c565b8152600a6020808301829052600060409384018190526006548152600b8083528482208651815586840151600182810191909155878701516002808401919091556060988901516003938401805491151560ff19928316179055885160808082018b52600754808352670de0b6b3a7640000838b01908152838d018c8152848f01888152928b52898c528d8b209451855590518488015551838601555191860180549215159284169290921790915589518082018b5260085480825268015af1d78b58c40000828b01908152828d018c8152838f01888152928b52898c528d8b2093518455905183880155518286015551908601805491151591841691909117905589519081018a5260095480825268056bc75e2d63100000828a01908152828c019a8b529b82018581529088529590975297909420945185559651848801559351918301919091555191018054911515918316919091179055600e80549091169091179055505050505050565b336109c86000546001600160a01b031690565b6001600160a01b031614806109ec57503360009081526003602052604090205460ff165b610a385760405162461bcd60e51b815260206004820152600860248201527f6e6f74206175746800000000000000000000000000000000000000000000000060448201526064016101b7565b610a40611d3c565b6000828152600b60205260409020548214610a9d5760405162461bcd60e51b815260206004820152600e60248201527f726f6f6d206e6f7420666f756e6400000000000000000000000000000000000060448201526064016101b7565b6000828152600b6020908152604080832060020154600d9092529091205414610b085760405162461bcd60e51b815260206004820152600760248201527f6e6f74207965740000000000000000000000000000000000000000000000000060448201526064016101b7565b6000610b148383611d7f565b6000848152600b6020526040812060018101546002909101549293509091610b3c919061299c565b6000858152600b602052604081206003015491925090610b6090839060ff16611e1a565b6000868152600b602052604090206003015490915060ff1615610b8c57610b878382611ffe565b610ba8565b600e54610ba89061010090046001600160a01b031684836120e6565b60005b6000868152600b6020526040902060020154811015610c0b576000868152600c60209081526040808320848452909152902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055600101610bab565b506000858152600d60209081526040808320838155600101839055600b8252918290206003015482513381529182018890526001600160a01b038616828401526060820184905260ff16151560808201524260a082015290517f011fd5bd96921cf092266465a7bad36acf4a1260044a0e2e3df779c2e526d5839181900360c00190a1505050610c9a60018055565b5050565b6000546001600160a01b03163314610cf85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016101b7565b60005b8151811015610c9a57600060036000848481518110610d1c57610d1c6129b3565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055600101610cfb565b6000546001600160a01b03163314610db05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016101b7565b60005b8151811015610c9a57600160036000848481518110610dd457610dd46129b3565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055600101610db3565b6000546001600160a01b03163314610e685760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016101b7565b601055565b6000546001600160a01b03163314610ec75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016101b7565b6002546001600160a01b0316600003610f225760405162461bcd60e51b815260206004820152601060248201527f6e6f74207a65726f20616464726573730000000000000000000000000000000060448201526064016101b7565b600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6000546001600160a01b03163314610fb65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016101b7565b60005b83518110156111ef57600b6000858381518110610fd857610fd86129b3565b6020026020010151815260200190815260200160002060000154848281518110611004576110046129b3565b6020026020010151146110595760405162461bcd60e51b815260206004820152600e60248201527f726f6f6d206e6f7420666f756e6400000000000000000000000000000000000060448201526064016101b7565b600d600085838151811061106f5761106f6129b3565b60200260200101518152602001908152602001600020600001546000146110d85760405162461bcd60e51b815260206004820152600f60248201527f616c726561647920656e7465726564000000000000000000000000000000000060448201526064016101b7565b60405180608001604052808583815181106110f5576110f56129b3565b60200260200101518152602001848381518110611114576111146129b3565b60200260200101518152602001838381518110611133576111336129b3565b60200260200101518152602001600b6000878581518110611156576111566129b3565b6020026020010151815260200190815260200160002060030160009054906101000a900460ff161515815250600b6000868481518110611198576111986129b3565b602090810291909101810151825281810192909252604090810160002083518155918301516001808401919091559083015160028301556060909201516003909101805460ff191691151591909117905501610fb9565b50505050565b6040805160808082018352600080835260208084018290528385018290526060938401829052858252600b8152848220855193840186528054845260018101549184019190915260028101549483019490945260039093015460ff16151581830181905290929182918291829161127c57600e5461010090046001600160a01b031661127f565b60005b945085602001518660400151611295919061299c565b60025460608801516040517fa17134b70000000000000000000000000000000000000000000000000000000081526001600160a01b038981166004830152602482018590529115156044820152929650169063a17134b790606401600060405180830381865afa15801561130d573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526113539190810190612a40565b50506000888152600d602052604090205490935091508167ffffffffffffffff81111561138257611382612388565b6040519080825280602002602001820160405280156113ab578160200160208202803683370190505b50905060005b82811015611413576000888152600c6020908152604080832084845290915290205482516001600160a01b03909116908390839081106113f3576113f36129b3565b6001600160a01b03909216602092830291909101909101526001016113b1565b5091939550919395565b611425611d3c565b60025474010000000000000000000000000000000000000000900460ff16156114905760405162461bcd60e51b815260206004820152600660248201527f706175736564000000000000000000000000000000000000000000000000000060448201526064016101b7565b6000818152600b602090815260409182902082516080810184528154815260018201549281019290925260028101549282019290925260039091015460ff161580156060830152611533573481602001511461152e5760405162461bcd60e51b815260206004820152601460248201527f696e73756666696369656e742062616c616e636500000000000000000000000060448201526064016101b7565b6115d3565b600e5460208201516040517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101919091526101009091046001600160a01b0316906323b872dd906064016020604051808303816000875af11580156115ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115d19190612b0d565b505b601054600f546040517f70a082310000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015611637573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061165b9190612825565b10156116a95760405162461bcd60e51b815260206004820152600e60248201527f6e6f7420656e6f756768206e667400000000000000000000000000000000000060448201526064016101b7565b6000828152600d6020526040902054815183146117085760405162461bcd60e51b815260206004820152600e60248201527f726f6f6d206e6f7420666f756e6400000000000000000000000000000000000060448201526064016101b7565b8160400151811061175b5760405162461bcd60e51b815260206004820152600760248201527f726561636865640000000000000000000000000000000000000000000000000060448201526064016101b7565b6000838152600c602090815260408083208484529091529020546001600160a01b0316156117cb5760405162461bcd60e51b815260206004820152600f60248201527f616c726561647920656e7465726564000000000000000000000000000000000060448201526064016101b7565b6000838152600c60209081526040808320848452825280832080547fffffffffffffffffffffffff00000000000000000000000000000000000000001633179055858352600d9091528120805460019290611827908490612b2a565b90915550506000838152600d60205260409020600101546118489044612255565b6000848152600d602052604090206001015550611866905060018055565b50565b6000546001600160a01b031633146118c35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016101b7565b6118cd60006122ee565b565b336118e26000546001600160a01b031690565b6001600160a01b0316148061190657503360009081526003602052604090205460ff165b6119525760405162461bcd60e51b815260206004820152600860248201527f6e6f74206175746800000000000000000000000000000000000000000000000060448201526064016101b7565b61195a611d3c565b6000818152600b602052604090205481146119b75760405162461bcd60e51b815260206004820152600e60248201527f726f6f6d206e6f7420666f756e6400000000000000000000000000000000000060448201526064016101b7565b6000818152600d6020908152604080832054600b9092529091206003015460ff1681611a255760405162461bcd60e51b815260206004820152600a60248201527f726f6f6d20656d7074790000000000000000000000000000000000000000000060448201526064016101b7565b6000838152600b6020526040812060010154905b83811015611add576000858152600c602090815260408083208484529091529020546001600160a01b03168315611a7957611a748184611ffe565b611a95565b600e54611a959061010090046001600160a01b031682856120e6565b506000858152600c60209081526040808320848452909152902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055600101611a39565b506000848152600d60209081526040808320838155600101929092558151338152908101869052428183015290517f80cbfccdf000bf697891059727332894c6b6fa2090916c79b81127ce49bcad5e9181900360600190a150505061186660018055565b6060600a5467ffffffffffffffff811115611b5e57611b5e612388565b604051908082528060200260200182016040528015611bce57816020015b6040805160808101825260008082526020808301829052928201819052606082015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909201910181611b7c5790505b50905060005b600a54811015611c5957600b6000611bed836001612b2a565b815260208082019290925260409081016000208151608081018352815481526001820154938101939093526002810154918301919091526003015460ff16151560608201528251839083908110611c4657611c466129b3565b6020908102919091010152600101611bd4565b5090565b6000546001600160a01b03163314611cb75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016101b7565b6001600160a01b038116611d335760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016101b7565b611866816122ee565b600260015403611d78576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600155565b6000828152600b602052604081206002015481908190611da190600190612b3d565b9050600082611db08184612b3d565b611dbb906001612b2a565b6000888152600d6020526040902060010154611dd8908890612255565b611de29190612b50565b611dec9190612b2a565b6000878152600c6020908152604080832093835292905220546001600160a01b031693505050505b92915050565b60008082611e3857600e5461010090046001600160a01b0316611e3b565b60005b6002546040517fa17134b70000000000000000000000000000000000000000000000000000000081526001600160a01b0380841660048301526024820188905286151560448301529293506000928392839291169063a17134b790606401600060405180830381865afa158015611eb6573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611efc9190810190612a40565b92509250925060005b8251811015611ff25760006001600160a01b0316838281518110611f2b57611f2b6129b3565b60200260200101516001600160a01b03161480611f6257506000828281518110611f5757611f576129b3565b602002602001015111155b611fea578615611fad57611fa8838281518110611f8157611f816129b3565b6020026020010151838381518110611f9b57611f9b6129b3565b6020026020010151611ffe565b611fea565b611fea85848381518110611fc357611fc36129b3565b6020026020010151848481518110611fdd57611fdd6129b3565b60200260200101516120e6565b600101611f05565b50919695505050505050565b604080516000808252602082019092526001600160a01b0384169083906040516120289190612b8b565b60006040518083038185875af1925050503d8060008114612065576040519150601f19603f3d011682016040523d82523d6000602084013e61206a565b606091505b50509050806120e15760405162461bcd60e51b815260206004820152603460248201527f5472616e7366657248656c7065723a3a736166655472616e736665724554483a60448201527f20455448207472616e73666572206661696c656400000000000000000000000060648201526084016101b7565b505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905291516000928392908716916121709190612b8b565b6000604051808303816000865af19150503d80600081146121ad576040519150601f19603f3d011682016040523d82523d6000602084013e6121b2565b606091505b50915091508180156121dc5750805115806121dc5750808060200190518101906121dc9190612b0d565b61224e5760405162461bcd60e51b815260206004820152602d60248201527f5472616e7366657248656c7065723a3a736166655472616e736665723a20747260448201527f616e73666572206661696c65640000000000000000000000000000000000000060648201526084016101b7565b5050505050565b6000828233612265600143612b3d565b6040805160208101959095528401929092527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606091821b169083015240607482015242609482015260b401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101209392505050565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b801515811461186657600080fd5b60006020828403121561237657600080fd5b813561238181612356565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156123fe576123fe612388565b604052919050565b600067ffffffffffffffff82111561242057612420612388565b5060051b60200190565b6001600160a01b038116811461186657600080fd5b600082601f83011261245057600080fd5b813561246361245e82612406565b6123b7565b8082825260208201915060208360051b86010192508583111561248557600080fd5b602085015b838110156124ab57803561249d8161242a565b83526020928301920161248a565b5095945050505050565b600080600080600060a086880312156124cd57600080fd5b853567ffffffffffffffff8111156124e457600080fd5b6124f08882890161243f565b95505060208601356125018161242a565b935060408601356125118161242a565b925060608601356125218161242a565b949793965091946080013592915050565b6000806040838503121561254557600080fd5b50508035926020909101359150565b60006020828403121561256657600080fd5b813567ffffffffffffffff81111561257d57600080fd5b6125898482850161243f565b949350505050565b6000602082840312156125a357600080fd5b5035919050565b6000602082840312156125bc57600080fd5b81356123818161242a565b600082601f8301126125d857600080fd5b81356125e661245e82612406565b8082825260208201915060208360051b86010192508583111561260857600080fd5b602085015b838110156124ab57803583526020928301920161260d565b60008060006060848603121561263a57600080fd5b833567ffffffffffffffff81111561265157600080fd5b8401601f8101861361266257600080fd5b803561267061245e82612406565b8082825260208201915060208360051b85010192508883111561269257600080fd5b6020840193505b828410156126b4578335825260209384019390910190612699565b9550505050602084013567ffffffffffffffff8111156126d357600080fd5b6126df868287016125c7565b925050604084013567ffffffffffffffff8111156126fc57600080fd5b612708868287016125c7565b9150509250925092565b865181526020808801519082015260408088015190820152606080880151151590820152600061012082016001600160a01b03881660808401528660a08401528560c08401528460e08401526101206101008401528084518083526101408501915060208601925060005b818110156127a45783516001600160a01b031683526020938401939092019160010161277d565b50909a9950505050505050505050565b602080825282518282018190526000918401906040840190835b8181101561281a576128048385518051825260208101516020830152604081015160408301526060810151151560608301525050565b60209390930192608092909201916001016127ce565b509095945050505050565b60006020828403121561283757600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6001815b60018411156128a85780850481111561288c5761288c61283e565b600184161561289a57908102905b60019390931c928002612871565b935093915050565b6000826128bf57506001611e14565b816128cc57506000611e14565b81600181146128e257600281146128ec57612908565b6001915050611e14565b60ff8411156128fd576128fd61283e565b50506001821b611e14565b5060208310610133831016604e8410600b841016171561292b575081810a611e14565b6129567fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848461286d565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156129885761298861283e565b029392505050565b600061238183836128b0565b8082028115828204841417611e1457611e1461283e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082601f8301126129f357600080fd5b8151612a0161245e82612406565b8082825260208201915060208360051b860101925085831115612a2357600080fd5b602085015b838110156124ab578051835260209283019201612a28565b600080600060608486031215612a5557600080fd5b8351602085015190935067ffffffffffffffff811115612a7457600080fd5b8401601f81018613612a8557600080fd5b8051612a9361245e82612406565b8082825260208201915060208360051b850101925088831115612ab557600080fd5b6020840193505b82841015612ae0578351612acf8161242a565b825260209384019390910190612abc565b80955050505050604084015167ffffffffffffffff811115612b0157600080fd5b612708868287016129e2565b600060208284031215612b1f57600080fd5b815161238181612356565b80820180821115611e1457611e1461283e565b81810381811115611e1457611e1461283e565b600082612b86577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500690565b6000825160005b81811015612bac5760208186018101518583015201612b92565b50600092019182525091905056fea26469706673582212203894e38b5927d0c07ca3b610245446691fbbdf1f323f650a63f8003ddc64109d64736f6c634300081b0033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ 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.