文件 1 的 11:IERC20.sol
pragma solidity ^0.5.0;
interface IERC20 {
function transfer(address to, uint256 value) external returns (bool);
function approve(address spender, uint256 value) external returns (bool);
function transferFrom(address from, address to, uint256 value) external returns (bool);
function totalSupply() external view returns (uint256);
function balanceOf(address who) external view returns (uint256);
function allowance(address owner, address spender) external view returns (uint256);
}
文件 2 的 11:OwnershipStorage.sol
pragma solidity ^0.5.0;
contract OwnershipStorage {
address internal _admin;
constructor () public {
_admin = msg.sender;
}
function admin() public view returns (address) {
return _admin;
}
function setNewAdmin(address newAdmin) public {
require(msg.sender == _admin);
require(newAdmin != address(0));
_admin = newAdmin;
}
}
文件 3 的 11:Proxy.sol
pragma solidity ^0.5.0;
contract Proxy {
function implementation() public view returns (address);
function() payable external {
address _impl = implementation();
require(_impl != address(0));
bytes memory data = msg.data;
assembly {
let result := delegatecall(gas, _impl, add(data, 0x20), mload(data), 0, 0)
let size := returndatasize
let ptr := mload(0x40)
returndatacopy(ptr, 0, size)
switch result
case 0 { revert(ptr, size) }
default { return(ptr, size) }
}
}
}
文件 4 的 11:ReentrancyGuard.sol
pragma solidity ^0.5.0;
contract ReentrancyGuard {
uint256 private _guardCounter;
constructor () internal {
_guardCounter = 1;
}
modifier nonReentrant() {
_guardCounter += 1;
uint256 localCounter = _guardCounter;
_;
require(localCounter == _guardCounter);
}
}
文件 5 的 11:SafeMath.sol
pragma solidity ^0.5.0;
library SafeMath {
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b);
return c;
}
function div(uint256 a, uint256 b) internal pure returns (uint256) {
require(b > 0);
uint256 c = a / b;
return c;
}
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
require(b <= a);
uint256 c = a - b;
return c;
}
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a);
return c;
}
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
require(b != 0);
return a % b;
}
}
文件 6 的 11:TokenProxy.sol
pragma solidity ^0.5.0;
import "./UpgradeabilityProxy.sol";
import "./TokenStorage.sol";
import "./OwnershipStorage.sol";
contract TokenProxy is UpgradeabilityProxy, TokenStorage, OwnershipStorage {
constructor (
string memory name,
string memory symbol,
uint8 decimals
)
public
{
_name = name;
_symbol = symbol;
_decimals = decimals;
_tokensMinted = false;
}
}
文件 7 的 11:TokenStorage.sol
pragma solidity ^0.5.0;
contract TokenStorage {
string internal _name;
string internal _symbol;
uint8 internal _decimals;
uint256 internal _totalSupply;
mapping(address => uint256) internal _balances;
mapping(address => mapping(address => uint256)) internal _allowances;
bool internal _tokensMinted = true;
}
文件 8 的 11:TokenV0.sol
pragma solidity ^0.5.0;
import "./UpgradeableTokenStorage.sol";
import "./SafeMath.sol";
import "./IERC20.sol";
contract TokenV0 is IERC20, UpgradeableTokenStorage {
using SafeMath for uint256;
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
function name() public view returns (string memory) {
return _name;
}
function symbol() public view returns (string memory) {
return _symbol;
}
function decimals() public view returns (uint8) {
return _decimals;
}
function totalSupply() public view returns (uint256) {
return _totalSupply;
}
function balanceOf(address owner) public view returns (uint256) {
return _balances[owner];
}
function allowance(address owner, address spender) public view returns (uint256) {
return _allowances[owner][spender];
}
function transfer(address to, uint256 value) public returns (bool) {
_transfer(msg.sender, to, value);
return true;
}
function approve(address spender, uint256 value) public returns (bool) {
_approve(msg.sender, spender, value);
return true;
}
function transferFrom(address from, address to, uint256 value) public returns (bool) {
_transfer(from, to, value);
_approve(from, msg.sender, _allowances[from][msg.sender].sub(value));
return true;
}
function mint(address account, uint256 value) public {
require(!_tokensMinted);
require(msg.sender == _admin);
require(account != address(0));
_tokensMinted = true;
_totalSupply = _totalSupply.add(value);
_balances[account] = _balances[account].add(value);
emit Transfer(address(0), account, value);
}
function _transfer(address from, address to, uint256 value) internal {
require(to != address(0));
_balances[from] = _balances[from].sub(value);
_balances[to] = _balances[to].add(value);
emit Transfer(from, to, value);
}
function _approve(address owner, address spender, uint256 value) internal {
require(spender != address(0));
require(owner != address(0));
_allowances[owner][spender] = value;
emit Approval(owner, spender, value);
}
}
文件 9 的 11:UpgradeabilityProxy.sol
pragma solidity ^0.5.0;
import "./Proxy.sol";
import "./UpgradeabilityStorage.sol";
contract UpgradeabilityProxy is Proxy, UpgradeabilityStorage {
function admin() public view returns (address);
event Upgraded(string version, address indexed implementation);
function upgradeTo(string memory version, address implementation) public {
require(msg.sender == admin());
require(_implementation != implementation);
_version = version;
_implementation = implementation;
emit Upgraded(version, implementation);
}
}
文件 10 的 11:UpgradeabilityStorage.sol
pragma solidity ^0.5.0;
contract UpgradeabilityStorage {
string internal _version;
address internal _implementation;
function version() public view returns (string memory) {
return _version;
}
function implementation() public view returns (address) {
return _implementation;
}
}
文件 11 的 11:UpgradeableTokenStorage.sol
pragma solidity ^0.5.0;
import "./UpgradeabilityProxy.sol";
import "./TokenStorage.sol";
import "./OwnershipStorage.sol";
contract UpgradeableTokenStorage is UpgradeabilityProxy, TokenStorage, OwnershipStorage {}
{
"compilationTarget": {
"TokenProxy.sol": "TokenProxy"
},
"evmVersion": "byzantium",
"libraries": {},
"optimizer": {
"enabled": false,
"runs": 0
},
"remappings": []
}
[{"constant":true,"inputs":[],"name":"version","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"version","type":"string"},{"name":"implementation","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"},{"constant":false,"inputs":[{"name":"newAdmin","type":"address"}],"name":"setNewAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"admin","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"name","type":"string"},{"name":"symbol","type":"string"},{"name":"decimals","type":"uint8"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":false,"name":"version","type":"string"},{"indexed":true,"name":"implementation","type":"address"}],"name":"Upgraded","type":"event"}]