Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
- Contract name:
- ArianeeEvent
- Optimization enabled
- true
- Compiler version
- v0.5.6+commit.b259423e
- Optimization runs
- 200
- EVM Version
- default
- Verified at
- 2024-07-08T17:10:59.366139Z
Constructor Arguments
000000000000000000000000512c1fcf401133680f373a386f3f752b98070bc50000000000000000000000003579669219dc20aa79e74eefd5fb2ecb0ce5fe0d
Arg [0] (address) : 0x512c1fcf401133680f373a386f3f752b98070bc5
Arg [1] (address) : 0x3579669219dc20aa79e74eefd5fb2ecb0ce5fe0d
.sol
// File: @0xcert/ethereum-utils-contracts/src/contracts/permission/ownable.sol
pragma solidity 0.5.6;
/**
* @dev The contract has an owner address, and provides basic authorization control whitch
* simplifies the implementation of user permissions. This contract is based on the source code at:
* https://github.com/OpenZeppelin/openzeppelin-solidity/blob/master/contracts/ownership/Ownable.sol
*/
contract Ownable
{
/**
* @dev Error constants.
*/
string constant NOT_OWNER = "018001";
string constant ZERO_ADDRESS = "018002";
/**
* @dev Address of the owner.
*/
address public owner;
/**
* @dev An event which is triggered when the owner is changed.
* @param previousOwner The address of the previous owner.
* @param newOwner The address of the new owner.
*/
event OwnershipTransferred(
address indexed previousOwner,
address indexed newOwner
);
/**
* @dev The constructor sets the original `owner` of the contract to the sender account.
*/
constructor()
public
{
owner = msg.sender;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner()
{
require(msg.sender == owner, NOT_OWNER);
_;
}
/**
* @dev Allows the current owner to transfer control of the contract to a newOwner.
* @param _newOwner The address to transfer ownership to.
*/
function transferOwnership(
address _newOwner
)
public
onlyOwner
{
require(_newOwner != address(0), ZERO_ADDRESS);
emit OwnershipTransferred(owner, _newOwner);
owner = _newOwner;
}
}
// File: @0xcert/ethereum-utils-contracts/src/contracts/math/safe-math.sol
pragma solidity 0.5.6;
/**
* @dev Math operations with safety checks that throw on error. This contract is based on the
* source code at:
* https://github.com/OpenZeppelin/openzeppelin-solidity/blob/master/contracts/math/SafeMath.sol.
*/
library SafeMath
{
/**
* @dev Error constants.
*/
string constant OVERFLOW = "008001";
string constant SUBTRAHEND_GREATER_THEN_MINUEND = "008002";
string constant DIVISION_BY_ZERO = "008003";
/**
* @dev Multiplies two numbers, reverts on overflow.
* @param _factor1 Factor number.
* @param _factor2 Factor number.
* @return The product of the two factors.
*/
function mul(
uint256 _factor1,
uint256 _factor2
)
internal
pure
returns (uint256 product)
{
// 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-solidity/pull/522
if (_factor1 == 0)
{
return 0;
}
product = _factor1 * _factor2;
require(product / _factor1 == _factor2, OVERFLOW);
}
/**
* @dev Integer division of two numbers, truncating the quotient, reverts on division by zero.
* @param _dividend Dividend number.
* @param _divisor Divisor number.
* @return The quotient.
*/
function div(
uint256 _dividend,
uint256 _divisor
)
internal
pure
returns (uint256 quotient)
{
// Solidity automatically asserts when dividing by 0, using all gas.
require(_divisor > 0, DIVISION_BY_ZERO);
quotient = _dividend / _divisor;
// assert(_dividend == _divisor * quotient + _dividend % _divisor); // There is no case in which this doesn't hold.
}
/**
* @dev Substracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
* @param _minuend Minuend number.
* @param _subtrahend Subtrahend number.
* @return Difference.
*/
function sub(
uint256 _minuend,
uint256 _subtrahend
)
internal
pure
returns (uint256 difference)
{
require(_subtrahend <= _minuend, SUBTRAHEND_GREATER_THEN_MINUEND);
difference = _minuend - _subtrahend;
}
/**
* @dev Adds two numbers, reverts on overflow.
* @param _addend1 Number.
* @param _addend2 Number.
* @return Sum.
*/
function add(
uint256 _addend1,
uint256 _addend2
)
internal
pure
returns (uint256 sum)
{
sum = _addend1 + _addend2;
require(sum >= _addend1, OVERFLOW);
}
/**
* @dev Divides two numbers and returns the remainder (unsigned integer modulo), reverts when
* dividing by zero.
* @param _dividend Number.
* @param _divisor Number.
* @return Remainder.
*/
function mod(
uint256 _dividend,
uint256 _divisor
)
internal
pure
returns (uint256 remainder)
{
require(_divisor != 0, DIVISION_BY_ZERO);
remainder = _dividend % _divisor;
}
}
// File: contracts/ArianeeEvent/Pausable.sol
pragma solidity 0.5.6;
/**
* @title Pausable
* @dev Base contract which allows children to implement an emergency stop mechanism.
*/
contract Pausable is Ownable {
event Pause();
event Unpause();
bool public paused = false;
/**
* @dev Modifier to make a function callable only when the contract is not paused.
*/
modifier whenNotPaused() {
require(!paused);
_;
}
/**
* @dev Modifier to make a function callable only when the contract is paused.
*/
modifier whenPaused() {
require(paused);
_;
}
/**
* @dev called by the owner to pause, triggers stopped state
*/
function pause() onlyOwner whenNotPaused public {
paused = true;
emit Pause();
}
/**
* @dev called by the owner to unpause, returns to normal state
*/
function unpause() onlyOwner whenPaused public {
paused = false;
emit Unpause();
}
}
// File: contracts/ArianeeEvent/ArianeeEvent.sol
pragma solidity 0.5.6;
contract ERC721Interface {
function canOperate(uint256 _tokenId, address _operator) public returns(bool);
function isTokenValid(uint256 _tokenId, bytes32 _hash, uint256 _tokenType, bytes memory _signature) public view returns (bool);
function issuerOf(uint256 _tokenId) external view returns(address _tokenIssuer);
function tokenCreation(uint256 _tokenId) external view returns(uint256);
}
contract iArianeeWhitelist {
function addWhitelistedAddress(uint256 _tokenId, address _address) public;
}
contract ArianeeEvent is
Ownable, Pausable{
using SafeMath for uint256;
address arianeeStoreAddress;
iArianeeWhitelist arianeeWhitelist;
ERC721Interface smartAsset;
uint256 eventDestroyDelay = 7776000;
/// Event ID per token
mapping(uint256 => uint256[]) public tokenEventsList;
mapping(uint256 => uint256) public idToTokenEventIndex;
/// Mapping from tokenid to pending events
mapping(uint256 => uint256[]) public pendingEvents;
/// Mapping from event ID to its index in the pending events list
mapping(uint256 => uint256) public idToPendingEvents;
mapping(uint256 => uint256) public eventIdToToken;
mapping(uint256 => uint256) public rewards;
mapping(uint256 => bool) destroyRequest;
/// Event list
mapping(uint256 => Event) internal events;
//Event[] public events;
struct Event{
string URI;
bytes32 imprint;
address provider;
uint destroyLimitTimestamp;
}
event EventCreated(uint256 indexed _tokenId, uint256 indexed _eventId, bytes32 indexed _imprint, string _uri, address _provider);
event EventAccepted(uint256 indexed _eventId, address indexed _sender);
event EventRefused(uint256 indexed _eventId, address indexed _sender);
event EventDestroyed(uint256 indexed _eventId);
event DestroyRequestUpdated(uint256 indexed _eventId, bool _active);
event EventDestroyDelayUpdated(uint256 _newDelay);
modifier onlyStore(){
//require(msg.sender == arianeeStoreAddress);
_;
}
modifier canOperate(uint256 _eventId,address _operator){
//uint256 _tokenId = eventIdToToken[_eventId];
//require(smartAsset.canOperate(_tokenId, _operator) || smartAsset.issuerOf(_tokenId) == _operator);
_;
}
modifier isProvider(uint256 _eventId) {
//require(msg.sender == events[_eventId].provider);
_;
}
constructor(address _smartAssetAddress, address _arianeeWhitelistAddress) public{
arianeeWhitelist = iArianeeWhitelist(address(_arianeeWhitelistAddress));
smartAsset = ERC721Interface(address(_smartAssetAddress));
}
/**
* @dev set a new store address
* @notice can only be called by the contract owner.
* @param _storeAddress new address of the store.
*/
function setStoreAddress(address _storeAddress) public onlyOwner(){
arianeeStoreAddress = _storeAddress;
}
/**
* @dev create a new event linked to a nft
* @notice can only be called through the store.
* @param _tokenId id of the NFT
* @param _imprint of the JSON.
* @param _uri uri of the JSON of the service.
* @param _reward total rewards of this event.
* @param _provider address of the event provider.
* @return the id of the service.
*/
function create(uint256 _eventId, uint256 _tokenId, bytes32 _imprint, string calldata _uri, uint256 _reward, address _provider) external onlyStore() whenNotPaused() {
require(smartAsset.tokenCreation(_tokenId)>0);
require(events[_eventId].provider == address(0));
Event memory _event = Event({
URI : _uri,
imprint : _imprint,
provider : _provider,
destroyLimitTimestamp : eventDestroyDelay.add(block.timestamp)
});
events[_eventId] = _event;
uint256 length = pendingEvents[_tokenId].push(_eventId);
idToPendingEvents[_eventId] = length - 1;
eventIdToToken[_eventId] = _tokenId;
rewards[_eventId]= _reward;
emit EventCreated(_tokenId, _eventId, _imprint, _uri, _provider);
}
/**
* @dev Accept an event so it can be concidered as valid.
* @notice can only be called through the store by an operator of the NFT.
* @param _eventId id of the service.
*/
function accept(uint256 _eventId, address _sender) external onlyStore() canOperate(_eventId, _sender) whenNotPaused() returns(uint256){
uint256 _tokenId = eventIdToToken[_eventId];
uint256 pendingEventToRemoveIndex = idToPendingEvents[_eventId];
uint256 lastPendingIndex = pendingEvents[_tokenId].length - 1;
if(lastPendingIndex != pendingEventToRemoveIndex){
uint256 lastPendingEvent = pendingEvents[_tokenId][lastPendingIndex];
pendingEvents[_tokenId][pendingEventToRemoveIndex]=lastPendingEvent;
idToPendingEvents[lastPendingEvent] = pendingEventToRemoveIndex;
}
pendingEvents[_tokenId].length--;
delete idToPendingEvents[_eventId];
uint256 length = tokenEventsList[_tokenId].push(_eventId);
idToTokenEventIndex[_eventId] = length - 1;
arianeeWhitelist.addWhitelistedAddress(_tokenId, events[_eventId].provider);
uint256 reward = rewards[_eventId];
delete rewards[_eventId];
emit EventAccepted(_eventId, _sender);
return reward;
}
/**
* @dev refuse an event so it can be concidered as valid.
* @notice can only be called through the store by an operator of the NFT.
* @param _eventId id of the service.
*/
function refuse(uint256 _eventId, address _sender) external onlyStore() canOperate(_eventId, _sender) whenNotPaused() returns(uint256){
_destroyPending(_eventId);
uint256 reward = rewards[_eventId];
delete rewards[_eventId];
emit EventRefused(_eventId, _sender);
return reward;
}
function destroy(uint256 _eventId) external isProvider(_eventId) whenNotPaused(){
require(block.timestamp < events[_eventId].destroyLimitTimestamp);
require(idToPendingEvents[_eventId] == 0);
_destroy(_eventId);
}
function updateDestroyRequest(uint256 _eventId, bool _active) external isProvider(_eventId) whenNotPaused() {
require(idToPendingEvents[_eventId] == 0);
destroyRequest[_eventId] = _active;
emit DestroyRequestUpdated(_eventId, _active);
}
function validDestroyRequest(uint256 _eventId) external onlyOwner() whenNotPaused() {
require(destroyRequest[_eventId] == true);
destroyRequest[_eventId] = false;
_destroy(_eventId);
}
function updateEventDestroyDelay(uint256 _newDelay) external onlyOwner() whenNotPaused() {
eventDestroyDelay = _newDelay;
emit EventDestroyDelayUpdated(_newDelay);
}
function getEvent(uint256 _eventId) public view returns(string memory, bytes32, address, uint){
require(events[_eventId].provider != address(0));
return (events[_eventId].URI, events[_eventId].imprint, events[_eventId].provider, events[_eventId].destroyLimitTimestamp);
}
function _destroy(uint256 _eventId) internal{
uint256 _tokenId = eventIdToToken[_eventId];
uint256 eventIdToRemove = idToTokenEventIndex[_eventId];
uint256 lastEventId = tokenEventsList[_tokenId].length - 1;
if(eventIdToRemove != lastEventId){
uint256 lastEvent = tokenEventsList[_tokenId][lastEventId];
tokenEventsList[_tokenId][eventIdToRemove] = lastEvent;
idToTokenEventIndex[lastEvent] = eventIdToRemove;
}
tokenEventsList[_tokenId].length--;
delete idToTokenEventIndex[_eventId];
delete eventIdToToken[_eventId];
delete events[_eventId];
emit EventDestroyed(_eventId);
}
function _destroyPending(uint256 _eventId) internal{
uint256 _tokenId = eventIdToToken[_eventId];
uint256 pendingEventToRemoveIndex = idToPendingEvents[_eventId];
uint256 lastPendingIndex = pendingEvents[_tokenId].length - 1;
if(lastPendingIndex != pendingEventToRemoveIndex){
uint256 lastPendingEvent = pendingEvents[_tokenId][lastPendingIndex];
pendingEvents[_tokenId][pendingEventToRemoveIndex]=lastPendingEvent;
idToPendingEvents[lastPendingEvent] = pendingEventToRemoveIndex;
}
pendingEvents[_tokenId].length--;
delete idToPendingEvents[_eventId];
delete eventIdToToken[_eventId];
delete events[_eventId];
emit EventDestroyed(_eventId);
}
function pendingEventsLength(uint256 _tokenId) public view returns(uint256){
return pendingEvents[_tokenId].length;
}
function eventsLength(uint256 _tokenId) public view returns(uint256){
return tokenEventsList[_tokenId].length;
}
}
Compiler Settings
{"outputSelection":{"*":{"*":["*"],"":["*"]}},"optimizer":{"runs":200,"enabled":true},"libraries":{".sol":{}}}
Contract ABI
[{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"idToPendingEvents","inputs":[{"type":"uint256","name":""}],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"tokenEventsList","inputs":[{"type":"uint256","name":""},{"type":"uint256","name":""}],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"create","inputs":[{"type":"uint256","name":"_eventId"},{"type":"uint256","name":"_tokenId"},{"type":"bytes32","name":"_imprint"},{"type":"string","name":"_uri"},{"type":"uint256","name":"_reward"},{"type":"address","name":"_provider"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"pendingEventsLength","inputs":[{"type":"uint256","name":"_tokenId"}],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"unpause","inputs":[],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"updateDestroyRequest","inputs":[{"type":"uint256","name":"_eventId"},{"type":"bool","name":"_active"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"accept","inputs":[{"type":"uint256","name":"_eventId"},{"type":"address","name":"_sender"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"bool","name":""}],"name":"paused","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"setStoreAddress","inputs":[{"type":"address","name":"_storeAddress"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"string","name":""},{"type":"bytes32","name":""},{"type":"address","name":""},{"type":"uint256","name":""}],"name":"getEvent","inputs":[{"type":"uint256","name":"_eventId"}],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"eventsLength","inputs":[{"type":"uint256","name":"_tokenId"}],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"pause","inputs":[],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":""}],"name":"owner","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"destroy","inputs":[{"type":"uint256","name":"_eventId"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"eventIdToToken","inputs":[{"type":"uint256","name":""}],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"idToTokenEventIndex","inputs":[{"type":"uint256","name":""}],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"validDestroyRequest","inputs":[{"type":"uint256","name":"_eventId"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"refuse","inputs":[{"type":"uint256","name":"_eventId"},{"type":"address","name":"_sender"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"pendingEvents","inputs":[{"type":"uint256","name":""},{"type":"uint256","name":""}],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"updateEventDestroyDelay","inputs":[{"type":"uint256","name":"_newDelay"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"_newOwner"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"rewards","inputs":[{"type":"uint256","name":""}],"constant":true},{"type":"constructor","stateMutability":"nonpayable","payable":false,"inputs":[{"type":"address","name":"_smartAssetAddress"},{"type":"address","name":"_arianeeWhitelistAddress"}]},{"type":"event","name":"EventCreated","inputs":[{"type":"uint256","name":"_tokenId","indexed":true},{"type":"uint256","name":"_eventId","indexed":true},{"type":"bytes32","name":"_imprint","indexed":true},{"type":"string","name":"_uri","indexed":false},{"type":"address","name":"_provider","indexed":false}],"anonymous":false},{"type":"event","name":"EventAccepted","inputs":[{"type":"uint256","name":"_eventId","indexed":true},{"type":"address","name":"_sender","indexed":true}],"anonymous":false},{"type":"event","name":"EventRefused","inputs":[{"type":"uint256","name":"_eventId","indexed":true},{"type":"address","name":"_sender","indexed":true}],"anonymous":false},{"type":"event","name":"EventDestroyed","inputs":[{"type":"uint256","name":"_eventId","indexed":true}],"anonymous":false},{"type":"event","name":"DestroyRequestUpdated","inputs":[{"type":"uint256","name":"_eventId","indexed":true},{"type":"bool","name":"_active","indexed":false}],"anonymous":false},{"type":"event","name":"EventDestroyDelayUpdated","inputs":[{"type":"uint256","name":"_newDelay","indexed":false}],"anonymous":false},{"type":"event","name":"Pause","inputs":[],"anonymous":false},{"type":"event","name":"Unpause","inputs":[],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","indexed":true},{"type":"address","name":"newOwner","indexed":true}],"anonymous":false}]
Contract Creation Code
0x608060405260008054600160a01b60ff02191690556276a70060045534801561002757600080fd5b506040516040806116758339810180604052604081101561004757600080fd5b508051602090910151600080546001600160a01b03199081163317909155600280546001600160a01b03938416908316179055600380549290931691161790556115df806100966000396000f3fe608060405234801561001057600080fd5b50600436106101425760003560e01c80638456cb59116100b8578063b215548e1161007c578063b215548e14610441578063c83ed88c1461045e578063df8edca01461048a578063e253981b146104ad578063f2fde38b146104ca578063f301af42146104f057610142565b80638456cb59146103be5780638da5cb5b146103c65780639d118770146103ea5780639f503b7514610407578063ac94e8131461042457610142565b80634d396a2a1161010a5780634d396a2a1461025257806350ace9c2146102775780635c975abb146102a35780636559e59a146102bf5780636d1884e0146102e55780637bf4c220146103a157610142565b80630185934b14610147578063042fe37b14610176578063078a5cfb14610199578063246cb2d51461022d5780633f4ba83a1461024a575b600080fd5b6101646004803603602081101561015d57600080fd5b503561050d565b60408051918252519081900360200190f35b6101646004803603604081101561018c57600080fd5b508035906020013561051f565b61022b600480360360c08110156101af57600080fd5b813591602081013591604082013591908101906080810160608201356401000000008111156101dd57600080fd5b8201836020820111156101ef57600080fd5b8035906020019184600183028401116401000000008311171561021157600080fd5b9193509150803590602001356001600160a01b031661054d565b005b6101646004803603602081101561024357600080fd5b50356107b6565b61022b6107c8565b61022b6004803603604081101561026857600080fd5b508035906020013515156108d2565b6101646004803603604081101561028d57600080fd5b50803590602001356001600160a01b031661095c565b6102ab610b37565b604080519115158252519081900360200190f35b61022b600480360360208110156102d557600080fd5b50356001600160a01b0316610b47565b610302600480360360208110156102fb57600080fd5b5035610be7565b6040518080602001858152602001846001600160a01b03166001600160a01b03168152602001838152602001828103825286818151815260200191508051906020019080838360005b8381101561036357818101518382015260200161034b565b50505050905090810190601f1680156103905780820380516001836020036101000a031916815260200191505b509550505050505060405180910390f35b610164600480360360208110156103b757600080fd5b5035610cdd565b61022b610cef565b6103ce610dc3565b604080516001600160a01b039092168252519081900360200190f35b61022b6004803603602081101561040057600080fd5b5035610dd2565b6101646004803603602081101561041d57600080fd5b5035610e2e565b6101646004803603602081101561043a57600080fd5b5035610e40565b61022b6004803603602081101561045757600080fd5b5035610e52565b6101646004803603604081101561047457600080fd5b50803590602001356001600160a01b0316610f29565b610164600480360360408110156104a057600080fd5b5080359060200135610fa0565b61022b600480360360208110156104c357600080fd5b5035610fb9565b61022b600480360360208110156104e057600080fd5b50356001600160a01b0316611089565b6101646004803603602081101561050657600080fd5b50356111db565b60086020526000908152604090205481565b6005602052816000526040600020818154811061053857fe5b90600052602060002001600091509150505481565b600054600160a01b900460ff161561056457600080fd5b60035460408051600160e11b632fd65c410281526004810189905290516000926001600160a01b031691635facb882916024808301926020929190829003018186803b1580156105b357600080fd5b505afa1580156105c7573d6000803e3d6000fd5b505050506040513d60208110156105dd57600080fd5b5051116105e957600080fd5b6000878152600c60205260409020600201546001600160a01b03161561060e57600080fd5b610616611488565b604051806080016040528086868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250602081018890526001600160a01b0384166040820152600454606090910190610689904263ffffffff6111ed16565b90526000898152600c6020908152604090912082518051939450849391926106b6928492909101906114af565b506020828101516001838101919091556040808501516002850180546001600160a01b0319166001600160a01b0392831617905560609586015160039095019490945560008c815260078452818120805493840180825590825284822084018f90558e82526008855282822093909355600984528181208d9055600a84528190208890558051938716928401929092528183529082018790529188918b918b917f22812011facd690a74ddd930726d2c051f0b7ef3d0ea35ad9b0f0d89849cb0f2918b918b918a919081908101858580828437600083820152604051601f909101601f1916909201829003965090945050505050a4505050505050505050565b60009081526007602052604090205490565b6000546040805180820190915260068152600160d01b65303138303031026020820152906001600160a01b0316331461088257604051600160e51b62461bcd0281526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561084757818101518382015260200161082f565b50505050905090810190601f1680156108745780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600054600160a01b900460ff1661089957600080fd5b60008054600160a01b60ff02191681556040517f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b339190a1565b6000548290600160a01b900460ff16156108eb57600080fd5b6000838152600860205260409020541561090457600080fd5b6000838152600b6020908152604091829020805460ff19168515159081179091558251908152915185927f5f9ec800eb8dc135e488f393491e324d4662a45bad8759259d6b70a7f3edabc292908290030190a2505050565b6000805483908390600160a01b900460ff161561097857600080fd5b6000858152600960209081526040808320546008835281842054818552600790935292205460001901808214610a0e5760008381526007602052604081208054839081106109c257fe5b90600052602060002001549050806007600086815260200190815260200160002084815481106109ee57fe5b600091825260208083209091019290925591825260089052604090208290555b6000838152600760205260409020805490610a2d90600019830161152d565b5060008881526008602090815260408083208390558583526005825280832080546001810180835591855283852081018d90558c8552600684528285205560028054600c90945282852001548251600160e01b6387159d9b028152600481018990526001600160a01b039182166024820152925191949316926387159d9b926044808201939182900301818387803b158015610ac857600080fd5b505af1158015610adc573d6000803e3d6000fd5b50505060008a8152600a602052604080822080549083905590519092506001600160a01b038b16918c917f801d564d3920ab7f9d83def865765f310bf8d043086d5ba3e544bd6f2073ad8c9190a39998505050505050505050565b600054600160a01b900460ff1681565b6000546040805180820190915260068152600160d01b65303138303031026020820152906001600160a01b03163314610bc457604051600160e51b62461bcd02815260206004820181815283516024840152835190928392604490910191908501908083836000831561084757818101518382015260200161082f565b50600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000818152600c602052604081206002015460609190819081906001600160a01b0316610c1357600080fd5b6000858152600c60209081526040918290206001808201546002808401546003850154855488516101009682161596909602600019011692909204601f8101879004870285018701909752868452939591946001600160a01b03909416939092918691830182828015610cc75780601f10610c9c57610100808354040283529160200191610cc7565b820191906000526020600020905b815481529060010190602001808311610caa57829003601f168201915b5050505050935093509350935093509193509193565b60009081526005602052604090205490565b6000546040805180820190915260068152600160d01b65303138303031026020820152906001600160a01b03163314610d6c57604051600160e51b62461bcd02815260206004820181815283516024840152835190928392604490910191908501908083836000831561084757818101518382015260200161082f565b50600054600160a01b900460ff1615610d8457600080fd5b60008054600160a01b60ff021916600160a01b1781556040517f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff6259190a1565b6000546001600160a01b031681565b6000548190600160a01b900460ff1615610deb57600080fd5b6000828152600c60205260409020600301544210610e0857600080fd5b60008281526008602052604090205415610e2157600080fd5b610e2a8261126a565b5050565b60096020526000908152604090205481565b60066020526000908152604090205481565b6000546040805180820190915260068152600160d01b65303138303031026020820152906001600160a01b03163314610ecf57604051600160e51b62461bcd02815260206004820181815283516024840152835190928392604490910191908501908083836000831561084757818101518382015260200161082f565b50600054600160a01b900460ff1615610ee757600080fd5b6000818152600b602052604090205460ff161515600114610f0757600080fd5b6000818152600b60205260409020805460ff19169055610f268161126a565b50565b6000805483908390600160a01b900460ff1615610f4557600080fd5b610f4e856113a2565b6000858152600a6020526040808220805490839055905190916001600160a01b0387169188917f7b63482061dff09283b6f74fe6316412dc2ecd1c506db6fd2e71587441de4a7891a395945050505050565b6007602052816000526040600020818154811061053857fe5b6000546040805180820190915260068152600160d01b65303138303031026020820152906001600160a01b0316331461103657604051600160e51b62461bcd02815260206004820181815283516024840152835190928392604490910191908501908083836000831561084757818101518382015260200161082f565b50600054600160a01b900460ff161561104e57600080fd5b60048190556040805182815290517f669d541b4334ab609b45df5fd2166d3307e17d6a4480a7b898b53d5d2944a4519181900360200190a150565b6000546040805180820190915260068152600160d01b65303138303031026020820152906001600160a01b0316331461110657604051600160e51b62461bcd02815260206004820181815283516024840152835190928392604490910191908501908083836000831561084757818101518382015260200161082f565b506040805180820190915260068152600160d11b6518189c1818190260208201526001600160a01b03821661117f57604051600160e51b62461bcd02815260206004820181815283516024840152835190928392604490910191908501908083836000831561084757818101518382015260200161082f565b50600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b600a6020526000908152604090205481565b6040805180820190915260068152600160d01b65303038303031026020820152828201908382101561126357604051600160e51b62461bcd02815260206004820181815283516024840152835190928392604490910191908501908083836000831561084757818101518382015260200161082f565b5092915050565b60008181526009602090815260408083205460068352818420548185526005909352922054600019018082146113005760008381526005602052604081208054839081106112b457fe5b90600052602060002001549050806005600086815260200190815260200160002084815481106112e057fe5b600091825260208083209091019290925591825260069052604090208290555b600083815260056020526040902080549061131f90600019830161152d565b50600084815260066020908152604080832083905560098252808320839055600c9091528120906113508282611556565b506000600182018190556002820180546001600160a01b0319169055600390910181905560405185917f76cbc15b6b19cc4b9fe30092856bf54574239555e9f1b1b96647b2dccd23b4d891a250505050565b60008181526009602090815260408083205460088352818420548185526007909352922054600019018082146114385760008381526007602052604081208054839081106113ec57fe5b906000526020600020015490508060076000868152602001908152602001600020848154811061141857fe5b600091825260208083209091019290925591825260089052604090208290555b600083815260076020526040902080549061145790600019830161152d565b50600084815260086020908152604080832083905560098252808320839055600c9091528120906113508282611556565b60408051608081018252606080825260006020830181905292820183905281019190915290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106114f057805160ff191683800117855561151d565b8280016001018555821561151d579182015b8281111561151d578251825591602001919060010190611502565b50611529929150611596565b5090565b81548183558181111561155157600083815260209020611551918101908301611596565b505050565b50805460018160011615610100020316600290046000825580601f1061157c5750610f26565b601f016020900490600052602060002090810190610f2691905b6115b091905b80821115611529576000815560010161159c565b9056fea165627a7a723058209478b394e393c7a4e48002bb91d88028548e49a26cde03a8edfaaf534290b6fa0029000000000000000000000000512c1fcf401133680f373a386f3f752b98070bc50000000000000000000000003579669219dc20aa79e74eefd5fb2ecb0ce5fe0d
Deployed ByteCode
0x608060405234801561001057600080fd5b50600436106101425760003560e01c80638456cb59116100b8578063b215548e1161007c578063b215548e14610441578063c83ed88c1461045e578063df8edca01461048a578063e253981b146104ad578063f2fde38b146104ca578063f301af42146104f057610142565b80638456cb59146103be5780638da5cb5b146103c65780639d118770146103ea5780639f503b7514610407578063ac94e8131461042457610142565b80634d396a2a1161010a5780634d396a2a1461025257806350ace9c2146102775780635c975abb146102a35780636559e59a146102bf5780636d1884e0146102e55780637bf4c220146103a157610142565b80630185934b14610147578063042fe37b14610176578063078a5cfb14610199578063246cb2d51461022d5780633f4ba83a1461024a575b600080fd5b6101646004803603602081101561015d57600080fd5b503561050d565b60408051918252519081900360200190f35b6101646004803603604081101561018c57600080fd5b508035906020013561051f565b61022b600480360360c08110156101af57600080fd5b813591602081013591604082013591908101906080810160608201356401000000008111156101dd57600080fd5b8201836020820111156101ef57600080fd5b8035906020019184600183028401116401000000008311171561021157600080fd5b9193509150803590602001356001600160a01b031661054d565b005b6101646004803603602081101561024357600080fd5b50356107b6565b61022b6107c8565b61022b6004803603604081101561026857600080fd5b508035906020013515156108d2565b6101646004803603604081101561028d57600080fd5b50803590602001356001600160a01b031661095c565b6102ab610b37565b604080519115158252519081900360200190f35b61022b600480360360208110156102d557600080fd5b50356001600160a01b0316610b47565b610302600480360360208110156102fb57600080fd5b5035610be7565b6040518080602001858152602001846001600160a01b03166001600160a01b03168152602001838152602001828103825286818151815260200191508051906020019080838360005b8381101561036357818101518382015260200161034b565b50505050905090810190601f1680156103905780820380516001836020036101000a031916815260200191505b509550505050505060405180910390f35b610164600480360360208110156103b757600080fd5b5035610cdd565b61022b610cef565b6103ce610dc3565b604080516001600160a01b039092168252519081900360200190f35b61022b6004803603602081101561040057600080fd5b5035610dd2565b6101646004803603602081101561041d57600080fd5b5035610e2e565b6101646004803603602081101561043a57600080fd5b5035610e40565b61022b6004803603602081101561045757600080fd5b5035610e52565b6101646004803603604081101561047457600080fd5b50803590602001356001600160a01b0316610f29565b610164600480360360408110156104a057600080fd5b5080359060200135610fa0565b61022b600480360360208110156104c357600080fd5b5035610fb9565b61022b600480360360208110156104e057600080fd5b50356001600160a01b0316611089565b6101646004803603602081101561050657600080fd5b50356111db565b60086020526000908152604090205481565b6005602052816000526040600020818154811061053857fe5b90600052602060002001600091509150505481565b600054600160a01b900460ff161561056457600080fd5b60035460408051600160e11b632fd65c410281526004810189905290516000926001600160a01b031691635facb882916024808301926020929190829003018186803b1580156105b357600080fd5b505afa1580156105c7573d6000803e3d6000fd5b505050506040513d60208110156105dd57600080fd5b5051116105e957600080fd5b6000878152600c60205260409020600201546001600160a01b03161561060e57600080fd5b610616611488565b604051806080016040528086868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250602081018890526001600160a01b0384166040820152600454606090910190610689904263ffffffff6111ed16565b90526000898152600c6020908152604090912082518051939450849391926106b6928492909101906114af565b506020828101516001838101919091556040808501516002850180546001600160a01b0319166001600160a01b0392831617905560609586015160039095019490945560008c815260078452818120805493840180825590825284822084018f90558e82526008855282822093909355600984528181208d9055600a84528190208890558051938716928401929092528183529082018790529188918b918b917f22812011facd690a74ddd930726d2c051f0b7ef3d0ea35ad9b0f0d89849cb0f2918b918b918a919081908101858580828437600083820152604051601f909101601f1916909201829003965090945050505050a4505050505050505050565b60009081526007602052604090205490565b6000546040805180820190915260068152600160d01b65303138303031026020820152906001600160a01b0316331461088257604051600160e51b62461bcd0281526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561084757818101518382015260200161082f565b50505050905090810190601f1680156108745780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600054600160a01b900460ff1661089957600080fd5b60008054600160a01b60ff02191681556040517f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b339190a1565b6000548290600160a01b900460ff16156108eb57600080fd5b6000838152600860205260409020541561090457600080fd5b6000838152600b6020908152604091829020805460ff19168515159081179091558251908152915185927f5f9ec800eb8dc135e488f393491e324d4662a45bad8759259d6b70a7f3edabc292908290030190a2505050565b6000805483908390600160a01b900460ff161561097857600080fd5b6000858152600960209081526040808320546008835281842054818552600790935292205460001901808214610a0e5760008381526007602052604081208054839081106109c257fe5b90600052602060002001549050806007600086815260200190815260200160002084815481106109ee57fe5b600091825260208083209091019290925591825260089052604090208290555b6000838152600760205260409020805490610a2d90600019830161152d565b5060008881526008602090815260408083208390558583526005825280832080546001810180835591855283852081018d90558c8552600684528285205560028054600c90945282852001548251600160e01b6387159d9b028152600481018990526001600160a01b039182166024820152925191949316926387159d9b926044808201939182900301818387803b158015610ac857600080fd5b505af1158015610adc573d6000803e3d6000fd5b50505060008a8152600a602052604080822080549083905590519092506001600160a01b038b16918c917f801d564d3920ab7f9d83def865765f310bf8d043086d5ba3e544bd6f2073ad8c9190a39998505050505050505050565b600054600160a01b900460ff1681565b6000546040805180820190915260068152600160d01b65303138303031026020820152906001600160a01b03163314610bc457604051600160e51b62461bcd02815260206004820181815283516024840152835190928392604490910191908501908083836000831561084757818101518382015260200161082f565b50600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000818152600c602052604081206002015460609190819081906001600160a01b0316610c1357600080fd5b6000858152600c60209081526040918290206001808201546002808401546003850154855488516101009682161596909602600019011692909204601f8101879004870285018701909752868452939591946001600160a01b03909416939092918691830182828015610cc75780601f10610c9c57610100808354040283529160200191610cc7565b820191906000526020600020905b815481529060010190602001808311610caa57829003601f168201915b5050505050935093509350935093509193509193565b60009081526005602052604090205490565b6000546040805180820190915260068152600160d01b65303138303031026020820152906001600160a01b03163314610d6c57604051600160e51b62461bcd02815260206004820181815283516024840152835190928392604490910191908501908083836000831561084757818101518382015260200161082f565b50600054600160a01b900460ff1615610d8457600080fd5b60008054600160a01b60ff021916600160a01b1781556040517f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff6259190a1565b6000546001600160a01b031681565b6000548190600160a01b900460ff1615610deb57600080fd5b6000828152600c60205260409020600301544210610e0857600080fd5b60008281526008602052604090205415610e2157600080fd5b610e2a8261126a565b5050565b60096020526000908152604090205481565b60066020526000908152604090205481565b6000546040805180820190915260068152600160d01b65303138303031026020820152906001600160a01b03163314610ecf57604051600160e51b62461bcd02815260206004820181815283516024840152835190928392604490910191908501908083836000831561084757818101518382015260200161082f565b50600054600160a01b900460ff1615610ee757600080fd5b6000818152600b602052604090205460ff161515600114610f0757600080fd5b6000818152600b60205260409020805460ff19169055610f268161126a565b50565b6000805483908390600160a01b900460ff1615610f4557600080fd5b610f4e856113a2565b6000858152600a6020526040808220805490839055905190916001600160a01b0387169188917f7b63482061dff09283b6f74fe6316412dc2ecd1c506db6fd2e71587441de4a7891a395945050505050565b6007602052816000526040600020818154811061053857fe5b6000546040805180820190915260068152600160d01b65303138303031026020820152906001600160a01b0316331461103657604051600160e51b62461bcd02815260206004820181815283516024840152835190928392604490910191908501908083836000831561084757818101518382015260200161082f565b50600054600160a01b900460ff161561104e57600080fd5b60048190556040805182815290517f669d541b4334ab609b45df5fd2166d3307e17d6a4480a7b898b53d5d2944a4519181900360200190a150565b6000546040805180820190915260068152600160d01b65303138303031026020820152906001600160a01b0316331461110657604051600160e51b62461bcd02815260206004820181815283516024840152835190928392604490910191908501908083836000831561084757818101518382015260200161082f565b506040805180820190915260068152600160d11b6518189c1818190260208201526001600160a01b03821661117f57604051600160e51b62461bcd02815260206004820181815283516024840152835190928392604490910191908501908083836000831561084757818101518382015260200161082f565b50600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b600a6020526000908152604090205481565b6040805180820190915260068152600160d01b65303038303031026020820152828201908382101561126357604051600160e51b62461bcd02815260206004820181815283516024840152835190928392604490910191908501908083836000831561084757818101518382015260200161082f565b5092915050565b60008181526009602090815260408083205460068352818420548185526005909352922054600019018082146113005760008381526005602052604081208054839081106112b457fe5b90600052602060002001549050806005600086815260200190815260200160002084815481106112e057fe5b600091825260208083209091019290925591825260069052604090208290555b600083815260056020526040902080549061131f90600019830161152d565b50600084815260066020908152604080832083905560098252808320839055600c9091528120906113508282611556565b506000600182018190556002820180546001600160a01b0319169055600390910181905560405185917f76cbc15b6b19cc4b9fe30092856bf54574239555e9f1b1b96647b2dccd23b4d891a250505050565b60008181526009602090815260408083205460088352818420548185526007909352922054600019018082146114385760008381526007602052604081208054839081106113ec57fe5b906000526020600020015490508060076000868152602001908152602001600020848154811061141857fe5b600091825260208083209091019290925591825260089052604090208290555b600083815260076020526040902080549061145790600019830161152d565b50600084815260086020908152604080832083905560098252808320839055600c9091528120906113508282611556565b60408051608081018252606080825260006020830181905292820183905281019190915290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106114f057805160ff191683800117855561151d565b8280016001018555821561151d579182015b8281111561151d578251825591602001919060010190611502565b50611529929150611596565b5090565b81548183558181111561155157600083815260209020611551918101908301611596565b505050565b50805460018160011615610100020316600290046000825580601f1061157c5750610f26565b601f016020900490600052602060002090810190610f2691905b6115b091905b80821115611529576000815560010161159c565b9056fea165627a7a723058209478b394e393c7a4e48002bb91d88028548e49a26cde03a8edfaaf534290b6fa0029