tx · BgFNEc24UcXCnbMoLgktt7rPSLpfddhrm7xWc42CNCgF

3P37f8Y3rNpKzSkHNVZMAStXdpmNBgftHN9:  -0.02400000 Waves

2024.01.30 10:00 [4019691] smart account 3P37f8Y3rNpKzSkHNVZMAStXdpmNBgftHN9 > SELF 0.00000000 Waves

{ "type": 13, "id": "BgFNEc24UcXCnbMoLgktt7rPSLpfddhrm7xWc42CNCgF", "fee": 2400000, "feeAssetId": null, "timestamp": 1706598014818, "version": 2, "chainId": 87, "sender": "3P37f8Y3rNpKzSkHNVZMAStXdpmNBgftHN9", "senderPublicKey": "9WT32oFSZterQbwJTDArqGxecguq4u3AVfYJfdLYZLy8", "proofs": [ "", "5wKARNhewufEMVuAC8E884hYUHQfgXJqWb5ZMZiFtC4RfimtzRDsCsFW2aTsihnbx6bWQ2pTNzeb2jhC2Edc4Urw", "2chqh6PcFg2PazjQMSzMUgzhvNzaX8h2U3A7ZWhPrdXxYGD7F5kr3GPuvz5NUXT4PiJKLCJn2YR4DkyXjq9U9cEz" ], "script": "base64:BgIfCAISABIAEgQKAggIEgMKAQgSBQoDCAEBEgMKAQgSAFIABENPTkYJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMCBmNvbmZpZwAGU0NBTEU4AIDC1y8AC0xFTkRFUlNfQVBSCQDMCAIAlgEJAMwIAgB4CQDMCAIAZAkAzAgCAFAJAMwIAgA8CQDMCAIAKAkAzAgCAB4JAMwIAgAUCQDMCAIACgUDbmlsABNMRU5ERVJTX0FQUl9QRVJJT0RTCQDMCAICAzEtMQkAzAgCAgMyLTIJAMwIAgIDMy0zCQDMCAICAzQtNAkAzAgCAgM1LTgJAMwIAgIEOS0xMgkAzAgCAgUxMy0xNgkAzAgCAgUxNy0yMAkAzAgCAgYyMS0xMDQFA25pbAATTEVOREVSU19NQVhfUEVSSU9EUwBoAAZMUF9BUFIJAMwIAgCWAQkAzAgCAHgJAMwIAgBkCQDMCAIAUAkAzAgCADwJAMwIAgAoBQNuaWwADkxQX0FQUl9QRVJJT0RTCQDMCAICAzEtMQkAzAgCAgMyLTIJAMwIAgIDMy0zCQDMCAICAzQtNAkAzAgCAgM1LTgJAMwIAgIEOS0xMgUDbmlsAA5MUF9NQVhfUEVSSU9EUwAMAAxrU3RhcnRIZWlnaHQCC3N0YXJ0SGVpZ2h0AA1rUGVyaW9kTGVuZ3RoAgxwZXJpb2RMZW5ndGgAEWtMZW5kZXJzTWF4QW1vdW50AhFsZW5kUmV3YXJkc0Ftb3VudAAMa0xQTWF4QW1vdW50Ag5scFJld2FyZEFtb3VudAAHa1Rva2VucwIGdG9rZW5zAAtrVXNlclN1cHBseQIQX3VzZXJUb3RhbFN1cHBseQAOa1Rva2VuSW50ZXJlc3QCDl90b2tlbkludGVyZXN0ABRrVG9rZW5JbnRlcmVzdEhlaWdodAIUX3Rva2VuSW50ZXJlc3RIZWlnaHQAFGtUb2tlblJld2FyZFBlckJsb2NrAhRfdG9rZW5SZXdhcmRQZXJCbG9jawARa0xhc3RVcGRhdGVQZXJpb2QCEnJld2FyZFVwZGF0ZVBlcmlvZAARa1VzZXJMZW5kSW50ZXJlc3QCEV91c2VyTGFuZEludGVyZXN0ABdrVXNlckxlbmRBdmFpbGFibGVDbGFpbQIXX3VzZXJMZW5kQXZhaWxhYmxlQ2xhaW0AFWtVc2VyTHBBdmFpbGFibGVDbGFpbQIVX3VzZXJMcEF2YWlsYWJsZUNsYWltAAtrTHBJbnRlcmVzdAIKbHBJbnRlcmVzdAARa0xwSW50ZXJlc3RIZWlnaHQCEGxwSW50ZXJlc3RIZWlnaHQADWtQcmV2TFBTdXBwbHkCEXByZXZMUFRvdGFsU3VwcGx5ABFrTHBSZXdhcmRQZXJCbG9jawIQbHBSZXdhcmRQZXJCbG9jawAPa1VzZXJMcEludGVyZXN0Ag9fdXNlckxwSW50ZXJlc3QADmtQcmljZUluT3JhY2xlAgdfdHdhcDVCABRrUHJldkxlbmRUb2tlblN1cHBseQIUX3ByZXZMZW5kVG90YWxTdXBwbHkADGtBWExZVG9rZW5JZAILYXhseVRva2VuSWQAEGtMZW5kVG9rZW5TdXBwbHkCD3RvdGFsX3N1cHBsaWVkXwASa0xlbmRUb2tlbkJvcnJvd2VkAg90b3RhbF9ib3Jyb3dlZF8AD2tMZW5kVXNlclN1cHBseQIKX3N1cHBsaWVkXwAQa0xlbmRTZXR1cFRva2VucwIMc2V0dXBfdG9rZW5zAA5rU0ZUb3RhbFN1cHBseQIaX3RvdGFsX3NoYXJlX3Rva2Vuc19sb2NrZWQAEmtTRlVzZXJUb3RhbFN1cHBseQIUX3NoYXJlX3Rva2Vuc19sb2NrZWQACWtBeGx5UG9vbAIIYXhseVBvb2wABWtMcElkAg5zaGFyZV9hc3NldF9pZAAJa0FkbWluMVBLAhVncm91cDFfYWRtaW4xX3B1Yl9rZXkACWtBZG1pbjJQSwIVZ3JvdXAxX2FkbWluMl9wdWJfa2V5AAlrQWRtaW4zUEsCFWdyb3VwMV9hZG1pbjNfcHViX2tleQAPa09wZXJhdG9yQ2FsbFBLAhJhZG1pbl9jYWxsX3B1Yl9rZXkACGF4bHlQb29sCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUJa0F4bHlQb29sAhZDYW4ndCBnZXQgYXhseVBvb2wga2V5AAxtYWluQ29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBENPTkYCDW1haW5fY29udHJhY3QADXRva2VuQ29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBENPTkYCCXRva2Vub21pYwAMbGVuZENvbnRyYWN0CQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEQ09ORgIRbGVuZF9zZXJ2aWNlX2FkZHICG0Nhbid0IGdldCBsZW5kIHNlcnZpY2UgYWRkcgARc2ZGYXJtaW5nQ29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQRDT05GAhNzd29wZmlfZmFybWluZ19hZGRyAh1DYW4ndCBnZXQgc3dvcGZpIGZhcm1pbmcgYWRkcgAPcHJpY2VPcmFjbGVBZGRyCQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEQ09ORgIMcHJpY2Vfb3JhY2xlAhdObyBwcmljZSBvcmFjbGUgYWRkcmVzcwAIYWRtaW4xUEsJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBENPTkYFCWtBZG1pbjFQSwISQ2FuJ3QgZ2V0IGFkbWluMVBLAAhhZG1pbjJQSwkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEQ09ORgUJa0FkbWluMlBLAhJDYW4ndCBnZXQgYWRtaW4yUEsACGFkbWluM1BLCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQRDT05GBQlrQWRtaW4zUEsCEkNhbid0IGdldCBhZG1pbjNQSwAKb3BlcmF0b3JQSwkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEQ09ORgUPa09wZXJhdG9yQ2FsbFBLAhRDYW4ndCBnZXQgb3BlcmF0b3JQSwAMYXhseUJ1cm5BZGRyCQERQGV4dHJOYXRpdmUoMTA2MikBCQERQGV4dHJOYXRpdmUoMTA1MykCBQRDT05GAhFheGx5X2J1cm5fYWRkcmVzcwAOQVhMWV9NT05FWV9CT1gJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBENPTkYCCW1vbmV5X2JveAAGYXhseUlkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUNdG9rZW5Db250cmFjdAUMa0FYTFlUb2tlbklkAhdDYW4ndCBnZXQgQXhseSB0b2tlbiBpZAALc3RhcnRIZWlnaHQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMFDGtTdGFydEhlaWdodAAMcGVyaW9kTGVuZ3RoCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzBQ1rUGVyaW9kTGVuZ3RoAA1sZW5kTWF4QW1vdW50CQERQGV4dHJOYXRpdmUoMTA1MCkCBQ10b2tlbkNvbnRyYWN0BRFrTGVuZGVyc01heEFtb3VudAATbGVuZE1heFBlcmlvZEFtb3VudAkAaQIFDWxlbmRNYXhBbW91bnQFE0xFTkRFUlNfTUFYX1BFUklPRFMAC2xwTWF4QW1vdW50CQERQGV4dHJOYXRpdmUoMTA1MCkCBQ10b2tlbkNvbnRyYWN0BQxrTFBNYXhBbW91bnQAEWxwTWF4UGVyaW9kQW1vdW50CQBpAgULbHBNYXhBbW91bnQFDkxQX01BWF9QRVJJT0RTAQtpc0FkbWluQ2FsbAEBaQMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFCGFkbWluMVBLCQDMCAIFCGFkbWluMlBLCQDMCAIFCGFkbWluM1BLBQNuaWwIBQFpD2NhbGxlclB1YmxpY0tleQUEdW5pdAkAAgECKE9ubHkgYWRtaW4gZ3JvdXAxIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24BCmlzU2VsZkNhbGwBAWkDCQAAAggFAWkGY2FsbGVyBQR0aGlzBQR1bml0CQACAQIrT25seSBjb250cmFjdCBpdHNlbGYgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgEOaXNPcGVyYXRvckNhbGwBAWkDAwkAAAIIBQFpD2NhbGxlclB1YmxpY0tleQUKb3BlcmF0b3JQSwYJAAACCAUBaQZjYWxsZXIFDkFYTFlfTU9ORVlfQk9YBQR1bml0CQACAQIkT25seSBvcGVyYXRvciBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uAQppc0xhbmRDYWxsAQFpAwkAAAIIBQFpBmNhbGxlcgUMbGVuZENvbnRyYWN0BQR1bml0CQACAQIpT25seSBsYW5kIGNvbnRyYWN0IGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24BD2lzU0ZGYXJtaW5nQ2FsbAEBaQMJAAACCAUBaQZjYWxsZXIFEXNmRmFybWluZ0NvbnRyYWN0BQR1bml0CQACAQIpT25seSBsYW5kIGNvbnRyYWN0IGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24BDGdldEFsbFRva2VucwAEBnRva2VucwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBQdrVG9rZW5zAgADCQAAAgUGdG9rZW5zAgAFA25pbAkAtQkCBQZ0b2tlbnMCASwBDWdldEFzc2V0UHJpY2UBB2Fzc2V0SWQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFD3ByaWNlT3JhY2xlQWRkcgkArAICBQdhc3NldElkBQ5rUHJpY2VJbk9yYWNsZQEQZ2V0QXNzZXREZWNpbWFscwEHYXNzZXRJZAMJAAACBQdhc3NldElkAgVXQVZFUwAIBAckbWF0Y2gwCQDsBwEJANkEAQUHYXNzZXRJZAMJAAECBQckbWF0Y2gwAgVBc3NldAQFYXNzZXQFByRtYXRjaDAIBQVhc3NldAhkZWNpbWFscwkAAgECEENhbid0IGZpbmQgYXNzZXQBEWdldEFzc2V0UHJlY2lzaW9uAQdhc3NldElkCQBsBgAKAAAJARBnZXRBc3NldERlY2ltYWxzAQUHYXNzZXRJZAAAAAAFBERPV04BFWdldEFkb3B0ZWRBUFJCeVBlcmlvZAMGcGVyaW9kCmFwclBlcmlvZHMDYXByCgEDZm9yAgFhB2FwZXJpb2QECyR0MDUzMTk1MzQxBQFhBAVpbmRleAgFCyR0MDUzMTk1MzQxAl8xBAVmb3VuZAgFCyR0MDUzMTk1MzQxAl8yBAJmdAkAtQkCBQdhcGVyaW9kAgEtBAskdDA1Mzc4NTQ0MQkAlAoCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCZnQAAAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmZ0AAEEBGZyb20IBQskdDA1Mzc4NTQ0MQJfMQQCdG8IBQskdDA1Mzc4NTQ0MQJfMgMFBWZvdW5kBQFhAwMJAGcCBQZwZXJpb2QFBGZyb20JAGcCBQJ0bwUGcGVyaW9kBwkAlAoCBQVpbmRleAYJAJQKAgkAZAIFBWluZGV4AAEHBAskdDA1NTc4NTY0NAoAAiRsBRNMRU5ERVJTX0FQUl9QRVJJT0RTCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCAAAHCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQNmb3ICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDkJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkEBWluZGV4CAULJHQwNTU3ODU2NDQCXzEEBWZvdW5kCAULJHQwNTU3ODU2NDQCXzIDBQVmb3VuZAkAawMJAGgCCQCRAwIFC0xFTkRFUlNfQVBSBQVpbmRleAUGU0NBTEU4AAcA7QIAAAEXZ2V0VG90YWxTdXBwbHlBbGxUb2tlbnMACgEDZm9yAgFhB3Rva2VuSWQECyR0MDU4NDM1OTEyBQFhBAt0b3RhbFN1cHBseQgFCyR0MDU4NDM1OTEyAl8xBA50b3RhbFN1cHBseVVzZAgFCyR0MDU4NDM1OTEyAl8yBBF0b3RhbFN1cHBseVVzZEFsbAgFCyR0MDU4NDM1OTEyAl8zBAt1dGlsaXphdGlvbggFCyR0MDU4NDM1OTEyAl80BAd0U3VwcGx5CQELdmFsdWVPckVsc2UCCQCaCAIFDGxlbmRDb250cmFjdAkArAICBRBrTGVuZFRva2VuU3VwcGx5BQd0b2tlbklkAAAEB3RCb3Jyb3cJAQt2YWx1ZU9yRWxzZQIJAJoIAgUMbGVuZENvbnRyYWN0CQCsAgIFEmtMZW5kVG9rZW5Cb3Jyb3dlZAUHdG9rZW5JZAAABAphc3NldFByaWNlCQENZ2V0QXNzZXRQcmljZQEFB3Rva2VuSWQEDmFzc2V0UHJlY2lzaW9uCQERZ2V0QXNzZXRQcmVjaXNpb24BBQd0b2tlbklkBAp0U3VwcGx5VXNkCQBrAwUHdFN1cHBseQUKYXNzZXRQcmljZQUOYXNzZXRQcmVjaXNpb24EAXUDAwkAAAIFB3RTdXBwbHkAAAYJAAACBQd0Qm9ycm93AAAAAAkAawMFB3RCb3Jyb3cFBlNDQUxFOAUHdFN1cHBseQkAlgoECQDNCAIFC3RvdGFsU3VwcGx5BQd0U3VwcGx5CQDNCAIFDnRvdGFsU3VwcGx5VXNkBQp0U3VwcGx5VXNkCQBkAgURdG90YWxTdXBwbHlVc2RBbGwFCnRTdXBwbHlVc2QJAM0IAgULdXRpbGl6YXRpb24FAXUKAAIkbAkBDGdldEFsbFRva2VucwAKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCWCgQFA25pbAUDbmlsAAAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEDZm9yAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAzMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgERZ2V0VG90YWxTdXBwbHlVc2QBB3Rva2VuSWQEB3RTdXBwbHkJAQt2YWx1ZU9yRWxzZQIJAJoIAgUMbGVuZENvbnRyYWN0CQCsAgIFEGtMZW5kVG9rZW5TdXBwbHkFB3Rva2VuSWQAAAQKYXNzZXRQcmljZQkBDWdldEFzc2V0UHJpY2UBBQd0b2tlbklkBA5hc3NldFByZWNpc2lvbgkBEWdldEFzc2V0UHJlY2lzaW9uAQUHdG9rZW5JZAkAawMFB3RTdXBwbHkFCmFzc2V0UHJpY2UFDmFzc2V0UHJlY2lzaW9uARRjYWxjTmV3VG9rZW5JbnRlcmVzdAIHdG9rZW5JZAt0b3RhbFN1cHBseQMJAGcCBQtzdGFydEhlaWdodAUGaGVpZ2h0AAAEDnJld2FyZFBlckJsb2NrCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIFB3Rva2VuSWQFFGtUb2tlblJld2FyZFBlckJsb2NrBAtvbGRJbnRlcmVzdAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICBQd0b2tlbklkBQ5rVG9rZW5JbnRlcmVzdAQMdXBkYXRlSGVpZ2h0CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIFB3Rva2VuSWQFFGtUb2tlbkludGVyZXN0SGVpZ2h0BAZyZXdhcmQJAGgCCQBlAgUGaGVpZ2h0BQx1cGRhdGVIZWlnaHQFDnJld2FyZFBlckJsb2NrBAhpbnRlcmVzdAMJAGYCBQt0b3RhbFN1cHBseQAACQBrAwUGcmV3YXJkBQZTQ0FMRTgFC3RvdGFsU3VwcGx5AAAJAGQCBQtvbGRJbnRlcmVzdAUIaW50ZXJlc3QBEWNhbGNOZXdMcEludGVyZXN0AQt0b3RhbFN1cHBseQMJAGcCBQtzdGFydEhlaWdodAUGaGVpZ2h0AAAEDnJld2FyZFBlckJsb2NrCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFEWtMcFJld2FyZFBlckJsb2NrAAAEC29sZEludGVyZXN0CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFC2tMcEludGVyZXN0AAAEDHVwZGF0ZUhlaWdodAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBRFrTHBJbnRlcmVzdEhlaWdodAUGaGVpZ2h0BAZyZXdhcmQJAGgCCQBlAgUGaGVpZ2h0BQx1cGRhdGVIZWlnaHQFDnJld2FyZFBlckJsb2NrBAhpbnRlcmVzdAMJAGYCBQt0b3RhbFN1cHBseQAACQBrAwUGcmV3YXJkBQZTQ0FMRTgFC3RvdGFsU3VwcGx5AAAJAGQCBQtvbGRJbnRlcmVzdAUIaW50ZXJlc3QBEmNhbGNMZW5kVXNlclJld2FyZAIEdXNlcgd0b2tlbklkBAt0b3RhbFN1cHBseQkBC3ZhbHVlT3JFbHNlAgkAmggCBQxsZW5kQ29udHJhY3QJAKwCAgUQa0xlbmRUb2tlblN1cHBseQUHdG9rZW5JZAAABA10b2tlbkludGVyZXN0CQEUY2FsY05ld1Rva2VuSW50ZXJlc3QCBQd0b2tlbklkBQt0b3RhbFN1cHBseQQKdXNlclN1cHBseQkBC3ZhbHVlT3JFbHNlAgkAmggCBQxsZW5kQ29udHJhY3QJAKwCAgkArAICBQR1c2VyBQ9rTGVuZFVzZXJTdXBwbHkFB3Rva2VuSWQAAAQRdXNlclRva2VuSW50ZXJlc3QJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgUHdG9rZW5JZAIBXwUEdXNlcgURa1VzZXJMZW5kSW50ZXJlc3QDCQAAAgUKdXNlclN1cHBseQAABQ10b2tlbkludGVyZXN0AAAEBnJld2FyZAkAawMFCnVzZXJTdXBwbHkJAGUCBQ10b2tlbkludGVyZXN0BRF1c2VyVG9rZW5JbnRlcmVzdAUGU0NBTEU4CQCVCgMFBnJld2FyZAUNdG9rZW5JbnRlcmVzdAUKdXNlclN1cHBseQEQY2FsY0xwVXNlclJld2FyZAEEdXNlcgQLdG90YWxTdXBwbHkJAQt2YWx1ZU9yRWxzZQIJAJoIAgURc2ZGYXJtaW5nQ29udHJhY3QJAKwCAgUIYXhseVBvb2wFDmtTRlRvdGFsU3VwcGx5AAAEDXRva2VuSW50ZXJlc3QJARFjYWxjTmV3THBJbnRlcmVzdAEFC3RvdGFsU3VwcGx5BAp1c2VyU3VwcGx5CQELdmFsdWVPckVsc2UCCQCaCAIFEXNmRmFybWluZ0NvbnRyYWN0CQCsAgIJAKwCAgkArAICBQhheGx5UG9vbAIBXwUEdXNlcgUSa1NGVXNlclRvdGFsU3VwcGx5AAAEEXVzZXJUb2tlbkludGVyZXN0CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEdXNlcgUPa1VzZXJMcEludGVyZXN0AwkAAAIFCnVzZXJTdXBwbHkAAAUNdG9rZW5JbnRlcmVzdAAABAZyZXdhcmQJAGsDBQp1c2VyU3VwcGx5CQBlAgUNdG9rZW5JbnRlcmVzdAURdXNlclRva2VuSW50ZXJlc3QFBlNDQUxFOAkAlQoDBQZyZXdhcmQFDXRva2VuSW50ZXJlc3QFCnVzZXJTdXBwbHkBGGNsYWltTGVuZGVyUmV3YXJkc0NvbW1vbgIEdXNlcghyZWFkT25seQoBBWNsYWltAgFhB3Rva2VuSWQECyR0MDkwMDY5MDUwBQFhBAh0b2tlbklkcwgFCyR0MDkwMDY5MDUwAl8xBAdjQW1vdW50CAULJHQwOTAwNjkwNTACXzIEBXRvdGFsCAULJHQwOTAwNjkwNTACXzMECGVudGVyaWVzCAULJHQwOTAwNjkwNTACXzQEEnVzZXJBdmFpbGFibGVDbGFpbQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICBQd0b2tlbklkAgFfBQR1c2VyBRdrVXNlckxlbmRBdmFpbGFibGVDbGFpbQAABAskdDA5MTYzOTI0MgkBEmNhbGNMZW5kVXNlclJld2FyZAIFBHVzZXIFB3Rva2VuSWQEB3VSZXdhcmQIBQskdDA5MTYzOTI0MgJfMQQQbmV3VG9rZW5JbnRlcmVzdAgFCyR0MDkxNjM5MjQyAl8yBAp1c2VyU3VwcGx5CAULJHQwOTE2MzkyNDICXzMEDHRvdGFsVG9DbGFpbQkAZAIFEnVzZXJBdmFpbGFibGVDbGFpbQUHdVJld2FyZAMDCQBmAgUMdG90YWxUb0NsYWltAAAGCQBmAgUKdXNlclN1cHBseQAABAxuZXdFbnRyZXJpZXMDAwUIcmVhZE9ubHkGCQAAAgUMdG90YWxUb0NsYWltAAAFCGVudGVyaWVzCQDOCAIFCGVudGVyaWVzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICBQd0b2tlbklkAgFfBQR1c2VyBRFrVXNlckxlbmRJbnRlcmVzdAUQbmV3VG9rZW5JbnRlcmVzdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgUHdG9rZW5JZAIBXwUEdXNlcgUXa1VzZXJMZW5kQXZhaWxhYmxlQ2xhaW0AAAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQd0b2tlbklkBQ5rVG9rZW5JbnRlcmVzdAUQbmV3VG9rZW5JbnRlcmVzdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQd0b2tlbklkBRRrVG9rZW5JbnRlcmVzdEhlaWdodAUGaGVpZ2h0BQNuaWwJAJYKBAkAzQgCBQh0b2tlbklkcwUHdG9rZW5JZAkAzQgCBQdjQW1vdW50BQx0b3RhbFRvQ2xhaW0JAGQCBQV0b3RhbAUMdG90YWxUb0NsYWltBQxuZXdFbnRyZXJpZXMJAJYKBAUIdG9rZW5JZHMFB2NBbW91bnQFBXRvdGFsBQhlbnRlcmllcwoAAiRsCQEMZ2V0QWxsVG9rZW5zAAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJYKBAUDbmlsBQNuaWwAAAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQVjbGFpbQIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMzAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsAHAAdAB4BFGNsYWltTHBSZXdhcmRzQ29tbW9uAgR1c2VyCHJlYWRPbmx5BBJ1c2VyQXZhaWxhYmxlQ2xhaW0JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQR1c2VyBRVrVXNlckxwQXZhaWxhYmxlQ2xhaW0AAAQNJHQwMTAxNzMxMDIzOAkBEGNhbGNMcFVzZXJSZXdhcmQBBQR1c2VyBAd1UmV3YXJkCAUNJHQwMTAxNzMxMDIzOAJfMQQNbmV3THBJbnRlcmVzdAgFDSR0MDEwMTczMTAyMzgCXzIECnVzZXJTdXBwbHkIBQ0kdDAxMDE3MzEwMjM4Al8zBAx0b3RhbFRvQ2xhaW0JAGQCBRJ1c2VyQXZhaWxhYmxlQ2xhaW0FB3VSZXdhcmQDAwUIcmVhZE9ubHkGCQAAAgUMdG90YWxUb0NsYWltAAAJAJQKAgUMdG90YWxUb0NsYWltBQNuaWwJAJQKAgUMdG90YWxUb0NsYWltCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHVzZXIFD2tVc2VyTHBJbnRlcmVzdAUNbmV3THBJbnRlcmVzdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQR1c2VyBRVrVXNlckxwQXZhaWxhYmxlQ2xhaW0AAAkAzAgCCQEMSW50ZWdlckVudHJ5AgULa0xwSW50ZXJlc3QFDW5ld0xwSW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIFEWtMcEludGVyZXN0SGVpZ2h0BQZoZWlnaHQFA25pbAEUZ2V0QXhseVByaWNlT25Td29wZmkABAhhQmFsYW5jZQkBEUBleHRyTmF0aXZlKDEwNTApAgkBEUBleHRyTmF0aXZlKDEwNjIpAQUIYXhseVBvb2wCD0FfYXNzZXRfYmFsYW5jZQQIYkJhbGFuY2UJARFAZXh0ck5hdGl2ZSgxMDUwKQIJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCGF4bHlQb29sAg9CX2Fzc2V0X2JhbGFuY2UEBndQcmljZQkBDWdldEFzc2V0UHJpY2UBAgVXQVZFUwkAawMFCGJCYWxhbmNlBQZ3UHJpY2UFCGFCYWxhbmNlARFnZXRBeGx5U2hhcmVQcmljZQAECHBvb2xBZGRyCQERQGV4dHJOYXRpdmUoMTA2MikBBQhheGx5UG9vbAQIYUJhbGFuY2UJARFAZXh0ck5hdGl2ZSgxMDUwKQIJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCGF4bHlQb29sAg9BX2Fzc2V0X2JhbGFuY2UECGJCYWxhbmNlCQERQGV4dHJOYXRpdmUoMTA1MCkCCQERQGV4dHJOYXRpdmUoMTA2MikBBQhheGx5UG9vbAIPQl9hc3NldF9iYWxhbmNlBAdkUHJpY2VBCQEUZ2V0QXhseVByaWNlT25Td29wZmkABAdkUHJpY2VCCQENZ2V0QXNzZXRQcmljZQECBVdBVkVTAwMJAGYCAAAFB2RQcmljZUEGCQBmAgAABQdkUHJpY2VCAP///////////wEEC3NoYXJlU3VwcGx5CQETdmFsdWVPckVycm9yTWVzc2FnZQIJARFAZXh0ck5hdGl2ZSgxMDUwKQIFCHBvb2xBZGRyAhJzaGFyZV9hc3NldF9zdXBwbHkCHENhbid0IGdldCBzaGFyZSBhc3NldCBzdXBwbHkECkFQcmVjaXNpb24JAGwGAAoAAAAIAAAAAAUERE9XTgQKQlByZWNpc2lvbgkAbAYACgAAAAgAAAAABQRET1dOBA5zaGFyZVByZWNpc2lvbgkAbAYACgAAAAgAAAAABQRET1dOBANzdW0JAGQCCQBrAwUIYUJhbGFuY2UFB2RQcmljZUEFCkFQcmVjaXNpb24JAGsDBQhiQmFsYW5jZQUHZFByaWNlQgUKQlByZWNpc2lvbgkAawMFA3N1bQUOc2hhcmVQcmVjaXNpb24FC3NoYXJlU3VwcGx5AQ1nZXRUb2tlbnNBUFJzAAQJYXhseVByaWNlCQEUZ2V0QXhseVByaWNlT25Td29wZmkABA1heGx5UHJlY2lzaW9uCQERZ2V0QXNzZXRQcmVjaXNpb24BBQZheGx5SWQKAQp0b2tlbnNBcHJzAgNhcHIHdG9rZW5JZAQEcndwYgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFB3Rva2VuSWQFFGtUb2tlblJld2FyZFBlckJsb2NrAAAEB3J3cGJVc2QJAGsDBQRyd3BiBQlheGx5UHJpY2UFDWF4bHlQcmVjaXNpb24EBnJ3WWVhcgkAaAIJAGgCBQdyd3BiVXNkBQxwZXJpb2RMZW5ndGgANAQOdG90YWxTdXBwbHlVc2QJARFnZXRUb3RhbFN1cHBseVVzZAEFB3Rva2VuSWQJAM0IAgUDYXByCQBrAwUGcndZZWFyBQZTQ0FMRTgFDnRvdGFsU3VwcGx5VXNkBARhcHJzCgACJGwJAQxnZXRBbGxUb2tlbnMACgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQp0b2tlbnNBcHJzAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAzMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgQNbHBUb3RhbFN1cHBseQkBEUBleHRyTmF0aXZlKDEwNTApAgURc2ZGYXJtaW5nQ29udHJhY3QJAKwCAgUIYXhseVBvb2wFDmtTRlRvdGFsU3VwcGx5BARscElkCQERQGV4dHJOYXRpdmUoMTA1MykCCQERQGV4dHJOYXRpdmUoMTA2MikBBQhheGx5UG9vbAUFa0xwSWQEC2xwUHJlY2lzaW9uCQERZ2V0QXNzZXRQcmVjaXNpb24BBQRscElkBAdscFByaWNlCQERZ2V0QXhseVNoYXJlUHJpY2UABBBscFRvdGFsU3VwcGx5VXNkCQBrAwUNbHBUb3RhbFN1cHBseQUHbHBQcmljZQULbHBQcmVjaXNpb24EBHJ3cGIJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwURa0xwUmV3YXJkUGVyQmxvY2sAAAQHcndwYlVzZAkAawMFBHJ3cGIFCWF4bHlQcmljZQUNYXhseVByZWNpc2lvbgQGcndZZWFyCQBoAgkAaAIFB3J3cGJVc2QFDHBlcmlvZExlbmd0aAA0BAVscEFwcgkAawMFBnJ3WWVhcgUGU0NBTEU4BRBscFRvdGFsU3VwcGx5VXNkCQCVCgMJAQxnZXRBbGxUb2tlbnMABQRhcHJzBQVscEFwcgETZ2V0VG9rZW5VdGlsaXphdGlvbgEHYXNzZXRJZAAABwFpARJjbGFpbUxlbmRlclJld2FyZHMABAhjbGFpbVJlcwkBGGNsYWltTGVuZGVyUmV3YXJkc0NvbW1vbgIJAKUIAQgFAWkGY2FsbGVyBwMJAAACCAUIY2xhaW1SZXMCXzMAAAkAAgECI2NsYWltIGFtb3VudCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwBANpbnYJAPwHBAUNdG9rZW5Db250cmFjdAISd2l0aGRyYXdMZW5kUmV3YXJkCQDMCAIIBQhjbGFpbVJlcwJfMwkAzAgCCQClCAEIBQFpBmNhbGxlcgUDbmlsBQNuaWwDCQAAAgUDaW52BQNpbnYIBQhjbGFpbVJlcwJfNAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ5jbGFpbUxwUmV3YXJkcwAECGNsYWltUmVzCQEUY2xhaW1McFJld2FyZHNDb21tb24CCQClCAEIBQFpBmNhbGxlcgcDCQAAAggFCGNsYWltUmVzAl8xAAAJAAIBAiNjbGFpbSBhbW91bnQgbXVzdCBiZSBncmVhdGVyIHRoYW4gMAQDaW52CQD8BwQFDXRva2VuQ29udHJhY3QCEHdpdGhkcmF3THBSZXdhcmQJAMwIAggFCGNsYWltUmVzAl8xCQDMCAIJAKUIAQgFAWkGY2FsbGVyBQNuaWwFA25pbAMJAAACBQNpbnYFA2ludggFCGNsYWltUmVzAl8yCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCmxlbmRBY3Rpb24CBHVzZXIHdG9rZW5JZAkBC3ZhbHVlT3JFbHNlAgkBCmlzTGFuZENhbGwBBQFpBBJ1c2VyQXZhaWxhYmxlQ2xhaW0JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgUHdG9rZW5JZAIBXwUEdXNlcgUXa1VzZXJMZW5kQXZhaWxhYmxlQ2xhaW0AAAQNJHQwMTM3ODgxMzg1NQkBEmNhbGNMZW5kVXNlclJld2FyZAIFBHVzZXIFB3Rva2VuSWQEB3VSZXdhcmQIBQ0kdDAxMzc4ODEzODU1Al8xBBBuZXdUb2tlbkludGVyZXN0CAUNJHQwMTM3ODgxMzg1NQJfMgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgUHdG9rZW5JZAIBXwUEdXNlcgURa1VzZXJMZW5kSW50ZXJlc3QFEG5ld1Rva2VuSW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIFB3Rva2VuSWQCAV8FBHVzZXIFF2tVc2VyTGVuZEF2YWlsYWJsZUNsYWltCQBkAgUSdXNlckF2YWlsYWJsZUNsYWltBQd1UmV3YXJkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFB3Rva2VuSWQFDmtUb2tlbkludGVyZXN0BRBuZXdUb2tlbkludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFB3Rva2VuSWQFFGtUb2tlbkludGVyZXN0SGVpZ2h0BQZoZWlnaHQFA25pbAFpAQhscEFjdGlvbgEEdXNlcgkBC3ZhbHVlT3JFbHNlAgkBD2lzU0ZGYXJtaW5nQ2FsbAEFAWkEEnVzZXJBdmFpbGFibGVDbGFpbQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHVzZXIFFWtVc2VyTHBBdmFpbGFibGVDbGFpbQAABA0kdDAxNDMyNzE0MzgwCQEQY2FsY0xwVXNlclJld2FyZAEFBHVzZXIEB3VSZXdhcmQIBQ0kdDAxNDMyNzE0MzgwAl8xBA1uZXdMcEludGVyZXN0CAUNJHQwMTQzMjcxNDM4MAJfMgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQR1c2VyBQ9rVXNlckxwSW50ZXJlc3QFDW5ld0xwSW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEdXNlcgUVa1VzZXJMcEF2YWlsYWJsZUNsYWltCQBkAgUSdXNlckF2YWlsYWJsZUNsYWltBQd1UmV3YXJkCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQtrTHBJbnRlcmVzdAUNbmV3THBJbnRlcmVzdAkAzAgCCQEMSW50ZWdlckVudHJ5AgURa0xwSW50ZXJlc3RIZWlnaHQFBmhlaWdodAUDbmlsAWkBBGluaXQDDGF4bHlQb29sQWRkchJmYXJtaW5nU3RhcnRIZWlnaHQMcGVyaW9kTGVuZ3RoCQELdmFsdWVPckVsc2UCCQEKaXNTZWxmQ2FsbAEFAWkJAMwIAgkBC1N0cmluZ0VudHJ5AgUJa0F4bHlQb29sBQxheGx5UG9vbEFkZHIJAMwIAgkBDEludGVnZXJFbnRyeQIFDGtTdGFydEhlaWdodAUSZmFybWluZ1N0YXJ0SGVpZ2h0CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ1rUGVyaW9kTGVuZ3RoBQxwZXJpb2RMZW5ndGgFA25pbAFpAQxpbml0TmV3VG9rZW4BB3Rva2VuSWQJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQEJaXNEZWZpbmVkAQkAmggCBQR0aGlzCQCsAgIFB3Rva2VuSWQFDmtUb2tlbkludGVyZXN0CQACAQIUdG9rZW4gYWxyZWFkeSBpbml0ZWQDCQEBIQEJAQhjb250YWlucwIJARFAZXh0ck5hdGl2ZSgxMDUzKQIFDGxlbmRDb250cmFjdAUQa0xlbmRTZXR1cFRva2VucwUHdG9rZW5JZAkAAgECE25vIHRva2VuIG9uIGxhbmRpbmcEDG5ld0FsbFRva2VucwkAzQgCCQEMZ2V0QWxsVG9rZW5zAAUHdG9rZW5JZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQd0b2tlbklkBQ5rVG9rZW5JbnRlcmVzdAAACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFB3Rva2VuSWQFFGtUb2tlbkludGVyZXN0SGVpZ2h0CQCWAwEJAMwIAgULc3RhcnRIZWlnaHQJAMwIAgUGaGVpZ2h0BQNuaWwJAMwIAgkBC1N0cmluZ0VudHJ5AgUHa1Rva2VucwkAuQkCBQxuZXdBbGxUb2tlbnMCASwJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUHdG9rZW5JZAUUa1Rva2VuUmV3YXJkUGVyQmxvY2sAAAUDbmlsAWkBDXVwZGF0ZVJld2FyZHMACQELdmFsdWVPckVsc2UCCQEOaXNPcGVyYXRvckNhbGwBBQFpBBBsYXN0VXBkYXRlUGVyaW9kCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFEWtMYXN0VXBkYXRlUGVyaW9kAAAECmNhbGNQZXJpb2QJAGQCCQBpAgkAZQIFBmhlaWdodAULc3RhcnRIZWlnaHQFDHBlcmlvZExlbmd0aAABBAljdXJQZXJpb2QDCQBnAgAABQpjYWxjUGVyaW9kAAEFCmNhbGNQZXJpb2QDCQBmAgUJY3VyUGVyaW9kAGgJAAIBAhFtYXggcGVyaW9kIGlzIDEwNAMDCQBnAgUQbGFzdFVwZGF0ZVBlcmlvZAUJY3VyUGVyaW9kCQECIT0CBRBsYXN0VXBkYXRlUGVyaW9kAAAHCQACAQIlcmV3YXJkcyBhbHJlZHkgdXBkYXRlZCBpbiB0aGlzIHBlcmlvZAQNJHQwMTU5MTgxNjAxMQkBF2dldFRvdGFsU3VwcGx5QWxsVG9rZW5zAAQLdG90YWxTdXBwbHkIBQ0kdDAxNTkxODE2MDExAl8xBA50b3RhbFN1cHBseVVzZAgFDSR0MDE1OTE4MTYwMTECXzIEEXRvdGFsU3VwcGx5VXNkQWxsCAUNJHQwMTU5MTgxNjAxMQJfMwQLdXRpbGl6YXRpb24IBQ0kdDAxNTkxODE2MDExAl80CgEMZ2V0TmV3V2lnaHRzAgFhB3Rva2VuSWQEDSR0MDE2MDgxMTYxMTgFAWEEB3dlaWdodHMIBQ0kdDAxNjA4MTE2MTE4Al8xBAt0b3RhbFdlaWdodAgFDSR0MDE2MDgxMTYxMTgCXzIEBWluZGV4CAUNJHQwMTYwODExNjExOAJfMwQFc2hhcmUJAGsDCQCRAwIFDnRvdGFsU3VwcGx5VXNkBQVpbmRleAUGU0NBTEU4BRF0b3RhbFN1cHBseVVzZEFsbAQJbmV3V2VpZ2h0CQBrAwUFc2hhcmUJAJEDAgULdXRpbGl6YXRpb24FBWluZGV4BQZTQ0FMRTgJAJUKAwkAzQgCBQd3ZWlnaHRzBQluZXdXZWlnaHQJAGQCBQt0b3RhbFdlaWdodAUJbmV3V2VpZ2h0CQBkAgUFaW5kZXgAAQQNJHQwMTYzMjQxNjQwOQoAAiRsCQEMZ2V0QWxsVG9rZW5zAAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJUKAwUDbmlsAAAAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEMZ2V0TmV3V2lnaHRzAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAzMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgQKbmV3V2VpZ2h0cwgFDSR0MDE2MzI0MTY0MDkCXzEEDnRvdGFsTmV3V2VpZ2h0CAUNJHQwMTYzMjQxNjQwOQJfMgQJYXhseVByaWNlCQEUZ2V0QXhseVByaWNlT25Td29wZmkABA1heGx5UHJlY2lzaW9uCQERZ2V0QXNzZXRQcmVjaXNpb24BBQZheGx5SWQEBm1heEFQUgkBFWdldEFkb3B0ZWRBUFJCeVBlcmlvZAMFCWN1clBlcmlvZAUTTEVOREVSU19BUFJfUEVSSU9EUwULTEVOREVSU19BUFIKAQx1cGRhdGVSZXdhcmQCAWEHdG9rZW5JZAQNJHQwMTY2NTkxNjcwMwUBYQQIZW50ZXJpZXMIBQ0kdDAxNjY1OTE2NzAzAl8xBBF0b3RhbFBlcmlvZFJld2FyZAgFDSR0MDE2NjU5MTY3MDMCXzIEBWluZGV4CAUNJHQwMTY2NTkxNjcwMwJfMwMJAAACCQCRAwIFC3RvdGFsU3VwcGx5BQVpbmRleAAACQCVCgMJAM4IAgUIZW50ZXJpZXMJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUHdG9rZW5JZAUUa1ByZXZMZW5kVG9rZW5TdXBwbHkJAJEDAgULdG90YWxTdXBwbHkFBWluZGV4CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFB3Rva2VuSWQFFGtUb2tlblJld2FyZFBlckJsb2NrAAAJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUHdG9rZW5JZAUOa1Rva2VuSW50ZXJlc3QJARRjYWxjTmV3VG9rZW5JbnRlcmVzdAIFB3Rva2VuSWQJAJEDAgULdG90YWxTdXBwbHkFBWluZGV4CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFB3Rva2VuSWQFFGtUb2tlbkludGVyZXN0SGVpZ2h0CQCWAwEJAMwIAgULc3RhcnRIZWlnaHQJAMwIAgUGaGVpZ2h0BQNuaWwFA25pbAURdG90YWxQZXJpb2RSZXdhcmQJAGQCBQVpbmRleAABBAVzaGFyZQkAawMJAJEDAgUKbmV3V2VpZ2h0cwUFaW5kZXgFBlNDQUxFOAUOdG90YWxOZXdXZWlnaHQECW1heFJld2FyZAkAawMFBXNoYXJlBRNsZW5kTWF4UGVyaW9kQW1vdW50BQZTQ0FMRTgEDG1heFJld2FyZFVzZAkAawMFCW1heFJld2FyZAUJYXhseVByaWNlBQ1heGx5UHJlY2lzaW9uBA9wcmV2VG90YWxTdXBwbHkJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQd0b2tlbklkBRRrUHJldkxlbmRUb2tlblN1cHBseQAABAZydENvZWYDAwkAAAIFD3ByZXZUb3RhbFN1cHBseQAABgkAAAIJAJEDAgULdG90YWxTdXBwbHkFBWluZGV4AAAAAAkAZQIJAGsDCQCRAwIFC3RvdGFsU3VwcGx5BQVpbmRleAUGU0NBTEU4BQ9wcmV2VG90YWxTdXBwbHkFBlNDQUxFOAQGcmV3YXJkCQBpAgkAaQIJAJcDAQkAzAgCCQBoAgUGbWF4QVBSCQBkAgUGU0NBTEU4CQCWAwEJAMwIAgUGcnRDb2VmCQDMCAIAAAUDbmlsCQDMCAIJAGsDBQZtYXhBUFIJAGgCAA8FBlNDQUxFOAAKBQNuaWwFBlNDQUxFOABkBAlyZXdhcmRVc2QJAJcDAQkAzAgCBQxtYXhSZXdhcmRVc2QJAMwIAgkAawMJAJEDAgUOdG90YWxTdXBwbHlVc2QFBWluZGV4BQZyZXdhcmQFBlNDQUxFOAUDbmlsBAxyZXdhcmRQZXJpb2QJAGsDBQlyZXdhcmRVc2QFDWF4bHlQcmVjaXNpb24FCWF4bHlQcmljZQQOcmV3YXJkUGVyQmxvY2sJAGkCBQxyZXdhcmRQZXJpb2QFDHBlcmlvZExlbmd0aAkAlQoDCQDOCAIFCGVudGVyaWVzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFB3Rva2VuSWQFFGtQcmV2TGVuZFRva2VuU3VwcGx5CQCRAwIFC3RvdGFsU3VwcGx5BQVpbmRleAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQd0b2tlbklkBRRrVG9rZW5SZXdhcmRQZXJCbG9jawUOcmV3YXJkUGVyQmxvY2sJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUHdG9rZW5JZAUOa1Rva2VuSW50ZXJlc3QJARRjYWxjTmV3VG9rZW5JbnRlcmVzdAIFB3Rva2VuSWQJAJEDAgULdG90YWxTdXBwbHkFBWluZGV4CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFB3Rva2VuSWQFFGtUb2tlbkludGVyZXN0SGVpZ2h0CQCWAwEJAMwIAgULc3RhcnRIZWlnaHQJAMwIAgUGaGVpZ2h0BQNuaWwFA25pbAkAZAIFEXRvdGFsUGVyaW9kUmV3YXJkBQxyZXdhcmRQZXJpb2QJAGQCBQVpbmRleAABBA0kdDAxODM4ODE4NDgwCgACJGwJAQxnZXRBbGxUb2tlbnMACgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlQoDBQNuaWwAAAAACgEFJGYxXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQx1cGRhdGVSZXdhcmQCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjFfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDMwCQEFJGYxXzICCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAAVABYAFwAYABkAGgAbABwAHQAeBA50b2tlbnNFbnRlcmllcwgFDSR0MDE4Mzg4MTg0ODACXzEEEHRvdGFsVG9rZW5SZXdhcmQIBQ0kdDAxODM4ODE4NDgwAl8yBAhidXJuTGVuZAkAZQIFE2xlbmRNYXhQZXJpb2RBbW91bnQFEHRvdGFsVG9rZW5SZXdhcmQEA2ludgkA/AcEBQ10b2tlbkNvbnRyYWN0AhJ3aXRoZHJhd0xlbmRSZXdhcmQJAMwIAgUIYnVybkxlbmQJAMwIAgkApQgBBQR0aGlzBQNuaWwFA25pbAMJAAACBQNpbnYFA2ludgkAzQgCCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIFEWtMcFJld2FyZFBlckJsb2NrAAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUMYXhseUJ1cm5BZGRyBQhidXJuTGVuZAkA2QQBBQZheGx5SWQFA25pbAUOdG9rZW5zRW50ZXJpZXMJAQxJbnRlZ2VyRW50cnkCBRFrTGFzdFVwZGF0ZVBlcmlvZAUJY3VyUGVyaW9kCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJ0eAEGdmVyaWZ5AAQTbXVsdGlTaWduZWRCeUFkbWlucwQSYWRtaW5QdWJLZXkxU2lnbmVkAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAUIYWRtaW4xUEsAAQAABBJhZG1pblB1YktleTJTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwABBQhhZG1pbjJQSwABAAAEEmFkbWluUHViS2V5M1NpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAIFCGFkbWluM1BLAAEAAAkAZwIJAGQCCQBkAgUSYWRtaW5QdWJLZXkxU2lnbmVkBRJhZG1pblB1YktleTJTaWduZWQFEmFkbWluUHViS2V5M1NpZ25lZAACBAckbWF0Y2gwBQJ0eAMJAAECBQckbWF0Y2gwAhdJbnZva2VTY3JpcHRUcmFuc2FjdGlvbgQDaW52BQckbWF0Y2gwBAZpc1NlbGYJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXkECmlzUmlnaHRGZWUDCQAAAggFA2ludgNmZWUAoPc2CQAAAggFA2ludgpmZWVBc3NldElkBQR1bml0BwQKaXNJbml0Q2FsbAkAAAIIBQNpbnYIZnVuY3Rpb24CBGluaXQEDGlzbm9QYXltZW50cwkAAAIJAJADAQgFA2ludghwYXltZW50cwAAAwMDAwUKaXNSaWdodEZlZQUKaXNJbml0Q2FsbAcFBmlzU2VsZgcFDGlzbm9QYXltZW50cwcGBRNtdWx0aVNpZ25lZEJ5QWRtaW5zBRNtdWx0aVNpZ25lZEJ5QWRtaW5zJ0/Kcw==", "height": 4019691, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: EhHRXhpMYhbShgcWk2KgYGdPNgPCLHAXTdDgR8ZKDvFU Next: none Diff:
OldNewDifferences
105105
106106 let axlyBurnAddr = addressFromStringValue(getStringValue(CONF, "axly_burn_address"))
107107
108+let AXLY_MONEY_BOX = addressFromStringValue(getStringValue(CONF, "money_box"))
109+
108110 let axlyId = valueOrErrorMessage(getString(tokenContract, kAXLYTokenId), "Can't get Axly token id")
109111
110112 let startHeight = getIntegerValue(this, kStartHeight)
129131 else throw("Only contract itself can call this function")
130132
131133
132-func isOperatorCall (i) = if ((i.callerPublicKey == operatorPK))
134+func isOperatorCall (i) = if (if ((i.callerPublicKey == operatorPK))
135+ then true
136+ else (i.caller == AXLY_MONEY_BOX))
133137 then unit
134138 else throw("Only operator can call this function")
135139
170174
171175 func getAdoptedAPRByPeriod (period,aprPeriods,apr) = {
172176 func for (a,aperiod) = {
173- let $t052105232 = a
174- let index = $t052105232._1
175- let found = $t052105232._2
177+ let $t053195341 = a
178+ let index = $t053195341._1
179+ let found = $t053195341._2
176180 let ft = split(aperiod, "-")
177- let $t052695332 = $Tuple2(parseIntValue(ft[0]), parseIntValue(ft[1]))
178- let from = $t052695332._1
179- let to = $t052695332._2
181+ let $t053785441 = $Tuple2(parseIntValue(ft[0]), parseIntValue(ft[1]))
182+ let from = $t053785441._1
183+ let to = $t053785441._2
180184 if (found)
181185 then a
182186 else if (if ((period >= from))
186190 else $Tuple2((index + 1), false)
187191 }
188192
189- let $t054695535 = {
193+ let $t055785644 = {
190194 let $l = LENDERS_APR_PERIODS
191195 let $s = size($l)
192196 let $acc0 = $Tuple2(0, false)
200204
201205 $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)
202206 }
203- let index = $t054695535._1
204- let found = $t054695535._2
207+ let index = $t055785644._1
208+ let found = $t055785644._2
205209 if (found)
206210 then fraction((LENDERS_APR[index] * SCALE8), 7, 365)
207211 else 0
210214
211215 func getTotalSupplyAllTokens () = {
212216 func for (a,tokenId) = {
213- let $t057345803 = a
214- let totalSupply = $t057345803._1
215- let totalSupplyUsd = $t057345803._2
216- let totalSupplyUsdAll = $t057345803._3
217- let utilization = $t057345803._4
217+ let $t058435912 = a
218+ let totalSupply = $t058435912._1
219+ let totalSupplyUsd = $t058435912._2
220+ let totalSupplyUsdAll = $t058435912._3
221+ let utilization = $t058435912._4
218222 let tSupply = valueOrElse(getInteger(lendContract, (kLendTokenSupply + tokenId)), 0)
219223 let tBorrow = valueOrElse(getInteger(lendContract, (kLendTokenBorrowed + tokenId)), 0)
220224 let assetPrice = getAssetPrice(tokenId)
305309
306310 func claimLenderRewardsCommon (user,readOnly) = {
307311 func claim (a,tokenId) = {
308- let $t088978941 = a
309- let tokenIds = $t088978941._1
310- let cAmount = $t088978941._2
311- let total = $t088978941._3
312- let enteries = $t088978941._4
312+ let $t090069050 = a
313+ let tokenIds = $t090069050._1
314+ let cAmount = $t090069050._2
315+ let total = $t090069050._3
316+ let enteries = $t090069050._4
313317 let userAvailableClaim = valueOrElse(getInteger(this, (((tokenId + "_") + user) + kUserLendAvailableClaim)), 0)
314- let $t090549133 = calcLendUserReward(user, tokenId)
315- let uReward = $t090549133._1
316- let newTokenInterest = $t090549133._2
317- let userSupply = $t090549133._3
318+ let $t091639242 = calcLendUserReward(user, tokenId)
319+ let uReward = $t091639242._1
320+ let newTokenInterest = $t091639242._2
321+ let userSupply = $t091639242._3
318322 let totalToClaim = (userAvailableClaim + uReward)
319323 if (if ((totalToClaim > 0))
320324 then true
347351
348352 func claimLpRewardsCommon (user,readOnly) = {
349353 let userAvailableClaim = valueOrElse(getInteger(this, (user + kUserLpAvailableClaim)), 0)
350- let $t01006410129 = calcLpUserReward(user)
351- let uReward = $t01006410129._1
352- let newLpInterest = $t01006410129._2
353- let userSupply = $t01006410129._3
354+ let $t01017310238 = calcLpUserReward(user)
355+ let uReward = $t01017310238._1
356+ let newLpInterest = $t01017310238._2
357+ let userSupply = $t01017310238._3
354358 let totalToClaim = (userAvailableClaim + uReward)
355359 if (if (readOnly)
356360 then true
463467 @Callable(i)
464468 func lendAction (user,tokenId) = valueOrElse(isLandCall(i), {
465469 let userAvailableClaim = valueOrElse(getInteger(this, (((tokenId + "_") + user) + kUserLendAvailableClaim)), 0)
466- let $t01367913746 = calcLendUserReward(user, tokenId)
467- let uReward = $t01367913746._1
468- let newTokenInterest = $t01367913746._2
470+ let $t01378813855 = calcLendUserReward(user, tokenId)
471+ let uReward = $t01378813855._1
472+ let newTokenInterest = $t01378813855._2
469473 [IntegerEntry((((tokenId + "_") + user) + kUserLendInterest), newTokenInterest), IntegerEntry((((tokenId + "_") + user) + kUserLendAvailableClaim), (userAvailableClaim + uReward)), IntegerEntry((tokenId + kTokenInterest), newTokenInterest), IntegerEntry((tokenId + kTokenInterestHeight), height)]
470474 })
471475
474478 @Callable(i)
475479 func lpAction (user) = valueOrElse(isSFFarmingCall(i), {
476480 let userAvailableClaim = valueOrElse(getInteger(this, (user + kUserLpAvailableClaim)), 0)
477- let $t01421814271 = calcLpUserReward(user)
478- let uReward = $t01421814271._1
479- let newLpInterest = $t01421814271._2
481+ let $t01432714380 = calcLpUserReward(user)
482+ let uReward = $t01432714380._1
483+ let newLpInterest = $t01432714380._2
480484 [IntegerEntry((user + kUserLpInterest), newLpInterest), IntegerEntry((user + kUserLpAvailableClaim), (userAvailableClaim + uReward)), IntegerEntry(kLpInterest, newLpInterest), IntegerEntry(kLpInterestHeight, height)]
481485 })
482486
513517 else false)
514518 then throw("rewards alredy updated in this period")
515519 else {
516- let $t01580915902 = getTotalSupplyAllTokens()
517- let totalSupply = $t01580915902._1
518- let totalSupplyUsd = $t01580915902._2
519- let totalSupplyUsdAll = $t01580915902._3
520- let utilization = $t01580915902._4
520+ let $t01591816011 = getTotalSupplyAllTokens()
521+ let totalSupply = $t01591816011._1
522+ let totalSupplyUsd = $t01591816011._2
523+ let totalSupplyUsdAll = $t01591816011._3
524+ let utilization = $t01591816011._4
521525 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 $t01608116118 = a
527+ let weights = $t01608116118._1
528+ let totalWeight = $t01608116118._2
529+ let index = $t01608116118._3
526530 let share = fraction(totalSupplyUsd[index], SCALE8, totalSupplyUsdAll)
527531 let newWeight = fraction(share, utilization[index], SCALE8)
528532 $Tuple3((weights :+ newWeight), (totalWeight + newWeight), (index + 1))
529533 }
530534
531- let $t01621516300 = {
535+ let $t01632416409 = {
532536 let $l = getAllTokens()
533537 let $s = size($l)
534538 let $acc0 = $Tuple3(nil, 0, 0)
542546
543547 $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)
544548 }
545- let newWeights = $t01621516300._1
546- let totalNewWeight = $t01621516300._2
549+ let newWeights = $t01632416409._1
550+ let totalNewWeight = $t01632416409._2
547551 let axlyPrice = getAxlyPriceOnSwopfi()
548552 let axlyPrecision = getAssetPrecision(axlyId)
549553 let maxAPR = getAdoptedAPRByPeriod(curPeriod, LENDERS_APR_PERIODS, LENDERS_APR)
550554 func updateReward (a,tokenId) = {
551- let $t01655016594 = a
552- let enteries = $t01655016594._1
553- let totalPeriodReward = $t01655016594._2
554- let index = $t01655016594._3
555+ let $t01665916703 = a
556+ let enteries = $t01665916703._1
557+ let totalPeriodReward = $t01665916703._2
558+ let index = $t01665916703._3
555559 if ((totalSupply[index] == 0))
556560 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))
557561 else {
572576 }
573577 }
574578
575- let $t01827918371 = {
579+ let $t01838818480 = {
576580 let $l = getAllTokens()
577581 let $s = size($l)
578582 let $acc0 = $Tuple3(nil, 0, 0)
586590
587591 $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)
588592 }
589- let tokensEnteries = $t01827918371._1
590- let totalTokenReward = $t01827918371._2
593+ let tokensEnteries = $t01838818480._1
594+ let totalTokenReward = $t01838818480._2
591595 let burnLend = (lendMaxPeriodAmount - totalTokenReward)
592596 let inv = invoke(tokenContract, "withdrawLendReward", [burnLend, toString(this)], nil)
593597 if ((inv == inv))
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
108+let AXLY_MONEY_BOX = addressFromStringValue(getStringValue(CONF, "money_box"))
109+
108110 let axlyId = valueOrErrorMessage(getString(tokenContract, kAXLYTokenId), "Can't get Axly token id")
109111
110112 let startHeight = getIntegerValue(this, kStartHeight)
111113
112114 let periodLength = getIntegerValue(this, kPeriodLength)
113115
114116 let lendMaxAmount = getIntegerValue(tokenContract, kLendersMaxAmount)
115117
116118 let lendMaxPeriodAmount = (lendMaxAmount / LENDERS_MAX_PERIODS)
117119
118120 let lpMaxAmount = getIntegerValue(tokenContract, kLPMaxAmount)
119121
120122 let lpMaxPeriodAmount = (lpMaxAmount / LP_MAX_PERIODS)
121123
122124 func isAdminCall (i) = if (containsElement([admin1PK, admin2PK, admin3PK], i.callerPublicKey))
123125 then unit
124126 else throw("Only admin group1 can call this function")
125127
126128
127129 func isSelfCall (i) = if ((i.caller == this))
128130 then unit
129131 else throw("Only contract itself can call this function")
130132
131133
132-func isOperatorCall (i) = if ((i.callerPublicKey == operatorPK))
134+func isOperatorCall (i) = if (if ((i.callerPublicKey == operatorPK))
135+ then true
136+ else (i.caller == AXLY_MONEY_BOX))
133137 then unit
134138 else throw("Only operator can call this function")
135139
136140
137141 func isLandCall (i) = if ((i.caller == lendContract))
138142 then unit
139143 else throw("Only land contract can call this function")
140144
141145
142146 func isSFFarmingCall (i) = if ((i.caller == sfFarmingContract))
143147 then unit
144148 else throw("Only land contract can call this function")
145149
146150
147151 func getAllTokens () = {
148152 let tokens = valueOrElse(getString(this, kTokens), "")
149153 if ((tokens == ""))
150154 then nil
151155 else split(tokens, ",")
152156 }
153157
154158
155159 func getAssetPrice (assetId) = getIntegerValue(priceOracleAddr, (assetId + kPriceInOracle))
156160
157161
158162 func getAssetDecimals (assetId) = if ((assetId == "WAVES"))
159163 then 8
160164 else match assetInfo(fromBase58String(assetId)) {
161165 case asset: Asset =>
162166 asset.decimals
163167 case _ =>
164168 throw("Can't find asset")
165169 }
166170
167171
168172 func getAssetPrecision (assetId) = pow(10, 0, getAssetDecimals(assetId), 0, 0, DOWN)
169173
170174
171175 func getAdoptedAPRByPeriod (period,aprPeriods,apr) = {
172176 func for (a,aperiod) = {
173- let $t052105232 = a
174- let index = $t052105232._1
175- let found = $t052105232._2
177+ let $t053195341 = a
178+ let index = $t053195341._1
179+ let found = $t053195341._2
176180 let ft = split(aperiod, "-")
177- let $t052695332 = $Tuple2(parseIntValue(ft[0]), parseIntValue(ft[1]))
178- let from = $t052695332._1
179- let to = $t052695332._2
181+ let $t053785441 = $Tuple2(parseIntValue(ft[0]), parseIntValue(ft[1]))
182+ let from = $t053785441._1
183+ let to = $t053785441._2
180184 if (found)
181185 then a
182186 else if (if ((period >= from))
183187 then (to >= period)
184188 else false)
185189 then $Tuple2(index, true)
186190 else $Tuple2((index + 1), false)
187191 }
188192
189- let $t054695535 = {
193+ let $t055785644 = {
190194 let $l = LENDERS_APR_PERIODS
191195 let $s = size($l)
192196 let $acc0 = $Tuple2(0, false)
193197 func $f0_1 ($a,$i) = if (($i >= $s))
194198 then $a
195199 else for($a, $l[$i])
196200
197201 func $f0_2 ($a,$i) = if (($i >= $s))
198202 then $a
199203 else throw("List size exceeds 9")
200204
201205 $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)
202206 }
203- let index = $t054695535._1
204- let found = $t054695535._2
207+ let index = $t055785644._1
208+ let found = $t055785644._2
205209 if (found)
206210 then fraction((LENDERS_APR[index] * SCALE8), 7, 365)
207211 else 0
208212 }
209213
210214
211215 func getTotalSupplyAllTokens () = {
212216 func for (a,tokenId) = {
213- let $t057345803 = a
214- let totalSupply = $t057345803._1
215- let totalSupplyUsd = $t057345803._2
216- let totalSupplyUsdAll = $t057345803._3
217- let utilization = $t057345803._4
217+ let $t058435912 = a
218+ let totalSupply = $t058435912._1
219+ let totalSupplyUsd = $t058435912._2
220+ let totalSupplyUsdAll = $t058435912._3
221+ let utilization = $t058435912._4
218222 let tSupply = valueOrElse(getInteger(lendContract, (kLendTokenSupply + tokenId)), 0)
219223 let tBorrow = valueOrElse(getInteger(lendContract, (kLendTokenBorrowed + tokenId)), 0)
220224 let assetPrice = getAssetPrice(tokenId)
221225 let assetPrecision = getAssetPrecision(tokenId)
222226 let tSupplyUsd = fraction(tSupply, assetPrice, assetPrecision)
223227 let u = if (if ((tSupply == 0))
224228 then true
225229 else (tBorrow == 0))
226230 then 0
227231 else fraction(tBorrow, SCALE8, tSupply)
228232 $Tuple4((totalSupply :+ tSupply), (totalSupplyUsd :+ tSupplyUsd), (totalSupplyUsdAll + tSupplyUsd), (utilization :+ u))
229233 }
230234
231235 let $l = getAllTokens()
232236 let $s = size($l)
233237 let $acc0 = $Tuple4(nil, nil, 0, nil)
234238 func $f0_1 ($a,$i) = if (($i >= $s))
235239 then $a
236240 else for($a, $l[$i])
237241
238242 func $f0_2 ($a,$i) = if (($i >= $s))
239243 then $a
240244 else throw("List size exceeds 30")
241245
242246 $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)
243247 }
244248
245249
246250 func getTotalSupplyUsd (tokenId) = {
247251 let tSupply = valueOrElse(getInteger(lendContract, (kLendTokenSupply + tokenId)), 0)
248252 let assetPrice = getAssetPrice(tokenId)
249253 let assetPrecision = getAssetPrecision(tokenId)
250254 fraction(tSupply, assetPrice, assetPrecision)
251255 }
252256
253257
254258 func calcNewTokenInterest (tokenId,totalSupply) = if ((startHeight >= height))
255259 then 0
256260 else {
257261 let rewardPerBlock = getIntegerValue(this, (tokenId + kTokenRewardPerBlock))
258262 let oldInterest = getIntegerValue(this, (tokenId + kTokenInterest))
259263 let updateHeight = getIntegerValue(this, (tokenId + kTokenInterestHeight))
260264 let reward = ((height - updateHeight) * rewardPerBlock)
261265 let interest = if ((totalSupply > 0))
262266 then fraction(reward, SCALE8, totalSupply)
263267 else 0
264268 (oldInterest + interest)
265269 }
266270
267271
268272 func calcNewLpInterest (totalSupply) = if ((startHeight >= height))
269273 then 0
270274 else {
271275 let rewardPerBlock = valueOrElse(getInteger(this, kLpRewardPerBlock), 0)
272276 let oldInterest = valueOrElse(getInteger(this, kLpInterest), 0)
273277 let updateHeight = valueOrElse(getInteger(this, kLpInterestHeight), height)
274278 let reward = ((height - updateHeight) * rewardPerBlock)
275279 let interest = if ((totalSupply > 0))
276280 then fraction(reward, SCALE8, totalSupply)
277281 else 0
278282 (oldInterest + interest)
279283 }
280284
281285
282286 func calcLendUserReward (user,tokenId) = {
283287 let totalSupply = valueOrElse(getInteger(lendContract, (kLendTokenSupply + tokenId)), 0)
284288 let tokenInterest = calcNewTokenInterest(tokenId, totalSupply)
285289 let userSupply = valueOrElse(getInteger(lendContract, ((user + kLendUserSupply) + tokenId)), 0)
286290 let userTokenInterest = valueOrElse(getInteger(this, (((tokenId + "_") + user) + kUserLendInterest)), if ((userSupply == 0))
287291 then tokenInterest
288292 else 0)
289293 let reward = fraction(userSupply, (tokenInterest - userTokenInterest), SCALE8)
290294 $Tuple3(reward, tokenInterest, userSupply)
291295 }
292296
293297
294298 func calcLpUserReward (user) = {
295299 let totalSupply = valueOrElse(getInteger(sfFarmingContract, (axlyPool + kSFTotalSupply)), 0)
296300 let tokenInterest = calcNewLpInterest(totalSupply)
297301 let userSupply = valueOrElse(getInteger(sfFarmingContract, (((axlyPool + "_") + user) + kSFUserTotalSupply)), 0)
298302 let userTokenInterest = valueOrElse(getInteger(this, (user + kUserLpInterest)), if ((userSupply == 0))
299303 then tokenInterest
300304 else 0)
301305 let reward = fraction(userSupply, (tokenInterest - userTokenInterest), SCALE8)
302306 $Tuple3(reward, tokenInterest, userSupply)
303307 }
304308
305309
306310 func claimLenderRewardsCommon (user,readOnly) = {
307311 func claim (a,tokenId) = {
308- let $t088978941 = a
309- let tokenIds = $t088978941._1
310- let cAmount = $t088978941._2
311- let total = $t088978941._3
312- let enteries = $t088978941._4
312+ let $t090069050 = a
313+ let tokenIds = $t090069050._1
314+ let cAmount = $t090069050._2
315+ let total = $t090069050._3
316+ let enteries = $t090069050._4
313317 let userAvailableClaim = valueOrElse(getInteger(this, (((tokenId + "_") + user) + kUserLendAvailableClaim)), 0)
314- let $t090549133 = calcLendUserReward(user, tokenId)
315- let uReward = $t090549133._1
316- let newTokenInterest = $t090549133._2
317- let userSupply = $t090549133._3
318+ let $t091639242 = calcLendUserReward(user, tokenId)
319+ let uReward = $t091639242._1
320+ let newTokenInterest = $t091639242._2
321+ let userSupply = $t091639242._3
318322 let totalToClaim = (userAvailableClaim + uReward)
319323 if (if ((totalToClaim > 0))
320324 then true
321325 else (userSupply > 0))
322326 then {
323327 let newEntreries = if (if (readOnly)
324328 then true
325329 else (totalToClaim == 0))
326330 then enteries
327331 else (enteries ++ [IntegerEntry((((tokenId + "_") + user) + kUserLendInterest), newTokenInterest), IntegerEntry((((tokenId + "_") + user) + kUserLendAvailableClaim), 0), IntegerEntry((tokenId + kTokenInterest), newTokenInterest), IntegerEntry((tokenId + kTokenInterestHeight), height)])
328332 $Tuple4((tokenIds :+ tokenId), (cAmount :+ totalToClaim), (total + totalToClaim), newEntreries)
329333 }
330334 else $Tuple4(tokenIds, cAmount, total, enteries)
331335 }
332336
333337 let $l = getAllTokens()
334338 let $s = size($l)
335339 let $acc0 = $Tuple4(nil, nil, 0, nil)
336340 func $f0_1 ($a,$i) = if (($i >= $s))
337341 then $a
338342 else claim($a, $l[$i])
339343
340344 func $f0_2 ($a,$i) = if (($i >= $s))
341345 then $a
342346 else throw("List size exceeds 30")
343347
344348 $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)
345349 }
346350
347351
348352 func claimLpRewardsCommon (user,readOnly) = {
349353 let userAvailableClaim = valueOrElse(getInteger(this, (user + kUserLpAvailableClaim)), 0)
350- let $t01006410129 = calcLpUserReward(user)
351- let uReward = $t01006410129._1
352- let newLpInterest = $t01006410129._2
353- let userSupply = $t01006410129._3
354+ let $t01017310238 = calcLpUserReward(user)
355+ let uReward = $t01017310238._1
356+ let newLpInterest = $t01017310238._2
357+ let userSupply = $t01017310238._3
354358 let totalToClaim = (userAvailableClaim + uReward)
355359 if (if (readOnly)
356360 then true
357361 else (totalToClaim == 0))
358362 then $Tuple2(totalToClaim, nil)
359363 else $Tuple2(totalToClaim, [IntegerEntry((user + kUserLpInterest), newLpInterest), IntegerEntry((user + kUserLpAvailableClaim), 0), IntegerEntry(kLpInterest, newLpInterest), IntegerEntry(kLpInterestHeight, height)])
360364 }
361365
362366
363367 func getAxlyPriceOnSwopfi () = {
364368 let aBalance = getIntegerValue(addressFromStringValue(axlyPool), "A_asset_balance")
365369 let bBalance = getIntegerValue(addressFromStringValue(axlyPool), "B_asset_balance")
366370 let wPrice = getAssetPrice("WAVES")
367371 fraction(bBalance, wPrice, aBalance)
368372 }
369373
370374
371375 func getAxlySharePrice () = {
372376 let poolAddr = addressFromStringValue(axlyPool)
373377 let aBalance = getIntegerValue(addressFromStringValue(axlyPool), "A_asset_balance")
374378 let bBalance = getIntegerValue(addressFromStringValue(axlyPool), "B_asset_balance")
375379 let dPriceA = getAxlyPriceOnSwopfi()
376380 let dPriceB = getAssetPrice("WAVES")
377381 if (if ((0 > dPriceA))
378382 then true
379383 else (0 > dPriceB))
380384 then -1
381385 else {
382386 let shareSupply = valueOrErrorMessage(getIntegerValue(poolAddr, "share_asset_supply"), "Can't get share asset supply")
383387 let APrecision = pow(10, 0, 8, 0, 0, DOWN)
384388 let BPrecision = pow(10, 0, 8, 0, 0, DOWN)
385389 let sharePrecision = pow(10, 0, 8, 0, 0, DOWN)
386390 let sum = (fraction(aBalance, dPriceA, APrecision) + fraction(bBalance, dPriceB, BPrecision))
387391 fraction(sum, sharePrecision, shareSupply)
388392 }
389393 }
390394
391395
392396 func getTokensAPRs () = {
393397 let axlyPrice = getAxlyPriceOnSwopfi()
394398 let axlyPrecision = getAssetPrecision(axlyId)
395399 func tokensAprs (apr,tokenId) = {
396400 let rwpb = valueOrElse(getInteger(this, (tokenId + kTokenRewardPerBlock)), 0)
397401 let rwpbUsd = fraction(rwpb, axlyPrice, axlyPrecision)
398402 let rwYear = ((rwpbUsd * periodLength) * 52)
399403 let totalSupplyUsd = getTotalSupplyUsd(tokenId)
400404 (apr :+ fraction(rwYear, SCALE8, totalSupplyUsd))
401405 }
402406
403407 let aprs = {
404408 let $l = getAllTokens()
405409 let $s = size($l)
406410 let $acc0 = nil
407411 func $f0_1 ($a,$i) = if (($i >= $s))
408412 then $a
409413 else tokensAprs($a, $l[$i])
410414
411415 func $f0_2 ($a,$i) = if (($i >= $s))
412416 then $a
413417 else throw("List size exceeds 30")
414418
415419 $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)
416420 }
417421 let lpTotalSupply = getIntegerValue(sfFarmingContract, (axlyPool + kSFTotalSupply))
418422 let lpId = getStringValue(addressFromStringValue(axlyPool), kLpId)
419423 let lpPrecision = getAssetPrecision(lpId)
420424 let lpPrice = getAxlySharePrice()
421425 let lpTotalSupplyUsd = fraction(lpTotalSupply, lpPrice, lpPrecision)
422426 let rwpb = valueOrElse(getInteger(this, kLpRewardPerBlock), 0)
423427 let rwpbUsd = fraction(rwpb, axlyPrice, axlyPrecision)
424428 let rwYear = ((rwpbUsd * periodLength) * 52)
425429 let lpApr = fraction(rwYear, SCALE8, lpTotalSupplyUsd)
426430 $Tuple3(getAllTokens(), aprs, lpApr)
427431 }
428432
429433
430434 func getTokenUtilization (assetId) = 0
431435
432436
433437 @Callable(i)
434438 func claimLenderRewards () = {
435439 let claimRes = claimLenderRewardsCommon(toString(i.caller), false)
436440 if ((claimRes._3 == 0))
437441 then throw("claim amount must be greater than 0")
438442 else {
439443 let inv = invoke(tokenContract, "withdrawLendReward", [claimRes._3, toString(i.caller)], nil)
440444 if ((inv == inv))
441445 then claimRes._4
442446 else throw("Strict value is not equal to itself.")
443447 }
444448 }
445449
446450
447451
448452 @Callable(i)
449453 func claimLpRewards () = {
450454 let claimRes = claimLpRewardsCommon(toString(i.caller), false)
451455 if ((claimRes._1 == 0))
452456 then throw("claim amount must be greater than 0")
453457 else {
454458 let inv = invoke(tokenContract, "withdrawLpReward", [claimRes._1, toString(i.caller)], nil)
455459 if ((inv == inv))
456460 then claimRes._2
457461 else throw("Strict value is not equal to itself.")
458462 }
459463 }
460464
461465
462466
463467 @Callable(i)
464468 func lendAction (user,tokenId) = valueOrElse(isLandCall(i), {
465469 let userAvailableClaim = valueOrElse(getInteger(this, (((tokenId + "_") + user) + kUserLendAvailableClaim)), 0)
466- let $t01367913746 = calcLendUserReward(user, tokenId)
467- let uReward = $t01367913746._1
468- let newTokenInterest = $t01367913746._2
470+ let $t01378813855 = calcLendUserReward(user, tokenId)
471+ let uReward = $t01378813855._1
472+ let newTokenInterest = $t01378813855._2
469473 [IntegerEntry((((tokenId + "_") + user) + kUserLendInterest), newTokenInterest), IntegerEntry((((tokenId + "_") + user) + kUserLendAvailableClaim), (userAvailableClaim + uReward)), IntegerEntry((tokenId + kTokenInterest), newTokenInterest), IntegerEntry((tokenId + kTokenInterestHeight), height)]
470474 })
471475
472476
473477
474478 @Callable(i)
475479 func lpAction (user) = valueOrElse(isSFFarmingCall(i), {
476480 let userAvailableClaim = valueOrElse(getInteger(this, (user + kUserLpAvailableClaim)), 0)
477- let $t01421814271 = calcLpUserReward(user)
478- let uReward = $t01421814271._1
479- let newLpInterest = $t01421814271._2
481+ let $t01432714380 = calcLpUserReward(user)
482+ let uReward = $t01432714380._1
483+ let newLpInterest = $t01432714380._2
480484 [IntegerEntry((user + kUserLpInterest), newLpInterest), IntegerEntry((user + kUserLpAvailableClaim), (userAvailableClaim + uReward)), IntegerEntry(kLpInterest, newLpInterest), IntegerEntry(kLpInterestHeight, height)]
481485 })
482486
483487
484488
485489 @Callable(i)
486490 func init (axlyPoolAddr,farmingStartHeight,periodLength) = valueOrElse(isSelfCall(i), [StringEntry(kAxlyPool, axlyPoolAddr), IntegerEntry(kStartHeight, farmingStartHeight), IntegerEntry(kPeriodLength, periodLength)])
487491
488492
489493
490494 @Callable(i)
491495 func initNewToken (tokenId) = valueOrElse(isAdminCall(i), if (isDefined(getInteger(this, (tokenId + kTokenInterest))))
492496 then throw("token already inited")
493497 else if (!(contains(getStringValue(lendContract, kLendSetupTokens), tokenId)))
494498 then throw("no token on landing")
495499 else {
496500 let newAllTokens = (getAllTokens() :+ tokenId)
497501 [IntegerEntry((tokenId + kTokenInterest), 0), IntegerEntry((tokenId + kTokenInterestHeight), max([startHeight, height])), StringEntry(kTokens, makeString(newAllTokens, ",")), IntegerEntry((tokenId + kTokenRewardPerBlock), 0)]
498502 })
499503
500504
501505
502506 @Callable(i)
503507 func updateRewards () = valueOrElse(isOperatorCall(i), {
504508 let lastUpdatePeriod = valueOrElse(getInteger(this, kLastUpdatePeriod), 0)
505509 let calcPeriod = (((height - startHeight) / periodLength) + 1)
506510 let curPeriod = if ((0 >= calcPeriod))
507511 then 1
508512 else calcPeriod
509513 if ((curPeriod > 104))
510514 then throw("max period is 104")
511515 else if (if ((lastUpdatePeriod >= curPeriod))
512516 then (lastUpdatePeriod != 0)
513517 else false)
514518 then throw("rewards alredy updated in this period")
515519 else {
516- let $t01580915902 = getTotalSupplyAllTokens()
517- let totalSupply = $t01580915902._1
518- let totalSupplyUsd = $t01580915902._2
519- let totalSupplyUsdAll = $t01580915902._3
520- let utilization = $t01580915902._4
520+ let $t01591816011 = getTotalSupplyAllTokens()
521+ let totalSupply = $t01591816011._1
522+ let totalSupplyUsd = $t01591816011._2
523+ let totalSupplyUsdAll = $t01591816011._3
524+ let utilization = $t01591816011._4
521525 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 $t01608116118 = a
527+ let weights = $t01608116118._1
528+ let totalWeight = $t01608116118._2
529+ let index = $t01608116118._3
526530 let share = fraction(totalSupplyUsd[index], SCALE8, totalSupplyUsdAll)
527531 let newWeight = fraction(share, utilization[index], SCALE8)
528532 $Tuple3((weights :+ newWeight), (totalWeight + newWeight), (index + 1))
529533 }
530534
531- let $t01621516300 = {
535+ let $t01632416409 = {
532536 let $l = getAllTokens()
533537 let $s = size($l)
534538 let $acc0 = $Tuple3(nil, 0, 0)
535539 func $f0_1 ($a,$i) = if (($i >= $s))
536540 then $a
537541 else getNewWights($a, $l[$i])
538542
539543 func $f0_2 ($a,$i) = if (($i >= $s))
540544 then $a
541545 else throw("List size exceeds 30")
542546
543547 $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)
544548 }
545- let newWeights = $t01621516300._1
546- let totalNewWeight = $t01621516300._2
549+ let newWeights = $t01632416409._1
550+ let totalNewWeight = $t01632416409._2
547551 let axlyPrice = getAxlyPriceOnSwopfi()
548552 let axlyPrecision = getAssetPrecision(axlyId)
549553 let maxAPR = getAdoptedAPRByPeriod(curPeriod, LENDERS_APR_PERIODS, LENDERS_APR)
550554 func updateReward (a,tokenId) = {
551- let $t01655016594 = a
552- let enteries = $t01655016594._1
553- let totalPeriodReward = $t01655016594._2
554- let index = $t01655016594._3
555+ let $t01665916703 = a
556+ let enteries = $t01665916703._1
557+ let totalPeriodReward = $t01665916703._2
558+ let index = $t01665916703._3
555559 if ((totalSupply[index] == 0))
556560 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))
557561 else {
558562 let share = fraction(newWeights[index], SCALE8, totalNewWeight)
559563 let maxReward = fraction(share, lendMaxPeriodAmount, SCALE8)
560564 let maxRewardUsd = fraction(maxReward, axlyPrice, axlyPrecision)
561565 let prevTotalSupply = valueOrElse(getInteger(this, (tokenId + kPrevLendTokenSupply)), 0)
562566 let rtCoef = if (if ((prevTotalSupply == 0))
563567 then true
564568 else (totalSupply[index] == 0))
565569 then 0
566570 else (fraction(totalSupply[index], SCALE8, prevTotalSupply) - SCALE8)
567571 let reward = ((min([(maxAPR * (SCALE8 + max([rtCoef, 0]))), fraction(maxAPR, (15 * SCALE8), 10)]) / SCALE8) / 100)
568572 let rewardUsd = min([maxRewardUsd, fraction(totalSupplyUsd[index], reward, SCALE8)])
569573 let rewardPeriod = fraction(rewardUsd, axlyPrecision, axlyPrice)
570574 let rewardPerBlock = (rewardPeriod / periodLength)
571575 $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))
572576 }
573577 }
574578
575- let $t01827918371 = {
579+ let $t01838818480 = {
576580 let $l = getAllTokens()
577581 let $s = size($l)
578582 let $acc0 = $Tuple3(nil, 0, 0)
579583 func $f1_1 ($a,$i) = if (($i >= $s))
580584 then $a
581585 else updateReward($a, $l[$i])
582586
583587 func $f1_2 ($a,$i) = if (($i >= $s))
584588 then $a
585589 else throw("List size exceeds 30")
586590
587591 $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)
588592 }
589- let tokensEnteries = $t01827918371._1
590- let totalTokenReward = $t01827918371._2
593+ let tokensEnteries = $t01838818480._1
594+ let totalTokenReward = $t01838818480._2
591595 let burnLend = (lendMaxPeriodAmount - totalTokenReward)
592596 let inv = invoke(tokenContract, "withdrawLendReward", [burnLend, toString(this)], nil)
593597 if ((inv == inv))
594598 then (([IntegerEntry(kLpRewardPerBlock, 0), ScriptTransfer(axlyBurnAddr, burnLend, fromBase58String(axlyId))] ++ tokensEnteries) :+ IntegerEntry(kLastUpdatePeriod, curPeriod))
595599 else throw("Strict value is not equal to itself.")
596600 }
597601 })
598602
599603
600604 @Verifier(tx)
601605 func verify () = {
602606 let multiSignedByAdmins = {
603607 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], admin1PK))
604608 then 1
605609 else 0
606610 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], admin2PK))
607611 then 1
608612 else 0
609613 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], admin3PK))
610614 then 1
611615 else 0
612616 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
613617 }
614618 match tx {
615619 case inv: InvokeScriptTransaction =>
616620 let isSelf = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
617621 let isRightFee = if ((inv.fee == 900000))
618622 then (inv.feeAssetId == unit)
619623 else false
620624 let isInitCall = (inv.function == "init")
621625 let isnoPayments = (size(inv.payments) == 0)
622626 if (if (if (if (isRightFee)
623627 then isInitCall
624628 else false)
625629 then isSelf
626630 else false)
627631 then isnoPayments
628632 else false)
629633 then true
630634 else multiSignedByAdmins
631635 case _ =>
632636 multiSignedByAdmins
633637 }
634638 }
635639

github/deemru/w8io/3ef1775 
103.25 ms