Skip to content

Commit

Permalink
add prism for persistence and persist nft state
Browse files Browse the repository at this point in the history
  • Loading branch information
doerfli committed Nov 14, 2024
1 parent 905316f commit 8904054
Show file tree
Hide file tree
Showing 8 changed files with 240 additions and 16 deletions.
4 changes: 3 additions & 1 deletion .devcontainer/devcontainer.json
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,9 @@
// "csstools.postcss",
// "vscodeshift.mui-snippets",
"mikestead.dotenv",
"vscode-icons-team.vscode-icons"
"vscode-icons-team.vscode-icons",
"prisma.prisma",
"ckolkman.vscode-postgres",
]
}
},
Expand Down
10 changes: 6 additions & 4 deletions .devcontainer/docker-compose.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,12 @@ version: '3'


services:
# redis:
# image: redis/redis-stack-server:7.0.6-RC8
# ports:
# - "6379:6379"
db:
image: postgres:alpine
ports:
- "5432:5432"
environment:
- POSTGRES_PASSWORD=password
app:
# See https://aka.ms/vscode-remote/containers/non-root for details.
user: node
Expand Down
153 changes: 145 additions & 8 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,12 @@
"typescript": "^5.4.5"
},
"dependencies": {
"@prisma/client": "^5.22.0",
"@types/express": "^5",
"axios": "^1.7.7",
"dotenv": "^16.4.5",
"express": "^5",
"prisma": "^5.22.0",
"winston": "^3.13.0"
}
}
16 changes: 16 additions & 0 deletions prisma/migrations/20241114134457_init/migration.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
-- CreateTable
CREATE TABLE "Nft" (
"nftId" BIGSERIAL NOT NULL,
"parentNftId" BIGINT NOT NULL DEFAULT 0,
"objectType" TEXT NOT NULL,
"objectAddress" TEXT NOT NULL,
"owner" TEXT NOT NULL,
"created_blockNumber" INTEGER NOT NULL,
"created_txHash" TEXT NOT NULL,
"created_from" TEXT NOT NULL,
"modified_blockNumber" INTEGER NOT NULL,
"modified_txHash" TEXT NOT NULL,
"modified_from" TEXT NOT NULL,

CONSTRAINT "Nft_pkey" PRIMARY KEY ("nftId")
);
3 changes: 3 additions & 0 deletions prisma/migrations/migration_lock.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Please do not edit this file manually
# It should be added in your version-control system (i.e. Git)
provider = "postgresql"
22 changes: 22 additions & 0 deletions prisma/schema.prisma
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}

generator client {
provider = "prisma-client-js"
}

model Nft {
nftId BigInt @id @default(autoincrement())
parentNftId BigInt @default(0)
objectType String
objectAddress String
owner String
created_blockNumber Int
created_txHash String
created_from String
modified_blockNumber Int
modified_txHash String
modified_from String
}
46 changes: 43 additions & 3 deletions src/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ import { logger } from './logger';
import { DecodedLogEntry } from './types/logdata';
import { Nft } from './types/nft';
import { getObjectType, ObjectType } from './types/objecttype';
import { notStrictEqual } from 'assert';
import { PrismaClient } from '@prisma/client';

dotenv.config();

Expand All @@ -17,7 +19,10 @@ BigInt.prototype.toJSON = function () {

class Main {

constructor() {
private prisma: PrismaClient;

constructor(prisma: PrismaClient) {
this.prisma = prisma;
}

public async main(): Promise<void> {
Expand All @@ -32,7 +37,7 @@ class Main {

let nfts = await this.processNftRegistrationEvents(nftRegistrationEvents);
nfts = await this.processNftTransferEvents(nftTransferEvents, nfts);

await this.persistNfts(nfts);

// print one log per event
nfts.forEach(event => {
Expand All @@ -45,6 +50,36 @@ class Main {
// logger.info(`Latest block: ${latestBaseBlock}`);
}

async persistNfts(nfts: Nft[]): Promise<void> {
for (const nft of nfts) {
await this.prisma.nft.upsert({
where: { nftId: nft.nftId as bigint },
update: {
parentNftId: nft.parentNftId as bigint,
objectType: ObjectType[nft.objectType],
objectAddress: nft.objectAddress,
owner: nft.owner,
modified_blockNumber: nft.modified.blockNumber,
modified_txHash: nft.modified.txHash,
modified_from: nft.modified.from
},
create: {
nftId: nft.nftId as bigint,
parentNftId: nft.parentNftId as bigint,
objectType: ObjectType[nft.objectType],
objectAddress: nft.objectAddress,
owner: nft.owner,
created_blockNumber: nft.created.blockNumber,
created_txHash: nft.created.txHash,
created_from: nft.created.from,
modified_blockNumber: nft.modified.blockNumber,
modified_txHash: nft.modified.txHash,
modified_from: nft.modified.from
}
});
}
}

async processNftRegistrationEvents(nftRegistrationEvents: Array<DecodedLogEntry>): Promise<Array<Nft>> {
return nftRegistrationEvents.map(event => {
logger.info(`Processing nft registration event ${event.tx_hash} - ${event.event_name} - ${event.data}`);
Expand Down Expand Up @@ -217,4 +252,9 @@ class Main {

}

new Main().main();
const prisma = new PrismaClient()
try {
new Main(prisma).main();
} finally {
prisma.$disconnect();
}

0 comments on commit 8904054

Please sign in to comment.