Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 6303219 | 2210 days ago | IN | 0 ETH | 0.00553034 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
OwnerValidatorImpl
Compiler Version
v0.4.24+commit.e67f0147
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2018-09-10 */ pragma solidity ^0.4.1; // File: contracts/OwnerValidator.sol contract TokenContract { function totalSupply() constant returns (uint256 supply); function decimals() constant returns(uint8 units); function balanceOf(address _owner) constant returns (uint256 balance); function transfer(address _to, address _msgSender, uint256 _value) returns (bool success); function transferFrom(address _from, address _to, address _msgSender, uint256 _value) returns (bool success); function transferFromSender(address _to, uint256 _value) returns (bool success); function approve(address _spender, address _msgSender, uint256 _value) returns (bool success); function allowance(address _owner, address _spender) constant returns (uint256 remaining); } contract OwnerValidator { function validate(address addr) constant returns (bool); } contract Owned { function ownerValidate(address addr) constant returns (bool); bool public isWorking; function Owned() { isWorking = true; } modifier onlyOwner { if (!ownerValidate(msg.sender)) throw; _; } modifier onlyWorking { if (!isWorking) throw; _; } modifier onlyNotWorking { if (isWorking) throw; _; } function setWorking(bool _isWorking) onlyOwner { isWorking = _isWorking; } } contract OwnerValidatorImpl is OwnerValidator, Owned { address[] public owners; TokenContract public tokenContract; function OwnerValidatorImpl() { owners.push(msg.sender); } function indexOfOwners(address _address) private constant returns (uint pos) { pos = 0; for (uint i = 0; i < owners.length; i++) { if (owners[i] == _address) { pos = i + 1; break; } } return pos; } function validate(address addr) constant returns (bool) { return (indexOfOwners(addr) != 0); } function getOwners() constant returns (address[]) { return owners; } function addOwner(address addr) onlyWorking { if (validate(msg.sender)) { if (!validate(addr)) { owners.push(addr); } } } function removeOwner(address addr) onlyWorking { if (validate(msg.sender)) { uint pos = indexOfOwners(addr); if (pos > 0) { owners[pos - 1] = 0x0; } } } function setTokenContract(address _tokenContract) onlyWorking { if (validate(msg.sender)) { tokenContract = TokenContract(_tokenContract); } } function ownerValidate(address addr) constant returns (bool) { return validate(addr); } function transferFromSender(address _to, uint256 _value) returns (bool success) { if (!validate(msg.sender)) throw; return tokenContract.transferFromSender(_to, _value); } function sendFromOwn(address _to, uint256 _value) returns (bool success) { if (!validate(msg.sender)) throw; if (!_to.send(_value)) throw; return true; } } // File: contracts/OffChainManager.sol contract OffChainManager { function isToOffChainAddress(address addr) constant returns (bool); function getOffChainRootAddress() constant returns (address); } contract OffChainManagerImpl is OffChainManager, Owned { address public rootAddress; address[] public offChainAddreses; mapping (address => uint256) refOffChainAddresses; OwnerValidator public ownerValidator; TokenContract public tokenContract; function OffChainManagerImpl( address _rootAddress, address _ownerValidator ) { rootAddress = _rootAddress; ownerValidator = OwnerValidator(_ownerValidator); } function setRootAddress(address _address) onlyWorking { if (ownerValidator.validate(msg.sender)) { rootAddress = _address; } } function setOwnerValidatorAddress(address _ownerValidator) onlyWorking { if (ownerValidator.validate(msg.sender)) { ownerValidator = OwnerValidator(_ownerValidator); } } function setTokenContract(address _tokenContract) { if (ownerValidator.validate(msg.sender)) { tokenContract = TokenContract(_tokenContract); } } function offChainAddresesValidCount() constant returns (uint) { uint cnt = 0; for (uint i = 0; i < offChainAddreses.length; i++) { if (offChainAddreses[i] != 0) { cnt++; } } return cnt; } function addOffChainAddress(address _address) private { if (!isToOffChainAddress(_address)) { offChainAddreses.push(_address); refOffChainAddresses[_address] = offChainAddreses.length; } } function removeOffChainAddress(address _address) private { uint pos = refOffChainAddresses[_address]; if (pos > 0) { offChainAddreses[pos - 1] = 0; refOffChainAddresses[_address] = 0x0; } } function addOffChainAddresses(address[] _addresses) onlyWorking { if (ownerValidator.validate(msg.sender)) { for (uint i = 0; i < _addresses.length; i++) { addOffChainAddress(_addresses[i]); } } } function removeOffChainAddresses(address[] _addresses) onlyWorking { if (ownerValidator.validate(msg.sender)) { for (uint i = 0; i < _addresses.length; i++) { removeOffChainAddress(_addresses[i]); } } } function ownerValidate(address addr) constant returns (bool) { return ownerValidator.validate(addr); } function transferFromSender(address _to, uint256 _value) returns (bool success) { if (!ownerValidator.validate(msg.sender)) throw; return tokenContract.transferFromSender(_to, _value); } function sendFromOwn(address _to, uint256 _value) returns (bool success) { if (!ownerValidator.validate(msg.sender)) throw; if (!_to.send(_value)) throw; return true; } function isToOffChainAddress(address addr) constant returns (bool) { return refOffChainAddresses[addr] > 0; } function getOffChainRootAddress() constant returns (address) { return rootAddress; } function getOffChainAddresses() constant returns (address[]) { return offChainAddreses; } function isToOffChainAddresses(address[] _addresses) constant returns (bool) { for (uint i = 0; i < _addresses.length; i++) { if (!isToOffChainAddress(_addresses[i])) { return false; } } return true; } } // File: contracts/TokenContract.sol library SafeMath { function mul(uint256 a, uint256 b) internal constant returns (uint256) { uint256 c = a * b; assert(a == 0 || c / a == b); return c; } function div(uint256 a, uint256 b) internal constant returns (uint256) { // assert(b > 0); uint256 c = a / b; // assert(a == b * c + a % b); return c; } function sub(uint256 a, uint256 b) internal constant returns (uint256) { assert(b <= a); return a - b; } function add(uint256 a, uint256 b) internal constant returns (uint256) { uint256 c = a + b; assert(c >= a); return c; } } contract TokenContractImpl is TokenContract, Owned { using SafeMath for uint256; string public standard = "Token 0.1"; uint256 _totalSupply; uint8 _decimals; address public _mainAddress; mapping (address => uint256) public balances; mapping (address => mapping (address => uint256)) public allowed; OwnerValidator public ownerValidator; OffChainManager public offChainManager; bool public isRedenominated; uint256 public redenomiValue; mapping (address => uint256) public redenominatedBalances; mapping (address => mapping (address => uint256)) public redenominatedAllowed; function TokenContractImpl( uint256 initialSupply, uint8 decimals, address _ownerValidator, address _offChainManager ){ balances[msg.sender] = initialSupply; _totalSupply = initialSupply; _decimals = decimals; ownerValidator = OwnerValidator(_ownerValidator); offChainManager = OffChainManager(_offChainManager); } function totalSupply() constant returns (uint256 totalSupply) { if (isRedenominated) { return redenominatedValue(_totalSupply); } return _totalSupply; } function decimals() constant returns (uint8 decimals) { return _decimals; } function balanceOf(address _owner) constant returns (uint256 balance) { if (isRedenominated) { if (redenominatedBalances[_owner] > 0) { return redenominatedBalances[_owner]; } return redenominatedValue(balances[_owner]); } return balances[_owner]; } function allowance(address _owner, address _spender) constant returns (uint remaining) { if (isRedenominated) { if (redenominatedAllowed[_owner][_spender] > 0) { return redenominatedAllowed[_owner][_spender]; } return redenominatedValue(allowed[_owner][_spender]); } return allowed[_owner][_spender]; } function redenominatedValue(uint256 _value) private returns (uint256) { return _value.mul(redenomiValue); } function ownerValidate(address addr) constant returns (bool) { return ownerValidator.validate(addr); } function redenominate(uint256 _redenomiValue) { if (isRedenominated) throw; if (ownerValidator.validate(msg.sender)) { redenomiValue = _redenomiValue; Redenominate(msg.sender, isRedenominated, redenomiValue); } } function applyRedenomination() onlyNotWorking { if (isRedenominated) throw; if (redenomiValue == 0) throw; if (ownerValidator.validate(msg.sender)) { isRedenominated = true; ApplyRedenomination(msg.sender, isRedenominated, redenomiValue); } } function setOwnerValidatorAddress(address _ownerValidator) onlyWorking { if (ownerValidator.validate(msg.sender)) { ownerValidator = OwnerValidator(_ownerValidator); } } function setOffChainManagerAddress(address _offChainManager) onlyWorking { if (ownerValidator.validate(msg.sender)) { offChainManager = OffChainManager(_offChainManager); } } function transfer(address _to, address _msgSender, uint256 _value) onlyWorking returns (bool success) { if (msg.sender != _mainAddress) throw; return transferProcess(_msgSender, _to, _value); } function transferProcess(address _from, address _to, uint256 _value) private returns (bool success) { if (balanceOf(_from) < _value) throw; subtractBalance(_from, _value); if (offChainManager.isToOffChainAddress(_to)) { addBalance(offChainManager.getOffChainRootAddress(), _value); ToOffChainTransfer(_from, _to, _to, _value); } else { addBalance(_to, _value); } return true; } function addBalance(address _address, uint256 _value) private { if (isRedenominated) { if (redenominatedBalances[_address] == 0) { if (balances[_address] > 0) { redenominatedBalances[_address] = redenominatedValue(balances[_address]); balances[_address] = 0; } } redenominatedBalances[_address] = redenominatedBalances[_address].add(_value); } else { balances[_address] = balances[_address].add(_value); } } function subtractBalance(address _address, uint256 _value) private { if (isRedenominated) { if (redenominatedBalances[_address] == 0) { if (balances[_address] > 0) { redenominatedBalances[_address] = redenominatedValue(balances[_address]); balances[_address] = 0; } } redenominatedBalances[_address] = redenominatedBalances[_address].sub(_value); } else { balances[_address] = balances[_address].sub(_value); } } function transferFrom(address _from, address _to, address _msgSender, uint256 _value) onlyWorking returns (bool success) { if (msg.sender != _mainAddress) throw; if (balanceOf(_from) < _value) throw; if (balanceOf(_to).add(_value) < balanceOf(_to)) throw; if (_value > allowance(_from, _msgSender)) throw; subtractBalance(_from, _value); if (offChainManager.isToOffChainAddress(_to)) { addBalance(offChainManager.getOffChainRootAddress(), _value); ToOffChainTransfer(_msgSender, _to, _to, _value); } else { addBalance(_to, _value); } subtractAllowed(_from, _msgSender, _value); return true; } function transferFromSender(address _to, uint256 _value) onlyWorking returns (bool success) { if (!transferProcess(msg.sender, _to, _value)) throw; TransferFromSender(msg.sender, _to, _value); return true; } function transferFromOwn(address _to, uint256 _value) onlyWorking returns (bool success) { if (!ownerValidator.validate(msg.sender)) throw; if (!transferProcess(this, _to, _value)) throw; TransferFromSender(this, _to, _value); return true; } function sendFromOwn(address _to, uint256 _value) returns (bool success) { if (!ownerValidator.validate(msg.sender)) throw; if (!_to.send(_value)) throw; return true; } function approve(address _spender, address _msgSender, uint256 _value) onlyWorking returns (bool success) { if (msg.sender != _mainAddress) throw; setAllowed(_msgSender, _spender, _value); return true; } function subtractAllowed(address _from, address _spender, uint256 _value) private { if (isRedenominated) { if (redenominatedAllowed[_from][_spender] == 0) { if (allowed[_from][_spender] > 0) { redenominatedAllowed[_from][_spender] = redenominatedValue(allowed[_from][_spender]); allowed[_from][_spender] = 0; } } redenominatedAllowed[_from][_spender] = redenominatedAllowed[_from][_spender].sub(_value); } else { allowed[_from][_spender] = allowed[_from][_spender].sub(_value); } } function setAllowed(address _owner, address _spender, uint256 _value) private { if (isRedenominated) { redenominatedAllowed[_owner][_spender] = _value; } else { allowed[_owner][_spender] = _value; } } function setMainAddress(address _address) onlyOwner { _mainAddress = _address; } event TransferFromSender(address indexed _from, address indexed _to, uint256 _value); event ToOffChainTransfer(address indexed _from, address indexed _toKey, address _to, uint256 _value); event Redenominate(address _owner, bool _isRedenominated, uint256 _redenomiVakye); event ApplyRedenomination(address _owner, bool _isRedenominated, uint256 _redenomiVakye); } // File: contracts/MainContract.sol contract MainContract { string public standard = "Token 0.1"; string public name; string public symbol; OwnerValidator public ownerValidator; TokenContract public tokenContract; function MainContract( string _tokenName, address _ownerValidator, address _tokenContract, string _symbol ) { ownerValidator = OwnerValidator(_ownerValidator); tokenContract = TokenContract(_tokenContract); name = _tokenName; symbol = _symbol; } function totalSupply() constant returns(uint256 totalSupply) { return tokenContract.totalSupply(); } function decimals() constant returns(uint8 decimals) { return tokenContract.decimals(); } function setOwnerValidateAddress(address _ownerValidator) { if (ownerValidator.validate(msg.sender)) { ownerValidator = OwnerValidator(_ownerValidator); } } function setTokenContract(address _tokenContract) { if (ownerValidator.validate(msg.sender)) { tokenContract = TokenContract(_tokenContract); } } function transferFromSender(address _to, uint256 _value) returns (bool success) { if (!ownerValidator.validate(msg.sender)) throw; return tokenContract.transferFromSender(_to, _value); } function sendFromOwn(address _to, uint256 _value) returns (bool success) { if (!ownerValidator.validate(msg.sender)) throw; if (!_to.send(_value)) throw; return true; } function balanceOf(address _owner) constant returns (uint256 balance) { return uint256(tokenContract.balanceOf(_owner)); } function transfer(address _to, uint256 _value) returns (bool success) { if (tokenContract.transfer(_to, msg.sender, _value)) { Transfer(msg.sender, _to, _value); return true; } else { throw; } } function transferFrom(address _from, address _to, uint256 _value) returns (bool success) { if (tokenContract.transferFrom(_from, _to, msg.sender, _value)) { Transfer(_from, _to, _value); return true; } else { throw; } } function approve(address _spender, uint256 _value) returns (bool success) { if (tokenContract.approve(_spender,msg.sender,_value)) { Approval(msg.sender,_spender,_value); return true; } else { throw; } } function allowance(address _owner, address _spender) constant returns (uint256 remaining) { return tokenContract.allowance(_owner,_spender); } event Transfer(address indexed _from, address indexed _to, uint256 _value); event Approval(address indexed _owner, address indexed _spender, uint256 _value); }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"owners","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isWorking","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"addr","type":"address"}],"name":"removeOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"addr","type":"address"}],"name":"validate","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tokenContract","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_isWorking","type":"bool"}],"name":"setWorking","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"addr","type":"address"}],"name":"addOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"sendFromOwn","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getOwners","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"addr","type":"address"}],"name":"ownerValidate","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFromSender","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_tokenContract","type":"address"}],"name":"setTokenContract","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"}]
Contract Creation Code
608060405234801561001057600080fd5b506000805460ff1916600190811782558054808201825591527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6018054600160a060020a031916331790556106688061006a6000396000f3006080604052600436106100b95763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663025e7c2781146100be578063099aea0a146100f2578063173825d91461011b578063207c64fb1461013e57806355a373d61461015f5780636fb3ba9e146101745780637065cb481461018e5780637e621667146101af578063a0e67e2b146101d3578063b43545bb14610238578063bae804a714610259578063bbcd5bbe1461027d575b600080fd5b3480156100ca57600080fd5b506100d660043561029e565b60408051600160a060020a039092168252519081900360200190f35b3480156100fe57600080fd5b506101076102c6565b604080519115158252519081900360200190f35b34801561012757600080fd5b5061013c600160a060020a03600435166102cf565b005b34801561014a57600080fd5b50610107600160a060020a0360043516610349565b34801561016b57600080fd5b506100d661035c565b34801561018057600080fd5b5061013c600435151561036b565b34801561019a57600080fd5b5061013c600160a060020a0360043516610392565b3480156101bb57600080fd5b50610107600160a060020a036004351660243561041b565b3480156101df57600080fd5b506101e861046a565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561022457818101518382015260200161020c565b505050509050019250505060405180910390f35b34801561024457600080fd5b50610107600160a060020a03600435166104cc565b34801561026557600080fd5b50610107600160a060020a03600435166024356104dd565b34801561028957600080fd5b5061013c600160a060020a0360043516610595565b60018054829081106102ac57fe5b600091825260209091200154600160a060020a0316905081565b60005460ff1681565b6000805460ff1615156102e157600080fd5b6102ea33610349565b15610345576102f8826105e1565b90506000811115610345576000600180830381548110151561031657fe5b9060005260206000200160006101000a815481600160a060020a030219169083600160a060020a031602179055505b5050565b6000610354826105e1565b151592915050565b600254600160a060020a031681565b610374336104cc565b151561037f57600080fd5b6000805460ff1916911515919091179055565b60005460ff1615156103a357600080fd5b6103ac33610349565b15610418576103ba81610349565b1515610418576001805480820182556000919091527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf601805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b50565b600061042633610349565b151561043157600080fd5b604051600160a060020a0384169083156108fc029084906000818181858888f19350505050151561046157600080fd5b50600192915050565b606060018054806020026020016040519081016040528092919081815260200182805480156104c257602002820191906000526020600020905b8154600160a060020a031681526001909101906020018083116104a4575b5050505050905090565b60006104d782610349565b92915050565b60006104e833610349565b15156104f357600080fd5b600254604080517fbae804a7000000000000000000000000000000000000000000000000000000008152600160a060020a038681166004830152602482018690529151919092169163bae804a79160448083019260209291908290030181600087803b15801561056257600080fd5b505af1158015610576573d6000803e3d6000fd5b505050506040513d602081101561058c57600080fd5b50519392505050565b60005460ff1615156105a657600080fd5b6105af33610349565b156104185760028054600160a060020a03831673ffffffffffffffffffffffffffffffffffffffff1990911617905550565b6000805b6001548110156106365782600160a060020a031660018281548110151561060857fe5b600091825260209091200154600160a060020a0316141561062e57806001019150610636565b6001016105e5565b509190505600a165627a7a723058207d490d70fc7d421c271ea9832c36a9b751804db26adfec463ee1d0853ed033090029
Deployed Bytecode
0x6080604052600436106100b95763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663025e7c2781146100be578063099aea0a146100f2578063173825d91461011b578063207c64fb1461013e57806355a373d61461015f5780636fb3ba9e146101745780637065cb481461018e5780637e621667146101af578063a0e67e2b146101d3578063b43545bb14610238578063bae804a714610259578063bbcd5bbe1461027d575b600080fd5b3480156100ca57600080fd5b506100d660043561029e565b60408051600160a060020a039092168252519081900360200190f35b3480156100fe57600080fd5b506101076102c6565b604080519115158252519081900360200190f35b34801561012757600080fd5b5061013c600160a060020a03600435166102cf565b005b34801561014a57600080fd5b50610107600160a060020a0360043516610349565b34801561016b57600080fd5b506100d661035c565b34801561018057600080fd5b5061013c600435151561036b565b34801561019a57600080fd5b5061013c600160a060020a0360043516610392565b3480156101bb57600080fd5b50610107600160a060020a036004351660243561041b565b3480156101df57600080fd5b506101e861046a565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561022457818101518382015260200161020c565b505050509050019250505060405180910390f35b34801561024457600080fd5b50610107600160a060020a03600435166104cc565b34801561026557600080fd5b50610107600160a060020a03600435166024356104dd565b34801561028957600080fd5b5061013c600160a060020a0360043516610595565b60018054829081106102ac57fe5b600091825260209091200154600160a060020a0316905081565b60005460ff1681565b6000805460ff1615156102e157600080fd5b6102ea33610349565b15610345576102f8826105e1565b90506000811115610345576000600180830381548110151561031657fe5b9060005260206000200160006101000a815481600160a060020a030219169083600160a060020a031602179055505b5050565b6000610354826105e1565b151592915050565b600254600160a060020a031681565b610374336104cc565b151561037f57600080fd5b6000805460ff1916911515919091179055565b60005460ff1615156103a357600080fd5b6103ac33610349565b15610418576103ba81610349565b1515610418576001805480820182556000919091527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf601805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b50565b600061042633610349565b151561043157600080fd5b604051600160a060020a0384169083156108fc029084906000818181858888f19350505050151561046157600080fd5b50600192915050565b606060018054806020026020016040519081016040528092919081815260200182805480156104c257602002820191906000526020600020905b8154600160a060020a031681526001909101906020018083116104a4575b5050505050905090565b60006104d782610349565b92915050565b60006104e833610349565b15156104f357600080fd5b600254604080517fbae804a7000000000000000000000000000000000000000000000000000000008152600160a060020a038681166004830152602482018690529151919092169163bae804a79160448083019260209291908290030181600087803b15801561056257600080fd5b505af1158015610576573d6000803e3d6000fd5b505050506040513d602081101561058c57600080fd5b50519392505050565b60005460ff1615156105a657600080fd5b6105af33610349565b156104185760028054600160a060020a03831673ffffffffffffffffffffffffffffffffffffffff1990911617905550565b6000805b6001548110156106365782600160a060020a031660018281548110151561060857fe5b600091825260209091200154600160a060020a0316141561062e57806001019150610636565b6001016105e5565b509190505600a165627a7a723058207d490d70fc7d421c271ea9832c36a9b751804db26adfec463ee1d0853ed033090029
Swarm Source
bzzr://7d490d70fc7d421c271ea9832c36a9b751804db26adfec463ee1d0853ed03309
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 27 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.