From 35da777a3ce0d755b4c7390e1e5d6aef72d9b635 Mon Sep 17 00:00:00 2001 From: marino <102478601+kemuru@users.noreply.github.com> Date: Thu, 13 Jul 2023 13:36:22 +0200 Subject: [PATCH 1/7] feat(subgraph): add fee token to subgraph --- subgraph/schema.graphql | 9 +++++++++ subgraph/src/KlerosCore.ts | 16 +++++++++++++++- subgraph/src/entities/Round.ts | 2 ++ subgraph/subgraph.yaml | 2 ++ 4 files changed, 28 insertions(+), 1 deletion(-) diff --git a/subgraph/schema.graphql b/subgraph/schema.graphql index 42f78a43b..da91f8e05 100644 --- a/subgraph/schema.graphql +++ b/subgraph/schema.graphql @@ -156,6 +156,7 @@ type Round @entity { penalties: BigInt! drawnJurors: [Draw!]! @derivedFrom(field: "round") dispute: Dispute! + feeToken: FeeToken } type Draw @entity { @@ -188,6 +189,14 @@ type Counter @entity { casesRuled: BigInt! } +type FeeToken @entity { + id: ID! # The address of the ERC20 token. + accepted: Boolean! + rateInEth: BigInt! + rateDecimals: Int! + rounds: [Round!] @derivedFrom(field: "feeToken") +} + ##################### # ClassicDisputeKit # ##################### diff --git a/subgraph/src/KlerosCore.ts b/subgraph/src/KlerosCore.ts index e9ab71e81..26847d509 100644 --- a/subgraph/src/KlerosCore.ts +++ b/subgraph/src/KlerosCore.ts @@ -12,6 +12,7 @@ import { TokenAndETHShift as TokenAndETHShiftEvent, Ruling, StakeDelayed, + AcceptedFeeToken, } from "../generated/KlerosCore/KlerosCore"; import { ZERO, ONE } from "./utils"; import { createCourtFromEvent, getFeeForJuror } from "./entities/Court"; @@ -24,7 +25,7 @@ import { updateJurorDelayedStake, updateJurorStake } from "./entities/JurorToken import { createDrawFromEvent } from "./entities/Draw"; import { createTokenAndEthShiftFromEvent, updateTokenAndEthShiftFromEvent } from "./entities/TokenAndEthShift"; import { updateArbitrableCases } from "./entities/Arbitrable"; -import { Court, Dispute } from "../generated/schema"; +import { Court, Dispute, FeeToken } from "../generated/schema"; import { BigInt } from "@graphprotocol/graph-ts"; import { updatePenalty } from "./entities/Penalty"; @@ -168,3 +169,16 @@ export function handleTokenAndETHShift(event: TokenAndETHShiftEvent): void { updatePenalty(event); court.save(); } + +export function handleAcceptedFeeToken(event: AcceptedFeeToken): void { + let feeToken = new FeeToken(event.params._token.toHexString()); + const contract = KlerosCore.bind(event.address); + + let currencyRate = contract.currencyRates(event.params._token); + + feeToken.accepted = currencyRate.value0; + feeToken.rateInEth = currencyRate.value1; + feeToken.rateDecimals = currencyRate.value2; + + feeToken.save(); +} diff --git a/subgraph/src/entities/Round.ts b/subgraph/src/entities/Round.ts index bb369685e..91451fd04 100644 --- a/subgraph/src/entities/Round.ts +++ b/subgraph/src/entities/Round.ts @@ -16,5 +16,7 @@ export function createRoundFromRoundInfo( round.repartitions = roundInfo.getRepartitions(); round.penalties = roundInfo.getPnkPenalties(); round.dispute = disputeID.toString(); + let feeToken = roundInfo.getFeeToken; + round.feeToken = feeToken ? feeToken.toString() : null; round.save(); } diff --git a/subgraph/subgraph.yaml b/subgraph/subgraph.yaml index d69b93290..3aa625bfe 100644 --- a/subgraph/subgraph.yaml +++ b/subgraph/subgraph.yaml @@ -54,6 +54,8 @@ dataSources: handler: handleTokenAndETHShift - event: Ruling(indexed address,indexed uint256,uint256) handler: handleRuling + - event: AcceptedFeeToken(indexed address,indexed bool) + handler: handleAcceptedFeeToken file: ./src/KlerosCore.ts - kind: ethereum name: PolicyRegistry From 500d28db45fc7649cccf5901171f2b877d182750 Mon Sep 17 00:00:00 2001 From: nhestrompia Date: Fri, 14 Jul 2023 17:33:20 +0300 Subject: [PATCH 2/7] feat: new params in subgraph --- subgraph/schema.graphql | 7 ++++++- subgraph/src/KlerosCore.ts | 14 +++++++++++++- subgraph/src/entities/TokenAndEthShift.ts | 14 ++++++++------ 3 files changed, 27 insertions(+), 8 deletions(-) diff --git a/subgraph/schema.graphql b/subgraph/schema.graphql index da91f8e05..89bcb877d 100644 --- a/subgraph/schema.graphql +++ b/subgraph/schema.graphql @@ -96,8 +96,10 @@ type TokenAndETHShift @entity { id: ID! # user.id-dispute.id juror: User! dispute: Dispute! - tokenAmount: BigInt! + pnkAmount: BigInt! ethAmount: BigInt! + feeToken: FeeToken + feeTokenAmount: BigInt } type JurorTokensPerCourt @entity { @@ -194,7 +196,10 @@ type FeeToken @entity { accepted: Boolean! rateInEth: BigInt! rateDecimals: Int! + totalPaid: BigInt + totalPaidInETH: BigInt rounds: [Round!] @derivedFrom(field: "feeToken") + tokenAndETHShift: [TokenAndETHShift!] @derivedFrom(field: "feeToken") } ##################### diff --git a/subgraph/src/KlerosCore.ts b/subgraph/src/KlerosCore.ts index 26847d509..85189979d 100644 --- a/subgraph/src/KlerosCore.ts +++ b/subgraph/src/KlerosCore.ts @@ -155,12 +155,23 @@ export function handleTokenAndETHShift(event: TokenAndETHShiftEvent): void { const disputeID = event.params._disputeID.toString(); const pnkAmount = event.params._pnkAmount; const feeAmount = event.params._feeAmount; + const feeToken = FeeToken.load(event.params._feeToken.toHexString()); + const contract = KlerosCore.bind(event.address); + const currencyRate = contract.currencyRates(event.params._feeToken); + if (!feeToken) return; + const paidETH = feeAmount.plus(currencyRate.value1); + const dispute = Dispute.load(disputeID); if (!dispute) return; const court = Court.load(dispute.court); if (!court) return; + const paidFeeToken = contract.convertEthToTokenAmount(event.params._feeToken, court.feeForJuror); + if (feeToken.totalPaidInETH && feeToken.totalPaid) { + feeToken.totalPaidInETH = feeToken.totalPaidInETH!.plus(currencyRate.value1); + feeToken.totalPaid = feeToken.totalPaid!.plus(paidFeeToken); + } updateJurorStake(jurorAddress, court.id, KlerosCore.bind(event.address), event.block.timestamp); - court.paidETH = court.paidETH.plus(feeAmount); + court.paidETH = court.paidETH.plus(paidETH); if (pnkAmount.gt(ZERO)) { court.paidPNK = court.paidPNK.plus(pnkAmount); updateRedistributedPNK(pnkAmount, event.block.timestamp); @@ -168,6 +179,7 @@ export function handleTokenAndETHShift(event: TokenAndETHShiftEvent): void { updatePaidETH(feeAmount, event.block.timestamp); updatePenalty(event); court.save(); + feeToken.save(); } export function handleAcceptedFeeToken(event: AcceptedFeeToken): void { diff --git a/subgraph/src/entities/TokenAndEthShift.ts b/subgraph/src/entities/TokenAndEthShift.ts index c0252d67c..7d5a2b164 100644 --- a/subgraph/src/entities/TokenAndEthShift.ts +++ b/subgraph/src/entities/TokenAndEthShift.ts @@ -1,5 +1,5 @@ import { TokenAndETHShift as TokenAndETHShiftEvent } from "../../generated/KlerosCore/KlerosCore"; -import { TokenAndETHShift } from "../../generated/schema"; +import { FeeToken, TokenAndETHShift } from "../../generated/schema"; import { ZERO } from "../utils"; import { resolveUserDispute } from "./User"; @@ -8,17 +8,19 @@ export function updateTokenAndEthShiftFromEvent(event: TokenAndETHShiftEvent): v const disputeID = event.params._disputeID.toString(); const shiftID = `${jurorAddress}-${disputeID}`; const shift = TokenAndETHShift.load(shiftID); - + const feeToken = FeeToken.load(event.params._feeToken.toHexString()); if (!shift) { createTokenAndEthShiftFromEvent(event); resolveUserDispute(jurorAddress, ZERO, event.params._feeAmount, disputeID); return; } - - shift.tokenAmount = shift.tokenAmount.plus(event.params._pnkAmount); + if (!feeToken) return; + shift.feeToken = event.params._feeToken.toHexString(); + shift.feeTokenAmount = shift.feeTokenAmount!.plus(feeToken.totalPaid!); + shift.pnkAmount = shift.pnkAmount.plus(event.params._pnkAmount); const previousFeeAmount = shift.ethAmount; const newFeeAmount = shift.ethAmount.plus(event.params._feeAmount); - shift.ethAmount = newFeeAmount; + shift.ethAmount = newFeeAmount.plus(feeToken.totalPaidInETH!); shift.save(); resolveUserDispute(jurorAddress, previousFeeAmount, newFeeAmount, disputeID); } @@ -30,7 +32,7 @@ export function createTokenAndEthShiftFromEvent(event: TokenAndETHShiftEvent): v const shift = new TokenAndETHShift(shiftID); shift.juror = jurorAddress; shift.dispute = disputeID; - shift.tokenAmount = event.params._pnkAmount; + shift.pnkAmount = event.params._pnkAmount; shift.ethAmount = event.params._feeAmount; shift.save(); } From b04fd1f9ce52e61560fcbd502162f58be093c9fc Mon Sep 17 00:00:00 2001 From: marino <102478601+kemuru@users.noreply.github.com> Date: Fri, 14 Jul 2023 18:28:18 +0200 Subject: [PATCH 3/7] fix: null errors --- subgraph/schema.graphql | 8 ++++---- subgraph/src/KlerosCore.ts | 6 ++++-- subgraph/src/entities/TokenAndEthShift.ts | 5 +++-- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/subgraph/schema.graphql b/subgraph/schema.graphql index 89bcb877d..0a45ba52b 100644 --- a/subgraph/schema.graphql +++ b/subgraph/schema.graphql @@ -98,8 +98,8 @@ type TokenAndETHShift @entity { dispute: Dispute! pnkAmount: BigInt! ethAmount: BigInt! - feeToken: FeeToken - feeTokenAmount: BigInt + feeToken: FeeToken! + feeTokenAmount: BigInt! } type JurorTokensPerCourt @entity { @@ -196,8 +196,8 @@ type FeeToken @entity { accepted: Boolean! rateInEth: BigInt! rateDecimals: Int! - totalPaid: BigInt - totalPaidInETH: BigInt + totalPaid: BigInt! + totalPaidInETH: BigInt! rounds: [Round!] @derivedFrom(field: "feeToken") tokenAndETHShift: [TokenAndETHShift!] @derivedFrom(field: "feeToken") } diff --git a/subgraph/src/KlerosCore.ts b/subgraph/src/KlerosCore.ts index 85189979d..fd3d46570 100644 --- a/subgraph/src/KlerosCore.ts +++ b/subgraph/src/KlerosCore.ts @@ -167,8 +167,8 @@ export function handleTokenAndETHShift(event: TokenAndETHShiftEvent): void { if (!court) return; const paidFeeToken = contract.convertEthToTokenAmount(event.params._feeToken, court.feeForJuror); if (feeToken.totalPaidInETH && feeToken.totalPaid) { - feeToken.totalPaidInETH = feeToken.totalPaidInETH!.plus(currencyRate.value1); - feeToken.totalPaid = feeToken.totalPaid!.plus(paidFeeToken); + feeToken.totalPaidInETH = feeToken.totalPaidInETH.plus(currencyRate.value1); + feeToken.totalPaid = feeToken.totalPaid.plus(paidFeeToken); } updateJurorStake(jurorAddress, court.id, KlerosCore.bind(event.address), event.block.timestamp); court.paidETH = court.paidETH.plus(paidETH); @@ -191,6 +191,8 @@ export function handleAcceptedFeeToken(event: AcceptedFeeToken): void { feeToken.accepted = currencyRate.value0; feeToken.rateInEth = currencyRate.value1; feeToken.rateDecimals = currencyRate.value2; + feeToken.totalPaid = ZERO; + feeToken.totalPaidInETH = ZERO; feeToken.save(); } diff --git a/subgraph/src/entities/TokenAndEthShift.ts b/subgraph/src/entities/TokenAndEthShift.ts index 7d5a2b164..5a4a25e61 100644 --- a/subgraph/src/entities/TokenAndEthShift.ts +++ b/subgraph/src/entities/TokenAndEthShift.ts @@ -16,11 +16,11 @@ export function updateTokenAndEthShiftFromEvent(event: TokenAndETHShiftEvent): v } if (!feeToken) return; shift.feeToken = event.params._feeToken.toHexString(); - shift.feeTokenAmount = shift.feeTokenAmount!.plus(feeToken.totalPaid!); + shift.feeTokenAmount = shift.feeTokenAmount.plus(feeToken.totalPaid); shift.pnkAmount = shift.pnkAmount.plus(event.params._pnkAmount); const previousFeeAmount = shift.ethAmount; const newFeeAmount = shift.ethAmount.plus(event.params._feeAmount); - shift.ethAmount = newFeeAmount.plus(feeToken.totalPaidInETH!); + shift.ethAmount = newFeeAmount.plus(feeToken.totalPaidInETH); shift.save(); resolveUserDispute(jurorAddress, previousFeeAmount, newFeeAmount, disputeID); } @@ -34,5 +34,6 @@ export function createTokenAndEthShiftFromEvent(event: TokenAndETHShiftEvent): v shift.dispute = disputeID; shift.pnkAmount = event.params._pnkAmount; shift.ethAmount = event.params._feeAmount; + shift.feeTokenAmount = ZERO; shift.save(); } From 361bc8ee22491db1054c8e223284fb3e2a4b2e6d Mon Sep 17 00:00:00 2001 From: nhestrompia Date: Thu, 20 Jul 2023 17:28:47 +0300 Subject: [PATCH 4/7] fix: null value in feeToken --- subgraph/src/entities/Round.ts | 4 ++-- subgraph/src/entities/TokenAndEthShift.ts | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/subgraph/src/entities/Round.ts b/subgraph/src/entities/Round.ts index 91451fd04..dc4d1255e 100644 --- a/subgraph/src/entities/Round.ts +++ b/subgraph/src/entities/Round.ts @@ -9,6 +9,7 @@ export function createRoundFromRoundInfo( ): void { const roundID = `${disputeID.toString()}-${roundIndex.toString()}`; const round = new Round(roundID); + const feeToken = roundInfo.getFeeToken(); round.disputeKit = roundInfo.getDisputeKitID.toString(); round.tokensAtStakePerJuror = roundInfo.getPnkAtStakePerJuror(); round.totalFeesForJurors = roundInfo.getTotalFeesForJurors(); @@ -16,7 +17,6 @@ export function createRoundFromRoundInfo( round.repartitions = roundInfo.getRepartitions(); round.penalties = roundInfo.getPnkPenalties(); round.dispute = disputeID.toString(); - let feeToken = roundInfo.getFeeToken; - round.feeToken = feeToken ? feeToken.toString() : null; + round.feeToken = feeToken ? feeToken.toHexString() : null; round.save(); } diff --git a/subgraph/src/entities/TokenAndEthShift.ts b/subgraph/src/entities/TokenAndEthShift.ts index 5a4a25e61..27e90e3ac 100644 --- a/subgraph/src/entities/TokenAndEthShift.ts +++ b/subgraph/src/entities/TokenAndEthShift.ts @@ -35,5 +35,6 @@ export function createTokenAndEthShiftFromEvent(event: TokenAndETHShiftEvent): v shift.pnkAmount = event.params._pnkAmount; shift.ethAmount = event.params._feeAmount; shift.feeTokenAmount = ZERO; + shift.feeToken = event.params._feeToken.toString(); shift.save(); } From 2ad8518b271554da4515340f47942acba98f28d4 Mon Sep 17 00:00:00 2001 From: alcercu <333aleix333@gmail.com> Date: Wed, 2 Aug 2023 20:16:37 +0200 Subject: [PATCH 5/7] fix(subgraph): correctly convert fees to eth --- subgraph/schema.graphql | 3 +- subgraph/src/KlerosCore.ts | 25 +------ subgraph/src/entities/FeeToken.ts | 53 ++++++++++++++ subgraph/src/entities/TokenAndEthShift.ts | 88 +++++++++++++++-------- 4 files changed, 115 insertions(+), 54 deletions(-) create mode 100644 subgraph/src/entities/FeeToken.ts diff --git a/subgraph/schema.graphql b/subgraph/schema.graphql index 6019f448b..5aecfcb11 100644 --- a/subgraph/schema.graphql +++ b/subgraph/schema.graphql @@ -98,8 +98,9 @@ type TokenAndETHShift @entity { dispute: Dispute! pnkAmount: BigInt! ethAmount: BigInt! - feeToken: FeeToken! + isNativeCurrency: Boolean! feeTokenAmount: BigInt! + feeToken: FeeToken } type JurorTokensPerCourt @entity { diff --git a/subgraph/src/KlerosCore.ts b/subgraph/src/KlerosCore.ts index 311290d83..5893ce882 100644 --- a/subgraph/src/KlerosCore.ts +++ b/subgraph/src/KlerosCore.ts @@ -19,7 +19,7 @@ import { createCourtFromEvent, getFeeForJuror } from "./entities/Court"; import { createDisputeKitFromEvent, filterSupportedDisputeKits } from "./entities/DisputeKit"; import { createDisputeFromEvent } from "./entities/Dispute"; import { createRoundFromRoundInfo } from "./entities/Round"; -import { updateCases, updatePaidETH, updateRedistributedPNK, updateCasesRuled, updateCasesVoting } from "./datapoint"; +import { updateCases, updateCasesRuled, updateCasesVoting } from "./datapoint"; import { addUserActiveDispute, ensureUser } from "./entities/User"; import { updateJurorDelayedStake, updateJurorStake } from "./entities/JurorTokensPerCourt"; import { createDrawFromEvent } from "./entities/Draw"; @@ -157,36 +157,15 @@ export function handleStakeDelayed(event: StakeDelayed): void { } export function handleTokenAndETHShift(event: TokenAndETHShiftEvent): void { + updatePenalty(event); updateTokenAndEthShiftFromEvent(event); const jurorAddress = event.params._account.toHexString(); const disputeID = event.params._disputeID.toString(); - const pnkAmount = event.params._pnkAmount; - const feeAmount = event.params._feeAmount; - const feeToken = FeeToken.load(event.params._feeToken.toHexString()); - const contract = KlerosCore.bind(event.address); - const currencyRate = contract.currencyRates(event.params._feeToken); - if (!feeToken) return; - const paidETH = feeAmount.plus(currencyRate.value1); - const dispute = Dispute.load(disputeID); if (!dispute) return; const court = Court.load(dispute.court); if (!court) return; - const paidFeeToken = contract.convertEthToTokenAmount(event.params._feeToken, court.feeForJuror); - if (feeToken.totalPaidInETH && feeToken.totalPaid) { - feeToken.totalPaidInETH = feeToken.totalPaidInETH.plus(currencyRate.value1); - feeToken.totalPaid = feeToken.totalPaid.plus(paidFeeToken); - } updateJurorStake(jurorAddress, court.id, KlerosCore.bind(event.address), event.block.timestamp); - court.paidETH = court.paidETH.plus(paidETH); - if (pnkAmount.gt(ZERO)) { - court.paidPNK = court.paidPNK.plus(pnkAmount); - updateRedistributedPNK(pnkAmount, event.block.timestamp); - } - updatePaidETH(feeAmount, event.block.timestamp); - updatePenalty(event); - court.save(); - feeToken.save(); } export function handleAcceptedFeeToken(event: AcceptedFeeToken): void { diff --git a/subgraph/src/entities/FeeToken.ts b/subgraph/src/entities/FeeToken.ts new file mode 100644 index 000000000..18cccd867 --- /dev/null +++ b/subgraph/src/entities/FeeToken.ts @@ -0,0 +1,53 @@ +import { BigInt, Address } from "@graphprotocol/graph-ts"; +import { FeeToken } from "../../generated/schema"; +import { KlerosCore } from "../../generated/KlerosCore/KlerosCore"; +import { ZERO } from "../utils"; + +export function ensureFeeToken(tokenAddress: Address, klerosCoreAddress: Address): FeeToken { + const hexTokenAddress = tokenAddress.toHexString(); + let feeToken = FeeToken.load(hexTokenAddress); + if (!feeToken) { + feeToken = new FeeToken(hexTokenAddress); + feeToken.totalPaid = ZERO; + feeToken.totalPaidInETH = ZERO; + } + const contract = KlerosCore.bind(klerosCoreAddress); + const currencyRate = contract.currencyRates(tokenAddress); + feeToken.accepted = currencyRate.value0; + feeToken.rateInEth = currencyRate.value1; + feeToken.rateDecimals = currencyRate.value2; + feeToken.save(); + return feeToken; +} + +export function updateFeeTokenRate(tokenAddress: Address, klerosCoreAddress: Address): void { + const feeToken = ensureFeeToken(tokenAddress, klerosCoreAddress); + const contract = KlerosCore.bind(klerosCoreAddress); + const currencyRate = contract.currencyRates(tokenAddress); + feeToken.accepted = currencyRate.value0; + feeToken.rateInEth = currencyRate.value1; + feeToken.rateDecimals = currencyRate.value2; + feeToken.save(); +} + +export function updateFeeTokenPaid(tokenAddress: Address, klerosCoreAddress: Address, amount: BigInt): void { + const feeToken = ensureFeeToken(tokenAddress, klerosCoreAddress); + const ethAmount = convertTokenAmountToEth(tokenAddress, amount, klerosCoreAddress); + feeToken.totalPaid = feeToken.totalPaid.plus(amount); + feeToken.totalPaidInETH = feeToken.totalPaidInETH.plus(ethAmount); + feeToken.save(); +} + +export function convertEthToTokenAmount(tokenAddress: Address, eth: BigInt, klerosCoreAddress: Address): BigInt { + const feeToken = ensureFeeToken(tokenAddress, klerosCoreAddress); + return eth.times(BigInt.fromI32(10 ** feeToken.rateDecimals)).div(feeToken.rateInEth); +} + +export function convertTokenAmountToEth( + tokenAddress: Address, + tokenAmount: BigInt, + klerosCoreAddress: Address +): BigInt { + const feeToken = ensureFeeToken(tokenAddress, klerosCoreAddress); + return tokenAmount.times(feeToken.rateInEth).div(BigInt.fromI32(10 ** feeToken.rateDecimals)); +} diff --git a/subgraph/src/entities/TokenAndEthShift.ts b/subgraph/src/entities/TokenAndEthShift.ts index 27e90e3ac..f225c0737 100644 --- a/subgraph/src/entities/TokenAndEthShift.ts +++ b/subgraph/src/entities/TokenAndEthShift.ts @@ -1,40 +1,68 @@ +import { Address, BigInt } from "@graphprotocol/graph-ts"; import { TokenAndETHShift as TokenAndETHShiftEvent } from "../../generated/KlerosCore/KlerosCore"; -import { FeeToken, TokenAndETHShift } from "../../generated/schema"; +import { Court, Dispute, TokenAndETHShift } from "../../generated/schema"; +import { updatePaidETH, updateRedistributedPNK } from "../datapoint"; import { ZERO } from "../utils"; +import { convertTokenAmountToEth, updateFeeTokenPaid } from "./FeeToken"; import { resolveUserDispute } from "./User"; export function updateTokenAndEthShiftFromEvent(event: TokenAndETHShiftEvent): void { - const jurorAddress = event.params._account.toHexString(); - const disputeID = event.params._disputeID.toString(); - const shiftID = `${jurorAddress}-${disputeID}`; - const shift = TokenAndETHShift.load(shiftID); - const feeToken = FeeToken.load(event.params._feeToken.toHexString()); - if (!shift) { - createTokenAndEthShiftFromEvent(event); - resolveUserDispute(jurorAddress, ZERO, event.params._feeAmount, disputeID); - return; + const jurorAddress = event.params._account; + const disputeID = event.params._disputeID; + const dispute = Dispute.load(disputeID.toString()); + if (!dispute) return; + const court = Court.load(dispute.court); + if (!court) return; + const roundIndex = event.params._roundID; + const feeTokenAddress = event.params._feeToken; + let shift = ensureTokenAndEthShift(jurorAddress, disputeID, roundIndex, feeTokenAddress); + const feeAmount = event.params._feeAmount; + const pnkAmount = event.params._pnkAmount; + let ethAmount: BigInt; + if (feeTokenAddress !== Address.fromI32(0)) { + updateFeeTokenPaid(feeTokenAddress, event.address, feeAmount); + ethAmount = convertTokenAmountToEth(feeTokenAddress, feeAmount, event.address); + shift.feeTokenAmount = shift.feeTokenAmount.plus(feeAmount); + } else { + ethAmount = feeAmount; + } + const previousEthAmount = shift.ethAmount; + const newEthAmount = previousEthAmount.plus(ethAmount); + shift.ethAmount = newEthAmount; + resolveUserDispute(jurorAddress.toHexString(), previousEthAmount, newEthAmount, disputeID.toString()); + court.paidETH = court.paidETH.plus(ethAmount); + updatePaidETH(ethAmount, event.block.timestamp); + if (pnkAmount.gt(ZERO)) { + court.paidPNK = court.paidPNK.plus(pnkAmount); + updateRedistributedPNK(pnkAmount, event.block.timestamp); } - if (!feeToken) return; - shift.feeToken = event.params._feeToken.toHexString(); - shift.feeTokenAmount = shift.feeTokenAmount.plus(feeToken.totalPaid); - shift.pnkAmount = shift.pnkAmount.plus(event.params._pnkAmount); - const previousFeeAmount = shift.ethAmount; - const newFeeAmount = shift.ethAmount.plus(event.params._feeAmount); - shift.ethAmount = newFeeAmount.plus(feeToken.totalPaidInETH); + shift.pnkAmount = shift.pnkAmount.plus(pnkAmount); shift.save(); - resolveUserDispute(jurorAddress, previousFeeAmount, newFeeAmount, disputeID); + court.save(); } -export function createTokenAndEthShiftFromEvent(event: TokenAndETHShiftEvent): void { - const jurorAddress = event.params._account.toHexString(); - const disputeID = event.params._disputeID.toString(); - const shiftID = `${jurorAddress}-${disputeID}`; - const shift = new TokenAndETHShift(shiftID); - shift.juror = jurorAddress; - shift.dispute = disputeID; - shift.pnkAmount = event.params._pnkAmount; - shift.ethAmount = event.params._feeAmount; - shift.feeTokenAmount = ZERO; - shift.feeToken = event.params._feeToken.toString(); - shift.save(); +export function ensureTokenAndEthShift( + jurorAddress: Address, + disputeID: BigInt, + roundIndex: BigInt, + feeTokenAddress: Address +): TokenAndETHShift { + const shiftID = `${jurorAddress.toHexString()}-${disputeID.toString()}-${roundIndex.toString()}`; + let shift = TokenAndETHShift.load(shiftID); + if (!shift) { + shift = new TokenAndETHShift(shiftID); + if (feeTokenAddress !== Address.fromI32(0)) { + shift.isNativeCurrency = false; + shift.feeToken = feeTokenAddress.toHexString(); + } else { + shift.isNativeCurrency = true; + } + shift.feeTokenAmount = ZERO; + shift.ethAmount = ZERO; + shift.juror = jurorAddress.toHexString(); + shift.dispute = disputeID.toString(); + shift.pnkAmount = ZERO; + shift.save(); + } + return shift; } From e8801e827e5d984b9591b31e3bf1a8a407390426 Mon Sep 17 00:00:00 2001 From: alcercu <333aleix333@gmail.com> Date: Thu, 3 Aug 2023 15:37:14 +0200 Subject: [PATCH 6/7] fix(subgraph): avoid creating a feeToken when using native currency --- subgraph/src/entities/Round.ts | 3 ++- subgraph/src/entities/TokenAndEthShift.ts | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/subgraph/src/entities/Round.ts b/subgraph/src/entities/Round.ts index dc4d1255e..320f5cf57 100644 --- a/subgraph/src/entities/Round.ts +++ b/subgraph/src/entities/Round.ts @@ -17,6 +17,7 @@ export function createRoundFromRoundInfo( round.repartitions = roundInfo.getRepartitions(); round.penalties = roundInfo.getPnkPenalties(); round.dispute = disputeID.toString(); - round.feeToken = feeToken ? feeToken.toHexString() : null; + round.feeToken = + feeToken.toHexString() === "0x0000000000000000000000000000000000000000" ? null : feeToken.toHexString(); round.save(); } diff --git a/subgraph/src/entities/TokenAndEthShift.ts b/subgraph/src/entities/TokenAndEthShift.ts index f225c0737..5fca5dec4 100644 --- a/subgraph/src/entities/TokenAndEthShift.ts +++ b/subgraph/src/entities/TokenAndEthShift.ts @@ -19,7 +19,7 @@ export function updateTokenAndEthShiftFromEvent(event: TokenAndETHShiftEvent): v const feeAmount = event.params._feeAmount; const pnkAmount = event.params._pnkAmount; let ethAmount: BigInt; - if (feeTokenAddress !== Address.fromI32(0)) { + if (feeTokenAddress.toHexString() === "0x0000000000000000000000000000000000000000") { updateFeeTokenPaid(feeTokenAddress, event.address, feeAmount); ethAmount = convertTokenAmountToEth(feeTokenAddress, feeAmount, event.address); shift.feeTokenAmount = shift.feeTokenAmount.plus(feeAmount); From 877bd68ed2ee368e18cc05bb345bc8f40886a2f8 Mon Sep 17 00:00:00 2001 From: alcercu <333aleix333@gmail.com> Date: Thu, 3 Aug 2023 16:43:35 +0200 Subject: [PATCH 7/7] fix(subgraph): correctly handle feeToken --- subgraph/src/KlerosCore.ts | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/subgraph/src/KlerosCore.ts b/subgraph/src/KlerosCore.ts index 5893ce882..e2c30e895 100644 --- a/subgraph/src/KlerosCore.ts +++ b/subgraph/src/KlerosCore.ts @@ -28,6 +28,7 @@ import { updateArbitrableCases } from "./entities/Arbitrable"; import { Court, Dispute, FeeToken } from "../generated/schema"; import { BigInt } from "@graphprotocol/graph-ts"; import { updatePenalty } from "./entities/Penalty"; +import { ensureFeeToken } from "./entities/FeeToken"; function getPeriodName(index: i32): string { const periodArray = ["evidence", "commit", "vote", "appeal", "execution"]; @@ -169,16 +170,5 @@ export function handleTokenAndETHShift(event: TokenAndETHShiftEvent): void { } export function handleAcceptedFeeToken(event: AcceptedFeeToken): void { - let feeToken = new FeeToken(event.params._token.toHexString()); - const contract = KlerosCore.bind(event.address); - - let currencyRate = contract.currencyRates(event.params._token); - - feeToken.accepted = currencyRate.value0; - feeToken.rateInEth = currencyRate.value1; - feeToken.rateDecimals = currencyRate.value2; - feeToken.totalPaid = ZERO; - feeToken.totalPaidInETH = ZERO; - - feeToken.save(); + ensureFeeToken(event.params._token, event.address); }