diff --git a/services/chronikService.ts b/services/chronikService.ts index 95a899454..34e97ab98 100644 --- a/services/chronikService.ts +++ b/services/chronikService.ts @@ -356,6 +356,24 @@ export class ChronikBlockchainClient implements BlockchainClient { } } + private getSortedInputAddresses (transaction: Tx_InNode): string[] { + const addressValueMap = new Map() + + transaction.inputs.forEach((inp) => { + const address = outputScriptToAddress(this.networkSlug, inp.outputScript) + if (address !== undefined && address !== '') { + const currentValue = addressValueMap.get(address) ?? 0 + addressValueMap.set(address, currentValue + inp.value) + } + }) + + const sortedInputAddresses = Array.from(addressValueMap.entries()) + .sort(([, valueA], [, valueB]) => valueB - valueA) + .map(([address]) => address) + + return sortedInputAddresses + } + private async processWsMessage (msg: WsMsgClient): Promise { // delete unconfirmed transaction from our database // if they were cancelled and not confirmed @@ -381,10 +399,11 @@ export class ChronikBlockchainClient implements BlockchainClient { console.log(`${this.CHRONIK_MSG_PREFIX}: [${msg.msgType}] ${msg.txid}`) const transaction = await this.chronik.tx(msg.txid) const addressesWithTransactions = await this.getAddressesForTransaction(transaction) + const inputAddresses = this.getSortedInputAddresses(transaction) for (const addressWithTransaction of addressesWithTransactions) { const { created, tx } = await createTransaction(addressWithTransaction.transaction) if (tx !== undefined) { - const broadcastTxData = this.broadcastIncomingTx(addressWithTransaction.address.address, tx) + const broadcastTxData = this.broadcastIncomingTx(addressWithTransaction.address.address, tx, inputAddresses) if (created) { // only execute trigger for newly added txs await executeAddressTriggers(broadcastTxData, tx.address.networkId) } @@ -402,11 +421,11 @@ export class ChronikBlockchainClient implements BlockchainClient { } } - private broadcastIncomingTx (addressString: string, createdTx: TransactionWithAddressAndPrices): BroadcastTxData { + private broadcastIncomingTx (addressString: string, createdTx: TransactionWithAddressAndPrices, inputAddresses: string[]): BroadcastTxData { const broadcastTxData: BroadcastTxData = {} as BroadcastTxData broadcastTxData.address = addressString broadcastTxData.messageType = 'NewTx' - const newSimplifiedTransaction = getSimplifiedTrasaction(createdTx) + const newSimplifiedTransaction = getSimplifiedTrasaction(createdTx, inputAddresses) broadcastTxData.txs = [newSimplifiedTransaction] try { // emit broadcast for both unconfirmed and confirmed txs this.wsEndpoint.emit(SOCKET_MESSAGES.TXS_BROADCAST, broadcastTxData) @@ -430,10 +449,12 @@ export class ChronikBlockchainClient implements BlockchainClient { } for (const transaction of blockTxsToSync) { const addressesWithTransactions = await this.getAddressesForTransaction(transaction) + const inputAddresses = this.getSortedInputAddresses(transaction) + for (const addressWithTransaction of addressesWithTransactions) { const { created, tx } = await createTransaction(addressWithTransaction.transaction) if (tx !== undefined) { - const broadcastTxData = this.broadcastIncomingTx(addressWithTransaction.address.address, tx) + const broadcastTxData = this.broadcastIncomingTx(addressWithTransaction.address.address, tx, inputAddresses) if (created) { // only execute trigger for newly added txs await executeAddressTriggers(broadcastTxData, tx.address.networkId) } diff --git a/services/transactionService.ts b/services/transactionService.ts index bcb95684f..9d2b014aa 100644 --- a/services/transactionService.ts +++ b/services/transactionService.ts @@ -44,7 +44,7 @@ export function getSimplifiedTransactions (transactionsToPersist: TransactionWit return simplifiedTransactions } -export function getSimplifiedTrasaction (tx: TransactionWithAddressAndPrices): SimplifiedTransaction { +export function getSimplifiedTrasaction (tx: TransactionWithAddressAndPrices, inputAddresses?: string[]): SimplifiedTransaction { const { hash, amount, @@ -64,7 +64,8 @@ export function getSimplifiedTrasaction (tx: TransactionWithAddressAndPrices): S address: address.address, timestamp, message: parsedOpReturn?.message ?? '', - rawMessage: parsedOpReturn?.rawMessage ?? '' + rawMessage: parsedOpReturn?.rawMessage ?? '', + inputAddresses: inputAddresses ?? [] } return simplifiedTransaction diff --git a/ws-service/types.ts b/ws-service/types.ts index a33bcb1b9..827fe5866 100644 --- a/ws-service/types.ts +++ b/ws-service/types.ts @@ -17,6 +17,7 @@ export interface SimplifiedTransaction { timestamp: number address: string rawMessage: string + inputAddresses: string[] } export interface CreateQuoteAndShiftData {