More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 157 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Transfer | 11823972 | 1876 days ago | IN | 0 ETH | 0.01001052 | ||||
| Transfer | 9974170 | 2161 days ago | IN | 0 ETH | 0.00066228 | ||||
| Transfer | 9974145 | 2161 days ago | IN | 0 ETH | 0.00210953 | ||||
| Transfer | 9974060 | 2161 days ago | IN | 0 ETH | 0.00066228 | ||||
| Transfer | 9974048 | 2161 days ago | IN | 0 ETH | 0.00416909 | ||||
| Transfer | 9943237 | 2166 days ago | IN | 0 ETH | 0.00066228 | ||||
| Transfer | 9943221 | 2166 days ago | IN | 0 ETH | 0.00064785 | ||||
| Transfer | 9931269 | 2168 days ago | IN | 0 ETH | 0.00066192 | ||||
| Transfer | 9931262 | 2168 days ago | IN | 0 ETH | 0.00011119 | ||||
| Transfer | 9923925 | 2169 days ago | IN | 0 ETH | 0.00066192 | ||||
| Transfer | 9923901 | 2169 days ago | IN | 0 ETH | 0.00104887 | ||||
| Transfer | 9724437 | 2199 days ago | IN | 0 ETH | 0.00015619 | ||||
| Transfer | 9710116 | 2202 days ago | IN | 0 ETH | 0.00010412 | ||||
| Transfer | 9698191 | 2204 days ago | IN | 0 ETH | 0.00040139 | ||||
| Transfer | 9688270 | 2205 days ago | IN | 0 ETH | 0.0011032 | ||||
| Transfer | 9688238 | 2205 days ago | IN | 0 ETH | 0.00285067 | ||||
| Transfer | 9662413 | 2209 days ago | IN | 0 ETH | 0.00121352 | ||||
| Transfer | 9660335 | 2209 days ago | IN | 0 ETH | 0.01904557 | ||||
| Transfer | 9632697 | 2214 days ago | IN | 0 ETH | 0.00005206 | ||||
| Transfer | 9571087 | 2223 days ago | IN | 0 ETH | 0.00046334 | ||||
| Transfer | 9571072 | 2223 days ago | IN | 0 ETH | 0.00086959 | ||||
| Transfer | 9568247 | 2224 days ago | IN | 0 ETH | 0.00046334 | ||||
| Transfer | 9568228 | 2224 days ago | IN | 0 ETH | 0.00095562 | ||||
| Transfer | 9407446 | 2248 days ago | IN | 0 ETH | 0.00109334 | ||||
| Transfer | 9404270 | 2249 days ago | IN | 0 ETH | 0.00109334 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
xEuro
Compiler Version
v0.5.7+commit.6da8b019
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2019-04-29
*/
pragma solidity 0.5.7;
/*
* xEuro.sol
* xEUR tokens smart contract
* implements [ERC-20 Token Standard](https://eips.ethereum.org/EIPS/eip-20)
* ver. 1.0.7
* 2019-04-29
* https://xeuro.online
* address: https://etherscan.io/address/0xe577e0B200d00eBdecbFc1cd3F7E8E04C70476BE
* deployed on block: 7660532
* solc version : 0.5.7+commit.6da8b019
**/
/**
* @title SafeMath
* @dev Unsigned math operations with safety checks that revert on error
*/
library SafeMath {
/**
* @dev Multiplies two unsigned integers, reverts on overflow.
*/
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-solidity/pull/522
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b);
return c;
}
/**
* @dev Integer division of two unsigned integers truncating the quotient, reverts on division by zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
// Solidity only automatically asserts when dividing by 0
require(b > 0);
uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
}
/**
* @dev Subtracts two unsigned integers, reverts on overflow (i.e. if subtrahend is greater than minuend).
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
require(b <= a);
uint256 c = a - b;
return c;
}
/**
* @dev Adds two unsigned integers, reverts on overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a);
return c;
}
/**
* @dev Divides two unsigned integers and returns the remainder (unsigned integer modulo),
* reverts when dividing by zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
require(b != 0);
return a % b;
}
}
/**
* ERC-677
* see: https://github.com/ethereum/EIPs/issues/677
* Allow tokens to be transferred to contracts and have the contract trigger logic for how to respond to receiving
* the tokens within a single transaction.
*/
contract TokenRecipient {
function onTokenTransfer(address _from, uint256 _value, bytes calldata _extraData) external returns (bool);
// function tokenFallback(address _from, uint256 _value, bytes calldata _extraData) external returns (bool);
}
/**
* see: https://www.cryptonomica.net/#!/verifyEthAddress/
* in our smart contract every new admin should have a verified identity on cryptonomica.net
*/
contract CryptonomicaVerification {
// returns 0 if verification is not revoked
function revokedOn(address _address) external view returns (uint unixTime);
function keyCertificateValidUntil(address _address) external view returns (uint unixTime);
}
contract xEuro {
/**
* see: https://github.com/OpenZeppelin/openzeppelin-solidity/blob/master/contracts/token/ERC20/BasicToken.sol
*/
using SafeMath for uint256;
CryptonomicaVerification public cryptonomicaVerification;
/* --- ERC-20 variables ----- */
/**
* https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20-token-standard.md#name
* function name() constant returns (string name)
*/
string public constant name = "xEuro";
/**
* https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20-token-standard.md#symbol
* function symbol() constant returns (string symbol)
*/
string public constant symbol = "xEUR";
/**
* https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20-token-standard.md#decimals
* function decimals() constant returns (uint8 decimals)
*/
uint8 public constant decimals = 0; // 1 token = €1, no smaller unit
/**
* https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20-token-standard.md#totalsupply
* function totalSupply() constant returns (uint256 totalSupply)
* we start with zero
*/
uint256 public totalSupply = 0;
// https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20-token-standard.md#balanceof
// function balanceOf(address _owner) constant returns (uint256 balance)
mapping(address => uint256) public balanceOf;
/**
* https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20-token-standard.md#allowance
* function allowance(address _owner, address _spender) constant returns (uint256 remaining)
*/
mapping(address => mapping(address => uint256)) public allowance;
/* --- administrative variables */
/**
* addresses that are admins in this smart contracts
* admin can assign and revoke authority to perform functions (mint, burn, transfer) in this contract
* for other addresses and for himself
*/
mapping(address => bool) public isAdmin;
/**
* addresses that can mint tokens
*/
mapping(address => bool) public canMint;
/**
* addresses allowed to transfer tokens from contract's own address to another address
* for example after tokens were minted, they can be transferred to user
* (tokenholder of new (fresh minted) tokens is always this smart contract itself)
*/
mapping(address => bool) public canTransferFromContract;
/**
* addresses allowed to burn tokens
* tokens can burned only if their tokenholder is smart contract itself
* nobody can burn tokens owned by user
*/
mapping(address => bool) public canBurn;
/* --- ERC-20 events */
// https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20-token-standard.md#events
/**
* https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20-token-standard.md#transfer-1
*/
event Transfer(address indexed _from, address indexed _to, uint256 _value);
/**
* https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20-token-standard.md#approval
*/
event Approval(address indexed _owner, address indexed _spender, uint256 _value);
/**
* event we fire when data are sent from this smart contract to other smart contract
* @param _from will be msg.sender
* @param _toContract address of smart contract information is sent to
* @param _extraData any data that msg.sender sends to another smart contract
*/
event DataSentToAnotherContract(address indexed _from, address indexed _toContract, bytes _extraData);
/* --- ERC-20 Functions */
// https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20-token-standard.md#methods
/*
* https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20-token-standard.md#approve
* there is and attack:
* https://github.com/CORIONplatform/solidity/issues/6,
* https://drive.google.com/file/d/0ByMtMw2hul0EN3NCaVFHSFdxRzA/view
* but this function is required by ERC-20:
* To prevent attack vectors like the one described on https://docs.google.com/document/d/1YLPtQxZu1UAvO9cZ1O2RPXBbT0mooh4DYKjA_jp-RLM/
* and discussed on https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 ,
* clients SHOULD make sure to create user interfaces in such a way that they set the allowance first to 0 before
* setting it to another value for the same spender.
* THOUGH The contract itself shouldn’t enforce it, to allow backwards compatibility with contracts deployed before
*
* @param _spender The address which will spend the funds.
* @param _value The amount of tokens to be spent.
*/
function approve(address _spender, uint256 _value) public returns (bool success){
allowance[msg.sender][_spender] = _value;
emit Approval(msg.sender, _spender, _value);
return true;
}
/**
* Overloaded (see https://solidity.readthedocs.io/en/v0.5.7/contracts.html#function-overloading) approve function
* see https://docs.google.com/document/d/1YLPtQxZu1UAvO9cZ1O2RPXBbT0mooh4DYKjA_jp-RLM/
*/
function approve(address _spender, uint256 _currentValue, uint256 _value) external returns (bool success){
require(allowance[msg.sender][_spender] == _currentValue);
return approve(_spender, _value);
}
/**
* https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20-token-standard.md#transfer
*/
function transfer(address _to, uint256 _value) public returns (bool success){
return transferFrom(msg.sender, _to, _value);
}
/**
* https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20-token-standard.md#transferfrom
*/
function transferFrom(address _from, address _to, uint256 _value) public returns (bool success){
// Transfers of 0 values MUST be treated as normal transfers and fire the Transfer event (ERC-20)
// Variables of uint type cannot be negative. Thus, comparing uint variable with zero (greater than or equal) is redundant
// require(_value >= 0);
require(_to != address(0));
// The function SHOULD throw unless the _from account has deliberately authorized the sender of the message via some mechanism
require(
msg.sender == _from
|| _value <= allowance[_from][msg.sender]
|| (_from == address(this) && canTransferFromContract[msg.sender]),
"Sender not authorized");
// check if _from account have required amount
require(_value <= balanceOf[_from], "Account doesn't have required amount");
if (_to == address(this)) {// tokens sent to smart contract itself (for exchange to fiat)
// (!) only token holder can send tokens to smart contract address to get fiat, not using allowance
require(_from == msg.sender, "Only token holder can do this");
require(_value >= minExchangeAmount, "Value is less than min. exchange amount");
// this event used by our bot to monitor tokens that have to be burned and to make a fiat payment
// bot also verifies this information checking 'tokensInTransfer' mapping, which contains the same data
tokensInEventsCounter++;
emit TokensIn(
_from,
_value,
tokensInEventsCounter
);
// here we write information about this transfer
// (the same as in event, but stored in contract variable and with timestamp)
tokensInTransfer[tokensInEventsCounter].from = _from;
tokensInTransfer[tokensInEventsCounter].value = _value;
// timestamp:
tokensInTransfer[tokensInEventsCounter].receivedOn = now;
}
balanceOf[_from] = balanceOf[_from].sub(_value);
balanceOf[_to] = balanceOf[_to].add(_value);
// If allowance used, change allowances correspondingly
if (_from != msg.sender && _from != address(this)) {
allowance[_from][msg.sender] = allowance[_from][msg.sender].sub(_value);
}
emit Transfer(_from, _to, _value);
return true;
}
/* ---------- Interaction with other contracts */
/**
* ERC-677
* https://github.com/ethereum/EIPs/issues/677
* transfer tokens with additional info to another smart contract, and calls its correspondent function
* @param _to - another smart contract address
* @param _value - number of tokens
* @param _extraData - data to send to another contract
* this is a recommended method to send tokens to smart contracts
*/
function transferAndCall(address _to, uint256 _value, bytes memory _extraData) public returns (bool success){
TokenRecipient receiver = TokenRecipient(_to);
if (transferFrom(msg.sender, _to, _value)) {
// if (receiver.tokenFallback(msg.sender, _value, _extraData)) {
if (receiver.onTokenTransfer(msg.sender, _value, _extraData)) {
emit DataSentToAnotherContract(msg.sender, _to, _extraData);
return true;
}
}
return false;
}
/**
* the same as above ('transferAndCall'), but for all tokens on user account
* for example for converting ALL tokens of user account to another tokens
*/
function transferAllAndCall(address _to, bytes calldata _extraData) external returns (bool){
return transferAndCall(_to, balanceOf[msg.sender], _extraData);
}
/* --- Administrative functions */
/**
* @param from old address
* @param to new address
* @param by who made a change
*/
event CryptonomicaArbitrationContractAddressChanged(address from, address to, address indexed by);
/*
* @param _newAddress address of new contract to be used to verify identity of new admins
*/
function changeCryptonomicaVerificationContractAddress(address _newAddress) public returns (bool success) {
require(isAdmin[msg.sender], "Only admin can do that");
emit CryptonomicaArbitrationContractAddressChanged(address(cryptonomicaVerification), _newAddress, msg.sender);
cryptonomicaVerification = CryptonomicaVerification(_newAddress);
return true;
}
/**
* @param by who added new admin
* @param newAdmin address of new admin
*/
event AdminAdded(address indexed by, address indexed newAdmin);
function addAdmin(address _newAdmin) public returns (bool success){
require(isAdmin[msg.sender], "Only admin can do that");
require(_newAdmin != address(0), "Address can not be zero-address");
require(cryptonomicaVerification.keyCertificateValidUntil(_newAdmin) > now, "New admin has to be verified on Cryptonomica.net");
// revokedOn returns uint256 (unix time), it's 0 if verification is not revoked
require(cryptonomicaVerification.revokedOn(_newAdmin) == 0, "Verification for this address was revoked, can not add");
isAdmin[_newAdmin] = true;
emit AdminAdded(msg.sender, _newAdmin);
return true;
}
/**
* @param by an address who removed admin
* @param _oldAdmin address of the admin removed
*/
event AdminRemoved(address indexed by, address indexed _oldAdmin);
/**
* @param _oldAdmin address to be removed from admins
*/
function removeAdmin(address _oldAdmin) external returns (bool success){
require(isAdmin[msg.sender], "Only admin can do that");
// prevents from deleting the last admin (can be multisig smart contract) by itself:
require(msg.sender != _oldAdmin, "Admin can't remove himself");
isAdmin[_oldAdmin] = false;
emit AdminRemoved(msg.sender, _oldAdmin);
return true;
}
/**
* minimum amount of tokens than can be exchanged to fiat
* can be changed by admin
*/
uint256 public minExchangeAmount;
/**
* @param by address who made a change
* @param from value before the change
* @param to value after the change
*/
event MinExchangeAmountChanged (address indexed by, uint256 from, uint256 to);
/**
* @param _minExchangeAmount new value of minimum amount of tokens that can be exchanged to fiat
* only admin can make this change
*/
function changeMinExchangeAmount(uint256 _minExchangeAmount) public returns (bool success){
require(isAdmin[msg.sender], "Only admin can do that");
uint256 from = minExchangeAmount;
minExchangeAmount = _minExchangeAmount;
emit MinExchangeAmountChanged(msg.sender, from, minExchangeAmount);
return true;
}
/**
* @param by who add permission to mint (only admin can do this)
* @param newAddress address that was authorized to mint new tokens
*/
event AddressAddedToCanMint(address indexed by, address indexed newAddress);
/**
* Add permission to mint new tokens to address _newAddress
*/
function addToCanMint(address _newAddress) public returns (bool success){
require(isAdmin[msg.sender], "Only admin can do that");
require(_newAddress != address(0), "Address can not be zero-address");
canMint[_newAddress] = true;
emit AddressAddedToCanMint(msg.sender, _newAddress);
return true;
}
event AddressRemovedFromCanMint(address indexed by, address indexed removedAddress);
function removeFromCanMint(address _addressToRemove) external returns (bool success){
require(isAdmin[msg.sender], "Only admin can do that");
canMint[_addressToRemove] = false;
emit AddressRemovedFromCanMint(msg.sender, _addressToRemove);
return true;
}
/**
* @param by who add permission (should be admin)
* @param newAddress address that got permission
*/
event AddressAddedToCanTransferFromContract(address indexed by, address indexed newAddress);
function addToCanTransferFromContract(address _newAddress) public returns (bool success){
require(isAdmin[msg.sender], "Only admin can do that");
require(_newAddress != address(0), "Address can not be zero-address");
canTransferFromContract[_newAddress] = true;
emit AddressAddedToCanTransferFromContract(msg.sender, _newAddress);
return true;
}
event AddressRemovedFromCanTransferFromContract(address indexed by, address indexed removedAddress);
function removeFromCanTransferFromContract(address _addressToRemove) external returns (bool success){
require(isAdmin[msg.sender], "Only admin can do that");
canTransferFromContract[_addressToRemove] = false;
emit AddressRemovedFromCanTransferFromContract(msg.sender, _addressToRemove);
return true;
}
/**
* @param by who add permission (should be admin)
* @param newAddress address that got permission
*/
event AddressAddedToCanBurn(address indexed by, address indexed newAddress);
function addToCanBurn(address _newAddress) public returns (bool success){
require(isAdmin[msg.sender], "Only admin can do that");
require(_newAddress != address(0), "Address can not be zero-address");
canBurn[_newAddress] = true;
emit AddressAddedToCanBurn(msg.sender, _newAddress);
return true;
}
event AddressRemovedFromCanBurn(address indexed by, address indexed removedAddress);
function removeFromCanBurn(address _addressToRemove) external returns (bool success){
require(isAdmin[msg.sender], "Only admin can do that");
canBurn[_addressToRemove] = false;
emit AddressRemovedFromCanBurn(msg.sender, _addressToRemove);
return true;
}
/* ---------- Create and burn tokens */
/**
* number (id) for MintTokensEvent
*/
uint public mintTokensEventsCounter = 0;
/**
* struct used to write information about every transaction that mint new tokens (we call it 'MintTokensEvent')
* every 'MintTokensEvent' has its number/id (mintTokensEventsCounter)
*/
struct MintTokensEvent {
address mintedBy; // address that minted tokens (msg.sender)
uint256 fiatInPaymentId; // reference to fiat transfer (deposit)
uint value; // number of new tokens minted
uint on; // UnixTime
uint currentTotalSupply; // new value of totalSupply
}
/**
* keep all fiat tx ids, to prevent minting tokens twice (or more times) for the same fiat deposit
* @param uint256 reference (id) of fiat deposit
* @param bool if true tokens already were minted for this fiat deposit
* (see: require(!fiatInPaymentIds[fiatInPaymentId]); in function mintTokens
*/
mapping(uint256 => bool) public fiatInPaymentIds;
/**
* here we can find a MintTokensEvent by fiatInPaymentId (id of fiat deposit),
* so we now if tokens were minted for given incoming fiat payment (deposit), and if yes when and how many
* @param uint256 reference (id) of fiat deposit
*/
mapping(uint256 => MintTokensEvent) public fiatInPaymentsToMintTokensEvent;
/**
* here we store MintTokensEvent with its ordinal numbers/ids (mintTokensEventsCounter)
* @param uint256 > mintTokensEventsCounter
*/
mapping(uint256 => MintTokensEvent) public mintTokensEvent;
/**
* an event with the same information as in struct MintTokensEvent
*/
event TokensMinted(
address indexed by, // who minted new tokens
uint256 indexed fiatInPaymentId, // reference to fiat payment (deposit)
uint value, // number of new minted tokens
uint currentTotalSupply, // totalSupply value after new tokens were minted
uint indexed mintTokensEventsCounter //
);
/**
* tokens should be minted to contract own address, (!) after that tokens should be transferred using transferFrom
* @param value number of tokens to create
* @param fiatInPaymentId fiat payment (deposit) id
*/
function mintTokens(uint256 value, uint256 fiatInPaymentId) public returns (bool success){
require(canMint[msg.sender], "Sender not authorized");
// require that this fiatInPaymentId was not used before:
require(!fiatInPaymentIds[fiatInPaymentId], "This fiat payment id is already used");
// Variables of uint type cannot be negative. Thus, comparing uint variable with zero (greater than or equal) is redundant
// require(value >= 0);
// this is the moment when new tokens appear in the system
totalSupply = totalSupply.add(value);
// first token holder of fresh minted tokens always is the contract itself
// (than tokens have to be transferred from contract address to user address)
balanceOf[address(this)] = balanceOf[address(this)].add(value);
mintTokensEventsCounter++;
mintTokensEvent[mintTokensEventsCounter].mintedBy = msg.sender;
mintTokensEvent[mintTokensEventsCounter].fiatInPaymentId = fiatInPaymentId;
mintTokensEvent[mintTokensEventsCounter].value = value;
mintTokensEvent[mintTokensEventsCounter].on = block.timestamp;
mintTokensEvent[mintTokensEventsCounter].currentTotalSupply = totalSupply;
// fiatInPaymentId => struct mintTokensEvent
fiatInPaymentsToMintTokensEvent[fiatInPaymentId] = mintTokensEvent[mintTokensEventsCounter];
emit TokensMinted(msg.sender, fiatInPaymentId, value, totalSupply, mintTokensEventsCounter);
// mark fiatInPaymentId as used to mint tokens
fiatInPaymentIds[fiatInPaymentId] = true;
return true;
}
/**
* mint and transfer new tokens to user in one tx
* requires msg.sender to have both 'canMint' and 'canTransferFromContract' permissions
* @param _value number of new tokens to create (to mint)
* @param fiatInPaymentId id of fiat payment (deposit) received for new tokens
* @param _to receiver of new tokens
*/
function mintAndTransfer(uint256 _value, uint256 fiatInPaymentId, address _to) public returns (bool success){
if (mintTokens(_value, fiatInPaymentId) && transferFrom(address(this), _to, _value)) {
return true;
}
return false;
}
/* -- Exchange tokens to fiat (tokens sent to contract owns address > fiat payment) */
/**
* number for every 'event' when we receive tokens to contract own address for exchange to fiat
*/
uint public tokensInEventsCounter = 0;
/**
* @param from who sent tokens for exchange
* @param value number of tokens received for exchange
* @param receivedOn timestamp (UnixTime)
*/
struct TokensInTransfer {// <<< used in 'transfer'
address from; //
uint value; //
uint receivedOn; // unix time
}
/**
* @param uint256 < tokensInEventsCounter
*/
mapping(uint256 => TokensInTransfer) public tokensInTransfer;
/**
* @param from address that sent tokens for exchange to fiat
* @param value number of tokens received
* @param tokensInEventsCounter number of event
*/
event TokensIn(
address indexed from,
uint256 value,
uint256 indexed tokensInEventsCounter
);
/**
* we also count every every token burning
*/
uint public burnTokensEventsCounter = 0;//
/**
* @param by who burned tokens
* @param value number of tokens burned
* @param tokensInEventId corresponding id on tokensInEvent, after witch tokens were burned
* @param fiatOutPaymentId id of outgoing fiat payment to user
* @param burnedOn timestamp (unix time)
* @param currentTotalSupply totalSupply after tokens were burned
*/
struct burnTokensEvent {
address by; //
uint256 value; //
uint256 tokensInEventId;
uint256 fiatOutPaymentId;
uint256 burnedOn; // UnixTime
uint256 currentTotalSupply;
}
/**
* @param uint256 < burnTokensEventsCounter
*/
mapping(uint256 => burnTokensEvent) public burnTokensEvents;
/**
* we count every fiat payment id used when burn tokens to prevent using it twice
*/
mapping(uint256 => bool) public fiatOutPaymentIdsUsed; //
/**
* smart contract event with the same data as in struct burnTokensEvent
*/
event TokensBurned(
address indexed by,
uint256 value,
uint256 indexed tokensInEventId, // this is the same as uint256 indexed tokensInEventsCounter in event TokensIn
uint256 indexed fiatOutPaymentId,
uint burnedOn, // UnixTime
uint currentTotalSupply
);
/**
* (!) only contract's own tokens (balanceOf[this]) can be burned
* @param value number of tokens to burn
* @param tokensInEventId reference to tokensInEventsCounter value for incoming tokens event (tokensInEvent)
* @param fiatOutPaymentId id of outgoing fiat payment (from the bank)
*/
function burnTokens(
uint256 value,
uint256 tokensInEventId, // this is the same as uint256 indexed tokensInEventsCounter in event TokensIn
uint256 fiatOutPaymentId
) public returns (bool success){
// Variables of uint type cannot be negative. Thus, comparing uint variable with zero (greater than or equal) is redundant
// require(value >= 0);
require(canBurn[msg.sender], "Sender not authorized");
require(balanceOf[address(this)] >= value, "Account does not have required amount");
// require(!tokensInEventIdsUsed[tokensInEventId]);
require(!fiatOutPaymentIdsUsed[fiatOutPaymentId], "This fiat payment id is already used");
balanceOf[address(this)] = balanceOf[address(this)].sub(value);
totalSupply = totalSupply.sub(value);
burnTokensEventsCounter++;
burnTokensEvents[burnTokensEventsCounter].by = msg.sender;
burnTokensEvents[burnTokensEventsCounter].value = value;
burnTokensEvents[burnTokensEventsCounter].tokensInEventId = tokensInEventId;
burnTokensEvents[burnTokensEventsCounter].fiatOutPaymentId = fiatOutPaymentId;
burnTokensEvents[burnTokensEventsCounter].burnedOn = block.timestamp;
burnTokensEvents[burnTokensEventsCounter].currentTotalSupply = totalSupply;
emit TokensBurned(msg.sender, value, tokensInEventId, fiatOutPaymentId, block.timestamp, totalSupply);
fiatOutPaymentIdsUsed[fiatOutPaymentId] = true;
return true;
}
/* ---------- Constructor */
constructor() public {// Constructor must be public or internal
// initial admin:
isAdmin[msg.sender] = true;
addToCanMint(msg.sender);
addToCanTransferFromContract(msg.sender);
addToCanBurn(msg.sender);
changeCryptonomicaVerificationContractAddress(0x846942953c3b2A898F10DF1e32763A823bf6b27f);
addAdmin(0xD851d045d8Aee53EF24890afBa3d701163AcbC8B);
// to test main functions and events (can be removed in production, or can be not):
changeMinExchangeAmount(12);
mintAndTransfer(12, 0, msg.sender);
transfer(msg.sender, 12);
transfer(address(this), 12);
burnTokens(12, 1, 0);
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"constant":false,"inputs":[{"name":"_addressToRemove","type":"address"}],"name":"removeFromCanTransferFromContract","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"value","type":"uint256"},{"name":"tokensInEventId","type":"uint256"},{"name":"fiatOutPaymentId","type":"uint256"}],"name":"burnTokens","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_minExchangeAmount","type":"uint256"}],"name":"changeMinExchangeAmount","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"canTransferFromContract","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"burnTokensEventsCounter","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_oldAdmin","type":"address"}],"name":"removeAdmin","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"isAdmin","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newAddress","type":"address"}],"name":"addToCanTransferFromContract","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"value","type":"uint256"},{"name":"fiatInPaymentId","type":"uint256"}],"name":"mintTokens","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_addressToRemove","type":"address"}],"name":"removeFromCanBurn","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"cryptonomicaVerification","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"canBurn","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"mintTokensEvent","outputs":[{"name":"mintedBy","type":"address"},{"name":"fiatInPaymentId","type":"uint256"},{"name":"value","type":"uint256"},{"name":"on","type":"uint256"},{"name":"currentTotalSupply","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"},{"name":"_extraData","type":"bytes"}],"name":"transferAndCall","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_currentValue","type":"uint256"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"tokensInTransfer","outputs":[{"name":"from","type":"address"},{"name":"value","type":"uint256"},{"name":"receivedOn","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"minExchangeAmount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_value","type":"uint256"},{"name":"fiatInPaymentId","type":"uint256"},{"name":"_to","type":"address"}],"name":"mintAndTransfer","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newAdmin","type":"address"}],"name":"addAdmin","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_addressToRemove","type":"address"}],"name":"removeFromCanMint","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newAddress","type":"address"}],"name":"changeCryptonomicaVerificationContractAddress","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newAddress","type":"address"}],"name":"addToCanMint","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"mintTokensEventsCounter","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newAddress","type":"address"}],"name":"addToCanBurn","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"burnTokensEvents","outputs":[{"name":"by","type":"address"},{"name":"value","type":"uint256"},{"name":"tokensInEventId","type":"uint256"},{"name":"fiatOutPaymentId","type":"uint256"},{"name":"burnedOn","type":"uint256"},{"name":"currentTotalSupply","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tokensInEventsCounter","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"canMint","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"fiatOutPaymentIdsUsed","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"fiatInPaymentIds","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_extraData","type":"bytes"}],"name":"transferAllAndCall","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"fiatInPaymentsToMintTokensEvent","outputs":[{"name":"mintedBy","type":"address"},{"name":"fiatInPaymentId","type":"uint256"},{"name":"value","type":"uint256"},{"name":"on","type":"uint256"},{"name":"currentTotalSupply","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":true,"name":"_to","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_spender","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":true,"name":"_toContract","type":"address"},{"indexed":false,"name":"_extraData","type":"bytes"}],"name":"DataSentToAnotherContract","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"from","type":"address"},{"indexed":false,"name":"to","type":"address"},{"indexed":true,"name":"by","type":"address"}],"name":"CryptonomicaArbitrationContractAddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"by","type":"address"},{"indexed":true,"name":"newAdmin","type":"address"}],"name":"AdminAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"by","type":"address"},{"indexed":true,"name":"_oldAdmin","type":"address"}],"name":"AdminRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"by","type":"address"},{"indexed":false,"name":"from","type":"uint256"},{"indexed":false,"name":"to","type":"uint256"}],"name":"MinExchangeAmountChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"by","type":"address"},{"indexed":true,"name":"newAddress","type":"address"}],"name":"AddressAddedToCanMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"by","type":"address"},{"indexed":true,"name":"removedAddress","type":"address"}],"name":"AddressRemovedFromCanMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"by","type":"address"},{"indexed":true,"name":"newAddress","type":"address"}],"name":"AddressAddedToCanTransferFromContract","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"by","type":"address"},{"indexed":true,"name":"removedAddress","type":"address"}],"name":"AddressRemovedFromCanTransferFromContract","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"by","type":"address"},{"indexed":true,"name":"newAddress","type":"address"}],"name":"AddressAddedToCanBurn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"by","type":"address"},{"indexed":true,"name":"removedAddress","type":"address"}],"name":"AddressRemovedFromCanBurn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"by","type":"address"},{"indexed":true,"name":"fiatInPaymentId","type":"uint256"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":false,"name":"currentTotalSupply","type":"uint256"},{"indexed":true,"name":"mintTokensEventsCounter","type":"uint256"}],"name":"TokensMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":true,"name":"tokensInEventsCounter","type":"uint256"}],"name":"TokensIn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"by","type":"address"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":true,"name":"tokensInEventId","type":"uint256"},{"indexed":true,"name":"fiatOutPaymentId","type":"uint256"},{"indexed":false,"name":"burnedOn","type":"uint256"},{"indexed":false,"name":"currentTotalSupply","type":"uint256"}],"name":"TokensBurned","type":"event"}]Contract Creation Code
6080604052600060015560006009556000600d556000600f553480156200002557600080fd5b50336000818152600460209081526040909120805460ff1916600117905562000053919062000132811b901c565b5062000065336200025760201b60201c565b5062000077336200037c60201b60201c565b506200009d73846942953c3b2a898f10df1e32763a823bf6b27f620004a160201b60201c565b50620000c373d851d045d8aee53ef24890afba3d701163acbc8b6200057d60201b60201c565b50620000d6600c6200087f60201b60201c565b50620000ec600c6000336200093860201b60201c565b506200010033600c6200098160201b60201c565b506200011430600c6200098160201b60201c565b506200012b600c600160006200099660201b60201c565b50620012dc565b3360009081526004602052604081205460ff16620001a057604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260166024820152600080516020620034f5833981519152604482015290519081900360640190fd5b6001600160a01b0382166200020557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f6024820152600080516020620035a2833981519152604482015290519081900360640190fd5b6001600160a01b038216600081815260056020526040808220805460ff191660011790555133917fdac4748568425c8dfc8706e3c3eb5191272f7d331ecec6c4e5e6bd0efc0b75bd91a3506001919050565b3360009081526004602052604081205460ff16620002c557604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260166024820152600080516020620034f5833981519152604482015290519081900360640190fd5b6001600160a01b0382166200032a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f6024820152600080516020620035a2833981519152604482015290519081900360640190fd5b6001600160a01b038216600081815260066020526040808220805460ff191660011790555133917f0a3824f403289d915446d591615857435fbf94fa18a273bf37f75ebecbde650c91a3506001919050565b3360009081526004602052604081205460ff16620003ea57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260166024820152600080516020620034f5833981519152604482015290519081900360640190fd5b6001600160a01b0382166200044f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f6024820152600080516020620035a2833981519152604482015290519081900360640190fd5b6001600160a01b038216600081815260076020526040808220805460ff191660011790555133917f0839a19aaf317047bdfffbd8e7dd2055c38842f33268dbc18016460178e17c2191a3506001919050565b3360009081526004602052604081205460ff166200050f57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260166024820152600080516020620034f5833981519152604482015290519081900360640190fd5b600054604080516001600160a01b0392831681529184166020830152805133927fdeee135e9ab3644341d22e8715d2d21eef558921ca6eb86764de7125302f200f92908290030190a250600080546001600160a01b0383166001600160a01b03199091161790556001919050565b3360009081526004602052604081205460ff16620005eb57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260166024820152600080516020620034f5833981519152604482015290519081900360640190fd5b6001600160a01b0382166200065057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f6024820152600080516020620035a2833981519152604482015290519081900360640190fd5b600054604080517f5b3d0bc10000000000000000000000000000000000000000000000000000000081526001600160a01b038581166004830152915142939290921691635b3d0bc191602480820192602092909190829003018186803b158015620006ba57600080fd5b505afa158015620006cf573d6000803e3d6000fd5b505050506040513d6020811015620006e657600080fd5b50511162000740576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526030815260200180620035156030913960400191505060405180910390fd5b600054604080517f836afead0000000000000000000000000000000000000000000000000000000081526001600160a01b0385811660048301529151919092169163836afead916024808301926020929190829003018186803b158015620007a757600080fd5b505afa158015620007bc573d6000803e3d6000fd5b505050506040513d6020811015620007d357600080fd5b5051156200082d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806200356c6036913960400191505060405180910390fd5b6001600160a01b038216600081815260046020526040808220805460ff191660011790555133917fbf3f493c772c8c283fd124432c2d0f539ab343faa04258fe88e52912d36b102b91a3506001919050565b3360009081526004602052604081205460ff16620008ed57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260166024820152600080516020620034f5833981519152604482015290519081900360640190fd5b60088054908390556040805182815260208101859052815133927f647ea6b9c0886d71b598c86e2dea5324cecd56394fb1c54c794462e31abd4b17928290030190a250600192915050565b60006200094c848462000c2260201b60201c565b80156200096757506200096730838662000e7960201b60201c565b1562000976575060016200097a565b5060005b9392505050565b60006200097a33848462000e7960201b60201c565b3360009081526007602052604081205460ff1662000a1557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f53656e646572206e6f7420617574686f72697a65640000000000000000000000604482015290519081900360640190fd5b3060009081526002602052604090205484111562000a7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180620034d06025913960400191505060405180910390fd5b60008281526011602052604090205460ff161562000ae9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180620034ac6024913960400191505060405180910390fd5b3060009081526002602090815260409091205462000b129186906200200f620012b3821b17901c565b3060009081526002602090815260409091209190915560015462000b419186906200200f620012b3821b17901c565b6001908155600f80548201808255600090815260106020908152604080832080546001600160a01b031916339081179091558454845281842086018a9055845484528184206002018990558454845281842060030188905584548452818420426004909101819055955494548452928190206005018490558051898152918201949094528084019290925291518492869290917f535315e7d1c7278469a90807aa28576a16d9dda00727fca7937f7ebc658a11fc9181900360600190a4506000818152601160205260409020805460ff191660019081179091559392505050565b3360009081526005602052604081205460ff1662000ca157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f53656e646572206e6f7420617574686f72697a65640000000000000000000000604482015290519081900360640190fd5b6000828152600a602052604090205460ff161562000d0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180620034ac6024913960400191505060405180910390fd5b62000d2783600154620012c960201b620020241790919060201c565b6001553060009081526002602090815260409091205462000d5391859062002024620012c9821b17901c565b306000908152600260208181526040808420949094556009805460019081018083558552600c83528585208054336001600160a01b031991821681179092558354875287872083018a90558354875287872086018b90558354875287872042600391820155835485548952898920600490810191909155855489528989208c8a52600b8852988a9020895481546001600160a01b0390911694169390931783558885015483860155888801549783019790975587810154908201559585015495909401949094555492548451888152918201528351929386937f3446268fc8181c87ca8580504fff9cf33b6de9c160e4989ae91343e75ff741609281900390910190a4506000818152600a60205260409020805460ff1916600190811790915592915050565b60006001600160a01b03831662000e8f57600080fd5b336001600160a01b038516148062000eca57506001600160a01b03841660009081526003602090815260408083203384529091529020548211155b8062000ef957506001600160a01b0384163014801562000ef957503360009081526006602052604090205460ff165b62000f6557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f53656e646572206e6f7420617574686f72697a65640000000000000000000000604482015290519081900360640190fd5b6001600160a01b03841660009081526002602052604090205482111562000fd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180620034886024913960400191505060405180910390fd5b6001600160a01b0383163014156200114f576001600160a01b03841633146200106257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4f6e6c7920746f6b656e20686f6c6465722063616e20646f2074686973000000604482015290519081900360640190fd5b600854821015620010bf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180620035456027913960400191505060405180910390fd5b600d8054600101908190556040805184815290516001600160a01b038716917f9f2fe8c128eb2cf4c04e739244f557be16604328557233a7a2a6c1fbf1cf8c4a919081900360200190a3600d80546000908152600e602052604080822080546001600160a01b0319166001600160a01b038916179055825482528082206001018590559154815220426002909101555b6001600160a01b038416600090815260026020908152604090912054620011819184906200200f620012b3821b17901c565b6001600160a01b0380861660009081526002602090815260408083209490945591861681529190912054620011c191849062002024620012c9821b17901c565b6001600160a01b0380851660009081526002602052604090209190915584163314801590620011f957506001600160a01b0384163014155b156200125e576001600160a01b0384166000908152600360209081526040808320338452825290912054620012399184906200200f620012b3821b17901c565b6001600160a01b03851660009081526003602090815260408083203384529091529020555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a35060019392505050565b600082821115620012c357600080fd5b50900390565b6000828201838110156200097a57600080fd5b61219c80620012ec6000396000f3fe608060405234801561001057600080fd5b50600436106102485760003560e01c8063439e6e091161013b57806395d89b41116100b8578063c3250df21161007c578063c3250df21461087d578063c9d599491461089a578063d87692d9146108b7578063dc78ab8e14610937578063dd62ed3e1461095457610248565b806395d89b41146107c1578063a9059cbb146107c9578063b3dc174e146107f5578063b82dfbcb1461084f578063c2ba47441461085757610248565b806370a08231116100ff57806370a08231146107215780637b56afa7146107475780637c390bd81461076d57806390136322146107935780639484d4a21461079b57610248565b8063439e6e0914610656578063551f59c91461069b57806366e02dda146106a357806370480275146106d557806370532b44146106fb57610248565b806324d7806c116101c957806336953c161161018d57806336953c16146104cd5780633820a686146104f157806339a7412b146105175780634000aea014610569578063426a84931461062457610248565b806324d7806c1461041a5780632b5e071a14610440578063313ce5671461046657806334a7c2e71461048457806335e80056146104a757610248565b806312b8b3241161021057806312b8b3241461037657806315a74a991461039c5780631785f53c146103b657806318160ddd146103dc57806323b872dd146103e457610248565b80630143faba1461024d57806304681a281461028757806306fdde03146102b0578063095ea7b31461032d5780630e5d127d14610359575b600080fd5b6102736004803603602081101561026357600080fd5b50356001600160a01b0316610982565b604080519115158252519081900360200190f35b6102736004803603606081101561029d57600080fd5b5080359060208101359060400135610a26565b6102b8610c4f565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102f25781810151838201526020016102da565b50505050905090810190601f16801561031f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102736004803603604081101561034357600080fd5b506001600160a01b038135169060200135610c73565b6102736004803603602081101561036f57600080fd5b5035610cd9565b6102736004803603602081101561038c57600080fd5b50356001600160a01b0316610d79565b6103a4610d8e565b60408051918252519081900360200190f35b610273600480360360208110156103cc57600080fd5b50356001600160a01b0316610d94565b6103a4610e99565b610273600480360360608110156103fa57600080fd5b506001600160a01b03813581169160208101359091169060400135610e9f565b6102736004803603602081101561043057600080fd5b50356001600160a01b0316611251565b6102736004803603602081101561045657600080fd5b50356001600160a01b0316611266565b61046e611359565b6040805160ff9092168252519081900360200190f35b6102736004803603604081101561049a57600080fd5b508035906020013561135e565b610273600480360360208110156104bd57600080fd5b50356001600160a01b031661156d565b6104d5611611565b604080516001600160a01b039092168252519081900360200190f35b6102736004803603602081101561050757600080fd5b50356001600160a01b0316611620565b6105346004803603602081101561052d57600080fd5b5035611635565b604080516001600160a01b03909616865260208601949094528484019290925260608401526080830152519081900360a00190f35b6102736004803603606081101561057f57600080fd5b6001600160a01b03823516916020810135918101906060810160408201356401000000008111156105af57600080fd5b8201836020820111156105c157600080fd5b803590602001918460018302840111640100000000831117156105e357600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061166e945050505050565b6102736004803603606081101561063a57600080fd5b506001600160a01b03813516906020810135906040013561183e565b6106736004803603602081101561066c57600080fd5b503561187f565b604080516001600160a01b039094168452602084019290925282820152519081900360600190f35b6103a46118aa565b610273600480360360608110156106b957600080fd5b50803590602081013590604001356001600160a01b03166118b0565b610273600480360360208110156106eb57600080fd5b50356001600160a01b03166118e5565b6102736004803603602081101561071157600080fd5b50356001600160a01b0316611b51565b6103a46004803603602081101561073757600080fd5b50356001600160a01b0316611bf5565b6102736004803603602081101561075d57600080fd5b50356001600160a01b0316611c07565b6102736004803603602081101561078357600080fd5b50356001600160a01b0316611cca565b6103a4611dbd565b610273600480360360208110156107b157600080fd5b50356001600160a01b0316611dc3565b6102b8611eb6565b610273600480360360408110156107df57600080fd5b506001600160a01b038135169060200135611ed9565b6108126004803603602081101561080b57600080fd5b5035611ee6565b604080516001600160a01b0390971687526020870195909552858501939093526060850191909152608084015260a0830152519081900360c00190f35b6103a4611f25565b6102736004803603602081101561086d57600080fd5b50356001600160a01b0316611f2b565b6102736004803603602081101561089357600080fd5b5035611f40565b610273600480360360208110156108b057600080fd5b5035611f55565b610273600480360360408110156108cd57600080fd5b6001600160a01b0382351691908101906040810160208201356401000000008111156108f857600080fd5b82018360208201111561090a57600080fd5b8035906020019184600183028401116401000000008311171561092c57600080fd5b509092509050611f6a565b6105346004803603602081101561094d57600080fd5b5035611fb9565b6103a46004803603604081101561096a57600080fd5b506001600160a01b0381358116916020013516611ff2565b3360009081526004602052604081205460ff166109d75760408051600160e51b62461bcd02815260206004820152601660248201526000805160206120a4833981519152604482015290519081900360640190fd5b6001600160a01b038216600081815260066020526040808220805460ff191690555133917f360cc1ecf7efd70487c243952543c7d95ab444c9c52dde253f7979c33a1cab7891a3506001919050565b3360009081526007602052604081205460ff16610a885760408051600160e51b62461bcd02815260206004820152601560248201526001605a1b7414d95b99195c881b9bdd08185d5d1a1bdc9a5e995902604482015290519081900360640190fd5b30600090815260026020526040902054841115610ad957604051600160e51b62461bcd02815260040180806020018281038252602581526020018061207f6025913960400191505060405180910390fd5b60008281526011602052604090205460ff1615610b2a57604051600160e51b62461bcd02815260040180806020018281038252602481526020018061205b6024913960400191505060405180910390fd5b30600090815260026020526040902054610b4a908563ffffffff61200f16565b30600090815260026020526040902055600154610b6d908563ffffffff61200f16565b6001908155600f80548201808255600090815260106020908152604080832080546001600160a01b031916339081179091558454845281842086018a9055845484528184206002018990558454845281842060030188905584548452818420426004909101819055955494548452928190206005018490558051898152918201949094528084019290925291518492869290917f535315e7d1c7278469a90807aa28576a16d9dda00727fca7937f7ebc658a11fc9181900360600190a4506000818152601160205260409020805460ff191660019081179091555b9392505050565b604051806040016040528060058152602001600160d81b64784575726f0281525081565b3360008181526003602090815260408083206001600160a01b038716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a350600192915050565b3360009081526004602052604081205460ff16610d2e5760408051600160e51b62461bcd02815260206004820152601660248201526000805160206120a4833981519152604482015290519081900360640190fd5b60088054908390556040805182815260208101859052815133927f647ea6b9c0886d71b598c86e2dea5324cecd56394fb1c54c794462e31abd4b17928290030190a250600192915050565b60066020526000908152604090205460ff1681565b600f5481565b3360009081526004602052604081205460ff16610de95760408051600160e51b62461bcd02815260206004820152601660248201526000805160206120a4833981519152604482015290519081900360640190fd5b336001600160a01b0383161415610e4a5760408051600160e51b62461bcd02815260206004820152601a60248201527f41646d696e2063616e27742072656d6f76652068696d73656c66000000000000604482015290519081900360640190fd5b6001600160a01b038216600081815260046020526040808220805460ff191690555133917fdb9d5d31320daf5bc7181d565b6da4d12e30f0f4d5aa324a992426c14a1d19ce91a3506001919050565b60015481565b60006001600160a01b038316610eb457600080fd5b336001600160a01b0385161480610eee57506001600160a01b03841660009081526003602090815260408083203384529091529020548211155b80610f1b57506001600160a01b03841630148015610f1b57503360009081526006602052604090205460ff165b610f6a5760408051600160e51b62461bcd02815260206004820152601560248201526001605a1b7414d95b99195c881b9bdd08185d5d1a1bdc9a5e995902604482015290519081900360640190fd5b6001600160a01b038416600090815260026020526040902054821115610fc457604051600160e51b62461bcd0281526004018080602001828103825260248152602001806120376024913960400191505060405180910390fd5b6001600160a01b038316301415611109576001600160a01b03841633146110355760408051600160e51b62461bcd02815260206004820152601d60248201527f4f6e6c7920746f6b656e20686f6c6465722063616e20646f2074686973000000604482015290519081900360640190fd5b60085482101561107957604051600160e51b62461bcd0281526004018080602001828103825260278152602001806120f46027913960400191505060405180910390fd5b600d8054600101908190556040805184815290516001600160a01b038716917f9f2fe8c128eb2cf4c04e739244f557be16604328557233a7a2a6c1fbf1cf8c4a919081900360200190a3600d80546000908152600e602052604080822080546001600160a01b0319166001600160a01b038916179055825482528082206001018590559154815220426002909101555b6001600160a01b038416600090815260026020526040902054611132908363ffffffff61200f16565b6001600160a01b038086166000908152600260205260408082209390935590851681522054611167908363ffffffff61202416565b6001600160a01b038085166000908152600260205260409020919091558416331480159061119e57506001600160a01b0384163014155b156111fc576001600160a01b03841660009081526003602090815260408083203384529091529020546111d7908363ffffffff61200f16565b6001600160a01b03851660009081526003602090815260408083203384529091529020555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a35060019392505050565b60046020526000908152604090205460ff1681565b3360009081526004602052604081205460ff166112bb5760408051600160e51b62461bcd02815260206004820152601660248201526000805160206120a4833981519152604482015290519081900360640190fd5b6001600160a01b0382166113075760408051600160e51b62461bcd02815260206004820152601f6024820152600080516020612151833981519152604482015290519081900360640190fd5b6001600160a01b038216600081815260066020526040808220805460ff191660011790555133917f0a3824f403289d915446d591615857435fbf94fa18a273bf37f75ebecbde650c91a3506001919050565b600081565b3360009081526005602052604081205460ff166113c05760408051600160e51b62461bcd02815260206004820152601560248201526001605a1b7414d95b99195c881b9bdd08185d5d1a1bdc9a5e995902604482015290519081900360640190fd5b6000828152600a602052604090205460ff161561141157604051600160e51b62461bcd02815260040180806020018281038252602481526020018061205b6024913960400191505060405180910390fd5b600154611424908463ffffffff61202416565b60015530600090815260026020526040902054611447908463ffffffff61202416565b306000908152600260208181526040808420949094556009805460019081018083558552600c83528585208054336001600160a01b031991821681179092558354875287872083018a90558354875287872086018b90558354875287872042600391820155835485548952898920600490810191909155855489528989208c8a52600b8852988a9020895481546001600160a01b0390911694169390931783558885015483860155888801549783019790975587810154908201559585015495909401949094555492548451888152918201528351929386937f3446268fc8181c87ca8580504fff9cf33b6de9c160e4989ae91343e75ff741609281900390910190a4506000818152600a60205260409020805460ff1916600190811790915592915050565b3360009081526004602052604081205460ff166115c25760408051600160e51b62461bcd02815260206004820152601660248201526000805160206120a4833981519152604482015290519081900360640190fd5b6001600160a01b038216600081815260076020526040808220805460ff191690555133917f712c2fc592e9be8dffbbe4227d1906927facef2da8a401921e916d864971b6bb91a3506001919050565b6000546001600160a01b031681565b60076020526000908152604090205460ff1681565b600c60205260009081526040902080546001820154600283015460038401546004909401546001600160a01b0390931693919290919085565b60008361167c338286610e9f565b1561183357806001600160a01b031663a4c0ed363386866040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156116fd5781810151838201526020016116e5565b50505050905090810190601f16801561172a5780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b15801561174b57600080fd5b505af115801561175f573d6000803e3d6000fd5b505050506040513d602081101561177557600080fd5b50511561183357846001600160a01b0316336001600160a01b03167f21ef8368734ad953ed9ae3c3035d58f91f69a15ebc986c4e008bc18f8cdc4d69856040518080602001828103825283818151815260200191508051906020019080838360005b838110156117ef5781810151838201526020016117d7565b50505050905090810190601f16801561181c5780820380516001836020036101000a031916815260200191505b509250505060405180910390a36001915050610c48565b506000949350505050565b3360009081526003602090815260408083206001600160a01b0387168452909152812054831461186d57600080fd5b6118778483610c73565b949350505050565b600e602052600090815260409020805460018201546002909201546001600160a01b03909116919083565b60085481565b60006118bc848461135e565b80156118ce57506118ce308386610e9f565b156118db57506001610c48565b5060009392505050565b3360009081526004602052604081205460ff1661193a5760408051600160e51b62461bcd02815260206004820152601660248201526000805160206120a4833981519152604482015290519081900360640190fd5b6001600160a01b0382166119865760408051600160e51b62461bcd02815260206004820152601f6024820152600080516020612151833981519152604482015290519081900360640190fd5b60005460408051600160e01b635b3d0bc10281526001600160a01b038581166004830152915142939290921691635b3d0bc191602480820192602092909190829003018186803b1580156119d957600080fd5b505afa1580156119ed573d6000803e3d6000fd5b505050506040513d6020811015611a0357600080fd5b505111611a4457604051600160e51b62461bcd0281526004018080602001828103825260308152602001806120c46030913960400191505060405180910390fd5b60005460408051600160e01b63836afead0281526001600160a01b0385811660048301529151919092169163836afead916024808301926020929190829003018186803b158015611a9457600080fd5b505afa158015611aa8573d6000803e3d6000fd5b505050506040513d6020811015611abe57600080fd5b505115611aff57604051600160e51b62461bcd02815260040180806020018281038252603681526020018061211b6036913960400191505060405180910390fd5b6001600160a01b038216600081815260046020526040808220805460ff191660011790555133917fbf3f493c772c8c283fd124432c2d0f539ab343faa04258fe88e52912d36b102b91a3506001919050565b3360009081526004602052604081205460ff16611ba65760408051600160e51b62461bcd02815260206004820152601660248201526000805160206120a4833981519152604482015290519081900360640190fd5b6001600160a01b038216600081815260056020526040808220805460ff191690555133917fd4373432dc9e869df5c22a4fa3c90d5cca453140523c9e076c2a347ee8d806f391a3506001919050565b60026020526000908152604090205481565b3360009081526004602052604081205460ff16611c5c5760408051600160e51b62461bcd02815260206004820152601660248201526000805160206120a4833981519152604482015290519081900360640190fd5b600054604080516001600160a01b0392831681529184166020830152805133927fdeee135e9ab3644341d22e8715d2d21eef558921ca6eb86764de7125302f200f92908290030190a250600080546001600160a01b0383166001600160a01b03199091161790556001919050565b3360009081526004602052604081205460ff16611d1f5760408051600160e51b62461bcd02815260206004820152601660248201526000805160206120a4833981519152604482015290519081900360640190fd5b6001600160a01b038216611d6b5760408051600160e51b62461bcd02815260206004820152601f6024820152600080516020612151833981519152604482015290519081900360640190fd5b6001600160a01b038216600081815260056020526040808220805460ff191660011790555133917fdac4748568425c8dfc8706e3c3eb5191272f7d331ecec6c4e5e6bd0efc0b75bd91a3506001919050565b60095481565b3360009081526004602052604081205460ff16611e185760408051600160e51b62461bcd02815260206004820152601660248201526000805160206120a4833981519152604482015290519081900360640190fd5b6001600160a01b038216611e645760408051600160e51b62461bcd02815260206004820152601f6024820152600080516020612151833981519152604482015290519081900360640190fd5b6001600160a01b038216600081815260076020526040808220805460ff191660011790555133917f0839a19aaf317047bdfffbd8e7dd2055c38842f33268dbc18016460178e17c2191a3506001919050565b604051806040016040528060048152602001600160e11b633c22aaa90281525081565b6000610c48338484610e9f565b6010602052600090815260409020805460018201546002830154600384015460048501546005909501546001600160a01b039094169492939192909186565b600d5481565b60056020526000908152604090205460ff1681565b60116020526000908152604090205460ff1681565b600a6020526000908152604090205460ff1681565b336000908152600260209081526040808320548151601f860184900484028101840190925284825261187792879290879087908190840183828082843760009201919091525061166e92505050565b600b60205260009081526040902080546001820154600283015460038401546004909401546001600160a01b0390931693919290919085565b600360209081526000928352604080842090915290825290205481565b60008282111561201e57600080fd5b50900390565b600082820183811015610c4857600080fdfe4163636f756e7420646f65736e2774206861766520726571756972656420616d6f756e74546869732066696174207061796d656e7420696420697320616c726561647920757365644163636f756e7420646f6573206e6f74206861766520726571756972656420616d6f756e744f6e6c792061646d696e2063616e20646f2074686174000000000000000000004e65772061646d696e2068617320746f206265207665726966696564206f6e2043727970746f6e6f6d6963612e6e657456616c7565206973206c657373207468616e206d696e2e2065786368616e676520616d6f756e74566572696669636174696f6e20666f722074686973206164647265737320776173207265766f6b65642c2063616e206e6f7420616464416464726573732063616e206e6f74206265207a65726f2d6164647265737300a165627a7a72305820b8b84e4364cf3182798956bb634089593885af05d1b7002241a82fdf40a8b36f00294163636f756e7420646f65736e2774206861766520726571756972656420616d6f756e74546869732066696174207061796d656e7420696420697320616c726561647920757365644163636f756e7420646f6573206e6f74206861766520726571756972656420616d6f756e744f6e6c792061646d696e2063616e20646f2074686174000000000000000000004e65772061646d696e2068617320746f206265207665726966696564206f6e2043727970746f6e6f6d6963612e6e657456616c7565206973206c657373207468616e206d696e2e2065786368616e676520616d6f756e74566572696669636174696f6e20666f722074686973206164647265737320776173207265766f6b65642c2063616e206e6f7420616464416464726573732063616e206e6f74206265207a65726f2d6164647265737300
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102485760003560e01c8063439e6e091161013b57806395d89b41116100b8578063c3250df21161007c578063c3250df21461087d578063c9d599491461089a578063d87692d9146108b7578063dc78ab8e14610937578063dd62ed3e1461095457610248565b806395d89b41146107c1578063a9059cbb146107c9578063b3dc174e146107f5578063b82dfbcb1461084f578063c2ba47441461085757610248565b806370a08231116100ff57806370a08231146107215780637b56afa7146107475780637c390bd81461076d57806390136322146107935780639484d4a21461079b57610248565b8063439e6e0914610656578063551f59c91461069b57806366e02dda146106a357806370480275146106d557806370532b44146106fb57610248565b806324d7806c116101c957806336953c161161018d57806336953c16146104cd5780633820a686146104f157806339a7412b146105175780634000aea014610569578063426a84931461062457610248565b806324d7806c1461041a5780632b5e071a14610440578063313ce5671461046657806334a7c2e71461048457806335e80056146104a757610248565b806312b8b3241161021057806312b8b3241461037657806315a74a991461039c5780631785f53c146103b657806318160ddd146103dc57806323b872dd146103e457610248565b80630143faba1461024d57806304681a281461028757806306fdde03146102b0578063095ea7b31461032d5780630e5d127d14610359575b600080fd5b6102736004803603602081101561026357600080fd5b50356001600160a01b0316610982565b604080519115158252519081900360200190f35b6102736004803603606081101561029d57600080fd5b5080359060208101359060400135610a26565b6102b8610c4f565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102f25781810151838201526020016102da565b50505050905090810190601f16801561031f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102736004803603604081101561034357600080fd5b506001600160a01b038135169060200135610c73565b6102736004803603602081101561036f57600080fd5b5035610cd9565b6102736004803603602081101561038c57600080fd5b50356001600160a01b0316610d79565b6103a4610d8e565b60408051918252519081900360200190f35b610273600480360360208110156103cc57600080fd5b50356001600160a01b0316610d94565b6103a4610e99565b610273600480360360608110156103fa57600080fd5b506001600160a01b03813581169160208101359091169060400135610e9f565b6102736004803603602081101561043057600080fd5b50356001600160a01b0316611251565b6102736004803603602081101561045657600080fd5b50356001600160a01b0316611266565b61046e611359565b6040805160ff9092168252519081900360200190f35b6102736004803603604081101561049a57600080fd5b508035906020013561135e565b610273600480360360208110156104bd57600080fd5b50356001600160a01b031661156d565b6104d5611611565b604080516001600160a01b039092168252519081900360200190f35b6102736004803603602081101561050757600080fd5b50356001600160a01b0316611620565b6105346004803603602081101561052d57600080fd5b5035611635565b604080516001600160a01b03909616865260208601949094528484019290925260608401526080830152519081900360a00190f35b6102736004803603606081101561057f57600080fd5b6001600160a01b03823516916020810135918101906060810160408201356401000000008111156105af57600080fd5b8201836020820111156105c157600080fd5b803590602001918460018302840111640100000000831117156105e357600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061166e945050505050565b6102736004803603606081101561063a57600080fd5b506001600160a01b03813516906020810135906040013561183e565b6106736004803603602081101561066c57600080fd5b503561187f565b604080516001600160a01b039094168452602084019290925282820152519081900360600190f35b6103a46118aa565b610273600480360360608110156106b957600080fd5b50803590602081013590604001356001600160a01b03166118b0565b610273600480360360208110156106eb57600080fd5b50356001600160a01b03166118e5565b6102736004803603602081101561071157600080fd5b50356001600160a01b0316611b51565b6103a46004803603602081101561073757600080fd5b50356001600160a01b0316611bf5565b6102736004803603602081101561075d57600080fd5b50356001600160a01b0316611c07565b6102736004803603602081101561078357600080fd5b50356001600160a01b0316611cca565b6103a4611dbd565b610273600480360360208110156107b157600080fd5b50356001600160a01b0316611dc3565b6102b8611eb6565b610273600480360360408110156107df57600080fd5b506001600160a01b038135169060200135611ed9565b6108126004803603602081101561080b57600080fd5b5035611ee6565b604080516001600160a01b0390971687526020870195909552858501939093526060850191909152608084015260a0830152519081900360c00190f35b6103a4611f25565b6102736004803603602081101561086d57600080fd5b50356001600160a01b0316611f2b565b6102736004803603602081101561089357600080fd5b5035611f40565b610273600480360360208110156108b057600080fd5b5035611f55565b610273600480360360408110156108cd57600080fd5b6001600160a01b0382351691908101906040810160208201356401000000008111156108f857600080fd5b82018360208201111561090a57600080fd5b8035906020019184600183028401116401000000008311171561092c57600080fd5b509092509050611f6a565b6105346004803603602081101561094d57600080fd5b5035611fb9565b6103a46004803603604081101561096a57600080fd5b506001600160a01b0381358116916020013516611ff2565b3360009081526004602052604081205460ff166109d75760408051600160e51b62461bcd02815260206004820152601660248201526000805160206120a4833981519152604482015290519081900360640190fd5b6001600160a01b038216600081815260066020526040808220805460ff191690555133917f360cc1ecf7efd70487c243952543c7d95ab444c9c52dde253f7979c33a1cab7891a3506001919050565b3360009081526007602052604081205460ff16610a885760408051600160e51b62461bcd02815260206004820152601560248201526001605a1b7414d95b99195c881b9bdd08185d5d1a1bdc9a5e995902604482015290519081900360640190fd5b30600090815260026020526040902054841115610ad957604051600160e51b62461bcd02815260040180806020018281038252602581526020018061207f6025913960400191505060405180910390fd5b60008281526011602052604090205460ff1615610b2a57604051600160e51b62461bcd02815260040180806020018281038252602481526020018061205b6024913960400191505060405180910390fd5b30600090815260026020526040902054610b4a908563ffffffff61200f16565b30600090815260026020526040902055600154610b6d908563ffffffff61200f16565b6001908155600f80548201808255600090815260106020908152604080832080546001600160a01b031916339081179091558454845281842086018a9055845484528184206002018990558454845281842060030188905584548452818420426004909101819055955494548452928190206005018490558051898152918201949094528084019290925291518492869290917f535315e7d1c7278469a90807aa28576a16d9dda00727fca7937f7ebc658a11fc9181900360600190a4506000818152601160205260409020805460ff191660019081179091555b9392505050565b604051806040016040528060058152602001600160d81b64784575726f0281525081565b3360008181526003602090815260408083206001600160a01b038716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a350600192915050565b3360009081526004602052604081205460ff16610d2e5760408051600160e51b62461bcd02815260206004820152601660248201526000805160206120a4833981519152604482015290519081900360640190fd5b60088054908390556040805182815260208101859052815133927f647ea6b9c0886d71b598c86e2dea5324cecd56394fb1c54c794462e31abd4b17928290030190a250600192915050565b60066020526000908152604090205460ff1681565b600f5481565b3360009081526004602052604081205460ff16610de95760408051600160e51b62461bcd02815260206004820152601660248201526000805160206120a4833981519152604482015290519081900360640190fd5b336001600160a01b0383161415610e4a5760408051600160e51b62461bcd02815260206004820152601a60248201527f41646d696e2063616e27742072656d6f76652068696d73656c66000000000000604482015290519081900360640190fd5b6001600160a01b038216600081815260046020526040808220805460ff191690555133917fdb9d5d31320daf5bc7181d565b6da4d12e30f0f4d5aa324a992426c14a1d19ce91a3506001919050565b60015481565b60006001600160a01b038316610eb457600080fd5b336001600160a01b0385161480610eee57506001600160a01b03841660009081526003602090815260408083203384529091529020548211155b80610f1b57506001600160a01b03841630148015610f1b57503360009081526006602052604090205460ff165b610f6a5760408051600160e51b62461bcd02815260206004820152601560248201526001605a1b7414d95b99195c881b9bdd08185d5d1a1bdc9a5e995902604482015290519081900360640190fd5b6001600160a01b038416600090815260026020526040902054821115610fc457604051600160e51b62461bcd0281526004018080602001828103825260248152602001806120376024913960400191505060405180910390fd5b6001600160a01b038316301415611109576001600160a01b03841633146110355760408051600160e51b62461bcd02815260206004820152601d60248201527f4f6e6c7920746f6b656e20686f6c6465722063616e20646f2074686973000000604482015290519081900360640190fd5b60085482101561107957604051600160e51b62461bcd0281526004018080602001828103825260278152602001806120f46027913960400191505060405180910390fd5b600d8054600101908190556040805184815290516001600160a01b038716917f9f2fe8c128eb2cf4c04e739244f557be16604328557233a7a2a6c1fbf1cf8c4a919081900360200190a3600d80546000908152600e602052604080822080546001600160a01b0319166001600160a01b038916179055825482528082206001018590559154815220426002909101555b6001600160a01b038416600090815260026020526040902054611132908363ffffffff61200f16565b6001600160a01b038086166000908152600260205260408082209390935590851681522054611167908363ffffffff61202416565b6001600160a01b038085166000908152600260205260409020919091558416331480159061119e57506001600160a01b0384163014155b156111fc576001600160a01b03841660009081526003602090815260408083203384529091529020546111d7908363ffffffff61200f16565b6001600160a01b03851660009081526003602090815260408083203384529091529020555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a35060019392505050565b60046020526000908152604090205460ff1681565b3360009081526004602052604081205460ff166112bb5760408051600160e51b62461bcd02815260206004820152601660248201526000805160206120a4833981519152604482015290519081900360640190fd5b6001600160a01b0382166113075760408051600160e51b62461bcd02815260206004820152601f6024820152600080516020612151833981519152604482015290519081900360640190fd5b6001600160a01b038216600081815260066020526040808220805460ff191660011790555133917f0a3824f403289d915446d591615857435fbf94fa18a273bf37f75ebecbde650c91a3506001919050565b600081565b3360009081526005602052604081205460ff166113c05760408051600160e51b62461bcd02815260206004820152601560248201526001605a1b7414d95b99195c881b9bdd08185d5d1a1bdc9a5e995902604482015290519081900360640190fd5b6000828152600a602052604090205460ff161561141157604051600160e51b62461bcd02815260040180806020018281038252602481526020018061205b6024913960400191505060405180910390fd5b600154611424908463ffffffff61202416565b60015530600090815260026020526040902054611447908463ffffffff61202416565b306000908152600260208181526040808420949094556009805460019081018083558552600c83528585208054336001600160a01b031991821681179092558354875287872083018a90558354875287872086018b90558354875287872042600391820155835485548952898920600490810191909155855489528989208c8a52600b8852988a9020895481546001600160a01b0390911694169390931783558885015483860155888801549783019790975587810154908201559585015495909401949094555492548451888152918201528351929386937f3446268fc8181c87ca8580504fff9cf33b6de9c160e4989ae91343e75ff741609281900390910190a4506000818152600a60205260409020805460ff1916600190811790915592915050565b3360009081526004602052604081205460ff166115c25760408051600160e51b62461bcd02815260206004820152601660248201526000805160206120a4833981519152604482015290519081900360640190fd5b6001600160a01b038216600081815260076020526040808220805460ff191690555133917f712c2fc592e9be8dffbbe4227d1906927facef2da8a401921e916d864971b6bb91a3506001919050565b6000546001600160a01b031681565b60076020526000908152604090205460ff1681565b600c60205260009081526040902080546001820154600283015460038401546004909401546001600160a01b0390931693919290919085565b60008361167c338286610e9f565b1561183357806001600160a01b031663a4c0ed363386866040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156116fd5781810151838201526020016116e5565b50505050905090810190601f16801561172a5780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b15801561174b57600080fd5b505af115801561175f573d6000803e3d6000fd5b505050506040513d602081101561177557600080fd5b50511561183357846001600160a01b0316336001600160a01b03167f21ef8368734ad953ed9ae3c3035d58f91f69a15ebc986c4e008bc18f8cdc4d69856040518080602001828103825283818151815260200191508051906020019080838360005b838110156117ef5781810151838201526020016117d7565b50505050905090810190601f16801561181c5780820380516001836020036101000a031916815260200191505b509250505060405180910390a36001915050610c48565b506000949350505050565b3360009081526003602090815260408083206001600160a01b0387168452909152812054831461186d57600080fd5b6118778483610c73565b949350505050565b600e602052600090815260409020805460018201546002909201546001600160a01b03909116919083565b60085481565b60006118bc848461135e565b80156118ce57506118ce308386610e9f565b156118db57506001610c48565b5060009392505050565b3360009081526004602052604081205460ff1661193a5760408051600160e51b62461bcd02815260206004820152601660248201526000805160206120a4833981519152604482015290519081900360640190fd5b6001600160a01b0382166119865760408051600160e51b62461bcd02815260206004820152601f6024820152600080516020612151833981519152604482015290519081900360640190fd5b60005460408051600160e01b635b3d0bc10281526001600160a01b038581166004830152915142939290921691635b3d0bc191602480820192602092909190829003018186803b1580156119d957600080fd5b505afa1580156119ed573d6000803e3d6000fd5b505050506040513d6020811015611a0357600080fd5b505111611a4457604051600160e51b62461bcd0281526004018080602001828103825260308152602001806120c46030913960400191505060405180910390fd5b60005460408051600160e01b63836afead0281526001600160a01b0385811660048301529151919092169163836afead916024808301926020929190829003018186803b158015611a9457600080fd5b505afa158015611aa8573d6000803e3d6000fd5b505050506040513d6020811015611abe57600080fd5b505115611aff57604051600160e51b62461bcd02815260040180806020018281038252603681526020018061211b6036913960400191505060405180910390fd5b6001600160a01b038216600081815260046020526040808220805460ff191660011790555133917fbf3f493c772c8c283fd124432c2d0f539ab343faa04258fe88e52912d36b102b91a3506001919050565b3360009081526004602052604081205460ff16611ba65760408051600160e51b62461bcd02815260206004820152601660248201526000805160206120a4833981519152604482015290519081900360640190fd5b6001600160a01b038216600081815260056020526040808220805460ff191690555133917fd4373432dc9e869df5c22a4fa3c90d5cca453140523c9e076c2a347ee8d806f391a3506001919050565b60026020526000908152604090205481565b3360009081526004602052604081205460ff16611c5c5760408051600160e51b62461bcd02815260206004820152601660248201526000805160206120a4833981519152604482015290519081900360640190fd5b600054604080516001600160a01b0392831681529184166020830152805133927fdeee135e9ab3644341d22e8715d2d21eef558921ca6eb86764de7125302f200f92908290030190a250600080546001600160a01b0383166001600160a01b03199091161790556001919050565b3360009081526004602052604081205460ff16611d1f5760408051600160e51b62461bcd02815260206004820152601660248201526000805160206120a4833981519152604482015290519081900360640190fd5b6001600160a01b038216611d6b5760408051600160e51b62461bcd02815260206004820152601f6024820152600080516020612151833981519152604482015290519081900360640190fd5b6001600160a01b038216600081815260056020526040808220805460ff191660011790555133917fdac4748568425c8dfc8706e3c3eb5191272f7d331ecec6c4e5e6bd0efc0b75bd91a3506001919050565b60095481565b3360009081526004602052604081205460ff16611e185760408051600160e51b62461bcd02815260206004820152601660248201526000805160206120a4833981519152604482015290519081900360640190fd5b6001600160a01b038216611e645760408051600160e51b62461bcd02815260206004820152601f6024820152600080516020612151833981519152604482015290519081900360640190fd5b6001600160a01b038216600081815260076020526040808220805460ff191660011790555133917f0839a19aaf317047bdfffbd8e7dd2055c38842f33268dbc18016460178e17c2191a3506001919050565b604051806040016040528060048152602001600160e11b633c22aaa90281525081565b6000610c48338484610e9f565b6010602052600090815260409020805460018201546002830154600384015460048501546005909501546001600160a01b039094169492939192909186565b600d5481565b60056020526000908152604090205460ff1681565b60116020526000908152604090205460ff1681565b600a6020526000908152604090205460ff1681565b336000908152600260209081526040808320548151601f860184900484028101840190925284825261187792879290879087908190840183828082843760009201919091525061166e92505050565b600b60205260009081526040902080546001820154600283015460038401546004909401546001600160a01b0390931693919290919085565b600360209081526000928352604080842090915290825290205481565b60008282111561201e57600080fd5b50900390565b600082820183811015610c4857600080fdfe4163636f756e7420646f65736e2774206861766520726571756972656420616d6f756e74546869732066696174207061796d656e7420696420697320616c726561647920757365644163636f756e7420646f6573206e6f74206861766520726571756972656420616d6f756e744f6e6c792061646d696e2063616e20646f2074686174000000000000000000004e65772061646d696e2068617320746f206265207665726966696564206f6e2043727970746f6e6f6d6963612e6e657456616c7565206973206c657373207468616e206d696e2e2065786368616e676520616d6f756e74566572696669636174696f6e20666f722074686973206164647265737320776173207265766f6b65642c2063616e206e6f7420616464416464726573732063616e206e6f74206265207a65726f2d6164647265737300a165627a7a72305820b8b84e4364cf3182798956bb634089593885af05d1b7002241a82fdf40a8b36f0029
Swarm Source
bzzr://b8b84e4364cf3182798956bb634089593885af05d1b7002241a82fdf40a8b36f
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.