Skip to content

Commit 239c9db

Browse files
committed
Add handle PLT events for block item summary helpers
1 parent eee485c commit 239c9db

File tree

1 file changed

+35
-13
lines changed

1 file changed

+35
-13
lines changed

packages/sdk/src/types/blockItemSummary.ts

Lines changed: 35 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { isEqualContractAddress } from '../contractHelpers.js';
21
import { type Upward, isKnown } from '../grpc/upward.js';
32
import { CreatePLTPayload } from '../plt/types.js';
43
import { AccountTransactionType, TransactionStatusEnum, TransactionSummaryType } from '../types.js';
@@ -454,6 +453,14 @@ export function getReceiverAccount(summary: BlockItemSummary): AccountAddress.Ty
454453
}
455454
}
456455

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+
457464
/**
458465
* Gets a list of {@link ContractAddress} contract addresses affected by the transaction.
459466
*
@@ -483,14 +490,10 @@ export function affectedContracts(summary: BlockItemSummary): Upward<ContractAdd
483490
if (!isKnown(event)) {
484491
return [...addresses, null];
485492
}
486-
if (
487-
event.tag !== TransactionEventTag.Updated ||
488-
addresses.filter(isKnown).some(isEqualContractAddress(event.address))
489-
) {
493+
if (event.tag !== TransactionEventTag.Updated) {
490494
return addresses;
491495
}
492-
493-
return [...addresses, event.address];
496+
return addUnique(addresses, event.address, ContractAddress.equals);
494497
}, []);
495498
}
496499
default: {
@@ -528,13 +531,32 @@ export function affectedAccounts(summary: BlockItemSummary): Upward<AccountAddre
528531
if (!isKnown(event)) {
529532
return [...addresses, null];
530533
}
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;
536559
}
537-
return addresses;
538560
},
539561
[summary.sender]
540562
);

0 commit comments

Comments
 (0)