tx · A2SapnPHH4MQ9YHSLWFDqkyu5oAnJSDgs5bP9WNFq6jT

3N2M4PztorHwrfENp7D6LhYGgGodjiD1fjn:  -0.02400000 Waves

2023.08.17 14:43 [2714549] smart account 3N2M4PztorHwrfENp7D6LhYGgGodjiD1fjn > SELF 0.00000000 Waves

{ "type": 13, "id": "A2SapnPHH4MQ9YHSLWFDqkyu5oAnJSDgs5bP9WNFq6jT", "fee": 2400000, "feeAssetId": null, "timestamp": 1692272634083, "version": 2, "chainId": 84, "sender": "3N2M4PztorHwrfENp7D6LhYGgGodjiD1fjn", "senderPublicKey": "Fj9LPkCtmW3pDnVU6wPQnvqpZJCBieWSvZqY5FAGeCyp", "proofs": [ "2AETyvgy9zpDz1FPxid8UDrYo5gEE6mMt4ZPpu5WgwRMnAMSxVpat8cypPH5EgWT21EQAsrB2kpnxM4GBqVfmUXw", "5w9ikohjMJcBhq6MoRfVrwdws1jteSLWQs1QsFWnEcFNUmPD4BKQyLT4QbUi7GVBfPa1cD6ghjQ8JXUNpTwVXbaV" ], "script": "base64:BgIhCAISABIAEgQKAggIEgMKAQgSBwoFCAgIAQESAwoBCBIAUQAGU0NBTEU4AIDC1y8AC0xFTkRFUlNfQVBSCQDMCAIAlgEJAMwIAgB4CQDMCAIAZAkAzAgCAFAJAMwIAgA8CQDMCAIAKAkAzAgCAB4JAMwIAgAUCQDMCAIACgUDbmlsABNMRU5ERVJTX0FQUl9QRVJJT0RTCQDMCAICAzEtMQkAzAgCAgMyLTIJAMwIAgIDMy0zCQDMCAICAzQtNAkAzAgCAgM1LTgJAMwIAgIEOS0xMgkAzAgCAgcxNCAtIDE2CQDMCAICBTE3LTIwCQDMCAICBjIwLTEwNAUDbmlsABNMRU5ERVJTX01BWF9QRVJJT0RTAGgABkxQX0FQUgkAzAgCAJYBCQDMCAIAeAkAzAgCAGQJAMwIAgBQCQDMCAIAPAkAzAgCACgFA25pbAAOTFBfQVBSX1BFUklPRFMJAMwIAgIDMS0xCQDMCAICAzItMgkAzAgCAgMzLTMJAMwIAgIDNC00CQDMCAICAzUtOAkAzAgCAgQ5LTEyBQNuaWwADkxQX01BWF9QRVJJT0RTAAwADGtTdGFydEhlaWdodAILc3RhcnRIZWlnaHQADWtQZXJpb2RMZW5ndGgCDHBlcmlvZExlbmd0aAARa0xlbmRlcnNNYXhBbW91bnQCEWxlbmRSZXdhcmRzQW1vdW50AAxrTFBNYXhBbW91bnQCDmxwUmV3YXJkQW1vdW50AAdrVG9rZW5zAgZ0b2tlbnMAC2tVc2VyU3VwcGx5AhBfdXNlclRvdGFsU3VwcGx5AA5rVG9rZW5JbnRlcmVzdAIOX3Rva2VuSW50ZXJlc3QAFGtUb2tlbkludGVyZXN0SGVpZ2h0AhRfdG9rZW5JbnRlcmVzdEhlaWdodAAUa1Rva2VuUmV3YXJkUGVyQmxvY2sCFF90b2tlblJld2FyZFBlckJsb2NrABNrUmV3YXJkVXBkYXRlSGVpZ2h0AhJyZXdhcmRVcGRhdGVIZWlnaHQAEWtVc2VyTGVuZEludGVyZXN0AhFfdXNlckxhbmRJbnRlcmVzdAAXa1VzZXJMZW5kQXZhaWxhYmxlQ2xhaW0CF191c2VyTGVuZEF2YWlsYWJsZUNsYWltABVrVXNlckxwQXZhaWxhYmxlQ2xhaW0CFV91c2VyTHBBdmFpbGFibGVDbGFpbQALa0xwSW50ZXJlc3QCCmxwSW50ZXJlc3QAEWtMcEludGVyZXN0SGVpZ2h0AhBscEludGVyZXN0SGVpZ2h0AA1rUHJldkxQU3VwcGx5AhFwcmV2TFBUb3RhbFN1cHBseQARa0xwUmV3YXJkUGVyQmxvY2sCEGxwUmV3YXJkUGVyQmxvY2sAD2tVc2VyTHBJbnRlcmVzdAIPX3VzZXJMcEludGVyZXN0AA5rUHJpY2VJbk9yYWNsZQIHX3R3YXA1QgAUa1ByZXZMZW5kVG9rZW5TdXBwbHkCFF9wcmV2TGVuZFRvdGFsU3VwcGx5AAxrQVhMWVRva2VuSWQCC2F4bHlUb2tlbklkABBrTGVuZFRva2VuU3VwcGx5Ag90b3RhbF9zdXBwbGllZF8AD2tMZW5kVXNlclN1cHBseQIKX3N1cHBsaWVkXwAQa0xlbmRTZXR1cFRva2VucwIMc2V0dXBfdG9rZW5zAA5rU0ZUb3RhbFN1cHBseQIaX3RvdGFsX3NoYXJlX3Rva2Vuc19sb2NrZWQAEmtTRlVzZXJUb3RhbFN1cHBseQIUX3NoYXJlX3Rva2Vuc19sb2NrZWQACWtBeGx5UG9vbAIIYXhseVBvb2wABWtMcElkAg5zaGFyZV9hc3NldF9pZAAMa1ByaWNlT3JhY2xlAgxwcmljZV9vcmFjbGUAEWtBeGx5TWFpbkNvbnRyYWN0AgxtYWluQ29udHJhY3QAFmtBeGx5VG9rZW5vbWljQ29udHJhY3QCEXRva2Vub21pY0NvbnRyYWN0ABJrU0ZGYXJtaW5nQ29udHJhY3QCE3N3b3BmaV9mYXJtaW5nX2FkZHIADWtMZW5kQ29udHJhY3QCEWxlbmRfc2VydmljZV9hZGRyAAlrQWRtaW4xUEsCFWdyb3VwMV9hZG1pbjFfcHViX2tleQAJa0FkbWluMlBLAhVncm91cDFfYWRtaW4yX3B1Yl9rZXkACWtBZG1pbjNQSwIVZ3JvdXAxX2FkbWluM19wdWJfa2V5AA9rT3BlcmF0b3JDYWxsUEsCEmFkbWluX2NhbGxfcHViX2tleQAIYXhseVBvb2wJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQlrQXhseVBvb2wCFkNhbid0IGdldCBheGx5UG9vbCBrZXkADG1haW5Db250cmFjdAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMFEWtBeGx5TWFpbkNvbnRyYWN0AhlDYW4ndCBnZXQgbWFpbkNvbnRhY3Qga2V5AA10b2tlbkNvbnRyYWN0CQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUWa0F4bHlUb2tlbm9taWNDb250cmFjdAIfQ2FuJ3QgZ2V0IHRva2Vub21pY0NvbnRyYWN0IGtleQAMbGVuZENvbnRyYWN0CQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUMbWFpbkNvbnRyYWN0BQ1rTGVuZENvbnRyYWN0Ah9DYW4ndCBnZXQgbGVuZF9zZXJ2aWNlX2FkZHIga2V5ABFzZkZhcm1pbmdDb250cmFjdAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFDG1haW5Db250cmFjdAUSa1NGRmFybWluZ0NvbnRyYWN0AiFDYW4ndCBnZXQgc3dvcGZpX2Zhcm1pbmdfYWRkciBrZXkAD3ByaWNlT3JhY2xlQWRkcgkBEUBleHRyTmF0aXZlKDEwNjIpAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFDG1haW5Db250cmFjdAUMa1ByaWNlT3JhY2xlAhpDYW4ndCBnZXQgcHJpY2Vfb3JhY2xlIGtleQAIYWRtaW4xUEsJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFDG1haW5Db250cmFjdAUJa0FkbWluMVBLAhJDYW4ndCBnZXQgYWRtaW4xUEsACGFkbWluMlBLCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQxtYWluQ29udHJhY3QFCWtBZG1pbjJQSwISQ2FuJ3QgZ2V0IGFkbWluMlBLAAhhZG1pbjNQSwkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUMbWFpbkNvbnRyYWN0BQlrQWRtaW4zUEsCFENhbid0IGdldCBvcGVyYXRvclBLAApvcGVyYXRvclBLCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQ9rT3BlcmF0b3JDYWxsUEsCFENhbid0IGdldCBvcGVyYXRvclBLAAZheGx5SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ10b2tlbkNvbnRyYWN0BQxrQVhMWVRva2VuSWQCF0Nhbid0IGdldCBBeGx5IHRva2VuIGlkAAtzdGFydEhlaWdodAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwUMa1N0YXJ0SGVpZ2h0AAxwZXJpb2RMZW5ndGgJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMFDWtQZXJpb2RMZW5ndGgACWN1clBlcmlvZAkAaQIJAGUCBQZoZWlnaHQFC3N0YXJ0SGVpZ2h0BQxwZXJpb2RMZW5ndGgADWxlbmRNYXhBbW91bnQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFDXRva2VuQ29udHJhY3QFEWtMZW5kZXJzTWF4QW1vdW50ABNsZW5kTWF4UGVyaW9kQW1vdW50CQBpAgUNbGVuZE1heEFtb3VudAUTTEVOREVSU19NQVhfUEVSSU9EUwALbHBNYXhBbW91bnQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFDXRva2VuQ29udHJhY3QFDGtMUE1heEFtb3VudAARbHBNYXhQZXJpb2RBbW91bnQJAGkCBQtscE1heEFtb3VudAUOTFBfTUFYX1BFUklPRFMBC2lzQWRtaW5DYWxsAQFpAwkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgUIYWRtaW4xUEsJAMwIAgUIYWRtaW4yUEsJAMwIAgUIYWRtaW4zUEsFA25pbAgFAWkPY2FsbGVyUHVibGljS2V5BQR1bml0CQACAQIoT25seSBhZG1pbiBncm91cDEgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgEKaXNTZWxmQ2FsbAEBaQMJAAACCAUBaQZjYWxsZXIFBHRoaXMFBHVuaXQJAAIBAitPbmx5IGNvbnRyYWN0IGl0c2VsZiBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uAQ5pc09wZXJhdG9yQ2FsbAEBaQMJAAACCAUBaQ9jYWxsZXJQdWJsaWNLZXkFCm9wZXJhdG9yUEsFBHVuaXQJAAIBAiRPbmx5IG9wZXJhdG9yIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24BCmlzTGFuZENhbGwBAWkDCQAAAggFAWkGY2FsbGVyBQxsZW5kQ29udHJhY3QFBHVuaXQJAAIBAilPbmx5IGxhbmQgY29udHJhY3QgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgEPaXNTRkZhcm1pbmdDYWxsAQFpAwkAAAIIBQFpBmNhbGxlcgURc2ZGYXJtaW5nQ29udHJhY3QFBHVuaXQJAAIBAilPbmx5IGxhbmQgY29udHJhY3QgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgEMZ2V0QWxsVG9rZW5zAAQGdG9rZW5zCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFB2tUb2tlbnMCAAMJAAACBQZ0b2tlbnMCAAUDbmlsCQC1CQIFBnRva2VucwIBLAENZ2V0QXNzZXRQcmljZQEHYXNzZXRJZAkBEUBleHRyTmF0aXZlKDEwNTApAgUPcHJpY2VPcmFjbGVBZGRyCQCsAgIFB2Fzc2V0SWQFDmtQcmljZUluT3JhY2xlARBnZXRBc3NldERlY2ltYWxzAQdhc3NldElkAwkAAAIFB2Fzc2V0SWQCBVdBVkVTAAgEByRtYXRjaDAJAOwHAQkA2QQBBQdhc3NldElkAwkAAQIFByRtYXRjaDACBUFzc2V0BAVhc3NldAUHJG1hdGNoMAgFBWFzc2V0CGRlY2ltYWxzCQACAQIQQ2FuJ3QgZmluZCBhc3NldAERZ2V0QXNzZXRQcmVjaXNpb24BB2Fzc2V0SWQJAGwGAAoAAAkBEGdldEFzc2V0RGVjaW1hbHMBBQdhc3NldElkAAAAAAUERE9XTgEVZ2V0QWRvcHRlZEFQUkJ5UGVyaW9kAwZwZXJpb2QKYXByUGVyaW9kcwNhcHIKAQNmb3ICAWEHYXBlcmlvZAQLJHQwNTQyMDU0NDIFAWEEBWluZGV4CAULJHQwNTQyMDU0NDICXzEEBWZvdW5kCAULJHQwNTQyMDU0NDICXzIEAmZ0CQC1CQIFB2FwZXJpb2QCAS0ECyR0MDU0Nzk1NTQyCQCUCgIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJmdAAACQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCZnQAAQQEZnJvbQgFCyR0MDU0Nzk1NTQyAl8xBAJ0bwgFCyR0MDU0Nzk1NTQyAl8yAwUFZm91bmQFAWEDAwkAZwIFBnBlcmlvZAUEZnJvbQkAZwIFAnRvBQZwZXJpb2QHCQCUCgIFBWluZGV4BgkAlAoCCQBkAgUFaW5kZXgAAQcECyR0MDU2Nzk1NzQ1CgACJGwFE0xFTkRFUlNfQVBSX1BFUklPRFMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIAAAcKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBA2ZvcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgOQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQQFaW5kZXgIBQskdDA1Njc5NTc0NQJfMQQFZm91bmQIBQskdDA1Njc5NTc0NQJfMgMFBWZvdW5kCQBrAwkAaAIJAJEDAgULTEVOREVSU19BUFIFBWluZGV4BQZTQ0FMRTgABwDtAgAAARdnZXRUb3RhbFN1cHBseUFsbFRva2VucwAKAQNmb3ICAWEHdG9rZW5JZAQLJHQwNTkzMzU5ODkFAWEEC3RvdGFsU3VwcGx5CAULJHQwNTkzMzU5ODkCXzEEDnRvdGFsU3VwcGx5VXNkCAULJHQwNTkzMzU5ODkCXzIEEXRvdGFsU3VwcGx5VXNkQWxsCAULJHQwNTkzMzU5ODkCXzMEB3RTdXBwbHkJAQt2YWx1ZU9yRWxzZQIJAJoIAgUMbGVuZENvbnRyYWN0CQCsAgIFEGtMZW5kVG9rZW5TdXBwbHkFB3Rva2VuSWQAAAQKYXNzZXRQcmljZQkBDWdldEFzc2V0UHJpY2UBBQd0b2tlbklkBA5hc3NldFByZWNpc2lvbgkBEWdldEFzc2V0UHJlY2lzaW9uAQUHdG9rZW5JZAQKdFN1cHBseVVzZAkAawMFB3RTdXBwbHkFCmFzc2V0UHJpY2UFDmFzc2V0UHJlY2lzaW9uCQCVCgMJAM0IAgULdG90YWxTdXBwbHkFB3RTdXBwbHkJAM0IAgUOdG90YWxTdXBwbHlVc2QFCnRTdXBwbHlVc2QJAGQCBRF0b3RhbFN1cHBseVVzZEFsbAUKdFN1cHBseVVzZAoAAiRsCQEMZ2V0QWxsVG9rZW5zAAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJUKAwUDbmlsBQNuaWwAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEDZm9yAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAzMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgERZ2V0VG90YWxTdXBwbHlVc2QBB3Rva2VuSWQEB3RTdXBwbHkJAQt2YWx1ZU9yRWxzZQIJAJoIAgUMbGVuZENvbnRyYWN0CQCsAgIFEGtMZW5kVG9rZW5TdXBwbHkFB3Rva2VuSWQAAAQKYXNzZXRQcmljZQkBDWdldEFzc2V0UHJpY2UBBQd0b2tlbklkBA5hc3NldFByZWNpc2lvbgkBEWdldEFzc2V0UHJlY2lzaW9uAQUHdG9rZW5JZAkAawMFB3RTdXBwbHkFCmFzc2V0UHJpY2UFDmFzc2V0UHJlY2lzaW9uARRjYWxjTmV3VG9rZW5JbnRlcmVzdAIHdG9rZW5JZAt0b3RhbFN1cHBseQMJAGcCBQZoZWlnaHQFC3N0YXJ0SGVpZ2h0AAAEDnJld2FyZFBlckJsb2NrCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIFB3Rva2VuSWQFFGtUb2tlblJld2FyZFBlckJsb2NrBAtvbGRJbnRlcmVzdAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICBQd0b2tlbklkBQ5rVG9rZW5JbnRlcmVzdAQMdXBkYXRlSGVpZ2h0CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIFB3Rva2VuSWQFFGtUb2tlbkludGVyZXN0SGVpZ2h0BAZyZXdhcmQJAGgCCQBlAgUGaGVpZ2h0BQx1cGRhdGVIZWlnaHQFDnJld2FyZFBlckJsb2NrBAhpbnRlcmVzdAMJAGYCBQt0b3RhbFN1cHBseQAACQBrAwUGcmV3YXJkBQZTQ0FMRTgFC3RvdGFsU3VwcGx5AAAJAGQCBQtvbGRJbnRlcmVzdAUIaW50ZXJlc3QBEWNhbGNOZXdMcEludGVyZXN0AQt0b3RhbFN1cHBseQMJAGcCBQZoZWlnaHQFC3N0YXJ0SGVpZ2h0AAAEDnJld2FyZFBlckJsb2NrCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzBRFrTHBSZXdhcmRQZXJCbG9jawQLb2xkSW50ZXJlc3QJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMFC2tMcEludGVyZXN0BAx1cGRhdGVIZWlnaHQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMFEWtMcEludGVyZXN0SGVpZ2h0BAZyZXdhcmQJAGgCCQBlAgUGaGVpZ2h0BQx1cGRhdGVIZWlnaHQFDnJld2FyZFBlckJsb2NrBAhpbnRlcmVzdAMJAGYCBQt0b3RhbFN1cHBseQAACQBrAwUGcmV3YXJkBQZTQ0FMRTgFC3RvdGFsU3VwcGx5AAAJAGQCBQtvbGRJbnRlcmVzdAUIaW50ZXJlc3QBEmNhbGNMZW5kVXNlclJld2FyZAIEdXNlcgd0b2tlbklkBAt0b3RhbFN1cHBseQkBC3ZhbHVlT3JFbHNlAgkAmggCBQxsZW5kQ29udHJhY3QJAKwCAgUQa0xlbmRUb2tlblN1cHBseQUHdG9rZW5JZAAABA10b2tlbkludGVyZXN0CQEUY2FsY05ld1Rva2VuSW50ZXJlc3QCBQd0b2tlbklkBQt0b3RhbFN1cHBseQQKdXNlclN1cHBseQkBC3ZhbHVlT3JFbHNlAgkAmggCBQxsZW5kQ29udHJhY3QJAKwCAgkArAICBQR1c2VyBQ9rTGVuZFVzZXJTdXBwbHkFB3Rva2VuSWQAAAQRdXNlclRva2VuSW50ZXJlc3QJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgUHdG9rZW5JZAIBXwUEdXNlcgURa1VzZXJMZW5kSW50ZXJlc3QDCQAAAgUKdXNlclN1cHBseQAABQ10b2tlbkludGVyZXN0AAAEBnJld2FyZAkAawMFCnVzZXJTdXBwbHkJAGUCBQ10b2tlbkludGVyZXN0BRF1c2VyVG9rZW5JbnRlcmVzdAUGU0NBTEU4CQCVCgMFBnJld2FyZAUNdG9rZW5JbnRlcmVzdAUKdXNlclN1cHBseQEQY2FsY0xwVXNlclJld2FyZAEEdXNlcgQLdG90YWxTdXBwbHkJAQt2YWx1ZU9yRWxzZQIJAJoIAgURc2ZGYXJtaW5nQ29udHJhY3QJAKwCAgUIYXhseVBvb2wFDmtTRlRvdGFsU3VwcGx5AAAEDXRva2VuSW50ZXJlc3QJARFjYWxjTmV3THBJbnRlcmVzdAEFC3RvdGFsU3VwcGx5BAp1c2VyU3VwcGx5CQELdmFsdWVPckVsc2UCCQCaCAIFDGxlbmRDb250cmFjdAkArAICCQCsAgIJAKwCAgUIYXhseVBvb2wCAV8FBHVzZXIFEmtTRlVzZXJUb3RhbFN1cHBseQAABBF1c2VyVG9rZW5JbnRlcmVzdAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHVzZXIFD2tVc2VyTHBJbnRlcmVzdAMJAAACBQp1c2VyU3VwcGx5AAAFDXRva2VuSW50ZXJlc3QAAAQGcmV3YXJkCQBrAwUKdXNlclN1cHBseQkAZQIFDXRva2VuSW50ZXJlc3QFEXVzZXJUb2tlbkludGVyZXN0BQZTQ0FMRTgJAJUKAwUGcmV3YXJkBQ10b2tlbkludGVyZXN0BQp1c2VyU3VwcGx5ARhjbGFpbUxlbmRlclJld2FyZHNDb21tb24CBHVzZXIIcmVhZE9ubHkKAQVjbGFpbQIBYQd0b2tlbklkBAskdDA4ODM4ODg4MgUBYQQIdG9rZW5JZHMIBQskdDA4ODM4ODg4MgJfMQQHY0Ftb3VudAgFCyR0MDg4Mzg4ODgyAl8yBAV0b3RhbAgFCyR0MDg4Mzg4ODgyAl8zBAhlbnRlcmllcwgFCyR0MDg4Mzg4ODgyAl80BBJ1c2VyQXZhaWxhYmxlQ2xhaW0JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgUHdG9rZW5JZAIBXwUEdXNlcgUXa1VzZXJMZW5kQXZhaWxhYmxlQ2xhaW0AAAQLJHQwODk5NTkwNzQJARJjYWxjTGVuZFVzZXJSZXdhcmQCBQR1c2VyBQd0b2tlbklkBAd1UmV3YXJkCAULJHQwODk5NTkwNzQCXzEEEG5ld1Rva2VuSW50ZXJlc3QIBQskdDA4OTk1OTA3NAJfMgQKdXNlclN1cHBseQgFCyR0MDg5OTU5MDc0Al8zBAx0b3RhbFRvQ2xhaW0JAGQCBRJ1c2VyQXZhaWxhYmxlQ2xhaW0FB3VSZXdhcmQDAwkAZgIFDHRvdGFsVG9DbGFpbQAABgkAZgIFCnVzZXJTdXBwbHkAAAQMbmV3RW50cmVyaWVzAwMFCHJlYWRPbmx5BgkAAAIFDHRvdGFsVG9DbGFpbQAABQhlbnRlcmllcwkAzggCBQhlbnRlcmllcwkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgUHdG9rZW5JZAIBXwUEdXNlcgURa1VzZXJMZW5kSW50ZXJlc3QFEG5ld1Rva2VuSW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIFB3Rva2VuSWQCAV8FBHVzZXIFF2tVc2VyTGVuZEF2YWlsYWJsZUNsYWltAAAJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUHdG9rZW5JZAUOa1Rva2VuSW50ZXJlc3QFEG5ld1Rva2VuSW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUHdG9rZW5JZAUUa1Rva2VuSW50ZXJlc3RIZWlnaHQFBmhlaWdodAUDbmlsCQCWCgQJAM0IAgUIdG9rZW5JZHMFB3Rva2VuSWQJAM0IAgUHY0Ftb3VudAUMdG90YWxUb0NsYWltCQBkAgUFdG90YWwFDHRvdGFsVG9DbGFpbQUMbmV3RW50cmVyaWVzCQCWCgQFCHRva2VuSWRzBQdjQW1vdW50BQV0b3RhbAUIZW50ZXJpZXMKAAIkbAkBDGdldEFsbFRva2VucwAKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCWCgQFA25pbAUDbmlsAAAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEFY2xhaW0CBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDMwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAAVABYAFwAYABkAGgAbABwAHQAeARRjbGFpbUxwUmV3YXJkc0NvbW1vbgIEdXNlcghyZWFkT25seQQSdXNlckF2YWlsYWJsZUNsYWltCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEdXNlcgUVa1VzZXJMcEF2YWlsYWJsZUNsYWltAAAEDSR0MDEwMDA2MTAwNzEJARBjYWxjTHBVc2VyUmV3YXJkAQUEdXNlcgQHdVJld2FyZAgFDSR0MDEwMDA2MTAwNzECXzEEDW5ld0xwSW50ZXJlc3QIBQ0kdDAxMDAwNjEwMDcxAl8yBAp1c2VyU3VwcGx5CAUNJHQwMTAwMDYxMDA3MQJfMwQMdG90YWxUb0NsYWltCQBkAgUSdXNlckF2YWlsYWJsZUNsYWltBQd1UmV3YXJkAwMFCHJlYWRPbmx5BgkAAAIFDHRvdGFsVG9DbGFpbQAACQCUCgIFDHRvdGFsVG9DbGFpbQUDbmlsCQCUCgIFDHRvdGFsVG9DbGFpbQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQR1c2VyBQ9rVXNlckxwSW50ZXJlc3QFDW5ld0xwSW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEdXNlcgUVa1VzZXJMcEF2YWlsYWJsZUNsYWltAAAJAMwIAgkBDEludGVnZXJFbnRyeQIFC2tMcEludGVyZXN0BQ1uZXdMcEludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRFrTHBJbnRlcmVzdEhlaWdodAUGaGVpZ2h0BQNuaWwBDWdldFRva2Vuc0FQUnMABAlheGx5UHJpY2UJAQ1nZXRBc3NldFByaWNlAQUGYXhseUlkBA1heGx5UHJlY2lzaW9uCQERZ2V0QXNzZXRQcmVjaXNpb24BBQZheGx5SWQKAQp0b2tlbnNBcHJzAgNhcHIHdG9rZW5JZAQEcndwYgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFB3Rva2VuSWQFFGtUb2tlblJld2FyZFBlckJsb2NrAAAEB3J3cGJVc2QJAGsDBQRyd3BiBQlheGx5UHJpY2UFDWF4bHlQcmVjaXNpb24EBnJ3WWVhcgkAaAIJAGgCBQdyd3BiVXNkBQxwZXJpb2RMZW5ndGgANAQOdG90YWxTdXBwbHlVc2QJARFnZXRUb3RhbFN1cHBseVVzZAEFB3Rva2VuSWQJAM0IAgUDYXByCQBrAwUGcndZZWFyBQZTQ0FMRTgFDnRvdGFsU3VwcGx5VXNkBARhcHJzCgACJGwJAQxnZXRBbGxUb2tlbnMACgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQp0b2tlbnNBcHJzAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAzMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgQNbHBUb3RhbFN1cHBseQkBEUBleHRyTmF0aXZlKDEwNTApAgURc2ZGYXJtaW5nQ29udHJhY3QJAKwCAgUIYXhseVBvb2wFDmtTRlRvdGFsU3VwcGx5BARscElkCQERQGV4dHJOYXRpdmUoMTA1MykCCQERQGV4dHJOYXRpdmUoMTA2MikBBQhheGx5UG9vbAUFa0xwSWQEC2xwUHJlY2lzaW9uCQERZ2V0QXNzZXRQcmVjaXNpb24BBQRscElkBAdscFByaWNlCgABQAkAkQMCCgABQAkA/AcEBQxtYWluQ29udHJhY3QCGmdldFNoYXJlQXNzZXRQcmljZVJFQURPTkxZCQDMCAIJAMwIAgUEbHBJZAUDbmlsBQNuaWwFA25pbAMJAAECBQFAAglMaXN0W0FueV0FAUAJAAIBCQCsAgIJAAMBBQFAAh4gY291bGRuJ3QgYmUgY2FzdCB0byBMaXN0W0FueV0AAAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQEEGxwVG90YWxTdXBwbHlVc2QJAGsDBQ1scFRvdGFsU3VwcGx5BQdscFByaWNlBQtscFByZWNpc2lvbgQEcndwYgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBRFrTHBSZXdhcmRQZXJCbG9jawAABAdyd3BiVXNkCQBrAwUEcndwYgUJYXhseVByaWNlBQ1heGx5UHJlY2lzaW9uBAZyd1llYXIJAGgCCQBoAgUHcndwYlVzZAUMcGVyaW9kTGVuZ3RoADQEBWxwQXByCQBrAwUGcndZZWFyBQZTQ0FMRTgFEGxwVG90YWxTdXBwbHlVc2QJAJUKAwkBDGdldEFsbFRva2VucwAFBGFwcnMFBWxwQXByBwFpARJjbGFpbUxlbmRlclJld2FyZHMABAhjbGFpbVJlcwkBGGNsYWltTGVuZGVyUmV3YXJkc0NvbW1vbgIJAKUIAQgFAWkGY2FsbGVyBwMJAAACCAUIY2xhaW1SZXMCXzMAAAkAAgECI2NsYWltIGFtb3VudCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwBANpbnYJAPwHBAUNdG9rZW5Db250cmFjdAISd2l0aGRyYXdMZW5kUmV3YXJkCQDMCAIIBQhjbGFpbVJlcwJfMwkAzAgCCQClCAEIBQFpBmNhbGxlcgUDbmlsBQNuaWwDCQAAAgUDaW52BQNpbnYIBQhjbGFpbVJlcwJfNAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ5jbGFpbUxwUmV3YXJkcwAECGNsYWltUmVzCQEUY2xhaW1McFJld2FyZHNDb21tb24CCQClCAEIBQFpBmNhbGxlcgcDCQAAAggFCGNsYWltUmVzAl8xAAAJAAIBAiNjbGFpbSBhbW91bnQgbXVzdCBiZSBncmVhdGVyIHRoYW4gMAQDaW52CQD8BwQFDXRva2VuQ29udHJhY3QCEHdpdGhkcmF3THBSZXdhcmQJAMwIAggFCGNsYWltUmVzAl8xCQDMCAIJAKUIAQgFAWkGY2FsbGVyBQNuaWwFA25pbAMJAAACBQNpbnYFA2ludggFCGNsYWltUmVzAl8yCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCmxlbmRBY3Rpb24CBHVzZXIHdG9rZW5JZAkBC3ZhbHVlT3JFbHNlAgkBCmlzTGFuZENhbGwBBQFpBBJ1c2VyQXZhaWxhYmxlQ2xhaW0JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQd0b2tlbklkBRdrVXNlckxlbmRBdmFpbGFibGVDbGFpbQAABA0kdDAxMjQ0MzEyNTEwCQESY2FsY0xlbmRVc2VyUmV3YXJkAgUEdXNlcgUHdG9rZW5JZAQHdVJld2FyZAgFDSR0MDEyNDQzMTI1MTACXzEEEG5ld1Rva2VuSW50ZXJlc3QIBQ0kdDAxMjQ0MzEyNTEwAl8yCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICBQR1c2VyAgFfBQd0b2tlbklkBRFrVXNlckxlbmRJbnRlcmVzdAUQbmV3VG9rZW5JbnRlcmVzdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgUEdXNlcgIBXwUHdG9rZW5JZAUXa1VzZXJMZW5kQXZhaWxhYmxlQ2xhaW0JAGQCBRJ1c2VyQXZhaWxhYmxlQ2xhaW0FB3VSZXdhcmQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUHdG9rZW5JZAUOa1Rva2VuSW50ZXJlc3QFEG5ld1Rva2VuSW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUHdG9rZW5JZAUUa1Rva2VuSW50ZXJlc3RIZWlnaHQFBmhlaWdodAUDbmlsAWkBCGxwQWN0aW9uAQR1c2VyCQELdmFsdWVPckVsc2UCCQEPaXNTRkZhcm1pbmdDYWxsAQUBaQQSdXNlckF2YWlsYWJsZUNsYWltCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFFWtVc2VyTHBBdmFpbGFibGVDbGFpbQAABA0kdDAxMjk3NTEzMDI4CQEQY2FsY0xwVXNlclJld2FyZAEFBHVzZXIEB3VSZXdhcmQIBQ0kdDAxMjk3NTEzMDI4Al8xBA1uZXdMcEludGVyZXN0CAUNJHQwMTI5NzUxMzAyOAJfMgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQR1c2VyBQ9rVXNlckxwSW50ZXJlc3QFDW5ld0xwSW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEdXNlcgUVa1VzZXJMcEF2YWlsYWJsZUNsYWltCQBkAgUSdXNlckF2YWlsYWJsZUNsYWltBQd1UmV3YXJkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHVzZXIFC2tMcEludGVyZXN0BQ1uZXdMcEludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHVzZXIFEWtMcEludGVyZXN0SGVpZ2h0BQZoZWlnaHQFA25pbAFpAQRpbml0BRRheGx5TWFpbkNvbnRyYWN0QWRkchlheGx5VG9rZW5vbWljQ29udHJhY3RBZGRyDGF4bHlQb29sQWRkchJmYXJtaW5nU3RhcnRIZWlnaHQMcGVyaW9kTGVuZ3RoCQELdmFsdWVPckVsc2UCCQEKaXNTZWxmQ2FsbAEFAWkDCQEBIQEJAQlpc0RlZmluZWQBCQCmCAEFFGF4bHlNYWluQ29udHJhY3RBZGRyCQACAQIVV3JvbmcgZmFybWluZyBhZGRyZXNzAwkBASEBCQEJaXNEZWZpbmVkAQkApggBBRlheGx5VG9rZW5vbWljQ29udHJhY3RBZGRyCQACAQIbV3JvbmcgbWFpbiBjb250cmFjdCBhZGRyZXNzCQDMCAIJAQtTdHJpbmdFbnRyeQIFEWtBeGx5TWFpbkNvbnRyYWN0BRRheGx5TWFpbkNvbnRyYWN0QWRkcgkAzAgCCQELU3RyaW5nRW50cnkCBRZrQXhseVRva2Vub21pY0NvbnRyYWN0BRlheGx5VG9rZW5vbWljQ29udHJhY3RBZGRyCQDMCAIJAQtTdHJpbmdFbnRyeQIFCWtBeGx5UG9vbAUMYXhseVBvb2xBZGRyCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQxrU3RhcnRIZWlnaHQFEmZhcm1pbmdTdGFydEhlaWdodAkAzAgCCQEMSW50ZWdlckVudHJ5AgUNa1BlcmlvZExlbmd0aAUMcGVyaW9kTGVuZ3RoBQNuaWwBaQEMaW5pdE5ld1Rva2VuAQd0b2tlbklkCQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwkBCWlzRGVmaW5lZAEJAJoIAgUEdGhpcwkArAICBQd0b2tlbklkBQ5rVG9rZW5JbnRlcmVzdAkAAgECFHRva2VuIGFscmVhZHkgaW5pdGVkAwkBASEBCQEIY29udGFpbnMCCQERQGV4dHJOYXRpdmUoMTA1MykCBQxsZW5kQ29udHJhY3QFEGtMZW5kU2V0dXBUb2tlbnMFB3Rva2VuSWQJAAIBAhNubyB0b2tlbiBvbiBsYW5kaW5nBAxuZXdBbGxUb2tlbnMJAM0IAgkBDGdldEFsbFRva2VucwAFB3Rva2VuSWQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUHdG9rZW5JZAUOa1Rva2VuSW50ZXJlc3QAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQd0b2tlbklkBRRrVG9rZW5JbnRlcmVzdEhlaWdodAkAlgMBCQDMCAIFC3N0YXJ0SGVpZ2h0CQDMCAIFBmhlaWdodAUDbmlsCQDMCAIJAQtTdHJpbmdFbnRyeQIFB2tUb2tlbnMJALkJAgUMbmV3QWxsVG9rZW5zAgEsCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFB3Rva2VuSWQFFGtUb2tlblJld2FyZFBlckJsb2NrAAAFA25pbAFpAQ11cGRhdGVSZXdhcmRzAAkBC3ZhbHVlT3JFbHNlAgkBDmlzT3BlcmF0b3JDYWxsAQUBaQQQbGFzdFVwZGF0ZUhlaWdodAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBRNrUmV3YXJkVXBkYXRlSGVpZ2h0AAADCQBmAgkAZAIFEGxhc3RVcGRhdGVIZWlnaHQFDHBlcmlvZExlbmd0aAUGaGVpZ2h0CQACAQIlcmV3YXJkcyBhbHJlZHkgdXBkYXRlZCBpbiB0aGlzIHBlcmlvZAQNJHQwMTQ3OTUxNDg3NQkBF2dldFRvdGFsU3VwcGx5QWxsVG9rZW5zAAQLdG90YWxTdXBwbHkIBQ0kdDAxNDc5NTE0ODc1Al8xBA50b3RhbFN1cHBseVVzZAgFDSR0MDE0Nzk1MTQ4NzUCXzIEEXRvdGFsU3VwcGx5VXNkQWxsCAUNJHQwMTQ3OTUxNDg3NQJfMwQJYXhseVByaWNlCQENZ2V0QXNzZXRQcmljZQEFBmF4bHlJZAQNYXhseVByZWNpc2lvbgkBEWdldEFzc2V0UHJlY2lzaW9uAQUGYXhseUlkBAZtYXhBUFIJARVnZXRBZG9wdGVkQVBSQnlQZXJpb2QDBQljdXJQZXJpb2QFE0xFTkRFUlNfQVBSX1BFUklPRFMFC0xFTkRFUlNfQVBSCgEMdXBkYXRlUmV3YXJkAgFhB3Rva2VuSWQEDSR0MDE1MTE5MTUxNDQFAWEECGVudGVyaWVzCAUNJHQwMTUxMTkxNTE0NAJfMQQFaW5kZXgIBQ0kdDAxNTExOTE1MTQ0Al8yAwkAAAIJAJEDAgULdG90YWxTdXBwbHkFBWluZGV4AAAJAJQKAgkAzggCBQhlbnRlcmllcwkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQd0b2tlbklkBRRrUHJldkxlbmRUb2tlblN1cHBseQkAkQMCBQt0b3RhbFN1cHBseQUFaW5kZXgJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUHdG9rZW5JZAUUa1Rva2VuUmV3YXJkUGVyQmxvY2sAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQd0b2tlbklkBQ5rVG9rZW5JbnRlcmVzdAkBFGNhbGNOZXdUb2tlbkludGVyZXN0AgUHdG9rZW5JZAkAkQMCBQt0b3RhbFN1cHBseQUFaW5kZXgJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUHdG9rZW5JZAUUa1Rva2VuSW50ZXJlc3RIZWlnaHQJAJYDAQkAzAgCBQtzdGFydEhlaWdodAkAzAgCBQZoZWlnaHQFA25pbAUDbmlsCQBkAgUFaW5kZXgAAQQFc2hhcmUJAGsDCQCRAwIFDnRvdGFsU3VwcGx5VXNkBQVpbmRleAUGU0NBTEU4BRF0b3RhbFN1cHBseVVzZEFsbAQJbWF4UmV3YXJkCQBrAwUFc2hhcmUFE2xlbmRNYXhQZXJpb2RBbW91bnQFBlNDQUxFOAQMbWF4UmV3YXJkVXNkCQBrAwUJbWF4UmV3YXJkBQlheGx5UHJpY2UFDWF4bHlQcmVjaXNpb24ED3ByZXZUb3RhbFN1cHBseQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBRRrUHJldkxlbmRUb2tlblN1cHBseQAABAZydENvZWYDAwkAAAIFD3ByZXZUb3RhbFN1cHBseQAABgkAAAIJAJEDAgULdG90YWxTdXBwbHkFBWluZGV4AAAAAAkAawMFD3ByZXZUb3RhbFN1cHBseQUGU0NBTEU4CQCRAwIFC3RvdGFsU3VwcGx5BQVpbmRleAQGcmV3YXJkCQBpAgkAlwMBCQDMCAIJAGgCBQZtYXhBUFIJAGQCBQZTQ0FMRTgFBnJ0Q29lZgkAzAgCCQBrAwUGbWF4QVBSCQBoAgAPBQZTQ0FMRTgACgUDbmlsBQZTQ0FMRTgECXJld2FyZFVzZAkAlwMBCQDMCAIFDG1heFJld2FyZFVzZAkAzAgCCQBrAwkAkQMCBQ50b3RhbFN1cHBseVVzZAUFaW5kZXgFBnJld2FyZAUGU0NBTEU4BQNuaWwEDHJld2FyZFBlcmlvZAkAawMFCXJld2FyZFVzZAUJYXhseVByaWNlBQ1heGx5UHJlY2lzaW9uBA5yZXdhcmRQZXJCbG9jawkAaQIFDHJld2FyZFBlcmlvZAUMcGVyaW9kTGVuZ3RoCQCUCgIJAM4IAgUIZW50ZXJpZXMJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUHdG9rZW5JZAUUa1ByZXZMZW5kVG9rZW5TdXBwbHkJAJEDAgULdG90YWxTdXBwbHkFBWluZGV4CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFB3Rva2VuSWQFFGtUb2tlblJld2FyZFBlckJsb2NrBQ5yZXdhcmRQZXJCbG9jawkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQd0b2tlbklkBQ5rVG9rZW5JbnRlcmVzdAkBFGNhbGNOZXdUb2tlbkludGVyZXN0AgUHdG9rZW5JZAkAkQMCBQt0b3RhbFN1cHBseQUFaW5kZXgJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUHdG9rZW5JZAUUa1Rva2VuSW50ZXJlc3RIZWlnaHQJAJYDAQkAzAgCBQtzdGFydEhlaWdodAkAzAgCBQZoZWlnaHQFA25pbAUDbmlsCQBkAgUFaW5kZXgAAQQNJHQwMTY3MzExNjgwOAoAAiRsCQEMZ2V0QWxsVG9rZW5zAAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgUDbmlsAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBDHVwZGF0ZVJld2FyZAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMzAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsAHAAdAB4EDnRva2Vuc0VudGVyaWVzCAUNJHQwMTY3MzExNjgwOAJfMQQFaW5kZXgIBQ0kdDAxNjczMTE2ODA4Al8yBAhscE1heEFQUgkBFWdldEFkb3B0ZWRBUFJCeVBlcmlvZAMFCWN1clBlcmlvZAUOTFBfQVBSX1BFUklPRFMFBkxQX0FQUgQNbHBUb3RhbFN1cHBseQkBEUBleHRyTmF0aXZlKDEwNTApAgURc2ZGYXJtaW5nQ29udHJhY3QJAKwCAgUIYXhseVBvb2wFDmtTRlRvdGFsU3VwcGx5BAtwcmVMUFN1cHBseQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQ1rUHJldkxQU3VwcGx5AAAEBGxwSWQJARFAZXh0ck5hdGl2ZSgxMDUzKQIJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCGF4bHlQb29sBQVrTHBJZAQLbHBQcmVjaXNpb24JARFnZXRBc3NldFByZWNpc2lvbgEFBGxwSWQEB2xwUHJpY2UKAAFACQCRAwIKAAFACQD8BwQFDG1haW5Db250cmFjdAIaZ2V0U2hhcmVBc3NldFByaWNlUkVBRE9OTFkJAMwIAgkAzAgCBQRscElkBQNuaWwFA25pbAUDbmlsAwkAAQIFAUACCUxpc3RbQW55XQUBQAkAAgEJAKwCAgkAAwEFAUACHiBjb3VsZG4ndCBiZSBjYXN0IHRvIExpc3RbQW55XQAAAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAQQbHBUb3RhbFN1cHBseVVzZAkAawMFDWxwVG90YWxTdXBwbHkFB2xwUHJpY2UFC2xwUHJlY2lzaW9uBA5tYXhMUFJld2FyZFVzZAkAawMFEWxwTWF4UGVyaW9kQW1vdW50BQlheGx5UHJpY2UFDWF4bHlQcmVjaXNpb24ECHJ0TFBDb2VmAwMJAAACBQtwcmVMUFN1cHBseQAABgkAAAIFDWxwVG90YWxTdXBwbHkAAAAACQBrAwULcHJlTFBTdXBwbHkFBlNDQUxFOAUNbHBUb3RhbFN1cHBseQQIcmV3YXJkTHAJAGkCCQCXAwEJAMwIAgkAaAIFCGxwTWF4QVBSCQBkAgUGU0NBTEU4BQhydExQQ29lZgkAzAgCCQBrAwUIbHBNYXhBUFIJAGgCAA8FBlNDQUxFOAAKBQNuaWwFBlNDQUxFOAQLcmV3YXJkTHBVc2QJAJcDAQkAzAgCBQ5tYXhMUFJld2FyZFVzZAkAzAgCCQBrAwUQbHBUb3RhbFN1cHBseVVzZAUIcmV3YXJkTHAFBlNDQUxFOAUDbmlsBA5yZXdhcmRMcFBlcmlvZAkAawMFC3Jld2FyZExwVXNkBQlheGx5UHJpY2UFDWF4bHlQcmVjaXNpb24EEHJld2FyZExwUGVyQmxvY2sJAGkCBQ5yZXdhcmRMcFBlcmlvZAUMcGVyaW9kTGVuZ3RoBApscEVudGVyaWVzCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ1rUHJldkxQU3VwcGx5BQ1scFRvdGFsU3VwcGx5CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRFrTHBSZXdhcmRQZXJCbG9jawUQcmV3YXJkTHBQZXJCbG9jawkAzAgCCQEMSW50ZWdlckVudHJ5AgULa0xwSW50ZXJlc3QJARFjYWxjTmV3THBJbnRlcmVzdAEFDWxwVG90YWxTdXBwbHkJAMwIAgkBDEludGVnZXJFbnRyeQIFEWtMcEludGVyZXN0SGVpZ2h0CQCWAwEJAMwIAgULc3RhcnRIZWlnaHQJAMwIAgUGaGVpZ2h0BQNuaWwFA25pbAkAzQgCCQDOCAIFCmxwRW50ZXJpZXMFDnRva2Vuc0VudGVyaWVzCQEMSW50ZWdlckVudHJ5AgUTa1Jld2FyZFVwZGF0ZUhlaWdodAkAlgMBCQDMCAIFC3N0YXJ0SGVpZ2h0CQDMCAIFBmhlaWdodAUDbmlsAQJ0eAEGdmVyaWZ5AAQTbXVsdGlTaWduZWRCeUFkbWlucwQSYWRtaW5QdWJLZXkxU2lnbmVkAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAUIYWRtaW4xUEsAAQAABBJhZG1pblB1YktleTJTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwABBQhhZG1pbjJQSwABAAAEEmFkbWluUHViS2V5M1NpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAIFCGFkbWluM1BLAAEAAAkAZwIJAGQCCQBkAgUSYWRtaW5QdWJLZXkxU2lnbmVkBRJhZG1pblB1YktleTJTaWduZWQFEmFkbWluUHViS2V5M1NpZ25lZAACBAckbWF0Y2gwBQJ0eAMJAAECBQckbWF0Y2gwAhdJbnZva2VTY3JpcHRUcmFuc2FjdGlvbgQDaW52BQckbWF0Y2gwBAZpc1NlbGYJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXkECmlzUmlnaHRGZWUDCQAAAggFA2ludgNmZWUAoPc2CQAAAggFA2ludgpmZWVBc3NldElkBQR1bml0BwQKaXNJbml0Q2FsbAkAAAIIBQNpbnYIZnVuY3Rpb24CBGluaXQEDGlzbm9QYXltZW50cwkAAAIJAJADAQgFA2ludghwYXltZW50cwAAAwMDAwUKaXNSaWdodEZlZQUKaXNJbml0Q2FsbAcFBmlzU2VsZgcFDGlzbm9QYXltZW50cwcGBRNtdWx0aVNpZ25lZEJ5QWRtaW5zBRNtdWx0aVNpZ25lZEJ5QWRtaW5zFsbXUQ==", "height": 2714549, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: FrqMnAPBVFDTHsepjajhd6DFybASWHwBRjCX3jbTDnpL Next: 4AVszmih4JRDsCjb5e6wKEapVJQ6ujWZHyK4jh7gvGVf Diff:
OldNewDifferences
125125
126126 let lpMaxPeriodAmount = (lpMaxAmount / LP_MAX_PERIODS)
127127
128-let allTokens = split(valueOrElse(getString(this, kTokens), ""), ",")
129-
130128 func isAdminCall (i) = if (containsElement([admin1PK, admin2PK, admin3PK], i.callerPublicKey))
131129 then unit
132130 else throw("Only admin group1 can call this function")
152150 else throw("Only land contract can call this function")
153151
154152
153+func getAllTokens () = {
154+ let tokens = valueOrElse(getString(this, kTokens), "")
155+ if ((tokens == ""))
156+ then nil
157+ else split(tokens, ",")
158+ }
159+
160+
155161 func getAssetPrice (assetId) = getIntegerValue(priceOracleAddr, (assetId + kPriceInOracle))
156162
157163
170176
171177 func getAdoptedAPRByPeriod (period,aprPeriods,apr) = {
172178 func for (a,aperiod) = {
173- let $t053515373 = a
174- let index = $t053515373._1
175- let found = $t053515373._2
179+ let $t054205442 = a
180+ let index = $t054205442._1
181+ let found = $t054205442._2
176182 let ft = split(aperiod, "-")
177- let $t054105473 = $Tuple2(parseIntValue(ft[0]), parseIntValue(ft[1]))
178- let from = $t054105473._1
179- let to = $t054105473._2
183+ let $t054795542 = $Tuple2(parseIntValue(ft[0]), parseIntValue(ft[1]))
184+ let from = $t054795542._1
185+ let to = $t054795542._2
180186 if (found)
181187 then a
182188 else if (if ((period >= from))
186192 else $Tuple2((index + 1), false)
187193 }
188194
189- let $t056105676 = {
195+ let $t056795745 = {
190196 let $l = LENDERS_APR_PERIODS
191197 let $s = size($l)
192198 let $acc0 = $Tuple2(0, false)
200206
201207 $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)
202208 }
203- let index = $t056105676._1
204- let found = $t056105676._2
209+ let index = $t056795745._1
210+ let found = $t056795745._2
205211 if (found)
206212 then fraction((LENDERS_APR[index] * SCALE8), 7, 365)
207213 else 0
210216
211217 func getTotalSupplyAllTokens () = {
212218 func for (a,tokenId) = {
213- let $t058645920 = a
214- let totalSupply = $t058645920._1
215- let totalSupplyUsd = $t058645920._2
216- let totalSupplyUsdAll = $t058645920._3
219+ let $t059335989 = a
220+ let totalSupply = $t059335989._1
221+ let totalSupplyUsd = $t059335989._2
222+ let totalSupplyUsdAll = $t059335989._3
217223 let tSupply = valueOrElse(getInteger(lendContract, (kLendTokenSupply + tokenId)), 0)
218224 let assetPrice = getAssetPrice(tokenId)
219225 let assetPrecision = getAssetPrecision(tokenId)
221227 $Tuple3((totalSupply :+ tSupply), (totalSupplyUsd :+ tSupplyUsd), (totalSupplyUsdAll + tSupplyUsd))
222228 }
223229
224- let $l = allTokens
230+ let $l = getAllTokens()
225231 let $s = size($l)
226232 let $acc0 = $Tuple3(nil, nil, 0)
227233 func $f0_1 ($a,$i) = if (($i >= $s))
298304
299305 func claimLenderRewardsCommon (user,readOnly) = {
300306 func claim (a,tokenId) = {
301- let $t087648808 = a
302- let tokenIds = $t087648808._1
303- let cAmount = $t087648808._2
304- let total = $t087648808._3
305- let enteries = $t087648808._4
307+ let $t088388882 = a
308+ let tokenIds = $t088388882._1
309+ let cAmount = $t088388882._2
310+ let total = $t088388882._3
311+ let enteries = $t088388882._4
306312 let userAvailableClaim = valueOrElse(getInteger(this, (((tokenId + "_") + user) + kUserLendAvailableClaim)), 0)
307- let $t089219000 = calcLendUserReward(user, tokenId)
308- let uReward = $t089219000._1
309- let newTokenInterest = $t089219000._2
310- let userSupply = $t089219000._3
313+ let $t089959074 = calcLendUserReward(user, tokenId)
314+ let uReward = $t089959074._1
315+ let newTokenInterest = $t089959074._2
316+ let userSupply = $t089959074._3
311317 let totalToClaim = (userAvailableClaim + uReward)
312318 if (if ((totalToClaim > 0))
313319 then true
323329 else $Tuple4(tokenIds, cAmount, total, enteries)
324330 }
325331
326- let $l = allTokens
332+ let $l = getAllTokens()
327333 let $s = size($l)
328334 let $acc0 = $Tuple4(nil, nil, 0, nil)
329335 func $f0_1 ($a,$i) = if (($i >= $s))
340346
341347 func claimLpRewardsCommon (user,readOnly) = {
342348 let userAvailableClaim = valueOrElse(getInteger(this, (user + kUserLpAvailableClaim)), 0)
343- let $t099279992 = calcLpUserReward(user)
344- let uReward = $t099279992._1
345- let newLpInterest = $t099279992._2
346- let userSupply = $t099279992._3
349+ let $t01000610071 = calcLpUserReward(user)
350+ let uReward = $t01000610071._1
351+ let newLpInterest = $t01000610071._2
352+ let userSupply = $t01000610071._3
347353 let totalToClaim = (userAvailableClaim + uReward)
348354 if (if (readOnly)
349355 then true
365371 }
366372
367373 let aprs = {
368- let $l = allTokens
374+ let $l = getAllTokens()
369375 let $s = size($l)
370376 let $acc0 = nil
371377 func $f0_1 ($a,$i) = if (($i >= $s))
397403 let rwpbUsd = fraction(rwpb, axlyPrice, axlyPrecision)
398404 let rwYear = ((rwpbUsd * periodLength) * 52)
399405 let lpApr = fraction(rwYear, SCALE8, lpTotalSupplyUsd)
400- $Tuple3(allTokens, aprs, lpApr)
406+ $Tuple3(getAllTokens(), aprs, lpApr)
401407 }
402408
403409
434440 @Callable(i)
435441 func lendAction (user,tokenId) = valueOrElse(isLandCall(i), {
436442 let userAvailableClaim = valueOrElse(getInteger(this, (tokenId + kUserLendAvailableClaim)), 0)
437- let $t01235412421 = calcLendUserReward(user, tokenId)
438- let uReward = $t01235412421._1
439- let newTokenInterest = $t01235412421._2
443+ let $t01244312510 = calcLendUserReward(user, tokenId)
444+ let uReward = $t01244312510._1
445+ let newTokenInterest = $t01244312510._2
440446 [IntegerEntry((((user + "_") + tokenId) + kUserLendInterest), newTokenInterest), IntegerEntry((((user + "_") + tokenId) + kUserLendAvailableClaim), (userAvailableClaim + uReward)), IntegerEntry((tokenId + kTokenInterest), newTokenInterest), IntegerEntry((tokenId + kTokenInterestHeight), height)]
441447 })
442448
445451 @Callable(i)
446452 func lpAction (user) = valueOrElse(isSFFarmingCall(i), {
447453 let userAvailableClaim = valueOrElse(getInteger(this, kUserLpAvailableClaim), 0)
448- let $t01288612939 = calcLpUserReward(user)
449- let uReward = $t01288612939._1
450- let newLpInterest = $t01288612939._2
454+ let $t01297513028 = calcLpUserReward(user)
455+ let uReward = $t01297513028._1
456+ let newLpInterest = $t01297513028._2
451457 [IntegerEntry((user + kUserLpInterest), newLpInterest), IntegerEntry((user + kUserLpAvailableClaim), (userAvailableClaim + uReward)), IntegerEntry((user + kLpInterest), newLpInterest), IntegerEntry((user + kLpInterestHeight), height)]
452458 })
453459
468474 else if (!(contains(getStringValue(lendContract, kLendSetupTokens), tokenId)))
469475 then throw("no token on landing")
470476 else {
471- let newAllTokens = if ((size(allTokens) == 0))
472- then [tokenId]
473- else (allTokens :+ tokenId)
477+ let newAllTokens = (getAllTokens() :+ tokenId)
474478 [IntegerEntry((tokenId + kTokenInterest), 0), IntegerEntry((tokenId + kTokenInterestHeight), max([startHeight, height])), StringEntry(kTokens, makeString(newAllTokens, ",")), IntegerEntry((tokenId + kTokenRewardPerBlock), 0)]
475479 })
476480
482486 if (((lastUpdateHeight + periodLength) > height))
483487 then throw("rewards alredy updated in this period")
484488 else {
485- let $t01474614826 = getTotalSupplyAllTokens()
486- let totalSupply = $t01474614826._1
487- let totalSupplyUsd = $t01474614826._2
488- let totalSupplyUsdAll = $t01474614826._3
489+ let $t01479514875 = getTotalSupplyAllTokens()
490+ let totalSupply = $t01479514875._1
491+ let totalSupplyUsd = $t01479514875._2
492+ let totalSupplyUsdAll = $t01479514875._3
489493 let axlyPrice = getAssetPrice(axlyId)
490494 let axlyPrecision = getAssetPrecision(axlyId)
491495 let maxAPR = getAdoptedAPRByPeriod(curPeriod, LENDERS_APR_PERIODS, LENDERS_APR)
492496 func updateReward (a,tokenId) = {
493- let $t01507015095 = a
494- let enteries = $t01507015095._1
495- let index = $t01507015095._2
497+ let $t01511915144 = a
498+ let enteries = $t01511915144._1
499+ let index = $t01511915144._2
496500 if ((totalSupply[index] == 0))
497- then $Tuple2((enteries ++ [IntegerEntry((tokenId + kTokenRewardPerBlock), 0), IntegerEntry((tokenId + kTokenInterest), calcNewTokenInterest(tokenId, totalSupply[index])), IntegerEntry((tokenId + kTokenInterestHeight), height)]), (index + 1))
501+ then $Tuple2((enteries ++ [IntegerEntry((tokenId + kPrevLendTokenSupply), totalSupply[index]), IntegerEntry((tokenId + kTokenRewardPerBlock), 0), IntegerEntry((tokenId + kTokenInterest), calcNewTokenInterest(tokenId, totalSupply[index])), IntegerEntry((tokenId + kTokenInterestHeight), max([startHeight, height]))]), (index + 1))
498502 else {
499503 let share = fraction(totalSupplyUsd[index], SCALE8, totalSupplyUsdAll)
500504 let maxReward = fraction(share, lendMaxPeriodAmount, SCALE8)
509513 let rewardUsd = min([maxRewardUsd, fraction(totalSupplyUsd[index], reward, SCALE8)])
510514 let rewardPeriod = fraction(rewardUsd, axlyPrice, axlyPrecision)
511515 let rewardPerBlock = (rewardPeriod / periodLength)
512- $Tuple2((enteries ++ [IntegerEntry((tokenId + kPrevLendTokenSupply), totalSupply[index]), IntegerEntry((tokenId + kTokenRewardPerBlock), rewardPerBlock), IntegerEntry((tokenId + kTokenInterest), calcNewTokenInterest(tokenId, totalSupply[index])), IntegerEntry((tokenId + kTokenInterestHeight), height)]), (index + 1))
516+ $Tuple2((enteries ++ [IntegerEntry((tokenId + kPrevLendTokenSupply), totalSupply[index]), IntegerEntry((tokenId + kTokenRewardPerBlock), rewardPerBlock), IntegerEntry((tokenId + kTokenInterest), calcNewTokenInterest(tokenId, totalSupply[index])), IntegerEntry((tokenId + kTokenInterestHeight), max([startHeight, height]))]), (index + 1))
513517 }
514518 }
515519
516- let $t01656616638 = {
517- let $l = allTokens
520+ let $t01673116808 = {
521+ let $l = getAllTokens()
518522 let $s = size($l)
519523 let $acc0 = $Tuple2(nil, 0)
520524 func $f0_1 ($a,$i) = if (($i >= $s))
527531
528532 $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)
529533 }
530- let tokensEnteries = $t01656616638._1
531- let index = $t01656616638._2
534+ let tokensEnteries = $t01673116808._1
535+ let index = $t01673116808._2
532536 let lpMaxAPR = getAdoptedAPRByPeriod(curPeriod, LP_APR_PERIODS, LP_APR)
533537 let lpTotalSupply = getIntegerValue(sfFarmingContract, (axlyPool + kSFTotalSupply))
534538 let preLPSupply = valueOrElse(getInteger(this, kPrevLPSupply), 0)
556560 let rewardLpUsd = min([maxLPRewardUsd, fraction(lpTotalSupplyUsd, rewardLp, SCALE8)])
557561 let rewardLpPeriod = fraction(rewardLpUsd, axlyPrice, axlyPrecision)
558562 let rewardLpPerBlock = (rewardLpPeriod / periodLength)
559- let lpEnteries = [IntegerEntry(kPrevLPSupply, lpTotalSupply), IntegerEntry(kLpRewardPerBlock, rewardLpPerBlock), IntegerEntry(kLpInterest, calcNewLpInterest(lpTotalSupply)), IntegerEntry(kLpInterestHeight, height)]
560- ((lpEnteries ++ tokensEnteries) :+ IntegerEntry(kRewardUpdateHeight, height))
563+ let lpEnteries = [IntegerEntry(kPrevLPSupply, lpTotalSupply), IntegerEntry(kLpRewardPerBlock, rewardLpPerBlock), IntegerEntry(kLpInterest, calcNewLpInterest(lpTotalSupply)), IntegerEntry(kLpInterestHeight, max([startHeight, height]))]
564+ ((lpEnteries ++ tokensEnteries) :+ IntegerEntry(kRewardUpdateHeight, max([startHeight, height])))
561565 }
562566 })
563567
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
128-let allTokens = split(valueOrElse(getString(this, kTokens), ""), ",")
129-
130128 func isAdminCall (i) = if (containsElement([admin1PK, admin2PK, admin3PK], i.callerPublicKey))
131129 then unit
132130 else throw("Only admin group1 can call this function")
133131
134132
135133 func isSelfCall (i) = if ((i.caller == this))
136134 then unit
137135 else throw("Only contract itself can call this function")
138136
139137
140138 func isOperatorCall (i) = if ((i.callerPublicKey == operatorPK))
141139 then unit
142140 else throw("Only operator can call this function")
143141
144142
145143 func isLandCall (i) = if ((i.caller == lendContract))
146144 then unit
147145 else throw("Only land contract can call this function")
148146
149147
150148 func isSFFarmingCall (i) = if ((i.caller == sfFarmingContract))
151149 then unit
152150 else throw("Only land contract can call this function")
153151
154152
153+func getAllTokens () = {
154+ let tokens = valueOrElse(getString(this, kTokens), "")
155+ if ((tokens == ""))
156+ then nil
157+ else split(tokens, ",")
158+ }
159+
160+
155161 func getAssetPrice (assetId) = getIntegerValue(priceOracleAddr, (assetId + kPriceInOracle))
156162
157163
158164 func getAssetDecimals (assetId) = if ((assetId == "WAVES"))
159165 then 8
160166 else match assetInfo(fromBase58String(assetId)) {
161167 case asset: Asset =>
162168 asset.decimals
163169 case _ =>
164170 throw("Can't find asset")
165171 }
166172
167173
168174 func getAssetPrecision (assetId) = pow(10, 0, getAssetDecimals(assetId), 0, 0, DOWN)
169175
170176
171177 func getAdoptedAPRByPeriod (period,aprPeriods,apr) = {
172178 func for (a,aperiod) = {
173- let $t053515373 = a
174- let index = $t053515373._1
175- let found = $t053515373._2
179+ let $t054205442 = a
180+ let index = $t054205442._1
181+ let found = $t054205442._2
176182 let ft = split(aperiod, "-")
177- let $t054105473 = $Tuple2(parseIntValue(ft[0]), parseIntValue(ft[1]))
178- let from = $t054105473._1
179- let to = $t054105473._2
183+ let $t054795542 = $Tuple2(parseIntValue(ft[0]), parseIntValue(ft[1]))
184+ let from = $t054795542._1
185+ let to = $t054795542._2
180186 if (found)
181187 then a
182188 else if (if ((period >= from))
183189 then (to >= period)
184190 else false)
185191 then $Tuple2(index, true)
186192 else $Tuple2((index + 1), false)
187193 }
188194
189- let $t056105676 = {
195+ let $t056795745 = {
190196 let $l = LENDERS_APR_PERIODS
191197 let $s = size($l)
192198 let $acc0 = $Tuple2(0, false)
193199 func $f0_1 ($a,$i) = if (($i >= $s))
194200 then $a
195201 else for($a, $l[$i])
196202
197203 func $f0_2 ($a,$i) = if (($i >= $s))
198204 then $a
199205 else throw("List size exceeds 9")
200206
201207 $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)
202208 }
203- let index = $t056105676._1
204- let found = $t056105676._2
209+ let index = $t056795745._1
210+ let found = $t056795745._2
205211 if (found)
206212 then fraction((LENDERS_APR[index] * SCALE8), 7, 365)
207213 else 0
208214 }
209215
210216
211217 func getTotalSupplyAllTokens () = {
212218 func for (a,tokenId) = {
213- let $t058645920 = a
214- let totalSupply = $t058645920._1
215- let totalSupplyUsd = $t058645920._2
216- let totalSupplyUsdAll = $t058645920._3
219+ let $t059335989 = a
220+ let totalSupply = $t059335989._1
221+ let totalSupplyUsd = $t059335989._2
222+ let totalSupplyUsdAll = $t059335989._3
217223 let tSupply = valueOrElse(getInteger(lendContract, (kLendTokenSupply + tokenId)), 0)
218224 let assetPrice = getAssetPrice(tokenId)
219225 let assetPrecision = getAssetPrecision(tokenId)
220226 let tSupplyUsd = fraction(tSupply, assetPrice, assetPrecision)
221227 $Tuple3((totalSupply :+ tSupply), (totalSupplyUsd :+ tSupplyUsd), (totalSupplyUsdAll + tSupplyUsd))
222228 }
223229
224- let $l = allTokens
230+ let $l = getAllTokens()
225231 let $s = size($l)
226232 let $acc0 = $Tuple3(nil, nil, 0)
227233 func $f0_1 ($a,$i) = if (($i >= $s))
228234 then $a
229235 else for($a, $l[$i])
230236
231237 func $f0_2 ($a,$i) = if (($i >= $s))
232238 then $a
233239 else throw("List size exceeds 30")
234240
235241 $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)
236242 }
237243
238244
239245 func getTotalSupplyUsd (tokenId) = {
240246 let tSupply = valueOrElse(getInteger(lendContract, (kLendTokenSupply + tokenId)), 0)
241247 let assetPrice = getAssetPrice(tokenId)
242248 let assetPrecision = getAssetPrecision(tokenId)
243249 fraction(tSupply, assetPrice, assetPrecision)
244250 }
245251
246252
247253 func calcNewTokenInterest (tokenId,totalSupply) = if ((height >= startHeight))
248254 then 0
249255 else {
250256 let rewardPerBlock = getIntegerValue(this, (tokenId + kTokenRewardPerBlock))
251257 let oldInterest = getIntegerValue(this, (tokenId + kTokenInterest))
252258 let updateHeight = getIntegerValue(this, (tokenId + kTokenInterestHeight))
253259 let reward = ((height - updateHeight) * rewardPerBlock)
254260 let interest = if ((totalSupply > 0))
255261 then fraction(reward, SCALE8, totalSupply)
256262 else 0
257263 (oldInterest + interest)
258264 }
259265
260266
261267 func calcNewLpInterest (totalSupply) = if ((height >= startHeight))
262268 then 0
263269 else {
264270 let rewardPerBlock = getIntegerValue(this, kLpRewardPerBlock)
265271 let oldInterest = getIntegerValue(this, kLpInterest)
266272 let updateHeight = getIntegerValue(this, kLpInterestHeight)
267273 let reward = ((height - updateHeight) * rewardPerBlock)
268274 let interest = if ((totalSupply > 0))
269275 then fraction(reward, SCALE8, totalSupply)
270276 else 0
271277 (oldInterest + interest)
272278 }
273279
274280
275281 func calcLendUserReward (user,tokenId) = {
276282 let totalSupply = valueOrElse(getInteger(lendContract, (kLendTokenSupply + tokenId)), 0)
277283 let tokenInterest = calcNewTokenInterest(tokenId, totalSupply)
278284 let userSupply = valueOrElse(getInteger(lendContract, ((user + kLendUserSupply) + tokenId)), 0)
279285 let userTokenInterest = valueOrElse(getInteger(this, (((tokenId + "_") + user) + kUserLendInterest)), if ((userSupply == 0))
280286 then tokenInterest
281287 else 0)
282288 let reward = fraction(userSupply, (tokenInterest - userTokenInterest), SCALE8)
283289 $Tuple3(reward, tokenInterest, userSupply)
284290 }
285291
286292
287293 func calcLpUserReward (user) = {
288294 let totalSupply = valueOrElse(getInteger(sfFarmingContract, (axlyPool + kSFTotalSupply)), 0)
289295 let tokenInterest = calcNewLpInterest(totalSupply)
290296 let userSupply = valueOrElse(getInteger(lendContract, (((axlyPool + "_") + user) + kSFUserTotalSupply)), 0)
291297 let userTokenInterest = valueOrElse(getInteger(this, (user + kUserLpInterest)), if ((userSupply == 0))
292298 then tokenInterest
293299 else 0)
294300 let reward = fraction(userSupply, (tokenInterest - userTokenInterest), SCALE8)
295301 $Tuple3(reward, tokenInterest, userSupply)
296302 }
297303
298304
299305 func claimLenderRewardsCommon (user,readOnly) = {
300306 func claim (a,tokenId) = {
301- let $t087648808 = a
302- let tokenIds = $t087648808._1
303- let cAmount = $t087648808._2
304- let total = $t087648808._3
305- let enteries = $t087648808._4
307+ let $t088388882 = a
308+ let tokenIds = $t088388882._1
309+ let cAmount = $t088388882._2
310+ let total = $t088388882._3
311+ let enteries = $t088388882._4
306312 let userAvailableClaim = valueOrElse(getInteger(this, (((tokenId + "_") + user) + kUserLendAvailableClaim)), 0)
307- let $t089219000 = calcLendUserReward(user, tokenId)
308- let uReward = $t089219000._1
309- let newTokenInterest = $t089219000._2
310- let userSupply = $t089219000._3
313+ let $t089959074 = calcLendUserReward(user, tokenId)
314+ let uReward = $t089959074._1
315+ let newTokenInterest = $t089959074._2
316+ let userSupply = $t089959074._3
311317 let totalToClaim = (userAvailableClaim + uReward)
312318 if (if ((totalToClaim > 0))
313319 then true
314320 else (userSupply > 0))
315321 then {
316322 let newEntreries = if (if (readOnly)
317323 then true
318324 else (totalToClaim == 0))
319325 then enteries
320326 else (enteries ++ [IntegerEntry((((tokenId + "_") + user) + kUserLendInterest), newTokenInterest), IntegerEntry((((tokenId + "_") + user) + kUserLendAvailableClaim), 0), IntegerEntry((tokenId + kTokenInterest), newTokenInterest), IntegerEntry((tokenId + kTokenInterestHeight), height)])
321327 $Tuple4((tokenIds :+ tokenId), (cAmount :+ totalToClaim), (total + totalToClaim), newEntreries)
322328 }
323329 else $Tuple4(tokenIds, cAmount, total, enteries)
324330 }
325331
326- let $l = allTokens
332+ let $l = getAllTokens()
327333 let $s = size($l)
328334 let $acc0 = $Tuple4(nil, nil, 0, nil)
329335 func $f0_1 ($a,$i) = if (($i >= $s))
330336 then $a
331337 else claim($a, $l[$i])
332338
333339 func $f0_2 ($a,$i) = if (($i >= $s))
334340 then $a
335341 else throw("List size exceeds 30")
336342
337343 $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)
338344 }
339345
340346
341347 func claimLpRewardsCommon (user,readOnly) = {
342348 let userAvailableClaim = valueOrElse(getInteger(this, (user + kUserLpAvailableClaim)), 0)
343- let $t099279992 = calcLpUserReward(user)
344- let uReward = $t099279992._1
345- let newLpInterest = $t099279992._2
346- let userSupply = $t099279992._3
349+ let $t01000610071 = calcLpUserReward(user)
350+ let uReward = $t01000610071._1
351+ let newLpInterest = $t01000610071._2
352+ let userSupply = $t01000610071._3
347353 let totalToClaim = (userAvailableClaim + uReward)
348354 if (if (readOnly)
349355 then true
350356 else (totalToClaim == 0))
351357 then $Tuple2(totalToClaim, nil)
352358 else $Tuple2(totalToClaim, [IntegerEntry((user + kUserLpInterest), newLpInterest), IntegerEntry((user + kUserLpAvailableClaim), 0), IntegerEntry(kLpInterest, newLpInterest), IntegerEntry(kLpInterestHeight, height)])
353359 }
354360
355361
356362 func getTokensAPRs () = {
357363 let axlyPrice = getAssetPrice(axlyId)
358364 let axlyPrecision = getAssetPrecision(axlyId)
359365 func tokensAprs (apr,tokenId) = {
360366 let rwpb = valueOrElse(getInteger(this, (tokenId + kTokenRewardPerBlock)), 0)
361367 let rwpbUsd = fraction(rwpb, axlyPrice, axlyPrecision)
362368 let rwYear = ((rwpbUsd * periodLength) * 52)
363369 let totalSupplyUsd = getTotalSupplyUsd(tokenId)
364370 (apr :+ fraction(rwYear, SCALE8, totalSupplyUsd))
365371 }
366372
367373 let aprs = {
368- let $l = allTokens
374+ let $l = getAllTokens()
369375 let $s = size($l)
370376 let $acc0 = nil
371377 func $f0_1 ($a,$i) = if (($i >= $s))
372378 then $a
373379 else tokensAprs($a, $l[$i])
374380
375381 func $f0_2 ($a,$i) = if (($i >= $s))
376382 then $a
377383 else throw("List size exceeds 30")
378384
379385 $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)
380386 }
381387 let lpTotalSupply = getIntegerValue(sfFarmingContract, (axlyPool + kSFTotalSupply))
382388 let lpId = getStringValue(addressFromStringValue(axlyPool), kLpId)
383389 let lpPrecision = getAssetPrecision(lpId)
384390 let lpPrice = {
385391 let @ = ({
386392 let @ = invoke(mainContract, "getShareAssetPriceREADONLY", [[lpId]], nil)
387393 if ($isInstanceOf(@, "List[Any]"))
388394 then @
389395 else throw(($getType(@) + " couldn't be cast to List[Any]"))
390396 })[0]
391397 if ($isInstanceOf(@, "Int"))
392398 then @
393399 else throw(($getType(@) + " couldn't be cast to Int"))
394400 }
395401 let lpTotalSupplyUsd = fraction(lpTotalSupply, lpPrice, lpPrecision)
396402 let rwpb = valueOrElse(getInteger(this, kLpRewardPerBlock), 0)
397403 let rwpbUsd = fraction(rwpb, axlyPrice, axlyPrecision)
398404 let rwYear = ((rwpbUsd * periodLength) * 52)
399405 let lpApr = fraction(rwYear, SCALE8, lpTotalSupplyUsd)
400- $Tuple3(allTokens, aprs, lpApr)
406+ $Tuple3(getAllTokens(), aprs, lpApr)
401407 }
402408
403409
404410 @Callable(i)
405411 func claimLenderRewards () = {
406412 let claimRes = claimLenderRewardsCommon(toString(i.caller), false)
407413 if ((claimRes._3 == 0))
408414 then throw("claim amount must be greater than 0")
409415 else {
410416 let inv = invoke(tokenContract, "withdrawLendReward", [claimRes._3, toString(i.caller)], nil)
411417 if ((inv == inv))
412418 then claimRes._4
413419 else throw("Strict value is not equal to itself.")
414420 }
415421 }
416422
417423
418424
419425 @Callable(i)
420426 func claimLpRewards () = {
421427 let claimRes = claimLpRewardsCommon(toString(i.caller), false)
422428 if ((claimRes._1 == 0))
423429 then throw("claim amount must be greater than 0")
424430 else {
425431 let inv = invoke(tokenContract, "withdrawLpReward", [claimRes._1, toString(i.caller)], nil)
426432 if ((inv == inv))
427433 then claimRes._2
428434 else throw("Strict value is not equal to itself.")
429435 }
430436 }
431437
432438
433439
434440 @Callable(i)
435441 func lendAction (user,tokenId) = valueOrElse(isLandCall(i), {
436442 let userAvailableClaim = valueOrElse(getInteger(this, (tokenId + kUserLendAvailableClaim)), 0)
437- let $t01235412421 = calcLendUserReward(user, tokenId)
438- let uReward = $t01235412421._1
439- let newTokenInterest = $t01235412421._2
443+ let $t01244312510 = calcLendUserReward(user, tokenId)
444+ let uReward = $t01244312510._1
445+ let newTokenInterest = $t01244312510._2
440446 [IntegerEntry((((user + "_") + tokenId) + kUserLendInterest), newTokenInterest), IntegerEntry((((user + "_") + tokenId) + kUserLendAvailableClaim), (userAvailableClaim + uReward)), IntegerEntry((tokenId + kTokenInterest), newTokenInterest), IntegerEntry((tokenId + kTokenInterestHeight), height)]
441447 })
442448
443449
444450
445451 @Callable(i)
446452 func lpAction (user) = valueOrElse(isSFFarmingCall(i), {
447453 let userAvailableClaim = valueOrElse(getInteger(this, kUserLpAvailableClaim), 0)
448- let $t01288612939 = calcLpUserReward(user)
449- let uReward = $t01288612939._1
450- let newLpInterest = $t01288612939._2
454+ let $t01297513028 = calcLpUserReward(user)
455+ let uReward = $t01297513028._1
456+ let newLpInterest = $t01297513028._2
451457 [IntegerEntry((user + kUserLpInterest), newLpInterest), IntegerEntry((user + kUserLpAvailableClaim), (userAvailableClaim + uReward)), IntegerEntry((user + kLpInterest), newLpInterest), IntegerEntry((user + kLpInterestHeight), height)]
452458 })
453459
454460
455461
456462 @Callable(i)
457463 func init (axlyMainContractAddr,axlyTokenomicContractAddr,axlyPoolAddr,farmingStartHeight,periodLength) = valueOrElse(isSelfCall(i), if (!(isDefined(addressFromString(axlyMainContractAddr))))
458464 then throw("Wrong farming address")
459465 else if (!(isDefined(addressFromString(axlyTokenomicContractAddr))))
460466 then throw("Wrong main contract address")
461467 else [StringEntry(kAxlyMainContract, axlyMainContractAddr), StringEntry(kAxlyTokenomicContract, axlyTokenomicContractAddr), StringEntry(kAxlyPool, axlyPoolAddr), IntegerEntry(kStartHeight, farmingStartHeight), IntegerEntry(kPeriodLength, periodLength)])
462468
463469
464470
465471 @Callable(i)
466472 func initNewToken (tokenId) = valueOrElse(isAdminCall(i), if (isDefined(getInteger(this, (tokenId + kTokenInterest))))
467473 then throw("token already inited")
468474 else if (!(contains(getStringValue(lendContract, kLendSetupTokens), tokenId)))
469475 then throw("no token on landing")
470476 else {
471- let newAllTokens = if ((size(allTokens) == 0))
472- then [tokenId]
473- else (allTokens :+ tokenId)
477+ let newAllTokens = (getAllTokens() :+ tokenId)
474478 [IntegerEntry((tokenId + kTokenInterest), 0), IntegerEntry((tokenId + kTokenInterestHeight), max([startHeight, height])), StringEntry(kTokens, makeString(newAllTokens, ",")), IntegerEntry((tokenId + kTokenRewardPerBlock), 0)]
475479 })
476480
477481
478482
479483 @Callable(i)
480484 func updateRewards () = valueOrElse(isOperatorCall(i), {
481485 let lastUpdateHeight = valueOrElse(getInteger(this, kRewardUpdateHeight), 0)
482486 if (((lastUpdateHeight + periodLength) > height))
483487 then throw("rewards alredy updated in this period")
484488 else {
485- let $t01474614826 = getTotalSupplyAllTokens()
486- let totalSupply = $t01474614826._1
487- let totalSupplyUsd = $t01474614826._2
488- let totalSupplyUsdAll = $t01474614826._3
489+ let $t01479514875 = getTotalSupplyAllTokens()
490+ let totalSupply = $t01479514875._1
491+ let totalSupplyUsd = $t01479514875._2
492+ let totalSupplyUsdAll = $t01479514875._3
489493 let axlyPrice = getAssetPrice(axlyId)
490494 let axlyPrecision = getAssetPrecision(axlyId)
491495 let maxAPR = getAdoptedAPRByPeriod(curPeriod, LENDERS_APR_PERIODS, LENDERS_APR)
492496 func updateReward (a,tokenId) = {
493- let $t01507015095 = a
494- let enteries = $t01507015095._1
495- let index = $t01507015095._2
497+ let $t01511915144 = a
498+ let enteries = $t01511915144._1
499+ let index = $t01511915144._2
496500 if ((totalSupply[index] == 0))
497- then $Tuple2((enteries ++ [IntegerEntry((tokenId + kTokenRewardPerBlock), 0), IntegerEntry((tokenId + kTokenInterest), calcNewTokenInterest(tokenId, totalSupply[index])), IntegerEntry((tokenId + kTokenInterestHeight), height)]), (index + 1))
501+ then $Tuple2((enteries ++ [IntegerEntry((tokenId + kPrevLendTokenSupply), totalSupply[index]), IntegerEntry((tokenId + kTokenRewardPerBlock), 0), IntegerEntry((tokenId + kTokenInterest), calcNewTokenInterest(tokenId, totalSupply[index])), IntegerEntry((tokenId + kTokenInterestHeight), max([startHeight, height]))]), (index + 1))
498502 else {
499503 let share = fraction(totalSupplyUsd[index], SCALE8, totalSupplyUsdAll)
500504 let maxReward = fraction(share, lendMaxPeriodAmount, SCALE8)
501505 let maxRewardUsd = fraction(maxReward, axlyPrice, axlyPrecision)
502506 let prevTotalSupply = valueOrElse(getInteger(this, kPrevLendTokenSupply), 0)
503507 let rtCoef = if (if ((prevTotalSupply == 0))
504508 then true
505509 else (totalSupply[index] == 0))
506510 then 0
507511 else fraction(prevTotalSupply, SCALE8, totalSupply[index])
508512 let reward = (min([(maxAPR * (SCALE8 + rtCoef)), fraction(maxAPR, (15 * SCALE8), 10)]) / SCALE8)
509513 let rewardUsd = min([maxRewardUsd, fraction(totalSupplyUsd[index], reward, SCALE8)])
510514 let rewardPeriod = fraction(rewardUsd, axlyPrice, axlyPrecision)
511515 let rewardPerBlock = (rewardPeriod / periodLength)
512- $Tuple2((enteries ++ [IntegerEntry((tokenId + kPrevLendTokenSupply), totalSupply[index]), IntegerEntry((tokenId + kTokenRewardPerBlock), rewardPerBlock), IntegerEntry((tokenId + kTokenInterest), calcNewTokenInterest(tokenId, totalSupply[index])), IntegerEntry((tokenId + kTokenInterestHeight), height)]), (index + 1))
516+ $Tuple2((enteries ++ [IntegerEntry((tokenId + kPrevLendTokenSupply), totalSupply[index]), IntegerEntry((tokenId + kTokenRewardPerBlock), rewardPerBlock), IntegerEntry((tokenId + kTokenInterest), calcNewTokenInterest(tokenId, totalSupply[index])), IntegerEntry((tokenId + kTokenInterestHeight), max([startHeight, height]))]), (index + 1))
513517 }
514518 }
515519
516- let $t01656616638 = {
517- let $l = allTokens
520+ let $t01673116808 = {
521+ let $l = getAllTokens()
518522 let $s = size($l)
519523 let $acc0 = $Tuple2(nil, 0)
520524 func $f0_1 ($a,$i) = if (($i >= $s))
521525 then $a
522526 else updateReward($a, $l[$i])
523527
524528 func $f0_2 ($a,$i) = if (($i >= $s))
525529 then $a
526530 else throw("List size exceeds 30")
527531
528532 $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)
529533 }
530- let tokensEnteries = $t01656616638._1
531- let index = $t01656616638._2
534+ let tokensEnteries = $t01673116808._1
535+ let index = $t01673116808._2
532536 let lpMaxAPR = getAdoptedAPRByPeriod(curPeriod, LP_APR_PERIODS, LP_APR)
533537 let lpTotalSupply = getIntegerValue(sfFarmingContract, (axlyPool + kSFTotalSupply))
534538 let preLPSupply = valueOrElse(getInteger(this, kPrevLPSupply), 0)
535539 let lpId = getStringValue(addressFromStringValue(axlyPool), kLpId)
536540 let lpPrecision = getAssetPrecision(lpId)
537541 let lpPrice = {
538542 let @ = ({
539543 let @ = invoke(mainContract, "getShareAssetPriceREADONLY", [[lpId]], nil)
540544 if ($isInstanceOf(@, "List[Any]"))
541545 then @
542546 else throw(($getType(@) + " couldn't be cast to List[Any]"))
543547 })[0]
544548 if ($isInstanceOf(@, "Int"))
545549 then @
546550 else throw(($getType(@) + " couldn't be cast to Int"))
547551 }
548552 let lpTotalSupplyUsd = fraction(lpTotalSupply, lpPrice, lpPrecision)
549553 let maxLPRewardUsd = fraction(lpMaxPeriodAmount, axlyPrice, axlyPrecision)
550554 let rtLPCoef = if (if ((preLPSupply == 0))
551555 then true
552556 else (lpTotalSupply == 0))
553557 then 0
554558 else fraction(preLPSupply, SCALE8, lpTotalSupply)
555559 let rewardLp = (min([(lpMaxAPR * (SCALE8 + rtLPCoef)), fraction(lpMaxAPR, (15 * SCALE8), 10)]) / SCALE8)
556560 let rewardLpUsd = min([maxLPRewardUsd, fraction(lpTotalSupplyUsd, rewardLp, SCALE8)])
557561 let rewardLpPeriod = fraction(rewardLpUsd, axlyPrice, axlyPrecision)
558562 let rewardLpPerBlock = (rewardLpPeriod / periodLength)
559- let lpEnteries = [IntegerEntry(kPrevLPSupply, lpTotalSupply), IntegerEntry(kLpRewardPerBlock, rewardLpPerBlock), IntegerEntry(kLpInterest, calcNewLpInterest(lpTotalSupply)), IntegerEntry(kLpInterestHeight, height)]
560- ((lpEnteries ++ tokensEnteries) :+ IntegerEntry(kRewardUpdateHeight, height))
563+ let lpEnteries = [IntegerEntry(kPrevLPSupply, lpTotalSupply), IntegerEntry(kLpRewardPerBlock, rewardLpPerBlock), IntegerEntry(kLpInterest, calcNewLpInterest(lpTotalSupply)), IntegerEntry(kLpInterestHeight, max([startHeight, height]))]
564+ ((lpEnteries ++ tokensEnteries) :+ IntegerEntry(kRewardUpdateHeight, max([startHeight, height])))
561565 }
562566 })
563567
564568
565569 @Verifier(tx)
566570 func verify () = {
567571 let multiSignedByAdmins = {
568572 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], admin1PK))
569573 then 1
570574 else 0
571575 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], admin2PK))
572576 then 1
573577 else 0
574578 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], admin3PK))
575579 then 1
576580 else 0
577581 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
578582 }
579583 match tx {
580584 case inv: InvokeScriptTransaction =>
581585 let isSelf = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
582586 let isRightFee = if ((inv.fee == 900000))
583587 then (inv.feeAssetId == unit)
584588 else false
585589 let isInitCall = (inv.function == "init")
586590 let isnoPayments = (size(inv.payments) == 0)
587591 if (if (if (if (isRightFee)
588592 then isInitCall
589593 else false)
590594 then isSelf
591595 else false)
592596 then isnoPayments
593597 else false)
594598 then true
595599 else multiSignedByAdmins
596600 case _ =>
597601 multiSignedByAdmins
598602 }
599603 }
600604

github/deemru/w8io/169f3d6 
90.30 ms