From f11f09b9329dd2c90c128c49b8d9751358841d37 Mon Sep 17 00:00:00 2001 From: Tomas Pulenta Date: Thu, 23 Feb 2023 08:29:00 -0300 Subject: [PATCH] adding reputationToken to 1.5 subgraph --- .../src/mappings/DAOAvatar/mapping.ts | 11 ++++- .../src/mappings/DAOAvatar/schema.graphql | 2 +- .../mappings/DAOReputation/datasource.yaml | 1 + .../src/mappings/DAOReputation/mapping.ts | 43 +++++++++++++++---- .../src/mappings/DAOReputation/schema.graphql | 13 +++++- 5 files changed, 58 insertions(+), 12 deletions(-) diff --git a/apps/dao-subgraph/src/mappings/DAOAvatar/mapping.ts b/apps/dao-subgraph/src/mappings/DAOAvatar/mapping.ts index 9f932e0d..102c523c 100644 --- a/apps/dao-subgraph/src/mappings/DAOAvatar/mapping.ts +++ b/apps/dao-subgraph/src/mappings/DAOAvatar/mapping.ts @@ -2,7 +2,7 @@ import { log } from '@graphprotocol/graph-ts'; import { OwnershipTransferred } from '../../types/DAOAvatar/DAOAvatar'; import { DAOController as DAOControllerContract } from '../../types/DAOController/DAOController'; -import { DAO } from '../../types/schema'; +import { DAO, ReputationToken } from '../../types/schema'; export function handleOwnershipTransferred(event: OwnershipTransferred): void { const daoId = event.address; @@ -15,7 +15,14 @@ export function handleOwnershipTransferred(event: OwnershipTransferred): void { dao.controllerAddress = controllerAddress.toHexString(); if (repToken.reverted) return; - else dao.reputationToken = repToken.value.toHexString(); + else { + dao.reputationToken = repToken.value.toHexString(); + let reputationToken = ReputationToken.load(repToken.value.toHexString()); + if (reputationToken) { + reputationToken.controllerAddress = controllerAddress.toHexString(); + reputationToken.save(); + } + } dao.save(); } diff --git a/apps/dao-subgraph/src/mappings/DAOAvatar/schema.graphql b/apps/dao-subgraph/src/mappings/DAOAvatar/schema.graphql index 2edfb57a..e8260c49 100644 --- a/apps/dao-subgraph/src/mappings/DAOAvatar/schema.graphql +++ b/apps/dao-subgraph/src/mappings/DAOAvatar/schema.graphql @@ -1,6 +1,6 @@ type DAO @entity { id: ID! - reputationToken: String! + reputationToken: ReputationToken! controllerAddress: String! schemes: [Scheme!] @derivedFrom(field: "avatar") } diff --git a/apps/dao-subgraph/src/mappings/DAOReputation/datasource.yaml b/apps/dao-subgraph/src/mappings/DAOReputation/datasource.yaml index dfa9c38e..7574cb83 100644 --- a/apps/dao-subgraph/src/mappings/DAOReputation/datasource.yaml +++ b/apps/dao-subgraph/src/mappings/DAOReputation/datasource.yaml @@ -1,5 +1,6 @@ entities: - Member + - ReputationToken eventHandlers: - event: Mint(indexed address,uint256) handler: handleMint diff --git a/apps/dao-subgraph/src/mappings/DAOReputation/mapping.ts b/apps/dao-subgraph/src/mappings/DAOReputation/mapping.ts index cff632be..04c15114 100644 --- a/apps/dao-subgraph/src/mappings/DAOReputation/mapping.ts +++ b/apps/dao-subgraph/src/mappings/DAOReputation/mapping.ts @@ -1,39 +1,66 @@ +import { BigInt } from '@graphprotocol/graph-ts'; import { Burn, DAOReputation, Mint, } from '../../types/DAOReputation/DAOReputation'; -import { Member } from '../../types/schema'; -import { BigInt, store } from '@graphprotocol/graph-ts'; +import { Member, ReputationToken } from '../../types/schema'; export function handleMint(event: Mint): void { const tokenAddress = event.address; const repContract = DAOReputation.bind(tokenAddress); + const repTokenId = tokenAddress.toHexString(); - const memberId = `${tokenAddress.toHexString()}-${event.params.to.toHexString()}`; + let reputationToken = ReputationToken.load(repTokenId); + if (!reputationToken) { + reputationToken = new ReputationToken(repTokenId); + reputationToken.address = repTokenId; + reputationToken.name = repContract.name(); + reputationToken.symbol = repContract.symbol(); + reputationToken.amount = BigInt.fromString('0'); + } + reputationToken.amount = reputationToken.amount.plus(event.params.amount); + + reputationToken.controllerAddress = repContract.owner().toHexString(); + + const memberId = `${event.params.to.toHexString()}-${tokenAddress.toHexString()}`; let member = Member.load(memberId); if (!member) { member = new Member(memberId); member.address = event.params.to.toHexString(); + member.reputationToken = repTokenId; } - const reputation = repContract.balanceOf(event.params.to); - member.reputation = reputation; + member.reputationTokenAmount = repContract.balanceOf(event.params.to); member.save(); + reputationToken.save(); } export function handleBurn(event: Burn): void { const tokenAddress = event.address; const repContract = DAOReputation.bind(tokenAddress); - const memberId = `${tokenAddress}-${event.params.from}`; + const repTokenId = tokenAddress.toHexString(); + let reputationToken = ReputationToken.load(repTokenId); + if (!reputationToken) return; + + const memberId = `${event.params.from}-${tokenAddress}`; let member = Member.load(memberId); if (!member) return; - const reputation = repContract.balanceOf(event.params.from); - member.reputation = reputation; + const memberReputationAmount = repContract.balanceOf(event.params.from); + + member.reputationTokenAmount = memberReputationAmount; + + reputationToken.amount = reputationToken.amount.minus(event.params.amount); + + reputationToken.save(); + + if (memberReputationAmount == BigInt.fromString('0')) { + member.unset(memberId); + } member.save(); } diff --git a/apps/dao-subgraph/src/mappings/DAOReputation/schema.graphql b/apps/dao-subgraph/src/mappings/DAOReputation/schema.graphql index 8a9d86a3..7fb31b0c 100644 --- a/apps/dao-subgraph/src/mappings/DAOReputation/schema.graphql +++ b/apps/dao-subgraph/src/mappings/DAOReputation/schema.graphql @@ -1,7 +1,18 @@ +type ReputationToken @entity { + id: ID! + address: String! + members: [Member!] @derivedFrom(field: "reputationToken") + name: String! + symbol: String! + controllerAddress: String! + amount: BigInt! +} + type Member @entity { id: ID! address: String! - reputation: BigInt! + reputationToken: ReputationToken + reputationTokenAmount: BigInt! votes: [Vote!] @derivedFrom(field: "member") }