编译器
0.8.17+commit.8df45f5f
文件 1 的 5:BSTIDO.sol
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";
contract BSTIDO is Ownable{
using EnumerableSet for EnumerableSet.AddressSet;
event Invest(address indexed account, uint indexed amount,uint time);
struct Info{
uint targetAmount;
uint maximum;
uint price;
uint startTime;
uint endTime;
uint claimTime;
uint base;
address rewardAddress;
address receiver;
string name;
}
Info public info;
uint public totalSupply;
mapping(address => uint) public balance;
mapping(address => uint) public payed;
mapping(address => uint) public payedETH;
EnumerableSet.AddressSet accounts;
struct Log {
uint time;
uint amount;
}
mapping(address => Log[]) logs;
constructor(Info memory info_) {
info = info_;
}
function getLog(address account) external view returns(Log[] memory) {
return logs[account];
}
function setInfo(Info calldata info_) external onlyOwner{
info = info_;
}
function invest() external payable {
require(info.startTime <= block.timestamp && block.timestamp <= info.endTime, 'Unable to stack');
_invest(Export(msg.sender, msg.value));
emit Invest(msg.sender, msg.value, block.timestamp);
}
function claim() external {
require(block.timestamp >= info.claimTime && info.claimTime != 0, 'Unable to claim');
uint eth = cost(msg.sender);
uint bst = eth * info.price;
require(payed[msg.sender] == 0 && payedETH[msg.sender] == 0, 'Unable to claim');
if (info.base == 1) {
IERC20(info.rewardAddress).transfer(msg.sender, bst);
payed[msg.sender] += bst;
} else {
payable(msg.sender).transfer(balance[msg.sender] - eth - 1);
payedETH[msg.sender] += balance[msg.sender] - eth - 1;
}
}
function cost(address account) public view returns (uint) {
return totalSupply < info.targetAmount ? 0 : info.targetAmount * balance[account] / totalSupply;
}
struct ViewLog{
uint invested;
uint investedFinal;
uint youHaveGotEth;
uint youCanClaimEth;
uint youHaveGot;
uint youCanClaim;
string name;
}
function viewLog(address account) external view returns(ViewLog memory){
uint eth = cost(account);
uint bst = eth * info.price;
return ViewLog(balance[account], eth, payedETH[account], balance[account] - eth - payedETH[account] - 1, payed[account], bst - payed[account], info.name);
}
struct Export{
address account;
uint amount;
}
function exportData(uint start, uint end) external view returns(Export[] memory) {
if (end > accounts.length()) {
end = accounts.length();
}
require(start < end, "start > end");
Export[] memory export_ = new Export[](end - start);
for(uint i = start; i < end; i++) {
export_[i - start].account = accounts.at(i);
export_[i - start].amount = balance[accounts.at(i)];
}
return export_;
}
function importData(Export[] memory exports) external {
for (uint i; i < exports.length; i++) {
_invest(exports[i]);
}
}
function _invest(Export memory export_) internal {
balance[export_.account] += export_.amount;
totalSupply += export_.amount;
accounts.add(export_.account);
logs[export_.account].push(Log(block.timestamp, msg.value));
}
function withdrawTarget () external {
payable(info.receiver).transfer(info.targetAmount);
}
}
文件 2 的 5:Context.sol
pragma solidity ^0.8.0;
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
文件 3 的 5:EnumerableSet.sol
pragma solidity ^0.8.0;
library EnumerableSet {
struct Set {
bytes32[] _values;
mapping(bytes32 => uint256) _indexes;
}
function _add(Set storage set, bytes32 value) private returns (bool) {
if (!_contains(set, value)) {
set._values.push(value);
set._indexes[value] = set._values.length;
return true;
} else {
return false;
}
}
function _remove(Set storage set, bytes32 value) private returns (bool) {
uint256 valueIndex = set._indexes[value];
if (valueIndex != 0) {
uint256 toDeleteIndex = valueIndex - 1;
uint256 lastIndex = set._values.length - 1;
if (lastIndex != toDeleteIndex) {
bytes32 lastValue = set._values[lastIndex];
set._values[toDeleteIndex] = lastValue;
set._indexes[lastValue] = valueIndex;
}
set._values.pop();
delete set._indexes[value];
return true;
} else {
return false;
}
}
function _contains(Set storage set, bytes32 value) private view returns (bool) {
return set._indexes[value] != 0;
}
function _length(Set storage set) private view returns (uint256) {
return set._values.length;
}
function _at(Set storage set, uint256 index) private view returns (bytes32) {
return set._values[index];
}
function _values(Set storage set) private view returns (bytes32[] memory) {
return set._values;
}
struct Bytes32Set {
Set _inner;
}
function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _add(set._inner, value);
}
function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _remove(set._inner, value);
}
function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
return _contains(set._inner, value);
}
function length(Bytes32Set storage set) internal view returns (uint256) {
return _length(set._inner);
}
function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
return _at(set._inner, index);
}
function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
bytes32[] memory store = _values(set._inner);
bytes32[] memory result;
assembly {
result := store
}
return result;
}
struct AddressSet {
Set _inner;
}
function add(AddressSet storage set, address value) internal returns (bool) {
return _add(set._inner, bytes32(uint256(uint160(value))));
}
function remove(AddressSet storage set, address value) internal returns (bool) {
return _remove(set._inner, bytes32(uint256(uint160(value))));
}
function contains(AddressSet storage set, address value) internal view returns (bool) {
return _contains(set._inner, bytes32(uint256(uint160(value))));
}
function length(AddressSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
function at(AddressSet storage set, uint256 index) internal view returns (address) {
return address(uint160(uint256(_at(set._inner, index))));
}
function values(AddressSet storage set) internal view returns (address[] memory) {
bytes32[] memory store = _values(set._inner);
address[] memory result;
assembly {
result := store
}
return result;
}
struct UintSet {
Set _inner;
}
function add(UintSet storage set, uint256 value) internal returns (bool) {
return _add(set._inner, bytes32(value));
}
function remove(UintSet storage set, uint256 value) internal returns (bool) {
return _remove(set._inner, bytes32(value));
}
function contains(UintSet storage set, uint256 value) internal view returns (bool) {
return _contains(set._inner, bytes32(value));
}
function length(UintSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
function at(UintSet storage set, uint256 index) internal view returns (uint256) {
return uint256(_at(set._inner, index));
}
function values(UintSet storage set) internal view returns (uint256[] memory) {
bytes32[] memory store = _values(set._inner);
uint256[] memory result;
assembly {
result := store
}
return result;
}
}
文件 4 的 5:IERC20.sol
pragma solidity ^0.8.0;
interface IERC20 {
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address to, uint256 amount) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(address from, address to, uint256 amount) external returns (bool);
}
文件 5 的 5:Ownable.sol
pragma solidity ^0.8.0;
import "../utils/Context.sol";
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor() {
_transferOwnership(_msgSender());
}
modifier onlyOwner() {
_checkOwner();
_;
}
function owner() public view virtual returns (address) {
return _owner;
}
function _checkOwner() internal view virtual {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
{
"compilationTarget": {
"contracts/BSTIDO.sol": "BSTIDO"
},
"evmVersion": "london",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": false,
"runs": 200
},
"remappings": []
}
[{"inputs":[{"components":[{"internalType":"uint256","name":"targetAmount","type":"uint256"},{"internalType":"uint256","name":"maximum","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"uint256","name":"claimTime","type":"uint256"},{"internalType":"uint256","name":"base","type":"uint256"},{"internalType":"address","name":"rewardAddress","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"string","name":"name","type":"string"}],"internalType":"struct BSTIDO.Info","name":"info_","type":"tuple"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"Invest","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"name":"exportData","outputs":[{"components":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct BSTIDO.Export[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getLog","outputs":[{"components":[{"internalType":"uint256","name":"time","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct BSTIDO.Log[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct BSTIDO.Export[]","name":"exports","type":"tuple[]"}],"name":"importData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"info","outputs":[{"internalType":"uint256","name":"targetAmount","type":"uint256"},{"internalType":"uint256","name":"maximum","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"uint256","name":"claimTime","type":"uint256"},{"internalType":"uint256","name":"base","type":"uint256"},{"internalType":"address","name":"rewardAddress","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"string","name":"name","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"invest","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"payed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"payedETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"targetAmount","type":"uint256"},{"internalType":"uint256","name":"maximum","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"uint256","name":"claimTime","type":"uint256"},{"internalType":"uint256","name":"base","type":"uint256"},{"internalType":"address","name":"rewardAddress","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"string","name":"name","type":"string"}],"internalType":"struct BSTIDO.Info","name":"info_","type":"tuple"}],"name":"setInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"viewLog","outputs":[{"components":[{"internalType":"uint256","name":"invested","type":"uint256"},{"internalType":"uint256","name":"investedFinal","type":"uint256"},{"internalType":"uint256","name":"youHaveGotEth","type":"uint256"},{"internalType":"uint256","name":"youCanClaimEth","type":"uint256"},{"internalType":"uint256","name":"youHaveGot","type":"uint256"},{"internalType":"uint256","name":"youCanClaim","type":"uint256"},{"internalType":"string","name":"name","type":"string"}],"internalType":"struct BSTIDO.ViewLog","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawTarget","outputs":[],"stateMutability":"nonpayable","type":"function"}]