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 { Bounty, BountyLayout } from './bounty'; import { FormattedOracleType } from '../oracle'; export type FormattedIntentStatus = "not_active" | "active" | "reverted" | "completed"; export const INTENT_STATUS_STRINGS: Map = new Map([ [0, "not_active"], [1, "active"], [2, "reverted"], [3, "completed"], ]); export type FormattedTaskType = "unknown" | "edit_creator" | "edit_manager_settings" | "edit_fee_settings" | "edit_schedule_settings" | "edit_automation_settings" | "edit_lp_settings" | "edit_metadata_settings" | "edit_deposits_settings" | "edit_force_rebalance_settings" | "edit_custom_rebalance_settings" | "edit_add_token_delay" | "edit_update_weights_delay" | "edit_make_direct_swap_delay" | "add_token" | "update_weights" | "make_direct_swap"; export const TASK_TYPE_STRINGS: Map = new Map([ [0, "unknown"], [1, "edit_creator"], [2, "edit_manager_settings"], [3, "edit_fee_settings"], [4, "edit_schedule_settings"], [5, "edit_automation_settings"], [6, "edit_lp_settings"], [7, "edit_metadata_settings"], [8, "edit_deposits_settings"], [9, "edit_force_rebalance_settings"], [10, "edit_custom_rebalance_settings"], [11, "edit_add_token_delay"], [12, "edit_update_weights_delay"], [13, "edit_make_direct_swap_delay"], [14, "add_token"], [15, "update_weights"], [16, "make_direct_swap"], ]); export interface FormattedBountySchedule { min_bounty: number, max_bounty: number, min_bounty_until: number, max_bounty_after: number, } export interface FormattedBounty { bounty_depositor: string, bounty_mint: string, bounty_per_price_update_task: FormattedBountySchedule, bounty_per_task: FormattedBountySchedule, bounty_total: number, bounty_left: number, } export interface FormattedIntent { pubkey: string, manager: string, status: FormattedIntentStatus, activation_timestamp: number, expiration_timestamp: number, basket: string, bounty: FormattedBounty, task_type: FormattedTaskType, task_data: Settings, } export const INTENT_TASK_DATA_SIZE = 600; export enum IntentStatus { NotActive, Active, Reverted, Completed, }; export interface Intent { manager: PublicKey; status : IntentStatus; activationTimestamp: BN; // u64 expirationTimestamp: BN; // u64 basket: PublicKey; bounty: Bounty; taskType: TaskType; taskData: number[]; // length of 600 ownAddress?: PublicKey; formatted?: FormattedIntent; }; export const IntentLayout = struct([ publicKey('manager'), u8('status'), u64('activationTimestamp'), u64('expirationTimestamp'), publicKey('basket'), BountyLayout.replicate('bounty'), u8('taskType'), array(u8(), INTENT_TASK_DATA_SIZE, 'taskData'), ]); export enum TaskType { Unknown = 0, EditCreator = 1, EditManagerSettings = 2, EditFeeSettings = 3, EditScheduleSettings = 4, EditAutomationSettings = 5, EditLpSettings = 6, EditMetadataSettings = 7, EditDepositsSettings = 8, EditForceRebalanceSettings = 9, EditCustomRebalanceSettings = 10, EditAddTokenDelay = 11, EditUpdateWeightsDelay = 12, EditMakeDirectSwapDelay = 13, AddToken = 14, UpdateWeights = 15, MakeDirectSwap = 16, } // Maps raw u8 values from on-chain Borsh-serialized storage to TaskType enum. // The on-chain program uses sequential Borsh discriminants (11-16) for storage, // but the SDK enum uses non-sequential values (101-103, 201-203) for instruction input. export function taskTypeFromU8(value: number): TaskType { switch (value) { case 1: return TaskType.EditCreator; case 2: return TaskType.EditManagerSettings; case 3: return TaskType.EditFeeSettings; case 4: return TaskType.EditScheduleSettings; case 5: return TaskType.EditAutomationSettings; case 6: return TaskType.EditLpSettings; case 7: return TaskType.EditMetadataSettings; case 8: return TaskType.EditDepositsSettings; case 9: return TaskType.EditForceRebalanceSettings; case 10: return TaskType.EditCustomRebalanceSettings; case 11: return TaskType.EditAddTokenDelay; case 12: return TaskType.EditUpdateWeightsDelay; case 13: return TaskType.EditMakeDirectSwapDelay; case 14: return TaskType.AddToken; case 15: return TaskType.UpdateWeights; case 16: return TaskType.MakeDirectSwap; default: return TaskType.Unknown; } }; export interface TaskContext { basket: string, manager: string, activation_timestamp?: number, expiration_timestamp?: number, min_bounty?: number, max_bounty?: number, } export interface EditCreatorSettings { creator: string, } export interface EditManagerSettings { managers: { pubkey: string; fee_split_weight_bps: number; authorities: { managers: boolean; fees: boolean; schedule: boolean; automation: boolean; lp: boolean; metadata: boolean; deposits: boolean; force_rebalance: boolean; custom_rebalance: boolean; add_token: boolean; update_weights: boolean; make_direct_swap: boolean; }, }[], modification_delay: number, } export interface EditFeeSettings { creator_deposit_fee_bps: number, creator_withdraw_fee_bps: number, creator_management_fee_bps: number, creator_performance_fee_bps: number, managers_deposit_fee_bps: number, managers_withdraw_fee_bps: number, managers_management_fee_bps: number, managers_performance_fee_bps: number, basket_deposit_fee_bps: number, basket_withdraw_fee_bps: number, modification_delay: number, } export interface EditScheduleSettings { cycle_start_time: number, cycle_duration: number, deposits_start: number, deposits_end: number, automation_start: number, automation_end: number, management_start: number, management_end: number, modification_delay: number, } export interface EditAutomationSettings { enabled: boolean, rebalance_slippage_threshold_bps: number, per_trade_rebalance_slippage_threshold_bps: number, rebalance_activation_threshold_abs_bps: number, rebalance_activation_threshold_rel_bps: number, rebalance_activation_cooldown: number, modification_delay: number, } export interface EditLpSettings { enabled: boolean, lp_threshold_bps: number, modification_delay: number, } export interface EditMetadataSettings { symbol: string, name: string, uri: string, modification_delay: number, } export interface EditDepositsSettings { enabled: boolean, } export interface EditForceRebalanceSettings { enabled: boolean, modification_delay: number, } export interface EditCustomRebalanceSettings { enabled: boolean, modification_delay: number, } export interface EditAddTokenSettings { modification_delay: number, } export interface EditUpdateWeightsSettings { modification_delay: number, } export interface EditMakeDirectSwapSettings { modification_delay: number, } export interface OracleInput { oracle_type: FormattedOracleType, account_lut_id: number, account_lut_index: number, account: string, weight: number, is_required: boolean, conf_thresh_bps: number, volatility_thresh_bps: number, max_slippage_bps: number, min_liquidity: number, staleness_thresh: number, staleness_conf_rate_bps: number, token_decimals: number, twap_seconds_ago: number, twap_secondary_seconds_ago: number, } export interface AddOrEditTokenInput { token_mint: string, active: boolean, min_oracles_thresh: number; min_conf_bps: number; conf_thresh_bps: number; conf_multiplier: number; oracles: OracleInput[]; }; export interface UpdateWeightsInput { token_weights: { mint: string, weight_bps: number, }[], token_mints_hash?: number[], } export interface MakeDirectSwapInput { from_token_mint: string, to_token_mint: string, amount_from: number, amount_to: number, } export type Settings = EditCreatorSettings | EditManagerSettings | EditFeeSettings | EditScheduleSettings | EditAutomationSettings | EditLpSettings | EditMetadataSettings | EditDepositsSettings | EditForceRebalanceSettings | EditCustomRebalanceSettings | EditAddTokenSettings | EditUpdateWeightsSettings | EditMakeDirectSwapSettings | AddOrEditTokenInput | UpdateWeightsInput | MakeDirectSwapInput;