@@ -503,22 +503,47 @@ export class ChronikBlockchainClient {
503503    } 
504504  } 
505505
506-   private  getSortedInputAddresses  ( transaction : Tx ) : string [ ]  { 
506+   private  getSortedInputAddresses  ( transaction : Tx ) : Array < { address :  string ,   amount :  Prisma . Decimal } >  { 
507507    const  addressSatsMap  =  new  Map < string ,  bigint > ( ) 
508- 
509508    transaction . inputs . forEach ( ( inp )  =>  { 
510509      const  address  =  outputScriptToAddress ( this . networkSlug ,  inp . outputScript ) 
511510      if  ( address  !==  undefined  &&  address  !==  '' )  { 
512511        const  currentValue  =  addressSatsMap . get ( address )  ??  0n 
513512        addressSatsMap . set ( address ,  currentValue  +  inp . sats ) 
514513      } 
515514    } ) 
516- 
515+     const  unitDivisor  =  this . networkId  ===  XEC_NETWORK_ID 
516+       ? 1e2 
517+       : ( this . networkId  ===  BCH_NETWORK_ID  ? 1e8  : 1 ) 
517518    const  sortedInputAddresses  =  Array . from ( addressSatsMap . entries ( ) ) 
518519      . sort ( ( [ ,  valueA ] ,  [ ,  valueB ] )  =>  Number ( valueB  -  valueA ) ) 
519-       . map ( ( [ address ] )  =>  address ) 
520+     return  sortedInputAddresses . map ( ( [ address ,  sats ] )  =>  { 
521+       const  decimal  =  new  Prisma . Decimal ( sats . toString ( ) ) 
522+       const  amount  =  decimal . dividedBy ( unitDivisor ) 
523+       return  {  address,  amount } 
524+     } ) 
525+   } 
520526
521-     return  sortedInputAddresses 
527+   private  getSortedOutputAddresses  ( transaction : Tx ) : Array < { address : string ,  amount : Prisma . Decimal } >  { 
528+     const  addressSatsMap  =  new  Map < string ,  bigint > ( ) 
529+     transaction . outputs . forEach ( ( out )  =>  { 
530+       const  address  =  outputScriptToAddress ( this . networkSlug ,  out . outputScript ) 
531+       if  ( address  !==  undefined  &&  address  !==  '' )  { 
532+         const  currentValue  =  addressSatsMap . get ( address )  ??  0n 
533+         addressSatsMap . set ( address ,  currentValue  +  out . sats ) 
534+       } 
535+     } ) 
536+     const  unitDivisor  =  this . networkId  ===  XEC_NETWORK_ID 
537+       ? 1e2 
538+       : ( this . networkId  ===  BCH_NETWORK_ID  ? 1e8  : 1 ) 
539+     const  sortedOutputAddresses  =  Array . from ( addressSatsMap . entries ( ) ) 
540+       . sort ( ( [ ,  valueA ] ,  [ ,  valueB ] )  =>  Number ( valueB  -  valueA ) ) 
541+       . map ( ( [ address ,  sats ] )  =>  { 
542+         const  decimal  =  new  Prisma . Decimal ( sats . toString ( ) ) 
543+         const  amount  =  decimal . dividedBy ( unitDivisor ) 
544+         return  {  address,  amount } 
545+       } ) 
546+     return  sortedOutputAddresses 
522547  } 
523548
524549  public  async  waitForSyncing  ( txId : string ,  addressStringArray : string [ ] ) : Promise < void >  { 
@@ -565,10 +590,11 @@ export class ChronikBlockchainClient {
565590        const  addressesWithTransactions  =  await  this . getAddressesForTransaction ( transaction ) 
566591        await  this . waitForSyncing ( msg . txid ,  addressesWithTransactions . map ( obj  =>  obj . address . address ) ) 
567592        const  inputAddresses  =  this . getSortedInputAddresses ( transaction ) 
593+         const  outputAddresses  =  this . getSortedOutputAddresses ( transaction ) 
568594        for  ( const  addressWithTransaction  of  addressesWithTransactions )  { 
569595          const  {  created,  tx }  =  await  upsertTransaction ( addressWithTransaction . transaction ) 
570596          if  ( tx  !==  undefined )  { 
571-             const  broadcastTxData  =  this . broadcastIncomingTx ( addressWithTransaction . address . address ,  tx ,  inputAddresses ) 
597+             const  broadcastTxData  =  this . broadcastIncomingTx ( addressWithTransaction . address . address ,  tx ,  inputAddresses ,   outputAddresses ) 
572598            if  ( created )  {  // only execute trigger for newly added txs 
573599              await  executeAddressTriggers ( broadcastTxData ,  tx . address . networkId ) 
574600            } 
@@ -592,11 +618,11 @@ export class ChronikBlockchainClient {
592618    } 
593619  } 
594620
595-   private  broadcastIncomingTx  ( addressString : string ,  createdTx : TransactionWithAddressAndPrices ,  inputAddresses : string [ ] ) : BroadcastTxData  { 
621+   private  broadcastIncomingTx  ( addressString : string ,  createdTx : TransactionWithAddressAndPrices ,  inputAddresses : Array < { address :  string ,   amount :  Prisma . Decimal } > ,   outputAddresses :  Array < { address :  string ,   amount :  Prisma . Decimal } > ) : BroadcastTxData  { 
596622    const  broadcastTxData : BroadcastTxData  =  { }  as  BroadcastTxData 
597623    broadcastTxData . address  =  addressString 
598624    broadcastTxData . messageType  =  'NewTx' 
599-     const  newSimplifiedTransaction  =  getSimplifiedTrasaction ( createdTx ,  inputAddresses ) 
625+     const  newSimplifiedTransaction  =  getSimplifiedTrasaction ( createdTx ,  inputAddresses ,   outputAddresses ) 
600626    broadcastTxData . txs  =  [ newSimplifiedTransaction ] 
601627    try  {  // emit broadcast for both unconfirmed and confirmed txs 
602628      this . wsEndpoint . emit ( SOCKET_MESSAGES . TXS_BROADCAST ,  broadcastTxData ) 
@@ -620,11 +646,12 @@ export class ChronikBlockchainClient {
620646    for  ( const  transaction  of  blockTxsToSync )  { 
621647      const  addressesWithTransactions  =  await  this . getAddressesForTransaction ( transaction ) 
622648      const  inputAddresses  =  this . getSortedInputAddresses ( transaction ) 
649+       const  outputAddresses  =  this . getSortedOutputAddresses ( transaction ) 
623650
624651      for  ( const  addressWithTransaction  of  addressesWithTransactions )  { 
625652        const  {  created,  tx }  =  await  upsertTransaction ( addressWithTransaction . transaction ) 
626653        if  ( tx  !==  undefined )  { 
627-           const  broadcastTxData  =  this . broadcastIncomingTx ( addressWithTransaction . address . address ,  tx ,  inputAddresses ) 
654+           const  broadcastTxData  =  this . broadcastIncomingTx ( addressWithTransaction . address . address ,  tx ,  inputAddresses ,   outputAddresses ) 
628655          if  ( created )  {  // only execute trigger for newly added txs 
629656            await  executeAddressTriggers ( broadcastTxData ,  tx . address . networkId ) 
630657          } 
0 commit comments