文件 1 的 12:Address.sol
pragma solidity 0.6.8;
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"
);
return _functionCallWithValue(target, data, value, errorMessage);
}
function _functionCallWithValue(
address target,
bytes memory data,
uint256 weiValue,
string memory errorMessage
) private returns (bytes memory) {
require(isContract(target), "Address: call to non-contract");
(bool success, bytes memory returndata) = target.call{value: weiValue}(
data
);
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 的 12:Context.sol
pragma solidity 0.6.8;
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;
}
}
文件 3 的 12:EnumerableSet.sol
pragma solidity 0.6.8;
library EnumerableSet {
struct Set {
bytes32[] _values;
mapping(bytes32 => uint256) _indexes;
}
function _add(Set storage set, bytes32 value) private returns (bool) {
if (!_contains(set, value)) {
set._values.push(value);
set._indexes[value] = set._values.length;
return true;
} else {
return false;
}
}
function _remove(Set storage set, bytes32 value) private returns (bool) {
uint256 valueIndex = set._indexes[value];
if (valueIndex != 0) {
uint256 toDeleteIndex = valueIndex - 1;
uint256 lastIndex = set._values.length - 1;
bytes32 lastvalue = set._values[lastIndex];
set._values[toDeleteIndex] = lastvalue;
set._indexes[lastvalue] = toDeleteIndex + 1;
set._values.pop();
delete set._indexes[value];
return true;
} else {
return false;
}
}
function _contains(Set storage set, bytes32 value)
private
view
returns (bool)
{
return set._indexes[value] != 0;
}
function _length(Set storage set) private view returns (uint256) {
return set._values.length;
}
function _at(Set storage set, uint256 index)
private
view
returns (bytes32)
{
require(
set._values.length > index,
"EnumerableSet: index out of bounds"
);
return set._values[index];
}
struct AddressSet {
Set _inner;
}
function add(AddressSet storage set, address value)
internal
returns (bool)
{
return _add(set._inner, bytes32(uint256(value)));
}
function remove(AddressSet storage set, address value)
internal
returns (bool)
{
return _remove(set._inner, bytes32(uint256(value)));
}
function contains(AddressSet storage set, address value)
internal
view
returns (bool)
{
return _contains(set._inner, bytes32(uint256(value)));
}
function length(AddressSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
function at(AddressSet storage set, uint256 index)
internal
view
returns (address)
{
return address(uint256(_at(set._inner, index)));
}
struct UintSet {
Set _inner;
}
function add(UintSet storage set, uint256 value) internal returns (bool) {
return _add(set._inner, bytes32(value));
}
function remove(UintSet storage set, uint256 value)
internal
returns (bool)
{
return _remove(set._inner, bytes32(value));
}
function contains(UintSet storage set, uint256 value)
internal
view
returns (bool)
{
return _contains(set._inner, bytes32(value));
}
function length(UintSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
function at(UintSet storage set, uint256 index)
internal
view
returns (uint256)
{
return uint256(_at(set._inner, index));
}
}
文件 4 的 12:IERC165.sol
pragma solidity ^0.6.0;
interface IERC165 {
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
文件 5 的 12:IERC20.sol
pragma solidity 0.6.8;
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 的 12:IERC721.sol
pragma solidity ^0.6.2;
import "./IERC165.sol";
interface IERC721 is IERC165 {
event Transfer(
address indexed from,
address indexed to,
uint256 indexed tokenId
);
event Approval(
address indexed owner,
address indexed approved,
uint256 indexed tokenId
);
event ApprovalForAll(
address indexed owner,
address indexed operator,
bool approved
);
function balanceOf(address owner) external view returns (uint256 balance);
function ownerOf(uint256 tokenId) external view returns (address owner);
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) external;
function transferFrom(
address from,
address to,
uint256 tokenId
) external;
function approve(address to, uint256 tokenId) external;
function getApproved(uint256 tokenId)
external
view
returns (address operator);
function setApprovalForAll(address operator, bool _approved) external;
function isApprovedForAll(address owner, address operator)
external
view
returns (bool);
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes calldata data
) external;
}
文件 7 的 12:IXToken.sol
pragma solidity 0.6.8;
import "./IERC20.sol";
interface IXToken is IERC20 {
function owner() external returns (address);
function burn(uint256 amount) external;
function burnFrom(address account, uint256 amount) external;
function mint(address to, uint256 amount) external;
function changeName(string calldata name) external;
function changeSymbol(string calldata symbol) external;
function setVaultAddress(address vaultAddress) external;
function transferOwnership(address newOwner) external;
}
文件 8 的 12:Initializable.sol
pragma solidity >=0.4.24 <0.7.0;
contract Initializable {
bool private initialized;
bool private initializing;
modifier initializer() {
require(
initializing || isConstructor() || !initialized,
"Contract instance has already been initialized"
);
bool isTopLevelCall = !initializing;
if (isTopLevelCall) {
initializing = true;
initialized = true;
}
_;
if (isTopLevelCall) {
initializing = false;
}
}
function isConstructor() private view returns (bool) {
address self = address(this);
uint256 cs;
assembly {
cs := extcodesize(self)
}
return cs == 0;
}
uint256[50] private ______gap;
}
文件 9 的 12:Ownable.sol
pragma solidity 0.6.8;
import "./Context.sol";
import "./Initializable.sol";
contract Ownable is Context, Initializable {
address private _owner;
event OwnershipTransferred(
address indexed previousOwner,
address indexed newOwner
);
function initOwnable() internal virtual initializer {
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;
}
}
文件 10 的 12:SafeERC20.sol
pragma solidity 0.6.8;
import "./IERC20.sol";
import "./SafeMath.sol";
import "./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"
);
}
}
}
文件 11 的 12:SafeMath.sol
pragma solidity 0.6.8;
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;
}
}
文件 12 的 12:XStore.sol
pragma solidity 0.6.8;
import "./EnumerableSet.sol";
import "./Ownable.sol";
import "./SafeMath.sol";
import "./IXToken.sol";
import "./IERC721.sol";
import "./SafeERC20.sol";
contract XStore is Ownable {
using SafeMath for uint256;
using SafeERC20 for IERC20;
using EnumerableSet for EnumerableSet.UintSet;
struct FeeParams {
uint256 ethBase;
uint256 ethStep;
}
struct BountyParams {
uint256 ethMax;
uint256 length;
}
struct Vault {
address xTokenAddress;
address nftAddress;
address manager;
IXToken xToken;
IERC721 nft;
EnumerableSet.UintSet holdings;
EnumerableSet.UintSet reserves;
mapping(uint256 => address) requester;
mapping(uint256 => bool) isEligible;
mapping(uint256 => bool) shouldReserve;
bool allowMintRequests;
bool flipEligOnRedeem;
bool negateEligibility;
bool isFinalized;
bool isClosed;
FeeParams mintFees;
FeeParams burnFees;
FeeParams dualFees;
BountyParams supplierBounty;
uint256 ethBalance;
uint256 tokenBalance;
bool isD2Vault;
address d2AssetAddress;
IERC20 d2Asset;
uint256 d2Holdings;
}
event XTokenAddressSet(uint256 indexed vaultId, address token);
event NftAddressSet(uint256 indexed vaultId, address asset);
event ManagerSet(uint256 indexed vaultId, address manager);
event XTokenSet(uint256 indexed vaultId);
event NftSet(uint256 indexed vaultId);
event HoldingsAdded(uint256 indexed vaultId, uint256 id);
event HoldingsRemoved(uint256 indexed vaultId, uint256 id);
event ReservesAdded(uint256 indexed vaultId, uint256 id);
event ReservesRemoved(uint256 indexed vaultId, uint256 id);
event RequesterSet(uint256 indexed vaultId, uint256 id, address requester);
event IsEligibleSet(uint256 indexed vaultId, uint256 id, bool _bool);
event ShouldReserveSet(uint256 indexed vaultId, uint256 id, bool _bool);
event AllowMintRequestsSet(uint256 indexed vaultId, bool isAllowed);
event FlipEligOnRedeemSet(uint256 indexed vaultId, bool _bool);
event NegateEligibilitySet(uint256 indexed vaultId, bool _bool);
event IsFinalizedSet(uint256 indexed vaultId, bool _isFinalized);
event IsClosedSet(uint256 indexed vaultId, bool _isClosed);
event MintFeesSet(
uint256 indexed vaultId,
uint256 ethBase,
uint256 ethStep
);
event BurnFeesSet(
uint256 indexed vaultId,
uint256 ethBase,
uint256 ethStep
);
event DualFeesSet(
uint256 indexed vaultId,
uint256 ethBase,
uint256 ethStep
);
event SupplierBountySet(
uint256 indexed vaultId,
uint256 ethMax,
uint256 length
);
event EthBalanceSet(uint256 indexed vaultId, uint256 _ethBalance);
event TokenBalanceSet(uint256 indexed vaultId, uint256 _tokenBalance);
event IsD2VaultSet(uint256 indexed vaultId, bool _isD2Vault);
event D2AssetAddressSet(uint256 indexed vaultId, address _d2Asset);
event D2AssetSet(uint256 indexed vaultId);
event D2HoldingsSet(uint256 indexed vaultId, uint256 _d2Holdings);
event NewVaultAdded(uint256 indexed vaultId);
event IsExtensionSet(address addr, bool _isExtension);
event RandNonceSet(uint256 _randNonce);
Vault[] internal vaults;
mapping(address => bool) public isExtension;
uint256 public randNonce;
constructor() public {
initOwnable();
}
function _getVault(uint256 vaultId) internal view returns (Vault storage) {
require(vaultId < vaults.length, "Invalid vaultId");
return vaults[vaultId];
}
function vaultsLength() public view returns (uint256) {
return vaults.length;
}
function xTokenAddress(uint256 vaultId) public view returns (address) {
Vault storage vault = _getVault(vaultId);
return vault.xTokenAddress;
}
function nftAddress(uint256 vaultId) public view returns (address) {
Vault storage vault = _getVault(vaultId);
return vault.nftAddress;
}
function manager(uint256 vaultId) public view returns (address) {
Vault storage vault = _getVault(vaultId);
return vault.manager;
}
function xToken(uint256 vaultId) public view returns (IXToken) {
Vault storage vault = _getVault(vaultId);
return vault.xToken;
}
function nft(uint256 vaultId) public view returns (IERC721) {
Vault storage vault = _getVault(vaultId);
return vault.nft;
}
function holdingsLength(uint256 vaultId) public view returns (uint256) {
Vault storage vault = _getVault(vaultId);
return vault.holdings.length();
}
function holdingsContains(uint256 vaultId, uint256 elem)
public
view
returns (bool)
{
Vault storage vault = _getVault(vaultId);
return vault.holdings.contains(elem);
}
function holdingsAt(uint256 vaultId, uint256 index)
public
view
returns (uint256)
{
Vault storage vault = _getVault(vaultId);
return vault.holdings.at(index);
}
function reservesLength(uint256 vaultId) public view returns (uint256) {
Vault storage vault = _getVault(vaultId);
return vault.holdings.length();
}
function reservesContains(uint256 vaultId, uint256 elem)
public
view
returns (bool)
{
Vault storage vault = _getVault(vaultId);
return vault.holdings.contains(elem);
}
function reservesAt(uint256 vaultId, uint256 index)
public
view
returns (uint256)
{
Vault storage vault = _getVault(vaultId);
return vault.holdings.at(index);
}
function requester(uint256 vaultId, uint256 id)
public
view
returns (address)
{
Vault storage vault = _getVault(vaultId);
return vault.requester[id];
}
function isEligible(uint256 vaultId, uint256 id)
public
view
returns (bool)
{
Vault storage vault = _getVault(vaultId);
return vault.isEligible[id];
}
function shouldReserve(uint256 vaultId, uint256 id)
public
view
returns (bool)
{
Vault storage vault = _getVault(vaultId);
return vault.shouldReserve[id];
}
function allowMintRequests(uint256 vaultId) public view returns (bool) {
Vault storage vault = _getVault(vaultId);
return vault.allowMintRequests;
}
function flipEligOnRedeem(uint256 vaultId) public view returns (bool) {
Vault storage vault = _getVault(vaultId);
return vault.flipEligOnRedeem;
}
function negateEligibility(uint256 vaultId) public view returns (bool) {
Vault storage vault = _getVault(vaultId);
return vault.negateEligibility;
}
function isFinalized(uint256 vaultId) public view returns (bool) {
Vault storage vault = _getVault(vaultId);
return vault.isFinalized;
}
function isClosed(uint256 vaultId) public view returns (bool) {
Vault storage vault = _getVault(vaultId);
return vault.isClosed;
}
function mintFees(uint256 vaultId) public view returns (uint256, uint256) {
Vault storage vault = _getVault(vaultId);
return (vault.mintFees.ethBase, vault.mintFees.ethStep);
}
function burnFees(uint256 vaultId) public view returns (uint256, uint256) {
Vault storage vault = _getVault(vaultId);
return (vault.burnFees.ethBase, vault.burnFees.ethStep);
}
function dualFees(uint256 vaultId) public view returns (uint256, uint256) {
Vault storage vault = _getVault(vaultId);
return (vault.dualFees.ethBase, vault.dualFees.ethStep);
}
function supplierBounty(uint256 vaultId)
public
view
returns (uint256, uint256)
{
Vault storage vault = _getVault(vaultId);
return (vault.supplierBounty.ethMax, vault.supplierBounty.length);
}
function ethBalance(uint256 vaultId) public view returns (uint256) {
Vault storage vault = _getVault(vaultId);
return vault.ethBalance;
}
function tokenBalance(uint256 vaultId) public view returns (uint256) {
Vault storage vault = _getVault(vaultId);
return vault.tokenBalance;
}
function isD2Vault(uint256 vaultId) public view returns (bool) {
Vault storage vault = _getVault(vaultId);
return vault.isD2Vault;
}
function d2AssetAddress(uint256 vaultId) public view returns (address) {
Vault storage vault = _getVault(vaultId);
return vault.d2AssetAddress;
}
function d2Asset(uint256 vaultId) public view returns (IERC20) {
Vault storage vault = _getVault(vaultId);
return vault.d2Asset;
}
function d2Holdings(uint256 vaultId) public view returns (uint256) {
Vault storage vault = _getVault(vaultId);
return vault.d2Holdings;
}
function setXTokenAddress(uint256 vaultId, address _xTokenAddress)
public
onlyOwner
{
Vault storage vault = _getVault(vaultId);
vault.xTokenAddress = _xTokenAddress;
emit XTokenAddressSet(vaultId, _xTokenAddress);
}
function setNftAddress(uint256 vaultId, address _nft) public onlyOwner {
Vault storage vault = _getVault(vaultId);
vault.nftAddress = _nft;
emit NftAddressSet(vaultId, _nft);
}
function setManager(uint256 vaultId, address _manager) public onlyOwner {
Vault storage vault = _getVault(vaultId);
vault.manager = _manager;
emit ManagerSet(vaultId, _manager);
}
function setXToken(uint256 vaultId) public onlyOwner {
Vault storage vault = _getVault(vaultId);
vault.xToken = IXToken(vault.xTokenAddress);
emit XTokenSet(vaultId);
}
function setNft(uint256 vaultId) public onlyOwner {
Vault storage vault = _getVault(vaultId);
vault.nft = IERC721(vault.nftAddress);
emit NftSet(vaultId);
}
function holdingsAdd(uint256 vaultId, uint256 elem) public onlyOwner {
Vault storage vault = _getVault(vaultId);
vault.holdings.add(elem);
emit HoldingsAdded(vaultId, elem);
}
function holdingsRemove(uint256 vaultId, uint256 elem) public onlyOwner {
Vault storage vault = _getVault(vaultId);
vault.holdings.remove(elem);
emit HoldingsRemoved(vaultId, elem);
}
function reservesAdd(uint256 vaultId, uint256 elem) public onlyOwner {
Vault storage vault = _getVault(vaultId);
vault.reserves.add(elem);
emit ReservesAdded(vaultId, elem);
}
function reservesRemove(uint256 vaultId, uint256 elem) public onlyOwner {
Vault storage vault = _getVault(vaultId);
vault.reserves.remove(elem);
emit ReservesRemoved(vaultId, elem);
}
function setRequester(uint256 vaultId, uint256 id, address _requester)
public
onlyOwner
{
Vault storage vault = _getVault(vaultId);
vault.requester[id] = _requester;
emit RequesterSet(vaultId, id, _requester);
}
function setIsEligible(uint256 vaultId, uint256 id, bool _bool)
public
onlyOwner
{
Vault storage vault = _getVault(vaultId);
vault.isEligible[id] = _bool;
emit IsEligibleSet(vaultId, id, _bool);
}
function setShouldReserve(uint256 vaultId, uint256 id, bool _shouldReserve)
public
onlyOwner
{
Vault storage vault = _getVault(vaultId);
vault.shouldReserve[id] = _shouldReserve;
emit ShouldReserveSet(vaultId, id, _shouldReserve);
}
function setAllowMintRequests(uint256 vaultId, bool isAllowed)
public
onlyOwner
{
Vault storage vault = _getVault(vaultId);
vault.allowMintRequests = isAllowed;
emit AllowMintRequestsSet(vaultId, isAllowed);
}
function setFlipEligOnRedeem(uint256 vaultId, bool flipElig)
public
onlyOwner
{
Vault storage vault = _getVault(vaultId);
vault.flipEligOnRedeem = flipElig;
emit FlipEligOnRedeemSet(vaultId, flipElig);
}
function setNegateEligibility(uint256 vaultId, bool negateElig)
public
onlyOwner
{
Vault storage vault = _getVault(vaultId);
vault.negateEligibility = negateElig;
emit NegateEligibilitySet(vaultId, negateElig);
}
function setIsFinalized(uint256 vaultId, bool _isFinalized)
public
onlyOwner
{
Vault storage vault = _getVault(vaultId);
vault.isFinalized = _isFinalized;
emit IsFinalizedSet(vaultId, _isFinalized);
}
function setIsClosed(uint256 vaultId, bool _isClosed) public onlyOwner {
Vault storage vault = _getVault(vaultId);
vault.isClosed = _isClosed;
emit IsClosedSet(vaultId, _isClosed);
}
function setMintFees(uint256 vaultId, uint256 ethBase, uint256 ethStep)
public
onlyOwner
{
Vault storage vault = _getVault(vaultId);
vault.mintFees = FeeParams(ethBase, ethStep);
emit MintFeesSet(vaultId, ethBase, ethStep);
}
function setBurnFees(uint256 vaultId, uint256 ethBase, uint256 ethStep)
public
onlyOwner
{
Vault storage vault = _getVault(vaultId);
vault.burnFees = FeeParams(ethBase, ethStep);
emit BurnFeesSet(vaultId, ethBase, ethStep);
}
function setDualFees(uint256 vaultId, uint256 ethBase, uint256 ethStep)
public
onlyOwner
{
Vault storage vault = _getVault(vaultId);
vault.dualFees = FeeParams(ethBase, ethStep);
emit DualFeesSet(vaultId, ethBase, ethStep);
}
function setSupplierBounty(uint256 vaultId, uint256 ethMax, uint256 length)
public
onlyOwner
{
Vault storage vault = _getVault(vaultId);
vault.supplierBounty = BountyParams(ethMax, length);
emit SupplierBountySet(vaultId, ethMax, length);
}
function setEthBalance(uint256 vaultId, uint256 _ethBalance)
public
onlyOwner
{
Vault storage vault = _getVault(vaultId);
vault.ethBalance = _ethBalance;
emit EthBalanceSet(vaultId, _ethBalance);
}
function setTokenBalance(uint256 vaultId, uint256 _tokenBalance)
public
onlyOwner
{
Vault storage vault = _getVault(vaultId);
vault.tokenBalance = _tokenBalance;
emit TokenBalanceSet(vaultId, _tokenBalance);
}
function setIsD2Vault(uint256 vaultId, bool _isD2Vault) public onlyOwner {
Vault storage vault = _getVault(vaultId);
vault.isD2Vault = _isD2Vault;
emit IsD2VaultSet(vaultId, _isD2Vault);
}
function setD2AssetAddress(uint256 vaultId, address _d2Asset)
public
onlyOwner
{
Vault storage vault = _getVault(vaultId);
vault.d2AssetAddress = _d2Asset;
emit D2AssetAddressSet(vaultId, _d2Asset);
}
function setD2Asset(uint256 vaultId) public onlyOwner {
Vault storage vault = _getVault(vaultId);
vault.d2Asset = IERC20(vault.d2AssetAddress);
emit D2AssetSet(vaultId);
}
function setD2Holdings(uint256 vaultId, uint256 _d2Holdings)
public
onlyOwner
{
Vault storage vault = _getVault(vaultId);
vault.d2Holdings = _d2Holdings;
emit D2HoldingsSet(vaultId, _d2Holdings);
}
function addNewVault() public onlyOwner returns (uint256) {
Vault memory newVault;
vaults.push(newVault);
uint256 vaultId = vaults.length.sub(1);
emit NewVaultAdded(vaultId);
return vaultId;
}
function setIsExtension(address addr, bool _isExtension) public onlyOwner {
isExtension[addr] = _isExtension;
emit IsExtensionSet(addr, _isExtension);
}
function setRandNonce(uint256 _randNonce) public onlyOwner {
randNonce = _randNonce;
emit RandNonceSet(_randNonce);
}
}
{
"compilationTarget": {
"XStore.sol": "XStore"
},
"evmVersion": "istanbul",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
}
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"vaultId","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isAllowed","type":"bool"}],"name":"AllowMintRequestsSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"vaultId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethBase","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethStep","type":"uint256"}],"name":"BurnFeesSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"vaultId","type":"uint256"},{"indexed":false,"internalType":"address","name":"_d2Asset","type":"address"}],"name":"D2AssetAddressSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"vaultId","type":"uint256"}],"name":"D2AssetSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"vaultId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_d2Holdings","type":"uint256"}],"name":"D2HoldingsSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"vaultId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethBase","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethStep","type":"uint256"}],"name":"DualFeesSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"vaultId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_ethBalance","type":"uint256"}],"name":"EthBalanceSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"vaultId","type":"uint256"},{"indexed":false,"internalType":"bool","name":"_bool","type":"bool"}],"name":"FlipEligOnRedeemSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"vaultId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"}],"name":"HoldingsAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"vaultId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"}],"name":"HoldingsRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"vaultId","type":"uint256"},{"indexed":false,"internalType":"bool","name":"_isClosed","type":"bool"}],"name":"IsClosedSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"vaultId","type":"uint256"},{"indexed":false,"internalType":"bool","name":"_isD2Vault","type":"bool"}],"name":"IsD2VaultSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"vaultId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"bool","name":"_bool","type":"bool"}],"name":"IsEligibleSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"addr","type":"address"},{"indexed":false,"internalType":"bool","name":"_isExtension","type":"bool"}],"name":"IsExtensionSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"vaultId","type":"uint256"},{"indexed":false,"internalType":"bool","name":"_isFinalized","type":"bool"}],"name":"IsFinalizedSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"vaultId","type":"uint256"},{"indexed":false,"internalType":"address","name":"manager","type":"address"}],"name":"ManagerSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"vaultId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethBase","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethStep","type":"uint256"}],"name":"MintFeesSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"vaultId","type":"uint256"},{"indexed":false,"internalType":"bool","name":"_bool","type":"bool"}],"name":"NegateEligibilitySet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"vaultId","type":"uint256"}],"name":"NewVaultAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"vaultId","type":"uint256"},{"indexed":false,"internalType":"address","name":"asset","type":"address"}],"name":"NftAddressSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"vaultId","type":"uint256"}],"name":"NftSet","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":"_randNonce","type":"uint256"}],"name":"RandNonceSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"vaultId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"address","name":"requester","type":"address"}],"name":"RequesterSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"vaultId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"}],"name":"ReservesAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"vaultId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"}],"name":"ReservesRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"vaultId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"bool","name":"_bool","type":"bool"}],"name":"ShouldReserveSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"vaultId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethMax","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"length","type":"uint256"}],"name":"SupplierBountySet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"vaultId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_tokenBalance","type":"uint256"}],"name":"TokenBalanceSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"vaultId","type":"uint256"},{"indexed":false,"internalType":"address","name":"token","type":"address"}],"name":"XTokenAddressSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"vaultId","type":"uint256"}],"name":"XTokenSet","type":"event"},{"inputs":[],"name":"addNewVault","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"}],"name":"allowMintRequests","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"}],"name":"burnFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"}],"name":"d2Asset","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"}],"name":"d2AssetAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"}],"name":"d2Holdings","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"}],"name":"dualFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"}],"name":"ethBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"}],"name":"flipEligOnRedeem","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"uint256","name":"elem","type":"uint256"}],"name":"holdingsAdd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"holdingsAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"uint256","name":"elem","type":"uint256"}],"name":"holdingsContains","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"}],"name":"holdingsLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"uint256","name":"elem","type":"uint256"}],"name":"holdingsRemove","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"}],"name":"isClosed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"}],"name":"isD2Vault","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"isEligible","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isExtension","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"}],"name":"isFinalized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"}],"name":"manager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"}],"name":"mintFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"}],"name":"negateEligibility","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"}],"name":"nft","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"}],"name":"nftAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"randNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"requester","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"uint256","name":"elem","type":"uint256"}],"name":"reservesAdd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"reservesAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"uint256","name":"elem","type":"uint256"}],"name":"reservesContains","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"}],"name":"reservesLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"uint256","name":"elem","type":"uint256"}],"name":"reservesRemove","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"bool","name":"isAllowed","type":"bool"}],"name":"setAllowMintRequests","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"uint256","name":"ethBase","type":"uint256"},{"internalType":"uint256","name":"ethStep","type":"uint256"}],"name":"setBurnFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"}],"name":"setD2Asset","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"address","name":"_d2Asset","type":"address"}],"name":"setD2AssetAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"uint256","name":"_d2Holdings","type":"uint256"}],"name":"setD2Holdings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"uint256","name":"ethBase","type":"uint256"},{"internalType":"uint256","name":"ethStep","type":"uint256"}],"name":"setDualFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"uint256","name":"_ethBalance","type":"uint256"}],"name":"setEthBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"bool","name":"flipElig","type":"bool"}],"name":"setFlipEligOnRedeem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"bool","name":"_isClosed","type":"bool"}],"name":"setIsClosed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"bool","name":"_isD2Vault","type":"bool"}],"name":"setIsD2Vault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bool","name":"_bool","type":"bool"}],"name":"setIsEligible","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bool","name":"_isExtension","type":"bool"}],"name":"setIsExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"bool","name":"_isFinalized","type":"bool"}],"name":"setIsFinalized","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"address","name":"_manager","type":"address"}],"name":"setManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"uint256","name":"ethBase","type":"uint256"},{"internalType":"uint256","name":"ethStep","type":"uint256"}],"name":"setMintFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"bool","name":"negateElig","type":"bool"}],"name":"setNegateEligibility","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"}],"name":"setNft","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"address","name":"_nft","type":"address"}],"name":"setNftAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_randNonce","type":"uint256"}],"name":"setRandNonce","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"_requester","type":"address"}],"name":"setRequester","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bool","name":"_shouldReserve","type":"bool"}],"name":"setShouldReserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"uint256","name":"ethMax","type":"uint256"},{"internalType":"uint256","name":"length","type":"uint256"}],"name":"setSupplierBounty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"uint256","name":"_tokenBalance","type":"uint256"}],"name":"setTokenBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"}],"name":"setXToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"address","name":"_xTokenAddress","type":"address"}],"name":"setXTokenAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"shouldReserve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"}],"name":"supplierBounty","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"}],"name":"tokenBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vaultsLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"}],"name":"xToken","outputs":[{"internalType":"contract IXToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"}],"name":"xTokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]