tx · EAnLk6E4niaQJBUKYafFQEnM9s7dt8iKFi95DT8G1gJ3

3N2M4PztorHwrfENp7D6LhYGgGodjiD1fjn:  -0.02400000 Waves

2023.08.18 14:55 [2716009] smart account 3N2M4PztorHwrfENp7D6LhYGgGodjiD1fjn > SELF 0.00000000 Waves

{ "type": 13, "id": "EAnLk6E4niaQJBUKYafFQEnM9s7dt8iKFi95DT8G1gJ3", "fee": 2400000, "feeAssetId": null, "timestamp": 1692359776792, "version": 2, "chainId": 84, "sender": "3N2M4PztorHwrfENp7D6LhYGgGodjiD1fjn", "senderPublicKey": "Fj9LPkCtmW3pDnVU6wPQnvqpZJCBieWSvZqY5FAGeCyp", "proofs": [ "24oMBMJc4mJxxXGumcxDgdUotWRQ3De2x3RemDsGXU8dYrjRurCxYpxN5855WP8X6JzyKyhgbvDNgMXYGrVRn5F6", "2Y9koNsWAq3BPEtSpQqwPU3rmFNWQawXBQAMaFjsLZNbsqkuPsWkdfF9gYqUvbZ4GYcKNYK5HLsc8ASAZMYaN3j8" ], "script": "base64:BgIhCAISABIAEgQKAggIEgMKAQgSBwoFCAgIAQESAwoBCBIAUAAGU0NBTEU4AIDC1y8AC0xFTkRFUlNfQVBSCQDMCAIAlgEJAMwIAgB4CQDMCAIAZAkAzAgCAFAJAMwIAgA8CQDMCAIAKAkAzAgCAB4JAMwIAgAUCQDMCAIACgUDbmlsABNMRU5ERVJTX0FQUl9QRVJJT0RTCQDMCAICAzEtMQkAzAgCAgMyLTIJAMwIAgIDMy0zCQDMCAICAzQtNAkAzAgCAgM1LTgJAMwIAgIEOS0xMgkAzAgCAgUxNC0xNgkAzAgCAgUxNy0yMAkAzAgCAgYyMC0xMDQFA25pbAATTEVOREVSU19NQVhfUEVSSU9EUwBoAAZMUF9BUFIJAMwIAgCWAQkAzAgCAHgJAMwIAgBkCQDMCAIAUAkAzAgCADwJAMwIAgAoBQNuaWwADkxQX0FQUl9QRVJJT0RTCQDMCAICAzEtMQkAzAgCAgMyLTIJAMwIAgIDMy0zCQDMCAICAzQtNAkAzAgCAgM1LTgJAMwIAgIEOS0xMgUDbmlsAA5MUF9NQVhfUEVSSU9EUwAMAAxrU3RhcnRIZWlnaHQCC3N0YXJ0SGVpZ2h0AA1rUGVyaW9kTGVuZ3RoAgxwZXJpb2RMZW5ndGgAEWtMZW5kZXJzTWF4QW1vdW50AhFsZW5kUmV3YXJkc0Ftb3VudAAMa0xQTWF4QW1vdW50Ag5scFJld2FyZEFtb3VudAAHa1Rva2VucwIGdG9rZW5zAAtrVXNlclN1cHBseQIQX3VzZXJUb3RhbFN1cHBseQAOa1Rva2VuSW50ZXJlc3QCDl90b2tlbkludGVyZXN0ABRrVG9rZW5JbnRlcmVzdEhlaWdodAIUX3Rva2VuSW50ZXJlc3RIZWlnaHQAFGtUb2tlblJld2FyZFBlckJsb2NrAhRfdG9rZW5SZXdhcmRQZXJCbG9jawARa0xhc3RVcGRhdGVQZXJpb2QCEnJld2FyZFVwZGF0ZVBlcmlvZAARa1VzZXJMZW5kSW50ZXJlc3QCEV91c2VyTGFuZEludGVyZXN0ABdrVXNlckxlbmRBdmFpbGFibGVDbGFpbQIXX3VzZXJMZW5kQXZhaWxhYmxlQ2xhaW0AFWtVc2VyTHBBdmFpbGFibGVDbGFpbQIVX3VzZXJMcEF2YWlsYWJsZUNsYWltAAtrTHBJbnRlcmVzdAIKbHBJbnRlcmVzdAARa0xwSW50ZXJlc3RIZWlnaHQCEGxwSW50ZXJlc3RIZWlnaHQADWtQcmV2TFBTdXBwbHkCEXByZXZMUFRvdGFsU3VwcGx5ABFrTHBSZXdhcmRQZXJCbG9jawIQbHBSZXdhcmRQZXJCbG9jawAPa1VzZXJMcEludGVyZXN0Ag9fdXNlckxwSW50ZXJlc3QADmtQcmljZUluT3JhY2xlAgdfdHdhcDVCABRrUHJldkxlbmRUb2tlblN1cHBseQIUX3ByZXZMZW5kVG90YWxTdXBwbHkADGtBWExZVG9rZW5JZAILYXhseVRva2VuSWQAEGtMZW5kVG9rZW5TdXBwbHkCD3RvdGFsX3N1cHBsaWVkXwAPa0xlbmRVc2VyU3VwcGx5Agpfc3VwcGxpZWRfABBrTGVuZFNldHVwVG9rZW5zAgxzZXR1cF90b2tlbnMADmtTRlRvdGFsU3VwcGx5AhpfdG90YWxfc2hhcmVfdG9rZW5zX2xvY2tlZAASa1NGVXNlclRvdGFsU3VwcGx5AhRfc2hhcmVfdG9rZW5zX2xvY2tlZAAJa0F4bHlQb29sAghheGx5UG9vbAAFa0xwSWQCDnNoYXJlX2Fzc2V0X2lkAAxrUHJpY2VPcmFjbGUCDHByaWNlX29yYWNsZQARa0F4bHlNYWluQ29udHJhY3QCDG1haW5Db250cmFjdAAWa0F4bHlUb2tlbm9taWNDb250cmFjdAIRdG9rZW5vbWljQ29udHJhY3QAEmtTRkZhcm1pbmdDb250cmFjdAITc3dvcGZpX2Zhcm1pbmdfYWRkcgANa0xlbmRDb250cmFjdAIRbGVuZF9zZXJ2aWNlX2FkZHIACWtBZG1pbjFQSwIVZ3JvdXAxX2FkbWluMV9wdWJfa2V5AAlrQWRtaW4yUEsCFWdyb3VwMV9hZG1pbjJfcHViX2tleQAJa0FkbWluM1BLAhVncm91cDFfYWRtaW4zX3B1Yl9rZXkAD2tPcGVyYXRvckNhbGxQSwISYWRtaW5fY2FsbF9wdWJfa2V5AAhheGx5UG9vbAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMFCWtBeGx5UG9vbAIWQ2FuJ3QgZ2V0IGF4bHlQb29sIGtleQAMbWFpbkNvbnRyYWN0CQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwURa0F4bHlNYWluQ29udHJhY3QCGUNhbid0IGdldCBtYWluQ29udGFjdCBrZXkADXRva2VuQ29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBRZrQXhseVRva2Vub21pY0NvbnRyYWN0Ah9DYW4ndCBnZXQgdG9rZW5vbWljQ29udHJhY3Qga2V5AAxsZW5kQ29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQxtYWluQ29udHJhY3QFDWtMZW5kQ29udHJhY3QCH0Nhbid0IGdldCBsZW5kX3NlcnZpY2VfYWRkciBrZXkAEXNmRmFybWluZ0NvbnRyYWN0CQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUMbWFpbkNvbnRyYWN0BRJrU0ZGYXJtaW5nQ29udHJhY3QCIUNhbid0IGdldCBzd29wZmlfZmFybWluZ19hZGRyIGtleQAPcHJpY2VPcmFjbGVBZGRyCQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUMbWFpbkNvbnRyYWN0BQxrUHJpY2VPcmFjbGUCGkNhbid0IGdldCBwcmljZV9vcmFjbGUga2V5AAhhZG1pbjFQSwkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUMbWFpbkNvbnRyYWN0BQlrQWRtaW4xUEsCEkNhbid0IGdldCBhZG1pbjFQSwAIYWRtaW4yUEsJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFDG1haW5Db250cmFjdAUJa0FkbWluMlBLAhJDYW4ndCBnZXQgYWRtaW4yUEsACGFkbWluM1BLCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQxtYWluQ29udHJhY3QFCWtBZG1pbjNQSwIUQ2FuJ3QgZ2V0IG9wZXJhdG9yUEsACm9wZXJhdG9yUEsJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMFD2tPcGVyYXRvckNhbGxQSwIUQ2FuJ3QgZ2V0IG9wZXJhdG9yUEsABmF4bHlJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFDXRva2VuQ29udHJhY3QFDGtBWExZVG9rZW5JZAIXQ2FuJ3QgZ2V0IEF4bHkgdG9rZW4gaWQAC3N0YXJ0SGVpZ2h0CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzBQxrU3RhcnRIZWlnaHQADHBlcmlvZExlbmd0aAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwUNa1BlcmlvZExlbmd0aAANbGVuZE1heEFtb3VudAkBEUBleHRyTmF0aXZlKDEwNTApAgUNdG9rZW5Db250cmFjdAURa0xlbmRlcnNNYXhBbW91bnQAE2xlbmRNYXhQZXJpb2RBbW91bnQJAGkCBQ1sZW5kTWF4QW1vdW50BRNMRU5ERVJTX01BWF9QRVJJT0RTAAtscE1heEFtb3VudAkBEUBleHRyTmF0aXZlKDEwNTApAgUNdG9rZW5Db250cmFjdAUMa0xQTWF4QW1vdW50ABFscE1heFBlcmlvZEFtb3VudAkAaQIFC2xwTWF4QW1vdW50BQ5MUF9NQVhfUEVSSU9EUwELaXNBZG1pbkNhbGwBAWkDCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQhhZG1pbjFQSwkAzAgCBQhhZG1pbjJQSwkAzAgCBQhhZG1pbjNQSwUDbmlsCAUBaQ9jYWxsZXJQdWJsaWNLZXkFBHVuaXQJAAIBAihPbmx5IGFkbWluIGdyb3VwMSBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uAQppc1NlbGZDYWxsAQFpAwkAAAIIBQFpBmNhbGxlcgUEdGhpcwUEdW5pdAkAAgECK09ubHkgY29udHJhY3QgaXRzZWxmIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24BDmlzT3BlcmF0b3JDYWxsAQFpAwkAAAIIBQFpD2NhbGxlclB1YmxpY0tleQUKb3BlcmF0b3JQSwUEdW5pdAkAAgECJE9ubHkgb3BlcmF0b3IgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgEKaXNMYW5kQ2FsbAEBaQMJAAACCAUBaQZjYWxsZXIFDGxlbmRDb250cmFjdAUEdW5pdAkAAgECKU9ubHkgbGFuZCBjb250cmFjdCBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uAQ9pc1NGRmFybWluZ0NhbGwBAWkDCQAAAggFAWkGY2FsbGVyBRFzZkZhcm1pbmdDb250cmFjdAUEdW5pdAkAAgECKU9ubHkgbGFuZCBjb250cmFjdCBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uAQxnZXRBbGxUb2tlbnMABAZ0b2tlbnMJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwUHa1Rva2VucwIAAwkAAAIFBnRva2VucwIABQNuaWwJALUJAgUGdG9rZW5zAgEsAQ1nZXRBc3NldFByaWNlAQdhc3NldElkCQERQGV4dHJOYXRpdmUoMTA1MCkCBQ9wcmljZU9yYWNsZUFkZHIJAKwCAgUHYXNzZXRJZAUOa1ByaWNlSW5PcmFjbGUBEGdldEFzc2V0RGVjaW1hbHMBB2Fzc2V0SWQDCQAAAgUHYXNzZXRJZAIFV0FWRVMACAQHJG1hdGNoMAkA7AcBCQDZBAEFB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIFQXNzZXQEBWFzc2V0BQckbWF0Y2gwCAUFYXNzZXQIZGVjaW1hbHMJAAIBAhBDYW4ndCBmaW5kIGFzc2V0ARFnZXRBc3NldFByZWNpc2lvbgEHYXNzZXRJZAkAbAYACgAACQEQZ2V0QXNzZXREZWNpbWFscwEFB2Fzc2V0SWQAAAAABQRET1dOARVnZXRBZG9wdGVkQVBSQnlQZXJpb2QDBnBlcmlvZAphcHJQZXJpb2RzA2FwcgoBA2ZvcgIBYQdhcGVyaW9kBAskdDA1MzYyNTM4NAUBYQQFaW5kZXgIBQskdDA1MzYyNTM4NAJfMQQFZm91bmQIBQskdDA1MzYyNTM4NAJfMgQCZnQJALUJAgUHYXBlcmlvZAIBLQQLJHQwNTQyMTU0ODQJAJQKAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmZ0AAAJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJmdAABBARmcm9tCAULJHQwNTQyMTU0ODQCXzEEAnRvCAULJHQwNTQyMTU0ODQCXzIDBQVmb3VuZAUBYQMDCQBnAgUGcGVyaW9kBQRmcm9tCQBnAgUCdG8FBnBlcmlvZAcJAJQKAgUFaW5kZXgGCQCUCgIJAGQCBQVpbmRleAABBwQLJHQwNTYyMTU2ODcKAAIkbAUTTEVOREVSU19BUFJfUEVSSU9EUwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgAABwoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEDZm9yAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA5CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJBAVpbmRleAgFCyR0MDU2MjE1Njg3Al8xBAVmb3VuZAgFCyR0MDU2MjE1Njg3Al8yAwUFZm91bmQJAGsDCQBoAgkAkQMCBQtMRU5ERVJTX0FQUgUFaW5kZXgFBlNDQUxFOAAHAO0CAAABF2dldFRvdGFsU3VwcGx5QWxsVG9rZW5zAAoBA2ZvcgIBYQd0b2tlbklkBAskdDA1ODc1NTkzMQUBYQQLdG90YWxTdXBwbHkIBQskdDA1ODc1NTkzMQJfMQQOdG90YWxTdXBwbHlVc2QIBQskdDA1ODc1NTkzMQJfMgQRdG90YWxTdXBwbHlVc2RBbGwIBQskdDA1ODc1NTkzMQJfMwQHdFN1cHBseQkBC3ZhbHVlT3JFbHNlAgkAmggCBQxsZW5kQ29udHJhY3QJAKwCAgUQa0xlbmRUb2tlblN1cHBseQUHdG9rZW5JZAAABAphc3NldFByaWNlCQENZ2V0QXNzZXRQcmljZQEFB3Rva2VuSWQEDmFzc2V0UHJlY2lzaW9uCQERZ2V0QXNzZXRQcmVjaXNpb24BBQd0b2tlbklkBAp0U3VwcGx5VXNkCQBrAwUHdFN1cHBseQUKYXNzZXRQcmljZQUOYXNzZXRQcmVjaXNpb24JAJUKAwkAzQgCBQt0b3RhbFN1cHBseQUHdFN1cHBseQkAzQgCBQ50b3RhbFN1cHBseVVzZAUKdFN1cHBseVVzZAkAZAIFEXRvdGFsU3VwcGx5VXNkQWxsBQp0U3VwcGx5VXNkCgACJGwJAQxnZXRBbGxUb2tlbnMACgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlQoDBQNuaWwFA25pbAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQNmb3ICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDMwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAAVABYAFwAYABkAGgAbABwAHQAeARFnZXRUb3RhbFN1cHBseVVzZAEHdG9rZW5JZAQHdFN1cHBseQkBC3ZhbHVlT3JFbHNlAgkAmggCBQxsZW5kQ29udHJhY3QJAKwCAgUQa0xlbmRUb2tlblN1cHBseQUHdG9rZW5JZAAABAphc3NldFByaWNlCQENZ2V0QXNzZXRQcmljZQEFB3Rva2VuSWQEDmFzc2V0UHJlY2lzaW9uCQERZ2V0QXNzZXRQcmVjaXNpb24BBQd0b2tlbklkCQBrAwUHdFN1cHBseQUKYXNzZXRQcmljZQUOYXNzZXRQcmVjaXNpb24BFGNhbGNOZXdUb2tlbkludGVyZXN0Agd0b2tlbklkC3RvdGFsU3VwcGx5AwkAZwIFC3N0YXJ0SGVpZ2h0BQZoZWlnaHQAAAQOcmV3YXJkUGVyQmxvY2sJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgUHdG9rZW5JZAUUa1Rva2VuUmV3YXJkUGVyQmxvY2sEC29sZEludGVyZXN0CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIFB3Rva2VuSWQFDmtUb2tlbkludGVyZXN0BAx1cGRhdGVIZWlnaHQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgUHdG9rZW5JZAUUa1Rva2VuSW50ZXJlc3RIZWlnaHQEBnJld2FyZAkAaAIJAGUCBQZoZWlnaHQFDHVwZGF0ZUhlaWdodAUOcmV3YXJkUGVyQmxvY2sECGludGVyZXN0AwkAZgIFC3RvdGFsU3VwcGx5AAAJAGsDBQZyZXdhcmQFBlNDQUxFOAULdG90YWxTdXBwbHkAAAkAZAIFC29sZEludGVyZXN0BQhpbnRlcmVzdAERY2FsY05ld0xwSW50ZXJlc3QBC3RvdGFsU3VwcGx5AwkAZwIFC3N0YXJ0SGVpZ2h0BQZoZWlnaHQAAAQOcmV3YXJkUGVyQmxvY2sJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwURa0xwUmV3YXJkUGVyQmxvY2sAAAQLb2xkSW50ZXJlc3QJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwULa0xwSW50ZXJlc3QAAAQMdXBkYXRlSGVpZ2h0CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFEWtMcEludGVyZXN0SGVpZ2h0BQZoZWlnaHQEBnJld2FyZAkAaAIJAGUCBQZoZWlnaHQFDHVwZGF0ZUhlaWdodAUOcmV3YXJkUGVyQmxvY2sECGludGVyZXN0AwkAZgIFC3RvdGFsU3VwcGx5AAAJAGsDBQZyZXdhcmQFBlNDQUxFOAULdG90YWxTdXBwbHkAAAkAZAIFC29sZEludGVyZXN0BQhpbnRlcmVzdAESY2FsY0xlbmRVc2VyUmV3YXJkAgR1c2VyB3Rva2VuSWQEC3RvdGFsU3VwcGx5CQELdmFsdWVPckVsc2UCCQCaCAIFDGxlbmRDb250cmFjdAkArAICBRBrTGVuZFRva2VuU3VwcGx5BQd0b2tlbklkAAAEDXRva2VuSW50ZXJlc3QJARRjYWxjTmV3VG9rZW5JbnRlcmVzdAIFB3Rva2VuSWQFC3RvdGFsU3VwcGx5BAp1c2VyU3VwcGx5CQELdmFsdWVPckVsc2UCCQCaCAIFDGxlbmRDb250cmFjdAkArAICCQCsAgIFBHVzZXIFD2tMZW5kVXNlclN1cHBseQUHdG9rZW5JZAAABBF1c2VyVG9rZW5JbnRlcmVzdAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICBQd0b2tlbklkAgFfBQR1c2VyBRFrVXNlckxlbmRJbnRlcmVzdAMJAAACBQp1c2VyU3VwcGx5AAAFDXRva2VuSW50ZXJlc3QAAAQGcmV3YXJkCQBrAwUKdXNlclN1cHBseQkAZQIFDXRva2VuSW50ZXJlc3QFEXVzZXJUb2tlbkludGVyZXN0BQZTQ0FMRTgJAJUKAwUGcmV3YXJkBQ10b2tlbkludGVyZXN0BQp1c2VyU3VwcGx5ARBjYWxjTHBVc2VyUmV3YXJkAQR1c2VyBAt0b3RhbFN1cHBseQkBC3ZhbHVlT3JFbHNlAgkAmggCBRFzZkZhcm1pbmdDb250cmFjdAkArAICBQhheGx5UG9vbAUOa1NGVG90YWxTdXBwbHkAAAQNdG9rZW5JbnRlcmVzdAkBEWNhbGNOZXdMcEludGVyZXN0AQULdG90YWxTdXBwbHkECnVzZXJTdXBwbHkJAQt2YWx1ZU9yRWxzZQIJAJoIAgURc2ZGYXJtaW5nQ29udHJhY3QJAKwCAgkArAICCQCsAgIFCGF4bHlQb29sAgFfBQR1c2VyBRJrU0ZVc2VyVG90YWxTdXBwbHkAAAQRdXNlclRva2VuSW50ZXJlc3QJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQR1c2VyBQ9rVXNlckxwSW50ZXJlc3QDCQAAAgUKdXNlclN1cHBseQAABQ10b2tlbkludGVyZXN0AAAEBnJld2FyZAkAawMFCnVzZXJTdXBwbHkJAGUCBQ10b2tlbkludGVyZXN0BRF1c2VyVG9rZW5JbnRlcmVzdAUGU0NBTEU4CQCVCgMFBnJld2FyZAUNdG9rZW5JbnRlcmVzdAUKdXNlclN1cHBseQEYY2xhaW1MZW5kZXJSZXdhcmRzQ29tbW9uAgR1c2VyCHJlYWRPbmx5CgEFY2xhaW0CAWEHdG9rZW5JZAQLJHQwODgyMDg4NjQFAWEECHRva2VuSWRzCAULJHQwODgyMDg4NjQCXzEEB2NBbW91bnQIBQskdDA4ODIwODg2NAJfMgQFdG90YWwIBQskdDA4ODIwODg2NAJfMwQIZW50ZXJpZXMIBQskdDA4ODIwODg2NAJfNAQSdXNlckF2YWlsYWJsZUNsYWltCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIFB3Rva2VuSWQCAV8FBHVzZXIFF2tVc2VyTGVuZEF2YWlsYWJsZUNsYWltAAAECyR0MDg5Nzc5MDU2CQESY2FsY0xlbmRVc2VyUmV3YXJkAgUEdXNlcgUHdG9rZW5JZAQHdVJld2FyZAgFCyR0MDg5Nzc5MDU2Al8xBBBuZXdUb2tlbkludGVyZXN0CAULJHQwODk3NzkwNTYCXzIECnVzZXJTdXBwbHkIBQskdDA4OTc3OTA1NgJfMwQMdG90YWxUb0NsYWltCQBkAgUSdXNlckF2YWlsYWJsZUNsYWltBQd1UmV3YXJkAwMJAGYCBQx0b3RhbFRvQ2xhaW0AAAYJAGYCBQp1c2VyU3VwcGx5AAAEDG5ld0VudHJlcmllcwMDBQhyZWFkT25seQYJAAACBQx0b3RhbFRvQ2xhaW0AAAUIZW50ZXJpZXMJAM4IAgUIZW50ZXJpZXMJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIFB3Rva2VuSWQCAV8FBHVzZXIFEWtVc2VyTGVuZEludGVyZXN0BRBuZXdUb2tlbkludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICBQd0b2tlbklkAgFfBQR1c2VyBRdrVXNlckxlbmRBdmFpbGFibGVDbGFpbQAACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFB3Rva2VuSWQFDmtUb2tlbkludGVyZXN0BRBuZXdUb2tlbkludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFB3Rva2VuSWQFFGtUb2tlbkludGVyZXN0SGVpZ2h0BQZoZWlnaHQFA25pbAkAlgoECQDNCAIFCHRva2VuSWRzBQd0b2tlbklkCQDNCAIFB2NBbW91bnQFDHRvdGFsVG9DbGFpbQkAZAIFBXRvdGFsBQx0b3RhbFRvQ2xhaW0FDG5ld0VudHJlcmllcwkAlgoEBQh0b2tlbklkcwUHY0Ftb3VudAUFdG90YWwFCGVudGVyaWVzCgACJGwJAQxnZXRBbGxUb2tlbnMACgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlgoEBQNuaWwFA25pbAAABQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBBWNsYWltAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAzMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgEUY2xhaW1McFJld2FyZHNDb21tb24CBHVzZXIIcmVhZE9ubHkEEnVzZXJBdmFpbGFibGVDbGFpbQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHVzZXIFFWtVc2VyTHBBdmFpbGFibGVDbGFpbQAABAwkdDA5OTg4MTAwNTMJARBjYWxjTHBVc2VyUmV3YXJkAQUEdXNlcgQHdVJld2FyZAgFDCR0MDk5ODgxMDA1MwJfMQQNbmV3THBJbnRlcmVzdAgFDCR0MDk5ODgxMDA1MwJfMgQKdXNlclN1cHBseQgFDCR0MDk5ODgxMDA1MwJfMwQMdG90YWxUb0NsYWltCQBkAgUSdXNlckF2YWlsYWJsZUNsYWltBQd1UmV3YXJkAwMFCHJlYWRPbmx5BgkAAAIFDHRvdGFsVG9DbGFpbQAACQCUCgIFDHRvdGFsVG9DbGFpbQUDbmlsCQCUCgIFDHRvdGFsVG9DbGFpbQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQR1c2VyBQ9rVXNlckxwSW50ZXJlc3QFDW5ld0xwSW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEdXNlcgUVa1VzZXJMcEF2YWlsYWJsZUNsYWltAAAJAMwIAgkBDEludGVnZXJFbnRyeQIFC2tMcEludGVyZXN0BQ1uZXdMcEludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRFrTHBJbnRlcmVzdEhlaWdodAUGaGVpZ2h0BQNuaWwBDWdldFRva2Vuc0FQUnMABAlheGx5UHJpY2UJAQ1nZXRBc3NldFByaWNlAQUGYXhseUlkBA1heGx5UHJlY2lzaW9uCQERZ2V0QXNzZXRQcmVjaXNpb24BBQZheGx5SWQKAQp0b2tlbnNBcHJzAgNhcHIHdG9rZW5JZAQEcndwYgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFB3Rva2VuSWQFFGtUb2tlblJld2FyZFBlckJsb2NrAAAEB3J3cGJVc2QJAGsDBQRyd3BiBQlheGx5UHJpY2UFDWF4bHlQcmVjaXNpb24EBnJ3WWVhcgkAaAIJAGgCBQdyd3BiVXNkBQxwZXJpb2RMZW5ndGgANAQOdG90YWxTdXBwbHlVc2QJARFnZXRUb3RhbFN1cHBseVVzZAEFB3Rva2VuSWQJAM0IAgUDYXByCQBrAwUGcndZZWFyBQZTQ0FMRTgFDnRvdGFsU3VwcGx5VXNkBARhcHJzCgACJGwJAQxnZXRBbGxUb2tlbnMACgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQp0b2tlbnNBcHJzAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAzMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgQNbHBUb3RhbFN1cHBseQkBEUBleHRyTmF0aXZlKDEwNTApAgURc2ZGYXJtaW5nQ29udHJhY3QJAKwCAgUIYXhseVBvb2wFDmtTRlRvdGFsU3VwcGx5BARscElkCQERQGV4dHJOYXRpdmUoMTA1MykCCQERQGV4dHJOYXRpdmUoMTA2MikBBQhheGx5UG9vbAUFa0xwSWQEC2xwUHJlY2lzaW9uCQERZ2V0QXNzZXRQcmVjaXNpb24BBQRscElkBAdscFByaWNlCgABQAkA/AcEBQxtYWluQ29udHJhY3QCGmdldFNoYXJlQXNzZXRQcmljZVJFQURPTkxZCQDMCAIFBGxwSWQFA25pbAUDbmlsAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAQQbHBUb3RhbFN1cHBseVVzZAkAawMFDWxwVG90YWxTdXBwbHkFB2xwUHJpY2UFC2xwUHJlY2lzaW9uBARyd3BiCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFEWtMcFJld2FyZFBlckJsb2NrAAAEB3J3cGJVc2QJAGsDBQRyd3BiBQlheGx5UHJpY2UFDWF4bHlQcmVjaXNpb24EBnJ3WWVhcgkAaAIJAGgCBQdyd3BiVXNkBQxwZXJpb2RMZW5ndGgANAQFbHBBcHIJAGsDBQZyd1llYXIFBlNDQUxFOAUQbHBUb3RhbFN1cHBseVVzZAkAlQoDCQEMZ2V0QWxsVG9rZW5zAAUEYXBycwUFbHBBcHIHAWkBEmNsYWltTGVuZGVyUmV3YXJkcwAECGNsYWltUmVzCQEYY2xhaW1MZW5kZXJSZXdhcmRzQ29tbW9uAgkApQgBCAUBaQZjYWxsZXIHAwkAAAIIBQhjbGFpbVJlcwJfMwAACQACAQIjY2xhaW0gYW1vdW50IG11c3QgYmUgZ3JlYXRlciB0aGFuIDAEA2ludgkA/AcEBQ10b2tlbkNvbnRyYWN0AhJ3aXRoZHJhd0xlbmRSZXdhcmQJAMwIAggFCGNsYWltUmVzAl8zCQDMCAIJAKUIAQgFAWkGY2FsbGVyBQNuaWwFA25pbAMJAAACBQNpbnYFA2ludggFCGNsYWltUmVzAl80CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDmNsYWltTHBSZXdhcmRzAAQIY2xhaW1SZXMJARRjbGFpbUxwUmV3YXJkc0NvbW1vbgIJAKUIAQgFAWkGY2FsbGVyBwMJAAACCAUIY2xhaW1SZXMCXzEAAAkAAgECI2NsYWltIGFtb3VudCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwBANpbnYJAPwHBAUNdG9rZW5Db250cmFjdAIQd2l0aGRyYXdMcFJld2FyZAkAzAgCCAUIY2xhaW1SZXMCXzEJAMwIAgkApQgBCAUBaQZjYWxsZXIFA25pbAUDbmlsAwkAAAIFA2ludgUDaW52CAUIY2xhaW1SZXMCXzIJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEKbGVuZEFjdGlvbgIEdXNlcgd0b2tlbklkCQELdmFsdWVPckVsc2UCCQEKaXNMYW5kQ2FsbAEFAWkEEnVzZXJBdmFpbGFibGVDbGFpbQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFB3Rva2VuSWQFF2tVc2VyTGVuZEF2YWlsYWJsZUNsYWltAAAEDSR0MDEyNDAxMTI0NjgJARJjYWxjTGVuZFVzZXJSZXdhcmQCBQR1c2VyBQd0b2tlbklkBAd1UmV3YXJkCAUNJHQwMTI0MDExMjQ2OAJfMQQQbmV3VG9rZW5JbnRlcmVzdAgFDSR0MDEyNDAxMTI0NjgCXzIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIFBHVzZXICAV8FB3Rva2VuSWQFEWtVc2VyTGVuZEludGVyZXN0BRBuZXdUb2tlbkludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICBQR1c2VyAgFfBQd0b2tlbklkBRdrVXNlckxlbmRBdmFpbGFibGVDbGFpbQkAZAIFEnVzZXJBdmFpbGFibGVDbGFpbQUHdVJld2FyZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQd0b2tlbklkBQ5rVG9rZW5JbnRlcmVzdAUQbmV3VG9rZW5JbnRlcmVzdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQd0b2tlbklkBRRrVG9rZW5JbnRlcmVzdEhlaWdodAUGaGVpZ2h0BQNuaWwBaQEIbHBBY3Rpb24BBHVzZXIJAQt2YWx1ZU9yRWxzZQIJAQ9pc1NGRmFybWluZ0NhbGwBBQFpBBJ1c2VyQXZhaWxhYmxlQ2xhaW0JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUVa1VzZXJMcEF2YWlsYWJsZUNsYWltAAAEDSR0MDEyOTMzMTI5ODYJARBjYWxjTHBVc2VyUmV3YXJkAQUEdXNlcgQHdVJld2FyZAgFDSR0MDEyOTMzMTI5ODYCXzEEDW5ld0xwSW50ZXJlc3QIBQ0kdDAxMjkzMzEyOTg2Al8yCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHVzZXIFD2tVc2VyTHBJbnRlcmVzdAUNbmV3THBJbnRlcmVzdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQR1c2VyBRVrVXNlckxwQXZhaWxhYmxlQ2xhaW0JAGQCBRJ1c2VyQXZhaWxhYmxlQ2xhaW0FB3VSZXdhcmQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEdXNlcgULa0xwSW50ZXJlc3QFDW5ld0xwSW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEdXNlcgURa0xwSW50ZXJlc3RIZWlnaHQFBmhlaWdodAUDbmlsAWkBBGluaXQFFGF4bHlNYWluQ29udHJhY3RBZGRyGWF4bHlUb2tlbm9taWNDb250cmFjdEFkZHIMYXhseVBvb2xBZGRyEmZhcm1pbmdTdGFydEhlaWdodAxwZXJpb2RMZW5ndGgJAQt2YWx1ZU9yRWxzZQIJAQppc1NlbGZDYWxsAQUBaQMJAQEhAQkBCWlzRGVmaW5lZAEJAKYIAQUUYXhseU1haW5Db250cmFjdEFkZHIJAAIBAhVXcm9uZyBmYXJtaW5nIGFkZHJlc3MDCQEBIQEJAQlpc0RlZmluZWQBCQCmCAEFGWF4bHlUb2tlbm9taWNDb250cmFjdEFkZHIJAAIBAhtXcm9uZyBtYWluIGNvbnRyYWN0IGFkZHJlc3MJAMwIAgkBC1N0cmluZ0VudHJ5AgURa0F4bHlNYWluQ29udHJhY3QFFGF4bHlNYWluQ29udHJhY3RBZGRyCQDMCAIJAQtTdHJpbmdFbnRyeQIFFmtBeGx5VG9rZW5vbWljQ29udHJhY3QFGWF4bHlUb2tlbm9taWNDb250cmFjdEFkZHIJAMwIAgkBC1N0cmluZ0VudHJ5AgUJa0F4bHlQb29sBQxheGx5UG9vbEFkZHIJAMwIAgkBDEludGVnZXJFbnRyeQIFDGtTdGFydEhlaWdodAUSZmFybWluZ1N0YXJ0SGVpZ2h0CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ1rUGVyaW9kTGVuZ3RoBQxwZXJpb2RMZW5ndGgFA25pbAFpAQxpbml0TmV3VG9rZW4BB3Rva2VuSWQJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQEJaXNEZWZpbmVkAQkAmggCBQR0aGlzCQCsAgIFB3Rva2VuSWQFDmtUb2tlbkludGVyZXN0CQACAQIUdG9rZW4gYWxyZWFkeSBpbml0ZWQDCQEBIQEJAQhjb250YWlucwIJARFAZXh0ck5hdGl2ZSgxMDUzKQIFDGxlbmRDb250cmFjdAUQa0xlbmRTZXR1cFRva2VucwUHdG9rZW5JZAkAAgECE25vIHRva2VuIG9uIGxhbmRpbmcEDG5ld0FsbFRva2VucwkAzQgCCQEMZ2V0QWxsVG9rZW5zAAUHdG9rZW5JZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQd0b2tlbklkBQ5rVG9rZW5JbnRlcmVzdAAACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFB3Rva2VuSWQFFGtUb2tlbkludGVyZXN0SGVpZ2h0CQCWAwEJAMwIAgULc3RhcnRIZWlnaHQJAMwIAgUGaGVpZ2h0BQNuaWwJAMwIAgkBC1N0cmluZ0VudHJ5AgUHa1Rva2VucwkAuQkCBQxuZXdBbGxUb2tlbnMCASwJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUHdG9rZW5JZAUUa1Rva2VuUmV3YXJkUGVyQmxvY2sAAAUDbmlsAWkBDXVwZGF0ZVJld2FyZHMACQELdmFsdWVPckVsc2UCCQEOaXNPcGVyYXRvckNhbGwBBQFpBBBsYXN0VXBkYXRlUGVyaW9kCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFEWtMYXN0VXBkYXRlUGVyaW9kAAAECWN1clBlcmlvZAkAZAIJAGkCCQBlAgUGaGVpZ2h0BQtzdGFydEhlaWdodAUMcGVyaW9kTGVuZ3RoAAEDAwkAZwIFEGxhc3RVcGRhdGVQZXJpb2QFCWN1clBlcmlvZAkBAiE9AgUQbGFzdFVwZGF0ZVBlcmlvZAAABwkAAgECJXJld2FyZHMgYWxyZWR5IHVwZGF0ZWQgaW4gdGhpcyBwZXJpb2QEDSR0MDE0ODI1MTQ5MDUJARdnZXRUb3RhbFN1cHBseUFsbFRva2VucwAEC3RvdGFsU3VwcGx5CAUNJHQwMTQ4MjUxNDkwNQJfMQQOdG90YWxTdXBwbHlVc2QIBQ0kdDAxNDgyNTE0OTA1Al8yBBF0b3RhbFN1cHBseVVzZEFsbAgFDSR0MDE0ODI1MTQ5MDUCXzMECWF4bHlQcmljZQkBDWdldEFzc2V0UHJpY2UBBQZheGx5SWQEDWF4bHlQcmVjaXNpb24JARFnZXRBc3NldFByZWNpc2lvbgEFBmF4bHlJZAQGbWF4QVBSCQEVZ2V0QWRvcHRlZEFQUkJ5UGVyaW9kAwUJY3VyUGVyaW9kBRNMRU5ERVJTX0FQUl9QRVJJT0RTBQtMRU5ERVJTX0FQUgoBDHVwZGF0ZVJld2FyZAIBYQd0b2tlbklkBA0kdDAxNTE1NDE1MTk4BQFhBAhlbnRlcmllcwgFDSR0MDE1MTU0MTUxOTgCXzEEEXRvdGFsUGVyaW9kUmV3YXJkCAUNJHQwMTUxNTQxNTE5OAJfMgQFaW5kZXgIBQ0kdDAxNTE1NDE1MTk4Al8zAwkAAAIJAJEDAgULdG90YWxTdXBwbHkFBWluZGV4AAAJAJUKAwkAzggCBQhlbnRlcmllcwkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQd0b2tlbklkBRRrUHJldkxlbmRUb2tlblN1cHBseQkAkQMCBQt0b3RhbFN1cHBseQUFaW5kZXgJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUHdG9rZW5JZAUUa1Rva2VuUmV3YXJkUGVyQmxvY2sAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQd0b2tlbklkBQ5rVG9rZW5JbnRlcmVzdAkBFGNhbGNOZXdUb2tlbkludGVyZXN0AgUHdG9rZW5JZAkAkQMCBQt0b3RhbFN1cHBseQUFaW5kZXgJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUHdG9rZW5JZAUUa1Rva2VuSW50ZXJlc3RIZWlnaHQJAJYDAQkAzAgCBQtzdGFydEhlaWdodAkAzAgCBQZoZWlnaHQFA25pbAUDbmlsBRF0b3RhbFBlcmlvZFJld2FyZAkAZAIFBWluZGV4AAEEBXNoYXJlCQBrAwkAkQMCBQ50b3RhbFN1cHBseVVzZAUFaW5kZXgFBlNDQUxFOAURdG90YWxTdXBwbHlVc2RBbGwECW1heFJld2FyZAkAawMFBXNoYXJlBRNsZW5kTWF4UGVyaW9kQW1vdW50BQZTQ0FMRTgEDG1heFJld2FyZFVzZAkAawMFCW1heFJld2FyZAUJYXhseVByaWNlBQ1heGx5UHJlY2lzaW9uBA9wcmV2VG90YWxTdXBwbHkJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUUa1ByZXZMZW5kVG9rZW5TdXBwbHkAAAQGcnRDb2VmAwMJAAACBQ9wcmV2VG90YWxTdXBwbHkAAAYJAAACCQCRAwIFC3RvdGFsU3VwcGx5BQVpbmRleAAAAAAJAGsDBQ9wcmV2VG90YWxTdXBwbHkFBlNDQUxFOAkAkQMCBQt0b3RhbFN1cHBseQUFaW5kZXgEBnJld2FyZAkAaQIJAGkCCQCXAwEJAMwIAgkAaAIFBm1heEFQUgkAZAIFBlNDQUxFOAUGcnRDb2VmCQDMCAIJAGsDBQZtYXhBUFIJAGgCAA8FBlNDQUxFOAAKBQNuaWwFBlNDQUxFOABkBAlyZXdhcmRVc2QJAJcDAQkAzAgCBQxtYXhSZXdhcmRVc2QJAMwIAgkAawMJAJEDAgUOdG90YWxTdXBwbHlVc2QFBWluZGV4BQZyZXdhcmQFBlNDQUxFOAUDbmlsBAxyZXdhcmRQZXJpb2QJAGsDBQlyZXdhcmRVc2QFDWF4bHlQcmVjaXNpb24FCWF4bHlQcmljZQQOcmV3YXJkUGVyQmxvY2sJAGkCBQxyZXdhcmRQZXJpb2QFDHBlcmlvZExlbmd0aAkAlQoDCQDOCAIFCGVudGVyaWVzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFB3Rva2VuSWQFFGtQcmV2TGVuZFRva2VuU3VwcGx5CQCRAwIFC3RvdGFsU3VwcGx5BQVpbmRleAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQd0b2tlbklkBRRrVG9rZW5SZXdhcmRQZXJCbG9jawUOcmV3YXJkUGVyQmxvY2sJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUHdG9rZW5JZAUOa1Rva2VuSW50ZXJlc3QJARRjYWxjTmV3VG9rZW5JbnRlcmVzdAIFB3Rva2VuSWQJAJEDAgULdG90YWxTdXBwbHkFBWluZGV4CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFB3Rva2VuSWQFFGtUb2tlbkludGVyZXN0SGVpZ2h0CQCWAwEJAMwIAgULc3RhcnRIZWlnaHQJAMwIAgUGaGVpZ2h0BQNuaWwFA25pbAkAZAIFEXRvdGFsUGVyaW9kUmV3YXJkBQxyZXdhcmRQZXJpb2QJAGQCBQVpbmRleAABBA0kdDAxNjg2MDE2OTU4CgACJGwJAQxnZXRBbGxUb2tlbnMACgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlQoDBQNuaWwAAAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQx1cGRhdGVSZXdhcmQCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDMwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAAVABYAFwAYABkAGgAbABwAHQAeBA50b2tlbnNFbnRlcmllcwgFDSR0MDE2ODYwMTY5NTgCXzEEEHRvdGFsVG9rZW5SZXdhcmQIBQ0kdDAxNjg2MDE2OTU4Al8yBAVpbmRleAgFDSR0MDE2ODYwMTY5NTgCXzMECGxwTWF4QVBSCQEVZ2V0QWRvcHRlZEFQUkJ5UGVyaW9kAwUJY3VyUGVyaW9kBQ5MUF9BUFJfUEVSSU9EUwUGTFBfQVBSBA1scFRvdGFsU3VwcGx5CQERQGV4dHJOYXRpdmUoMTA1MCkCBRFzZkZhcm1pbmdDb250cmFjdAkArAICBQhheGx5UG9vbAUOa1NGVG90YWxTdXBwbHkEC3ByZUxQU3VwcGx5CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFDWtQcmV2TFBTdXBwbHkAAAQEbHBJZAkBEUBleHRyTmF0aXZlKDEwNTMpAgkBEUBleHRyTmF0aXZlKDEwNjIpAQUIYXhseVBvb2wFBWtMcElkBAtscFByZWNpc2lvbgkBEWdldEFzc2V0UHJlY2lzaW9uAQUEbHBJZAQHbHBQcmljZQoAAUAJAPwHBAUMbWFpbkNvbnRyYWN0AhpnZXRTaGFyZUFzc2V0UHJpY2VSRUFET05MWQkAzAgCBQRscElkBQNuaWwFA25pbAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQEEGxwVG90YWxTdXBwbHlVc2QJAGsDBQ1scFRvdGFsU3VwcGx5BQdscFByaWNlBQtscFByZWNpc2lvbgQObWF4TFBSZXdhcmRVc2QJAGsDBRFscE1heFBlcmlvZEFtb3VudAUJYXhseVByaWNlBQ1heGx5UHJlY2lzaW9uBAhydExQQ29lZgMDCQAAAgULcHJlTFBTdXBwbHkAAAYJAAACBQ1scFRvdGFsU3VwcGx5AAAAAAkAawMFC3ByZUxQU3VwcGx5BQZTQ0FMRTgFDWxwVG90YWxTdXBwbHkECHJld2FyZExwCQBpAgkAaQIJAJcDAQkAzAgCCQBoAgUIbHBNYXhBUFIJAGQCBQZTQ0FMRTgFCHJ0TFBDb2VmCQDMCAIJAGsDBQhscE1heEFQUgkAaAIADwUGU0NBTEU4AAoFA25pbAUGU0NBTEU4AGQEC3Jld2FyZExwVXNkCQCXAwEJAMwIAgUObWF4TFBSZXdhcmRVc2QJAMwIAgkAawMFEGxwVG90YWxTdXBwbHlVc2QFCHJld2FyZExwBQZTQ0FMRTgFA25pbAQOcmV3YXJkTHBQZXJpb2QJAGsDBQtyZXdhcmRMcFVzZAUNYXhseVByZWNpc2lvbgUJYXhseVByaWNlBBByZXdhcmRMcFBlckJsb2NrCQBpAgUOcmV3YXJkTHBQZXJpb2QFDHBlcmlvZExlbmd0aAQIYnVybkxlbmQJAGUCBRNsZW5kTWF4UGVyaW9kQW1vdW50BRB0b3RhbFRva2VuUmV3YXJkBAZidXJuTHAJAGUCBRFscE1heFBlcmlvZEFtb3VudAUOcmV3YXJkTHBQZXJpb2QEA2ludgkA/AcEBQ10b2tlbkNvbnRyYWN0AhB3aXRoZHJhd0xwUmV3YXJkCQDMCAIJAGQCBQhidXJuTGVuZAUGYnVybkxwCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQNuaWwDCQAAAgUDaW52BQNpbnYECmxwRW50ZXJpZXMJAMwIAgkBDEludGVnZXJFbnRyeQIFDWtQcmV2TFBTdXBwbHkFDWxwVG90YWxTdXBwbHkJAMwIAgkBDEludGVnZXJFbnRyeQIFEWtMcFJld2FyZFBlckJsb2NrBRByZXdhcmRMcFBlckJsb2NrCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQtrTHBJbnRlcmVzdAkBEWNhbGNOZXdMcEludGVyZXN0AQUNbHBUb3RhbFN1cHBseQkAzAgCCQEMSW50ZWdlckVudHJ5AgURa0xwSW50ZXJlc3RIZWlnaHQJAJYDAQkAzAgCBQtzdGFydEhlaWdodAkAzAgCBQZoZWlnaHQFA25pbAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEBGgFUJ5EsPDoJzQ7bvgXV083vCkgY+zYDPYa7BQhidXJuTGVuZAkA2QQBBQZheGx5SWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBARoBVCeRLDw6Cc0O274F1dPN7wpIGPs2Az2GuwUGYnVybkxwCQDZBAEFBmF4bHlJZAUDbmlsCQDNCAIJAM4IAgUKbHBFbnRlcmllcwUOdG9rZW5zRW50ZXJpZXMJAQxJbnRlZ2VyRW50cnkCBRFrTGFzdFVwZGF0ZVBlcmlvZAUQbGFzdFVwZGF0ZVBlcmlvZAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgECdHgBBnZlcmlmeQAEE211bHRpU2lnbmVkQnlBZG1pbnMEEmFkbWluUHViS2V5MVNpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFCGFkbWluMVBLAAEAAAQSYWRtaW5QdWJLZXkyU2lnbmVkAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAQUIYWRtaW4yUEsAAQAABBJhZG1pblB1YktleTNTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwACBQhhZG1pbjNQSwABAAAJAGcCCQBkAgkAZAIFEmFkbWluUHViS2V5MVNpZ25lZAUSYWRtaW5QdWJLZXkyU2lnbmVkBRJhZG1pblB1YktleTNTaWduZWQAAgQHJG1hdGNoMAUCdHgDCQABAgUHJG1hdGNoMAIXSW52b2tlU2NyaXB0VHJhbnNhY3Rpb24EA2ludgUHJG1hdGNoMAQGaXNTZWxmCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACAUCdHgPc2VuZGVyUHVibGljS2V5BAppc1JpZ2h0RmVlAwkAAAIIBQNpbnYDZmVlAKD3NgkAAAIIBQNpbnYKZmVlQXNzZXRJZAUEdW5pdAcECmlzSW5pdENhbGwJAAACCAUDaW52CGZ1bmN0aW9uAgRpbml0BAxpc25vUGF5bWVudHMJAAACCQCQAwEIBQNpbnYIcGF5bWVudHMAAAMDAwMFCmlzUmlnaHRGZWUFCmlzSW5pdENhbGwHBQZpc1NlbGYHBQxpc25vUGF5bWVudHMHBgUTbXVsdGlTaWduZWRCeUFkbWlucwUTbXVsdGlTaWduZWRCeUFkbWluczSVeMA=", "height": 2716009, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 7PEeNfgEQayzcq5WNYrSPYsodzQpLtpZSSXV1zpWfkKA Next: CFhZzZ6MY7TwbdvfGoJJbqUaEGbABsr8SUHyewKHNDK2 Diff:
OldNewDifferences
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 = max([1, ((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 $t054295451 = a
180- let index = $t054295451._1
181- let found = $t054295451._2
177+ let $t053625384 = a
178+ let index = $t053625384._1
179+ let found = $t053625384._2
182180 let ft = split(aperiod, "-")
183- let $t054885551 = $Tuple2(parseIntValue(ft[0]), parseIntValue(ft[1]))
184- let from = $t054885551._1
185- let to = $t054885551._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 $t056885754 = {
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 = $t056885754._1
210- let found = $t056885754._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 $t059425998 = a
220- let totalSupply = $t059425998._1
221- let totalSupplyUsd = $t059425998._2
222- let totalSupplyUsdAll = $t059425998._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)
304302
305303 func claimLenderRewardsCommon (user,readOnly) = {
306304 func claim (a,tokenId) = {
307- let $t088878931 = a
308- let tokenIds = $t088878931._1
309- let cAmount = $t088878931._2
310- let total = $t088878931._3
311- let enteries = $t088878931._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 $t090449123 = calcLendUserReward(user, tokenId)
314- let uReward = $t090449123._1
315- let newTokenInterest = $t090449123._2
316- let userSupply = $t090449123._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 $t01005510120 = calcLpUserReward(user)
350- let uReward = $t01005510120._1
351- let newLpInterest = $t01005510120._2
352- let userSupply = $t01005510120._3
347+ let $t0998810053 = calcLpUserReward(user)
348+ let uReward = $t0998810053._1
349+ let newLpInterest = $t0998810053._2
350+ let userSupply = $t0998810053._3
353351 let totalToClaim = (userAvailableClaim + uReward)
354352 if (if (readOnly)
355353 then true
435433 @Callable(i)
436434 func lendAction (user,tokenId) = valueOrElse(isLandCall(i), {
437435 let userAvailableClaim = valueOrElse(getInteger(this, (tokenId + kUserLendAvailableClaim)), 0)
438- let $t01246812535 = calcLendUserReward(user, tokenId)
439- let uReward = $t01246812535._1
440- let newTokenInterest = $t01246812535._2
436+ let $t01240112468 = calcLendUserReward(user, tokenId)
437+ let uReward = $t01240112468._1
438+ let newTokenInterest = $t01240112468._2
441439 [IntegerEntry((((user + "_") + tokenId) + kUserLendInterest), newTokenInterest), IntegerEntry((((user + "_") + tokenId) + kUserLendAvailableClaim), (userAvailableClaim + uReward)), IntegerEntry((tokenId + kTokenInterest), newTokenInterest), IntegerEntry((tokenId + kTokenInterestHeight), height)]
442440 })
443441
446444 @Callable(i)
447445 func lpAction (user) = valueOrElse(isSFFarmingCall(i), {
448446 let userAvailableClaim = valueOrElse(getInteger(this, kUserLpAvailableClaim), 0)
449- let $t01300013053 = calcLpUserReward(user)
450- let uReward = $t01300013053._1
451- let newLpInterest = $t01300013053._2
447+ let $t01293312986 = calcLpUserReward(user)
448+ let uReward = $t01293312986._1
449+ let newLpInterest = $t01293312986._2
452450 [IntegerEntry((user + kUserLpInterest), newLpInterest), IntegerEntry((user + kUserLpAvailableClaim), (userAvailableClaim + uReward)), IntegerEntry((user + kLpInterest), newLpInterest), IntegerEntry((user + kLpInterestHeight), height)]
453451 })
454452
477475
478476 @Callable(i)
479477 func updateRewards () = valueOrElse(isOperatorCall(i), {
480- let lastUpdateHeight = valueOrElse(getInteger(this, kRewardUpdateHeight), 0)
481- if (((lastUpdateHeight + periodLength) > height))
478+ let lastUpdatePeriod = valueOrElse(getInteger(this, kLastUpdatePeriod), 0)
479+ let curPeriod = (((height - startHeight) / periodLength) + 1)
480+ if (if ((lastUpdatePeriod >= curPeriod))
481+ then (lastUpdatePeriod != 0)
482+ else false)
482483 then throw("rewards alredy updated in this period")
483484 else {
484- let $t01482014900 = getTotalSupplyAllTokens()
485- let totalSupply = $t01482014900._1
486- let totalSupplyUsd = $t01482014900._2
487- let totalSupplyUsdAll = $t01482014900._3
485+ let $t01482514905 = getTotalSupplyAllTokens()
486+ let totalSupply = $t01482514905._1
487+ let totalSupplyUsd = $t01482514905._2
488+ let totalSupplyUsdAll = $t01482514905._3
488489 let axlyPrice = getAssetPrice(axlyId)
489490 let axlyPrecision = getAssetPrecision(axlyId)
490491 let maxAPR = getAdoptedAPRByPeriod(curPeriod, LENDERS_APR_PERIODS, LENDERS_APR)
491492 func updateReward (a,tokenId) = {
492- let $t01514915193 = a
493- let enteries = $t01514915193._1
494- let totalPeriodReward = $t01514915193._2
495- let index = $t01514915193._3
493+ let $t01515415198 = a
494+ let enteries = $t01515415198._1
495+ let totalPeriodReward = $t01515415198._2
496+ let index = $t01515415198._3
496497 if ((totalSupply[index] == 0))
497498 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))
498499 else {
513514 }
514515 }
515516
516- let $t01685516953 = {
517+ let $t01686016958 = {
517518 let $l = getAllTokens()
518519 let $s = size($l)
519520 let $acc0 = $Tuple3(nil, 0, 0)
527528
528529 $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)
529530 }
530- let tokensEnteries = $t01685516953._1
531- let totalTokenReward = $t01685516953._2
532- let index = $t01685516953._3
531+ let tokensEnteries = $t01686016958._1
532+ let totalTokenReward = $t01686016958._2
533+ let index = $t01686016958._3
533534 let lpMaxAPR = getAdoptedAPRByPeriod(curPeriod, LP_APR_PERIODS, LP_APR)
534535 let lpTotalSupply = getIntegerValue(sfFarmingContract, (axlyPool + kSFTotalSupply))
535536 let preLPSupply = valueOrElse(getInteger(this, kPrevLPSupply), 0)
558559 if ((inv == inv))
559560 then {
560561 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))]
561- ((lpEnteries ++ tokensEnteries) :+ IntegerEntry(kRewardUpdateHeight, max([startHeight, height])))
562+ ((lpEnteries ++ tokensEnteries) :+ IntegerEntry(kLastUpdatePeriod, lastUpdatePeriod))
562563 }
563564 else throw("Strict value is not equal to itself.")
564565 }
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
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 = max([1, ((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 $t054295451 = a
180- let index = $t054295451._1
181- let found = $t054295451._2
177+ let $t053625384 = a
178+ let index = $t053625384._1
179+ let found = $t053625384._2
182180 let ft = split(aperiod, "-")
183- let $t054885551 = $Tuple2(parseIntValue(ft[0]), parseIntValue(ft[1]))
184- let from = $t054885551._1
185- let to = $t054885551._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 $t056885754 = {
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 = $t056885754._1
210- let found = $t056885754._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 $t059425998 = a
220- let totalSupply = $t059425998._1
221- let totalSupplyUsd = $t059425998._2
222- let totalSupplyUsdAll = $t059425998._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
253251 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
267265 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)
296294 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 $t088878931 = a
308- let tokenIds = $t088878931._1
309- let cAmount = $t088878931._2
310- let total = $t088878931._3
311- let enteries = $t088878931._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 $t090449123 = calcLendUserReward(user, tokenId)
314- let uReward = $t090449123._1
315- let newTokenInterest = $t090449123._2
316- let userSupply = $t090449123._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 $t01005510120 = calcLpUserReward(user)
350- let uReward = $t01005510120._1
351- let newLpInterest = $t01005510120._2
352- let userSupply = $t01005510120._3
347+ let $t0998810053 = calcLpUserReward(user)
348+ let uReward = $t0998810053._1
349+ let newLpInterest = $t0998810053._2
350+ let userSupply = $t0998810053._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 = {
391389 let @ = invoke(mainContract, "getShareAssetPriceREADONLY", [lpId], nil)
392390 if ($isInstanceOf(@, "Int"))
393391 then @
394392 else throw(($getType(@) + " couldn't be cast to Int"))
395393 }
396394 let lpTotalSupplyUsd = fraction(lpTotalSupply, lpPrice, lpPrecision)
397395 let rwpb = valueOrElse(getInteger(this, kLpRewardPerBlock), 0)
398396 let rwpbUsd = fraction(rwpb, axlyPrice, axlyPrecision)
399397 let rwYear = ((rwpbUsd * periodLength) * 52)
400398 let lpApr = fraction(rwYear, SCALE8, lpTotalSupplyUsd)
401399 $Tuple3(getAllTokens(), aprs, lpApr)
402400 }
403401
404402
405403 @Callable(i)
406404 func claimLenderRewards () = {
407405 let claimRes = claimLenderRewardsCommon(toString(i.caller), false)
408406 if ((claimRes._3 == 0))
409407 then throw("claim amount must be greater than 0")
410408 else {
411409 let inv = invoke(tokenContract, "withdrawLendReward", [claimRes._3, toString(i.caller)], nil)
412410 if ((inv == inv))
413411 then claimRes._4
414412 else throw("Strict value is not equal to itself.")
415413 }
416414 }
417415
418416
419417
420418 @Callable(i)
421419 func claimLpRewards () = {
422420 let claimRes = claimLpRewardsCommon(toString(i.caller), false)
423421 if ((claimRes._1 == 0))
424422 then throw("claim amount must be greater than 0")
425423 else {
426424 let inv = invoke(tokenContract, "withdrawLpReward", [claimRes._1, toString(i.caller)], nil)
427425 if ((inv == inv))
428426 then claimRes._2
429427 else throw("Strict value is not equal to itself.")
430428 }
431429 }
432430
433431
434432
435433 @Callable(i)
436434 func lendAction (user,tokenId) = valueOrElse(isLandCall(i), {
437435 let userAvailableClaim = valueOrElse(getInteger(this, (tokenId + kUserLendAvailableClaim)), 0)
438- let $t01246812535 = calcLendUserReward(user, tokenId)
439- let uReward = $t01246812535._1
440- let newTokenInterest = $t01246812535._2
436+ let $t01240112468 = calcLendUserReward(user, tokenId)
437+ let uReward = $t01240112468._1
438+ let newTokenInterest = $t01240112468._2
441439 [IntegerEntry((((user + "_") + tokenId) + kUserLendInterest), newTokenInterest), IntegerEntry((((user + "_") + tokenId) + kUserLendAvailableClaim), (userAvailableClaim + uReward)), IntegerEntry((tokenId + kTokenInterest), newTokenInterest), IntegerEntry((tokenId + kTokenInterestHeight), height)]
442440 })
443441
444442
445443
446444 @Callable(i)
447445 func lpAction (user) = valueOrElse(isSFFarmingCall(i), {
448446 let userAvailableClaim = valueOrElse(getInteger(this, kUserLpAvailableClaim), 0)
449- let $t01300013053 = calcLpUserReward(user)
450- let uReward = $t01300013053._1
451- let newLpInterest = $t01300013053._2
447+ let $t01293312986 = calcLpUserReward(user)
448+ let uReward = $t01293312986._1
449+ let newLpInterest = $t01293312986._2
452450 [IntegerEntry((user + kUserLpInterest), newLpInterest), IntegerEntry((user + kUserLpAvailableClaim), (userAvailableClaim + uReward)), IntegerEntry((user + kLpInterest), newLpInterest), IntegerEntry((user + kLpInterestHeight), height)]
453451 })
454452
455453
456454
457455 @Callable(i)
458456 func init (axlyMainContractAddr,axlyTokenomicContractAddr,axlyPoolAddr,farmingStartHeight,periodLength) = valueOrElse(isSelfCall(i), if (!(isDefined(addressFromString(axlyMainContractAddr))))
459457 then throw("Wrong farming address")
460458 else if (!(isDefined(addressFromString(axlyTokenomicContractAddr))))
461459 then throw("Wrong main contract address")
462460 else [StringEntry(kAxlyMainContract, axlyMainContractAddr), StringEntry(kAxlyTokenomicContract, axlyTokenomicContractAddr), StringEntry(kAxlyPool, axlyPoolAddr), IntegerEntry(kStartHeight, farmingStartHeight), IntegerEntry(kPeriodLength, periodLength)])
463461
464462
465463
466464 @Callable(i)
467465 func initNewToken (tokenId) = valueOrElse(isAdminCall(i), if (isDefined(getInteger(this, (tokenId + kTokenInterest))))
468466 then throw("token already inited")
469467 else if (!(contains(getStringValue(lendContract, kLendSetupTokens), tokenId)))
470468 then throw("no token on landing")
471469 else {
472470 let newAllTokens = (getAllTokens() :+ tokenId)
473471 [IntegerEntry((tokenId + kTokenInterest), 0), IntegerEntry((tokenId + kTokenInterestHeight), max([startHeight, height])), StringEntry(kTokens, makeString(newAllTokens, ",")), IntegerEntry((tokenId + kTokenRewardPerBlock), 0)]
474472 })
475473
476474
477475
478476 @Callable(i)
479477 func updateRewards () = valueOrElse(isOperatorCall(i), {
480- let lastUpdateHeight = valueOrElse(getInteger(this, kRewardUpdateHeight), 0)
481- if (((lastUpdateHeight + periodLength) > height))
478+ let lastUpdatePeriod = valueOrElse(getInteger(this, kLastUpdatePeriod), 0)
479+ let curPeriod = (((height - startHeight) / periodLength) + 1)
480+ if (if ((lastUpdatePeriod >= curPeriod))
481+ then (lastUpdatePeriod != 0)
482+ else false)
482483 then throw("rewards alredy updated in this period")
483484 else {
484- let $t01482014900 = getTotalSupplyAllTokens()
485- let totalSupply = $t01482014900._1
486- let totalSupplyUsd = $t01482014900._2
487- let totalSupplyUsdAll = $t01482014900._3
485+ let $t01482514905 = getTotalSupplyAllTokens()
486+ let totalSupply = $t01482514905._1
487+ let totalSupplyUsd = $t01482514905._2
488+ let totalSupplyUsdAll = $t01482514905._3
488489 let axlyPrice = getAssetPrice(axlyId)
489490 let axlyPrecision = getAssetPrecision(axlyId)
490491 let maxAPR = getAdoptedAPRByPeriod(curPeriod, LENDERS_APR_PERIODS, LENDERS_APR)
491492 func updateReward (a,tokenId) = {
492- let $t01514915193 = a
493- let enteries = $t01514915193._1
494- let totalPeriodReward = $t01514915193._2
495- let index = $t01514915193._3
493+ let $t01515415198 = a
494+ let enteries = $t01515415198._1
495+ let totalPeriodReward = $t01515415198._2
496+ let index = $t01515415198._3
496497 if ((totalSupply[index] == 0))
497498 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))
498499 else {
499500 let share = fraction(totalSupplyUsd[index], SCALE8, totalSupplyUsdAll)
500501 let maxReward = fraction(share, lendMaxPeriodAmount, SCALE8)
501502 let maxRewardUsd = fraction(maxReward, axlyPrice, axlyPrecision)
502503 let prevTotalSupply = valueOrElse(getInteger(this, kPrevLendTokenSupply), 0)
503504 let rtCoef = if (if ((prevTotalSupply == 0))
504505 then true
505506 else (totalSupply[index] == 0))
506507 then 0
507508 else fraction(prevTotalSupply, SCALE8, totalSupply[index])
508509 let reward = ((min([(maxAPR * (SCALE8 + rtCoef)), fraction(maxAPR, (15 * SCALE8), 10)]) / SCALE8) / 100)
509510 let rewardUsd = min([maxRewardUsd, fraction(totalSupplyUsd[index], reward, SCALE8)])
510511 let rewardPeriod = fraction(rewardUsd, axlyPrecision, axlyPrice)
511512 let rewardPerBlock = (rewardPeriod / periodLength)
512513 $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))
513514 }
514515 }
515516
516- let $t01685516953 = {
517+ let $t01686016958 = {
517518 let $l = getAllTokens()
518519 let $s = size($l)
519520 let $acc0 = $Tuple3(nil, 0, 0)
520521 func $f0_1 ($a,$i) = if (($i >= $s))
521522 then $a
522523 else updateReward($a, $l[$i])
523524
524525 func $f0_2 ($a,$i) = if (($i >= $s))
525526 then $a
526527 else throw("List size exceeds 30")
527528
528529 $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)
529530 }
530- let tokensEnteries = $t01685516953._1
531- let totalTokenReward = $t01685516953._2
532- let index = $t01685516953._3
531+ let tokensEnteries = $t01686016958._1
532+ let totalTokenReward = $t01686016958._2
533+ let index = $t01686016958._3
533534 let lpMaxAPR = getAdoptedAPRByPeriod(curPeriod, LP_APR_PERIODS, LP_APR)
534535 let lpTotalSupply = getIntegerValue(sfFarmingContract, (axlyPool + kSFTotalSupply))
535536 let preLPSupply = valueOrElse(getInteger(this, kPrevLPSupply), 0)
536537 let lpId = getStringValue(addressFromStringValue(axlyPool), kLpId)
537538 let lpPrecision = getAssetPrecision(lpId)
538539 let lpPrice = {
539540 let @ = invoke(mainContract, "getShareAssetPriceREADONLY", [lpId], nil)
540541 if ($isInstanceOf(@, "Int"))
541542 then @
542543 else throw(($getType(@) + " couldn't be cast to Int"))
543544 }
544545 let lpTotalSupplyUsd = fraction(lpTotalSupply, lpPrice, lpPrecision)
545546 let maxLPRewardUsd = fraction(lpMaxPeriodAmount, axlyPrice, axlyPrecision)
546547 let rtLPCoef = if (if ((preLPSupply == 0))
547548 then true
548549 else (lpTotalSupply == 0))
549550 then 0
550551 else fraction(preLPSupply, SCALE8, lpTotalSupply)
551552 let rewardLp = ((min([(lpMaxAPR * (SCALE8 + rtLPCoef)), fraction(lpMaxAPR, (15 * SCALE8), 10)]) / SCALE8) / 100)
552553 let rewardLpUsd = min([maxLPRewardUsd, fraction(lpTotalSupplyUsd, rewardLp, SCALE8)])
553554 let rewardLpPeriod = fraction(rewardLpUsd, axlyPrecision, axlyPrice)
554555 let rewardLpPerBlock = (rewardLpPeriod / periodLength)
555556 let burnLend = (lendMaxPeriodAmount - totalTokenReward)
556557 let burnLp = (lpMaxPeriodAmount - rewardLpPeriod)
557558 let inv = invoke(tokenContract, "withdrawLpReward", [(burnLend + burnLp), toString(this)], nil)
558559 if ((inv == inv))
559560 then {
560561 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))]
561- ((lpEnteries ++ tokensEnteries) :+ IntegerEntry(kRewardUpdateHeight, max([startHeight, height])))
562+ ((lpEnteries ++ tokensEnteries) :+ IntegerEntry(kLastUpdatePeriod, lastUpdatePeriod))
562563 }
563564 else throw("Strict value is not equal to itself.")
564565 }
565566 })
566567
567568
568569 @Verifier(tx)
569570 func verify () = {
570571 let multiSignedByAdmins = {
571572 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], admin1PK))
572573 then 1
573574 else 0
574575 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], admin2PK))
575576 then 1
576577 else 0
577578 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], admin3PK))
578579 then 1
579580 else 0
580581 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
581582 }
582583 match tx {
583584 case inv: InvokeScriptTransaction =>
584585 let isSelf = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
585586 let isRightFee = if ((inv.fee == 900000))
586587 then (inv.feeAssetId == unit)
587588 else false
588589 let isInitCall = (inv.function == "init")
589590 let isnoPayments = (size(inv.payments) == 0)
590591 if (if (if (if (isRightFee)
591592 then isInitCall
592593 else false)
593594 then isSelf
594595 else false)
595596 then isnoPayments
596597 else false)
597598 then true
598599 else multiSignedByAdmins
599600 case _ =>
600601 multiSignedByAdmins
601602 }
602603 }
603604

github/deemru/w8io/169f3d6 
100.62 ms