From 80293db8c52d55316885a4801d71a409179b8151 Mon Sep 17 00:00:00 2001 From: Marc-Aurele Besner <82244926+marc-aurele-besner@users.noreply.github.com> Date: Sat, 1 Feb 2025 10:55:24 -0500 Subject: [PATCH 1/3] add support for xdm transfer to domain --- indexers/consensus/schema.graphql | 2 + indexers/consensus/src/mappings/db.ts | 36 +++++------- .../consensus/src/mappings/mappingHandlers.ts | 58 +++++++++++++++---- .../db/docker-entrypoint-initdb.d/init-db.sql | 2 + 4 files changed, 67 insertions(+), 31 deletions(-) diff --git a/indexers/consensus/schema.graphql b/indexers/consensus/schema.graphql index 201303b1..9b27f786 100644 --- a/indexers/consensus/schema.graphql +++ b/indexers/consensus/schema.graphql @@ -97,7 +97,9 @@ type Transfer @entity { extrinsicId: String! eventId: String! from: String! + fromChain: String! to: String! + toChain: String! value: BigInt! fee: BigInt! success: Boolean! diff --git a/indexers/consensus/src/mappings/db.ts b/indexers/consensus/src/mappings/db.ts index edb95f06..75e1222e 100644 --- a/indexers/consensus/src/mappings/db.ts +++ b/indexers/consensus/src/mappings/db.ts @@ -25,11 +25,9 @@ export function createBlock( voteRewardValue: bigint, authorId: string ) { - const id = height.toString(); - const sortId = getSortId(height); return { - id, - sortId, + id: height.toString(), + sortId: getSortId(height), height, hash, timestamp, @@ -54,7 +52,7 @@ export function createBlock( }; } -export function createAndSaveLog( +export function createLog( blockHeight: bigint, blockHash: string, indexInBlock: number, @@ -62,11 +60,9 @@ export function createAndSaveLog( value: string, timestamp: Date ) { - const id = `${blockHeight}-${indexInBlock}`; - const sortId = getSortId(blockHeight, BigInt(indexInBlock)); return { - id, - sortId, + id: blockHeight + "-" + indexInBlock, + sortId: getSortId(blockHeight, BigInt(indexInBlock)), blockHeight, blockHash, indexInBlock, @@ -96,11 +92,9 @@ export function createExtrinsic( pos: number, cid?: string ) { - const extrinsicId = `${blockHeight}-${indexInBlock}`; - const sortId = getSortId(blockHeight, BigInt(indexInBlock)); return { - id: extrinsicId, - sortId, + id: blockHeight + "-" + indexInBlock, + sortId: getSortId(blockHeight, BigInt(indexInBlock)), hash, blockHeight, blockHash, @@ -137,11 +131,9 @@ export function createEvent( args: string, cid?: string ) { - const id = `${blockHeight}-${indexInBlock.toString()}`; - const sortId = getSortId(blockHeight, BigInt(indexInBlock)); return { - id, - sortId, + id: blockHeight + "-" + indexInBlock.toString(), + sortId: getSortId(blockHeight, indexInBlock), blockHeight, blockHash, extrinsicId, @@ -185,21 +177,24 @@ export function createTransfer( extrinsicId: string, eventId: string, from: string, + fromChain: string, to: string, + toChain: string, value: bigint, fee: bigint, success: boolean, timestamp: Date ) { - const id = extrinsicId + "-" + eventId; return { - id, + id: extrinsicId + "-" + eventId, blockHeight, blockHash, extrinsicId, eventId, from, + fromChain, to, + toChain, value, fee, success, @@ -217,9 +212,8 @@ export function createReward( amount: bigint, timestamp: Date ) { - const id = accountId + "-" + eventId; return { - id, + id: accountId + "-" + eventId, blockHeight, blockHash, extrinsicId, diff --git a/indexers/consensus/src/mappings/mappingHandlers.ts b/indexers/consensus/src/mappings/mappingHandlers.ts index 080e30ec..ccc46597 100644 --- a/indexers/consensus/src/mappings/mappingHandlers.ts +++ b/indexers/consensus/src/mappings/mappingHandlers.ts @@ -13,16 +13,18 @@ import { SubstrateBlock } from "@subql/types"; import { Entity } from "@subql/types-core"; import { createAccountHistory, - createAndSaveLog, createBlock, createEvent, createExtrinsic, + createLog, createReward, createTransfer, } from "./db"; import { getBlockAuthor, parseDataToCid } from "./helper"; import { ExtrinsicPrimitive, LogValue } from "./types"; +const CONSENSUS_CHAIN_TYPE = "consensus"; + export async function handleBlock(_block: SubstrateBlock): Promise { const { block: { @@ -133,7 +135,7 @@ export async function handleBlock(_block: SubstrateBlock): Promise { // Detect data storage extrinsics and parse args to cid let cid: string | undefined = ""; - let args: string = stringify(extrinsicMethodToPrimitive.args); + let extrinsicArgs: string = stringify(extrinsicMethodToPrimitive.args); if ( (extrinsic.method.section === "historySeeding" && extrinsic.method.method === "seedHistory") || @@ -144,7 +146,7 @@ export async function handleBlock(_block: SubstrateBlock): Promise { const parsedArgs = parseDataToCid(extrinsicMethodToPrimitive.args.remark); cid = parsedArgs.cid; // The args parameter will be replaced by `{ "cid": "bafkr6i..." }` to minimize the size of the db - args = parsedArgs.modifiedArgs ?? args; + extrinsicArgs = parsedArgs.modifiedArgs ?? extrinsicArgs; } newExtrinsics.push( @@ -161,7 +163,7 @@ export async function handleBlock(_block: SubstrateBlock): Promise { extrinsicSigner, extrinsic.signature.toString(), extrinsicEvents.length, - args, + extrinsicArgs, error, BigInt(extrinsic.tip.toString()), fee, @@ -179,7 +181,7 @@ export async function handleBlock(_block: SubstrateBlock): Promise { // Detect data storage extrinsics and parse args to cid let cid: string | undefined = ""; - let args: string = stringify(event.event.data); + let eventsArgs: string = stringify(event.event.data); if ( event.event.section === "system" && event.event.method === "Remarked" @@ -187,7 +189,7 @@ export async function handleBlock(_block: SubstrateBlock): Promise { const parsedArgs = parseDataToCid(event.event.data[1].toString()); cid = parsedArgs.cid; // The args parameter will be replaced by `{ "cid": "bafkr6i..." }` to minimize the size of the db - args = parsedArgs.modifiedArgs ?? args; + eventsArgs = parsedArgs.modifiedArgs ?? eventsArgs; } newEvents.push( @@ -202,13 +204,13 @@ export async function handleBlock(_block: SubstrateBlock): Promise { blockTimestamp, event.phase.type, pos, - args, + eventsArgs, cid ) ); // Process specific events - switch (`${event.event.section}.${event.event.method}`) { + switch (event.event.section + "." + event.event.method) { case "balances.Transfer": { const from = event.event.data[0].toString(); const to = event.event.data[1].toString(); @@ -225,7 +227,43 @@ export async function handleBlock(_block: SubstrateBlock): Promise { extrinsicId, height + "-" + eventIndex, from, + CONSENSUS_CHAIN_TYPE, + to, + CONSENSUS_CHAIN_TYPE, + amount, + fee, + successEvent ? true : false, + blockTimestamp + ); + newTransfers.push(newTransfer); + + break; + } + case "transporter.OutgoingTransferInitiated": { + const [chainType, domainId] = Object.entries( + extrinsicMethodToPrimitive.args.dst_location.chainId + )[0] as [string, string | undefined]; + const [_, to] = Object.entries( + extrinsicMethodToPrimitive.args.dst_location.accountId + )[0] as [string, string]; + const amount = BigInt( + extrinsicMethodToPrimitive.args.amount.toString() + ); + + addressToUpdate.add(extrinsicSigner); + if (chainType === CONSENSUS_CHAIN_TYPE) addressToUpdate.add(to); + + totalTransferValue += amount; + + const newTransfer = createTransfer( + height, + blockHash, + extrinsicId, + height + "-" + eventIndex, + extrinsicSigner, + CONSENSUS_CHAIN_TYPE, to, + chainType + ":" + domainId, amount, fee, successEvent ? true : false, @@ -264,7 +302,7 @@ export async function handleBlock(_block: SubstrateBlock): Promise { ); // Process specific events - switch (`${event.event.section}.${event.event.method}`) { + switch (event.event.section + "." + event.event.method) { case "rewards.VoteReward": { const voter = event.event.data[0].toString(); const reward = BigInt(event.event.data[1].toString()); @@ -335,7 +373,7 @@ export async function handleBlock(_block: SubstrateBlock): Promise { ? { data: _value[1], engine: _value[0] } : { data: _value }; - return createAndSaveLog( + return createLog( height, blockHash, i, diff --git a/indexers/db/docker-entrypoint-initdb.d/init-db.sql b/indexers/db/docker-entrypoint-initdb.d/init-db.sql index c9ce4a1d..cec52485 100644 --- a/indexers/db/docker-entrypoint-initdb.d/init-db.sql +++ b/indexers/db/docker-entrypoint-initdb.d/init-db.sql @@ -450,7 +450,9 @@ CREATE TABLE consensus.transfers ( extrinsic_id TEXT NOT NULL, event_id TEXT NOT NULL, "from" TEXT NOT NULL, + from_chain TEXT NOT NULL, "to" TEXT NOT NULL, + to_chain TEXT NOT NULL, value NUMERIC NOT NULL, fee NUMERIC NOT NULL, success BOOLEAN NOT NULL, From 4c24b40ab9cdf9edb6629a6f4af15040cfd880ff Mon Sep 17 00:00:00 2001 From: Marc-Aurele Besner <82244926+marc-aurele-besner@users.noreply.github.com> Date: Sat, 1 Feb 2025 10:58:25 -0500 Subject: [PATCH 2/3] add support for balance update on deposit --- indexers/consensus/src/mappings/mappingHandlers.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/indexers/consensus/src/mappings/mappingHandlers.ts b/indexers/consensus/src/mappings/mappingHandlers.ts index ccc46597..8a3adbba 100644 --- a/indexers/consensus/src/mappings/mappingHandlers.ts +++ b/indexers/consensus/src/mappings/mappingHandlers.ts @@ -353,6 +353,13 @@ export async function handleBlock(_block: SubstrateBlock): Promise { break; } + case "balances.Deposit": { + const receiver = event.event.data[0].toString(); + + addressToUpdate.add(receiver); + + break; + } default: break; } From 5ade17f8ccbc9e71397946a2344d28797b495406 Mon Sep 17 00:00:00 2001 From: Marc-Aurele Besner <82244926+marc-aurele-besner@users.noreply.github.com> Date: Sat, 1 Feb 2025 11:00:35 -0500 Subject: [PATCH 3/3] add balance update on burn --- indexers/consensus/src/mappings/mappingHandlers.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/indexers/consensus/src/mappings/mappingHandlers.ts b/indexers/consensus/src/mappings/mappingHandlers.ts index 8a3adbba..e7d280a2 100644 --- a/indexers/consensus/src/mappings/mappingHandlers.ts +++ b/indexers/consensus/src/mappings/mappingHandlers.ts @@ -273,6 +273,10 @@ export async function handleBlock(_block: SubstrateBlock): Promise { break; } + case "balances.Burned": { + addressToUpdate.add(event.event.data[0].toString()); + break; + } default: break; } @@ -354,10 +358,7 @@ export async function handleBlock(_block: SubstrateBlock): Promise { break; } case "balances.Deposit": { - const receiver = event.event.data[0].toString(); - - addressToUpdate.add(receiver); - + addressToUpdate.add(event.event.data[0].toString()); break; } default: