tx · FrqMnAPBVFDTHsepjajhd6DFybASWHwBRjCX3jbTDnpL

3N2M4PztorHwrfENp7D6LhYGgGodjiD1fjn:  -0.02300000 Waves

2023.08.17 14:30 [2714536] smart account 3N2M4PztorHwrfENp7D6LhYGgGodjiD1fjn > SELF 0.00000000 Waves

{ "type": 13, "id": "FrqMnAPBVFDTHsepjajhd6DFybASWHwBRjCX3jbTDnpL", "fee": 2300000, "feeAssetId": null, "timestamp": 1692271905788, "version": 2, "chainId": 84, "sender": "3N2M4PztorHwrfENp7D6LhYGgGodjiD1fjn", "senderPublicKey": "Fj9LPkCtmW3pDnVU6wPQnvqpZJCBieWSvZqY5FAGeCyp", "proofs": [ "gbHmMDdeATdsxEcL4EHE1opQeHroyEpFqVX4F3kDM2h68gM6XD3NNANupDoqK4BzG5jLNMrGtvtAFQtq3TmhUXq", "jNBa7xRyw7HgcVY5RTSBHr4Mj9UCXhWcC5vSjX5bGk1qNmKLjYKGf41PczRhqZpiRTXNPbxMG52vGnTfG18GEve" ], "script": "base64:BgIhCAISABIAEgQKAggIEgMKAQgSBwoFCAgIAQESAwoBCBIAUQAGU0NBTEU4AIDC1y8AC0xFTkRFUlNfQVBSCQDMCAIAlgEJAMwIAgB4CQDMCAIAZAkAzAgCAFAJAMwIAgA8CQDMCAIAKAkAzAgCAB4JAMwIAgAUCQDMCAIACgUDbmlsABNMRU5ERVJTX0FQUl9QRVJJT0RTCQDMCAICAzEtMQkAzAgCAgMyLTIJAMwIAgIDMy0zCQDMCAICAzQtNAkAzAgCAgM1LTgJAMwIAgIEOS0xMgkAzAgCAgcxNCAtIDE2CQDMCAICBTE3LTIwCQDMCAICBjIwLTEwNAUDbmlsABNMRU5ERVJTX01BWF9QRVJJT0RTAGgABkxQX0FQUgkAzAgCAJYBCQDMCAIAeAkAzAgCAGQJAMwIAgBQCQDMCAIAPAkAzAgCACgFA25pbAAOTFBfQVBSX1BFUklPRFMJAMwIAgIDMS0xCQDMCAICAzItMgkAzAgCAgMzLTMJAMwIAgIDNC00CQDMCAICAzUtOAkAzAgCAgQ5LTEyBQNuaWwADkxQX01BWF9QRVJJT0RTAAwADGtTdGFydEhlaWdodAILc3RhcnRIZWlnaHQADWtQZXJpb2RMZW5ndGgCDHBlcmlvZExlbmd0aAARa0xlbmRlcnNNYXhBbW91bnQCEWxlbmRSZXdhcmRzQW1vdW50AAxrTFBNYXhBbW91bnQCDmxwUmV3YXJkQW1vdW50AAdrVG9rZW5zAgZ0b2tlbnMAC2tVc2VyU3VwcGx5AhBfdXNlclRvdGFsU3VwcGx5AA5rVG9rZW5JbnRlcmVzdAIOX3Rva2VuSW50ZXJlc3QAFGtUb2tlbkludGVyZXN0SGVpZ2h0AhRfdG9rZW5JbnRlcmVzdEhlaWdodAAUa1Rva2VuUmV3YXJkUGVyQmxvY2sCFF90b2tlblJld2FyZFBlckJsb2NrABNrUmV3YXJkVXBkYXRlSGVpZ2h0AhJyZXdhcmRVcGRhdGVIZWlnaHQAEWtVc2VyTGVuZEludGVyZXN0AhFfdXNlckxhbmRJbnRlcmVzdAAXa1VzZXJMZW5kQXZhaWxhYmxlQ2xhaW0CF191c2VyTGVuZEF2YWlsYWJsZUNsYWltABVrVXNlckxwQXZhaWxhYmxlQ2xhaW0CFV91c2VyTHBBdmFpbGFibGVDbGFpbQALa0xwSW50ZXJlc3QCCmxwSW50ZXJlc3QAEWtMcEludGVyZXN0SGVpZ2h0AhBscEludGVyZXN0SGVpZ2h0AA1rUHJldkxQU3VwcGx5AhFwcmV2TFBUb3RhbFN1cHBseQARa0xwUmV3YXJkUGVyQmxvY2sCEGxwUmV3YXJkUGVyQmxvY2sAD2tVc2VyTHBJbnRlcmVzdAIPX3VzZXJMcEludGVyZXN0AA5rUHJpY2VJbk9yYWNsZQIHX3R3YXA1QgAUa1ByZXZMZW5kVG9rZW5TdXBwbHkCFF9wcmV2TGVuZFRvdGFsU3VwcGx5AAxrQVhMWVRva2VuSWQCC2F4bHlUb2tlbklkABBrTGVuZFRva2VuU3VwcGx5Ag90b3RhbF9zdXBwbGllZF8AD2tMZW5kVXNlclN1cHBseQIKX3N1cHBsaWVkXwAQa0xlbmRTZXR1cFRva2VucwIMc2V0dXBfdG9rZW5zAA5rU0ZUb3RhbFN1cHBseQIaX3RvdGFsX3NoYXJlX3Rva2Vuc19sb2NrZWQAEmtTRlVzZXJUb3RhbFN1cHBseQIUX3NoYXJlX3Rva2Vuc19sb2NrZWQACWtBeGx5UG9vbAIIYXhseVBvb2wABWtMcElkAg5zaGFyZV9hc3NldF9pZAAMa1ByaWNlT3JhY2xlAgxwcmljZV9vcmFjbGUAEWtBeGx5TWFpbkNvbnRyYWN0AgxtYWluQ29udHJhY3QAFmtBeGx5VG9rZW5vbWljQ29udHJhY3QCEXRva2Vub21pY0NvbnRyYWN0ABJrU0ZGYXJtaW5nQ29udHJhY3QCE3N3b3BmaV9mYXJtaW5nX2FkZHIADWtMZW5kQ29udHJhY3QCEWxlbmRfc2VydmljZV9hZGRyAAlrQWRtaW4xUEsCFWdyb3VwMV9hZG1pbjFfcHViX2tleQAJa0FkbWluMlBLAhVncm91cDFfYWRtaW4yX3B1Yl9rZXkACWtBZG1pbjNQSwIVZ3JvdXAxX2FkbWluM19wdWJfa2V5AA9rT3BlcmF0b3JDYWxsUEsCEmFkbWluX2NhbGxfcHViX2tleQAIYXhseVBvb2wJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQlrQXhseVBvb2wCFkNhbid0IGdldCBheGx5UG9vbCBrZXkADG1haW5Db250cmFjdAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMFEWtBeGx5TWFpbkNvbnRyYWN0AhlDYW4ndCBnZXQgbWFpbkNvbnRhY3Qga2V5AA10b2tlbkNvbnRyYWN0CQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUWa0F4bHlUb2tlbm9taWNDb250cmFjdAIfQ2FuJ3QgZ2V0IHRva2Vub21pY0NvbnRyYWN0IGtleQAMbGVuZENvbnRyYWN0CQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUMbWFpbkNvbnRyYWN0BQ1rTGVuZENvbnRyYWN0Ah9DYW4ndCBnZXQgbGVuZF9zZXJ2aWNlX2FkZHIga2V5ABFzZkZhcm1pbmdDb250cmFjdAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFDG1haW5Db250cmFjdAUSa1NGRmFybWluZ0NvbnRyYWN0AiFDYW4ndCBnZXQgc3dvcGZpX2Zhcm1pbmdfYWRkciBrZXkAD3ByaWNlT3JhY2xlQWRkcgkBEUBleHRyTmF0aXZlKDEwNjIpAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFDG1haW5Db250cmFjdAUMa1ByaWNlT3JhY2xlAhpDYW4ndCBnZXQgcHJpY2Vfb3JhY2xlIGtleQAIYWRtaW4xUEsJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFDG1haW5Db250cmFjdAUJa0FkbWluMVBLAhJDYW4ndCBnZXQgYWRtaW4xUEsACGFkbWluMlBLCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQxtYWluQ29udHJhY3QFCWtBZG1pbjJQSwISQ2FuJ3QgZ2V0IGFkbWluMlBLAAhhZG1pbjNQSwkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUMbWFpbkNvbnRyYWN0BQlrQWRtaW4zUEsCFENhbid0IGdldCBvcGVyYXRvclBLAApvcGVyYXRvclBLCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQ9rT3BlcmF0b3JDYWxsUEsCFENhbid0IGdldCBvcGVyYXRvclBLAAZheGx5SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ10b2tlbkNvbnRyYWN0BQxrQVhMWVRva2VuSWQCF0Nhbid0IGdldCBBeGx5IHRva2VuIGlkAAtzdGFydEhlaWdodAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwUMa1N0YXJ0SGVpZ2h0AAxwZXJpb2RMZW5ndGgJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMFDWtQZXJpb2RMZW5ndGgACWN1clBlcmlvZAkAaQIJAGUCBQZoZWlnaHQFC3N0YXJ0SGVpZ2h0BQxwZXJpb2RMZW5ndGgADWxlbmRNYXhBbW91bnQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFDXRva2VuQ29udHJhY3QFEWtMZW5kZXJzTWF4QW1vdW50ABNsZW5kTWF4UGVyaW9kQW1vdW50CQBpAgUNbGVuZE1heEFtb3VudAUTTEVOREVSU19NQVhfUEVSSU9EUwALbHBNYXhBbW91bnQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFDXRva2VuQ29udHJhY3QFDGtMUE1heEFtb3VudAARbHBNYXhQZXJpb2RBbW91bnQJAGkCBQtscE1heEFtb3VudAUOTFBfTUFYX1BFUklPRFMACWFsbFRva2VucwkAtQkCCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFB2tUb2tlbnMCAAIBLAELaXNBZG1pbkNhbGwBAWkDCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQhhZG1pbjFQSwkAzAgCBQhhZG1pbjJQSwkAzAgCBQhhZG1pbjNQSwUDbmlsCAUBaQ9jYWxsZXJQdWJsaWNLZXkFBHVuaXQJAAIBAihPbmx5IGFkbWluIGdyb3VwMSBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uAQppc1NlbGZDYWxsAQFpAwkAAAIIBQFpBmNhbGxlcgUEdGhpcwUEdW5pdAkAAgECK09ubHkgY29udHJhY3QgaXRzZWxmIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24BDmlzT3BlcmF0b3JDYWxsAQFpAwkAAAIIBQFpD2NhbGxlclB1YmxpY0tleQUKb3BlcmF0b3JQSwUEdW5pdAkAAgECJE9ubHkgb3BlcmF0b3IgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgEKaXNMYW5kQ2FsbAEBaQMJAAACCAUBaQZjYWxsZXIFDGxlbmRDb250cmFjdAUEdW5pdAkAAgECKU9ubHkgbGFuZCBjb250cmFjdCBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uAQ9pc1NGRmFybWluZ0NhbGwBAWkDCQAAAggFAWkGY2FsbGVyBRFzZkZhcm1pbmdDb250cmFjdAUEdW5pdAkAAgECKU9ubHkgbGFuZCBjb250cmFjdCBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uAQ1nZXRBc3NldFByaWNlAQdhc3NldElkCQERQGV4dHJOYXRpdmUoMTA1MCkCBQ9wcmljZU9yYWNsZUFkZHIJAKwCAgUHYXNzZXRJZAUOa1ByaWNlSW5PcmFjbGUBEGdldEFzc2V0RGVjaW1hbHMBB2Fzc2V0SWQDCQAAAgUHYXNzZXRJZAIFV0FWRVMACAQHJG1hdGNoMAkA7AcBCQDZBAEFB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIFQXNzZXQEBWFzc2V0BQckbWF0Y2gwCAUFYXNzZXQIZGVjaW1hbHMJAAIBAhBDYW4ndCBmaW5kIGFzc2V0ARFnZXRBc3NldFByZWNpc2lvbgEHYXNzZXRJZAkAbAYACgAACQEQZ2V0QXNzZXREZWNpbWFscwEFB2Fzc2V0SWQAAAAABQRET1dOARVnZXRBZG9wdGVkQVBSQnlQZXJpb2QDBnBlcmlvZAphcHJQZXJpb2RzA2FwcgoBA2ZvcgIBYQdhcGVyaW9kBAskdDA1MzUxNTM3MwUBYQQFaW5kZXgIBQskdDA1MzUxNTM3MwJfMQQFZm91bmQIBQskdDA1MzUxNTM3MwJfMgQCZnQJALUJAgUHYXBlcmlvZAIBLQQLJHQwNTQxMDU0NzMJAJQKAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmZ0AAAJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJmdAABBARmcm9tCAULJHQwNTQxMDU0NzMCXzEEAnRvCAULJHQwNTQxMDU0NzMCXzIDBQVmb3VuZAUBYQMDCQBnAgUGcGVyaW9kBQRmcm9tCQBnAgUCdG8FBnBlcmlvZAcJAJQKAgUFaW5kZXgGCQCUCgIJAGQCBQVpbmRleAABBwQLJHQwNTYxMDU2NzYKAAIkbAUTTEVOREVSU19BUFJfUEVSSU9EUwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgAABwoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEDZm9yAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA5CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJBAVpbmRleAgFCyR0MDU2MTA1Njc2Al8xBAVmb3VuZAgFCyR0MDU2MTA1Njc2Al8yAwUFZm91bmQJAGsDCQBoAgkAkQMCBQtMRU5ERVJTX0FQUgUFaW5kZXgFBlNDQUxFOAAHAO0CAAABF2dldFRvdGFsU3VwcGx5QWxsVG9rZW5zAAoBA2ZvcgIBYQd0b2tlbklkBAskdDA1ODY0NTkyMAUBYQQLdG90YWxTdXBwbHkIBQskdDA1ODY0NTkyMAJfMQQOdG90YWxTdXBwbHlVc2QIBQskdDA1ODY0NTkyMAJfMgQRdG90YWxTdXBwbHlVc2RBbGwIBQskdDA1ODY0NTkyMAJfMwQHdFN1cHBseQkBC3ZhbHVlT3JFbHNlAgkAmggCBQxsZW5kQ29udHJhY3QJAKwCAgUQa0xlbmRUb2tlblN1cHBseQUHdG9rZW5JZAAABAphc3NldFByaWNlCQENZ2V0QXNzZXRQcmljZQEFB3Rva2VuSWQEDmFzc2V0UHJlY2lzaW9uCQERZ2V0QXNzZXRQcmVjaXNpb24BBQd0b2tlbklkBAp0U3VwcGx5VXNkCQBrAwUHdFN1cHBseQUKYXNzZXRQcmljZQUOYXNzZXRQcmVjaXNpb24JAJUKAwkAzQgCBQt0b3RhbFN1cHBseQUHdFN1cHBseQkAzQgCBQ50b3RhbFN1cHBseVVzZAUKdFN1cHBseVVzZAkAZAIFEXRvdGFsU3VwcGx5VXNkQWxsBQp0U3VwcGx5VXNkCgACJGwFCWFsbFRva2VucwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJUKAwUDbmlsBQNuaWwAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEDZm9yAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAzMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgERZ2V0VG90YWxTdXBwbHlVc2QBB3Rva2VuSWQEB3RTdXBwbHkJAQt2YWx1ZU9yRWxzZQIJAJoIAgUMbGVuZENvbnRyYWN0CQCsAgIFEGtMZW5kVG9rZW5TdXBwbHkFB3Rva2VuSWQAAAQKYXNzZXRQcmljZQkBDWdldEFzc2V0UHJpY2UBBQd0b2tlbklkBA5hc3NldFByZWNpc2lvbgkBEWdldEFzc2V0UHJlY2lzaW9uAQUHdG9rZW5JZAkAawMFB3RTdXBwbHkFCmFzc2V0UHJpY2UFDmFzc2V0UHJlY2lzaW9uARRjYWxjTmV3VG9rZW5JbnRlcmVzdAIHdG9rZW5JZAt0b3RhbFN1cHBseQMJAGcCBQZoZWlnaHQFC3N0YXJ0SGVpZ2h0AAAEDnJld2FyZFBlckJsb2NrCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIFB3Rva2VuSWQFFGtUb2tlblJld2FyZFBlckJsb2NrBAtvbGRJbnRlcmVzdAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICBQd0b2tlbklkBQ5rVG9rZW5JbnRlcmVzdAQMdXBkYXRlSGVpZ2h0CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIFB3Rva2VuSWQFFGtUb2tlbkludGVyZXN0SGVpZ2h0BAZyZXdhcmQJAGgCCQBlAgUGaGVpZ2h0BQx1cGRhdGVIZWlnaHQFDnJld2FyZFBlckJsb2NrBAhpbnRlcmVzdAMJAGYCBQt0b3RhbFN1cHBseQAACQBrAwUGcmV3YXJkBQZTQ0FMRTgFC3RvdGFsU3VwcGx5AAAJAGQCBQtvbGRJbnRlcmVzdAUIaW50ZXJlc3QBEWNhbGNOZXdMcEludGVyZXN0AQt0b3RhbFN1cHBseQMJAGcCBQZoZWlnaHQFC3N0YXJ0SGVpZ2h0AAAEDnJld2FyZFBlckJsb2NrCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzBRFrTHBSZXdhcmRQZXJCbG9jawQLb2xkSW50ZXJlc3QJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMFC2tMcEludGVyZXN0BAx1cGRhdGVIZWlnaHQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMFEWtMcEludGVyZXN0SGVpZ2h0BAZyZXdhcmQJAGgCCQBlAgUGaGVpZ2h0BQx1cGRhdGVIZWlnaHQFDnJld2FyZFBlckJsb2NrBAhpbnRlcmVzdAMJAGYCBQt0b3RhbFN1cHBseQAACQBrAwUGcmV3YXJkBQZTQ0FMRTgFC3RvdGFsU3VwcGx5AAAJAGQCBQtvbGRJbnRlcmVzdAUIaW50ZXJlc3QBEmNhbGNMZW5kVXNlclJld2FyZAIEdXNlcgd0b2tlbklkBAt0b3RhbFN1cHBseQkBC3ZhbHVlT3JFbHNlAgkAmggCBQxsZW5kQ29udHJhY3QJAKwCAgUQa0xlbmRUb2tlblN1cHBseQUHdG9rZW5JZAAABA10b2tlbkludGVyZXN0CQEUY2FsY05ld1Rva2VuSW50ZXJlc3QCBQd0b2tlbklkBQt0b3RhbFN1cHBseQQKdXNlclN1cHBseQkBC3ZhbHVlT3JFbHNlAgkAmggCBQxsZW5kQ29udHJhY3QJAKwCAgkArAICBQR1c2VyBQ9rTGVuZFVzZXJTdXBwbHkFB3Rva2VuSWQAAAQRdXNlclRva2VuSW50ZXJlc3QJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgUHdG9rZW5JZAIBXwUEdXNlcgURa1VzZXJMZW5kSW50ZXJlc3QDCQAAAgUKdXNlclN1cHBseQAABQ10b2tlbkludGVyZXN0AAAEBnJld2FyZAkAawMFCnVzZXJTdXBwbHkJAGUCBQ10b2tlbkludGVyZXN0BRF1c2VyVG9rZW5JbnRlcmVzdAUGU0NBTEU4CQCVCgMFBnJld2FyZAUNdG9rZW5JbnRlcmVzdAUKdXNlclN1cHBseQEQY2FsY0xwVXNlclJld2FyZAEEdXNlcgQLdG90YWxTdXBwbHkJAQt2YWx1ZU9yRWxzZQIJAJoIAgURc2ZGYXJtaW5nQ29udHJhY3QJAKwCAgUIYXhseVBvb2wFDmtTRlRvdGFsU3VwcGx5AAAEDXRva2VuSW50ZXJlc3QJARFjYWxjTmV3THBJbnRlcmVzdAEFC3RvdGFsU3VwcGx5BAp1c2VyU3VwcGx5CQELdmFsdWVPckVsc2UCCQCaCAIFDGxlbmRDb250cmFjdAkArAICCQCsAgIJAKwCAgUIYXhseVBvb2wCAV8FBHVzZXIFEmtTRlVzZXJUb3RhbFN1cHBseQAABBF1c2VyVG9rZW5JbnRlcmVzdAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHVzZXIFD2tVc2VyTHBJbnRlcmVzdAMJAAACBQp1c2VyU3VwcGx5AAAFDXRva2VuSW50ZXJlc3QAAAQGcmV3YXJkCQBrAwUKdXNlclN1cHBseQkAZQIFDXRva2VuSW50ZXJlc3QFEXVzZXJUb2tlbkludGVyZXN0BQZTQ0FMRTgJAJUKAwUGcmV3YXJkBQ10b2tlbkludGVyZXN0BQp1c2VyU3VwcGx5ARhjbGFpbUxlbmRlclJld2FyZHNDb21tb24CBHVzZXIIcmVhZE9ubHkKAQVjbGFpbQIBYQd0b2tlbklkBAskdDA4NzY0ODgwOAUBYQQIdG9rZW5JZHMIBQskdDA4NzY0ODgwOAJfMQQHY0Ftb3VudAgFCyR0MDg3NjQ4ODA4Al8yBAV0b3RhbAgFCyR0MDg3NjQ4ODA4Al8zBAhlbnRlcmllcwgFCyR0MDg3NjQ4ODA4Al80BBJ1c2VyQXZhaWxhYmxlQ2xhaW0JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgUHdG9rZW5JZAIBXwUEdXNlcgUXa1VzZXJMZW5kQXZhaWxhYmxlQ2xhaW0AAAQLJHQwODkyMTkwMDAJARJjYWxjTGVuZFVzZXJSZXdhcmQCBQR1c2VyBQd0b2tlbklkBAd1UmV3YXJkCAULJHQwODkyMTkwMDACXzEEEG5ld1Rva2VuSW50ZXJlc3QIBQskdDA4OTIxOTAwMAJfMgQKdXNlclN1cHBseQgFCyR0MDg5MjE5MDAwAl8zBAx0b3RhbFRvQ2xhaW0JAGQCBRJ1c2VyQXZhaWxhYmxlQ2xhaW0FB3VSZXdhcmQDAwkAZgIFDHRvdGFsVG9DbGFpbQAABgkAZgIFCnVzZXJTdXBwbHkAAAQMbmV3RW50cmVyaWVzAwMFCHJlYWRPbmx5BgkAAAIFDHRvdGFsVG9DbGFpbQAABQhlbnRlcmllcwkAzggCBQhlbnRlcmllcwkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgUHdG9rZW5JZAIBXwUEdXNlcgURa1VzZXJMZW5kSW50ZXJlc3QFEG5ld1Rva2VuSW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIFB3Rva2VuSWQCAV8FBHVzZXIFF2tVc2VyTGVuZEF2YWlsYWJsZUNsYWltAAAJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUHdG9rZW5JZAUOa1Rva2VuSW50ZXJlc3QFEG5ld1Rva2VuSW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUHdG9rZW5JZAUUa1Rva2VuSW50ZXJlc3RIZWlnaHQFBmhlaWdodAUDbmlsCQCWCgQJAM0IAgUIdG9rZW5JZHMFB3Rva2VuSWQJAM0IAgUHY0Ftb3VudAUMdG90YWxUb0NsYWltCQBkAgUFdG90YWwFDHRvdGFsVG9DbGFpbQUMbmV3RW50cmVyaWVzCQCWCgQFCHRva2VuSWRzBQdjQW1vdW50BQV0b3RhbAUIZW50ZXJpZXMKAAIkbAUJYWxsVG9rZW5zCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlgoEBQNuaWwFA25pbAAABQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBBWNsYWltAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAzMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgEUY2xhaW1McFJld2FyZHNDb21tb24CBHVzZXIIcmVhZE9ubHkEEnVzZXJBdmFpbGFibGVDbGFpbQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHVzZXIFFWtVc2VyTHBBdmFpbGFibGVDbGFpbQAABAskdDA5OTI3OTk5MgkBEGNhbGNMcFVzZXJSZXdhcmQBBQR1c2VyBAd1UmV3YXJkCAULJHQwOTkyNzk5OTICXzEEDW5ld0xwSW50ZXJlc3QIBQskdDA5OTI3OTk5MgJfMgQKdXNlclN1cHBseQgFCyR0MDk5Mjc5OTkyAl8zBAx0b3RhbFRvQ2xhaW0JAGQCBRJ1c2VyQXZhaWxhYmxlQ2xhaW0FB3VSZXdhcmQDAwUIcmVhZE9ubHkGCQAAAgUMdG90YWxUb0NsYWltAAAJAJQKAgUMdG90YWxUb0NsYWltBQNuaWwJAJQKAgUMdG90YWxUb0NsYWltCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHVzZXIFD2tVc2VyTHBJbnRlcmVzdAUNbmV3THBJbnRlcmVzdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQR1c2VyBRVrVXNlckxwQXZhaWxhYmxlQ2xhaW0AAAkAzAgCCQEMSW50ZWdlckVudHJ5AgULa0xwSW50ZXJlc3QFDW5ld0xwSW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIFEWtMcEludGVyZXN0SGVpZ2h0BQZoZWlnaHQFA25pbAENZ2V0VG9rZW5zQVBScwAECWF4bHlQcmljZQkBDWdldEFzc2V0UHJpY2UBBQZheGx5SWQEDWF4bHlQcmVjaXNpb24JARFnZXRBc3NldFByZWNpc2lvbgEFBmF4bHlJZAoBCnRva2Vuc0FwcnMCA2Fwcgd0b2tlbklkBARyd3BiCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUHdG9rZW5JZAUUa1Rva2VuUmV3YXJkUGVyQmxvY2sAAAQHcndwYlVzZAkAawMFBHJ3cGIFCWF4bHlQcmljZQUNYXhseVByZWNpc2lvbgQGcndZZWFyCQBoAgkAaAIFB3J3cGJVc2QFDHBlcmlvZExlbmd0aAA0BA50b3RhbFN1cHBseVVzZAkBEWdldFRvdGFsU3VwcGx5VXNkAQUHdG9rZW5JZAkAzQgCBQNhcHIJAGsDBQZyd1llYXIFBlNDQUxFOAUOdG90YWxTdXBwbHlVc2QEBGFwcnMKAAIkbAUJYWxsVG9rZW5zCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQp0b2tlbnNBcHJzAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAzMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgQNbHBUb3RhbFN1cHBseQkBEUBleHRyTmF0aXZlKDEwNTApAgURc2ZGYXJtaW5nQ29udHJhY3QJAKwCAgUIYXhseVBvb2wFDmtTRlRvdGFsU3VwcGx5BARscElkCQERQGV4dHJOYXRpdmUoMTA1MykCCQERQGV4dHJOYXRpdmUoMTA2MikBBQhheGx5UG9vbAUFa0xwSWQEC2xwUHJlY2lzaW9uCQERZ2V0QXNzZXRQcmVjaXNpb24BBQRscElkBAdscFByaWNlCgABQAkAkQMCCgABQAkA/AcEBQxtYWluQ29udHJhY3QCGmdldFNoYXJlQXNzZXRQcmljZVJFQURPTkxZCQDMCAIJAMwIAgUEbHBJZAUDbmlsBQNuaWwFA25pbAMJAAECBQFAAglMaXN0W0FueV0FAUAJAAIBCQCsAgIJAAMBBQFAAh4gY291bGRuJ3QgYmUgY2FzdCB0byBMaXN0W0FueV0AAAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQEEGxwVG90YWxTdXBwbHlVc2QJAGsDBQ1scFRvdGFsU3VwcGx5BQdscFByaWNlBQtscFByZWNpc2lvbgQEcndwYgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBRFrTHBSZXdhcmRQZXJCbG9jawAABAdyd3BiVXNkCQBrAwUEcndwYgUJYXhseVByaWNlBQ1heGx5UHJlY2lzaW9uBAZyd1llYXIJAGgCCQBoAgUHcndwYlVzZAUMcGVyaW9kTGVuZ3RoADQEBWxwQXByCQBrAwUGcndZZWFyBQZTQ0FMRTgFEGxwVG90YWxTdXBwbHlVc2QJAJUKAwUJYWxsVG9rZW5zBQRhcHJzBQVscEFwcgcBaQESY2xhaW1MZW5kZXJSZXdhcmRzAAQIY2xhaW1SZXMJARhjbGFpbUxlbmRlclJld2FyZHNDb21tb24CCQClCAEIBQFpBmNhbGxlcgcDCQAAAggFCGNsYWltUmVzAl8zAAAJAAIBAiNjbGFpbSBhbW91bnQgbXVzdCBiZSBncmVhdGVyIHRoYW4gMAQDaW52CQD8BwQFDXRva2VuQ29udHJhY3QCEndpdGhkcmF3TGVuZFJld2FyZAkAzAgCCAUIY2xhaW1SZXMCXzMJAMwIAgkApQgBCAUBaQZjYWxsZXIFA25pbAUDbmlsAwkAAAIFA2ludgUDaW52CAUIY2xhaW1SZXMCXzQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEOY2xhaW1McFJld2FyZHMABAhjbGFpbVJlcwkBFGNsYWltTHBSZXdhcmRzQ29tbW9uAgkApQgBCAUBaQZjYWxsZXIHAwkAAAIIBQhjbGFpbVJlcwJfMQAACQACAQIjY2xhaW0gYW1vdW50IG11c3QgYmUgZ3JlYXRlciB0aGFuIDAEA2ludgkA/AcEBQ10b2tlbkNvbnRyYWN0AhB3aXRoZHJhd0xwUmV3YXJkCQDMCAIIBQhjbGFpbVJlcwJfMQkAzAgCCQClCAEIBQFpBmNhbGxlcgUDbmlsBQNuaWwDCQAAAgUDaW52BQNpbnYIBQhjbGFpbVJlcwJfMgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQpsZW5kQWN0aW9uAgR1c2VyB3Rva2VuSWQJAQt2YWx1ZU9yRWxzZQIJAQppc0xhbmRDYWxsAQUBaQQSdXNlckF2YWlsYWJsZUNsYWltCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUHdG9rZW5JZAUXa1VzZXJMZW5kQXZhaWxhYmxlQ2xhaW0AAAQNJHQwMTIzNTQxMjQyMQkBEmNhbGNMZW5kVXNlclJld2FyZAIFBHVzZXIFB3Rva2VuSWQEB3VSZXdhcmQIBQ0kdDAxMjM1NDEyNDIxAl8xBBBuZXdUb2tlbkludGVyZXN0CAUNJHQwMTIzNTQxMjQyMQJfMgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgUEdXNlcgIBXwUHdG9rZW5JZAURa1VzZXJMZW5kSW50ZXJlc3QFEG5ld1Rva2VuSW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIFBHVzZXICAV8FB3Rva2VuSWQFF2tVc2VyTGVuZEF2YWlsYWJsZUNsYWltCQBkAgUSdXNlckF2YWlsYWJsZUNsYWltBQd1UmV3YXJkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFB3Rva2VuSWQFDmtUb2tlbkludGVyZXN0BRBuZXdUb2tlbkludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFB3Rva2VuSWQFFGtUb2tlbkludGVyZXN0SGVpZ2h0BQZoZWlnaHQFA25pbAFpAQhscEFjdGlvbgEEdXNlcgkBC3ZhbHVlT3JFbHNlAgkBD2lzU0ZGYXJtaW5nQ2FsbAEFAWkEEnVzZXJBdmFpbGFibGVDbGFpbQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBRVrVXNlckxwQXZhaWxhYmxlQ2xhaW0AAAQNJHQwMTI4ODYxMjkzOQkBEGNhbGNMcFVzZXJSZXdhcmQBBQR1c2VyBAd1UmV3YXJkCAUNJHQwMTI4ODYxMjkzOQJfMQQNbmV3THBJbnRlcmVzdAgFDSR0MDEyODg2MTI5MzkCXzIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEdXNlcgUPa1VzZXJMcEludGVyZXN0BQ1uZXdMcEludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHVzZXIFFWtVc2VyTHBBdmFpbGFibGVDbGFpbQkAZAIFEnVzZXJBdmFpbGFibGVDbGFpbQUHdVJld2FyZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQR1c2VyBQtrTHBJbnRlcmVzdAUNbmV3THBJbnRlcmVzdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQR1c2VyBRFrTHBJbnRlcmVzdEhlaWdodAUGaGVpZ2h0BQNuaWwBaQEEaW5pdAUUYXhseU1haW5Db250cmFjdEFkZHIZYXhseVRva2Vub21pY0NvbnRyYWN0QWRkcgxheGx5UG9vbEFkZHISZmFybWluZ1N0YXJ0SGVpZ2h0DHBlcmlvZExlbmd0aAkBC3ZhbHVlT3JFbHNlAgkBCmlzU2VsZkNhbGwBBQFpAwkBASEBCQEJaXNEZWZpbmVkAQkApggBBRRheGx5TWFpbkNvbnRyYWN0QWRkcgkAAgECFVdyb25nIGZhcm1pbmcgYWRkcmVzcwMJAQEhAQkBCWlzRGVmaW5lZAEJAKYIAQUZYXhseVRva2Vub21pY0NvbnRyYWN0QWRkcgkAAgECG1dyb25nIG1haW4gY29udHJhY3QgYWRkcmVzcwkAzAgCCQELU3RyaW5nRW50cnkCBRFrQXhseU1haW5Db250cmFjdAUUYXhseU1haW5Db250cmFjdEFkZHIJAMwIAgkBC1N0cmluZ0VudHJ5AgUWa0F4bHlUb2tlbm9taWNDb250cmFjdAUZYXhseVRva2Vub21pY0NvbnRyYWN0QWRkcgkAzAgCCQELU3RyaW5nRW50cnkCBQlrQXhseVBvb2wFDGF4bHlQb29sQWRkcgkAzAgCCQEMSW50ZWdlckVudHJ5AgUMa1N0YXJ0SGVpZ2h0BRJmYXJtaW5nU3RhcnRIZWlnaHQJAMwIAgkBDEludGVnZXJFbnRyeQIFDWtQZXJpb2RMZW5ndGgFDHBlcmlvZExlbmd0aAUDbmlsAWkBDGluaXROZXdUb2tlbgEHdG9rZW5JZAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMJAQlpc0RlZmluZWQBCQCaCAIFBHRoaXMJAKwCAgUHdG9rZW5JZAUOa1Rva2VuSW50ZXJlc3QJAAIBAhR0b2tlbiBhbHJlYWR5IGluaXRlZAMJAQEhAQkBCGNvbnRhaW5zAgkBEUBleHRyTmF0aXZlKDEwNTMpAgUMbGVuZENvbnRyYWN0BRBrTGVuZFNldHVwVG9rZW5zBQd0b2tlbklkCQACAQITbm8gdG9rZW4gb24gbGFuZGluZwQMbmV3QWxsVG9rZW5zAwkAAAIJAJADAQUJYWxsVG9rZW5zAAAJAMwIAgUHdG9rZW5JZAUDbmlsCQDNCAIFCWFsbFRva2VucwUHdG9rZW5JZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQd0b2tlbklkBQ5rVG9rZW5JbnRlcmVzdAAACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFB3Rva2VuSWQFFGtUb2tlbkludGVyZXN0SGVpZ2h0CQCWAwEJAMwIAgULc3RhcnRIZWlnaHQJAMwIAgUGaGVpZ2h0BQNuaWwJAMwIAgkBC1N0cmluZ0VudHJ5AgUHa1Rva2VucwkAuQkCBQxuZXdBbGxUb2tlbnMCASwJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUHdG9rZW5JZAUUa1Rva2VuUmV3YXJkUGVyQmxvY2sAAAUDbmlsAWkBDXVwZGF0ZVJld2FyZHMACQELdmFsdWVPckVsc2UCCQEOaXNPcGVyYXRvckNhbGwBBQFpBBBsYXN0VXBkYXRlSGVpZ2h0CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFE2tSZXdhcmRVcGRhdGVIZWlnaHQAAAMJAGYCCQBkAgUQbGFzdFVwZGF0ZUhlaWdodAUMcGVyaW9kTGVuZ3RoBQZoZWlnaHQJAAIBAiVyZXdhcmRzIGFscmVkeSB1cGRhdGVkIGluIHRoaXMgcGVyaW9kBA0kdDAxNDc0NjE0ODI2CQEXZ2V0VG90YWxTdXBwbHlBbGxUb2tlbnMABAt0b3RhbFN1cHBseQgFDSR0MDE0NzQ2MTQ4MjYCXzEEDnRvdGFsU3VwcGx5VXNkCAUNJHQwMTQ3NDYxNDgyNgJfMgQRdG90YWxTdXBwbHlVc2RBbGwIBQ0kdDAxNDc0NjE0ODI2Al8zBAlheGx5UHJpY2UJAQ1nZXRBc3NldFByaWNlAQUGYXhseUlkBA1heGx5UHJlY2lzaW9uCQERZ2V0QXNzZXRQcmVjaXNpb24BBQZheGx5SWQEBm1heEFQUgkBFWdldEFkb3B0ZWRBUFJCeVBlcmlvZAMFCWN1clBlcmlvZAUTTEVOREVSU19BUFJfUEVSSU9EUwULTEVOREVSU19BUFIKAQx1cGRhdGVSZXdhcmQCAWEHdG9rZW5JZAQNJHQwMTUwNzAxNTA5NQUBYQQIZW50ZXJpZXMIBQ0kdDAxNTA3MDE1MDk1Al8xBAVpbmRleAgFDSR0MDE1MDcwMTUwOTUCXzIDCQAAAgkAkQMCBQt0b3RhbFN1cHBseQUFaW5kZXgAAAkAlAoCCQDOCAIFCGVudGVyaWVzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFB3Rva2VuSWQFFGtUb2tlblJld2FyZFBlckJsb2NrAAAJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUHdG9rZW5JZAUOa1Rva2VuSW50ZXJlc3QJARRjYWxjTmV3VG9rZW5JbnRlcmVzdAIFB3Rva2VuSWQJAJEDAgULdG90YWxTdXBwbHkFBWluZGV4CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFB3Rva2VuSWQFFGtUb2tlbkludGVyZXN0SGVpZ2h0BQZoZWlnaHQFA25pbAkAZAIFBWluZGV4AAEEBXNoYXJlCQBrAwkAkQMCBQ50b3RhbFN1cHBseVVzZAUFaW5kZXgFBlNDQUxFOAURdG90YWxTdXBwbHlVc2RBbGwECW1heFJld2FyZAkAawMFBXNoYXJlBRNsZW5kTWF4UGVyaW9kQW1vdW50BQZTQ0FMRTgEDG1heFJld2FyZFVzZAkAawMFCW1heFJld2FyZAUJYXhseVByaWNlBQ1heGx5UHJlY2lzaW9uBA9wcmV2VG90YWxTdXBwbHkJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUUa1ByZXZMZW5kVG9rZW5TdXBwbHkAAAQGcnRDb2VmAwMJAAACBQ9wcmV2VG90YWxTdXBwbHkAAAYJAAACCQCRAwIFC3RvdGFsU3VwcGx5BQVpbmRleAAAAAAJAGsDBQ9wcmV2VG90YWxTdXBwbHkFBlNDQUxFOAkAkQMCBQt0b3RhbFN1cHBseQUFaW5kZXgEBnJld2FyZAkAaQIJAJcDAQkAzAgCCQBoAgUGbWF4QVBSCQBkAgUGU0NBTEU4BQZydENvZWYJAMwIAgkAawMFBm1heEFQUgkAaAIADwUGU0NBTEU4AAoFA25pbAUGU0NBTEU4BAlyZXdhcmRVc2QJAJcDAQkAzAgCBQxtYXhSZXdhcmRVc2QJAMwIAgkAawMJAJEDAgUOdG90YWxTdXBwbHlVc2QFBWluZGV4BQZyZXdhcmQFBlNDQUxFOAUDbmlsBAxyZXdhcmRQZXJpb2QJAGsDBQlyZXdhcmRVc2QFCWF4bHlQcmljZQUNYXhseVByZWNpc2lvbgQOcmV3YXJkUGVyQmxvY2sJAGkCBQxyZXdhcmRQZXJpb2QFDHBlcmlvZExlbmd0aAkAlAoCCQDOCAIFCGVudGVyaWVzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFB3Rva2VuSWQFFGtQcmV2TGVuZFRva2VuU3VwcGx5CQCRAwIFC3RvdGFsU3VwcGx5BQVpbmRleAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQd0b2tlbklkBRRrVG9rZW5SZXdhcmRQZXJCbG9jawUOcmV3YXJkUGVyQmxvY2sJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUHdG9rZW5JZAUOa1Rva2VuSW50ZXJlc3QJARRjYWxjTmV3VG9rZW5JbnRlcmVzdAIFB3Rva2VuSWQJAJEDAgULdG90YWxTdXBwbHkFBWluZGV4CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFB3Rva2VuSWQFFGtUb2tlbkludGVyZXN0SGVpZ2h0BQZoZWlnaHQFA25pbAkAZAIFBWluZGV4AAEEDSR0MDE2NTY2MTY2MzgKAAIkbAUJYWxsVG9rZW5zCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBQNuaWwAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEMdXBkYXRlUmV3YXJkAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAzMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgQOdG9rZW5zRW50ZXJpZXMIBQ0kdDAxNjU2NjE2NjM4Al8xBAVpbmRleAgFDSR0MDE2NTY2MTY2MzgCXzIECGxwTWF4QVBSCQEVZ2V0QWRvcHRlZEFQUkJ5UGVyaW9kAwUJY3VyUGVyaW9kBQ5MUF9BUFJfUEVSSU9EUwUGTFBfQVBSBA1scFRvdGFsU3VwcGx5CQERQGV4dHJOYXRpdmUoMTA1MCkCBRFzZkZhcm1pbmdDb250cmFjdAkArAICBQhheGx5UG9vbAUOa1NGVG90YWxTdXBwbHkEC3ByZUxQU3VwcGx5CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFDWtQcmV2TFBTdXBwbHkAAAQEbHBJZAkBEUBleHRyTmF0aXZlKDEwNTMpAgkBEUBleHRyTmF0aXZlKDEwNjIpAQUIYXhseVBvb2wFBWtMcElkBAtscFByZWNpc2lvbgkBEWdldEFzc2V0UHJlY2lzaW9uAQUEbHBJZAQHbHBQcmljZQoAAUAJAJEDAgoAAUAJAPwHBAUMbWFpbkNvbnRyYWN0AhpnZXRTaGFyZUFzc2V0UHJpY2VSRUFET05MWQkAzAgCCQDMCAIFBGxwSWQFA25pbAUDbmlsBQNuaWwDCQABAgUBQAIJTGlzdFtBbnldBQFACQACAQkArAICCQADAQUBQAIeIGNvdWxkbid0IGJlIGNhc3QgdG8gTGlzdFtBbnldAAADCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50BBBscFRvdGFsU3VwcGx5VXNkCQBrAwUNbHBUb3RhbFN1cHBseQUHbHBQcmljZQULbHBQcmVjaXNpb24EDm1heExQUmV3YXJkVXNkCQBrAwURbHBNYXhQZXJpb2RBbW91bnQFCWF4bHlQcmljZQUNYXhseVByZWNpc2lvbgQIcnRMUENvZWYDAwkAAAIFC3ByZUxQU3VwcGx5AAAGCQAAAgUNbHBUb3RhbFN1cHBseQAAAAAJAGsDBQtwcmVMUFN1cHBseQUGU0NBTEU4BQ1scFRvdGFsU3VwcGx5BAhyZXdhcmRMcAkAaQIJAJcDAQkAzAgCCQBoAgUIbHBNYXhBUFIJAGQCBQZTQ0FMRTgFCHJ0TFBDb2VmCQDMCAIJAGsDBQhscE1heEFQUgkAaAIADwUGU0NBTEU4AAoFA25pbAUGU0NBTEU4BAtyZXdhcmRMcFVzZAkAlwMBCQDMCAIFDm1heExQUmV3YXJkVXNkCQDMCAIJAGsDBRBscFRvdGFsU3VwcGx5VXNkBQhyZXdhcmRMcAUGU0NBTEU4BQNuaWwEDnJld2FyZExwUGVyaW9kCQBrAwULcmV3YXJkTHBVc2QFCWF4bHlQcmljZQUNYXhseVByZWNpc2lvbgQQcmV3YXJkTHBQZXJCbG9jawkAaQIFDnJld2FyZExwUGVyaW9kBQxwZXJpb2RMZW5ndGgECmxwRW50ZXJpZXMJAMwIAgkBDEludGVnZXJFbnRyeQIFDWtQcmV2TFBTdXBwbHkFDWxwVG90YWxTdXBwbHkJAMwIAgkBDEludGVnZXJFbnRyeQIFEWtMcFJld2FyZFBlckJsb2NrBRByZXdhcmRMcFBlckJsb2NrCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQtrTHBJbnRlcmVzdAkBEWNhbGNOZXdMcEludGVyZXN0AQUNbHBUb3RhbFN1cHBseQkAzAgCCQEMSW50ZWdlckVudHJ5AgURa0xwSW50ZXJlc3RIZWlnaHQFBmhlaWdodAUDbmlsCQDNCAIJAM4IAgUKbHBFbnRlcmllcwUOdG9rZW5zRW50ZXJpZXMJAQxJbnRlZ2VyRW50cnkCBRNrUmV3YXJkVXBkYXRlSGVpZ2h0BQZoZWlnaHQBAnR4AQZ2ZXJpZnkABBNtdWx0aVNpZ25lZEJ5QWRtaW5zBBJhZG1pblB1YktleTFTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQhhZG1pbjFQSwABAAAEEmFkbWluUHViS2V5MlNpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAEFCGFkbWluMlBLAAEAAAQSYWRtaW5QdWJLZXkzU2lnbmVkAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAgUIYWRtaW4zUEsAAQAACQBnAgkAZAIJAGQCBRJhZG1pblB1YktleTFTaWduZWQFEmFkbWluUHViS2V5MlNpZ25lZAUSYWRtaW5QdWJLZXkzU2lnbmVkAAIEByRtYXRjaDAFAnR4AwkAAQIFByRtYXRjaDACF0ludm9rZVNjcmlwdFRyYW5zYWN0aW9uBANpbnYFByRtYXRjaDAEBmlzU2VsZgkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAgFAnR4D3NlbmRlclB1YmxpY0tleQQKaXNSaWdodEZlZQMJAAACCAUDaW52A2ZlZQCg9zYJAAACCAUDaW52CmZlZUFzc2V0SWQFBHVuaXQHBAppc0luaXRDYWxsCQAAAggFA2ludghmdW5jdGlvbgIEaW5pdAQMaXNub1BheW1lbnRzCQAAAgkAkAMBCAUDaW52CHBheW1lbnRzAAADAwMDBQppc1JpZ2h0RmVlBQppc0luaXRDYWxsBwUGaXNTZWxmBwUMaXNub1BheW1lbnRzBwYFE211bHRpU2lnbmVkQnlBZG1pbnMFE211bHRpU2lnbmVkQnlBZG1pbnOU/7hh", "height": 2714536, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: HPd3puN7tEcmzDUKnvuojKqwJ42wuyfm9xUkHuGPHmjT Next: A2SapnPHH4MQ9YHSLWFDqkyu5oAnJSDgs5bP9WNFq6jT 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 = ((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 let allTokens = split(valueOrElse(getString(this, kTokens), ""), ",")
129129
130130 func isAdminCall (i) = if (containsElement([admin1PK, admin2PK, admin3PK], i.callerPublicKey))
131131 then unit
132132 else throw("Only admin group1 can call this function")
133133
134134
135135 func isSelfCall (i) = if ((i.caller == this))
136136 then unit
137137 else throw("Only contract itself can call this function")
138138
139139
140140 func isOperatorCall (i) = if ((i.callerPublicKey == operatorPK))
141141 then unit
142142 else throw("Only operator can call this function")
143143
144144
145145 func isLandCall (i) = if ((i.caller == lendContract))
146146 then unit
147147 else throw("Only land contract can call this function")
148148
149149
150150 func isSFFarmingCall (i) = if ((i.caller == sfFarmingContract))
151151 then unit
152152 else throw("Only land contract can call this function")
153153
154154
155155 func getAssetPrice (assetId) = getIntegerValue(priceOracleAddr, (assetId + kPriceInOracle))
156156
157157
158158 func getAssetDecimals (assetId) = if ((assetId == "WAVES"))
159159 then 8
160160 else match assetInfo(fromBase58String(assetId)) {
161161 case asset: Asset =>
162162 asset.decimals
163163 case _ =>
164164 throw("Can't find asset")
165165 }
166166
167167
168168 func getAssetPrecision (assetId) = pow(10, 0, getAssetDecimals(assetId), 0, 0, DOWN)
169169
170170
171171 func getAdoptedAPRByPeriod (period,aprPeriods,apr) = {
172172 func for (a,aperiod) = {
173173 let $t053515373 = a
174174 let index = $t053515373._1
175175 let found = $t053515373._2
176176 let ft = split(aperiod, "-")
177177 let $t054105473 = $Tuple2(parseIntValue(ft[0]), parseIntValue(ft[1]))
178178 let from = $t054105473._1
179179 let to = $t054105473._2
180180 if (found)
181181 then a
182182 else if (if ((period >= from))
183183 then (to >= period)
184184 else false)
185185 then $Tuple2(index, true)
186186 else $Tuple2((index + 1), false)
187187 }
188188
189189 let $t056105676 = {
190190 let $l = LENDERS_APR_PERIODS
191191 let $s = size($l)
192192 let $acc0 = $Tuple2(0, false)
193193 func $f0_1 ($a,$i) = if (($i >= $s))
194194 then $a
195195 else for($a, $l[$i])
196196
197197 func $f0_2 ($a,$i) = if (($i >= $s))
198198 then $a
199199 else throw("List size exceeds 9")
200200
201201 $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)
202202 }
203203 let index = $t056105676._1
204204 let found = $t056105676._2
205205 if (found)
206206 then fraction((LENDERS_APR[index] * SCALE8), 7, 365)
207207 else 0
208208 }
209209
210210
211211 func getTotalSupplyAllTokens () = {
212212 func for (a,tokenId) = {
213213 let $t058645920 = a
214214 let totalSupply = $t058645920._1
215215 let totalSupplyUsd = $t058645920._2
216216 let totalSupplyUsdAll = $t058645920._3
217217 let tSupply = valueOrElse(getInteger(lendContract, (kLendTokenSupply + tokenId)), 0)
218218 let assetPrice = getAssetPrice(tokenId)
219219 let assetPrecision = getAssetPrecision(tokenId)
220220 let tSupplyUsd = fraction(tSupply, assetPrice, assetPrecision)
221221 $Tuple3((totalSupply :+ tSupply), (totalSupplyUsd :+ tSupplyUsd), (totalSupplyUsdAll + tSupplyUsd))
222222 }
223223
224224 let $l = allTokens
225225 let $s = size($l)
226226 let $acc0 = $Tuple3(nil, nil, 0)
227227 func $f0_1 ($a,$i) = if (($i >= $s))
228228 then $a
229229 else for($a, $l[$i])
230230
231231 func $f0_2 ($a,$i) = if (($i >= $s))
232232 then $a
233233 else throw("List size exceeds 30")
234234
235235 $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)
236236 }
237237
238238
239239 func getTotalSupplyUsd (tokenId) = {
240240 let tSupply = valueOrElse(getInteger(lendContract, (kLendTokenSupply + tokenId)), 0)
241241 let assetPrice = getAssetPrice(tokenId)
242242 let assetPrecision = getAssetPrecision(tokenId)
243243 fraction(tSupply, assetPrice, assetPrecision)
244244 }
245245
246246
247247 func calcNewTokenInterest (tokenId,totalSupply) = if ((height >= startHeight))
248248 then 0
249249 else {
250250 let rewardPerBlock = getIntegerValue(this, (tokenId + kTokenRewardPerBlock))
251251 let oldInterest = getIntegerValue(this, (tokenId + kTokenInterest))
252252 let updateHeight = getIntegerValue(this, (tokenId + kTokenInterestHeight))
253253 let reward = ((height - updateHeight) * rewardPerBlock)
254254 let interest = if ((totalSupply > 0))
255255 then fraction(reward, SCALE8, totalSupply)
256256 else 0
257257 (oldInterest + interest)
258258 }
259259
260260
261261 func calcNewLpInterest (totalSupply) = if ((height >= startHeight))
262262 then 0
263263 else {
264264 let rewardPerBlock = getIntegerValue(this, kLpRewardPerBlock)
265265 let oldInterest = getIntegerValue(this, kLpInterest)
266266 let updateHeight = getIntegerValue(this, kLpInterestHeight)
267267 let reward = ((height - updateHeight) * rewardPerBlock)
268268 let interest = if ((totalSupply > 0))
269269 then fraction(reward, SCALE8, totalSupply)
270270 else 0
271271 (oldInterest + interest)
272272 }
273273
274274
275275 func calcLendUserReward (user,tokenId) = {
276276 let totalSupply = valueOrElse(getInteger(lendContract, (kLendTokenSupply + tokenId)), 0)
277277 let tokenInterest = calcNewTokenInterest(tokenId, totalSupply)
278278 let userSupply = valueOrElse(getInteger(lendContract, ((user + kLendUserSupply) + tokenId)), 0)
279279 let userTokenInterest = valueOrElse(getInteger(this, (((tokenId + "_") + user) + kUserLendInterest)), if ((userSupply == 0))
280280 then tokenInterest
281281 else 0)
282282 let reward = fraction(userSupply, (tokenInterest - userTokenInterest), SCALE8)
283283 $Tuple3(reward, tokenInterest, userSupply)
284284 }
285285
286286
287287 func calcLpUserReward (user) = {
288288 let totalSupply = valueOrElse(getInteger(sfFarmingContract, (axlyPool + kSFTotalSupply)), 0)
289289 let tokenInterest = calcNewLpInterest(totalSupply)
290290 let userSupply = valueOrElse(getInteger(lendContract, (((axlyPool + "_") + user) + kSFUserTotalSupply)), 0)
291291 let userTokenInterest = valueOrElse(getInteger(this, (user + kUserLpInterest)), if ((userSupply == 0))
292292 then tokenInterest
293293 else 0)
294294 let reward = fraction(userSupply, (tokenInterest - userTokenInterest), SCALE8)
295295 $Tuple3(reward, tokenInterest, userSupply)
296296 }
297297
298298
299299 func claimLenderRewardsCommon (user,readOnly) = {
300300 func claim (a,tokenId) = {
301301 let $t087648808 = a
302302 let tokenIds = $t087648808._1
303303 let cAmount = $t087648808._2
304304 let total = $t087648808._3
305305 let enteries = $t087648808._4
306306 let userAvailableClaim = valueOrElse(getInteger(this, (((tokenId + "_") + user) + kUserLendAvailableClaim)), 0)
307307 let $t089219000 = calcLendUserReward(user, tokenId)
308308 let uReward = $t089219000._1
309309 let newTokenInterest = $t089219000._2
310310 let userSupply = $t089219000._3
311311 let totalToClaim = (userAvailableClaim + uReward)
312312 if (if ((totalToClaim > 0))
313313 then true
314314 else (userSupply > 0))
315315 then {
316316 let newEntreries = if (if (readOnly)
317317 then true
318318 else (totalToClaim == 0))
319319 then enteries
320320 else (enteries ++ [IntegerEntry((((tokenId + "_") + user) + kUserLendInterest), newTokenInterest), IntegerEntry((((tokenId + "_") + user) + kUserLendAvailableClaim), 0), IntegerEntry((tokenId + kTokenInterest), newTokenInterest), IntegerEntry((tokenId + kTokenInterestHeight), height)])
321321 $Tuple4((tokenIds :+ tokenId), (cAmount :+ totalToClaim), (total + totalToClaim), newEntreries)
322322 }
323323 else $Tuple4(tokenIds, cAmount, total, enteries)
324324 }
325325
326326 let $l = allTokens
327327 let $s = size($l)
328328 let $acc0 = $Tuple4(nil, nil, 0, nil)
329329 func $f0_1 ($a,$i) = if (($i >= $s))
330330 then $a
331331 else claim($a, $l[$i])
332332
333333 func $f0_2 ($a,$i) = if (($i >= $s))
334334 then $a
335335 else throw("List size exceeds 30")
336336
337337 $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)
338338 }
339339
340340
341341 func claimLpRewardsCommon (user,readOnly) = {
342342 let userAvailableClaim = valueOrElse(getInteger(this, (user + kUserLpAvailableClaim)), 0)
343343 let $t099279992 = calcLpUserReward(user)
344344 let uReward = $t099279992._1
345345 let newLpInterest = $t099279992._2
346346 let userSupply = $t099279992._3
347347 let totalToClaim = (userAvailableClaim + uReward)
348348 if (if (readOnly)
349349 then true
350350 else (totalToClaim == 0))
351351 then $Tuple2(totalToClaim, nil)
352352 else $Tuple2(totalToClaim, [IntegerEntry((user + kUserLpInterest), newLpInterest), IntegerEntry((user + kUserLpAvailableClaim), 0), IntegerEntry(kLpInterest, newLpInterest), IntegerEntry(kLpInterestHeight, height)])
353353 }
354354
355355
356356 func getTokensAPRs () = {
357357 let axlyPrice = getAssetPrice(axlyId)
358358 let axlyPrecision = getAssetPrecision(axlyId)
359359 func tokensAprs (apr,tokenId) = {
360360 let rwpb = valueOrElse(getInteger(this, (tokenId + kTokenRewardPerBlock)), 0)
361361 let rwpbUsd = fraction(rwpb, axlyPrice, axlyPrecision)
362362 let rwYear = ((rwpbUsd * periodLength) * 52)
363363 let totalSupplyUsd = getTotalSupplyUsd(tokenId)
364364 (apr :+ fraction(rwYear, SCALE8, totalSupplyUsd))
365365 }
366366
367367 let aprs = {
368368 let $l = allTokens
369369 let $s = size($l)
370370 let $acc0 = nil
371371 func $f0_1 ($a,$i) = if (($i >= $s))
372372 then $a
373373 else tokensAprs($a, $l[$i])
374374
375375 func $f0_2 ($a,$i) = if (($i >= $s))
376376 then $a
377377 else throw("List size exceeds 30")
378378
379379 $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)
380380 }
381381 let lpTotalSupply = getIntegerValue(sfFarmingContract, (axlyPool + kSFTotalSupply))
382382 let lpId = getStringValue(addressFromStringValue(axlyPool), kLpId)
383383 let lpPrecision = getAssetPrecision(lpId)
384384 let lpPrice = {
385385 let @ = ({
386386 let @ = invoke(mainContract, "getShareAssetPriceREADONLY", [[lpId]], nil)
387387 if ($isInstanceOf(@, "List[Any]"))
388388 then @
389389 else throw(($getType(@) + " couldn't be cast to List[Any]"))
390390 })[0]
391391 if ($isInstanceOf(@, "Int"))
392392 then @
393393 else throw(($getType(@) + " couldn't be cast to Int"))
394394 }
395395 let lpTotalSupplyUsd = fraction(lpTotalSupply, lpPrice, lpPrecision)
396396 let rwpb = valueOrElse(getInteger(this, kLpRewardPerBlock), 0)
397397 let rwpbUsd = fraction(rwpb, axlyPrice, axlyPrecision)
398398 let rwYear = ((rwpbUsd * periodLength) * 52)
399399 let lpApr = fraction(rwYear, SCALE8, lpTotalSupplyUsd)
400400 $Tuple3(allTokens, aprs, lpApr)
401401 }
402402
403403
404404 @Callable(i)
405405 func claimLenderRewards () = {
406406 let claimRes = claimLenderRewardsCommon(toString(i.caller), false)
407407 if ((claimRes._3 == 0))
408408 then throw("claim amount must be greater than 0")
409409 else {
410410 let inv = invoke(tokenContract, "withdrawLendReward", [claimRes._3, toString(i.caller)], nil)
411411 if ((inv == inv))
412412 then claimRes._4
413413 else throw("Strict value is not equal to itself.")
414414 }
415415 }
416416
417417
418418
419419 @Callable(i)
420420 func claimLpRewards () = {
421421 let claimRes = claimLpRewardsCommon(toString(i.caller), false)
422422 if ((claimRes._1 == 0))
423423 then throw("claim amount must be greater than 0")
424424 else {
425425 let inv = invoke(tokenContract, "withdrawLpReward", [claimRes._1, toString(i.caller)], nil)
426426 if ((inv == inv))
427427 then claimRes._2
428428 else throw("Strict value is not equal to itself.")
429429 }
430430 }
431431
432432
433433
434434 @Callable(i)
435435 func lendAction (user,tokenId) = valueOrElse(isLandCall(i), {
436436 let userAvailableClaim = valueOrElse(getInteger(this, (tokenId + kUserLendAvailableClaim)), 0)
437437 let $t01235412421 = calcLendUserReward(user, tokenId)
438438 let uReward = $t01235412421._1
439439 let newTokenInterest = $t01235412421._2
440440 [IntegerEntry((((user + "_") + tokenId) + kUserLendInterest), newTokenInterest), IntegerEntry((((user + "_") + tokenId) + kUserLendAvailableClaim), (userAvailableClaim + uReward)), IntegerEntry((tokenId + kTokenInterest), newTokenInterest), IntegerEntry((tokenId + kTokenInterestHeight), height)]
441441 })
442442
443443
444444
445445 @Callable(i)
446446 func lpAction (user) = valueOrElse(isSFFarmingCall(i), {
447447 let userAvailableClaim = valueOrElse(getInteger(this, kUserLpAvailableClaim), 0)
448448 let $t01288612939 = calcLpUserReward(user)
449449 let uReward = $t01288612939._1
450450 let newLpInterest = $t01288612939._2
451451 [IntegerEntry((user + kUserLpInterest), newLpInterest), IntegerEntry((user + kUserLpAvailableClaim), (userAvailableClaim + uReward)), IntegerEntry((user + kLpInterest), newLpInterest), IntegerEntry((user + kLpInterestHeight), height)]
452452 })
453453
454454
455455
456456 @Callable(i)
457457 func init (axlyMainContractAddr,axlyTokenomicContractAddr,axlyPoolAddr,farmingStartHeight,periodLength) = valueOrElse(isSelfCall(i), if (!(isDefined(addressFromString(axlyMainContractAddr))))
458458 then throw("Wrong farming address")
459459 else if (!(isDefined(addressFromString(axlyTokenomicContractAddr))))
460460 then throw("Wrong main contract address")
461461 else [StringEntry(kAxlyMainContract, axlyMainContractAddr), StringEntry(kAxlyTokenomicContract, axlyTokenomicContractAddr), StringEntry(kAxlyPool, axlyPoolAddr), IntegerEntry(kStartHeight, farmingStartHeight), IntegerEntry(kPeriodLength, periodLength)])
462462
463463
464464
465465 @Callable(i)
466466 func initNewToken (tokenId) = valueOrElse(isAdminCall(i), if (isDefined(getInteger(this, (tokenId + kTokenInterest))))
467467 then throw("token already inited")
468468 else if (!(contains(getStringValue(lendContract, kLendSetupTokens), tokenId)))
469469 then throw("no token on landing")
470470 else {
471471 let newAllTokens = if ((size(allTokens) == 0))
472472 then [tokenId]
473473 else (allTokens :+ tokenId)
474474 [IntegerEntry((tokenId + kTokenInterest), 0), IntegerEntry((tokenId + kTokenInterestHeight), max([startHeight, height])), StringEntry(kTokens, makeString(newAllTokens, ",")), IntegerEntry((tokenId + kTokenRewardPerBlock), 0)]
475475 })
476476
477477
478478
479479 @Callable(i)
480480 func updateRewards () = valueOrElse(isOperatorCall(i), {
481481 let lastUpdateHeight = valueOrElse(getInteger(this, kRewardUpdateHeight), 0)
482482 if (((lastUpdateHeight + periodLength) > height))
483483 then throw("rewards alredy updated in this period")
484484 else {
485485 let $t01474614826 = getTotalSupplyAllTokens()
486486 let totalSupply = $t01474614826._1
487487 let totalSupplyUsd = $t01474614826._2
488488 let totalSupplyUsdAll = $t01474614826._3
489489 let axlyPrice = getAssetPrice(axlyId)
490490 let axlyPrecision = getAssetPrecision(axlyId)
491491 let maxAPR = getAdoptedAPRByPeriod(curPeriod, LENDERS_APR_PERIODS, LENDERS_APR)
492492 func updateReward (a,tokenId) = {
493493 let $t01507015095 = a
494494 let enteries = $t01507015095._1
495495 let index = $t01507015095._2
496496 if ((totalSupply[index] == 0))
497497 then $Tuple2((enteries ++ [IntegerEntry((tokenId + kTokenRewardPerBlock), 0), IntegerEntry((tokenId + kTokenInterest), calcNewTokenInterest(tokenId, totalSupply[index])), IntegerEntry((tokenId + kTokenInterestHeight), height)]), (index + 1))
498498 else {
499499 let share = fraction(totalSupplyUsd[index], SCALE8, totalSupplyUsdAll)
500500 let maxReward = fraction(share, lendMaxPeriodAmount, SCALE8)
501501 let maxRewardUsd = fraction(maxReward, axlyPrice, axlyPrecision)
502502 let prevTotalSupply = valueOrElse(getInteger(this, kPrevLendTokenSupply), 0)
503503 let rtCoef = if (if ((prevTotalSupply == 0))
504504 then true
505505 else (totalSupply[index] == 0))
506506 then 0
507507 else fraction(prevTotalSupply, SCALE8, totalSupply[index])
508508 let reward = (min([(maxAPR * (SCALE8 + rtCoef)), fraction(maxAPR, (15 * SCALE8), 10)]) / SCALE8)
509509 let rewardUsd = min([maxRewardUsd, fraction(totalSupplyUsd[index], reward, SCALE8)])
510510 let rewardPeriod = fraction(rewardUsd, axlyPrice, axlyPrecision)
511511 let rewardPerBlock = (rewardPeriod / periodLength)
512512 $Tuple2((enteries ++ [IntegerEntry((tokenId + kPrevLendTokenSupply), totalSupply[index]), IntegerEntry((tokenId + kTokenRewardPerBlock), rewardPerBlock), IntegerEntry((tokenId + kTokenInterest), calcNewTokenInterest(tokenId, totalSupply[index])), IntegerEntry((tokenId + kTokenInterestHeight), height)]), (index + 1))
513513 }
514514 }
515515
516516 let $t01656616638 = {
517517 let $l = allTokens
518518 let $s = size($l)
519519 let $acc0 = $Tuple2(nil, 0)
520520 func $f0_1 ($a,$i) = if (($i >= $s))
521521 then $a
522522 else updateReward($a, $l[$i])
523523
524524 func $f0_2 ($a,$i) = if (($i >= $s))
525525 then $a
526526 else throw("List size exceeds 30")
527527
528528 $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)
529529 }
530530 let tokensEnteries = $t01656616638._1
531531 let index = $t01656616638._2
532532 let lpMaxAPR = getAdoptedAPRByPeriod(curPeriod, LP_APR_PERIODS, LP_APR)
533533 let lpTotalSupply = getIntegerValue(sfFarmingContract, (axlyPool + kSFTotalSupply))
534534 let preLPSupply = valueOrElse(getInteger(this, kPrevLPSupply), 0)
535535 let lpId = getStringValue(addressFromStringValue(axlyPool), kLpId)
536536 let lpPrecision = getAssetPrecision(lpId)
537537 let lpPrice = {
538538 let @ = ({
539539 let @ = invoke(mainContract, "getShareAssetPriceREADONLY", [[lpId]], nil)
540540 if ($isInstanceOf(@, "List[Any]"))
541541 then @
542542 else throw(($getType(@) + " couldn't be cast to List[Any]"))
543543 })[0]
544544 if ($isInstanceOf(@, "Int"))
545545 then @
546546 else throw(($getType(@) + " couldn't be cast to Int"))
547547 }
548548 let lpTotalSupplyUsd = fraction(lpTotalSupply, lpPrice, lpPrecision)
549549 let maxLPRewardUsd = fraction(lpMaxPeriodAmount, axlyPrice, axlyPrecision)
550550 let rtLPCoef = if (if ((preLPSupply == 0))
551551 then true
552552 else (lpTotalSupply == 0))
553553 then 0
554554 else fraction(preLPSupply, SCALE8, lpTotalSupply)
555555 let rewardLp = (min([(lpMaxAPR * (SCALE8 + rtLPCoef)), fraction(lpMaxAPR, (15 * SCALE8), 10)]) / SCALE8)
556556 let rewardLpUsd = min([maxLPRewardUsd, fraction(lpTotalSupplyUsd, rewardLp, SCALE8)])
557557 let rewardLpPeriod = fraction(rewardLpUsd, axlyPrice, axlyPrecision)
558558 let rewardLpPerBlock = (rewardLpPeriod / periodLength)
559559 let lpEnteries = [IntegerEntry(kPrevLPSupply, lpTotalSupply), IntegerEntry(kLpRewardPerBlock, rewardLpPerBlock), IntegerEntry(kLpInterest, calcNewLpInterest(lpTotalSupply)), IntegerEntry(kLpInterestHeight, height)]
560560 ((lpEnteries ++ tokensEnteries) :+ IntegerEntry(kRewardUpdateHeight, height))
561561 }
562562 })
563563
564564
565565 @Verifier(tx)
566566 func verify () = {
567567 let multiSignedByAdmins = {
568568 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], admin1PK))
569569 then 1
570570 else 0
571571 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], admin2PK))
572572 then 1
573573 else 0
574574 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], admin3PK))
575575 then 1
576576 else 0
577577 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
578578 }
579579 match tx {
580580 case inv: InvokeScriptTransaction =>
581581 let isSelf = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
582582 let isRightFee = if ((inv.fee == 900000))
583583 then (inv.feeAssetId == unit)
584584 else false
585585 let isInitCall = (inv.function == "init")
586586 let isnoPayments = (size(inv.payments) == 0)
587587 if (if (if (if (isRightFee)
588588 then isInitCall
589589 else false)
590590 then isSelf
591591 else false)
592592 then isnoPayments
593593 else false)
594594 then true
595595 else multiSignedByAdmins
596596 case _ =>
597597 multiSignedByAdmins
598598 }
599599 }
600600

github/deemru/w8io/169f3d6 
63.45 ms