293 lines
9.2 KiB
TypeScript
293 lines
9.2 KiB
TypeScript
import { BN } from '@project-serum/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;
|
|
}
|