文件 1 的 26:BaseCAVO.sol
pragma solidity >=0.6.6;
import "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
import './libraries/SafeMath.sol';
import './libraries/Math.sol';
import './interfaces/ICAVO.sol';
import './interfaces/IExcavoERC20.sol';
import './interfaces/IxCAVO.sol';
import './interfaces/IEXCV.sol';
import './interfaces/IExcavoFactory.sol';
contract BaseCAVO is ICAVO, IExcavoERC20, ReentrancyGuard {
using SafeMath for uint;
string public constant override name = 'CAVO';
string public constant override symbol = 'CAVO';
uint8 public constant override decimals = 18;
uint public constant override MAX_SUPPLY = 10**6 * 10**18;
uint public constant override CREATOR_SUPPLY = 200 ether + 120 ether;
address public override xCAVOToken;
address public immutable override creator;
address public override EXCVToken;
uint public override totalSupply;
mapping(address => uint) public override balanceOf;
mapping(address => mapping(address => uint)) public override allowance;
mapping(address => uint) private lastBalanceOf;
mapping(address => uint) private lastBalanceBlockOf;
event Approval(address indexed owner, address indexed spender, uint value);
event Transfer(address indexed from, address indexed to, uint value);
constructor() public {
creator = msg.sender;
_mint(msg.sender, CREATOR_SUPPLY);
}
function initialize(address _factory) external override nonReentrant {
require(msg.sender == creator && IEXCV(EXCVToken).factory() == address(0), 'EXCV: FORBIDDEN');
IEXCV(EXCVToken).initialize(_factory);
IxCAVO(xCAVOToken).initialize(_factory, EXCVToken);
}
function virtualBalanceOf(address account) external view override returns (uint) {
uint balance = balanceOf[account];
if (block.number - lastBalanceBlockOf[account] > 0) {
return balance;
}
uint lastBalance = lastBalanceOf[account];
return balance < lastBalance ? balance : lastBalance;
}
function mint(address account, uint256 amount) external override nonReentrant {
require(msg.sender == xCAVOToken, 'Excavo: FORBIDDEN');
_mint(account, amount);
}
function _mint(address to, uint value) internal {
_saveLastBalance(to);
uint _value = Math.min(value, MAX_SUPPLY.sub(totalSupply));
totalSupply = totalSupply.add(_value);
balanceOf[to] = balanceOf[to].add(_value);
emit Transfer(address(0), to, _value);
}
function _approve(address owner, address spender, uint value) private {
allowance[owner][spender] = value;
emit Approval(owner, spender, value);
}
function _transfer(address from, address to, uint value) internal {
_saveLastBalance(from);
_saveLastBalance(to);
balanceOf[from] = balanceOf[from].sub(value);
balanceOf[to] = balanceOf[to].add(value);
emit Transfer(from, to, value);
}
function approve(address spender, uint value) external virtual override returns (bool) {
_approve(msg.sender, spender, value);
return true;
}
function transfer(address to, uint value) external virtual override returns (bool) {
_transfer(msg.sender, to, value);
return true;
}
function transferFrom(address from, address to, uint value) external virtual override returns (bool) {
if (allowance[from][msg.sender] != uint(-1)) {
allowance[from][msg.sender] = allowance[from][msg.sender].sub(value);
}
_transfer(from, to, value);
return true;
}
function _saveLastBalance(address account) private {
if (block.number - lastBalanceBlockOf[account] > 0) {
lastBalanceOf[account] = balanceOf[account];
lastBalanceBlockOf[account] = block.number;
}
}
}
文件 2 的 26:CAVO.sol
pragma solidity >=0.6.6;
import './PublicPresale.sol';
import './xCAVO.sol';
import './EXCV.sol';
import './TeamDistribution.sol';
import './PrivatePresale.sol';
contract CAVO is PublicPresale, PrivatePresale, TeamDistribution {
uint private constant PUBLIC_PRESALE_DURATION_IN_BLOCKS = 7 * 6500;
uint32 private constant PRESALE_VESTING_PERIOD_IN_BLOCKS = 7 * 6500;
uint private constant PRIVATE_PRESALE_DISTRIBUTED_CAVO_IN_WEI = 1460.769 ether;
address private constant PUBLIC_PRESALE_OWNER = 0xAb96C12881A2E9Ffa6706Ae68bCFA4EcD1A8bf21;
address[] private teamAddresses = [
0x381657fdE9bfE7558837757aC54249Ef748CACB7,
0x564569020c298D2487445CCa5C5ef3eD8cd408A3,
0xDfe2abc3d395a87a1476f5B707E77f5F23B1d88b,
0x8CF3329E378c6196F35f5cB7eea5040873f8AC8C,
0x8B9a2b2d9a41909D613C81F2f344E364cD62b63C,
0x57B93A6b8954938DE455BE95c9AA7843b99D7DEa,
0xf0393FB1e988317ca6E3fb986874D019dE712c7d,
0x698f4a1f42c3601579A3E40a9e4D90C2032C443a
];
uint[] private teamAmounts = [
40000 ether,
40000 ether,
15000 ether,
10000 ether,
50000 ether,
30000 ether,
10000 ether,
5000 ether
];
constructor()
public
PublicPresale(PUBLIC_PRESALE_OWNER, PRESALE_VESTING_PERIOD_IN_BLOCKS, PUBLIC_PRESALE_DURATION_IN_BLOCKS)
PrivatePresale(PRESALE_VESTING_PERIOD_IN_BLOCKS, PRIVATE_PRESALE_DISTRIBUTED_CAVO_IN_WEI)
TeamDistribution(PRESALE_VESTING_PERIOD_IN_BLOCKS, teamAddresses, teamAmounts)
{
address _xCAVO;
address _EXCV;
bytes memory xCAVOBytecode = type(xCAVO).creationCode;
bytes memory EXCVBytecode = type(EXCV).creationCode;
bytes32 xCAVOSalt = keccak256(abi.encodePacked("xCAVO"));
bytes32 EXCVSalt = keccak256(abi.encodePacked("EXCV"));
assembly {
_xCAVO := create2(0, add(xCAVOBytecode, 32), mload(xCAVOBytecode), xCAVOSalt)
_EXCV := create2(0, add(EXCVBytecode, 32), mload(EXCVBytecode), EXCVSalt)
}
xCAVOToken = _xCAVO;
EXCVToken = _EXCV;
_mint(address(this), totalTeamDistribution.add(totalPrivatePresaleDistribution));
}
}
文件 3 的 26:DistributionLibrary.sol
pragma solidity >=0.6.6;
import "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
import './TransferHelper.sol';
import './Math.sol';
import './SafeMath.sol';
import '../interfaces/ICAVO.sol';
library DistributionLibrary {
using SafeMath for uint;
struct Data {
mapping(address => uint) claimedAmountOf;
mapping(address => uint) maxAmountOf;
uint unlockBlock;
uint32 blocksInPeriod;
}
function availableAmountOf(Data storage self, address account) internal view returns (uint) {
if (self.unlockBlock == 0 || block.number <= self.unlockBlock || self.maxAmountOf[account] == 0) {
return 0;
}
uint unlockedAmountPerPeriod = self.maxAmountOf[account].mul(10).div(100);
uint unlockPeriodInBlocks = self.maxAmountOf[account].div(unlockedAmountPerPeriod).mul(self.blocksInPeriod);
return Math.min(self.unlockBlock.add(unlockPeriodInBlocks), block.number)
.sub(self.unlockBlock)
.div(self.blocksInPeriod)
.mul(unlockedAmountPerPeriod)
.sub(self.claimedAmountOf[account]);
}
function start(Data storage self) internal {
require(self.unlockBlock == 0 && msg.sender == ICAVO(address(this)).creator(), 'DistributionLibrary: FORBIDDEN');
self.unlockBlock = block.number;
}
function claim(Data storage self, uint amount) internal {
require(amount <= availableAmountOf(self, msg.sender), 'DistributionLibrary: OVERDRAFT');
self.claimedAmountOf[msg.sender] = self.claimedAmountOf[msg.sender].add(amount);
TransferHelper.safeTransfer(address(this), msg.sender, amount);
}
}
文件 4 的 26:EXCV.sol
pragma solidity >=0.6.6;
import './interfaces/IExcavoERC20.sol';
import './interfaces/ICAVO.sol';
import './libraries/Math.sol';
import "./xEXCV.sol";
contract EXCV is IEXCV, IExcavoERC20, ReentrancyGuard {
using SafeMath for uint;
string public constant override name = 'EXCV';
string public constant override symbol = 'EXCV';
uint8 public constant override decimals = 18;
uint public constant override MAX_SUPPLY = 10**9 * 10**18;
uint public constant override CREATOR_SUPPLY = 600 * 5 * 10**18;
address public override immutable xEXCVToken;
address public override factory;
uint public override totalSupply;
mapping(address => uint) public override balanceOf;
mapping(address => mapping(address => uint)) public override allowance;
address private immutable creator;
event Approval(address indexed owner, address indexed spender, uint value);
event Transfer(address indexed from, address indexed to, uint value);
constructor() public {
creator = msg.sender;
address _xEXCV;
bytes memory bytecode = type(xEXCV).creationCode;
bytes32 salt = keccak256(abi.encodePacked("xEXCV"));
assembly {
_xEXCV := create2(0, add(bytecode, 32), mload(bytecode), salt)
}
xEXCVToken = _xEXCV;
}
function initialize(address _factory) external override nonReentrant {
require(factory == address(0) && msg.sender == creator, "EXCV: FORBIDDEN");
factory = _factory;
IxEXCV(xEXCVToken).initialize(_factory);
_mint(ICAVO(creator).creator(), CREATOR_SUPPLY);
}
function _mint(address to, uint value) internal {
uint _value = Math.min(value, MAX_SUPPLY.sub(totalSupply));
totalSupply = totalSupply.add(_value);
balanceOf[to] = balanceOf[to].add(_value);
emit Transfer(address(0), to, _value);
}
function _approve(address owner, address spender, uint value) private {
allowance[owner][spender] = value;
emit Approval(owner, spender, value);
}
function _transfer(address from, address to, uint value) private {
balanceOf[from] = balanceOf[from].sub(value);
balanceOf[to] = balanceOf[to].add(value);
emit Transfer(from, to, value);
}
function mint(address to, uint value) external override nonReentrant {
require(msg.sender == xEXCVToken, "EXCV: FORBIDDEN");
_mint(to, value);
}
function approve(address spender, uint value) external virtual override nonReentrant returns (bool) {
_approve(msg.sender, spender, value);
return true;
}
function transfer(address to, uint value) external virtual override returns (bool) {
_transfer(msg.sender, to, value);
return true;
}
function transferFrom(address from, address to, uint value) external virtual override nonReentrant returns (bool) {
if (allowance[from][msg.sender] != uint(-1)) {
allowance[from][msg.sender] = allowance[from][msg.sender].sub(value);
}
_transfer(from, to, value);
return true;
}
}
文件 5 的 26:ExcavoLibrary.sol
pragma solidity >=0.6.6;
import '../interfaces/IExcavoPair.sol';
import "./SafeMath.sol";
import './Math.sol';
library ExcavoLibrary {
using SafeMath for uint;
function sortTokens(address tokenA, address tokenB) internal pure returns (address token0, address token1) {
require(tokenA != tokenB, 'ExcavoLibrary: IDENTICAL_ADDRESSES');
(token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
require(token0 != address(0), 'ExcavoLibrary: ZERO_ADDRESS');
}
function pairFor(address factory, address tokenA, address tokenB) internal pure returns (address pair) {
(address token0, address token1) = sortTokens(tokenA, tokenB);
pair = address(uint(keccak256(abi.encodePacked(
hex'ff',
factory,
keccak256(abi.encodePacked(token0, token1)),
hex'3b4596e5d4f0ba0faf3c029e2a152a4931e4da86804417810c5960569e839f1e'
))));
}
function getReserves(address factory, address tokenA, address tokenB) internal view returns (uint reserveA, uint reserveB) {
(address token0,) = sortTokens(tokenA, tokenB);
(uint reserve0, uint reserve1,) = IExcavoPair(pairFor(factory, tokenA, tokenB)).getReserves();
(reserveA, reserveB) = tokenA == token0 ? (reserve0, reserve1) : (reserve1, reserve0);
}
function quote(uint amountA, uint reserveA, uint reserveB) internal pure returns (uint amountB) {
require(amountA > 0, 'ExcavoLibrary: INSUFFICIENT_AMOUNT');
require(reserveA > 0 && reserveB > 0, 'ExcavoLibrary: INSUFFICIENT_LIQUIDITY');
amountB = amountA.mul(reserveB) / reserveA;
}
function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut, uint discount) internal pure returns (uint amountOut) {
require(amountIn > 0, 'ExcavoLibrary: INSUFFICIENT_INPUT_AMOUNT');
require(reserveIn > 0 && reserveOut > 0, 'ExcavoLibrary: INSUFFICIENT_LIQUIDITY');
uint amountInWithFee = amountIn.mul(10000 - 4 * discount);
uint numerator = amountInWithFee.mul(reserveOut);
uint denominator = reserveIn.mul(10000).add(amountInWithFee);
amountOut = numerator / denominator;
}
function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut, uint discount) internal pure returns (uint amountIn) {
require(amountOut > 0, 'ExcavoLibrary: INSUFFICIENT_OUTPUT_AMOUNT');
require(reserveIn > 0 && reserveOut > 0, 'ExcavoLibrary: INSUFFICIENT_LIQUIDITY');
uint numerator = reserveIn.mul(amountOut).mul(10000);
uint denominator = reserveOut.sub(amountOut).mul(10000 - 4 * discount);
amountIn = (numerator / denominator).add(1);
}
function getAmountsOut(address factory, uint amountIn, address[] memory path, uint discount) internal view returns (uint[] memory amounts) {
require(path.length >= 2, 'ExcavoLibrary: INVALID_PATH');
amounts = new uint[](path.length);
amounts[0] = amountIn;
for (uint i; i < path.length - 1; i++) {
(uint reserveIn, uint reserveOut) = getReserves(factory, path[i], path[i + 1]);
amounts[i + 1] = getAmountOut(amounts[i], reserveIn, reserveOut, discount);
}
}
function getAmountsIn(address factory, uint amountOut, address[] memory path, uint discount) internal view returns (uint[] memory amounts) {
require(path.length >= 2, 'ExcavoLibrary: INVALID_PATH');
amounts = new uint[](path.length);
amounts[amounts.length - 1] = amountOut;
for (uint i = path.length - 1; i > 0; i--) {
(uint reserveIn, uint reserveOut) = getReserves(factory, path[i - 1], path[i]);
amounts[i - 1] = getAmountIn(amounts[i], reserveIn, reserveOut, discount);
}
}
}
文件 6 的 26:ICAVO.sol
pragma solidity >=0.6.6;
interface ICAVO {
function MAX_SUPPLY() external pure returns(uint);
function CREATOR_SUPPLY() external pure returns(uint);
function creator() external returns (address);
function xCAVOToken() external view returns (address);
function EXCVToken() external view returns (address);
function mint(address to, uint value) external;
function initialize(address _factory) external;
function virtualBalanceOf(address account) external view returns (uint);
}
文件 7 的 26:IERC20.sol
pragma solidity >=0.6.6;
interface IERC20 {
event Approval(address indexed owner, address indexed spender, uint value);
event Transfer(address indexed from, address indexed to, uint value);
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function decimals() external view returns (uint8);
function totalSupply() external view returns (uint);
function balanceOf(address owner) external view returns (uint);
function allowance(address owner, address spender) external view returns (uint);
function approve(address spender, uint value) external returns (bool);
function transfer(address to, uint value) external returns (bool);
function transferFrom(address from, address to, uint value) external returns (bool);
}
文件 8 的 26:IEXCV.sol
pragma solidity >=0.6.6;
interface IEXCV {
function MAX_SUPPLY() external pure returns(uint);
function CREATOR_SUPPLY() external pure returns(uint);
function xEXCVToken() external view returns (address);
function factory() external view returns (address);
function mint(address to, uint value) external;
function initialize(address _factory) external;
}
文件 9 的 26:IExcavoERC20.sol
pragma solidity >=0.6.6;
interface IExcavoERC20 {
event Approval(address indexed owner, address indexed spender, uint value);
event Transfer(address indexed from, address indexed to, uint value);
function name() external pure returns (string memory);
function symbol() external pure returns (string memory);
function decimals() external pure returns (uint8);
function totalSupply() external view returns (uint);
function balanceOf(address owner) external view returns (uint);
function allowance(address owner, address spender) external view returns (uint);
function approve(address spender, uint value) external returns (bool);
function transfer(address to, uint value) external returns (bool);
function transferFrom(address from, address to, uint value) external returns (bool);
}
文件 10 的 26:IExcavoFactory.sol
pragma solidity >=0.6.6;
interface IExcavoFactory {
event PairCreated(address indexed token0, address indexed token1, address pair, uint);
function EXCVToken() external view returns (address);
function CAVOToken() external view returns (address);
function WETHToken() external view returns (address);
function feeToSetter() external view returns (address);
function router() 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 initialize(address) external;
}
文件 11 的 26:IExcavoPair.sol
pragma solidity >=0.6.6;
import './IExcavoERC20.sol';
interface IExcavoPair is IExcavoERC20 {
event Mint(address indexed sender, uint amount0, uint amount1);
event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
event Swap(
address indexed sender,
uint amount0In,
uint amount1In,
uint amount0Out,
uint amount1Out,
address indexed to
);
event Sync(uint112 reserve0, uint112 reserve1);
function MINIMUM_LIQUIDITY() external pure returns (uint);
function factory() external view returns (address);
function token0() external view returns (address);
function token1() external view returns (address);
function router() external view returns (address);
function accumulatedLiquidityGrowth() external view returns (uint);
function accumulatedUnclaimedLiquidity() external view returns (uint);
function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
function price0CumulativeLast() external view returns (uint);
function price1CumulativeLast() external view returns (uint);
function mint(address to) external returns (uint liquidity);
function burn(address to) external returns (uint amount0, uint amount1);
function swap(uint amount0Out, uint amount1Out, address to, bytes calldata _data, uint discount) external;
function skim(address to) external;
function sync() external;
function initialize(address, address, address) external;
function setxEXCV(address) external;
function unclaimedLiquidityOf(address) external view returns (uint);
function claimLiquidity(address account, uint256 amount) external returns (uint claimAmount);
function claimAllLiquidity(address account) external returns (uint claimAmount);
function compoundLiquidity() external;
function setCAVO(address _CAVO, address _xCAVO) external;
}
文件 12 的 26:IPrivatePresale.sol
pragma solidity >=0.6.6;
interface IPrivatePresale {
function totalPrivatePresaleDistribution() external view returns (uint);
function privatePresaleDistributed() external view returns (uint);
function availablePrivatePresaleAmountOf(address account) external view returns (uint);
function distribute(address[] calldata _accounts, uint[] calldata _amounts) external;
function editDistributed(address _account, uint _amount) external;
function privatePresaleClaim(uint amount) external;
function startPrivatePresaleDistribution() external;
}
文件 13 的 26:IPublicPresale.sol
pragma solidity >=0.6.6;
interface IPublicPresale {
function presaleOwner() external view returns (address);
function availablePublicPresaleAmountOf(address account) external view returns (uint);
function publicPresaleClaim(uint amount) external;
function startPublicPresaleDistribution() external;
function startPublicPresale() external;
}
文件 14 的 26:ITeamDistribution.sol
pragma solidity >=0.6.6;
interface ITeamDistribution {
function totalTeamDistribution() external view returns (uint);
function availableTeamMemberAmountOf(address account) external view returns (uint);
function teamMemberClaim(uint amount) external;
function startTeamDistribution() external;
}
文件 15 的 26:IxCAVO.sol
pragma solidity >=0.6.6;
interface IxCAVO {
function excvEthPair() external view returns (address);
function cavoEthPair() external view returns (address);
function getEXCV() external view returns (address);
function getCAVO() external view returns (address);
function redeem(address recipient) external;
function initialize(address _factory, address _EXCV) external;
function registerPairCreation() external;
function mint(uint price) external;
function accumulatedMintableCAVOAmount() external view returns (uint);
}
文件 16 的 26:IxEXCV.sol
pragma solidity >=0.6.6;
interface IxEXCV {
function liquidityPairs() external view returns (address[] memory);
function factory() external view returns (address);
function excvEthPair() external view returns (address);
function getEXCV() external view returns (address);
function initialize(address _factory) external;
function redeem(address recipient) external;
function redeemPair(address recipient, address pair, uint claimedLiquidityAmount) external;
function addPair(address tokenA, address tokenB) external;
function pairBalanceOf(address owner, address pair) external view returns (uint);
}
文件 17 的 26:Math.sol
pragma solidity >=0.6.6;
library Math {
function min(uint x, uint y) internal pure returns (uint z) {
z = x < y ? x : y;
}
function sqrt(uint y) internal pure returns (uint z) {
if (y > 3) {
z = y;
uint x = y / 2 + 1;
while (x < z) {
z = x;
x = (y / x + x) / 2;
}
} else if (y != 0) {
z = 1;
}
}
}
文件 18 的 26:PrivatePresale.sol
pragma solidity >=0.6.6;
import "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
import './libraries/TransferHelper.sol';
import './libraries/SafeMath.sol';
import './libraries/DistributionLibrary.sol';
import './interfaces/ICAVO.sol';
import './interfaces/IExcavoERC20.sol';
import './interfaces/IxCAVO.sol';
import './interfaces/IPrivatePresale.sol';
abstract contract PrivatePresale is IPrivatePresale, ICAVO, IExcavoERC20, ReentrancyGuard {
using SafeMath for uint;
using DistributionLibrary for DistributionLibrary.Data;
event PrivateDistributionInitialized(address indexed recipient, uint amount);
event PrivateDistributed(address indexed recipient, uint amount);
DistributionLibrary.Data private distribution;
uint public override totalPrivatePresaleDistribution;
uint public override privatePresaleDistributed;
constructor(uint32 _blocksInPeriod, uint _totalPrivatePresaleDistribution) public {
distribution.blocksInPeriod = _blocksInPeriod;
totalPrivatePresaleDistribution = _totalPrivatePresaleDistribution;
}
function distribute(address[] calldata _accounts, uint[] calldata _amounts) external override nonReentrant {
require(msg.sender == ICAVO(address(this)).creator(), 'PrivatePresale: FORBIDDEN');
require(_accounts.length == _amounts.length, 'PrivatePresale: INVALID_LENGTH');
uint _distributed = privatePresaleDistributed;
for (uint i = 0; i < _accounts.length; ++i) {
uint max = distribution.maxAmountOf[_accounts[i]].add(_amounts[i]);
distribution.maxAmountOf[_accounts[i]] = max;
_distributed = _distributed.add(_amounts[i]);
emit PrivateDistributionInitialized(_accounts[i], max);
}
require(_distributed <= totalPrivatePresaleDistribution, 'PrivatePresale: LIMIT_EXCEEDED');
privatePresaleDistributed = _distributed;
}
function editDistributed(address _account, uint _amount) external override nonReentrant {
require(distribution.unlockBlock == 0 && msg.sender == ICAVO(address(this)).creator(), 'PrivatePresale: FORBIDDEN');
uint _distributed = privatePresaleDistributed.sub(distribution.maxAmountOf[_account]).add(_amount);
distribution.maxAmountOf[_account] = _amount;
require(_distributed <= totalPrivatePresaleDistribution, 'PrivatePresale: LIMIT_EXCEEDED');
privatePresaleDistributed = _distributed;
emit PrivateDistributionInitialized(_account, _amount);
}
function availablePrivatePresaleAmountOf(address account) external view override returns (uint) {
return distribution.availableAmountOf(account);
}
function privatePresaleClaim(uint amount) external override nonReentrant {
distribution.claim(amount);
emit PrivateDistributed(msg.sender, amount);
}
function startPrivatePresaleDistribution() external override nonReentrant {
require(privatePresaleDistributed == totalPrivatePresaleDistribution, 'PrivatePresale: DISTRIBUTION_UNFINISHED');
distribution.start();
}
}
文件 19 的 26:PublicPresale.sol
pragma solidity >=0.6.6;
import '@openzeppelin/contracts/utils/ReentrancyGuard.sol';
import './libraries/TransferHelper.sol';
import './libraries/Math.sol';
import './libraries/SafeMath.sol';
import './libraries/DistributionLibrary.sol';
import './interfaces/ICAVO.sol';
import './interfaces/IExcavoERC20.sol';
import './interfaces/IxCAVO.sol';
import './interfaces/IPublicPresale.sol';
import './BaseCAVO.sol';
contract PublicPresale is BaseCAVO, IPublicPresale {
using SafeMath for uint;
using DistributionLibrary for DistributionLibrary.Data;
event PublicPresalePurchase(address indexed recipient, uint amount);
event PublicDistributed(address indexed recipient, uint amount);
address public immutable override presaleOwner;
uint private presaleDurationInBlocks;
uint private presaleStartBlock;
DistributionLibrary.Data private distribution;
constructor(address _presaleOwner, uint32 _vestingBlocksInPeriod, uint _presaleDurationInBlocks) public {
presaleOwner = _presaleOwner;
distribution.blocksInPeriod = _vestingBlocksInPeriod;
presaleDurationInBlocks = _presaleDurationInBlocks;
}
function availablePublicPresaleAmountOf(address account) external view override returns (uint) {
return distribution.availableAmountOf(account);
}
function publicPresaleClaim(uint amount) external override nonReentrant {
distribution.claim(amount);
emit PublicDistributed(msg.sender, amount);
}
function startPublicPresaleDistribution() external override nonReentrant {
require(presaleStartBlock != 0 && block.number >= presaleStartBlock.add(presaleDurationInBlocks), 'PublicPresale: INVALID_PARAMS');
distribution.start();
}
function startPublicPresale() external override nonReentrant {
require(presaleStartBlock == 0 && msg.sender == creator, 'PublicPresale: FORBIDDEN');
presaleStartBlock = block.number;
}
receive() external payable nonReentrant {
require(block.number >= presaleStartBlock && block.number < presaleStartBlock.add(presaleDurationInBlocks), 'PublicPresale: INACTIVE');
uint mintedCAVO = msg.value.mul(100).div(50);
payable(presaleOwner).transfer(msg.value);
_mint(address(this), mintedCAVO);
distribution.maxAmountOf[msg.sender] = distribution.maxAmountOf[msg.sender].add(mintedCAVO);
emit PublicPresalePurchase(msg.sender, mintedCAVO);
}
}
文件 20 的 26:ReentrancyGuard.sol
pragma solidity ^0.6.0;
contract ReentrancyGuard {
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor () internal {
_status = _NOT_ENTERED;
}
modifier nonReentrant() {
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
_status = _ENTERED;
_;
_status = _NOT_ENTERED;
}
}
文件 21 的 26:SafeMath.sol
pragma solidity >=0.6.6;
library SafeMath {
function add(uint x, uint y) internal pure returns (uint z) {
require((z = x + y) >= x, 'ds-math-add-overflow');
}
function sub(uint x, uint y) internal pure returns (uint z) {
require((z = x - y) <= x, 'ds-math-sub-underflow');
}
function mul(uint x, uint y) internal pure returns (uint z) {
require(y == 0 || (z = x * y) / y == x, 'ds-math-mul-overflow');
}
function div(uint x, uint y) internal pure returns (uint z) {
require(y > 0, "SafeMath: division by zero");
z = x / y;
}
}
文件 22 的 26:TeamDistribution.sol
pragma solidity >=0.6.6;
import "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
import './libraries/TransferHelper.sol';
import './libraries/Math.sol';
import './libraries/SafeMath.sol';
import './libraries/DistributionLibrary.sol';
import './interfaces/ICAVO.sol';
import './interfaces/IExcavoERC20.sol';
import './interfaces/IxCAVO.sol';
import './interfaces/ITeamDistribution.sol';
abstract contract TeamDistribution is ITeamDistribution, ICAVO, IExcavoERC20, ReentrancyGuard {
using SafeMath for uint;
using DistributionLibrary for DistributionLibrary.Data;
event TeamDistributed(address indexed recipient, uint amount);
uint public override totalTeamDistribution;
DistributionLibrary.Data private distribution;
constructor(uint32 _blocksInPeriod, address[] memory _team, uint[] memory _amounts) public {
require(_team.length == _amounts.length, 'TeamDistribution: INVALID_PARAMS');
uint total;
for (uint i = 0; i < _team.length; ++i) {
distribution.maxAmountOf[_team[i]] = _amounts[i];
total = total.add(_amounts[i]);
}
totalTeamDistribution = total;
distribution.blocksInPeriod = _blocksInPeriod;
}
function availableTeamMemberAmountOf(address account) external view override returns (uint) {
return distribution.availableAmountOf(account);
}
function teamMemberClaim(uint amount) external override nonReentrant {
distribution.claim(amount);
emit TeamDistributed(msg.sender, amount);
}
function startTeamDistribution() external override nonReentrant {
distribution.start();
}
}
文件 23 的 26:TransferHelper.sol
pragma solidity >=0.6.6;
library TransferHelper {
function safeApprove(address token, address to, uint value) internal {
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));
require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: APPROVE_FAILED');
}
function safeTransfer(address token, address to, uint value) internal {
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FAILED');
}
function safeTransferFrom(address token, address from, address to, uint value) internal {
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));
require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FROM_FAILED');
}
function safeTransferETH(address to, uint value) internal {
(bool success,) = to.call{value:value}(new bytes(0));
require(success, 'TransferHelper: ETH_TRANSFER_FAILED');
}
}
文件 24 的 26:UQ112x112.sol
pragma solidity >=0.6.6;
library UQ112x112 {
uint224 constant Q112 = 2**112;
function encode(uint112 y) internal pure returns (uint224 z) {
z = uint224(y) * Q112;
}
function uqdiv(uint224 x, uint112 y) internal pure returns (uint224 z) {
z = x / uint224(y);
}
}
文件 25 的 26:xCAVO.sol
pragma solidity >=0.6.6;
import './interfaces/IxCAVO.sol';
import './interfaces/ICAVO.sol';
import "./interfaces/IERC20.sol";
import "./interfaces/IEXCV.sol";
import "./interfaces/IExcavoPair.sol";
import "./interfaces/IExcavoFactory.sol";
import './libraries/SafeMath.sol';
import "./libraries/ExcavoLibrary.sol";
import './libraries/UQ112x112.sol';
import "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
contract xCAVO is IxCAVO, IERC20, ReentrancyGuard {
using SafeMath for uint;
event Redeem(address indexed sender, address indexed recipient, uint amount);
string public constant override name = 'xCAVO';
string public constant override symbol = 'xCAVO';
uint8 public constant override decimals = 18;
uint private constant Q112 = 2**112;
uint private constant WEI_IN_CAVO = 10**18;
uint private constant VESTING_PERIOD = 7020000;
address public immutable override getCAVO;
address public override excvEthPair;
address public override cavoEthPair;
address public override getEXCV;
mapping(address => uint) private lastAccumulatedMintableCAVOAmount;
mapping(address => uint) private lastAccumulatedUnclaimedLiquidity;
uint public override accumulatedMintableCAVOAmount;
uint private firstBlockNumber;
uint private lastBlockNumber;
uint internal expectedPriceInUQ;
event Approval(address indexed owner, address indexed spender, uint value);
event Transfer(address indexed from, address indexed to, uint value);
constructor() public {
getCAVO = msg.sender;
}
function initialize(address _factory, address _EXCV) external override nonReentrant {
require(getEXCV == address(0) && excvEthPair == address(0) && cavoEthPair == address(0) && msg.sender == getCAVO, "xCAVO: FORBIDDEN");
getEXCV = _EXCV;
address WETH = IExcavoFactory(_factory).WETHToken();
excvEthPair = ExcavoLibrary.pairFor(_factory, getEXCV, WETH);
cavoEthPair = ExcavoLibrary.pairFor(_factory, getCAVO, WETH);
}
function registerPairCreation() external override nonReentrant {
require(firstBlockNumber == 0 && msg.sender == cavoEthPair, "xCAVO: FORBIDDEN");
firstBlockNumber = block.number;
lastBlockNumber = block.number;
}
function totalSupply() external view override returns (uint) {
return IERC20(getCAVO).totalSupply();
}
function balanceOf(address owner) external view override returns (uint) {
uint totalUnclaimedLiquidity = IExcavoPair(excvEthPair).accumulatedLiquidityGrowth() - lastAccumulatedUnclaimedLiquidity[owner];
if (totalUnclaimedLiquidity == 0) {
return 0;
}
uint totalMintableCAVO = accumulatedMintableCAVOAmount - lastAccumulatedMintableCAVOAmount[owner];
uint liquidity = IExcavoPair(excvEthPair).unclaimedLiquidityOf(owner);
return liquidity.mul(totalMintableCAVO) / totalUnclaimedLiquidity;
}
function redeem(address recipient) external override nonReentrant {
uint liquidity = IExcavoPair(excvEthPair).claimAllLiquidity(msg.sender);
uint accumulatedUnclaimedLiquidity = IExcavoPair(excvEthPair).accumulatedUnclaimedLiquidity();
uint totalUnclaimedLiquidity = accumulatedUnclaimedLiquidity - lastAccumulatedUnclaimedLiquidity[msg.sender];
if (totalUnclaimedLiquidity == 0) {
revert('xCAVO: INSUFFICIENT_MINTED_AMOUNT');
}
uint totalMintableCAVO = accumulatedMintableCAVOAmount - lastAccumulatedMintableCAVOAmount[msg.sender];
uint mintedAmount = liquidity.mul(totalMintableCAVO) / totalUnclaimedLiquidity;
require(mintedAmount > 0, 'xCAVO: INSUFFICIENT_MINTED_AMOUNT');
lastAccumulatedUnclaimedLiquidity[msg.sender] = accumulatedUnclaimedLiquidity;
lastAccumulatedMintableCAVOAmount[msg.sender] = accumulatedMintableCAVOAmount;
ICAVO(getCAVO).mint(recipient, mintedAmount);
emit Redeem(msg.sender, recipient, mintedAmount);
}
function mint(uint priceInUQ) external override nonReentrant {
require(msg.sender == cavoEthPair, "xCAVO: FORBIDDEN");
if (block.number - firstBlockNumber >= VESTING_PERIOD || block.number == lastBlockNumber) {
return;
}
uint priceChangeInUQ = Q112.mul(block.number.sub(lastBlockNumber)).mul(3).div(6500000);
if (expectedPriceInUQ + priceChangeInUQ < expectedPriceInUQ) {
return;
}
expectedPriceInUQ += priceChangeInUQ;
if (priceInUQ >= expectedPriceInUQ) {
uint mintedAmount = block.number.sub(lastBlockNumber).mul(1000000)
.mul(block.number.add(lastBlockNumber).sub(firstBlockNumber.mul(2)))
.mul(WEI_IN_CAVO)
.div(49280400000000);
if (mintedAmount > 0) {
accumulatedMintableCAVOAmount = accumulatedMintableCAVOAmount + mintedAmount;
}
}
lastBlockNumber = block.number;
}
function allowance(address , address ) external view override returns (uint) {
revert("xCAVO: FORBIDDEN");
}
function approve(address , uint ) external override returns (bool) {
revert("xCAVO: FORBIDDEN");
}
function transfer(address , uint ) external override returns (bool) {
revert("xCAVO: FORBIDDEN");
}
function transferFrom(address , address , uint ) external override returns (bool) {
revert("xCAVO: FORBIDDEN");
}
}
文件 26 的 26:xEXCV.sol
pragma solidity >=0.6.6;
import "./interfaces/IxEXCV.sol";
import "./interfaces/IERC20.sol";
import "./interfaces/IEXCV.sol";
import "./interfaces/IExcavoFactory.sol";
import "./interfaces/IExcavoPair.sol";
import "./libraries/ExcavoLibrary.sol";
import './libraries/Math.sol';
import "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
contract xEXCV is IxEXCV, IERC20, ReentrancyGuard {
using SafeMath for uint;
event Redeem(address indexed sender, address indexed recipient, uint amount);
uint constant MIN_LIQUIDITY_PAIR_COUNT = 3;
address public immutable override getEXCV;
address public override factory;
address public override excvEthPair;
address[] private _liquidityPairs;
string public constant override symbol = "xEXCV";
string public constant override name = "xEXCV";
uint8 public constant override decimals = 18;
constructor() public {
getEXCV = msg.sender;
}
function initialize(address _factory) external override nonReentrant {
require(msg.sender == getEXCV && factory == address(0) && excvEthPair == address(0), "xEXCV: FORBIDDEN");
factory = _factory;
address WETH = IExcavoFactory(_factory).WETHToken();
excvEthPair = ExcavoLibrary.pairFor(_factory, getEXCV, WETH);
}
function addPair(address tokenA, address tokenB) external override nonReentrant {
require(ExcavoLibrary.pairFor(factory, tokenA, tokenB) == msg.sender, "xEXCV: FORBIDDEN");
if (!_pairExists(msg.sender)) {
_liquidityPairs.push(msg.sender);
}
}
function redeem(address recipient) external override nonReentrant {
address[] memory pairs = _liquidityPairs;
uint _circulatingSupply = circulatingSupply();
uint excvQuantity;
for (uint i = 0; i < pairs.length; i++) {
uint lastK = IExcavoPair(pairs[i]).totalSupply();
uint claimedLiquidity = IExcavoPair(pairs[i]).claimAllLiquidity(msg.sender);
excvQuantity = excvQuantity.add(claimedLiquidity.mul(_circulatingSupply).div(lastK));
}
IEXCV(getEXCV).mint(recipient, excvQuantity);
emit Redeem(msg.sender, recipient, excvQuantity);
}
function redeemPair(address recipient, address pair, uint claimedLiquidityAmount) external override nonReentrant {
require(_pairExists(pair), "xEXCV: unknown pair");
uint _circulatingSupply = circulatingSupply();
uint lastK = IExcavoPair(pair).totalSupply();
IExcavoPair(pair).claimLiquidity(msg.sender, claimedLiquidityAmount);
uint excvQuantity = claimedLiquidityAmount.mul(_circulatingSupply).div(lastK);
IEXCV(getEXCV).mint(recipient, excvQuantity);
emit Redeem(msg.sender, recipient, excvQuantity);
}
function totalSupply() external view override returns (uint) {
return IERC20(getEXCV).totalSupply();
}
function balanceOf(address owner) external view override returns (uint) {
address[] memory pairs = _liquidityPairs;
uint _circulatingSupply = circulatingSupply();
uint excvQuantity;
for (uint i = 0; i < pairs.length; i++) {
uint accumulatedLiquidity = IExcavoPair(pairs[i]).unclaimedLiquidityOf(owner);
uint lastK = IExcavoPair(pairs[i]).totalSupply();
excvQuantity = excvQuantity.add(accumulatedLiquidity.mul(_circulatingSupply).div(lastK));
}
return excvQuantity;
}
function liquidityPairs() external view override returns (address[] memory) {
return _liquidityPairs;
}
function pairBalanceOf(address owner, address pair) external view override returns (uint) {
if (!_pairExists(pair)) {
return 0;
}
uint lastK = IExcavoPair(pair).totalSupply();
if (lastK == 0) {
return 0;
}
uint _circulatingSupply = circulatingSupply();
uint accumulatedLiquidity = IExcavoPair(pair).unclaimedLiquidityOf(owner);
return accumulatedLiquidity.mul(_circulatingSupply) / lastK;
}
function circulatingSupply() private view returns (uint) {
(uint reserve0, uint reserve1, ) = IExcavoPair(excvEthPair).getReserves();
return IExcavoPair(excvEthPair).token0() == getEXCV ? reserve0 : reserve1;
}
function _pairExists(address pair) private view returns (bool) {
address[] memory pairs = _liquidityPairs;
for (uint i = 0; i < pairs.length; ++i) {
if (pairs[i] == pair) {
return true;
}
}
return false;
}
function allowance(address , address ) external view override returns (uint) {
revert("xEXCV: FORBIDDEN");
}
function approve(address , uint ) external override returns (bool) {
revert("xEXCV: FORBIDDEN");
}
function transfer(address , uint ) external override returns (bool) {
revert("xEXCV: FORBIDDEN");
}
function transferFrom(address , address , uint ) external override returns (bool) {
revert("xEXCV: FORBIDDEN");
}
}
{
"compilationTarget": {
"contracts/CAVO.sol": "CAVO"
},
"evmVersion": "istanbul",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs",
"useLiteralContent": true
},
"optimizer": {
"enabled": true,
"runs": 999999
},
"remappings": []
}
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PrivateDistributed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PrivateDistributionInitialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PublicDistributed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PublicPresalePurchase","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TeamDistributed","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":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"CREATOR_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EXCVToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"availablePrivatePresaleAmountOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"availablePublicPresaleAmountOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"availableTeamMemberAmountOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"creator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_accounts","type":"address[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"distribute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"editDistributed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_factory","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"privatePresaleClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"privatePresaleDistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"publicPresaleClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startPrivatePresaleDistribution","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startPublicPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startPublicPresaleDistribution","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTeamDistribution","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"teamMemberClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalPrivatePresaleDistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalTeamDistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"virtualBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"xCAVOToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]