tx · 7PEeNfgEQayzcq5WNYrSPYsodzQpLtpZSSXV1zpWfkKA

3N2M4PztorHwrfENp7D6LhYGgGodjiD1fjn:  -0.02400000 Waves

2023.08.18 14:05 [2715959] smart account 3N2M4PztorHwrfENp7D6LhYGgGodjiD1fjn > SELF 0.00000000 Waves

{ "type": 13, "id": "7PEeNfgEQayzcq5WNYrSPYsodzQpLtpZSSXV1zpWfkKA", "fee": 2400000, "feeAssetId": null, "timestamp": 1692356783381, "version": 2, "chainId": 84, "sender": "3N2M4PztorHwrfENp7D6LhYGgGodjiD1fjn", "senderPublicKey": "Fj9LPkCtmW3pDnVU6wPQnvqpZJCBieWSvZqY5FAGeCyp", "proofs": [ "63aJ2mHGGqmMJ8YdVdS8Mn465BQPc8K9fu8GHthbfoNK57e3zxwCRHNaVSj6ZZWHs5bkqTEX9mvmzPoms6WmUYbf", "2ZGM1RSuWGQmTAtyDFPWw4CmAxK8rUXt31Zsf66DvNQuqfNbTzFvPETABmGjWuJhB21pcvQfpaQTMfG7Bxz53n6" ], "script": "base64:BgIhCAISABIAEgQKAggIEgMKAQgSBwoFCAgIAQESAwoBCBIAUQAGU0NBTEU4AIDC1y8AC0xFTkRFUlNfQVBSCQDMCAIAlgEJAMwIAgB4CQDMCAIAZAkAzAgCAFAJAMwIAgA8CQDMCAIAKAkAzAgCAB4JAMwIAgAUCQDMCAIACgUDbmlsABNMRU5ERVJTX0FQUl9QRVJJT0RTCQDMCAICAzEtMQkAzAgCAgMyLTIJAMwIAgIDMy0zCQDMCAICAzQtNAkAzAgCAgM1LTgJAMwIAgIEOS0xMgkAzAgCAgUxNC0xNgkAzAgCAgUxNy0yMAkAzAgCAgYyMC0xMDQFA25pbAATTEVOREVSU19NQVhfUEVSSU9EUwBoAAZMUF9BUFIJAMwIAgCWAQkAzAgCAHgJAMwIAgBkCQDMCAIAUAkAzAgCADwJAMwIAgAoBQNuaWwADkxQX0FQUl9QRVJJT0RTCQDMCAICAzEtMQkAzAgCAgMyLTIJAMwIAgIDMy0zCQDMCAICAzQtNAkAzAgCAgM1LTgJAMwIAgIEOS0xMgUDbmlsAA5MUF9NQVhfUEVSSU9EUwAMAAxrU3RhcnRIZWlnaHQCC3N0YXJ0SGVpZ2h0AA1rUGVyaW9kTGVuZ3RoAgxwZXJpb2RMZW5ndGgAEWtMZW5kZXJzTWF4QW1vdW50AhFsZW5kUmV3YXJkc0Ftb3VudAAMa0xQTWF4QW1vdW50Ag5scFJld2FyZEFtb3VudAAHa1Rva2VucwIGdG9rZW5zAAtrVXNlclN1cHBseQIQX3VzZXJUb3RhbFN1cHBseQAOa1Rva2VuSW50ZXJlc3QCDl90b2tlbkludGVyZXN0ABRrVG9rZW5JbnRlcmVzdEhlaWdodAIUX3Rva2VuSW50ZXJlc3RIZWlnaHQAFGtUb2tlblJld2FyZFBlckJsb2NrAhRfdG9rZW5SZXdhcmRQZXJCbG9jawATa1Jld2FyZFVwZGF0ZUhlaWdodAIScmV3YXJkVXBkYXRlSGVpZ2h0ABFrVXNlckxlbmRJbnRlcmVzdAIRX3VzZXJMYW5kSW50ZXJlc3QAF2tVc2VyTGVuZEF2YWlsYWJsZUNsYWltAhdfdXNlckxlbmRBdmFpbGFibGVDbGFpbQAVa1VzZXJMcEF2YWlsYWJsZUNsYWltAhVfdXNlckxwQXZhaWxhYmxlQ2xhaW0AC2tMcEludGVyZXN0AgpscEludGVyZXN0ABFrTHBJbnRlcmVzdEhlaWdodAIQbHBJbnRlcmVzdEhlaWdodAANa1ByZXZMUFN1cHBseQIRcHJldkxQVG90YWxTdXBwbHkAEWtMcFJld2FyZFBlckJsb2NrAhBscFJld2FyZFBlckJsb2NrAA9rVXNlckxwSW50ZXJlc3QCD191c2VyTHBJbnRlcmVzdAAOa1ByaWNlSW5PcmFjbGUCB190d2FwNUIAFGtQcmV2TGVuZFRva2VuU3VwcGx5AhRfcHJldkxlbmRUb3RhbFN1cHBseQAMa0FYTFlUb2tlbklkAgtheGx5VG9rZW5JZAAQa0xlbmRUb2tlblN1cHBseQIPdG90YWxfc3VwcGxpZWRfAA9rTGVuZFVzZXJTdXBwbHkCCl9zdXBwbGllZF8AEGtMZW5kU2V0dXBUb2tlbnMCDHNldHVwX3Rva2VucwAOa1NGVG90YWxTdXBwbHkCGl90b3RhbF9zaGFyZV90b2tlbnNfbG9ja2VkABJrU0ZVc2VyVG90YWxTdXBwbHkCFF9zaGFyZV90b2tlbnNfbG9ja2VkAAlrQXhseVBvb2wCCGF4bHlQb29sAAVrTHBJZAIOc2hhcmVfYXNzZXRfaWQADGtQcmljZU9yYWNsZQIMcHJpY2Vfb3JhY2xlABFrQXhseU1haW5Db250cmFjdAIMbWFpbkNvbnRyYWN0ABZrQXhseVRva2Vub21pY0NvbnRyYWN0AhF0b2tlbm9taWNDb250cmFjdAASa1NGRmFybWluZ0NvbnRyYWN0AhNzd29wZmlfZmFybWluZ19hZGRyAA1rTGVuZENvbnRyYWN0AhFsZW5kX3NlcnZpY2VfYWRkcgAJa0FkbWluMVBLAhVncm91cDFfYWRtaW4xX3B1Yl9rZXkACWtBZG1pbjJQSwIVZ3JvdXAxX2FkbWluMl9wdWJfa2V5AAlrQWRtaW4zUEsCFWdyb3VwMV9hZG1pbjNfcHViX2tleQAPa09wZXJhdG9yQ2FsbFBLAhJhZG1pbl9jYWxsX3B1Yl9rZXkACGF4bHlQb29sCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUJa0F4bHlQb29sAhZDYW4ndCBnZXQgYXhseVBvb2wga2V5AAxtYWluQ29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBRFrQXhseU1haW5Db250cmFjdAIZQ2FuJ3QgZ2V0IG1haW5Db250YWN0IGtleQANdG9rZW5Db250cmFjdAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMFFmtBeGx5VG9rZW5vbWljQ29udHJhY3QCH0Nhbid0IGdldCB0b2tlbm9taWNDb250cmFjdCBrZXkADGxlbmRDb250cmFjdAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFDG1haW5Db250cmFjdAUNa0xlbmRDb250cmFjdAIfQ2FuJ3QgZ2V0IGxlbmRfc2VydmljZV9hZGRyIGtleQARc2ZGYXJtaW5nQ29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQxtYWluQ29udHJhY3QFEmtTRkZhcm1pbmdDb250cmFjdAIhQ2FuJ3QgZ2V0IHN3b3BmaV9mYXJtaW5nX2FkZHIga2V5AA9wcmljZU9yYWNsZUFkZHIJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQxtYWluQ29udHJhY3QFDGtQcmljZU9yYWNsZQIaQ2FuJ3QgZ2V0IHByaWNlX29yYWNsZSBrZXkACGFkbWluMVBLCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQxtYWluQ29udHJhY3QFCWtBZG1pbjFQSwISQ2FuJ3QgZ2V0IGFkbWluMVBLAAhhZG1pbjJQSwkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUMbWFpbkNvbnRyYWN0BQlrQWRtaW4yUEsCEkNhbid0IGdldCBhZG1pbjJQSwAIYWRtaW4zUEsJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFDG1haW5Db250cmFjdAUJa0FkbWluM1BLAhRDYW4ndCBnZXQgb3BlcmF0b3JQSwAKb3BlcmF0b3JQSwkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUPa09wZXJhdG9yQ2FsbFBLAhRDYW4ndCBnZXQgb3BlcmF0b3JQSwAGYXhseUlkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUNdG9rZW5Db250cmFjdAUMa0FYTFlUb2tlbklkAhdDYW4ndCBnZXQgQXhseSB0b2tlbiBpZAALc3RhcnRIZWlnaHQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMFDGtTdGFydEhlaWdodAAMcGVyaW9kTGVuZ3RoCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzBQ1rUGVyaW9kTGVuZ3RoAAljdXJQZXJpb2QJAJYDAQkAzAgCAAEJAMwIAgkAaQIJAGUCBQZoZWlnaHQFC3N0YXJ0SGVpZ2h0BQxwZXJpb2RMZW5ndGgFA25pbAANbGVuZE1heEFtb3VudAkBEUBleHRyTmF0aXZlKDEwNTApAgUNdG9rZW5Db250cmFjdAURa0xlbmRlcnNNYXhBbW91bnQAE2xlbmRNYXhQZXJpb2RBbW91bnQJAGkCBQ1sZW5kTWF4QW1vdW50BRNMRU5ERVJTX01BWF9QRVJJT0RTAAtscE1heEFtb3VudAkBEUBleHRyTmF0aXZlKDEwNTApAgUNdG9rZW5Db250cmFjdAUMa0xQTWF4QW1vdW50ABFscE1heFBlcmlvZEFtb3VudAkAaQIFC2xwTWF4QW1vdW50BQ5MUF9NQVhfUEVSSU9EUwELaXNBZG1pbkNhbGwBAWkDCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQhhZG1pbjFQSwkAzAgCBQhhZG1pbjJQSwkAzAgCBQhhZG1pbjNQSwUDbmlsCAUBaQ9jYWxsZXJQdWJsaWNLZXkFBHVuaXQJAAIBAihPbmx5IGFkbWluIGdyb3VwMSBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uAQppc1NlbGZDYWxsAQFpAwkAAAIIBQFpBmNhbGxlcgUEdGhpcwUEdW5pdAkAAgECK09ubHkgY29udHJhY3QgaXRzZWxmIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24BDmlzT3BlcmF0b3JDYWxsAQFpAwkAAAIIBQFpD2NhbGxlclB1YmxpY0tleQUKb3BlcmF0b3JQSwUEdW5pdAkAAgECJE9ubHkgb3BlcmF0b3IgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgEKaXNMYW5kQ2FsbAEBaQMJAAACCAUBaQZjYWxsZXIFDGxlbmRDb250cmFjdAUEdW5pdAkAAgECKU9ubHkgbGFuZCBjb250cmFjdCBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uAQ9pc1NGRmFybWluZ0NhbGwBAWkDCQAAAggFAWkGY2FsbGVyBRFzZkZhcm1pbmdDb250cmFjdAUEdW5pdAkAAgECKU9ubHkgbGFuZCBjb250cmFjdCBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uAQxnZXRBbGxUb2tlbnMABAZ0b2tlbnMJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwUHa1Rva2VucwIAAwkAAAIFBnRva2VucwIABQNuaWwJALUJAgUGdG9rZW5zAgEsAQ1nZXRBc3NldFByaWNlAQdhc3NldElkCQERQGV4dHJOYXRpdmUoMTA1MCkCBQ9wcmljZU9yYWNsZUFkZHIJAKwCAgUHYXNzZXRJZAUOa1ByaWNlSW5PcmFjbGUBEGdldEFzc2V0RGVjaW1hbHMBB2Fzc2V0SWQDCQAAAgUHYXNzZXRJZAIFV0FWRVMACAQHJG1hdGNoMAkA7AcBCQDZBAEFB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIFQXNzZXQEBWFzc2V0BQckbWF0Y2gwCAUFYXNzZXQIZGVjaW1hbHMJAAIBAhBDYW4ndCBmaW5kIGFzc2V0ARFnZXRBc3NldFByZWNpc2lvbgEHYXNzZXRJZAkAbAYACgAACQEQZ2V0QXNzZXREZWNpbWFscwEFB2Fzc2V0SWQAAAAABQRET1dOARVnZXRBZG9wdGVkQVBSQnlQZXJpb2QDBnBlcmlvZAphcHJQZXJpb2RzA2FwcgoBA2ZvcgIBYQdhcGVyaW9kBAskdDA1NDI5NTQ1MQUBYQQFaW5kZXgIBQskdDA1NDI5NTQ1MQJfMQQFZm91bmQIBQskdDA1NDI5NTQ1MQJfMgQCZnQJALUJAgUHYXBlcmlvZAIBLQQLJHQwNTQ4ODU1NTEJAJQKAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmZ0AAAJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJmdAABBARmcm9tCAULJHQwNTQ4ODU1NTECXzEEAnRvCAULJHQwNTQ4ODU1NTECXzIDBQVmb3VuZAUBYQMDCQBnAgUGcGVyaW9kBQRmcm9tCQBnAgUCdG8FBnBlcmlvZAcJAJQKAgUFaW5kZXgGCQCUCgIJAGQCBQVpbmRleAABBwQLJHQwNTY4ODU3NTQKAAIkbAUTTEVOREVSU19BUFJfUEVSSU9EUwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgAABwoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEDZm9yAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA5CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJBAVpbmRleAgFCyR0MDU2ODg1NzU0Al8xBAVmb3VuZAgFCyR0MDU2ODg1NzU0Al8yAwUFZm91bmQJAGsDCQBoAgkAkQMCBQtMRU5ERVJTX0FQUgUFaW5kZXgFBlNDQUxFOAAHAO0CAAABF2dldFRvdGFsU3VwcGx5QWxsVG9rZW5zAAoBA2ZvcgIBYQd0b2tlbklkBAskdDA1OTQyNTk5OAUBYQQLdG90YWxTdXBwbHkIBQskdDA1OTQyNTk5OAJfMQQOdG90YWxTdXBwbHlVc2QIBQskdDA1OTQyNTk5OAJfMgQRdG90YWxTdXBwbHlVc2RBbGwIBQskdDA1OTQyNTk5OAJfMwQHdFN1cHBseQkBC3ZhbHVlT3JFbHNlAgkAmggCBQxsZW5kQ29udHJhY3QJAKwCAgUQa0xlbmRUb2tlblN1cHBseQUHdG9rZW5JZAAABAphc3NldFByaWNlCQENZ2V0QXNzZXRQcmljZQEFB3Rva2VuSWQEDmFzc2V0UHJlY2lzaW9uCQERZ2V0QXNzZXRQcmVjaXNpb24BBQd0b2tlbklkBAp0U3VwcGx5VXNkCQBrAwUHdFN1cHBseQUKYXNzZXRQcmljZQUOYXNzZXRQcmVjaXNpb24JAJUKAwkAzQgCBQt0b3RhbFN1cHBseQUHdFN1cHBseQkAzQgCBQ50b3RhbFN1cHBseVVzZAUKdFN1cHBseVVzZAkAZAIFEXRvdGFsU3VwcGx5VXNkQWxsBQp0U3VwcGx5VXNkCgACJGwJAQxnZXRBbGxUb2tlbnMACgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlQoDBQNuaWwFA25pbAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQNmb3ICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDMwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAAVABYAFwAYABkAGgAbABwAHQAeARFnZXRUb3RhbFN1cHBseVVzZAEHdG9rZW5JZAQHdFN1cHBseQkBC3ZhbHVlT3JFbHNlAgkAmggCBQxsZW5kQ29udHJhY3QJAKwCAgUQa0xlbmRUb2tlblN1cHBseQUHdG9rZW5JZAAABAphc3NldFByaWNlCQENZ2V0QXNzZXRQcmljZQEFB3Rva2VuSWQEDmFzc2V0UHJlY2lzaW9uCQERZ2V0QXNzZXRQcmVjaXNpb24BBQd0b2tlbklkCQBrAwUHdFN1cHBseQUKYXNzZXRQcmljZQUOYXNzZXRQcmVjaXNpb24BFGNhbGNOZXdUb2tlbkludGVyZXN0Agd0b2tlbklkC3RvdGFsU3VwcGx5AwkAZwIFC3N0YXJ0SGVpZ2h0BQZoZWlnaHQAAAQOcmV3YXJkUGVyQmxvY2sJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgUHdG9rZW5JZAUUa1Rva2VuUmV3YXJkUGVyQmxvY2sEC29sZEludGVyZXN0CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIFB3Rva2VuSWQFDmtUb2tlbkludGVyZXN0BAx1cGRhdGVIZWlnaHQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgUHdG9rZW5JZAUUa1Rva2VuSW50ZXJlc3RIZWlnaHQEBnJld2FyZAkAaAIJAGUCBQZoZWlnaHQFDHVwZGF0ZUhlaWdodAUOcmV3YXJkUGVyQmxvY2sECGludGVyZXN0AwkAZgIFC3RvdGFsU3VwcGx5AAAJAGsDBQZyZXdhcmQFBlNDQUxFOAULdG90YWxTdXBwbHkAAAkAZAIFC29sZEludGVyZXN0BQhpbnRlcmVzdAERY2FsY05ld0xwSW50ZXJlc3QBC3RvdGFsU3VwcGx5AwkAZwIFC3N0YXJ0SGVpZ2h0BQZoZWlnaHQAAAQOcmV3YXJkUGVyQmxvY2sJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwURa0xwUmV3YXJkUGVyQmxvY2sAAAQLb2xkSW50ZXJlc3QJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwULa0xwSW50ZXJlc3QAAAQMdXBkYXRlSGVpZ2h0CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFEWtMcEludGVyZXN0SGVpZ2h0BQZoZWlnaHQEBnJld2FyZAkAaAIJAGUCBQZoZWlnaHQFDHVwZGF0ZUhlaWdodAUOcmV3YXJkUGVyQmxvY2sECGludGVyZXN0AwkAZgIFC3RvdGFsU3VwcGx5AAAJAGsDBQZyZXdhcmQFBlNDQUxFOAULdG90YWxTdXBwbHkAAAkAZAIFC29sZEludGVyZXN0BQhpbnRlcmVzdAESY2FsY0xlbmRVc2VyUmV3YXJkAgR1c2VyB3Rva2VuSWQEC3RvdGFsU3VwcGx5CQELdmFsdWVPckVsc2UCCQCaCAIFDGxlbmRDb250cmFjdAkArAICBRBrTGVuZFRva2VuU3VwcGx5BQd0b2tlbklkAAAEDXRva2VuSW50ZXJlc3QJARRjYWxjTmV3VG9rZW5JbnRlcmVzdAIFB3Rva2VuSWQFC3RvdGFsU3VwcGx5BAp1c2VyU3VwcGx5CQELdmFsdWVPckVsc2UCCQCaCAIFDGxlbmRDb250cmFjdAkArAICCQCsAgIFBHVzZXIFD2tMZW5kVXNlclN1cHBseQUHdG9rZW5JZAAABBF1c2VyVG9rZW5JbnRlcmVzdAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICBQd0b2tlbklkAgFfBQR1c2VyBRFrVXNlckxlbmRJbnRlcmVzdAMJAAACBQp1c2VyU3VwcGx5AAAFDXRva2VuSW50ZXJlc3QAAAQGcmV3YXJkCQBrAwUKdXNlclN1cHBseQkAZQIFDXRva2VuSW50ZXJlc3QFEXVzZXJUb2tlbkludGVyZXN0BQZTQ0FMRTgJAJUKAwUGcmV3YXJkBQ10b2tlbkludGVyZXN0BQp1c2VyU3VwcGx5ARBjYWxjTHBVc2VyUmV3YXJkAQR1c2VyBAt0b3RhbFN1cHBseQkBC3ZhbHVlT3JFbHNlAgkAmggCBRFzZkZhcm1pbmdDb250cmFjdAkArAICBQhheGx5UG9vbAUOa1NGVG90YWxTdXBwbHkAAAQNdG9rZW5JbnRlcmVzdAkBEWNhbGNOZXdMcEludGVyZXN0AQULdG90YWxTdXBwbHkECnVzZXJTdXBwbHkJAQt2YWx1ZU9yRWxzZQIJAJoIAgURc2ZGYXJtaW5nQ29udHJhY3QJAKwCAgkArAICCQCsAgIFCGF4bHlQb29sAgFfBQR1c2VyBRJrU0ZVc2VyVG90YWxTdXBwbHkAAAQRdXNlclRva2VuSW50ZXJlc3QJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQR1c2VyBQ9rVXNlckxwSW50ZXJlc3QDCQAAAgUKdXNlclN1cHBseQAABQ10b2tlbkludGVyZXN0AAAEBnJld2FyZAkAawMFCnVzZXJTdXBwbHkJAGUCBQ10b2tlbkludGVyZXN0BRF1c2VyVG9rZW5JbnRlcmVzdAUGU0NBTEU4CQCVCgMFBnJld2FyZAUNdG9rZW5JbnRlcmVzdAUKdXNlclN1cHBseQEYY2xhaW1MZW5kZXJSZXdhcmRzQ29tbW9uAgR1c2VyCHJlYWRPbmx5CgEFY2xhaW0CAWEHdG9rZW5JZAQLJHQwODg4Nzg5MzEFAWEECHRva2VuSWRzCAULJHQwODg4Nzg5MzECXzEEB2NBbW91bnQIBQskdDA4ODg3ODkzMQJfMgQFdG90YWwIBQskdDA4ODg3ODkzMQJfMwQIZW50ZXJpZXMIBQskdDA4ODg3ODkzMQJfNAQSdXNlckF2YWlsYWJsZUNsYWltCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIFB3Rva2VuSWQCAV8FBHVzZXIFF2tVc2VyTGVuZEF2YWlsYWJsZUNsYWltAAAECyR0MDkwNDQ5MTIzCQESY2FsY0xlbmRVc2VyUmV3YXJkAgUEdXNlcgUHdG9rZW5JZAQHdVJld2FyZAgFCyR0MDkwNDQ5MTIzAl8xBBBuZXdUb2tlbkludGVyZXN0CAULJHQwOTA0NDkxMjMCXzIECnVzZXJTdXBwbHkIBQskdDA5MDQ0OTEyMwJfMwQMdG90YWxUb0NsYWltCQBkAgUSdXNlckF2YWlsYWJsZUNsYWltBQd1UmV3YXJkAwMJAGYCBQx0b3RhbFRvQ2xhaW0AAAYJAGYCBQp1c2VyU3VwcGx5AAAEDG5ld0VudHJlcmllcwMDBQhyZWFkT25seQYJAAACBQx0b3RhbFRvQ2xhaW0AAAUIZW50ZXJpZXMJAM4IAgUIZW50ZXJpZXMJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIFB3Rva2VuSWQCAV8FBHVzZXIFEWtVc2VyTGVuZEludGVyZXN0BRBuZXdUb2tlbkludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICBQd0b2tlbklkAgFfBQR1c2VyBRdrVXNlckxlbmRBdmFpbGFibGVDbGFpbQAACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFB3Rva2VuSWQFDmtUb2tlbkludGVyZXN0BRBuZXdUb2tlbkludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFB3Rva2VuSWQFFGtUb2tlbkludGVyZXN0SGVpZ2h0BQZoZWlnaHQFA25pbAkAlgoECQDNCAIFCHRva2VuSWRzBQd0b2tlbklkCQDNCAIFB2NBbW91bnQFDHRvdGFsVG9DbGFpbQkAZAIFBXRvdGFsBQx0b3RhbFRvQ2xhaW0FDG5ld0VudHJlcmllcwkAlgoEBQh0b2tlbklkcwUHY0Ftb3VudAUFdG90YWwFCGVudGVyaWVzCgACJGwJAQxnZXRBbGxUb2tlbnMACgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlgoEBQNuaWwFA25pbAAABQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBBWNsYWltAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAzMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgEUY2xhaW1McFJld2FyZHNDb21tb24CBHVzZXIIcmVhZE9ubHkEEnVzZXJBdmFpbGFibGVDbGFpbQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHVzZXIFFWtVc2VyTHBBdmFpbGFibGVDbGFpbQAABA0kdDAxMDA1NTEwMTIwCQEQY2FsY0xwVXNlclJld2FyZAEFBHVzZXIEB3VSZXdhcmQIBQ0kdDAxMDA1NTEwMTIwAl8xBA1uZXdMcEludGVyZXN0CAUNJHQwMTAwNTUxMDEyMAJfMgQKdXNlclN1cHBseQgFDSR0MDEwMDU1MTAxMjACXzMEDHRvdGFsVG9DbGFpbQkAZAIFEnVzZXJBdmFpbGFibGVDbGFpbQUHdVJld2FyZAMDBQhyZWFkT25seQYJAAACBQx0b3RhbFRvQ2xhaW0AAAkAlAoCBQx0b3RhbFRvQ2xhaW0FA25pbAkAlAoCBQx0b3RhbFRvQ2xhaW0JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEdXNlcgUPa1VzZXJMcEludGVyZXN0BQ1uZXdMcEludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHVzZXIFFWtVc2VyTHBBdmFpbGFibGVDbGFpbQAACQDMCAIJAQxJbnRlZ2VyRW50cnkCBQtrTHBJbnRlcmVzdAUNbmV3THBJbnRlcmVzdAkAzAgCCQEMSW50ZWdlckVudHJ5AgURa0xwSW50ZXJlc3RIZWlnaHQFBmhlaWdodAUDbmlsAQ1nZXRUb2tlbnNBUFJzAAQJYXhseVByaWNlCQENZ2V0QXNzZXRQcmljZQEFBmF4bHlJZAQNYXhseVByZWNpc2lvbgkBEWdldEFzc2V0UHJlY2lzaW9uAQUGYXhseUlkCgEKdG9rZW5zQXBycwIDYXByB3Rva2VuSWQEBHJ3cGIJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQd0b2tlbklkBRRrVG9rZW5SZXdhcmRQZXJCbG9jawAABAdyd3BiVXNkCQBrAwUEcndwYgUJYXhseVByaWNlBQ1heGx5UHJlY2lzaW9uBAZyd1llYXIJAGgCCQBoAgUHcndwYlVzZAUMcGVyaW9kTGVuZ3RoADQEDnRvdGFsU3VwcGx5VXNkCQERZ2V0VG90YWxTdXBwbHlVc2QBBQd0b2tlbklkCQDNCAIFA2FwcgkAawMFBnJ3WWVhcgUGU0NBTEU4BQ50b3RhbFN1cHBseVVzZAQEYXBycwoAAiRsCQEMZ2V0QWxsVG9rZW5zAAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEKdG9rZW5zQXBycwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMzAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsAHAAdAB4EDWxwVG90YWxTdXBwbHkJARFAZXh0ck5hdGl2ZSgxMDUwKQIFEXNmRmFybWluZ0NvbnRyYWN0CQCsAgIFCGF4bHlQb29sBQ5rU0ZUb3RhbFN1cHBseQQEbHBJZAkBEUBleHRyTmF0aXZlKDEwNTMpAgkBEUBleHRyTmF0aXZlKDEwNjIpAQUIYXhseVBvb2wFBWtMcElkBAtscFByZWNpc2lvbgkBEWdldEFzc2V0UHJlY2lzaW9uAQUEbHBJZAQHbHBQcmljZQoAAUAJAPwHBAUMbWFpbkNvbnRyYWN0AhpnZXRTaGFyZUFzc2V0UHJpY2VSRUFET05MWQkAzAgCBQRscElkBQNuaWwFA25pbAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQEEGxwVG90YWxTdXBwbHlVc2QJAGsDBQ1scFRvdGFsU3VwcGx5BQdscFByaWNlBQtscFByZWNpc2lvbgQEcndwYgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBRFrTHBSZXdhcmRQZXJCbG9jawAABAdyd3BiVXNkCQBrAwUEcndwYgUJYXhseVByaWNlBQ1heGx5UHJlY2lzaW9uBAZyd1llYXIJAGgCCQBoAgUHcndwYlVzZAUMcGVyaW9kTGVuZ3RoADQEBWxwQXByCQBrAwUGcndZZWFyBQZTQ0FMRTgFEGxwVG90YWxTdXBwbHlVc2QJAJUKAwkBDGdldEFsbFRva2VucwAFBGFwcnMFBWxwQXByBwFpARJjbGFpbUxlbmRlclJld2FyZHMABAhjbGFpbVJlcwkBGGNsYWltTGVuZGVyUmV3YXJkc0NvbW1vbgIJAKUIAQgFAWkGY2FsbGVyBwMJAAACCAUIY2xhaW1SZXMCXzMAAAkAAgECI2NsYWltIGFtb3VudCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwBANpbnYJAPwHBAUNdG9rZW5Db250cmFjdAISd2l0aGRyYXdMZW5kUmV3YXJkCQDMCAIIBQhjbGFpbVJlcwJfMwkAzAgCCQClCAEIBQFpBmNhbGxlcgUDbmlsBQNuaWwDCQAAAgUDaW52BQNpbnYIBQhjbGFpbVJlcwJfNAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ5jbGFpbUxwUmV3YXJkcwAECGNsYWltUmVzCQEUY2xhaW1McFJld2FyZHNDb21tb24CCQClCAEIBQFpBmNhbGxlcgcDCQAAAggFCGNsYWltUmVzAl8xAAAJAAIBAiNjbGFpbSBhbW91bnQgbXVzdCBiZSBncmVhdGVyIHRoYW4gMAQDaW52CQD8BwQFDXRva2VuQ29udHJhY3QCEHdpdGhkcmF3THBSZXdhcmQJAMwIAggFCGNsYWltUmVzAl8xCQDMCAIJAKUIAQgFAWkGY2FsbGVyBQNuaWwFA25pbAMJAAACBQNpbnYFA2ludggFCGNsYWltUmVzAl8yCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCmxlbmRBY3Rpb24CBHVzZXIHdG9rZW5JZAkBC3ZhbHVlT3JFbHNlAgkBCmlzTGFuZENhbGwBBQFpBBJ1c2VyQXZhaWxhYmxlQ2xhaW0JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQd0b2tlbklkBRdrVXNlckxlbmRBdmFpbGFibGVDbGFpbQAABA0kdDAxMjQ2ODEyNTM1CQESY2FsY0xlbmRVc2VyUmV3YXJkAgUEdXNlcgUHdG9rZW5JZAQHdVJld2FyZAgFDSR0MDEyNDY4MTI1MzUCXzEEEG5ld1Rva2VuSW50ZXJlc3QIBQ0kdDAxMjQ2ODEyNTM1Al8yCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICBQR1c2VyAgFfBQd0b2tlbklkBRFrVXNlckxlbmRJbnRlcmVzdAUQbmV3VG9rZW5JbnRlcmVzdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgUEdXNlcgIBXwUHdG9rZW5JZAUXa1VzZXJMZW5kQXZhaWxhYmxlQ2xhaW0JAGQCBRJ1c2VyQXZhaWxhYmxlQ2xhaW0FB3VSZXdhcmQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUHdG9rZW5JZAUOa1Rva2VuSW50ZXJlc3QFEG5ld1Rva2VuSW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUHdG9rZW5JZAUUa1Rva2VuSW50ZXJlc3RIZWlnaHQFBmhlaWdodAUDbmlsAWkBCGxwQWN0aW9uAQR1c2VyCQELdmFsdWVPckVsc2UCCQEPaXNTRkZhcm1pbmdDYWxsAQUBaQQSdXNlckF2YWlsYWJsZUNsYWltCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFFWtVc2VyTHBBdmFpbGFibGVDbGFpbQAABA0kdDAxMzAwMDEzMDUzCQEQY2FsY0xwVXNlclJld2FyZAEFBHVzZXIEB3VSZXdhcmQIBQ0kdDAxMzAwMDEzMDUzAl8xBA1uZXdMcEludGVyZXN0CAUNJHQwMTMwMDAxMzA1MwJfMgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQR1c2VyBQ9rVXNlckxwSW50ZXJlc3QFDW5ld0xwSW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEdXNlcgUVa1VzZXJMcEF2YWlsYWJsZUNsYWltCQBkAgUSdXNlckF2YWlsYWJsZUNsYWltBQd1UmV3YXJkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHVzZXIFC2tMcEludGVyZXN0BQ1uZXdMcEludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHVzZXIFEWtMcEludGVyZXN0SGVpZ2h0BQZoZWlnaHQFA25pbAFpAQRpbml0BRRheGx5TWFpbkNvbnRyYWN0QWRkchlheGx5VG9rZW5vbWljQ29udHJhY3RBZGRyDGF4bHlQb29sQWRkchJmYXJtaW5nU3RhcnRIZWlnaHQMcGVyaW9kTGVuZ3RoCQELdmFsdWVPckVsc2UCCQEKaXNTZWxmQ2FsbAEFAWkDCQEBIQEJAQlpc0RlZmluZWQBCQCmCAEFFGF4bHlNYWluQ29udHJhY3RBZGRyCQACAQIVV3JvbmcgZmFybWluZyBhZGRyZXNzAwkBASEBCQEJaXNEZWZpbmVkAQkApggBBRlheGx5VG9rZW5vbWljQ29udHJhY3RBZGRyCQACAQIbV3JvbmcgbWFpbiBjb250cmFjdCBhZGRyZXNzCQDMCAIJAQtTdHJpbmdFbnRyeQIFEWtBeGx5TWFpbkNvbnRyYWN0BRRheGx5TWFpbkNvbnRyYWN0QWRkcgkAzAgCCQELU3RyaW5nRW50cnkCBRZrQXhseVRva2Vub21pY0NvbnRyYWN0BRlheGx5VG9rZW5vbWljQ29udHJhY3RBZGRyCQDMCAIJAQtTdHJpbmdFbnRyeQIFCWtBeGx5UG9vbAUMYXhseVBvb2xBZGRyCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQxrU3RhcnRIZWlnaHQFEmZhcm1pbmdTdGFydEhlaWdodAkAzAgCCQEMSW50ZWdlckVudHJ5AgUNa1BlcmlvZExlbmd0aAUMcGVyaW9kTGVuZ3RoBQNuaWwBaQEMaW5pdE5ld1Rva2VuAQd0b2tlbklkCQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwkBCWlzRGVmaW5lZAEJAJoIAgUEdGhpcwkArAICBQd0b2tlbklkBQ5rVG9rZW5JbnRlcmVzdAkAAgECFHRva2VuIGFscmVhZHkgaW5pdGVkAwkBASEBCQEIY29udGFpbnMCCQERQGV4dHJOYXRpdmUoMTA1MykCBQxsZW5kQ29udHJhY3QFEGtMZW5kU2V0dXBUb2tlbnMFB3Rva2VuSWQJAAIBAhNubyB0b2tlbiBvbiBsYW5kaW5nBAxuZXdBbGxUb2tlbnMJAM0IAgkBDGdldEFsbFRva2VucwAFB3Rva2VuSWQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUHdG9rZW5JZAUOa1Rva2VuSW50ZXJlc3QAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQd0b2tlbklkBRRrVG9rZW5JbnRlcmVzdEhlaWdodAkAlgMBCQDMCAIFC3N0YXJ0SGVpZ2h0CQDMCAIFBmhlaWdodAUDbmlsCQDMCAIJAQtTdHJpbmdFbnRyeQIFB2tUb2tlbnMJALkJAgUMbmV3QWxsVG9rZW5zAgEsCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFB3Rva2VuSWQFFGtUb2tlblJld2FyZFBlckJsb2NrAAAFA25pbAFpAQ11cGRhdGVSZXdhcmRzAAkBC3ZhbHVlT3JFbHNlAgkBDmlzT3BlcmF0b3JDYWxsAQUBaQQQbGFzdFVwZGF0ZUhlaWdodAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBRNrUmV3YXJkVXBkYXRlSGVpZ2h0AAADCQBmAgkAZAIFEGxhc3RVcGRhdGVIZWlnaHQFDHBlcmlvZExlbmd0aAUGaGVpZ2h0CQACAQIlcmV3YXJkcyBhbHJlZHkgdXBkYXRlZCBpbiB0aGlzIHBlcmlvZAQNJHQwMTQ4MjAxNDkwMAkBF2dldFRvdGFsU3VwcGx5QWxsVG9rZW5zAAQLdG90YWxTdXBwbHkIBQ0kdDAxNDgyMDE0OTAwAl8xBA50b3RhbFN1cHBseVVzZAgFDSR0MDE0ODIwMTQ5MDACXzIEEXRvdGFsU3VwcGx5VXNkQWxsCAUNJHQwMTQ4MjAxNDkwMAJfMwQJYXhseVByaWNlCQENZ2V0QXNzZXRQcmljZQEFBmF4bHlJZAQNYXhseVByZWNpc2lvbgkBEWdldEFzc2V0UHJlY2lzaW9uAQUGYXhseUlkBAZtYXhBUFIJARVnZXRBZG9wdGVkQVBSQnlQZXJpb2QDBQljdXJQZXJpb2QFE0xFTkRFUlNfQVBSX1BFUklPRFMFC0xFTkRFUlNfQVBSCgEMdXBkYXRlUmV3YXJkAgFhB3Rva2VuSWQEDSR0MDE1MTQ5MTUxOTMFAWEECGVudGVyaWVzCAUNJHQwMTUxNDkxNTE5MwJfMQQRdG90YWxQZXJpb2RSZXdhcmQIBQ0kdDAxNTE0OTE1MTkzAl8yBAVpbmRleAgFDSR0MDE1MTQ5MTUxOTMCXzMDCQAAAgkAkQMCBQt0b3RhbFN1cHBseQUFaW5kZXgAAAkAlQoDCQDOCAIFCGVudGVyaWVzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFB3Rva2VuSWQFFGtQcmV2TGVuZFRva2VuU3VwcGx5CQCRAwIFC3RvdGFsU3VwcGx5BQVpbmRleAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQd0b2tlbklkBRRrVG9rZW5SZXdhcmRQZXJCbG9jawAACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFB3Rva2VuSWQFDmtUb2tlbkludGVyZXN0CQEUY2FsY05ld1Rva2VuSW50ZXJlc3QCBQd0b2tlbklkCQCRAwIFC3RvdGFsU3VwcGx5BQVpbmRleAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQd0b2tlbklkBRRrVG9rZW5JbnRlcmVzdEhlaWdodAkAlgMBCQDMCAIFC3N0YXJ0SGVpZ2h0CQDMCAIFBmhlaWdodAUDbmlsBQNuaWwFEXRvdGFsUGVyaW9kUmV3YXJkCQBkAgUFaW5kZXgAAQQFc2hhcmUJAGsDCQCRAwIFDnRvdGFsU3VwcGx5VXNkBQVpbmRleAUGU0NBTEU4BRF0b3RhbFN1cHBseVVzZEFsbAQJbWF4UmV3YXJkCQBrAwUFc2hhcmUFE2xlbmRNYXhQZXJpb2RBbW91bnQFBlNDQUxFOAQMbWF4UmV3YXJkVXNkCQBrAwUJbWF4UmV3YXJkBQlheGx5UHJpY2UFDWF4bHlQcmVjaXNpb24ED3ByZXZUb3RhbFN1cHBseQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBRRrUHJldkxlbmRUb2tlblN1cHBseQAABAZydENvZWYDAwkAAAIFD3ByZXZUb3RhbFN1cHBseQAABgkAAAIJAJEDAgULdG90YWxTdXBwbHkFBWluZGV4AAAAAAkAawMFD3ByZXZUb3RhbFN1cHBseQUGU0NBTEU4CQCRAwIFC3RvdGFsU3VwcGx5BQVpbmRleAQGcmV3YXJkCQBpAgkAaQIJAJcDAQkAzAgCCQBoAgUGbWF4QVBSCQBkAgUGU0NBTEU4BQZydENvZWYJAMwIAgkAawMFBm1heEFQUgkAaAIADwUGU0NBTEU4AAoFA25pbAUGU0NBTEU4AGQECXJld2FyZFVzZAkAlwMBCQDMCAIFDG1heFJld2FyZFVzZAkAzAgCCQBrAwkAkQMCBQ50b3RhbFN1cHBseVVzZAUFaW5kZXgFBnJld2FyZAUGU0NBTEU4BQNuaWwEDHJld2FyZFBlcmlvZAkAawMFCXJld2FyZFVzZAUNYXhseVByZWNpc2lvbgUJYXhseVByaWNlBA5yZXdhcmRQZXJCbG9jawkAaQIFDHJld2FyZFBlcmlvZAUMcGVyaW9kTGVuZ3RoCQCVCgMJAM4IAgUIZW50ZXJpZXMJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUHdG9rZW5JZAUUa1ByZXZMZW5kVG9rZW5TdXBwbHkJAJEDAgULdG90YWxTdXBwbHkFBWluZGV4CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFB3Rva2VuSWQFFGtUb2tlblJld2FyZFBlckJsb2NrBQ5yZXdhcmRQZXJCbG9jawkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQd0b2tlbklkBQ5rVG9rZW5JbnRlcmVzdAkBFGNhbGNOZXdUb2tlbkludGVyZXN0AgUHdG9rZW5JZAkAkQMCBQt0b3RhbFN1cHBseQUFaW5kZXgJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUHdG9rZW5JZAUUa1Rva2VuSW50ZXJlc3RIZWlnaHQJAJYDAQkAzAgCBQtzdGFydEhlaWdodAkAzAgCBQZoZWlnaHQFA25pbAUDbmlsCQBkAgURdG90YWxQZXJpb2RSZXdhcmQFDHJld2FyZFBlcmlvZAkAZAIFBWluZGV4AAEEDSR0MDE2ODU1MTY5NTMKAAIkbAkBDGdldEFsbFRva2VucwAKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCVCgMFA25pbAAAAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBDHVwZGF0ZVJld2FyZAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMzAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsAHAAdAB4EDnRva2Vuc0VudGVyaWVzCAUNJHQwMTY4NTUxNjk1MwJfMQQQdG90YWxUb2tlblJld2FyZAgFDSR0MDE2ODU1MTY5NTMCXzIEBWluZGV4CAUNJHQwMTY4NTUxNjk1MwJfMwQIbHBNYXhBUFIJARVnZXRBZG9wdGVkQVBSQnlQZXJpb2QDBQljdXJQZXJpb2QFDkxQX0FQUl9QRVJJT0RTBQZMUF9BUFIEDWxwVG90YWxTdXBwbHkJARFAZXh0ck5hdGl2ZSgxMDUwKQIFEXNmRmFybWluZ0NvbnRyYWN0CQCsAgIFCGF4bHlQb29sBQ5rU0ZUb3RhbFN1cHBseQQLcHJlTFBTdXBwbHkJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUNa1ByZXZMUFN1cHBseQAABARscElkCQERQGV4dHJOYXRpdmUoMTA1MykCCQERQGV4dHJOYXRpdmUoMTA2MikBBQhheGx5UG9vbAUFa0xwSWQEC2xwUHJlY2lzaW9uCQERZ2V0QXNzZXRQcmVjaXNpb24BBQRscElkBAdscFByaWNlCgABQAkA/AcEBQxtYWluQ29udHJhY3QCGmdldFNoYXJlQXNzZXRQcmljZVJFQURPTkxZCQDMCAIFBGxwSWQFA25pbAUDbmlsAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAQQbHBUb3RhbFN1cHBseVVzZAkAawMFDWxwVG90YWxTdXBwbHkFB2xwUHJpY2UFC2xwUHJlY2lzaW9uBA5tYXhMUFJld2FyZFVzZAkAawMFEWxwTWF4UGVyaW9kQW1vdW50BQlheGx5UHJpY2UFDWF4bHlQcmVjaXNpb24ECHJ0TFBDb2VmAwMJAAACBQtwcmVMUFN1cHBseQAABgkAAAIFDWxwVG90YWxTdXBwbHkAAAAACQBrAwULcHJlTFBTdXBwbHkFBlNDQUxFOAUNbHBUb3RhbFN1cHBseQQIcmV3YXJkTHAJAGkCCQBpAgkAlwMBCQDMCAIJAGgCBQhscE1heEFQUgkAZAIFBlNDQUxFOAUIcnRMUENvZWYJAMwIAgkAawMFCGxwTWF4QVBSCQBoAgAPBQZTQ0FMRTgACgUDbmlsBQZTQ0FMRTgAZAQLcmV3YXJkTHBVc2QJAJcDAQkAzAgCBQ5tYXhMUFJld2FyZFVzZAkAzAgCCQBrAwUQbHBUb3RhbFN1cHBseVVzZAUIcmV3YXJkTHAFBlNDQUxFOAUDbmlsBA5yZXdhcmRMcFBlcmlvZAkAawMFC3Jld2FyZExwVXNkBQ1heGx5UHJlY2lzaW9uBQlheGx5UHJpY2UEEHJld2FyZExwUGVyQmxvY2sJAGkCBQ5yZXdhcmRMcFBlcmlvZAUMcGVyaW9kTGVuZ3RoBAhidXJuTGVuZAkAZQIFE2xlbmRNYXhQZXJpb2RBbW91bnQFEHRvdGFsVG9rZW5SZXdhcmQEBmJ1cm5McAkAZQIFEWxwTWF4UGVyaW9kQW1vdW50BQ5yZXdhcmRMcFBlcmlvZAQDaW52CQD8BwQFDXRva2VuQ29udHJhY3QCEHdpdGhkcmF3THBSZXdhcmQJAMwIAgkAZAIFCGJ1cm5MZW5kBQZidXJuTHAJAMwIAgkApQgBBQR0aGlzBQNuaWwFA25pbAMJAAACBQNpbnYFA2ludgQKbHBFbnRlcmllcwkAzAgCCQEMSW50ZWdlckVudHJ5AgUNa1ByZXZMUFN1cHBseQUNbHBUb3RhbFN1cHBseQkAzAgCCQEMSW50ZWdlckVudHJ5AgURa0xwUmV3YXJkUGVyQmxvY2sFEHJld2FyZExwUGVyQmxvY2sJAMwIAgkBDEludGVnZXJFbnRyeQIFC2tMcEludGVyZXN0CQERY2FsY05ld0xwSW50ZXJlc3QBBQ1scFRvdGFsU3VwcGx5CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRFrTHBJbnRlcmVzdEhlaWdodAkAlgMBCQDMCAIFC3N0YXJ0SGVpZ2h0CQDMCAIFBmhlaWdodAUDbmlsCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQEaAVQnkSw8OgnNDtu+BdXTze8KSBj7NgM9hrsFCGJ1cm5MZW5kCQDZBAEFBmF4bHlJZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEBGgFUJ5EsPDoJzQ7bvgXV083vCkgY+zYDPYa7BQZidXJuTHAJANkEAQUGYXhseUlkBQNuaWwJAM0IAgkAzggCBQpscEVudGVyaWVzBQ50b2tlbnNFbnRlcmllcwkBDEludGVnZXJFbnRyeQIFE2tSZXdhcmRVcGRhdGVIZWlnaHQJAJYDAQkAzAgCBQtzdGFydEhlaWdodAkAzAgCBQZoZWlnaHQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgECdHgBBnZlcmlmeQAEE211bHRpU2lnbmVkQnlBZG1pbnMEEmFkbWluUHViS2V5MVNpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFCGFkbWluMVBLAAEAAAQSYWRtaW5QdWJLZXkyU2lnbmVkAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAQUIYWRtaW4yUEsAAQAABBJhZG1pblB1YktleTNTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwACBQhhZG1pbjNQSwABAAAJAGcCCQBkAgkAZAIFEmFkbWluUHViS2V5MVNpZ25lZAUSYWRtaW5QdWJLZXkyU2lnbmVkBRJhZG1pblB1YktleTNTaWduZWQAAgQHJG1hdGNoMAUCdHgDCQABAgUHJG1hdGNoMAIXSW52b2tlU2NyaXB0VHJhbnNhY3Rpb24EA2ludgUHJG1hdGNoMAQGaXNTZWxmCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACAUCdHgPc2VuZGVyUHVibGljS2V5BAppc1JpZ2h0RmVlAwkAAAIIBQNpbnYDZmVlAKD3NgkAAAIIBQNpbnYKZmVlQXNzZXRJZAUEdW5pdAcECmlzSW5pdENhbGwJAAACCAUDaW52CGZ1bmN0aW9uAgRpbml0BAxpc25vUGF5bWVudHMJAAACCQCQAwEIBQNpbnYIcGF5bWVudHMAAAMDAwMFCmlzUmlnaHRGZWUFCmlzSW5pdENhbGwHBQZpc1NlbGYHBQxpc25vUGF5bWVudHMHBgUTbXVsdGlTaWduZWRCeUFkbWlucwUTbXVsdGlTaWduZWRCeUFkbWluc9/Y1Dk=", "height": 2715959, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: CmNCq51HSpysXcsPbWi4WhPNzd2DEn7Z26HRk4CBp3TZ Next: EAnLk6E4niaQJBUKYafFQEnM9s7dt8iKFi95DT8G1gJ3 Diff:
OldNewDifferences
388388 let lpId = getStringValue(addressFromStringValue(axlyPool), kLpId)
389389 let lpPrecision = getAssetPrecision(lpId)
390390 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]
391+ let @ = invoke(mainContract, "getShareAssetPriceREADONLY", [lpId], nil)
397392 if ($isInstanceOf(@, "Int"))
398393 then @
399394 else throw(($getType(@) + " couldn't be cast to Int"))
440435 @Callable(i)
441436 func lendAction (user,tokenId) = valueOrElse(isLandCall(i), {
442437 let userAvailableClaim = valueOrElse(getInteger(this, (tokenId + kUserLendAvailableClaim)), 0)
443- let $t01249212559 = calcLendUserReward(user, tokenId)
444- let uReward = $t01249212559._1
445- let newTokenInterest = $t01249212559._2
438+ let $t01246812535 = calcLendUserReward(user, tokenId)
439+ let uReward = $t01246812535._1
440+ let newTokenInterest = $t01246812535._2
446441 [IntegerEntry((((user + "_") + tokenId) + kUserLendInterest), newTokenInterest), IntegerEntry((((user + "_") + tokenId) + kUserLendAvailableClaim), (userAvailableClaim + uReward)), IntegerEntry((tokenId + kTokenInterest), newTokenInterest), IntegerEntry((tokenId + kTokenInterestHeight), height)]
447442 })
448443
451446 @Callable(i)
452447 func lpAction (user) = valueOrElse(isSFFarmingCall(i), {
453448 let userAvailableClaim = valueOrElse(getInteger(this, kUserLpAvailableClaim), 0)
454- let $t01302413077 = calcLpUserReward(user)
455- let uReward = $t01302413077._1
456- let newLpInterest = $t01302413077._2
449+ let $t01300013053 = calcLpUserReward(user)
450+ let uReward = $t01300013053._1
451+ let newLpInterest = $t01300013053._2
457452 [IntegerEntry((user + kUserLpInterest), newLpInterest), IntegerEntry((user + kUserLpAvailableClaim), (userAvailableClaim + uReward)), IntegerEntry((user + kLpInterest), newLpInterest), IntegerEntry((user + kLpInterestHeight), height)]
458453 })
459454
486481 if (((lastUpdateHeight + periodLength) > height))
487482 then throw("rewards alredy updated in this period")
488483 else {
489- let $t01484414924 = getTotalSupplyAllTokens()
490- let totalSupply = $t01484414924._1
491- let totalSupplyUsd = $t01484414924._2
492- let totalSupplyUsdAll = $t01484414924._3
484+ let $t01482014900 = getTotalSupplyAllTokens()
485+ let totalSupply = $t01482014900._1
486+ let totalSupplyUsd = $t01482014900._2
487+ let totalSupplyUsdAll = $t01482014900._3
493488 let axlyPrice = getAssetPrice(axlyId)
494489 let axlyPrecision = getAssetPrecision(axlyId)
495490 let maxAPR = getAdoptedAPRByPeriod(curPeriod, LENDERS_APR_PERIODS, LENDERS_APR)
496491 func updateReward (a,tokenId) = {
497- let $t01517315217 = a
498- let enteries = $t01517315217._1
499- let totalPeriodReward = $t01517315217._2
500- let index = $t01517315217._3
492+ let $t01514915193 = a
493+ let enteries = $t01514915193._1
494+ let totalPeriodReward = $t01514915193._2
495+ let index = $t01514915193._3
501496 if ((totalSupply[index] == 0))
502497 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))
503498 else {
518513 }
519514 }
520515
521- let $t01687916977 = {
516+ let $t01685516953 = {
522517 let $l = getAllTokens()
523518 let $s = size($l)
524519 let $acc0 = $Tuple3(nil, 0, 0)
532527
533528 $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)
534529 }
535- let tokensEnteries = $t01687916977._1
536- let totalTokenReward = $t01687916977._2
537- let index = $t01687916977._3
530+ let tokensEnteries = $t01685516953._1
531+ let totalTokenReward = $t01685516953._2
532+ let index = $t01685516953._3
538533 let lpMaxAPR = getAdoptedAPRByPeriod(curPeriod, LP_APR_PERIODS, LP_APR)
539534 let lpTotalSupply = getIntegerValue(sfFarmingContract, (axlyPool + kSFTotalSupply))
540535 let preLPSupply = valueOrElse(getInteger(this, kPrevLPSupply), 0)
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 kRewardUpdateHeight = "rewardUpdateHeight"
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 curPeriod = max([1, ((height - startHeight) / periodLength)])
119119
120120 let lendMaxAmount = getIntegerValue(tokenContract, kLendersMaxAmount)
121121
122122 let lendMaxPeriodAmount = (lendMaxAmount / LENDERS_MAX_PERIODS)
123123
124124 let lpMaxAmount = getIntegerValue(tokenContract, kLPMaxAmount)
125125
126126 let lpMaxPeriodAmount = (lpMaxAmount / LP_MAX_PERIODS)
127127
128128 func isAdminCall (i) = if (containsElement([admin1PK, admin2PK, admin3PK], i.callerPublicKey))
129129 then unit
130130 else throw("Only admin group1 can call this function")
131131
132132
133133 func isSelfCall (i) = if ((i.caller == this))
134134 then unit
135135 else throw("Only contract itself can call this function")
136136
137137
138138 func isOperatorCall (i) = if ((i.callerPublicKey == operatorPK))
139139 then unit
140140 else throw("Only operator can call this function")
141141
142142
143143 func isLandCall (i) = if ((i.caller == lendContract))
144144 then unit
145145 else throw("Only land contract can call this function")
146146
147147
148148 func isSFFarmingCall (i) = if ((i.caller == sfFarmingContract))
149149 then unit
150150 else throw("Only land contract can call this function")
151151
152152
153153 func getAllTokens () = {
154154 let tokens = valueOrElse(getString(this, kTokens), "")
155155 if ((tokens == ""))
156156 then nil
157157 else split(tokens, ",")
158158 }
159159
160160
161161 func getAssetPrice (assetId) = getIntegerValue(priceOracleAddr, (assetId + kPriceInOracle))
162162
163163
164164 func getAssetDecimals (assetId) = if ((assetId == "WAVES"))
165165 then 8
166166 else match assetInfo(fromBase58String(assetId)) {
167167 case asset: Asset =>
168168 asset.decimals
169169 case _ =>
170170 throw("Can't find asset")
171171 }
172172
173173
174174 func getAssetPrecision (assetId) = pow(10, 0, getAssetDecimals(assetId), 0, 0, DOWN)
175175
176176
177177 func getAdoptedAPRByPeriod (period,aprPeriods,apr) = {
178178 func for (a,aperiod) = {
179179 let $t054295451 = a
180180 let index = $t054295451._1
181181 let found = $t054295451._2
182182 let ft = split(aperiod, "-")
183183 let $t054885551 = $Tuple2(parseIntValue(ft[0]), parseIntValue(ft[1]))
184184 let from = $t054885551._1
185185 let to = $t054885551._2
186186 if (found)
187187 then a
188188 else if (if ((period >= from))
189189 then (to >= period)
190190 else false)
191191 then $Tuple2(index, true)
192192 else $Tuple2((index + 1), false)
193193 }
194194
195195 let $t056885754 = {
196196 let $l = LENDERS_APR_PERIODS
197197 let $s = size($l)
198198 let $acc0 = $Tuple2(0, false)
199199 func $f0_1 ($a,$i) = if (($i >= $s))
200200 then $a
201201 else for($a, $l[$i])
202202
203203 func $f0_2 ($a,$i) = if (($i >= $s))
204204 then $a
205205 else throw("List size exceeds 9")
206206
207207 $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)
208208 }
209209 let index = $t056885754._1
210210 let found = $t056885754._2
211211 if (found)
212212 then fraction((LENDERS_APR[index] * SCALE8), 7, 365)
213213 else 0
214214 }
215215
216216
217217 func getTotalSupplyAllTokens () = {
218218 func for (a,tokenId) = {
219219 let $t059425998 = a
220220 let totalSupply = $t059425998._1
221221 let totalSupplyUsd = $t059425998._2
222222 let totalSupplyUsdAll = $t059425998._3
223223 let tSupply = valueOrElse(getInteger(lendContract, (kLendTokenSupply + tokenId)), 0)
224224 let assetPrice = getAssetPrice(tokenId)
225225 let assetPrecision = getAssetPrecision(tokenId)
226226 let tSupplyUsd = fraction(tSupply, assetPrice, assetPrecision)
227227 $Tuple3((totalSupply :+ tSupply), (totalSupplyUsd :+ tSupplyUsd), (totalSupplyUsdAll + tSupplyUsd))
228228 }
229229
230230 let $l = getAllTokens()
231231 let $s = size($l)
232232 let $acc0 = $Tuple3(nil, nil, 0)
233233 func $f0_1 ($a,$i) = if (($i >= $s))
234234 then $a
235235 else for($a, $l[$i])
236236
237237 func $f0_2 ($a,$i) = if (($i >= $s))
238238 then $a
239239 else throw("List size exceeds 30")
240240
241241 $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)
242242 }
243243
244244
245245 func getTotalSupplyUsd (tokenId) = {
246246 let tSupply = valueOrElse(getInteger(lendContract, (kLendTokenSupply + tokenId)), 0)
247247 let assetPrice = getAssetPrice(tokenId)
248248 let assetPrecision = getAssetPrecision(tokenId)
249249 fraction(tSupply, assetPrice, assetPrecision)
250250 }
251251
252252
253253 func calcNewTokenInterest (tokenId,totalSupply) = if ((startHeight >= height))
254254 then 0
255255 else {
256256 let rewardPerBlock = getIntegerValue(this, (tokenId + kTokenRewardPerBlock))
257257 let oldInterest = getIntegerValue(this, (tokenId + kTokenInterest))
258258 let updateHeight = getIntegerValue(this, (tokenId + kTokenInterestHeight))
259259 let reward = ((height - updateHeight) * rewardPerBlock)
260260 let interest = if ((totalSupply > 0))
261261 then fraction(reward, SCALE8, totalSupply)
262262 else 0
263263 (oldInterest + interest)
264264 }
265265
266266
267267 func calcNewLpInterest (totalSupply) = if ((startHeight >= height))
268268 then 0
269269 else {
270270 let rewardPerBlock = valueOrElse(getInteger(this, kLpRewardPerBlock), 0)
271271 let oldInterest = valueOrElse(getInteger(this, kLpInterest), 0)
272272 let updateHeight = valueOrElse(getInteger(this, kLpInterestHeight), height)
273273 let reward = ((height - updateHeight) * rewardPerBlock)
274274 let interest = if ((totalSupply > 0))
275275 then fraction(reward, SCALE8, totalSupply)
276276 else 0
277277 (oldInterest + interest)
278278 }
279279
280280
281281 func calcLendUserReward (user,tokenId) = {
282282 let totalSupply = valueOrElse(getInteger(lendContract, (kLendTokenSupply + tokenId)), 0)
283283 let tokenInterest = calcNewTokenInterest(tokenId, totalSupply)
284284 let userSupply = valueOrElse(getInteger(lendContract, ((user + kLendUserSupply) + tokenId)), 0)
285285 let userTokenInterest = valueOrElse(getInteger(this, (((tokenId + "_") + user) + kUserLendInterest)), if ((userSupply == 0))
286286 then tokenInterest
287287 else 0)
288288 let reward = fraction(userSupply, (tokenInterest - userTokenInterest), SCALE8)
289289 $Tuple3(reward, tokenInterest, userSupply)
290290 }
291291
292292
293293 func calcLpUserReward (user) = {
294294 let totalSupply = valueOrElse(getInteger(sfFarmingContract, (axlyPool + kSFTotalSupply)), 0)
295295 let tokenInterest = calcNewLpInterest(totalSupply)
296296 let userSupply = valueOrElse(getInteger(sfFarmingContract, (((axlyPool + "_") + user) + kSFUserTotalSupply)), 0)
297297 let userTokenInterest = valueOrElse(getInteger(this, (user + kUserLpInterest)), if ((userSupply == 0))
298298 then tokenInterest
299299 else 0)
300300 let reward = fraction(userSupply, (tokenInterest - userTokenInterest), SCALE8)
301301 $Tuple3(reward, tokenInterest, userSupply)
302302 }
303303
304304
305305 func claimLenderRewardsCommon (user,readOnly) = {
306306 func claim (a,tokenId) = {
307307 let $t088878931 = a
308308 let tokenIds = $t088878931._1
309309 let cAmount = $t088878931._2
310310 let total = $t088878931._3
311311 let enteries = $t088878931._4
312312 let userAvailableClaim = valueOrElse(getInteger(this, (((tokenId + "_") + user) + kUserLendAvailableClaim)), 0)
313313 let $t090449123 = calcLendUserReward(user, tokenId)
314314 let uReward = $t090449123._1
315315 let newTokenInterest = $t090449123._2
316316 let userSupply = $t090449123._3
317317 let totalToClaim = (userAvailableClaim + uReward)
318318 if (if ((totalToClaim > 0))
319319 then true
320320 else (userSupply > 0))
321321 then {
322322 let newEntreries = if (if (readOnly)
323323 then true
324324 else (totalToClaim == 0))
325325 then enteries
326326 else (enteries ++ [IntegerEntry((((tokenId + "_") + user) + kUserLendInterest), newTokenInterest), IntegerEntry((((tokenId + "_") + user) + kUserLendAvailableClaim), 0), IntegerEntry((tokenId + kTokenInterest), newTokenInterest), IntegerEntry((tokenId + kTokenInterestHeight), height)])
327327 $Tuple4((tokenIds :+ tokenId), (cAmount :+ totalToClaim), (total + totalToClaim), newEntreries)
328328 }
329329 else $Tuple4(tokenIds, cAmount, total, enteries)
330330 }
331331
332332 let $l = getAllTokens()
333333 let $s = size($l)
334334 let $acc0 = $Tuple4(nil, nil, 0, nil)
335335 func $f0_1 ($a,$i) = if (($i >= $s))
336336 then $a
337337 else claim($a, $l[$i])
338338
339339 func $f0_2 ($a,$i) = if (($i >= $s))
340340 then $a
341341 else throw("List size exceeds 30")
342342
343343 $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)
344344 }
345345
346346
347347 func claimLpRewardsCommon (user,readOnly) = {
348348 let userAvailableClaim = valueOrElse(getInteger(this, (user + kUserLpAvailableClaim)), 0)
349349 let $t01005510120 = calcLpUserReward(user)
350350 let uReward = $t01005510120._1
351351 let newLpInterest = $t01005510120._2
352352 let userSupply = $t01005510120._3
353353 let totalToClaim = (userAvailableClaim + uReward)
354354 if (if (readOnly)
355355 then true
356356 else (totalToClaim == 0))
357357 then $Tuple2(totalToClaim, nil)
358358 else $Tuple2(totalToClaim, [IntegerEntry((user + kUserLpInterest), newLpInterest), IntegerEntry((user + kUserLpAvailableClaim), 0), IntegerEntry(kLpInterest, newLpInterest), IntegerEntry(kLpInterestHeight, height)])
359359 }
360360
361361
362362 func getTokensAPRs () = {
363363 let axlyPrice = getAssetPrice(axlyId)
364364 let axlyPrecision = getAssetPrecision(axlyId)
365365 func tokensAprs (apr,tokenId) = {
366366 let rwpb = valueOrElse(getInteger(this, (tokenId + kTokenRewardPerBlock)), 0)
367367 let rwpbUsd = fraction(rwpb, axlyPrice, axlyPrecision)
368368 let rwYear = ((rwpbUsd * periodLength) * 52)
369369 let totalSupplyUsd = getTotalSupplyUsd(tokenId)
370370 (apr :+ fraction(rwYear, SCALE8, totalSupplyUsd))
371371 }
372372
373373 let aprs = {
374374 let $l = getAllTokens()
375375 let $s = size($l)
376376 let $acc0 = nil
377377 func $f0_1 ($a,$i) = if (($i >= $s))
378378 then $a
379379 else tokensAprs($a, $l[$i])
380380
381381 func $f0_2 ($a,$i) = if (($i >= $s))
382382 then $a
383383 else throw("List size exceeds 30")
384384
385385 $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)
386386 }
387387 let lpTotalSupply = getIntegerValue(sfFarmingContract, (axlyPool + kSFTotalSupply))
388388 let lpId = getStringValue(addressFromStringValue(axlyPool), kLpId)
389389 let lpPrecision = getAssetPrecision(lpId)
390390 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]
391+ let @ = invoke(mainContract, "getShareAssetPriceREADONLY", [lpId], nil)
397392 if ($isInstanceOf(@, "Int"))
398393 then @
399394 else throw(($getType(@) + " couldn't be cast to Int"))
400395 }
401396 let lpTotalSupplyUsd = fraction(lpTotalSupply, lpPrice, lpPrecision)
402397 let rwpb = valueOrElse(getInteger(this, kLpRewardPerBlock), 0)
403398 let rwpbUsd = fraction(rwpb, axlyPrice, axlyPrecision)
404399 let rwYear = ((rwpbUsd * periodLength) * 52)
405400 let lpApr = fraction(rwYear, SCALE8, lpTotalSupplyUsd)
406401 $Tuple3(getAllTokens(), aprs, lpApr)
407402 }
408403
409404
410405 @Callable(i)
411406 func claimLenderRewards () = {
412407 let claimRes = claimLenderRewardsCommon(toString(i.caller), false)
413408 if ((claimRes._3 == 0))
414409 then throw("claim amount must be greater than 0")
415410 else {
416411 let inv = invoke(tokenContract, "withdrawLendReward", [claimRes._3, toString(i.caller)], nil)
417412 if ((inv == inv))
418413 then claimRes._4
419414 else throw("Strict value is not equal to itself.")
420415 }
421416 }
422417
423418
424419
425420 @Callable(i)
426421 func claimLpRewards () = {
427422 let claimRes = claimLpRewardsCommon(toString(i.caller), false)
428423 if ((claimRes._1 == 0))
429424 then throw("claim amount must be greater than 0")
430425 else {
431426 let inv = invoke(tokenContract, "withdrawLpReward", [claimRes._1, toString(i.caller)], nil)
432427 if ((inv == inv))
433428 then claimRes._2
434429 else throw("Strict value is not equal to itself.")
435430 }
436431 }
437432
438433
439434
440435 @Callable(i)
441436 func lendAction (user,tokenId) = valueOrElse(isLandCall(i), {
442437 let userAvailableClaim = valueOrElse(getInteger(this, (tokenId + kUserLendAvailableClaim)), 0)
443- let $t01249212559 = calcLendUserReward(user, tokenId)
444- let uReward = $t01249212559._1
445- let newTokenInterest = $t01249212559._2
438+ let $t01246812535 = calcLendUserReward(user, tokenId)
439+ let uReward = $t01246812535._1
440+ let newTokenInterest = $t01246812535._2
446441 [IntegerEntry((((user + "_") + tokenId) + kUserLendInterest), newTokenInterest), IntegerEntry((((user + "_") + tokenId) + kUserLendAvailableClaim), (userAvailableClaim + uReward)), IntegerEntry((tokenId + kTokenInterest), newTokenInterest), IntegerEntry((tokenId + kTokenInterestHeight), height)]
447442 })
448443
449444
450445
451446 @Callable(i)
452447 func lpAction (user) = valueOrElse(isSFFarmingCall(i), {
453448 let userAvailableClaim = valueOrElse(getInteger(this, kUserLpAvailableClaim), 0)
454- let $t01302413077 = calcLpUserReward(user)
455- let uReward = $t01302413077._1
456- let newLpInterest = $t01302413077._2
449+ let $t01300013053 = calcLpUserReward(user)
450+ let uReward = $t01300013053._1
451+ let newLpInterest = $t01300013053._2
457452 [IntegerEntry((user + kUserLpInterest), newLpInterest), IntegerEntry((user + kUserLpAvailableClaim), (userAvailableClaim + uReward)), IntegerEntry((user + kLpInterest), newLpInterest), IntegerEntry((user + kLpInterestHeight), height)]
458453 })
459454
460455
461456
462457 @Callable(i)
463458 func init (axlyMainContractAddr,axlyTokenomicContractAddr,axlyPoolAddr,farmingStartHeight,periodLength) = valueOrElse(isSelfCall(i), if (!(isDefined(addressFromString(axlyMainContractAddr))))
464459 then throw("Wrong farming address")
465460 else if (!(isDefined(addressFromString(axlyTokenomicContractAddr))))
466461 then throw("Wrong main contract address")
467462 else [StringEntry(kAxlyMainContract, axlyMainContractAddr), StringEntry(kAxlyTokenomicContract, axlyTokenomicContractAddr), StringEntry(kAxlyPool, axlyPoolAddr), IntegerEntry(kStartHeight, farmingStartHeight), IntegerEntry(kPeriodLength, periodLength)])
468463
469464
470465
471466 @Callable(i)
472467 func initNewToken (tokenId) = valueOrElse(isAdminCall(i), if (isDefined(getInteger(this, (tokenId + kTokenInterest))))
473468 then throw("token already inited")
474469 else if (!(contains(getStringValue(lendContract, kLendSetupTokens), tokenId)))
475470 then throw("no token on landing")
476471 else {
477472 let newAllTokens = (getAllTokens() :+ tokenId)
478473 [IntegerEntry((tokenId + kTokenInterest), 0), IntegerEntry((tokenId + kTokenInterestHeight), max([startHeight, height])), StringEntry(kTokens, makeString(newAllTokens, ",")), IntegerEntry((tokenId + kTokenRewardPerBlock), 0)]
479474 })
480475
481476
482477
483478 @Callable(i)
484479 func updateRewards () = valueOrElse(isOperatorCall(i), {
485480 let lastUpdateHeight = valueOrElse(getInteger(this, kRewardUpdateHeight), 0)
486481 if (((lastUpdateHeight + periodLength) > height))
487482 then throw("rewards alredy updated in this period")
488483 else {
489- let $t01484414924 = getTotalSupplyAllTokens()
490- let totalSupply = $t01484414924._1
491- let totalSupplyUsd = $t01484414924._2
492- let totalSupplyUsdAll = $t01484414924._3
484+ let $t01482014900 = getTotalSupplyAllTokens()
485+ let totalSupply = $t01482014900._1
486+ let totalSupplyUsd = $t01482014900._2
487+ let totalSupplyUsdAll = $t01482014900._3
493488 let axlyPrice = getAssetPrice(axlyId)
494489 let axlyPrecision = getAssetPrecision(axlyId)
495490 let maxAPR = getAdoptedAPRByPeriod(curPeriod, LENDERS_APR_PERIODS, LENDERS_APR)
496491 func updateReward (a,tokenId) = {
497- let $t01517315217 = a
498- let enteries = $t01517315217._1
499- let totalPeriodReward = $t01517315217._2
500- let index = $t01517315217._3
492+ let $t01514915193 = a
493+ let enteries = $t01514915193._1
494+ let totalPeriodReward = $t01514915193._2
495+ let index = $t01514915193._3
501496 if ((totalSupply[index] == 0))
502497 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))
503498 else {
504499 let share = fraction(totalSupplyUsd[index], SCALE8, totalSupplyUsdAll)
505500 let maxReward = fraction(share, lendMaxPeriodAmount, SCALE8)
506501 let maxRewardUsd = fraction(maxReward, axlyPrice, axlyPrecision)
507502 let prevTotalSupply = valueOrElse(getInteger(this, kPrevLendTokenSupply), 0)
508503 let rtCoef = if (if ((prevTotalSupply == 0))
509504 then true
510505 else (totalSupply[index] == 0))
511506 then 0
512507 else fraction(prevTotalSupply, SCALE8, totalSupply[index])
513508 let reward = ((min([(maxAPR * (SCALE8 + rtCoef)), fraction(maxAPR, (15 * SCALE8), 10)]) / SCALE8) / 100)
514509 let rewardUsd = min([maxRewardUsd, fraction(totalSupplyUsd[index], reward, SCALE8)])
515510 let rewardPeriod = fraction(rewardUsd, axlyPrecision, axlyPrice)
516511 let rewardPerBlock = (rewardPeriod / periodLength)
517512 $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))
518513 }
519514 }
520515
521- let $t01687916977 = {
516+ let $t01685516953 = {
522517 let $l = getAllTokens()
523518 let $s = size($l)
524519 let $acc0 = $Tuple3(nil, 0, 0)
525520 func $f0_1 ($a,$i) = if (($i >= $s))
526521 then $a
527522 else updateReward($a, $l[$i])
528523
529524 func $f0_2 ($a,$i) = if (($i >= $s))
530525 then $a
531526 else throw("List size exceeds 30")
532527
533528 $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)
534529 }
535- let tokensEnteries = $t01687916977._1
536- let totalTokenReward = $t01687916977._2
537- let index = $t01687916977._3
530+ let tokensEnteries = $t01685516953._1
531+ let totalTokenReward = $t01685516953._2
532+ let index = $t01685516953._3
538533 let lpMaxAPR = getAdoptedAPRByPeriod(curPeriod, LP_APR_PERIODS, LP_APR)
539534 let lpTotalSupply = getIntegerValue(sfFarmingContract, (axlyPool + kSFTotalSupply))
540535 let preLPSupply = valueOrElse(getInteger(this, kPrevLPSupply), 0)
541536 let lpId = getStringValue(addressFromStringValue(axlyPool), kLpId)
542537 let lpPrecision = getAssetPrecision(lpId)
543538 let lpPrice = {
544539 let @ = invoke(mainContract, "getShareAssetPriceREADONLY", [lpId], nil)
545540 if ($isInstanceOf(@, "Int"))
546541 then @
547542 else throw(($getType(@) + " couldn't be cast to Int"))
548543 }
549544 let lpTotalSupplyUsd = fraction(lpTotalSupply, lpPrice, lpPrecision)
550545 let maxLPRewardUsd = fraction(lpMaxPeriodAmount, axlyPrice, axlyPrecision)
551546 let rtLPCoef = if (if ((preLPSupply == 0))
552547 then true
553548 else (lpTotalSupply == 0))
554549 then 0
555550 else fraction(preLPSupply, SCALE8, lpTotalSupply)
556551 let rewardLp = ((min([(lpMaxAPR * (SCALE8 + rtLPCoef)), fraction(lpMaxAPR, (15 * SCALE8), 10)]) / SCALE8) / 100)
557552 let rewardLpUsd = min([maxLPRewardUsd, fraction(lpTotalSupplyUsd, rewardLp, SCALE8)])
558553 let rewardLpPeriod = fraction(rewardLpUsd, axlyPrecision, axlyPrice)
559554 let rewardLpPerBlock = (rewardLpPeriod / periodLength)
560555 let burnLend = (lendMaxPeriodAmount - totalTokenReward)
561556 let burnLp = (lpMaxPeriodAmount - rewardLpPeriod)
562557 let inv = invoke(tokenContract, "withdrawLpReward", [(burnLend + burnLp), toString(this)], nil)
563558 if ((inv == inv))
564559 then {
565560 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))]
566561 ((lpEnteries ++ tokensEnteries) :+ IntegerEntry(kRewardUpdateHeight, max([startHeight, height])))
567562 }
568563 else throw("Strict value is not equal to itself.")
569564 }
570565 })
571566
572567
573568 @Verifier(tx)
574569 func verify () = {
575570 let multiSignedByAdmins = {
576571 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], admin1PK))
577572 then 1
578573 else 0
579574 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], admin2PK))
580575 then 1
581576 else 0
582577 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], admin3PK))
583578 then 1
584579 else 0
585580 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
586581 }
587582 match tx {
588583 case inv: InvokeScriptTransaction =>
589584 let isSelf = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
590585 let isRightFee = if ((inv.fee == 900000))
591586 then (inv.feeAssetId == unit)
592587 else false
593588 let isInitCall = (inv.function == "init")
594589 let isnoPayments = (size(inv.payments) == 0)
595590 if (if (if (if (isRightFee)
596591 then isInitCall
597592 else false)
598593 then isSelf
599594 else false)
600595 then isnoPayments
601596 else false)
602597 then true
603598 else multiSignedByAdmins
604599 case _ =>
605600 multiSignedByAdmins
606601 }
607602 }
608603

github/deemru/w8io/169f3d6 
65.56 ms