@@ -10,13 +10,16 @@ import {
10
10
ChangeSubmissionTimeoutCall ,
11
11
ChangeWinnerMultiplierCall ,
12
12
ChangeWithdrawTimeoutCall ,
13
+ ExecuteSubmissionsCall ,
13
14
Governor ,
14
15
SetMetaEvidenceCall ,
15
16
SubmitListCall ,
17
+ WithdrawTransactionListCall ,
16
18
} from "../generated/Governor/Governor" ;
17
19
import {
18
20
Contract ,
19
21
MetaEvidence ,
22
+ Round ,
20
23
Session ,
21
24
Submission ,
22
25
Transaction ,
@@ -36,6 +39,23 @@ function concatByteArrays(a: ByteArray, b: ByteArray): ByteArray {
36
39
return out as ByteArray ;
37
40
}
38
41
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
+
39
59
function initializeContract (
40
60
address : Address ,
41
61
deployer : Address ,
@@ -60,22 +80,41 @@ function initializeContract(
60
80
contract . lastApprovalTime = governor . lastApprovalTime ( ) ;
61
81
contract . metaEvidenceUpdates = governor . metaEvidenceUpdates ( ) ;
62
82
contract . metaEvidence = contract . metaEvidenceUpdates . toHexString ( ) ;
63
- contract . sessionsLength = BigInt . fromI32 ( 1 ) ;
83
+ contract . sessionsLength = BigInt . fromI32 ( 0 ) ;
64
84
contract . submissionsLength = BigInt . fromI32 ( 0 ) ;
65
85
contract . save ( ) ;
66
86
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 ) ;
75
88
76
89
return contract as Contract ;
77
90
}
78
91
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
+
79
118
export function setMetaEvidence ( call : SetMetaEvidenceCall ) : void {
80
119
let contract = initializeContract ( call . to , call . from , call . block . timestamp ) ;
81
120
@@ -156,8 +195,8 @@ export function changeMetaEvidence(call: ChangeMetaEvidenceCall): void {
156
195
}
157
196
158
197
export function submitList ( call : SubmitListCall ) : void {
159
- let contract = initializeContract ( call . to , call . from , call . block . timestamp ) ;
160
198
let governor = Governor . bind ( call . to ) ;
199
+ let contract = initializeContract ( call . to , call . from , call . block . timestamp ) ;
161
200
162
201
let submission = new Submission ( contract . submissionsLength . toHexString ( ) ) ;
163
202
let _submission = governor . submissions ( contract . submissionsLength ) ;
@@ -169,6 +208,7 @@ export function submitList(call: SubmitListCall): void {
169
208
submission . deposit = _submission . value1 ;
170
209
submission . listHash = _submission . value2 ;
171
210
submission . approved = _submission . value4 ;
211
+ submission . withdrawn = false ;
172
212
submission . transactionsLength = BigInt . fromI32 ( call . inputs . _target . length ) ;
173
213
submission . save ( ) ;
174
214
@@ -207,3 +247,65 @@ export function submitList(call: SubmitListCall): void {
207
247
) ;
208
248
session . save ( ) ;
209
249
}
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
+ }
0 commit comments