Address Contract Partially Verified
Address
0x688fF43c3c19e4714f0BeB76df8Ee394207Ab411
Balance
0 ETH
Nonce
1
Code Size
1120 bytes
Creator
0x7d5A3523...0446 at tx 0x016d40a6...32b081
Last Active
Indexed Transactions
1 (10,608,284 → 10,608,284)
Gas Used (indexed)
50,909
Contract Bytecode
1120 bytes
0x608060405260043610610057576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680632f54bf6e146100615780633659cfe6146100bc5780635c60da1b146100ff575b61005f610156565b005b34801561006d57600080fd5b506100a2600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610170565b604051808215151515815260200191505060405180910390f35b3480156100c857600080fd5b506100fd600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506101c9565b005b34801561010b57600080fd5b50610114610278565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61015e610287565b61016e610169610289565b6102ba565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050919050565b6101d233610170565b151561026c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001807f4f776e6572526f6c653a2063616c6c657220646f6573206e6f7420686176652081526020017f746865204f776e657220726f6c6500000000000000000000000000000000000081525060400191505060405180910390fd5b610275816102e0565b50565b6000610282610289565b905090565b565b6000807f7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c36001029050805491505090565b3660008037600080366000845af43d6000803e80600081146102db573d6000f35b3d6000fd5b6102e98161034f565b7fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b81604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b600061035a82610421565b15156103f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603b8152602001807f43616e6e6f742073657420612070726f787920696d706c656d656e746174696f81526020017f6e20746f2061206e6f6e2d636f6e74726163742061646472657373000000000081525060400191505060405180910390fd5b7f7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c360010290508181555050565b600080823b9050600081119150509190505600a165627a7a723058200b5d2dadcad91f3b785d95eecc7b21ba1b82bcf44b9595b0277e96ea95490d450029
Verified Source Code Partial Match
Compiler: v0.4.24+commit.e67f0147
EVM: byzantium
Optimization: No
Proxy.sol 67 lines
pragma solidity ^0.4.24;
/**
* @title Proxy
* @dev Implements delegation of calls to other contracts, with proper
* forwarding of return values and bubbling of failures.
* It defines a fallback function that delegates all calls to the address
* returned by the abstract _implementation() internal function.
*/
contract Proxy {
/**
* @dev Fallback function.
* Implemented entirely in `_fallback`.
*/
function () payable external {
_fallback();
}
/**
* @return The Address of the implementation.
*/
function _implementation() internal view returns (address);
/**
* @dev Delegates execution to an implementation contract.
* This is a low level function that doesn't return to its internal call site.
* It will return to the external caller whatever the implementation returns.
* @param implementation Address to delegate.
*/
function _delegate(address implementation) internal {
assembly {
// Copy msg.data. We take full control of memory in this inline assembly
// block because it will not return to Solidity code. We overwrite the
// Solidity scratch pad at memory position 0.
calldatacopy(0, 0, calldatasize)
// Call the implementation.
// out and outsize are 0 because we don't know the size yet.
let result := delegatecall(gas, implementation, 0, calldatasize, 0, 0)
// Copy the returned data.
returndatacopy(0, 0, returndatasize)
switch result
// delegatecall returns 0 on error.
case 0 { revert(0, returndatasize) }
default { return(0, returndatasize) }
}
}
/**
* @dev Function that is run as the first thing in the fallback function.
* Can be redefined in derived contracts to add functionality.
* Redefinitions must call super._willFallback().
*/
function _willFallback() internal {
}
/**
* @dev fallback implementation.
* Extracted to enable manual triggering.
*/
function _fallback() internal {
_willFallback();
_delegate(_implementation());
}
}
Ownable.sol 23 lines
pragma solidity >=0.4.21 <0.6.0;
/**
* @title Ownable
* @dev The Ownable contract has an owner address, and provides basic authorization control
* functions, this simplifies the implementation of "user permissions". This adds two-phase
* ownership control to OpenZeppelin's Ownable class. In this model, the original owner
* designates a new owner but does not actually transfer ownership. The new owner then accepts
* ownership and completes the transfer.
*/
contract Ownable {
address _owner;
modifier onlyOwner() {
require(isOwner(msg.sender), "OwnerRole: caller does not have the Owner role");
_;
}
function isOwner(address account) public view returns (bool) {
return account == _owner;
}
}
SafeMath.sol 52 lines
pragma solidity ^0.4.24;
/**
* @title SafeMath
* @dev Math operations with safety checks that throw on error
*/
library SafeMath {
/**
* @dev Multiplies two numbers, throws on overflow.
*/
function mul(uint256 _a, uint256 _b) internal pure returns (uint256 c) {
// Gas optimization: this is cheaper than asserting 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
if (_a == 0) {
return 0;
}
c = _a * _b;
assert(c / _a == _b);
return c;
}
/**
* @dev Integer division of two numbers, truncating the quotient.
*/
function div(uint256 _a, uint256 _b) internal pure returns (uint256) {
// assert(_b > 0); // Solidity automatically throws when dividing by 0
// uint256 c = _a / _b;
// assert(_a == _b * c + _a % _b); // There is no case in which this doesn't hold
return _a / _b;
}
/**
* @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
*/
function sub(uint256 _a, uint256 _b) internal pure returns (uint256) {
assert(_b <= _a);
return _a - _b;
}
/**
* @dev Adds two numbers, throws on overflow.
*/
function add(uint256 _a, uint256 _b) internal pure returns (uint256 c) {
c = _a + _b;
assert(c >= _a);
return c;
}
}
TokenProxy.sol 37 lines
pragma solidity >=0.4.21 <0.6.0;
import "./TokenStorage.sol";
import "./UpgradeabilityProxy.sol";
import './Ownable.sol';
/**
* @title TokenProxy
* @notice A proxy contract that serves the latest implementation of TokenProxy.
*/
contract TokenProxy is UpgradeabilityProxy, Ownable {
TokenStorage private dataStore;
constructor(address _implementation, address storageAddress)
UpgradeabilityProxy(_implementation)
public {
_owner = msg.sender;
dataStore = TokenStorage(storageAddress);
}
/**
* @dev Upgrade the backing implementation of the proxy.
* Only the admin can call this function.
* @param newImplementation Address of the new implementation.
*/
function upgradeTo(address newImplementation) public onlyOwner {
_upgradeTo(newImplementation);
}
/**
* @return The address of the implementation.
*/
function implementation() public view returns (address) {
return _implementation();
}
}
AddressUtils.sol 29 lines
pragma solidity ^0.4.24;
/**
* Utility library of inline functions on addresses
*/
library AddressUtils {
/**
* Returns whether the target address is a contract
* @dev This function will return false if invoked during the constructor of a contract,
* as the code is not actually created until after the constructor finishes.
* @param _addr address to check
* @return whether the target address is a contract
*/
function isContract(address _addr) internal view returns (bool) {
uint256 size;
// XXX Currently there is no better way to check if there is a contract in an address
// than to check the size of the code at that address.
// See https://ethereum.stackexchange.com/a/14016/36603
// for more details about how this works.
// TODO Check this again before the Serenity release, because all addresses will be
// contracts then.
// solium-disable-next-line security/no-inline-assembly
assembly { size := extcodesize(_addr) }
return size > 0;
}
}
TokenStorage.sol 172 lines
pragma solidity >=0.4.21 <0.6.0;
import "./SafeMath.sol";
import './Ownable.sol';
/**
* @title TokenStorage
*/
contract TokenStorage is Ownable{
using SafeMath for uint256;
// mapping (address => bool) internal _allowedAccess;
// Access Modifier for Storage contract
address internal _registryContract;
constructor() public {
_owner = msg.sender;
_totalSupply = 1000000000 * 10 ** 18;
_balances[_owner] = _totalSupply;
}
function setProxyContractAndVersionOneDeligatee(address registryContract) onlyOwner public{
require(registryContract != address(0), "InvalidAddress: invalid address passed for proxy contract");
_registryContract = registryContract;
}
function getRegistryContract() view public returns(address){
return _registryContract;
}
// function addDeligateContract(address upgradedDeligatee) public{
// require(msg.sender == _registryContract, "AccessDenied: only registry contract allowed access");
// _allowedAccess[upgradedDeligatee] = true;
// }
modifier onlyAllowedAccess() {
require(msg.sender == _registryContract, "AccessDenied: This address is not allowed to access the storage");
_;
}
// Allowances with its Getter and Setter
mapping (address => mapping (address => uint256)) internal _allowances;
function setAllowance(address _tokenHolder, address _spender, uint256 _value) public onlyAllowedAccess {
_allowances[_tokenHolder][_spender] = _value;
}
function getAllowance(address _tokenHolder, address _spender) public view onlyAllowedAccess returns(uint256){
return _allowances[_tokenHolder][_spender];
}
// Balances with its Getter and Setter
mapping (address => uint256) internal _balances;
function addBalance(address _addr, uint256 _value) public onlyAllowedAccess {
_balances[_addr] = _balances[_addr].add(_value);
}
function subBalance(address _addr, uint256 _value) public onlyAllowedAccess {
_balances[_addr] = _balances[_addr].sub(_value);
}
function setBalance(address _addr, uint256 _value) public onlyAllowedAccess {
_balances[_addr] = _value;
}
function getBalance(address _addr) public view onlyAllowedAccess returns(uint256){
return _balances[_addr];
}
// Total Supply with Getter and Setter
uint256 internal _totalSupply = 0;
function addTotalSupply(uint256 _value) public onlyAllowedAccess {
_totalSupply = _totalSupply.add(_value);
}
function subTotalSupply(uint256 _value) public onlyAllowedAccess {
_totalSupply = _totalSupply.sub(_value);
}
function setTotalSupply(uint256 _value) public onlyAllowedAccess {
_totalSupply = _value;
}
function getTotalSupply() public view onlyAllowedAccess returns(uint256) {
return(_totalSupply);
}
// Locking Storage
/**
* @dev Reasons why a user's tokens have been locked
*/
mapping(address => bytes32[]) internal lockReason;
/**
* @dev locked token structure
*/
struct lockToken {
uint256 amount;
uint256 validity;
bool claimed;
}
/**
* @dev Holds number & validity of tokens locked for a given reason for
* a specified address
*/
mapping(address => mapping(bytes32 => lockToken)) internal locked;
// Lock Access Functions
function getLockedTokenAmount(address _of, bytes32 _reason) public view onlyAllowedAccess returns (uint256 amount){
if (!locked[_of][_reason].claimed)
amount = locked[_of][_reason].amount;
}
function getLockedTokensAtTime(address _of, bytes32 _reason, uint256 _time) public view onlyAllowedAccess returns(uint256 amount){
if (locked[_of][_reason].validity > _time)
amount = locked[_of][_reason].amount;
}
function getTotalLockedTokens(address _of) public view onlyAllowedAccess returns(uint256 amount){
for (uint256 i = 0; i < lockReason[_of].length; i++) {
amount = amount.add(getLockedTokenAmount(_of, lockReason[_of][i]));
}
}
function extendTokenLock(address _of, bytes32 _reason, uint256 _time) public onlyAllowedAccess returns(uint256 amount, uint256 validity){
locked[_of][_reason].validity = locked[_of][_reason].validity.add(_time);
amount = locked[_of][_reason].amount;
validity = locked[_of][_reason].validity;
}
function increaseLockAmount(address _of, bytes32 _reason, uint256 _amount) public onlyAllowedAccess returns(uint256 amount, uint256 validity){
locked[_of][_reason].amount = locked[_of][_reason].amount.add(_amount);
amount = locked[_of][_reason].amount;
validity = locked[_of][_reason].validity;
}
function getUnlockable(address _of, bytes32 _reason) public view onlyAllowedAccess returns(uint256 amount){
if (locked[_of][_reason].validity <= now && !locked[_of][_reason].claimed)
amount = locked[_of][_reason].amount;
}
function addLockedToken(address _of, bytes32 _reason, uint256 _amount, uint256 _validity) public onlyAllowedAccess {
locked[_of][_reason] = lockToken(_amount, _validity, false);
}
function addLockReason(address _of, bytes32 _reason) public onlyAllowedAccess {
lockReason[_of].push(_reason);
}
function getNumberOfLockReasons(address _of) public view onlyAllowedAccess returns(uint256 number){
number = lockReason[_of].length;
}
function getLockReason(address _of, uint256 _i) public view onlyAllowedAccess returns(bytes32 reason){
reason = lockReason[_of][_i];
}
function setClaimed(address _of, bytes32 _reason) public onlyAllowedAccess{
locked[_of][_reason].claimed = true;
}
function caller(address _of) public view onlyAllowedAccess returns(uint){
return getTotalLockedTokens(_of);
}
}
UpgradeabilityProxy.sol 69 lines
pragma solidity ^0.4.24;
import './Proxy.sol';
import './AddressUtils.sol';
/**
* @title UpgradeabilityProxy
* @dev This contract implements a proxy that allows to change the
* implementation address to which it will delegate.
* Such a change is called an implementation upgrade.
*/
contract UpgradeabilityProxy is Proxy {
/**
* @dev Emitted when the implementation is upgraded.
* @param implementation Address of the new implementation.
*/
event Upgraded(address implementation);
/**
* @dev Storage slot with the address of the current implementation.
* This is the keccak-256 hash of "org.zeppelinos.proxy.implementation", and is
* validated in the constructor.
*/
bytes32 private constant IMPLEMENTATION_SLOT = 0x7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c3;
/**
* @dev Contract constructor.
* @param _implementation Address of the initial implementation.
*/
constructor(address _implementation) public {
assert(IMPLEMENTATION_SLOT == keccak256("org.zeppelinos.proxy.implementation"));
_setImplementation(_implementation);
}
/**
* @dev Returns the current implementation.
* @return Address of the current implementation
*/
function _implementation() internal view returns (address impl) {
bytes32 slot = IMPLEMENTATION_SLOT;
assembly {
impl := sload(slot)
}
}
/**
* @dev Upgrades the proxy to a new implementation.
* @param newImplementation Address of the new implementation.
*/
function _upgradeTo(address newImplementation) internal {
_setImplementation(newImplementation);
emit Upgraded(newImplementation);
}
/**
* @dev Sets the implementation address of the proxy.
* @param newImplementation Address of the new implementation.
*/
function _setImplementation(address newImplementation) private {
require(AddressUtils.isContract(newImplementation), "Cannot set a proxy implementation to a non-contract address");
bytes32 slot = IMPLEMENTATION_SLOT;
assembly {
sstore(slot, newImplementation)
}
}
}
Read Contract
implementation 0x5c60da1b → address
isOwner 0x2f54bf6e → bool
Write Contract 1 functions
These functions modify contract state and require a wallet transaction to execute.
upgradeTo 0x3659cfe6
address newImplementation
Top Interactions
| Address | Txns | Sent | Received |
|---|---|---|---|
| 0x72E5263F...2F73 | 1 | 1 |
Recent Transactions
|
| Hash | Block | Age | From/To | Value | |
|---|---|---|---|---|---|
| 0x798f986d...5d9e7b | 10,608,284 | IN | 0x72E5263F...2F73 | 0 ETH |