From 07fabfc01ea0b80d2cbe3d6f9913268f185d4c52 Mon Sep 17 00:00:00 2001 From: ErikssonJoakim Date: Thu, 3 Aug 2023 16:13:37 +0200 Subject: [PATCH] feat(mapping): add store object handler --- project.yaml | 2 +- src/index.ts | 2 +- src/mappings/handleStoreObject.ts | 17 +++++++++ src/mappings/mappingHandlers.ts | 62 ------------------------------- src/utils/utils.ts | 8 ++++ 5 files changed, 27 insertions(+), 64 deletions(-) create mode 100644 src/mappings/handleStoreObject.ts delete mode 100644 src/mappings/mappingHandlers.ts create mode 100644 src/utils/utils.ts diff --git a/project.yaml b/project.yaml index cad9796..dfc55ce 100644 --- a/project.yaml +++ b/project.yaml @@ -29,7 +29,7 @@ network: - MsgExecuteContract dataSources: - kind: cosmos/Runtime - startBlock: 2910000 + startBlock: 3492166 mapping: file: ./dist/index.js handlers: diff --git a/src/index.ts b/src/index.ts index 55d8e9c..69e9c6c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,2 +1,2 @@ //Exports all handler functions -export * from './mappings/mappingHandlers' +export * from "./mappings/handleStoreObject"; diff --git a/src/mappings/handleStoreObject.ts b/src/mappings/handleStoreObject.ts new file mode 100644 index 0000000..2de8a57 --- /dev/null +++ b/src/mappings/handleStoreObject.ts @@ -0,0 +1,17 @@ +import type { CosmosMessage } from "@subql/types-cosmos"; +import type { MsgExecuteContract } from "cosmjs-types/cosmwasm/wasm/v1/tx"; +import { ObjectariumObject } from "../types"; +import { getObjectariumObjectId } from "../utils/utils"; + +export const handleStoreObject = async ( + msg: CosmosMessage +): Promise => { + const objectId = getObjectariumObjectId(msg.tx.tx.events); + + objectId && + (await ObjectariumObject.create({ + id: objectId, + sender: msg.msg.decodedMsg.sender, + contract: msg.msg.decodedMsg.contract, + }).save()); +}; diff --git a/src/mappings/mappingHandlers.ts b/src/mappings/mappingHandlers.ts deleted file mode 100644 index 205ba1c..0000000 --- a/src/mappings/mappingHandlers.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { - CosmosEvent, - CosmosMessage, -} from '@subql/types-cosmos'; -import { TransferEvent, Message } from '../types'; - -/* -export async function handleBlock(block: CosmosBlock): Promise { - // If you want to index each block in Cosmos (CosmosHub), you could do that here -} -*/ - -/* -export async function handleTransaction(tx: CosmosTransaction): Promise { - // If you want to index each transaction in Cosmos (CosmosHub), you could do that here - const transactionRecord = Transaction.create({ - id: tx.hash, - blockHeight: BigInt(tx.block.block.header.height), - timestamp: tx.block.block.header.time, - }); - await transactionRecord.save(); -} -*/ - -export async function handleMessage(msg: CosmosMessage): Promise { - const messageRecord = Message.create({ - id: `${msg.tx.hash}-${msg.idx}`, - blockHeight: BigInt(msg.block.block.header.height), - txHash: msg.tx.hash, - from: msg.msg.decodedMsg.fromAddress, - to: msg.msg.decodedMsg.toAddress, - amount: JSON.stringify(msg.msg.decodedMsg.amount), - }); - await messageRecord.save(); -} - -export async function handleEvent(event: CosmosEvent): Promise { - const eventRecord = TransferEvent.create({ - id: `${event.tx.hash}-${event.msg.idx}-${event.idx}`, - blockHeight: BigInt(event.block.block.header.height), - txHash: event.tx.hash, - recipient: '', - amount: '', - sender: '', - }); - for (const attr of event.event.attributes) { - switch (attr.key) { - case 'recipient': - eventRecord.recipient = attr.value; - break; - case 'amount': - eventRecord.amount = attr.value; - break; - case 'sender': - eventRecord.sender = attr.value; - break; - default: - break; - } - } - await eventRecord.save(); -} diff --git a/src/utils/utils.ts b/src/utils/utils.ts new file mode 100644 index 0000000..3e8a5b6 --- /dev/null +++ b/src/utils/utils.ts @@ -0,0 +1,8 @@ +import type { Event } from "@cosmjs/tendermint-rpc/build/tendermint37"; + +export const getObjectariumObjectId = ( + events: Readonly +): string | undefined => + events + .find((event) => event.type === "wasm") + ?.attributes.find((attribute) => attribute.key === "id")?.value;