tx · CFhZzZ6MY7TwbdvfGoJJbqUaEGbABsr8SUHyewKHNDK2

3N2M4PztorHwrfENp7D6LhYGgGodjiD1fjn:  -0.02400000 Waves

2023.08.21 10:36 [2720103] smart account 3N2M4PztorHwrfENp7D6LhYGgGodjiD1fjn > SELF 0.00000000 Waves

{ "type": 13, "id": "CFhZzZ6MY7TwbdvfGoJJbqUaEGbABsr8SUHyewKHNDK2", "fee": 2400000, "feeAssetId": null, "timestamp": 1692603377240, "version": 2, "chainId": 84, "sender": "3N2M4PztorHwrfENp7D6LhYGgGodjiD1fjn", "senderPublicKey": "Fj9LPkCtmW3pDnVU6wPQnvqpZJCBieWSvZqY5FAGeCyp", "proofs": [ "3i5ymQxPNVkYZMuYguTuKTCPxZcVQwjfuBNrkp4HUgUwWsy93zaFzkEFSgfbWbD18UxygStPuW2t3buE3E8sgDm9", "43JEWYkmTviTm93C64PrimyHpwQq2NH1Pinm4JTcxy2KsXzVfRtDuxBchCYhFRbVha6x2sirQoeNPcNsbjaieF1L" ], "script": "base64:BgIhCAISABIAEgQKAggIEgMKAQgSBwoFCAgIAQESAwoBCBIAUAAGU0NBTEU4AIDC1y8AC0xFTkRFUlNfQVBSCQDMCAIAlgEJAMwIAgB4CQDMCAIAZAkAzAgCAFAJAMwIAgA8CQDMCAIAKAkAzAgCAB4JAMwIAgAUCQDMCAIACgUDbmlsABNMRU5ERVJTX0FQUl9QRVJJT0RTCQDMCAICAzEtMQkAzAgCAgMyLTIJAMwIAgIDMy0zCQDMCAICAzQtNAkAzAgCAgM1LTgJAMwIAgIEOS0xMgkAzAgCAgUxNC0xNgkAzAgCAgUxNy0yMAkAzAgCAgYyMC0xMDQFA25pbAATTEVOREVSU19NQVhfUEVSSU9EUwBoAAZMUF9BUFIJAMwIAgCWAQkAzAgCAHgJAMwIAgBkCQDMCAIAUAkAzAgCADwJAMwIAgAoBQNuaWwADkxQX0FQUl9QRVJJT0RTCQDMCAICAzEtMQkAzAgCAgMyLTIJAMwIAgIDMy0zCQDMCAICAzQtNAkAzAgCAgM1LTgJAMwIAgIEOS0xMgUDbmlsAA5MUF9NQVhfUEVSSU9EUwAMAAxrU3RhcnRIZWlnaHQCC3N0YXJ0SGVpZ2h0AA1rUGVyaW9kTGVuZ3RoAgxwZXJpb2RMZW5ndGgAEWtMZW5kZXJzTWF4QW1vdW50AhFsZW5kUmV3YXJkc0Ftb3VudAAMa0xQTWF4QW1vdW50Ag5scFJld2FyZEFtb3VudAAHa1Rva2VucwIGdG9rZW5zAAtrVXNlclN1cHBseQIQX3VzZXJUb3RhbFN1cHBseQAOa1Rva2VuSW50ZXJlc3QCDl90b2tlbkludGVyZXN0ABRrVG9rZW5JbnRlcmVzdEhlaWdodAIUX3Rva2VuSW50ZXJlc3RIZWlnaHQAFGtUb2tlblJld2FyZFBlckJsb2NrAhRfdG9rZW5SZXdhcmRQZXJCbG9jawARa0xhc3RVcGRhdGVQZXJpb2QCEnJld2FyZFVwZGF0ZVBlcmlvZAARa1VzZXJMZW5kSW50ZXJlc3QCEV91c2VyTGFuZEludGVyZXN0ABdrVXNlckxlbmRBdmFpbGFibGVDbGFpbQIXX3VzZXJMZW5kQXZhaWxhYmxlQ2xhaW0AFWtVc2VyTHBBdmFpbGFibGVDbGFpbQIVX3VzZXJMcEF2YWlsYWJsZUNsYWltAAtrTHBJbnRlcmVzdAIKbHBJbnRlcmVzdAARa0xwSW50ZXJlc3RIZWlnaHQCEGxwSW50ZXJlc3RIZWlnaHQADWtQcmV2TFBTdXBwbHkCEXByZXZMUFRvdGFsU3VwcGx5ABFrTHBSZXdhcmRQZXJCbG9jawIQbHBSZXdhcmRQZXJCbG9jawAPa1VzZXJMcEludGVyZXN0Ag9fdXNlckxwSW50ZXJlc3QADmtQcmljZUluT3JhY2xlAgdfdHdhcDVCABRrUHJldkxlbmRUb2tlblN1cHBseQIUX3ByZXZMZW5kVG90YWxTdXBwbHkADGtBWExZVG9rZW5JZAILYXhseVRva2VuSWQAEGtMZW5kVG9rZW5TdXBwbHkCD3RvdGFsX3N1cHBsaWVkXwAPa0xlbmRVc2VyU3VwcGx5Agpfc3VwcGxpZWRfABBrTGVuZFNldHVwVG9rZW5zAgxzZXR1cF90b2tlbnMADmtTRlRvdGFsU3VwcGx5AhpfdG90YWxfc2hhcmVfdG9rZW5zX2xvY2tlZAASa1NGVXNlclRvdGFsU3VwcGx5AhRfc2hhcmVfdG9rZW5zX2xvY2tlZAAJa0F4bHlQb29sAghheGx5UG9vbAAFa0xwSWQCDnNoYXJlX2Fzc2V0X2lkAAxrUHJpY2VPcmFjbGUCDHByaWNlX29yYWNsZQARa0F4bHlNYWluQ29udHJhY3QCDG1haW5Db250cmFjdAAWa0F4bHlUb2tlbm9taWNDb250cmFjdAIRdG9rZW5vbWljQ29udHJhY3QAEmtTRkZhcm1pbmdDb250cmFjdAITc3dvcGZpX2Zhcm1pbmdfYWRkcgANa0xlbmRDb250cmFjdAIRbGVuZF9zZXJ2aWNlX2FkZHIACWtBZG1pbjFQSwIVZ3JvdXAxX2FkbWluMV9wdWJfa2V5AAlrQWRtaW4yUEsCFWdyb3VwMV9hZG1pbjJfcHViX2tleQAJa0FkbWluM1BLAhVncm91cDFfYWRtaW4zX3B1Yl9rZXkAD2tPcGVyYXRvckNhbGxQSwISYWRtaW5fY2FsbF9wdWJfa2V5AAhheGx5UG9vbAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMFCWtBeGx5UG9vbAIWQ2FuJ3QgZ2V0IGF4bHlQb29sIGtleQAMbWFpbkNvbnRyYWN0CQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwURa0F4bHlNYWluQ29udHJhY3QCGUNhbid0IGdldCBtYWluQ29udGFjdCBrZXkADXRva2VuQ29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBRZrQXhseVRva2Vub21pY0NvbnRyYWN0Ah9DYW4ndCBnZXQgdG9rZW5vbWljQ29udHJhY3Qga2V5AAxsZW5kQ29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQxtYWluQ29udHJhY3QFDWtMZW5kQ29udHJhY3QCH0Nhbid0IGdldCBsZW5kX3NlcnZpY2VfYWRkciBrZXkAEXNmRmFybWluZ0NvbnRyYWN0CQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUMbWFpbkNvbnRyYWN0BRJrU0ZGYXJtaW5nQ29udHJhY3QCIUNhbid0IGdldCBzd29wZmlfZmFybWluZ19hZGRyIGtleQAPcHJpY2VPcmFjbGVBZGRyCQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUMbWFpbkNvbnRyYWN0BQxrUHJpY2VPcmFjbGUCGkNhbid0IGdldCBwcmljZV9vcmFjbGUga2V5AAhhZG1pbjFQSwkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUMbWFpbkNvbnRyYWN0BQlrQWRtaW4xUEsCEkNhbid0IGdldCBhZG1pbjFQSwAIYWRtaW4yUEsJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFDG1haW5Db250cmFjdAUJa0FkbWluMlBLAhJDYW4ndCBnZXQgYWRtaW4yUEsACGFkbWluM1BLCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQxtYWluQ29udHJhY3QFCWtBZG1pbjNQSwIUQ2FuJ3QgZ2V0IG9wZXJhdG9yUEsACm9wZXJhdG9yUEsJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMFD2tPcGVyYXRvckNhbGxQSwIUQ2FuJ3QgZ2V0IG9wZXJhdG9yUEsABmF4bHlJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFDXRva2VuQ29udHJhY3QFDGtBWExZVG9rZW5JZAIXQ2FuJ3QgZ2V0IEF4bHkgdG9rZW4gaWQAC3N0YXJ0SGVpZ2h0CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzBQxrU3RhcnRIZWlnaHQADHBlcmlvZExlbmd0aAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwUNa1BlcmlvZExlbmd0aAANbGVuZE1heEFtb3VudAkBEUBleHRyTmF0aXZlKDEwNTApAgUNdG9rZW5Db250cmFjdAURa0xlbmRlcnNNYXhBbW91bnQAE2xlbmRNYXhQZXJpb2RBbW91bnQJAGkCBQ1sZW5kTWF4QW1vdW50BRNMRU5ERVJTX01BWF9QRVJJT0RTAAtscE1heEFtb3VudAkBEUBleHRyTmF0aXZlKDEwNTApAgUNdG9rZW5Db250cmFjdAUMa0xQTWF4QW1vdW50ABFscE1heFBlcmlvZEFtb3VudAkAaQIFC2xwTWF4QW1vdW50BQ5MUF9NQVhfUEVSSU9EUwELaXNBZG1pbkNhbGwBAWkDCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQhhZG1pbjFQSwkAzAgCBQhhZG1pbjJQSwkAzAgCBQhhZG1pbjNQSwUDbmlsCAUBaQ9jYWxsZXJQdWJsaWNLZXkFBHVuaXQJAAIBAihPbmx5IGFkbWluIGdyb3VwMSBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uAQppc1NlbGZDYWxsAQFpAwkAAAIIBQFpBmNhbGxlcgUEdGhpcwUEdW5pdAkAAgECK09ubHkgY29udHJhY3QgaXRzZWxmIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24BDmlzT3BlcmF0b3JDYWxsAQFpAwkAAAIIBQFpD2NhbGxlclB1YmxpY0tleQUKb3BlcmF0b3JQSwUEdW5pdAkAAgECJE9ubHkgb3BlcmF0b3IgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgEKaXNMYW5kQ2FsbAEBaQMJAAACCAUBaQZjYWxsZXIFDGxlbmRDb250cmFjdAUEdW5pdAkAAgECKU9ubHkgbGFuZCBjb250cmFjdCBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uAQ9pc1NGRmFybWluZ0NhbGwBAWkDCQAAAggFAWkGY2FsbGVyBRFzZkZhcm1pbmdDb250cmFjdAUEdW5pdAkAAgECKU9ubHkgbGFuZCBjb250cmFjdCBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uAQxnZXRBbGxUb2tlbnMABAZ0b2tlbnMJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwUHa1Rva2VucwIAAwkAAAIFBnRva2VucwIABQNuaWwJALUJAgUGdG9rZW5zAgEsAQ1nZXRBc3NldFByaWNlAQdhc3NldElkCQERQGV4dHJOYXRpdmUoMTA1MCkCBQ9wcmljZU9yYWNsZUFkZHIJAKwCAgUHYXNzZXRJZAUOa1ByaWNlSW5PcmFjbGUBEGdldEFzc2V0RGVjaW1hbHMBB2Fzc2V0SWQDCQAAAgUHYXNzZXRJZAIFV0FWRVMACAQHJG1hdGNoMAkA7AcBCQDZBAEFB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIFQXNzZXQEBWFzc2V0BQckbWF0Y2gwCAUFYXNzZXQIZGVjaW1hbHMJAAIBAhBDYW4ndCBmaW5kIGFzc2V0ARFnZXRBc3NldFByZWNpc2lvbgEHYXNzZXRJZAkAbAYACgAACQEQZ2V0QXNzZXREZWNpbWFscwEFB2Fzc2V0SWQAAAAABQRET1dOARVnZXRBZG9wdGVkQVBSQnlQZXJpb2QDBnBlcmlvZAphcHJQZXJpb2RzA2FwcgoBA2ZvcgIBYQdhcGVyaW9kBAskdDA1MzYyNTM4NAUBYQQFaW5kZXgIBQskdDA1MzYyNTM4NAJfMQQFZm91bmQIBQskdDA1MzYyNTM4NAJfMgQCZnQJALUJAgUHYXBlcmlvZAIBLQQLJHQwNTQyMTU0ODQJAJQKAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmZ0AAAJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJmdAABBARmcm9tCAULJHQwNTQyMTU0ODQCXzEEAnRvCAULJHQwNTQyMTU0ODQCXzIDBQVmb3VuZAUBYQMDCQBnAgUGcGVyaW9kBQRmcm9tCQBnAgUCdG8FBnBlcmlvZAcJAJQKAgUFaW5kZXgGCQCUCgIJAGQCBQVpbmRleAABBwQLJHQwNTYyMTU2ODcKAAIkbAUTTEVOREVSU19BUFJfUEVSSU9EUwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgAABwoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEDZm9yAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA5CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJBAVpbmRleAgFCyR0MDU2MjE1Njg3Al8xBAVmb3VuZAgFCyR0MDU2MjE1Njg3Al8yAwUFZm91bmQJAGsDCQBoAgkAkQMCBQtMRU5ERVJTX0FQUgUFaW5kZXgFBlNDQUxFOAAHAO0CAAABF2dldFRvdGFsU3VwcGx5QWxsVG9rZW5zAAoBA2ZvcgIBYQd0b2tlbklkBAskdDA1ODc1NTkzMQUBYQQLdG90YWxTdXBwbHkIBQskdDA1ODc1NTkzMQJfMQQOdG90YWxTdXBwbHlVc2QIBQskdDA1ODc1NTkzMQJfMgQRdG90YWxTdXBwbHlVc2RBbGwIBQskdDA1ODc1NTkzMQJfMwQHdFN1cHBseQkBC3ZhbHVlT3JFbHNlAgkAmggCBQxsZW5kQ29udHJhY3QJAKwCAgUQa0xlbmRUb2tlblN1cHBseQUHdG9rZW5JZAAABAphc3NldFByaWNlCQENZ2V0QXNzZXRQcmljZQEFB3Rva2VuSWQEDmFzc2V0UHJlY2lzaW9uCQERZ2V0QXNzZXRQcmVjaXNpb24BBQd0b2tlbklkBAp0U3VwcGx5VXNkCQBrAwUHdFN1cHBseQUKYXNzZXRQcmljZQUOYXNzZXRQcmVjaXNpb24JAJUKAwkAzQgCBQt0b3RhbFN1cHBseQUHdFN1cHBseQkAzQgCBQ50b3RhbFN1cHBseVVzZAUKdFN1cHBseVVzZAkAZAIFEXRvdGFsU3VwcGx5VXNkQWxsBQp0U3VwcGx5VXNkCgACJGwJAQxnZXRBbGxUb2tlbnMACgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlQoDBQNuaWwFA25pbAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQNmb3ICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDMwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAAVABYAFwAYABkAGgAbABwAHQAeARFnZXRUb3RhbFN1cHBseVVzZAEHdG9rZW5JZAQHdFN1cHBseQkBC3ZhbHVlT3JFbHNlAgkAmggCBQxsZW5kQ29udHJhY3QJAKwCAgUQa0xlbmRUb2tlblN1cHBseQUHdG9rZW5JZAAABAphc3NldFByaWNlCQENZ2V0QXNzZXRQcmljZQEFB3Rva2VuSWQEDmFzc2V0UHJlY2lzaW9uCQERZ2V0QXNzZXRQcmVjaXNpb24BBQd0b2tlbklkCQBrAwUHdFN1cHBseQUKYXNzZXRQcmljZQUOYXNzZXRQcmVjaXNpb24BFGNhbGNOZXdUb2tlbkludGVyZXN0Agd0b2tlbklkC3RvdGFsU3VwcGx5AwkAZwIFC3N0YXJ0SGVpZ2h0BQZoZWlnaHQAAAQOcmV3YXJkUGVyQmxvY2sJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgUHdG9rZW5JZAUUa1Rva2VuUmV3YXJkUGVyQmxvY2sEC29sZEludGVyZXN0CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIFB3Rva2VuSWQFDmtUb2tlbkludGVyZXN0BAx1cGRhdGVIZWlnaHQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgUHdG9rZW5JZAUUa1Rva2VuSW50ZXJlc3RIZWlnaHQEBnJld2FyZAkAaAIJAGUCBQZoZWlnaHQFDHVwZGF0ZUhlaWdodAUOcmV3YXJkUGVyQmxvY2sECGludGVyZXN0AwkAZgIFC3RvdGFsU3VwcGx5AAAJAGsDBQZyZXdhcmQFBlNDQUxFOAULdG90YWxTdXBwbHkAAAkAZAIFC29sZEludGVyZXN0BQhpbnRlcmVzdAERY2FsY05ld0xwSW50ZXJlc3QBC3RvdGFsU3VwcGx5AwkAZwIFC3N0YXJ0SGVpZ2h0BQZoZWlnaHQAAAQOcmV3YXJkUGVyQmxvY2sJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwURa0xwUmV3YXJkUGVyQmxvY2sAAAQLb2xkSW50ZXJlc3QJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwULa0xwSW50ZXJlc3QAAAQMdXBkYXRlSGVpZ2h0CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFEWtMcEludGVyZXN0SGVpZ2h0BQZoZWlnaHQEBnJld2FyZAkAaAIJAGUCBQZoZWlnaHQFDHVwZGF0ZUhlaWdodAUOcmV3YXJkUGVyQmxvY2sECGludGVyZXN0AwkAZgIFC3RvdGFsU3VwcGx5AAAJAGsDBQZyZXdhcmQFBlNDQUxFOAULdG90YWxTdXBwbHkAAAkAZAIFC29sZEludGVyZXN0BQhpbnRlcmVzdAESY2FsY0xlbmRVc2VyUmV3YXJkAgR1c2VyB3Rva2VuSWQEC3RvdGFsU3VwcGx5CQELdmFsdWVPckVsc2UCCQCaCAIFDGxlbmRDb250cmFjdAkArAICBRBrTGVuZFRva2VuU3VwcGx5BQd0b2tlbklkAAAEDXRva2VuSW50ZXJlc3QJARRjYWxjTmV3VG9rZW5JbnRlcmVzdAIFB3Rva2VuSWQFC3RvdGFsU3VwcGx5BAp1c2VyU3VwcGx5CQELdmFsdWVPckVsc2UCCQCaCAIFDGxlbmRDb250cmFjdAkArAICCQCsAgIFBHVzZXIFD2tMZW5kVXNlclN1cHBseQUHdG9rZW5JZAAABBF1c2VyVG9rZW5JbnRlcmVzdAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICBQd0b2tlbklkAgFfBQR1c2VyBRFrVXNlckxlbmRJbnRlcmVzdAMJAAACBQp1c2VyU3VwcGx5AAAFDXRva2VuSW50ZXJlc3QAAAQGcmV3YXJkCQBrAwUKdXNlclN1cHBseQkAZQIFDXRva2VuSW50ZXJlc3QFEXVzZXJUb2tlbkludGVyZXN0BQZTQ0FMRTgJAJUKAwUGcmV3YXJkBQ10b2tlbkludGVyZXN0BQp1c2VyU3VwcGx5ARBjYWxjTHBVc2VyUmV3YXJkAQR1c2VyBAt0b3RhbFN1cHBseQkBC3ZhbHVlT3JFbHNlAgkAmggCBRFzZkZhcm1pbmdDb250cmFjdAkArAICBQhheGx5UG9vbAUOa1NGVG90YWxTdXBwbHkAAAQNdG9rZW5JbnRlcmVzdAkBEWNhbGNOZXdMcEludGVyZXN0AQULdG90YWxTdXBwbHkECnVzZXJTdXBwbHkJAQt2YWx1ZU9yRWxzZQIJAJoIAgURc2ZGYXJtaW5nQ29udHJhY3QJAKwCAgkArAICCQCsAgIFCGF4bHlQb29sAgFfBQR1c2VyBRJrU0ZVc2VyVG90YWxTdXBwbHkAAAQRdXNlclRva2VuSW50ZXJlc3QJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQR1c2VyBQ9rVXNlckxwSW50ZXJlc3QDCQAAAgUKdXNlclN1cHBseQAABQ10b2tlbkludGVyZXN0AAAEBnJld2FyZAkAawMFCnVzZXJTdXBwbHkJAGUCBQ10b2tlbkludGVyZXN0BRF1c2VyVG9rZW5JbnRlcmVzdAUGU0NBTEU4CQCVCgMFBnJld2FyZAUNdG9rZW5JbnRlcmVzdAUKdXNlclN1cHBseQEYY2xhaW1MZW5kZXJSZXdhcmRzQ29tbW9uAgR1c2VyCHJlYWRPbmx5CgEFY2xhaW0CAWEHdG9rZW5JZAQLJHQwODgyMDg4NjQFAWEECHRva2VuSWRzCAULJHQwODgyMDg4NjQCXzEEB2NBbW91bnQIBQskdDA4ODIwODg2NAJfMgQFdG90YWwIBQskdDA4ODIwODg2NAJfMwQIZW50ZXJpZXMIBQskdDA4ODIwODg2NAJfNAQSdXNlckF2YWlsYWJsZUNsYWltCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIFB3Rva2VuSWQCAV8FBHVzZXIFF2tVc2VyTGVuZEF2YWlsYWJsZUNsYWltAAAECyR0MDg5Nzc5MDU2CQESY2FsY0xlbmRVc2VyUmV3YXJkAgUEdXNlcgUHdG9rZW5JZAQHdVJld2FyZAgFCyR0MDg5Nzc5MDU2Al8xBBBuZXdUb2tlbkludGVyZXN0CAULJHQwODk3NzkwNTYCXzIECnVzZXJTdXBwbHkIBQskdDA4OTc3OTA1NgJfMwQMdG90YWxUb0NsYWltCQBkAgUSdXNlckF2YWlsYWJsZUNsYWltBQd1UmV3YXJkAwMJAGYCBQx0b3RhbFRvQ2xhaW0AAAYJAGYCBQp1c2VyU3VwcGx5AAAEDG5ld0VudHJlcmllcwMDBQhyZWFkT25seQYJAAACBQx0b3RhbFRvQ2xhaW0AAAUIZW50ZXJpZXMJAM4IAgUIZW50ZXJpZXMJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIFB3Rva2VuSWQCAV8FBHVzZXIFEWtVc2VyTGVuZEludGVyZXN0BRBuZXdUb2tlbkludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICBQd0b2tlbklkAgFfBQR1c2VyBRdrVXNlckxlbmRBdmFpbGFibGVDbGFpbQAACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFB3Rva2VuSWQFDmtUb2tlbkludGVyZXN0BRBuZXdUb2tlbkludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFB3Rva2VuSWQFFGtUb2tlbkludGVyZXN0SGVpZ2h0BQZoZWlnaHQFA25pbAkAlgoECQDNCAIFCHRva2VuSWRzBQd0b2tlbklkCQDNCAIFB2NBbW91bnQFDHRvdGFsVG9DbGFpbQkAZAIFBXRvdGFsBQx0b3RhbFRvQ2xhaW0FDG5ld0VudHJlcmllcwkAlgoEBQh0b2tlbklkcwUHY0Ftb3VudAUFdG90YWwFCGVudGVyaWVzCgACJGwJAQxnZXRBbGxUb2tlbnMACgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlgoEBQNuaWwFA25pbAAABQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBBWNsYWltAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAzMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgEUY2xhaW1McFJld2FyZHNDb21tb24CBHVzZXIIcmVhZE9ubHkEEnVzZXJBdmFpbGFibGVDbGFpbQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHVzZXIFFWtVc2VyTHBBdmFpbGFibGVDbGFpbQAABAwkdDA5OTg4MTAwNTMJARBjYWxjTHBVc2VyUmV3YXJkAQUEdXNlcgQHdVJld2FyZAgFDCR0MDk5ODgxMDA1MwJfMQQNbmV3THBJbnRlcmVzdAgFDCR0MDk5ODgxMDA1MwJfMgQKdXNlclN1cHBseQgFDCR0MDk5ODgxMDA1MwJfMwQMdG90YWxUb0NsYWltCQBkAgUSdXNlckF2YWlsYWJsZUNsYWltBQd1UmV3YXJkAwMFCHJlYWRPbmx5BgkAAAIFDHRvdGFsVG9DbGFpbQAACQCUCgIFDHRvdGFsVG9DbGFpbQUDbmlsCQCUCgIFDHRvdGFsVG9DbGFpbQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQR1c2VyBQ9rVXNlckxwSW50ZXJlc3QFDW5ld0xwSW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEdXNlcgUVa1VzZXJMcEF2YWlsYWJsZUNsYWltAAAJAMwIAgkBDEludGVnZXJFbnRyeQIFC2tMcEludGVyZXN0BQ1uZXdMcEludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRFrTHBJbnRlcmVzdEhlaWdodAUGaGVpZ2h0BQNuaWwBDWdldFRva2Vuc0FQUnMABAlheGx5UHJpY2UJAQ1nZXRBc3NldFByaWNlAQUGYXhseUlkBA1heGx5UHJlY2lzaW9uCQERZ2V0QXNzZXRQcmVjaXNpb24BBQZheGx5SWQKAQp0b2tlbnNBcHJzAgNhcHIHdG9rZW5JZAQEcndwYgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFB3Rva2VuSWQFFGtUb2tlblJld2FyZFBlckJsb2NrAAAEB3J3cGJVc2QJAGsDBQRyd3BiBQlheGx5UHJpY2UFDWF4bHlQcmVjaXNpb24EBnJ3WWVhcgkAaAIJAGgCBQdyd3BiVXNkBQxwZXJpb2RMZW5ndGgANAQOdG90YWxTdXBwbHlVc2QJARFnZXRUb3RhbFN1cHBseVVzZAEFB3Rva2VuSWQJAM0IAgUDYXByCQBrAwUGcndZZWFyBQZTQ0FMRTgFDnRvdGFsU3VwcGx5VXNkBARhcHJzCgACJGwJAQxnZXRBbGxUb2tlbnMACgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQp0b2tlbnNBcHJzAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAzMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgQNbHBUb3RhbFN1cHBseQkBEUBleHRyTmF0aXZlKDEwNTApAgURc2ZGYXJtaW5nQ29udHJhY3QJAKwCAgUIYXhseVBvb2wFDmtTRlRvdGFsU3VwcGx5BARscElkCQERQGV4dHJOYXRpdmUoMTA1MykCCQERQGV4dHJOYXRpdmUoMTA2MikBBQhheGx5UG9vbAUFa0xwSWQEC2xwUHJlY2lzaW9uCQERZ2V0QXNzZXRQcmVjaXNpb24BBQRscElkBAdscFByaWNlCgABQAkA/AcEBQxtYWluQ29udHJhY3QCGmdldFNoYXJlQXNzZXRQcmljZVJFQURPTkxZCQDMCAIFBGxwSWQFA25pbAUDbmlsAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAQQbHBUb3RhbFN1cHBseVVzZAkAawMFDWxwVG90YWxTdXBwbHkFB2xwUHJpY2UFC2xwUHJlY2lzaW9uBARyd3BiCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFEWtMcFJld2FyZFBlckJsb2NrAAAEB3J3cGJVc2QJAGsDBQRyd3BiBQlheGx5UHJpY2UFDWF4bHlQcmVjaXNpb24EBnJ3WWVhcgkAaAIJAGgCBQdyd3BiVXNkBQxwZXJpb2RMZW5ndGgANAQFbHBBcHIJAGsDBQZyd1llYXIFBlNDQUxFOAUQbHBUb3RhbFN1cHBseVVzZAkAlQoDCQEMZ2V0QWxsVG9rZW5zAAUEYXBycwUFbHBBcHIHAWkBEmNsYWltTGVuZGVyUmV3YXJkcwAECGNsYWltUmVzCQEYY2xhaW1MZW5kZXJSZXdhcmRzQ29tbW9uAgkApQgBCAUBaQZjYWxsZXIHAwkAAAIIBQhjbGFpbVJlcwJfMwAACQACAQIjY2xhaW0gYW1vdW50IG11c3QgYmUgZ3JlYXRlciB0aGFuIDAEA2ludgkA/AcEBQ10b2tlbkNvbnRyYWN0AhJ3aXRoZHJhd0xlbmRSZXdhcmQJAMwIAggFCGNsYWltUmVzAl8zCQDMCAIJAKUIAQgFAWkGY2FsbGVyBQNuaWwFA25pbAMJAAACBQNpbnYFA2ludggFCGNsYWltUmVzAl80CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDmNsYWltTHBSZXdhcmRzAAQIY2xhaW1SZXMJARRjbGFpbUxwUmV3YXJkc0NvbW1vbgIJAKUIAQgFAWkGY2FsbGVyBwMJAAACCAUIY2xhaW1SZXMCXzEAAAkAAgECI2NsYWltIGFtb3VudCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwBANpbnYJAPwHBAUNdG9rZW5Db250cmFjdAIQd2l0aGRyYXdMcFJld2FyZAkAzAgCCAUIY2xhaW1SZXMCXzEJAMwIAgkApQgBCAUBaQZjYWxsZXIFA25pbAUDbmlsAwkAAAIFA2ludgUDaW52CAUIY2xhaW1SZXMCXzIJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEKbGVuZEFjdGlvbgIEdXNlcgd0b2tlbklkCQELdmFsdWVPckVsc2UCCQEKaXNMYW5kQ2FsbAEFAWkEEnVzZXJBdmFpbGFibGVDbGFpbQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFB3Rva2VuSWQFF2tVc2VyTGVuZEF2YWlsYWJsZUNsYWltAAAEDSR0MDEyNDAxMTI0NjgJARJjYWxjTGVuZFVzZXJSZXdhcmQCBQR1c2VyBQd0b2tlbklkBAd1UmV3YXJkCAUNJHQwMTI0MDExMjQ2OAJfMQQQbmV3VG9rZW5JbnRlcmVzdAgFDSR0MDEyNDAxMTI0NjgCXzIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIFBHVzZXICAV8FB3Rva2VuSWQFEWtVc2VyTGVuZEludGVyZXN0BRBuZXdUb2tlbkludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICBQR1c2VyAgFfBQd0b2tlbklkBRdrVXNlckxlbmRBdmFpbGFibGVDbGFpbQkAZAIFEnVzZXJBdmFpbGFibGVDbGFpbQUHdVJld2FyZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQd0b2tlbklkBQ5rVG9rZW5JbnRlcmVzdAUQbmV3VG9rZW5JbnRlcmVzdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQd0b2tlbklkBRRrVG9rZW5JbnRlcmVzdEhlaWdodAUGaGVpZ2h0BQNuaWwBaQEIbHBBY3Rpb24BBHVzZXIJAQt2YWx1ZU9yRWxzZQIJAQ9pc1NGRmFybWluZ0NhbGwBBQFpBBJ1c2VyQXZhaWxhYmxlQ2xhaW0JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUVa1VzZXJMcEF2YWlsYWJsZUNsYWltAAAEDSR0MDEyOTMzMTI5ODYJARBjYWxjTHBVc2VyUmV3YXJkAQUEdXNlcgQHdVJld2FyZAgFDSR0MDEyOTMzMTI5ODYCXzEEDW5ld0xwSW50ZXJlc3QIBQ0kdDAxMjkzMzEyOTg2Al8yCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHVzZXIFD2tVc2VyTHBJbnRlcmVzdAUNbmV3THBJbnRlcmVzdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQR1c2VyBRVrVXNlckxwQXZhaWxhYmxlQ2xhaW0JAGQCBRJ1c2VyQXZhaWxhYmxlQ2xhaW0FB3VSZXdhcmQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEdXNlcgULa0xwSW50ZXJlc3QFDW5ld0xwSW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEdXNlcgURa0xwSW50ZXJlc3RIZWlnaHQFBmhlaWdodAUDbmlsAWkBBGluaXQFFGF4bHlNYWluQ29udHJhY3RBZGRyGWF4bHlUb2tlbm9taWNDb250cmFjdEFkZHIMYXhseVBvb2xBZGRyEmZhcm1pbmdTdGFydEhlaWdodAxwZXJpb2RMZW5ndGgJAQt2YWx1ZU9yRWxzZQIJAQppc1NlbGZDYWxsAQUBaQMJAQEhAQkBCWlzRGVmaW5lZAEJAKYIAQUUYXhseU1haW5Db250cmFjdEFkZHIJAAIBAhVXcm9uZyBmYXJtaW5nIGFkZHJlc3MDCQEBIQEJAQlpc0RlZmluZWQBCQCmCAEFGWF4bHlUb2tlbm9taWNDb250cmFjdEFkZHIJAAIBAhtXcm9uZyBtYWluIGNvbnRyYWN0IGFkZHJlc3MJAMwIAgkBC1N0cmluZ0VudHJ5AgURa0F4bHlNYWluQ29udHJhY3QFFGF4bHlNYWluQ29udHJhY3RBZGRyCQDMCAIJAQtTdHJpbmdFbnRyeQIFFmtBeGx5VG9rZW5vbWljQ29udHJhY3QFGWF4bHlUb2tlbm9taWNDb250cmFjdEFkZHIJAMwIAgkBC1N0cmluZ0VudHJ5AgUJa0F4bHlQb29sBQxheGx5UG9vbEFkZHIJAMwIAgkBDEludGVnZXJFbnRyeQIFDGtTdGFydEhlaWdodAUSZmFybWluZ1N0YXJ0SGVpZ2h0CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ1rUGVyaW9kTGVuZ3RoBQxwZXJpb2RMZW5ndGgFA25pbAFpAQxpbml0TmV3VG9rZW4BB3Rva2VuSWQJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQEJaXNEZWZpbmVkAQkAmggCBQR0aGlzCQCsAgIFB3Rva2VuSWQFDmtUb2tlbkludGVyZXN0CQACAQIUdG9rZW4gYWxyZWFkeSBpbml0ZWQDCQEBIQEJAQhjb250YWlucwIJARFAZXh0ck5hdGl2ZSgxMDUzKQIFDGxlbmRDb250cmFjdAUQa0xlbmRTZXR1cFRva2VucwUHdG9rZW5JZAkAAgECE25vIHRva2VuIG9uIGxhbmRpbmcEDG5ld0FsbFRva2VucwkAzQgCCQEMZ2V0QWxsVG9rZW5zAAUHdG9rZW5JZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQd0b2tlbklkBQ5rVG9rZW5JbnRlcmVzdAAACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFB3Rva2VuSWQFFGtUb2tlbkludGVyZXN0SGVpZ2h0CQCWAwEJAMwIAgULc3RhcnRIZWlnaHQJAMwIAgUGaGVpZ2h0BQNuaWwJAMwIAgkBC1N0cmluZ0VudHJ5AgUHa1Rva2VucwkAuQkCBQxuZXdBbGxUb2tlbnMCASwJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUHdG9rZW5JZAUUa1Rva2VuUmV3YXJkUGVyQmxvY2sAAAUDbmlsAWkBDXVwZGF0ZVJld2FyZHMACQELdmFsdWVPckVsc2UCCQEOaXNPcGVyYXRvckNhbGwBBQFpBBBsYXN0VXBkYXRlUGVyaW9kCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFEWtMYXN0VXBkYXRlUGVyaW9kAAAECmNhbGNQZXJpb2QJAGQCCQBpAgkAZQIFBmhlaWdodAULc3RhcnRIZWlnaHQFDHBlcmlvZExlbmd0aAABBAljdXJQZXJpb2QDCQBnAgAABQpjYWxjUGVyaW9kAAEFCmNhbGNQZXJpb2QDCQBmAgUJY3VyUGVyaW9kAGgJAAIBAhFtYXggcGVyaW9kIGlzIDEwNAMDCQBnAgUQbGFzdFVwZGF0ZVBlcmlvZAUJY3VyUGVyaW9kCQECIT0CBRBsYXN0VXBkYXRlUGVyaW9kAAAHCQACAQIlcmV3YXJkcyBhbHJlZHkgdXBkYXRlZCBpbiB0aGlzIHBlcmlvZAQNJHQwMTQ5NDQxNTAyNAkBF2dldFRvdGFsU3VwcGx5QWxsVG9rZW5zAAQLdG90YWxTdXBwbHkIBQ0kdDAxNDk0NDE1MDI0Al8xBA50b3RhbFN1cHBseVVzZAgFDSR0MDE0OTQ0MTUwMjQCXzIEEXRvdGFsU3VwcGx5VXNkQWxsCAUNJHQwMTQ5NDQxNTAyNAJfMwQJYXhseVByaWNlCQENZ2V0QXNzZXRQcmljZQEFBmF4bHlJZAQNYXhseVByZWNpc2lvbgkBEWdldEFzc2V0UHJlY2lzaW9uAQUGYXhseUlkBAZtYXhBUFIJARVnZXRBZG9wdGVkQVBSQnlQZXJpb2QDBQljdXJQZXJpb2QFE0xFTkRFUlNfQVBSX1BFUklPRFMFC0xFTkRFUlNfQVBSCgEMdXBkYXRlUmV3YXJkAgFhB3Rva2VuSWQEDSR0MDE1MjczMTUzMTcFAWEECGVudGVyaWVzCAUNJHQwMTUyNzMxNTMxNwJfMQQRdG90YWxQZXJpb2RSZXdhcmQIBQ0kdDAxNTI3MzE1MzE3Al8yBAVpbmRleAgFDSR0MDE1MjczMTUzMTcCXzMDCQAAAgkAkQMCBQt0b3RhbFN1cHBseQUFaW5kZXgAAAkAlQoDCQDOCAIFCGVudGVyaWVzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFB3Rva2VuSWQFFGtQcmV2TGVuZFRva2VuU3VwcGx5CQCRAwIFC3RvdGFsU3VwcGx5BQVpbmRleAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQd0b2tlbklkBRRrVG9rZW5SZXdhcmRQZXJCbG9jawAACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFB3Rva2VuSWQFDmtUb2tlbkludGVyZXN0CQEUY2FsY05ld1Rva2VuSW50ZXJlc3QCBQd0b2tlbklkCQCRAwIFC3RvdGFsU3VwcGx5BQVpbmRleAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQd0b2tlbklkBRRrVG9rZW5JbnRlcmVzdEhlaWdodAkAlgMBCQDMCAIFC3N0YXJ0SGVpZ2h0CQDMCAIFBmhlaWdodAUDbmlsBQNuaWwFEXRvdGFsUGVyaW9kUmV3YXJkCQBkAgUFaW5kZXgAAQQFc2hhcmUJAGsDCQCRAwIFDnRvdGFsU3VwcGx5VXNkBQVpbmRleAUGU0NBTEU4BRF0b3RhbFN1cHBseVVzZEFsbAQJbWF4UmV3YXJkCQBrAwUFc2hhcmUFE2xlbmRNYXhQZXJpb2RBbW91bnQFBlNDQUxFOAQMbWF4UmV3YXJkVXNkCQBrAwUJbWF4UmV3YXJkBQlheGx5UHJpY2UFDWF4bHlQcmVjaXNpb24ED3ByZXZUb3RhbFN1cHBseQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBRRrUHJldkxlbmRUb2tlblN1cHBseQAABAZydENvZWYDAwkAAAIFD3ByZXZUb3RhbFN1cHBseQAABgkAAAIJAJEDAgULdG90YWxTdXBwbHkFBWluZGV4AAAAAAkAawMFD3ByZXZUb3RhbFN1cHBseQUGU0NBTEU4CQCRAwIFC3RvdGFsU3VwcGx5BQVpbmRleAQGcmV3YXJkCQBpAgkAaQIJAJcDAQkAzAgCCQBoAgUGbWF4QVBSCQBkAgUGU0NBTEU4BQZydENvZWYJAMwIAgkAawMFBm1heEFQUgkAaAIADwUGU0NBTEU4AAoFA25pbAUGU0NBTEU4AGQECXJld2FyZFVzZAkAlwMBCQDMCAIFDG1heFJld2FyZFVzZAkAzAgCCQBrAwkAkQMCBQ50b3RhbFN1cHBseVVzZAUFaW5kZXgFBnJld2FyZAUGU0NBTEU4BQNuaWwEDHJld2FyZFBlcmlvZAkAawMFCXJld2FyZFVzZAUNYXhseVByZWNpc2lvbgUJYXhseVByaWNlBA5yZXdhcmRQZXJCbG9jawkAaQIFDHJld2FyZFBlcmlvZAUMcGVyaW9kTGVuZ3RoCQCVCgMJAM4IAgUIZW50ZXJpZXMJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUHdG9rZW5JZAUUa1ByZXZMZW5kVG9rZW5TdXBwbHkJAJEDAgULdG90YWxTdXBwbHkFBWluZGV4CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFB3Rva2VuSWQFFGtUb2tlblJld2FyZFBlckJsb2NrBQ5yZXdhcmRQZXJCbG9jawkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQd0b2tlbklkBQ5rVG9rZW5JbnRlcmVzdAkBFGNhbGNOZXdUb2tlbkludGVyZXN0AgUHdG9rZW5JZAkAkQMCBQt0b3RhbFN1cHBseQUFaW5kZXgJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUHdG9rZW5JZAUUa1Rva2VuSW50ZXJlc3RIZWlnaHQJAJYDAQkAzAgCBQtzdGFydEhlaWdodAkAzAgCBQZoZWlnaHQFA25pbAUDbmlsCQBkAgURdG90YWxQZXJpb2RSZXdhcmQFDHJld2FyZFBlcmlvZAkAZAIFBWluZGV4AAEEDSR0MDE2OTc5MTcwNzEKAAIkbAkBDGdldEFsbFRva2VucwAKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCVCgMFA25pbAAAAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBDHVwZGF0ZVJld2FyZAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMzAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsAHAAdAB4EDnRva2Vuc0VudGVyaWVzCAUNJHQwMTY5NzkxNzA3MQJfMQQQdG90YWxUb2tlblJld2FyZAgFDSR0MDE2OTc5MTcwNzECXzIECGxwTWF4QVBSCQEVZ2V0QWRvcHRlZEFQUkJ5UGVyaW9kAwUJY3VyUGVyaW9kBQ5MUF9BUFJfUEVSSU9EUwUGTFBfQVBSBA1scFRvdGFsU3VwcGx5CQERQGV4dHJOYXRpdmUoMTA1MCkCBRFzZkZhcm1pbmdDb250cmFjdAkArAICBQhheGx5UG9vbAUOa1NGVG90YWxTdXBwbHkEC3ByZUxQU3VwcGx5CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFDWtQcmV2TFBTdXBwbHkAAAQEbHBJZAkBEUBleHRyTmF0aXZlKDEwNTMpAgkBEUBleHRyTmF0aXZlKDEwNjIpAQUIYXhseVBvb2wFBWtMcElkBAtscFByZWNpc2lvbgkBEWdldEFzc2V0UHJlY2lzaW9uAQUEbHBJZAQHbHBQcmljZQoAAUAJAPwHBAUMbWFpbkNvbnRyYWN0AhpnZXRTaGFyZUFzc2V0UHJpY2VSRUFET05MWQkAzAgCBQRscElkBQNuaWwFA25pbAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQEEGxwVG90YWxTdXBwbHlVc2QJAGsDBQ1scFRvdGFsU3VwcGx5BQdscFByaWNlBQtscFByZWNpc2lvbgQObWF4TFBSZXdhcmRVc2QJAGsDBRFscE1heFBlcmlvZEFtb3VudAUJYXhseVByaWNlBQ1heGx5UHJlY2lzaW9uBAhydExQQ29lZgMDCQAAAgULcHJlTFBTdXBwbHkAAAYJAAACBQ1scFRvdGFsU3VwcGx5AAAAAAkAawMFC3ByZUxQU3VwcGx5BQZTQ0FMRTgFDWxwVG90YWxTdXBwbHkECHJld2FyZExwCQBpAgkAaQIJAJcDAQkAzAgCCQBoAgUIbHBNYXhBUFIJAGQCBQZTQ0FMRTgFCHJ0TFBDb2VmCQDMCAIJAGsDBQhscE1heEFQUgkAaAIADwUGU0NBTEU4AAoFA25pbAUGU0NBTEU4AGQEC3Jld2FyZExwVXNkCQCXAwEJAMwIAgUObWF4TFBSZXdhcmRVc2QJAMwIAgkAawMFEGxwVG90YWxTdXBwbHlVc2QFCHJld2FyZExwBQZTQ0FMRTgFA25pbAQOcmV3YXJkTHBQZXJpb2QJAGsDBQtyZXdhcmRMcFVzZAUNYXhseVByZWNpc2lvbgUJYXhseVByaWNlBBByZXdhcmRMcFBlckJsb2NrCQBpAgUOcmV3YXJkTHBQZXJpb2QFDHBlcmlvZExlbmd0aAQIYnVybkxlbmQJAGUCBRNsZW5kTWF4UGVyaW9kQW1vdW50BRB0b3RhbFRva2VuUmV3YXJkBAZidXJuTHAJAGUCBRFscE1heFBlcmlvZEFtb3VudAUOcmV3YXJkTHBQZXJpb2QEA2ludgkA/AcEBQ10b2tlbkNvbnRyYWN0AhB3aXRoZHJhd0xwUmV3YXJkCQDMCAIJAGQCBQhidXJuTGVuZAUGYnVybkxwCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQNuaWwDCQAAAgUDaW52BQNpbnYECmxwRW50ZXJpZXMDCQBnAgAMBQljdXJQZXJpb2QJAMwIAgkBDEludGVnZXJFbnRyeQIFDWtQcmV2TFBTdXBwbHkFDWxwVG90YWxTdXBwbHkJAMwIAgkBDEludGVnZXJFbnRyeQIFEWtMcFJld2FyZFBlckJsb2NrBRByZXdhcmRMcFBlckJsb2NrCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQtrTHBJbnRlcmVzdAkBEWNhbGNOZXdMcEludGVyZXN0AQUNbHBUb3RhbFN1cHBseQkAzAgCCQEMSW50ZWdlckVudHJ5AgURa0xwSW50ZXJlc3RIZWlnaHQJAJYDAQkAzAgCBQtzdGFydEhlaWdodAkAzAgCBQZoZWlnaHQFA25pbAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEBGgFUJ5EsPDoJzQ7bvgXV083vCkgY+zYDPYa7BQhidXJuTGVuZAkA2QQBBQZheGx5SWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBARoBVCeRLDw6Cc0O274F1dPN7wpIGPs2Az2GuwUGYnVybkxwCQDZBAEFBmF4bHlJZAUDbmlsBQNuaWwJAM0IAgkAzggCBQpscEVudGVyaWVzBQ50b2tlbnNFbnRlcmllcwkBDEludGVnZXJFbnRyeQIFEWtMYXN0VXBkYXRlUGVyaW9kBRBsYXN0VXBkYXRlUGVyaW9kCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJ0eAEGdmVyaWZ5AAQTbXVsdGlTaWduZWRCeUFkbWlucwQSYWRtaW5QdWJLZXkxU2lnbmVkAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAUIYWRtaW4xUEsAAQAABBJhZG1pblB1YktleTJTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwABBQhhZG1pbjJQSwABAAAEEmFkbWluUHViS2V5M1NpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAIFCGFkbWluM1BLAAEAAAkAZwIJAGQCCQBkAgUSYWRtaW5QdWJLZXkxU2lnbmVkBRJhZG1pblB1YktleTJTaWduZWQFEmFkbWluUHViS2V5M1NpZ25lZAACBAckbWF0Y2gwBQJ0eAMJAAECBQckbWF0Y2gwAhdJbnZva2VTY3JpcHRUcmFuc2FjdGlvbgQDaW52BQckbWF0Y2gwBAZpc1NlbGYJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXkECmlzUmlnaHRGZWUDCQAAAggFA2ludgNmZWUAoPc2CQAAAggFA2ludgpmZWVBc3NldElkBQR1bml0BwQKaXNJbml0Q2FsbAkAAAIIBQNpbnYIZnVuY3Rpb24CBGluaXQEDGlzbm9QYXltZW50cwkAAAIJAJADAQgFA2ludghwYXltZW50cwAAAwMDAwUKaXNSaWdodEZlZQUKaXNJbml0Q2FsbAcFBmlzU2VsZgcFDGlzbm9QYXltZW50cwcGBRNtdWx0aVNpZ25lZEJ5QWRtaW5zBRNtdWx0aVNpZ25lZEJ5QWRtaW5zySzL/Q==", "height": 2720103, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: EAnLk6E4niaQJBUKYafFQEnM9s7dt8iKFi95DT8G1gJ3 Next: Da28mGrJkJgGZepZN1Addyv83dTwpckaYEPko4NMDQMQ Diff:
OldNewDifferences
476476 @Callable(i)
477477 func updateRewards () = valueOrElse(isOperatorCall(i), {
478478 let lastUpdatePeriod = valueOrElse(getInteger(this, kLastUpdatePeriod), 0)
479- let curPeriod = (((height - startHeight) / periodLength) + 1)
480- if (if ((lastUpdatePeriod >= curPeriod))
481- then (lastUpdatePeriod != 0)
482- else false)
483- then throw("rewards alredy updated in this period")
484- else {
485- let $t01482514905 = getTotalSupplyAllTokens()
486- let totalSupply = $t01482514905._1
487- let totalSupplyUsd = $t01482514905._2
488- let totalSupplyUsdAll = $t01482514905._3
489- let axlyPrice = getAssetPrice(axlyId)
490- let axlyPrecision = getAssetPrecision(axlyId)
491- let maxAPR = getAdoptedAPRByPeriod(curPeriod, LENDERS_APR_PERIODS, LENDERS_APR)
492- func updateReward (a,tokenId) = {
493- let $t01515415198 = a
494- let enteries = $t01515415198._1
495- let totalPeriodReward = $t01515415198._2
496- let index = $t01515415198._3
497- if ((totalSupply[index] == 0))
498- 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))
499- else {
500- let share = fraction(totalSupplyUsd[index], SCALE8, totalSupplyUsdAll)
501- let maxReward = fraction(share, lendMaxPeriodAmount, SCALE8)
502- let maxRewardUsd = fraction(maxReward, axlyPrice, axlyPrecision)
503- let prevTotalSupply = valueOrElse(getInteger(this, kPrevLendTokenSupply), 0)
504- let rtCoef = if (if ((prevTotalSupply == 0))
505- then true
506- else (totalSupply[index] == 0))
507- then 0
508- else fraction(prevTotalSupply, SCALE8, totalSupply[index])
509- let reward = ((min([(maxAPR * (SCALE8 + rtCoef)), fraction(maxAPR, (15 * SCALE8), 10)]) / SCALE8) / 100)
510- let rewardUsd = min([maxRewardUsd, fraction(totalSupplyUsd[index], reward, SCALE8)])
511- let rewardPeriod = fraction(rewardUsd, axlyPrecision, axlyPrice)
512- let rewardPerBlock = (rewardPeriod / periodLength)
513- $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))
479+ let calcPeriod = (((height - startHeight) / periodLength) + 1)
480+ let curPeriod = if ((0 >= calcPeriod))
481+ then 1
482+ else calcPeriod
483+ if ((curPeriod > 104))
484+ then throw("max period is 104")
485+ else if (if ((lastUpdatePeriod >= curPeriod))
486+ then (lastUpdatePeriod != 0)
487+ else false)
488+ then throw("rewards alredy updated in this period")
489+ else {
490+ let $t01494415024 = getTotalSupplyAllTokens()
491+ let totalSupply = $t01494415024._1
492+ let totalSupplyUsd = $t01494415024._2
493+ let totalSupplyUsdAll = $t01494415024._3
494+ let axlyPrice = getAssetPrice(axlyId)
495+ let axlyPrecision = getAssetPrecision(axlyId)
496+ let maxAPR = getAdoptedAPRByPeriod(curPeriod, LENDERS_APR_PERIODS, LENDERS_APR)
497+ func updateReward (a,tokenId) = {
498+ let $t01527315317 = a
499+ let enteries = $t01527315317._1
500+ let totalPeriodReward = $t01527315317._2
501+ let index = $t01527315317._3
502+ if ((totalSupply[index] == 0))
503+ 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))
504+ else {
505+ let share = fraction(totalSupplyUsd[index], SCALE8, totalSupplyUsdAll)
506+ let maxReward = fraction(share, lendMaxPeriodAmount, SCALE8)
507+ let maxRewardUsd = fraction(maxReward, axlyPrice, axlyPrecision)
508+ let prevTotalSupply = valueOrElse(getInteger(this, kPrevLendTokenSupply), 0)
509+ let rtCoef = if (if ((prevTotalSupply == 0))
510+ then true
511+ else (totalSupply[index] == 0))
512+ then 0
513+ else fraction(prevTotalSupply, SCALE8, totalSupply[index])
514+ let reward = ((min([(maxAPR * (SCALE8 + rtCoef)), fraction(maxAPR, (15 * SCALE8), 10)]) / SCALE8) / 100)
515+ let rewardUsd = min([maxRewardUsd, fraction(totalSupplyUsd[index], reward, SCALE8)])
516+ let rewardPeriod = fraction(rewardUsd, axlyPrecision, axlyPrice)
517+ let rewardPerBlock = (rewardPeriod / periodLength)
518+ $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))
519+ }
520+ }
521+
522+ let $t01697917071 = {
523+ let $l = getAllTokens()
524+ let $s = size($l)
525+ let $acc0 = $Tuple3(nil, 0, 0)
526+ func $f0_1 ($a,$i) = if (($i >= $s))
527+ then $a
528+ else updateReward($a, $l[$i])
529+
530+ func $f0_2 ($a,$i) = if (($i >= $s))
531+ then $a
532+ else throw("List size exceeds 30")
533+
534+ $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)
535+ }
536+ let tokensEnteries = $t01697917071._1
537+ let totalTokenReward = $t01697917071._2
538+ let lpMaxAPR = getAdoptedAPRByPeriod(curPeriod, LP_APR_PERIODS, LP_APR)
539+ let lpTotalSupply = getIntegerValue(sfFarmingContract, (axlyPool + kSFTotalSupply))
540+ let preLPSupply = valueOrElse(getInteger(this, kPrevLPSupply), 0)
541+ let lpId = getStringValue(addressFromStringValue(axlyPool), kLpId)
542+ let lpPrecision = getAssetPrecision(lpId)
543+ let lpPrice = {
544+ let @ = invoke(mainContract, "getShareAssetPriceREADONLY", [lpId], nil)
545+ if ($isInstanceOf(@, "Int"))
546+ then @
547+ else throw(($getType(@) + " couldn't be cast to Int"))
548+ }
549+ let lpTotalSupplyUsd = fraction(lpTotalSupply, lpPrice, lpPrecision)
550+ let maxLPRewardUsd = fraction(lpMaxPeriodAmount, axlyPrice, axlyPrecision)
551+ let rtLPCoef = if (if ((preLPSupply == 0))
552+ then true
553+ else (lpTotalSupply == 0))
554+ then 0
555+ else fraction(preLPSupply, SCALE8, lpTotalSupply)
556+ let rewardLp = ((min([(lpMaxAPR * (SCALE8 + rtLPCoef)), fraction(lpMaxAPR, (15 * SCALE8), 10)]) / SCALE8) / 100)
557+ let rewardLpUsd = min([maxLPRewardUsd, fraction(lpTotalSupplyUsd, rewardLp, SCALE8)])
558+ let rewardLpPeriod = fraction(rewardLpUsd, axlyPrecision, axlyPrice)
559+ let rewardLpPerBlock = (rewardLpPeriod / periodLength)
560+ let burnLend = (lendMaxPeriodAmount - totalTokenReward)
561+ let burnLp = (lpMaxPeriodAmount - rewardLpPeriod)
562+ let inv = invoke(tokenContract, "withdrawLpReward", [(burnLend + burnLp), toString(this)], nil)
563+ if ((inv == inv))
564+ then {
565+ let lpEnteries = if ((12 >= curPeriod))
566+ then [IntegerEntry(kPrevLPSupply, lpTotalSupply), IntegerEntry(kLpRewardPerBlock, rewardLpPerBlock), IntegerEntry(kLpInterest, calcNewLpInterest(lpTotalSupply)), IntegerEntry(kLpInterestHeight, max([startHeight, height])), ScriptTransfer(Address(base58'3MsXJ3BesPECkYejzBQGHZPJT8GVYy4Fd3Q'), burnLend, fromBase58String(axlyId)), ScriptTransfer(Address(base58'3MsXJ3BesPECkYejzBQGHZPJT8GVYy4Fd3Q'), burnLp, fromBase58String(axlyId))]
567+ else nil
568+ ((lpEnteries ++ tokensEnteries) :+ IntegerEntry(kLastUpdatePeriod, lastUpdatePeriod))
514569 }
570+ else throw("Strict value is not equal to itself.")
515571 }
516-
517- let $t01686016958 = {
518- let $l = getAllTokens()
519- let $s = size($l)
520- let $acc0 = $Tuple3(nil, 0, 0)
521- func $f0_1 ($a,$i) = if (($i >= $s))
522- then $a
523- else updateReward($a, $l[$i])
524-
525- func $f0_2 ($a,$i) = if (($i >= $s))
526- then $a
527- else throw("List size exceeds 30")
528-
529- $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)
530- }
531- let tokensEnteries = $t01686016958._1
532- let totalTokenReward = $t01686016958._2
533- let index = $t01686016958._3
534- let lpMaxAPR = getAdoptedAPRByPeriod(curPeriod, LP_APR_PERIODS, LP_APR)
535- let lpTotalSupply = getIntegerValue(sfFarmingContract, (axlyPool + kSFTotalSupply))
536- let preLPSupply = valueOrElse(getInteger(this, kPrevLPSupply), 0)
537- let lpId = getStringValue(addressFromStringValue(axlyPool), kLpId)
538- let lpPrecision = getAssetPrecision(lpId)
539- let lpPrice = {
540- let @ = invoke(mainContract, "getShareAssetPriceREADONLY", [lpId], nil)
541- if ($isInstanceOf(@, "Int"))
542- then @
543- else throw(($getType(@) + " couldn't be cast to Int"))
544- }
545- let lpTotalSupplyUsd = fraction(lpTotalSupply, lpPrice, lpPrecision)
546- let maxLPRewardUsd = fraction(lpMaxPeriodAmount, axlyPrice, axlyPrecision)
547- let rtLPCoef = if (if ((preLPSupply == 0))
548- then true
549- else (lpTotalSupply == 0))
550- then 0
551- else fraction(preLPSupply, SCALE8, lpTotalSupply)
552- let rewardLp = ((min([(lpMaxAPR * (SCALE8 + rtLPCoef)), fraction(lpMaxAPR, (15 * SCALE8), 10)]) / SCALE8) / 100)
553- let rewardLpUsd = min([maxLPRewardUsd, fraction(lpTotalSupplyUsd, rewardLp, SCALE8)])
554- let rewardLpPeriod = fraction(rewardLpUsd, axlyPrecision, axlyPrice)
555- let rewardLpPerBlock = (rewardLpPeriod / periodLength)
556- let burnLend = (lendMaxPeriodAmount - totalTokenReward)
557- let burnLp = (lpMaxPeriodAmount - rewardLpPeriod)
558- let inv = invoke(tokenContract, "withdrawLpReward", [(burnLend + burnLp), toString(this)], nil)
559- if ((inv == inv))
560- then {
561- let lpEnteries = [IntegerEntry(kPrevLPSupply, lpTotalSupply), IntegerEntry(kLpRewardPerBlock, rewardLpPerBlock), IntegerEntry(kLpInterest, calcNewLpInterest(lpTotalSupply)), IntegerEntry(kLpInterestHeight, max([startHeight, height])), ScriptTransfer(Address(base58'3MsXJ3BesPECkYejzBQGHZPJT8GVYy4Fd3Q'), burnLend, fromBase58String(axlyId)), ScriptTransfer(Address(base58'3MsXJ3BesPECkYejzBQGHZPJT8GVYy4Fd3Q'), burnLp, fromBase58String(axlyId))]
562- ((lpEnteries ++ tokensEnteries) :+ IntegerEntry(kLastUpdatePeriod, lastUpdatePeriod))
563- }
564- else throw("Strict value is not equal to itself.")
565- }
566572 })
567573
568574
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SCALE8 = 100000000
55
66 let LENDERS_APR = [150, 120, 100, 80, 60, 40, 30, 20, 10]
77
88 let LENDERS_APR_PERIODS = ["1-1", "2-2", "3-3", "4-4", "5-8", "9-12", "14-16", "17-20", "20-104"]
99
1010 let LENDERS_MAX_PERIODS = 104
1111
1212 let LP_APR = [150, 120, 100, 80, 60, 40]
1313
1414 let LP_APR_PERIODS = ["1-1", "2-2", "3-3", "4-4", "5-8", "9-12"]
1515
1616 let LP_MAX_PERIODS = 12
1717
1818 let kStartHeight = "startHeight"
1919
2020 let kPeriodLength = "periodLength"
2121
2222 let kLendersMaxAmount = "lendRewardsAmount"
2323
2424 let kLPMaxAmount = "lpRewardAmount"
2525
2626 let kTokens = "tokens"
2727
2828 let kUserSupply = "_userTotalSupply"
2929
3030 let kTokenInterest = "_tokenInterest"
3131
3232 let kTokenInterestHeight = "_tokenInterestHeight"
3333
3434 let kTokenRewardPerBlock = "_tokenRewardPerBlock"
3535
3636 let kLastUpdatePeriod = "rewardUpdatePeriod"
3737
3838 let kUserLendInterest = "_userLandInterest"
3939
4040 let kUserLendAvailableClaim = "_userLendAvailableClaim"
4141
4242 let kUserLpAvailableClaim = "_userLpAvailableClaim"
4343
4444 let kLpInterest = "lpInterest"
4545
4646 let kLpInterestHeight = "lpInterestHeight"
4747
4848 let kPrevLPSupply = "prevLPTotalSupply"
4949
5050 let kLpRewardPerBlock = "lpRewardPerBlock"
5151
5252 let kUserLpInterest = "_userLpInterest"
5353
5454 let kPriceInOracle = "_twap5B"
5555
5656 let kPrevLendTokenSupply = "_prevLendTotalSupply"
5757
5858 let kAXLYTokenId = "axlyTokenId"
5959
6060 let kLendTokenSupply = "total_supplied_"
6161
6262 let kLendUserSupply = "_supplied_"
6363
6464 let kLendSetupTokens = "setup_tokens"
6565
6666 let kSFTotalSupply = "_total_share_tokens_locked"
6767
6868 let kSFUserTotalSupply = "_share_tokens_locked"
6969
7070 let kAxlyPool = "axlyPool"
7171
7272 let kLpId = "share_asset_id"
7373
7474 let kPriceOracle = "price_oracle"
7575
7676 let kAxlyMainContract = "mainContract"
7777
7878 let kAxlyTokenomicContract = "tokenomicContract"
7979
8080 let kSFFarmingContract = "swopfi_farming_addr"
8181
8282 let kLendContract = "lend_service_addr"
8383
8484 let kAdmin1PK = "group1_admin1_pub_key"
8585
8686 let kAdmin2PK = "group1_admin2_pub_key"
8787
8888 let kAdmin3PK = "group1_admin3_pub_key"
8989
9090 let kOperatorCallPK = "admin_call_pub_key"
9191
9292 let axlyPool = valueOrErrorMessage(getString(this, kAxlyPool), "Can't get axlyPool key")
9393
9494 let mainContract = addressFromStringValue(valueOrErrorMessage(getString(this, kAxlyMainContract), "Can't get mainContact key"))
9595
9696 let tokenContract = addressFromStringValue(valueOrErrorMessage(getString(this, kAxlyTokenomicContract), "Can't get tokenomicContract key"))
9797
9898 let lendContract = addressFromStringValue(valueOrErrorMessage(getString(mainContract, kLendContract), "Can't get lend_service_addr key"))
9999
100100 let sfFarmingContract = addressFromStringValue(valueOrErrorMessage(getString(mainContract, kSFFarmingContract), "Can't get swopfi_farming_addr key"))
101101
102102 let priceOracleAddr = addressFromStringValue(valueOrErrorMessage(getString(mainContract, kPriceOracle), "Can't get price_oracle key"))
103103
104104 let admin1PK = fromBase58String(valueOrErrorMessage(getString(mainContract, kAdmin1PK), "Can't get admin1PK"))
105105
106106 let admin2PK = fromBase58String(valueOrErrorMessage(getString(mainContract, kAdmin2PK), "Can't get admin2PK"))
107107
108108 let admin3PK = fromBase58String(valueOrErrorMessage(getString(mainContract, kAdmin3PK), "Can't get operatorPK"))
109109
110110 let operatorPK = fromBase58String(valueOrErrorMessage(getString(this, kOperatorCallPK), "Can't get operatorPK"))
111111
112112 let axlyId = valueOrErrorMessage(getString(tokenContract, kAXLYTokenId), "Can't get Axly token id")
113113
114114 let startHeight = getIntegerValue(this, kStartHeight)
115115
116116 let periodLength = getIntegerValue(this, kPeriodLength)
117117
118118 let lendMaxAmount = getIntegerValue(tokenContract, kLendersMaxAmount)
119119
120120 let lendMaxPeriodAmount = (lendMaxAmount / LENDERS_MAX_PERIODS)
121121
122122 let lpMaxAmount = getIntegerValue(tokenContract, kLPMaxAmount)
123123
124124 let lpMaxPeriodAmount = (lpMaxAmount / LP_MAX_PERIODS)
125125
126126 func isAdminCall (i) = if (containsElement([admin1PK, admin2PK, admin3PK], i.callerPublicKey))
127127 then unit
128128 else throw("Only admin group1 can call this function")
129129
130130
131131 func isSelfCall (i) = if ((i.caller == this))
132132 then unit
133133 else throw("Only contract itself can call this function")
134134
135135
136136 func isOperatorCall (i) = if ((i.callerPublicKey == operatorPK))
137137 then unit
138138 else throw("Only operator can call this function")
139139
140140
141141 func isLandCall (i) = if ((i.caller == lendContract))
142142 then unit
143143 else throw("Only land contract can call this function")
144144
145145
146146 func isSFFarmingCall (i) = if ((i.caller == sfFarmingContract))
147147 then unit
148148 else throw("Only land contract can call this function")
149149
150150
151151 func getAllTokens () = {
152152 let tokens = valueOrElse(getString(this, kTokens), "")
153153 if ((tokens == ""))
154154 then nil
155155 else split(tokens, ",")
156156 }
157157
158158
159159 func getAssetPrice (assetId) = getIntegerValue(priceOracleAddr, (assetId + kPriceInOracle))
160160
161161
162162 func getAssetDecimals (assetId) = if ((assetId == "WAVES"))
163163 then 8
164164 else match assetInfo(fromBase58String(assetId)) {
165165 case asset: Asset =>
166166 asset.decimals
167167 case _ =>
168168 throw("Can't find asset")
169169 }
170170
171171
172172 func getAssetPrecision (assetId) = pow(10, 0, getAssetDecimals(assetId), 0, 0, DOWN)
173173
174174
175175 func getAdoptedAPRByPeriod (period,aprPeriods,apr) = {
176176 func for (a,aperiod) = {
177177 let $t053625384 = a
178178 let index = $t053625384._1
179179 let found = $t053625384._2
180180 let ft = split(aperiod, "-")
181181 let $t054215484 = $Tuple2(parseIntValue(ft[0]), parseIntValue(ft[1]))
182182 let from = $t054215484._1
183183 let to = $t054215484._2
184184 if (found)
185185 then a
186186 else if (if ((period >= from))
187187 then (to >= period)
188188 else false)
189189 then $Tuple2(index, true)
190190 else $Tuple2((index + 1), false)
191191 }
192192
193193 let $t056215687 = {
194194 let $l = LENDERS_APR_PERIODS
195195 let $s = size($l)
196196 let $acc0 = $Tuple2(0, false)
197197 func $f0_1 ($a,$i) = if (($i >= $s))
198198 then $a
199199 else for($a, $l[$i])
200200
201201 func $f0_2 ($a,$i) = if (($i >= $s))
202202 then $a
203203 else throw("List size exceeds 9")
204204
205205 $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)
206206 }
207207 let index = $t056215687._1
208208 let found = $t056215687._2
209209 if (found)
210210 then fraction((LENDERS_APR[index] * SCALE8), 7, 365)
211211 else 0
212212 }
213213
214214
215215 func getTotalSupplyAllTokens () = {
216216 func for (a,tokenId) = {
217217 let $t058755931 = a
218218 let totalSupply = $t058755931._1
219219 let totalSupplyUsd = $t058755931._2
220220 let totalSupplyUsdAll = $t058755931._3
221221 let tSupply = valueOrElse(getInteger(lendContract, (kLendTokenSupply + tokenId)), 0)
222222 let assetPrice = getAssetPrice(tokenId)
223223 let assetPrecision = getAssetPrecision(tokenId)
224224 let tSupplyUsd = fraction(tSupply, assetPrice, assetPrecision)
225225 $Tuple3((totalSupply :+ tSupply), (totalSupplyUsd :+ tSupplyUsd), (totalSupplyUsdAll + tSupplyUsd))
226226 }
227227
228228 let $l = getAllTokens()
229229 let $s = size($l)
230230 let $acc0 = $Tuple3(nil, nil, 0)
231231 func $f0_1 ($a,$i) = if (($i >= $s))
232232 then $a
233233 else for($a, $l[$i])
234234
235235 func $f0_2 ($a,$i) = if (($i >= $s))
236236 then $a
237237 else throw("List size exceeds 30")
238238
239239 $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)
240240 }
241241
242242
243243 func getTotalSupplyUsd (tokenId) = {
244244 let tSupply = valueOrElse(getInteger(lendContract, (kLendTokenSupply + tokenId)), 0)
245245 let assetPrice = getAssetPrice(tokenId)
246246 let assetPrecision = getAssetPrecision(tokenId)
247247 fraction(tSupply, assetPrice, assetPrecision)
248248 }
249249
250250
251251 func calcNewTokenInterest (tokenId,totalSupply) = if ((startHeight >= height))
252252 then 0
253253 else {
254254 let rewardPerBlock = getIntegerValue(this, (tokenId + kTokenRewardPerBlock))
255255 let oldInterest = getIntegerValue(this, (tokenId + kTokenInterest))
256256 let updateHeight = getIntegerValue(this, (tokenId + kTokenInterestHeight))
257257 let reward = ((height - updateHeight) * rewardPerBlock)
258258 let interest = if ((totalSupply > 0))
259259 then fraction(reward, SCALE8, totalSupply)
260260 else 0
261261 (oldInterest + interest)
262262 }
263263
264264
265265 func calcNewLpInterest (totalSupply) = if ((startHeight >= height))
266266 then 0
267267 else {
268268 let rewardPerBlock = valueOrElse(getInteger(this, kLpRewardPerBlock), 0)
269269 let oldInterest = valueOrElse(getInteger(this, kLpInterest), 0)
270270 let updateHeight = valueOrElse(getInteger(this, kLpInterestHeight), height)
271271 let reward = ((height - updateHeight) * rewardPerBlock)
272272 let interest = if ((totalSupply > 0))
273273 then fraction(reward, SCALE8, totalSupply)
274274 else 0
275275 (oldInterest + interest)
276276 }
277277
278278
279279 func calcLendUserReward (user,tokenId) = {
280280 let totalSupply = valueOrElse(getInteger(lendContract, (kLendTokenSupply + tokenId)), 0)
281281 let tokenInterest = calcNewTokenInterest(tokenId, totalSupply)
282282 let userSupply = valueOrElse(getInteger(lendContract, ((user + kLendUserSupply) + tokenId)), 0)
283283 let userTokenInterest = valueOrElse(getInteger(this, (((tokenId + "_") + user) + kUserLendInterest)), if ((userSupply == 0))
284284 then tokenInterest
285285 else 0)
286286 let reward = fraction(userSupply, (tokenInterest - userTokenInterest), SCALE8)
287287 $Tuple3(reward, tokenInterest, userSupply)
288288 }
289289
290290
291291 func calcLpUserReward (user) = {
292292 let totalSupply = valueOrElse(getInteger(sfFarmingContract, (axlyPool + kSFTotalSupply)), 0)
293293 let tokenInterest = calcNewLpInterest(totalSupply)
294294 let userSupply = valueOrElse(getInteger(sfFarmingContract, (((axlyPool + "_") + user) + kSFUserTotalSupply)), 0)
295295 let userTokenInterest = valueOrElse(getInteger(this, (user + kUserLpInterest)), if ((userSupply == 0))
296296 then tokenInterest
297297 else 0)
298298 let reward = fraction(userSupply, (tokenInterest - userTokenInterest), SCALE8)
299299 $Tuple3(reward, tokenInterest, userSupply)
300300 }
301301
302302
303303 func claimLenderRewardsCommon (user,readOnly) = {
304304 func claim (a,tokenId) = {
305305 let $t088208864 = a
306306 let tokenIds = $t088208864._1
307307 let cAmount = $t088208864._2
308308 let total = $t088208864._3
309309 let enteries = $t088208864._4
310310 let userAvailableClaim = valueOrElse(getInteger(this, (((tokenId + "_") + user) + kUserLendAvailableClaim)), 0)
311311 let $t089779056 = calcLendUserReward(user, tokenId)
312312 let uReward = $t089779056._1
313313 let newTokenInterest = $t089779056._2
314314 let userSupply = $t089779056._3
315315 let totalToClaim = (userAvailableClaim + uReward)
316316 if (if ((totalToClaim > 0))
317317 then true
318318 else (userSupply > 0))
319319 then {
320320 let newEntreries = if (if (readOnly)
321321 then true
322322 else (totalToClaim == 0))
323323 then enteries
324324 else (enteries ++ [IntegerEntry((((tokenId + "_") + user) + kUserLendInterest), newTokenInterest), IntegerEntry((((tokenId + "_") + user) + kUserLendAvailableClaim), 0), IntegerEntry((tokenId + kTokenInterest), newTokenInterest), IntegerEntry((tokenId + kTokenInterestHeight), height)])
325325 $Tuple4((tokenIds :+ tokenId), (cAmount :+ totalToClaim), (total + totalToClaim), newEntreries)
326326 }
327327 else $Tuple4(tokenIds, cAmount, total, enteries)
328328 }
329329
330330 let $l = getAllTokens()
331331 let $s = size($l)
332332 let $acc0 = $Tuple4(nil, nil, 0, nil)
333333 func $f0_1 ($a,$i) = if (($i >= $s))
334334 then $a
335335 else claim($a, $l[$i])
336336
337337 func $f0_2 ($a,$i) = if (($i >= $s))
338338 then $a
339339 else throw("List size exceeds 30")
340340
341341 $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)
342342 }
343343
344344
345345 func claimLpRewardsCommon (user,readOnly) = {
346346 let userAvailableClaim = valueOrElse(getInteger(this, (user + kUserLpAvailableClaim)), 0)
347347 let $t0998810053 = calcLpUserReward(user)
348348 let uReward = $t0998810053._1
349349 let newLpInterest = $t0998810053._2
350350 let userSupply = $t0998810053._3
351351 let totalToClaim = (userAvailableClaim + uReward)
352352 if (if (readOnly)
353353 then true
354354 else (totalToClaim == 0))
355355 then $Tuple2(totalToClaim, nil)
356356 else $Tuple2(totalToClaim, [IntegerEntry((user + kUserLpInterest), newLpInterest), IntegerEntry((user + kUserLpAvailableClaim), 0), IntegerEntry(kLpInterest, newLpInterest), IntegerEntry(kLpInterestHeight, height)])
357357 }
358358
359359
360360 func getTokensAPRs () = {
361361 let axlyPrice = getAssetPrice(axlyId)
362362 let axlyPrecision = getAssetPrecision(axlyId)
363363 func tokensAprs (apr,tokenId) = {
364364 let rwpb = valueOrElse(getInteger(this, (tokenId + kTokenRewardPerBlock)), 0)
365365 let rwpbUsd = fraction(rwpb, axlyPrice, axlyPrecision)
366366 let rwYear = ((rwpbUsd * periodLength) * 52)
367367 let totalSupplyUsd = getTotalSupplyUsd(tokenId)
368368 (apr :+ fraction(rwYear, SCALE8, totalSupplyUsd))
369369 }
370370
371371 let aprs = {
372372 let $l = getAllTokens()
373373 let $s = size($l)
374374 let $acc0 = nil
375375 func $f0_1 ($a,$i) = if (($i >= $s))
376376 then $a
377377 else tokensAprs($a, $l[$i])
378378
379379 func $f0_2 ($a,$i) = if (($i >= $s))
380380 then $a
381381 else throw("List size exceeds 30")
382382
383383 $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)
384384 }
385385 let lpTotalSupply = getIntegerValue(sfFarmingContract, (axlyPool + kSFTotalSupply))
386386 let lpId = getStringValue(addressFromStringValue(axlyPool), kLpId)
387387 let lpPrecision = getAssetPrecision(lpId)
388388 let lpPrice = {
389389 let @ = invoke(mainContract, "getShareAssetPriceREADONLY", [lpId], nil)
390390 if ($isInstanceOf(@, "Int"))
391391 then @
392392 else throw(($getType(@) + " couldn't be cast to Int"))
393393 }
394394 let lpTotalSupplyUsd = fraction(lpTotalSupply, lpPrice, lpPrecision)
395395 let rwpb = valueOrElse(getInteger(this, kLpRewardPerBlock), 0)
396396 let rwpbUsd = fraction(rwpb, axlyPrice, axlyPrecision)
397397 let rwYear = ((rwpbUsd * periodLength) * 52)
398398 let lpApr = fraction(rwYear, SCALE8, lpTotalSupplyUsd)
399399 $Tuple3(getAllTokens(), aprs, lpApr)
400400 }
401401
402402
403403 @Callable(i)
404404 func claimLenderRewards () = {
405405 let claimRes = claimLenderRewardsCommon(toString(i.caller), false)
406406 if ((claimRes._3 == 0))
407407 then throw("claim amount must be greater than 0")
408408 else {
409409 let inv = invoke(tokenContract, "withdrawLendReward", [claimRes._3, toString(i.caller)], nil)
410410 if ((inv == inv))
411411 then claimRes._4
412412 else throw("Strict value is not equal to itself.")
413413 }
414414 }
415415
416416
417417
418418 @Callable(i)
419419 func claimLpRewards () = {
420420 let claimRes = claimLpRewardsCommon(toString(i.caller), false)
421421 if ((claimRes._1 == 0))
422422 then throw("claim amount must be greater than 0")
423423 else {
424424 let inv = invoke(tokenContract, "withdrawLpReward", [claimRes._1, toString(i.caller)], nil)
425425 if ((inv == inv))
426426 then claimRes._2
427427 else throw("Strict value is not equal to itself.")
428428 }
429429 }
430430
431431
432432
433433 @Callable(i)
434434 func lendAction (user,tokenId) = valueOrElse(isLandCall(i), {
435435 let userAvailableClaim = valueOrElse(getInteger(this, (tokenId + kUserLendAvailableClaim)), 0)
436436 let $t01240112468 = calcLendUserReward(user, tokenId)
437437 let uReward = $t01240112468._1
438438 let newTokenInterest = $t01240112468._2
439439 [IntegerEntry((((user + "_") + tokenId) + kUserLendInterest), newTokenInterest), IntegerEntry((((user + "_") + tokenId) + kUserLendAvailableClaim), (userAvailableClaim + uReward)), IntegerEntry((tokenId + kTokenInterest), newTokenInterest), IntegerEntry((tokenId + kTokenInterestHeight), height)]
440440 })
441441
442442
443443
444444 @Callable(i)
445445 func lpAction (user) = valueOrElse(isSFFarmingCall(i), {
446446 let userAvailableClaim = valueOrElse(getInteger(this, kUserLpAvailableClaim), 0)
447447 let $t01293312986 = calcLpUserReward(user)
448448 let uReward = $t01293312986._1
449449 let newLpInterest = $t01293312986._2
450450 [IntegerEntry((user + kUserLpInterest), newLpInterest), IntegerEntry((user + kUserLpAvailableClaim), (userAvailableClaim + uReward)), IntegerEntry((user + kLpInterest), newLpInterest), IntegerEntry((user + kLpInterestHeight), height)]
451451 })
452452
453453
454454
455455 @Callable(i)
456456 func init (axlyMainContractAddr,axlyTokenomicContractAddr,axlyPoolAddr,farmingStartHeight,periodLength) = valueOrElse(isSelfCall(i), if (!(isDefined(addressFromString(axlyMainContractAddr))))
457457 then throw("Wrong farming address")
458458 else if (!(isDefined(addressFromString(axlyTokenomicContractAddr))))
459459 then throw("Wrong main contract address")
460460 else [StringEntry(kAxlyMainContract, axlyMainContractAddr), StringEntry(kAxlyTokenomicContract, axlyTokenomicContractAddr), StringEntry(kAxlyPool, axlyPoolAddr), IntegerEntry(kStartHeight, farmingStartHeight), IntegerEntry(kPeriodLength, periodLength)])
461461
462462
463463
464464 @Callable(i)
465465 func initNewToken (tokenId) = valueOrElse(isAdminCall(i), if (isDefined(getInteger(this, (tokenId + kTokenInterest))))
466466 then throw("token already inited")
467467 else if (!(contains(getStringValue(lendContract, kLendSetupTokens), tokenId)))
468468 then throw("no token on landing")
469469 else {
470470 let newAllTokens = (getAllTokens() :+ tokenId)
471471 [IntegerEntry((tokenId + kTokenInterest), 0), IntegerEntry((tokenId + kTokenInterestHeight), max([startHeight, height])), StringEntry(kTokens, makeString(newAllTokens, ",")), IntegerEntry((tokenId + kTokenRewardPerBlock), 0)]
472472 })
473473
474474
475475
476476 @Callable(i)
477477 func updateRewards () = valueOrElse(isOperatorCall(i), {
478478 let lastUpdatePeriod = valueOrElse(getInteger(this, kLastUpdatePeriod), 0)
479- let curPeriod = (((height - startHeight) / periodLength) + 1)
480- if (if ((lastUpdatePeriod >= curPeriod))
481- then (lastUpdatePeriod != 0)
482- else false)
483- then throw("rewards alredy updated in this period")
484- else {
485- let $t01482514905 = getTotalSupplyAllTokens()
486- let totalSupply = $t01482514905._1
487- let totalSupplyUsd = $t01482514905._2
488- let totalSupplyUsdAll = $t01482514905._3
489- let axlyPrice = getAssetPrice(axlyId)
490- let axlyPrecision = getAssetPrecision(axlyId)
491- let maxAPR = getAdoptedAPRByPeriod(curPeriod, LENDERS_APR_PERIODS, LENDERS_APR)
492- func updateReward (a,tokenId) = {
493- let $t01515415198 = a
494- let enteries = $t01515415198._1
495- let totalPeriodReward = $t01515415198._2
496- let index = $t01515415198._3
497- if ((totalSupply[index] == 0))
498- 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))
499- else {
500- let share = fraction(totalSupplyUsd[index], SCALE8, totalSupplyUsdAll)
501- let maxReward = fraction(share, lendMaxPeriodAmount, SCALE8)
502- let maxRewardUsd = fraction(maxReward, axlyPrice, axlyPrecision)
503- let prevTotalSupply = valueOrElse(getInteger(this, kPrevLendTokenSupply), 0)
504- let rtCoef = if (if ((prevTotalSupply == 0))
505- then true
506- else (totalSupply[index] == 0))
507- then 0
508- else fraction(prevTotalSupply, SCALE8, totalSupply[index])
509- let reward = ((min([(maxAPR * (SCALE8 + rtCoef)), fraction(maxAPR, (15 * SCALE8), 10)]) / SCALE8) / 100)
510- let rewardUsd = min([maxRewardUsd, fraction(totalSupplyUsd[index], reward, SCALE8)])
511- let rewardPeriod = fraction(rewardUsd, axlyPrecision, axlyPrice)
512- let rewardPerBlock = (rewardPeriod / periodLength)
513- $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))
479+ let calcPeriod = (((height - startHeight) / periodLength) + 1)
480+ let curPeriod = if ((0 >= calcPeriod))
481+ then 1
482+ else calcPeriod
483+ if ((curPeriod > 104))
484+ then throw("max period is 104")
485+ else if (if ((lastUpdatePeriod >= curPeriod))
486+ then (lastUpdatePeriod != 0)
487+ else false)
488+ then throw("rewards alredy updated in this period")
489+ else {
490+ let $t01494415024 = getTotalSupplyAllTokens()
491+ let totalSupply = $t01494415024._1
492+ let totalSupplyUsd = $t01494415024._2
493+ let totalSupplyUsdAll = $t01494415024._3
494+ let axlyPrice = getAssetPrice(axlyId)
495+ let axlyPrecision = getAssetPrecision(axlyId)
496+ let maxAPR = getAdoptedAPRByPeriod(curPeriod, LENDERS_APR_PERIODS, LENDERS_APR)
497+ func updateReward (a,tokenId) = {
498+ let $t01527315317 = a
499+ let enteries = $t01527315317._1
500+ let totalPeriodReward = $t01527315317._2
501+ let index = $t01527315317._3
502+ if ((totalSupply[index] == 0))
503+ 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))
504+ else {
505+ let share = fraction(totalSupplyUsd[index], SCALE8, totalSupplyUsdAll)
506+ let maxReward = fraction(share, lendMaxPeriodAmount, SCALE8)
507+ let maxRewardUsd = fraction(maxReward, axlyPrice, axlyPrecision)
508+ let prevTotalSupply = valueOrElse(getInteger(this, kPrevLendTokenSupply), 0)
509+ let rtCoef = if (if ((prevTotalSupply == 0))
510+ then true
511+ else (totalSupply[index] == 0))
512+ then 0
513+ else fraction(prevTotalSupply, SCALE8, totalSupply[index])
514+ let reward = ((min([(maxAPR * (SCALE8 + rtCoef)), fraction(maxAPR, (15 * SCALE8), 10)]) / SCALE8) / 100)
515+ let rewardUsd = min([maxRewardUsd, fraction(totalSupplyUsd[index], reward, SCALE8)])
516+ let rewardPeriod = fraction(rewardUsd, axlyPrecision, axlyPrice)
517+ let rewardPerBlock = (rewardPeriod / periodLength)
518+ $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))
519+ }
520+ }
521+
522+ let $t01697917071 = {
523+ let $l = getAllTokens()
524+ let $s = size($l)
525+ let $acc0 = $Tuple3(nil, 0, 0)
526+ func $f0_1 ($a,$i) = if (($i >= $s))
527+ then $a
528+ else updateReward($a, $l[$i])
529+
530+ func $f0_2 ($a,$i) = if (($i >= $s))
531+ then $a
532+ else throw("List size exceeds 30")
533+
534+ $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)
535+ }
536+ let tokensEnteries = $t01697917071._1
537+ let totalTokenReward = $t01697917071._2
538+ let lpMaxAPR = getAdoptedAPRByPeriod(curPeriod, LP_APR_PERIODS, LP_APR)
539+ let lpTotalSupply = getIntegerValue(sfFarmingContract, (axlyPool + kSFTotalSupply))
540+ let preLPSupply = valueOrElse(getInteger(this, kPrevLPSupply), 0)
541+ let lpId = getStringValue(addressFromStringValue(axlyPool), kLpId)
542+ let lpPrecision = getAssetPrecision(lpId)
543+ let lpPrice = {
544+ let @ = invoke(mainContract, "getShareAssetPriceREADONLY", [lpId], nil)
545+ if ($isInstanceOf(@, "Int"))
546+ then @
547+ else throw(($getType(@) + " couldn't be cast to Int"))
548+ }
549+ let lpTotalSupplyUsd = fraction(lpTotalSupply, lpPrice, lpPrecision)
550+ let maxLPRewardUsd = fraction(lpMaxPeriodAmount, axlyPrice, axlyPrecision)
551+ let rtLPCoef = if (if ((preLPSupply == 0))
552+ then true
553+ else (lpTotalSupply == 0))
554+ then 0
555+ else fraction(preLPSupply, SCALE8, lpTotalSupply)
556+ let rewardLp = ((min([(lpMaxAPR * (SCALE8 + rtLPCoef)), fraction(lpMaxAPR, (15 * SCALE8), 10)]) / SCALE8) / 100)
557+ let rewardLpUsd = min([maxLPRewardUsd, fraction(lpTotalSupplyUsd, rewardLp, SCALE8)])
558+ let rewardLpPeriod = fraction(rewardLpUsd, axlyPrecision, axlyPrice)
559+ let rewardLpPerBlock = (rewardLpPeriod / periodLength)
560+ let burnLend = (lendMaxPeriodAmount - totalTokenReward)
561+ let burnLp = (lpMaxPeriodAmount - rewardLpPeriod)
562+ let inv = invoke(tokenContract, "withdrawLpReward", [(burnLend + burnLp), toString(this)], nil)
563+ if ((inv == inv))
564+ then {
565+ let lpEnteries = if ((12 >= curPeriod))
566+ then [IntegerEntry(kPrevLPSupply, lpTotalSupply), IntegerEntry(kLpRewardPerBlock, rewardLpPerBlock), IntegerEntry(kLpInterest, calcNewLpInterest(lpTotalSupply)), IntegerEntry(kLpInterestHeight, max([startHeight, height])), ScriptTransfer(Address(base58'3MsXJ3BesPECkYejzBQGHZPJT8GVYy4Fd3Q'), burnLend, fromBase58String(axlyId)), ScriptTransfer(Address(base58'3MsXJ3BesPECkYejzBQGHZPJT8GVYy4Fd3Q'), burnLp, fromBase58String(axlyId))]
567+ else nil
568+ ((lpEnteries ++ tokensEnteries) :+ IntegerEntry(kLastUpdatePeriod, lastUpdatePeriod))
514569 }
570+ else throw("Strict value is not equal to itself.")
515571 }
516-
517- let $t01686016958 = {
518- let $l = getAllTokens()
519- let $s = size($l)
520- let $acc0 = $Tuple3(nil, 0, 0)
521- func $f0_1 ($a,$i) = if (($i >= $s))
522- then $a
523- else updateReward($a, $l[$i])
524-
525- func $f0_2 ($a,$i) = if (($i >= $s))
526- then $a
527- else throw("List size exceeds 30")
528-
529- $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)
530- }
531- let tokensEnteries = $t01686016958._1
532- let totalTokenReward = $t01686016958._2
533- let index = $t01686016958._3
534- let lpMaxAPR = getAdoptedAPRByPeriod(curPeriod, LP_APR_PERIODS, LP_APR)
535- let lpTotalSupply = getIntegerValue(sfFarmingContract, (axlyPool + kSFTotalSupply))
536- let preLPSupply = valueOrElse(getInteger(this, kPrevLPSupply), 0)
537- let lpId = getStringValue(addressFromStringValue(axlyPool), kLpId)
538- let lpPrecision = getAssetPrecision(lpId)
539- let lpPrice = {
540- let @ = invoke(mainContract, "getShareAssetPriceREADONLY", [lpId], nil)
541- if ($isInstanceOf(@, "Int"))
542- then @
543- else throw(($getType(@) + " couldn't be cast to Int"))
544- }
545- let lpTotalSupplyUsd = fraction(lpTotalSupply, lpPrice, lpPrecision)
546- let maxLPRewardUsd = fraction(lpMaxPeriodAmount, axlyPrice, axlyPrecision)
547- let rtLPCoef = if (if ((preLPSupply == 0))
548- then true
549- else (lpTotalSupply == 0))
550- then 0
551- else fraction(preLPSupply, SCALE8, lpTotalSupply)
552- let rewardLp = ((min([(lpMaxAPR * (SCALE8 + rtLPCoef)), fraction(lpMaxAPR, (15 * SCALE8), 10)]) / SCALE8) / 100)
553- let rewardLpUsd = min([maxLPRewardUsd, fraction(lpTotalSupplyUsd, rewardLp, SCALE8)])
554- let rewardLpPeriod = fraction(rewardLpUsd, axlyPrecision, axlyPrice)
555- let rewardLpPerBlock = (rewardLpPeriod / periodLength)
556- let burnLend = (lendMaxPeriodAmount - totalTokenReward)
557- let burnLp = (lpMaxPeriodAmount - rewardLpPeriod)
558- let inv = invoke(tokenContract, "withdrawLpReward", [(burnLend + burnLp), toString(this)], nil)
559- if ((inv == inv))
560- then {
561- let lpEnteries = [IntegerEntry(kPrevLPSupply, lpTotalSupply), IntegerEntry(kLpRewardPerBlock, rewardLpPerBlock), IntegerEntry(kLpInterest, calcNewLpInterest(lpTotalSupply)), IntegerEntry(kLpInterestHeight, max([startHeight, height])), ScriptTransfer(Address(base58'3MsXJ3BesPECkYejzBQGHZPJT8GVYy4Fd3Q'), burnLend, fromBase58String(axlyId)), ScriptTransfer(Address(base58'3MsXJ3BesPECkYejzBQGHZPJT8GVYy4Fd3Q'), burnLp, fromBase58String(axlyId))]
562- ((lpEnteries ++ tokensEnteries) :+ IntegerEntry(kLastUpdatePeriod, lastUpdatePeriod))
563- }
564- else throw("Strict value is not equal to itself.")
565- }
566572 })
567573
568574
569575 @Verifier(tx)
570576 func verify () = {
571577 let multiSignedByAdmins = {
572578 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], admin1PK))
573579 then 1
574580 else 0
575581 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], admin2PK))
576582 then 1
577583 else 0
578584 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], admin3PK))
579585 then 1
580586 else 0
581587 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
582588 }
583589 match tx {
584590 case inv: InvokeScriptTransaction =>
585591 let isSelf = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
586592 let isRightFee = if ((inv.fee == 900000))
587593 then (inv.feeAssetId == unit)
588594 else false
589595 let isInitCall = (inv.function == "init")
590596 let isnoPayments = (size(inv.payments) == 0)
591597 if (if (if (if (isRightFee)
592598 then isInitCall
593599 else false)
594600 then isSelf
595601 else false)
596602 then isnoPayments
597603 else false)
598604 then true
599605 else multiSignedByAdmins
600606 case _ =>
601607 multiSignedByAdmins
602608 }
603609 }
604610

github/deemru/w8io/026f985 
56.24 ms