mango-v4/ts/client/src/clientIxParamBuilder.ts

293 lines
9.2 KiB
TypeScript

import { BN } from '@coral-xyz/anchor';
import { PublicKey } from '@solana/web3.js';
import { InterestRateParams, OracleConfigParams } from './types';
export interface TokenEditParams {
oracle: PublicKey | null;
oracleConfig: OracleConfigParams | null;
groupInsuranceFund: boolean | null;
interestRateParams: InterestRateParams | null;
loanFeeRate: number | null;
loanOriginationFeeRate: number | null;
maintAssetWeight: number | null;
initAssetWeight: number | null;
maintLiabWeight: number | null;
initLiabWeight: number | null;
liquidationFee: number | null;
stablePriceDelayIntervalSeconds: number | null;
stablePriceDelayGrowthLimit: number | null;
stablePriceGrowthLimit: number | null;
minVaultToDepositsRatio: number | null;
netBorrowLimitPerWindowQuote: number | null;
netBorrowLimitWindowSizeTs: number | null;
borrowWeightScaleStartQuote: number | null;
depositWeightScaleStartQuote: number | null;
resetStablePrice: boolean | null;
resetNetBorrowLimit: boolean | null;
reduceOnly: boolean | null;
}
export const NullTokenEditParams: TokenEditParams = {
oracle: null,
oracleConfig: null,
groupInsuranceFund: null,
interestRateParams: null,
loanFeeRate: null,
loanOriginationFeeRate: null,
maintAssetWeight: null,
initAssetWeight: null,
maintLiabWeight: null,
initLiabWeight: null,
liquidationFee: null,
stablePriceDelayIntervalSeconds: null,
stablePriceDelayGrowthLimit: null,
stablePriceGrowthLimit: null,
minVaultToDepositsRatio: null,
netBorrowLimitPerWindowQuote: null,
netBorrowLimitWindowSizeTs: null,
borrowWeightScaleStartQuote: null,
depositWeightScaleStartQuote: null,
resetStablePrice: null,
resetNetBorrowLimit: null,
reduceOnly: null,
};
export interface PerpEditParams {
oracle: PublicKey | null;
oracleConfig: OracleConfigParams | null;
baseDecimals: number | null;
maintBaseAssetWeight: number | null;
initBaseAssetWeight: number | null;
maintBaseLiabWeight: number | null;
initBaseLiabWeight: number | null;
maintOverallAssetWeight: number | null;
initOverallAssetWeight: number | null;
baseLiquidationFee: number | null;
makerFee: number | null;
takerFee: number | null;
feePenalty: number | null;
minFunding: number | null;
maxFunding: number | null;
impactQuantity: number | null;
groupInsuranceFund: boolean | null;
settleFeeFlat: number | null;
settleFeeAmountThreshold: number | null;
settleFeeFractionLowHealth: number | null;
stablePriceDelayIntervalSeconds: number | null;
stablePriceDelayGrowthLimit: number | null;
stablePriceGrowthLimit: number | null;
settlePnlLimitFactor: number | null;
settlePnlLimitWindowSize: number | null;
reduceOnly: boolean | null;
resetStablePrice: boolean | null;
positivePnlLiquidationFee: number | null;
}
export const NullPerpEditParams: PerpEditParams = {
oracle: null,
oracleConfig: null,
baseDecimals: null,
maintBaseAssetWeight: null,
initBaseAssetWeight: null,
maintBaseLiabWeight: null,
initBaseLiabWeight: null,
maintOverallAssetWeight: null,
initOverallAssetWeight: null,
baseLiquidationFee: null,
makerFee: null,
takerFee: null,
feePenalty: null,
minFunding: null,
maxFunding: null,
impactQuantity: null,
groupInsuranceFund: null,
settleFeeFlat: null,
settleFeeAmountThreshold: null,
settleFeeFractionLowHealth: null,
stablePriceDelayIntervalSeconds: null,
stablePriceDelayGrowthLimit: null,
stablePriceGrowthLimit: null,
settlePnlLimitFactor: null,
settlePnlLimitWindowSize: null,
reduceOnly: null,
resetStablePrice: null,
positivePnlLiquidationFee: null,
};
// Use with TrueIxGateParams and buildIxGate
export interface IxGateParams {
AccountClose: boolean;
AccountCreate: boolean;
AccountEdit: boolean;
AccountExpand: boolean;
AccountToggleFreeze: boolean;
AltExtend: boolean;
AltSet: boolean;
FlashLoan: boolean;
GroupClose: boolean;
GroupCreate: boolean;
GroupToggleHalt: boolean;
HealthRegion: boolean;
PerpCancelAllOrders: boolean;
PerpCancelAllOrdersBySide: boolean;
PerpCancelOrder: boolean;
PerpCancelOrderByClientOrderId: boolean;
PerpCloseMarket: boolean;
PerpConsumeEvents: boolean;
PerpCreateMarket: boolean;
PerpDeactivatePosition: boolean;
PerpEditMarket: boolean;
PerpLiqBaseOrPositivePnl: boolean;
PerpLiqForceCancelOrders: boolean;
PerpLiqNegativePnlOrBankruptcy: boolean;
PerpPlaceOrder: boolean;
PerpSettleFees: boolean;
PerpSettlePnl: boolean;
PerpUpdateFunding: boolean;
Serum3CancelAllOrders: boolean;
Serum3CancelOrder: boolean;
Serum3CloseOpenOrders: boolean;
Serum3CreateOpenOrders: boolean;
Serum3DeregisterMarket: boolean;
Serum3EditMarket: boolean;
Serum3LiqForceCancelOrders: boolean;
Serum3PlaceOrder: boolean;
Serum3RegisterMarket: boolean;
Serum3SettleFunds: boolean;
StubOracleClose: boolean;
StubOracleCreate: boolean;
StubOracleSet: boolean;
TokenAddBank: boolean;
TokenDeposit: boolean;
TokenDeregister: boolean;
TokenEdit: boolean;
TokenLiqBankruptcy: boolean;
TokenLiqWithToken: boolean;
TokenRegister: boolean;
TokenRegisterTrustless: boolean;
TokenUpdateIndexAndRate: boolean;
TokenWithdraw: boolean;
}
// Default with all ixs enabled, use with buildIxGate
export const TrueIxGateParams: IxGateParams = {
AccountClose: true,
AccountCreate: true,
AccountEdit: true,
AccountExpand: true,
AccountToggleFreeze: true,
AltExtend: true,
AltSet: true,
FlashLoan: true,
GroupClose: true,
GroupCreate: true,
GroupToggleHalt: true,
HealthRegion: true,
PerpCancelAllOrders: true,
PerpCancelAllOrdersBySide: true,
PerpCancelOrder: true,
PerpCancelOrderByClientOrderId: true,
PerpCloseMarket: true,
PerpConsumeEvents: true,
PerpCreateMarket: true,
PerpDeactivatePosition: true,
PerpEditMarket: true,
PerpLiqBaseOrPositivePnl: true,
PerpLiqForceCancelOrders: true,
PerpLiqNegativePnlOrBankruptcy: true,
PerpPlaceOrder: true,
PerpSettleFees: true,
PerpSettlePnl: true,
PerpUpdateFunding: true,
Serum3CancelAllOrders: true,
Serum3CancelOrder: true,
Serum3CloseOpenOrders: true,
Serum3CreateOpenOrders: true,
Serum3DeregisterMarket: true,
Serum3EditMarket: true,
Serum3LiqForceCancelOrders: true,
Serum3PlaceOrder: true,
Serum3RegisterMarket: true,
Serum3SettleFunds: true,
StubOracleClose: true,
StubOracleCreate: true,
StubOracleSet: true,
TokenAddBank: true,
TokenDeposit: true,
TokenDeregister: true,
TokenEdit: true,
TokenLiqBankruptcy: true,
TokenLiqWithToken: true,
TokenRegister: true,
TokenRegisterTrustless: true,
TokenUpdateIndexAndRate: true,
TokenWithdraw: true,
};
// build ix gate e.g. buildIxGate(Builder(TrueIxGateParams).TokenDeposit(false).build()).toNumber(),
export function buildIxGate(p: IxGateParams): BN {
const ixGate = new BN(0);
function toggleIx(
ixGate: BN,
p: IxGateParams,
propName: string,
index: number,
): void {
if (p[propName] === undefined) {
throw new Error(`Unknown property ${propName}`);
}
ixGate.ior(p[propName] ? new BN(0) : new BN(1).ushln(index));
}
toggleIx(ixGate, p, 'AccountClose', 0);
toggleIx(ixGate, p, 'AccountCreate', 1);
toggleIx(ixGate, p, 'AccountEdit', 2);
toggleIx(ixGate, p, 'AccountExpand', 3);
toggleIx(ixGate, p, 'AccountToggleFreeze', 4);
toggleIx(ixGate, p, 'AltExtend', 5);
toggleIx(ixGate, p, 'AltSet', 6);
toggleIx(ixGate, p, 'FlashLoan', 7);
toggleIx(ixGate, p, 'GroupClose', 8);
toggleIx(ixGate, p, 'GroupCreate', 9);
toggleIx(ixGate, p, 'HealthRegion', 10);
toggleIx(ixGate, p, 'PerpCancelAllOrders', 11);
toggleIx(ixGate, p, 'PerpCancelAllOrdersBySide', 12);
toggleIx(ixGate, p, 'PerpCancelOrder', 13);
toggleIx(ixGate, p, 'PerpCancelOrderByClientOrderId', 14);
toggleIx(ixGate, p, 'PerpCloseMarket', 15);
toggleIx(ixGate, p, 'PerpConsumeEvents', 16);
toggleIx(ixGate, p, 'PerpCreateMarket', 17);
toggleIx(ixGate, p, 'PerpDeactivatePosition', 18);
toggleIx(ixGate, p, 'PerpLiqBaseOrPositivePnl', 19);
toggleIx(ixGate, p, 'PerpLiqForceCancelOrders', 20);
toggleIx(ixGate, p, 'PerpLiqNegativePnlOrBankruptcy', 21);
toggleIx(ixGate, p, 'PerpPlaceOrder', 22);
toggleIx(ixGate, p, 'PerpSettleFees', 23);
toggleIx(ixGate, p, 'PerpSettlePnl', 24);
toggleIx(ixGate, p, 'PerpUpdateFunding', 25);
toggleIx(ixGate, p, 'Serum3CancelAllOrders', 26);
toggleIx(ixGate, p, 'Serum3CancelOrder', 27);
toggleIx(ixGate, p, 'Serum3CloseOpenOrders', 28);
toggleIx(ixGate, p, 'Serum3CreateOpenOrders', 29);
toggleIx(ixGate, p, 'Serum3DeregisterMarket', 30);
toggleIx(ixGate, p, 'Serum3EditMarket', 31);
toggleIx(ixGate, p, 'Serum3LiqForceCancelOrders', 32);
toggleIx(ixGate, p, 'Serum3PlaceOrder', 33);
toggleIx(ixGate, p, 'Serum3RegisterMarket', 34);
toggleIx(ixGate, p, 'Serum3SettleFunds', 35);
toggleIx(ixGate, p, 'StubOracleClose', 36);
toggleIx(ixGate, p, 'StubOracleCreate', 37);
toggleIx(ixGate, p, 'StubOracleSet', 38);
toggleIx(ixGate, p, 'TokenAddBank', 39);
toggleIx(ixGate, p, 'TokenDeposit', 40);
toggleIx(ixGate, p, 'TokenDeregister', 41);
toggleIx(ixGate, p, 'TokenLiqBankruptcy', 42);
toggleIx(ixGate, p, 'TokenLiqWithToken', 43);
toggleIx(ixGate, p, 'TokenRegister', 44);
toggleIx(ixGate, p, 'TokenRegisterTrustless', 45);
toggleIx(ixGate, p, 'TokenUpdateIndexAndRate', 46);
toggleIx(ixGate, p, 'TokenWithdraw', 47);
return ixGate;
}