tx · 2R2pjHb4YEa23SH1s1yXr5NgfL5dbgzsqyhjV7ZBLGDN

3P37f8Y3rNpKzSkHNVZMAStXdpmNBgftHN9:  -0.03000000 Waves

2024.01.29 15:04 [4018563] smart account 3P37f8Y3rNpKzSkHNVZMAStXdpmNBgftHN9 > SELF 0.00000000 Waves

{ "type": 13, "id": "2R2pjHb4YEa23SH1s1yXr5NgfL5dbgzsqyhjV7ZBLGDN", "fee": 3000000, "feeAssetId": null, "timestamp": 1706529836493, "version": 2, "chainId": 87, "sender": "3P37f8Y3rNpKzSkHNVZMAStXdpmNBgftHN9", "senderPublicKey": "9WT32oFSZterQbwJTDArqGxecguq4u3AVfYJfdLYZLy8", "proofs": [ "", "24r8hS5SixQ6hSYEYWe5Pz4pq4zwQHySLntBm3E8i2GWEjVeqCQnmybTB4ow6ZW8bUn61uMb7MDUQtXj48eaTzGc", "4rcYXPEVqw4AbuyX6ay3S9qtxHqQDmfhB8FSYzqdVWFcGDDcJFPAwfRGCiYXt4W617mYNYJMm2PK9hhTtH56iLjS" ], "script": "base64:BgIfCAISABIAEgQKAggIEgMKAQgSBQoDCAEBEgMKAQgSAFEABENPTkYJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMCBmNvbmZpZwAGU0NBTEU4AIDC1y8AC0xFTkRFUlNfQVBSCQDMCAIAlgEJAMwIAgB4CQDMCAIAZAkAzAgCAFAJAMwIAgA8CQDMCAIAKAkAzAgCAB4JAMwIAgAUCQDMCAIACgUDbmlsABNMRU5ERVJTX0FQUl9QRVJJT0RTCQDMCAICAzEtMQkAzAgCAgMyLTIJAMwIAgIDMy0zCQDMCAICAzQtNAkAzAgCAgM1LTgJAMwIAgIEOS0xMgkAzAgCAgUxMy0xNgkAzAgCAgUxNy0yMAkAzAgCAgYyMS0xMDQFA25pbAATTEVOREVSU19NQVhfUEVSSU9EUwBoAAZMUF9BUFIJAMwIAgCWAQkAzAgCAHgJAMwIAgBkCQDMCAIAUAkAzAgCADwJAMwIAgAoBQNuaWwADkxQX0FQUl9QRVJJT0RTCQDMCAICAzEtMQkAzAgCAgMyLTIJAMwIAgIDMy0zCQDMCAICAzQtNAkAzAgCAgM1LTgJAMwIAgIEOS0xMgUDbmlsAA5MUF9NQVhfUEVSSU9EUwAMAAxrU3RhcnRIZWlnaHQCC3N0YXJ0SGVpZ2h0AA1rUGVyaW9kTGVuZ3RoAgxwZXJpb2RMZW5ndGgAEWtMZW5kZXJzTWF4QW1vdW50AhFsZW5kUmV3YXJkc0Ftb3VudAAMa0xQTWF4QW1vdW50Ag5scFJld2FyZEFtb3VudAAHa1Rva2VucwIGdG9rZW5zAAtrVXNlclN1cHBseQIQX3VzZXJUb3RhbFN1cHBseQAOa1Rva2VuSW50ZXJlc3QCDl90b2tlbkludGVyZXN0ABRrVG9rZW5JbnRlcmVzdEhlaWdodAIUX3Rva2VuSW50ZXJlc3RIZWlnaHQAFGtUb2tlblJld2FyZFBlckJsb2NrAhRfdG9rZW5SZXdhcmRQZXJCbG9jawARa0xhc3RVcGRhdGVQZXJpb2QCEnJld2FyZFVwZGF0ZVBlcmlvZAARa1VzZXJMZW5kSW50ZXJlc3QCEV91c2VyTGFuZEludGVyZXN0ABdrVXNlckxlbmRBdmFpbGFibGVDbGFpbQIXX3VzZXJMZW5kQXZhaWxhYmxlQ2xhaW0AFWtVc2VyTHBBdmFpbGFibGVDbGFpbQIVX3VzZXJMcEF2YWlsYWJsZUNsYWltAAtrTHBJbnRlcmVzdAIKbHBJbnRlcmVzdAARa0xwSW50ZXJlc3RIZWlnaHQCEGxwSW50ZXJlc3RIZWlnaHQADWtQcmV2TFBTdXBwbHkCEXByZXZMUFRvdGFsU3VwcGx5ABFrTHBSZXdhcmRQZXJCbG9jawIQbHBSZXdhcmRQZXJCbG9jawAPa1VzZXJMcEludGVyZXN0Ag9fdXNlckxwSW50ZXJlc3QADmtQcmljZUluT3JhY2xlAgdfdHdhcDVCABRrUHJldkxlbmRUb2tlblN1cHBseQIUX3ByZXZMZW5kVG90YWxTdXBwbHkADGtBWExZVG9rZW5JZAILYXhseVRva2VuSWQAEGtMZW5kVG9rZW5TdXBwbHkCD3RvdGFsX3N1cHBsaWVkXwASa0xlbmRUb2tlbkJvcnJvd2VkAg90b3RhbF9ib3Jyb3dlZF8AD2tMZW5kVXNlclN1cHBseQIKX3N1cHBsaWVkXwAQa0xlbmRTZXR1cFRva2VucwIMc2V0dXBfdG9rZW5zAA5rU0ZUb3RhbFN1cHBseQIaX3RvdGFsX3NoYXJlX3Rva2Vuc19sb2NrZWQAEmtTRlVzZXJUb3RhbFN1cHBseQIUX3NoYXJlX3Rva2Vuc19sb2NrZWQACWtBeGx5UG9vbAIIYXhseVBvb2wABWtMcElkAg5zaGFyZV9hc3NldF9pZAAJa0FkbWluMVBLAhVncm91cDFfYWRtaW4xX3B1Yl9rZXkACWtBZG1pbjJQSwIVZ3JvdXAxX2FkbWluMl9wdWJfa2V5AAlrQWRtaW4zUEsCFWdyb3VwMV9hZG1pbjNfcHViX2tleQAPa09wZXJhdG9yQ2FsbFBLAhJhZG1pbl9jYWxsX3B1Yl9rZXkACGF4bHlQb29sCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUJa0F4bHlQb29sAhZDYW4ndCBnZXQgYXhseVBvb2wga2V5AAxtYWluQ29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBENPTkYCDW1haW5fY29udHJhY3QADXRva2VuQ29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBENPTkYCCXRva2Vub21pYwAMbGVuZENvbnRyYWN0CQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEQ09ORgIRbGVuZF9zZXJ2aWNlX2FkZHICG0Nhbid0IGdldCBsZW5kIHNlcnZpY2UgYWRkcgARc2ZGYXJtaW5nQ29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQRDT05GAhNzd29wZmlfZmFybWluZ19hZGRyAh1DYW4ndCBnZXQgc3dvcGZpIGZhcm1pbmcgYWRkcgAPcHJpY2VPcmFjbGVBZGRyCQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEQ09ORgIMcHJpY2Vfb3JhY2xlAhdObyBwcmljZSBvcmFjbGUgYWRkcmVzcwAIYWRtaW4xUEsJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBENPTkYFCWtBZG1pbjFQSwISQ2FuJ3QgZ2V0IGFkbWluMVBLAAhhZG1pbjJQSwkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEQ09ORgUJa0FkbWluMlBLAhJDYW4ndCBnZXQgYWRtaW4yUEsACGFkbWluM1BLCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQRDT05GBQlrQWRtaW4zUEsCEkNhbid0IGdldCBhZG1pbjNQSwAKb3BlcmF0b3JQSwkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEQ09ORgUPa09wZXJhdG9yQ2FsbFBLAhRDYW4ndCBnZXQgb3BlcmF0b3JQSwAMYXhseUJ1cm5BZGRyCQERQGV4dHJOYXRpdmUoMTA2MikBCQERQGV4dHJOYXRpdmUoMTA1MykCBQRDT05GAhFheGx5X2J1cm5fYWRkcmVzcwAGYXhseUlkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUNdG9rZW5Db250cmFjdAUMa0FYTFlUb2tlbklkAhdDYW4ndCBnZXQgQXhseSB0b2tlbiBpZAALc3RhcnRIZWlnaHQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMFDGtTdGFydEhlaWdodAAMcGVyaW9kTGVuZ3RoCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzBQ1rUGVyaW9kTGVuZ3RoAA1sZW5kTWF4QW1vdW50CQERQGV4dHJOYXRpdmUoMTA1MCkCBQ10b2tlbkNvbnRyYWN0BRFrTGVuZGVyc01heEFtb3VudAATbGVuZE1heFBlcmlvZEFtb3VudAkAaQIFDWxlbmRNYXhBbW91bnQFE0xFTkRFUlNfTUFYX1BFUklPRFMAC2xwTWF4QW1vdW50CQERQGV4dHJOYXRpdmUoMTA1MCkCBQ10b2tlbkNvbnRyYWN0BQxrTFBNYXhBbW91bnQAEWxwTWF4UGVyaW9kQW1vdW50CQBpAgULbHBNYXhBbW91bnQFDkxQX01BWF9QRVJJT0RTAQtpc0FkbWluQ2FsbAEBaQMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFCGFkbWluMVBLCQDMCAIFCGFkbWluMlBLCQDMCAIFCGFkbWluM1BLBQNuaWwIBQFpD2NhbGxlclB1YmxpY0tleQUEdW5pdAkAAgECKE9ubHkgYWRtaW4gZ3JvdXAxIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24BCmlzU2VsZkNhbGwBAWkDCQAAAggFAWkGY2FsbGVyBQR0aGlzBQR1bml0CQACAQIrT25seSBjb250cmFjdCBpdHNlbGYgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgEOaXNPcGVyYXRvckNhbGwBAWkDCQAAAggFAWkPY2FsbGVyUHVibGljS2V5BQpvcGVyYXRvclBLBQR1bml0CQACAQIkT25seSBvcGVyYXRvciBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uAQppc0xhbmRDYWxsAQFpAwkAAAIIBQFpBmNhbGxlcgUMbGVuZENvbnRyYWN0BQR1bml0CQACAQIpT25seSBsYW5kIGNvbnRyYWN0IGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24BD2lzU0ZGYXJtaW5nQ2FsbAEBaQMJAAACCAUBaQZjYWxsZXIFEXNmRmFybWluZ0NvbnRyYWN0BQR1bml0CQACAQIpT25seSBsYW5kIGNvbnRyYWN0IGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24BDGdldEFsbFRva2VucwAEBnRva2VucwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBQdrVG9rZW5zAgADCQAAAgUGdG9rZW5zAgAFA25pbAkAtQkCBQZ0b2tlbnMCASwBDWdldEFzc2V0UHJpY2UBB2Fzc2V0SWQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFD3ByaWNlT3JhY2xlQWRkcgkArAICBQdhc3NldElkBQ5rUHJpY2VJbk9yYWNsZQEQZ2V0QXNzZXREZWNpbWFscwEHYXNzZXRJZAMJAAACBQdhc3NldElkAgVXQVZFUwAIBAckbWF0Y2gwCQDsBwEJANkEAQUHYXNzZXRJZAMJAAECBQckbWF0Y2gwAgVBc3NldAQFYXNzZXQFByRtYXRjaDAIBQVhc3NldAhkZWNpbWFscwkAAgECEENhbid0IGZpbmQgYXNzZXQBEWdldEFzc2V0UHJlY2lzaW9uAQdhc3NldElkCQBsBgAKAAAJARBnZXRBc3NldERlY2ltYWxzAQUHYXNzZXRJZAAAAAAFBERPV04BFWdldEFkb3B0ZWRBUFJCeVBlcmlvZAMGcGVyaW9kCmFwclBlcmlvZHMDYXByCgEDZm9yAgFhB2FwZXJpb2QECyR0MDUyMTA1MjMyBQFhBAVpbmRleAgFCyR0MDUyMTA1MjMyAl8xBAVmb3VuZAgFCyR0MDUyMTA1MjMyAl8yBAJmdAkAtQkCBQdhcGVyaW9kAgEtBAskdDA1MjY5NTMzMgkAlAoCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCZnQAAAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmZ0AAEEBGZyb20IBQskdDA1MjY5NTMzMgJfMQQCdG8IBQskdDA1MjY5NTMzMgJfMgMFBWZvdW5kBQFhAwMJAGcCBQZwZXJpb2QFBGZyb20JAGcCBQJ0bwUGcGVyaW9kBwkAlAoCBQVpbmRleAYJAJQKAgkAZAIFBWluZGV4AAEHBAskdDA1NDY5NTUzNQoAAiRsBRNMRU5ERVJTX0FQUl9QRVJJT0RTCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCAAAHCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQNmb3ICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDkJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkEBWluZGV4CAULJHQwNTQ2OTU1MzUCXzEEBWZvdW5kCAULJHQwNTQ2OTU1MzUCXzIDBQVmb3VuZAkAawMJAGgCCQCRAwIFC0xFTkRFUlNfQVBSBQVpbmRleAUGU0NBTEU4AAcA7QIAAAEXZ2V0VG90YWxTdXBwbHlBbGxUb2tlbnMACgEDZm9yAgFhB3Rva2VuSWQECyR0MDU3MzQ1ODAzBQFhBAt0b3RhbFN1cHBseQgFCyR0MDU3MzQ1ODAzAl8xBA50b3RhbFN1cHBseVVzZAgFCyR0MDU3MzQ1ODAzAl8yBBF0b3RhbFN1cHBseVVzZEFsbAgFCyR0MDU3MzQ1ODAzAl8zBAt1dGlsaXphdGlvbggFCyR0MDU3MzQ1ODAzAl80BAd0U3VwcGx5CQELdmFsdWVPckVsc2UCCQCaCAIFDGxlbmRDb250cmFjdAkArAICBRBrTGVuZFRva2VuU3VwcGx5BQd0b2tlbklkAAAEB3RCb3Jyb3cJAQt2YWx1ZU9yRWxzZQIJAJoIAgUMbGVuZENvbnRyYWN0CQCsAgIFEmtMZW5kVG9rZW5Cb3Jyb3dlZAUHdG9rZW5JZAAABAphc3NldFByaWNlCQENZ2V0QXNzZXRQcmljZQEFB3Rva2VuSWQEDmFzc2V0UHJlY2lzaW9uCQERZ2V0QXNzZXRQcmVjaXNpb24BBQd0b2tlbklkBAp0U3VwcGx5VXNkCQBrAwUHdFN1cHBseQUKYXNzZXRQcmljZQUOYXNzZXRQcmVjaXNpb24EAXUDAwkAAAIFB3RTdXBwbHkAAAYJAAACBQd0Qm9ycm93AAAAAAkAawMFB3RCb3Jyb3cFBlNDQUxFOAUHdFN1cHBseQkAlgoECQDNCAIFC3RvdGFsU3VwcGx5BQd0U3VwcGx5CQDNCAIFDnRvdGFsU3VwcGx5VXNkBQp0U3VwcGx5VXNkCQBkAgURdG90YWxTdXBwbHlVc2RBbGwFCnRTdXBwbHlVc2QJAM0IAgULdXRpbGl6YXRpb24FAXUKAAIkbAkBDGdldEFsbFRva2VucwAKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCWCgQFA25pbAUDbmlsAAAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEDZm9yAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAzMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgERZ2V0VG90YWxTdXBwbHlVc2QBB3Rva2VuSWQEB3RTdXBwbHkJAQt2YWx1ZU9yRWxzZQIJAJoIAgUMbGVuZENvbnRyYWN0CQCsAgIFEGtMZW5kVG9rZW5TdXBwbHkFB3Rva2VuSWQAAAQKYXNzZXRQcmljZQkBDWdldEFzc2V0UHJpY2UBBQd0b2tlbklkBA5hc3NldFByZWNpc2lvbgkBEWdldEFzc2V0UHJlY2lzaW9uAQUHdG9rZW5JZAkAawMFB3RTdXBwbHkFCmFzc2V0UHJpY2UFDmFzc2V0UHJlY2lzaW9uARRjYWxjTmV3VG9rZW5JbnRlcmVzdAIHdG9rZW5JZAt0b3RhbFN1cHBseQMJAGcCBQtzdGFydEhlaWdodAUGaGVpZ2h0AAAEDnJld2FyZFBlckJsb2NrCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIFB3Rva2VuSWQFFGtUb2tlblJld2FyZFBlckJsb2NrBAtvbGRJbnRlcmVzdAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICBQd0b2tlbklkBQ5rVG9rZW5JbnRlcmVzdAQMdXBkYXRlSGVpZ2h0CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIFB3Rva2VuSWQFFGtUb2tlbkludGVyZXN0SGVpZ2h0BAZyZXdhcmQJAGgCCQBlAgUGaGVpZ2h0BQx1cGRhdGVIZWlnaHQFDnJld2FyZFBlckJsb2NrBAhpbnRlcmVzdAMJAGYCBQt0b3RhbFN1cHBseQAACQBrAwUGcmV3YXJkBQZTQ0FMRTgFC3RvdGFsU3VwcGx5AAAJAGQCBQtvbGRJbnRlcmVzdAUIaW50ZXJlc3QBEWNhbGNOZXdMcEludGVyZXN0AQt0b3RhbFN1cHBseQMJAGcCBQtzdGFydEhlaWdodAUGaGVpZ2h0AAAEDnJld2FyZFBlckJsb2NrCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFEWtMcFJld2FyZFBlckJsb2NrAAAEC29sZEludGVyZXN0CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFC2tMcEludGVyZXN0AAAEDHVwZGF0ZUhlaWdodAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBRFrTHBJbnRlcmVzdEhlaWdodAUGaGVpZ2h0BAZyZXdhcmQJAGgCCQBlAgUGaGVpZ2h0BQx1cGRhdGVIZWlnaHQFDnJld2FyZFBlckJsb2NrBAhpbnRlcmVzdAMJAGYCBQt0b3RhbFN1cHBseQAACQBrAwUGcmV3YXJkBQZTQ0FMRTgFC3RvdGFsU3VwcGx5AAAJAGQCBQtvbGRJbnRlcmVzdAUIaW50ZXJlc3QBEmNhbGNMZW5kVXNlclJld2FyZAIEdXNlcgd0b2tlbklkBAt0b3RhbFN1cHBseQkBC3ZhbHVlT3JFbHNlAgkAmggCBQxsZW5kQ29udHJhY3QJAKwCAgUQa0xlbmRUb2tlblN1cHBseQUHdG9rZW5JZAAABA10b2tlbkludGVyZXN0CQEUY2FsY05ld1Rva2VuSW50ZXJlc3QCBQd0b2tlbklkBQt0b3RhbFN1cHBseQQKdXNlclN1cHBseQkBC3ZhbHVlT3JFbHNlAgkAmggCBQxsZW5kQ29udHJhY3QJAKwCAgkArAICBQR1c2VyBQ9rTGVuZFVzZXJTdXBwbHkFB3Rva2VuSWQAAAQRdXNlclRva2VuSW50ZXJlc3QJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgUHdG9rZW5JZAIBXwUEdXNlcgURa1VzZXJMZW5kSW50ZXJlc3QDCQAAAgUKdXNlclN1cHBseQAABQ10b2tlbkludGVyZXN0AAAEBnJld2FyZAkAawMFCnVzZXJTdXBwbHkJAGUCBQ10b2tlbkludGVyZXN0BRF1c2VyVG9rZW5JbnRlcmVzdAUGU0NBTEU4CQCVCgMFBnJld2FyZAUNdG9rZW5JbnRlcmVzdAUKdXNlclN1cHBseQEQY2FsY0xwVXNlclJld2FyZAEEdXNlcgQLdG90YWxTdXBwbHkJAQt2YWx1ZU9yRWxzZQIJAJoIAgURc2ZGYXJtaW5nQ29udHJhY3QJAKwCAgUIYXhseVBvb2wFDmtTRlRvdGFsU3VwcGx5AAAEDXRva2VuSW50ZXJlc3QJARFjYWxjTmV3THBJbnRlcmVzdAEFC3RvdGFsU3VwcGx5BAp1c2VyU3VwcGx5CQELdmFsdWVPckVsc2UCCQCaCAIFEXNmRmFybWluZ0NvbnRyYWN0CQCsAgIJAKwCAgkArAICBQhheGx5UG9vbAIBXwUEdXNlcgUSa1NGVXNlclRvdGFsU3VwcGx5AAAEEXVzZXJUb2tlbkludGVyZXN0CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEdXNlcgUPa1VzZXJMcEludGVyZXN0AwkAAAIFCnVzZXJTdXBwbHkAAAUNdG9rZW5JbnRlcmVzdAAABAZyZXdhcmQJAGsDBQp1c2VyU3VwcGx5CQBlAgUNdG9rZW5JbnRlcmVzdAURdXNlclRva2VuSW50ZXJlc3QFBlNDQUxFOAkAlQoDBQZyZXdhcmQFDXRva2VuSW50ZXJlc3QFCnVzZXJTdXBwbHkBGGNsYWltTGVuZGVyUmV3YXJkc0NvbW1vbgIEdXNlcghyZWFkT25seQoBBWNsYWltAgFhB3Rva2VuSWQECyR0MDg4OTc4OTQxBQFhBAh0b2tlbklkcwgFCyR0MDg4OTc4OTQxAl8xBAdjQW1vdW50CAULJHQwODg5Nzg5NDECXzIEBXRvdGFsCAULJHQwODg5Nzg5NDECXzMECGVudGVyaWVzCAULJHQwODg5Nzg5NDECXzQEEnVzZXJBdmFpbGFibGVDbGFpbQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICBQd0b2tlbklkAgFfBQR1c2VyBRdrVXNlckxlbmRBdmFpbGFibGVDbGFpbQAABAskdDA5MDU0OTEzMwkBEmNhbGNMZW5kVXNlclJld2FyZAIFBHVzZXIFB3Rva2VuSWQEB3VSZXdhcmQIBQskdDA5MDU0OTEzMwJfMQQQbmV3VG9rZW5JbnRlcmVzdAgFCyR0MDkwNTQ5MTMzAl8yBAp1c2VyU3VwcGx5CAULJHQwOTA1NDkxMzMCXzMEDHRvdGFsVG9DbGFpbQkAZAIFEnVzZXJBdmFpbGFibGVDbGFpbQUHdVJld2FyZAMDCQBmAgUMdG90YWxUb0NsYWltAAAGCQBmAgUKdXNlclN1cHBseQAABAxuZXdFbnRyZXJpZXMDAwUIcmVhZE9ubHkGCQAAAgUMdG90YWxUb0NsYWltAAAFCGVudGVyaWVzCQDOCAIFCGVudGVyaWVzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICBQd0b2tlbklkAgFfBQR1c2VyBRFrVXNlckxlbmRJbnRlcmVzdAUQbmV3VG9rZW5JbnRlcmVzdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgUHdG9rZW5JZAIBXwUEdXNlcgUXa1VzZXJMZW5kQXZhaWxhYmxlQ2xhaW0AAAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQd0b2tlbklkBQ5rVG9rZW5JbnRlcmVzdAUQbmV3VG9rZW5JbnRlcmVzdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQd0b2tlbklkBRRrVG9rZW5JbnRlcmVzdEhlaWdodAUGaGVpZ2h0BQNuaWwJAJYKBAkAzQgCBQh0b2tlbklkcwUHdG9rZW5JZAkAzQgCBQdjQW1vdW50BQx0b3RhbFRvQ2xhaW0JAGQCBQV0b3RhbAUMdG90YWxUb0NsYWltBQxuZXdFbnRyZXJpZXMJAJYKBAUIdG9rZW5JZHMFB2NBbW91bnQFBXRvdGFsBQhlbnRlcmllcwoAAiRsCQEMZ2V0QWxsVG9rZW5zAAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJYKBAUDbmlsBQNuaWwAAAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQVjbGFpbQIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMzAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsAHAAdAB4BFGNsYWltTHBSZXdhcmRzQ29tbW9uAgR1c2VyCHJlYWRPbmx5BBJ1c2VyQXZhaWxhYmxlQ2xhaW0JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQR1c2VyBRVrVXNlckxwQXZhaWxhYmxlQ2xhaW0AAAQNJHQwMTAwNjQxMDEyOQkBEGNhbGNMcFVzZXJSZXdhcmQBBQR1c2VyBAd1UmV3YXJkCAUNJHQwMTAwNjQxMDEyOQJfMQQNbmV3THBJbnRlcmVzdAgFDSR0MDEwMDY0MTAxMjkCXzIECnVzZXJTdXBwbHkIBQ0kdDAxMDA2NDEwMTI5Al8zBAx0b3RhbFRvQ2xhaW0JAGQCBRJ1c2VyQXZhaWxhYmxlQ2xhaW0FB3VSZXdhcmQDAwUIcmVhZE9ubHkGCQAAAgUMdG90YWxUb0NsYWltAAAJAJQKAgUMdG90YWxUb0NsYWltBQNuaWwJAJQKAgUMdG90YWxUb0NsYWltCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHVzZXIFD2tVc2VyTHBJbnRlcmVzdAUNbmV3THBJbnRlcmVzdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQR1c2VyBRVrVXNlckxwQXZhaWxhYmxlQ2xhaW0AAAkAzAgCCQEMSW50ZWdlckVudHJ5AgULa0xwSW50ZXJlc3QFDW5ld0xwSW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIFEWtMcEludGVyZXN0SGVpZ2h0BQZoZWlnaHQFA25pbAEUZ2V0QXhseVByaWNlT25Td29wZmkABAhhQmFsYW5jZQkBEUBleHRyTmF0aXZlKDEwNTApAgkBEUBleHRyTmF0aXZlKDEwNjIpAQUIYXhseVBvb2wCD0FfYXNzZXRfYmFsYW5jZQQIYkJhbGFuY2UJARFAZXh0ck5hdGl2ZSgxMDUwKQIJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCGF4bHlQb29sAg9CX2Fzc2V0X2JhbGFuY2UEBndQcmljZQkBDWdldEFzc2V0UHJpY2UBAgVXQVZFUwkAawMFCGJCYWxhbmNlBQZ3UHJpY2UFCGFCYWxhbmNlARFnZXRBeGx5U2hhcmVQcmljZQAECHBvb2xBZGRyCQERQGV4dHJOYXRpdmUoMTA2MikBBQhheGx5UG9vbAQIYUJhbGFuY2UJARFAZXh0ck5hdGl2ZSgxMDUwKQIJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCGF4bHlQb29sAg9BX2Fzc2V0X2JhbGFuY2UECGJCYWxhbmNlCQERQGV4dHJOYXRpdmUoMTA1MCkCCQERQGV4dHJOYXRpdmUoMTA2MikBBQhheGx5UG9vbAIPQl9hc3NldF9iYWxhbmNlBAdkUHJpY2VBCQEUZ2V0QXhseVByaWNlT25Td29wZmkABAdkUHJpY2VCCQENZ2V0QXNzZXRQcmljZQECBVdBVkVTAwMJAGYCAAAFB2RQcmljZUEGCQBmAgAABQdkUHJpY2VCAP///////////wEEC3NoYXJlU3VwcGx5CQETdmFsdWVPckVycm9yTWVzc2FnZQIJARFAZXh0ck5hdGl2ZSgxMDUwKQIFCHBvb2xBZGRyAhJzaGFyZV9hc3NldF9zdXBwbHkCHENhbid0IGdldCBzaGFyZSBhc3NldCBzdXBwbHkECkFQcmVjaXNpb24JAGwGAAoAAAAIAAAAAAUERE9XTgQKQlByZWNpc2lvbgkAbAYACgAAAAgAAAAABQRET1dOBA5zaGFyZVByZWNpc2lvbgkAbAYACgAAAAgAAAAABQRET1dOBANzdW0JAGQCCQBrAwUIYUJhbGFuY2UFB2RQcmljZUEFCkFQcmVjaXNpb24JAGsDBQhiQmFsYW5jZQUHZFByaWNlQgUKQlByZWNpc2lvbgkAawMFA3N1bQUOc2hhcmVQcmVjaXNpb24FC3NoYXJlU3VwcGx5AQ1nZXRUb2tlbnNBUFJzAAQJYXhseVByaWNlCQEUZ2V0QXhseVByaWNlT25Td29wZmkABA1heGx5UHJlY2lzaW9uCQERZ2V0QXNzZXRQcmVjaXNpb24BBQZheGx5SWQKAQp0b2tlbnNBcHJzAgNhcHIHdG9rZW5JZAQEcndwYgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFB3Rva2VuSWQFFGtUb2tlblJld2FyZFBlckJsb2NrAAAEB3J3cGJVc2QJAGsDBQRyd3BiBQlheGx5UHJpY2UFDWF4bHlQcmVjaXNpb24EBnJ3WWVhcgkAaAIJAGgCBQdyd3BiVXNkBQxwZXJpb2RMZW5ndGgANAQOdG90YWxTdXBwbHlVc2QJARFnZXRUb3RhbFN1cHBseVVzZAEFB3Rva2VuSWQJAM0IAgUDYXByCQBrAwUGcndZZWFyBQZTQ0FMRTgFDnRvdGFsU3VwcGx5VXNkBARhcHJzCgACJGwJAQxnZXRBbGxUb2tlbnMACgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQp0b2tlbnNBcHJzAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAzMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgQNbHBUb3RhbFN1cHBseQkBEUBleHRyTmF0aXZlKDEwNTApAgURc2ZGYXJtaW5nQ29udHJhY3QJAKwCAgUIYXhseVBvb2wFDmtTRlRvdGFsU3VwcGx5BARscElkCQERQGV4dHJOYXRpdmUoMTA1MykCCQERQGV4dHJOYXRpdmUoMTA2MikBBQhheGx5UG9vbAUFa0xwSWQEC2xwUHJlY2lzaW9uCQERZ2V0QXNzZXRQcmVjaXNpb24BBQRscElkBAdscFByaWNlCQERZ2V0QXhseVNoYXJlUHJpY2UABBBscFRvdGFsU3VwcGx5VXNkCQBrAwUNbHBUb3RhbFN1cHBseQUHbHBQcmljZQULbHBQcmVjaXNpb24EBHJ3cGIJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwURa0xwUmV3YXJkUGVyQmxvY2sAAAQHcndwYlVzZAkAawMFBHJ3cGIFCWF4bHlQcmljZQUNYXhseVByZWNpc2lvbgQGcndZZWFyCQBoAgkAaAIFB3J3cGJVc2QFDHBlcmlvZExlbmd0aAA0BAVscEFwcgkAawMFBnJ3WWVhcgUGU0NBTEU4BRBscFRvdGFsU3VwcGx5VXNkCQCVCgMJAQxnZXRBbGxUb2tlbnMABQRhcHJzBQVscEFwcgETZ2V0VG9rZW5VdGlsaXphdGlvbgEHYXNzZXRJZAAABwFpARJjbGFpbUxlbmRlclJld2FyZHMABAhjbGFpbVJlcwkBGGNsYWltTGVuZGVyUmV3YXJkc0NvbW1vbgIJAKUIAQgFAWkGY2FsbGVyBwMJAAACCAUIY2xhaW1SZXMCXzMAAAkAAgECI2NsYWltIGFtb3VudCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwBANpbnYJAPwHBAUNdG9rZW5Db250cmFjdAISd2l0aGRyYXdMZW5kUmV3YXJkCQDMCAIIBQhjbGFpbVJlcwJfMwkAzAgCCQClCAEIBQFpBmNhbGxlcgUDbmlsBQNuaWwDCQAAAgUDaW52BQNpbnYIBQhjbGFpbVJlcwJfNAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ5jbGFpbUxwUmV3YXJkcwAECGNsYWltUmVzCQEUY2xhaW1McFJld2FyZHNDb21tb24CCQClCAEIBQFpBmNhbGxlcgcDCQAAAggFCGNsYWltUmVzAl8xAAAJAAIBAiNjbGFpbSBhbW91bnQgbXVzdCBiZSBncmVhdGVyIHRoYW4gMAQDaW52CQD8BwQFDXRva2VuQ29udHJhY3QCEHdpdGhkcmF3THBSZXdhcmQJAMwIAggFCGNsYWltUmVzAl8xCQDMCAIJAKUIAQgFAWkGY2FsbGVyBQNuaWwFA25pbAMJAAACBQNpbnYFA2ludggFCGNsYWltUmVzAl8yCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCmxlbmRBY3Rpb24CBHVzZXIHdG9rZW5JZAkBC3ZhbHVlT3JFbHNlAgkBCmlzTGFuZENhbGwBBQFpBBJ1c2VyQXZhaWxhYmxlQ2xhaW0JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgUHdG9rZW5JZAIBXwUEdXNlcgUXa1VzZXJMZW5kQXZhaWxhYmxlQ2xhaW0AAAQNJHQwMTM2NzkxMzc0NgkBEmNhbGNMZW5kVXNlclJld2FyZAIFBHVzZXIFB3Rva2VuSWQEB3VSZXdhcmQIBQ0kdDAxMzY3OTEzNzQ2Al8xBBBuZXdUb2tlbkludGVyZXN0CAUNJHQwMTM2NzkxMzc0NgJfMgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgUHdG9rZW5JZAIBXwUEdXNlcgURa1VzZXJMZW5kSW50ZXJlc3QFEG5ld1Rva2VuSW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIFB3Rva2VuSWQCAV8FBHVzZXIFF2tVc2VyTGVuZEF2YWlsYWJsZUNsYWltCQBkAgUSdXNlckF2YWlsYWJsZUNsYWltBQd1UmV3YXJkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFB3Rva2VuSWQFDmtUb2tlbkludGVyZXN0BRBuZXdUb2tlbkludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFB3Rva2VuSWQFFGtUb2tlbkludGVyZXN0SGVpZ2h0BQZoZWlnaHQFA25pbAFpAQhscEFjdGlvbgEEdXNlcgkBC3ZhbHVlT3JFbHNlAgkBD2lzU0ZGYXJtaW5nQ2FsbAEFAWkEEnVzZXJBdmFpbGFibGVDbGFpbQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHVzZXIFFWtVc2VyTHBBdmFpbGFibGVDbGFpbQAABA0kdDAxNDIxODE0MjcxCQEQY2FsY0xwVXNlclJld2FyZAEFBHVzZXIEB3VSZXdhcmQIBQ0kdDAxNDIxODE0MjcxAl8xBA1uZXdMcEludGVyZXN0CAUNJHQwMTQyMTgxNDI3MQJfMgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQR1c2VyBQ9rVXNlckxwSW50ZXJlc3QFDW5ld0xwSW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEdXNlcgUVa1VzZXJMcEF2YWlsYWJsZUNsYWltCQBkAgUSdXNlckF2YWlsYWJsZUNsYWltBQd1UmV3YXJkCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQtrTHBJbnRlcmVzdAUNbmV3THBJbnRlcmVzdAkAzAgCCQEMSW50ZWdlckVudHJ5AgURa0xwSW50ZXJlc3RIZWlnaHQFBmhlaWdodAUDbmlsAWkBBGluaXQDDGF4bHlQb29sQWRkchJmYXJtaW5nU3RhcnRIZWlnaHQMcGVyaW9kTGVuZ3RoCQELdmFsdWVPckVsc2UCCQEKaXNTZWxmQ2FsbAEFAWkJAMwIAgkBC1N0cmluZ0VudHJ5AgUJa0F4bHlQb29sBQxheGx5UG9vbEFkZHIJAMwIAgkBDEludGVnZXJFbnRyeQIFDGtTdGFydEhlaWdodAUSZmFybWluZ1N0YXJ0SGVpZ2h0CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ1rUGVyaW9kTGVuZ3RoBQxwZXJpb2RMZW5ndGgFA25pbAFpAQxpbml0TmV3VG9rZW4BB3Rva2VuSWQJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQEJaXNEZWZpbmVkAQkAmggCBQR0aGlzCQCsAgIFB3Rva2VuSWQFDmtUb2tlbkludGVyZXN0CQACAQIUdG9rZW4gYWxyZWFkeSBpbml0ZWQDCQEBIQEJAQhjb250YWlucwIJARFAZXh0ck5hdGl2ZSgxMDUzKQIFDGxlbmRDb250cmFjdAUQa0xlbmRTZXR1cFRva2VucwUHdG9rZW5JZAkAAgECE25vIHRva2VuIG9uIGxhbmRpbmcEDG5ld0FsbFRva2VucwkAzQgCCQEMZ2V0QWxsVG9rZW5zAAUHdG9rZW5JZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQd0b2tlbklkBQ5rVG9rZW5JbnRlcmVzdAAACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFB3Rva2VuSWQFFGtUb2tlbkludGVyZXN0SGVpZ2h0CQCWAwEJAMwIAgULc3RhcnRIZWlnaHQJAMwIAgUGaGVpZ2h0BQNuaWwJAMwIAgkBC1N0cmluZ0VudHJ5AgUHa1Rva2VucwkAuQkCBQxuZXdBbGxUb2tlbnMCASwJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUHdG9rZW5JZAUUa1Rva2VuUmV3YXJkUGVyQmxvY2sAAAUDbmlsAWkBDXVwZGF0ZVJld2FyZHMACQELdmFsdWVPckVsc2UCCQEOaXNPcGVyYXRvckNhbGwBBQFpBBBsYXN0VXBkYXRlUGVyaW9kCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFEWtMYXN0VXBkYXRlUGVyaW9kAAAECmNhbGNQZXJpb2QJAGQCCQBpAgkAZQIFBmhlaWdodAULc3RhcnRIZWlnaHQFDHBlcmlvZExlbmd0aAABBAljdXJQZXJpb2QDCQBnAgAABQpjYWxjUGVyaW9kAAEFCmNhbGNQZXJpb2QDCQBmAgUJY3VyUGVyaW9kAGgJAAIBAhFtYXggcGVyaW9kIGlzIDEwNAMDCQBnAgUQbGFzdFVwZGF0ZVBlcmlvZAUJY3VyUGVyaW9kCQECIT0CBRBsYXN0VXBkYXRlUGVyaW9kAAAHCQACAQIlcmV3YXJkcyBhbHJlZHkgdXBkYXRlZCBpbiB0aGlzIHBlcmlvZAQNJHQwMTU4MDkxNTkwMgkBF2dldFRvdGFsU3VwcGx5QWxsVG9rZW5zAAQLdG90YWxTdXBwbHkIBQ0kdDAxNTgwOTE1OTAyAl8xBA50b3RhbFN1cHBseVVzZAgFDSR0MDE1ODA5MTU5MDICXzIEEXRvdGFsU3VwcGx5VXNkQWxsCAUNJHQwMTU4MDkxNTkwMgJfMwQLdXRpbGl6YXRpb24IBQ0kdDAxNTgwOTE1OTAyAl80CgEMZ2V0TmV3V2lnaHRzAgFhB3Rva2VuSWQEDSR0MDE1OTcyMTYwMDkFAWEEB3dlaWdodHMIBQ0kdDAxNTk3MjE2MDA5Al8xBAt0b3RhbFdlaWdodAgFDSR0MDE1OTcyMTYwMDkCXzIEBWluZGV4CAUNJHQwMTU5NzIxNjAwOQJfMwQFc2hhcmUJAGsDCQCRAwIFDnRvdGFsU3VwcGx5VXNkBQVpbmRleAUGU0NBTEU4BRF0b3RhbFN1cHBseVVzZEFsbAQJbmV3V2VpZ2h0CQBrAwUFc2hhcmUJAJEDAgULdXRpbGl6YXRpb24FBWluZGV4BQZTQ0FMRTgJAJUKAwkAzQgCBQd3ZWlnaHRzBQluZXdXZWlnaHQJAGQCBQt0b3RhbFdlaWdodAUJbmV3V2VpZ2h0CQBkAgUFaW5kZXgAAQQNJHQwMTYyMTUxNjMwMAoAAiRsCQEMZ2V0QWxsVG9rZW5zAAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJUKAwUDbmlsAAAAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEMZ2V0TmV3V2lnaHRzAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAzMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgQKbmV3V2VpZ2h0cwgFDSR0MDE2MjE1MTYzMDACXzEEDnRvdGFsTmV3V2VpZ2h0CAUNJHQwMTYyMTUxNjMwMAJfMgQJYXhseVByaWNlCQEUZ2V0QXhseVByaWNlT25Td29wZmkABA1heGx5UHJlY2lzaW9uCQERZ2V0QXNzZXRQcmVjaXNpb24BBQZheGx5SWQEBm1heEFQUgkBFWdldEFkb3B0ZWRBUFJCeVBlcmlvZAMFCWN1clBlcmlvZAUTTEVOREVSU19BUFJfUEVSSU9EUwULTEVOREVSU19BUFIKAQx1cGRhdGVSZXdhcmQCAWEHdG9rZW5JZAQNJHQwMTY1NTAxNjU5NAUBYQQIZW50ZXJpZXMIBQ0kdDAxNjU1MDE2NTk0Al8xBBF0b3RhbFBlcmlvZFJld2FyZAgFDSR0MDE2NTUwMTY1OTQCXzIEBWluZGV4CAUNJHQwMTY1NTAxNjU5NAJfMwMJAAACCQCRAwIFC3RvdGFsU3VwcGx5BQVpbmRleAAACQCVCgMJAM4IAgUIZW50ZXJpZXMJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUHdG9rZW5JZAUUa1ByZXZMZW5kVG9rZW5TdXBwbHkJAJEDAgULdG90YWxTdXBwbHkFBWluZGV4CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFB3Rva2VuSWQFFGtUb2tlblJld2FyZFBlckJsb2NrAAAJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUHdG9rZW5JZAUOa1Rva2VuSW50ZXJlc3QJARRjYWxjTmV3VG9rZW5JbnRlcmVzdAIFB3Rva2VuSWQJAJEDAgULdG90YWxTdXBwbHkFBWluZGV4CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFB3Rva2VuSWQFFGtUb2tlbkludGVyZXN0SGVpZ2h0CQCWAwEJAMwIAgULc3RhcnRIZWlnaHQJAMwIAgUGaGVpZ2h0BQNuaWwFA25pbAURdG90YWxQZXJpb2RSZXdhcmQJAGQCBQVpbmRleAABBAVzaGFyZQkAawMJAJEDAgUKbmV3V2VpZ2h0cwUFaW5kZXgFBlNDQUxFOAUOdG90YWxOZXdXZWlnaHQECW1heFJld2FyZAkAawMFBXNoYXJlBRNsZW5kTWF4UGVyaW9kQW1vdW50BQZTQ0FMRTgEDG1heFJld2FyZFVzZAkAawMFCW1heFJld2FyZAUJYXhseVByaWNlBQ1heGx5UHJlY2lzaW9uBA9wcmV2VG90YWxTdXBwbHkJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQd0b2tlbklkBRRrUHJldkxlbmRUb2tlblN1cHBseQAABAZydENvZWYDAwkAAAIFD3ByZXZUb3RhbFN1cHBseQAABgkAAAIJAJEDAgULdG90YWxTdXBwbHkFBWluZGV4AAAAAAkAZQIJAGsDCQCRAwIFC3RvdGFsU3VwcGx5BQVpbmRleAUGU0NBTEU4BQ9wcmV2VG90YWxTdXBwbHkFBlNDQUxFOAQGcmV3YXJkCQBpAgkAaQIJAJcDAQkAzAgCCQBoAgUGbWF4QVBSCQBkAgUGU0NBTEU4CQCWAwEJAMwIAgUGcnRDb2VmCQDMCAIAAAUDbmlsCQDMCAIJAGsDBQZtYXhBUFIJAGgCAA8FBlNDQUxFOAAKBQNuaWwFBlNDQUxFOABkBAlyZXdhcmRVc2QJAJcDAQkAzAgCBQxtYXhSZXdhcmRVc2QJAMwIAgkAawMJAJEDAgUOdG90YWxTdXBwbHlVc2QFBWluZGV4BQZyZXdhcmQFBlNDQUxFOAUDbmlsBAxyZXdhcmRQZXJpb2QJAGsDBQlyZXdhcmRVc2QFDWF4bHlQcmVjaXNpb24FCWF4bHlQcmljZQQOcmV3YXJkUGVyQmxvY2sJAGkCBQxyZXdhcmRQZXJpb2QFDHBlcmlvZExlbmd0aAkAlQoDCQDOCAIFCGVudGVyaWVzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFB3Rva2VuSWQFFGtQcmV2TGVuZFRva2VuU3VwcGx5CQCRAwIFC3RvdGFsU3VwcGx5BQVpbmRleAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQd0b2tlbklkBRRrVG9rZW5SZXdhcmRQZXJCbG9jawUOcmV3YXJkUGVyQmxvY2sJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUHdG9rZW5JZAUOa1Rva2VuSW50ZXJlc3QJARRjYWxjTmV3VG9rZW5JbnRlcmVzdAIFB3Rva2VuSWQJAJEDAgULdG90YWxTdXBwbHkFBWluZGV4CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFB3Rva2VuSWQFFGtUb2tlbkludGVyZXN0SGVpZ2h0CQCWAwEJAMwIAgULc3RhcnRIZWlnaHQJAMwIAgUGaGVpZ2h0BQNuaWwFA25pbAkAZAIFEXRvdGFsUGVyaW9kUmV3YXJkBQxyZXdhcmRQZXJpb2QJAGQCBQVpbmRleAABBA0kdDAxODI3OTE4MzcxCgACJGwJAQxnZXRBbGxUb2tlbnMACgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlQoDBQNuaWwAAAAACgEFJGYxXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQx1cGRhdGVSZXdhcmQCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjFfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDMwCQEFJGYxXzICCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAAVABYAFwAYABkAGgAbABwAHQAeBA50b2tlbnNFbnRlcmllcwgFDSR0MDE4Mjc5MTgzNzECXzEEEHRvdGFsVG9rZW5SZXdhcmQIBQ0kdDAxODI3OTE4MzcxAl8yBAhidXJuTGVuZAkAZQIFE2xlbmRNYXhQZXJpb2RBbW91bnQFEHRvdGFsVG9rZW5SZXdhcmQEA2ludgkA/AcEBQ10b2tlbkNvbnRyYWN0AhJ3aXRoZHJhd0xlbmRSZXdhcmQJAMwIAgUIYnVybkxlbmQJAMwIAgkApQgBBQR0aGlzBQNuaWwFA25pbAMJAAACBQNpbnYFA2ludgkAzQgCCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIFEWtMcFJld2FyZFBlckJsb2NrAAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUMYXhseUJ1cm5BZGRyBQhidXJuTGVuZAkA2QQBBQZheGx5SWQFA25pbAUOdG9rZW5zRW50ZXJpZXMJAQxJbnRlZ2VyRW50cnkCBRFrTGFzdFVwZGF0ZVBlcmlvZAUJY3VyUGVyaW9kCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJ0eAEGdmVyaWZ5AAQTbXVsdGlTaWduZWRCeUFkbWlucwQSYWRtaW5QdWJLZXkxU2lnbmVkAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAUIYWRtaW4xUEsAAQAABBJhZG1pblB1YktleTJTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwABBQhhZG1pbjJQSwABAAAEEmFkbWluUHViS2V5M1NpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAIFCGFkbWluM1BLAAEAAAkAZwIJAGQCCQBkAgUSYWRtaW5QdWJLZXkxU2lnbmVkBRJhZG1pblB1YktleTJTaWduZWQFEmFkbWluUHViS2V5M1NpZ25lZAACBAckbWF0Y2gwBQJ0eAMJAAECBQckbWF0Y2gwAhdJbnZva2VTY3JpcHRUcmFuc2FjdGlvbgQDaW52BQckbWF0Y2gwBAZpc1NlbGYJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXkECmlzUmlnaHRGZWUDCQAAAggFA2ludgNmZWUAoPc2CQAAAggFA2ludgpmZWVBc3NldElkBQR1bml0BwQKaXNJbml0Q2FsbAkAAAIIBQNpbnYIZnVuY3Rpb24CBGluaXQEDGlzbm9QYXltZW50cwkAAAIJAJADAQgFA2ludghwYXltZW50cwAAAwMDAwUKaXNSaWdodEZlZQUKaXNJbml0Q2FsbAcFBmlzU2VsZgcFDGlzbm9QYXltZW50cwcGBRNtdWx0aVNpZ25lZEJ5QWRtaW5zBRNtdWx0aVNpZ25lZEJ5QWRtaW5zV4cJdA==", "height": 4018563, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: JHMqr1nQ2ieKzDXCTHUjfxMMcE1v7S1MbTpwJTc2stt Next: EhHRXhpMYhbShgcWk2KgYGdPNgPCLHAXTdDgR8ZKDvFU Diff:
OldNewDifferences
513513 else false)
514514 then throw("rewards alredy updated in this period")
515515 else {
516- let $t01580915889 = getTotalSupplyAllTokens()
517- let totalSupply = $t01580915889._1
518- let totalSupplyUsd = $t01580915889._2
519- let totalSupplyUsdAll = $t01580915889._3
516+ let $t01580915902 = getTotalSupplyAllTokens()
517+ let totalSupply = $t01580915902._1
518+ let totalSupplyUsd = $t01580915902._2
519+ let totalSupplyUsdAll = $t01580915902._3
520+ let utilization = $t01580915902._4
521+ func getNewWights (a,tokenId) = {
522+ let $t01597216009 = a
523+ let weights = $t01597216009._1
524+ let totalWeight = $t01597216009._2
525+ let index = $t01597216009._3
526+ let share = fraction(totalSupplyUsd[index], SCALE8, totalSupplyUsdAll)
527+ let newWeight = fraction(share, utilization[index], SCALE8)
528+ $Tuple3((weights :+ newWeight), (totalWeight + newWeight), (index + 1))
529+ }
530+
531+ let $t01621516300 = {
532+ let $l = getAllTokens()
533+ let $s = size($l)
534+ let $acc0 = $Tuple3(nil, 0, 0)
535+ func $f0_1 ($a,$i) = if (($i >= $s))
536+ then $a
537+ else getNewWights($a, $l[$i])
538+
539+ func $f0_2 ($a,$i) = if (($i >= $s))
540+ then $a
541+ else throw("List size exceeds 30")
542+
543+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30)
544+ }
545+ let newWeights = $t01621516300._1
546+ let totalNewWeight = $t01621516300._2
520547 let axlyPrice = getAxlyPriceOnSwopfi()
521548 let axlyPrecision = getAssetPrecision(axlyId)
522549 let maxAPR = getAdoptedAPRByPeriod(curPeriod, LENDERS_APR_PERIODS, LENDERS_APR)
523550 func updateReward (a,tokenId) = {
524- let $t01613916183 = a
525- let enteries = $t01613916183._1
526- let totalPeriodReward = $t01613916183._2
527- let index = $t01613916183._3
551+ let $t01655016594 = a
552+ let enteries = $t01655016594._1
553+ let totalPeriodReward = $t01655016594._2
554+ let index = $t01655016594._3
528555 if ((totalSupply[index] == 0))
529556 then $Tuple3((enteries ++ [IntegerEntry((tokenId + kPrevLendTokenSupply), totalSupply[index]), IntegerEntry((tokenId + kTokenRewardPerBlock), 0), IntegerEntry((tokenId + kTokenInterest), calcNewTokenInterest(tokenId, totalSupply[index])), IntegerEntry((tokenId + kTokenInterestHeight), max([startHeight, height]))]), totalPeriodReward, (index + 1))
530557 else {
531- let share = fraction(totalSupplyUsd[index], SCALE8, totalSupplyUsdAll)
558+ let share = fraction(newWeights[index], SCALE8, totalNewWeight)
532559 let maxReward = fraction(share, lendMaxPeriodAmount, SCALE8)
533560 let maxRewardUsd = fraction(maxReward, axlyPrice, axlyPrecision)
534561 let prevTotalSupply = valueOrElse(getInteger(this, (tokenId + kPrevLendTokenSupply)), 0)
545572 }
546573 }
547574
548- let $t01787517967 = {
575+ let $t01827918371 = {
549576 let $l = getAllTokens()
550577 let $s = size($l)
551578 let $acc0 = $Tuple3(nil, 0, 0)
552- func $f0_1 ($a,$i) = if (($i >= $s))
579+ func $f1_1 ($a,$i) = if (($i >= $s))
553580 then $a
554581 else updateReward($a, $l[$i])
555582
556- func $f0_2 ($a,$i) = if (($i >= $s))
583+ func $f1_2 ($a,$i) = if (($i >= $s))
557584 then $a
558585 else throw("List size exceeds 30")
559586
560- $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30)
587+ $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30)
561588 }
562- let tokensEnteries = $t01787517967._1
563- let totalTokenReward = $t01787517967._2
589+ let tokensEnteries = $t01827918371._1
590+ let totalTokenReward = $t01827918371._2
564591 let burnLend = (lendMaxPeriodAmount - totalTokenReward)
565592 let inv = invoke(tokenContract, "withdrawLendReward", [burnLend, toString(this)], nil)
566593 if ((inv == inv))
567594 then (([IntegerEntry(kLpRewardPerBlock, 0), ScriptTransfer(axlyBurnAddr, burnLend, fromBase58String(axlyId))] ++ tokensEnteries) :+ IntegerEntry(kLastUpdatePeriod, curPeriod))
568595 else throw("Strict value is not equal to itself.")
569596 }
570- })
571-
572-
573-
574-@Callable(i)
575-func updateRewardsOld () = valueOrElse(isOperatorCall(i), {
576- let lastUpdatePeriod = valueOrElse(getInteger(this, kLastUpdatePeriod), 0)
577- let calcPeriod = (((height - startHeight) / periodLength) + 1)
578- let curPeriod = if ((0 >= calcPeriod))
579- then 1
580- else calcPeriod
581- if ((curPeriod > 104))
582- then throw("max period is 104")
583- else {
584- let $t01862818708 = getTotalSupplyAllTokens()
585- let totalSupply = $t01862818708._1
586- let totalSupplyUsd = $t01862818708._2
587- let totalSupplyUsdAll = $t01862818708._3
588- let axlyPrice = getAxlyPriceOnSwopfi()
589- let axlyPrecision = getAssetPrecision(axlyId)
590- let maxAPR = getAdoptedAPRByPeriod(curPeriod, LENDERS_APR_PERIODS, LENDERS_APR)
591- func updateReward (a,tokenId) = {
592- let $t01898019041 = a
593- let enteries = $t01898019041._1
594- let totalPeriodReward = $t01898019041._2
595- let index = $t01898019041._3
596- let shares = $t01898019041._4
597- let rewards = $t01898019041._5
598- if ((totalSupply[index] == 0))
599- then $Tuple3((enteries ++ [IntegerEntry((tokenId + kPrevLendTokenSupply), totalSupply[index]), IntegerEntry((tokenId + kTokenRewardPerBlock), 0), IntegerEntry((tokenId + kTokenInterest), calcNewTokenInterest(tokenId, totalSupply[index])), IntegerEntry((tokenId + kTokenInterestHeight), max([startHeight, height]))]), totalPeriodReward, (index + 1))
600- else {
601- let share = fraction(totalSupplyUsd[index], SCALE8, totalSupplyUsdAll)
602- let maxReward = fraction(share, lendMaxPeriodAmount, SCALE8)
603- let maxRewardUsd = fraction(maxReward, axlyPrice, axlyPrecision)
604- let prevTotalSupply = valueOrElse(getInteger(this, (tokenId + kPrevLendTokenSupply)), 0)
605- let rtCoef = if (if ((prevTotalSupply == 0))
606- then true
607- else (totalSupply[index] == 0))
608- then 0
609- else (fraction(totalSupply[index], SCALE8, prevTotalSupply) - SCALE8)
610- let reward = ((min([(maxAPR * (SCALE8 + max([rtCoef, 0]))), fraction(maxAPR, (15 * SCALE8), 10)]) / SCALE8) / 100)
611- let rewardUsd = min([maxRewardUsd, fraction(totalSupplyUsd[index], reward, SCALE8)])
612- let rewardPeriod = fraction(rewardUsd, axlyPrecision, axlyPrice)
613- let rewardPerBlock = (rewardPeriod / periodLength)
614- $Tuple5((enteries ++ [IntegerEntry((tokenId + kPrevLendTokenSupply), totalSupply[index]), IntegerEntry((tokenId + kTokenRewardPerBlock), rewardPerBlock), IntegerEntry((tokenId + kTokenInterest), calcNewTokenInterest(tokenId, totalSupply[index])), IntegerEntry((tokenId + kTokenInterestHeight), max([startHeight, height]))]), (totalPeriodReward + rewardPeriod), (index + 1), (shares :+ share), (rewards :+ rewardPerBlock))
615- }
616- }
617-
618- let $t02079320917 = {
619- let $l = getAllTokens()
620- let $s = size($l)
621- let $acc0 = $Tuple5(nil, 0, 0, nil, nil)
622- func $f0_1 ($a,$i) = if (($i >= $s))
623- then $a
624- else updateReward($a, $l[$i])
625-
626- func $f0_2 ($a,$i) = if (($i >= $s))
627- then $a
628- else throw("List size exceeds 30")
629-
630- $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30)
631- }
632- let tokensEnteries = $t02079320917._1
633- let totalTokenReward = $t02079320917._2
634- let index = $t02079320917._3
635- let shares = $t02079320917._4
636- let rewards = $t02079320917._5
637- let burnLend = (lendMaxPeriodAmount - totalTokenReward)
638- $Tuple2(nil, $Tuple3(shares, rewards, burnLend))
639- }
640- })
641-
642-
643-
644-@Callable(i)
645-func updateRewardsNew () = valueOrElse(isOperatorCall(i), {
646- let lastUpdatePeriod = valueOrElse(getInteger(this, kLastUpdatePeriod), 0)
647- let calcPeriod = (((height - startHeight) / periodLength) + 1)
648- let curPeriod = if ((0 >= calcPeriod))
649- then 1
650- else calcPeriod
651- if ((curPeriod > 104))
652- then throw("max period is 104")
653- else {
654- let $t02134021433 = getTotalSupplyAllTokens()
655- let totalSupply = $t02134021433._1
656- let totalSupplyUsd = $t02134021433._2
657- let totalSupplyUsdAll = $t02134021433._3
658- let utilization = $t02134021433._4
659- func getNewWights (a,tokenId) = {
660- let $t02150321540 = a
661- let weights = $t02150321540._1
662- let totalWeight = $t02150321540._2
663- let index = $t02150321540._3
664- let share = fraction(totalSupplyUsd[index], SCALE8, totalSupplyUsdAll)
665- let newWeight = fraction(share, utilization[index], SCALE8)
666- $Tuple3((weights :+ newWeight), (totalWeight + newWeight), (index + 1))
667- }
668-
669- let $t02174621831 = {
670- let $l = getAllTokens()
671- let $s = size($l)
672- let $acc0 = $Tuple3(nil, 0, 0)
673- func $f0_1 ($a,$i) = if (($i >= $s))
674- then $a
675- else getNewWights($a, $l[$i])
676-
677- func $f0_2 ($a,$i) = if (($i >= $s))
678- then $a
679- else throw("List size exceeds 30")
680-
681- $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30)
682- }
683- let newWeights = $t02174621831._1
684- let totalNewWeight = $t02174621831._2
685- let axlyPrice = getAxlyPriceOnSwopfi()
686- let axlyPrecision = getAssetPrecision(axlyId)
687- let maxAPR = getAdoptedAPRByPeriod(curPeriod, LENDERS_APR_PERIODS, LENDERS_APR)
688- func updateReward (a,tokenId) = {
689- let $t02210322164 = a
690- let enteries = $t02210322164._1
691- let totalPeriodReward = $t02210322164._2
692- let index = $t02210322164._3
693- let shares = $t02210322164._4
694- let rewards = $t02210322164._5
695- if ((totalSupply[index] == 0))
696- then $Tuple3((enteries ++ [IntegerEntry((tokenId + kPrevLendTokenSupply), totalSupply[index]), IntegerEntry((tokenId + kTokenRewardPerBlock), 0), IntegerEntry((tokenId + kTokenInterest), calcNewTokenInterest(tokenId, totalSupply[index])), IntegerEntry((tokenId + kTokenInterestHeight), max([startHeight, height]))]), totalPeriodReward, (index + 1))
697- else {
698- let share = fraction(newWeights[index], SCALE8, totalNewWeight)
699- let maxReward = fraction(share, lendMaxPeriodAmount, SCALE8)
700- let maxRewardUsd = fraction(maxReward, axlyPrice, axlyPrecision)
701- let prevTotalSupply = valueOrElse(getInteger(this, (tokenId + kPrevLendTokenSupply)), 0)
702- let rtCoef = if (if ((prevTotalSupply == 0))
703- then true
704- else (totalSupply[index] == 0))
705- then 0
706- else (fraction(totalSupply[index], SCALE8, prevTotalSupply) - SCALE8)
707- let reward = ((min([(maxAPR * (SCALE8 + max([rtCoef, 0]))), fraction(maxAPR, (15 * SCALE8), 10)]) / SCALE8) / 100)
708- let rewardUsd = min([maxRewardUsd, fraction(totalSupplyUsd[index], reward, SCALE8)])
709- let rewardPeriod = fraction(rewardUsd, axlyPrecision, axlyPrice)
710- let rewardPerBlock = (rewardPeriod / periodLength)
711- $Tuple5((enteries ++ [IntegerEntry((tokenId + kPrevLendTokenSupply), totalSupply[index]), IntegerEntry((tokenId + kTokenRewardPerBlock), rewardPerBlock), IntegerEntry((tokenId + kTokenInterest), calcNewTokenInterest(tokenId, totalSupply[index])), IntegerEntry((tokenId + kTokenInterestHeight), max([startHeight, height]))]), (totalPeriodReward + rewardPeriod), (index + 1), (shares :+ share), (rewards :+ rewardPerBlock))
712- }
713- }
714-
715- let $t02390924033 = {
716- let $l = getAllTokens()
717- let $s = size($l)
718- let $acc0 = $Tuple5(nil, 0, 0, nil, nil)
719- func $f1_1 ($a,$i) = if (($i >= $s))
720- then $a
721- else updateReward($a, $l[$i])
722-
723- func $f1_2 ($a,$i) = if (($i >= $s))
724- then $a
725- else throw("List size exceeds 30")
726-
727- $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30)
728- }
729- let tokensEnteries = $t02390924033._1
730- let totalTokenReward = $t02390924033._2
731- let index = $t02390924033._3
732- let shares = $t02390924033._4
733- let rewards = $t02390924033._5
734- let burnLend = (lendMaxPeriodAmount - totalTokenReward)
735- $Tuple2(nil, $Tuple5(shares, rewards, newWeights, totalNewWeight, burnLend))
736- }
737597 })
738598
739599
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let CONF = addressFromStringValue(getStringValue(this, "config"))
55
66 let SCALE8 = 100000000
77
88 let LENDERS_APR = [150, 120, 100, 80, 60, 40, 30, 20, 10]
99
1010 let LENDERS_APR_PERIODS = ["1-1", "2-2", "3-3", "4-4", "5-8", "9-12", "13-16", "17-20", "21-104"]
1111
1212 let LENDERS_MAX_PERIODS = 104
1313
1414 let LP_APR = [150, 120, 100, 80, 60, 40]
1515
1616 let LP_APR_PERIODS = ["1-1", "2-2", "3-3", "4-4", "5-8", "9-12"]
1717
1818 let LP_MAX_PERIODS = 12
1919
2020 let kStartHeight = "startHeight"
2121
2222 let kPeriodLength = "periodLength"
2323
2424 let kLendersMaxAmount = "lendRewardsAmount"
2525
2626 let kLPMaxAmount = "lpRewardAmount"
2727
2828 let kTokens = "tokens"
2929
3030 let kUserSupply = "_userTotalSupply"
3131
3232 let kTokenInterest = "_tokenInterest"
3333
3434 let kTokenInterestHeight = "_tokenInterestHeight"
3535
3636 let kTokenRewardPerBlock = "_tokenRewardPerBlock"
3737
3838 let kLastUpdatePeriod = "rewardUpdatePeriod"
3939
4040 let kUserLendInterest = "_userLandInterest"
4141
4242 let kUserLendAvailableClaim = "_userLendAvailableClaim"
4343
4444 let kUserLpAvailableClaim = "_userLpAvailableClaim"
4545
4646 let kLpInterest = "lpInterest"
4747
4848 let kLpInterestHeight = "lpInterestHeight"
4949
5050 let kPrevLPSupply = "prevLPTotalSupply"
5151
5252 let kLpRewardPerBlock = "lpRewardPerBlock"
5353
5454 let kUserLpInterest = "_userLpInterest"
5555
5656 let kPriceInOracle = "_twap5B"
5757
5858 let kPrevLendTokenSupply = "_prevLendTotalSupply"
5959
6060 let kAXLYTokenId = "axlyTokenId"
6161
6262 let kLendTokenSupply = "total_supplied_"
6363
6464 let kLendTokenBorrowed = "total_borrowed_"
6565
6666 let kLendUserSupply = "_supplied_"
6767
6868 let kLendSetupTokens = "setup_tokens"
6969
7070 let kSFTotalSupply = "_total_share_tokens_locked"
7171
7272 let kSFUserTotalSupply = "_share_tokens_locked"
7373
7474 let kAxlyPool = "axlyPool"
7575
7676 let kLpId = "share_asset_id"
7777
7878 let kAdmin1PK = "group1_admin1_pub_key"
7979
8080 let kAdmin2PK = "group1_admin2_pub_key"
8181
8282 let kAdmin3PK = "group1_admin3_pub_key"
8383
8484 let kOperatorCallPK = "admin_call_pub_key"
8585
8686 let axlyPool = valueOrErrorMessage(getString(this, kAxlyPool), "Can't get axlyPool key")
8787
8888 let mainContract = addressFromStringValue(getStringValue(CONF, "main_contract"))
8989
9090 let tokenContract = addressFromStringValue(getStringValue(CONF, "tokenomic"))
9191
9292 let lendContract = addressFromStringValue(valueOrErrorMessage(getString(CONF, "lend_service_addr"), "Can't get lend service addr"))
9393
9494 let sfFarmingContract = addressFromStringValue(valueOrErrorMessage(getString(CONF, "swopfi_farming_addr"), "Can't get swopfi farming addr"))
9595
9696 let priceOracleAddr = addressFromStringValue(valueOrErrorMessage(getString(CONF, "price_oracle"), "No price oracle address"))
9797
9898 let admin1PK = fromBase58String(valueOrErrorMessage(getString(CONF, kAdmin1PK), "Can't get admin1PK"))
9999
100100 let admin2PK = fromBase58String(valueOrErrorMessage(getString(CONF, kAdmin2PK), "Can't get admin2PK"))
101101
102102 let admin3PK = fromBase58String(valueOrErrorMessage(getString(CONF, kAdmin3PK), "Can't get admin3PK"))
103103
104104 let operatorPK = fromBase58String(valueOrErrorMessage(getString(CONF, kOperatorCallPK), "Can't get operatorPK"))
105105
106106 let axlyBurnAddr = addressFromStringValue(getStringValue(CONF, "axly_burn_address"))
107107
108108 let axlyId = valueOrErrorMessage(getString(tokenContract, kAXLYTokenId), "Can't get Axly token id")
109109
110110 let startHeight = getIntegerValue(this, kStartHeight)
111111
112112 let periodLength = getIntegerValue(this, kPeriodLength)
113113
114114 let lendMaxAmount = getIntegerValue(tokenContract, kLendersMaxAmount)
115115
116116 let lendMaxPeriodAmount = (lendMaxAmount / LENDERS_MAX_PERIODS)
117117
118118 let lpMaxAmount = getIntegerValue(tokenContract, kLPMaxAmount)
119119
120120 let lpMaxPeriodAmount = (lpMaxAmount / LP_MAX_PERIODS)
121121
122122 func isAdminCall (i) = if (containsElement([admin1PK, admin2PK, admin3PK], i.callerPublicKey))
123123 then unit
124124 else throw("Only admin group1 can call this function")
125125
126126
127127 func isSelfCall (i) = if ((i.caller == this))
128128 then unit
129129 else throw("Only contract itself can call this function")
130130
131131
132132 func isOperatorCall (i) = if ((i.callerPublicKey == operatorPK))
133133 then unit
134134 else throw("Only operator can call this function")
135135
136136
137137 func isLandCall (i) = if ((i.caller == lendContract))
138138 then unit
139139 else throw("Only land contract can call this function")
140140
141141
142142 func isSFFarmingCall (i) = if ((i.caller == sfFarmingContract))
143143 then unit
144144 else throw("Only land contract can call this function")
145145
146146
147147 func getAllTokens () = {
148148 let tokens = valueOrElse(getString(this, kTokens), "")
149149 if ((tokens == ""))
150150 then nil
151151 else split(tokens, ",")
152152 }
153153
154154
155155 func getAssetPrice (assetId) = getIntegerValue(priceOracleAddr, (assetId + kPriceInOracle))
156156
157157
158158 func getAssetDecimals (assetId) = if ((assetId == "WAVES"))
159159 then 8
160160 else match assetInfo(fromBase58String(assetId)) {
161161 case asset: Asset =>
162162 asset.decimals
163163 case _ =>
164164 throw("Can't find asset")
165165 }
166166
167167
168168 func getAssetPrecision (assetId) = pow(10, 0, getAssetDecimals(assetId), 0, 0, DOWN)
169169
170170
171171 func getAdoptedAPRByPeriod (period,aprPeriods,apr) = {
172172 func for (a,aperiod) = {
173173 let $t052105232 = a
174174 let index = $t052105232._1
175175 let found = $t052105232._2
176176 let ft = split(aperiod, "-")
177177 let $t052695332 = $Tuple2(parseIntValue(ft[0]), parseIntValue(ft[1]))
178178 let from = $t052695332._1
179179 let to = $t052695332._2
180180 if (found)
181181 then a
182182 else if (if ((period >= from))
183183 then (to >= period)
184184 else false)
185185 then $Tuple2(index, true)
186186 else $Tuple2((index + 1), false)
187187 }
188188
189189 let $t054695535 = {
190190 let $l = LENDERS_APR_PERIODS
191191 let $s = size($l)
192192 let $acc0 = $Tuple2(0, false)
193193 func $f0_1 ($a,$i) = if (($i >= $s))
194194 then $a
195195 else for($a, $l[$i])
196196
197197 func $f0_2 ($a,$i) = if (($i >= $s))
198198 then $a
199199 else throw("List size exceeds 9")
200200
201201 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9)
202202 }
203203 let index = $t054695535._1
204204 let found = $t054695535._2
205205 if (found)
206206 then fraction((LENDERS_APR[index] * SCALE8), 7, 365)
207207 else 0
208208 }
209209
210210
211211 func getTotalSupplyAllTokens () = {
212212 func for (a,tokenId) = {
213213 let $t057345803 = a
214214 let totalSupply = $t057345803._1
215215 let totalSupplyUsd = $t057345803._2
216216 let totalSupplyUsdAll = $t057345803._3
217217 let utilization = $t057345803._4
218218 let tSupply = valueOrElse(getInteger(lendContract, (kLendTokenSupply + tokenId)), 0)
219219 let tBorrow = valueOrElse(getInteger(lendContract, (kLendTokenBorrowed + tokenId)), 0)
220220 let assetPrice = getAssetPrice(tokenId)
221221 let assetPrecision = getAssetPrecision(tokenId)
222222 let tSupplyUsd = fraction(tSupply, assetPrice, assetPrecision)
223223 let u = if (if ((tSupply == 0))
224224 then true
225225 else (tBorrow == 0))
226226 then 0
227227 else fraction(tBorrow, SCALE8, tSupply)
228228 $Tuple4((totalSupply :+ tSupply), (totalSupplyUsd :+ tSupplyUsd), (totalSupplyUsdAll + tSupplyUsd), (utilization :+ u))
229229 }
230230
231231 let $l = getAllTokens()
232232 let $s = size($l)
233233 let $acc0 = $Tuple4(nil, nil, 0, nil)
234234 func $f0_1 ($a,$i) = if (($i >= $s))
235235 then $a
236236 else for($a, $l[$i])
237237
238238 func $f0_2 ($a,$i) = if (($i >= $s))
239239 then $a
240240 else throw("List size exceeds 30")
241241
242242 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30)
243243 }
244244
245245
246246 func getTotalSupplyUsd (tokenId) = {
247247 let tSupply = valueOrElse(getInteger(lendContract, (kLendTokenSupply + tokenId)), 0)
248248 let assetPrice = getAssetPrice(tokenId)
249249 let assetPrecision = getAssetPrecision(tokenId)
250250 fraction(tSupply, assetPrice, assetPrecision)
251251 }
252252
253253
254254 func calcNewTokenInterest (tokenId,totalSupply) = if ((startHeight >= height))
255255 then 0
256256 else {
257257 let rewardPerBlock = getIntegerValue(this, (tokenId + kTokenRewardPerBlock))
258258 let oldInterest = getIntegerValue(this, (tokenId + kTokenInterest))
259259 let updateHeight = getIntegerValue(this, (tokenId + kTokenInterestHeight))
260260 let reward = ((height - updateHeight) * rewardPerBlock)
261261 let interest = if ((totalSupply > 0))
262262 then fraction(reward, SCALE8, totalSupply)
263263 else 0
264264 (oldInterest + interest)
265265 }
266266
267267
268268 func calcNewLpInterest (totalSupply) = if ((startHeight >= height))
269269 then 0
270270 else {
271271 let rewardPerBlock = valueOrElse(getInteger(this, kLpRewardPerBlock), 0)
272272 let oldInterest = valueOrElse(getInteger(this, kLpInterest), 0)
273273 let updateHeight = valueOrElse(getInteger(this, kLpInterestHeight), height)
274274 let reward = ((height - updateHeight) * rewardPerBlock)
275275 let interest = if ((totalSupply > 0))
276276 then fraction(reward, SCALE8, totalSupply)
277277 else 0
278278 (oldInterest + interest)
279279 }
280280
281281
282282 func calcLendUserReward (user,tokenId) = {
283283 let totalSupply = valueOrElse(getInteger(lendContract, (kLendTokenSupply + tokenId)), 0)
284284 let tokenInterest = calcNewTokenInterest(tokenId, totalSupply)
285285 let userSupply = valueOrElse(getInteger(lendContract, ((user + kLendUserSupply) + tokenId)), 0)
286286 let userTokenInterest = valueOrElse(getInteger(this, (((tokenId + "_") + user) + kUserLendInterest)), if ((userSupply == 0))
287287 then tokenInterest
288288 else 0)
289289 let reward = fraction(userSupply, (tokenInterest - userTokenInterest), SCALE8)
290290 $Tuple3(reward, tokenInterest, userSupply)
291291 }
292292
293293
294294 func calcLpUserReward (user) = {
295295 let totalSupply = valueOrElse(getInteger(sfFarmingContract, (axlyPool + kSFTotalSupply)), 0)
296296 let tokenInterest = calcNewLpInterest(totalSupply)
297297 let userSupply = valueOrElse(getInteger(sfFarmingContract, (((axlyPool + "_") + user) + kSFUserTotalSupply)), 0)
298298 let userTokenInterest = valueOrElse(getInteger(this, (user + kUserLpInterest)), if ((userSupply == 0))
299299 then tokenInterest
300300 else 0)
301301 let reward = fraction(userSupply, (tokenInterest - userTokenInterest), SCALE8)
302302 $Tuple3(reward, tokenInterest, userSupply)
303303 }
304304
305305
306306 func claimLenderRewardsCommon (user,readOnly) = {
307307 func claim (a,tokenId) = {
308308 let $t088978941 = a
309309 let tokenIds = $t088978941._1
310310 let cAmount = $t088978941._2
311311 let total = $t088978941._3
312312 let enteries = $t088978941._4
313313 let userAvailableClaim = valueOrElse(getInteger(this, (((tokenId + "_") + user) + kUserLendAvailableClaim)), 0)
314314 let $t090549133 = calcLendUserReward(user, tokenId)
315315 let uReward = $t090549133._1
316316 let newTokenInterest = $t090549133._2
317317 let userSupply = $t090549133._3
318318 let totalToClaim = (userAvailableClaim + uReward)
319319 if (if ((totalToClaim > 0))
320320 then true
321321 else (userSupply > 0))
322322 then {
323323 let newEntreries = if (if (readOnly)
324324 then true
325325 else (totalToClaim == 0))
326326 then enteries
327327 else (enteries ++ [IntegerEntry((((tokenId + "_") + user) + kUserLendInterest), newTokenInterest), IntegerEntry((((tokenId + "_") + user) + kUserLendAvailableClaim), 0), IntegerEntry((tokenId + kTokenInterest), newTokenInterest), IntegerEntry((tokenId + kTokenInterestHeight), height)])
328328 $Tuple4((tokenIds :+ tokenId), (cAmount :+ totalToClaim), (total + totalToClaim), newEntreries)
329329 }
330330 else $Tuple4(tokenIds, cAmount, total, enteries)
331331 }
332332
333333 let $l = getAllTokens()
334334 let $s = size($l)
335335 let $acc0 = $Tuple4(nil, nil, 0, nil)
336336 func $f0_1 ($a,$i) = if (($i >= $s))
337337 then $a
338338 else claim($a, $l[$i])
339339
340340 func $f0_2 ($a,$i) = if (($i >= $s))
341341 then $a
342342 else throw("List size exceeds 30")
343343
344344 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30)
345345 }
346346
347347
348348 func claimLpRewardsCommon (user,readOnly) = {
349349 let userAvailableClaim = valueOrElse(getInteger(this, (user + kUserLpAvailableClaim)), 0)
350350 let $t01006410129 = calcLpUserReward(user)
351351 let uReward = $t01006410129._1
352352 let newLpInterest = $t01006410129._2
353353 let userSupply = $t01006410129._3
354354 let totalToClaim = (userAvailableClaim + uReward)
355355 if (if (readOnly)
356356 then true
357357 else (totalToClaim == 0))
358358 then $Tuple2(totalToClaim, nil)
359359 else $Tuple2(totalToClaim, [IntegerEntry((user + kUserLpInterest), newLpInterest), IntegerEntry((user + kUserLpAvailableClaim), 0), IntegerEntry(kLpInterest, newLpInterest), IntegerEntry(kLpInterestHeight, height)])
360360 }
361361
362362
363363 func getAxlyPriceOnSwopfi () = {
364364 let aBalance = getIntegerValue(addressFromStringValue(axlyPool), "A_asset_balance")
365365 let bBalance = getIntegerValue(addressFromStringValue(axlyPool), "B_asset_balance")
366366 let wPrice = getAssetPrice("WAVES")
367367 fraction(bBalance, wPrice, aBalance)
368368 }
369369
370370
371371 func getAxlySharePrice () = {
372372 let poolAddr = addressFromStringValue(axlyPool)
373373 let aBalance = getIntegerValue(addressFromStringValue(axlyPool), "A_asset_balance")
374374 let bBalance = getIntegerValue(addressFromStringValue(axlyPool), "B_asset_balance")
375375 let dPriceA = getAxlyPriceOnSwopfi()
376376 let dPriceB = getAssetPrice("WAVES")
377377 if (if ((0 > dPriceA))
378378 then true
379379 else (0 > dPriceB))
380380 then -1
381381 else {
382382 let shareSupply = valueOrErrorMessage(getIntegerValue(poolAddr, "share_asset_supply"), "Can't get share asset supply")
383383 let APrecision = pow(10, 0, 8, 0, 0, DOWN)
384384 let BPrecision = pow(10, 0, 8, 0, 0, DOWN)
385385 let sharePrecision = pow(10, 0, 8, 0, 0, DOWN)
386386 let sum = (fraction(aBalance, dPriceA, APrecision) + fraction(bBalance, dPriceB, BPrecision))
387387 fraction(sum, sharePrecision, shareSupply)
388388 }
389389 }
390390
391391
392392 func getTokensAPRs () = {
393393 let axlyPrice = getAxlyPriceOnSwopfi()
394394 let axlyPrecision = getAssetPrecision(axlyId)
395395 func tokensAprs (apr,tokenId) = {
396396 let rwpb = valueOrElse(getInteger(this, (tokenId + kTokenRewardPerBlock)), 0)
397397 let rwpbUsd = fraction(rwpb, axlyPrice, axlyPrecision)
398398 let rwYear = ((rwpbUsd * periodLength) * 52)
399399 let totalSupplyUsd = getTotalSupplyUsd(tokenId)
400400 (apr :+ fraction(rwYear, SCALE8, totalSupplyUsd))
401401 }
402402
403403 let aprs = {
404404 let $l = getAllTokens()
405405 let $s = size($l)
406406 let $acc0 = nil
407407 func $f0_1 ($a,$i) = if (($i >= $s))
408408 then $a
409409 else tokensAprs($a, $l[$i])
410410
411411 func $f0_2 ($a,$i) = if (($i >= $s))
412412 then $a
413413 else throw("List size exceeds 30")
414414
415415 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30)
416416 }
417417 let lpTotalSupply = getIntegerValue(sfFarmingContract, (axlyPool + kSFTotalSupply))
418418 let lpId = getStringValue(addressFromStringValue(axlyPool), kLpId)
419419 let lpPrecision = getAssetPrecision(lpId)
420420 let lpPrice = getAxlySharePrice()
421421 let lpTotalSupplyUsd = fraction(lpTotalSupply, lpPrice, lpPrecision)
422422 let rwpb = valueOrElse(getInteger(this, kLpRewardPerBlock), 0)
423423 let rwpbUsd = fraction(rwpb, axlyPrice, axlyPrecision)
424424 let rwYear = ((rwpbUsd * periodLength) * 52)
425425 let lpApr = fraction(rwYear, SCALE8, lpTotalSupplyUsd)
426426 $Tuple3(getAllTokens(), aprs, lpApr)
427427 }
428428
429429
430430 func getTokenUtilization (assetId) = 0
431431
432432
433433 @Callable(i)
434434 func claimLenderRewards () = {
435435 let claimRes = claimLenderRewardsCommon(toString(i.caller), false)
436436 if ((claimRes._3 == 0))
437437 then throw("claim amount must be greater than 0")
438438 else {
439439 let inv = invoke(tokenContract, "withdrawLendReward", [claimRes._3, toString(i.caller)], nil)
440440 if ((inv == inv))
441441 then claimRes._4
442442 else throw("Strict value is not equal to itself.")
443443 }
444444 }
445445
446446
447447
448448 @Callable(i)
449449 func claimLpRewards () = {
450450 let claimRes = claimLpRewardsCommon(toString(i.caller), false)
451451 if ((claimRes._1 == 0))
452452 then throw("claim amount must be greater than 0")
453453 else {
454454 let inv = invoke(tokenContract, "withdrawLpReward", [claimRes._1, toString(i.caller)], nil)
455455 if ((inv == inv))
456456 then claimRes._2
457457 else throw("Strict value is not equal to itself.")
458458 }
459459 }
460460
461461
462462
463463 @Callable(i)
464464 func lendAction (user,tokenId) = valueOrElse(isLandCall(i), {
465465 let userAvailableClaim = valueOrElse(getInteger(this, (((tokenId + "_") + user) + kUserLendAvailableClaim)), 0)
466466 let $t01367913746 = calcLendUserReward(user, tokenId)
467467 let uReward = $t01367913746._1
468468 let newTokenInterest = $t01367913746._2
469469 [IntegerEntry((((tokenId + "_") + user) + kUserLendInterest), newTokenInterest), IntegerEntry((((tokenId + "_") + user) + kUserLendAvailableClaim), (userAvailableClaim + uReward)), IntegerEntry((tokenId + kTokenInterest), newTokenInterest), IntegerEntry((tokenId + kTokenInterestHeight), height)]
470470 })
471471
472472
473473
474474 @Callable(i)
475475 func lpAction (user) = valueOrElse(isSFFarmingCall(i), {
476476 let userAvailableClaim = valueOrElse(getInteger(this, (user + kUserLpAvailableClaim)), 0)
477477 let $t01421814271 = calcLpUserReward(user)
478478 let uReward = $t01421814271._1
479479 let newLpInterest = $t01421814271._2
480480 [IntegerEntry((user + kUserLpInterest), newLpInterest), IntegerEntry((user + kUserLpAvailableClaim), (userAvailableClaim + uReward)), IntegerEntry(kLpInterest, newLpInterest), IntegerEntry(kLpInterestHeight, height)]
481481 })
482482
483483
484484
485485 @Callable(i)
486486 func init (axlyPoolAddr,farmingStartHeight,periodLength) = valueOrElse(isSelfCall(i), [StringEntry(kAxlyPool, axlyPoolAddr), IntegerEntry(kStartHeight, farmingStartHeight), IntegerEntry(kPeriodLength, periodLength)])
487487
488488
489489
490490 @Callable(i)
491491 func initNewToken (tokenId) = valueOrElse(isAdminCall(i), if (isDefined(getInteger(this, (tokenId + kTokenInterest))))
492492 then throw("token already inited")
493493 else if (!(contains(getStringValue(lendContract, kLendSetupTokens), tokenId)))
494494 then throw("no token on landing")
495495 else {
496496 let newAllTokens = (getAllTokens() :+ tokenId)
497497 [IntegerEntry((tokenId + kTokenInterest), 0), IntegerEntry((tokenId + kTokenInterestHeight), max([startHeight, height])), StringEntry(kTokens, makeString(newAllTokens, ",")), IntegerEntry((tokenId + kTokenRewardPerBlock), 0)]
498498 })
499499
500500
501501
502502 @Callable(i)
503503 func updateRewards () = valueOrElse(isOperatorCall(i), {
504504 let lastUpdatePeriod = valueOrElse(getInteger(this, kLastUpdatePeriod), 0)
505505 let calcPeriod = (((height - startHeight) / periodLength) + 1)
506506 let curPeriod = if ((0 >= calcPeriod))
507507 then 1
508508 else calcPeriod
509509 if ((curPeriod > 104))
510510 then throw("max period is 104")
511511 else if (if ((lastUpdatePeriod >= curPeriod))
512512 then (lastUpdatePeriod != 0)
513513 else false)
514514 then throw("rewards alredy updated in this period")
515515 else {
516- let $t01580915889 = getTotalSupplyAllTokens()
517- let totalSupply = $t01580915889._1
518- let totalSupplyUsd = $t01580915889._2
519- let totalSupplyUsdAll = $t01580915889._3
516+ let $t01580915902 = getTotalSupplyAllTokens()
517+ let totalSupply = $t01580915902._1
518+ let totalSupplyUsd = $t01580915902._2
519+ let totalSupplyUsdAll = $t01580915902._3
520+ let utilization = $t01580915902._4
521+ func getNewWights (a,tokenId) = {
522+ let $t01597216009 = a
523+ let weights = $t01597216009._1
524+ let totalWeight = $t01597216009._2
525+ let index = $t01597216009._3
526+ let share = fraction(totalSupplyUsd[index], SCALE8, totalSupplyUsdAll)
527+ let newWeight = fraction(share, utilization[index], SCALE8)
528+ $Tuple3((weights :+ newWeight), (totalWeight + newWeight), (index + 1))
529+ }
530+
531+ let $t01621516300 = {
532+ let $l = getAllTokens()
533+ let $s = size($l)
534+ let $acc0 = $Tuple3(nil, 0, 0)
535+ func $f0_1 ($a,$i) = if (($i >= $s))
536+ then $a
537+ else getNewWights($a, $l[$i])
538+
539+ func $f0_2 ($a,$i) = if (($i >= $s))
540+ then $a
541+ else throw("List size exceeds 30")
542+
543+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30)
544+ }
545+ let newWeights = $t01621516300._1
546+ let totalNewWeight = $t01621516300._2
520547 let axlyPrice = getAxlyPriceOnSwopfi()
521548 let axlyPrecision = getAssetPrecision(axlyId)
522549 let maxAPR = getAdoptedAPRByPeriod(curPeriod, LENDERS_APR_PERIODS, LENDERS_APR)
523550 func updateReward (a,tokenId) = {
524- let $t01613916183 = a
525- let enteries = $t01613916183._1
526- let totalPeriodReward = $t01613916183._2
527- let index = $t01613916183._3
551+ let $t01655016594 = a
552+ let enteries = $t01655016594._1
553+ let totalPeriodReward = $t01655016594._2
554+ let index = $t01655016594._3
528555 if ((totalSupply[index] == 0))
529556 then $Tuple3((enteries ++ [IntegerEntry((tokenId + kPrevLendTokenSupply), totalSupply[index]), IntegerEntry((tokenId + kTokenRewardPerBlock), 0), IntegerEntry((tokenId + kTokenInterest), calcNewTokenInterest(tokenId, totalSupply[index])), IntegerEntry((tokenId + kTokenInterestHeight), max([startHeight, height]))]), totalPeriodReward, (index + 1))
530557 else {
531- let share = fraction(totalSupplyUsd[index], SCALE8, totalSupplyUsdAll)
558+ let share = fraction(newWeights[index], SCALE8, totalNewWeight)
532559 let maxReward = fraction(share, lendMaxPeriodAmount, SCALE8)
533560 let maxRewardUsd = fraction(maxReward, axlyPrice, axlyPrecision)
534561 let prevTotalSupply = valueOrElse(getInteger(this, (tokenId + kPrevLendTokenSupply)), 0)
535562 let rtCoef = if (if ((prevTotalSupply == 0))
536563 then true
537564 else (totalSupply[index] == 0))
538565 then 0
539566 else (fraction(totalSupply[index], SCALE8, prevTotalSupply) - SCALE8)
540567 let reward = ((min([(maxAPR * (SCALE8 + max([rtCoef, 0]))), fraction(maxAPR, (15 * SCALE8), 10)]) / SCALE8) / 100)
541568 let rewardUsd = min([maxRewardUsd, fraction(totalSupplyUsd[index], reward, SCALE8)])
542569 let rewardPeriod = fraction(rewardUsd, axlyPrecision, axlyPrice)
543570 let rewardPerBlock = (rewardPeriod / periodLength)
544571 $Tuple3((enteries ++ [IntegerEntry((tokenId + kPrevLendTokenSupply), totalSupply[index]), IntegerEntry((tokenId + kTokenRewardPerBlock), rewardPerBlock), IntegerEntry((tokenId + kTokenInterest), calcNewTokenInterest(tokenId, totalSupply[index])), IntegerEntry((tokenId + kTokenInterestHeight), max([startHeight, height]))]), (totalPeriodReward + rewardPeriod), (index + 1))
545572 }
546573 }
547574
548- let $t01787517967 = {
575+ let $t01827918371 = {
549576 let $l = getAllTokens()
550577 let $s = size($l)
551578 let $acc0 = $Tuple3(nil, 0, 0)
552- func $f0_1 ($a,$i) = if (($i >= $s))
579+ func $f1_1 ($a,$i) = if (($i >= $s))
553580 then $a
554581 else updateReward($a, $l[$i])
555582
556- func $f0_2 ($a,$i) = if (($i >= $s))
583+ func $f1_2 ($a,$i) = if (($i >= $s))
557584 then $a
558585 else throw("List size exceeds 30")
559586
560- $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30)
587+ $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30)
561588 }
562- let tokensEnteries = $t01787517967._1
563- let totalTokenReward = $t01787517967._2
589+ let tokensEnteries = $t01827918371._1
590+ let totalTokenReward = $t01827918371._2
564591 let burnLend = (lendMaxPeriodAmount - totalTokenReward)
565592 let inv = invoke(tokenContract, "withdrawLendReward", [burnLend, toString(this)], nil)
566593 if ((inv == inv))
567594 then (([IntegerEntry(kLpRewardPerBlock, 0), ScriptTransfer(axlyBurnAddr, burnLend, fromBase58String(axlyId))] ++ tokensEnteries) :+ IntegerEntry(kLastUpdatePeriod, curPeriod))
568595 else throw("Strict value is not equal to itself.")
569596 }
570- })
571-
572-
573-
574-@Callable(i)
575-func updateRewardsOld () = valueOrElse(isOperatorCall(i), {
576- let lastUpdatePeriod = valueOrElse(getInteger(this, kLastUpdatePeriod), 0)
577- let calcPeriod = (((height - startHeight) / periodLength) + 1)
578- let curPeriod = if ((0 >= calcPeriod))
579- then 1
580- else calcPeriod
581- if ((curPeriod > 104))
582- then throw("max period is 104")
583- else {
584- let $t01862818708 = getTotalSupplyAllTokens()
585- let totalSupply = $t01862818708._1
586- let totalSupplyUsd = $t01862818708._2
587- let totalSupplyUsdAll = $t01862818708._3
588- let axlyPrice = getAxlyPriceOnSwopfi()
589- let axlyPrecision = getAssetPrecision(axlyId)
590- let maxAPR = getAdoptedAPRByPeriod(curPeriod, LENDERS_APR_PERIODS, LENDERS_APR)
591- func updateReward (a,tokenId) = {
592- let $t01898019041 = a
593- let enteries = $t01898019041._1
594- let totalPeriodReward = $t01898019041._2
595- let index = $t01898019041._3
596- let shares = $t01898019041._4
597- let rewards = $t01898019041._5
598- if ((totalSupply[index] == 0))
599- then $Tuple3((enteries ++ [IntegerEntry((tokenId + kPrevLendTokenSupply), totalSupply[index]), IntegerEntry((tokenId + kTokenRewardPerBlock), 0), IntegerEntry((tokenId + kTokenInterest), calcNewTokenInterest(tokenId, totalSupply[index])), IntegerEntry((tokenId + kTokenInterestHeight), max([startHeight, height]))]), totalPeriodReward, (index + 1))
600- else {
601- let share = fraction(totalSupplyUsd[index], SCALE8, totalSupplyUsdAll)
602- let maxReward = fraction(share, lendMaxPeriodAmount, SCALE8)
603- let maxRewardUsd = fraction(maxReward, axlyPrice, axlyPrecision)
604- let prevTotalSupply = valueOrElse(getInteger(this, (tokenId + kPrevLendTokenSupply)), 0)
605- let rtCoef = if (if ((prevTotalSupply == 0))
606- then true
607- else (totalSupply[index] == 0))
608- then 0
609- else (fraction(totalSupply[index], SCALE8, prevTotalSupply) - SCALE8)
610- let reward = ((min([(maxAPR * (SCALE8 + max([rtCoef, 0]))), fraction(maxAPR, (15 * SCALE8), 10)]) / SCALE8) / 100)
611- let rewardUsd = min([maxRewardUsd, fraction(totalSupplyUsd[index], reward, SCALE8)])
612- let rewardPeriod = fraction(rewardUsd, axlyPrecision, axlyPrice)
613- let rewardPerBlock = (rewardPeriod / periodLength)
614- $Tuple5((enteries ++ [IntegerEntry((tokenId + kPrevLendTokenSupply), totalSupply[index]), IntegerEntry((tokenId + kTokenRewardPerBlock), rewardPerBlock), IntegerEntry((tokenId + kTokenInterest), calcNewTokenInterest(tokenId, totalSupply[index])), IntegerEntry((tokenId + kTokenInterestHeight), max([startHeight, height]))]), (totalPeriodReward + rewardPeriod), (index + 1), (shares :+ share), (rewards :+ rewardPerBlock))
615- }
616- }
617-
618- let $t02079320917 = {
619- let $l = getAllTokens()
620- let $s = size($l)
621- let $acc0 = $Tuple5(nil, 0, 0, nil, nil)
622- func $f0_1 ($a,$i) = if (($i >= $s))
623- then $a
624- else updateReward($a, $l[$i])
625-
626- func $f0_2 ($a,$i) = if (($i >= $s))
627- then $a
628- else throw("List size exceeds 30")
629-
630- $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30)
631- }
632- let tokensEnteries = $t02079320917._1
633- let totalTokenReward = $t02079320917._2
634- let index = $t02079320917._3
635- let shares = $t02079320917._4
636- let rewards = $t02079320917._5
637- let burnLend = (lendMaxPeriodAmount - totalTokenReward)
638- $Tuple2(nil, $Tuple3(shares, rewards, burnLend))
639- }
640- })
641-
642-
643-
644-@Callable(i)
645-func updateRewardsNew () = valueOrElse(isOperatorCall(i), {
646- let lastUpdatePeriod = valueOrElse(getInteger(this, kLastUpdatePeriod), 0)
647- let calcPeriod = (((height - startHeight) / periodLength) + 1)
648- let curPeriod = if ((0 >= calcPeriod))
649- then 1
650- else calcPeriod
651- if ((curPeriod > 104))
652- then throw("max period is 104")
653- else {
654- let $t02134021433 = getTotalSupplyAllTokens()
655- let totalSupply = $t02134021433._1
656- let totalSupplyUsd = $t02134021433._2
657- let totalSupplyUsdAll = $t02134021433._3
658- let utilization = $t02134021433._4
659- func getNewWights (a,tokenId) = {
660- let $t02150321540 = a
661- let weights = $t02150321540._1
662- let totalWeight = $t02150321540._2
663- let index = $t02150321540._3
664- let share = fraction(totalSupplyUsd[index], SCALE8, totalSupplyUsdAll)
665- let newWeight = fraction(share, utilization[index], SCALE8)
666- $Tuple3((weights :+ newWeight), (totalWeight + newWeight), (index + 1))
667- }
668-
669- let $t02174621831 = {
670- let $l = getAllTokens()
671- let $s = size($l)
672- let $acc0 = $Tuple3(nil, 0, 0)
673- func $f0_1 ($a,$i) = if (($i >= $s))
674- then $a
675- else getNewWights($a, $l[$i])
676-
677- func $f0_2 ($a,$i) = if (($i >= $s))
678- then $a
679- else throw("List size exceeds 30")
680-
681- $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30)
682- }
683- let newWeights = $t02174621831._1
684- let totalNewWeight = $t02174621831._2
685- let axlyPrice = getAxlyPriceOnSwopfi()
686- let axlyPrecision = getAssetPrecision(axlyId)
687- let maxAPR = getAdoptedAPRByPeriod(curPeriod, LENDERS_APR_PERIODS, LENDERS_APR)
688- func updateReward (a,tokenId) = {
689- let $t02210322164 = a
690- let enteries = $t02210322164._1
691- let totalPeriodReward = $t02210322164._2
692- let index = $t02210322164._3
693- let shares = $t02210322164._4
694- let rewards = $t02210322164._5
695- if ((totalSupply[index] == 0))
696- then $Tuple3((enteries ++ [IntegerEntry((tokenId + kPrevLendTokenSupply), totalSupply[index]), IntegerEntry((tokenId + kTokenRewardPerBlock), 0), IntegerEntry((tokenId + kTokenInterest), calcNewTokenInterest(tokenId, totalSupply[index])), IntegerEntry((tokenId + kTokenInterestHeight), max([startHeight, height]))]), totalPeriodReward, (index + 1))
697- else {
698- let share = fraction(newWeights[index], SCALE8, totalNewWeight)
699- let maxReward = fraction(share, lendMaxPeriodAmount, SCALE8)
700- let maxRewardUsd = fraction(maxReward, axlyPrice, axlyPrecision)
701- let prevTotalSupply = valueOrElse(getInteger(this, (tokenId + kPrevLendTokenSupply)), 0)
702- let rtCoef = if (if ((prevTotalSupply == 0))
703- then true
704- else (totalSupply[index] == 0))
705- then 0
706- else (fraction(totalSupply[index], SCALE8, prevTotalSupply) - SCALE8)
707- let reward = ((min([(maxAPR * (SCALE8 + max([rtCoef, 0]))), fraction(maxAPR, (15 * SCALE8), 10)]) / SCALE8) / 100)
708- let rewardUsd = min([maxRewardUsd, fraction(totalSupplyUsd[index], reward, SCALE8)])
709- let rewardPeriod = fraction(rewardUsd, axlyPrecision, axlyPrice)
710- let rewardPerBlock = (rewardPeriod / periodLength)
711- $Tuple5((enteries ++ [IntegerEntry((tokenId + kPrevLendTokenSupply), totalSupply[index]), IntegerEntry((tokenId + kTokenRewardPerBlock), rewardPerBlock), IntegerEntry((tokenId + kTokenInterest), calcNewTokenInterest(tokenId, totalSupply[index])), IntegerEntry((tokenId + kTokenInterestHeight), max([startHeight, height]))]), (totalPeriodReward + rewardPeriod), (index + 1), (shares :+ share), (rewards :+ rewardPerBlock))
712- }
713- }
714-
715- let $t02390924033 = {
716- let $l = getAllTokens()
717- let $s = size($l)
718- let $acc0 = $Tuple5(nil, 0, 0, nil, nil)
719- func $f1_1 ($a,$i) = if (($i >= $s))
720- then $a
721- else updateReward($a, $l[$i])
722-
723- func $f1_2 ($a,$i) = if (($i >= $s))
724- then $a
725- else throw("List size exceeds 30")
726-
727- $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30)
728- }
729- let tokensEnteries = $t02390924033._1
730- let totalTokenReward = $t02390924033._2
731- let index = $t02390924033._3
732- let shares = $t02390924033._4
733- let rewards = $t02390924033._5
734- let burnLend = (lendMaxPeriodAmount - totalTokenReward)
735- $Tuple2(nil, $Tuple5(shares, rewards, newWeights, totalNewWeight, burnLend))
736- }
737597 })
738598
739599
740600 @Verifier(tx)
741601 func verify () = {
742602 let multiSignedByAdmins = {
743603 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], admin1PK))
744604 then 1
745605 else 0
746606 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], admin2PK))
747607 then 1
748608 else 0
749609 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], admin3PK))
750610 then 1
751611 else 0
752612 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
753613 }
754614 match tx {
755615 case inv: InvokeScriptTransaction =>
756616 let isSelf = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
757617 let isRightFee = if ((inv.fee == 900000))
758618 then (inv.feeAssetId == unit)
759619 else false
760620 let isInitCall = (inv.function == "init")
761621 let isnoPayments = (size(inv.payments) == 0)
762622 if (if (if (if (isRightFee)
763623 then isInitCall
764624 else false)
765625 then isSelf
766626 else false)
767627 then isnoPayments
768628 else false)
769629 then true
770630 else multiSignedByAdmins
771631 case _ =>
772632 multiSignedByAdmins
773633 }
774634 }
775635

github/deemru/w8io/3ef1775 
90.74 ms