import BN from 'bn.js'; import { array, publicKey, str, struct, u128, u16, u64, u8 } from '@coral-xyz/borsh'; import { PublicKey } from '@solana/web3.js'; import { Fraction, FractionLayout } from './fraction'; import { BountySchedule, BountyScheduleLayout } from './intents/bounty'; import { MAX_SUPPORTED_TOKENS_PER_BASKET } from '../constants'; import { FormattedBountySchedule } from './intents/intent'; export const MAX_MANAGERS_PER_BASKET = 10; export const MAX_SYMBOL_LENGTH = 10; export const MAX_NAME_LENGTH = 32; export const MAX_URI_LENGTH = 200; export enum BasketType { Private = 0, Public = 1, }; export interface EditCreator { creator: PublicKey; }; export const EditCreatorLayout = struct([ publicKey('creator'), ]); export interface AuthorityBitmasks{ scheduleAuthorityBitmask: number; // u16 feesAuthorityBitmask: number; // u16 managersAuthorityBitmask: number; // u16 automationAuthorityBitmask: number; // u16 lpAuthorityBitmask: number; // u16 metadataAuthorityBitmask: number; // u16 depositsAuthorityBitmask: number; // u16 forceRebalanceAuthorityBitmask: number; // u16 customRebalanceAuthorityBitmask: number; // u16 addTokenIntentAuthorityBitmask: number; // u16 updateWeightsIntentAuthorityBitmask: number; // u16 makeDirectSwapIntentAuthorityBitmask: number; // u16 extraData: number; // u16 extraData1: number; // u16 extraData2: number; // u16 } export const AuthorityBitmasksLayout = struct([ u16('scheduleAuthorityBitmask'), u16('feesAuthorityBitmask'), u16('managersAuthorityBitmask'), u16('automationAuthorityBitmask'), u16('lpAuthorityBitmask'), u16('metadataAuthorityBitmask'), u16('depositsAuthorityBitmask'), u16('forceRebalanceAuthorityBitmask'), u16('customRebalanceAuthorityBitmask'), u16('addTokenIntentAuthorityBitmask'), u16('updateWeightsIntentAuthorityBitmask'), u16('makeDirectSwapIntentAuthorityBitmask'), u16('extraData'), u16('extraData1'), u16('extraData2'), ]); export interface ManagerSettings { managers: PublicKey[]; // [Pubkey; 10] managersWeightBps: number[]; //[u16; 10] modificationDelay: BN; // u64 } export const ManagerSettingsLayout = struct([ array(publicKey(), MAX_MANAGERS_PER_BASKET, 'managers'), array(u16(), MAX_MANAGERS_PER_BASKET, 'managersWeightBps'), u64('modificationDelay'), ]) export interface ManagerSettingsWithAuthorityBitmasks{ managerSettings: ManagerSettings; authorityBitmasks: AuthorityBitmasks; }; export const ManagerSettingsWithAuthorityBitmasksLayout = struct([ ManagerSettingsLayout.replicate('managerSettings'), AuthorityBitmasksLayout.replicate('authorityBitmasks'), ]); export interface HostFees { hostDepositFeeBps: number; hostWithdrawalFeeBps: number; hostManagementFeeBps: number; hostPerformanceFeeBps: number; } export const HostFeesLayout = struct([ u16('hostDepositFeeBps'), u16('hostWithdrawalFeeBps'), u16('hostManagementFeeBps'), u16('hostPerformanceFeeBps'), ]); export interface FeeSettings { hostDepositFeeBps: number; hostWithdrawFeeBps: number, hostManagementFeeBps: number; hostPerformanceFeeBps: number; creatorDepositFeeBps: number; creatorWithdrawFeeBps: number, creatorManagementFeeBps: number; creatorPerformanceFeeBps: number; managersDepositFeeBps: number; managersWithdrawFeeBps: number; managersManagementFeeBps: number; managersPerformanceFeeBps: number; basketDepositFeeBps: number; basketWithdrawFeeBps: number; extraData: number[]; modificationDelay: BN; // u64 -> BN }; export const FeeSettingsLayout = struct([ u16('hostDepositFeeBps'), u16('hostWithdrawFeeBps'), u16('hostManagementFeeBps'), u16('hostPerformanceFeeBps'), u16('creatorDepositFeeBps'), u16('creatorWithdrawFeeBps'), u16('creatorManagementFeeBps'), u16('creatorPerformanceFeeBps'), u16('managersDepositFeeBps'), u16('managersWithdrawFeeBps'), u16('managersManagementFeeBps'), u16('managersPerformanceFeeBps'), u16('basketDepositFeeBps'), u16('basketWithdrawFeeBps'), array(u8(), 32, 'extraData'), u64('modificationDelay'), ]); export interface ScheduleSettings { cycleStartTime: BN; // u64 cycleDuration: BN; // u64 depositsStart: BN; // u64 depositsEnd: BN; // u64 automationStart: BN; // u64 automationEnd: BN; // u64 managementStart: BN; // u64 managementEnd: BN; // u64 modificationDelay: BN; // u64 }; export const ScheduleSettingsLayout = struct([ u64('cycleStartTime'), u64('cycleDuration'), u64('depositsStart'), u64('depositsEnd'), u64('automationStart'), u64('automationEnd'), u64('managementStart'), u64('managementEnd'), u64('modificationDelay'), ]); export interface AutomationSettings { allowAutomation: number; // u8 rebalanceSlippageThresholdBps: number; // u16 perTradeRebalanceSlippageThresholdBps: number; // u16 rebalanceActivationThresholdAbsBps: number; // u16 rebalanceActivationThresholdRelBps: number; // u16 rebalanceActivationCooldown: BN; // u64 -> BN extraData: PublicKey[]; // 128bytes modificationDelay: BN; // u64 -> BN }; export const AutomationSettingsLayout = struct([ u8('allowAutomation'), u16('rebalanceSlippageThresholdBps'), u16('perTradeRebalanceSlippageThresholdBps'), u16('rebalanceActivationThresholdAbsBps'), u16('rebalanceActivationThresholdRelBps'), u64('rebalanceActivationCooldown'), array(publicKey(), 4, 'extraData'), u64('modificationDelay'), ]); export interface LpSettings { allowLp: number; // u8 lpThresholdBps: number; // u16 extraData: number[]; // 32 bytes modificationDelay: BN; // u64 -> BN }; export const LpSettingsLayout = struct([ u8('allowLp'), u16('lpThresholdBps'), array(u8(), 32, 'extraData'), u64('modificationDelay'), ]); export interface MetadataParams { name: string; symbol: string; uri: string; }; export const MetadataParamsLayout = struct([ str("name"), str("symbol"), str("uri"), ]); export interface MetadataSettings { symbolLength: number; // u8 symbol: number[]; // [u8; MAX_SYMBOL_LENGTH] nameLength: number; // u8 name: number[]; // [u8; MAX_NAME_LENGTH] uriLength: number; // u8 uri: number[]; // [u8; MAX_URI_LENGTH] modificationDelay: BN; // u64 }; export const MetadataSettingsLayout = struct([ u8('symbolLength'), array(u8(), MAX_SYMBOL_LENGTH, 'symbol'), u8('nameLength'), array(u8(), MAX_NAME_LENGTH, 'name'), u8('uriLength'), array(u8(), MAX_URI_LENGTH, 'uri'), u64('modificationDelay'), ]); export interface EditAddTokenDelay{ modificationDelay: BN; }; export const EditAddTokenDelayLayout = struct([ u64('modificationDelay'), ]); export interface EditUpdateWeightsDelay{ modificationDelay: BN; }; export const EditUpdateWeightsDelayLayout = struct([ u64('modificationDelay'), ]); export interface EditMakeDirectSwapDelay{ modificationDelay: BN; }; export const EditMakeDirectSwapDelayLayout = struct([ u64('modificationDelay'), ]); export interface UpdateWeights{ tokenWeights: number[]; // [u16; 100] tokenMintsHash: number[]; // [u8; 32] }; export const UpdateWeightsLayout = struct([ array(u16(), MAX_SUPPORTED_TOKENS_PER_BASKET, 'tokenWeights'), array(u8(), 32, 'tokenMintsHash'), ]); export interface MakeDirectSwap { fromTokenMint: PublicKey; toTokenMint: PublicKey; amountFrom: BN; // u64 amountTo: BN; // u64 }; export const MakeDirectSwapLayout = struct([ publicKey('fromTokenMint'), publicKey('toTokenMint'), u64('amountFrom'), u64('amountTo'), ]); export interface BasketSettings { creator: PublicKey, host: PublicKey, basketType: BasketType, bountyMint: PublicKey, bountyBalance: BN; // u64 startPrice: Fraction, highWaterMark: Fraction, activeRebalance: BN; // u64 activeWithdraws: BN; // u64 activeManagements: BN; // u64 lastAutomationExecutionTimestamp: BN; // u64 managers: ManagerSettings, managersLastUpdateTimestamp: BN; // u64 managersAuthorityBitmask: number; // u16 fees: FeeSettings, feesLastUpdateTimestamp: BN; // u64 feesAuthorityBitmask: number; // u16 schedule: ScheduleSettings, scheduleLastUpdateTimestamp: BN; // u64 scheduleAuthorityBitmask: number; // u16 automation: AutomationSettings, automationLastUpdateTimestamp: BN; // u64 automationAuthorityBitmask: number; // u16 lp: LpSettings, lpLastUpdateTimestamp: BN; // u64 lpAuthorityBitmask: number; // u16 metadata: MetadataSettings, metadataLastUpdateTimestamp: BN; // u64 metadataAuthorityBitmask: number; // u16 depositsAreAllowed: number; // u8 depositsAuthorityBitmask: number; // u16 forceRebalanceIsAllowed: number; // u8 forceRebalanceModificationDelay: BN; // u64 forceRebalanceLastUpdateTimestamp: BN; // u64 forceRebalanceAuthorityBitmask: number; // u16 customRebalanceIsAllowed: number; // u8 customRebalanceModificationDelay: BN; // u64 customRebalanceLastUpdateTimestamp: BN; // u64 customRebalanceAuthorityBitmask: number; // u16 addTokenDelay: BN; // u64 addTokenLastUpdateTimestamp: BN; // u64 addTokenIntentAuthorityBitmask: number; // u16 updateWeightsDelay: BN; // u64 updateWeightsLastUpdateTimestamp: BN; // u64 updateWeightsIntentAuthorityBitmask: number; // u16, makeDirectSwapDelay: BN; // u64, makeDirectSwapLastUpdateTimestamp: BN; // u64, makeDirectSwapIntentAuthorityBitmask: number; // u16, extraData: BN[]; // [u64; 32], } export const BasketSettingsLayout = struct([ publicKey('creator'), publicKey('host'), u8('basketType'), publicKey('bountyMint'), u64('bountyBalance'), FractionLayout.replicate('startPrice'), FractionLayout.replicate('highWaterMark'), u64('activeRebalance'), u64('activeWithdraws'), u64('activeManagements'), u64('lastAutomationExecutionTimestamp'), ManagerSettingsLayout.replicate('managers'), u64('managersLastUpdateTimestamp'), u16('managersAuthorityBitmask'), FeeSettingsLayout.replicate('fees'), u64('feesLastUpdateTimestamp'), u16('feesAuthorityBitmask'), ScheduleSettingsLayout.replicate('schedule'), u64('scheduleLastUpdateTimestamp'), u16('scheduleAuthorityBitmask'), AutomationSettingsLayout.replicate('automation'), u64('automationLastUpdateTimestamp'), u16('automationAuthorityBitmask'), LpSettingsLayout.replicate('lp'), u64('lpLastUpdateTimestamp'), u16('lpAuthorityBitmask'), MetadataSettingsLayout.replicate('metadata'), u64('metadataLastUpdateTimestamp'), u16('metadataAuthorityBitmask'), u8('depositsAreAllowed'), u16('depositsAuthorityBitmask'), u8('forceRebalanceIsAllowed'), u64('forceRebalanceModificationDelay'), u64('forceRebalanceLastUpdateTimestamp'), u16('forceRebalanceAuthorityBitmask'), u8('customRebalanceIsAllowed'), u64('customRebalanceModificationDelay'), u64('customRebalanceLastUpdateTimestamp'), u16('customRebalanceAuthorityBitmask'), u64('addTokenDelay'), u64('addTokenLastUpdateTimestamp'), u16('addTokenIntentAuthorityBitmask'), u64('updateWeightsDelay'), u64('updateWeightsLastUpdateTimestamp'), u16('updateWeightsIntentAuthorityBitmask'), u64('makeDirectSwapDelay'), u64('makeDirectSwapLastUpdateTimestamp'), u16('makeDirectSwapIntentAuthorityBitmask'), array(u64(), 32, 'extraData'), ]); export interface FormattedGlobalConfig { pubkey: string; admin: string; owners: string[]; // [Pubkey; 3] total_number_of_baskets: number; allow_interactions: boolean; // u8 allow_creation: boolean; // u8 allow_management: boolean; // u8 allow_automation: boolean; // u8 allow_deposits: boolean; // u8 allow_withdraws: boolean; // u8 max_deposit_fee_bps: number; // u16 max_withdraw_fee_bps: number; // u16 max_management_fee_bps: number; // u16 max_performance_fee_bps: number; // u16 symmetry_fee_collector: string; symmetry_deposit_fee_bps: number; // u16 symmetry_deposit_fee_share_bps: number; // u16 symmetry_withdraw_fee_bps: number; // u16 symmetry_withdraw_fee_share_bps: number; // u16 symmetry_management_fee_bps: number; // u16 symmetry_management_fee_share_bps: number; // u16 symmetry_performance_fee_bps: number; // u16 symmetry_performance_fee_share_bps: number; // u16 symmetry_trade_fee_bps: number; // u16 symmetry_limit_order_fee_bps: number; // u16 bounty_mint: string; min_bounty_for_basket_automation: number; // u64 bounty_bond_amount: number; // u64 bounty_per_task: FormattedBountySchedule; bounty_per_price_update_task_divisor: number; // u64 min_remaining_value: number; min_mint_ratio: number; apr_bps_per_year: number; // u16 rebalance_intent_lifetime: number; // u64 rebalance_auction_1_timeframe: number; // u64 rebalance_auction_2_timeframe: number; // u64 rebalance_auction_3_timeframe: number; // u64 price_update_delay_after_creation: number; // u64 price_update_lifetime: number; // u64 price_update_reexecution_delay: number; // u64 } export interface GlobalConfig { admin: PublicKey; owners: PublicKey[]; // [Pubkey; 3] totalNumberOfBaskets: BN, allowInteractions: number; // u8 allowCreation: number; // u8 allowManagement: number; // u8 allowAutomation: number; // u8 allowDeposits: number; // u8 allowWithdraws: number; // u8 maxDepositFeeBps: number; // u16 maxWithdrawFeeBps: number; // u16 maxManagementFeeBps: number; // u16 maxPerformanceFeeBps: number; // u16 symmetryFeeCollector: PublicKey; symmetryDepositFeeBps: number; // u16 symmetryDepositFeeShareBps: number; // u16 symmetryWithdrawFeeBps: number; // u16 symmetryWithdrawFeeShareBps: number; // u16 symmetryManagementFeeBps: number; // u16 symmetryManagementFeeShareBps: number; // u16 symmetryPerformanceFeeBps: number; // u16 symmetryPerformanceFeeShareBps: number; // u16 symmetryTradeFeeBps: number; // u16 symmetryLimitOrderFeeBps: number; // u16 symmetryFeesExtraData: number[]; // 16bytes bountyMint: PublicKey; minBountyForBasketAutomation: BN; // u64 bountyBondAmount: BN; // u64 bountyPerTask: BountySchedule; bountyPerPriceUpdateTaskDivisor: BN; // u64 minRemainingValue: Fraction; minMintRatio: Fraction; aprBpsPerYear: number; // u16 rebalanceIntentLifetime: BN; // u64 rebalanceAuction1Timeframe: BN; // u64 rebalanceAuction2Timeframe: BN; // u64 rebalanceAuction3Timeframe: BN; // u64 priceUpdateDelayAfterCreation: BN; // u64 priceUpdateLifetime: BN; // u64 priceUpdateReexecutionDelay: BN; // u64 extraData: BN[]; //8 * 32 bytes formatted?: FormattedGlobalConfig; } export const GlobalConfigLayout = struct([ publicKey('admin'), array(publicKey(), 3, 'owners'), u64('totalNumberOfBaskets'), u8('allowInteractions'), u8('allowCreation'), u8('allowManagement'), u8('allowAutomation'), u8('allowDeposits'), u8('allowWithdraws'), u16('maxDepositFeeBps'), u16('maxWithdrawFeeBps'), u16('maxManagementFeeBps'), u16('maxPerformanceFeeBps'), publicKey('symmetryFeeCollector'), u16('symmetryDepositFeeBps'), u16('symmetryDepositFeeShareBps'), u16('symmetryWithdrawFeeBps'), u16('symmetryWithdrawFeeShareBps'), u16('symmetryManagementFeeBps'), u16('symmetryManagementFeeShareBps'), u16('symmetryPerformanceFeeBps'), u16('symmetryPerformanceFeeShareBps'), u16('symmetryTradeFeeBps'), u16('symmetryLimitOrderFeeBps'), array(u8(), 16, 'symmetryFeesExtraData'), publicKey('bountyMint'), u64('minBountyForBasketAutomation'), u64('bountyBondAmount'), BountyScheduleLayout.replicate('bountyPerTask'), u64('bountyPerPriceUpdateTaskDivisor'), FractionLayout.replicate('minRemainingValue'), FractionLayout.replicate('minMintRatio'), u16('aprBpsPerYear'), u64('rebalanceIntentLifetime'), u64('rebalanceAuction1Timeframe'), u64('rebalanceAuction2Timeframe'), u64('rebalanceAuction3Timeframe'), u64('priceUpdateDelayAfterCreation'), u64('priceUpdateLifetime'), u64('priceUpdateReexecutionDelay'), array(u64(), 32, 'extraData'), ]);