BCD

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