编译器
0.6.12+commit.27d51765
文件 1 的 2:Token.sol
pragma solidity ^0.6.0;
abstract contract Token {
event Transfer(address indexed from, address indexed to, uint value);
event Approval(address indexed owner, address indexed spender, uint value);
function transfer(address to, uint value) public virtual returns (bool);
function transferFrom(address from, address to, uint value) public virtual returns (bool);
function approve(address spender, uint value) public virtual returns (bool);
function balanceOf(address owner) public virtual view returns (uint);
function allowance(address owner, address spender) public virtual view returns (uint);
function totalSupply() public virtual view returns (uint);
}
文件 2 的 2:disbursement.sol
pragma solidity ^0.6.0;
import "./Token.sol";
contract Disbursement {
address public receiver;
address public wallet;
uint public disbursementPeriod;
uint public startDate;
uint public withdrawnTokens;
Token public token;
modifier isReceiver() {
if (msg.sender != receiver)
revert("Only receiver is allowed to proceed");
_;
}
modifier isWallet() {
if (msg.sender != wallet)
revert("Only wallet is allowed to proceed");
_;
}
constructor(address _receiver, address _wallet, uint _disbursementPeriod, uint _startDate, Token _token)
public
{
if (_receiver == address(0) || _wallet == address(0) || _disbursementPeriod == 0 || address(_token) == address(0))
revert("Arguments are null");
receiver = _receiver;
wallet = _wallet;
disbursementPeriod = _disbursementPeriod;
startDate = _startDate;
token = _token;
if (startDate == 0){
startDate = now;
}
}
function withdraw(address _to, uint256 _value)
public
isReceiver
{
uint maxTokens = calcMaxWithdraw();
if (_value > maxTokens){
revert("Withdraw amount exceeds allowed tokens");
}
withdrawnTokens += _value;
token.transfer(_to, _value);
}
function walletWithdraw()
public
isWallet
{
uint balance = token.balanceOf(address(this));
withdrawnTokens += balance;
token.transfer(wallet, balance);
}
function calcMaxWithdraw()
public
view
returns (uint)
{
uint maxTokens = (token.balanceOf(address(this)) + withdrawnTokens) * (now - startDate) / disbursementPeriod;
if (withdrawnTokens >= maxTokens || startDate > now){
return 0;
}
return maxTokens - withdrawnTokens;
}
}
{
"compilationTarget": {
"contracts/disbursement.sol": "Disbursement"
},
"evmVersion": "istanbul",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
}
[{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"address","name":"_wallet","type":"address"},{"internalType":"uint256","name":"_disbursementPeriod","type":"uint256"},{"internalType":"uint256","name":"_startDate","type":"uint256"},{"internalType":"contract Token","name":"_token","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"calcMaxWithdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disbursementPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"receiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract Token","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"walletWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawnTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]