import { CreatedPdaAccount, UtxoMetaData } from '@saturnbtcio/arch-sdk'; import { containsOpReturn, getUtxosIdsFromPsbts } from '@saturnbtcio/psbt'; import { Address, NETWORK, OutScript, Transaction } from '@scure/btc-signer'; import { PoolErrorException, PoolErrorType } from '../error/pool.error'; import { CollectionUtxo } from '../wallet/wallet.dto'; export const buildUtxoInfoFromOutputs = ( tx: Transaction, userArchAddress: string, accounts: Array, network: typeof NETWORK, ) => { const utxosInfo: Array = []; for (let i = 0; i < tx.outputsLength; i++) { const output = tx.getOutput(i); if (!output.script || containsOpReturn(output.script)) continue; const address = Address(network).encode(OutScript.decode(output.script)); if ( userArchAddress === address || accounts.find((a) => a.address === address) ) { const utxoId: UtxoMetaData = { txid: tx.id, vout: i, }; utxosInfo.push(utxoId); } } return utxosInfo; }; export const buildUtxoInfoFromInputs = ( psbtBase64: string, walletUtxos: Array, ) => { const inputs: Array = getUtxosIdsFromPsbts([psbtBase64]); const utxosInfo: Array = []; for (const input of inputs) { const utxo = walletUtxos.find((u) => `${u.txid}:${u.vout}` === input); if (!utxo) { throw new PoolErrorException({ type: PoolErrorType.InvalidUtxo, message: `Invalid utxo. Utxo is not in wallet`, utxos: [input], }); } const utxoMetaData: UtxoMetaData = { txid: utxo.txid, vout: utxo.vout, }; utxosInfo.push(utxoMetaData); } return utxosInfo; };