From e5eb279453c6e6d7da19f56bd8550b10f95b19f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Estev=C3=A3o?= Date: Tue, 7 Jan 2025 19:28:22 -0300 Subject: [PATCH 1/4] feat: console log trigger execution --- services/triggerService.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/services/triggerService.ts b/services/triggerService.ts index 140e081c0..1245af66e 100644 --- a/services/triggerService.ts +++ b/services/triggerService.ts @@ -244,6 +244,7 @@ export async function executeAddressTriggers (broadcastTxData: BroadcastTxData, } = tx const addressTriggers = await fetchTriggersForAddress(address) + console.log(`[TRIGGER]: Will execute ${addressTriggers.length} triggers for tx ${hash} and address ${address}`) // Send post requests const posterTriggers = addressTriggers.filter(t => !t.isEmailTrigger) From 6e2aaabfd733f9c0c9ef42451139f7fccc211248 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Estev=C3=A3o?= Date: Tue, 7 Jan 2025 22:38:02 -0300 Subject: [PATCH 2/4] feat: execute triggers also for confirmed txs if newly added --- services/chronikService.ts | 15 +++---- services/triggerService.ts | 88 ++++++++++++++++++++------------------ 2 files changed, 53 insertions(+), 50 deletions(-) diff --git a/services/chronikService.ts b/services/chronikService.ts index 6aa605131..95a899454 100644 --- a/services/chronikService.ts +++ b/services/chronikService.ts @@ -385,12 +385,8 @@ export class ChronikBlockchainClient implements BlockchainClient { const { created, tx } = await createTransaction(addressWithTransaction.transaction) if (tx !== undefined) { const broadcastTxData = this.broadcastIncomingTx(addressWithTransaction.address.address, tx) - if (created) { // only execute trigger for unconfirmed tx arriving - try { - await executeAddressTriggers(broadcastTxData, tx.address.networkId) - } catch (err: any) { - console.error(RESPONSE_MESSAGES.COULD_NOT_EXECUTE_TRIGGER_500.message, err.stack) - } + if (created) { // only execute trigger for newly added txs + await executeAddressTriggers(broadcastTxData, tx.address.networkId) } } } @@ -435,9 +431,12 @@ export class ChronikBlockchainClient implements BlockchainClient { for (const transaction of blockTxsToSync) { const addressesWithTransactions = await this.getAddressesForTransaction(transaction) for (const addressWithTransaction of addressesWithTransactions) { - const { tx } = await createTransaction(addressWithTransaction.transaction) + const { created, tx } = await createTransaction(addressWithTransaction.transaction) if (tx !== undefined) { - this.broadcastIncomingTx(addressWithTransaction.address.address, tx) + const broadcastTxData = this.broadcastIncomingTx(addressWithTransaction.address.address, tx) + if (created) { // only execute trigger for newly added txs + await executeAddressTriggers(broadcastTxData, tx.address.networkId) + } } } } diff --git a/services/triggerService.ts b/services/triggerService.ts index 1245af66e..1508ff74f 100644 --- a/services/triggerService.ts +++ b/services/triggerService.ts @@ -231,29 +231,49 @@ interface EmailTriggerLog { } export async function executeAddressTriggers (broadcastTxData: BroadcastTxData, networkId: number): Promise { - const address = broadcastTxData.address - const tx = broadcastTxData.txs[0] - const currency = NETWORK_TICKERS_FROM_ID[networkId] - const { - amount, - hash, - timestamp, - paymentId, - message, - rawMessage - } = tx - - const addressTriggers = await fetchTriggersForAddress(address) - console.log(`[TRIGGER]: Will execute ${addressTriggers.length} triggers for tx ${hash} and address ${address}`) - - // Send post requests - const posterTriggers = addressTriggers.filter(t => !t.isEmailTrigger) - await Promise.all(posterTriggers.map(async (trigger) => { - const postDataParameters: PostDataParameters = { + try { + const address = broadcastTxData.address + const tx = broadcastTxData.txs[0] + const currency = NETWORK_TICKERS_FROM_ID[networkId] + const { + amount, + hash, + timestamp, + paymentId, + message, + rawMessage + } = tx + + const addressTriggers = await fetchTriggersForAddress(address) + console.log(`[TRIGGER]: Will execute ${addressTriggers.length} triggers for tx ${hash} and address ${address}`) + + // Send post requests + const posterTriggers = addressTriggers.filter(t => !t.isEmailTrigger) + await Promise.all(posterTriggers.map(async (trigger) => { + const postDataParameters: PostDataParameters = { + amount, + currency, + txId: hash, + buttonName: trigger.paybutton.name, + address, + timestamp, + opReturn: paymentId !== '' || message !== '' + ? { + paymentId, + message, + rawMessage + } + : EMPTY_OP_RETURN + } + await postDataForTrigger(trigger, postDataParameters) + })) + + // Send emails + const emailTriggers = addressTriggers.filter(t => t.isEmailTrigger) + const sendEmailParameters: Partial = { amount, currency, txId: hash, - buttonName: trigger.paybutton.name, address, timestamp, opReturn: paymentId !== '' || message !== '' @@ -264,29 +284,13 @@ export async function executeAddressTriggers (broadcastTxData: BroadcastTxData, } : EMPTY_OP_RETURN } - await postDataForTrigger(trigger, postDataParameters) - })) - - // Send emails - const emailTriggers = addressTriggers.filter(t => t.isEmailTrigger) - const sendEmailParameters: Partial = { - amount, - currency, - txId: hash, - address, - timestamp, - opReturn: paymentId !== '' || message !== '' - ? { - paymentId, - message, - rawMessage - } - : EMPTY_OP_RETURN + await Promise.all(emailTriggers.map(async (trigger) => { + sendEmailParameters.buttonName = trigger.paybutton.name + await sendEmailForTrigger(trigger, sendEmailParameters as SendEmailParameters) + })) + } catch (err: any) { + console.error(RESPONSE_MESSAGES.COULD_NOT_EXECUTE_TRIGGER_500.message, err.stack) } - await Promise.all(emailTriggers.map(async (trigger) => { - sendEmailParameters.buttonName = trigger.paybutton.name - await sendEmailForTrigger(trigger, sendEmailParameters as SendEmailParameters) - })) } async function fetchUserFromTriggerId (triggerId: string): Promise { From 9a53a3db62e05c1f3f73f9fdfaef0dc2105c019f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Estev=C3=A3o?= Date: Tue, 7 Jan 2025 22:39:14 -0300 Subject: [PATCH 3/4] feat: show network on trigger log --- services/triggerService.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/triggerService.ts b/services/triggerService.ts index 1508ff74f..aee10e6c6 100644 --- a/services/triggerService.ts +++ b/services/triggerService.ts @@ -245,7 +245,7 @@ export async function executeAddressTriggers (broadcastTxData: BroadcastTxData, } = tx const addressTriggers = await fetchTriggersForAddress(address) - console.log(`[TRIGGER]: Will execute ${addressTriggers.length} triggers for tx ${hash} and address ${address}`) + console.log(`[TRIGGER ${currency}]: Will execute ${addressTriggers.length} triggers for tx ${hash} and address ${address}`) // Send post requests const posterTriggers = addressTriggers.filter(t => !t.isEmailTrigger) From 23561a3b4fad03edf95f094678ae89119b7563c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Estev=C3=A3o?= Date: Tue, 7 Jan 2025 23:26:12 -0300 Subject: [PATCH 4/4] feat: early return if no triggers to execute --- services/triggerService.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/services/triggerService.ts b/services/triggerService.ts index aee10e6c6..b09cec3f0 100644 --- a/services/triggerService.ts +++ b/services/triggerService.ts @@ -245,6 +245,7 @@ export async function executeAddressTriggers (broadcastTxData: BroadcastTxData, } = tx const addressTriggers = await fetchTriggersForAddress(address) + if (addressTriggers.length === 0) return console.log(`[TRIGGER ${currency}]: Will execute ${addressTriggers.length} triggers for tx ${hash} and address ${address}`) // Send post requests