@@ -286,6 +286,18 @@ export const createOTokenProcessor = (params: {
286
286
},
287
287
}
288
288
289
+ /* Owners which have been pulled or updated in the current context. */
290
+ let ownersChanged = new Map<string, OTokenAddress>()
291
+ let getOwner = async (ctx: Context, address: string, block: Block) => {
292
+ let owner = owners!.get(address)
293
+ if (!owner) {
294
+ owner = await createAddress(ctx, params.otokenAddress, address, block)
295
+ owners!.set(owner.address, owner)
296
+ }
297
+ ownersChanged.set(owner.address, owner)
298
+ return owner
299
+ }
300
+
289
301
await result.initialize()
290
302
291
303
// Prepare data for transfer processing
@@ -347,11 +359,7 @@ export const createOTokenProcessor = (params: {
347
359
.find(({ address }) => address === data.to)!.credits
348
360
349
361
const ensureAddress = async (address: string) => {
350
- let entity = owners!.get(address)
351
- if (!entity) {
352
- entity = await createAddress(ctx, params.otokenAddress, address, block)
353
- owners!.set(entity.address, entity)
354
- }
362
+ let entity = await getOwner(ctx, address, block)
355
363
entity.blockNumber = block.header.height
356
364
entity.lastUpdated = new Date(block.header.timestamp)
357
365
return entity
@@ -601,11 +609,7 @@ export const createOTokenProcessor = (params: {
601
609
const timestamp = new Date(block.header.timestamp)
602
610
const blockNumber = block.header.height
603
611
const otokenObject = await getOTokenObject(block)
604
- let owner = owners!.get(address)
605
- if (!owner) {
606
- owner = await createAddress(ctx, params.otokenAddress, address, block)
607
- owners!.set(address, owner)
608
- }
612
+ let owner = await getOwner(ctx, address, block)
609
613
const rebaseOption = new OTokenRebaseOption({
610
614
id: getUniqueId(`${ctx.chain.id}-${params.otokenAddress}-${hash}-${owner.address}`),
611
615
chainId: ctx.chain.id,
@@ -645,11 +649,7 @@ export const createOTokenProcessor = (params: {
645
649
const sourceAddress = data.source.toLowerCase()
646
650
const targetAddress = data.target.toLowerCase()
647
651
// Source
648
- let sourceOwner = owners!.get(sourceAddress)
649
- if (!sourceOwner) {
650
- sourceOwner = await createAddress(ctx, params.otokenAddress, sourceAddress, block)
651
- owners!.set(sourceAddress, sourceOwner)
652
- }
652
+ let sourceOwner = await getOwner(ctx, sourceAddress, block)
653
653
sourceOwner.rebasingOption = RebasingOption.YieldDelegationSource
654
654
sourceOwner.delegatedTo = targetAddress
655
655
result.rebaseOptions.push(
@@ -666,11 +666,7 @@ export const createOTokenProcessor = (params: {
666
666
}),
667
667
)
668
668
// Target
669
- let targetOwner = owners!.get(targetAddress)
670
- if (!targetOwner) {
671
- targetOwner = await createAddress(ctx, params.otokenAddress, targetAddress, block)
672
- owners!.set(targetAddress, targetOwner)
673
- }
669
+ let targetOwner = await getOwner(ctx, targetAddress, block)
674
670
targetOwner.rebasingOption = RebasingOption.YieldDelegationTarget
675
671
targetOwner.delegatedTo = null
676
672
result.rebaseOptions.push(
@@ -696,11 +692,7 @@ export const createOTokenProcessor = (params: {
696
692
const sourceAddress = data.source.toLowerCase()
697
693
const targetAddress = data.target.toLowerCase()
698
694
// Source
699
- let sourceOwner = owners!.get(sourceAddress)
700
- if (!sourceOwner) {
701
- sourceOwner = await createAddress(ctx, params.otokenAddress, sourceAddress, block)
702
- owners!.set(sourceAddress, sourceOwner)
703
- }
695
+ let sourceOwner = await getOwner(ctx, sourceAddress, block)
704
696
sourceOwner.rebasingOption = RebasingOption.OptOut
705
697
sourceOwner.delegatedTo = null
706
698
result.rebaseOptions.push(
@@ -717,11 +709,7 @@ export const createOTokenProcessor = (params: {
717
709
}),
718
710
)
719
711
// Target
720
- let targetOwner = owners!.get(targetAddress)
721
- if (!targetOwner) {
722
- targetOwner = await createAddress(ctx, params.otokenAddress, targetAddress, block)
723
- owners!.set(targetAddress, targetOwner)
724
- }
712
+ let targetOwner = await getOwner(ctx, targetAddress, block)
725
713
targetOwner.rebasingOption = RebasingOption.OptIn
726
714
targetOwner.delegatedTo = null
727
715
result.rebaseOptions.push(
@@ -1134,7 +1122,8 @@ export const createOTokenProcessor = (params: {
1134
1122
})
1135
1123
result.erc20.states.set(erc20State.id, erc20State)
1136
1124
}
1137
- for (const owner of owners?.values() ?? []) {
1125
+ const ownersToUpdate = [...(ownersChanged.values() ?? [])]
1126
+ for (const owner of ownersToUpdate) {
1138
1127
if (owner.balance === 0n) {
1139
1128
result.erc20.removedHolders.add(owner.address)
1140
1129
} else {
@@ -1202,11 +1191,8 @@ export const createOTokenProcessor = (params: {
1202
1191
time('erc20 instances')
1203
1192
1204
1193
// Save to database
1205
- if (owners) {
1206
- const ownerCount = owners.size
1207
- await ctx.store.upsert([...owners.values()])
1208
- ctx.log.info(`Saved ${ownerCount} OTokenAddress entities`)
1209
- }
1194
+ await ctx.store.upsert(ownersToUpdate)
1195
+ ctx.log.info(`Saved ${ownersToUpdate.length} OTokenAddress entities`)
1210
1196
await ctx.store.upsert(result.apies)
1211
1197
await Promise.all([
1212
1198
ctx.store.upsert(result.otokens), // TODO: Consider changing otoken ID to block number instead of timestamp.
0 commit comments