Skip to content

Commit 320e989

Browse files
authored
Merge pull request #2357 from AmbireTech/fix/hyper-evm-balance-changes
Fix/hyper evm balance changes
2 parents f6f8ddb + acb8efc commit 320e989

6 files changed

Lines changed: 941 additions & 12 deletions

File tree

src/controllers/activity/activity.ts

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ import wait from '../../utils/wait'
3737
import EventEmitter from '../eventEmitter/eventEmitter'
3838
import { InternalSignedMessages, SignedMessage } from './types'
3939

40+
import type { BalanceChangesReceipt } from '../../libs/accountOp/balanceChanges'
4041
export interface Pagination {
4142
fromPage: number
4243
itemsPerPage: number
@@ -616,7 +617,8 @@ export class ActivityController extends EventEmitter implements IActivityControl
616617
network,
617618
tokenAddrs,
618619
balanceChangeWindow.receiptBlockNumber,
619-
balanceChangeWindow.prevBlockNumber
620+
balanceChangeWindow.prevBlockNumber,
621+
receipts
620622
)
621623
} catch (error: any) {
622624
console.log(error)
@@ -673,17 +675,19 @@ export class ActivityController extends EventEmitter implements IActivityControl
673675
tokenAddrs: string[]
674676
receiptBlockNumber: number
675677
prevBlockNumber?: number
678+
receipts?: BalanceChangesReceipt[]
676679
}>
677680
) {
678681
await Promise.all(
679682
balanceChangesTasks.map(
680-
({ accountOp, network, tokenAddrs, receiptBlockNumber, prevBlockNumber }) =>
683+
({ accountOp, network, tokenAddrs, receiptBlockNumber, prevBlockNumber, receipts }) =>
681684
this.updateAccountOpBalanceChanges(
682685
accountOp,
683686
network,
684687
tokenAddrs,
685688
receiptBlockNumber,
686-
prevBlockNumber
689+
prevBlockNumber,
690+
receipts
687691
)
688692
)
689693
)
@@ -734,6 +738,7 @@ export class ActivityController extends EventEmitter implements IActivityControl
734738
tokenAddrs: string[]
735739
receiptBlockNumber: number
736740
prevBlockNumber?: number
741+
receipts?: BalanceChangesReceipt[]
737742
}> = []
738743

739744
// we should fetch Safe txns again upon failure
@@ -772,6 +777,7 @@ export class ActivityController extends EventEmitter implements IActivityControl
772777
let lastReceiptBlockNumber: number | undefined
773778
let shouldScheduleBalanceChangesTask = false
774779
const foundTokensForBalanceChanges = new Set<string>()
780+
const receiptsForBalanceChanges: BalanceChangesReceipt[] = []
775781

776782
if (newestOpTimestamp === undefined || newestOpTimestamp < accountOp.timestamp) {
777783
newestOpTimestamp = accountOp.timestamp
@@ -868,6 +874,13 @@ export class ActivityController extends EventEmitter implements IActivityControl
868874
firstReceiptBlockNumber = receipt.blockNumber
869875
}
870876
lastReceiptBlockNumber = receipt.blockNumber
877+
receiptsForBalanceChanges.push({
878+
logs: receipt.logs,
879+
hash: receipt.hash,
880+
from: receipt.from,
881+
gasUsed: receipt.gasUsed,
882+
gasPrice: receipt.gasPrice
883+
})
871884

872885
// if this is an user op, we have to check the logs
873886
let isSuccess: boolean | undefined
@@ -978,7 +991,8 @@ export class ActivityController extends EventEmitter implements IActivityControl
978991
isIdentifiedByMultipleTxn(accountOp.identifiedBy) &&
979992
typeof firstReceiptBlockNumber !== 'undefined'
980993
? getPreviousBlockNumber(firstReceiptBlockNumber)
981-
: undefined
994+
: undefined,
995+
receipts: receiptsForBalanceChanges
982996
})
983997
}
984998
})
@@ -1011,7 +1025,8 @@ export class ActivityController extends EventEmitter implements IActivityControl
10111025
network: Network,
10121026
tokenAddrs: string[],
10131027
receiptBlockNumber: number,
1014-
prevBlockNumber?: number
1028+
prevBlockNumber?: number,
1029+
receipts?: BalanceChangesReceipt[]
10151030
) {
10161031
await this.#initialLoadPromise
10171032

@@ -1028,7 +1043,15 @@ export class ActivityController extends EventEmitter implements IActivityControl
10281043
tokenAddrs,
10291044
receiptBlockNumber,
10301045
getTokenBalancesOnBlock: this.#portfolio.getTokenBalancesOnBlock.bind(this.#portfolio),
1031-
prevBlockNumber
1046+
prevBlockNumber,
1047+
receipts,
1048+
debugTraceTransaction: (txnHash) =>
1049+
network.chainId === 999n
1050+
? this.#providers.providers[network.chainId.toString()]!.send(
1051+
'debug_traceTransaction',
1052+
[txnHash, { tracer: 'callTracer' }]
1053+
)
1054+
: Promise.resolve(null)
10321055
})
10331056

