BCD

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