编译器
0.8.18+commit.87f61d96
文件 1 的 25:Address.sol
pragma solidity ^0.8.1;
library Address {
function isContract(address account) internal view returns (bool) {
return account.code.length > 0;
}
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
function functionCallWithValue(
address target,
bytes memory data,
uint256 value
) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResult(success, returndata, errorMessage);
}
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResult(success, returndata, errorMessage);
}
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResult(success, returndata, errorMessage);
}
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
if (returndata.length > 0) {
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
文件 2 的 25:GPv2Order.sol
pragma solidity ^0.8.18;
import "@openzeppelin/contracts-v4/token/ERC20/IERC20.sol";
library GPv2Order {
struct Data {
IERC20 sellToken;
IERC20 buyToken;
address receiver;
uint256 sellAmount;
uint256 buyAmount;
uint32 validTo;
bytes32 appData;
uint256 feeAmount;
bytes32 kind;
bool partiallyFillable;
bytes32 sellTokenBalance;
bytes32 buyTokenBalance;
}
bytes32 internal constant TYPE_HASH =
hex"d5a25ba2e97094ad7d83dc28a6572da797d6b3e7fc6663bd93efb789fc17e489";
bytes32 internal constant KIND_SELL =
hex"f3b277728b3fee749481eb3e0b3b48980dbbab78658fc419025cb16eee346775";
bytes32 internal constant KIND_BUY =
hex"6ed88e868af0a1983e3886d5f3e95a2fafbd6c3450bc229e27342283dc429ccc";
bytes32 internal constant BALANCE_ERC20 =
hex"5a28e9363bb942b639270062aa6bb295f434bcdfc42c97267bf003f272060dc9";
bytes32 internal constant BALANCE_EXTERNAL =
hex"abee3b73373acd583a130924aad6dc38cfdc44ba0555ba94ce2ff63980ea0632";
bytes32 internal constant BALANCE_INTERNAL =
hex"4ac99ace14ee0a5ef932dc609df0943ab7ac16b7583634612f8dc35a4289a6ce";
address internal constant RECEIVER_SAME_AS_OWNER = address(0);
uint256 internal constant UID_LENGTH = 56;
function actualReceiver(Data memory order, address owner)
internal
pure
returns (address receiver)
{
if (order.receiver == RECEIVER_SAME_AS_OWNER) {
receiver = owner;
} else {
receiver = order.receiver;
}
}
function hash(Data memory order, bytes32 domainSeparator)
internal
pure
returns (bytes32 orderDigest)
{
bytes32 structHash;
assembly {
let dataStart := sub(order, 32)
let temp := mload(dataStart)
mstore(dataStart, TYPE_HASH)
structHash := keccak256(dataStart, 416)
mstore(dataStart, temp)
}
assembly {
let freeMemoryPointer := mload(0x40)
mstore(freeMemoryPointer, "\x19\x01")
mstore(add(freeMemoryPointer, 2), domainSeparator)
mstore(add(freeMemoryPointer, 34), structHash)
orderDigest := keccak256(freeMemoryPointer, 66)
}
}
function packOrderUidParams(
bytes memory orderUid,
bytes32 orderDigest,
address owner,
uint32 validTo
) internal pure {
require(orderUid.length == UID_LENGTH, "GPv2: uid buffer overflow");
assembly {
mstore(add(orderUid, 56), validTo)
mstore(add(orderUid, 52), owner)
mstore(add(orderUid, 32), orderDigest)
}
}
function extractOrderUidParams(bytes calldata orderUid)
internal
pure
returns (
bytes32 orderDigest,
address owner,
uint32 validTo
)
{
require(orderUid.length == UID_LENGTH, "GPv2: invalid uid");
assembly {
orderDigest := calldataload(orderUid.offset)
owner := shr(96, calldataload(add(orderUid.offset, 32)))
validTo := shr(224, calldataload(add(orderUid.offset, 52)))
}
}
}
文件 3 的 25:ICowSettlement.sol
pragma solidity >=0.5.0;
import "./IERC20Detailed.sol";
interface ICowSettlement {
struct GPv2TradeData {
uint256 sellTokenIndex;
uint256 buyTokenIndex;
address receiver;
uint256 sellAmount;
uint256 buyAmount;
uint32 validTo;
bytes32 appData;
uint256 feeAmount;
uint256 flags;
uint256 executedAmount;
bytes signature;
}
struct GPv2InteractionData {
address target;
uint256 value;
bytes callData;
}
function setPreSignature(bytes calldata orderUid, bool signed) external;
function invalidateOrder(bytes calldata orderUid) external;
function filledAmount(bytes calldata orderUid) external view returns (uint256);
function vaultRelayer() external view returns (address);
function domainSeparator() external view returns (bytes32);
function settle(
IERC20Detailed[] calldata tokens,
uint256[] calldata clearingPrices,
GPv2TradeData[] calldata trades,
GPv2InteractionData[][3] calldata interactions
) external;
function preSignature(bytes memory) external returns (uint);
}
文件 4 的 25:IERC20.sol
pragma solidity ^0.8.0;
interface IERC20 {
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address to, uint256 amount) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(
address from,
address to,
uint256 amount
) external returns (bool);
}
文件 5 的 25:IERC20Detailed.sol
pragma solidity >=0.5.0;
interface IERC20Detailed {
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);
function decimals() external view returns (uint8);
function symbol() external view returns (string memory);
}
文件 6 的 25:IEnzymeFundValueCalculatorRouter.sol
pragma solidity >=0.5.0;
interface IEnzymeFundValueCalculatorRouter {
function calcGrossShareValue(address _vaultProxy)
external
returns (address denominationAsset_, uint256 grossShareValue_);
function calcNetShareValue(address _vaultProxy)
external
returns (address denominationAsset_, uint256 netShareValue_);
}
文件 7 的 25:ILegacyPool.sol
pragma solidity >=0.5.0;
import "./IPriceFeedOracle.sol";
interface ILegacyPool {
struct SwapDetails {
uint104 minAmount;
uint104 maxAmount;
uint32 lastSwapTime;
uint16 maxSlippageRatio;
}
struct Asset {
address assetAddress;
bool isCoverAsset;
bool isAbandoned;
}
function getAsset(uint assetId) external view returns (Asset memory);
function getAssets() external view returns (Asset[] memory);
function buyNXM(uint minTokensOut) external payable;
function sellNXM(uint tokenAmount, uint minEthOut) external;
function sellNXMTokens(uint tokenAmount) external returns (bool);
function transferAssetToSwapOperator(address asset, uint amount) external;
function setSwapDetailsLastSwapTime(address asset, uint32 lastSwapTime) external;
function getAssetSwapDetails(address assetAddress) external view returns (SwapDetails memory);
function getNXMForEth(uint ethAmount) external view returns (uint);
function sendPayout(uint assetIndex, address payable payoutAddress, uint amount) external;
function upgradeCapitalPool(address payable newPoolAddress) external;
function priceFeedOracle() external view returns (IPriceFeedOracle);
function getPoolValueInEth() external view returns (uint);
function getEthForNXM(uint nxmAmount) external view returns (uint ethAmount);
function calculateEthForNXM(uint nxmAmount, uint currentTotalAssetValue, uint mcrEth) external pure returns (uint);
function calculateMCRRatio(uint totalAssetValue, uint mcrEth) external pure returns (uint);
function calculateTokenSpotPrice(uint totalAssetValue, uint mcrEth) external pure returns (uint tokenPrice);
function getTokenPriceInAsset(uint assetId) external view returns (uint tokenPrice);
function getTokenPrice() external view returns (uint tokenPrice);
function getMCRRatio() external view returns (uint);
function setSwapValue(uint value) external;
}
文件 8 的 25:IMCR.sol
pragma solidity >=0.5.0;
interface IMCR {
function updateMCRInternal(bool forceUpdate) external;
function getMCR() external view returns (uint);
function mcr() external view returns (uint80);
function desiredMCR() external view returns (uint80);
function lastUpdateTime() external view returns (uint32);
function maxMCRIncrement() external view returns (uint16);
function gearingFactor() external view returns (uint24);
function minUpdateTime() external view returns (uint16);
}
文件 9 的 25:IMasterAwareV2.sol
pragma solidity >=0.5.0;
interface IMasterAwareV2 {
enum ID {
TC,
P1,
MR,
MC,
CO,
SP,
PS,
GV,
GW,
CL,
AS,
CI,
CG,
RA,
ST,
CP
}
function changeMasterAddress(address masterAddress) external;
function changeDependentContractAddress() external;
function internalContracts(uint) external view returns (address payable);
}
文件 10 的 25:IMemberRoles.sol
pragma solidity >=0.5.0;
interface IMemberRoles {
enum Role {Unassigned, AdvisoryBoard, Member, Owner}
function join(address _userAddress, uint nonce, bytes calldata signature) external payable;
function switchMembership(address _newAddress) external;
function switchMembershipAndAssets(
address newAddress,
uint[] calldata coverIds,
uint[] calldata stakingTokenIds
) external;
function switchMembershipOf(address member, address _newAddress) external;
function totalRoles() external view returns (uint256);
function changeAuthorized(uint _roleId, address _newAuthorized) external;
function setKycAuthAddress(address _add) external;
function members(uint _memberRoleId) external view returns (uint, address[] memory memberArray);
function numberOfMembers(uint _memberRoleId) external view returns (uint);
function authorized(uint _memberRoleId) external view returns (address);
function roles(address _memberAddress) external view returns (uint[] memory);
function checkRole(address _memberAddress, uint _roleId) external view returns (bool);
function getMemberLengthForAllRoles() external view returns (uint[] memory totalMembers);
function memberAtIndex(uint _memberRoleId, uint index) external view returns (address, bool);
function membersLength(uint _memberRoleId) external view returns (uint);
event MemberRole(uint256 indexed roleId, bytes32 roleName, string roleDescription);
event MemberJoined(address indexed newMember, uint indexed nonce);
event switchedMembership(address indexed previousMember, address indexed newMember, uint timeStamp);
event MembershipWithdrawn(address indexed member, uint timestamp);
}
文件 11 的 25:INXMMaster.sol
pragma solidity >=0.5.0;
interface INXMMaster {
function tokenAddress() external view returns (address);
function owner() external view returns (address);
function emergencyAdmin() external view returns (address);
function masterInitialized() external view returns (bool);
function isInternal(address _add) external view returns (bool);
function isPause() external view returns (bool check);
function isMember(address _add) external view returns (bool);
function checkIsAuthToGoverned(address _add) external view returns (bool);
function getLatestAddress(bytes2 _contractName) external view returns (address payable contractAddress);
function contractAddresses(bytes2 code) external view returns (address payable);
function upgradeMultipleContracts(
bytes2[] calldata _contractCodes,
address payable[] calldata newAddresses
) external;
function removeContracts(bytes2[] calldata contractCodesToRemove) external;
function addNewInternalContracts(
bytes2[] calldata _contractCodes,
address payable[] calldata newAddresses,
uint[] calldata _types
) external;
function updateOwnerParameters(bytes8 code, address payable val) external;
}
文件 12 的 25:INXMToken.sol
pragma solidity >=0.5.0;
interface INXMToken {
function burn(uint256 amount) external returns (bool);
function burnFrom(address from, uint256 value) external returns (bool);
function operatorTransfer(address from, uint256 value) external returns (bool);
function mint(address account, uint256 amount) external;
function isLockedForMV(address member) external view returns (uint);
function whiteListed(address member) external view returns (bool);
function addToWhiteList(address _member) external returns (bool);
function removeFromWhiteList(address _member) external returns (bool);
function changeOperator(address _newOperator) external returns (bool);
function lockForMemberVote(address _of, uint _days) external;
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);
}
文件 13 的 25:IPool.sol
pragma solidity >=0.5.0;
import "./IPriceFeedOracle.sol";
struct SwapDetails {
uint104 minAmount;
uint104 maxAmount;
uint32 lastSwapTime;
uint16 maxSlippageRatio;
}
struct Asset {
address assetAddress;
bool isCoverAsset;
bool isAbandoned;
}
interface IPool {
error RevertedWithoutReason(uint index);
error AssetNotFound();
error UnknownParameter();
error OrderInProgress();
function swapOperator() external view returns (address);
function getAsset(uint assetId) external view returns (Asset memory);
function getAssets() external view returns (Asset[] memory);
function transferAssetToSwapOperator(address asset, uint amount) external;
function setSwapDetailsLastSwapTime(address asset, uint32 lastSwapTime) external;
function getAssetSwapDetails(address assetAddress) external view returns (SwapDetails memory);
function sendPayout(uint assetIndex, address payable payoutAddress, uint amount, uint ethDepositAmount) external;
function sendEth(address payoutAddress, uint amount) external;
function upgradeCapitalPool(address payable newPoolAddress) external;
function priceFeedOracle() external view returns (IPriceFeedOracle);
function getPoolValueInEth() external view returns (uint);
function calculateMCRRatio(uint totalAssetValue, uint mcrEth) external pure returns (uint);
function getInternalTokenPriceInAsset(uint assetId) external view returns (uint tokenPrice);
function getInternalTokenPriceInAssetAndUpdateTwap(uint assetId) external returns (uint tokenPrice);
function getTokenPrice() external view returns (uint tokenPrice);
function getMCRRatio() external view returns (uint);
function setSwapAssetAmount(address assetAddress, uint value) external;
}
文件 14 的 25:IPriceFeedOracle.sol
pragma solidity >=0.5.0;
interface Aggregator {
function decimals() external view returns (uint8);
function latestAnswer() external view returns (int);
}
interface IPriceFeedOracle {
struct OracleAsset {
Aggregator aggregator;
uint8 decimals;
}
function ETH() external view returns (address);
function assets(address) external view returns (Aggregator, uint8);
function getAssetToEthRate(address asset) external view returns (uint);
function getAssetForEth(address asset, uint ethIn) external view returns (uint);
function getEthForAsset(address asset, uint amount) external view returns (uint);
}
文件 15 的 25:IRamm.sol
pragma solidity >=0.5.0;
import "./IPool.sol";
import "./INXMToken.sol";
import "./ITokenController.sol";
interface IRamm {
struct Slot0 {
uint128 nxmReserveA;
uint128 nxmReserveB;
}
struct Slot1 {
uint128 ethReserve;
uint88 budget;
uint32 updatedAt;
bool swapPaused;
}
struct Observation {
uint32 timestamp;
uint112 priceCumulativeAbove;
uint112 priceCumulativeBelow;
}
struct State {
uint nxmA;
uint nxmB;
uint eth;
uint budget;
uint ratchetSpeedB;
uint timestamp;
}
struct Context {
uint capital;
uint supply;
uint mcr;
}
struct CumulativePriceCalculationProps {
uint previousEthReserve;
uint currentEthReserve;
uint previousNxmA;
uint currentNxmA;
uint previousNxmB;
uint currentNxmB;
uint previousTimestamp;
uint observationTimestamp;
}
struct CumulativePriceCalculationTimes {
uint secondsUntilBVAbove;
uint secondsUntilBVBelow;
uint timeElapsed;
uint bvTimeBelow;
uint bvTimeAbove;
uint ratchetTimeAbove;
uint ratchetTimeBelow;
}
function getReserves() external view returns (
uint ethReserve,
uint nxmA,
uint nxmB,
uint remainingBudget
);
function getSpotPrices() external view returns (uint spotPriceA, uint spotPriceB);
function getBookValue() external view returns (uint bookValue);
function getInternalPrice() external view returns (uint internalPrice);
function updateTwap() external;
function getInternalPriceAndUpdateTwap() external returns (uint internalPrice);
function swap(uint nxmIn, uint minAmountOut, uint deadline) external payable returns (uint amountOut);
function removeBudget() external;
function setEmergencySwapPause(bool _swapPaused) external;
event EthSwappedForNxm(address indexed member, uint ethIn, uint nxmOut);
event NxmSwappedForEth(address indexed member, uint nxmIn, uint ethOut);
event ObservationUpdated(uint32 timestamp, uint112 priceCumulativeAbove, uint112 priceCumulativeBelow);
event BudgetRemoved();
event SwapPauseConfigured(bool paused);
event EthInjected(uint value);
event EthExtracted(uint value);
error SystemPaused();
error SwapPaused();
error OneInputOnly();
error OneInputRequired();
error SwapExpired(uint deadline, uint blockTimestamp);
error InsufficientAmountOut(uint amountOut, uint minAmountOut);
error NoSwapsInBufferZone();
error EthTransferFailed();
error EthCircuitBreakerHit();
error NxmCircuitBreakerHit();
}
文件 16 的 25:ISwapOperator.sol
pragma solidity >=0.5.0;
import "../external/cow/GPv2Order.sol";
import "../external/enzyme/IEnzymeFundValueCalculatorRouter.sol";
import "./ICowSettlement.sol";
import "./INXMMaster.sol";
import "./IPool.sol";
import "./IWeth.sol";
interface ISwapOperator {
enum SwapOperationType {
EthToAsset,
AssetToEth,
AssetToAsset
}
function getDigest(GPv2Order.Data calldata order) external view returns (bytes32);
function getUID(GPv2Order.Data calldata order) external view returns (bytes memory);
function orderInProgress() external view returns (bool);
function currentOrderUID() external view returns (bytes memory);
function cowSettlement() external view returns (ICowSettlement);
function cowVaultRelayer() external view returns (address);
function master() external view returns (INXMMaster);
function swapController() external view returns (address);
function weth() external view returns (IWeth);
function domainSeparator() external view returns (bytes32);
function enzymeV4VaultProxyAddress() external view returns (address);
function enzymeFundValueCalculatorRouter() external view returns (IEnzymeFundValueCalculatorRouter);
function minPoolEth() external view returns (uint);
function placeOrder(GPv2Order.Data calldata order, bytes calldata orderUID) external;
function closeOrder(GPv2Order.Data calldata order) external;
function swapEnzymeVaultShareForETH(uint amountIn, uint amountOutMin) external;
function swapETHForEnzymeVaultShare(uint amountIn, uint amountOutMin) external;
function recoverAsset(address assetAddress, address receiver) external;
function requestAsset(address asset, uint amount) external;
function transferRequestedAsset(address requestedAsset, uint requestedAmount) external;
event OrderPlaced(GPv2Order.Data order);
event OrderClosed(GPv2Order.Data order, uint filledAmount);
event Swapped(address indexed fromAsset, address indexed toAsset, uint amountIn, uint amountOut);
event TransferredToSafe(address asset, uint amount);
error OrderInProgress(bytes currentOrderUID);
error NoOrderInPlace();
error OrderUidMismatch(bytes providedOrderUID, bytes expectedOrderUID);
error UnsupportedTokenBalance(string kind);
error InvalidReceiver(address validReceiver);
error TokenDisabled(address token);
error AmountOutTooLow(uint amountOut, uint minAmount);
error InvalidTokenAddress(string token);
error InvalidDenominationAsset(address invalidAsset, address validAsset);
error BelowMinValidTo(uint minValidTo);
error AboveMaxValidTo(uint maxValidTo);
error InvalidBalance(uint tokenBalance, uint limit);
error InvalidPostSwapBalance(uint postSwapBalance, uint limit);
error OnlyController();
error TransferFailed(address to, uint value, address token);
error InsufficientTimeBetweenSwaps(uint minValidSwapTime);
error AboveMaxFee(uint feeInEth, uint maxFee);
}
文件 17 的 25:ITokenController.sol
pragma solidity >=0.5.0;
import "./INXMToken.sol";
interface ITokenController {
struct StakingPoolNXMBalances {
uint128 rewards;
uint128 deposits;
}
struct CoverInfo {
uint16 claimCount;
bool hasOpenClaim;
bool hasAcceptedClaim;
uint96 requestedPayoutAmount;
}
struct StakingPoolOwnershipOffer {
address proposedManager;
uint96 deadline;
}
struct WithdrawAssessment {
bool stake;
bool rewards;
}
struct StakingPoolDeposit {
uint tokenId;
uint[] trancheIds;
}
struct StakingPoolManagerReward {
uint poolId;
uint[] trancheIds;
}
function token() external view returns (INXMToken);
function coverInfo(uint id) external view returns (
uint16 claimCount,
bool hasOpenClaim,
bool hasAcceptedClaim,
uint96 requestedPayoutAmount
);
function getLockReasons(address _of) external view returns (bytes32[] memory reasons);
function totalSupply() external view returns (uint);
function totalBalanceOf(address _of) external view returns (uint amount);
function totalBalanceOfWithoutDelegations(address _of) external view returns (uint amount);
function getTokenPrice() external view returns (uint tokenPrice);
function getPendingRewards(address member) external view returns (uint);
function tokensLocked(address _of, bytes32 _reason) external view returns (uint256 amount);
function getWithdrawableCoverNotes(
address coverOwner
) external view returns (
uint[] memory coverIds,
bytes32[] memory lockReasons,
uint withdrawableAmount
);
function getStakingPoolManager(uint poolId) external view returns (address manager);
function getManagerStakingPools(address manager) external view returns (uint[] memory poolIds);
function isStakingPoolManager(address member) external view returns (bool);
function getStakingPoolOwnershipOffer(uint poolId) external view returns (address proposedManager, uint deadline);
function stakingPoolNXMBalances(uint poolId) external view returns (uint128 rewards, uint128 deposits);
function withdrawCoverNote(
address _of,
uint[] calldata _coverIds,
uint[] calldata _indexes
) external;
function changeOperator(address _newOperator) external;
function operatorTransfer(address _from, address _to, uint _value) external returns (bool);
function burnFrom(address _of, uint amount) external returns (bool);
function addToWhitelist(address _member) external;
function removeFromWhitelist(address _member) external;
function mint(address _member, uint _amount) external;
function lockForMemberVote(address _of, uint _days) external;
function withdrawClaimAssessmentTokens(address[] calldata users) external;
function transferStakingPoolsOwnership(address from, address to) external;
function assignStakingPoolManager(uint poolId, address manager) external;
function createStakingPoolOwnershipOffer(uint poolId, address proposedManager, uint deadline) external;
function acceptStakingPoolOwnershipOffer(uint poolId) external;
function cancelStakingPoolOwnershipOffer(uint poolId) external;
function mintStakingPoolNXMRewards(uint amount, uint poolId) external;
function burnStakingPoolNXMRewards(uint amount, uint poolId) external;
function depositStakedNXM(address from, uint amount, uint poolId) external;
function withdrawNXMStakeAndRewards(address to, uint stakeToWithdraw, uint rewardsToWithdraw, uint poolId) external;
function burnStakedNXM(uint amount, uint poolId) external;
}
文件 18 的 25:IWeth.sol
pragma solidity >=0.5.0;
interface IWeth {
function deposit() external payable;
function withdraw(uint256 wad) external;
function approve(address spender, uint256 value) external;
function balanceOf(address account) external view returns (uint256);
function transfer(address recipient, uint256 amount) external returns (bool);
}
文件 19 的 25:MasterAwareV2.sol
pragma solidity ^0.8.18;
import "../interfaces/INXMMaster.sol";
import "../interfaces/IMasterAwareV2.sol";
import "../interfaces/IMemberRoles.sol";
abstract contract MasterAwareV2 is IMasterAwareV2 {
INXMMaster public master;
mapping(uint => address payable) public internalContracts;
modifier onlyMember {
require(
IMemberRoles(internalContracts[uint(ID.MR)]).checkRole(
msg.sender,
uint(IMemberRoles.Role.Member)
),
"Caller is not a member"
);
_;
}
modifier onlyAdvisoryBoard {
require(
IMemberRoles(internalContracts[uint(ID.MR)]).checkRole(
msg.sender,
uint(IMemberRoles.Role.AdvisoryBoard)
),
"Caller is not an advisory board member"
);
_;
}
modifier onlyInternal {
require(master.isInternal(msg.sender), "Caller is not an internal contract");
_;
}
modifier onlyMaster {
if (address(master) != address(0)) {
require(address(master) == msg.sender, "Not master");
}
_;
}
modifier onlyGovernance {
require(
master.checkIsAuthToGoverned(msg.sender),
"Caller is not authorized to govern"
);
_;
}
modifier onlyEmergencyAdmin {
require(
msg.sender == master.emergencyAdmin(),
"Caller is not emergency admin"
);
_;
}
modifier whenPaused {
require(master.isPause(), "System is not paused");
_;
}
modifier whenNotPaused {
require(!master.isPause(), "System is paused");
_;
}
function getInternalContractAddress(ID id) internal view returns (address payable) {
return internalContracts[uint(id)];
}
function changeMasterAddress(address masterAddress) public onlyMaster {
master = INXMMaster(masterAddress);
}
}
文件 20 的 25:Math.sol
pragma solidity ^0.8.18;
library Math {
function min(uint a, uint b) internal pure returns (uint) {
return a < b ? a : b;
}
function max(uint a, uint b) internal pure returns (uint) {
return a > b ? a : b;
}
function sum(uint[] memory items) internal pure returns (uint) {
uint count = items.length;
uint total;
for (uint i = 0; i < count; i++) {
total += items[i];
}
return total;
}
function divRound(uint a, uint b) internal pure returns (uint) {
return (a + b / 2) / b;
}
function divCeil(uint a, uint b) internal pure returns (uint) {
return (a + b - 1) / b;
}
function roundUp(uint a, uint b) internal pure returns (uint) {
return divCeil(a, b) * b;
}
function sqrt(uint y) internal pure returns (uint) {
if (y > 3) {
uint z = y;
uint x = y / 2 + 1;
while (x < z) {
z = x;
x = (y / x + x) / 2;
}
return z;
}
if (y != 0) {
return 1;
}
return 0;
}
}
文件 21 的 25:Pool.sol
pragma solidity ^0.8.18;
import "@openzeppelin/contracts-v4/token/ERC20/utils/SafeERC20.sol";
import "@openzeppelin/contracts-v4/security/ReentrancyGuard.sol";
import "../../abstract/MasterAwareV2.sol";
import "../../interfaces/IMCR.sol";
import "../../interfaces/IRamm.sol";
import "../../interfaces/INXMToken.sol";
import "../../interfaces/ILegacyPool.sol";
import "../../interfaces/IPool.sol";
import "../../interfaces/IPriceFeedOracle.sol";
import "../../interfaces/ISwapOperator.sol";
import "../../libraries/Math.sol";
import "../../libraries/SafeUintCast.sol";
contract Pool is IPool, MasterAwareV2, ReentrancyGuard {
using SafeERC20 for IERC20;
using SafeUintCast for uint;
Asset[] public assets;
mapping(address => SwapDetails) public swapDetails;
IPriceFeedOracle public override priceFeedOracle;
address public swapOperator;
uint32 public assetsInSwapOperatorBitmap;
uint public assetInSwapOperator;
address constant public ETH = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
uint public constant MCR_RATIO_DECIMALS = 4;
uint internal constant MAX_SLIPPAGE_DENOMINATOR = 10000;
INXMToken public immutable nxmToken;
event Payout(address indexed to, address indexed assetAddress, uint amount);
event DepositReturned(address indexed to, uint amount);
modifier onlySwapOperator {
require(msg.sender == swapOperator, "Pool: Not swapOperator");
_;
}
modifier onlyRamm {
require(msg.sender == internalContracts[uint(ID.RA)], "Pool: Not Ramm");
_;
}
constructor (
address _master,
address _priceOracle,
address _swapOperator,
address _nxmTokenAddress,
address _previousPool
) {
master = INXMMaster(_master);
nxmToken = INXMToken(_nxmTokenAddress);
swapOperator = _swapOperator;
ILegacyPool previousPool = ILegacyPool(_previousPool);
ILegacyPool.Asset[] memory previousAssets = previousPool.getAssets();
for (uint i = 0; i < previousAssets.length; i++) {
address assetAddress = previousAssets[i].assetAddress;
assets.push(
Asset(
previousAssets[i].assetAddress,
previousAssets[i].isCoverAsset,
previousAssets[i].isAbandoned
)
);
if (assetAddress != ETH) {
ILegacyPool.SwapDetails memory previousSwapDetails = previousPool.getAssetSwapDetails(assetAddress);
swapDetails[assetAddress] = SwapDetails(
previousSwapDetails.minAmount,
previousSwapDetails.maxAmount,
previousSwapDetails.lastSwapTime,
previousSwapDetails.maxSlippageRatio
);
}
}
_setPriceFeedOracle(IPriceFeedOracle(_priceOracle));
}
receive() external payable {}
function getAssetValueInEth(address assetAddress, uint assetAmountInSwapOperator) internal view returns (uint) {
uint assetBalance = assetAmountInSwapOperator;
if (assetAddress.code.length != 0) {
try IERC20(assetAddress).balanceOf(address(this)) returns (uint balance) {
assetBalance += balance;
} catch {
}
}
if (assetBalance == 0) {
return 0;
}
return priceFeedOracle.getEthForAsset(assetAddress, assetBalance);
}
function getPoolValueInEth() public override view returns (uint) {
uint total = address(this).balance;
uint assetCount = assets.length;
uint _assetsInSwapOperatorBitmap = assetsInSwapOperatorBitmap;
for (uint i = 0; i < assetCount; i++) {
Asset memory asset = assets[i];
if (asset.isAbandoned) {
continue;
}
uint assetAmountInSwapOperator = isAssetInSwapOperator(i, _assetsInSwapOperatorBitmap)
? assetInSwapOperator
: 0;
if (i == 0) {
total += assetAmountInSwapOperator;
continue;
}
total += getAssetValueInEth(asset.assetAddress, assetAmountInSwapOperator);
}
return total;
}
function getAsset(uint assetId) external override view returns (Asset memory) {
require(assetId < assets.length, "Pool: Invalid asset id");
return assets[assetId];
}
function getAssets() external override view returns (Asset[] memory) {
return assets;
}
function getAssetSwapDetails(address assetAddress) external view returns (SwapDetails memory) {
return swapDetails[assetAddress];
}
function getAssetId(address assetAddress) public view returns (uint) {
uint assetCount = assets.length;
for (uint i = 0; i < assetCount; i++) {
if (assets[i].assetAddress == assetAddress) {
return i;
}
}
revert AssetNotFound();
}
function isAssetInSwapOperator(uint _assetId, uint _assetsInSwapOperatorBitmap) internal pure returns (bool) {
if (
_assetsInSwapOperatorBitmap != 0 &&
((1 << _assetId) & _assetsInSwapOperatorBitmap == 0)
) {
return false;
}
return true;
}
function addAsset(
address assetAddress,
bool isCoverAsset,
uint _min,
uint _max,
uint _maxSlippageRatio
) external onlyGovernance {
require(assetAddress != address(0), "Pool: Asset is zero address");
require(_max >= _min, "Pool: max < min");
require(_maxSlippageRatio <= MAX_SLIPPAGE_DENOMINATOR, "Pool: Max slippage ratio > 1");
(Aggregator aggregator,) = priceFeedOracle.assets(assetAddress);
require(address(aggregator) != address(0), "Pool: PriceFeedOracle lacks aggregator for asset");
uint assetCount = assets.length;
for (uint i = 0; i < assetCount; i++) {
require(assetAddress != assets[i].assetAddress, "Pool: Asset exists");
}
assets.push(
Asset(
assetAddress,
isCoverAsset,
false
)
);
swapDetails[assetAddress] = SwapDetails(
_min.toUint104(),
_max.toUint104(),
0,
_maxSlippageRatio.toUint16()
);
}
function setAssetDetails(
uint assetId,
bool isCoverAsset,
bool isAbandoned
) external onlyGovernance {
require(assets.length > assetId, "Pool: Asset does not exist");
assets[assetId].isCoverAsset = isCoverAsset;
assets[assetId].isAbandoned = isAbandoned;
}
function setSwapDetails(
address assetAddress,
uint _min,
uint _max,
uint _maxSlippageRatio
) external onlyGovernance {
require(_min <= _max, "Pool: min > max");
require(_maxSlippageRatio <= MAX_SLIPPAGE_DENOMINATOR, "Pool: Max slippage ratio > 1");
uint assetCount = assets.length;
for (uint i = 0; i < assetCount; i++) {
if (assetAddress != assets[i].assetAddress) {
continue;
}
swapDetails[assetAddress].minAmount = _min.toUint104();
swapDetails[assetAddress].maxAmount = _max.toUint104();
swapDetails[assetAddress].maxSlippageRatio = _maxSlippageRatio.toUint16();
return;
}
revert AssetNotFound();
}
function transferAsset(
address assetAddress,
address payable destination,
uint amount
) external onlyGovernance nonReentrant {
require(swapDetails[assetAddress].maxAmount == 0, "Pool: Max not zero");
require(destination != address(0), "Pool: Dest zero");
IERC20 token = IERC20(assetAddress);
uint balance = token.balanceOf(address(this));
uint transferableAmount = amount > balance ? balance : amount;
token.safeTransfer(destination, transferableAmount);
}
function transferAssetToSwapOperator(
address assetAddress,
uint amount
) public override onlySwapOperator nonReentrant whenNotPaused {
if (assetAddress == ETH) {
(bool ok, ) = swapOperator.call{value: amount}("");
require(ok, "Pool: ETH transfer failed");
return;
}
IERC20 token = IERC20(assetAddress);
token.safeTransfer(swapOperator, amount);
}
function setSwapDetailsLastSwapTime(
address assetAddress,
uint32 lastSwapTime
) public override onlySwapOperator whenNotPaused {
swapDetails[assetAddress].lastSwapTime = lastSwapTime;
}
function setSwapAssetAmount(address assetAddress, uint value) external onlySwapOperator whenNotPaused {
uint assetId = getAssetId(assetAddress);
assetInSwapOperator = value;
if (value > 0) {
if (assetsInSwapOperatorBitmap != 0) {
revert OrderInProgress();
}
assetsInSwapOperatorBitmap = uint32(1 << assetId);
} else {
assetsInSwapOperatorBitmap = 0;
}
}
function sendPayout(
uint assetId,
address payable payoutAddress,
uint amount,
uint ethDepositAmount
) external override onlyInternal nonReentrant {
Asset memory asset = assets[assetId];
if (asset.assetAddress == ETH) {
(bool transferSucceeded, ) = payoutAddress.call{value: amount}("");
require(transferSucceeded, "Pool: ETH transfer failed");
} else {
IERC20(asset.assetAddress).safeTransfer(payoutAddress, amount);
}
if (ethDepositAmount > 0) {
(bool transferSucceeded, ) = payoutAddress.call{value: ethDepositAmount}("");
require(transferSucceeded, "Pool: ETH transfer failed");
emit DepositReturned(payoutAddress, ethDepositAmount);
}
emit Payout(payoutAddress, asset.assetAddress, amount);
mcr().updateMCRInternal(true);
}
function sendEth(address member, uint amount) external override onlyRamm nonReentrant {
(bool transferSucceeded, ) = member.call{value: amount}("");
require(transferSucceeded, "Pool: ETH transfer failed");
}
function calculateMCRRatio(
uint totalAssetValue,
uint mcrEth
) public override pure returns (uint) {
return totalAssetValue * (10 ** MCR_RATIO_DECIMALS) / mcrEth;
}
function getInternalTokenPriceInAsset(uint assetId) public view override returns (uint tokenPrice) {
require(assetId < assets.length, "Pool: Unknown cover asset");
address assetAddress = assets[assetId].assetAddress;
uint tokenInternalPrice = ramm().getInternalPrice();
return priceFeedOracle.getAssetForEth(assetAddress, tokenInternalPrice);
}
function getInternalTokenPriceInAssetAndUpdateTwap(uint assetId) public override returns (uint tokenPrice) {
require(assetId < assets.length, "Pool: Unknown cover asset");
address assetAddress = assets[assetId].assetAddress;
uint tokenInternalPrice = ramm().getInternalPriceAndUpdateTwap();
return priceFeedOracle.getAssetForEth(assetAddress, tokenInternalPrice);
}
function getTokenPrice() public override view returns (uint tokenPrice) {
(, tokenPrice) = ramm().getSpotPrices();
return tokenPrice;
}
function getMCRRatio() public override view returns (uint) {
uint totalAssetValue = getPoolValueInEth();
uint mcrEth = mcr().getMCR();
return calculateMCRRatio(totalAssetValue, mcrEth);
}
function upgradeCapitalPool(address payable newPoolAddress) external override onlyMaster nonReentrant {
(bool ok, ) = newPoolAddress.call{value: address(this).balance}("");
require(ok, "Pool: Transfer failed");
uint assetCount = assets.length;
for (uint i = 1; i < assetCount; i++) {
if (assets[i].isAbandoned) {
continue;
}
IERC20 asset = IERC20(assets[i].assetAddress);
uint balance = asset.balanceOf(address(this));
asset.safeTransfer(newPoolAddress, balance);
}
}
function _setPriceFeedOracle(IPriceFeedOracle _priceFeedOracle) internal {
uint assetCount = assets.length;
for (uint i = 1; i < assetCount; i++) {
(Aggregator aggregator,) = _priceFeedOracle.assets(assets[i].assetAddress);
require(address(aggregator) != address(0), "Pool: PriceFeedOracle lacks aggregator for asset");
}
priceFeedOracle = _priceFeedOracle;
}
function updateUintParameters(bytes8 , uint ) external view onlyGovernance {
revert UnknownParameter();
}
function updateAddressParameters(bytes8 code, address value) external onlyGovernance {
if (code == "SWP_OP") {
if (swapOperator != address(0)) {
require(!ISwapOperator(swapOperator).orderInProgress(), 'Pool: Cancel all swaps before changing swapOperator');
}
swapOperator = value;
return;
}
if (code == "PRC_FEED") {
_setPriceFeedOracle(IPriceFeedOracle(value));
return;
}
revert UnknownParameter();
}
function mcr() internal view returns (IMCR) {
return IMCR(internalContracts[uint(ID.MC)]);
}
function ramm() internal view returns (IRamm) {
return IRamm(internalContracts[uint(ID.RA)]);
}
function changeDependentContractAddress() public {
internalContracts[uint(ID.MC)] = master.getLatestAddress("MC");
internalContracts[uint(ID.RA)] = master.getLatestAddress("RA");
internalContracts[uint(ID.MR)] = master.getLatestAddress("MR");
}
}
文件 22 的 25:ReentrancyGuard.sol
pragma solidity ^0.8.0;
abstract contract ReentrancyGuard {
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor() {
_status = _NOT_ENTERED;
}
modifier nonReentrant() {
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
_status = _ENTERED;
_;
_status = _NOT_ENTERED;
}
}
文件 23 的 25:SafeERC20.sol
pragma solidity ^0.8.0;
import "../IERC20.sol";
import "../extensions/draft-IERC20Permit.sol";
import "../../../utils/Address.sol";
library SafeERC20 {
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) + value;
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function safeDecreaseAllowance(
IERC20 token,
address spender,
uint256 value
) internal {
unchecked {
uint256 oldAllowance = token.allowance(address(this), spender);
require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
uint256 newAllowance = oldAllowance - value;
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
}
function safePermit(
IERC20Permit token,
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) internal {
uint256 nonceBefore = token.nonces(owner);
token.permit(owner, spender, value, deadline, v, r, s);
uint256 nonceAfter = token.nonces(owner);
require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed");
}
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");
}
}
}
文件 24 的 25:SafeUintCast.sol
pragma solidity ^0.8.18;
library SafeUintCast {
function toUint248(uint256 value) internal pure returns (uint248) {
require(value < 2**248, "SafeCast: value doesn\'t fit in 248 bits");
return uint248(value);
}
function toUint240(uint256 value) internal pure returns (uint240) {
require(value < 2**240, "SafeCast: value doesn\'t fit in 240 bits");
return uint240(value);
}
function toUint232(uint256 value) internal pure returns (uint232) {
require(value < 2**232, "SafeCast: value doesn\'t fit in 232 bits");
return uint232(value);
}
function toUint224(uint256 value) internal pure returns (uint224) {
require(value < 2**224, "SafeCast: value doesn\'t fit in 224 bits");
return uint224(value);
}
function toUint216(uint256 value) internal pure returns (uint216) {
require(value < 2**216, "SafeCast: value doesn\'t fit in 216 bits");
return uint216(value);
}
function toUint208(uint256 value) internal pure returns (uint208) {
require(value < 2**208, "SafeCast: value doesn\'t fit in 208 bits");
return uint208(value);
}
function toUint200(uint256 value) internal pure returns (uint200) {
require(value < 2**200, "SafeCast: value doesn\'t fit in 200 bits");
return uint200(value);
}
function toUint192(uint256 value) internal pure returns (uint192) {
require(value < 2**192, "SafeCast: value doesn\'t fit in 192 bits");
return uint192(value);
}
function toUint184(uint256 value) internal pure returns (uint184) {
require(value < 2**184, "SafeCast: value doesn\'t fit in 184 bits");
return uint184(value);
}
function toUint176(uint256 value) internal pure returns (uint176) {
require(value < 2**176, "SafeCast: value doesn\'t fit in 176 bits");
return uint176(value);
}
function toUint168(uint256 value) internal pure returns (uint168) {
require(value < 2**168, "SafeCast: value doesn\'t fit in 168 bits");
return uint168(value);
}
function toUint160(uint256 value) internal pure returns (uint160) {
require(value < 2**160, "SafeCast: value doesn\'t fit in 160 bits");
return uint160(value);
}
function toUint152(uint256 value) internal pure returns (uint152) {
require(value < 2**152, "SafeCast: value doesn\'t fit in 152 bits");
return uint152(value);
}
function toUint144(uint256 value) internal pure returns (uint144) {
require(value < 2**144, "SafeCast: value doesn\'t fit in 144 bits");
return uint144(value);
}
function toUint136(uint256 value) internal pure returns (uint136) {
require(value < 2**136, "SafeCast: value doesn\'t fit in 136 bits");
return uint136(value);
}
function toUint128(uint256 value) internal pure returns (uint128) {
require(value < 2**128, "SafeCast: value doesn\'t fit in 128 bits");
return uint128(value);
}
function toUint120(uint256 value) internal pure returns (uint120) {
require(value < 2**120, "SafeCast: value doesn\'t fit in 120 bits");
return uint120(value);
}
function toUint112(uint256 value) internal pure returns (uint112) {
require(value < 2**112, "SafeCast: value doesn\'t fit in 112 bits");
return uint112(value);
}
function toUint104(uint256 value) internal pure returns (uint104) {
require(value < 2**104, "SafeCast: value doesn\'t fit in 104 bits");
return uint104(value);
}
function toUint96(uint256 value) internal pure returns (uint96) {
require(value < 2**96, "SafeCast: value doesn\'t fit in 96 bits");
return uint96(value);
}
function toUint88(uint256 value) internal pure returns (uint88) {
require(value < 2**88, "SafeCast: value doesn\'t fit in 88 bits");
return uint88(value);
}
function toUint80(uint256 value) internal pure returns (uint80) {
require(value < 2**80, "SafeCast: value doesn\'t fit in 80 bits");
return uint80(value);
}
function toUint64(uint256 value) internal pure returns (uint64) {
require(value < 2**64, "SafeCast: value doesn\'t fit in 64 bits");
return uint64(value);
}
function toUint56(uint256 value) internal pure returns (uint56) {
require(value < 2**56, "SafeCast: value doesn\'t fit in 56 bits");
return uint56(value);
}
function toUint48(uint256 value) internal pure returns (uint48) {
require(value < 2**48, "SafeCast: value doesn\'t fit in 48 bits");
return uint48(value);
}
function toUint40(uint256 value) internal pure returns (uint40) {
require(value < 2**40, "SafeCast: value doesn\'t fit in 40 bits");
return uint40(value);
}
function toUint32(uint256 value) internal pure returns (uint32) {
require(value < 2**32, "SafeCast: value doesn\'t fit in 32 bits");
return uint32(value);
}
function toUint24(uint256 value) internal pure returns (uint24) {
require(value < 2**24, "SafeCast: value doesn\'t fit in 24 bits");
return uint24(value);
}
function toUint16(uint256 value) internal pure returns (uint16) {
require(value < 2**16, "SafeCast: value doesn\'t fit in 16 bits");
return uint16(value);
}
function toUint8(uint256 value) internal pure returns (uint8) {
require(value < 2**8, "SafeCast: value doesn\'t fit in 8 bits");
return uint8(value);
}
}
文件 25 的 25:draft-IERC20Permit.sol
pragma solidity ^0.8.0;
interface IERC20Permit {
function permit(
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external;
function nonces(address owner) external view returns (uint256);
function DOMAIN_SEPARATOR() external view returns (bytes32);
}
{
"compilationTarget": {
"contracts/modules/capital/Pool.sol": "Pool"
},
"evmVersion": "paris",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
}
[{"inputs":[{"internalType":"address","name":"_master","type":"address"},{"internalType":"address","name":"_priceOracle","type":"address"},{"internalType":"address","name":"_swapOperator","type":"address"},{"internalType":"address","name":"_nxmTokenAddress","type":"address"},{"internalType":"address","name":"_previousPool","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AssetNotFound","type":"error"},{"inputs":[],"name":"OrderInProgress","type":"error"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"RevertedWithoutReason","type":"error"},{"inputs":[],"name":"UnknownParameter","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"DepositReturned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"address","name":"assetAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Payout","type":"event"},{"inputs":[],"name":"ETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MCR_RATIO_DECIMALS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"assetAddress","type":"address"},{"internalType":"bool","name":"isCoverAsset","type":"bool"},{"internalType":"uint256","name":"_min","type":"uint256"},{"internalType":"uint256","name":"_max","type":"uint256"},{"internalType":"uint256","name":"_maxSlippageRatio","type":"uint256"}],"name":"addAsset","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"assetInSwapOperator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"assets","outputs":[{"internalType":"address","name":"assetAddress","type":"address"},{"internalType":"bool","name":"isCoverAsset","type":"bool"},{"internalType":"bool","name":"isAbandoned","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"assetsInSwapOperatorBitmap","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"totalAssetValue","type":"uint256"},{"internalType":"uint256","name":"mcrEth","type":"uint256"}],"name":"calculateMCRRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"changeDependentContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"masterAddress","type":"address"}],"name":"changeMasterAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"assetId","type":"uint256"}],"name":"getAsset","outputs":[{"components":[{"internalType":"address","name":"assetAddress","type":"address"},{"internalType":"bool","name":"isCoverAsset","type":"bool"},{"internalType":"bool","name":"isAbandoned","type":"bool"}],"internalType":"struct Asset","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"assetAddress","type":"address"}],"name":"getAssetId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"assetAddress","type":"address"}],"name":"getAssetSwapDetails","outputs":[{"components":[{"internalType":"uint104","name":"minAmount","type":"uint104"},{"internalType":"uint104","name":"maxAmount","type":"uint104"},{"internalType":"uint32","name":"lastSwapTime","type":"uint32"},{"internalType":"uint16","name":"maxSlippageRatio","type":"uint16"}],"internalType":"struct SwapDetails","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAssets","outputs":[{"components":[{"internalType":"address","name":"assetAddress","type":"address"},{"internalType":"bool","name":"isCoverAsset","type":"bool"},{"internalType":"bool","name":"isAbandoned","type":"bool"}],"internalType":"struct Asset[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"assetId","type":"uint256"}],"name":"getInternalTokenPriceInAsset","outputs":[{"internalType":"uint256","name":"tokenPrice","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"assetId","type":"uint256"}],"name":"getInternalTokenPriceInAssetAndUpdateTwap","outputs":[{"internalType":"uint256","name":"tokenPrice","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getMCRRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPoolValueInEth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTokenPrice","outputs":[{"internalType":"uint256","name":"tokenPrice","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"internalContracts","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"master","outputs":[{"internalType":"contract INXMMaster","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nxmToken","outputs":[{"internalType":"contract INXMToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceFeedOracle","outputs":[{"internalType":"contract IPriceFeedOracle","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"member","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"sendEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"assetId","type":"uint256"},{"internalType":"address payable","name":"payoutAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"ethDepositAmount","type":"uint256"}],"name":"sendPayout","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"assetId","type":"uint256"},{"internalType":"bool","name":"isCoverAsset","type":"bool"},{"internalType":"bool","name":"isAbandoned","type":"bool"}],"name":"setAssetDetails","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"assetAddress","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setSwapAssetAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"assetAddress","type":"address"},{"internalType":"uint256","name":"_min","type":"uint256"},{"internalType":"uint256","name":"_max","type":"uint256"},{"internalType":"uint256","name":"_maxSlippageRatio","type":"uint256"}],"name":"setSwapDetails","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"assetAddress","type":"address"},{"internalType":"uint32","name":"lastSwapTime","type":"uint32"}],"name":"setSwapDetailsLastSwapTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"swapDetails","outputs":[{"internalType":"uint104","name":"minAmount","type":"uint104"},{"internalType":"uint104","name":"maxAmount","type":"uint104"},{"internalType":"uint32","name":"lastSwapTime","type":"uint32"},{"internalType":"uint16","name":"maxSlippageRatio","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapOperator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"assetAddress","type":"address"},{"internalType":"address payable","name":"destination","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferAsset","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"assetAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferAssetToSwapOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes8","name":"code","type":"bytes8"},{"internalType":"address","name":"value","type":"address"}],"name":"updateAddressParameters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes8","name":"","type":"bytes8"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"updateUintParameters","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"newPoolAddress","type":"address"}],"name":"upgradeCapitalPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]