文件 1 的 21:BasicToken.sol
pragma solidity ^0.5.8;
contract Owned {
modifier only_owner { require(msg.sender == owner); _; }
event NewOwner(address indexed old, address indexed current);
function setOwner(address _new) only_owner public { emit NewOwner(owner, _new); owner = _new; }
address public owner = msg.sender;
}
interface Token {
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
function balanceOf(address _owner) view external returns (uint256 balance);
function transfer(address _to, uint256 _value) external returns (bool success);
function transferFrom(address _from, address _to, uint256 _value) external returns (bool success);
function approve(address _spender, uint256 _value) external returns (bool success);
function allowance(address _owner, address _spender) view external returns (uint256 remaining);
}
contract TokenReg {
function register(address _addr, string memory _tla, uint _base, string memory _name) public payable returns (bool);
function registerAs(address _addr, string memory _tla, uint _base, string memory _name, address _owner) public payable returns (bool);
function unregister(uint _id) public;
function setFee(uint _fee) public;
function tokenCount() public view returns (uint);
function token(uint _id) public view returns (address addr, string memory tla, uint base, string memory name, address owner);
function fromAddress(address _addr) public view returns (uint id, string memory tla, uint base, string memory name, address owner);
function fromTLA(string memory _tla) public view returns (uint id, address addr, uint base, string memory name, address owner);
function meta(uint _id, bytes32 _key) public view returns (bytes32);
function setMeta(uint _id, bytes32 _key, bytes32 _value) public;
function drain() public;
uint public fee;
}
contract BasicCoin is Owned, Token {
struct Account {
uint balance;
mapping (address => uint) allowanceOf;
}
modifier when_owns(address _owner, uint _amount) {
if (accounts[_owner].balance < _amount) revert();
_;
}
modifier when_has_allowance(address _owner, address _spender, uint _amount) {
if (accounts[_owner].allowanceOf[_spender] < _amount) revert();
_;
}
modifier when_non_zero(uint _value) {
if (_value == 0) revert();
_;
}
bool public called = false;
uint constant public base = 1000000;
uint public totalSupply;
mapping (address => Account) accounts;
constructor(uint _totalSupply, address _owner) public when_non_zero(_totalSupply) {
totalSupply = _totalSupply;
owner = _owner;
accounts[_owner].balance = totalSupply;
}
function balanceOf(address _who) public view returns (uint256) {
return accounts[_who].balance;
}
function transfer(address _to, uint256 _value) public when_owns(msg.sender, _value) returns (bool) {
emit Transfer(msg.sender, _to, _value);
accounts[msg.sender].balance -= _value;
accounts[_to].balance += _value;
return true;
}
function transferFrom(address _from, address _to, uint256 _value) public when_owns(_from, _value) when_has_allowance(_from, msg.sender, _value) returns (bool) {
called = true;
emit Transfer(_from, _to, _value);
accounts[_from].allowanceOf[msg.sender] -= _value;
accounts[_from].balance -= _value;
accounts[_to].balance += _value;
return true;
}
function approve(address _spender, uint256 _value) public returns (bool) {
emit Approval(msg.sender, _spender, _value);
accounts[msg.sender].allowanceOf[_spender] += _value;
return true;
}
function allowance(address _owner, address _spender) public view returns (uint256) {
return accounts[_owner].allowanceOf[_spender];
}
function() external {
revert();
}
}
contract BasicCoinManager is Owned {
struct Coin {
address coin;
address owner;
address tokenreg;
}
event Created(address indexed owner, address indexed tokenreg, address indexed coin);
Coin[] coins;
mapping (address => uint[]) ownedCoins;
uint constant public base = 1000000;
function count() public view returns (uint) {
return coins.length;
}
function get(uint _index) public view returns (address coin, address owner, address tokenreg) {
Coin memory c = coins[_index];
coin = c.coin;
owner = c.owner;
tokenreg = c.tokenreg;
}
function countByOwner(address _owner) public view returns (uint) {
return ownedCoins[_owner].length;
}
function getByOwner(address _owner, uint _index) public view returns (address coin, address owner, address tokenreg) {
return get(ownedCoins[_owner][_index]);
}
function deploy(uint _totalSupply, string memory _tla, string memory _name, address _tokenreg) public payable returns (bool) {
TokenReg tokenreg = TokenReg(_tokenreg);
BasicCoin coin = new BasicCoin(_totalSupply, msg.sender);
uint ownerCount = countByOwner(msg.sender);
uint fee = tokenreg.fee();
ownedCoins[msg.sender].length = ownerCount + 1;
ownedCoins[msg.sender][ownerCount] = coins.length;
coins.push(Coin(address(coin), msg.sender, address(tokenreg)));
tokenreg.registerAs.value(fee)(address(coin), _tla, base, _name, msg.sender);
emit Created(msg.sender, address(tokenreg), address(coin));
return true;
}
function drain() public only_owner {
if (!msg.sender.send(address(this).balance)) {
revert();
}
}
}
文件 2 的 21:ERC20.sol
pragma solidity ^0.5.8;
import "./IERC20.sol";
import "./SafeMath.sol";
contract ERC20 is IERC20 {
using SafeMath for uint256;
mapping(address => uint256) private _balances;
mapping(address => mapping(address => uint256)) private _allowed;
uint256 private _totalSupply;
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 _allowed[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, _allowed[from][msg.sender].sub(value));
return true;
}
function increaseAllowance(address spender, uint256 addedValue) public returns (bool) {
_approve(msg.sender, spender, _allowed[msg.sender][spender].add(addedValue));
return true;
}
function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) {
_approve(msg.sender, spender, _allowed[msg.sender][spender].sub(subtractedValue));
return true;
}
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 _mint(address account, uint256 value) internal {
require(account != address(0));
_totalSupply = _totalSupply.add(value);
_balances[account] = _balances[account].add(value);
emit Transfer(address(0), account, value);
}
function _burn(address account, uint256 value) internal {
require(account != address(0));
_totalSupply = _totalSupply.sub(value);
_balances[account] = _balances[account].sub(value);
emit Transfer(account, address(0), value);
}
function _approve(address owner, address spender, uint256 value) internal {
require(spender != address(0));
require(owner != address(0));
_allowed[owner][spender] = value;
emit Approval(owner, spender, value);
}
function _burnFrom(address account, uint256 value) internal {
_burn(account, value);
_approve(account, msg.sender, _allowed[account][msg.sender].sub(value));
}
}
文件 3 的 21:ERC20Burnable.sol
pragma solidity ^0.5.8;
import "./ERC20.sol";
contract ERC20Burnable is ERC20 {
function burn(uint256 value) public {
_burn(msg.sender, value);
}
function burnFrom(address from, uint256 value) public {
_burnFrom(from, value);
}
}
文件 4 的 21:ERC20Detailed.sol
pragma solidity ^0.5.8;
import "./IERC20.sol";
contract ERC20Detailed is IERC20 {
string private _name;
string private _symbol;
uint8 private _decimals;
constructor (string memory name, string memory symbol, uint8 decimals) public {
_name = name;
_symbol = symbol;
_decimals = decimals;
}
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;
}
}
文件 5 的 21:Failer.sol
pragma solidity ^0.5.8;
contract Failer {
function() external payable {
revert("eth transfer revert");
}
function transfer(address, uint256) external pure {
revert("ERC-20 transfer revert");
}
}
文件 6 的 21:IERC20.sol
pragma solidity ^0.5.8;
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);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
文件 7 的 21:IMaster.sol
pragma solidity ^0.5.8;
contract IMaster {
function withdraw(
address tokenAddress,
uint256 amount,
address to,
bytes32 txHash,
uint8[] memory v,
bytes32[] memory r,
bytes32[] memory s,
address from
)
public;
function mintTokensByPeers(
address tokenAddress,
uint256 amount,
address beneficiary,
bytes32 txHash,
uint8[] memory v,
bytes32[] memory r,
bytes32[] memory s,
address from
)
public;
function checkTokenAddress(address token) public view returns (bool);
}
文件 8 的 21:IRelayRegistry.sol
pragma solidity ^0.5.8;
interface IRelayRegistry {
function addNewRelayAddress(address relay, address[] calldata whiteList) external;
function isWhiteListed(address relay, address who) external view returns (bool);
function getWhiteListByRelay(address relay) external view returns (address[] memory);
event AddNewRelay (
address indexed relayAddress,
address[] indexed whiteList
);
}
文件 9 的 21:Master.sol
pragma solidity ^0.5.8;
import "./IERC20.sol";
import "./SoraToken.sol";
contract Master {
bool internal initialized_;
address public owner_;
mapping(address => bool) public isPeer;
uint public peersCount;
mapping(bytes32 => bool) public used;
mapping(address => bool) public uniqueAddresses;
mapping(address => bytes) public registeredClients;
SoraToken public xorTokenInstance;
mapping(address => bool) public isToken;
event IrohaAccountRegistration(address ethereumAddress, bytes accountId);
event InsufficientFundsForWithdrawal(address asset, address recipient);
constructor(address[] memory initialPeers) public {
initialize(msg.sender, initialPeers);
}
function initialize(address owner, address[] memory initialPeers) public {
require(!initialized_);
owner_ = owner;
for (uint8 i = 0; i < initialPeers.length; i++) {
addPeer(initialPeers[i]);
}
isToken[address(0)] = true;
xorTokenInstance = new SoraToken();
isToken[address(xorTokenInstance)] = true;
initialized_ = true;
}
modifier onlyOwner() {
require(isOwner());
_;
}
function isOwner() public view returns(bool) {
return msg.sender == owner_;
}
function() external payable {
require(msg.data.length == 0);
}
function addPeer(address newAddress) private returns (uint) {
require(isPeer[newAddress] == false);
isPeer[newAddress] = true;
++peersCount;
return peersCount;
}
function removePeer(address peerAddress) private {
require(isPeer[peerAddress] == true);
isPeer[peerAddress] = false;
--peersCount;
}
function addPeerByPeer(
address newPeerAddress,
bytes32 txHash,
uint8[] memory v,
bytes32[] memory r,
bytes32[] memory s
)
public returns (bool)
{
require(used[txHash] == false);
require(checkSignatures(keccak256(abi.encodePacked(newPeerAddress, txHash)),
v,
r,
s)
);
addPeer(newPeerAddress);
used[txHash] = true;
return true;
}
function removePeerByPeer(
address peerAddress,
bytes32 txHash,
uint8[] memory v,
bytes32[] memory r,
bytes32[] memory s
)
public returns (bool)
{
require(used[txHash] == false);
require(checkSignatures(
keccak256(abi.encodePacked(peerAddress, txHash)),
v,
r,
s)
);
removePeer(peerAddress);
used[txHash] = true;
return true;
}
function addToken(address newToken) public onlyOwner {
require(isToken[newToken] == false);
isToken[newToken] = true;
}
function checkTokenAddress(address tokenAddress) public view returns (bool) {
return isToken[tokenAddress];
}
function register(
address clientEthereumAddress,
bytes memory clientIrohaAccountId,
bytes32 txHash,
uint8[] memory v,
bytes32[] memory r,
bytes32[] memory s
)
public
{
require(used[txHash] == false);
require(checkSignatures(
keccak256(abi.encodePacked(clientEthereumAddress, clientIrohaAccountId, txHash)),
v,
r,
s)
);
require(clientEthereumAddress == msg.sender);
require(registeredClients[clientEthereumAddress].length == 0);
registeredClients[clientEthereumAddress] = clientIrohaAccountId;
emit IrohaAccountRegistration(clientEthereumAddress, clientIrohaAccountId);
}
function withdraw(
address tokenAddress,
uint256 amount,
address payable to,
bytes32 txHash,
uint8[] memory v,
bytes32[] memory r,
bytes32[] memory s,
address from
)
public
{
require(checkTokenAddress(tokenAddress));
require(used[txHash] == false);
require(checkSignatures(
keccak256(abi.encodePacked(tokenAddress, amount, to, txHash, from)),
v,
r,
s)
);
if (tokenAddress == address (0)) {
if (address(this).balance < amount) {
emit InsufficientFundsForWithdrawal(tokenAddress, to);
} else {
used[txHash] = true;
to.transfer(amount);
}
} else {
IERC20 coin = IERC20(tokenAddress);
if (coin.balanceOf(address (this)) < amount) {
emit InsufficientFundsForWithdrawal(tokenAddress, to);
} else {
used[txHash] = true;
coin.transfer(to, amount);
}
}
}
function checkSignatures(bytes32 hash,
uint8[] memory v,
bytes32[] memory r,
bytes32[] memory s
) private returns (bool) {
require(peersCount >= 1);
require(v.length == r.length);
require(r.length == s.length);
uint needSigs = peersCount - (peersCount - 1) / 3;
require(s.length >= needSigs);
uint count = 0;
address[] memory recoveredAddresses = new address[](s.length);
for (uint i = 0; i < s.length; ++i) {
address recoveredAddress = recoverAddress(
hash,
v[i],
r[i],
s[i]
);
if (isPeer[recoveredAddress] != true || uniqueAddresses[recoveredAddress] == true) {
continue;
}
recoveredAddresses[count] = recoveredAddress;
count = count + 1;
uniqueAddresses[recoveredAddress] = true;
}
for (uint i = 0; i < count; ++i) {
uniqueAddresses[recoveredAddresses[i]] = false;
}
return count >= needSigs;
}
function recoverAddress(bytes32 hash, uint8 v, bytes32 r, bytes32 s) private pure returns (address) {
bytes32 simple_hash = keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
address res = ecrecover(simple_hash, v, r, s);
return res;
}
function mintTokensByPeers(
address tokenAddress,
uint256 amount,
address beneficiary,
bytes32 txHash,
uint8[] memory v,
bytes32[] memory r,
bytes32[] memory s,
address from
)
public
{
require(address(xorTokenInstance) == tokenAddress);
require(used[txHash] == false);
require(checkSignatures(
keccak256(abi.encodePacked(tokenAddress, amount, beneficiary, txHash, from)),
v,
r,
s)
);
xorTokenInstance.mintTokens(beneficiary, amount);
used[txHash] = true;
}
}
文件 10 的 21:MasterRelayed.sol
pragma solidity ^0.5.8;
import "./IRelayRegistry.sol";
import "./IERC20.sol";
import "./SoraToken.sol";
contract MasterRelayed {
bool internal initialized_;
address public owner_;
mapping(address => bool) public isPeer;
uint public peersCount;
mapping(bytes32 => bool) public used;
mapping(address => bool) public uniqueAddresses;
address public relayRegistryAddress;
IRelayRegistry public relayRegistryInstance;
SoraToken public xorTokenInstance;
mapping(address => bool) public isToken;
event InsufficientFundsForWithdrawal(address asset, address recipient);
constructor(address relayRegistry, address[] memory initialPeers) public {
initialize(msg.sender, relayRegistry, initialPeers);
}
function initialize(address owner, address relayRegistry, address[] memory initialPeers) public {
require(!initialized_);
owner_ = owner;
relayRegistryAddress = relayRegistry;
relayRegistryInstance = IRelayRegistry(relayRegistryAddress);
for (uint8 i = 0; i < initialPeers.length; i++) {
addPeer(initialPeers[i]);
}
isToken[address(0)] = true;
xorTokenInstance = new SoraToken();
isToken[address(xorTokenInstance)] = true;
initialized_ = true;
}
modifier onlyOwner() {
require(isOwner());
_;
}
function isOwner() public view returns(bool) {
return msg.sender == owner_;
}
function() external payable {
require(msg.data.length == 0);
}
function addPeer(address newAddress) private returns (uint) {
require(isPeer[newAddress] == false);
isPeer[newAddress] = true;
++peersCount;
return peersCount;
}
function removePeer(address peerAddress) private {
require(isPeer[peerAddress] == true);
isPeer[peerAddress] = false;
--peersCount;
}
function addPeerByPeer(
address newPeerAddress,
bytes32 txHash,
uint8[] memory v,
bytes32[] memory r,
bytes32[] memory s
)
public returns (bool)
{
require(used[txHash] == false);
require(checkSignatures(keccak256(abi.encodePacked(newPeerAddress, txHash)),
v,
r,
s)
);
addPeer(newPeerAddress);
used[txHash] = true;
return true;
}
function removePeerByPeer(
address peerAddress,
bytes32 txHash,
uint8[] memory v,
bytes32[] memory r,
bytes32[] memory s
)
public returns (bool)
{
require(used[txHash] == false);
require(checkSignatures(
keccak256(abi.encodePacked(peerAddress, txHash)),
v,
r,
s)
);
removePeer(peerAddress);
used[txHash] = true;
return true;
}
function addToken(address newToken) public onlyOwner {
require(isToken[newToken] == false);
isToken[newToken] = true;
}
function checkTokenAddress(address tokenAddress) public view returns (bool) {
return isToken[tokenAddress];
}
function withdraw(
address tokenAddress,
uint256 amount,
address payable to,
bytes32 txHash,
uint8[] memory v,
bytes32[] memory r,
bytes32[] memory s,
address from
)
public
{
require(checkTokenAddress(tokenAddress));
require(relayRegistryInstance.isWhiteListed(from, to));
require(used[txHash] == false);
require(checkSignatures(
keccak256(abi.encodePacked(tokenAddress, amount, to, txHash, from)),
v,
r,
s)
);
if (tokenAddress == address (0)) {
if (address(this).balance < amount) {
emit InsufficientFundsForWithdrawal(tokenAddress, to);
} else {
used[txHash] = true;
to.transfer(amount);
}
} else {
IERC20 coin = IERC20(tokenAddress);
if (coin.balanceOf(address (this)) < amount) {
emit InsufficientFundsForWithdrawal(tokenAddress, to);
} else {
used[txHash] = true;
coin.transfer(to, amount);
}
}
}
function checkSignatures(bytes32 hash,
uint8[] memory v,
bytes32[] memory r,
bytes32[] memory s
) private returns (bool) {
require(peersCount >= 1);
require(v.length == r.length);
require(r.length == s.length);
uint needSigs = peersCount - (peersCount - 1) / 3;
require(s.length >= needSigs);
uint count = 0;
address[] memory recoveredAddresses = new address[](s.length);
for (uint i = 0; i < s.length; ++i) {
address recoveredAddress = recoverAddress(
hash,
v[i],
r[i],
s[i]
);
if (isPeer[recoveredAddress] != true || uniqueAddresses[recoveredAddress] == true) {
continue;
}
recoveredAddresses[count] = recoveredAddress;
count = count + 1;
uniqueAddresses[recoveredAddress] = true;
}
for (uint i = 0; i < count; ++i) {
uniqueAddresses[recoveredAddresses[i]] = false;
}
return count >= needSigs;
}
function recoverAddress(bytes32 hash, uint8 v, bytes32 r, bytes32 s) private pure returns (address) {
bytes32 simple_hash = keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
address res = ecrecover(simple_hash, v, r, s);
return res;
}
function mintTokensByPeers(
address tokenAddress,
uint256 amount,
address beneficiary,
bytes32 txHash,
uint8[] memory v,
bytes32[] memory r,
bytes32[] memory s,
address from
)
public
{
require(address(xorTokenInstance) == tokenAddress);
require(relayRegistryInstance.isWhiteListed(from, beneficiary));
require(used[txHash] == false);
require(checkSignatures(
keccak256(abi.encodePacked(tokenAddress, amount, beneficiary, txHash, from)),
v,
r,
s)
);
xorTokenInstance.mintTokens(beneficiary, amount);
used[txHash] = true;
}
}
文件 11 的 21:Ownable.sol
pragma solidity ^0.5.8;
contract Ownable {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor () internal {
_owner = msg.sender;
emit OwnershipTransferred(address(0), _owner);
}
function owner() public view returns (address) {
return _owner;
}
modifier onlyOwner() {
require(isOwner());
_;
}
function isOwner() public view returns (bool) {
return msg.sender == _owner;
}
function renounceOwnership() public onlyOwner {
emit OwnershipTransferred(_owner, address(0));
_owner = address(0);
}
function transferOwnership(address newOwner) public onlyOwner {
_transferOwnership(newOwner);
}
function _transferOwnership(address newOwner) internal {
require(newOwner != address(0));
emit OwnershipTransferred(_owner, newOwner);
_owner = newOwner;
}
}
文件 12 的 21:OwnedUpgradeabilityProxy.sol
pragma solidity ^0.5.8;
import './UpgradeabilityProxy.sol';
contract OwnedUpgradeabilityProxy is UpgradeabilityProxy {
event ProxyOwnershipTransferred(address previousOwner, address newOwner);
bytes32 private constant proxyOwnerPosition = keccak256("com.d3ledger.proxy.owner");
constructor() public {
setUpgradeabilityOwner(msg.sender);
}
modifier onlyProxyOwner() {
require(msg.sender == proxyOwner());
_;
}
function proxyOwner() public view returns (address owner) {
bytes32 position = proxyOwnerPosition;
assembly {
owner := sload(position)
}
}
function setUpgradeabilityOwner(address newProxyOwner) internal {
bytes32 position = proxyOwnerPosition;
assembly {
sstore(position, newProxyOwner)
}
}
function transferProxyOwnership(address newOwner) public onlyProxyOwner {
require(newOwner != address(0));
emit ProxyOwnershipTransferred(proxyOwner(), newOwner);
setUpgradeabilityOwner(newOwner);
}
function upgradeTo(address implementation) public onlyProxyOwner {
_upgradeTo(implementation);
}
function upgradeToAndCall(address implementation, bytes memory data) payable public onlyProxyOwner {
upgradeTo(implementation);
(bool success,) = address(this).call.value(msg.value)(data);
require(success);
}
}
文件 13 的 21:Proxy.sol
pragma solidity ^0.5.8;
contract Proxy {
function implementation() public view returns (address);
function () payable external {
address _impl = implementation();
require(_impl != address(0));
assembly {
let ptr := mload(0x40)
calldatacopy(ptr, 0, calldatasize)
let result := delegatecall(gas, _impl, ptr, calldatasize, 0, 0)
let size := returndatasize
returndatacopy(ptr, 0, size)
switch result
case 0 { revert(ptr, size) }
default { return(ptr, size) }
}
}
}
文件 14 的 21:Relay.sol
pragma solidity ^0.5.8;
import "./IMaster.sol";
import "./IERC20.sol";
contract Relay {
bool internal initialized_;
address payable private masterAddress;
IMaster private masterInstance;
event AddressEvent(address input);
event StringEvent(string input);
event BytesEvent(bytes32 input);
event NumberEvent(uint256 input);
constructor(address payable master) public {
initialize(master);
}
function initialize(address payable master) public {
require(!initialized_);
masterAddress = master;
masterInstance = IMaster(masterAddress);
initialized_ = true;
}
function() external payable {
require(msg.data.length == 0);
emit AddressEvent(msg.sender);
}
function sendToMaster(address tokenAddress) public {
require(masterInstance.checkTokenAddress(tokenAddress));
if (tokenAddress == address(0)) {
masterAddress.transfer(address(this).balance);
} else {
IERC20 ic = IERC20(tokenAddress);
ic.transfer(masterAddress, ic.balanceOf(address(this)));
}
}
function withdraw(
address tokenAddress,
uint256 amount,
address payable to,
bytes32 tx_hash,
uint8[] memory v,
bytes32[] memory r,
bytes32[] memory s,
address from
)
public
{
emit AddressEvent(masterAddress);
masterInstance.withdraw(tokenAddress, amount, to, tx_hash, v, r, s, from);
}
function mintTokensByPeers(
address tokenAddress,
uint256 amount,
address beneficiary,
bytes32 txHash,
uint8[] memory v,
bytes32[] memory r,
bytes32[] memory s,
address from
)
public
{
emit AddressEvent(masterAddress);
masterInstance.mintTokensByPeers(tokenAddress, amount, beneficiary, txHash, v, r, s, from);
}
}
文件 15 的 21:RelayRegistry.sol
pragma solidity ^0.5.8;
import "./IRelayRegistry.sol";
contract RelayRegistry is IRelayRegistry {
bool internal initialized_;
address private owner_;
mapping(address => address[]) private _relayWhiteList;
constructor () public {
initialize(msg.sender);
}
function initialize(address owner) public {
require(!initialized_);
owner_ = owner;
initialized_ = true;
}
function addNewRelayAddress(address relay, address[] calldata whiteList) external {
require(msg.sender == owner_);
require(_relayWhiteList[relay].length == 0);
_relayWhiteList[relay] = whiteList;
emit AddNewRelay(relay, whiteList);
}
function isWhiteListed(address relay, address who) external view returns (bool) {
if (_relayWhiteList[relay].length == 0) {
return true;
}
if (_relayWhiteList[relay].length > 0) {
for (uint i = 0; i < _relayWhiteList[relay].length; i++) {
if (who == _relayWhiteList[relay][i]) {
return true;
}
}
}
return false;
}
function getWhiteListByRelay(address relay) external view returns (address[] memory ) {
require(relay != address(0));
require(_relayWhiteList[relay].length != 0);
return _relayWhiteList[relay];
}
}
文件 16 的 21:SafeMath.sol
pragma solidity ^0.5.8;
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;
}
}
文件 17 的 21:SoraToken.sol
pragma solidity ^0.5.8;
import "./ERC20Detailed.sol";
import "./ERC20Burnable.sol";
import "./Ownable.sol";
contract SoraToken is ERC20Burnable, ERC20Detailed, Ownable {
uint256 public constant INITIAL_SUPPLY = 0;
constructor() public ERC20Detailed("Sora Token", "XOR", 18) {
_mint(msg.sender, INITIAL_SUPPLY);
}
function mintTokens(address beneficiary, uint256 amount) public onlyOwner {
_mint(beneficiary, amount);
}
}
文件 18 的 21:TestGreeter_v0.sol
pragma solidity ^0.5.8;
contract TestGreeter_v0 {
bool ininialized_;
string greeting_;
constructor(string memory greeting) public {
initialize(greeting);
}
function initialize(string memory greeting) public {
require(!ininialized_);
greeting_ = greeting;
ininialized_ = true;
}
function greet() view public returns (string memory) {
return greeting_;
}
function set(string memory greeting) public {
greeting_ = greeting;
}
}
文件 19 的 21:TestGreeter_v1.sol
pragma solidity ^0.5.8;
import './TestGreeter_v0.sol';
contract TestGreeter_v1 is TestGreeter_v0("Hi, World!") {
function farewell() public view returns (string memory) {
return "Good bye!";
}
}
文件 20 的 21:TransferEthereum.sol
pragma solidity ^0.5.8;
contract TransferEthereum {
function() external payable {
require(msg.data.length == 0);
}
function transfer(address payable to, uint256 amount) public {
to.call.value(amount)("");
}
}
文件 21 的 21:UpgradeabilityProxy.sol
pragma solidity ^0.5.8;
import './Proxy.sol';
contract UpgradeabilityProxy is Proxy {
event Upgraded(address indexed implementation);
bytes32 private constant implementationPosition = keccak256("com.d3ledger.proxy.implementation");
constructor() public {}
function implementation() public view returns (address impl) {
bytes32 position = implementationPosition;
assembly {
impl := sload(position)
}
}
function setImplementation(address newImplementation) internal {
bytes32 position = implementationPosition;
assembly {
sstore(position, newImplementation)
}
}
function _upgradeTo(address newImplementation) internal {
address currentImplementation = implementation();
require(currentImplementation != newImplementation);
setImplementation(newImplementation);
emit Upgraded(newImplementation);
}
}
{
"compilationTarget": {
"SoraToken.sol": "SoraToken"
},
"evmVersion": "petersburg",
"libraries": {},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
}
[{"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":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":"INITIAL_SUPPLY","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"value","type":"uint256"}],"name":"burn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"value","type":"uint256"}],"name":"burnFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","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":"owner","type":"address"},{"name":"spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"beneficiary","type":"address"},{"name":"amount","type":"uint256"}],"name":"mintTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","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"},{"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"}]