BCD

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