non-fungible-apps/subgraph/src/mint.ts

107 lines
3.3 KiB
TypeScript

import { BigInt, Bytes, log } from '@graphprotocol/graph-ts';
// Event Imports [based on the yaml config]
import { NewMint as NewMintEvent } from '../generated/FleekNFA/FleekNFA';
// Entity Imports [based on the schema]
import {
Owner,
NewMint,
Token,
GitRepository,
Collection,
Verifier,
} from '../generated/schema';
export function handleNewMint(event: NewMintEvent): void {
const newMintEntity = new NewMint(
event.transaction.hash.concatI32(event.logIndex.toI32())
);
const name = event.params.name;
const description = event.params.description;
const externalURL = event.params.externalURL;
const ENS = event.params.ENS;
const gitRepository = event.params.gitRepository;
const ipfsHash = event.params.ipfsHash;
const commitHash = event.params.commitHash;
const logo = event.params.logo;
const color = event.params.color;
const accessPointAutoApproval = event.params.accessPointAutoApproval;
const tokenId = event.params.tokenId;
const ownerAddress = event.params.owner;
const verifierAddress = event.params.verifier;
newMintEntity.tokenId = tokenId;
newMintEntity.name = name;
newMintEntity.description = description;
newMintEntity.externalURL = externalURL;
newMintEntity.ENS = ENS;
newMintEntity.commitHash = commitHash;
newMintEntity.gitRepository = gitRepository;
newMintEntity.ipfsHash = ipfsHash;
newMintEntity.logo = logo;
newMintEntity.color = color;
newMintEntity.accessPointAutoApproval = accessPointAutoApproval;
newMintEntity.triggeredBy = event.params.minter;
newMintEntity.owner = ownerAddress;
newMintEntity.verifier = verifierAddress;
newMintEntity.blockNumber = event.block.number;
newMintEntity.blockTimestamp = event.block.timestamp;
newMintEntity.transactionHash = event.transaction.hash;
newMintEntity.save();
log.error('{}', [tokenId.toString()]);
// Create Token, Owner, and Controller entities
let owner = Owner.load(ownerAddress);
const token = new Token(Bytes.fromByteArray(Bytes.fromBigInt(tokenId)));
if (!owner) {
// Create a new owner entity
owner = new Owner(ownerAddress);
// Since no CollectionRoleChanged event was emitted before for this address, we can set `collection` to false.
owner.collection = false;
}
// Populate Token with data from the event
token.tokenId = tokenId;
token.name = name;
token.description = description;
token.externalURL = externalURL;
token.ENS = ENS;
token.logo = logo;
token.color = color;
token.accessPointAutoApproval = accessPointAutoApproval;
token.owner = ownerAddress;
token.verified = false;
token.mintTransaction = event.transaction.hash.concatI32(
event.logIndex.toI32()
);
token.mintedBy = event.params.minter;
token.controllers = [ownerAddress];
token.createdAt = event.block.timestamp;
if (Verifier.load(verifierAddress)) {
token.verifier = verifierAddress;
}
// Populate GitRepository entity
let repository = GitRepository.load(gitRepository);
if (!repository) {
repository = new GitRepository(gitRepository);
}
// Increase total tokens counter
const collection = Collection.load(event.address);
if (collection) {
collection.totalTokens = collection.totalTokens.plus(BigInt.fromU32(1));
collection.save();
}
// Save entities
owner.save();
token.save();
repository.save();
}