|
1 | | -import { isEqualContractAddress } from '../contractHelpers.js'; |
2 | 1 | import { type Upward, isKnown } from '../grpc/upward.js'; |
3 | 2 | import { CreatePLTPayload } from '../plt/types.js'; |
4 | 3 | import { AccountTransactionType, TransactionStatusEnum, TransactionSummaryType } from '../types.js'; |
@@ -454,6 +453,14 @@ export function getReceiverAccount(summary: BlockItemSummary): AccountAddress.Ty |
454 | 453 | } |
455 | 454 | } |
456 | 455 |
|
| 456 | +// NOTE: This is O(n*m) i.e. not great, but the expected data set is very small. If that ever changes, |
| 457 | +// consider optimizing. |
| 458 | +function addUnique<T>(list: Upward<T>[], items: T | T[], eq: (a: T, b: T) => boolean): Upward<T>[] { |
| 459 | + const flattened = Array.isArray(items) ? items : [items]; |
| 460 | + const newItems = flattened.filter((i) => !list.filter(isKnown).some((li) => eq(i, li))); |
| 461 | + return [...list, ...newItems]; |
| 462 | +} |
| 463 | + |
457 | 464 | /** |
458 | 465 | * Gets a list of {@link ContractAddress} contract addresses affected by the transaction. |
459 | 466 | * |
@@ -483,14 +490,10 @@ export function affectedContracts(summary: BlockItemSummary): Upward<ContractAdd |
483 | 490 | if (!isKnown(event)) { |
484 | 491 | return [...addresses, null]; |
485 | 492 | } |
486 | | - if ( |
487 | | - event.tag !== TransactionEventTag.Updated || |
488 | | - addresses.filter(isKnown).some(isEqualContractAddress(event.address)) |
489 | | - ) { |
| 493 | + if (event.tag !== TransactionEventTag.Updated) { |
490 | 494 | return addresses; |
491 | 495 | } |
492 | | - |
493 | | - return [...addresses, event.address]; |
| 496 | + return addUnique(addresses, event.address, ContractAddress.equals); |
494 | 497 | }, []); |
495 | 498 | } |
496 | 499 | default: { |
@@ -528,13 +531,32 @@ export function affectedAccounts(summary: BlockItemSummary): Upward<AccountAddre |
528 | 531 | if (!isKnown(event)) { |
529 | 532 | return [...addresses, null]; |
530 | 533 | } |
531 | | - if ( |
532 | | - event.tag === TransactionEventTag.Transferred && |
533 | | - !addresses.filter(isKnown).some(AccountAddress.equals.bind(undefined, event.to)) |
534 | | - ) { |
535 | | - return [...addresses, event.to]; |
| 534 | + if (event.tag !== TransactionEventTag.Transferred) { |
| 535 | + return addresses; |
| 536 | + } |
| 537 | + return addUnique(addresses, event.to, AccountAddress.equals); |
| 538 | + }, |
| 539 | + [summary.sender] |
| 540 | + ); |
| 541 | + } |
| 542 | + case TransactionKindString.TokenUpdate: { |
| 543 | + return summary.events.reduce( |
| 544 | + (addresses: Upward<AccountAddress.Type>[], event) => { |
| 545 | + if (!isKnown(event)) { |
| 546 | + return [...addresses, null]; |
| 547 | + } |
| 548 | + |
| 549 | + switch (event.tag) { |
| 550 | + case TransactionEventTag.TokenTransfer: |
| 551 | + return addUnique(addresses, [event.to.address, event.from.address], AccountAddress.equals); |
| 552 | + case TransactionEventTag.TokenBurn: |
| 553 | + case TransactionEventTag.TokenMint: |
| 554 | + return addUnique(addresses, [event.target.address], AccountAddress.equals); |
| 555 | + case TransactionEventTag.TokenModuleEvent: |
| 556 | + // This only includes the encoded events pertaining to list updates and token pausation, |
| 557 | + // thus not affecting any accounts |
| 558 | + return addresses; |
536 | 559 | } |
537 | | - return addresses; |
538 | 560 | }, |
539 | 561 | [summary.sender] |
540 | 562 | ); |
|
0 commit comments