编译器
0.4.24+commit.e67f0147
文件 1 的 7:AddressUtils.sol
pragma solidity ^0.4.24;
library AddressUtils {
function isContract(address _addr) internal view returns (bool) {
uint256 size;
assembly { size := extcodesize(_addr) }
return size > 0;
}
}
文件 2 的 7:Ownable.sol
pragma solidity >=0.4.21 <0.6.0;
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;
}
}
文件 3 的 7:Proxy.sol
pragma solidity ^0.4.24;
contract Proxy {
function () payable external {
_fallback();
}
function _implementation() internal view returns (address);
function _delegate(address implementation) internal {
assembly {
calldatacopy(0, 0, calldatasize)
let result := delegatecall(gas, implementation, 0, calldatasize, 0, 0)
returndatacopy(0, 0, returndatasize)
switch result
case 0 { revert(0, returndatasize) }
default { return(0, returndatasize) }
}
}
function _willFallback() internal {
}
function _fallback() internal {
_willFallback();
_delegate(_implementation());
}
}
文件 4 的 7:SafeMath.sol
pragma solidity ^0.4.24;
library SafeMath {
function mul(uint256 _a, uint256 _b) internal pure returns (uint256 c) {
if (_a == 0) {
return 0;
}
c = _a * _b;
assert(c / _a == _b);
return c;
}
function div(uint256 _a, uint256 _b) internal pure returns (uint256) {
return _a / _b;
}
function sub(uint256 _a, uint256 _b) internal pure returns (uint256) {
assert(_b <= _a);
return _a - _b;
}
function add(uint256 _a, uint256 _b) internal pure returns (uint256 c) {
c = _a + _b;
assert(c >= _a);
return c;
}
}
文件 5 的 7:TokenProxy.sol
pragma solidity >=0.4.21 <0.6.0;
import "./TokenStorage.sol";
import "./UpgradeabilityProxy.sol";
import './Ownable.sol';
contract TokenProxy is UpgradeabilityProxy, Ownable {
TokenStorage private dataStore;
constructor(address _implementation, address storageAddress)
UpgradeabilityProxy(_implementation)
public {
_owner = msg.sender;
dataStore = TokenStorage(storageAddress);
}
function upgradeTo(address newImplementation) public onlyOwner {
_upgradeTo(newImplementation);
}
function implementation() public view returns (address) {
return _implementation();
}
}
文件 6 的 7:TokenStorage.sol
pragma solidity >=0.4.21 <0.6.0;
import "./SafeMath.sol";
import './Ownable.sol';
contract TokenStorage is Ownable{
using SafeMath for uint256;
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;
}
modifier onlyAllowedAccess() {
require(msg.sender == _registryContract, "AccessDenied: This address is not allowed to access the storage");
_;
}
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];
}
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];
}
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);
}
mapping(address => bytes32[]) internal lockReason;
struct lockToken {
uint256 amount;
uint256 validity;
bool claimed;
}
mapping(address => mapping(bytes32 => lockToken)) internal locked;
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);
}
}
文件 7 的 7:UpgradeabilityProxy.sol
pragma solidity ^0.4.24;
import './Proxy.sol';
import './AddressUtils.sol';
contract UpgradeabilityProxy is Proxy {
event Upgraded(address implementation);
bytes32 private constant IMPLEMENTATION_SLOT = 0x7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c3;
constructor(address _implementation) public {
assert(IMPLEMENTATION_SLOT == keccak256("org.zeppelinos.proxy.implementation"));
_setImplementation(_implementation);
}
function _implementation() internal view returns (address impl) {
bytes32 slot = IMPLEMENTATION_SLOT;
assembly {
impl := sload(slot)
}
}
function _upgradeTo(address newImplementation) internal {
_setImplementation(newImplementation);
emit Upgraded(newImplementation);
}
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)
}
}
}
{
"compilationTarget": {
"TokenProxy.sol": "TokenProxy"
},
"evmVersion": "byzantium",
"libraries": {},
"optimizer": {
"enabled": false,
"runs": 200
},
"remappings": []
}
[{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"isOwner","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newImplementation","type":"address"}],"name":"upgradeTo","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"implementation","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_implementation","type":"address"},{"name":"storageAddress","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":false,"name":"implementation","type":"address"}],"name":"Upgraded","type":"event"}]