Skip to content

Commit 10a65b6

Browse files
authored
Merge branch 'fix(web)/staking-refetch-and-improving-fetching-timing' into fix(web)/dashboard-data-and-wallet-connection
2 parents 52f68f7 + 2ade29e commit 10a65b6

File tree

6 files changed

+141
-39
lines changed

6 files changed

+141
-39
lines changed

subgraph/schema.graphql

+16-1
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,11 @@ type TokenAndETHShift @entity {
9696
id: ID! # user.id-dispute.id
9797
juror: User!
9898
dispute: Dispute!
99-
tokenAmount: BigInt!
99+
pnkAmount: BigInt!
100100
ethAmount: BigInt!
101+
isNativeCurrency: Boolean!
102+
feeTokenAmount: BigInt!
103+
feeToken: FeeToken
101104
}
102105

103106
type JurorTokensPerCourt @entity {
@@ -159,6 +162,7 @@ type Round @entity {
159162
penalties: BigInt!
160163
drawnJurors: [Draw!]! @derivedFrom(field: "round")
161164
dispute: Dispute!
165+
feeToken: FeeToken
162166
}
163167

164168
type Draw @entity {
@@ -191,6 +195,17 @@ type Counter @entity {
191195
casesRuled: BigInt!
192196
}
193197

198+
type FeeToken @entity {
199+
id: ID! # The address of the ERC20 token.
200+
accepted: Boolean!
201+
rateInEth: BigInt!
202+
rateDecimals: Int!
203+
totalPaid: BigInt!
204+
totalPaidInETH: BigInt!
205+
rounds: [Round!] @derivedFrom(field: "feeToken")
206+
tokenAndETHShift: [TokenAndETHShift!] @derivedFrom(field: "feeToken")
207+
}
208+
194209
#####################
195210
# ClassicDisputeKit #
196211
#####################

subgraph/src/KlerosCore.ts

+9-12
Original file line numberDiff line numberDiff line change
@@ -12,21 +12,23 @@ import {
1212
TokenAndETHShift as TokenAndETHShiftEvent,
1313
Ruling,
1414
StakeDelayed,
15+
AcceptedFeeToken,
1516
} from "../generated/KlerosCore/KlerosCore";
1617
import { ZERO, ONE } from "./utils";
1718
import { createCourtFromEvent, getFeeForJuror } from "./entities/Court";
1819
import { createDisputeKitFromEvent, filterSupportedDisputeKits } from "./entities/DisputeKit";
1920
import { createDisputeFromEvent } from "./entities/Dispute";
2021
import { createRoundFromRoundInfo } from "./entities/Round";
21-
import { updateCases, updatePaidETH, updateRedistributedPNK, updateCasesRuled, updateCasesVoting } from "./datapoint";
22+
import { updateCases, updateCasesRuled, updateCasesVoting } from "./datapoint";
2223
import { addUserActiveDispute, ensureUser } from "./entities/User";
2324
import { updateJurorDelayedStake, updateJurorStake } from "./entities/JurorTokensPerCourt";
2425
import { createDrawFromEvent } from "./entities/Draw";
2526
import { updateTokenAndEthShiftFromEvent } from "./entities/TokenAndEthShift";
2627
import { updateArbitrableCases } from "./entities/Arbitrable";
27-
import { Court, Dispute } from "../generated/schema";
28+
import { Court, Dispute, FeeToken } from "../generated/schema";
2829
import { BigInt } from "@graphprotocol/graph-ts";
2930
import { updatePenalty } from "./entities/Penalty";
31+
import { ensureFeeToken } from "./entities/FeeToken";
3032

3133
function getPeriodName(index: i32): string {
3234
const periodArray = ["evidence", "commit", "vote", "appeal", "execution"];
@@ -156,22 +158,17 @@ export function handleStakeDelayed(event: StakeDelayed): void {
156158
}
157159

158160
export function handleTokenAndETHShift(event: TokenAndETHShiftEvent): void {
161+
updatePenalty(event);
159162
updateTokenAndEthShiftFromEvent(event);
160163
const jurorAddress = event.params._account.toHexString();
161164
const disputeID = event.params._disputeID.toString();
162-
const pnkAmount = event.params._pnkAmount;
163-
const feeAmount = event.params._feeAmount;
164165
const dispute = Dispute.load(disputeID);
165166
if (!dispute) return;
166167
const court = Court.load(dispute.court);
167168
if (!court) return;
168169
updateJurorStake(jurorAddress, court.id, KlerosCore.bind(event.address), event.block.timestamp);
169-
court.paidETH = court.paidETH.plus(feeAmount);
170-
if (pnkAmount.gt(ZERO)) {
171-
court.paidPNK = court.paidPNK.plus(pnkAmount);
172-
updateRedistributedPNK(pnkAmount, event.block.timestamp);
173-
}
174-
updatePaidETH(feeAmount, event.block.timestamp);
175-
updatePenalty(event);
176-
court.save();
170+
}
171+
172+
export function handleAcceptedFeeToken(event: AcceptedFeeToken): void {
173+
ensureFeeToken(event.params._token, event.address);
177174
}

subgraph/src/entities/FeeToken.ts

+53
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import { BigInt, Address } from "@graphprotocol/graph-ts";
2+
import { FeeToken } from "../../generated/schema";
3+
import { KlerosCore } from "../../generated/KlerosCore/KlerosCore";
4+
import { ZERO } from "../utils";
5+
6+
export function ensureFeeToken(tokenAddress: Address, klerosCoreAddress: Address): FeeToken {
7+
const hexTokenAddress = tokenAddress.toHexString();
8+
let feeToken = FeeToken.load(hexTokenAddress);
9+
if (!feeToken) {
10+
feeToken = new FeeToken(hexTokenAddress);
11+
feeToken.totalPaid = ZERO;
12+
feeToken.totalPaidInETH = ZERO;
13+
}
14+
const contract = KlerosCore.bind(klerosCoreAddress);
15+
const currencyRate = contract.currencyRates(tokenAddress);
16+
feeToken.accepted = currencyRate.value0;
17+
feeToken.rateInEth = currencyRate.value1;
18+
feeToken.rateDecimals = currencyRate.value2;
19+
feeToken.save();
20+
return feeToken;
21+
}
22+
23+
export function updateFeeTokenRate(tokenAddress: Address, klerosCoreAddress: Address): void {
24+
const feeToken = ensureFeeToken(tokenAddress, klerosCoreAddress);
25+
const contract = KlerosCore.bind(klerosCoreAddress);
26+
const currencyRate = contract.currencyRates(tokenAddress);
27+
feeToken.accepted = currencyRate.value0;
28+
feeToken.rateInEth = currencyRate.value1;
29+
feeToken.rateDecimals = currencyRate.value2;
30+
feeToken.save();
31+
}
32+
33+
export function updateFeeTokenPaid(tokenAddress: Address, klerosCoreAddress: Address, amount: BigInt): void {
34+
const feeToken = ensureFeeToken(tokenAddress, klerosCoreAddress);
35+
const ethAmount = convertTokenAmountToEth(tokenAddress, amount, klerosCoreAddress);
36+
feeToken.totalPaid = feeToken.totalPaid.plus(amount);
37+
feeToken.totalPaidInETH = feeToken.totalPaidInETH.plus(ethAmount);
38+
feeToken.save();
39+
}
40+
41+
export function convertEthToTokenAmount(tokenAddress: Address, eth: BigInt, klerosCoreAddress: Address): BigInt {
42+
const feeToken = ensureFeeToken(tokenAddress, klerosCoreAddress);
43+
return eth.times(BigInt.fromI32(10 ** feeToken.rateDecimals)).div(feeToken.rateInEth);
44+
}
45+
46+
export function convertTokenAmountToEth(
47+
tokenAddress: Address,
48+
tokenAmount: BigInt,
49+
klerosCoreAddress: Address
50+
): BigInt {
51+
const feeToken = ensureFeeToken(tokenAddress, klerosCoreAddress);
52+
return tokenAmount.times(feeToken.rateInEth).div(BigInt.fromI32(10 ** feeToken.rateDecimals));
53+
}

subgraph/src/entities/Round.ts

+3
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,15 @@ export function createRoundFromRoundInfo(
99
): void {
1010
const roundID = `${disputeID.toString()}-${roundIndex.toString()}`;
1111
const round = new Round(roundID);
12+
const feeToken = roundInfo.getFeeToken();
1213
round.disputeKit = roundInfo.getDisputeKitID.toString();
1314
round.tokensAtStakePerJuror = roundInfo.getPnkAtStakePerJuror();
1415
round.totalFeesForJurors = roundInfo.getTotalFeesForJurors();
1516
round.nbVotes = roundInfo.getNbVotes();
1617
round.repartitions = roundInfo.getRepartitions();
1718
round.penalties = roundInfo.getPnkPenalties();
1819
round.dispute = disputeID.toString();
20+
round.feeToken =
21+
feeToken.toHexString() === "0x0000000000000000000000000000000000000000" ? null : feeToken.toHexString();
1922
round.save();
2023
}
+58-26
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,68 @@
1+
import { Address, BigInt } from "@graphprotocol/graph-ts";
12
import { TokenAndETHShift as TokenAndETHShiftEvent } from "../../generated/KlerosCore/KlerosCore";
2-
import { TokenAndETHShift } from "../../generated/schema";
3+
import { Court, Dispute, TokenAndETHShift } from "../../generated/schema";
4+
import { updatePaidETH, updateRedistributedPNK } from "../datapoint";
35
import { ZERO } from "../utils";
6+
import { convertTokenAmountToEth, updateFeeTokenPaid } from "./FeeToken";
47
import { resolveUserDispute } from "./User";
58

69
export function updateTokenAndEthShiftFromEvent(event: TokenAndETHShiftEvent): void {
7-
const jurorAddress = event.params._account.toHexString();
8-
const disputeID = event.params._disputeID.toString();
9-
const shiftID = `${jurorAddress}-${disputeID}`;
10-
const shift = TokenAndETHShift.load(shiftID);
11-
12-
if (!shift) {
13-
createTokenAndEthShiftFromEvent(event);
14-
resolveUserDispute(jurorAddress, ZERO, event.params._feeAmount, disputeID);
15-
return;
10+
const jurorAddress = event.params._account;
11+
const disputeID = event.params._disputeID;
12+
const dispute = Dispute.load(disputeID.toString());
13+
if (!dispute) return;
14+
const court = Court.load(dispute.court);
15+
if (!court) return;
16+
const roundIndex = event.params._roundID;
17+
const feeTokenAddress = event.params._feeToken;
18+
let shift = ensureTokenAndEthShift(jurorAddress, disputeID, roundIndex, feeTokenAddress);
19+
const feeAmount = event.params._feeAmount;
20+
const pnkAmount = event.params._pnkAmount;
21+
let ethAmount: BigInt;
22+
if (feeTokenAddress.toHexString() === "0x0000000000000000000000000000000000000000") {
23+
updateFeeTokenPaid(feeTokenAddress, event.address, feeAmount);
24+
ethAmount = convertTokenAmountToEth(feeTokenAddress, feeAmount, event.address);
25+
shift.feeTokenAmount = shift.feeTokenAmount.plus(feeAmount);
26+
} else {
27+
ethAmount = feeAmount;
1628
}
17-
18-
shift.tokenAmount = shift.tokenAmount.plus(event.params._pnkAmount);
19-
const previousFeeAmount = shift.ethAmount;
20-
const newFeeAmount = shift.ethAmount.plus(event.params._feeAmount);
21-
shift.ethAmount = newFeeAmount;
29+
const previousEthAmount = shift.ethAmount;
30+
const newEthAmount = previousEthAmount.plus(ethAmount);
31+
shift.ethAmount = newEthAmount;
32+
resolveUserDispute(jurorAddress.toHexString(), previousEthAmount, newEthAmount, disputeID.toString());
33+
court.paidETH = court.paidETH.plus(ethAmount);
34+
updatePaidETH(ethAmount, event.block.timestamp);
35+
if (pnkAmount.gt(ZERO)) {
36+
court.paidPNK = court.paidPNK.plus(pnkAmount);
37+
updateRedistributedPNK(pnkAmount, event.block.timestamp);
38+
}
39+
shift.pnkAmount = shift.pnkAmount.plus(pnkAmount);
2240
shift.save();
23-
resolveUserDispute(jurorAddress, previousFeeAmount, newFeeAmount, disputeID);
41+
court.save();
2442
}
2543

26-
export function createTokenAndEthShiftFromEvent(event: TokenAndETHShiftEvent): void {
27-
const jurorAddress = event.params._account.toHexString();
28-
const disputeID = event.params._disputeID.toString();
29-
const shiftID = `${jurorAddress}-${disputeID}`;
30-
const shift = new TokenAndETHShift(shiftID);
31-
shift.juror = jurorAddress;
32-
shift.dispute = disputeID;
33-
shift.tokenAmount = event.params._pnkAmount;
34-
shift.ethAmount = event.params._feeAmount;
35-
shift.save();
44+
export function ensureTokenAndEthShift(
45+
jurorAddress: Address,
46+
disputeID: BigInt,
47+
roundIndex: BigInt,
48+
feeTokenAddress: Address
49+
): TokenAndETHShift {
50+
const shiftID = `${jurorAddress.toHexString()}-${disputeID.toString()}-${roundIndex.toString()}`;
51+
let shift = TokenAndETHShift.load(shiftID);
52+
if (!shift) {
53+
shift = new TokenAndETHShift(shiftID);
54+
if (feeTokenAddress !== Address.fromI32(0)) {
55+
shift.isNativeCurrency = false;
56+
shift.feeToken = feeTokenAddress.toHexString();
57+
} else {
58+
shift.isNativeCurrency = true;
59+
}
60+
shift.feeTokenAmount = ZERO;
61+
shift.ethAmount = ZERO;
62+
shift.juror = jurorAddress.toHexString();
63+
shift.dispute = disputeID.toString();
64+
shift.pnkAmount = ZERO;
65+
shift.save();
66+
}
67+
return shift;
3668
}

subgraph/subgraph.yaml

+2
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ dataSources:
5454
handler: handleTokenAndETHShift
5555
- event: Ruling(indexed address,indexed uint256,uint256)
5656
handler: handleRuling
57+
- event: AcceptedFeeToken(indexed address,indexed bool)
58+
handler: handleAcceptedFeeToken
5759
file: ./src/KlerosCore.ts
5860
- kind: ethereum
5961
name: PolicyRegistry

0 commit comments

Comments
 (0)