编译器
0.6.12+commit.27d51765
文件 1 的 13:Address.sol
pragma solidity >=0.6.2 <0.8.0;
library Address {
function isContract(address account) internal view returns (bool) {
uint256 size;
assembly { size := extcodesize(account) }
return size > 0;
}
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{ value: amount }("");
require(success, "Address: unable to send value, recipient may have reverted");
}
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
(bool success, bytes memory returndata) = target.call{ value: value }(data);
return _verifyCallResult(success, returndata, errorMessage);
}
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
(bool success, bytes memory returndata) = target.staticcall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
if (success) {
return returndata;
} else {
if (returndata.length > 0) {
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
文件 2 的 13:BigDiv.sol
pragma solidity ^0.6.0;
import "@openzeppelin/contracts/math/SafeMath.sol";
library BigDiv
{
using SafeMath for uint256;
uint256 private constant MAX_UINT = 2**256 - 1;
uint256 private constant MAX_BEFORE_SQUARE = 2**128 - 1;
uint256 private constant MAX_ERROR = 100000000;
uint256 private constant MAX_ERROR_BEFORE_DIV = MAX_ERROR * 2;
function bigDiv2x1(
uint256 _numA,
uint256 _numB,
uint256 _den
) internal pure
returns(uint256)
{
if(_numA == 0 || _numB == 0)
{
return 0;
}
uint256 value;
if(MAX_UINT / _numA >= _numB)
{
value = _numA * _numB;
value /= _den;
return value;
}
uint256 numMax = _numB;
uint256 numMin = _numA;
if(_numA > _numB)
{
numMax = _numA;
numMin = _numB;
}
value = numMax / _den;
if(value > MAX_ERROR)
{
value = value.mul(numMin);
return value;
}
uint256 factor = numMin - 1;
factor /= MAX_BEFORE_SQUARE;
factor += 1;
uint256 temp = numMax - 1;
temp /= MAX_BEFORE_SQUARE;
temp += 1;
if(MAX_UINT / factor >= temp)
{
factor *= temp;
value = numMax / factor;
if(value > MAX_ERROR_BEFORE_DIV)
{
value = value.mul(numMin);
temp = _den - 1;
temp /= factor;
temp = temp.add(1);
value /= temp;
return value;
}
}
factor = numMin - 1;
factor /= MAX_BEFORE_SQUARE;
factor += 1;
value = numMin / factor;
temp = _den - 1;
temp /= factor;
temp += 1;
temp = numMax / temp;
value = value.mul(temp);
return value;
}
function bigDiv2x1RoundUp(
uint256 _numA,
uint256 _numB,
uint256 _den
) internal pure
returns(uint256)
{
uint256 value = bigDiv2x1(_numA, _numB, _den);
if(value == 0)
{
return 1;
}
uint256 temp = value - 1;
temp /= MAX_ERROR;
temp += 1;
if(MAX_UINT - value < temp)
{
return MAX_UINT;
}
value += temp;
return value;
}
function bigDiv2x2(
uint256 _numA,
uint256 _numB,
uint256 _denA,
uint256 _denB
) internal pure
returns (uint256)
{
if(MAX_UINT / _denA >= _denB)
{
return bigDiv2x1(_numA, _numB, _denA * _denB);
}
if(_numA == 0 || _numB == 0)
{
return 0;
}
uint256 denMax = _denB;
uint256 denMin = _denA;
if(_denA > _denB)
{
denMax = _denA;
denMin = _denB;
}
uint256 value;
if(MAX_UINT / _numA >= _numB)
{
value = _numA * _numB;
value /= denMin;
value /= denMax;
return value;
}
uint256 numMax = _numB;
uint256 numMin = _numA;
if(_numA > _numB)
{
numMax = _numA;
numMin = _numB;
}
uint256 temp = numMax / denMin;
if(temp > MAX_ERROR_BEFORE_DIV)
{
return bigDiv2x1(temp, numMin, denMax);
}
uint256 factor = numMin - 1;
factor /= MAX_BEFORE_SQUARE;
factor += 1;
temp = numMax - 1;
temp /= MAX_BEFORE_SQUARE;
temp += 1;
if(MAX_UINT / factor >= temp)
{
factor *= temp;
value = numMax / factor;
if(value > MAX_ERROR_BEFORE_DIV)
{
value = value.mul(numMin);
value /= denMin;
if(value > 0 && MAX_UINT / value >= factor)
{
value *= factor;
value /= denMax;
return value;
}
}
}
factor = denMin;
factor /= MAX_BEFORE_SQUARE;
temp = denMax;
temp /= MAX_BEFORE_SQUARE + 1;
factor *= temp;
return bigDiv2x1(numMax / factor, numMin, MAX_UINT);
}
}
文件 3 的 13:Context.sol
pragma solidity >=0.6.0 <0.8.0;
abstract contract Context {
function _msgSender() internal view virtual returns (address payable) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes memory) {
this;
return msg.data;
}
}
文件 4 的 13:DecentralizedAutonomousTrust.sol
pragma solidity ^0.6.0;
pragma experimental ABIEncoderV2;
import "./math/BigDiv.sol";
import "./math/Sqrt.sol";
import "./Take.sol";
import "./uniswap/IUniswapV2Router02.sol";
import "./uniswap/IUniswapV2Factory.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC20/SafeERC20.sol";
import "@openzeppelin/contracts/math/SafeMath.sol";
import "@openzeppelin/contracts/utils/Address.sol";
import "@openzeppelin/contracts/token/ERC20/TokenTimelock.sol";
contract DecentralizedAutonomousTrust
is Take
{
using SafeMath for uint;
using Sqrt for uint;
using SafeERC20 for IERC20;
event Buy(
address indexed _from,
address indexed _to,
uint256 _currencyValue,
uint256 _fairValue
);
event Close();
event StateChange(
uint256 _previousState,
uint256 _newState
);
event UpdateConfig(
address indexed _beneficiary,
address indexed _control,
address _uniswapRouterAddress,
address _uniswapFactoryAddress,
uint256 _minInvestment,
uint256 _openUntilAtLeast
);
uint256 private constant STATE_INIT = 0;
uint256 private constant STATE_RUN = 1;
uint256 private constant STATE_CLOSE = 2;
uint256 private constant STATE_CANCEL = 3;
uint256 private constant MAX_BEFORE_SQUARE = 2**128 - 1;
uint256 private constant BASIS_POINTS_DEN = 10000;
uint256 private constant MAX_SUPPLY = 10 ** 38;
address payable public beneficiary;
uint256 public buySlopeNum;
uint256 public buySlopeDen;
address public control;
IERC20 public currency;
uint256 public initGoal;
uint256 public initReserve;
uint256 public bcGoal;
uint256 public bcTakeReleased;
uint256 public investmentReserveBasisPoints;
uint256 public openUntilAtLeast;
uint256 public minInvestment;
uint256 public state;
string public constant version = "2";
bytes32 public DOMAIN_SEPARATOR;
bytes32 public constant PERMIT_TYPEHASH = 0xea2aa0a1be11a07ed86d755c93467f4f82362b452371d1ba94d1715123511acb;
address public uniswapFactoryAddress;
address public uniswapRouterAddress;
IUniswapV2Router02 private uniswapRouter;
IUniswapV2Factory private uniswapFactory;
address internal constant NULL_ADDRESS = 0x0000000000000000000000000000000000000000;
uint96 private constant uniswapBurnRate = 1000;
address public uniswapPairAddress = 0x0000000000000000000000000000000000000000;
address public uniswapTokenTimelockAddress = 0x0000000000000000000000000000000000000000;
address public takeTimelockAddress = 0x0000000000000000000000000000000000000000;
uint256 private constant teamRevenueBasisPoints = 3000;
bool public bcFlowAllowed = false;
function pay() external payable
{
require(address(currency) == address(0), "ONLY_FOR_CURRENCY_ETH");
}
function handleBC(
bool withdrawOnError
) external
{
require(state == STATE_CLOSE, "ONLY_AFTER_CLOSE");
require(msg.sender == beneficiary, "BENEFICIARY_ONLY");
uint256 reserve = address(this).balance;
require(reserve > 0, "MUST_BUY_AT_LEAST_1");
uint256 teamReserve = reserve.mul(teamRevenueBasisPoints);
teamReserve /= BASIS_POINTS_DEN;
uint256 uniswapPoolEthAmount = reserve.sub(teamReserve);
uint256 uniswapPoolTakeAmount = uniswapPoolEthAmount.mul(buySlopeDen);
uniswapPoolTakeAmount = uniswapPoolTakeAmount.div(bcTakeReleased);
uniswapPoolTakeAmount = uniswapPoolTakeAmount.div(buySlopeNum);
super._allowTokenTransfer();
super._approve(address(this), uniswapRouterAddress, uint(-1));
try uniswapRouter.addLiquidityETH{
value: uniswapPoolEthAmount
}(
address(this),
uniswapPoolTakeAmount,
uniswapPoolTakeAmount,
uniswapPoolEthAmount,
address(this),
block.timestamp + 15
) returns (uint256 amountToken, uint256 amountETH, uint256 liquidity) {
Address.sendValue(beneficiary, address(this).balance);
uniswapPairAddress = uniswapFactory.getPair(uniswapRouter.WETH(), address(this));
super._setBurnConfig(uniswapBurnRate, NULL_ADDRESS);
super._addBurnSaleAddress(uniswapPairAddress);
super._setApproveConfig(NULL_ADDRESS);
lockTakeTokens();
} catch {
if (withdrawOnError) {
Address.sendValue(beneficiary, address(this).balance);
uint96 amount = safe96(this.balanceOf(address(this)), "DAT:: amount exceeds 96 bits");
super._transferTokens(address(this), beneficiary, amount);
}
}
}
function lockUniswapTokens() external {
require(state == STATE_CLOSE, "ONLY_AFTER_CLOSE");
require(msg.sender == beneficiary, "BENEFICIARY_ONLY");
IERC20 uniswapPair = IERC20(uniswapPairAddress);
TokenTimelock uniswapTokenTimelock = new TokenTimelock(uniswapPair, beneficiary, block.timestamp + 31 days);
uniswapTokenTimelockAddress = address(uniswapTokenTimelock);
uniswapPair.transfer(uniswapTokenTimelockAddress, uniswapPair.balanceOf(address(this)) );
}
function permit(
address holder,
address spender,
uint256 nonce,
uint256 expiry,
bool allowed,
uint8 v,
bytes32 r,
bytes32 s
) external
{
bytes32 digest = keccak256(
abi.encodePacked(
"\x19\x01",
DOMAIN_SEPARATOR,
keccak256(
abi.encode(PERMIT_TYPEHASH,
holder,
spender,
nonce,
expiry,
allowed
)
)
)
);
require(holder != address(0), "DAT/invalid-address-0");
require(holder == ecrecover(digest, v, r, s), "DAT/invalid-permit");
require(expiry == 0 || now <= expiry, "DAT/permit-expired");
require(nonce == nonces[holder]++, "DAT/invalid-nonce");
uint256 wad = allowed ? uint(-1) : 0;
super._approve(holder, spender, wad);
}
function initialize(
address _currencyAddress,
uint256 _initGoal,
uint256 _bcGoal,
uint256 _buySlopeNum,
uint256 _buySlopeDen,
uint256 _investmentReserveBasisPoints
) public
{
require(control == address(0), "ALREADY_INITIALIZED");
initReserve = 0;
if(_initGoal == 0)
{
emit StateChange(state, STATE_RUN);
state = STATE_RUN;
}
else
{
require(_initGoal < MAX_SUPPLY, "EXCESSIVE_GOAL");
initGoal = _initGoal;
}
require(_bcGoal > 0, "INVALID_BC_GOAL");
bcGoal = _bcGoal;
bcTakeReleased = 0;
require(_buySlopeNum > 0, "INVALID_SLOPE_NUM");
require(_buySlopeDen > 0, "INVALID_SLOPE_DEN");
require(_buySlopeNum < MAX_BEFORE_SQUARE, "EXCESSIVE_SLOPE_NUM");
require(_buySlopeDen < MAX_BEFORE_SQUARE, "EXCESSIVE_SLOPE_DEN");
buySlopeNum = _buySlopeNum;
buySlopeDen = _buySlopeDen;
require(_investmentReserveBasisPoints <= BASIS_POINTS_DEN, "INVALID_RESERVE");
investmentReserveBasisPoints = _investmentReserveBasisPoints;
minInvestment = 1 ether;
beneficiary = msg.sender;
control = msg.sender;
currency = IERC20(_currencyAddress);
DOMAIN_SEPARATOR = keccak256(
abi.encode(
keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
keccak256(bytes(name)),
keccak256(bytes(version)),
_getChainId(),
address(this)
)
);
}
function updateConfig(
address payable _beneficiary,
address _control,
address _uniswapRouterAddress,
address _uniswapFactoryAddress,
uint256 _minInvestment,
uint256 _openUntilAtLeast
) public
{
require(msg.sender == control, "CONTROL_ONLY");
require(_control != address(0), "INVALID_ADDRESS");
control = _control;
require(_uniswapRouterAddress != address(0), "INVALID_ADDRESS");
uniswapRouterAddress = _uniswapRouterAddress;
require(_uniswapFactoryAddress != address(0), "INVALID_ADDRESS");
uniswapFactoryAddress = _uniswapFactoryAddress;
uniswapRouter = IUniswapV2Router02(uniswapRouterAddress);
uniswapFactory = IUniswapV2Factory(uniswapFactoryAddress);
require(_minInvestment > 0, "INVALID_MIN_INVESTMENT");
minInvestment = _minInvestment;
require(_openUntilAtLeast >= openUntilAtLeast, "OPEN_UNTIL_MAY_NOT_BE_REDUCED");
openUntilAtLeast = _openUntilAtLeast;
if(beneficiary != _beneficiary)
{
require(_beneficiary != address(0), "INVALID_ADDRESS");
uint256 tokens = balances[beneficiary];
if(tokens > 0)
{
_transfer(beneficiary, _beneficiary, tokens);
}
beneficiary = _beneficiary;
}
emit UpdateConfig(
_beneficiary,
_control,
_uniswapRouterAddress,
_uniswapFactoryAddress,
_minInvestment,
_openUntilAtLeast
);
}
function allowBcFlow() public {
require(msg.sender == beneficiary, "BENEFICIARY_ONLY");
bcFlowAllowed = true;
}
function estimateBuyValue(
uint256 _currencyValue
) public view
returns (uint)
{
if(_currencyValue < minInvestment)
{
return 0;
}
uint256 tokenValue;
if(state == STATE_RUN)
{
uint256 supply = bcTakeReleased;
tokenValue = BigDiv.bigDiv2x1(
_currencyValue,
2 * buySlopeDen,
buySlopeNum
);
tokenValue = tokenValue.add(supply * supply);
tokenValue = tokenValue.sqrt();
tokenValue = tokenValue.sub(supply);
}
else
{
return 0;
}
return tokenValue;
}
function estimateBuyTokensValue (
uint256 _tokenValue
) public view
returns (uint)
{
uint256 currencyValue;
if(state == STATE_RUN) {
uint256 supply = bcTakeReleased;
uint256 tokenValue = _tokenValue.add(supply);
tokenValue = tokenValue.mul(tokenValue);
tokenValue = tokenValue.sub(supply * supply);
currencyValue = BigDiv.bigDiv2x1(
tokenValue,
buySlopeNum,
2 * buySlopeDen
);
}
else
{
return 0;
}
return currencyValue;
}
function buy(
address _to,
uint256 _currencyValue,
uint256 _minTokensBought
) public payable
{
require(bcFlowAllowed, "TOKEN_SALE_NOT_STARTED");
require(_to != address(0), "INVALID_ADDRESS");
require(_minTokensBought > 0, "MUST_BUY_AT_LEAST_1");
require(bcGoal >= bcTakeReleased, "BC_GOAL_REACHED");
bool closeAfterBuy = false;
uint256 tokenValue = estimateBuyValue(_currencyValue);
if (bcTakeReleased.add(tokenValue) >= bcGoal) {
closeAfterBuy = true;
tokenValue = bcGoal.sub(bcTakeReleased);
_currencyValue = estimateBuyTokensValue(tokenValue);
}
require(tokenValue >= _minTokensBought, "PRICE_SLIPPAGE");
emit Buy(msg.sender, _to, _currencyValue, tokenValue);
_collectInvestment(_currencyValue, msg.value, true);
super._transferTokens(address(this), _to, safe96(tokenValue, "DAT:: amount exceeds 96 bits"));
bcTakeReleased = bcTakeReleased.add(tokenValue);
if(state == STATE_RUN && closeAfterBuy) {
_close();
}
}
function close() public
{
require(msg.sender == beneficiary, "BENEFICIARY_ONLY");
_close();
}
function _transfer(
address _from,
address _to,
uint256 _amount
) internal
{
require(state != STATE_INIT || _from == beneficiary, "ONLY_BENEFICIARY_DURING_INIT");
uint96 amount = safe96(_amount, "DAT::transfer: amount exceeds 96 bits");
super._transferTokens(_from, _to, amount);
}
function _close() private
{
if(state == STATE_INIT)
{
emit StateChange(state, STATE_CANCEL);
state = STATE_CANCEL;
}
else if(state == STATE_RUN)
{
require(openUntilAtLeast <= block.timestamp, "TOO_EARLY");
emit StateChange(state, STATE_CLOSE);
state = STATE_CLOSE;
}
else
{
revert("INVALID_STATE");
}
emit Close();
}
function _collectInvestment(
uint256 _quantityToInvest,
uint256 _msgValue,
bool _refundRemainder
) private
{
if(address(currency) == address(0))
{
if(_refundRemainder)
{
uint256 refund = _msgValue.sub(_quantityToInvest);
if(refund > 0)
{
Address.sendValue(msg.sender, refund);
}
}
else
{
require(_quantityToInvest == _msgValue, "INCORRECT_MSG_VALUE");
}
}
else
{
require(_msgValue == 0, "DO_NOT_SEND_ETH");
currency.safeTransferFrom(msg.sender, address(this), _quantityToInvest);
}
}
function _transferCurrency(
address payable _to,
uint256 _amount
) private
{
if(_amount > 0)
{
if(address(currency) == address(0))
{
Address.sendValue(_to, _amount);
}
else
{
currency.safeTransfer(_to, _amount);
}
}
}
function _getChainId(
) private pure
returns (uint256 id)
{
assembly
{
id := chainid()
}
}
function lockTakeTokens() private {
require(state == STATE_CLOSE, "ONLY_AFTER_CLOSE");
require(msg.sender == beneficiary, "BENEFICIARY_ONLY");
TokenTimelock takeTokenTimelock = new TokenTimelock(IERC20(address(this)), beneficiary, block.timestamp + 31 days);
takeTimelockAddress = address(takeTokenTimelock);
this.transfer(takeTimelockAddress, this.balanceOf(address(this)) );
}
}
文件 5 的 13:IERC20.sol
pragma solidity >=0.6.0 <0.8.0;
interface IERC20 {
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address recipient, 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 sender, address recipient, uint256 amount) external returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
文件 6 的 13:IUniswapV2Factory.sol
pragma solidity >=0.5.0;
interface IUniswapV2Factory {
event PairCreated(address indexed token0, address indexed token1, address pair, uint);
function feeTo() external view returns (address);
function feeToSetter() external view returns (address);
function getPair(address tokenA, address tokenB) external view returns (address pair);
function allPairs(uint) external view returns (address pair);
function allPairsLength() external view returns (uint);
function createPair(address tokenA, address tokenB) external returns (address pair);
function setFeeTo(address) external;
function setFeeToSetter(address) external;
}
文件 7 的 13:IUniswapV2Router02.sol
pragma solidity ^0.6.0;
interface IUniswapV2Router02 {
function factory() external pure returns (address);
function WETH() external pure returns (address);
function addLiquidity(
address tokenA,
address tokenB,
uint amountADesired,
uint amountBDesired,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB, uint liquidity);
function addLiquidityETH(
address token,
uint amountTokenDesired,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external payable returns (uint amountToken, uint amountETH, uint liquidity);
function removeLiquidity(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB);
function removeLiquidityETH(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountToken, uint amountETH);
function removeLiquidityWithPermit(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountA, uint amountB);
function removeLiquidityETHWithPermit(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountToken, uint amountETH);
function swapExactTokensForTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapTokensForExactTokens(
uint amountOut,
uint amountInMax,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
external
payable
returns (uint[] memory amounts);
function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
external
returns (uint[] memory amounts);
function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
external
returns (uint[] memory amounts);
function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
external
payable
returns (uint[] memory amounts);
function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
function removeLiquidityETHSupportingFeeOnTransferTokens(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountETH);
function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountETH);
function swapExactTokensForTokensSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
function swapExactETHForTokensSupportingFeeOnTransferTokens(
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external payable;
function swapExactTokensForETHSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
}
文件 8 的 13:Ownable.sol
pragma solidity >=0.6.0 <0.8.0;
import "../GSN/Context.sol";
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor () internal {
address msgSender = _msgSender();
_owner = msgSender;
emit OwnershipTransferred(address(0), msgSender);
}
function owner() public view returns (address) {
return _owner;
}
modifier onlyOwner() {
require(_owner == _msgSender(), "Ownable: caller is not the owner");
_;
}
function renounceOwnership() public virtual onlyOwner {
emit OwnershipTransferred(_owner, address(0));
_owner = address(0);
}
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
emit OwnershipTransferred(_owner, newOwner);
_owner = newOwner;
}
}
文件 9 的 13:SafeERC20.sol
pragma solidity >=0.6.0 <0.8.0;
import "./IERC20.sol";
import "../../math/SafeMath.sol";
import "../../utils/Address.sol";
library SafeERC20 {
using SafeMath for uint256;
using Address for address;
function safeTransfer(IERC20 token, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
function safeApprove(IERC20 token, address spender, uint256 value) internal {
require((value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 newAllowance = token.allowance(address(this), spender).add(value);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero");
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function _callOptionalReturn(IERC20 token, bytes memory data) private {
bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
if (returndata.length > 0) {
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
}
文件 10 的 13:SafeMath.sol
pragma solidity >=0.6.0 <0.8.0;
library SafeMath {
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return sub(a, b, "SafeMath: subtraction overflow");
}
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;
return c;
}
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return div(a, b, "SafeMath: division by zero");
}
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
uint256 c = a / b;
return c;
}
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return mod(a, b, "SafeMath: modulo by zero");
}
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b != 0, errorMessage);
return a % b;
}
}
文件 11 的 13:Sqrt.sol
pragma solidity ^0.6.0;
library Sqrt
{
uint256 private constant MAX_UINT = 2**256 - 1;
function sqrt(
uint x
) internal pure
returns (uint y)
{
if (x == 0)
{
return 0;
}
else if (x <= 3)
{
return 1;
}
else if (x == MAX_UINT)
{
return 2**128 - 1;
}
uint z = (x + 1) / 2;
y = x;
while (z < y)
{
y = z;
z = (x / z + z) / 2;
}
}
}
文件 12 的 13:Take.sol
pragma solidity ^0.6.0;
pragma experimental ABIEncoderV2;
import "@openzeppelin/contracts/math/SafeMath.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
contract Take is Ownable {
using SafeMath for uint;
string public constant name = "Take";
string public constant symbol = "TAKE";
uint8 public constant decimals = 18;
uint256 public totalSupply;
mapping (address => mapping (address => uint96)) internal allowances;
mapping (address => uint96) internal balances;
mapping (address => address) public delegates;
struct Checkpoint {
uint32 fromBlock;
uint96 votes;
}
mapping (address => mapping (uint32 => Checkpoint)) public checkpoints;
mapping (address => uint32) public numCheckpoints;
mapping (address => uint) public nonces;
event BurnConfigChanged(uint96 burnRate, address burnPoolAddress);
event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);
event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);
event Transfer(address indexed from, address indexed to, uint256 amount);
event Approval(address indexed owner, address indexed spender, uint256 amount);
uint96 public burnRate;
address public burnPoolAddress;
uint96 public constant burnRateBase = 10000;
address public approveDisabledAddress;
bool public tokenTransferAllowed = false;
mapping (address => bool) public burnSaleAddresses;
constructor() public {
uint96 _totalSupply = 1000000e18;
totalSupply = _totalSupply;
balances[msg.sender] = _totalSupply;
emit Transfer(address(0), msg.sender, _totalSupply);
burnRate = 0;
burnPoolAddress = 0x0000000000000000000000000000000000000000;
approveDisabledAddress = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
}
function setBurnConfig(uint96 _burnRate, address _burnPoolAddress) external
onlyOwner
{
_setBurnConfig(_burnRate, _burnPoolAddress);
}
function addBurnSaleAddress(address burnAddress) external onlyOwner {
_addBurnSaleAddress(burnAddress);
}
function removeBurnSaleAddress(address burnAddress) external onlyOwner {
burnSaleAddresses[burnAddress] = false;
}
function setApproveConfig(address _approveDisabledAddress) external onlyOwner {
_setApproveConfig(_approveDisabledAddress);
}
function allowTokenTransfer() external onlyOwner {
_allowTokenTransfer();
}
function allowance(address account, address spender) external view returns (uint) {
return allowances[account][spender];
}
function approve(address spender, uint256 rawAmount) external returns (bool) {
require(approveDisabledAddress != spender, "Take::approve: disabled");
uint96 amount;
if (rawAmount == uint(-1)) {
amount = uint96(-1);
} else {
amount = safe96(rawAmount, "Take::approve: amount exceeds 96 bits");
}
allowances[msg.sender][spender] = amount;
emit Approval(msg.sender, spender, amount);
return true;
}
function balanceOf(address account) external view returns (uint) {
return balances[account];
}
function transfer(address dst, uint256 rawAmount) external returns (bool) {
if (msg.sender != owner()) {
require(tokenTransferAllowed, "Take:: Token transfer not allowed");
}
uint96 amount = safe96(rawAmount, "Take::transfer: amount exceeds 96 bits");
_transferTokens(msg.sender, dst, amount);
return true;
}
function transferFrom(address src, address dst, uint256 rawAmount) external returns (bool) {
if (msg.sender != owner()) {
require(tokenTransferAllowed, "Take:: Token transfer not allowed");
}
address spender = msg.sender;
uint96 spenderAllowance = allowances[src][spender];
uint96 amount = safe96(rawAmount, "Take::approve: amount exceeds 96 bits");
if (spender != src && spenderAllowance != uint96(-1)) {
uint96 newAllowance = sub96(spenderAllowance, amount, "Take::transferFrom: transfer amount exceeds spender allowance");
allowances[src][spender] = newAllowance;
emit Approval(src, spender, newAllowance);
}
_transferTokens(src, dst, amount);
return true;
}
function getCurrentVotes(address account) external view returns (uint96) {
uint32 nCheckpoints = numCheckpoints[account];
return nCheckpoints > 0 ? checkpoints[account][nCheckpoints - 1].votes : 0;
}
function delegate(address delegatee) public {
return _delegate(msg.sender, delegatee);
}
function getPriorVotes(address account, uint256 blockNumber) public view returns (uint96) {
require(blockNumber < block.number, "Take::getPriorVotes: not yet determined");
uint32 nCheckpoints = numCheckpoints[account];
if (nCheckpoints == 0) {
return 0;
}
if (checkpoints[account][nCheckpoints - 1].fromBlock <= blockNumber) {
return checkpoints[account][nCheckpoints - 1].votes;
}
if (checkpoints[account][0].fromBlock > blockNumber) {
return 0;
}
uint32 lower = 0;
uint32 upper = nCheckpoints - 1;
while (upper > lower) {
uint32 center = upper - (upper - lower) / 2;
Checkpoint memory cp = checkpoints[account][center];
if (cp.fromBlock == blockNumber) {
return cp.votes;
} else if (cp.fromBlock < blockNumber) {
lower = center;
} else {
upper = center - 1;
}
}
return checkpoints[account][lower].votes;
}
function _delegate(address delegator, address delegatee) internal {
address currentDelegate = delegates[delegator];
uint96 delegatorBalance = balances[delegator];
delegates[delegator] = delegatee;
emit DelegateChanged(delegator, currentDelegate, delegatee);
_moveDelegates(currentDelegate, delegatee, delegatorBalance);
}
function _transferTokens(address src, address dst, uint96 amount) internal {
require(src != address(0), "Take::_transferTokens: cannot transfer from the zero address");
require(dst != address(0), "Take::_transferTokens: cannot transfer to the zero address");
uint96 sendAmount = amount;
uint96 burnFee = div96(mul96(burnRate, amount), burnRateBase);
if (burnFee >0 && burnSaleAddresses[dst]) {
balances[burnPoolAddress] = add96(
balances[burnPoolAddress],
burnFee,
"Take::_transferTokens: transfer amount burnFee overflows"
);
sendAmount = sub96(amount, burnFee, "Take::_transferTokens: burnFee > amount");
emit Transfer(src, burnPoolAddress, burnFee);
}
balances[src] = sub96(balances[src], amount, "Take::_transferTokens: transfer amount exceeds balance");
balances[dst] = add96(balances[dst], sendAmount, "Take::_transferTokens: transfer amount overflows");
emit Transfer(src, dst, sendAmount);
_moveDelegates(delegates[src], delegates[dst], amount);
}
function _moveDelegates(address srcRep, address dstRep, uint96 amount) internal {
if (srcRep != dstRep && amount > 0) {
if (srcRep != address(0)) {
uint32 srcRepNum = numCheckpoints[srcRep];
uint96 srcRepOld = srcRepNum > 0 ? checkpoints[srcRep][srcRepNum - 1].votes : 0;
uint96 srcRepNew = sub96(srcRepOld, amount, "Take::_moveVotes: vote amount underflows");
_writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew);
}
if (dstRep != address(0)) {
uint32 dstRepNum = numCheckpoints[dstRep];
uint96 dstRepOld = dstRepNum > 0 ? checkpoints[dstRep][dstRepNum - 1].votes : 0;
uint96 dstRepNew = add96(dstRepOld, amount, "Take::_moveVotes: vote amount overflows");
_writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew);
}
}
}
function _writeCheckpoint(address delegatee, uint32 nCheckpoints, uint96 oldVotes, uint96 newVotes) internal {
uint32 blockNumber = safe32(block.number, "Take::_writeCheckpoint: block number exceeds 32 bits");
if (nCheckpoints > 0 && checkpoints[delegatee][nCheckpoints - 1].fromBlock == blockNumber) {
checkpoints[delegatee][nCheckpoints - 1].votes = newVotes;
} else {
checkpoints[delegatee][nCheckpoints] = Checkpoint(blockNumber, newVotes);
numCheckpoints[delegatee] = nCheckpoints + 1;
}
emit DelegateVotesChanged(delegatee, oldVotes, newVotes);
}
function safe32(uint256 n, string memory errorMessage) internal pure returns (uint32) {
require(n < 2**32, errorMessage);
return uint32(n);
}
function safe96(uint256 n, string memory errorMessage) internal pure returns (uint96) {
require(n < 2**96, errorMessage);
return uint96(n);
}
function add96(uint96 a, uint96 b, string memory errorMessage) internal pure returns (uint96) {
uint96 c = a + b;
require(c >= a, errorMessage);
return c;
}
function sub96(uint96 a, uint96 b, string memory errorMessage) internal pure returns (uint96) {
require(b <= a, errorMessage);
return a - b;
}
function mul96(uint96 a, uint96 b) internal pure returns (uint96) {
if (a == 0) {
return 0;
}
uint96 c = a * b;
require(c / a == b, "multiplication overflow");
return c;
}
function div96(uint96 a, uint96 b) internal pure returns (uint96) {
require(b > 0, "division by zero");
uint96 c = a / b;
return c;
}
function getChainId() internal pure returns (uint) {
uint256 chainId;
assembly { chainId := chainid() }
return chainId;
}
function _approve(address owner, address spender, uint256 rawAmount) internal {
require(owner != address(0), "Take::approve: approve from the zero address");
require(spender != address(0), "Take::approve: approve to the zero address");
uint96 amount;
if (rawAmount == uint(-1)) {
amount = uint96(-1);
} else {
amount = safe96(rawAmount, "Take::approve: amount exceeds 96 bits");
}
allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
function _addBurnSaleAddress(address burnAddress) internal onlyOwner {
burnSaleAddresses[burnAddress] = true;
}
function _setBurnConfig(uint96 _burnRate, address _burnPoolAddress) internal
{
burnRate = _burnRate;
burnPoolAddress = _burnPoolAddress;
emit BurnConfigChanged(burnRate, burnPoolAddress);
}
function _setApproveConfig(address _approveDisabledAddress) internal {
approveDisabledAddress = _approveDisabledAddress;
}
function _allowTokenTransfer() internal {
tokenTransferAllowed = true;
}
}
文件 13 的 13:TokenTimelock.sol
pragma solidity >=0.6.0 <0.8.0;
import "./SafeERC20.sol";
contract TokenTimelock {
using SafeERC20 for IERC20;
IERC20 private _token;
address private _beneficiary;
uint256 private _releaseTime;
constructor (IERC20 token_, address beneficiary_, uint256 releaseTime_) public {
require(releaseTime_ > block.timestamp, "TokenTimelock: release time is before current time");
_token = token_;
_beneficiary = beneficiary_;
_releaseTime = releaseTime_;
}
function token() public view returns (IERC20) {
return _token;
}
function beneficiary() public view returns (address) {
return _beneficiary;
}
function releaseTime() public view returns (uint256) {
return _releaseTime;
}
function release() public virtual {
require(block.timestamp >= _releaseTime, "TokenTimelock: current time is before release time");
uint256 amount = _token.balanceOf(address(this));
require(amount > 0, "TokenTimelock: no tokens to release");
_token.safeTransfer(_beneficiary, amount);
}
}
{
"compilationTarget": {
"contracts/DecentralizedAutonomousTrust.sol": "DecentralizedAutonomousTrust"
},
"evmVersion": "istanbul",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
}
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint96","name":"burnRate","type":"uint96"},{"indexed":false,"internalType":"address","name":"burnPoolAddress","type":"address"}],"name":"BurnConfigChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_currencyValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_fairValue","type":"uint256"}],"name":"Buy","type":"event"},{"anonymous":false,"inputs":[],"name":"Close","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegator","type":"address"},{"indexed":true,"internalType":"address","name":"fromDelegate","type":"address"},{"indexed":true,"internalType":"address","name":"toDelegate","type":"address"}],"name":"DelegateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"DelegateVotesChanged","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_previousState","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_newState","type":"uint256"}],"name":"StateChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":true,"internalType":"address","name":"_control","type":"address"},{"indexed":false,"internalType":"address","name":"_uniswapRouterAddress","type":"address"},{"indexed":false,"internalType":"address","name":"_uniswapFactoryAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"_minInvestment","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_openUntilAtLeast","type":"uint256"}],"name":"UpdateConfig","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"burnAddress","type":"address"}],"name":"addBurnSaleAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"allowBcFlow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"allowTokenTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"rawAmount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"approveDisabledAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bcFlowAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bcGoal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bcTakeReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"beneficiary","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnPoolAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnRate","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnRateBase","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"burnSaleAddresses","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_currencyValue","type":"uint256"},{"internalType":"uint256","name":"_minTokensBought","type":"uint256"}],"name":"buy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"buySlopeDen","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buySlopeNum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint32","name":"","type":"uint32"}],"name":"checkpoints","outputs":[{"internalType":"uint32","name":"fromBlock","type":"uint32"},{"internalType":"uint96","name":"votes","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"close","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"control","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currency","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"}],"name":"delegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"delegates","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenValue","type":"uint256"}],"name":"estimateBuyTokensValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_currencyValue","type":"uint256"}],"name":"estimateBuyValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getCurrentVotes","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getPriorVotes","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"withdrawOnError","type":"bool"}],"name":"handleBC","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initGoal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initReserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_currencyAddress","type":"address"},{"internalType":"uint256","name":"_initGoal","type":"uint256"},{"internalType":"uint256","name":"_bcGoal","type":"uint256"},{"internalType":"uint256","name":"_buySlopeNum","type":"uint256"},{"internalType":"uint256","name":"_buySlopeDen","type":"uint256"},{"internalType":"uint256","name":"_investmentReserveBasisPoints","type":"uint256"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"investmentReserveBasisPoints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockUniswapTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"minInvestment","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numCheckpoints","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openUntilAtLeast","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pay","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"bool","name":"allowed","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"burnAddress","type":"address"}],"name":"removeBurnSaleAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_approveDisabledAddress","type":"address"}],"name":"setApproveConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint96","name":"_burnRate","type":"uint96"},{"internalType":"address","name":"_burnPoolAddress","type":"address"}],"name":"setBurnConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"state","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"takeTimelockAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenTransferAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"rawAmount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"src","type":"address"},{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"rawAmount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapFactoryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapPairAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapRouterAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapTokenTimelockAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"_beneficiary","type":"address"},{"internalType":"address","name":"_control","type":"address"},{"internalType":"address","name":"_uniswapRouterAddress","type":"address"},{"internalType":"address","name":"_uniswapFactoryAddress","type":"address"},{"internalType":"uint256","name":"_minInvestment","type":"uint256"},{"internalType":"uint256","name":"_openUntilAtLeast","type":"uint256"}],"name":"updateConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]