Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Transactions Sent
Latest:
N/A
First:
N/A
Funded By
N/A
Latest 25 from a total of 1,088 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Kill | 6988646 | 2090 days ago | IN | 0 ETH | 0.00004078 | ||||
Transfer Owner | 6522633 | 2167 days ago | IN | 0 ETH | 0.00015356 | ||||
Finish Issuing | 6520768 | 2168 days ago | IN | 0 ETH | 0.0001441 | ||||
Transfer | 6504322 | 2170 days ago | IN | 0 ETH | 0.00153768 | ||||
Transfer | 6504249 | 2170 days ago | IN | 0 ETH | 0.00184903 | ||||
Transfer | 6504249 | 2170 days ago | IN | 0 ETH | 0.00184903 | ||||
Transfer | 6504249 | 2170 days ago | IN | 0 ETH | 0.00184788 | ||||
Transfer | 6504249 | 2170 days ago | IN | 0 ETH | 0.00184788 | ||||
Transfer | 6504249 | 2170 days ago | IN | 0 ETH | 0.00184788 | ||||
Transfer | 6504238 | 2170 days ago | IN | 0 ETH | 0.00184788 | ||||
Transfer | 6504238 | 2170 days ago | IN | 0 ETH | 0.00184672 | ||||
Transfer | 6504238 | 2170 days ago | IN | 0 ETH | 0.00184672 | ||||
Transfer | 6504238 | 2170 days ago | IN | 0 ETH | 0.00184788 | ||||
Transfer | 6504238 | 2170 days ago | IN | 0 ETH | 0.00184788 | ||||
Transfer | 6504238 | 2170 days ago | IN | 0 ETH | 0.00184788 | ||||
Transfer | 6504238 | 2170 days ago | IN | 0 ETH | 0.00184788 | ||||
Transfer | 6504238 | 2170 days ago | IN | 0 ETH | 0.00184788 | ||||
Transfer | 6504238 | 2170 days ago | IN | 0 ETH | 0.00184788 | ||||
Transfer | 6504238 | 2170 days ago | IN | 0 ETH | 0.00184788 | ||||
Transfer | 6504238 | 2170 days ago | IN | 0 ETH | 0.00184788 | ||||
Transfer | 6504238 | 2170 days ago | IN | 0 ETH | 0.00184788 | ||||
Transfer | 6504238 | 2170 days ago | IN | 0 ETH | 0.00184788 | ||||
Transfer | 6504238 | 2170 days ago | IN | 0 ETH | 0.00184788 | ||||
Transfer | 6504238 | 2170 days ago | IN | 0 ETH | 0.00184788 | ||||
Transfer | 6504238 | 2170 days ago | IN | 0 ETH | 0.00184672 |
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
6988646 | 2090 days ago | 0 ETH |
Loading...
Loading
Contract Self Destruct called at Txn Hash 0xebebeb58c4137ae8191e1c9b219ee9f1065d4c2973885566b446af90b93f69fb
Contract Name:
T0ken
Compiler Version
v0.4.25+commit.59dbf8f1
Optimization Enabled:
Yes with 1000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2018-10-16 */ pragma solidity >=0.4.24 <0.5.0; /** * * @title AddressMap * @dev Map of unique indexed addresseses. * * **NOTE** * The internal collections are one-based. * This is simply because null values are expressed as zero, * which makes it hard to check for the existence of items within the array, * or grabbing the first item of an array for non-existent items. * * This is only exposed internally, so callers still use zero-based indices. * */ library AddressMap { address constant ZERO_ADDRESS = address(0); struct Data { int256 count; mapping(address => int256) indices; mapping(int256 => address) items; } /** * Appends the address to the end of the map, if the addres is not * zero and the address doesn't currently exist. * @param addr The address to append. * @return true if the address was added. */ function append(Data storage self, address addr) internal returns (bool) { if (addr == ZERO_ADDRESS) { return false; } int256 index = self.indices[addr] - 1; if (index >= 0 && index < self.count) { return false; } self.count++; self.indices[addr] = self.count; self.items[self.count] = addr; return true; } /** * Removes the given address from the map. * @param addr The address to remove from the map. * @return true if the address was removed. */ function remove(Data storage self, address addr) internal returns (bool) { int256 oneBasedIndex = self.indices[addr]; if (oneBasedIndex < 1 || oneBasedIndex > self.count) { return false; // address doesn't exist, or zero. } // When the item being removed is not the last item in the collection, // replace that item with the last one, otherwise zero it out. // // If {2} is the item to be removed // [0, 1, 2, 3, 4] // The result would be: // [0, 1, 4, 3] // if (oneBasedIndex < self.count) { // Replace with last item address last = self.items[self.count]; // Get the last item self.indices[last] = oneBasedIndex; // Update last items index to current index self.items[oneBasedIndex] = last; // Update current index to last item delete self.items[self.count]; // Delete the last item, since it's moved } else { // Delete the address delete self.items[oneBasedIndex]; } delete self.indices[addr]; self.count--; return true; } /** * Retrieves the address at the given index. * THROWS when the index is invalid. * @param index The index of the item to retrieve. * @return The address of the item at the given index. */ function at(Data storage self, int256 index) internal view returns (address) { require(index >= 0 && index < self.count, "Index outside of bounds."); return self.items[index + 1]; } /** * Gets the index of the given address. * @param addr The address of the item to get the index for. * @return The index of the given address. */ function indexOf(Data storage self, address addr) internal view returns (int256) { if (addr == ZERO_ADDRESS) { return -1; } int256 index = self.indices[addr] - 1; if (index < 0 || index >= self.count) { return -1; } return index; } /** * Returns whether or not the given address exists within the map. * @param addr The address to check for existence. * @return If the given address exists or not. */ function exists(Data storage self, address addr) internal view returns (bool) { int256 index = self.indices[addr] - 1; return index >= 0 && index < self.count; } /** * Clears all items within the map. */ function clear(Data storage self) internal { self.count = 0; } } /** * * @title AccountMap * @dev Map of unique indexed accounts. * * **NOTE** * The internal collections are one-based. * This is simply because null values are expressed as zero, * which makes it hard to check for the existence of items within the array, * or grabbing the first item of an array for non-existent items. * * This is only exposed internally, so callers still use zero-based indices. * */ library AccountMap { address constant ZERO_ADDRESS = address(0); struct Account { address addr; uint8 kind; bool frozen; address parent; } struct Data { int256 count; mapping(address => int256) indices; mapping(int256 => Account) items; } /** * Appends the address to the end of the map, if the addres is not * zero and the address doesn't currently exist. * @param addr The address to append. * @return true if the address was added. */ function append(Data storage self, address addr, uint8 kind, bool isFrozen, address parent) internal returns (bool) { if (addr == ZERO_ADDRESS) { return false; } int256 index = self.indices[addr] - 1; if (index >= 0 && index < self.count) { return false; } self.count++; self.indices[addr] = self.count; self.items[self.count] = Account(addr, kind, isFrozen, parent); return true; } /** * Removes the given address from the map. * @param addr The address to remove from the map. * @return true if the address was removed. */ function remove(Data storage self, address addr) internal returns (bool) { int256 oneBasedIndex = self.indices[addr]; if (oneBasedIndex < 1 || oneBasedIndex > self.count) { return false; // address doesn't exist, or zero. } // When the item being removed is not the last item in the collection, // replace that item with the last one, otherwise zero it out. // // If {2} is the item to be removed // [0, 1, 2, 3, 4] // The result would be: // [0, 1, 4, 3] // if (oneBasedIndex < self.count) { // Replace with last item Account storage last = self.items[self.count]; // Get the last item self.indices[last.addr] = oneBasedIndex; // Update last items index to current index self.items[oneBasedIndex] = last; // Update current index to last item delete self.items[self.count]; // Delete the last item, since it's moved } else { // Delete the account delete self.items[oneBasedIndex]; } delete self.indices[addr]; self.count--; return true; } /** * Retrieves the address at the given index. * THROWS when the index is invalid. * @param index The index of the item to retrieve. * @return The address of the item at the given index. */ function at(Data storage self, int256 index) internal view returns (Account) { require(index >= 0 && index < self.count, "Index outside of bounds."); return self.items[index + 1]; } /** * Gets the index of the given address. * @param addr The address of the item to get the index for. * @return The index of the given address. */ function indexOf(Data storage self, address addr) internal view returns (int256) { if (addr == ZERO_ADDRESS) { return -1; } int256 index = self.indices[addr] - 1; if (index < 0 || index >= self.count) { return -1; } return index; } /** * Gets the Account for the given address. * THROWS when an account doesn't exist for the given address. * @param addr The address of the item to get. * @return The account of the given address. */ function get(Data storage self, address addr) internal view returns (Account) { return at(self, indexOf(self, addr)); } /** * Returns whether or not the given address exists within the map. * @param addr The address to check for existence. * @return If the given address exists or not. */ function exists(Data storage self, address addr) internal view returns (bool) { int256 index = self.indices[addr] - 1; return index >= 0 && index < self.count; } /** * Clears all items within the map. */ function clear(Data storage self) internal { self.count = 0; } } /** * @title Ownable * @dev Provides a modifier that requires the caller to be the owner of the contract. */ contract Ownable { address public owner; event OwnerTransferred( address indexed oldOwner, address indexed newOwner ); constructor() public { owner = msg.sender; } modifier onlyOwner() { require(msg.sender == owner, "Owner account is required"); _; } /** * @dev Allows the current owner to transfer control of the contract to newOwner. * @param newOwner The address to transfer ownership to. */ function transferOwner(address newOwner) public onlyOwner { require(newOwner != owner, "New Owner cannot be the current owner"); require(newOwner != address(0), "New Owner cannot be zero address"); address prevOwner = owner; owner = newOwner; emit OwnerTransferred(prevOwner, newOwner); } } /** * @title Lockable * @dev The Lockable contract adds the ability for the contract owner to set the lock status * of the account. A modifier is provided that checks the throws when the contract is * in the locked state. */ contract Lockable is Ownable { bool public isLocked; constructor() public { isLocked = false; } modifier isUnlocked() { require(!isLocked, "Contract is currently locked for modification"); _; } /** * Set the contract to a read-only state. * @param locked The locked state to set the contract to. */ function setLocked(bool locked) onlyOwner external { require(isLocked != locked, "Contract already in requested lock state"); isLocked = locked; } } /** * @title Destroyable * @dev The Destroyable contract alows the owner address to `selfdestruct` the contract. */ contract Destroyable is Ownable { /** * Allow the owner to destroy this contract. */ function kill() onlyOwner external { selfdestruct(owner); } } /** * Contract to facilitate locking and self destructing. */ contract LockableDestroyable is Lockable, Destroyable { } /** * @title Registry Storage */ contract Storage is Ownable, LockableDestroyable { struct Mapping { address key; address value; } using AccountMap for AccountMap.Data; using AddressMap for AddressMap.Data; // ------------------------------- Variables ------------------------------- // Nmber of data slots available for accounts uint8 MAX_DATA = 30; // Accounts AccountMap.Data public accounts; // Account Data // - mapping of: // (address => (index => data)) mapping(address => mapping(uint8 => bytes32)) public data; // Address write permissions // (kind => address) mapping(uint8 => AddressMap.Data) public permissions; // ------------------------------- Modifiers ------------------------------- /** * Ensures the `msg.sender` has permission for the given kind/type of account. * * - The `owner` account is always allowed * - Addresses/Contracts must have a corresponding entry, for the given kind */ modifier isAllowed(uint8 kind) { require(kind > 0, "Invalid, or missing permission"); if (msg.sender != owner) { require(permissions[kind].exists(msg.sender), "Missing permission"); } _; } // ---------------------------- Address Getters ---------------------------- /** * Gets the account at the given index * THROWS when the index is out-of-bounds * @param index The index of the item to retrieve * @return The address, kind, frozen status, and parent of the account at the given index */ function accountAt(int256 index) external view returns(address, uint8, bool, address) { AccountMap.Account memory acct = accounts.at(index); return (acct.addr, acct.kind, acct.frozen, acct.parent); } /** * Gets the account for the given address * THROWS when the account doesn't exist * @param addr The address of the item to retrieve * @return The address, kind, frozen status, and parent of the account at the given index */ function accountGet(address addr) external view returns(uint8, bool, address) { AccountMap.Account memory acct = accounts.get(addr); return (acct.kind, acct.frozen, acct.parent); } /** * Gets the parent address for the given account address * THROWS when the account doesn't exist * @param addr The address of the account * @return The parent address */ function accountParent(address addr) external view returns(address) { return accounts.get(addr).parent; } /** * Gets the account kind, for the given account address * THROWS when the account doesn't exist * @param addr The address of the account * @return The kind of account */ function accountKind(address addr) external view returns(uint8) { return accounts.get(addr).kind; } /** * Gets the frozen status of the account * THROWS when the account doesn't exist * @param addr The address of the account * @return The frozen status of the account */ function accountFrozen(address addr) external view returns(bool) { return accounts.get(addr).frozen; } /** * Gets the index of the account * Returns -1 for missing accounts * @param addr The address of the account to get the index for * @return The index of the given account address */ function accountIndexOf(address addr) external view returns(int256) { return accounts.indexOf(addr); } /** * Returns wether or not the given address exists * @param addr The account address * @return If the given address exists */ function accountExists(address addr) external view returns(bool) { return accounts.exists(addr); } /** * Returns wether or not the given address exists for the given kind * @param addr The account address * @param kind The kind of address * @return If the given address exists with the given kind */ function accountExists(address addr, uint8 kind) external view returns(bool) { int256 index = accounts.indexOf(addr); if (index < 0) { return false; } return accounts.at(index).kind == kind; } // -------------------------- Permission Getters --------------------------- /** * Retrieves the permission address at the index for the given type * THROWS when the index is out-of-bounds * @param kind The kind of permission * @param index The index of the item to retrieve * @return The permission address of the item at the given index */ function permissionAt(uint8 kind, int256 index) external view returns(address) { return permissions[kind].at(index); } /** * Gets the index of the permission address for the given type * Returns -1 for missing permission * @param kind The kind of perission * @param addr The address of the permission to get the index for * @return The index of the given permission address */ function permissionIndexOf(uint8 kind, address addr) external view returns(int256) { return permissions[kind].indexOf(addr); } /** * Returns wether or not the given permission address exists for the given type * @param kind The kind of permission * @param addr The address to check for permission * @return If the given address has permission or not */ function permissionExists(uint8 kind, address addr) external view returns(bool) { return permissions[kind].exists(addr); } // ------------------------------------------------------------------------- /** * Adds an account to storage * THROWS when `msg.sender` doesn't have permission * THROWS when the account already exists * @param addr The address of the account * @param kind The kind of account * @param isFrozen The frozen status of the account * @param parent The account parent/owner */ function addAccount(address addr, uint8 kind, bool isFrozen, address parent) isUnlocked isAllowed(kind) external { require(accounts.append(addr, kind, isFrozen, parent), "Account already exists"); } /** * Sets an account's frozen status * THROWS when the account doesn't exist * @param addr The address of the account * @param frozen The frozen status of the account */ function setAccountFrozen(address addr, bool frozen) isUnlocked isAllowed(accounts.get(addr).kind) external { // NOTE: Not bounds checking `index` here, as `isAllowed` ensures the address exists. // Indices are one-based internally, so we need to add one to compensate. int256 index = accounts.indexOf(addr) + 1; accounts.items[index].frozen = frozen; } /** * Removes an account from storage * THROWS when the account doesn't exist * @param addr The address of the account */ function removeAccount(address addr) isUnlocked isAllowed(accounts.get(addr).kind) external { bytes32 ZERO_BYTES = bytes32(0); mapping(uint8 => bytes32) accountData = data[addr]; // Remove data for (uint8 i = 0; i < MAX_DATA; i++) { if (accountData[i] != ZERO_BYTES) { delete accountData[i]; } } // Remove account accounts.remove(addr); } /** * Sets data for an address/caller * THROWS when the account doesn't exist * @param addr The address * @param index The index of the data * @param customData The data store set */ function setAccountData(address addr, uint8 index, bytes32 customData) isUnlocked isAllowed(accounts.get(addr).kind) external { require(index < MAX_DATA, "index outside of bounds"); data[addr][index] = customData; } /** * Grants the address permission for the given kind * @param kind The kind of address * @param addr The address */ function grantPermission(uint8 kind, address addr) isUnlocked isAllowed(kind) external { permissions[kind].append(addr); } /** * Revokes the address permission for the given kind * @param kind The kind of address * @param addr The address */ function revokePermission(uint8 kind, address addr) isUnlocked isAllowed(kind) external { permissions[kind].remove(addr); } } interface ERC20 { event Approval(address indexed owner, address indexed spender, uint256 value); event Transfer(address indexed from, address indexed to, uint256 value); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 value) external returns (bool); function balanceOf(address who) external view returns (uint256); function totalSupply() external view returns (uint256); function transfer(address to, uint256 value) external returns (bool); function transferFrom(address from, address to, uint256 value) external returns (bool); } library AdditiveMath { /** * Adds two numbers and returns the result * THROWS when the result overflows * @return The sum of the arguments */ function add(uint256 x, uint256 y) internal pure returns (uint256) { uint256 sum = x + y; require(sum >= x, "Results in overflow"); return sum; } /** * Subtracts two numbers and returns the result * THROWS when the result underflows * @return The difference of the arguments */ function subtract(uint256 x, uint256 y) internal pure returns (uint256) { require(y <= x, "Results in underflow"); return x - y; } } interface ComplianceRule { /** * @param from The address of the sender * @param to The address of the receiver * @param toKind The kind of the to address * @param store The Storage contract * @return true if transfer is allowed */ function canTransfer(address from, address to, uint8 toKind, Storage store) external view returns(bool); } interface Compliance { /** * This event is emitted when an address's frozen status has changed. * @param addr The address whose frozen status has been updated. * @param isFrozen Whether the custodian is being frozen. * @param owner The address that updated the frozen status. */ event AddressFrozen( address indexed addr, bool indexed isFrozen, address indexed owner ); /** * Sets an address frozen status for this token * @param addr The address to update frozen status. * @param freeze Frozen status of the address. */ function setAddressFrozen(address addr, bool freeze) external; /** * Returns all of the current compliance rules for this token * @param kind The bucket of rules to get. * @return List of all compliance rules. */ function getRules(uint8 kind) view external returns(ComplianceRule[]); /** * Replaces all of the existing rules with the given ones * @param kind The bucket of rules to set. * @param rules New compliance rules. */ function setRules(uint8 kind, ComplianceRule[] rules) external; /** * Checks if a transfer can occur between the from/to addresses. * Both addressses must be valid, unfrozen, and pass all compliance rule checks. * @param from The address of the sender. * @param to The address of the receiver. * @return If a transfer can occure between the from/to addresses. */ function canTransfer(address from, address to) view external returns(bool); } contract T0ken is ERC20, Ownable, LockableDestroyable { // ------------------------------- Variables ------------------------------- using AdditiveMath for uint256; using AddressMap for AddressMap.Data; AddressMap.Data public shareholders; mapping(address => address) public cancellations; mapping(address => uint256) internal balances; mapping (address => mapping (address => uint256)) private allowed; address public issuer; bool public issuingFinished = false; uint256 internal totalSupplyTokens; address constant internal ZERO_ADDRESS = address(0); Compliance public compliance; Storage public store; // Possible 3rd party integration variables string public constant name = "TZERO PREFERRED"; string public constant symbol = "TZROP"; uint8 public constant decimals = 0; // ------------------------------- Modifiers ------------------------------- modifier transferCheck(uint256 value, address fromAddr) { require(value <= balances[fromAddr], "Balance is more than from address has"); _; } modifier isNotCancelled(address addr) { require(cancellations[addr] == ZERO_ADDRESS, "Address has been cancelled"); _; } modifier onlyIssuer() { require(msg.sender == issuer, "Only issuer allowed"); _; } modifier canIssue() { require(!issuingFinished, "Issuing is already finished"); _; } modifier canTransfer(address fromAddress, address toAddress) { if(fromAddress == issuer) { require(store.accountExists(toAddress), "The to address does not exist"); } else { require(compliance.canTransfer(fromAddress, toAddress), "Address cannot transfer"); } _; } modifier canTransferFrom(address fromAddress, address toAddress) { if(msg.sender == owner) { require(store.accountExists(toAddress), "The to address does not exist"); } else { require(compliance.canTransfer(fromAddress, toAddress), "Address cannot transfer"); } _; } // -------------------------- Events ------------------------------- /** * This event is emitted when an address is cancelled and replaced with * a new address. This happens in the case where a shareholder has * lost access to their original address and needs to have their share * reissued to a new address. This is the equivalent of issuing replacement * share certificates. * @param original The address being superseded. * @param replacement The new address. * @param sender The address that caused the address to be superseded. */ event VerifiedAddressSuperseded(address indexed original, address indexed replacement, address indexed sender); event IssuerSet(address indexed previousIssuer, address indexed newIssuer); event Issue(address indexed to, uint256 amount); event IssueFinished(); // ---------------------------- Getters ---------------------------- /** * @return total number of tokens in existence */ function totalSupply() external view returns (uint256) { return totalSupplyTokens; } /** * @dev Gets the balance of the specified address. * @param addr The address to query the the balance of. * @return An uint256 representing the amount owned by the passed address. */ function balanceOf(address addr) external view returns (uint256) { return balances[addr]; } /** * @dev Function to check the amount of tokens that an owner allowed to a spender. * @param addrOwner address The address which owns the funds. * @param spender address The address which will spend the funds. * @return A uint256 specifying the amount of tokens still available for the spender. */ function allowance(address addrOwner, address spender) isUnlocked external view returns (uint256) { return allowed[addrOwner][spender]; } /** * By counting the number of token holders using `holderCount` * you can retrieve the complete list of token holders, one at a time. * It MUST throw if `index >= holderCount()`. * @param index The zero-based index of the holder. * @return the address of the token holder with the given index. */ function holderAt(int256 index) external view returns (address){ return shareholders.at(index); } /** * Checks to see if the supplied address is a share holder. * @param addr The address to check. * @return true if the supplied address owns a token. */ function isHolder(address addr) external view returns (bool) { return shareholders.exists(addr); } /** * Checks to see if the supplied address was superseded. * @param addr The address to check. * @return true if the supplied address was superseded by another address. */ function isSuperseded(address addr) onlyOwner external view returns (bool) { return cancellations[addr] != ZERO_ADDRESS; } /** * Gets the most recent address, given a superseded one. * Addresses may be superseded multiple times, so this function needs to * follow the chain of addresses until it reaches the final, verified address. * @param addr The superseded address. * @return the verified address that ultimately holds the share. */ function getSuperseded(address addr) onlyOwner public view returns (address) { require(addr != ZERO_ADDRESS, "Non-zero address required"); address candidate = cancellations[addr]; if (candidate == ZERO_ADDRESS) { return ZERO_ADDRESS; } return candidate; } // ----------------------------------------------------------------- function setCompliance(address newComplianceAddress) isUnlocked onlyOwner external { compliance = Compliance(newComplianceAddress); } function setStorage(Storage s) isUnlocked onlyOwner external { store = s; } /** * @dev transfer token for a specified address * @param to The address to transfer to. * @param value The amount to be transferred. * The `transfer` function MUST NOT allow transfers to addresses that * have not been verified and added to the contract. * If the `to` address is not currently a shareholder then it MUST become one. * If the transfer will reduce `msg.sender`'s balance to 0 then that address * MUST be removed from the list of shareholders. */ function transfer(address to, uint256 value) isUnlocked isNotCancelled(to) transferCheck(value, msg.sender) canTransfer(msg.sender, to) public returns (bool) { balances[msg.sender] = balances[msg.sender].subtract(value); balances[to] = balances[to].add(value); // Adds the shareholder, if they don't already exist. shareholders.append(to); // Remove the shareholder if they no longer hold tokens. if (balances[msg.sender] == 0) { shareholders.remove(msg.sender); } emit Transfer(msg.sender, to, value); return true; } /** * @dev Transfer tokens from one address to another * @param from address The address which you want to send tokens from * @param to address The address which you want to transfer to * @param value uint256 the amount of tokens to be transferred * The `transferFrom` function MUST NOT allow transfers to addresses that * have not been verified and added to the contract. * If the `to` address is not currently a shareholder then it MUST become one. * If the transfer will reduce `from`'s balance to 0 then that address * MUST be removed from the list of shareholders. */ function transferFrom(address from, address to, uint256 value) public transferCheck(value, from) isNotCancelled(to) canTransferFrom(from, to) isUnlocked returns (bool) { if(msg.sender != owner) { require(value <= allowed[from][msg.sender], "Value exceeds what is allowed to transfer"); allowed[from][msg.sender] = allowed[from][msg.sender].subtract(value); } balances[from] = balances[from].subtract(value); balances[to] = balances[to].add(value); // Adds the shareholder, if they don't already exist. shareholders.append(to); // Remove the shareholder if they no longer hold tokens. if (balances[msg.sender] == 0) { shareholders.remove(from); } emit Transfer(from, to, value); return true; } /** * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender. * * Beware that changing an allowance with this method brings the risk that someone may use both the old * and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this * race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * @param spender The address which will spend the funds. * @param value The amount of tokens to be spent. */ function approve(address spender, uint256 value) isUnlocked external returns (bool) { allowed[msg.sender][spender] = value; emit Approval(msg.sender, spender, value); return true; } function setIssuer(address newIssuer) isUnlocked onlyOwner external { issuer = newIssuer; emit IssuerSet(issuer, newIssuer); } /** * Tokens will be issued only to the issuer's address * @param quantity The amount of tokens to mint. * @return A boolean that indicates if the operation was successful. */ function issueTokens(uint256 quantity) isUnlocked onlyIssuer canIssue public returns (bool) { address issuer = msg.sender; totalSupplyTokens = totalSupplyTokens.add(quantity); balances[issuer] = balances[issuer].add(quantity); shareholders.append(issuer); emit Issue(issuer, quantity); return true; } function finishIssuing() isUnlocked onlyIssuer canIssue public returns (bool) { issuingFinished = true; emit IssueFinished(); return issuingFinished; } /** * Cancel the original address and reissue the Tokens to the replacement address. * * ***It's on the issuer to make sure the replacement address belongs to a verified investor.*** * * Access to this function MUST be strictly controlled. * The `original` address MUST be removed from the set of verified addresses. * Throw if the `original` address supplied is not a shareholder. * Throw if the replacement address is not a verified address. * This function MUST emit the `VerifiedAddressSuperseded` event. * @param original The address to be superseded. This address MUST NOT be reused. * @param replacement The address that supersedes the original. This address MUST be verified. */ function cancelAndReissue(address original, address replacement) isUnlocked onlyOwner isNotCancelled(replacement) external { // replace the original address in the shareholders mapping // and update all the associated mappings require(shareholders.exists(original) && !shareholders.exists(replacement), "Original doesn't exist or replacement does"); shareholders.remove(original); shareholders.append(replacement); cancellations[original] = replacement; balances[replacement] = balances[original]; balances[original] = 0; emit VerifiedAddressSuperseded(original, replacement, msg.sender); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"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":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"issuer","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"locked","type":"bool"}],"name":"setLocked","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"addr","type":"address"}],"name":"isSuperseded","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"cancellations","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"shareholders","outputs":[{"name":"count","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"kill","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"issuingFinished","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newIssuer","type":"address"}],"name":"setIssuer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"compliance","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"addr","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"original","type":"address"},{"name":"replacement","type":"address"}],"name":"cancelAndReissue","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"finishIssuing","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"index","type":"int256"}],"name":"holderAt","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"s","type":"address"}],"name":"setStorage","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"store","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isLocked","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"quantity","type":"uint256"}],"name":"issueTokens","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"value","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"addr","type":"address"}],"name":"isHolder","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"addrOwner","type":"address"},{"name":"spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"addr","type":"address"}],"name":"getSuperseded","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newComplianceAddress","type":"address"}],"name":"setCompliance","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"original","type":"address"},{"indexed":true,"name":"replacement","type":"address"},{"indexed":true,"name":"sender","type":"address"}],"name":"VerifiedAddressSuperseded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousIssuer","type":"address"},{"indexed":true,"name":"newIssuer","type":"address"}],"name":"IssuerSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"Issue","type":"event"},{"anonymous":false,"inputs":[],"name":"IssueFinished","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"oldOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnerTransferred","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":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"}]
Contract Creation Code
60806040526007805460a060020a60ff021990811690915560008054600160a060020a031916331790911690556125c48061003b6000396000f30060806040526004361061017f5763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166306fdde038114610184578063095ea7b31461020e57806318160ddd146102465780631d1438481461026d578063211e28b61461029e57806323b872dd146102ba5780632da7293e146102e4578063313ce5671461030557806334a84827146103305780633723bc0e1461035157806341c0e1b5146103665780634ef05a711461037b5780634fb2e45d1461039057806355cc4e57146103b15780636290865d146103d257806370a08231146103e757806379f64720146104085780637e8d1a391461042f5780638082a929146104445780638da5cb5b1461045c5780639137c1a71461047157806395d89b4114610492578063975057e7146104a7578063a4e2d634146104bc578063a5820daa146104d1578063a9059cbb146104e9578063d4d7b19a1461050d578063dd62ed3e1461052e578063e37ccac714610555578063f898178914610576575b600080fd5b34801561019057600080fd5b50610199610597565b6040805160208082528351818301528351919283929083019185019080838360005b838110156101d35781810151838201526020016101bb565b50505050905090810190601f1680156102005780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561021a57600080fd5b50610232600160a060020a03600435166024356105ce565b604080519115158252519081900360200190f35b34801561025257600080fd5b5061025b6106cf565b60408051918252519081900360200190f35b34801561027957600080fd5b506102826106d5565b60408051600160a060020a039092168252519081900360200190f35b3480156102aa57600080fd5b506102b860043515156106e4565b005b3480156102c657600080fd5b50610232600160a060020a0360043581169060243516604435610826565b3480156102f057600080fd5b50610232600160a060020a0360043516610ddb565b34801561031157600080fd5b5061031a610e5f565b6040805160ff9092168252519081900360200190f35b34801561033c57600080fd5b50610282600160a060020a0360043516610e64565b34801561035d57600080fd5b5061025b610e7f565b34801561037257600080fd5b506102b8610e85565b34801561038757600080fd5b50610232610ef5565b34801561039c57600080fd5b506102b8600160a060020a0360043516610f16565b3480156103bd57600080fd5b506102b8600160a060020a03600435166110c3565b3480156103de57600080fd5b5061028261121b565b3480156103f357600080fd5b5061025b600160a060020a036004351661122a565b34801561041457600080fd5b506102b8600160a060020a0360043581169060243516611245565b34801561043b57600080fd5b506102326114fe565b34801561045057600080fd5b506102826004356116ed565b34801561046857600080fd5b50610282611706565b34801561047d57600080fd5b506102b8600160a060020a0360043516611715565b34801561049e57600080fd5b5061019961183f565b3480156104b357600080fd5b50610282611876565b3480156104c857600080fd5b50610232611885565b3480156104dd57600080fd5b506102326004356118a6565b3480156104f557600080fd5b50610232600160a060020a0360043516602435611ace565b34801561051957600080fd5b50610232600160a060020a0360043516611f56565b34801561053a57600080fd5b5061025b600160a060020a0360043581169060243516611f69565b34801561056157600080fd5b50610282600160a060020a036004351661202f565b34801561058257600080fd5b506102b8600160a060020a0360043516612120565b60408051808201909152600f81527f545a45524f205052454645525245440000000000000000000000000000000000602082015281565b6000805474010000000000000000000000000000000000000000900460ff1615610668576040805160e560020a62461bcd02815260206004820152602d60248201527f436f6e74726163742069732063757272656e746c79206c6f636b656420666f7260448201527f206d6f64696669636174696f6e00000000000000000000000000000000000000606482015290519081900360840190fd5b336000818152600660209081526040808320600160a060020a03881680855290835292819020869055805186815290519293927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a350600192915050565b60085490565b600754600160a060020a031681565b600054600160a060020a03163314610746576040805160e560020a62461bcd02815260206004820152601960248201527f4f776e6572206163636f756e7420697320726571756972656400000000000000604482015290519081900360640190fd5b60005460ff7401000000000000000000000000000000000000000090910416151581151514156107e6576040805160e560020a62461bcd02815260206004820152602860248201527f436f6e747261637420616c726561647920696e20726571756573746564206c6f60448201527f636b207374617465000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b60008054911515740100000000000000000000000000000000000000000274ff000000000000000000000000000000000000000019909216919091179055565b600160a060020a038316600090815260056020526040812054829085908211156108c0576040805160e560020a62461bcd02815260206004820152602560248201527f42616c616e6365206973206d6f7265207468616e2066726f6d2061646472657360448201527f7320686173000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a0380861660009081526004602052604090205486911615610932576040805160e560020a62461bcd02815260206004820152601a60248201527f4164647265737320686173206265656e2063616e63656c6c6564000000000000604482015290519081900360640190fd5b60005487908790600160a060020a0316331415610a3857600a54604080517f75cd51ed000000000000000000000000000000000000000000000000000000008152600160a060020a038481166004830152915191909216916375cd51ed9160248083019260209291908290030181600087803b1580156109b157600080fd5b505af11580156109c5573d6000803e3d6000fd5b505050506040513d60208110156109db57600080fd5b50511515610a33576040805160e560020a62461bcd02815260206004820152601d60248201527f54686520746f206164647265737320646f6573206e6f74206578697374000000604482015290519081900360640190fd5b610b2a565b600954604080517f6c85cf67000000000000000000000000000000000000000000000000000000008152600160a060020a038581166004830152848116602483015291519190921691636c85cf679160448083019260209291908290030181600087803b158015610aa857600080fd5b505af1158015610abc573d6000803e3d6000fd5b505050506040513d6020811015610ad257600080fd5b50511515610b2a576040805160e560020a62461bcd02815260206004820152601760248201527f416464726573732063616e6e6f74207472616e73666572000000000000000000604482015290519081900360640190fd5b60005474010000000000000000000000000000000000000000900460ff1615610bc3576040805160e560020a62461bcd02815260206004820152602d60248201527f436f6e74726163742069732063757272656e746c79206c6f636b656420666f7260448201527f206d6f64696669636174696f6e00000000000000000000000000000000000000606482015290519081900360840190fd5b600054600160a060020a03163314610ccf57600160a060020a0389166000908152600660209081526040808320338452909152902054871115610c76576040805160e560020a62461bcd02815260206004820152602960248201527f56616c75652065786365656473207768617420697320616c6c6f77656420746f60448201527f207472616e736665720000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a0389166000908152600660209081526040808320338452909152902054610caa908863ffffffff61224a16565b600160a060020a038a1660009081526006602090815260408083203384529091529020555b600160a060020a038916600090815260056020526040902054610cf8908863ffffffff61224a16565b600160a060020a03808b1660009081526005602052604080822093909355908a1681522054610d2d908863ffffffff6122aa16565b600160a060020a038916600090815260056020526040902055610d5760018963ffffffff61231216565b50336000908152600560205260409020541515610d8157610d7f60018a63ffffffff6123c916565b505b87600160a060020a031689600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef896040518082815260200191505060405180910390a350600198975050505050505050565b60008054600160a060020a03163314610e3e576040805160e560020a62461bcd02815260206004820152601960248201527f4f776e6572206163636f756e7420697320726571756972656400000000000000604482015290519081900360640190fd5b50600160a060020a0390811660009081526004602052604090205416151590565b600081565b600460205260009081526040902054600160a060020a031681565b60015481565b600054600160a060020a03163314610ee7576040805160e560020a62461bcd02815260206004820152601960248201527f4f776e6572206163636f756e7420697320726571756972656400000000000000604482015290519081900360640190fd5b600054600160a060020a0316ff5b60075474010000000000000000000000000000000000000000900460ff1681565b60008054600160a060020a03163314610f79576040805160e560020a62461bcd02815260206004820152601960248201527f4f776e6572206163636f756e7420697320726571756972656400000000000000604482015290519081900360640190fd5b600054600160a060020a0383811691161415611005576040805160e560020a62461bcd02815260206004820152602560248201527f4e6577204f776e65722063616e6e6f74206265207468652063757272656e742060448201527f6f776e6572000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a0382161515611065576040805160e560020a62461bcd02815260206004820181905260248201527f4e6577204f776e65722063616e6e6f74206265207a65726f2061646472657373604482015290519081900360640190fd5b5060008054600160a060020a0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8934ce4adea8d9ce0d714d2c22b86790e41b7731c84b926fbbdc1d40ff6533c99190a35050565b60005474010000000000000000000000000000000000000000900460ff161561115c576040805160e560020a62461bcd02815260206004820152602d60248201527f436f6e74726163742069732063757272656e746c79206c6f636b656420666f7260448201527f206d6f64696669636174696f6e00000000000000000000000000000000000000606482015290519081900360840190fd5b600054600160a060020a031633146111be576040805160e560020a62461bcd02815260206004820152601960248201527f4f776e6572206163636f756e7420697320726571756972656400000000000000604482015290519081900360640190fd5b6007805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383811691821792839055604051919216907ff7189b85d7899f5a32d733e6584c4f1dcdff0274f09d969d186c1797673ede1190600090a350565b600954600160a060020a031681565b600160a060020a031660009081526005602052604090205490565b60005474010000000000000000000000000000000000000000900460ff16156112de576040805160e560020a62461bcd02815260206004820152602d60248201527f436f6e74726163742069732063757272656e746c79206c6f636b656420666f7260448201527f206d6f64696669636174696f6e00000000000000000000000000000000000000606482015290519081900360840190fd5b600054600160a060020a03163314611340576040805160e560020a62461bcd02815260206004820152601960248201527f4f776e6572206163636f756e7420697320726571756972656400000000000000604482015290519081900360640190fd5b600160a060020a03808216600090815260046020526040902054829116156113b2576040805160e560020a62461bcd02815260206004820152601a60248201527f4164647265737320686173206265656e2063616e63656c6c6564000000000000604482015290519081900360640190fd5b6113c360018463ffffffff6124d616565b80156113dd57506113db60018363ffffffff6124d616565b155b1515611459576040805160e560020a62461bcd02815260206004820152602a60248201527f4f726967696e616c20646f65736e2774206578697374206f72207265706c616360448201527f656d656e7420646f657300000000000000000000000000000000000000000000606482015290519081900360840190fd5b61146a60018463ffffffff6123c916565b5061147c60018363ffffffff61231216565b50600160a060020a038381166000818152600460209081526040808320805473ffffffffffffffffffffffffffffffffffffffff19169588169586179055600590915280822080548584528284205583835282905551339392917fb64971100522354f3d25283cb14e2eefcb0dd26a757482ccfe42479d0a68685791a4505050565b6000805474010000000000000000000000000000000000000000900460ff1615611598576040805160e560020a62461bcd02815260206004820152602d60248201527f436f6e74726163742069732063757272656e746c79206c6f636b656420666f7260448201527f206d6f64696669636174696f6e00000000000000000000000000000000000000606482015290519081900360840190fd5b600754600160a060020a031633146115fa576040805160e560020a62461bcd02815260206004820152601360248201527f4f6e6c792069737375657220616c6c6f77656400000000000000000000000000604482015290519081900360640190fd5b60075474010000000000000000000000000000000000000000900460ff161561166d576040805160e560020a62461bcd02815260206004820152601b60248201527f49737375696e6720697320616c72656164792066696e69736865640000000000604482015290519081900360640190fd5b6007805474ff00000000000000000000000000000000000000001916740100000000000000000000000000000000000000001790556040517f7bc15082cf539fecd9e12596dc8e4e77c17a81fccc2c267b626af583162232a290600090a15060075474010000000000000000000000000000000000000000900460ff1690565b600061170060018363ffffffff61250d16565b92915050565b600054600160a060020a031681565b60005474010000000000000000000000000000000000000000900460ff16156117ae576040805160e560020a62461bcd02815260206004820152602d60248201527f436f6e74726163742069732063757272656e746c79206c6f636b656420666f7260448201527f206d6f64696669636174696f6e00000000000000000000000000000000000000606482015290519081900360840190fd5b600054600160a060020a03163314611810576040805160e560020a62461bcd02815260206004820152601960248201527f4f776e6572206163636f756e7420697320726571756972656400000000000000604482015290519081900360640190fd5b600a805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60408051808201909152600581527f545a524f50000000000000000000000000000000000000000000000000000000602082015281565b600a54600160a060020a031681565b60005474010000000000000000000000000000000000000000900460ff1681565b60008054819074010000000000000000000000000000000000000000900460ff1615611942576040805160e560020a62461bcd02815260206004820152602d60248201527f436f6e74726163742069732063757272656e746c79206c6f636b656420666f7260448201527f206d6f64696669636174696f6e00000000000000000000000000000000000000606482015290519081900360840190fd5b600754600160a060020a031633146119a4576040805160e560020a62461bcd02815260206004820152601360248201527f4f6e6c792069737375657220616c6c6f77656400000000000000000000000000604482015290519081900360640190fd5b60075474010000000000000000000000000000000000000000900460ff1615611a17576040805160e560020a62461bcd02815260206004820152601b60248201527f49737375696e6720697320616c72656164792066696e69736865640000000000604482015290519081900360640190fd5b506008543390611a2d908463ffffffff6122aa16565b600855600160a060020a038116600090815260056020526040902054611a59908463ffffffff6122aa16565b600160a060020a038216600090815260056020526040902055611a8360018263ffffffff61231216565b50604080518481529051600160a060020a038316917fc65a3f767206d2fdcede0b094a4840e01c0dd0be1888b5ba800346eaa0123c16919081900360200190a2600191505b50919050565b6000805474010000000000000000000000000000000000000000900460ff1615611b68576040805160e560020a62461bcd02815260206004820152602d60248201527f436f6e74726163742069732063757272656e746c79206c6f636b656420666f7260448201527f206d6f64696669636174696f6e00000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a0380841660009081526004602052604090205484911615611bda576040805160e560020a62461bcd02815260206004820152601a60248201527f4164647265737320686173206265656e2063616e63656c6c6564000000000000604482015290519081900360640190fd5b33600081815260056020526040902054849190821115611c6a576040805160e560020a62461bcd02815260206004820152602560248201527f42616c616e6365206973206d6f7265207468616e2066726f6d2061646472657360448201527f7320686173000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b60075433908790600160a060020a0316821415611d7057600a54604080517f75cd51ed000000000000000000000000000000000000000000000000000000008152600160a060020a038481166004830152915191909216916375cd51ed9160248083019260209291908290030181600087803b158015611ce957600080fd5b505af1158015611cfd573d6000803e3d6000fd5b505050506040513d6020811015611d1357600080fd5b50511515611d6b576040805160e560020a62461bcd02815260206004820152601d60248201527f54686520746f206164647265737320646f6573206e6f74206578697374000000604482015290519081900360640190fd5b611e62565b600954604080517f6c85cf67000000000000000000000000000000000000000000000000000000008152600160a060020a038581166004830152848116602483015291519190921691636c85cf679160448083019260209291908290030181600087803b158015611de057600080fd5b505af1158015611df4573d6000803e3d6000fd5b505050506040513d6020811015611e0a57600080fd5b50511515611e62576040805160e560020a62461bcd02815260206004820152601760248201527f416464726573732063616e6e6f74207472616e73666572000000000000000000604482015290519081900360640190fd5b33600090815260056020526040902054611e82908863ffffffff61224a16565b3360009081526005602052604080822092909255600160a060020a038a1681522054611eb4908863ffffffff6122aa16565b600160a060020a038916600090815260056020526040902055611ede60018963ffffffff61231216565b50336000908152600560205260409020541515611f0857611f0660013363ffffffff6123c916565b505b604080518881529051600160a060020a038a169133917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a3506001979650505050505050565b600061170060018363ffffffff6124d616565b6000805474010000000000000000000000000000000000000000900460ff1615612003576040805160e560020a62461bcd02815260206004820152602d60248201527f436f6e74726163742069732063757272656e746c79206c6f636b656420666f7260448201527f206d6f64696669636174696f6e00000000000000000000000000000000000000606482015290519081900360840190fd5b50600160a060020a03918216600090815260066020908152604080832093909416825291909152205490565b600080548190600160a060020a03163314612094576040805160e560020a62461bcd02815260206004820152601960248201527f4f776e6572206163636f756e7420697320726571756972656400000000000000604482015290519081900360640190fd5b600160a060020a03831615156120f4576040805160e560020a62461bcd02815260206004820152601960248201527f4e6f6e2d7a65726f206164647265737320726571756972656400000000000000604482015290519081900360640190fd5b50600160a060020a03808316600090815260046020526040902054168015156117005760009150611ac8565b60005474010000000000000000000000000000000000000000900460ff16156121b9576040805160e560020a62461bcd02815260206004820152602d60248201527f436f6e74726163742069732063757272656e746c79206c6f636b656420666f7260448201527f206d6f64696669636174696f6e00000000000000000000000000000000000000606482015290519081900360840190fd5b600054600160a060020a0316331461221b576040805160e560020a62461bcd02815260206004820152601960248201527f4f776e6572206163636f756e7420697320726571756972656400000000000000604482015290519081900360640190fd5b6009805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b6000828211156122a4576040805160e560020a62461bcd02815260206004820152601460248201527f526573756c747320696e20756e646572666c6f77000000000000000000000000604482015290519081900360640190fd5b50900390565b600082820183811015612307576040805160e560020a62461bcd02815260206004820152601360248201527f526573756c747320696e206f766572666c6f7700000000000000000000000000604482015290519081900360640190fd5b8091505b5092915050565b600080600160a060020a038316151561232e576000915061230b565b50600160a060020a03821660009081526001840160205260408120546000190190811280159061235e5750835481125b1561236c576000915061230b565b83546001908101808655600160a060020a03851660008181528388016020908152604080832085905593825260028901905291909120805473ffffffffffffffffffffffffffffffffffffffff1916909117905591505092915050565b600160a060020a0381166000908152600180840160205260408220549082908212806123f55750845482135b1561240357600092506124ce565b8454821215612478575083546000908152600285016020818152604080842054600160a060020a031680855260018901835281852086905585855292909152808320805473ffffffffffffffffffffffffffffffffffffffff19908116841790915587548452922080549092169091556124a4565b60008281526002860160205260409020805473ffffffffffffffffffffffffffffffffffffffff191690555b600160a060020a038416600090815260018087016020526040822091909155855460001901865592505b505092915050565b600160a060020a0381166000908152600183016020526040812054600019018181128015906125055750835481125b949350505050565b600080821215801561251f5750825482125b1515612575576040805160e560020a62461bcd02815260206004820152601860248201527f496e646578206f757473696465206f6620626f756e64732e0000000000000000604482015290519081900360640190fd5b5060010160009081526002919091016020526040902054600160a060020a0316905600a165627a7a7230582099c8ad7cc21c5fd4dc66bc38990d6bcfed48314768acc1ce8462c6936dbc69690029
Deployed Bytecode
0x60806040526004361061017f5763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166306fdde038114610184578063095ea7b31461020e57806318160ddd146102465780631d1438481461026d578063211e28b61461029e57806323b872dd146102ba5780632da7293e146102e4578063313ce5671461030557806334a84827146103305780633723bc0e1461035157806341c0e1b5146103665780634ef05a711461037b5780634fb2e45d1461039057806355cc4e57146103b15780636290865d146103d257806370a08231146103e757806379f64720146104085780637e8d1a391461042f5780638082a929146104445780638da5cb5b1461045c5780639137c1a71461047157806395d89b4114610492578063975057e7146104a7578063a4e2d634146104bc578063a5820daa146104d1578063a9059cbb146104e9578063d4d7b19a1461050d578063dd62ed3e1461052e578063e37ccac714610555578063f898178914610576575b600080fd5b34801561019057600080fd5b50610199610597565b6040805160208082528351818301528351919283929083019185019080838360005b838110156101d35781810151838201526020016101bb565b50505050905090810190601f1680156102005780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561021a57600080fd5b50610232600160a060020a03600435166024356105ce565b604080519115158252519081900360200190f35b34801561025257600080fd5b5061025b6106cf565b60408051918252519081900360200190f35b34801561027957600080fd5b506102826106d5565b60408051600160a060020a039092168252519081900360200190f35b3480156102aa57600080fd5b506102b860043515156106e4565b005b3480156102c657600080fd5b50610232600160a060020a0360043581169060243516604435610826565b3480156102f057600080fd5b50610232600160a060020a0360043516610ddb565b34801561031157600080fd5b5061031a610e5f565b6040805160ff9092168252519081900360200190f35b34801561033c57600080fd5b50610282600160a060020a0360043516610e64565b34801561035d57600080fd5b5061025b610e7f565b34801561037257600080fd5b506102b8610e85565b34801561038757600080fd5b50610232610ef5565b34801561039c57600080fd5b506102b8600160a060020a0360043516610f16565b3480156103bd57600080fd5b506102b8600160a060020a03600435166110c3565b3480156103de57600080fd5b5061028261121b565b3480156103f357600080fd5b5061025b600160a060020a036004351661122a565b34801561041457600080fd5b506102b8600160a060020a0360043581169060243516611245565b34801561043b57600080fd5b506102326114fe565b34801561045057600080fd5b506102826004356116ed565b34801561046857600080fd5b50610282611706565b34801561047d57600080fd5b506102b8600160a060020a0360043516611715565b34801561049e57600080fd5b5061019961183f565b3480156104b357600080fd5b50610282611876565b3480156104c857600080fd5b50610232611885565b3480156104dd57600080fd5b506102326004356118a6565b3480156104f557600080fd5b50610232600160a060020a0360043516602435611ace565b34801561051957600080fd5b50610232600160a060020a0360043516611f56565b34801561053a57600080fd5b5061025b600160a060020a0360043581169060243516611f69565b34801561056157600080fd5b50610282600160a060020a036004351661202f565b34801561058257600080fd5b506102b8600160a060020a0360043516612120565b60408051808201909152600f81527f545a45524f205052454645525245440000000000000000000000000000000000602082015281565b6000805474010000000000000000000000000000000000000000900460ff1615610668576040805160e560020a62461bcd02815260206004820152602d60248201527f436f6e74726163742069732063757272656e746c79206c6f636b656420666f7260448201527f206d6f64696669636174696f6e00000000000000000000000000000000000000606482015290519081900360840190fd5b336000818152600660209081526040808320600160a060020a03881680855290835292819020869055805186815290519293927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a350600192915050565b60085490565b600754600160a060020a031681565b600054600160a060020a03163314610746576040805160e560020a62461bcd02815260206004820152601960248201527f4f776e6572206163636f756e7420697320726571756972656400000000000000604482015290519081900360640190fd5b60005460ff7401000000000000000000000000000000000000000090910416151581151514156107e6576040805160e560020a62461bcd02815260206004820152602860248201527f436f6e747261637420616c726561647920696e20726571756573746564206c6f60448201527f636b207374617465000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b60008054911515740100000000000000000000000000000000000000000274ff000000000000000000000000000000000000000019909216919091179055565b600160a060020a038316600090815260056020526040812054829085908211156108c0576040805160e560020a62461bcd02815260206004820152602560248201527f42616c616e6365206973206d6f7265207468616e2066726f6d2061646472657360448201527f7320686173000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a0380861660009081526004602052604090205486911615610932576040805160e560020a62461bcd02815260206004820152601a60248201527f4164647265737320686173206265656e2063616e63656c6c6564000000000000604482015290519081900360640190fd5b60005487908790600160a060020a0316331415610a3857600a54604080517f75cd51ed000000000000000000000000000000000000000000000000000000008152600160a060020a038481166004830152915191909216916375cd51ed9160248083019260209291908290030181600087803b1580156109b157600080fd5b505af11580156109c5573d6000803e3d6000fd5b505050506040513d60208110156109db57600080fd5b50511515610a33576040805160e560020a62461bcd02815260206004820152601d60248201527f54686520746f206164647265737320646f6573206e6f74206578697374000000604482015290519081900360640190fd5b610b2a565b600954604080517f6c85cf67000000000000000000000000000000000000000000000000000000008152600160a060020a038581166004830152848116602483015291519190921691636c85cf679160448083019260209291908290030181600087803b158015610aa857600080fd5b505af1158015610abc573d6000803e3d6000fd5b505050506040513d6020811015610ad257600080fd5b50511515610b2a576040805160e560020a62461bcd02815260206004820152601760248201527f416464726573732063616e6e6f74207472616e73666572000000000000000000604482015290519081900360640190fd5b60005474010000000000000000000000000000000000000000900460ff1615610bc3576040805160e560020a62461bcd02815260206004820152602d60248201527f436f6e74726163742069732063757272656e746c79206c6f636b656420666f7260448201527f206d6f64696669636174696f6e00000000000000000000000000000000000000606482015290519081900360840190fd5b600054600160a060020a03163314610ccf57600160a060020a0389166000908152600660209081526040808320338452909152902054871115610c76576040805160e560020a62461bcd02815260206004820152602960248201527f56616c75652065786365656473207768617420697320616c6c6f77656420746f60448201527f207472616e736665720000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a0389166000908152600660209081526040808320338452909152902054610caa908863ffffffff61224a16565b600160a060020a038a1660009081526006602090815260408083203384529091529020555b600160a060020a038916600090815260056020526040902054610cf8908863ffffffff61224a16565b600160a060020a03808b1660009081526005602052604080822093909355908a1681522054610d2d908863ffffffff6122aa16565b600160a060020a038916600090815260056020526040902055610d5760018963ffffffff61231216565b50336000908152600560205260409020541515610d8157610d7f60018a63ffffffff6123c916565b505b87600160a060020a031689600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef896040518082815260200191505060405180910390a350600198975050505050505050565b60008054600160a060020a03163314610e3e576040805160e560020a62461bcd02815260206004820152601960248201527f4f776e6572206163636f756e7420697320726571756972656400000000000000604482015290519081900360640190fd5b50600160a060020a0390811660009081526004602052604090205416151590565b600081565b600460205260009081526040902054600160a060020a031681565b60015481565b600054600160a060020a03163314610ee7576040805160e560020a62461bcd02815260206004820152601960248201527f4f776e6572206163636f756e7420697320726571756972656400000000000000604482015290519081900360640190fd5b600054600160a060020a0316ff5b60075474010000000000000000000000000000000000000000900460ff1681565b60008054600160a060020a03163314610f79576040805160e560020a62461bcd02815260206004820152601960248201527f4f776e6572206163636f756e7420697320726571756972656400000000000000604482015290519081900360640190fd5b600054600160a060020a0383811691161415611005576040805160e560020a62461bcd02815260206004820152602560248201527f4e6577204f776e65722063616e6e6f74206265207468652063757272656e742060448201527f6f776e6572000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a0382161515611065576040805160e560020a62461bcd02815260206004820181905260248201527f4e6577204f776e65722063616e6e6f74206265207a65726f2061646472657373604482015290519081900360640190fd5b5060008054600160a060020a0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8934ce4adea8d9ce0d714d2c22b86790e41b7731c84b926fbbdc1d40ff6533c99190a35050565b60005474010000000000000000000000000000000000000000900460ff161561115c576040805160e560020a62461bcd02815260206004820152602d60248201527f436f6e74726163742069732063757272656e746c79206c6f636b656420666f7260448201527f206d6f64696669636174696f6e00000000000000000000000000000000000000606482015290519081900360840190fd5b600054600160a060020a031633146111be576040805160e560020a62461bcd02815260206004820152601960248201527f4f776e6572206163636f756e7420697320726571756972656400000000000000604482015290519081900360640190fd5b6007805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383811691821792839055604051919216907ff7189b85d7899f5a32d733e6584c4f1dcdff0274f09d969d186c1797673ede1190600090a350565b600954600160a060020a031681565b600160a060020a031660009081526005602052604090205490565b60005474010000000000000000000000000000000000000000900460ff16156112de576040805160e560020a62461bcd02815260206004820152602d60248201527f436f6e74726163742069732063757272656e746c79206c6f636b656420666f7260448201527f206d6f64696669636174696f6e00000000000000000000000000000000000000606482015290519081900360840190fd5b600054600160a060020a03163314611340576040805160e560020a62461bcd02815260206004820152601960248201527f4f776e6572206163636f756e7420697320726571756972656400000000000000604482015290519081900360640190fd5b600160a060020a03808216600090815260046020526040902054829116156113b2576040805160e560020a62461bcd02815260206004820152601a60248201527f4164647265737320686173206265656e2063616e63656c6c6564000000000000604482015290519081900360640190fd5b6113c360018463ffffffff6124d616565b80156113dd57506113db60018363ffffffff6124d616565b155b1515611459576040805160e560020a62461bcd02815260206004820152602a60248201527f4f726967696e616c20646f65736e2774206578697374206f72207265706c616360448201527f656d656e7420646f657300000000000000000000000000000000000000000000606482015290519081900360840190fd5b61146a60018463ffffffff6123c916565b5061147c60018363ffffffff61231216565b50600160a060020a038381166000818152600460209081526040808320805473ffffffffffffffffffffffffffffffffffffffff19169588169586179055600590915280822080548584528284205583835282905551339392917fb64971100522354f3d25283cb14e2eefcb0dd26a757482ccfe42479d0a68685791a4505050565b6000805474010000000000000000000000000000000000000000900460ff1615611598576040805160e560020a62461bcd02815260206004820152602d60248201527f436f6e74726163742069732063757272656e746c79206c6f636b656420666f7260448201527f206d6f64696669636174696f6e00000000000000000000000000000000000000606482015290519081900360840190fd5b600754600160a060020a031633146115fa576040805160e560020a62461bcd02815260206004820152601360248201527f4f6e6c792069737375657220616c6c6f77656400000000000000000000000000604482015290519081900360640190fd5b60075474010000000000000000000000000000000000000000900460ff161561166d576040805160e560020a62461bcd02815260206004820152601b60248201527f49737375696e6720697320616c72656164792066696e69736865640000000000604482015290519081900360640190fd5b6007805474ff00000000000000000000000000000000000000001916740100000000000000000000000000000000000000001790556040517f7bc15082cf539fecd9e12596dc8e4e77c17a81fccc2c267b626af583162232a290600090a15060075474010000000000000000000000000000000000000000900460ff1690565b600061170060018363ffffffff61250d16565b92915050565b600054600160a060020a031681565b60005474010000000000000000000000000000000000000000900460ff16156117ae576040805160e560020a62461bcd02815260206004820152602d60248201527f436f6e74726163742069732063757272656e746c79206c6f636b656420666f7260448201527f206d6f64696669636174696f6e00000000000000000000000000000000000000606482015290519081900360840190fd5b600054600160a060020a03163314611810576040805160e560020a62461bcd02815260206004820152601960248201527f4f776e6572206163636f756e7420697320726571756972656400000000000000604482015290519081900360640190fd5b600a805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60408051808201909152600581527f545a524f50000000000000000000000000000000000000000000000000000000602082015281565b600a54600160a060020a031681565b60005474010000000000000000000000000000000000000000900460ff1681565b60008054819074010000000000000000000000000000000000000000900460ff1615611942576040805160e560020a62461bcd02815260206004820152602d60248201527f436f6e74726163742069732063757272656e746c79206c6f636b656420666f7260448201527f206d6f64696669636174696f6e00000000000000000000000000000000000000606482015290519081900360840190fd5b600754600160a060020a031633146119a4576040805160e560020a62461bcd02815260206004820152601360248201527f4f6e6c792069737375657220616c6c6f77656400000000000000000000000000604482015290519081900360640190fd5b60075474010000000000000000000000000000000000000000900460ff1615611a17576040805160e560020a62461bcd02815260206004820152601b60248201527f49737375696e6720697320616c72656164792066696e69736865640000000000604482015290519081900360640190fd5b506008543390611a2d908463ffffffff6122aa16565b600855600160a060020a038116600090815260056020526040902054611a59908463ffffffff6122aa16565b600160a060020a038216600090815260056020526040902055611a8360018263ffffffff61231216565b50604080518481529051600160a060020a038316917fc65a3f767206d2fdcede0b094a4840e01c0dd0be1888b5ba800346eaa0123c16919081900360200190a2600191505b50919050565b6000805474010000000000000000000000000000000000000000900460ff1615611b68576040805160e560020a62461bcd02815260206004820152602d60248201527f436f6e74726163742069732063757272656e746c79206c6f636b656420666f7260448201527f206d6f64696669636174696f6e00000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a0380841660009081526004602052604090205484911615611bda576040805160e560020a62461bcd02815260206004820152601a60248201527f4164647265737320686173206265656e2063616e63656c6c6564000000000000604482015290519081900360640190fd5b33600081815260056020526040902054849190821115611c6a576040805160e560020a62461bcd02815260206004820152602560248201527f42616c616e6365206973206d6f7265207468616e2066726f6d2061646472657360448201527f7320686173000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b60075433908790600160a060020a0316821415611d7057600a54604080517f75cd51ed000000000000000000000000000000000000000000000000000000008152600160a060020a038481166004830152915191909216916375cd51ed9160248083019260209291908290030181600087803b158015611ce957600080fd5b505af1158015611cfd573d6000803e3d6000fd5b505050506040513d6020811015611d1357600080fd5b50511515611d6b576040805160e560020a62461bcd02815260206004820152601d60248201527f54686520746f206164647265737320646f6573206e6f74206578697374000000604482015290519081900360640190fd5b611e62565b600954604080517f6c85cf67000000000000000000000000000000000000000000000000000000008152600160a060020a038581166004830152848116602483015291519190921691636c85cf679160448083019260209291908290030181600087803b158015611de057600080fd5b505af1158015611df4573d6000803e3d6000fd5b505050506040513d6020811015611e0a57600080fd5b50511515611e62576040805160e560020a62461bcd02815260206004820152601760248201527f416464726573732063616e6e6f74207472616e73666572000000000000000000604482015290519081900360640190fd5b33600090815260056020526040902054611e82908863ffffffff61224a16565b3360009081526005602052604080822092909255600160a060020a038a1681522054611eb4908863ffffffff6122aa16565b600160a060020a038916600090815260056020526040902055611ede60018963ffffffff61231216565b50336000908152600560205260409020541515611f0857611f0660013363ffffffff6123c916565b505b604080518881529051600160a060020a038a169133917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a3506001979650505050505050565b600061170060018363ffffffff6124d616565b6000805474010000000000000000000000000000000000000000900460ff1615612003576040805160e560020a62461bcd02815260206004820152602d60248201527f436f6e74726163742069732063757272656e746c79206c6f636b656420666f7260448201527f206d6f64696669636174696f6e00000000000000000000000000000000000000606482015290519081900360840190fd5b50600160a060020a03918216600090815260066020908152604080832093909416825291909152205490565b600080548190600160a060020a03163314612094576040805160e560020a62461bcd02815260206004820152601960248201527f4f776e6572206163636f756e7420697320726571756972656400000000000000604482015290519081900360640190fd5b600160a060020a03831615156120f4576040805160e560020a62461bcd02815260206004820152601960248201527f4e6f6e2d7a65726f206164647265737320726571756972656400000000000000604482015290519081900360640190fd5b50600160a060020a03808316600090815260046020526040902054168015156117005760009150611ac8565b60005474010000000000000000000000000000000000000000900460ff16156121b9576040805160e560020a62461bcd02815260206004820152602d60248201527f436f6e74726163742069732063757272656e746c79206c6f636b656420666f7260448201527f206d6f64696669636174696f6e00000000000000000000000000000000000000606482015290519081900360840190fd5b600054600160a060020a0316331461221b576040805160e560020a62461bcd02815260206004820152601960248201527f4f776e6572206163636f756e7420697320726571756972656400000000000000604482015290519081900360640190fd5b6009805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b6000828211156122a4576040805160e560020a62461bcd02815260206004820152601460248201527f526573756c747320696e20756e646572666c6f77000000000000000000000000604482015290519081900360640190fd5b50900390565b600082820183811015612307576040805160e560020a62461bcd02815260206004820152601360248201527f526573756c747320696e206f766572666c6f7700000000000000000000000000604482015290519081900360640190fd5b8091505b5092915050565b600080600160a060020a038316151561232e576000915061230b565b50600160a060020a03821660009081526001840160205260408120546000190190811280159061235e5750835481125b1561236c576000915061230b565b83546001908101808655600160a060020a03851660008181528388016020908152604080832085905593825260028901905291909120805473ffffffffffffffffffffffffffffffffffffffff1916909117905591505092915050565b600160a060020a0381166000908152600180840160205260408220549082908212806123f55750845482135b1561240357600092506124ce565b8454821215612478575083546000908152600285016020818152604080842054600160a060020a031680855260018901835281852086905585855292909152808320805473ffffffffffffffffffffffffffffffffffffffff19908116841790915587548452922080549092169091556124a4565b60008281526002860160205260409020805473ffffffffffffffffffffffffffffffffffffffff191690555b600160a060020a038416600090815260018087016020526040822091909155855460001901865592505b505092915050565b600160a060020a0381166000908152600183016020526040812054600019018181128015906125055750835481125b949350505050565b600080821215801561251f5750825482125b1515612575576040805160e560020a62461bcd02815260206004820152601860248201527f496e646578206f757473696465206f6620626f756e64732e0000000000000000604482015290519081900360640190fd5b5060010160009081526002919091016020526040902054600160a060020a0316905600a165627a7a7230582099c8ad7cc21c5fd4dc66bc38990d6bcfed48314768acc1ce8462c6936dbc69690029
Swarm Source
bzzr://99c8ad7cc21c5fd4dc66bc38990d6bcfed48314768acc1ce8462c6936dbc6969
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 27 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ 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.