Skip to content

Commit d23bf60

Browse files
committed
perf improvements - only update owners which have changed/been pulled in the context.
1 parent 59550ee commit d23bf60

File tree

1 file changed

+22
-36
lines changed

1 file changed

+22
-36
lines changed

src/templates/otoken/otoken.ts

+22-36
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,18 @@ export const createOTokenProcessor = (params: {
286286
},
287287
}
288288

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+
289301
await result.initialize()
290302

291303
// Prepare data for transfer processing
@@ -347,11 +359,7 @@ export const createOTokenProcessor = (params: {
347359
.find(({ address }) => address === data.to)!.credits
348360

349361
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)
355363
entity.blockNumber = block.header.height
356364
entity.lastUpdated = new Date(block.header.timestamp)
357365
return entity
@@ -601,11 +609,7 @@ export const createOTokenProcessor = (params: {
601609
const timestamp = new Date(block.header.timestamp)
602610
const blockNumber = block.header.height
603611
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)
609613
const rebaseOption = new OTokenRebaseOption({
610614
id: getUniqueId(`${ctx.chain.id}-${params.otokenAddress}-${hash}-${owner.address}`),
611615
chainId: ctx.chain.id,
@@ -645,11 +649,7 @@ export const createOTokenProcessor = (params: {
645649
const sourceAddress = data.source.toLowerCase()
646650
const targetAddress = data.target.toLowerCase()
647651
// 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)
653653
sourceOwner.rebasingOption = RebasingOption.YieldDelegationSource
654654
sourceOwner.delegatedTo = targetAddress
655655
result.rebaseOptions.push(
@@ -666,11 +666,7 @@ export const createOTokenProcessor = (params: {
666666
}),
667667
)
668668
// 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)
674670
targetOwner.rebasingOption = RebasingOption.YieldDelegationTarget
675671
targetOwner.delegatedTo = null
676672
result.rebaseOptions.push(
@@ -696,11 +692,7 @@ export const createOTokenProcessor = (params: {
696692
const sourceAddress = data.source.toLowerCase()
697693
const targetAddress = data.target.toLowerCase()
698694
// 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)
704696
sourceOwner.rebasingOption = RebasingOption.OptOut
705697
sourceOwner.delegatedTo = null
706698
result.rebaseOptions.push(
@@ -717,11 +709,7 @@ export const createOTokenProcessor = (params: {
717709
}),
718710
)
719711
// 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)
725713
targetOwner.rebasingOption = RebasingOption.OptIn
726714
targetOwner.delegatedTo = null
727715
result.rebaseOptions.push(
@@ -1134,7 +1122,8 @@ export const createOTokenProcessor = (params: {
11341122
})
11351123
result.erc20.states.set(erc20State.id, erc20State)
11361124
}
1137-
for (const owner of owners?.values() ?? []) {
1125+
const ownersToUpdate = [...(ownersChanged.values() ?? [])]
1126+
for (const owner of ownersToUpdate) {
11381127
if (owner.balance === 0n) {
11391128
result.erc20.removedHolders.add(owner.address)
11401129
} else {
@@ -1202,11 +1191,8 @@ export const createOTokenProcessor = (params: {
12021191
time('erc20 instances')
12031192

12041193
// 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`)
12101196
await ctx.store.upsert(result.apies)
12111197
await Promise.all([
12121198
ctx.store.upsert(result.otokens), // TODO: Consider changing otoken ID to block number instead of timestamp.

0 commit comments

Comments
 (0)