BCD

Tezos Contract Explorer
Search Networks Deploy
  • Home
  • /
  • Mainnet
  • /
  • KT1E92n...ADTh
operations (98.1K)Storage Code Interact Tokens Fork Views Statistics Details
Latest
​x
564
 
1
{ parameter (or (unit %update_price_observations)
2
                (or (unit %update_shortest_observations)
3
                    (unit %update_short_observations))) ;
4
  storage (pair
5
            (big_map %price_observations nat
6
                                         (pair timestamp (nat %price_0_cumulative)
7
                                               (nat %price_1_cumulative)))
8
            (big_map %shortest_observations nat (pair timestamp (nat %shortest_twap)))
9
            (big_map %short_observations nat (pair timestamp (nat %short_twap)))
10
            (nat %granularity)
11
            (nat %shortest_record_period)
12
            (nat %shortest_window)
13
            (nat %short_record_period)
14
            (nat %long_record_period)
15
            (nat %long_granularity)
16
            (nat %shortest_twap_end)
17
            (nat %short_twap_end)
18
            (nat %long_twap_end)
19
            (nat %shortest_twap_start)
20
            (nat %short_twap_start)
21
            (nat %long_twap_start)
22
            (address %dispatcher)) ;
23
  code { UNPAIR ;
24
         IF_LEFT
25
           { DROP ;
26
             SELF_ADDRESS ;
27
             NOW ;
28
             VIEW "timestamp.priceObsIndex" nat ;
29
             IF_NONE { PUSH string "twaps.view failed 448" ; FAILWITH } {} ;
30
             RENAME @price_observation_index ;
31
             SELF_ADDRESS ;
32
             DUP 2 ;
33
             VIEW "nat.priceObservation" (pair timestamp nat nat) ;
34
             IF_NONE { PUSH string "twaps.view failed 450" ; FAILWITH } {} ;
35
             RENAME @price_observation ;
36
             CAR @observed_at ;
37
             SELF_ADDRESS ;
38
             UNIT ;
39
             VIEW "unit.granularity" nat ;
40
             IF_NONE { PUSH string "twaps.view failed 454" ; FAILWITH } {} ;
41
             INT @granularity ;
42
             NOW ;
43
             SUB ;
44
             { COMPARE ;
45
               LE ;
46
               IF { PUSH string "twaps.already observed this period" ; FAILWITH } {} } ;
47
             SWAP ;
48
             DUP 2 ;
49
             UPDATE 19 ;
50
             SELF_ADDRESS ;
51
             UNIT ;
52
             VIEW "unit.granularity" nat ;
53
             IF_NONE { PUSH string "twaps.view failed 474" ; FAILWITH } {} ;
54
             INT @granularity ;
55
             SELF_ADDRESS ;
56
             UNIT ;
57
             VIEW "unit.shortestWindow" nat ;
58
             IF_NONE { PUSH string "twaps.view failed 476" ; FAILWITH } {} ;
59
             INT @shortest_window ;
60
             EDIV ;
61
             IF_NONE { PUSH string "twaps.division by zero 475" ; FAILWITH } {} ;
62
             CAR @window_length ;
63
             SELF_ADDRESS ;
64
             UNIT ;
65
             VIEW "unit.priceMaxIndex" nat ;
66
             IF_NONE { PUSH string "twaps.view failed 479" ; FAILWITH } {} ;
67
             RENAME @price_max_index ;
68
             DUP ;
69
             DUG 2 ;
70
             SUB ;
71
             ISNAT ;
72
             IF_NONE
73
               { PUSH string "twaps.window size larger than recorded data" ; FAILWITH }
74
               {} ;
75
             RENAME @window_index_complement ;
76
             DUP 4 ;
77
             ADD ;
78
             EDIV ;
79
             IF_NONE { PUSH string "twaps.division by zero 486" ; FAILWITH } {} ;
80
             CDR @shortest_twap_start_index ;
81
             UPDATE 25 ;
82
             DUP ;
83
             GET 1 ;
84
             DIG 2 ;
85
             SELF_ADDRESS ;
86
             UNIT ;
87
             VIEW "unit.baseTokenCumulativePrices" (pair timestamp nat nat) ;
88
             IF_NONE { PUSH string "twaps.view failed 489" ; FAILWITH } {} ;
89
             RENAME @current_observation ;
90
             SOME ;
91
             SWAP ;
92
             UPDATE ;
93
             UPDATE 1 ;
94
             NIL operation }
95
           { IF_LEFT
96
               { DROP ;
97
                 SELF_ADDRESS ;
98
                 NOW ;
99
                 VIEW "timestamp.shortestObsIndex" nat ;
100
                 IF_NONE { PUSH string "twaps.view failed 499" ; FAILWITH } {} ;
101
                 RENAME @shortest_observation_index ;
102
                 SELF_ADDRESS ;
103
                 DUP 2 ;
104
                 VIEW "nat.shortestObservation" (pair timestamp nat) ;
105
                 IF_NONE { PUSH string "twaps.view failed 501" ; FAILWITH } {} ;
106
                 RENAME @shortest_observation ;
107
                 CAR @observed_at ;
108
                 SELF_ADDRESS ;
109
                 UNIT ;
110
                 VIEW "unit.shortestRecordPeriod" nat ;
111
                 IF_NONE { PUSH string "twaps.view failed 506" ; FAILWITH } {} ;
112
                 INT @granularity ;
113
                 NOW ;
114
                 SUB ;
115
                 { COMPARE ;
116
                   LE ;
117
                   IF
118
                     { PUSH string "twaps.already observed this period" ; FAILWITH }
119
                     {} } ;
120
                 SWAP ;
121
                 DUP 2 ;
122
                 UPDATE 21 ;
123
                 DUP 2 ;
124
                 PUSH nat 1 ;
125
                 ADD ;
126
                 DUP ;
127
                 SELF_ADDRESS ;
128
                 UNIT ;
129
                 VIEW "unit.shortestMaxIndex" nat ;
130
                 IF_NONE { PUSH string "twaps.view failed 516" ; FAILWITH } {} ;
131
                 RENAME @shortest_max_index ;
132
                 { COMPARE ; LE ; IF { DROP ; PUSH nat 0 } {} } ;
133
                 UPDATE 27 ;
134
                 DUP ;
135
                 GET 3 ;
136
                 DIG 2 ;
137
                 SELF_ADDRESS ;
138
                 UNIT ;
139
                 VIEW "unit.shortestTWAP" (pair timestamp nat) ;
140
                 IF_NONE { PUSH string "twaps.view failed 523" ; FAILWITH } {} ;
141
                 RENAME @current_observation ;
142
                 SOME ;
143
                 SWAP ;
144
                 UPDATE ;
145
                 UPDATE 3 ;
146
                 NIL operation }
147
               { DROP ;
148
                 SELF_ADDRESS ;
149
                 NOW ;
150
                 VIEW "timestamp.shortObsIndex" nat ;
151
                 IF_NONE { PUSH string "twaps.view failed 533" ; FAILWITH } {} ;
152
                 RENAME @short_observation_index ;
153
                 SELF_ADDRESS ;
154
                 DUP 2 ;
155
                 VIEW "nat.shortObservation" (pair timestamp nat) ;
156
                 IF_NONE { PUSH string "twaps.view failed 535" ; FAILWITH } {} ;
157
                 RENAME @short_observation ;
158
                 CAR @observed_at ;
159
                 SELF_ADDRESS ;
160
                 UNIT ;
161
                 VIEW "unit.longGranularity" nat ;
162
                 IF_NONE { PUSH string "twaps.view failed 540" ; FAILWITH } {} ;
163
                 INT @granularity ;
164
                 NOW ;
165
                 SUB ;
166
                 { COMPARE ;
167
                   LE ;
168
                   IF
169
                     { PUSH string "twaps.already observed this period" ; FAILWITH }
170
                     {} } ;
171
                 SWAP ;
172
                 DUP 2 ;
173
                 UPDATE 23 ;
174
                 DUP 2 ;
175
                 PUSH nat 1 ;
176
                 ADD ;
177
                 DUP ;
178
                 SELF_ADDRESS ;
179
                 UNIT ;
180
                 VIEW "unit.shortMaxIndex" nat ;
181
                 IF_NONE { PUSH string "twaps.view failed 550" ; FAILWITH } {} ;
182
                 RENAME @short_max_index ;
183
                 { COMPARE ; LE ; IF { DROP ; PUSH nat 0 } {} } ;
184
                 UPDATE 29 ;
185
                 DUP ;
186
                 GET 5 ;
187
                 DIG 2 ;
188
                 SELF_ADDRESS ;
189
                 UNIT ;
190
                 VIEW "unit.shortTWAP" (pair timestamp nat) ;
191
                 IF_NONE { PUSH string "twaps.view failed 557" ; FAILWITH } {} ;
192
                 RENAME @current_observation ;
193
                 SOME ;
194
                 SWAP ;
195
                 UPDATE ;
196
                 UPDATE 5 ;
197
                 NIL operation } } ;
198
         PAIR } ;
199
  view "nat.priceObservation" nat (pair timestamp nat nat)
200
        { UNPAIR @% ;
201
          DIP { GET 1 } ;
202
          SELF_ADDRESS ;
203
          UNIT ;
204
          VIEW "unit.priceMaxIndex" nat ;
205
          IF_NONE { PUSH string "twaps.view failed 90" ; FAILWITH } {} ;
206
          RENAME @price_max_index ;
207
          SWAP ;
208
          EDIV ;
209
          IF_NONE { PUSH string "twaps.division by zero 92" ; FAILWITH } {} ;
210
          CDR @remainder ;
211
          GET ;
212
          IF_NONE { PUSH string "twaps.invalid observation index 97" ; FAILWITH } {} } ;
213
  view "nat.shortestObservation" nat (pair timestamp nat)
214
        { UNPAIR @% ;
215
          DIP { GET 3 } ;
216
          SELF_ADDRESS ;
217
          UNIT ;
218
          VIEW "unit.shortestMaxIndex" nat ;
219
          IF_NONE { PUSH string "twaps.view failed 108" ; FAILWITH } {} ;
220
          RENAME @shortest_max_index ;
221
          SWAP ;
222
          EDIV ;
223
          IF_NONE { PUSH string "twaps.division by zero 110" ; FAILWITH } {} ;
224
          CDR @remainder ;
225
          GET ;
226
          IF_NONE { PUSH string "twaps.invalid observation index 114" ; FAILWITH } {} } ;
227
  view "nat.shortObservation" nat (pair timestamp nat)
228
        { UNPAIR @% ;
229
          DIP { GET 5 } ;
230
          SELF_ADDRESS ;
231
          UNIT ;
232
          VIEW "unit.shortMaxIndex" nat ;
233
          IF_NONE { PUSH string "twaps.view failed 125" ; FAILWITH } {} ;
234
          RENAME @short_max_index ;
235
          SWAP ;
236
          EDIV ;
237
          IF_NONE { PUSH string "twaps.division by zero 127" ; FAILWITH } {} ;
238
          CDR @remainder ;
239
          GET ;
240
          IF_NONE { PUSH string "twaps.invalid observation index 131" ; FAILWITH } {} } ;
241
  view "unit.priceMaxIndex" unit nat
242
        { DROP ;
243
          SELF_ADDRESS ;
244
          UNIT ;
245
          VIEW "unit.granularity" nat ;
246
          IF_NONE { PUSH string "twaps.view failed 140" ; FAILWITH } {} ;
247
          RENAME @granularity ;
248
          SELF_ADDRESS ;
249
          UNIT ;
250
          VIEW "unit.shortestRecordPeriod" nat ;
251
          IF_NONE { PUSH string "twaps.view failed 142" ; FAILWITH } {} ;
252
          RENAME @shortest_record_period ;
253
          EDIV ;
254
          IF_NONE { PUSH string "twaps.division by zero 144" ; FAILWITH } {} ;
255
          CAR @index } ;
256
  view "unit.shortestMaxIndex" unit nat
257
        { DROP ;
258
          SELF_ADDRESS ;
259
          UNIT ;
260
          VIEW "unit.shortestRecordPeriod" nat ;
261
          IF_NONE { PUSH string "twaps.view failed 150" ; FAILWITH } {} ;
262
          RENAME @granularity ;
263
          SELF_ADDRESS ;
264
          UNIT ;
265
          VIEW "unit.shortRecordPeriod" nat ;
266
          IF_NONE { PUSH string "twaps.view failed 152" ; FAILWITH } {} ;
267
          RENAME @short_record_period ;
268
          EDIV ;
269
          IF_NONE { PUSH string "twaps.division by zero 144" ; FAILWITH } {} ;
270
          CAR @index } ;
271
  view "unit.shortMaxIndex" unit nat
272
        { DROP ;
273
          SELF_ADDRESS ;
274
          UNIT ;
275
          VIEW "unit.longGranularity" nat ;
276
          IF_NONE { PUSH string "twaps.view failed 160" ; FAILWITH } {} ;
277
          RENAME @long_granularity ;
278
          SELF_ADDRESS ;
279
          UNIT ;
280
          VIEW "unit.longRecordPeriod" nat ;
281
          IF_NONE { PUSH string "twaps.view failed 162" ; FAILWITH } {} ;
282
          RENAME @long_record_period ;
283
          EDIV ;
284
          IF_NONE { PUSH string "twaps.division by zero 144" ; FAILWITH } {} ;
285
          CAR @index } ;
286
  view "unit.granularity" unit nat { CDR ; GET 7 } ;
287
  view "unit.shortestRecordPeriod" unit nat { CDR ; GET 9 } ;
288
  view "unit.shortestWindow" unit nat { CDR ; GET 11 } ;
289
  view "unit.shortRecordPeriod" unit nat { CDR ; GET 13 } ;
290
  view "unit.longRecordPeriod" unit nat { CDR ; GET 15 } ;
291
  view "unit.longGranularity" unit nat { CDR ; GET 17 } ;
292
  view "unit.shortestTwapEnd" unit nat { CDR ; GET 19 } ;
293
  view "unit.shortTwapEnd" unit nat { CDR ; GET 21 } ;
294
  view "unit.longTwapEnd" unit nat { CDR ; GET 23 } ;
295
  view "unit.shortestTwapStart" unit nat { CDR ; GET 25 } ;
296
  view "unit.shortTwapStart" unit nat { CDR ; GET 27 } ;
297
  view "unit.longTwapStart" unit nat { CDR ; GET 29 } ;
298
  view "unit.dispatcher" unit address { CDR ; GET 30 } ;
299
  view "unit.cumulativePricesWrapper" unit address
300
        { DROP ;
301
          SELF_ADDRESS ;
302
          UNIT ;
303
          VIEW "unit.dispatcher" address ;
304
          IF_NONE { PUSH string "twaps.view failed 248" ; FAILWITH } {} ;
305
          RENAME @dispatcher ;
306
          PUSH string "quipu_cumulative_wrapper" ;
307
          VIEW "string.getAddress" address ;
308
          IF_NONE { PUSH string "twaps.view failed 250" ; FAILWITH } {} ;
309
          RENAME @wrapper } ;
310
  view "unit.baseTokenCumulativePrices" unit
311
        (pair timestamp (nat %token_a_price_cml) (nat %token_b_price_cml))
312
        { DROP ;
313
          SELF_ADDRESS ;
314
          UNIT ;
315
          VIEW "unit.cumulativePricesWrapper" address ;
316
          IF_NONE { PUSH string "twaps.view failed 259" ; FAILWITH } {} ;
317
          RENAME @wrapper ;
318
          UNIT ;
319
          VIEW "unit.freshCumulativePrices" (pair timestamp nat nat) ;
320
          IF_NONE { PUSH string "twaps.view failed 261" ; FAILWITH } {} ;
321
          RENAME @price_data } ;
322
  view "timestamp.priceObsIndex" timestamp nat
323
        { CAR ;
324
          PUSH timestamp 0 ;
325
          SWAP ;
326
          SUB ;
327
          SELF_ADDRESS ;
328
          UNIT ;
329
          VIEW "unit.shortestRecordPeriod" nat ;
330
          IF_NONE { PUSH string "twaps.view failed 272" ; FAILWITH } {} ;
331
          RENAME @shortest_record_period ;
332
          SWAP ;
333
          EDIV ;
334
          IF_NONE { PUSH string "twaps.division by zero 274" ; FAILWITH } {} ;
335
          CDR @remainder ;
336
          SELF_ADDRESS ;
337
          UNIT ;
338
          VIEW "unit.granularity" nat ;
339
          IF_NONE { PUSH string "twaps.view failed 275" ; FAILWITH } {} ;
340
          RENAME @granularity ;
341
          SWAP ;
342
          EDIV ;
343
          IF_NONE { PUSH string "twaps.division by zero 277" ; FAILWITH } {} ;
344
          CAR @index } ;
345
  view "timestamp.shortestObsIndex" timestamp nat
346
        { CAR ;
347
          PUSH timestamp 0 ;
348
          SWAP ;
349
          SUB ;
350
          SELF_ADDRESS ;
351
          UNIT ;
352
          VIEW "unit.shortRecordPeriod" nat ;
353
          IF_NONE { PUSH string "twaps.view failed 287" ; FAILWITH } {} ;
354
          RENAME @short_record_period ;
355
          SWAP ;
356
          EDIV ;
357
          IF_NONE { PUSH string "twaps.division by zero 289" ; FAILWITH } {} ;
358
          CDR @remainder ;
359
          SELF_ADDRESS ;
360
          UNIT ;
361
          VIEW "unit.shortestRecordPeriod" nat ;
362
          IF_NONE { PUSH string "twaps.view failed 290" ; FAILWITH } {} ;
363
          RENAME @shortest_record_period ;
364
          SWAP ;
365
          EDIV ;
366
          IF_NONE { PUSH string "twaps.division by zero 292" ; FAILWITH } {} ;
367
          CAR @index } ;
368
  view "timestamp.shortObsIndex" timestamp nat
369
        { CAR ;
370
          PUSH timestamp 0 ;
371
          SWAP ;
372
          SUB ;
373
          SELF_ADDRESS ;
374
          UNIT ;
375
          VIEW "unit.longRecordPeriod" nat ;
376
          IF_NONE { PUSH string "twaps.view failed 302" ; FAILWITH } {} ;
377
          RENAME @long_record_period ;
378
          SWAP ;
379
          EDIV ;
380
          IF_NONE { PUSH string "twaps.division by zero 304" ; FAILWITH } {} ;
381
          CDR @remainder ;
382
          SELF_ADDRESS ;
383
          UNIT ;
384
          VIEW "unit.shortRecordPeriod" nat ;
385
          IF_NONE { PUSH string "twaps.view failed 305" ; FAILWITH } {} ;
386
          RENAME @short_record_period ;
387
          SWAP ;
388
          EDIV ;
389
          IF_NONE { PUSH string "twaps.division by zero 307" ; FAILWITH } {} ;
390
          CAR @index } ;
391
  view "unit.shortestTWAP" unit (pair timestamp nat)
392
        { DROP ;
393
          SELF_ADDRESS ;
394
          UNIT ;
395
          VIEW "unit.shortestTwapEnd" nat ;
396
          IF_NONE { PUSH string "twaps.view failed 318" ; FAILWITH } {} ;
397
          RENAME @end_index ;
398
          SELF_ADDRESS ;
399
          SWAP ;
400
          VIEW "nat.priceObservation" (pair timestamp nat nat) ;
401
          IF_NONE { PUSH string "twaps.view failed 320" ; FAILWITH } {} ;
402
          RENAME @end_observation ;
403
          SELF_ADDRESS ;
404
          UNIT ;
405
          VIEW "unit.shortestTwapStart" nat ;
406
          IF_NONE { PUSH string "twaps.view failed 340" ; FAILWITH } {} ;
407
          RENAME @start_index ;
408
          SELF_ADDRESS ;
409
          SWAP ;
410
          VIEW "nat.priceObservation" (pair timestamp nat nat) ;
411
          IF_NONE { PUSH string "twaps.view failed 342" ; FAILWITH } {} ;
412
          RENAME @start_observation ;
413
          DUP ;
414
          CAR @start_timestamp ;
415
          SELF_ADDRESS ;
416
          UNIT ;
417
          VIEW "unit.granularity" nat ;
418
          IF_NONE { PUSH string "twaps.view failed 346" ; FAILWITH } {} ;
419
          INT @granularity ;
420
          SELF_ADDRESS ;
421
          UNIT ;
422
          VIEW "unit.shortestWindow" nat ;
423
          IF_NONE { PUSH string "twaps.view failed 348" ; FAILWITH } {} ;
424
          INT @shortest_window ;
425
          DUP 5 ;
426
          CAR @end_timestamp ;
427
          SUB ;
428
          SUB ;
429
          { COMPARE ;
430
            GT ;
431
            IF
432
              { PUSH string "twaps.shortest TWAP: stale start observation" ; FAILWITH }
433
              {} } ;
434
          DUP ;
435
          CAR @start_timestamp ;
436
          DUP 3 ;
437
          CAR @end_timestamp ;
438
          SUB @time_elapsed ;
439
          ISNAT ;
440
          IF_NONE { PUSH string "twaps.negative time elapsed" ; FAILWITH } {} ;
441
          SWAP ;
442
          GET @start_price 4 ;
443
          DUP 3 ;
444
          GET @end_price 4 ;
445
          SUB ;
446
          ISNAT ;
447
          IF_NONE { PUSH string "twaps.negative cumulative price" ; FAILWITH } {} ;
448
          EDIV ;
449
          IF_NONE { PUSH string "twaps.division by zero 360" ; FAILWITH } {} ;
450
          CAR @twap ;
451
          PUSH nat 1000000000000 ;
452
          SWAP ;
453
          EDIV ;
454
          IF_NONE { PUSH string "twaps.division by zero 366" ; FAILWITH } {} ;
455
          CAR @twap ;
456
          SWAP ;
457
          CAR @twap_timestamp ;
458
          PAIR } ;
459
  view "unit.shortTWAP" unit (pair timestamp nat)
460
        { DROP ;
461
          SELF_ADDRESS ;
462
          UNIT ;
463
          VIEW "unit.shortTwapEnd" nat ;
464
          IF_NONE { PUSH string "twaps.view failed 372" ; FAILWITH } {} ;
465
          RENAME @end_index ;
466
          SELF_ADDRESS ;
467
          SWAP ;
468
          VIEW "nat.shortestObservation" (pair timestamp nat) ;
469
          IF_NONE { PUSH string "twaps.view failed 374" ; FAILWITH } {} ;
470
          RENAME @end_observation ;
471
          SELF_ADDRESS ;
472
          UNIT ;
473
          VIEW "unit.shortTwapStart" nat ;
474
          IF_NONE { PUSH string "twaps.view failed 380" ; FAILWITH } {} ;
475
          RENAME @start_index ;
476
          SELF_ADDRESS ;
477
          SWAP ;
478
          VIEW "nat.shortestObservation" (pair timestamp nat) ;
479
          IF_NONE { PUSH string "twaps.view failed 382" ; FAILWITH } {} ;
480
          RENAME @start_observation ;
481
          DUP ;
482
          CAR @start_timestamp ;
483
          SELF_ADDRESS ;
484
          UNIT ;
485
          VIEW "unit.shortestRecordPeriod" nat ;
486
          IF_NONE { PUSH string "twaps.view failed 390" ; FAILWITH } {} ;
487
          INT @granularity ;
488
          SELF_ADDRESS ;
489
          UNIT ;
490
          VIEW "unit.shortRecordPeriod" nat ;
491
          IF_NONE { PUSH string "twaps.view failed 392" ; FAILWITH } {} ;
492
          INT @short_record_period ;
493
          DUP 5 ;
494
          CAR @end_timestamp ;
495
          SUB ;
496
          SUB ;
497
          { COMPARE ;
498
            GT ;
499
            IF { PUSH string "short TWAP: stale start observation" ; FAILWITH } {} } ;
500
          CDR @start_price ;
501
          DUP 2 ;
502
          CDR @end_price ;
503
          ADD ;
504
          PUSH nat 2 ;
505
          SWAP ;
506
          EDIV ;
507
          IF_NONE { PUSH string "twaps.division by zero 400" ; FAILWITH } {} ;
508
          CAR @twap ;
509
          SWAP ;
510
          CAR @twap_timestamp ;
511
          PAIR } ;
512
  view "unit.longTWAP" unit (pair timestamp nat)
513
        { DROP ;
514
          SELF_ADDRESS ;
515
          UNIT ;
516
          VIEW "unit.longTwapEnd" nat ;
517
          IF_NONE { PUSH string "twaps.view failed 410" ; FAILWITH } {} ;
518
          RENAME @end_index ;
519
          SELF_ADDRESS ;
520
          SWAP ;
521
          VIEW "nat.shortObservation" (pair timestamp nat) ;
522
          IF_NONE { PUSH string "twaps.view failed 412" ; FAILWITH } {} ;
523
          RENAME @end_observation ;
524
          SELF_ADDRESS ;
525
          UNIT ;
526
          VIEW "unit.longTwapStart" nat ;
527
          IF_NONE { PUSH string "twaps.view failed 418" ; FAILWITH } {} ;
528
          RENAME @start_index ;
529
          SELF_ADDRESS ;
530
          SWAP ;
531
          VIEW "nat.shortObservation" (pair timestamp nat) ;
532
          IF_NONE { PUSH string "twaps.view failed 420" ; FAILWITH } {} ;
533
          RENAME @start_observation ;
534
          DUP ;
535
          CAR @start_timestamp ;
536
          SELF_ADDRESS ;
537
          UNIT ;
538
          VIEW "unit.longGranularity" nat ;
539
          IF_NONE { PUSH string "twaps.view failed 428" ; FAILWITH } {} ;
540
          INT @granularity ;
541
          SELF_ADDRESS ;
542
          UNIT ;
543
          VIEW "unit.longRecordPeriod" nat ;
544
          IF_NONE { PUSH string "twaps.view failed 430" ; FAILWITH } {} ;
545
          INT @long_record_period ;
546
          DUP 5 ;
547
          CAR @end_timestamp ;
548
          SUB ;
549
          SUB ;
550
          { COMPARE ;
551
            GT ;
552
            IF { PUSH string "long TWAP: stale start observation" ; FAILWITH } {} } ;
553
          CDR @start_price ;
554
          DUP 2 ;
555
          CDR @end_price ;
556
          ADD ;
557
          PUSH nat 2 ;
558
          SWAP ;
559
          EDIV ;
560
          IF_NONE { PUSH string "twaps.division by zero 438" ; FAILWITH } {} ;
561
          CAR @twap ;
562
          SWAP ;
563
          CAR @twap_timestamp ;
564
          PAIR } }