Skip to content
This repository was archived by the owner on Nov 9, 2022. It is now read-only.

Commit f74acb7

Browse files
committed
chore: map the withdrawal and execution of submissions in subgraph
1 parent 8cbbe41 commit f74acb7

File tree

4 files changed

+121
-10
lines changed

4 files changed

+121
-10
lines changed

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,5 @@
33
- chore: build subgraph schema ([9810923](https://github.com/kleros/governor-web/commit/9810923))
44
- chore: generate first changelog ([2e41de7](https://github.com/kleros/governor-web/commit/2e41de7))
55
- chore: map governance functions in subgraph ([360d007](https://github.com/kleros/governor-web/commit/360d007))
6+
- chore: map list submissions in subgraph ([8cbbe41](https://github.com/kleros/governor-web/commit/8cbbe41))
67
- chore: set up project and architecture ([d28fb74](https://github.com/kleros/governor-web/commit/d28fb74))

subgraph/schema.graphql

+4
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,10 @@ type Submission @entity {
180180
"""
181181
approvalTime: BigInt
182182
"""
183+
True, if the submission was withdrawn.
184+
"""
185+
withdrawn: Boolean!
186+
"""
183187
Transactions.
184188
"""
185189
transactions: [Transaction!]! @derivedFrom(field: "submission")

subgraph/src/mapping.ts

+112-10
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,16 @@ import {
1010
ChangeSubmissionTimeoutCall,
1111
ChangeWinnerMultiplierCall,
1212
ChangeWithdrawTimeoutCall,
13+
ExecuteSubmissionsCall,
1314
Governor,
1415
SetMetaEvidenceCall,
1516
SubmitListCall,
17+
WithdrawTransactionListCall,
1618
} from "../generated/Governor/Governor";
1719
import {
1820
Contract,
1921
MetaEvidence,
22+
Round,
2023
Session,
2124
Submission,
2225
Transaction,
@@ -36,6 +39,23 @@ function concatByteArrays(a: ByteArray, b: ByteArray): ByteArray {
3639
return out as ByteArray;
3740
}
3841

42+
function newSession(contract: Contract, creationTime: BigInt): Session {
43+
let session = new Session(contract.sessionsLength.toHexString());
44+
session.creationTime = creationTime;
45+
session.sumDeposit = BigInt.fromI32(0);
46+
session.status = getStatus(0);
47+
session.durationOffset = BigInt.fromI32(0);
48+
session.submissionsLength = BigInt.fromI32(0);
49+
session.roundsLength = BigInt.fromI32(0);
50+
session.save();
51+
52+
contract.sessionsLength.plus(BigInt.fromI32(1));
53+
contract.save();
54+
55+
// Something is broken with The Graph's null type guards so we need these explicit casts in some places.
56+
return session as Session;
57+
}
58+
3959
function initializeContract(
4060
address: Address,
4161
deployer: Address,
@@ -60,22 +80,41 @@ function initializeContract(
6080
contract.lastApprovalTime = governor.lastApprovalTime();
6181
contract.metaEvidenceUpdates = governor.metaEvidenceUpdates();
6282
contract.metaEvidence = contract.metaEvidenceUpdates.toHexString();
63-
contract.sessionsLength = BigInt.fromI32(1);
83+
contract.sessionsLength = BigInt.fromI32(0);
6484
contract.submissionsLength = BigInt.fromI32(0);
6585
contract.save();
6686

67-
let session = new Session("0");
68-
session.creationTime = creationTime;
69-
session.sumDeposit = BigInt.fromI32(0);
70-
session.status = getStatus(0);
71-
session.durationOffset = BigInt.fromI32(0);
72-
session.submissionsLength = BigInt.fromI32(0);
73-
session.roundsLength = BigInt.fromI32(0);
74-
session.save();
87+
newSession(contract as Contract, creationTime);
7588

7689
return contract as Contract;
7790
}
7891

92+
function newRound(session: Session, creationTime: BigInt): Round {
93+
let round = new Round(
94+
crypto
95+
.keccak256(
96+
concatByteArrays(
97+
ByteArray.fromUTF8(session.id),
98+
ByteArray.fromUTF8(session.roundsLength.toString())
99+
)
100+
)
101+
.toHexString()
102+
);
103+
round.creationTime = creationTime;
104+
round.session = session.id;
105+
round.paidFees = [];
106+
round.hasPaid = [];
107+
round.feeRewards = BigInt.fromI32(0);
108+
round.successfullyPaid = BigInt.fromI32(0);
109+
round.contributionsLength = BigInt.fromI32(0);
110+
round.save();
111+
112+
session.roundsLength = session.roundsLength.plus(BigInt.fromI32(1));
113+
session.save();
114+
115+
return round as Round;
116+
}
117+
79118
export function setMetaEvidence(call: SetMetaEvidenceCall): void {
80119
let contract = initializeContract(call.to, call.from, call.block.timestamp);
81120

@@ -156,8 +195,8 @@ export function changeMetaEvidence(call: ChangeMetaEvidenceCall): void {
156195
}
157196

158197
export function submitList(call: SubmitListCall): void {
159-
let contract = initializeContract(call.to, call.from, call.block.timestamp);
160198
let governor = Governor.bind(call.to);
199+
let contract = initializeContract(call.to, call.from, call.block.timestamp);
161200

162201
let submission = new Submission(contract.submissionsLength.toHexString());
163202
let _submission = governor.submissions(contract.submissionsLength);
@@ -169,6 +208,7 @@ export function submitList(call: SubmitListCall): void {
169208
submission.deposit = _submission.value1;
170209
submission.listHash = _submission.value2;
171210
submission.approved = _submission.value4;
211+
submission.withdrawn = false;
172212
submission.transactionsLength = BigInt.fromI32(call.inputs._target.length);
173213
submission.save();
174214

@@ -207,3 +247,65 @@ export function submitList(call: SubmitListCall): void {
207247
);
208248
session.save();
209249
}
250+
251+
export function withdrawTransactionList(
252+
call: WithdrawTransactionListCall
253+
): void {
254+
let governor = Governor.bind(call.to);
255+
let contract = initializeContract(call.to, call.from, call.block.timestamp);
256+
contract.reservedETH = governor.reservedETH();
257+
contract.save();
258+
259+
let submission = Submission.load(call.inputs._submissionID.toHexString());
260+
submission.withdrawn = true;
261+
submission.save();
262+
263+
let session = Session.load(submission.session);
264+
session.sumDeposit = session.sumDeposit.minus(submission.deposit);
265+
session.save();
266+
}
267+
268+
export function executeSubmissions(call: ExecuteSubmissionsCall): void {
269+
let governor = Governor.bind(call.to);
270+
let contract = initializeContract(call.to, call.from, call.block.timestamp);
271+
272+
let sessionID = contract.sessionsLength.minus(BigInt.fromI32(1));
273+
let session = Session.load(sessionID.toHexString());
274+
if (session.submissionsLength.equals(BigInt.fromI32(0))) {
275+
contract.lastApprovalTime = call.block.timestamp;
276+
contract.save();
277+
278+
session.status = getStatus(2);
279+
session.save();
280+
281+
newSession(contract as Contract, call.block.timestamp);
282+
} else if (session.submissionsLength.equals(BigInt.fromI32(1))) {
283+
contract.reservedETH = governor.reservedETH();
284+
contract.lastApprovalTime = call.block.timestamp;
285+
contract.save();
286+
287+
session.sumDeposit = BigInt.fromI32(0);
288+
session.status = getStatus(2);
289+
session.save();
290+
291+
let submission = Submission.load(
292+
contract.submissionsLength.minus(BigInt.fromI32(1)).toHexString()
293+
);
294+
submission.approved = true;
295+
submission.approvalTime = call.block.timestamp;
296+
submission.save();
297+
298+
newSession(contract as Contract, call.block.timestamp);
299+
} else {
300+
contract.reservedETH = governor.reservedETH();
301+
contract.save();
302+
303+
let _session = governor.sessions(sessionID);
304+
session.disputeID = _session.value1;
305+
session.sumDeposit = _session.value2;
306+
session.status = getStatus(0);
307+
session.save();
308+
309+
newRound(session as Session, call.block.timestamp);
310+
}
311+
}

subgraph/subgraph.template.yaml

+4
Original file line numberDiff line numberDiff line change
@@ -41,4 +41,8 @@ dataSources:
4141
handler: changeMetaEvidence
4242
- function: submitList(address[],uint256[],bytes,uint256[],string)
4343
handler: submitList
44+
- function: withdrawTransactionList(uint256,bytes32)
45+
handler: withdrawTransactionList
46+
- function: executeSubmissions()
47+
handler: executeSubmissions
4448
file: ./src/mapping.ts

0 commit comments

Comments
 (0)