BCD

Tezos Contract Explorer
Search Networks Deploy
  • Home
  • /
  • Ghostnet
  • /
  • KT1Cm2p...GjWo
operations (1)Storage Code Interact Tokens Fork Views Statistics Details
Latest
​x
1141
 
1
{ parameter (or (unit %snapshot)
2
                (or (pair %insert (bytes %key) (bytes %value))
3
                    (list %configure (or (address %update_administrator)
4
                                        (or (nat %update_max_state_size)
5
                                            (nat %update_snapshot_duration)))))) ;
6
  storage (pair
7
            (pair %config (address %administrator)
8
                          (pair (nat %max_state_size) (nat %snapshot_duration)))
9
            (pair
10
              (pair %merkle_tree
11
                (map %nodes bytes
12
                            (map int
13
                                 (pair (pair %label (nat %data) (nat %length))
14
                                       (bytes %node))))
15
                (pair (bytes %root)
16
                      (pair
17
                        (pair %root_edge (pair %label (nat %data) (nat %length))
18
                                         (bytes %node))
19
                        (map %states bytes bytes))))
20
              (pair (nat %snapshot_counter)
21
                    (pair (big_map %snapshot_level nat nat) (nat %snapshot_start_level))))) ;
22
  code { LAMBDA
23
           (pair bool
24
                 (pair (list operation)
25
                       (pair (pair address (pair nat nat))
26
                             (pair
27
                               (pair (map bytes (map int (pair (pair nat nat) bytes)))
28
                                     (pair bytes
29
                                           (pair (pair (pair nat nat) bytes)
30
                                                 (map bytes bytes))))
31
                               (pair nat (pair (big_map nat nat) nat))))))
32
           (pair unit
33
                 (pair (list operation)
34
                       (pair (pair address (pair nat nat))
35
                             (pair
36
                               (pair (map bytes (map int (pair (pair nat nat) bytes)))
37
                                     (pair bytes
38
                                           (pair (pair (pair nat nat) bytes)
39
                                                 (map bytes bytes))))
40
                               (pair nat (pair (big_map nat nat) nat))))))
41
           { UNPAIR 3 ;
42
             SWAP ;
43
             PUSH nat 0 ;
44
             DUP 4 ;
45
             GET 8 ;
46
             COMPARE ;
47
             EQ ;
48
             IF
49
               { DIG 2 ;
50
                 LEVEL ;
51
                 UPDATE 8 ;
52
                 EMPTY_MAP bytes bytes ;
53
                 PUSH (pair (pair nat nat) bytes) (Pair (Pair 0 0) 0x) ;
54
                 PUSH bytes 0x ;
55
                 EMPTY_MAP bytes (map int (pair (pair nat nat) bytes)) ;
56
                 PAIR 4 ;
57
                 UPDATE 3 ;
58
                 DUG 2 }
59
               {} ;
60
             LEVEL ;
61
             DIG 3 ;
62
             DUP ;
63
             CAR ;
64
             GET 4 ;
65
             SWAP ;
66
             DUP ;
67
             DUG 5 ;
68
             GET 8 ;
69
             ADD ;
70
             COMPARE ;
71
             LT ;
72
             IF
73
               { DIG 2 ;
74
                 DUP ;
75
                 GET 5 ;
76
                 PUSH nat 1 ;
77
                 ADD ;
78
                 UPDATE 5 ;
79
                 DUG 2 ;
80
                 PUSH nat 1 ;
81
                 LEVEL ;
82
                 SUB ;
83
                 ISNAT ;
84
                 IF_NONE { PUSH int 324 ; FAILWITH } {} ;
85
                 DUP 4 ;
86
                 DUP ;
87
                 GET 7 ;
88
                 DUP 3 ;
89
                 SOME ;
90
                 DIG 6 ;
91
                 GET 5 ;
92
                 UPDATE ;
93
                 UPDATE 7 ;
94
                 LEVEL ;
95
                 UPDATE 8 ;
96
                 EMPTY_MAP bytes bytes ;
97
                 PUSH (pair (pair nat nat) bytes) (Pair (Pair 0 0) 0x) ;
98
                 PUSH bytes 0x ;
99
                 EMPTY_MAP bytes (map int (pair (pair nat nat) bytes)) ;
100
                 PAIR 4 ;
101
                 DIG 4 ;
102
                 DROP ;
103
                 UPDATE 3 ;
104
                 DUG 2 ;
105
                 SWAP ;
106
                 DUP 3 ;
107
                 GET 5 ;
108
                 DIG 2 ;
109
                 PAIR ;
110
                 EMIT %SNAPSHOT_FINALIZED (pair (nat %level) (nat %snapshot)) ;
111
                 CONS }
112
               { SWAP ; IF { PUSH string "CANNOT_SNAPSHOT" ; FAILWITH } {} } ;
113
             UNIT ;
114
             PAIR 3 } ;
115
         SWAP ;
116
         LAMBDA_REC
117
           (pair (pair (pair (pair nat nat) bytes) (pair nat nat))
118
                 (pair
119
                   (pair (map bytes (map int (pair (pair nat nat) bytes)))
120
                         (pair bytes
121
                               (pair (pair (pair nat nat) bytes) (map bytes bytes))))
122
                   bytes))
123
           (pair
124
             (pair (map bytes (map int (pair (pair nat nat) bytes)))
125
                   (pair bytes (pair (pair (pair nat nat) bytes) (map bytes bytes))))
126
             (pair (pair nat nat) bytes))
127
           { DUP ;
128
             UNPAIR ;
129
             UNPAIR ;
130
             DIG 2 ;
131
             UNPAIR ;
132
             DUP ;
133
             LAMBDA
134
               (pair nat nat)
135
               (pair int (pair nat nat))
136
               { DUP ;
137
                 CDR ;
138
                 PUSH nat 0 ;
139
                 COMPARE ;
140
                 LT ;
141
                 IF {} { PUSH string "EMPTY_KEY" ; FAILWITH } ;
142
                 DUP ;
143
                 CDR ;
144
                 PUSH nat 1 ;
145
                 SWAP ;
146
                 SUB ;
147
                 ISNAT ;
148
                 IF_NONE { PUSH int 0 ; FAILWITH } {} ;
149
                 PUSH nat 1 ;
150
                 DUP ;
151
                 DUP 4 ;
152
                 CDR ;
153
                 SUB ;
154
                 ISNAT ;
155
                 IF_NONE { PUSH int 0 ; FAILWITH } {} ;
156
                 PUSH nat 1 ;
157
                 LSL ;
158
                 SUB ;
159
                 ISNAT ;
160
                 IF_NONE { PUSH int 21 ; FAILWITH } {} ;
161
                 DUP 3 ;
162
                 CAR ;
163
                 AND ;
164
                 PAIR ;
165
                 PUSH nat 1 ;
166
                 DUP 3 ;
167
                 CDR ;
168
                 SUB ;
169
                 ISNAT ;
170
                 IF_NONE { PUSH int 0 ; FAILWITH } {} ;
171
                 DIG 2 ;
172
                 CAR ;
173
                 LSR ;
174
                 INT ;
175
                 PAIR } ;
176
             LAMBDA
177
               (pair (pair nat nat) nat)
178
               (pair nat nat)
179
               { UNPAIR ;
180
                 DUP ;
181
                 DUG 2 ;
182
                 CDR ;
183
                 SUB ;
184
                 ISNAT ;
185
                 IF_NONE { PUSH string "PREFIX_TOO_LONG" ; FAILWITH } {} ;
186
                 DUP ;
187
                 PUSH nat 0 ;
188
                 COMPARE ;
189
                 EQ ;
190
                 IF
191
                   { DROP 2 ; PUSH (pair nat nat) (Pair 0 0) }
192
                   { DUP ;
193
                     PUSH nat 1 ;
194
                     DIG 2 ;
195
                     PUSH nat 1 ;
196
                     LSL ;
197
                     SUB ;
198
                     ISNAT ;
199
                     IF_NONE { PUSH int 21 ; FAILWITH } {} ;
200
                     DIG 2 ;
201
                     CAR ;
202
                     AND ;
203
                     PAIR } } ;
204
             LAMBDA
205
               (pair (pair nat nat) (pair nat nat))
206
               (pair (pair nat nat) (pair nat nat))
207
               { DUP ;
208
                 UNPAIR ;
209
                 SWAP ;
210
                 DUP ;
211
                 DUG 2 ;
212
                 CDR ;
213
                 SWAP ;
214
                 DUP ;
215
                 DUG 2 ;
216
                 CDR ;
217
                 COMPARE ;
218
                 LT ;
219
                 IF { DUP ; CDR } { SWAP ; DUP ; DUG 2 ; CDR } ;
220
                 PUSH nat 0 ;
221
                 PUSH bool False ;
222
                 DUP 3 ;
223
                 DUP 3 ;
224
                 COMPARE ;
225
                 LT ;
226
                 LOOP { PUSH nat 1 ;
227
                        DUP 3 ;
228
                        ADD ;
229
                        DUP 6 ;
230
                        CDR ;
231
                        SUB ;
232
                        ISNAT ;
233
                        IF_NONE { PUSH int 25 ; FAILWITH } {} ;
234
                        DUP 6 ;
235
                        CAR ;
236
                        LSR ;
237
                        PUSH nat 1 ;
238
                        DUP 4 ;
239
                        ADD ;
240
                        DUP 6 ;
241
                        CDR ;
242
                        SUB ;
243
                        ISNAT ;
244
                        IF_NONE { PUSH int 25 ; FAILWITH } {} ;
245
                        DUP 6 ;
246
                        CAR ;
247
                        LSR ;
248
                        COMPARE ;
249
                        EQ ;
250
                        IF
251
                          { PUSH nat 1 ; DIG 2 ; ADD ; SWAP }
252
                          { DROP ; PUSH bool True } ;
253
                        DUP ;
254
                        IF { PUSH bool False } { DUP 3 ; DUP 3 ; COMPARE ; LT } } ;
255
                 DROP ;
256
                 SWAP ;
257
                 DROP ;
258
                 DIG 2 ;
259
                 DROP ;
260
                 DIG 2 ;
261
                 DROP ;
262
                 SWAP ;
263
                 DUP ;
264
                 CDR ;
265
                 DUP 3 ;
266
                 COMPARE ;
267
                 LE ;
268
                 IF { PUSH nat 256 ; DUP 3 ; COMPARE ; LE } { PUSH bool False } ;
269
                 IF {} { PUSH string "BAD_POS" ; FAILWITH } ;
270
                 SWAP ;
271
                 DUP ;
272
                 DUG 2 ;
273
                 PUSH nat 0 ;
274
                 PAIR ;
275
                 PUSH nat 0 ;
276
                 DUP 4 ;
277
                 COMPARE ;
278
                 NEQ ;
279
                 IF
280
                   { DUP 3 ;
281
                     DUP 3 ;
282
                     CDR ;
283
                     SUB ;
284
                     ISNAT ;
285
                     IF_NONE { PUSH int 25 ; FAILWITH } {} ;
286
                     DUP 3 ;
287
                     CAR ;
288
                     LSR ;
289
                     UPDATE 1 }
290
                   {} ;
291
                 DUP 3 ;
292
                 DUP 3 ;
293
                 CDR ;
294
                 SUB ;
295
                 ISNAT ;
296
                 IF_NONE { PUSH int 0 ; FAILWITH } {} ;
297
                 PUSH nat 1 ;
298
                 DIG 4 ;
299
                 DUP 5 ;
300
                 CDR ;
301
                 SUB ;
302
                 ISNAT ;
303
                 IF_NONE { PUSH int 0 ; FAILWITH } {} ;
304
                 PUSH nat 1 ;
305
                 LSL ;
306
                 SUB ;
307
                 ISNAT ;
308
                 IF_NONE { PUSH int 21 ; FAILWITH } {} ;
309
                 DIG 3 ;
310
                 CAR ;
311
                 AND ;
312
                 PAIR ;
313
                 SWAP ;
314
                 PAIR } ;
315
             DUP 7 ;
316
             CAR ;
317
             CDR ;
318
             DUP 9 ;
319
             CDR ;
320
             COMPARE ;
321
             GE ;
322
             IF {} { PUSH string "KEY_LENGTH_MISMATCH" ; FAILWITH } ;
323
             DUP ;
324
             DUP 8 ;
325
             CAR ;
326
             DUP 10 ;
327
             PAIR ;
328
             EXEC ;
329
             UNPAIR ;
330
             PUSH nat 0 ;
331
             DUP 3 ;
332
             CDR ;
333
             COMPARE ;
334
             EQ ;
335
             IF
336
               { SWAP ;
337
                 DROP ;
338
                 SWAP ;
339
                 DROP ;
340
                 SWAP ;
341
                 DROP ;
342
                 SWAP ;
343
                 DROP ;
344
                 DIG 2 ;
345
                 DROP ;
346
                 DIG 3 ;
347
                 DROP ;
348
                 DIG 3 ;
349
                 DROP ;
350
                 DIG 3 ;
351
                 DROP ;
352
                 DIG 3 ;
353
                 DROP ;
354
                 DUG 2 ;
355
                 PAIR }
356
               { DUP 5 ;
357
                 DUP 3 ;
358
                 EXEC ;
359
                 UNPAIR ;
360
                 DUP 11 ;
361
                 CAR ;
362
                 CDR ;
363
                 DUP 4 ;
364
                 CDR ;
365
                 COMPARE ;
366
                 GE ;
367
                 IF
368
                   { DIG 4 ;
369
                     DROP ;
370
                     DIG 4 ;
371
                     DROP ;
372
                     DIG 4 ;
373
                     DROP ;
374
                     DIG 5 ;
375
                     DROP ;
376
                     DIG 7 ;
377
                     DROP ;
378
                     DIG 7 ;
379
                     DROP ;
380
                     PUSH nat 1 ;
381
                     DIG 4 ;
382
                     CDR ;
383
                     COMPARE ;
384
                     GT ;
385
                     IF {} { PUSH string "BAD_KEY" ; FAILWITH } ;
386
                     DUP 4 ;
387
                     CAR ;
388
                     DUP 7 ;
389
                     CDR ;
390
                     GET ;
391
                     IF_NONE { PUSH int 398 ; FAILWITH } {} ;
392
                     DIG 7 ;
393
                     DIG 6 ;
394
                     DIG 6 ;
395
                     PAIR ;
396
                     DIG 4 ;
397
                     DUP 4 ;
398
                     DUP 6 ;
399
                     GET ;
400
                     IF_NONE { PUSH int 402 ; FAILWITH } {} ;
401
                     PAIR ;
402
                     PAIR ;
403
                     EXEC ;
404
                     UNPAIR ;
405
                     DUG 4 ;
406
                     SOME ;
407
                     DIG 2 ;
408
                     UPDATE ;
409
                     DIG 2 ;
410
                     DUP ;
411
                     CAR ;
412
                     NONE (map int (pair (pair nat nat) bytes)) ;
413
                     DIG 5 ;
414
                     CDR ;
415
                     UPDATE ;
416
                     UPDATE 1 ;
417
                     DUG 2 ;
418
                     DUP ;
419
                     PUSH int 1 ;
420
                     GET ;
421
                     IF_NONE { PUSH int 53 ; FAILWITH } {} ;
422
                     CDR ;
423
                     SWAP ;
424
                     DUP ;
425
                     DUG 2 ;
426
                     PUSH int 0 ;
427
                     GET ;
428
                     IF_NONE { PUSH int 52 ; FAILWITH } {} ;
429
                     CDR ;
430
                     CONCAT ;
431
                     KECCAK ;
432
                     DIG 3 ;
433
                     DUP ;
434
                     CAR ;
435
                     DIG 3 ;
436
                     SOME ;
437
                     DUP 4 ;
438
                     UPDATE ;
439
                     UPDATE 1 ;
440
                     PAIR }
441
                   { DIG 3 ;
442
                     DROP ;
443
                     DIG 3 ;
444
                     DROP ;
445
                     DIG 4 ;
446
                     DROP ;
447
                     DIG 5 ;
448
                     DROP ;
449
                     DIG 7 ;
450
                     DROP ;
451
                     DIG 7 ;
452
                     DROP ;
453
                     DIG 7 ;
454
                     DROP ;
455
                     EMPTY_MAP int (pair (pair nat nat) bytes) ;
456
                     DIG 6 ;
457
                     DIG 3 ;
458
                     PAIR ;
459
                     SOME ;
460
                     DUP 3 ;
461
                     UPDATE ;
462
                     DUP 6 ;
463
                     CDR ;
464
                     DIG 4 ;
465
                     PUSH nat 1 ;
466
                     DUP 6 ;
467
                     CDR ;
468
                     ADD ;
469
                     DIG 7 ;
470
                     CAR ;
471
                     PAIR ;
472
                     EXEC ;
473
                     PAIR ;
474
                     SOME ;
475
                     DIG 2 ;
476
                     PUSH int 1 ;
477
                     SUB ;
478
                     UPDATE ;
479
                     DUP ;
480
                     PUSH int 1 ;
481
                     GET ;
482
                     IF_NONE { PUSH int 53 ; FAILWITH } {} ;
483
                     CDR ;
484
                     SWAP ;
485
                     DUP ;
486
                     DUG 2 ;
487
                     PUSH int 0 ;
488
                     GET ;
489
                     IF_NONE { PUSH int 52 ; FAILWITH } {} ;
490
                     CDR ;
491
                     CONCAT ;
492
                     KECCAK ;
493
                     DIG 3 ;
494
                     DUP ;
495
                     CAR ;
496
                     DIG 3 ;
497
                     SOME ;
498
                     DUP 4 ;
499
                     UPDATE ;
500
                     UPDATE 1 ;
501
                     PAIR } } ;
502
             UNPAIR ;
503
             SWAP ;
504
             DIG 2 ;
505
             PAIR ;
506
             SWAP ;
507
             PAIR } ;
508
         SWAP ;
509
         UNPAIR ;
510
         IF_LEFT
511
           { DROP ; SWAP ; DROP ; NIL operation ; DIG 2 ; PUSH bool True ; SWAP ; DUG 3 ; PAIR 3 ; EXEC ; CDR ; UNPAIR }
512
           { IF_LEFT
513
               { LAMBDA
514
                   bytes
515
                   nat
516
                   { DUP ;
517
                     SIZE ;
518
                     DUP ;
519
                     PUSH nat 0 ;
520
                     SWAP ;
521
                     PUSH nat 0 ;
522
                     DUP ;
523
                     DUP 3 ;
524
                     COMPARE ;
525
                     GT ;
526
                     LOOP { DUP 5 ;
527
                            PUSH nat 1 ;
528
                            DUP 3 ;
529
                            SLICE ;
530
                            IF_NONE { PUSH int 126 ; FAILWITH } {} ;
531
                            PUSH nat 2 ;
532
                            PUSH nat 1 ;
533
                            DUP 4 ;
534
                            ADD ;
535
                            DUP 7 ;
536
                            SUB ;
537
                            ISNAT ;
538
                            IF_NONE { PUSH int 127 ; FAILWITH } {} ;
539
                            MUL ;
540
                            PUSH nat 1 ;
541
                            PUSH nat 16 ;
542
                            DUP 3 ;
543
                            DUP ;
544
                            PUSH nat 0 ;
545
                            COMPARE ;
546
                            NEQ ;
547
                            LOOP { PUSH nat 0 ;
548
                                   PUSH nat 2 ;
549
                                   DUP 3 ;
550
                                   EDIV ;
551
                                   IF_NONE { PUSH int 28 ; FAILWITH } { CDR } ;
552
                                   COMPARE ;
553
                                   NEQ ;
554
                                   IF { SWAP ; DUP ; DUG 2 ; DIG 3 ; MUL ; DUG 2 } {} ;
555
                                   PUSH nat 1 ;
556
                                   SWAP ;
557
                                   LSR ;
558
                                   SWAP ;
559
                                   DUP ;
560
                                   MUL ;
561
                                   SWAP ;
562
                                   DUP ;
563
                                   PUSH nat 0 ;
564
                                   COMPARE ;
565
                                   NEQ } ;
566
                            DROP 2 ;
567
                            SWAP ;
568
                            DROP ;
569
                            PUSH bytes 0x00000000000000000000000000000000000000000000000000000000000000 ;
570
                            DIG 2 ;
571
                            PUSH bytes 0x050a00000020 ;
572
                            CONCAT ;
573
                            CONCAT ;
574
                            UNPACK bls12_381_fr ;
575
                            IF_NONE { PUSH int 134 ; FAILWITH } {} ;
576
                            INT ;
577
                            ISNAT ;
578
                            IF_NONE { PUSH int 133 ; FAILWITH } {} ;
579
                            MUL ;
580
                            DIG 3 ;
581
                            ADD ;
582
                            DUG 2 ;
583
                            PUSH nat 1 ;
584
                            ADD ;
585
                            DUP ;
586
                            DUP 3 ;
587
                            COMPARE ;
588
                            GT } ;
589
                     DROP 2 ;
590
                     SWAP ;
591
                     DROP ;
592
                     SWAP ;
593
                     DROP } ;
594
                 NIL operation ;
595
                 DUP 6 ;
596
                 PUSH bool False ;
597
                 SWAP ;
598
                 DIG 5 ;
599
                 DIG 3 ;
600
                 DIG 3 ;
601
                 PAIR 3 ;
602
                 EXEC ;
603
                 CDR ;
604
                 UNPAIR ;
605
                 DIG 5 ;
606
                 DIG 5 ;
607
                 DIG 3 ;
608
                 DIG 5 ;
609
                 DIG 5 ;
610
                 DIG 5 ;
611
                 DUP 4 ;
612
                 CAR ;
613
                 GET 3 ;
614
                 DUP 4 ;
615
                 CDR ;
616
                 SIZE ;
617
                 COMPARE ;
618
                 LE ;
619
                 IF {} { PUSH string "STATE_TOO_LARGE" ; FAILWITH } ;
620
                 DUP 3 ;
621
                 CAR ;
622
                 SENDER ;
623
                 PACK ;
624
                 CONCAT ;
625
                 KECCAK ;
626
                 PUSH nat 256 ;
627
                 DIG 3 ;
628
                 DIG 2 ;
629
                 EXEC ;
630
                 PAIR ;
631
                 NIL bytes ;
632
                 DUP 4 ;
633
                 CDR ;
634
                 CONS ;
635
                 DUP 4 ;
636
                 CAR ;
637
                 CONS ;
638
                 SENDER ;
639
                 PACK ;
640
                 CONS ;
641
                 CONCAT ;
642
                 KECCAK ;
643
                 DIG 4 ;
644
                 DUP ;
645
                 GET 3 ;
646
                 DUP ;
647
                 GET 6 ;
648
                 DIG 6 ;
649
                 CDR ;
650
                 SOME ;
651
                 DUP 5 ;
652
                 UPDATE ;
653
                 UPDATE 6 ;
654
                 UPDATE 3 ;
655
                 DUG 3 ;
656
                 PUSH bytes 0x ;
657
                 DUP 5 ;
658
                 GET 3 ;
659
                 GET 3 ;
660
                 COMPARE ;
661
                 EQ ;
662
                 IF
663
                   { DIG 4 ;
664
                     DROP ;
665
                     DIG 4 ;
666
                     DROP ;
667
                     SWAP ;
668
                     PAIR ;
669
                     DIG 2 ;
670
                     DUP ;
671
                     GET 3 ;
672
                     DUP 3 ;
673
                     CDR ;
674
                     UPDATE 3 ;
675
                     UPDATE 3 ;
676
                     DUP ;
677
                     GET 3 ;
678
                     DIG 2 ;
679
                     UPDATE 5 ;
680
                     UPDATE 3 ;
681
                     SWAP }
682
                   { DIG 5 ;
683
                     DROP ;
684
                     DIG 4 ;
685
                     SWAP ;
686
                     DUP 5 ;
687
                     GET 3 ;
688
                     PAIR ;
689
                     DIG 2 ;
690
                     DUP 5 ;
691
                     GET 3 ;
692
                     GET 5 ;
693
                     PAIR ;
694
                     PAIR ;
695
                     EXEC ;
696
                     UNPAIR ;
697
                     DIG 3 ;
698
                     SWAP ;
699
                     UPDATE 3 ;
700
                     DUP ;
701
                     GET 3 ;
702
                     DUP 3 ;
703
                     CDR ;
704
                     UPDATE 3 ;
705
                     UPDATE 3 ;
706
                     DUP ;
707
                     GET 3 ;
708
                     DIG 2 ;
709
                     UPDATE 5 ;
710
                     UPDATE 3 ;
711
                     SWAP } }
712
               { SENDER ;
713
                 DUP 3 ;
714
                 CAR ;
715
                 CAR ;
716
                 COMPARE ;
717
                 EQ ;
718
                 IF {} { PUSH string "NOT_ADMINISTRATOR" ; FAILWITH } ;
719
                 DUP ;
720
                 ITER { IF_LEFT
721
                          { DIG 2 ; DUP ; CAR ; DIG 2 ; UPDATE 1 ; UPDATE 1 ; SWAP }
722
                          { IF_LEFT
723
                              { DIG 2 ; DUP ; CAR ; DIG 2 ; UPDATE 3 ; UPDATE 1 ; SWAP }
724
                              { DIG 2 ; DUP ; CAR ; DIG 2 ; UPDATE 4 ; UPDATE 1 ; SWAP } } } ;
725
                 DROP ;
726
                 SWAP ;
727
                 DROP ;
728
                 SWAP ;
729
                 DROP ;
730
                 NIL operation } } ;
731
         NIL operation ;
732
         SWAP ;
733
         ITER { CONS } ;
734
         PAIR } ;
735
  view "get_proof" (pair (bytes %key) (address %owner))
736
        (pair (bytes %key)
737
              (pair (bytes %merkle_root)
738
                    (pair (list %path (or (bytes %Left) (bytes %Right)))
739
                          (pair (nat %snapshot) (bytes %value)))))
740
        { UNPAIR ;
741
          LAMBDA
742
            (pair nat nat)
743
            (pair int (pair nat nat))
744
            { DUP ;
745
              CDR ;
746
              PUSH nat 0 ;
747
              COMPARE ;
748
              LT ;
749
              IF {} { PUSH string "EMPTY_KEY" ; FAILWITH } ;
750
              DUP ;
751
              CDR ;
752
              PUSH nat 1 ;
753
              SWAP ;
754
              SUB ;
755
              ISNAT ;
756
              IF_NONE { PUSH int 0 ; FAILWITH } {} ;
757
              PUSH nat 1 ;
758
              DUP ;
759
              DUP 4 ;
760
              CDR ;
761
              SUB ;
762
              ISNAT ;
763
              IF_NONE { PUSH int 0 ; FAILWITH } {} ;
764
              PUSH nat 1 ;
765
              LSL ;
766
              SUB ;
767
              ISNAT ;
768
              IF_NONE { PUSH int 21 ; FAILWITH } {} ;
769
              DUP 3 ;
770
              CAR ;
771
              AND ;
772
              PAIR ;
773
              PUSH nat 1 ;
774
              DUP 3 ;
775
              CDR ;
776
              SUB ;
777
              ISNAT ;
778
              IF_NONE { PUSH int 0 ; FAILWITH } {} ;
779
              DIG 2 ;
780
              CAR ;
781
              LSR ;
782
              INT ;
783
              PAIR } ;
784
          LAMBDA
785
            (pair (pair nat nat) (pair nat nat))
786
            (pair (pair nat nat) (pair nat nat))
787
            { DUP ;
788
              UNPAIR ;
789
              SWAP ;
790
              DUP ;
791
              DUG 2 ;
792
              CDR ;
793
              SWAP ;
794
              DUP ;
795
              DUG 2 ;
796
              CDR ;
797
              COMPARE ;
798
              LT ;
799
              IF { DUP ; CDR } { SWAP ; DUP ; DUG 2 ; CDR } ;
800
              PUSH nat 0 ;
801
              PUSH bool False ;
802
              DUP 3 ;
803
              DUP 3 ;
804
              COMPARE ;
805
              LT ;
806
              LOOP { PUSH nat 1 ;
807
                     DUP 3 ;
808
                     ADD ;
809
                     DUP 6 ;
810
                     CDR ;
811
                     SUB ;
812
                     ISNAT ;
813
                     IF_NONE { PUSH int 25 ; FAILWITH } {} ;
814
                     DUP 6 ;
815
                     CAR ;
816
                     LSR ;
817
                     PUSH nat 1 ;
818
                     DUP 4 ;
819
                     ADD ;
820
                     DUP 6 ;
821
                     CDR ;
822
                     SUB ;
823
                     ISNAT ;
824
                     IF_NONE { PUSH int 25 ; FAILWITH } {} ;
825
                     DUP 6 ;
826
                     CAR ;
827
                     LSR ;
828
                     COMPARE ;
829
                     EQ ;
830
                     IF { PUSH nat 1 ; DIG 2 ; ADD ; SWAP } { DROP ; PUSH bool True } ;
831
                     DUP ;
832
                     IF { PUSH bool False } { DUP 3 ; DUP 3 ; COMPARE ; LT } } ;
833
              DROP ;
834
              SWAP ;
835
              DROP ;
836
              DIG 2 ;
837
              DROP ;
838
              DIG 2 ;
839
              DROP ;
840
              SWAP ;
841
              DUP ;
842
              CDR ;
843
              DUP 3 ;
844
              COMPARE ;
845
              LE ;
846
              IF { PUSH nat 256 ; DUP 3 ; COMPARE ; LE } { PUSH bool False } ;
847
              IF {} { PUSH string "BAD_POS" ; FAILWITH } ;
848
              SWAP ;
849
              DUP ;
850
              DUG 2 ;
851
              PUSH nat 0 ;
852
              PAIR ;
853
              PUSH nat 0 ;
854
              DUP 4 ;
855
              COMPARE ;
856
              NEQ ;
857
              IF
858
                { DUP 3 ;
859
                  DUP 3 ;
860
                  CDR ;
861
                  SUB ;
862
                  ISNAT ;
863
                  IF_NONE { PUSH int 25 ; FAILWITH } {} ;
864
                  DUP 3 ;
865
                  CAR ;
866
                  LSR ;
867
                  UPDATE 1 }
868
                {} ;
869
              DUP 3 ;
870
              DUP 3 ;
871
              CDR ;
872
              SUB ;
873
              ISNAT ;
874
              IF_NONE { PUSH int 0 ; FAILWITH } {} ;
875
              PUSH nat 1 ;
876
              DIG 4 ;
877
              DUP 5 ;
878
              CDR ;
879
              SUB ;
880
              ISNAT ;
881
              IF_NONE { PUSH int 0 ; FAILWITH } {} ;
882
              PUSH nat 1 ;
883
              LSL ;
884
              SUB ;
885
              ISNAT ;
886
              IF_NONE { PUSH int 21 ; FAILWITH } {} ;
887
              DIG 3 ;
888
              CAR ;
889
              AND ;
890
              PAIR ;
891
              SWAP ;
892
              PAIR } ;
893
          LAMBDA
894
            bytes
895
            nat
896
            { DUP ;
897
              SIZE ;
898
              DUP ;
899
              PUSH nat 0 ;
900
              SWAP ;
901
              PUSH nat 0 ;
902
              DUP ;
903
              DUP 3 ;
904
              COMPARE ;
905
              GT ;
906
              LOOP { DUP 5 ;
907
                     PUSH nat 1 ;
908
                     DUP 3 ;
909
                     SLICE ;
910
                     IF_NONE { PUSH int 126 ; FAILWITH } {} ;
911
                     PUSH nat 2 ;
912
                     PUSH nat 1 ;
913
                     DUP 4 ;
914
                     ADD ;
915
                     DUP 7 ;
916
                     SUB ;
917
                     ISNAT ;
918
                     IF_NONE { PUSH int 127 ; FAILWITH } {} ;
919
                     MUL ;
920
                     PUSH nat 1 ;
921
                     PUSH nat 16 ;
922
                     DUP 3 ;
923
                     DUP ;
924
                     PUSH nat 0 ;
925
                     COMPARE ;
926
                     NEQ ;
927
                     LOOP { PUSH nat 0 ;
928
                            PUSH nat 2 ;
929
                            DUP 3 ;
930
                            EDIV ;
931
                            IF_NONE { PUSH int 28 ; FAILWITH } { CDR } ;
932
                            COMPARE ;
933
                            NEQ ;
934
                            IF { SWAP ; DUP ; DUG 2 ; DIG 3 ; MUL ; DUG 2 } {} ;
935
                            PUSH nat 1 ;
936
                            SWAP ;
937
                            LSR ;
938
                            SWAP ;
939
                            DUP ;
940
                            MUL ;
941
                            SWAP ;
942
                            DUP ;
943
                            PUSH nat 0 ;
944
                            COMPARE ;
945
                            NEQ } ;
946
                     DROP 2 ;
947
                     SWAP ;
948
                     DROP ;
949
                     PUSH bytes 0x00000000000000000000000000000000000000000000000000000000000000 ;
950
                     DIG 2 ;
951
                     PUSH bytes 0x050a00000020 ;
952
                     CONCAT ;
953
                     CONCAT ;
954
                     UNPACK bls12_381_fr ;
955
                     IF_NONE { PUSH int 134 ; FAILWITH } {} ;
956
                     INT ;
957
                     ISNAT ;
958
                     IF_NONE { PUSH int 133 ; FAILWITH } {} ;
959
                     MUL ;
960
                     DIG 3 ;
961
                     ADD ;
962
                     DUG 2 ;
963
                     PUSH nat 1 ;
964
                     ADD ;
965
                     DUP ;
966
                     DUP 3 ;
967
                     COMPARE ;
968
                     GT } ;
969
              DROP 2 ;
970
              SWAP ;
971
              DROP ;
972
              SWAP ;
973
              DROP } ;
974
          DIG 3 ;
975
          DUP ;
976
          CAR ;
977
          SWAP ;
978
          DUP ;
979
          DUG 5 ;
980
          CDR ;
981
          PACK ;
982
          CONCAT ;
983
          KECCAK ;
984
          DUP ;
985
          PUSH nat 256 ;
986
          DUP 4 ;
987
          DUP 3 ;
988
          EXEC ;
989
          PAIR ;
990
          DUP 8 ;
991
          GET 3 ;
992
          DUP ;
993
          GET 5 ;
994
          NIL (or bytes bytes) ;
995
          PUSH bool True ;
996
          DUP ;
997
          LOOP { DUP 9 ;
998
                 DUP 4 ;
999
                 CAR ;
1000
                 DUP 7 ;
1001
                 PAIR ;
1002
                 EXEC ;
1003
                 UNPAIR ;
1004
                 DUP 5 ;
1005
                 CAR ;
1006
                 CDR ;
1007
                 SWAP ;
1008
                 DUP ;
1009
                 DUG 2 ;
1010
                 CDR ;
1011
                 COMPARE ;
1012
                 EQ ;
1013
                 IF {} { PUSH string "PROOF_NOT_FOUND" ; FAILWITH } ;
1014
                 PUSH nat 0 ;
1015
                 DUP 3 ;
1016
                 CDR ;
1017
                 COMPARE ;
1018
                 EQ ;
1019
                 IF
1020
                   { DIG 2 ; DROP 3 ; PUSH bool False }
1021
                   { DIG 6 ;
1022
                     DROP 2 ;
1023
                     DUP 10 ;
1024
                     SWAP ;
1025
                     EXEC ;
1026
                     UNPAIR ;
1027
                     DUP ;
1028
                     PUSH int 0 ;
1029
                     COMPARE ;
1030
                     EQ ;
1031
                     IF
1032
                       { DUP 6 ;
1033
                         CAR ;
1034
                         DUP 6 ;
1035
                         CDR ;
1036
                         GET ;
1037
                         IF_NONE { PUSH int 281 ; FAILWITH } {} ;
1038
                         PUSH int 1 ;
1039
                         GET ;
1040
                         IF_NONE { PUSH int 281 ; FAILWITH } {} ;
1041
                         CDR ;
1042
                         RIGHT bytes }
1043
                       { DUP 6 ;
1044
                         CAR ;
1045
                         DUP 6 ;
1046
                         CDR ;
1047
                         GET ;
1048
                         IF_NONE { PUSH int 289 ; FAILWITH } {} ;
1049
                         PUSH int 0 ;
1050
                         GET ;
1051
                         IF_NONE { PUSH int 289 ; FAILWITH } {} ;
1052
                         CDR ;
1053
                         LEFT bytes } ;
1054
                     DIG 4 ;
1055
                     SWAP ;
1056
                     CONS ;
1057
                     DUG 3 ;
1058
                     DUP 6 ;
1059
                     CAR ;
1060
                     DIG 5 ;
1061
                     CDR ;
1062
                     GET ;
1063
                     IF_NONE { PUSH int 295 ; FAILWITH } {} ;
1064
                     SWAP ;
1065
                     GET ;
1066
                     IF_NONE { PUSH int 295 ; FAILWITH } {} ;
1067
                     DUG 3 ;
1068
                     DUG 4 } ;
1069
                 DUP } ;
1070
          DUP 4 ;
1071
          GET 6 ;
1072
          DUP 4 ;
1073
          CDR ;
1074
          GET ;
1075
          IF_NONE { PUSH int 303 ; FAILWITH } {} ;
1076
          PUSH nat 1 ;
1077
          DUP 14 ;
1078
          GET 5 ;
1079
          ADD ;
1080
          DUP 4 ;
1081
          DUP 7 ;
1082
          GET 3 ;
1083
          DUP 15 ;
1084
          CAR ;
1085
          PAIR 5 ;
1086
          SWAP ;
1087
          DROP ;
1088
          SWAP ;
1089
          DROP ;
1090
          SWAP ;
1091
          DROP ;
1092
          SWAP ;
1093
          DROP ;
1094
          SWAP ;
1095
          DROP ;
1096
          SWAP ;
1097
          DROP ;
1098
          SWAP ;
1099
          DROP ;
1100
          SWAP ;
1101
          DROP ;
1102
          SWAP ;
1103
          DROP ;
1104
          SWAP ;
1105
          DROP ;
1106
          SWAP ;
1107
          DROP ;
1108
          SWAP ;
1109
          DROP } ;
1110
  view "verify_proof"
1111
        (pair (list %path (or (bytes %Left) (bytes %Right)))
1112
              (pair %state (bytes %key) (pair (address %owner) (bytes %value))))
1113
        unit
1114
        { UNPAIR ;
1115
          DUP ;
1116
          GET 6 ;
1117
          NIL bytes ;
1118
          SWAP ;
1119
          CONS ;
1120
          SWAP ;
1121
          DUP ;
1122
          DUG 2 ;
1123
          GET 3 ;
1124
          CONS ;
1125
          SWAP ;
1126
          DUP ;
1127
          DUG 2 ;
1128
          GET 5 ;
1129
          PACK ;
1130
          CONS ;
1131
          CONCAT ;
1132
          KECCAK ;
1133
          SWAP ;
1134
          CAR ;
1135
          ITER { IF_LEFT { CONCAT ; KECCAK } { SWAP ; CONCAT ; KECCAK } } ;
1136
          SWAP ;
1137
          GET 3 ;
1138
          GET 3 ;
1139
          COMPARE ;
1140
          EQ ;
1141
          IF {} { PUSH string "PROOF_INVALID" ; FAILWITH } ;
1142
          UNIT } }