Skip to content

Commit

Permalink
[PLA-1512] Fixes incorrect nonce values (#767)
Browse files Browse the repository at this point in the history
* Fetch nonce

* lint

* Update nonce.ts
  • Loading branch information
leonardocustodio authored Dec 18, 2023
1 parent e9b91f8 commit d3ee06f
Show file tree
Hide file tree
Showing 3 changed files with 83 additions and 1 deletion.
1 change: 0 additions & 1 deletion docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ services:
- "5432:5432"
command: [
"postgres",
"-c", "shared_buffer=256MB",
"-c", "max_connections=200"
]

Expand Down
79 changes: 79 additions & 0 deletions src/mappings/util/nonce.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
import { SubstrateBlock } from '@subsquid/substrate-processor'
import { hexToU8a, u8aToHex } from '@polkadot/util'
import { CommonContext } from '../types/contexts'
import { encodeId, isAddressSS58 } from '../../common/tools'
import { Account, Balance } from '../../model'
import { UnknownVersionError } from '../../common/errors'
import { SystemAccountStorage } from '../../types/generated/storage'

async function getSystemAccountBalances(ctx: CommonContext, block: SubstrateBlock, accounts: Uint8Array[]) {
const storage = new SystemAccountStorage(ctx, block)
if (!storage.isExists) return undefined

if (storage.isMatrixEnjinV603) {
return storage.asMatrixEnjinV603.getMany(accounts)
}
if (storage.isV602) {
return storage.asV602.getMany(accounts)
}

if (storage.isV500) {
return storage.asV500.getMany(accounts)
}

throw new UnknownVersionError(storage.constructor.name)
}

async function getNonces(ctx: CommonContext, block: SubstrateBlock, accountIds: Uint8Array[]) {
return getSystemAccountBalances(ctx, block, accountIds)
}

// eslint-disable-next-line sonarjs/cognitive-complexity
export async function fetchNonces(ctx: CommonContext, block: SubstrateBlock, accountIds: Set<string>) {
if (accountIds.size === 0) return

const accountsPublicKey = Array.from(accountIds)
const accountsU8a: Uint8Array[] = accountsPublicKey.map((id) => hexToU8a(id))
const accountInfos = await getNonces(ctx, block, accountsU8a)
if (!accountInfos) {
return
}

const accounts: any[] = []

for (let i = 0; i < accountsPublicKey.length; i += 1) {
const id = accountsPublicKey[i]
const accountInfo = accountInfos[i]
const accountData = accountInfo.data

if ('frozen' in accountData) {
accounts.push({
id,
address: isAddressSS58(accountsU8a[i]) ? encodeId(accountsU8a[i]) : u8aToHex(accountsU8a[i]),
nonce: accountInfo.nonce,
balance: new Balance({
transferable: accountData.free - accountData.frozen,
free: accountData.free,
reserved: accountData.reserved,
feeFrozen: 0n,
miscFrozen: 0n,
}),
})
} else if ('miscFrozen' in accountData) {
accounts.push({
id,
address: isAddressSS58(accountsU8a[i]) ? encodeId(accountsU8a[i]) : u8aToHex(accountsU8a[i]),
nonce: accountInfo.nonce,
balance: new Balance({
transferable: accountData.free - accountData.miscFrozen,
free: accountData.free,
reserved: accountData.reserved,
feeFrozen: accountData.feeFrozen,
miscFrozen: accountData.miscFrozen,
}),
})
}
}

ctx.store.createQueryBuilder().insert().into(Account).values(accounts).orUpdate(['nonce'], ['id']).execute()
}
4 changes: 4 additions & 0 deletions src/processor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import { updateClaimDetails } from './mappings/claims/common'
import { syncAllCollections } from './jobs/collection-stats'
import { metadataQueue } from './jobs/process-metadata'
import { getTankDataFromCall } from './mappings/fuelTanks/common'
import { fetchNonces } from './mappings/util/nonce'

Sentry.init({
dsn: config.sentryDsn,
Expand Down Expand Up @@ -252,6 +253,7 @@ processor.run(
// eslint-disable-next-line no-restricted-syntax
for (const block of ctx.blocks) {
const extrinsics: Extrinsic[] = []
const signers = new Set<string>()
const events: Event[] = []
const accountTokenEvents: AccountTokenEvent[] = []

Expand Down Expand Up @@ -435,11 +437,13 @@ processor.run(
}
}

signers.add(publicKey)
extrinsics.push(extrinsic)
}
}

await map.balances.processor.saveAccounts(ctx as unknown as CommonContext, block.header)
await fetchNonces(ctx as unknown as CommonContext, block.header, signers)
_.chunk(extrinsics, 2000).forEach((chunk) => ctx.store.insert(Extrinsic, chunk as any))
_.chunk(events, 2000).forEach((chunk) => ctx.store.insert(Event, chunk as any))
_.chunk(accountTokenEvents, 2000).forEach((chunk) => ctx.store.insert(AccountTokenEvent, chunk as any))
Expand Down

0 comments on commit d3ee06f

Please sign in to comment.