tx · 2dh898hSMEeoAvR25DE53RCGXkHrz6yz86qyw8fANhKh

3N2M4PztorHwrfENp7D6LhYGgGodjiD1fjn:  -0.02400000 Waves

2023.08.24 15:42 [2724733] smart account 3N2M4PztorHwrfENp7D6LhYGgGodjiD1fjn > SELF 0.00000000 Waves

{ "type": 13, "id": "2dh898hSMEeoAvR25DE53RCGXkHrz6yz86qyw8fANhKh", "fee": 2400000, "feeAssetId": null, "timestamp": 1692880933594, "version": 2, "chainId": 84, "sender": "3N2M4PztorHwrfENp7D6LhYGgGodjiD1fjn", "senderPublicKey": "Fj9LPkCtmW3pDnVU6wPQnvqpZJCBieWSvZqY5FAGeCyp", "proofs": [ "36d4N8ykDfk9x3zDuGNZeefpuB5iixZrK97HqRqDDJKUgrQRrm1K8fxuHWhWJwwnY5Qe6DhHdnySD8roWQAPicJR", "39PhwqhCVo6SFJq82qWNEzaHAy4md4rwBBm3pNFJN1pjbe71C9oM93n7NsjYxShiw5oHarYvN9PDXYZeb84SiSVJ" ], "script": "base64:BgIhCAISABIAEgQKAggIEgMKAQgSBwoFCAgIAQESAwoBCBIAUAAGU0NBTEU4AIDC1y8AC0xFTkRFUlNfQVBSCQDMCAIAlgEJAMwIAgB4CQDMCAIAZAkAzAgCAFAJAMwIAgA8CQDMCAIAKAkAzAgCAB4JAMwIAgAUCQDMCAIACgUDbmlsABNMRU5ERVJTX0FQUl9QRVJJT0RTCQDMCAICAzEtMQkAzAgCAgMyLTIJAMwIAgIDMy0zCQDMCAICAzQtNAkAzAgCAgM1LTgJAMwIAgIEOS0xMgkAzAgCAgUxNC0xNgkAzAgCAgUxNy0yMAkAzAgCAgYyMC0xMDQFA25pbAATTEVOREVSU19NQVhfUEVSSU9EUwBoAAZMUF9BUFIJAMwIAgCWAQkAzAgCAHgJAMwIAgBkCQDMCAIAUAkAzAgCADwJAMwIAgAoBQNuaWwADkxQX0FQUl9QRVJJT0RTCQDMCAICAzEtMQkAzAgCAgMyLTIJAMwIAgIDMy0zCQDMCAICAzQtNAkAzAgCAgM1LTgJAMwIAgIEOS0xMgUDbmlsAA5MUF9NQVhfUEVSSU9EUwAMAAxrU3RhcnRIZWlnaHQCC3N0YXJ0SGVpZ2h0AA1rUGVyaW9kTGVuZ3RoAgxwZXJpb2RMZW5ndGgAEWtMZW5kZXJzTWF4QW1vdW50AhFsZW5kUmV3YXJkc0Ftb3VudAAMa0xQTWF4QW1vdW50Ag5scFJld2FyZEFtb3VudAAHa1Rva2VucwIGdG9rZW5zAAtrVXNlclN1cHBseQIQX3VzZXJUb3RhbFN1cHBseQAOa1Rva2VuSW50ZXJlc3QCDl90b2tlbkludGVyZXN0ABRrVG9rZW5JbnRlcmVzdEhlaWdodAIUX3Rva2VuSW50ZXJlc3RIZWlnaHQAFGtUb2tlblJld2FyZFBlckJsb2NrAhRfdG9rZW5SZXdhcmRQZXJCbG9jawARa0xhc3RVcGRhdGVQZXJpb2QCEnJld2FyZFVwZGF0ZVBlcmlvZAARa1VzZXJMZW5kSW50ZXJlc3QCEV91c2VyTGFuZEludGVyZXN0ABdrVXNlckxlbmRBdmFpbGFibGVDbGFpbQIXX3VzZXJMZW5kQXZhaWxhYmxlQ2xhaW0AFWtVc2VyTHBBdmFpbGFibGVDbGFpbQIVX3VzZXJMcEF2YWlsYWJsZUNsYWltAAtrTHBJbnRlcmVzdAIKbHBJbnRlcmVzdAARa0xwSW50ZXJlc3RIZWlnaHQCEGxwSW50ZXJlc3RIZWlnaHQADWtQcmV2TFBTdXBwbHkCEXByZXZMUFRvdGFsU3VwcGx5ABFrTHBSZXdhcmRQZXJCbG9jawIQbHBSZXdhcmRQZXJCbG9jawAPa1VzZXJMcEludGVyZXN0Ag9fdXNlckxwSW50ZXJlc3QADmtQcmljZUluT3JhY2xlAgdfdHdhcDVCABRrUHJldkxlbmRUb2tlblN1cHBseQIUX3ByZXZMZW5kVG90YWxTdXBwbHkADGtBWExZVG9rZW5JZAILYXhseVRva2VuSWQAEGtMZW5kVG9rZW5TdXBwbHkCD3RvdGFsX3N1cHBsaWVkXwAPa0xlbmRVc2VyU3VwcGx5Agpfc3VwcGxpZWRfABBrTGVuZFNldHVwVG9rZW5zAgxzZXR1cF90b2tlbnMADmtTRlRvdGFsU3VwcGx5AhpfdG90YWxfc2hhcmVfdG9rZW5zX2xvY2tlZAASa1NGVXNlclRvdGFsU3VwcGx5AhRfc2hhcmVfdG9rZW5zX2xvY2tlZAAJa0F4bHlQb29sAghheGx5UG9vbAAFa0xwSWQCDnNoYXJlX2Fzc2V0X2lkAAxrUHJpY2VPcmFjbGUCDHByaWNlX29yYWNsZQARa0F4bHlNYWluQ29udHJhY3QCDG1haW5Db250cmFjdAAWa0F4bHlUb2tlbm9taWNDb250cmFjdAIRdG9rZW5vbWljQ29udHJhY3QAEmtTRkZhcm1pbmdDb250cmFjdAITc3dvcGZpX2Zhcm1pbmdfYWRkcgANa0xlbmRDb250cmFjdAIRbGVuZF9zZXJ2aWNlX2FkZHIACWtBZG1pbjFQSwIVZ3JvdXAxX2FkbWluMV9wdWJfa2V5AAlrQWRtaW4yUEsCFWdyb3VwMV9hZG1pbjJfcHViX2tleQAJa0FkbWluM1BLAhVncm91cDFfYWRtaW4zX3B1Yl9rZXkAD2tPcGVyYXRvckNhbGxQSwISYWRtaW5fY2FsbF9wdWJfa2V5AAhheGx5UG9vbAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMFCWtBeGx5UG9vbAIWQ2FuJ3QgZ2V0IGF4bHlQb29sIGtleQAMbWFpbkNvbnRyYWN0CQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwURa0F4bHlNYWluQ29udHJhY3QCGUNhbid0IGdldCBtYWluQ29udGFjdCBrZXkADXRva2VuQ29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBRZrQXhseVRva2Vub21pY0NvbnRyYWN0Ah9DYW4ndCBnZXQgdG9rZW5vbWljQ29udHJhY3Qga2V5AAxsZW5kQ29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQxtYWluQ29udHJhY3QFDWtMZW5kQ29udHJhY3QCH0Nhbid0IGdldCBsZW5kX3NlcnZpY2VfYWRkciBrZXkAEXNmRmFybWluZ0NvbnRyYWN0CQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUMbWFpbkNvbnRyYWN0BRJrU0ZGYXJtaW5nQ29udHJhY3QCIUNhbid0IGdldCBzd29wZmlfZmFybWluZ19hZGRyIGtleQAPcHJpY2VPcmFjbGVBZGRyCQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUMbWFpbkNvbnRyYWN0BQxrUHJpY2VPcmFjbGUCGkNhbid0IGdldCBwcmljZV9vcmFjbGUga2V5AAhhZG1pbjFQSwkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUMbWFpbkNvbnRyYWN0BQlrQWRtaW4xUEsCEkNhbid0IGdldCBhZG1pbjFQSwAIYWRtaW4yUEsJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFDG1haW5Db250cmFjdAUJa0FkbWluMlBLAhJDYW4ndCBnZXQgYWRtaW4yUEsACGFkbWluM1BLCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQxtYWluQ29udHJhY3QFCWtBZG1pbjNQSwIUQ2FuJ3QgZ2V0IG9wZXJhdG9yUEsACm9wZXJhdG9yUEsJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMFD2tPcGVyYXRvckNhbGxQSwIUQ2FuJ3QgZ2V0IG9wZXJhdG9yUEsABmF4bHlJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFDXRva2VuQ29udHJhY3QFDGtBWExZVG9rZW5JZAIXQ2FuJ3QgZ2V0IEF4bHkgdG9rZW4gaWQAC3N0YXJ0SGVpZ2h0CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzBQxrU3RhcnRIZWlnaHQADHBlcmlvZExlbmd0aAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwUNa1BlcmlvZExlbmd0aAANbGVuZE1heEFtb3VudAkBEUBleHRyTmF0aXZlKDEwNTApAgUNdG9rZW5Db250cmFjdAURa0xlbmRlcnNNYXhBbW91bnQAE2xlbmRNYXhQZXJpb2RBbW91bnQJAGkCBQ1sZW5kTWF4QW1vdW50BRNMRU5ERVJTX01BWF9QRVJJT0RTAAtscE1heEFtb3VudAkBEUBleHRyTmF0aXZlKDEwNTApAgUNdG9rZW5Db250cmFjdAUMa0xQTWF4QW1vdW50ABFscE1heFBlcmlvZEFtb3VudAkAaQIFC2xwTWF4QW1vdW50BQ5MUF9NQVhfUEVSSU9EUwELaXNBZG1pbkNhbGwBAWkDCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQhhZG1pbjFQSwkAzAgCBQhhZG1pbjJQSwkAzAgCBQhhZG1pbjNQSwUDbmlsCAUBaQ9jYWxsZXJQdWJsaWNLZXkFBHVuaXQJAAIBAihPbmx5IGFkbWluIGdyb3VwMSBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uAQppc1NlbGZDYWxsAQFpAwkAAAIIBQFpBmNhbGxlcgUEdGhpcwUEdW5pdAkAAgECK09ubHkgY29udHJhY3QgaXRzZWxmIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24BDmlzT3BlcmF0b3JDYWxsAQFpAwkAAAIIBQFpD2NhbGxlclB1YmxpY0tleQUKb3BlcmF0b3JQSwUEdW5pdAkAAgECJE9ubHkgb3BlcmF0b3IgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgEKaXNMYW5kQ2FsbAEBaQMJAAACCAUBaQZjYWxsZXIFDGxlbmRDb250cmFjdAUEdW5pdAkAAgECKU9ubHkgbGFuZCBjb250cmFjdCBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uAQ9pc1NGRmFybWluZ0NhbGwBAWkDCQAAAggFAWkGY2FsbGVyBRFzZkZhcm1pbmdDb250cmFjdAUEdW5pdAkAAgECKU9ubHkgbGFuZCBjb250cmFjdCBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uAQxnZXRBbGxUb2tlbnMABAZ0b2tlbnMJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwUHa1Rva2VucwIAAwkAAAIFBnRva2VucwIABQNuaWwJALUJAgUGdG9rZW5zAgEsAQ1nZXRBc3NldFByaWNlAQdhc3NldElkCQERQGV4dHJOYXRpdmUoMTA1MCkCBQ9wcmljZU9yYWNsZUFkZHIJAKwCAgUHYXNzZXRJZAUOa1ByaWNlSW5PcmFjbGUBEGdldEFzc2V0RGVjaW1hbHMBB2Fzc2V0SWQDCQAAAgUHYXNzZXRJZAIFV0FWRVMACAQHJG1hdGNoMAkA7AcBCQDZBAEFB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIFQXNzZXQEBWFzc2V0BQckbWF0Y2gwCAUFYXNzZXQIZGVjaW1hbHMJAAIBAhBDYW4ndCBmaW5kIGFzc2V0ARFnZXRBc3NldFByZWNpc2lvbgEHYXNzZXRJZAkAbAYACgAACQEQZ2V0QXNzZXREZWNpbWFscwEFB2Fzc2V0SWQAAAAABQRET1dOARVnZXRBZG9wdGVkQVBSQnlQZXJpb2QDBnBlcmlvZAphcHJQZXJpb2RzA2FwcgoBA2ZvcgIBYQdhcGVyaW9kBAskdDA1MzYyNTM4NAUBYQQFaW5kZXgIBQskdDA1MzYyNTM4NAJfMQQFZm91bmQIBQskdDA1MzYyNTM4NAJfMgQCZnQJALUJAgUHYXBlcmlvZAIBLQQLJHQwNTQyMTU0ODQJAJQKAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmZ0AAAJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJmdAABBARmcm9tCAULJHQwNTQyMTU0ODQCXzEEAnRvCAULJHQwNTQyMTU0ODQCXzIDBQVmb3VuZAUBYQMDCQBnAgUGcGVyaW9kBQRmcm9tCQBnAgUCdG8FBnBlcmlvZAcJAJQKAgUFaW5kZXgGCQCUCgIJAGQCBQVpbmRleAABBwQLJHQwNTYyMTU2ODcKAAIkbAUTTEVOREVSU19BUFJfUEVSSU9EUwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgAABwoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEDZm9yAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA5CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJBAVpbmRleAgFCyR0MDU2MjE1Njg3Al8xBAVmb3VuZAgFCyR0MDU2MjE1Njg3Al8yAwUFZm91bmQJAGsDCQBoAgkAkQMCBQtMRU5ERVJTX0FQUgUFaW5kZXgFBlNDQUxFOAAHAO0CAAABF2dldFRvdGFsU3VwcGx5QWxsVG9rZW5zAAoBA2ZvcgIBYQd0b2tlbklkBAskdDA1ODc1NTkzMQUBYQQLdG90YWxTdXBwbHkIBQskdDA1ODc1NTkzMQJfMQQOdG90YWxTdXBwbHlVc2QIBQskdDA1ODc1NTkzMQJfMgQRdG90YWxTdXBwbHlVc2RBbGwIBQskdDA1ODc1NTkzMQJfMwQHdFN1cHBseQkBC3ZhbHVlT3JFbHNlAgkAmggCBQxsZW5kQ29udHJhY3QJAKwCAgUQa0xlbmRUb2tlblN1cHBseQUHdG9rZW5JZAAABAphc3NldFByaWNlCQENZ2V0QXNzZXRQcmljZQEFB3Rva2VuSWQEDmFzc2V0UHJlY2lzaW9uCQERZ2V0QXNzZXRQcmVjaXNpb24BBQd0b2tlbklkBAp0U3VwcGx5VXNkCQBrAwUHdFN1cHBseQUKYXNzZXRQcmljZQUOYXNzZXRQcmVjaXNpb24JAJUKAwkAzQgCBQt0b3RhbFN1cHBseQUHdFN1cHBseQkAzQgCBQ50b3RhbFN1cHBseVVzZAUKdFN1cHBseVVzZAkAZAIFEXRvdGFsU3VwcGx5VXNkQWxsBQp0U3VwcGx5VXNkCgACJGwJAQxnZXRBbGxUb2tlbnMACgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlQoDBQNuaWwFA25pbAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQNmb3ICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDMwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAAVABYAFwAYABkAGgAbABwAHQAeARFnZXRUb3RhbFN1cHBseVVzZAEHdG9rZW5JZAQHdFN1cHBseQkBC3ZhbHVlT3JFbHNlAgkAmggCBQxsZW5kQ29udHJhY3QJAKwCAgUQa0xlbmRUb2tlblN1cHBseQUHdG9rZW5JZAAABAphc3NldFByaWNlCQENZ2V0QXNzZXRQcmljZQEFB3Rva2VuSWQEDmFzc2V0UHJlY2lzaW9uCQERZ2V0QXNzZXRQcmVjaXNpb24BBQd0b2tlbklkCQBrAwUHdFN1cHBseQUKYXNzZXRQcmljZQUOYXNzZXRQcmVjaXNpb24BFGNhbGNOZXdUb2tlbkludGVyZXN0Agd0b2tlbklkC3RvdGFsU3VwcGx5AwkAZwIFC3N0YXJ0SGVpZ2h0BQZoZWlnaHQAAAQOcmV3YXJkUGVyQmxvY2sJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgUHdG9rZW5JZAUUa1Rva2VuUmV3YXJkUGVyQmxvY2sEC29sZEludGVyZXN0CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIFB3Rva2VuSWQFDmtUb2tlbkludGVyZXN0BAx1cGRhdGVIZWlnaHQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgUHdG9rZW5JZAUUa1Rva2VuSW50ZXJlc3RIZWlnaHQEBnJld2FyZAkAaAIJAGUCBQZoZWlnaHQFDHVwZGF0ZUhlaWdodAUOcmV3YXJkUGVyQmxvY2sECGludGVyZXN0AwkAZgIFC3RvdGFsU3VwcGx5AAAJAGsDBQZyZXdhcmQFBlNDQUxFOAULdG90YWxTdXBwbHkAAAkAZAIFC29sZEludGVyZXN0BQhpbnRlcmVzdAERY2FsY05ld0xwSW50ZXJlc3QBC3RvdGFsU3VwcGx5AwkAZwIFC3N0YXJ0SGVpZ2h0BQZoZWlnaHQAAAQOcmV3YXJkUGVyQmxvY2sJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwURa0xwUmV3YXJkUGVyQmxvY2sAAAQLb2xkSW50ZXJlc3QJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwULa0xwSW50ZXJlc3QAAAQMdXBkYXRlSGVpZ2h0CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFEWtMcEludGVyZXN0SGVpZ2h0BQZoZWlnaHQEBnJld2FyZAkAaAIJAGUCBQZoZWlnaHQFDHVwZGF0ZUhlaWdodAUOcmV3YXJkUGVyQmxvY2sECGludGVyZXN0AwkAZgIFC3RvdGFsU3VwcGx5AAAJAGsDBQZyZXdhcmQFBlNDQUxFOAULdG90YWxTdXBwbHkAAAkAZAIFC29sZEludGVyZXN0BQhpbnRlcmVzdAESY2FsY0xlbmRVc2VyUmV3YXJkAgR1c2VyB3Rva2VuSWQEC3RvdGFsU3VwcGx5CQELdmFsdWVPckVsc2UCCQCaCAIFDGxlbmRDb250cmFjdAkArAICBRBrTGVuZFRva2VuU3VwcGx5BQd0b2tlbklkAAAEDXRva2VuSW50ZXJlc3QJARRjYWxjTmV3VG9rZW5JbnRlcmVzdAIFB3Rva2VuSWQFC3RvdGFsU3VwcGx5BAp1c2VyU3VwcGx5CQELdmFsdWVPckVsc2UCCQCaCAIFDGxlbmRDb250cmFjdAkArAICCQCsAgIFBHVzZXIFD2tMZW5kVXNlclN1cHBseQUHdG9rZW5JZAAABBF1c2VyVG9rZW5JbnRlcmVzdAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICBQd0b2tlbklkAgFfBQR1c2VyBRFrVXNlckxlbmRJbnRlcmVzdAMJAAACBQp1c2VyU3VwcGx5AAAFDXRva2VuSW50ZXJlc3QAAAQGcmV3YXJkCQBrAwUKdXNlclN1cHBseQkAZQIFDXRva2VuSW50ZXJlc3QFEXVzZXJUb2tlbkludGVyZXN0BQZTQ0FMRTgJAJUKAwUGcmV3YXJkBQ10b2tlbkludGVyZXN0BQp1c2VyU3VwcGx5ARBjYWxjTHBVc2VyUmV3YXJkAQR1c2VyBAt0b3RhbFN1cHBseQkBC3ZhbHVlT3JFbHNlAgkAmggCBRFzZkZhcm1pbmdDb250cmFjdAkArAICBQhheGx5UG9vbAUOa1NGVG90YWxTdXBwbHkAAAQNdG9rZW5JbnRlcmVzdAkBEWNhbGNOZXdMcEludGVyZXN0AQULdG90YWxTdXBwbHkECnVzZXJTdXBwbHkJAQt2YWx1ZU9yRWxzZQIJAJoIAgURc2ZGYXJtaW5nQ29udHJhY3QJAKwCAgkArAICCQCsAgIFCGF4bHlQb29sAgFfBQR1c2VyBRJrU0ZVc2VyVG90YWxTdXBwbHkAAAQRdXNlclRva2VuSW50ZXJlc3QJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQR1c2VyBQ9rVXNlckxwSW50ZXJlc3QDCQAAAgUKdXNlclN1cHBseQAABQ10b2tlbkludGVyZXN0AAAEBnJld2FyZAkAawMFCnVzZXJTdXBwbHkJAGUCBQ10b2tlbkludGVyZXN0BRF1c2VyVG9rZW5JbnRlcmVzdAUGU0NBTEU4CQCVCgMFBnJld2FyZAUNdG9rZW5JbnRlcmVzdAUKdXNlclN1cHBseQEYY2xhaW1MZW5kZXJSZXdhcmRzQ29tbW9uAgR1c2VyCHJlYWRPbmx5CgEFY2xhaW0CAWEHdG9rZW5JZAQLJHQwODgyMDg4NjQFAWEECHRva2VuSWRzCAULJHQwODgyMDg4NjQCXzEEB2NBbW91bnQIBQskdDA4ODIwODg2NAJfMgQFdG90YWwIBQskdDA4ODIwODg2NAJfMwQIZW50ZXJpZXMIBQskdDA4ODIwODg2NAJfNAQSdXNlckF2YWlsYWJsZUNsYWltCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIFB3Rva2VuSWQCAV8FBHVzZXIFF2tVc2VyTGVuZEF2YWlsYWJsZUNsYWltAAAECyR0MDg5Nzc5MDU2CQESY2FsY0xlbmRVc2VyUmV3YXJkAgUEdXNlcgUHdG9rZW5JZAQHdVJld2FyZAgFCyR0MDg5Nzc5MDU2Al8xBBBuZXdUb2tlbkludGVyZXN0CAULJHQwODk3NzkwNTYCXzIECnVzZXJTdXBwbHkIBQskdDA4OTc3OTA1NgJfMwQMdG90YWxUb0NsYWltCQBkAgUSdXNlckF2YWlsYWJsZUNsYWltBQd1UmV3YXJkAwMJAGYCBQx0b3RhbFRvQ2xhaW0AAAYJAGYCBQp1c2VyU3VwcGx5AAAEDG5ld0VudHJlcmllcwMDBQhyZWFkT25seQYJAAACBQx0b3RhbFRvQ2xhaW0AAAUIZW50ZXJpZXMJAM4IAgUIZW50ZXJpZXMJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIFB3Rva2VuSWQCAV8FBHVzZXIFEWtVc2VyTGVuZEludGVyZXN0BRBuZXdUb2tlbkludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICBQd0b2tlbklkAgFfBQR1c2VyBRdrVXNlckxlbmRBdmFpbGFibGVDbGFpbQAACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFB3Rva2VuSWQFDmtUb2tlbkludGVyZXN0BRBuZXdUb2tlbkludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFB3Rva2VuSWQFFGtUb2tlbkludGVyZXN0SGVpZ2h0BQZoZWlnaHQFA25pbAkAlgoECQDNCAIFCHRva2VuSWRzBQd0b2tlbklkCQDNCAIFB2NBbW91bnQFDHRvdGFsVG9DbGFpbQkAZAIFBXRvdGFsBQx0b3RhbFRvQ2xhaW0FDG5ld0VudHJlcmllcwkAlgoEBQh0b2tlbklkcwUHY0Ftb3VudAUFdG90YWwFCGVudGVyaWVzCgACJGwJAQxnZXRBbGxUb2tlbnMACgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlgoEBQNuaWwFA25pbAAABQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBBWNsYWltAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAzMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgEUY2xhaW1McFJld2FyZHNDb21tb24CBHVzZXIIcmVhZE9ubHkEEnVzZXJBdmFpbGFibGVDbGFpbQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHVzZXIFFWtVc2VyTHBBdmFpbGFibGVDbGFpbQAABAwkdDA5OTg3MTAwNTIJARBjYWxjTHBVc2VyUmV3YXJkAQUEdXNlcgQHdVJld2FyZAgFDCR0MDk5ODcxMDA1MgJfMQQNbmV3THBJbnRlcmVzdAgFDCR0MDk5ODcxMDA1MgJfMgQKdXNlclN1cHBseQgFDCR0MDk5ODcxMDA1MgJfMwQMdG90YWxUb0NsYWltCQBkAgUSdXNlckF2YWlsYWJsZUNsYWltBQd1UmV3YXJkAwMFCHJlYWRPbmx5BgkAAAIFDHRvdGFsVG9DbGFpbQAACQCUCgIFDHRvdGFsVG9DbGFpbQUDbmlsCQCUCgIFDHRvdGFsVG9DbGFpbQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQR1c2VyBQ9rVXNlckxwSW50ZXJlc3QFDW5ld0xwSW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEdXNlcgUVa1VzZXJMcEF2YWlsYWJsZUNsYWltAAAJAMwIAgkBDEludGVnZXJFbnRyeQIFC2tMcEludGVyZXN0BQ1uZXdMcEludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRFrTHBJbnRlcmVzdEhlaWdodAUGaGVpZ2h0BQNuaWwBDWdldFRva2Vuc0FQUnMABAlheGx5UHJpY2UJAQ1nZXRBc3NldFByaWNlAQUGYXhseUlkBA1heGx5UHJlY2lzaW9uCQERZ2V0QXNzZXRQcmVjaXNpb24BBQZheGx5SWQKAQp0b2tlbnNBcHJzAgNhcHIHdG9rZW5JZAQEcndwYgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFB3Rva2VuSWQFFGtUb2tlblJld2FyZFBlckJsb2NrAAAEB3J3cGJVc2QJAGsDBQRyd3BiBQlheGx5UHJpY2UFDWF4bHlQcmVjaXNpb24EBnJ3WWVhcgkAaAIJAGgCBQdyd3BiVXNkBQxwZXJpb2RMZW5ndGgANAQOdG90YWxTdXBwbHlVc2QJARFnZXRUb3RhbFN1cHBseVVzZAEFB3Rva2VuSWQJAM0IAgUDYXByCQBrAwUGcndZZWFyBQZTQ0FMRTgFDnRvdGFsU3VwcGx5VXNkBARhcHJzCgACJGwJAQxnZXRBbGxUb2tlbnMACgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQp0b2tlbnNBcHJzAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAzMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgQNbHBUb3RhbFN1cHBseQkBEUBleHRyTmF0aXZlKDEwNTApAgURc2ZGYXJtaW5nQ29udHJhY3QJAKwCAgUIYXhseVBvb2wFDmtTRlRvdGFsU3VwcGx5BARscElkCQERQGV4dHJOYXRpdmUoMTA1MykCCQERQGV4dHJOYXRpdmUoMTA2MikBBQhheGx5UG9vbAUFa0xwSWQEC2xwUHJlY2lzaW9uCQERZ2V0QXNzZXRQcmVjaXNpb24BBQRscElkBAdscFByaWNlCgABQAkA/AcEBQxtYWluQ29udHJhY3QCGmdldFNoYXJlQXNzZXRQcmljZVJFQURPTkxZCQDMCAIFBGxwSWQFA25pbAUDbmlsAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAQQbHBUb3RhbFN1cHBseVVzZAkAawMFDWxwVG90YWxTdXBwbHkFB2xwUHJpY2UFC2xwUHJlY2lzaW9uBARyd3BiCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFEWtMcFJld2FyZFBlckJsb2NrAAAEB3J3cGJVc2QJAGsDBQRyd3BiBQlheGx5UHJpY2UFDWF4bHlQcmVjaXNpb24EBnJ3WWVhcgkAaAIJAGgCBQdyd3BiVXNkBQxwZXJpb2RMZW5ndGgANAQFbHBBcHIJAGsDBQZyd1llYXIFBlNDQUxFOAUQbHBUb3RhbFN1cHBseVVzZAkAlQoDCQEMZ2V0QWxsVG9rZW5zAAUEYXBycwUFbHBBcHIHAWkBEmNsYWltTGVuZGVyUmV3YXJkcwAECGNsYWltUmVzCQEYY2xhaW1MZW5kZXJSZXdhcmRzQ29tbW9uAgkApQgBCAUBaQZjYWxsZXIHAwkAAAIIBQhjbGFpbVJlcwJfMwAACQACAQIjY2xhaW0gYW1vdW50IG11c3QgYmUgZ3JlYXRlciB0aGFuIDAEA2ludgkA/AcEBQ10b2tlbkNvbnRyYWN0AhJ3aXRoZHJhd0xlbmRSZXdhcmQJAMwIAggFCGNsYWltUmVzAl8zCQDMCAIJAKUIAQgFAWkGY2FsbGVyBQNuaWwFA25pbAMJAAACBQNpbnYFA2ludggFCGNsYWltUmVzAl80CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDmNsYWltTHBSZXdhcmRzAAQIY2xhaW1SZXMJARRjbGFpbUxwUmV3YXJkc0NvbW1vbgIJAKUIAQgFAWkGY2FsbGVyBwMJAAACCAUIY2xhaW1SZXMCXzEAAAkAAgECI2NsYWltIGFtb3VudCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwBANpbnYJAPwHBAUNdG9rZW5Db250cmFjdAIQd2l0aGRyYXdMcFJld2FyZAkAzAgCCAUIY2xhaW1SZXMCXzEJAMwIAgkApQgBCAUBaQZjYWxsZXIFA25pbAUDbmlsAwkAAAIFA2ludgUDaW52CAUIY2xhaW1SZXMCXzIJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEKbGVuZEFjdGlvbgIEdXNlcgd0b2tlbklkCQELdmFsdWVPckVsc2UCCQEKaXNMYW5kQ2FsbAEFAWkEEnVzZXJBdmFpbGFibGVDbGFpbQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFB3Rva2VuSWQFF2tVc2VyTGVuZEF2YWlsYWJsZUNsYWltAAAEDSR0MDEyMzk5MTI0NjYJARJjYWxjTGVuZFVzZXJSZXdhcmQCBQR1c2VyBQd0b2tlbklkBAd1UmV3YXJkCAUNJHQwMTIzOTkxMjQ2NgJfMQQQbmV3VG9rZW5JbnRlcmVzdAgFDSR0MDEyMzk5MTI0NjYCXzIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIFB3Rva2VuSWQCAV8FBHVzZXIFEWtVc2VyTGVuZEludGVyZXN0BRBuZXdUb2tlbkludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICBQd0b2tlbklkAgFfBQR1c2VyBRdrVXNlckxlbmRBdmFpbGFibGVDbGFpbQkAZAIFEnVzZXJBdmFpbGFibGVDbGFpbQUHdVJld2FyZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQd0b2tlbklkBQ5rVG9rZW5JbnRlcmVzdAUQbmV3VG9rZW5JbnRlcmVzdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQd0b2tlbklkBRRrVG9rZW5JbnRlcmVzdEhlaWdodAUGaGVpZ2h0BQNuaWwBaQEIbHBBY3Rpb24BBHVzZXIJAQt2YWx1ZU9yRWxzZQIJAQ9pc1NGRmFybWluZ0NhbGwBBQFpBBJ1c2VyQXZhaWxhYmxlQ2xhaW0JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUVa1VzZXJMcEF2YWlsYWJsZUNsYWltAAAEDSR0MDEyOTMxMTI5ODQJARBjYWxjTHBVc2VyUmV3YXJkAQUEdXNlcgQHdVJld2FyZAgFDSR0MDEyOTMxMTI5ODQCXzEEDW5ld0xwSW50ZXJlc3QIBQ0kdDAxMjkzMTEyOTg0Al8yCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHVzZXIFD2tVc2VyTHBJbnRlcmVzdAUNbmV3THBJbnRlcmVzdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQR1c2VyBRVrVXNlckxwQXZhaWxhYmxlQ2xhaW0JAGQCBRJ1c2VyQXZhaWxhYmxlQ2xhaW0FB3VSZXdhcmQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEdXNlcgULa0xwSW50ZXJlc3QFDW5ld0xwSW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEdXNlcgURa0xwSW50ZXJlc3RIZWlnaHQFBmhlaWdodAUDbmlsAWkBBGluaXQFFGF4bHlNYWluQ29udHJhY3RBZGRyGWF4bHlUb2tlbm9taWNDb250cmFjdEFkZHIMYXhseVBvb2xBZGRyEmZhcm1pbmdTdGFydEhlaWdodAxwZXJpb2RMZW5ndGgJAQt2YWx1ZU9yRWxzZQIJAQppc1NlbGZDYWxsAQUBaQMJAQEhAQkBCWlzRGVmaW5lZAEJAKYIAQUUYXhseU1haW5Db250cmFjdEFkZHIJAAIBAhVXcm9uZyBmYXJtaW5nIGFkZHJlc3MDCQEBIQEJAQlpc0RlZmluZWQBCQCmCAEFGWF4bHlUb2tlbm9taWNDb250cmFjdEFkZHIJAAIBAhtXcm9uZyBtYWluIGNvbnRyYWN0IGFkZHJlc3MJAMwIAgkBC1N0cmluZ0VudHJ5AgURa0F4bHlNYWluQ29udHJhY3QFFGF4bHlNYWluQ29udHJhY3RBZGRyCQDMCAIJAQtTdHJpbmdFbnRyeQIFFmtBeGx5VG9rZW5vbWljQ29udHJhY3QFGWF4bHlUb2tlbm9taWNDb250cmFjdEFkZHIJAMwIAgkBC1N0cmluZ0VudHJ5AgUJa0F4bHlQb29sBQxheGx5UG9vbEFkZHIJAMwIAgkBDEludGVnZXJFbnRyeQIFDGtTdGFydEhlaWdodAUSZmFybWluZ1N0YXJ0SGVpZ2h0CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ1rUGVyaW9kTGVuZ3RoBQxwZXJpb2RMZW5ndGgFA25pbAFpAQxpbml0TmV3VG9rZW4BB3Rva2VuSWQJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQEJaXNEZWZpbmVkAQkAmggCBQR0aGlzCQCsAgIFB3Rva2VuSWQFDmtUb2tlbkludGVyZXN0CQACAQIUdG9rZW4gYWxyZWFkeSBpbml0ZWQDCQEBIQEJAQhjb250YWlucwIJARFAZXh0ck5hdGl2ZSgxMDUzKQIFDGxlbmRDb250cmFjdAUQa0xlbmRTZXR1cFRva2VucwUHdG9rZW5JZAkAAgECE25vIHRva2VuIG9uIGxhbmRpbmcEDG5ld0FsbFRva2VucwkAzQgCCQEMZ2V0QWxsVG9rZW5zAAUHdG9rZW5JZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQd0b2tlbklkBQ5rVG9rZW5JbnRlcmVzdAAACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFB3Rva2VuSWQFFGtUb2tlbkludGVyZXN0SGVpZ2h0CQCWAwEJAMwIAgULc3RhcnRIZWlnaHQJAMwIAgUGaGVpZ2h0BQNuaWwJAMwIAgkBC1N0cmluZ0VudHJ5AgUHa1Rva2VucwkAuQkCBQxuZXdBbGxUb2tlbnMCASwJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUHdG9rZW5JZAUUa1Rva2VuUmV3YXJkUGVyQmxvY2sAAAUDbmlsAWkBDXVwZGF0ZVJld2FyZHMACQELdmFsdWVPckVsc2UCCQEOaXNPcGVyYXRvckNhbGwBBQFpBBBsYXN0VXBkYXRlUGVyaW9kCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFEWtMYXN0VXBkYXRlUGVyaW9kAAAECmNhbGNQZXJpb2QJAGQCCQBpAgkAZQIFBmhlaWdodAULc3RhcnRIZWlnaHQFDHBlcmlvZExlbmd0aAABBAljdXJQZXJpb2QDCQBnAgAABQpjYWxjUGVyaW9kAAEFCmNhbGNQZXJpb2QDCQBmAgUJY3VyUGVyaW9kAGgJAAIBAhFtYXggcGVyaW9kIGlzIDEwNAMDCQBnAgUQbGFzdFVwZGF0ZVBlcmlvZAUJY3VyUGVyaW9kCQECIT0CBRBsYXN0VXBkYXRlUGVyaW9kAAAHCQACAQIlcmV3YXJkcyBhbHJlZHkgdXBkYXRlZCBpbiB0aGlzIHBlcmlvZAQNJHQwMTQ5NDIxNTAyMgkBF2dldFRvdGFsU3VwcGx5QWxsVG9rZW5zAAQLdG90YWxTdXBwbHkIBQ0kdDAxNDk0MjE1MDIyAl8xBA50b3RhbFN1cHBseVVzZAgFDSR0MDE0OTQyMTUwMjICXzIEEXRvdGFsU3VwcGx5VXNkQWxsCAUNJHQwMTQ5NDIxNTAyMgJfMwQJYXhseVByaWNlCQENZ2V0QXNzZXRQcmljZQEFBmF4bHlJZAQNYXhseVByZWNpc2lvbgkBEWdldEFzc2V0UHJlY2lzaW9uAQUGYXhseUlkBAZtYXhBUFIJARVnZXRBZG9wdGVkQVBSQnlQZXJpb2QDBQljdXJQZXJpb2QFE0xFTkRFUlNfQVBSX1BFUklPRFMFC0xFTkRFUlNfQVBSCgEMdXBkYXRlUmV3YXJkAgFhB3Rva2VuSWQEDSR0MDE1MjcxMTUzMTUFAWEECGVudGVyaWVzCAUNJHQwMTUyNzExNTMxNQJfMQQRdG90YWxQZXJpb2RSZXdhcmQIBQ0kdDAxNTI3MTE1MzE1Al8yBAVpbmRleAgFDSR0MDE1MjcxMTUzMTUCXzMDCQAAAgkAkQMCBQt0b3RhbFN1cHBseQUFaW5kZXgAAAkAlQoDCQDOCAIFCGVudGVyaWVzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFB3Rva2VuSWQFFGtQcmV2TGVuZFRva2VuU3VwcGx5CQCRAwIFC3RvdGFsU3VwcGx5BQVpbmRleAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQd0b2tlbklkBRRrVG9rZW5SZXdhcmRQZXJCbG9jawAACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFB3Rva2VuSWQFDmtUb2tlbkludGVyZXN0CQEUY2FsY05ld1Rva2VuSW50ZXJlc3QCBQd0b2tlbklkCQCRAwIFC3RvdGFsU3VwcGx5BQVpbmRleAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQd0b2tlbklkBRRrVG9rZW5JbnRlcmVzdEhlaWdodAkAlgMBCQDMCAIFC3N0YXJ0SGVpZ2h0CQDMCAIFBmhlaWdodAUDbmlsBQNuaWwFEXRvdGFsUGVyaW9kUmV3YXJkCQBkAgUFaW5kZXgAAQQFc2hhcmUJAGsDCQCRAwIFDnRvdGFsU3VwcGx5VXNkBQVpbmRleAUGU0NBTEU4BRF0b3RhbFN1cHBseVVzZEFsbAQJbWF4UmV3YXJkCQBrAwUFc2hhcmUFE2xlbmRNYXhQZXJpb2RBbW91bnQFBlNDQUxFOAQMbWF4UmV3YXJkVXNkCQBrAwUJbWF4UmV3YXJkBQlheGx5UHJpY2UFDWF4bHlQcmVjaXNpb24ED3ByZXZUb3RhbFN1cHBseQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFB3Rva2VuSWQFFGtQcmV2TGVuZFRva2VuU3VwcGx5AAAEBnJ0Q29lZgMDCQAAAgUPcHJldlRvdGFsU3VwcGx5AAAGCQAAAgkAkQMCBQt0b3RhbFN1cHBseQUFaW5kZXgAAAAACQBlAgkAawMJAJEDAgULdG90YWxTdXBwbHkFBWluZGV4BQZTQ0FMRTgFD3ByZXZUb3RhbFN1cHBseQUGU0NBTEU4BAZyZXdhcmQJAGkCCQBpAgkAlwMBCQDMCAIJAGgCBQZtYXhBUFIJAGQCBQZTQ0FMRTgJAJYDAQkAzAgCBQZydENvZWYJAMwIAgAABQNuaWwJAMwIAgkAawMFBm1heEFQUgkAaAIADwUGU0NBTEU4AAoFA25pbAUGU0NBTEU4AGQECXJld2FyZFVzZAkAlwMBCQDMCAIFDG1heFJld2FyZFVzZAkAzAgCCQBrAwkAkQMCBQ50b3RhbFN1cHBseVVzZAUFaW5kZXgFBnJld2FyZAUGU0NBTEU4BQNuaWwEDHJld2FyZFBlcmlvZAkAawMFCXJld2FyZFVzZAUNYXhseVByZWNpc2lvbgUJYXhseVByaWNlBA5yZXdhcmRQZXJCbG9jawkAaQIFDHJld2FyZFBlcmlvZAUMcGVyaW9kTGVuZ3RoCQCVCgMJAM4IAgUIZW50ZXJpZXMJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUHdG9rZW5JZAUUa1ByZXZMZW5kVG9rZW5TdXBwbHkJAJEDAgULdG90YWxTdXBwbHkFBWluZGV4CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFB3Rva2VuSWQFFGtUb2tlblJld2FyZFBlckJsb2NrBQ5yZXdhcmRQZXJCbG9jawkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQd0b2tlbklkBQ5rVG9rZW5JbnRlcmVzdAkBFGNhbGNOZXdUb2tlbkludGVyZXN0AgUHdG9rZW5JZAkAkQMCBQt0b3RhbFN1cHBseQUFaW5kZXgJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUHdG9rZW5JZAUUa1Rva2VuSW50ZXJlc3RIZWlnaHQJAJYDAQkAzAgCBQtzdGFydEhlaWdodAkAzAgCBQZoZWlnaHQFA25pbAUDbmlsCQBkAgURdG90YWxQZXJpb2RSZXdhcmQFDHJld2FyZFBlcmlvZAkAZAIFBWluZGV4AAEEDSR0MDE3MDA3MTcwOTkKAAIkbAkBDGdldEFsbFRva2VucwAKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCVCgMFA25pbAAAAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBDHVwZGF0ZVJld2FyZAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMzAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsAHAAdAB4EDnRva2Vuc0VudGVyaWVzCAUNJHQwMTcwMDcxNzA5OQJfMQQQdG90YWxUb2tlblJld2FyZAgFDSR0MDE3MDA3MTcwOTkCXzIECGxwTWF4QVBSCQEVZ2V0QWRvcHRlZEFQUkJ5UGVyaW9kAwUJY3VyUGVyaW9kBQ5MUF9BUFJfUEVSSU9EUwUGTFBfQVBSBA1scFRvdGFsU3VwcGx5CQERQGV4dHJOYXRpdmUoMTA1MCkCBRFzZkZhcm1pbmdDb250cmFjdAkArAICBQhheGx5UG9vbAUOa1NGVG90YWxTdXBwbHkEC3ByZUxQU3VwcGx5CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFDWtQcmV2TFBTdXBwbHkAAAQEbHBJZAkBEUBleHRyTmF0aXZlKDEwNTMpAgkBEUBleHRyTmF0aXZlKDEwNjIpAQUIYXhseVBvb2wFBWtMcElkBAtscFByZWNpc2lvbgkBEWdldEFzc2V0UHJlY2lzaW9uAQUEbHBJZAQHbHBQcmljZQoAAUAJAPwHBAUMbWFpbkNvbnRyYWN0AhpnZXRTaGFyZUFzc2V0UHJpY2VSRUFET05MWQkAzAgCBQRscElkBQNuaWwFA25pbAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQEEGxwVG90YWxTdXBwbHlVc2QJAGsDBQ1scFRvdGFsU3VwcGx5BQdscFByaWNlBQtscFByZWNpc2lvbgQObWF4TFBSZXdhcmRVc2QJAGsDBRFscE1heFBlcmlvZEFtb3VudAUJYXhseVByaWNlBQ1heGx5UHJlY2lzaW9uBAhydExQQ29lZgMDCQAAAgULcHJlTFBTdXBwbHkAAAYJAAACBQ1scFRvdGFsU3VwcGx5AAAAAAkAZQIJAGsDBQ1scFRvdGFsU3VwcGx5BQZTQ0FMRTgFC3ByZUxQU3VwcGx5BQZTQ0FMRTgECHJld2FyZExwCQBpAgkAaQIJAJcDAQkAzAgCCQBoAgUIbHBNYXhBUFIJAGQCBQZTQ0FMRTgJAJYDAQkAzAgCBQhydExQQ29lZgkAzAgCAAAFA25pbAkAzAgCCQBrAwUIbHBNYXhBUFIJAGgCAA8FBlNDQUxFOAAKBQNuaWwFBlNDQUxFOABkBAtyZXdhcmRMcFVzZAkAlwMBCQDMCAIFDm1heExQUmV3YXJkVXNkCQDMCAIJAGsDBRBscFRvdGFsU3VwcGx5VXNkBQhyZXdhcmRMcAUGU0NBTEU4BQNuaWwEDnJld2FyZExwUGVyaW9kCQBrAwULcmV3YXJkTHBVc2QFDWF4bHlQcmVjaXNpb24FCWF4bHlQcmljZQQQcmV3YXJkTHBQZXJCbG9jawkAaQIFDnJld2FyZExwUGVyaW9kBQxwZXJpb2RMZW5ndGgECGJ1cm5MZW5kCQBlAgUTbGVuZE1heFBlcmlvZEFtb3VudAUQdG90YWxUb2tlblJld2FyZAQGYnVybkxwCQBlAgURbHBNYXhQZXJpb2RBbW91bnQFDnJld2FyZExwUGVyaW9kBANpbnYJAPwHBAUNdG9rZW5Db250cmFjdAIQd2l0aGRyYXdMcFJld2FyZAkAzAgCCQBkAgUIYnVybkxlbmQFBmJ1cm5McAkAzAgCCQClCAEFBHRoaXMFA25pbAUDbmlsAwkAAAIFA2ludgUDaW52BApscEVudGVyaWVzAwkAZwIADAUJY3VyUGVyaW9kCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ1rUHJldkxQU3VwcGx5BQ1scFRvdGFsU3VwcGx5CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRFrTHBSZXdhcmRQZXJCbG9jawUQcmV3YXJkTHBQZXJCbG9jawkAzAgCCQEMSW50ZWdlckVudHJ5AgULa0xwSW50ZXJlc3QJARFjYWxjTmV3THBJbnRlcmVzdAEFDWxwVG90YWxTdXBwbHkJAMwIAgkBDEludGVnZXJFbnRyeQIFEWtMcEludGVyZXN0SGVpZ2h0CQCWAwEJAMwIAgULc3RhcnRIZWlnaHQJAMwIAgUGaGVpZ2h0BQNuaWwJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBARoBVCeRLDw6Cc0O274F1dPN7wpIGPs2Az2GuwUIYnVybkxlbmQJANkEAQUGYXhseUlkCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQEaAVQnkSw8OgnNDtu+BdXTze8KSBj7NgM9hrsFBmJ1cm5McAkA2QQBBQZheGx5SWQFA25pbAUDbmlsCQDNCAIJAM4IAgUKbHBFbnRlcmllcwUOdG9rZW5zRW50ZXJpZXMJAQxJbnRlZ2VyRW50cnkCBRFrTGFzdFVwZGF0ZVBlcmlvZAUJY3VyUGVyaW9kCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJ0eAEGdmVyaWZ5AAQTbXVsdGlTaWduZWRCeUFkbWlucwQSYWRtaW5QdWJLZXkxU2lnbmVkAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAUIYWRtaW4xUEsAAQAABBJhZG1pblB1YktleTJTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwABBQhhZG1pbjJQSwABAAAEEmFkbWluUHViS2V5M1NpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAIFCGFkbWluM1BLAAEAAAkAZwIJAGQCCQBkAgUSYWRtaW5QdWJLZXkxU2lnbmVkBRJhZG1pblB1YktleTJTaWduZWQFEmFkbWluUHViS2V5M1NpZ25lZAACBAckbWF0Y2gwBQJ0eAMJAAECBQckbWF0Y2gwAhdJbnZva2VTY3JpcHRUcmFuc2FjdGlvbgQDaW52BQckbWF0Y2gwBAZpc1NlbGYJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXkECmlzUmlnaHRGZWUDCQAAAggFA2ludgNmZWUAoPc2CQAAAggFA2ludgpmZWVBc3NldElkBQR1bml0BwQKaXNJbml0Q2FsbAkAAAIIBQNpbnYIZnVuY3Rpb24CBGluaXQEDGlzbm9QYXltZW50cwkAAAIJAJADAQgFA2ludghwYXltZW50cwAAAwMDAwUKaXNSaWdodEZlZQUKaXNJbml0Q2FsbAcFBmlzU2VsZgcFDGlzbm9QYXltZW50cwcGBRNtdWx0aVNpZ25lZEJ5QWRtaW5zBRNtdWx0aVNpZ25lZEJ5QWRtaW5z0LG/mw==", "height": 2724733, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 3Fk2KfwHLRibW9g4DvSGvAHjtHiaGeD1x3jBGN91vo8b Next: FPKLWkgy6Zyj2uXph7GjFcrdZcyNFMGewQVs8tPsYURU Diff:
OldNewDifferences
55
66 let LENDERS_APR = [150, 120, 100, 80, 60, 40, 30, 20, 10]
77
8-let LENDERS_APR_PERIODS = ["1-1", "2-2", "3-3", "4-4", "5-8", "9-12", "14 - 16", "17-20", "20-104"]
8+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
3333
3434 let kTokenRewardPerBlock = "_tokenRewardPerBlock"
3535
36-let kRewardUpdateHeight = "rewardUpdateHeight"
36+let kLastUpdatePeriod = "rewardUpdatePeriod"
3737
3838 let kUserLendInterest = "_userLandInterest"
3939
115115
116116 let periodLength = getIntegerValue(this, kPeriodLength)
117117
118-let curPeriod = ((height - startHeight) / periodLength)
119-
120118 let lendMaxAmount = getIntegerValue(tokenContract, kLendersMaxAmount)
121119
122120 let lendMaxPeriodAmount = (lendMaxAmount / LENDERS_MAX_PERIODS)
176174
177175 func getAdoptedAPRByPeriod (period,aprPeriods,apr) = {
178176 func for (a,aperiod) = {
179- let $t054205442 = a
180- let index = $t054205442._1
181- let found = $t054205442._2
177+ let $t053625384 = a
178+ let index = $t053625384._1
179+ let found = $t053625384._2
182180 let ft = split(aperiod, "-")
183- let $t054795542 = $Tuple2(parseIntValue(ft[0]), parseIntValue(ft[1]))
184- let from = $t054795542._1
185- let to = $t054795542._2
181+ let $t054215484 = $Tuple2(parseIntValue(ft[0]), parseIntValue(ft[1]))
182+ let from = $t054215484._1
183+ let to = $t054215484._2
186184 if (found)
187185 then a
188186 else if (if ((period >= from))
192190 else $Tuple2((index + 1), false)
193191 }
194192
195- let $t056795745 = {
193+ let $t056215687 = {
196194 let $l = LENDERS_APR_PERIODS
197195 let $s = size($l)
198196 let $acc0 = $Tuple2(0, false)
206204
207205 $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)
208206 }
209- let index = $t056795745._1
210- let found = $t056795745._2
207+ let index = $t056215687._1
208+ let found = $t056215687._2
211209 if (found)
212210 then fraction((LENDERS_APR[index] * SCALE8), 7, 365)
213211 else 0
216214
217215 func getTotalSupplyAllTokens () = {
218216 func for (a,tokenId) = {
219- let $t059335989 = a
220- let totalSupply = $t059335989._1
221- let totalSupplyUsd = $t059335989._2
222- let totalSupplyUsdAll = $t059335989._3
217+ let $t058755931 = a
218+ let totalSupply = $t058755931._1
219+ let totalSupplyUsd = $t058755931._2
220+ let totalSupplyUsdAll = $t058755931._3
223221 let tSupply = valueOrElse(getInteger(lendContract, (kLendTokenSupply + tokenId)), 0)
224222 let assetPrice = getAssetPrice(tokenId)
225223 let assetPrecision = getAssetPrecision(tokenId)
250248 }
251249
252250
253-func calcNewTokenInterest (tokenId,totalSupply) = if ((height >= startHeight))
251+func calcNewTokenInterest (tokenId,totalSupply) = if ((startHeight >= height))
254252 then 0
255253 else {
256254 let rewardPerBlock = getIntegerValue(this, (tokenId + kTokenRewardPerBlock))
264262 }
265263
266264
267-func calcNewLpInterest (totalSupply) = if ((height >= startHeight))
265+func calcNewLpInterest (totalSupply) = if ((startHeight >= height))
268266 then 0
269267 else {
270268 let rewardPerBlock = valueOrElse(getInteger(this, kLpRewardPerBlock), 0)
293291 func calcLpUserReward (user) = {
294292 let totalSupply = valueOrElse(getInteger(sfFarmingContract, (axlyPool + kSFTotalSupply)), 0)
295293 let tokenInterest = calcNewLpInterest(totalSupply)
296- let userSupply = valueOrElse(getInteger(lendContract, (((axlyPool + "_") + user) + kSFUserTotalSupply)), 0)
294+ let userSupply = valueOrElse(getInteger(sfFarmingContract, (((axlyPool + "_") + user) + kSFUserTotalSupply)), 0)
297295 let userTokenInterest = valueOrElse(getInteger(this, (user + kUserLpInterest)), if ((userSupply == 0))
298296 then tokenInterest
299297 else 0)
304302
305303 func claimLenderRewardsCommon (user,readOnly) = {
306304 func claim (a,tokenId) = {
307- let $t088738917 = a
308- let tokenIds = $t088738917._1
309- let cAmount = $t088738917._2
310- let total = $t088738917._3
311- let enteries = $t088738917._4
305+ let $t088208864 = a
306+ let tokenIds = $t088208864._1
307+ let cAmount = $t088208864._2
308+ let total = $t088208864._3
309+ let enteries = $t088208864._4
312310 let userAvailableClaim = valueOrElse(getInteger(this, (((tokenId + "_") + user) + kUserLendAvailableClaim)), 0)
313- let $t090309109 = calcLendUserReward(user, tokenId)
314- let uReward = $t090309109._1
315- let newTokenInterest = $t090309109._2
316- let userSupply = $t090309109._3
311+ let $t089779056 = calcLendUserReward(user, tokenId)
312+ let uReward = $t089779056._1
313+ let newTokenInterest = $t089779056._2
314+ let userSupply = $t089779056._3
317315 let totalToClaim = (userAvailableClaim + uReward)
318316 if (if ((totalToClaim > 0))
319317 then true
346344
347345 func claimLpRewardsCommon (user,readOnly) = {
348346 let userAvailableClaim = valueOrElse(getInteger(this, (user + kUserLpAvailableClaim)), 0)
349- let $t01004110106 = calcLpUserReward(user)
350- let uReward = $t01004110106._1
351- let newLpInterest = $t01004110106._2
352- let userSupply = $t01004110106._3
347+ let $t0998710052 = calcLpUserReward(user)
348+ let uReward = $t0998710052._1
349+ let newLpInterest = $t0998710052._2
350+ let userSupply = $t0998710052._3
353351 let totalToClaim = (userAvailableClaim + uReward)
354352 if (if (readOnly)
355353 then true
388386 let lpId = getStringValue(addressFromStringValue(axlyPool), kLpId)
389387 let lpPrecision = getAssetPrecision(lpId)
390388 let lpPrice = {
391- let @ = ({
392- let @ = invoke(mainContract, "getShareAssetPriceREADONLY", [[lpId]], nil)
393- if ($isInstanceOf(@, "List[Any]"))
394- then @
395- else throw(($getType(@) + " couldn't be cast to List[Any]"))
396- })[0]
389+ let @ = invoke(mainContract, "getShareAssetPriceREADONLY", [lpId], nil)
397390 if ($isInstanceOf(@, "Int"))
398391 then @
399392 else throw(($getType(@) + " couldn't be cast to Int"))
440433 @Callable(i)
441434 func lendAction (user,tokenId) = valueOrElse(isLandCall(i), {
442435 let userAvailableClaim = valueOrElse(getInteger(this, (tokenId + kUserLendAvailableClaim)), 0)
443- let $t01247712544 = calcLendUserReward(user, tokenId)
444- let uReward = $t01247712544._1
445- let newTokenInterest = $t01247712544._2
436+ let $t01239912466 = calcLendUserReward(user, tokenId)
437+ let uReward = $t01239912466._1
438+ let newTokenInterest = $t01239912466._2
446439 [IntegerEntry((((tokenId + "_") + user) + kUserLendInterest), newTokenInterest), IntegerEntry((((tokenId + "_") + user) + kUserLendAvailableClaim), (userAvailableClaim + uReward)), IntegerEntry((tokenId + kTokenInterest), newTokenInterest), IntegerEntry((tokenId + kTokenInterestHeight), height)]
447440 })
448441
451444 @Callable(i)
452445 func lpAction (user) = valueOrElse(isSFFarmingCall(i), {
453446 let userAvailableClaim = valueOrElse(getInteger(this, kUserLpAvailableClaim), 0)
454- let $t01300913062 = calcLpUserReward(user)
455- let uReward = $t01300913062._1
456- let newLpInterest = $t01300913062._2
447+ let $t01293112984 = calcLpUserReward(user)
448+ let uReward = $t01293112984._1
449+ let newLpInterest = $t01293112984._2
457450 [IntegerEntry((user + kUserLpInterest), newLpInterest), IntegerEntry((user + kUserLpAvailableClaim), (userAvailableClaim + uReward)), IntegerEntry((user + kLpInterest), newLpInterest), IntegerEntry((user + kLpInterestHeight), height)]
458451 })
459452
482475
483476 @Callable(i)
484477 func updateRewards () = valueOrElse(isOperatorCall(i), {
485- let lastUpdateHeight = valueOrElse(getInteger(this, kRewardUpdateHeight), 0)
486- if (((lastUpdateHeight + periodLength) > height))
487- then throw("rewards alredy updated in this period")
488- else {
489- let $t01482914909 = getTotalSupplyAllTokens()
490- let totalSupply = $t01482914909._1
491- let totalSupplyUsd = $t01482914909._2
492- let totalSupplyUsdAll = $t01482914909._3
493- let axlyPrice = getAssetPrice(axlyId)
494- let axlyPrecision = getAssetPrecision(axlyId)
495- let maxAPR = getAdoptedAPRByPeriod(curPeriod, LENDERS_APR_PERIODS, LENDERS_APR)
496- func updateReward (a,tokenId) = {
497- let $t01515315178 = a
498- let enteries = $t01515315178._1
499- let index = $t01515315178._2
500- if ((totalSupply[index] == 0))
501- then $Tuple2((enteries ++ [IntegerEntry((tokenId + kPrevLendTokenSupply), totalSupply[index]), IntegerEntry((tokenId + kTokenRewardPerBlock), 0), IntegerEntry((tokenId + kTokenInterest), calcNewTokenInterest(tokenId, totalSupply[index])), IntegerEntry((tokenId + kTokenInterestHeight), max([startHeight, height]))]), (index + 1))
502- else {
503- let share = fraction(totalSupplyUsd[index], SCALE8, totalSupplyUsdAll)
504- let maxReward = fraction(share, lendMaxPeriodAmount, SCALE8)
505- let maxRewardUsd = fraction(maxReward, axlyPrice, axlyPrecision)
506- let prevTotalSupply = valueOrElse(getInteger(this, kPrevLendTokenSupply), 0)
507- let rtCoef = if (if ((prevTotalSupply == 0))
508- then true
509- else (totalSupply[index] == 0))
510- then 0
511- else fraction(prevTotalSupply, SCALE8, totalSupply[index])
512- let reward = (min([(maxAPR * (SCALE8 + rtCoef)), fraction(maxAPR, (15 * SCALE8), 10)]) / SCALE8)
513- let rewardUsd = min([maxRewardUsd, fraction(totalSupplyUsd[index], reward, SCALE8)])
514- let rewardPeriod = fraction(rewardUsd, axlyPrecision, axlyPrice)
515- let rewardPerBlock = (rewardPeriod / periodLength)
516- $Tuple2((enteries ++ [IntegerEntry((tokenId + kPrevLendTokenSupply), totalSupply[index]), IntegerEntry((tokenId + kTokenRewardPerBlock), rewardPerBlock), IntegerEntry((tokenId + kTokenInterest), calcNewTokenInterest(tokenId, totalSupply[index])), IntegerEntry((tokenId + kTokenInterestHeight), max([startHeight, height]))]), (index + 1))
478+ let lastUpdatePeriod = valueOrElse(getInteger(this, kLastUpdatePeriod), 0)
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 $t01494215022 = getTotalSupplyAllTokens()
491+ let totalSupply = $t01494215022._1
492+ let totalSupplyUsd = $t01494215022._2
493+ let totalSupplyUsdAll = $t01494215022._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 $t01527115315 = a
499+ let enteries = $t01527115315._1
500+ let totalPeriodReward = $t01527115315._2
501+ let index = $t01527115315._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, (tokenId + kPrevLendTokenSupply)), 0)
509+ let rtCoef = if (if ((prevTotalSupply == 0))
510+ then true
511+ else (totalSupply[index] == 0))
512+ then 0
513+ else (fraction(totalSupply[index], SCALE8, prevTotalSupply) - SCALE8)
514+ let reward = ((min([(maxAPR * (SCALE8 + max([rtCoef, 0]))), 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 $t01700717099 = {
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 = $t01700717099._1
537+ let totalTokenReward = $t01700717099._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(lpTotalSupply, SCALE8, preLPSupply) - SCALE8)
556+ let rewardLp = ((min([(lpMaxAPR * (SCALE8 + max([rtLPCoef, 0]))), 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, curPeriod))
517569 }
570+ else throw("Strict value is not equal to itself.")
518571 }
519-
520- let $t01676516842 = {
521- let $l = getAllTokens()
522- let $s = size($l)
523- let $acc0 = $Tuple2(nil, 0)
524- func $f0_1 ($a,$i) = if (($i >= $s))
525- then $a
526- else updateReward($a, $l[$i])
527-
528- func $f0_2 ($a,$i) = if (($i >= $s))
529- then $a
530- else throw("List size exceeds 30")
531-
532- $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)
533- }
534- let tokensEnteries = $t01676516842._1
535- let index = $t01676516842._2
536- let lpMaxAPR = getAdoptedAPRByPeriod(curPeriod, LP_APR_PERIODS, LP_APR)
537- let lpTotalSupply = getIntegerValue(sfFarmingContract, (axlyPool + kSFTotalSupply))
538- let preLPSupply = valueOrElse(getInteger(this, kPrevLPSupply), 0)
539- let lpId = getStringValue(addressFromStringValue(axlyPool), kLpId)
540- let lpPrecision = getAssetPrecision(lpId)
541- let lpPrice = {
542- let @ = invoke(mainContract, "getShareAssetPriceREADONLY", [lpId], nil)
543- if ($isInstanceOf(@, "Int"))
544- then @
545- else throw(($getType(@) + " couldn't be cast to Int"))
546- }
547- let lpTotalSupplyUsd = fraction(lpTotalSupply, lpPrice, lpPrecision)
548- let maxLPRewardUsd = fraction(lpMaxPeriodAmount, axlyPrice, axlyPrecision)
549- let rtLPCoef = if (if ((preLPSupply == 0))
550- then true
551- else (lpTotalSupply == 0))
552- then 0
553- else fraction(preLPSupply, SCALE8, lpTotalSupply)
554- let rewardLp = (min([(lpMaxAPR * (SCALE8 + rtLPCoef)), fraction(lpMaxAPR, (15 * SCALE8), 10)]) / SCALE8)
555- let rewardLpUsd = min([maxLPRewardUsd, fraction(lpTotalSupplyUsd, rewardLp, SCALE8)])
556- let rewardLpPeriod = fraction(rewardLpUsd, axlyPrice, axlyPrecision)
557- let rewardLpPerBlock = (rewardLpPeriod / periodLength)
558- let lpEnteries = [IntegerEntry(kPrevLPSupply, lpTotalSupply), IntegerEntry(kLpRewardPerBlock, rewardLpPerBlock), IntegerEntry(kLpInterest, calcNewLpInterest(lpTotalSupply)), IntegerEntry(kLpInterestHeight, max([startHeight, height]))]
559- ((lpEnteries ++ tokensEnteries) :+ IntegerEntry(kRewardUpdateHeight, max([startHeight, height])))
560- }
561572 })
562573
563574
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
8-let LENDERS_APR_PERIODS = ["1-1", "2-2", "3-3", "4-4", "5-8", "9-12", "14 - 16", "17-20", "20-104"]
8+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
36-let kRewardUpdateHeight = "rewardUpdateHeight"
36+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
118-let curPeriod = ((height - startHeight) / periodLength)
119-
120118 let lendMaxAmount = getIntegerValue(tokenContract, kLendersMaxAmount)
121119
122120 let lendMaxPeriodAmount = (lendMaxAmount / LENDERS_MAX_PERIODS)
123121
124122 let lpMaxAmount = getIntegerValue(tokenContract, kLPMaxAmount)
125123
126124 let lpMaxPeriodAmount = (lpMaxAmount / LP_MAX_PERIODS)
127125
128126 func isAdminCall (i) = if (containsElement([admin1PK, admin2PK, admin3PK], i.callerPublicKey))
129127 then unit
130128 else throw("Only admin group1 can call this function")
131129
132130
133131 func isSelfCall (i) = if ((i.caller == this))
134132 then unit
135133 else throw("Only contract itself can call this function")
136134
137135
138136 func isOperatorCall (i) = if ((i.callerPublicKey == operatorPK))
139137 then unit
140138 else throw("Only operator can call this function")
141139
142140
143141 func isLandCall (i) = if ((i.caller == lendContract))
144142 then unit
145143 else throw("Only land contract can call this function")
146144
147145
148146 func isSFFarmingCall (i) = if ((i.caller == sfFarmingContract))
149147 then unit
150148 else throw("Only land contract can call this function")
151149
152150
153151 func getAllTokens () = {
154152 let tokens = valueOrElse(getString(this, kTokens), "")
155153 if ((tokens == ""))
156154 then nil
157155 else split(tokens, ",")
158156 }
159157
160158
161159 func getAssetPrice (assetId) = getIntegerValue(priceOracleAddr, (assetId + kPriceInOracle))
162160
163161
164162 func getAssetDecimals (assetId) = if ((assetId == "WAVES"))
165163 then 8
166164 else match assetInfo(fromBase58String(assetId)) {
167165 case asset: Asset =>
168166 asset.decimals
169167 case _ =>
170168 throw("Can't find asset")
171169 }
172170
173171
174172 func getAssetPrecision (assetId) = pow(10, 0, getAssetDecimals(assetId), 0, 0, DOWN)
175173
176174
177175 func getAdoptedAPRByPeriod (period,aprPeriods,apr) = {
178176 func for (a,aperiod) = {
179- let $t054205442 = a
180- let index = $t054205442._1
181- let found = $t054205442._2
177+ let $t053625384 = a
178+ let index = $t053625384._1
179+ let found = $t053625384._2
182180 let ft = split(aperiod, "-")
183- let $t054795542 = $Tuple2(parseIntValue(ft[0]), parseIntValue(ft[1]))
184- let from = $t054795542._1
185- let to = $t054795542._2
181+ let $t054215484 = $Tuple2(parseIntValue(ft[0]), parseIntValue(ft[1]))
182+ let from = $t054215484._1
183+ let to = $t054215484._2
186184 if (found)
187185 then a
188186 else if (if ((period >= from))
189187 then (to >= period)
190188 else false)
191189 then $Tuple2(index, true)
192190 else $Tuple2((index + 1), false)
193191 }
194192
195- let $t056795745 = {
193+ let $t056215687 = {
196194 let $l = LENDERS_APR_PERIODS
197195 let $s = size($l)
198196 let $acc0 = $Tuple2(0, false)
199197 func $f0_1 ($a,$i) = if (($i >= $s))
200198 then $a
201199 else for($a, $l[$i])
202200
203201 func $f0_2 ($a,$i) = if (($i >= $s))
204202 then $a
205203 else throw("List size exceeds 9")
206204
207205 $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)
208206 }
209- let index = $t056795745._1
210- let found = $t056795745._2
207+ let index = $t056215687._1
208+ let found = $t056215687._2
211209 if (found)
212210 then fraction((LENDERS_APR[index] * SCALE8), 7, 365)
213211 else 0
214212 }
215213
216214
217215 func getTotalSupplyAllTokens () = {
218216 func for (a,tokenId) = {
219- let $t059335989 = a
220- let totalSupply = $t059335989._1
221- let totalSupplyUsd = $t059335989._2
222- let totalSupplyUsdAll = $t059335989._3
217+ let $t058755931 = a
218+ let totalSupply = $t058755931._1
219+ let totalSupplyUsd = $t058755931._2
220+ let totalSupplyUsdAll = $t058755931._3
223221 let tSupply = valueOrElse(getInteger(lendContract, (kLendTokenSupply + tokenId)), 0)
224222 let assetPrice = getAssetPrice(tokenId)
225223 let assetPrecision = getAssetPrecision(tokenId)
226224 let tSupplyUsd = fraction(tSupply, assetPrice, assetPrecision)
227225 $Tuple3((totalSupply :+ tSupply), (totalSupplyUsd :+ tSupplyUsd), (totalSupplyUsdAll + tSupplyUsd))
228226 }
229227
230228 let $l = getAllTokens()
231229 let $s = size($l)
232230 let $acc0 = $Tuple3(nil, nil, 0)
233231 func $f0_1 ($a,$i) = if (($i >= $s))
234232 then $a
235233 else for($a, $l[$i])
236234
237235 func $f0_2 ($a,$i) = if (($i >= $s))
238236 then $a
239237 else throw("List size exceeds 30")
240238
241239 $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)
242240 }
243241
244242
245243 func getTotalSupplyUsd (tokenId) = {
246244 let tSupply = valueOrElse(getInteger(lendContract, (kLendTokenSupply + tokenId)), 0)
247245 let assetPrice = getAssetPrice(tokenId)
248246 let assetPrecision = getAssetPrecision(tokenId)
249247 fraction(tSupply, assetPrice, assetPrecision)
250248 }
251249
252250
253-func calcNewTokenInterest (tokenId,totalSupply) = if ((height >= startHeight))
251+func calcNewTokenInterest (tokenId,totalSupply) = if ((startHeight >= height))
254252 then 0
255253 else {
256254 let rewardPerBlock = getIntegerValue(this, (tokenId + kTokenRewardPerBlock))
257255 let oldInterest = getIntegerValue(this, (tokenId + kTokenInterest))
258256 let updateHeight = getIntegerValue(this, (tokenId + kTokenInterestHeight))
259257 let reward = ((height - updateHeight) * rewardPerBlock)
260258 let interest = if ((totalSupply > 0))
261259 then fraction(reward, SCALE8, totalSupply)
262260 else 0
263261 (oldInterest + interest)
264262 }
265263
266264
267-func calcNewLpInterest (totalSupply) = if ((height >= startHeight))
265+func calcNewLpInterest (totalSupply) = if ((startHeight >= height))
268266 then 0
269267 else {
270268 let rewardPerBlock = valueOrElse(getInteger(this, kLpRewardPerBlock), 0)
271269 let oldInterest = valueOrElse(getInteger(this, kLpInterest), 0)
272270 let updateHeight = valueOrElse(getInteger(this, kLpInterestHeight), height)
273271 let reward = ((height - updateHeight) * rewardPerBlock)
274272 let interest = if ((totalSupply > 0))
275273 then fraction(reward, SCALE8, totalSupply)
276274 else 0
277275 (oldInterest + interest)
278276 }
279277
280278
281279 func calcLendUserReward (user,tokenId) = {
282280 let totalSupply = valueOrElse(getInteger(lendContract, (kLendTokenSupply + tokenId)), 0)
283281 let tokenInterest = calcNewTokenInterest(tokenId, totalSupply)
284282 let userSupply = valueOrElse(getInteger(lendContract, ((user + kLendUserSupply) + tokenId)), 0)
285283 let userTokenInterest = valueOrElse(getInteger(this, (((tokenId + "_") + user) + kUserLendInterest)), if ((userSupply == 0))
286284 then tokenInterest
287285 else 0)
288286 let reward = fraction(userSupply, (tokenInterest - userTokenInterest), SCALE8)
289287 $Tuple3(reward, tokenInterest, userSupply)
290288 }
291289
292290
293291 func calcLpUserReward (user) = {
294292 let totalSupply = valueOrElse(getInteger(sfFarmingContract, (axlyPool + kSFTotalSupply)), 0)
295293 let tokenInterest = calcNewLpInterest(totalSupply)
296- let userSupply = valueOrElse(getInteger(lendContract, (((axlyPool + "_") + user) + kSFUserTotalSupply)), 0)
294+ let userSupply = valueOrElse(getInteger(sfFarmingContract, (((axlyPool + "_") + user) + kSFUserTotalSupply)), 0)
297295 let userTokenInterest = valueOrElse(getInteger(this, (user + kUserLpInterest)), if ((userSupply == 0))
298296 then tokenInterest
299297 else 0)
300298 let reward = fraction(userSupply, (tokenInterest - userTokenInterest), SCALE8)
301299 $Tuple3(reward, tokenInterest, userSupply)
302300 }
303301
304302
305303 func claimLenderRewardsCommon (user,readOnly) = {
306304 func claim (a,tokenId) = {
307- let $t088738917 = a
308- let tokenIds = $t088738917._1
309- let cAmount = $t088738917._2
310- let total = $t088738917._3
311- let enteries = $t088738917._4
305+ let $t088208864 = a
306+ let tokenIds = $t088208864._1
307+ let cAmount = $t088208864._2
308+ let total = $t088208864._3
309+ let enteries = $t088208864._4
312310 let userAvailableClaim = valueOrElse(getInteger(this, (((tokenId + "_") + user) + kUserLendAvailableClaim)), 0)
313- let $t090309109 = calcLendUserReward(user, tokenId)
314- let uReward = $t090309109._1
315- let newTokenInterest = $t090309109._2
316- let userSupply = $t090309109._3
311+ let $t089779056 = calcLendUserReward(user, tokenId)
312+ let uReward = $t089779056._1
313+ let newTokenInterest = $t089779056._2
314+ let userSupply = $t089779056._3
317315 let totalToClaim = (userAvailableClaim + uReward)
318316 if (if ((totalToClaim > 0))
319317 then true
320318 else (userSupply > 0))
321319 then {
322320 let newEntreries = if (if (readOnly)
323321 then true
324322 else (totalToClaim == 0))
325323 then enteries
326324 else (enteries ++ [IntegerEntry((((tokenId + "_") + user) + kUserLendInterest), newTokenInterest), IntegerEntry((((tokenId + "_") + user) + kUserLendAvailableClaim), 0), IntegerEntry((tokenId + kTokenInterest), newTokenInterest), IntegerEntry((tokenId + kTokenInterestHeight), height)])
327325 $Tuple4((tokenIds :+ tokenId), (cAmount :+ totalToClaim), (total + totalToClaim), newEntreries)
328326 }
329327 else $Tuple4(tokenIds, cAmount, total, enteries)
330328 }
331329
332330 let $l = getAllTokens()
333331 let $s = size($l)
334332 let $acc0 = $Tuple4(nil, nil, 0, nil)
335333 func $f0_1 ($a,$i) = if (($i >= $s))
336334 then $a
337335 else claim($a, $l[$i])
338336
339337 func $f0_2 ($a,$i) = if (($i >= $s))
340338 then $a
341339 else throw("List size exceeds 30")
342340
343341 $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)
344342 }
345343
346344
347345 func claimLpRewardsCommon (user,readOnly) = {
348346 let userAvailableClaim = valueOrElse(getInteger(this, (user + kUserLpAvailableClaim)), 0)
349- let $t01004110106 = calcLpUserReward(user)
350- let uReward = $t01004110106._1
351- let newLpInterest = $t01004110106._2
352- let userSupply = $t01004110106._3
347+ let $t0998710052 = calcLpUserReward(user)
348+ let uReward = $t0998710052._1
349+ let newLpInterest = $t0998710052._2
350+ let userSupply = $t0998710052._3
353351 let totalToClaim = (userAvailableClaim + uReward)
354352 if (if (readOnly)
355353 then true
356354 else (totalToClaim == 0))
357355 then $Tuple2(totalToClaim, nil)
358356 else $Tuple2(totalToClaim, [IntegerEntry((user + kUserLpInterest), newLpInterest), IntegerEntry((user + kUserLpAvailableClaim), 0), IntegerEntry(kLpInterest, newLpInterest), IntegerEntry(kLpInterestHeight, height)])
359357 }
360358
361359
362360 func getTokensAPRs () = {
363361 let axlyPrice = getAssetPrice(axlyId)
364362 let axlyPrecision = getAssetPrecision(axlyId)
365363 func tokensAprs (apr,tokenId) = {
366364 let rwpb = valueOrElse(getInteger(this, (tokenId + kTokenRewardPerBlock)), 0)
367365 let rwpbUsd = fraction(rwpb, axlyPrice, axlyPrecision)
368366 let rwYear = ((rwpbUsd * periodLength) * 52)
369367 let totalSupplyUsd = getTotalSupplyUsd(tokenId)
370368 (apr :+ fraction(rwYear, SCALE8, totalSupplyUsd))
371369 }
372370
373371 let aprs = {
374372 let $l = getAllTokens()
375373 let $s = size($l)
376374 let $acc0 = nil
377375 func $f0_1 ($a,$i) = if (($i >= $s))
378376 then $a
379377 else tokensAprs($a, $l[$i])
380378
381379 func $f0_2 ($a,$i) = if (($i >= $s))
382380 then $a
383381 else throw("List size exceeds 30")
384382
385383 $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)
386384 }
387385 let lpTotalSupply = getIntegerValue(sfFarmingContract, (axlyPool + kSFTotalSupply))
388386 let lpId = getStringValue(addressFromStringValue(axlyPool), kLpId)
389387 let lpPrecision = getAssetPrecision(lpId)
390388 let lpPrice = {
391- let @ = ({
392- let @ = invoke(mainContract, "getShareAssetPriceREADONLY", [[lpId]], nil)
393- if ($isInstanceOf(@, "List[Any]"))
394- then @
395- else throw(($getType(@) + " couldn't be cast to List[Any]"))
396- })[0]
389+ let @ = invoke(mainContract, "getShareAssetPriceREADONLY", [lpId], nil)
397390 if ($isInstanceOf(@, "Int"))
398391 then @
399392 else throw(($getType(@) + " couldn't be cast to Int"))
400393 }
401394 let lpTotalSupplyUsd = fraction(lpTotalSupply, lpPrice, lpPrecision)
402395 let rwpb = valueOrElse(getInteger(this, kLpRewardPerBlock), 0)
403396 let rwpbUsd = fraction(rwpb, axlyPrice, axlyPrecision)
404397 let rwYear = ((rwpbUsd * periodLength) * 52)
405398 let lpApr = fraction(rwYear, SCALE8, lpTotalSupplyUsd)
406399 $Tuple3(getAllTokens(), aprs, lpApr)
407400 }
408401
409402
410403 @Callable(i)
411404 func claimLenderRewards () = {
412405 let claimRes = claimLenderRewardsCommon(toString(i.caller), false)
413406 if ((claimRes._3 == 0))
414407 then throw("claim amount must be greater than 0")
415408 else {
416409 let inv = invoke(tokenContract, "withdrawLendReward", [claimRes._3, toString(i.caller)], nil)
417410 if ((inv == inv))
418411 then claimRes._4
419412 else throw("Strict value is not equal to itself.")
420413 }
421414 }
422415
423416
424417
425418 @Callable(i)
426419 func claimLpRewards () = {
427420 let claimRes = claimLpRewardsCommon(toString(i.caller), false)
428421 if ((claimRes._1 == 0))
429422 then throw("claim amount must be greater than 0")
430423 else {
431424 let inv = invoke(tokenContract, "withdrawLpReward", [claimRes._1, toString(i.caller)], nil)
432425 if ((inv == inv))
433426 then claimRes._2
434427 else throw("Strict value is not equal to itself.")
435428 }
436429 }
437430
438431
439432
440433 @Callable(i)
441434 func lendAction (user,tokenId) = valueOrElse(isLandCall(i), {
442435 let userAvailableClaim = valueOrElse(getInteger(this, (tokenId + kUserLendAvailableClaim)), 0)
443- let $t01247712544 = calcLendUserReward(user, tokenId)
444- let uReward = $t01247712544._1
445- let newTokenInterest = $t01247712544._2
436+ let $t01239912466 = calcLendUserReward(user, tokenId)
437+ let uReward = $t01239912466._1
438+ let newTokenInterest = $t01239912466._2
446439 [IntegerEntry((((tokenId + "_") + user) + kUserLendInterest), newTokenInterest), IntegerEntry((((tokenId + "_") + user) + kUserLendAvailableClaim), (userAvailableClaim + uReward)), IntegerEntry((tokenId + kTokenInterest), newTokenInterest), IntegerEntry((tokenId + kTokenInterestHeight), height)]
447440 })
448441
449442
450443
451444 @Callable(i)
452445 func lpAction (user) = valueOrElse(isSFFarmingCall(i), {
453446 let userAvailableClaim = valueOrElse(getInteger(this, kUserLpAvailableClaim), 0)
454- let $t01300913062 = calcLpUserReward(user)
455- let uReward = $t01300913062._1
456- let newLpInterest = $t01300913062._2
447+ let $t01293112984 = calcLpUserReward(user)
448+ let uReward = $t01293112984._1
449+ let newLpInterest = $t01293112984._2
457450 [IntegerEntry((user + kUserLpInterest), newLpInterest), IntegerEntry((user + kUserLpAvailableClaim), (userAvailableClaim + uReward)), IntegerEntry((user + kLpInterest), newLpInterest), IntegerEntry((user + kLpInterestHeight), height)]
458451 })
459452
460453
461454
462455 @Callable(i)
463456 func init (axlyMainContractAddr,axlyTokenomicContractAddr,axlyPoolAddr,farmingStartHeight,periodLength) = valueOrElse(isSelfCall(i), if (!(isDefined(addressFromString(axlyMainContractAddr))))
464457 then throw("Wrong farming address")
465458 else if (!(isDefined(addressFromString(axlyTokenomicContractAddr))))
466459 then throw("Wrong main contract address")
467460 else [StringEntry(kAxlyMainContract, axlyMainContractAddr), StringEntry(kAxlyTokenomicContract, axlyTokenomicContractAddr), StringEntry(kAxlyPool, axlyPoolAddr), IntegerEntry(kStartHeight, farmingStartHeight), IntegerEntry(kPeriodLength, periodLength)])
468461
469462
470463
471464 @Callable(i)
472465 func initNewToken (tokenId) = valueOrElse(isAdminCall(i), if (isDefined(getInteger(this, (tokenId + kTokenInterest))))
473466 then throw("token already inited")
474467 else if (!(contains(getStringValue(lendContract, kLendSetupTokens), tokenId)))
475468 then throw("no token on landing")
476469 else {
477470 let newAllTokens = (getAllTokens() :+ tokenId)
478471 [IntegerEntry((tokenId + kTokenInterest), 0), IntegerEntry((tokenId + kTokenInterestHeight), max([startHeight, height])), StringEntry(kTokens, makeString(newAllTokens, ",")), IntegerEntry((tokenId + kTokenRewardPerBlock), 0)]
479472 })
480473
481474
482475
483476 @Callable(i)
484477 func updateRewards () = valueOrElse(isOperatorCall(i), {
485- let lastUpdateHeight = valueOrElse(getInteger(this, kRewardUpdateHeight), 0)
486- if (((lastUpdateHeight + periodLength) > height))
487- then throw("rewards alredy updated in this period")
488- else {
489- let $t01482914909 = getTotalSupplyAllTokens()
490- let totalSupply = $t01482914909._1
491- let totalSupplyUsd = $t01482914909._2
492- let totalSupplyUsdAll = $t01482914909._3
493- let axlyPrice = getAssetPrice(axlyId)
494- let axlyPrecision = getAssetPrecision(axlyId)
495- let maxAPR = getAdoptedAPRByPeriod(curPeriod, LENDERS_APR_PERIODS, LENDERS_APR)
496- func updateReward (a,tokenId) = {
497- let $t01515315178 = a
498- let enteries = $t01515315178._1
499- let index = $t01515315178._2
500- if ((totalSupply[index] == 0))
501- then $Tuple2((enteries ++ [IntegerEntry((tokenId + kPrevLendTokenSupply), totalSupply[index]), IntegerEntry((tokenId + kTokenRewardPerBlock), 0), IntegerEntry((tokenId + kTokenInterest), calcNewTokenInterest(tokenId, totalSupply[index])), IntegerEntry((tokenId + kTokenInterestHeight), max([startHeight, height]))]), (index + 1))
502- else {
503- let share = fraction(totalSupplyUsd[index], SCALE8, totalSupplyUsdAll)
504- let maxReward = fraction(share, lendMaxPeriodAmount, SCALE8)
505- let maxRewardUsd = fraction(maxReward, axlyPrice, axlyPrecision)
506- let prevTotalSupply = valueOrElse(getInteger(this, kPrevLendTokenSupply), 0)
507- let rtCoef = if (if ((prevTotalSupply == 0))
508- then true
509- else (totalSupply[index] == 0))
510- then 0
511- else fraction(prevTotalSupply, SCALE8, totalSupply[index])
512- let reward = (min([(maxAPR * (SCALE8 + rtCoef)), fraction(maxAPR, (15 * SCALE8), 10)]) / SCALE8)
513- let rewardUsd = min([maxRewardUsd, fraction(totalSupplyUsd[index], reward, SCALE8)])
514- let rewardPeriod = fraction(rewardUsd, axlyPrecision, axlyPrice)
515- let rewardPerBlock = (rewardPeriod / periodLength)
516- $Tuple2((enteries ++ [IntegerEntry((tokenId + kPrevLendTokenSupply), totalSupply[index]), IntegerEntry((tokenId + kTokenRewardPerBlock), rewardPerBlock), IntegerEntry((tokenId + kTokenInterest), calcNewTokenInterest(tokenId, totalSupply[index])), IntegerEntry((tokenId + kTokenInterestHeight), max([startHeight, height]))]), (index + 1))
478+ let lastUpdatePeriod = valueOrElse(getInteger(this, kLastUpdatePeriod), 0)
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 $t01494215022 = getTotalSupplyAllTokens()
491+ let totalSupply = $t01494215022._1
492+ let totalSupplyUsd = $t01494215022._2
493+ let totalSupplyUsdAll = $t01494215022._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 $t01527115315 = a
499+ let enteries = $t01527115315._1
500+ let totalPeriodReward = $t01527115315._2
501+ let index = $t01527115315._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, (tokenId + kPrevLendTokenSupply)), 0)
509+ let rtCoef = if (if ((prevTotalSupply == 0))
510+ then true
511+ else (totalSupply[index] == 0))
512+ then 0
513+ else (fraction(totalSupply[index], SCALE8, prevTotalSupply) - SCALE8)
514+ let reward = ((min([(maxAPR * (SCALE8 + max([rtCoef, 0]))), 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 $t01700717099 = {
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 = $t01700717099._1
537+ let totalTokenReward = $t01700717099._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(lpTotalSupply, SCALE8, preLPSupply) - SCALE8)
556+ let rewardLp = ((min([(lpMaxAPR * (SCALE8 + max([rtLPCoef, 0]))), 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, curPeriod))
517569 }
570+ else throw("Strict value is not equal to itself.")
518571 }
519-
520- let $t01676516842 = {
521- let $l = getAllTokens()
522- let $s = size($l)
523- let $acc0 = $Tuple2(nil, 0)
524- func $f0_1 ($a,$i) = if (($i >= $s))
525- then $a
526- else updateReward($a, $l[$i])
527-
528- func $f0_2 ($a,$i) = if (($i >= $s))
529- then $a
530- else throw("List size exceeds 30")
531-
532- $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)
533- }
534- let tokensEnteries = $t01676516842._1
535- let index = $t01676516842._2
536- let lpMaxAPR = getAdoptedAPRByPeriod(curPeriod, LP_APR_PERIODS, LP_APR)
537- let lpTotalSupply = getIntegerValue(sfFarmingContract, (axlyPool + kSFTotalSupply))
538- let preLPSupply = valueOrElse(getInteger(this, kPrevLPSupply), 0)
539- let lpId = getStringValue(addressFromStringValue(axlyPool), kLpId)
540- let lpPrecision = getAssetPrecision(lpId)
541- let lpPrice = {
542- let @ = invoke(mainContract, "getShareAssetPriceREADONLY", [lpId], nil)
543- if ($isInstanceOf(@, "Int"))
544- then @
545- else throw(($getType(@) + " couldn't be cast to Int"))
546- }
547- let lpTotalSupplyUsd = fraction(lpTotalSupply, lpPrice, lpPrecision)
548- let maxLPRewardUsd = fraction(lpMaxPeriodAmount, axlyPrice, axlyPrecision)
549- let rtLPCoef = if (if ((preLPSupply == 0))
550- then true
551- else (lpTotalSupply == 0))
552- then 0
553- else fraction(preLPSupply, SCALE8, lpTotalSupply)
554- let rewardLp = (min([(lpMaxAPR * (SCALE8 + rtLPCoef)), fraction(lpMaxAPR, (15 * SCALE8), 10)]) / SCALE8)
555- let rewardLpUsd = min([maxLPRewardUsd, fraction(lpTotalSupplyUsd, rewardLp, SCALE8)])
556- let rewardLpPeriod = fraction(rewardLpUsd, axlyPrice, axlyPrecision)
557- let rewardLpPerBlock = (rewardLpPeriod / periodLength)
558- let lpEnteries = [IntegerEntry(kPrevLPSupply, lpTotalSupply), IntegerEntry(kLpRewardPerBlock, rewardLpPerBlock), IntegerEntry(kLpInterest, calcNewLpInterest(lpTotalSupply)), IntegerEntry(kLpInterestHeight, max([startHeight, height]))]
559- ((lpEnteries ++ tokensEnteries) :+ IntegerEntry(kRewardUpdateHeight, max([startHeight, height])))
560- }
561572 })
562573
563574
564575 @Verifier(tx)
565576 func verify () = {
566577 let multiSignedByAdmins = {
567578 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], admin1PK))
568579 then 1
569580 else 0
570581 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], admin2PK))
571582 then 1
572583 else 0
573584 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], admin3PK))
574585 then 1
575586 else 0
576587 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
577588 }
578589 match tx {
579590 case inv: InvokeScriptTransaction =>
580591 let isSelf = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
581592 let isRightFee = if ((inv.fee == 900000))
582593 then (inv.feeAssetId == unit)
583594 else false
584595 let isInitCall = (inv.function == "init")
585596 let isnoPayments = (size(inv.payments) == 0)
586597 if (if (if (if (isRightFee)
587598 then isInitCall
588599 else false)
589600 then isSelf
590601 else false)
591602 then isnoPayments
592603 else false)
593604 then true
594605 else multiSignedByAdmins
595606 case _ =>
596607 multiSignedByAdmins
597608 }
598609 }
599610

github/deemru/w8io/c3f4982 
79.35 ms