BCD

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