Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
- Contract name:
- BFTH_Arena
- Optimization enabled
- true
- Compiler version
- v0.8.17+commit.8df45f5f
- Optimization runs
- 200
- EVM Version
- london
- Verified at
- 2024-05-20T14:15:18.383683Z
Contract source code
// File: @openzeppelin/contracts/utils/Context.sol // SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable 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 Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling 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); } } // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @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 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; 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 require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // 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; } } // File: contracts/BFTH-Arena/BFTH_Arena.sol pragma solidity ^0.8.17; contract BFTH_Arena is Ownable, ReentrancyGuard { struct User { string name; uint256 paid; bool blocked; bool exist; } bool public isFinalized; address[] public users; mapping (address => User) public userInfo; event Registered(address indexed userAddress, string name); event Paid(address indexed userAddress, uint256 amount); event Blocked(address indexed userAddress, bool blocked); event Finalized(address recipient); receive() external payable {} constructor() Ownable() {} function listOfUsers() external view returns(User[] memory) { uint256 usersLength = users.length; User[] memory us = new User[](usersLength); for (uint256 i = 0; i < usersLength; i++) { us[i] = userInfo[users[i]]; } return us; } function listOfUsersAddresses() external view returns(address[] memory) { return users; } function register(address userAddress_, string memory name_) external { require(!isFinalized, "BFTH_Arena: Arena already finalized"); require(address(0) != userAddress_, "BFTH_Arena: User address cannot be null"); require(0 != bytes(name_).length, "BFTH_Arena: User name cannot be empty"); require(! userExists(userAddress_), "BFTH_Arena: User with this address already exists"); User storage u = userInfo[userAddress_]; u.name = name_; u.paid = 0; u.blocked = false; u.exist = true; users.push(userAddress_); emit Registered(userAddress_, name_); } function blockUser(address userAddress_, bool block_) external onlyOwner() { require(!isFinalized, "BFTH_Arena: Arena already finalized"); require(userExists(userAddress_), "BFTH_Arena: User with this address not exists"); userInfo[userAddress_].blocked = block_; emit Blocked(userAddress_, block_); } function pay(address userAddress_, uint256 amount_) external onlyOwner() nonReentrant() { require(!isFinalized, "BFTH_Arena: Arena already finalized"); require(userExists(userAddress_), "BFTH_Arena: User with this address not exists"); require(0 != amount_, "BFTH_Arena: amount must be greater than 0"); require(address(this).balance >= amount_, "BFTH_Arena: Not enough funds"); User storage user = userInfo[userAddress_]; require(user.blocked != true, "BFTH_Arena: user blocked"); (bool success, ) = userAddress_.call{value: amount_}(''); require(success, 'BFTH_Arena: Native token transfer failed'); user.paid += amount_; emit Paid(userAddress_, amount_); } function finalize(address _recipient) public onlyOwner() { require(!isFinalized, "BFTH_Arena: Arena already finalized"); isFinalized = true; (bool success, ) = _recipient.call{value: address(this).balance}(''); require(success, 'BFTH_Arena: Native token transfer failed'); emit Finalized(_recipient); } /// Helper member functions function userExists(address userAddress_) view private returns(bool) { return userInfo[userAddress_].exist; } }
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[]},{"type":"event","name":"Blocked","inputs":[{"type":"address","name":"userAddress","internalType":"address","indexed":true},{"type":"bool","name":"blocked","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"Finalized","inputs":[{"type":"address","name":"recipient","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"Paid","inputs":[{"type":"address","name":"userAddress","internalType":"address","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Registered","inputs":[{"type":"address","name":"userAddress","internalType":"address","indexed":true},{"type":"string","name":"name","internalType":"string","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"blockUser","inputs":[{"type":"address","name":"userAddress_","internalType":"address"},{"type":"bool","name":"block_","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"finalize","inputs":[{"type":"address","name":"_recipient","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isFinalized","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple[]","name":"","internalType":"struct BFTH_Arena.User[]","components":[{"type":"string","name":"name","internalType":"string"},{"type":"uint256","name":"paid","internalType":"uint256"},{"type":"bool","name":"blocked","internalType":"bool"},{"type":"bool","name":"exist","internalType":"bool"}]}],"name":"listOfUsers","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address[]","name":"","internalType":"address[]"}],"name":"listOfUsersAddresses","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"pay","inputs":[{"type":"address","name":"userAddress_","internalType":"address"},{"type":"uint256","name":"amount_","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"register","inputs":[{"type":"address","name":"userAddress_","internalType":"address"},{"type":"string","name":"name_","internalType":"string"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"name","internalType":"string"},{"type":"uint256","name":"paid","internalType":"uint256"},{"type":"bool","name":"blocked","internalType":"bool"},{"type":"bool","name":"exist","internalType":"bool"}],"name":"userInfo","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"users","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"receive","stateMutability":"payable"}]
Contract Creation Code
0x608060405234801561001057600080fd5b5061001a33610023565b60018055610073565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6112eb806100826000396000f3fe6080604052600436106100ab5760003560e01c80638d4e4083116100645780638d4e4083146101a15780638da5cb5b146101cb578063c4076876146101e9578063d9b998b414610209578063f2fde38b14610229578063f9f9686d1461024957600080fd5b80631959a002146100b757806319ce63dc146100f057806332434a2e14610112578063365b98b2146101345780634ef39b751461016c578063715018a61461018c57600080fd5b366100b257005b600080fd5b3480156100c357600080fd5b506100d76100d2366004610d57565b61026b565b6040516100e79493929190610dbf565b60405180910390f35b3480156100fc57600080fd5b50610105610322565b6040516100e79190610df0565b34801561011e57600080fd5b5061013261012d366004610e95565b6104df565b005b34801561014057600080fd5b5061015461014f366004610f57565b61070a565b6040516001600160a01b0390911681526020016100e7565b34801561017857600080fd5b50610132610187366004610d57565b610734565b34801561019857600080fd5b5061013261081d565b3480156101ad57600080fd5b506002546101bb9060ff1681565b60405190151581526020016100e7565b3480156101d757600080fd5b506000546001600160a01b0316610154565b3480156101f557600080fd5b50610132610204366004610f70565b610831565b34801561021557600080fd5b50610132610224366004610f9a565b610a85565b34801561023557600080fd5b50610132610244366004610d57565b610b37565b34801561025557600080fd5b5061025e610bb0565b6040516100e79190610fd6565b60046020526000908152604090208054819061028690611023565b80601f01602080910402602001604051908101604052809291908181526020018280546102b290611023565b80156102ff5780601f106102d4576101008083540402835291602001916102ff565b820191906000526020600020905b8154815290600101906020018083116102e257829003601f168201915b50505050600183015460029093015491929160ff80821692506101009091041684565b60035460609060008167ffffffffffffffff81111561034357610343610e7f565b60405190808252806020026020018201604052801561039657816020015b604080516080810182526060808252600060208084018290529383018190529082015282526000199092019101816103615790505b50905060005b828110156104d85760046000600383815481106103bb576103bb61105d565b60009182526020808320909101546001600160a01b0316835282019290925260409081019091208151608081019092528054829082906103fa90611023565b80601f016020809104026020016040519081016040528092919081815260200182805461042690611023565b80156104735780601f1061044857610100808354040283529160200191610473565b820191906000526020600020905b81548152906001019060200180831161045657829003601f168201915b50505091835250506001820154602082015260029091015460ff8082161515604084015261010090910416151560609091015282518390839081106104ba576104ba61105d565b602002602001018190525080806104d090611089565b91505061039c565b5092915050565b60025460ff161561050b5760405162461bcd60e51b8152600401610502906110a2565b60405180910390fd5b6001600160a01b0382166000036105745760405162461bcd60e51b815260206004820152602760248201527f424654485f4172656e613a205573657220616464726573732063616e6e6f74206044820152661899481b9d5b1b60ca1b6064820152608401610502565b80516000036105d35760405162461bcd60e51b815260206004820152602560248201527f424654485f4172656e613a2055736572206e616d652063616e6e6f7420626520604482015264656d70747960d81b6064820152608401610502565b6105dc82610c12565b156106435760405162461bcd60e51b815260206004820152603160248201527f424654485f4172656e613a205573657220776974682074686973206164647265604482015270737320616c72656164792065786973747360781b6064820152608401610502565b6001600160a01b0382166000908152600460205260409020806106668382611134565b506000600180830182905560028301805461ffff19166101001790556003805491820181559091527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0180546001600160a01b0385166001600160a01b031990911681179091556040517fb3eccf73f39b1c07947c780b2b39df2a1bb058b4037b0a42d0881ca1a028a132906106fd9085906111f4565b60405180910390a2505050565b6003818154811061071a57600080fd5b6000918252602090912001546001600160a01b0316905081565b61073c610c38565b60025460ff161561075f5760405162461bcd60e51b8152600401610502906110a2565b6002805460ff191660011790556040516000906001600160a01b0383169047908381818185875af1925050503d80600081146107b7576040519150601f19603f3d011682016040523d82523d6000602084013e6107bc565b606091505b50509050806107dd5760405162461bcd60e51b815260040161050290611207565b6040516001600160a01b03831681527f8e500951de09bcc6854e88c0810bafb819503505895751e657a92df6578d3d999060200160405180910390a15050565b610825610c38565b61082f6000610c92565b565b610839610c38565b610841610ce2565b60025460ff16156108645760405162461bcd60e51b8152600401610502906110a2565b61086d82610c12565b6108895760405162461bcd60e51b81526004016105029061124f565b806000036108eb5760405162461bcd60e51b815260206004820152602960248201527f424654485f4172656e613a20616d6f756e74206d75737420626520677265617460448201526806572207468616e20360bc1b6064820152608401610502565b8047101561093b5760405162461bcd60e51b815260206004820152601c60248201527f424654485f4172656e613a204e6f7420656e6f7567682066756e6473000000006044820152606401610502565b6001600160a01b0382166000908152600460205260409020600281015460ff1615156001036109ac5760405162461bcd60e51b815260206004820152601860248201527f424654485f4172656e613a207573657220626c6f636b656400000000000000006044820152606401610502565b6000836001600160a01b03168360405160006040518083038185875af1925050503d80600081146109f9576040519150601f19603f3d011682016040523d82523d6000602084013e6109fe565b606091505b5050905080610a1f5760405162461bcd60e51b815260040161050290611207565b82826001016000828254610a33919061129c565b90915550506040518381526001600160a01b038516907f737c69225d647e5994eab1a6c301bf6d9232beb2759ae1e27a8966b4732bc4899060200160405180910390a25050610a8160018055565b5050565b610a8d610c38565b60025460ff1615610ab05760405162461bcd60e51b8152600401610502906110a2565b610ab982610c12565b610ad55760405162461bcd60e51b81526004016105029061124f565b6001600160a01b038216600081815260046020908152604091829020600201805460ff191685151590811790915591519182527fcecdf9dd6f2193d677b10450a2e4ff64d6b61a566bdc6e34ab5c9fc2f797960b910160405180910390a25050565b610b3f610c38565b6001600160a01b038116610ba45760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610502565b610bad81610c92565b50565b60606003805480602002602001604051908101604052809291908181526020018280548015610c0857602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610bea575b5050505050905090565b6001600160a01b0316600090815260046020526040902060020154610100900460ff1690565b6000546001600160a01b0316331461082f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610502565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600260015403610d345760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610502565b6002600155565b80356001600160a01b0381168114610d5257600080fd5b919050565b600060208284031215610d6957600080fd5b610d7282610d3b565b9392505050565b6000815180845260005b81811015610d9f57602081850181015186830182015201610d83565b506000602082860101526020601f19601f83011685010191505092915050565b608081526000610dd26080830187610d79565b60208301959095525091151560408301521515606090910152919050565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b83811015610e7157603f19898403018552815160808151818652610e3d82870182610d79565b838b0151878c01528984015115158a8801526060938401511515939096019290925250509386019390860190600101610e17565b509098975050505050505050565b634e487b7160e01b600052604160045260246000fd5b60008060408385031215610ea857600080fd5b610eb183610d3b565b9150602083013567ffffffffffffffff80821115610ece57600080fd5b818501915085601f830112610ee257600080fd5b813581811115610ef457610ef4610e7f565b604051601f8201601f19908116603f01168101908382118183101715610f1c57610f1c610e7f565b81604052828152886020848701011115610f3557600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b600060208284031215610f6957600080fd5b5035919050565b60008060408385031215610f8357600080fd5b610f8c83610d3b565b946020939093013593505050565b60008060408385031215610fad57600080fd5b610fb683610d3b565b915060208301358015158114610fcb57600080fd5b809150509250929050565b6020808252825182820181905260009190848201906040850190845b818110156110175783516001600160a01b031683529284019291840191600101610ff2565b50909695505050505050565b600181811c9082168061103757607f821691505b60208210810361105757634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001820161109b5761109b611073565b5060010190565b60208082526023908201527f424654485f4172656e613a204172656e6120616c72656164792066696e616c696040820152621e995960ea1b606082015260800190565b601f82111561112f57600081815260208120601f850160051c8101602086101561110c5750805b601f850160051c820191505b8181101561112b57828155600101611118565b5050505b505050565b815167ffffffffffffffff81111561114e5761114e610e7f565b6111628161115c8454611023565b846110e5565b602080601f831160018114611197576000841561117f5750858301515b600019600386901b1c1916600185901b17855561112b565b600085815260208120601f198616915b828110156111c6578886015182559484019460019091019084016111a7565b50858210156111e45787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b602081526000610d726020830184610d79565b60208082526028908201527f424654485f4172656e613a204e617469766520746f6b656e207472616e7366656040820152671c8819985a5b195960c21b606082015260800190565b6020808252602d908201527f424654485f4172656e613a20557365722077697468207468697320616464726560408201526c7373206e6f742065786973747360981b606082015260800190565b808201808211156112af576112af611073565b9291505056fea2646970667358221220bd48859b8fc486c9c571dd3617c0ba72f739671fc631590e011c0d1c9b30a85c64736f6c63430008110033
Deployed ByteCode
0x6080604052600436106100ab5760003560e01c80638d4e4083116100645780638d4e4083146101a15780638da5cb5b146101cb578063c4076876146101e9578063d9b998b414610209578063f2fde38b14610229578063f9f9686d1461024957600080fd5b80631959a002146100b757806319ce63dc146100f057806332434a2e14610112578063365b98b2146101345780634ef39b751461016c578063715018a61461018c57600080fd5b366100b257005b600080fd5b3480156100c357600080fd5b506100d76100d2366004610d57565b61026b565b6040516100e79493929190610dbf565b60405180910390f35b3480156100fc57600080fd5b50610105610322565b6040516100e79190610df0565b34801561011e57600080fd5b5061013261012d366004610e95565b6104df565b005b34801561014057600080fd5b5061015461014f366004610f57565b61070a565b6040516001600160a01b0390911681526020016100e7565b34801561017857600080fd5b50610132610187366004610d57565b610734565b34801561019857600080fd5b5061013261081d565b3480156101ad57600080fd5b506002546101bb9060ff1681565b60405190151581526020016100e7565b3480156101d757600080fd5b506000546001600160a01b0316610154565b3480156101f557600080fd5b50610132610204366004610f70565b610831565b34801561021557600080fd5b50610132610224366004610f9a565b610a85565b34801561023557600080fd5b50610132610244366004610d57565b610b37565b34801561025557600080fd5b5061025e610bb0565b6040516100e79190610fd6565b60046020526000908152604090208054819061028690611023565b80601f01602080910402602001604051908101604052809291908181526020018280546102b290611023565b80156102ff5780601f106102d4576101008083540402835291602001916102ff565b820191906000526020600020905b8154815290600101906020018083116102e257829003601f168201915b50505050600183015460029093015491929160ff80821692506101009091041684565b60035460609060008167ffffffffffffffff81111561034357610343610e7f565b60405190808252806020026020018201604052801561039657816020015b604080516080810182526060808252600060208084018290529383018190529082015282526000199092019101816103615790505b50905060005b828110156104d85760046000600383815481106103bb576103bb61105d565b60009182526020808320909101546001600160a01b0316835282019290925260409081019091208151608081019092528054829082906103fa90611023565b80601f016020809104026020016040519081016040528092919081815260200182805461042690611023565b80156104735780601f1061044857610100808354040283529160200191610473565b820191906000526020600020905b81548152906001019060200180831161045657829003601f168201915b50505091835250506001820154602082015260029091015460ff8082161515604084015261010090910416151560609091015282518390839081106104ba576104ba61105d565b602002602001018190525080806104d090611089565b91505061039c565b5092915050565b60025460ff161561050b5760405162461bcd60e51b8152600401610502906110a2565b60405180910390fd5b6001600160a01b0382166000036105745760405162461bcd60e51b815260206004820152602760248201527f424654485f4172656e613a205573657220616464726573732063616e6e6f74206044820152661899481b9d5b1b60ca1b6064820152608401610502565b80516000036105d35760405162461bcd60e51b815260206004820152602560248201527f424654485f4172656e613a2055736572206e616d652063616e6e6f7420626520604482015264656d70747960d81b6064820152608401610502565b6105dc82610c12565b156106435760405162461bcd60e51b815260206004820152603160248201527f424654485f4172656e613a205573657220776974682074686973206164647265604482015270737320616c72656164792065786973747360781b6064820152608401610502565b6001600160a01b0382166000908152600460205260409020806106668382611134565b506000600180830182905560028301805461ffff19166101001790556003805491820181559091527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0180546001600160a01b0385166001600160a01b031990911681179091556040517fb3eccf73f39b1c07947c780b2b39df2a1bb058b4037b0a42d0881ca1a028a132906106fd9085906111f4565b60405180910390a2505050565b6003818154811061071a57600080fd5b6000918252602090912001546001600160a01b0316905081565b61073c610c38565b60025460ff161561075f5760405162461bcd60e51b8152600401610502906110a2565b6002805460ff191660011790556040516000906001600160a01b0383169047908381818185875af1925050503d80600081146107b7576040519150601f19603f3d011682016040523d82523d6000602084013e6107bc565b606091505b50509050806107dd5760405162461bcd60e51b815260040161050290611207565b6040516001600160a01b03831681527f8e500951de09bcc6854e88c0810bafb819503505895751e657a92df6578d3d999060200160405180910390a15050565b610825610c38565b61082f6000610c92565b565b610839610c38565b610841610ce2565b60025460ff16156108645760405162461bcd60e51b8152600401610502906110a2565b61086d82610c12565b6108895760405162461bcd60e51b81526004016105029061124f565b806000036108eb5760405162461bcd60e51b815260206004820152602960248201527f424654485f4172656e613a20616d6f756e74206d75737420626520677265617460448201526806572207468616e20360bc1b6064820152608401610502565b8047101561093b5760405162461bcd60e51b815260206004820152601c60248201527f424654485f4172656e613a204e6f7420656e6f7567682066756e6473000000006044820152606401610502565b6001600160a01b0382166000908152600460205260409020600281015460ff1615156001036109ac5760405162461bcd60e51b815260206004820152601860248201527f424654485f4172656e613a207573657220626c6f636b656400000000000000006044820152606401610502565b6000836001600160a01b03168360405160006040518083038185875af1925050503d80600081146109f9576040519150601f19603f3d011682016040523d82523d6000602084013e6109fe565b606091505b5050905080610a1f5760405162461bcd60e51b815260040161050290611207565b82826001016000828254610a33919061129c565b90915550506040518381526001600160a01b038516907f737c69225d647e5994eab1a6c301bf6d9232beb2759ae1e27a8966b4732bc4899060200160405180910390a25050610a8160018055565b5050565b610a8d610c38565b60025460ff1615610ab05760405162461bcd60e51b8152600401610502906110a2565b610ab982610c12565b610ad55760405162461bcd60e51b81526004016105029061124f565b6001600160a01b038216600081815260046020908152604091829020600201805460ff191685151590811790915591519182527fcecdf9dd6f2193d677b10450a2e4ff64d6b61a566bdc6e34ab5c9fc2f797960b910160405180910390a25050565b610b3f610c38565b6001600160a01b038116610ba45760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610502565b610bad81610c92565b50565b60606003805480602002602001604051908101604052809291908181526020018280548015610c0857602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610bea575b5050505050905090565b6001600160a01b0316600090815260046020526040902060020154610100900460ff1690565b6000546001600160a01b0316331461082f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610502565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600260015403610d345760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610502565b6002600155565b80356001600160a01b0381168114610d5257600080fd5b919050565b600060208284031215610d6957600080fd5b610d7282610d3b565b9392505050565b6000815180845260005b81811015610d9f57602081850181015186830182015201610d83565b506000602082860101526020601f19601f83011685010191505092915050565b608081526000610dd26080830187610d79565b60208301959095525091151560408301521515606090910152919050565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b83811015610e7157603f19898403018552815160808151818652610e3d82870182610d79565b838b0151878c01528984015115158a8801526060938401511515939096019290925250509386019390860190600101610e17565b509098975050505050505050565b634e487b7160e01b600052604160045260246000fd5b60008060408385031215610ea857600080fd5b610eb183610d3b565b9150602083013567ffffffffffffffff80821115610ece57600080fd5b818501915085601f830112610ee257600080fd5b813581811115610ef457610ef4610e7f565b604051601f8201601f19908116603f01168101908382118183101715610f1c57610f1c610e7f565b81604052828152886020848701011115610f3557600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b600060208284031215610f6957600080fd5b5035919050565b60008060408385031215610f8357600080fd5b610f8c83610d3b565b946020939093013593505050565b60008060408385031215610fad57600080fd5b610fb683610d3b565b915060208301358015158114610fcb57600080fd5b809150509250929050565b6020808252825182820181905260009190848201906040850190845b818110156110175783516001600160a01b031683529284019291840191600101610ff2565b50909695505050505050565b600181811c9082168061103757607f821691505b60208210810361105757634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001820161109b5761109b611073565b5060010190565b60208082526023908201527f424654485f4172656e613a204172656e6120616c72656164792066696e616c696040820152621e995960ea1b606082015260800190565b601f82111561112f57600081815260208120601f850160051c8101602086101561110c5750805b601f850160051c820191505b8181101561112b57828155600101611118565b5050505b505050565b815167ffffffffffffffff81111561114e5761114e610e7f565b6111628161115c8454611023565b846110e5565b602080601f831160018114611197576000841561117f5750858301515b600019600386901b1c1916600185901b17855561112b565b600085815260208120601f198616915b828110156111c6578886015182559484019460019091019084016111a7565b50858210156111e45787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b602081526000610d726020830184610d79565b60208082526028908201527f424654485f4172656e613a204e617469766520746f6b656e207472616e7366656040820152671c8819985a5b195960c21b606082015260800190565b6020808252602d908201527f424654485f4172656e613a20557365722077697468207468697320616464726560408201526c7373206e6f742065786973747360981b606082015260800190565b808201808211156112af576112af611073565b9291505056fea2646970667358221220bd48859b8fc486c9c571dd3617c0ba72f739671fc631590e011c0d1c9b30a85c64736f6c63430008110033