10341057
await this.setAccountOpBalanceChanges(

src/controllers/providers/providers.ts

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { IEventEmitterRegistryController, Statuses } from '../../interfaces/even
55
import { Network } from '../../interfaces/network'
66
import { IProvidersController, RPCProvider, RPCProviders } from '../../interfaces/provider'
77
import { IStorageController } from '../../interfaces/storage'
8+
import type { BalanceChangesReceipt } from '../../libs/accountOp/balanceChanges'
89
import { getAccountOpBalanceChanges } from '../../libs/accountOp/balanceChanges'
910
import { getProviderBatchMaxCount } from '../../libs/networks/networks'
1011
import { GetOptions, Portfolio, TokenResult } from '../../libs/portfolio'
@@ -374,13 +375,15 @@ export class ProvidersController extends EventEmitter implements IProvidersContr
374375
chainId,
375376
tokenAddrs,
376377
blockTag,
377-
accountAddr
378+
accountAddr,
379+
receipts
378380
}: {
379381
accountId: string
380382
chainId: bigint
381383
tokenAddrs: string[]
382384
blockTag: number
383385
accountAddr?: string
386+
receipts?: BalanceChangesReceipt[]
384387
},
385388
requestId: string
386389
) {
@@ -414,7 +417,7 @@ export class ProvidersController extends EventEmitter implements IProvidersContr
414417
portfolioAccountId: string,
415418
_chainId: bigint,
416419
portfolioTokenAddrs: string[],
417-
portfolioBlockTag: number,
420+
portfolioBlockTag: GetOptions['blockTag'],
418421
portfolioAccountAddr?: string
419422
) =>
420423
portfolio.getTokensByAddresses(
@@ -428,7 +431,12 @@ export class ProvidersController extends EventEmitter implements IProvidersContr
428431
chainId,
429432
tokenAddrs,
430433
receiptBlockNumber: blockTag,
431-
getTokenBalancesOnBlock
434+
getTokenBalancesOnBlock,
435+
receipts,
436+
debugTraceTransaction: (txnHash) =>
437+
chainId === 999n
438+
? provider.send('debug_traceTransaction', [txnHash, { tracer: 'callTracer' }])
439+
: Promise.resolve(null)
432440
})
433441

434442
return this.#sendUiMessage({

src/controllers/storage/storage.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ export class StorageController extends EventEmitter implements IStorageControlle
6464
await this.#removeLegacyPhishingDetection() // As of version 5.32.0
6565
await this.#removeLegacyPhishingDetectionV2() // As of version 5.34.0
6666
await this.#cleanUpEmailVaultStorage() // As of version 5.33.5
67+
await this.#resetAccountOpBalanceChangesOneTimeForAmbireNextTesting() // One-time reset after balance changes recalculation fixes
6768
} catch (error) {
6869
console.error('Storage migration error: ', error)
6970
}
@@ -720,6 +721,34 @@ export class StorageController extends EventEmitter implements IStorageControlle
720721
])
721722
}
722723

724+
async #resetAccountOpBalanceChangesOneTimeForAmbireNextTesting() {
725+
const [passedMigrations, accountsOps] = await Promise.all([
726+
this.#storage.get('passedMigrations', []),
727+
this.#storage.get('accountsOps', {})
728+
])
729+
730+
if (passedMigrations.includes('resetAccountOpBalanceChangesOneTimeForAmbireNextTesting')) return
731+
732+
const migratedAccountsOps = Object.fromEntries(
733+
Object.entries(accountsOps).map(([accountId, opsByChain]) => [
734+
accountId,
735+
Object.fromEntries(
736+
Object.entries(opsByChain as Record<string, any[]>).map(([chainId, ops]) => [
737+
chainId,
738+
Array.isArray(ops)
739+
? ops.map(({ balanceChanges, balanceChangesFetchRetryCount, ...op }) => op)
740+
: ops
741+
])
742+
)
743+
])
744+
)
745+
746+
await this.#storage.set('accountsOps', migratedAccountsOps)
747+
await this.#storage.set('passedMigrations', [
748+
...new Set([...passedMigrations, 'resetAccountOpBalanceChangesOneTimeForAmbireNextTesting'])
749+
])
750+
}
751+
723752
toJSON() {
724753
return {
725754
...this,

0 commit comments

Comments
 (0)