Skip to content

Commit 5928796

Browse files
authored
Merge pull request #984 from PayButton/feat/value-prop-trigger
Feat/value prop trigger
2 parents 6085e27 + 64d92e5 commit 5928796

7 files changed

Lines changed: 32 additions & 10 deletions

File tree

components/Paybutton/PaybuttonTrigger.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,8 @@ export default ({ paybuttonId, emailCredits }: IProps): JSX.Element => {
213213
<div>&lt;opReturn&gt;</div>
214214
<div>&lt;signature&gt;</div>
215215
<div>&lt;inputAddresses&gt;</div>
216+
<div>&lt;value&gt;</div>
217+
216218
</div>
217219
</div>
218220
{/* Tooltip */}

constants/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,8 @@ export const TRIGGER_POST_VARIABLES = [
241241
'<signature>',
242242
'<timestamp>',
243243
'<txId>',
244-
'<inputAddresses>'
244+
'<inputAddresses>',
245+
'<value>'
245246
]
246247

247248
export const PAYBUTTON_TRANSACTIONS_FILE_HEADERS = {

services/transactionService.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import { OpReturnData, parseAddress } from 'utils/validators'
1010
import { generatePaymentFromTx } from 'redis/paymentCache'
1111
import { ButtonDisplayData, Payment } from 'redis/types'
1212

13-
export function getTransactionValue (transaction: TransactionWithPrices | TransactionsWithPaybuttonsAndPrices): QuoteValues {
13+
export function getTransactionValue (transaction: TransactionWithPrices | TransactionsWithPaybuttonsAndPrices | SimplifiedTransaction): QuoteValues {
1414
const ret: QuoteValues = {
1515
usd: new Prisma.Decimal(0),
1616
cad: new Prisma.Decimal(0)
@@ -62,7 +62,8 @@ export function getSimplifiedTrasaction (tx: TransactionWithAddressAndPrices, in
6262
timestamp,
6363
message: parsedOpReturn?.message ?? '',
6464
rawMessage: parsedOpReturn?.rawMessage ?? '',
65-
inputAddresses: inputAddresses ?? []
65+
inputAddresses: inputAddresses ?? [],
66+
prices: tx.prices
6667
}
6768

6869
return simplifiedTransaction

services/triggerService.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
import { PaybuttonTrigger, Prisma, UserProfile } from '@prisma/client'
22
import axios from 'axios'
3-
import { RESPONSE_MESSAGES, NETWORK_TICKERS_FROM_ID } from 'constants/index'
3+
import { RESPONSE_MESSAGES, NETWORK_TICKERS_FROM_ID, SUPPORTED_QUOTES_FROM_ID } from 'constants/index'
44
import prisma from 'prisma/clientInstance'
55
import { EMPTY_OP_RETURN, OpReturnData, parseTriggerPostData } from 'utils/validators'
66
import { BroadcastTxData } from 'ws-service/types'
77
import { fetchPaybuttonById, fetchPaybuttonWithTriggers } from './paybuttonService'
88
import config from 'config'
99
import { MAIL_FROM, MAIL_HTML_REPLACER, MAIL_SUBJECT, getMailerTransporter, SendEmailParameters } from 'constants/mail'
10+
import { getTransactionValue } from './transactionService'
1011

1112
const triggerWithPaybutton = Prisma.validator<Prisma.PaybuttonTriggerDefaultArgs>()({
1213
include: { paybutton: true }
@@ -247,14 +248,16 @@ export async function executeAddressTriggers (broadcastTxData: BroadcastTxData,
247248
rawMessage,
248249
inputAddresses
249250
} = tx
250-
251+
const values = getTransactionValue(tx)
251252
const addressTriggers = await fetchTriggersForAddress(address)
252253
if (addressTriggers.length === 0) return
253254
console.log(`[TRIGGER ${currency}]: Will execute ${addressTriggers.length} triggers for tx ${hash} and address ${address}`)
254255

255256
// Send post requests
256257
const posterTriggers = addressTriggers.filter(t => !t.isEmailTrigger)
257258
await Promise.all(posterTriggers.map(async (trigger) => {
259+
const userProfile = await fetchUserFromTriggerId(trigger.id)
260+
const quoteSlug = SUPPORTED_QUOTES_FROM_ID[userProfile.preferredCurrencyId]
258261
const postDataParameters: PostDataParameters = {
259262
amount,
260263
currency,
@@ -269,8 +272,10 @@ export async function executeAddressTriggers (broadcastTxData: BroadcastTxData,
269272
rawMessage
270273
}
271274
: EMPTY_OP_RETURN,
272-
inputAddresses
275+
inputAddresses,
276+
value: values[quoteSlug].toString()
273277
}
278+
274279
await postDataForTrigger(trigger, postDataParameters)
275280
}))
276281

@@ -391,6 +396,7 @@ export interface PostDataParameters {
391396
address: string
392397
opReturn: OpReturnData
393398
inputAddresses?: string[]
399+
value: string
394400
}
395401

396402
async function postDataForTrigger (trigger: TriggerWithPaybutton, postDataParameters: PostDataParameters): Promise<void> {

tests/unittests/validators.test.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -413,7 +413,8 @@ describe('Signature payload', () => {
413413
message: 'my custom opReturn data',
414414
paymentId: '123paymentId',
415415
rawMessage: 'my custom opReturn data'
416-
}
416+
},
417+
value: '0.0002189581274'
417418
}
418419
it('Gets payload for single variable', () => {
419420
const postData = '{"myVar": 3, "amount": <amount>}'
@@ -457,7 +458,8 @@ describe('Signature payload', () => {
457458
message: '',
458459
paymentId: '',
459460
rawMessage: ''
460-
}
461+
},
462+
value: '0.0002189581274'
461463
}
462464
const postData = '{"id": <txId>, "coin": <currency>, "myVar": 3, "OP_RETURN": <opReturn>, "name": <buttonName>, "amount": <amount>, "ts": <timestamp>}'
463465
const result = v.exportedForTesting.getSignaturePayload(postData, params)
@@ -482,7 +484,8 @@ describe('Sign post data', () => {
482484
message: 'my custom opReturn data',
483485
paymentId: '123paymentId',
484486
rawMessage: 'my custom opReturn data'
485-
}
487+
},
488+
value: '0.0002189581274'
486489
}
487490
it('Sign full payload', () => {
488491
const postData = '{"id": <txId>, "coin": <currency>, "myVar": 3, "OP_RETURN": <opReturn>, "to": <address>, "name": <buttonName>, "amount": <amount>, "ts": <timestamp>}'

utils/validators.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,8 @@ export function parseTriggerPostData ({ userId, postData, postDataParameters }:
273273
.replace('<opReturn>', opReturn)
274274
.replace('<signature>', `${JSON.stringify(signature, undefined, 2)}`)
275275
.replace('<inputAddresses>', `${JSON.stringify(postDataParameters.inputAddresses, undefined, 2)}`)
276+
.replace('<value>', `"${postDataParameters.value}"`)
277+
276278
const parsedResultingData = JSON.parse(resultingData)
277279
return parsedResultingData
278280
} catch (err: any) {
@@ -316,7 +318,8 @@ export const parsePaybuttonTriggerPOSTRequest = function (params: PaybuttonTrigg
316318
address: '',
317319
timestamp: 0,
318320
opReturn: EMPTY_OP_RETURN,
319-
inputAddresses: []
321+
inputAddresses: [],
322+
value: ''
320323
}
321324
const parsed = parseTriggerPostData({
322325
userId: params.userId,

ws-service/types.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,12 @@ export interface SimplifiedTransaction {
1818
address: string
1919
rawMessage: string
2020
inputAddresses: string[]
21+
prices: Array<{
22+
price: {
23+
value: Prisma.Decimal
24+
quoteId: number
25+
}
26+
}>
2127
}
2228

2329
export interface CreateQuoteAndShiftData {

0 commit comments

Comments
 (0)