import { getBitcoinNetwork, toXOnly } from '@saturnbtcio/psbt'; import { SaturnSdkConfig } from '../../saturn-sdk'; import { InitializeProtocolMessageRequest } from './initialize-protocol.dto'; import { validatePoolSdkData } from '../../util/validation'; import { hex } from '@scure/base'; import { createAccountsForInitializeProtocol } from './initialize-protocol.utils'; import { createInitializeProtocolMessage, InitializeProtocolInstruction, } from '@saturnbtcio/pool-serde-sdk'; export class InitializeProtocol { private readonly config: SaturnSdkConfig; constructor(config: SaturnSdkConfig) { this.config = config; } async initializeProtocolMessage(request: InitializeProtocolMessageRequest) { const scureNetwork = getBitcoinNetwork(this.config.network); validatePoolSdkData( request, scureNetwork, ); const accountPromises = createAccountsForInitializeProtocol( this.config.programAccount, this.config.archProvider, ); const accounts = await Promise.all(accountPromises); const initializeProtocolData: InitializeProtocolInstruction = { owner: hex.encode(toXOnly(hex.decode(request.owner))), }; const message = createInitializeProtocolMessage( this.config.programAccount, hex.encode(toXOnly(hex.decode(request.feePayerPubkey))), accounts[0].pubkey, initializeProtocolData, request.recentBlockhash, ); return message; } }