BCD

Tezos Contract Explorer
Search Networks Deploy
  • Home
  • /
  • Mainnet
  • /
  • Etherlink Fast Kernel Governance
operations (1)Storage Code Interact Tokens Metadata Fork Views Statistics Details
Latest
​x
884
1663
 
1
{ parameter (or (address %trigger_kernel_upgrade)
2
                (or (string %vote) (or (bytes %upvote_proposal) (bytes %new_proposal)))) ;
3
  storage (pair
4
            (pair %config (nat %started_at_level)
5
                          (pair (nat %period_length)
6
                                (pair (nat %adoption_period_sec)
7
                                      (pair (nat %upvoting_limit)
8
                                            (pair (nat %scale)
9
                                                  (pair (nat %proposal_quorum)
10
                                                        (pair (nat %promotion_quorum)
11
                                                              (pair
12
                                                                (nat %promotion_supermajority)
13
                                                                (address %delegation_contract)))))))))
14
            (pair
15
              (option %voting_context (pair (nat %period_index)
16
                                           (or %period
17
                                             (pair %proposal
18
                                               (big_map %upvoters_upvotes_count key_hash
19
                                                                                nat)
20
                                               (pair
21
                                                 (big_map %upvoters_proposals
22
                                                   (pair key_hash bytes)
23
                                                   unit)
24
                                                 (pair
25
                                                   (big_map %proposals bytes
26
                                                                       (pair
27
                                                                         (set %proposers key_hash)
28
                                                                         (nat %upvotes_voting_power)))
29
                                                   (pair
30
                                                     (option %max_upvotes_voting_power nat)
31
                                                     (pair
32
                                                       (option %winner_candidate bytes)
33
                                                       (nat %total_voting_power))))))
34
                                             (pair %promotion
35
                                               (big_map %voters key_hash string)
36
                                               (pair (nat %yea_voting_power)
37
                                                     (pair (nat %nay_voting_power)
38
                                                           (pair
39
                                                             (nat %pass_voting_power)
40
                                                             (pair
41
                                                               (nat %total_voting_power)
42
                                                               (bytes %winner_candidate)))))))))
43
              (pair
44
                (option %last_winner (pair (bytes %payload)
45
                                          (big_map %trigger_history address unit)))
46
                (big_map %metadata string bytes)))) ;
47
  code { PUSH string "NOT_PROPOSAL_PERIOD" ;
48
         PUSH string "NOT_PROMOTION_PERIOD" ;
49
         PUSH string "UPVOTING_LIMIT_EXCEEDED" ;
50
         PUSH string "PROPOSAL_ALREADY_UPVOTED" ;
51
         PUSH string "PROMOTION_ALREADY_VOTED" ;
52
         LAMBDA
53
           (pair nat nat)
54
           bytes
55
           { UNPAIR ;
56
             PUSH nat 56 ;
57
             DUP 2 ;
58
             COMPARE ;
59
             LT ;
60
             IF
61
               { ADD ; BYTES }
62
               { BYTES ;
63
                 DUP ;
64
                 SIZE ;
65
                 PUSH nat 9 ;
66
                 DUP 2 ;
67
                 COMPARE ;
68
                 LT ;
69
                 IF {} { PUSH string "INPUT_TOO_LONG_FOR_RLP" ; FAILWITH } ;
70
                 SWAP ;
71
                 PUSH nat 55 ;
72
                 DIG 3 ;
73
                 DIG 3 ;
74
                 ADD ;
75
                 ADD ;
76
                 BYTES ;
77
                 CONCAT } } ;
78
         LAMBDA
79
           unit
80
           unit
81
           { DROP ;
82
             PUSH string "TEZ_IN_TRANSACTION_DISALLOWED" ;
83
             PUSH mutez 0 ;
84
             AMOUNT ;
85
             COMPARE ;
86
             EQ ;
87
             IF { DROP ; UNIT } { FAILWITH } } ;
88
         LAMBDA
89
           nat
90
           unit
91
           { PUSH nat 0 ;
92
             SWAP ;
93
             COMPARE ;
94
             GT ;
95
             IF { UNIT } { PUSH string "NO_VOTING_POWER" ; FAILWITH } } ;
96
         LAMBDA
97
           (pair nat
98
                 (pair nat
99
                       (pair nat
100
                             (pair nat
101
                                   (pair nat (pair nat (pair nat (pair nat address))))))))
102
           nat
103
           { DUP ;
104
             CAR ;
105
             LEVEL ;
106
             SUB ;
107
             ISNAT ;
108
             IF_NONE
109
               { DROP ; PUSH string "CURRENT_LEVEL_LESS_THAN_START_LEVEL" ; FAILWITH }
110
               { SWAP ; GET 3 ; SWAP ; EDIV ; IF_NONE { PUSH string "DIV by 0" ; FAILWITH } {} ; CAR } } ;
111
         LAMBDA
112
           address
113
           (list key_hash)
114
           { SELF_ADDRESS ;
115
             SOME ;
116
             SENDER ;
117
             PAIR ;
118
             VIEW "list_voters" (list key_hash) ;
119
             IF_NONE
120
               { PUSH string "ASSERTION_FAILURE_DELEGATION_CONTRACT_MISSING_OR_INCONSISTENT" ;
121
                 FAILWITH }
122
               { SENDER ;
123
                 DUP ;
124
                 PACK ;
125
                 PUSH bytes 0x00 ;
126
                 DUP 2 ;
127
                 PUSH nat 1 ;
128
                 PUSH nat 6 ;
129
                 SLICE ;
130
                 IF_NONE { PUSH string "SLICE" ; FAILWITH } {} ;
131
                 COMPARE ;
132
                 EQ ;
133
                 IF {} { PUSH string "NOT_IMPLICIT_ADDRESS" ; FAILWITH } ;
134
                 NIL bytes ;
135
                 DUP 2 ;
136
                 PUSH nat 21 ;
137
                 PUSH nat 7 ;
138
                 SLICE ;
139
                 IF_NONE { PUSH string "SLICE" ; FAILWITH } {} ;
140
                 CONS ;
141
                 PUSH bytes 0x00000015 ;
142
                 CONS ;
143
                 SWAP ;
144
                 PUSH nat 2 ;
145
                 PUSH nat 0 ;
146
                 SLICE ;
147
                 IF_NONE { PUSH string "SLICE" ; FAILWITH } {} ;
148
                 CONS ;
149
                 CONCAT ;
150
                 UNPACK key_hash ;
151
                 PUSH string "FAILED_TO_CAST_ADDRESS_TO_KEY_HASH" ;
152
                 SWAP ;
153
                 IF_NONE { FAILWITH } { SWAP ; DROP } ;
154
                 PUSH string "KEY_HASH_NOT_EQUAL_TO_SOURCE_ADDRESS" ;
155
                 DIG 2 ;
156
                 DUP 3 ;
157
                 IMPLICIT_ACCOUNT ;
158
                 ADDRESS ;
159
                 COMPARE ;
160
                 EQ ;
161
                 IF { DROP } { FAILWITH } ;
162
                 CONS } } ;
163
         DIG 10 ;
164
         UNPAIR ;
165
         IF_LEFT
166
           { DIG 2 ;
167
             DIG 4 ;
168
             DIG 7 ;
169
             DIG 8 ;
170
             DIG 9 ;
171
             DIG 10 ;
172
             DIG 11 ;
173
             DROP 7 ;
174
             UNIT ;
175
             DIG 4 ;
176
             SWAP ;
177
             EXEC ;
178
             DROP ;
179
             DUP 2 ;
180
             CAR ;
181
             DIG 3 ;
182
             SWAP ;
183
             EXEC ;
184
             DUP 3 ;
185
             GET 3 ;
186
             IF_NONE
187
               { NONE (pair nat (pair (or unit unit) (option bytes))) ;
188
                 TOTAL_VOTING_POWER ;
189
                 NONE bytes ;
190
                 NONE nat ;
191
                 EMPTY_BIG_MAP bytes (pair (set key_hash) nat) ;
192
                 EMPTY_BIG_MAP (pair key_hash bytes) unit ;
193
                 EMPTY_BIG_MAP key_hash nat ;
194
                 PAIR 6 ;
195
                 LEFT (pair (big_map key_hash string)
196
                            (pair nat (pair nat (pair nat (pair nat bytes))))) ;
197
                 DIG 2 ;
198
                 PAIR }
199
               { DUP ;
200
                 CAR ;
201
                 DUP 3 ;
202
                 COMPARE ;
203
                 EQ ;
204
                 IF
205
                   { SWAP ; DROP ; NONE (pair nat (pair (or unit unit) (option bytes))) ; SWAP }
206
                   { DUP 4 ;
207
                     CAR ;
208
                     DUP 2 ;
209
                     CDR ;
210
                     IF_LEFT
211
                       { DUP 2 ;
212
                         GET 11 ;
213
                         DUP 2 ;
214
                         GET 10 ;
215
                         MUL ;
216
                         DIG 2 ;
217
                         GET 9 ;
218
                         DUP 3 ;
219
                         GET 7 ;
220
                         IF_NONE { PUSH nat 0 } {} ;
221
                         MUL ;
222
                         COMPARE ;
223
                         GE ;
224
                         IF { DUP ; GET 9 } { NONE bytes } ;
225
                         IF_NONE
226
                           { GET 7 ;
227
                             IF_NONE { PUSH bool False } { DROP ; PUSH bool True } ;
228
                             IF
229
                               { NONE bytes ;
230
                                 UNIT ;
231
                                 LEFT unit ;
232
                                 DIG 2 ;
233
                                 CAR ;
234
                                 DUG 2 ;
235
                                 PUSH nat 1 ;
236
                                 DIG 3 ;
237
                                 ADD ;
238
                                 PAIR 3 ;
239
                                 SOME }
240
                               { DROP ;
241
                                 NONE (pair nat (pair (or unit unit) (option bytes))) } ;
242
                             TOTAL_VOTING_POWER ;
243
                             NONE bytes ;
244
                             NONE nat ;
245
                             EMPTY_BIG_MAP bytes (pair (set key_hash) nat) ;
246
                             EMPTY_BIG_MAP (pair key_hash bytes) unit ;
247
                             EMPTY_BIG_MAP key_hash nat ;
248
                             PAIR 6 ;
249
                             LEFT (pair (big_map key_hash string)
250
                                        (pair nat (pair nat (pair nat (pair nat bytes))))) }
251
                           { SWAP ;
252
                             DROP ;
253
                             PUSH nat 1 ;
254
                             DIG 2 ;
255
                             CAR ;
256
                             ADD ;
257
                             DUP ;
258
                             DUP 4 ;
259
                             COMPARE ;
260
                             EQ ;
261
                             IF
262
                               { DROP ;
263
                                 NONE (pair nat (pair (or unit unit) (option bytes))) ;
264
                                 SWAP ;
265
                                 TOTAL_VOTING_POWER ;
266
                                 PUSH nat 0 ;
267
                                 PUSH nat 0 ;
268
                                 PUSH nat 0 ;
269
                                 EMPTY_BIG_MAP key_hash string ;
270
                                 PAIR 6 ;
271
                                 RIGHT (pair (big_map key_hash nat)
272
                                             (pair (big_map (pair key_hash bytes) unit)
273
                                                   (pair
274
                                                     (big_map bytes
275
                                                              (pair (set key_hash) nat))
276
                                                     (pair (option nat)
277
                                                           (pair (option bytes) nat))))) }
278
                               { SWAP ;
279
                                 DROP ;
280
                                 NONE bytes ;
281
                                 UNIT ;
282
                                 RIGHT unit ;
283
                                 PUSH nat 1 ;
284
                                 DIG 3 ;
285
                                 ADD ;
286
                                 PAIR 3 ;
287
                                 SOME ;
288
                                 TOTAL_VOTING_POWER ;
289
                                 NONE bytes ;
290
                                 NONE nat ;
291
                                 EMPTY_BIG_MAP bytes (pair (set key_hash) nat) ;
292
                                 EMPTY_BIG_MAP (pair key_hash bytes) unit ;
293
                                 EMPTY_BIG_MAP key_hash nat ;
294
                                 PAIR 6 ;
295
                                 LEFT (pair (big_map key_hash string)
296
                                            (pair nat
297
                                                  (pair nat (pair nat (pair nat bytes))))) } } }
298
                       { UNPAIR 6 ;
299
                         DROP ;
300
                         DIG 3 ;
301
                         DUP 6 ;
302
                         GET 13 ;
303
                         MUL ;
304
                         DUP 6 ;
305
                         GET 9 ;
306
                         DIG 4 ;
307
                         DUP 5 ;
308
                         DUP 5 ;
309
                         ADD ;
310
                         ADD ;
311
                         MUL ;
312
                         COMPARE ;
313
                         GE ;
314
                         DIG 2 ;
315
                         DUP 3 ;
316
                         ADD ;
317
                         DUP ;
318
                         DUP 6 ;
319
                         GET 15 ;
320
                         MUL ;
321
                         DIG 5 ;
322
                         GET 9 ;
323
                         DIG 4 ;
324
                         MUL ;
325
                         COMPARE ;
326
                         GE ;
327
                         PUSH nat 0 ;
328
                         DIG 2 ;
329
                         COMPARE ;
330
                         GT ;
331
                         AND ;
332
                         AND ;
333
                         IF { SOME } { DROP ; NONE bytes } ;
334
                         UNIT ;
335
                         RIGHT unit ;
336
                         DIG 2 ;
337
                         CAR ;
338
                         DUG 2 ;
339
                         PUSH nat 1 ;
340
                         DIG 3 ;
341
                         ADD ;
342
                         PAIR 3 ;
343
                         SOME ;
344
                         TOTAL_VOTING_POWER ;
345
                         NONE bytes ;
346
                         NONE nat ;
347
                         EMPTY_BIG_MAP bytes (pair (set key_hash) nat) ;
348
                         EMPTY_BIG_MAP (pair key_hash bytes) unit ;
349
                         EMPTY_BIG_MAP key_hash nat ;
350
                         PAIR 6 ;
351
                         LEFT (pair (big_map key_hash string)
352
                                    (pair nat (pair nat (pair nat (pair nat bytes))))) } ;
353
                     DIG 2 ;
354
                     PAIR } } ;
355
             DUP 2 ;
356
             DIG 2 ;
357
             IF_NONE
358
               { DUP 4 ; GET 5 }
359
               { GET 4 ;
360
                 IF_NONE
361
                   { DUP 4 ; GET 5 }
362
                   { EMPTY_BIG_MAP address unit ; SWAP ; PAIR ; SOME } } ;
363
             DIG 2 ;
364
             SWAP ;
365
             IF_NONE { PUSH string "LAST_WINNER_NOT_FOUND" ; FAILWITH } {} ;
366
             DUP ;
367
             CDR ;
368
             DUP 5 ;
369
             MEM ;
370
             NOT ;
371
             IF {} { PUSH string "UPGRADE_FOR_ADDRESS_ALREADY_TRIGGERED" ; FAILWITH } ;
372
             DUP 4 ;
373
             CONTRACT (or
374
                        (or (pair %d bytes (ticket (pair nat (option bytes))))
375
                            (bytes %a))
376
                        (bytes %u)) ;
377
             IF_NONE { PUSH string "ROLLUP_ENTRYPOINT_NOT_FOUND" ; FAILWITH } {} ;
378
             DUP 6 ;
379
             CAR ;
380
             GET 5 ;
381
             INT ;
382
             NOW ;
383
             ADD ;
384
             PUSH timestamp 0 ;
385
             SWAP ;
386
             SUB ;
387
             ISNAT ;
388
             PUSH string "NEGATIVE_TIMESTAMP" ;
389
             SWAP ;
390
             IF_NONE { FAILWITH } { SWAP ; DROP } ;
391
             BYTES ;
392
             PUSH bytes 0x ;
393
             PUSH int 1 ;
394
             PUSH int 1 ;
395
             DUP 4 ;
396
             SIZE ;
397
             SUB ;
398
             PUSH int 0 ;
399
             DUP 2 ;
400
             DUP 2 ;
401
             COMPARE ;
402
             LE ;
403
             LOOP { DUP ;
404
                    DUG 3 ;
405
                    DIP 3
406
                         { ISNAT ;
407
                           PUSH string "INDEX_NOT_NAT" ;
408
                           SWAP ;
409
                           IF_NONE { FAILWITH } { SWAP ; DROP } ;
410
                           SWAP ;
411
                           DUP 3 ;
412
                           PUSH nat 1 ;
413
                           DIG 3 ;
414
                           SLICE ;
415
                           IF_NONE { PUSH string "SLICE" ; FAILWITH } {} ;
416
                           CONCAT } ;
417
                    DUP 3 ;
418
                    ADD ;
419
                    DUP 2 ;
420
                    DUP 2 ;
421
                    COMPARE ;
422
                    LE } ;
423
             DROP 3 ;
424
             SWAP ;
425
             DROP ;
426
             DUP ;
427
             SIZE ;
428
             INT ;
429
             PUSH int 1 ;
430
             PUSH int 1 ;
431
             PUSH nat 8 ;
432
             SUB ;
433
             DIG 2 ;
434
             DUP 2 ;
435
             DUP 2 ;
436
             COMPARE ;
437
             LE ;
438
             LOOP { DUP ;
439
                    DUG 3 ;
440
                    DIP 3 { DROP ; PUSH bytes 0x00 ; SWAP ; CONCAT } ;
441
                    DUP 3 ;
442
                    ADD ;
443
                    DUP 2 ;
444
                    DUP 2 ;
445
                    COMPARE ;
446
                    LE } ;
447
             DROP 3 ;
448
             NIL bytes ;
449
             SWAP ;
450
             CONS ;
451
             DUP 3 ;
452
             CAR ;
453
             CONS ;
454
             MAP { DUP ;
455
                   SIZE ;
456
                   PUSH bytes 0x80 ;
457
                   DUP 3 ;
458
                   COMPARE ;
459
                   LT ;
460
                   PUSH nat 1 ;
461
                   DUP 3 ;
462
                   COMPARE ;
463
                   EQ ;
464
                   AND ;
465
                   IF
466
                     { DROP ; PUSH bytes 0x }
467
                     { PUSH nat 128 ; SWAP ; PAIR ; DUP 9 ; SWAP ; EXEC } ;
468
                   CONCAT } ;
469
             CONCAT ;
470
             PUSH nat 192 ;
471
             DUP 2 ;
472
             SIZE ;
473
             PAIR ;
474
             DIG 8 ;
475
             SWAP ;
476
             EXEC ;
477
             CONCAT ;
478
             RIGHT (or (pair bytes (ticket (pair nat (option bytes)))) bytes) ;
479
             SWAP ;
480
             PUSH mutez 0 ;
481
             DIG 2 ;
482
             TRANSFER_TOKENS ;
483
             DIG 3 ;
484
             IF_NONE
485
               { NIL operation }
486
               { NIL operation ;
487
                 SWAP ;
488
                 EMIT %voting_finished (pair (nat %finished_at_period_index)
489
                                             (pair
490
                                               (or %finished_at_period_type
491
                                                 (unit %proposal)
492
                                                 (unit %promotion))
493
                                               (option %winner_proposal_payload bytes))) ;
494
                 CONS } ;
495
             DIG 5 ;
496
             DIG 4 ;
497
             SOME ;
498
             UPDATE 3 ;
499
             DUP 4 ;
500
             DIG 4 ;
501
             CDR ;
502
             UNIT ;
503
             SOME ;
504
             DIG 6 ;
505
             UPDATE ;
506
             UPDATE 2 ;
507
             SOME ;
508
             UPDATE 5 ;
509
             SWAP ;
510
             DIG 2 ;
511
             CONS }
512
           { DIG 6 ;
513
             DROP ;
514
             IF_LEFT
515
               { DIG 7 ;
516
                 DIG 8 ;
517
                 DIG 10 ;
518
                 DROP 3 ;
519
                 UNIT ;
520
                 DIG 6 ;
521
                 SWAP ;
522
                 EXEC ;
523
                 DROP ;
524
                 DUP 2 ;
525
                 CAR ;
526
                 DIG 4 ;
527
                 SWAP ;
528
                 EXEC ;
529
                 DUP 3 ;
530
                 GET 3 ;
531
                 IF_NONE
532
                   { NONE (pair nat (pair (or unit unit) (option bytes))) ;
533
                     TOTAL_VOTING_POWER ;
534
                     NONE bytes ;
535
                     NONE nat ;
536
                     EMPTY_BIG_MAP bytes (pair (set key_hash) nat) ;
537
                     EMPTY_BIG_MAP (pair key_hash bytes) unit ;
538
                     EMPTY_BIG_MAP key_hash nat ;
539
                     PAIR 6 ;
540
                     LEFT (pair (big_map key_hash string)
541
                                (pair nat (pair nat (pair nat (pair nat bytes))))) ;
542
                     DIG 2 ;
543
                     PAIR }
544
                   { DUP ;
545
                     CAR ;
546
                     DUP 3 ;
547
                     COMPARE ;
548
                     EQ ;
549
                     IF
550
                       { SWAP ;
551
                         DROP ;
552
                         NONE (pair nat (pair (or unit unit) (option bytes))) ;
553
                         SWAP }
554
                       { DUP 4 ;
555
                         CAR ;
556
                         DUP 2 ;
557
                         CDR ;
558
                         IF_LEFT
559
                           { DUP 2 ;
560
                             GET 11 ;
561
                             DUP 2 ;
562
                             GET 10 ;
563
                             MUL ;
564
                             DIG 2 ;
565
                             GET 9 ;
566
                             DUP 3 ;
567
                             GET 7 ;
568
                             IF_NONE { PUSH nat 0 } {} ;
569
                             MUL ;
570
                             COMPARE ;
571
                             GE ;
572
                             IF { DUP ; GET 9 } { NONE bytes } ;
573
                             IF_NONE
574
                               { GET 7 ;
575
                                 IF_NONE { PUSH bool False } { DROP ; PUSH bool True } ;
576
                                 IF
577
                                   { NONE bytes ;
578
                                     UNIT ;
579
                                     LEFT unit ;
580
                                     DIG 2 ;
581
                                     CAR ;
582
                                     DUG 2 ;
583
                                     PUSH nat 1 ;
584
                                     DIG 3 ;
585
                                     ADD ;
586
                                     PAIR 3 ;
587
                                     SOME }
588
                                   { DROP ;
589
                                     NONE (pair nat (pair (or unit unit) (option bytes))) } ;
590
                                 TOTAL_VOTING_POWER ;
591
                                 NONE bytes ;
592
                                 NONE nat ;
593
                                 EMPTY_BIG_MAP bytes (pair (set key_hash) nat) ;
594
                                 EMPTY_BIG_MAP (pair key_hash bytes) unit ;
595
                                 EMPTY_BIG_MAP key_hash nat ;
596
                                 PAIR 6 ;
597
                                 LEFT (pair (big_map key_hash string)
598
                                            (pair nat
599
                                                  (pair nat (pair nat (pair nat bytes))))) }
600
                               { SWAP ;
601
                                 DROP ;
602
                                 PUSH nat 1 ;
603
                                 DIG 2 ;
604
                                 CAR ;
605
                                 ADD ;
606
                                 DUP ;
607
                                 DUP 4 ;
608
                                 COMPARE ;
609
                                 EQ ;
610
                                 IF
611
                                   { DROP ;
612
                                     NONE (pair nat (pair (or unit unit) (option bytes))) ;
613
                                     SWAP ;
614
                                     TOTAL_VOTING_POWER ;
615
                                     PUSH nat 0 ;
616
                                     PUSH nat 0 ;
617
                                     PUSH nat 0 ;
618
                                     EMPTY_BIG_MAP key_hash string ;
619
                                     PAIR 6 ;
620
                                     RIGHT (pair (big_map key_hash nat)
621
                                                 (pair
622
                                                   (big_map (pair key_hash bytes) unit)
623
                                                   (pair
624
                                                     (big_map bytes
625
                                                              (pair (set key_hash) nat))
626
                                                     (pair (option nat)
627
                                                           (pair (option bytes) nat))))) }
628
                                   { SWAP ;
629
                                     DROP ;
630
                                     NONE bytes ;
631
                                     UNIT ;
632
                                     RIGHT unit ;
633
                                     PUSH nat 1 ;
634
                                     DIG 3 ;
635
                                     ADD ;
636
                                     PAIR 3 ;
637
                                     SOME ;
638
                                     TOTAL_VOTING_POWER ;
639
                                     NONE bytes ;
640
                                     NONE nat ;
641
                                     EMPTY_BIG_MAP bytes (pair (set key_hash) nat) ;
642
                                     EMPTY_BIG_MAP (pair key_hash bytes) unit ;
643
                                     EMPTY_BIG_MAP key_hash nat ;
644
                                     PAIR 6 ;
645
                                     LEFT (pair (big_map key_hash string)
646
                                                (pair nat
647
                                                      (pair nat
648
                                                            (pair nat (pair nat bytes))))) } } }
649
                           { UNPAIR 6 ;
650
                             DROP ;
651
                             DIG 3 ;
652
                             DUP 6 ;
653
                             GET 13 ;
654
                             MUL ;
655
                             DUP 6 ;
656
                             GET 9 ;
657
                             DIG 4 ;
658
                             DUP 5 ;
659
                             DUP 5 ;
660
                             ADD ;
661
                             ADD ;
662
                             MUL ;
663
                             COMPARE ;
664
                             GE ;
665
                             DIG 2 ;
666
                             DUP 3 ;
667
                             ADD ;
668
                             DUP ;
669
                             DUP 6 ;
670
                             GET 15 ;
671
                             MUL ;
672
                             DIG 5 ;
673
                             GET 9 ;
674
                             DIG 4 ;
675
                             MUL ;
676
                             COMPARE ;
677
                             GE ;
678
                             PUSH nat 0 ;
679
                             DIG 2 ;
680
                             COMPARE ;
681
                             GT ;
682
                             AND ;
683
                             AND ;
684
                             IF { SOME } { DROP ; NONE bytes } ;
685
                             UNIT ;
686
                             RIGHT unit ;
687
                             DIG 2 ;
688
                             CAR ;
689
                             DUG 2 ;
690
                             PUSH nat 1 ;
691
                             DIG 3 ;
692
                             ADD ;
693
                             PAIR 3 ;
694
                             SOME ;
695
                             TOTAL_VOTING_POWER ;
696
                             NONE bytes ;
697
                             NONE nat ;
698
                             EMPTY_BIG_MAP bytes (pair (set key_hash) nat) ;
699
                             EMPTY_BIG_MAP (pair key_hash bytes) unit ;
700
                             EMPTY_BIG_MAP key_hash nat ;
701
                             PAIR 6 ;
702
                             LEFT (pair (big_map key_hash string)
703
                                        (pair nat (pair nat (pair nat (pair nat bytes))))) } ;
704
                         DIG 2 ;
705
                         PAIR } } ;
706
                 SWAP ;
707
                 DROP ;
708
                 DUP 3 ;
709
                 CAR ;
710
                 GET 16 ;
711
                 DIG 4 ;
712
                 SWAP ;
713
                 EXEC ;
714
                 DUP 2 ;
715
                 CDR ;
716
                 IF_LEFT { DROP ; DUP 7 ; FAILWITH } {} ;
717
                 PUSH nat 0 ;
718
                 EMPTY_MAP key_hash nat ;
719
                 PAIR ;
720
                 DIG 2 ;
721
                 ITER { SWAP ;
722
                        UNPAIR ;
723
                        DUP 3 ;
724
                        VOTING_POWER ;
725
                        DUP 5 ;
726
                        CAR ;
727
                        DUP 5 ;
728
                        MEM ;
729
                        NOT ;
730
                        NOT ;
731
                        PUSH nat 0 ;
732
                        DUP 3 ;
733
                        COMPARE ;
734
                        EQ ;
735
                        OR ;
736
                        IF
737
                          { DIG 3 ; DROP ; DIG 2 ; ADD ; SWAP }
738
                          { DIG 2 ; DUP 2 ; ADD ; DUG 2 ; SOME ; DIG 3 ; UPDATE } ;
739
                        PAIR } ;
740
                 SWAP ;
741
                 DROP ;
742
                 UNPAIR ;
743
                 SWAP ;
744
                 DIG 5 ;
745
                 SWAP ;
746
                 EXEC ;
747
                 DROP ;
748
                 PUSH nat 0 ;
749
                 DUP 2 ;
750
                 SIZE ;
751
                 COMPARE ;
752
                 GT ;
753
                 IF {} { DUP 5 ; FAILWITH } ;
754
                 DUP 2 ;
755
                 SWAP ;
756
                 ITER { UNPAIR ;
757
                        DIG 2 ;
758
                        CDR ;
759
                        IF_LEFT { DROP ; DUP 7 ; FAILWITH } {} ;
760
                        DUP ;
761
                        CAR ;
762
                        DUP 3 ;
763
                        MEM ;
764
                        NOT ;
765
                        IF {} { DUP 7 ; FAILWITH } ;
766
                        PUSH string "yea" ;
767
                        DUP 6 ;
768
                        COMPARE ;
769
                        EQ ;
770
                        IF
771
                          { DUP ; DIG 3 ; DUP 3 ; GET 3 ; ADD ; UPDATE 3 }
772
                          { PUSH string "nay" ;
773
                            DUP 6 ;
774
                            COMPARE ;
775
                            EQ ;
776
                            IF
777
                              { DUP ; DIG 3 ; DUP 3 ; GET 5 ; ADD ; UPDATE 5 }
778
                              { PUSH string "pass" ;
779
                                DUP 6 ;
780
                                COMPARE ;
781
                                EQ ;
782
                                IF
783
                                  { DUP ; DIG 3 ; DUP 3 ; GET 7 ; ADD ; UPDATE 7 }
784
                                  { DIG 2 ;
785
                                    DROP ;
786
                                    PUSH string "INCORRECT_VOTE_VALUE" ;
787
                                    FAILWITH } } } ;
788
                        SWAP ;
789
                        CAR ;
790
                        DUP 5 ;
791
                        SOME ;
792
                        DIG 3 ;
793
                        UPDATE ;
794
                        UPDATE 1 ;
795
                        RIGHT (pair (big_map key_hash nat)
796
                                    (pair (big_map (pair key_hash bytes) unit)
797
                                          (pair
798
                                            (big_map bytes (pair (set key_hash) nat))
799
                                            (pair (option nat) (pair (option bytes) nat))))) ;
800
                        DUP 2 ;
801
                        SWAP ;
802
                        UPDATE 2 } ;
803
                 SWAP ;
804
                 DIG 2 ;
805
                 DIG 4 ;
806
                 DIG 5 ;
807
                 DROP 4 ;
808
                 SOME ;
809
                 UPDATE 3 ;
810
                 NIL operation }
811
               { DIG 6 ;
812
                 DIG 9 ;
813
                 DROP 2 ;
814
                 IF_LEFT
815
                   { UNIT ;
816
                     DIG 6 ;
817
                     SWAP ;
818
                     EXEC ;
819
                     DROP ;
820
                     DUP 2 ;
821
                     CAR ;
822
                     DIG 4 ;
823
                     SWAP ;
824
                     EXEC ;
825
                     DUP 3 ;
826
                     GET 3 ;
827
                     IF_NONE
828
                       { NONE (pair nat (pair (or unit unit) (option bytes))) ;
829
                         TOTAL_VOTING_POWER ;
830
                         NONE bytes ;
831
                         NONE nat ;
832
                         EMPTY_BIG_MAP bytes (pair (set key_hash) nat) ;
833
                         EMPTY_BIG_MAP (pair key_hash bytes) unit ;
834
                         EMPTY_BIG_MAP key_hash nat ;
835
                         PAIR 6 ;
836
                         LEFT (pair (big_map key_hash string)
837
                                    (pair nat (pair nat (pair nat (pair nat bytes))))) ;
838
                         DIG 2 ;
839
                         PAIR }
840
                       { DUP ;
841
                         CAR ;
842
                         DUP 3 ;
843
                         COMPARE ;
844
                         EQ ;
845
                         IF
846
                           { SWAP ;
847
                             DROP ;
848
                             NONE (pair nat (pair (or unit unit) (option bytes))) ;
849
                             SWAP }
850
                           { DUP 4 ;
851
                             CAR ;
852
                             DUP 2 ;
853
                             CDR ;
854
                             IF_LEFT
855
                               { DUP 2 ;
856
                                 GET 11 ;
857
                                 DUP 2 ;
858
                                 GET 10 ;
859
                                 MUL ;
860
                                 DIG 2 ;
861
                                 GET 9 ;
862
                                 DUP 3 ;
863
                                 GET 7 ;
864
                                 IF_NONE { PUSH nat 0 } {} ;
865
                                 MUL ;
866
                                 COMPARE ;
867
                                 GE ;
868
                                 IF { DUP ; GET 9 } { NONE bytes } ;
869
                                 IF_NONE
870
                                   { GET 7 ;
871
                                     IF_NONE
872
                                       { PUSH bool False }
873
                                       { DROP ; PUSH bool True } ;
874
                                     IF
875
                                       { NONE bytes ;
876
                                         UNIT ;
877
                                         LEFT unit ;
878
                                         DIG 2 ;
879
                                         CAR ;
880
                                         DUG 2 ;
881
                                         PUSH nat 1 ;
882
                                         DIG 3 ;
883
                                         ADD ;
884
                                         PAIR 3 ;
885
                                         SOME }
886
                                       { DROP ;
887
                                         NONE (pair nat
888
                                                    (pair (or unit unit) (option bytes))) } ;
889
                                     TOTAL_VOTING_POWER ;
890
                                     NONE bytes ;
891
                                     NONE nat ;
892
                                     EMPTY_BIG_MAP bytes (pair (set key_hash) nat) ;
893
                                     EMPTY_BIG_MAP (pair key_hash bytes) unit ;
894
                                     EMPTY_BIG_MAP key_hash nat ;
895
                                     PAIR 6 ;
896
                                     LEFT (pair (big_map key_hash string)
897
                                                (pair nat
898
                                                      (pair nat
899
                                                            (pair nat (pair nat bytes))))) }
900
                                   { SWAP ;
901
                                     DROP ;
902
                                     PUSH nat 1 ;
903
                                     DIG 2 ;
904
                                     CAR ;
905
                                     ADD ;
906
                                     DUP ;
907
                                     DUP 4 ;
908
                                     COMPARE ;
909
                                     EQ ;
910
                                     IF
911
                                       { DROP ;
912
                                         NONE (pair nat
913
                                                    (pair (or unit unit) (option bytes))) ;
914
                                         SWAP ;
915
                                         TOTAL_VOTING_POWER ;
916
                                         PUSH nat 0 ;
917
                                         PUSH nat 0 ;
918
                                         PUSH nat 0 ;
919
                                         EMPTY_BIG_MAP key_hash string ;
920
                                         PAIR 6 ;
921
                                         RIGHT (pair (big_map key_hash nat)
922
                                                     (pair
923
                                                       (big_map (pair key_hash bytes)
924
                                                                unit)
925
                                                       (pair
926
                                                         (big_map bytes
927
                                                                  (pair (set key_hash)
928
                                                                        nat))
929
                                                         (pair (option nat)
930
                                                               (pair (option bytes) nat))))) }
931
                                       { SWAP ;
932
                                         DROP ;
933
                                         NONE bytes ;
934
                                         UNIT ;
935
                                         RIGHT unit ;
936
                                         PUSH nat 1 ;
937
                                         DIG 3 ;
938
                                         ADD ;
939
                                         PAIR 3 ;
940
                                         SOME ;
941
                                         TOTAL_VOTING_POWER ;
942
                                         NONE bytes ;
943
                                         NONE nat ;
944
                                         EMPTY_BIG_MAP bytes (pair (set key_hash) nat) ;
945
                                         EMPTY_BIG_MAP (pair key_hash bytes) unit ;
946
                                         EMPTY_BIG_MAP key_hash nat ;
947
                                         PAIR 6 ;
948
                                         LEFT (pair (big_map key_hash string)
949
                                                    (pair nat
950
                                                          (pair nat
951
                                                                (pair nat
952
                                                                      (pair nat bytes))))) } } }
953
                               { UNPAIR 6 ;
954
                                 DROP ;
955
                                 DIG 3 ;
956
                                 DUP 6 ;
957
                                 GET 13 ;
958
                                 MUL ;
959
                                 DUP 6 ;
960
                                 GET 9 ;
961
                                 DIG 4 ;
962
                                 DUP 5 ;
963
                                 DUP 5 ;
964
                                 ADD ;
965
                                 ADD ;
966
                                 MUL ;
967
                                 COMPARE ;
968
                                 GE ;
969
                                 DIG 2 ;
970
                                 DUP 3 ;
971
                                 ADD ;
972
                                 DUP ;
973
                                 DUP 6 ;
974
                                 GET 15 ;
975
                                 MUL ;
976
                                 DIG 5 ;
977
                                 GET 9 ;
978
                                 DIG 4 ;
979
                                 MUL ;
980
                                 COMPARE ;
981
                                 GE ;
982
                                 PUSH nat 0 ;
983
                                 DIG 2 ;
984
                                 COMPARE ;
985
                                 GT ;
986
                                 AND ;
987
                                 AND ;
988
                                 IF { SOME } { DROP ; NONE bytes } ;
989
                                 UNIT ;
990
                                 RIGHT unit ;
991
                                 DIG 2 ;
992
                                 CAR ;
993
                                 DUG 2 ;
994
                                 PUSH nat 1 ;
995
                                 DIG 3 ;
996
                                 ADD ;
997
                                 PAIR 3 ;
998
                                 SOME ;
999
                                 TOTAL_VOTING_POWER ;
1000
                                 NONE bytes ;
1001
                                 NONE nat ;
1002
                                 EMPTY_BIG_MAP bytes (pair (set key_hash) nat) ;
1003
                                 EMPTY_BIG_MAP (pair key_hash bytes) unit ;
1004
                                 EMPTY_BIG_MAP key_hash nat ;
1005
                                 PAIR 6 ;
1006
                                 LEFT (pair (big_map key_hash string)
1007
                                            (pair nat
1008
                                                  (pair nat (pair nat (pair nat bytes))))) } ;
1009
                             DIG 2 ;
1010
                             PAIR } } ;
1011
                     DUP 2 ;
1012
                     DIG 2 ;
1013
                     IF_NONE
1014
                       { DUP 4 ; GET 5 }
1015
                       { GET 4 ;
1016
                         IF_NONE
1017
                           { DUP 4 ; GET 5 }
1018
                           { EMPTY_BIG_MAP address unit ; SWAP ; PAIR ; SOME } } ;
1019
                     DIG 2 ;
1020
                     DUP ;
1021
                     CDR ;
1022
                     IF_LEFT {} { DROP ; DUP 10 ; FAILWITH } ;
1023
                     DUP 6 ;
1024
                     CAR ;
1025
                     GET 16 ;
1026
                     DIG 7 ;
1027
                     SWAP ;
1028
                     EXEC ;
1029
                     PUSH bool False ;
1030
                     PUSH nat 0 ;
1031
                     EMPTY_MAP key_hash nat ;
1032
                     PAIR 3 ;
1033
                     SWAP ;
1034
                     ITER { SWAP ;
1035
                            UNPAIR 3 ;
1036
                            DUP 4 ;
1037
                            VOTING_POWER ;
1038
                            DUP 11 ;
1039
                            CAR ;
1040
                            GET 7 ;
1041
                            DUP 7 ;
1042
                            CAR ;
1043
                            DUP 7 ;
1044
                            GET ;
1045
                            IF_NONE { PUSH nat 0 } {} ;
1046
                            COMPARE ;
1047
                            LT ;
1048
                            NOT ;
1049
                            PUSH nat 0 ;
1050
                            DUP 3 ;
1051
                            COMPARE ;
1052
                            EQ ;
1053
                            OR ;
1054
                            IF
1055
                              { DIG 4 ; DROP ; DIG 3 ; DIG 3 ; DIG 2 ; ADD ; DIG 2 }
1056
                              { DUP 6 ;
1057
                                GET 3 ;
1058
                                DUP 11 ;
1059
                                DUP 7 ;
1060
                                PAIR ;
1061
                                MEM ;
1062
                                IF
1063
                                  { DIG 3 ; DIG 4 ; DROP 2 ; PUSH bool True ; DIG 3 ; DIG 2 ; ADD ; DIG 2 }
1064
                                  { DIG 3 ; DIG 3 ; DUP 3 ; ADD ; DIG 3 ; DIG 3 ; SOME ; DIG 4 ; UPDATE } } ;
1065
                            PAIR 3 } ;
1066
                     SWAP ;
1067
                     DROP ;
1068
                     UNPAIR 3 ;
1069
                     SWAP ;
1070
                     DIG 8 ;
1071
                     SWAP ;
1072
                     EXEC ;
1073
                     DROP ;
1074
                     PUSH nat 0 ;
1075
                     DUP 2 ;
1076
                     SIZE ;
1077
                     COMPARE ;
1078
                     GT ;
1079
                     IF { SWAP ; DROP } { SWAP ; IF { DUP 7 } { DUP 8 } ; FAILWITH } ;
1080
                     DUP 2 ;
1081
                     SWAP ;
1082
                     ITER { UNPAIR ;
1083
                            DIG 2 ;
1084
                            CDR ;
1085
                            IF_LEFT {} { DROP ; DUP 10 ; FAILWITH } ;
1086
                            DUP ;
1087
                            CAR ;
1088
                            DUP 9 ;
1089
                            CAR ;
1090
                            GET 7 ;
1091
                            DUP 2 ;
1092
                            DUP 5 ;
1093
                            GET ;
1094
                            IF_NONE { PUSH nat 0 } {} ;
1095
                            COMPARE ;
1096
                            LT ;
1097
                            IF {} { DUP 11 ; FAILWITH } ;
1098
                            DUP 2 ;
1099
                            GET 5 ;
1100
                            DUP 9 ;
1101
                            GET ;
1102
                            IF_NONE { PUSH string "PROPOSAL_NOT_FOUND" ; FAILWITH } {} ;
1103
                            DUP 3 ;
1104
                            GET 3 ;
1105
                            DUP ;
1106
                            DUP 11 ;
1107
                            DUP 7 ;
1108
                            PAIR ;
1109
                            MEM ;
1110
                            NOT ;
1111
                            IF {} { DUP 12 ; FAILWITH } ;
1112
                            DIG 5 ;
1113
                            DUP 3 ;
1114
                            CDR ;
1115
                            ADD ;
1116
                            DUP 5 ;
1117
                            DUP 5 ;
1118
                            DUP 8 ;
1119
                            GET ;
1120
                            IF_NONE
1121
                              { DIG 4 ; PUSH nat 1 ; SOME ; DUP 8 ; UPDATE }
1122
                              { DIG 5 ; PUSH nat 1 ; DIG 2 ; ADD ; SOME ; DUP 8 ; UPDATE } ;
1123
                            UPDATE 1 ;
1124
                            DIG 2 ;
1125
                            UNIT ;
1126
                            SOME ;
1127
                            DUP 11 ;
1128
                            DIG 7 ;
1129
                            PAIR ;
1130
                            UPDATE ;
1131
                            UPDATE 3 ;
1132
                            DIG 3 ;
1133
                            GET 5 ;
1134
                            DIG 3 ;
1135
                            DUP 4 ;
1136
                            UPDATE 2 ;
1137
                            SOME ;
1138
                            DUP 8 ;
1139
                            UPDATE ;
1140
                            UPDATE 5 ;
1141
                            DUP ;
1142
                            GET 7 ;
1143
                            IF_NONE
1144
                              { SWAP ; SOME ; UPDATE 7 ; DUP 5 ; SOME ; UPDATE 9 }
1145
                              { DUP ;
1146
                                DUP 4 ;
1147
                                COMPARE ;
1148
                                GT ;
1149
                                IF
1150
                                  { DROP ; SWAP ; SOME ; UPDATE 7 ; DUP 5 ; SOME ; UPDATE 9 }
1151
                                  { DIG 2 ; COMPARE ; EQ ; IF { NONE bytes ; UPDATE 9 } {} } } ;
1152
                            LEFT (pair (big_map key_hash string)
1153
                                       (pair nat (pair nat (pair nat (pair nat bytes))))) ;
1154
                            DUP 2 ;
1155
                            SWAP ;
1156
                            UPDATE 2 } ;
1157
                     SWAP ;
1158
                     DIG 4 ;
1159
                     DIG 6 ;
1160
                     DIG 7 ;
1161
                     DIG 8 ;
1162
                     DROP 5 ;
1163
                     DIG 2 ;
1164
                     IF_NONE
1165
                       { NIL operation }
1166
                       { NIL operation ;
1167
                         SWAP ;
1168
                         EMIT %voting_finished (pair (nat %finished_at_period_index)
1169
                                                     (pair
1170
                                                       (or %finished_at_period_type
1171
                                                         (unit %proposal)
1172
                                                         (unit %promotion))
1173
                                                       (option %winner_proposal_payload bytes))) ;
1174
                         CONS } ;
1175
                     DIG 3 ;
1176
                     DIG 2 ;
1177
                     SOME ;
1178
                     UPDATE 3 ;
1179
                     DIG 2 ;
1180
                     UPDATE 5 }
1181
                   { DIG 6 ;
1182
                     DROP ;
1183
                     PUSH nat 33 ;
1184
                     DUP 2 ;
1185
                     SIZE ;
1186
                     COMPARE ;
1187
                     EQ ;
1188
                     IF
1189
                       {}
1190
                       { PUSH string "INCORRECT_KERNEL_ROOT_HASH_LENGTH" ; FAILWITH } ;
1191
                     UNIT ;
1192
                     DIG 6 ;
1193
                     SWAP ;
1194
                     EXEC ;
1195
                     DROP ;
1196
                     DUP 2 ;
1197
                     CAR ;
1198
                     DIG 4 ;
1199
                     SWAP ;
1200
                     EXEC ;
1201
                     DUP 3 ;
1202
                     GET 3 ;
1203
                     IF_NONE
1204
                       { NONE (pair nat (pair (or unit unit) (option bytes))) ;
1205
                         TOTAL_VOTING_POWER ;
1206
                         NONE bytes ;
1207
                         NONE nat ;
1208
                         EMPTY_BIG_MAP bytes (pair (set key_hash) nat) ;
1209
                         EMPTY_BIG_MAP (pair key_hash bytes) unit ;
1210
                         EMPTY_BIG_MAP key_hash nat ;
1211
                         PAIR 6 ;
1212
                         LEFT (pair (big_map key_hash string)
1213
                                    (pair nat (pair nat (pair nat (pair nat bytes))))) ;
1214
                         DIG 2 ;
1215
                         PAIR }
1216
                       { DUP ;
1217
                         CAR ;
1218
                         DUP 3 ;
1219
                         COMPARE ;
1220
                         EQ ;
1221
                         IF
1222
                           { SWAP ;
1223
                             DROP ;
1224
                             NONE (pair nat (pair (or unit unit) (option bytes))) ;
1225
                             SWAP }
1226
                           { DUP 4 ;
1227
                             CAR ;
1228
                             DUP 2 ;
1229
                             CDR ;
1230
                             IF_LEFT
1231
                               { DUP 2 ;
1232
                                 GET 11 ;
1233
                                 DUP 2 ;
1234
                                 GET 10 ;
1235
                                 MUL ;
1236
                                 DIG 2 ;
1237
                                 GET 9 ;
1238
                                 DUP 3 ;
1239
                                 GET 7 ;
1240
                                 IF_NONE { PUSH nat 0 } {} ;
1241
                                 MUL ;
1242
                                 COMPARE ;
1243
                                 GE ;
1244
                                 IF { DUP ; GET 9 } { NONE bytes } ;
1245
                                 IF_NONE
1246
                                   { GET 7 ;
1247
                                     IF_NONE
1248
                                       { PUSH bool False }
1249
                                       { DROP ; PUSH bool True } ;
1250
                                     IF
1251
                                       { NONE bytes ;
1252
                                         UNIT ;
1253
                                         LEFT unit ;
1254
                                         DIG 2 ;
1255
                                         CAR ;
1256
                                         DUG 2 ;
1257
                                         PUSH nat 1 ;
1258
                                         DIG 3 ;
1259
                                         ADD ;
1260
                                         PAIR 3 ;
1261
                                         SOME }
1262
                                       { DROP ;
1263
                                         NONE (pair nat
1264
                                                    (pair (or unit unit) (option bytes))) } ;
1265
                                     TOTAL_VOTING_POWER ;
1266
                                     NONE bytes ;
1267
                                     NONE nat ;
1268
                                     EMPTY_BIG_MAP bytes (pair (set key_hash) nat) ;
1269
                                     EMPTY_BIG_MAP (pair key_hash bytes) unit ;
1270
                                     EMPTY_BIG_MAP key_hash nat ;
1271
                                     PAIR 6 ;
1272
                                     LEFT (pair (big_map key_hash string)
1273
                                                (pair nat
1274
                                                      (pair nat
1275
                                                            (pair nat (pair nat bytes))))) }
1276
                                   { SWAP ;
1277
                                     DROP ;
1278
                                     PUSH nat 1 ;
1279
                                     DIG 2 ;
1280
                                     CAR ;
1281
                                     ADD ;
1282
                                     DUP ;
1283
                                     DUP 4 ;
1284
                                     COMPARE ;
1285
                                     EQ ;
1286
                                     IF
1287
                                       { DROP ;
1288
                                         NONE (pair nat
1289
                                                    (pair (or unit unit) (option bytes))) ;
1290
                                         SWAP ;
1291
                                         TOTAL_VOTING_POWER ;
1292
                                         PUSH nat 0 ;
1293
                                         PUSH nat 0 ;
1294
                                         PUSH nat 0 ;
1295
                                         EMPTY_BIG_MAP key_hash string ;
1296
                                         PAIR 6 ;
1297
                                         RIGHT (pair (big_map key_hash nat)
1298
                                                     (pair
1299
                                                       (big_map (pair key_hash bytes)
1300
                                                                unit)
1301
                                                       (pair
1302
                                                         (big_map bytes
1303
                                                                  (pair (set key_hash)
1304
                                                                        nat))
1305
                                                         (pair (option nat)
1306
                                                               (pair (option bytes) nat))))) }
1307
                                       { SWAP ;
1308
                                         DROP ;
1309
                                         NONE bytes ;
1310
                                         UNIT ;
1311
                                         RIGHT unit ;
1312
                                         PUSH nat 1 ;
1313
                                         DIG 3 ;
1314
                                         ADD ;
1315
                                         PAIR 3 ;
1316
                                         SOME ;
1317
                                         TOTAL_VOTING_POWER ;
1318
                                         NONE bytes ;
1319
                                         NONE nat ;
1320
                                         EMPTY_BIG_MAP bytes (pair (set key_hash) nat) ;
1321
                                         EMPTY_BIG_MAP (pair key_hash bytes) unit ;
1322
                                         EMPTY_BIG_MAP key_hash nat ;
1323
                                         PAIR 6 ;
1324
                                         LEFT (pair (big_map key_hash string)
1325
                                                    (pair nat
1326
                                                          (pair nat
1327
                                                                (pair nat
1328
                                                                      (pair nat bytes))))) } } }
1329
                               { UNPAIR 6 ;
1330
                                 DROP ;
1331
                                 DIG 3 ;
1332
                                 DUP 6 ;
1333
                                 GET 13 ;
1334
                                 MUL ;
1335
                                 DUP 6 ;
1336
                                 GET 9 ;
1337
                                 DIG 4 ;
1338
                                 DUP 5 ;
1339
                                 DUP 5 ;
1340
                                 ADD ;
1341
                                 ADD ;
1342
                                 MUL ;
1343
                                 COMPARE ;
1344
                                 GE ;
1345
                                 DIG 2 ;
1346
                                 DUP 3 ;
1347
                                 ADD ;
1348
                                 DUP ;
1349
                                 DUP 6 ;
1350
                                 GET 15 ;
1351
                                 MUL ;
1352
                                 DIG 5 ;
1353
                                 GET 9 ;
1354
                                 DIG 4 ;
1355
                                 MUL ;
1356
                                 COMPARE ;
1357
                                 GE ;
1358
                                 PUSH nat 0 ;
1359
                                 DIG 2 ;
1360
                                 COMPARE ;
1361
                                 GT ;
1362
                                 AND ;
1363
                                 AND ;
1364
                                 IF { SOME } { DROP ; NONE bytes } ;
1365
                                 UNIT ;
1366
                                 RIGHT unit ;
1367
                                 DIG 2 ;
1368
                                 CAR ;
1369
                                 DUG 2 ;
1370
                                 PUSH nat 1 ;
1371
                                 DIG 3 ;
1372
                                 ADD ;
1373
                                 PAIR 3 ;
1374
                                 SOME ;
1375
                                 TOTAL_VOTING_POWER ;
1376
                                 NONE bytes ;
1377
                                 NONE nat ;
1378
                                 EMPTY_BIG_MAP bytes (pair (set key_hash) nat) ;
1379
                                 EMPTY_BIG_MAP (pair key_hash bytes) unit ;
1380
                                 EMPTY_BIG_MAP key_hash nat ;
1381
                                 PAIR 6 ;
1382
                                 LEFT (pair (big_map key_hash string)
1383
                                            (pair nat
1384
                                                  (pair nat (pair nat (pair nat bytes))))) } ;
1385
                             DIG 2 ;
1386
                             PAIR } } ;
1387
                     DUP 2 ;
1388
                     DIG 2 ;
1389
                     IF_NONE
1390
                       { DUP 4 ; GET 5 }
1391
                       { GET 4 ;
1392
                         IF_NONE
1393
                           { DUP 4 ; GET 5 }
1394
                           { EMPTY_BIG_MAP address unit ; SWAP ; PAIR ; SOME } } ;
1395
                     DIG 2 ;
1396
                     DUP ;
1397
                     CDR ;
1398
                     IF_LEFT { DIG 9 ; DROP } { DROP ; DIG 8 ; FAILWITH } ;
1399
                     DUP 6 ;
1400
                     CAR ;
1401
                     GET 16 ;
1402
                     DIG 7 ;
1403
                     SWAP ;
1404
                     EXEC ;
1405
                     PUSH nat 0 ;
1406
                     PUSH nat 0 ;
1407
                     EMPTY_SET key_hash ;
1408
                     PAIR 3 ;
1409
                     SWAP ;
1410
                     ITER { SWAP ;
1411
                            UNPAIR 3 ;
1412
                            DUP 4 ;
1413
                            VOTING_POWER ;
1414
                            DUP 11 ;
1415
                            CAR ;
1416
                            GET 7 ;
1417
                            DUP 7 ;
1418
                            CAR ;
1419
                            DUP 7 ;
1420
                            GET ;
1421
                            IF_NONE { PUSH nat 0 } {} ;
1422
                            COMPARE ;
1423
                            LT ;
1424
                            NOT ;
1425
                            PUSH nat 0 ;
1426
                            DUP 3 ;
1427
                            COMPARE ;
1428
                            EQ ;
1429
                            OR ;
1430
                            IF
1431
                              { DIG 4 ; DROP ; DIG 3 ; DIG 3 ; DIG 2 ; ADD ; DIG 2 }
1432
                              { DIG 3 ;
1433
                                DUP 2 ;
1434
                                ADD ;
1435
                                DIG 3 ;
1436
                                DIG 2 ;
1437
                                ADD ;
1438
                                DIG 2 ;
1439
                                PUSH bool True ;
1440
                                DIG 4 ;
1441
                                UPDATE } ;
1442
                            PAIR 3 } ;
1443
                     UNPAIR 3 ;
1444
                     SWAP ;
1445
                     DIG 9 ;
1446
                     SWAP ;
1447
                     EXEC ;
1448
                     DROP ;
1449
                     PUSH nat 0 ;
1450
                     DUP 2 ;
1451
                     SIZE ;
1452
                     COMPARE ;
1453
                     GT ;
1454
                     IF { DIG 8 ; DROP } { DIG 8 ; FAILWITH } ;
1455
                     DUP 3 ;
1456
                     GET 5 ;
1457
                     DUP 8 ;
1458
                     MEM ;
1459
                     NOT ;
1460
                     IF {} { PUSH string "PROPOSAL_ALREADY_CREATED" ; FAILWITH } ;
1461
                     DUP 3 ;
1462
                     GET 3 ;
1463
                     DUP 4 ;
1464
                     CAR ;
1465
                     PAIR ;
1466
                     DUP 2 ;
1467
                     ITER { SWAP ;
1468
                            UNPAIR ;
1469
                            SWAP ;
1470
                            UNIT ;
1471
                            SOME ;
1472
                            DUP 11 ;
1473
                            DUP 5 ;
1474
                            PAIR ;
1475
                            UPDATE ;
1476
                            DUP 2 ;
1477
                            DUP 4 ;
1478
                            GET ;
1479
                            IF_NONE
1480
                              { SWAP ; PUSH nat 1 ; SOME ; DIG 3 ; UPDATE }
1481
                              { DIG 2 ; PUSH nat 1 ; DIG 2 ; ADD ; SOME ; DIG 3 ; UPDATE } ;
1482
                            PAIR } ;
1483
                     UNPAIR ;
1484
                     DUP 5 ;
1485
                     SWAP ;
1486
                     UPDATE 1 ;
1487
                     SWAP ;
1488
                     UPDATE 3 ;
1489
                     DIG 3 ;
1490
                     GET 5 ;
1491
                     DUP 4 ;
1492
                     DIG 3 ;
1493
                     PAIR ;
1494
                     SOME ;
1495
                     DUP 8 ;
1496
                     UPDATE ;
1497
                     UPDATE 5 ;
1498
                     DUP ;
1499
                     GET 7 ;
1500
                     IF_NONE
1501
                       { SWAP ; SOME ; UPDATE 7 ; DIG 4 ; SOME ; UPDATE 9 }
1502
                       { DUP ;
1503
                         DUP 4 ;
1504
                         COMPARE ;
1505
                         GT ;
1506
                         IF
1507
                           { DROP ; SWAP ; SOME ; UPDATE 7 ; DIG 4 ; SOME ; UPDATE 9 }
1508
                           { DIG 6 ; DROP ; DIG 2 ; COMPARE ; EQ ; IF { NONE bytes ; UPDATE 9 } {} } } ;
1509
                     LEFT (pair (big_map key_hash string)
1510
                                (pair nat (pair nat (pair nat (pair nat bytes))))) ;
1511
                     DIG 3 ;
1512
                     IF_NONE
1513
                       { NIL operation }
1514
                       { NIL operation ;
1515
                         SWAP ;
1516
                         EMIT %voting_finished (pair (nat %finished_at_period_index)
1517
                                                     (pair
1518
                                                       (or %finished_at_period_type
1519
                                                         (unit %proposal)
1520
                                                         (unit %promotion))
1521
                                                       (option %winner_proposal_payload bytes))) ;
1522
                         CONS } ;
1523
                     DIG 4 ;
1524
                     DIG 3 ;
1525
                     DIG 3 ;
1526
                     UPDATE 2 ;
1527
                     SOME ;
1528
                     UPDATE 3 ;
1529
                     DIG 2 ;
1530
                     UPDATE 5 } ;
1531
                 SWAP } } ;
1532
         PAIR } ;
1533
  view "get_voting_state" unit
1534
        (pair (nat %period_index)
1535
              (pair (or %period_type (unit %proposal) (unit %promotion))
1536
                    (pair (nat %remaining_blocks)
1537
                          (option %finished_voting (pair (nat %finished_at_period_index)
1538
                                                        (pair
1539
                                                          (or %finished_at_period_type
1540
                                                            (unit %proposal)
1541
                                                            (unit %promotion))
1542
                                                          (option %winner_proposal_payload bytes)))))))
1543
        { PUSH string "CURRENT_LEVEL_LESS_THAN_START_LEVEL" ;
1544
          SWAP ;
1545
          CDR ;
1546
          DUP ;
1547
          CAR ;
1548
          DUP ;
1549
          CAR ;
1550
          LEVEL ;
1551
          SUB ;
1552
          ISNAT ;
1553
          IF_NONE
1554
            { DROP ; DUP 2 ; FAILWITH }
1555
            { SWAP ; GET 3 ; SWAP ; EDIV ; IF_NONE { PUSH string "DIV by 0" ; FAILWITH } {} ; CAR } ;
1556
          DUP 2 ;
1557
          GET 3 ;
1558
          IF_NONE
1559
            { NONE (pair nat (pair (or unit unit) (option bytes))) ;
1560
              TOTAL_VOTING_POWER ;
1561
              NONE bytes ;
1562
              NONE nat ;
1563
              EMPTY_BIG_MAP bytes (pair (set key_hash) nat) ;
1564
              EMPTY_BIG_MAP (pair key_hash bytes) unit ;
1565
              EMPTY_BIG_MAP key_hash nat ;
1566
              PAIR 6 ;
1567
              LEFT (pair (big_map key_hash string)
1568
                         (pair nat (pair nat (pair nat (pair nat bytes))))) ;
1569
              DIG 2 ;
1570
              PAIR }
1571
            { DUP ;
1572
              CAR ;
1573
              DUP 3 ;
1574
              COMPARE ;
1575
              EQ ;
1576
              IF
1577
                { SWAP ; DROP ; NONE (pair nat (pair (or unit unit) (option bytes))) ; SWAP }
1578
                { DUP 3 ;
1579
                  CAR ;
1580
                  DUP 2 ;
1581
                  CDR ;
1582
                  IF_LEFT
1583
                    { DUP 2 ;
1584
                      GET 11 ;
1585
                      DUP 2 ;
1586
                      GET 10 ;
1587
                      MUL ;
1588
                      DIG 2 ;
1589
                      GET 9 ;
1590
                      DUP 3 ;
1591
                      GET 7 ;
1592
                      IF_NONE { PUSH nat 0 } {} ;
1593
                      MUL ;
1594
                      COMPARE ;
1595
                      GE ;
1596
                      IF { DUP ; GET 9 } { NONE bytes } ;
1597
                      IF_NONE
1598
                        { GET 7 ;
1599
                          IF_NONE { PUSH bool False } { DROP ; PUSH bool True } ;
1600
                          IF
1601
                            { NONE bytes ;
1602
                              UNIT ;
1603
                              LEFT unit ;
1604
                              DIG 2 ;
1605
                              CAR ;
1606
                              DUG 2 ;
1607
                              PUSH nat 1 ;
1608
                              DIG 3 ;
1609
                              ADD ;
1610
                              PAIR 3 ;
1611
                              SOME }
1612
                            { DROP ;
1613
                              NONE (pair nat (pair (or unit unit) (option bytes))) } ;
1614
                          TOTAL_VOTING_POWER ;
1615
                          NONE bytes ;
1616
                          NONE nat ;
1617
                          EMPTY_BIG_MAP bytes (pair (set key_hash) nat) ;
1618
                          EMPTY_BIG_MAP (pair key_hash bytes) unit ;
1619
                          EMPTY_BIG_MAP key_hash nat ;
1620
                          PAIR 6 ;
1621
                          LEFT (pair (big_map key_hash string)
1622
                                     (pair nat (pair nat (pair nat (pair nat bytes))))) }
1623
                        { SWAP ;
1624
                          DROP ;
1625
                          PUSH nat 1 ;
1626
                          DIG 2 ;
1627
                          CAR ;
1628
                          ADD ;
1629
                          DUP ;
1630
                          DUP 4 ;
1631
                          COMPARE ;
1632
                          EQ ;
1633
                          IF
1634
                            { DROP ;
1635
                              NONE (pair nat (pair (or unit unit) (option bytes))) ;
1636
                              SWAP ;
1637
                              TOTAL_VOTING_POWER ;
1638
                              PUSH nat 0 ;
1639
                              PUSH nat 0 ;
1640
                              PUSH nat 0 ;
1641
                              EMPTY_BIG_MAP key_hash string ;
1642
                              PAIR 6 ;
1643
                              RIGHT (pair (big_map key_hash nat)
1644
                                          (pair (big_map (pair key_hash bytes) unit)
1645
                                                (pair
1646
                                                  (big_map bytes
1647
                                                           (pair (set key_hash) nat))
1648
                                                  (pair (option nat)
1649
                                                        (pair (option bytes) nat))))) }
1650
                            { SWAP ;
1651
                              DROP ;
1652
                              NONE bytes ;
1653
                              UNIT ;
1654
                              RIGHT unit ;
1655
                              PUSH nat 1 ;
1656
                              DIG 3 ;
1657
                              ADD ;
1658
                              PAIR 3 ;
1659
                              SOME ;
1660
                              TOTAL_VOTING_POWER ;
1661
                              NONE bytes ;
1662
                              NONE nat ;
1663
                              EMPTY_BIG_MAP bytes (pair (set key_hash) nat) ;
1664
                              EMPTY_BIG_MAP (pair key_hash bytes) unit ;
1665
                              EMPTY_BIG_MAP key_hash nat ;
1666
                              PAIR 6 ;
1667
                              LEFT (pair (big_map key_hash string)
1668
                                         (pair nat
1669
                                               (pair nat (pair nat (pair nat bytes))))) } } }
1670
                    { UNPAIR 6 ;
1671
                      DROP ;
1672
                      DIG 3 ;
1673
                      DUP 6 ;
1674
                      GET 13 ;
1675
                      MUL ;
1676
                      DUP 6 ;
1677
                      GET 9 ;
1678
                      DIG 4 ;
1679
                      DUP 5 ;
1680
                      DUP 5 ;
1681
                      ADD ;
1682
                      ADD ;
1683
                      MUL ;
1684
                      COMPARE ;
1685
                      GE ;
1686
                      DIG 2 ;
1687
                      DUP 3 ;
1688
                      ADD ;
1689
                      DUP ;
1690
                      DUP 6 ;
1691
                      GET 15 ;
1692
                      MUL ;
1693
                      DIG 5 ;
1694
                      GET 9 ;
1695
                      DIG 4 ;
1696
                      MUL ;
1697
                      COMPARE ;
1698
                      GE ;
1699
                      PUSH nat 0 ;
1700
                      DIG 2 ;
1701
                      COMPARE ;
1702
                      GT ;
1703
                      AND ;
1704
                      AND ;
1705
                      IF { SOME } { DROP ; NONE bytes } ;
1706
                      UNIT ;
1707
                      RIGHT unit ;
1708
                      DIG 2 ;
1709
                      CAR ;
1710
                      DUG 2 ;
1711
                      PUSH nat 1 ;
1712
                      DIG 3 ;
1713
                      ADD ;
1714
                      PAIR 3 ;
1715
                      SOME ;
1716
                      TOTAL_VOTING_POWER ;
1717
                      NONE bytes ;
1718
                      NONE nat ;
1719
                      EMPTY_BIG_MAP bytes (pair (set key_hash) nat) ;
1720
                      EMPTY_BIG_MAP (pair key_hash bytes) unit ;
1721
                      EMPTY_BIG_MAP key_hash nat ;
1722
                      PAIR 6 ;
1723
                      LEFT (pair (big_map key_hash string)
1724
                                 (pair nat (pair nat (pair nat (pair nat bytes))))) } ;
1725
                  DIG 2 ;
1726
                  PAIR } } ;
1727
          DUP 2 ;
1728
          DIG 2 ;
1729
          IF_NONE
1730
            { DUP 3 ; GET 5 }
1731
            { GET 4 ;
1732
              IF_NONE
1733
                { DUP 3 ; GET 5 }
1734
                { EMPTY_BIG_MAP address unit ; SWAP ; PAIR ; SOME } } ;
1735
          DIG 2 ;
1736
          PAIR 3 ;
1737
          DUP ;
1738
          CAR ;
1739
          SWAP ;
1740
          GET 4 ;
1741
          DIG 2 ;
1742
          CAR ;
1743
          DUP ;
1744
          CAR ;
1745
          LEVEL ;
1746
          SUB ;
1747
          SWAP ;
1748
          GET 3 ;
1749
          SWAP ;
1750
          ISNAT ;
1751
          IF_NONE
1752
            { DROP ; DIG 2 ; FAILWITH }
1753
            { DIG 4 ;
1754
              DROP ;
1755
              DUP 2 ;
1756
              SWAP ;
1757
              EDIV ;
1758
              IF_NONE { PUSH string "MOD by 0" ; FAILWITH } {} ;
1759
              CDR ;
1760
              SWAP ;
1761
              SUB ;
1762
              ISNAT ;
1763
              IF_NONE { PUSH string "option is None" ; FAILWITH } {} } ;
1764
          DUP 3 ;
1765
          CDR ;
1766
          IF_LEFT { DROP ; UNIT ; LEFT unit } { DROP ; UNIT ; RIGHT unit } ;
1767
          DIG 3 ;
1768
          CAR ;
1769
          PAIR 4 } }