tx · 9PeiqCqKrU1iYVzK6Hs62mnJ7b3hCTxt1FDUdHBi1Dwi

3P37f8Y3rNpKzSkHNVZMAStXdpmNBgftHN9:  -0.02500000 Waves

2023.08.29 14:48 [3797584] smart account 3P37f8Y3rNpKzSkHNVZMAStXdpmNBgftHN9 > SELF 0.00000000 Waves

{ "type": 13, "id": "9PeiqCqKrU1iYVzK6Hs62mnJ7b3hCTxt1FDUdHBi1Dwi", "fee": 2500000, "feeAssetId": null, "timestamp": 1693309742254, "version": 2, "chainId": 87, "sender": "3P37f8Y3rNpKzSkHNVZMAStXdpmNBgftHN9", "senderPublicKey": "9WT32oFSZterQbwJTDArqGxecguq4u3AVfYJfdLYZLy8", "proofs": [ "", "2oqoHbvMh9tBVLvwx828h7mELTVV3g4bEybGGe93VAv8i2DrHbAjDNoNC3LWLCnxLHyUo6QHQeZrwYsRCTdiQ4Xf", "ihujWiioYrabhA8YF8sSKvsTYjrvRTyDTnPDhwnkRgfL6VnrBBTpiT6uFruPqmd8dsF61s8nr77GaMtQkaDcawM" ], "script": "base64:BgIhCAISABIAEgQKAggIEgMKAQgSBwoFCAgIAQESAwoBCBIAUgAGU0NBTEU4AIDC1y8AC0xFTkRFUlNfQVBSCQDMCAIAlgEJAMwIAgB4CQDMCAIAZAkAzAgCAFAJAMwIAgA8CQDMCAIAKAkAzAgCAB4JAMwIAgAUCQDMCAIACgUDbmlsABNMRU5ERVJTX0FQUl9QRVJJT0RTCQDMCAICAzEtMQkAzAgCAgMyLTIJAMwIAgIDMy0zCQDMCAICAzQtNAkAzAgCAgM1LTgJAMwIAgIEOS0xMgkAzAgCAgUxNC0xNgkAzAgCAgUxNy0yMAkAzAgCAgYyMC0xMDQFA25pbAATTEVOREVSU19NQVhfUEVSSU9EUwBoAAZMUF9BUFIJAMwIAgCWAQkAzAgCAHgJAMwIAgBkCQDMCAIAUAkAzAgCADwJAMwIAgAoBQNuaWwADkxQX0FQUl9QRVJJT0RTCQDMCAICAzEtMQkAzAgCAgMyLTIJAMwIAgIDMy0zCQDMCAICAzQtNAkAzAgCAgM1LTgJAMwIAgIEOS0xMgUDbmlsAA5MUF9NQVhfUEVSSU9EUwAMAAxrU3RhcnRIZWlnaHQCC3N0YXJ0SGVpZ2h0AA1rUGVyaW9kTGVuZ3RoAgxwZXJpb2RMZW5ndGgAEWtMZW5kZXJzTWF4QW1vdW50AhFsZW5kUmV3YXJkc0Ftb3VudAAMa0xQTWF4QW1vdW50Ag5scFJld2FyZEFtb3VudAAHa1Rva2VucwIGdG9rZW5zAAtrVXNlclN1cHBseQIQX3VzZXJUb3RhbFN1cHBseQAOa1Rva2VuSW50ZXJlc3QCDl90b2tlbkludGVyZXN0ABRrVG9rZW5JbnRlcmVzdEhlaWdodAIUX3Rva2VuSW50ZXJlc3RIZWlnaHQAFGtUb2tlblJld2FyZFBlckJsb2NrAhRfdG9rZW5SZXdhcmRQZXJCbG9jawARa0xhc3RVcGRhdGVQZXJpb2QCEnJld2FyZFVwZGF0ZVBlcmlvZAARa1VzZXJMZW5kSW50ZXJlc3QCEV91c2VyTGFuZEludGVyZXN0ABdrVXNlckxlbmRBdmFpbGFibGVDbGFpbQIXX3VzZXJMZW5kQXZhaWxhYmxlQ2xhaW0AFWtVc2VyTHBBdmFpbGFibGVDbGFpbQIVX3VzZXJMcEF2YWlsYWJsZUNsYWltAAtrTHBJbnRlcmVzdAIKbHBJbnRlcmVzdAARa0xwSW50ZXJlc3RIZWlnaHQCEGxwSW50ZXJlc3RIZWlnaHQADWtQcmV2TFBTdXBwbHkCEXByZXZMUFRvdGFsU3VwcGx5ABFrTHBSZXdhcmRQZXJCbG9jawIQbHBSZXdhcmRQZXJCbG9jawAPa1VzZXJMcEludGVyZXN0Ag9fdXNlckxwSW50ZXJlc3QADmtQcmljZUluT3JhY2xlAgdfdHdhcDVCABRrUHJldkxlbmRUb2tlblN1cHBseQIUX3ByZXZMZW5kVG90YWxTdXBwbHkADGtBWExZVG9rZW5JZAILYXhseVRva2VuSWQAEGtMZW5kVG9rZW5TdXBwbHkCD3RvdGFsX3N1cHBsaWVkXwAPa0xlbmRVc2VyU3VwcGx5Agpfc3VwcGxpZWRfABBrTGVuZFNldHVwVG9rZW5zAgxzZXR1cF90b2tlbnMADmtTRlRvdGFsU3VwcGx5AhpfdG90YWxfc2hhcmVfdG9rZW5zX2xvY2tlZAASa1NGVXNlclRvdGFsU3VwcGx5AhRfc2hhcmVfdG9rZW5zX2xvY2tlZAAJa0F4bHlQb29sAghheGx5UG9vbAAFa0xwSWQCDnNoYXJlX2Fzc2V0X2lkAAxrUHJpY2VPcmFjbGUCDHByaWNlX29yYWNsZQARa0F4bHlNYWluQ29udHJhY3QCDG1haW5Db250cmFjdAAWa0F4bHlUb2tlbm9taWNDb250cmFjdAIRdG9rZW5vbWljQ29udHJhY3QAEmtTRkZhcm1pbmdDb250cmFjdAITc3dvcGZpX2Zhcm1pbmdfYWRkcgANa0xlbmRDb250cmFjdAIRbGVuZF9zZXJ2aWNlX2FkZHIACWtBZG1pbjFQSwIVZ3JvdXAxX2FkbWluMV9wdWJfa2V5AAlrQWRtaW4yUEsCFWdyb3VwMV9hZG1pbjJfcHViX2tleQAJa0FkbWluM1BLAhVncm91cDFfYWRtaW4zX3B1Yl9rZXkAD2tPcGVyYXRvckNhbGxQSwISYWRtaW5fY2FsbF9wdWJfa2V5AAhheGx5UG9vbAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMFCWtBeGx5UG9vbAIWQ2FuJ3QgZ2V0IGF4bHlQb29sIGtleQAMbWFpbkNvbnRyYWN0CQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwURa0F4bHlNYWluQ29udHJhY3QCGUNhbid0IGdldCBtYWluQ29udGFjdCBrZXkADXRva2VuQ29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBRZrQXhseVRva2Vub21pY0NvbnRyYWN0Ah9DYW4ndCBnZXQgdG9rZW5vbWljQ29udHJhY3Qga2V5AAxsZW5kQ29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQxtYWluQ29udHJhY3QFDWtMZW5kQ29udHJhY3QCH0Nhbid0IGdldCBsZW5kX3NlcnZpY2VfYWRkciBrZXkAEXNmRmFybWluZ0NvbnRyYWN0CQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUMbWFpbkNvbnRyYWN0BRJrU0ZGYXJtaW5nQ29udHJhY3QCIUNhbid0IGdldCBzd29wZmlfZmFybWluZ19hZGRyIGtleQAPcHJpY2VPcmFjbGVBZGRyCQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUMbWFpbkNvbnRyYWN0BQxrUHJpY2VPcmFjbGUCGkNhbid0IGdldCBwcmljZV9vcmFjbGUga2V5AAhhZG1pbjFQSwkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUMbWFpbkNvbnRyYWN0BQlrQWRtaW4xUEsCEkNhbid0IGdldCBhZG1pbjFQSwAIYWRtaW4yUEsJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFDG1haW5Db250cmFjdAUJa0FkbWluMlBLAhJDYW4ndCBnZXQgYWRtaW4yUEsACGFkbWluM1BLCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQxtYWluQ29udHJhY3QFCWtBZG1pbjNQSwISQ2FuJ3QgZ2V0IGFkbWluM1BLAApvcGVyYXRvclBLCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQxtYWluQ29udHJhY3QFD2tPcGVyYXRvckNhbGxQSwIUQ2FuJ3QgZ2V0IG9wZXJhdG9yUEsABmF4bHlJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFDXRva2VuQ29udHJhY3QFDGtBWExZVG9rZW5JZAIXQ2FuJ3QgZ2V0IEF4bHkgdG9rZW4gaWQAC3N0YXJ0SGVpZ2h0CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzBQxrU3RhcnRIZWlnaHQADHBlcmlvZExlbmd0aAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwUNa1BlcmlvZExlbmd0aAANbGVuZE1heEFtb3VudAkBEUBleHRyTmF0aXZlKDEwNTApAgUNdG9rZW5Db250cmFjdAURa0xlbmRlcnNNYXhBbW91bnQAE2xlbmRNYXhQZXJpb2RBbW91bnQJAGkCBQ1sZW5kTWF4QW1vdW50BRNMRU5ERVJTX01BWF9QRVJJT0RTAAtscE1heEFtb3VudAkBEUBleHRyTmF0aXZlKDEwNTApAgUNdG9rZW5Db250cmFjdAUMa0xQTWF4QW1vdW50ABFscE1heFBlcmlvZEFtb3VudAkAaQIFC2xwTWF4QW1vdW50BQ5MUF9NQVhfUEVSSU9EUwELaXNBZG1pbkNhbGwBAWkDCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQhhZG1pbjFQSwkAzAgCBQhhZG1pbjJQSwkAzAgCBQhhZG1pbjNQSwUDbmlsCAUBaQ9jYWxsZXJQdWJsaWNLZXkFBHVuaXQJAAIBAihPbmx5IGFkbWluIGdyb3VwMSBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uAQppc1NlbGZDYWxsAQFpAwkAAAIIBQFpBmNhbGxlcgUEdGhpcwUEdW5pdAkAAgECK09ubHkgY29udHJhY3QgaXRzZWxmIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24BDmlzT3BlcmF0b3JDYWxsAQFpAwkAAAIIBQFpD2NhbGxlclB1YmxpY0tleQUKb3BlcmF0b3JQSwUEdW5pdAkAAgECJE9ubHkgb3BlcmF0b3IgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgEKaXNMYW5kQ2FsbAEBaQMJAAACCAUBaQZjYWxsZXIFDGxlbmRDb250cmFjdAUEdW5pdAkAAgECKU9ubHkgbGFuZCBjb250cmFjdCBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uAQ9pc1NGRmFybWluZ0NhbGwBAWkDCQAAAggFAWkGY2FsbGVyBRFzZkZhcm1pbmdDb250cmFjdAUEdW5pdAkAAgECKU9ubHkgbGFuZCBjb250cmFjdCBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uAQxnZXRBbGxUb2tlbnMABAZ0b2tlbnMJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwUHa1Rva2VucwIAAwkAAAIFBnRva2VucwIABQNuaWwJALUJAgUGdG9rZW5zAgEsAQ1nZXRBc3NldFByaWNlAQdhc3NldElkCQERQGV4dHJOYXRpdmUoMTA1MCkCBQ9wcmljZU9yYWNsZUFkZHIJAKwCAgUHYXNzZXRJZAUOa1ByaWNlSW5PcmFjbGUBEGdldEFzc2V0RGVjaW1hbHMBB2Fzc2V0SWQDCQAAAgUHYXNzZXRJZAIFV0FWRVMACAQHJG1hdGNoMAkA7AcBCQDZBAEFB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIFQXNzZXQEBWFzc2V0BQckbWF0Y2gwCAUFYXNzZXQIZGVjaW1hbHMJAAIBAhBDYW4ndCBmaW5kIGFzc2V0ARFnZXRBc3NldFByZWNpc2lvbgEHYXNzZXRJZAkAbAYACgAACQEQZ2V0QXNzZXREZWNpbWFscwEFB2Fzc2V0SWQAAAAABQRET1dOARVnZXRBZG9wdGVkQVBSQnlQZXJpb2QDBnBlcmlvZAphcHJQZXJpb2RzA2FwcgoBA2ZvcgIBYQdhcGVyaW9kBAskdDA1MzY4NTM5MAUBYQQFaW5kZXgIBQskdDA1MzY4NTM5MAJfMQQFZm91bmQIBQskdDA1MzY4NTM5MAJfMgQCZnQJALUJAgUHYXBlcmlvZAIBLQQLJHQwNTQyNzU0OTAJAJQKAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmZ0AAAJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJmdAABBARmcm9tCAULJHQwNTQyNzU0OTACXzEEAnRvCAULJHQwNTQyNzU0OTACXzIDBQVmb3VuZAUBYQMDCQBnAgUGcGVyaW9kBQRmcm9tCQBnAgUCdG8FBnBlcmlvZAcJAJQKAgUFaW5kZXgGCQCUCgIJAGQCBQVpbmRleAABBwQLJHQwNTYyNzU2OTMKAAIkbAUTTEVOREVSU19BUFJfUEVSSU9EUwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgAABwoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEDZm9yAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA5CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJBAVpbmRleAgFCyR0MDU2Mjc1NjkzAl8xBAVmb3VuZAgFCyR0MDU2Mjc1NjkzAl8yAwUFZm91bmQJAGsDCQBoAgkAkQMCBQtMRU5ERVJTX0FQUgUFaW5kZXgFBlNDQUxFOAAHAO0CAAABF2dldFRvdGFsU3VwcGx5QWxsVG9rZW5zAAoBA2ZvcgIBYQd0b2tlbklkBAskdDA1ODgxNTkzNwUBYQQLdG90YWxTdXBwbHkIBQskdDA1ODgxNTkzNwJfMQQOdG90YWxTdXBwbHlVc2QIBQskdDA1ODgxNTkzNwJfMgQRdG90YWxTdXBwbHlVc2RBbGwIBQskdDA1ODgxNTkzNwJfMwQHdFN1cHBseQkBC3ZhbHVlT3JFbHNlAgkAmggCBQxsZW5kQ29udHJhY3QJAKwCAgUQa0xlbmRUb2tlblN1cHBseQUHdG9rZW5JZAAABAphc3NldFByaWNlCQENZ2V0QXNzZXRQcmljZQEFB3Rva2VuSWQEDmFzc2V0UHJlY2lzaW9uCQERZ2V0QXNzZXRQcmVjaXNpb24BBQd0b2tlbklkBAp0U3VwcGx5VXNkCQBrAwUHdFN1cHBseQUKYXNzZXRQcmljZQUOYXNzZXRQcmVjaXNpb24JAJUKAwkAzQgCBQt0b3RhbFN1cHBseQUHdFN1cHBseQkAzQgCBQ50b3RhbFN1cHBseVVzZAUKdFN1cHBseVVzZAkAZAIFEXRvdGFsU3VwcGx5VXNkQWxsBQp0U3VwcGx5VXNkCgACJGwJAQxnZXRBbGxUb2tlbnMACgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlQoDBQNuaWwFA25pbAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQNmb3ICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDMwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAAVABYAFwAYABkAGgAbABwAHQAeARFnZXRUb3RhbFN1cHBseVVzZAEHdG9rZW5JZAQHdFN1cHBseQkBC3ZhbHVlT3JFbHNlAgkAmggCBQxsZW5kQ29udHJhY3QJAKwCAgUQa0xlbmRUb2tlblN1cHBseQUHdG9rZW5JZAAABAphc3NldFByaWNlCQENZ2V0QXNzZXRQcmljZQEFB3Rva2VuSWQEDmFzc2V0UHJlY2lzaW9uCQERZ2V0QXNzZXRQcmVjaXNpb24BBQd0b2tlbklkCQBrAwUHdFN1cHBseQUKYXNzZXRQcmljZQUOYXNzZXRQcmVjaXNpb24BFGNhbGNOZXdUb2tlbkludGVyZXN0Agd0b2tlbklkC3RvdGFsU3VwcGx5AwkAZwIFC3N0YXJ0SGVpZ2h0BQZoZWlnaHQAAAQOcmV3YXJkUGVyQmxvY2sJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgUHdG9rZW5JZAUUa1Rva2VuUmV3YXJkUGVyQmxvY2sEC29sZEludGVyZXN0CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIFB3Rva2VuSWQFDmtUb2tlbkludGVyZXN0BAx1cGRhdGVIZWlnaHQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgUHdG9rZW5JZAUUa1Rva2VuSW50ZXJlc3RIZWlnaHQEBnJld2FyZAkAaAIJAGUCBQZoZWlnaHQFDHVwZGF0ZUhlaWdodAUOcmV3YXJkUGVyQmxvY2sECGludGVyZXN0AwkAZgIFC3RvdGFsU3VwcGx5AAAJAGsDBQZyZXdhcmQFBlNDQUxFOAULdG90YWxTdXBwbHkAAAkAZAIFC29sZEludGVyZXN0BQhpbnRlcmVzdAERY2FsY05ld0xwSW50ZXJlc3QBC3RvdGFsU3VwcGx5AwkAZwIFC3N0YXJ0SGVpZ2h0BQZoZWlnaHQAAAQOcmV3YXJkUGVyQmxvY2sJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwURa0xwUmV3YXJkUGVyQmxvY2sAAAQLb2xkSW50ZXJlc3QJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwULa0xwSW50ZXJlc3QAAAQMdXBkYXRlSGVpZ2h0CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFEWtMcEludGVyZXN0SGVpZ2h0BQZoZWlnaHQEBnJld2FyZAkAaAIJAGUCBQZoZWlnaHQFDHVwZGF0ZUhlaWdodAUOcmV3YXJkUGVyQmxvY2sECGludGVyZXN0AwkAZgIFC3RvdGFsU3VwcGx5AAAJAGsDBQZyZXdhcmQFBlNDQUxFOAULdG90YWxTdXBwbHkAAAkAZAIFC29sZEludGVyZXN0BQhpbnRlcmVzdAESY2FsY0xlbmRVc2VyUmV3YXJkAgR1c2VyB3Rva2VuSWQEC3RvdGFsU3VwcGx5CQELdmFsdWVPckVsc2UCCQCaCAIFDGxlbmRDb250cmFjdAkArAICBRBrTGVuZFRva2VuU3VwcGx5BQd0b2tlbklkAAAEDXRva2VuSW50ZXJlc3QJARRjYWxjTmV3VG9rZW5JbnRlcmVzdAIFB3Rva2VuSWQFC3RvdGFsU3VwcGx5BAp1c2VyU3VwcGx5CQELdmFsdWVPckVsc2UCCQCaCAIFDGxlbmRDb250cmFjdAkArAICCQCsAgIFBHVzZXIFD2tMZW5kVXNlclN1cHBseQUHdG9rZW5JZAAABBF1c2VyVG9rZW5JbnRlcmVzdAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICBQd0b2tlbklkAgFfBQR1c2VyBRFrVXNlckxlbmRJbnRlcmVzdAMJAAACBQp1c2VyU3VwcGx5AAAFDXRva2VuSW50ZXJlc3QAAAQGcmV3YXJkCQBrAwUKdXNlclN1cHBseQkAZQIFDXRva2VuSW50ZXJlc3QFEXVzZXJUb2tlbkludGVyZXN0BQZTQ0FMRTgJAJUKAwUGcmV3YXJkBQ10b2tlbkludGVyZXN0BQp1c2VyU3VwcGx5ARBjYWxjTHBVc2VyUmV3YXJkAQR1c2VyBAt0b3RhbFN1cHBseQkBC3ZhbHVlT3JFbHNlAgkAmggCBRFzZkZhcm1pbmdDb250cmFjdAkArAICBQhheGx5UG9vbAUOa1NGVG90YWxTdXBwbHkAAAQNdG9rZW5JbnRlcmVzdAkBEWNhbGNOZXdMcEludGVyZXN0AQULdG90YWxTdXBwbHkECnVzZXJTdXBwbHkJAQt2YWx1ZU9yRWxzZQIJAJoIAgURc2ZGYXJtaW5nQ29udHJhY3QJAKwCAgkArAICCQCsAgIFCGF4bHlQb29sAgFfBQR1c2VyBRJrU0ZVc2VyVG90YWxTdXBwbHkAAAQRdXNlclRva2VuSW50ZXJlc3QJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQR1c2VyBQ9rVXNlckxwSW50ZXJlc3QDCQAAAgUKdXNlclN1cHBseQAABQ10b2tlbkludGVyZXN0AAAEBnJld2FyZAkAawMFCnVzZXJTdXBwbHkJAGUCBQ10b2tlbkludGVyZXN0BRF1c2VyVG9rZW5JbnRlcmVzdAUGU0NBTEU4CQCVCgMFBnJld2FyZAUNdG9rZW5JbnRlcmVzdAUKdXNlclN1cHBseQEYY2xhaW1MZW5kZXJSZXdhcmRzQ29tbW9uAgR1c2VyCHJlYWRPbmx5CgEFY2xhaW0CAWEHdG9rZW5JZAQLJHQwODgyNjg4NzAFAWEECHRva2VuSWRzCAULJHQwODgyNjg4NzACXzEEB2NBbW91bnQIBQskdDA4ODI2ODg3MAJfMgQFdG90YWwIBQskdDA4ODI2ODg3MAJfMwQIZW50ZXJpZXMIBQskdDA4ODI2ODg3MAJfNAQSdXNlckF2YWlsYWJsZUNsYWltCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIFB3Rva2VuSWQCAV8FBHVzZXIFF2tVc2VyTGVuZEF2YWlsYWJsZUNsYWltAAAECyR0MDg5ODM5MDYyCQESY2FsY0xlbmRVc2VyUmV3YXJkAgUEdXNlcgUHdG9rZW5JZAQHdVJld2FyZAgFCyR0MDg5ODM5MDYyAl8xBBBuZXdUb2tlbkludGVyZXN0CAULJHQwODk4MzkwNjICXzIECnVzZXJTdXBwbHkIBQskdDA4OTgzOTA2MgJfMwQMdG90YWxUb0NsYWltCQBkAgUSdXNlckF2YWlsYWJsZUNsYWltBQd1UmV3YXJkAwMJAGYCBQx0b3RhbFRvQ2xhaW0AAAYJAGYCBQp1c2VyU3VwcGx5AAAEDG5ld0VudHJlcmllcwMDBQhyZWFkT25seQYJAAACBQx0b3RhbFRvQ2xhaW0AAAUIZW50ZXJpZXMJAM4IAgUIZW50ZXJpZXMJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIFB3Rva2VuSWQCAV8FBHVzZXIFEWtVc2VyTGVuZEludGVyZXN0BRBuZXdUb2tlbkludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICBQd0b2tlbklkAgFfBQR1c2VyBRdrVXNlckxlbmRBdmFpbGFibGVDbGFpbQAACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFB3Rva2VuSWQFDmtUb2tlbkludGVyZXN0BRBuZXdUb2tlbkludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFB3Rva2VuSWQFFGtUb2tlbkludGVyZXN0SGVpZ2h0BQZoZWlnaHQFA25pbAkAlgoECQDNCAIFCHRva2VuSWRzBQd0b2tlbklkCQDNCAIFB2NBbW91bnQFDHRvdGFsVG9DbGFpbQkAZAIFBXRvdGFsBQx0b3RhbFRvQ2xhaW0FDG5ld0VudHJlcmllcwkAlgoEBQh0b2tlbklkcwUHY0Ftb3VudAUFdG90YWwFCGVudGVyaWVzCgACJGwJAQxnZXRBbGxUb2tlbnMACgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlgoEBQNuaWwFA25pbAAABQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBBWNsYWltAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAzMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgEUY2xhaW1McFJld2FyZHNDb21tb24CBHVzZXIIcmVhZE9ubHkEEnVzZXJBdmFpbGFibGVDbGFpbQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHVzZXIFFWtVc2VyTHBBdmFpbGFibGVDbGFpbQAABAwkdDA5OTkzMTAwNTgJARBjYWxjTHBVc2VyUmV3YXJkAQUEdXNlcgQHdVJld2FyZAgFDCR0MDk5OTMxMDA1OAJfMQQNbmV3THBJbnRlcmVzdAgFDCR0MDk5OTMxMDA1OAJfMgQKdXNlclN1cHBseQgFDCR0MDk5OTMxMDA1OAJfMwQMdG90YWxUb0NsYWltCQBkAgUSdXNlckF2YWlsYWJsZUNsYWltBQd1UmV3YXJkAwMFCHJlYWRPbmx5BgkAAAIFDHRvdGFsVG9DbGFpbQAACQCUCgIFDHRvdGFsVG9DbGFpbQUDbmlsCQCUCgIFDHRvdGFsVG9DbGFpbQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQR1c2VyBQ9rVXNlckxwSW50ZXJlc3QFDW5ld0xwSW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEdXNlcgUVa1VzZXJMcEF2YWlsYWJsZUNsYWltAAAJAMwIAgkBDEludGVnZXJFbnRyeQIFC2tMcEludGVyZXN0BQ1uZXdMcEludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRFrTHBJbnRlcmVzdEhlaWdodAUGaGVpZ2h0BQNuaWwBFGdldEF4bHlQcmljZU9uU3dvcGZpAAQIYUJhbGFuY2UJARFAZXh0ck5hdGl2ZSgxMDUwKQIJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCGF4bHlQb29sAg9BX2Fzc2V0X2JhbGFuY2UECGJCYWxhbmNlCQERQGV4dHJOYXRpdmUoMTA1MCkCCQERQGV4dHJOYXRpdmUoMTA2MikBBQhheGx5UG9vbAIPQl9hc3NldF9iYWxhbmNlBAZ3UHJpY2UJAQ1nZXRBc3NldFByaWNlAQIFV0FWRVMJAGsDBQhiQmFsYW5jZQUGd1ByaWNlBQhhQmFsYW5jZQERZ2V0QXhseVNoYXJlUHJpY2UABAhwb29sQWRkcgkBEUBleHRyTmF0aXZlKDEwNjIpAQUIYXhseVBvb2wECGFCYWxhbmNlCQERQGV4dHJOYXRpdmUoMTA1MCkCCQERQGV4dHJOYXRpdmUoMTA2MikBBQhheGx5UG9vbAIPQV9hc3NldF9iYWxhbmNlBAhiQmFsYW5jZQkBEUBleHRyTmF0aXZlKDEwNTApAgkBEUBleHRyTmF0aXZlKDEwNjIpAQUIYXhseVBvb2wCD0JfYXNzZXRfYmFsYW5jZQQHZFByaWNlQQkBFGdldEF4bHlQcmljZU9uU3dvcGZpAAQHZFByaWNlQgkBDWdldEFzc2V0UHJpY2UBAgVXQVZFUwMDCQBmAgAABQdkUHJpY2VBBgkAZgIAAAUHZFByaWNlQgD///////////8BBAtzaGFyZVN1cHBseQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQERQGV4dHJOYXRpdmUoMTA1MCkCBQhwb29sQWRkcgISc2hhcmVfYXNzZXRfc3VwcGx5AhxDYW4ndCBnZXQgc2hhcmUgYXNzZXQgc3VwcGx5BApBUHJlY2lzaW9uCQBsBgAKAAAACAAAAAAFBERPV04ECkJQcmVjaXNpb24JAGwGAAoAAAAIAAAAAAUERE9XTgQOc2hhcmVQcmVjaXNpb24JAGwGAAoAAAAIAAAAAAUERE9XTgQDc3VtCQBkAgkAawMFCGFCYWxhbmNlBQdkUHJpY2VBBQpBUHJlY2lzaW9uCQBrAwUIYkJhbGFuY2UFB2RQcmljZUIFCkJQcmVjaXNpb24JAGsDBQNzdW0FDnNoYXJlUHJlY2lzaW9uBQtzaGFyZVN1cHBseQENZ2V0VG9rZW5zQVBScwAECWF4bHlQcmljZQkBFGdldEF4bHlQcmljZU9uU3dvcGZpAAQNYXhseVByZWNpc2lvbgkBEWdldEFzc2V0UHJlY2lzaW9uAQUGYXhseUlkCgEKdG9rZW5zQXBycwIDYXByB3Rva2VuSWQEBHJ3cGIJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQd0b2tlbklkBRRrVG9rZW5SZXdhcmRQZXJCbG9jawAABAdyd3BiVXNkCQBrAwUEcndwYgUJYXhseVByaWNlBQ1heGx5UHJlY2lzaW9uBAZyd1llYXIJAGgCCQBoAgUHcndwYlVzZAUMcGVyaW9kTGVuZ3RoADQEDnRvdGFsU3VwcGx5VXNkCQERZ2V0VG90YWxTdXBwbHlVc2QBBQd0b2tlbklkCQDNCAIFA2FwcgkAawMFBnJ3WWVhcgUGU0NBTEU4BQ50b3RhbFN1cHBseVVzZAQEYXBycwoAAiRsCQEMZ2V0QWxsVG9rZW5zAAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEKdG9rZW5zQXBycwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMzAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsAHAAdAB4EDWxwVG90YWxTdXBwbHkJARFAZXh0ck5hdGl2ZSgxMDUwKQIFEXNmRmFybWluZ0NvbnRyYWN0CQCsAgIFCGF4bHlQb29sBQ5rU0ZUb3RhbFN1cHBseQQEbHBJZAkBEUBleHRyTmF0aXZlKDEwNTMpAgkBEUBleHRyTmF0aXZlKDEwNjIpAQUIYXhseVBvb2wFBWtMcElkBAtscFByZWNpc2lvbgkBEWdldEFzc2V0UHJlY2lzaW9uAQUEbHBJZAQHbHBQcmljZQkBEWdldEF4bHlTaGFyZVByaWNlAAQQbHBUb3RhbFN1cHBseVVzZAkAawMFDWxwVG90YWxTdXBwbHkFB2xwUHJpY2UFC2xwUHJlY2lzaW9uBARyd3BiCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFEWtMcFJld2FyZFBlckJsb2NrAAAEB3J3cGJVc2QJAGsDBQRyd3BiBQlheGx5UHJpY2UFDWF4bHlQcmVjaXNpb24EBnJ3WWVhcgkAaAIJAGgCBQdyd3BiVXNkBQxwZXJpb2RMZW5ndGgANAQFbHBBcHIJAGsDBQZyd1llYXIFBlNDQUxFOAUQbHBUb3RhbFN1cHBseVVzZAkAlQoDCQEMZ2V0QWxsVG9rZW5zAAUEYXBycwUFbHBBcHIHAWkBEmNsYWltTGVuZGVyUmV3YXJkcwAECGNsYWltUmVzCQEYY2xhaW1MZW5kZXJSZXdhcmRzQ29tbW9uAgkApQgBCAUBaQZjYWxsZXIHAwkAAAIIBQhjbGFpbVJlcwJfMwAACQACAQIjY2xhaW0gYW1vdW50IG11c3QgYmUgZ3JlYXRlciB0aGFuIDAEA2ludgkA/AcEBQ10b2tlbkNvbnRyYWN0AhJ3aXRoZHJhd0xlbmRSZXdhcmQJAMwIAggFCGNsYWltUmVzAl8zCQDMCAIJAKUIAQgFAWkGY2FsbGVyBQNuaWwFA25pbAMJAAACBQNpbnYFA2ludggFCGNsYWltUmVzAl80CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDmNsYWltTHBSZXdhcmRzAAQIY2xhaW1SZXMJARRjbGFpbUxwUmV3YXJkc0NvbW1vbgIJAKUIAQgFAWkGY2FsbGVyBwMJAAACCAUIY2xhaW1SZXMCXzEAAAkAAgECI2NsYWltIGFtb3VudCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwBANpbnYJAPwHBAUNdG9rZW5Db250cmFjdAIQd2l0aGRyYXdMcFJld2FyZAkAzAgCCAUIY2xhaW1SZXMCXzEJAMwIAgkApQgBCAUBaQZjYWxsZXIFA25pbAUDbmlsAwkAAAIFA2ludgUDaW52CAUIY2xhaW1SZXMCXzIJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEKbGVuZEFjdGlvbgIEdXNlcgd0b2tlbklkCQELdmFsdWVPckVsc2UCCQEKaXNMYW5kQ2FsbAEFAWkEEnVzZXJBdmFpbGFibGVDbGFpbQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICBQd0b2tlbklkAgFfBQR1c2VyBRdrVXNlckxlbmRBdmFpbGFibGVDbGFpbQAABA0kdDAxMzU1NTEzNjIyCQESY2FsY0xlbmRVc2VyUmV3YXJkAgUEdXNlcgUHdG9rZW5JZAQHdVJld2FyZAgFDSR0MDEzNTU1MTM2MjICXzEEEG5ld1Rva2VuSW50ZXJlc3QIBQ0kdDAxMzU1NTEzNjIyAl8yCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICBQd0b2tlbklkAgFfBQR1c2VyBRFrVXNlckxlbmRJbnRlcmVzdAUQbmV3VG9rZW5JbnRlcmVzdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgUHdG9rZW5JZAIBXwUEdXNlcgUXa1VzZXJMZW5kQXZhaWxhYmxlQ2xhaW0JAGQCBRJ1c2VyQXZhaWxhYmxlQ2xhaW0FB3VSZXdhcmQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUHdG9rZW5JZAUOa1Rva2VuSW50ZXJlc3QFEG5ld1Rva2VuSW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUHdG9rZW5JZAUUa1Rva2VuSW50ZXJlc3RIZWlnaHQFBmhlaWdodAUDbmlsAWkBCGxwQWN0aW9uAQR1c2VyCQELdmFsdWVPckVsc2UCCQEPaXNTRkZhcm1pbmdDYWxsAQUBaQQSdXNlckF2YWlsYWJsZUNsYWltCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEdXNlcgUVa1VzZXJMcEF2YWlsYWJsZUNsYWltAAAEDSR0MDE0MDk0MTQxNDcJARBjYWxjTHBVc2VyUmV3YXJkAQUEdXNlcgQHdVJld2FyZAgFDSR0MDE0MDk0MTQxNDcCXzEEDW5ld0xwSW50ZXJlc3QIBQ0kdDAxNDA5NDE0MTQ3Al8yCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHVzZXIFD2tVc2VyTHBJbnRlcmVzdAUNbmV3THBJbnRlcmVzdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQR1c2VyBRVrVXNlckxwQXZhaWxhYmxlQ2xhaW0JAGQCBRJ1c2VyQXZhaWxhYmxlQ2xhaW0FB3VSZXdhcmQJAMwIAgkBDEludGVnZXJFbnRyeQIFC2tMcEludGVyZXN0BQ1uZXdMcEludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRFrTHBJbnRlcmVzdEhlaWdodAUGaGVpZ2h0BQNuaWwBaQEEaW5pdAUUYXhseU1haW5Db250cmFjdEFkZHIZYXhseVRva2Vub21pY0NvbnRyYWN0QWRkcgxheGx5UG9vbEFkZHISZmFybWluZ1N0YXJ0SGVpZ2h0DHBlcmlvZExlbmd0aAkBC3ZhbHVlT3JFbHNlAgkBCmlzU2VsZkNhbGwBBQFpAwkBASEBCQEJaXNEZWZpbmVkAQkApggBBRRheGx5TWFpbkNvbnRyYWN0QWRkcgkAAgECFVdyb25nIGZhcm1pbmcgYWRkcmVzcwMJAQEhAQkBCWlzRGVmaW5lZAEJAKYIAQUZYXhseVRva2Vub21pY0NvbnRyYWN0QWRkcgkAAgECG1dyb25nIG1haW4gY29udHJhY3QgYWRkcmVzcwkAzAgCCQELU3RyaW5nRW50cnkCBRFrQXhseU1haW5Db250cmFjdAUUYXhseU1haW5Db250cmFjdEFkZHIJAMwIAgkBC1N0cmluZ0VudHJ5AgUWa0F4bHlUb2tlbm9taWNDb250cmFjdAUZYXhseVRva2Vub21pY0NvbnRyYWN0QWRkcgkAzAgCCQELU3RyaW5nRW50cnkCBQlrQXhseVBvb2wFDGF4bHlQb29sQWRkcgkAzAgCCQEMSW50ZWdlckVudHJ5AgUMa1N0YXJ0SGVpZ2h0BRJmYXJtaW5nU3RhcnRIZWlnaHQJAMwIAgkBDEludGVnZXJFbnRyeQIFDWtQZXJpb2RMZW5ndGgFDHBlcmlvZExlbmd0aAUDbmlsAWkBDGluaXROZXdUb2tlbgEHdG9rZW5JZAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMJAQlpc0RlZmluZWQBCQCaCAIFBHRoaXMJAKwCAgUHdG9rZW5JZAUOa1Rva2VuSW50ZXJlc3QJAAIBAhR0b2tlbiBhbHJlYWR5IGluaXRlZAMJAQEhAQkBCGNvbnRhaW5zAgkBEUBleHRyTmF0aXZlKDEwNTMpAgUMbGVuZENvbnRyYWN0BRBrTGVuZFNldHVwVG9rZW5zBQd0b2tlbklkCQACAQITbm8gdG9rZW4gb24gbGFuZGluZwQMbmV3QWxsVG9rZW5zCQDNCAIJAQxnZXRBbGxUb2tlbnMABQd0b2tlbklkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFB3Rva2VuSWQFDmtUb2tlbkludGVyZXN0AAAJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUHdG9rZW5JZAUUa1Rva2VuSW50ZXJlc3RIZWlnaHQJAJYDAQkAzAgCBQtzdGFydEhlaWdodAkAzAgCBQZoZWlnaHQFA25pbAkAzAgCCQELU3RyaW5nRW50cnkCBQdrVG9rZW5zCQC5CQIFDG5ld0FsbFRva2VucwIBLAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQd0b2tlbklkBRRrVG9rZW5SZXdhcmRQZXJCbG9jawAABQNuaWwBaQENdXBkYXRlUmV3YXJkcwAJAQt2YWx1ZU9yRWxzZQIJAQ5pc09wZXJhdG9yQ2FsbAEFAWkEEGxhc3RVcGRhdGVQZXJpb2QJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwURa0xhc3RVcGRhdGVQZXJpb2QAAAQKY2FsY1BlcmlvZAkAZAIJAGkCCQBlAgUGaGVpZ2h0BQtzdGFydEhlaWdodAUMcGVyaW9kTGVuZ3RoAAEECWN1clBlcmlvZAMJAGcCAAAFCmNhbGNQZXJpb2QAAQUKY2FsY1BlcmlvZAMJAGYCBQljdXJQZXJpb2QAaAkAAgECEW1heCBwZXJpb2QgaXMgMTA0AwMJAGcCBRBsYXN0VXBkYXRlUGVyaW9kBQljdXJQZXJpb2QJAQIhPQIFEGxhc3RVcGRhdGVQZXJpb2QAAAcJAAIBAiVyZXdhcmRzIGFscmVkeSB1cGRhdGVkIGluIHRoaXMgcGVyaW9kBA0kdDAxNjA5MTE2MjEyCQEXZ2V0VG90YWxTdXBwbHlBbGxUb2tlbnMABAt0b3RhbFN1cHBseQgFDSR0MDE2MDkxMTYyMTICXzEEDnRvdGFsU3VwcGx5VXNkCAUNJHQwMTYwOTExNjIxMgJfMgQRdG90YWxTdXBwbHlVc2RBbGwIBQ0kdDAxNjA5MTE2MjEyAl8zBAlheGx5UHJpY2UJARRnZXRBeGx5UHJpY2VPblN3b3BmaQAEDWF4bHlQcmVjaXNpb24JARFnZXRBc3NldFByZWNpc2lvbgEFBmF4bHlJZAQGbWF4QVBSCQEVZ2V0QWRvcHRlZEFQUkJ5UGVyaW9kAwUJY3VyUGVyaW9kBRNMRU5ERVJTX0FQUl9QRVJJT0RTBQtMRU5ERVJTX0FQUgoBDHVwZGF0ZVJld2FyZAIBYQd0b2tlbklkBA0kdDAxNjQ2MjE2NTA2BQFhBAhlbnRlcmllcwgFDSR0MDE2NDYyMTY1MDYCXzEEEXRvdGFsUGVyaW9kUmV3YXJkCAUNJHQwMTY0NjIxNjUwNgJfMgQFaW5kZXgIBQ0kdDAxNjQ2MjE2NTA2Al8zAwkAAAIJAJEDAgULdG90YWxTdXBwbHkFBWluZGV4AAAJAJUKAwkAzggCBQhlbnRlcmllcwkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQd0b2tlbklkBRRrUHJldkxlbmRUb2tlblN1cHBseQkAkQMCBQt0b3RhbFN1cHBseQUFaW5kZXgJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUHdG9rZW5JZAUUa1Rva2VuUmV3YXJkUGVyQmxvY2sAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQd0b2tlbklkBQ5rVG9rZW5JbnRlcmVzdAkBFGNhbGNOZXdUb2tlbkludGVyZXN0AgUHdG9rZW5JZAkAkQMCBQt0b3RhbFN1cHBseQUFaW5kZXgJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUHdG9rZW5JZAUUa1Rva2VuSW50ZXJlc3RIZWlnaHQJAJYDAQkAzAgCBQtzdGFydEhlaWdodAkAzAgCBQZoZWlnaHQFA25pbAUDbmlsBRF0b3RhbFBlcmlvZFJld2FyZAkAZAIFBWluZGV4AAEEBXNoYXJlCQBrAwkAkQMCBQ50b3RhbFN1cHBseVVzZAUFaW5kZXgFBlNDQUxFOAURdG90YWxTdXBwbHlVc2RBbGwECW1heFJld2FyZAkAawMFBXNoYXJlBRNsZW5kTWF4UGVyaW9kQW1vdW50BQZTQ0FMRTgEDG1heFJld2FyZFVzZAkAawMFCW1heFJld2FyZAUJYXhseVByaWNlBQ1heGx5UHJlY2lzaW9uBA9wcmV2VG90YWxTdXBwbHkJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQd0b2tlbklkBRRrUHJldkxlbmRUb2tlblN1cHBseQAABAZydENvZWYDAwkAAAIFD3ByZXZUb3RhbFN1cHBseQAABgkAAAIJAJEDAgULdG90YWxTdXBwbHkFBWluZGV4AAAAAAkAZQIJAGsDCQCRAwIFC3RvdGFsU3VwcGx5BQVpbmRleAUGU0NBTEU4BQ9wcmV2VG90YWxTdXBwbHkFBlNDQUxFOAQGcmV3YXJkCQBpAgkAaQIJAJcDAQkAzAgCCQBoAgUGbWF4QVBSCQBkAgUGU0NBTEU4CQCWAwEJAMwIAgUGcnRDb2VmCQDMCAIAAAUDbmlsCQDMCAIJAGsDBQZtYXhBUFIJAGgCAA8FBlNDQUxFOAAKBQNuaWwFBlNDQUxFOABkBAlyZXdhcmRVc2QJAJcDAQkAzAgCBQxtYXhSZXdhcmRVc2QJAMwIAgkAawMJAJEDAgUOdG90YWxTdXBwbHlVc2QFBWluZGV4BQZyZXdhcmQFBlNDQUxFOAUDbmlsBAxyZXdhcmRQZXJpb2QJAGsDBQlyZXdhcmRVc2QFDWF4bHlQcmVjaXNpb24FCWF4bHlQcmljZQQOcmV3YXJkUGVyQmxvY2sJAGkCBQxyZXdhcmRQZXJpb2QFDHBlcmlvZExlbmd0aAkAlQoDCQDOCAIFCGVudGVyaWVzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFB3Rva2VuSWQFFGtQcmV2TGVuZFRva2VuU3VwcGx5CQCRAwIFC3RvdGFsU3VwcGx5BQVpbmRleAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQd0b2tlbklkBRRrVG9rZW5SZXdhcmRQZXJCbG9jawUOcmV3YXJkUGVyQmxvY2sJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUHdG9rZW5JZAUOa1Rva2VuSW50ZXJlc3QJARRjYWxjTmV3VG9rZW5JbnRlcmVzdAIFB3Rva2VuSWQJAJEDAgULdG90YWxTdXBwbHkFBWluZGV4CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFB3Rva2VuSWQFFGtUb2tlbkludGVyZXN0SGVpZ2h0CQCWAwEJAMwIAgULc3RhcnRIZWlnaHQJAMwIAgUGaGVpZ2h0BQNuaWwFA25pbAkAZAIFEXRvdGFsUGVyaW9kUmV3YXJkBQxyZXdhcmRQZXJpb2QJAGQCBQVpbmRleAABBA0kdDAxODE5ODE4MjkwCgACJGwJAQxnZXRBbGxUb2tlbnMACgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlQoDBQNuaWwAAAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQx1cGRhdGVSZXdhcmQCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDMwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAAVABYAFwAYABkAGgAbABwAHQAeBA50b2tlbnNFbnRlcmllcwgFDSR0MDE4MTk4MTgyOTACXzEEEHRvdGFsVG9rZW5SZXdhcmQIBQ0kdDAxODE5ODE4MjkwAl8yBAhscE1heEFQUgkBFWdldEFkb3B0ZWRBUFJCeVBlcmlvZAMFCWN1clBlcmlvZAUOTFBfQVBSX1BFUklPRFMFBkxQX0FQUgQNbHBUb3RhbFN1cHBseQkBEUBleHRyTmF0aXZlKDEwNTApAgURc2ZGYXJtaW5nQ29udHJhY3QJAKwCAgUIYXhseVBvb2wFDmtTRlRvdGFsU3VwcGx5BAtwcmVMUFN1cHBseQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQ1rUHJldkxQU3VwcGx5AAAEBGxwSWQJARFAZXh0ck5hdGl2ZSgxMDUzKQIJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCGF4bHlQb29sBQVrTHBJZAQLbHBQcmVjaXNpb24JARFnZXRBc3NldFByZWNpc2lvbgEFBGxwSWQEB2xwUHJpY2UJARFnZXRBeGx5U2hhcmVQcmljZQAEEGxwVG90YWxTdXBwbHlVc2QJAGsDBQ1scFRvdGFsU3VwcGx5BQdscFByaWNlBQtscFByZWNpc2lvbgQObWF4TFBSZXdhcmRVc2QJAGsDBRFscE1heFBlcmlvZEFtb3VudAUJYXhseVByaWNlBQ1heGx5UHJlY2lzaW9uBAhydExQQ29lZgMDCQAAAgULcHJlTFBTdXBwbHkAAAYJAAACBQ1scFRvdGFsU3VwcGx5AAAAAAkAZQIJAGsDBQ1scFRvdGFsU3VwcGx5BQZTQ0FMRTgFC3ByZUxQU3VwcGx5BQZTQ0FMRTgECHJld2FyZExwCQBpAgkAaQIJAJcDAQkAzAgCCQBoAgUIbHBNYXhBUFIJAGQCBQZTQ0FMRTgJAJYDAQkAzAgCBQhydExQQ29lZgkAzAgCAAAFA25pbAkAzAgCCQBrAwUIbHBNYXhBUFIJAGgCAA8FBlNDQUxFOAAKBQNuaWwFBlNDQUxFOABkBAtyZXdhcmRMcFVzZAkAlwMBCQDMCAIFDm1heExQUmV3YXJkVXNkCQDMCAIJAGsDBRBscFRvdGFsU3VwcGx5VXNkBQhyZXdhcmRMcAUGU0NBTEU4BQNuaWwEDnJld2FyZExwUGVyaW9kCQBrAwULcmV3YXJkTHBVc2QFDWF4bHlQcmVjaXNpb24FCWF4bHlQcmljZQQQcmV3YXJkTHBQZXJCbG9jawkAaQIFDnJld2FyZExwUGVyaW9kBQxwZXJpb2RMZW5ndGgECGJ1cm5MZW5kCQBlAgUTbGVuZE1heFBlcmlvZEFtb3VudAUQdG90YWxUb2tlblJld2FyZAQGYnVybkxwCQBlAgURbHBNYXhQZXJpb2RBbW91bnQFDnJld2FyZExwUGVyaW9kBANpbnYJAPwHBAUNdG9rZW5Db250cmFjdAIQd2l0aGRyYXdMcFJld2FyZAkAzAgCCQBkAgUIYnVybkxlbmQFBmJ1cm5McAkAzAgCCQClCAEFBHRoaXMFA25pbAUDbmlsAwkAAAIFA2ludgUDaW52BApscEVudGVyaWVzAwkAZwIADAUJY3VyUGVyaW9kCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ1rUHJldkxQU3VwcGx5BQ1scFRvdGFsU3VwcGx5CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRFrTHBSZXdhcmRQZXJCbG9jawUQcmV3YXJkTHBQZXJCbG9jawkAzAgCCQEMSW50ZWdlckVudHJ5AgULa0xwSW50ZXJlc3QJARFjYWxjTmV3THBJbnRlcmVzdAEFDWxwVG90YWxTdXBwbHkJAMwIAgkBDEludGVnZXJFbnRyeQIFEWtMcEludGVyZXN0SGVpZ2h0CQCWAwEJAMwIAgULc3RhcnRIZWlnaHQJAMwIAgUGaGVpZ2h0BQNuaWwJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBARoBVCeRLDw6Cc0O274F1dPN7wpIGPs2Az2GuwUIYnVybkxlbmQJANkEAQUGYXhseUlkCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQEaAVQnkSw8OgnNDtu+BdXTze8KSBj7NgM9hrsFBmJ1cm5McAkA2QQBBQZheGx5SWQFA25pbAUDbmlsCQDNCAIJAM4IAgUKbHBFbnRlcmllcwUOdG9rZW5zRW50ZXJpZXMJAQxJbnRlZ2VyRW50cnkCBRFrTGFzdFVwZGF0ZVBlcmlvZAUJY3VyUGVyaW9kCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJ0eAEGdmVyaWZ5AAQTbXVsdGlTaWduZWRCeUFkbWlucwQSYWRtaW5QdWJLZXkxU2lnbmVkAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAUIYWRtaW4xUEsAAQAABBJhZG1pblB1YktleTJTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwABBQhhZG1pbjJQSwABAAAEEmFkbWluUHViS2V5M1NpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAIFCGFkbWluM1BLAAEAAAkAZwIJAGQCCQBkAgUSYWRtaW5QdWJLZXkxU2lnbmVkBRJhZG1pblB1YktleTJTaWduZWQFEmFkbWluUHViS2V5M1NpZ25lZAACBAckbWF0Y2gwBQJ0eAMJAAECBQckbWF0Y2gwAhdJbnZva2VTY3JpcHRUcmFuc2FjdGlvbgQDaW52BQckbWF0Y2gwBAZpc1NlbGYJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXkECmlzUmlnaHRGZWUDCQAAAggFA2ludgNmZWUAoPc2CQAAAggFA2ludgpmZWVBc3NldElkBQR1bml0BwQKaXNJbml0Q2FsbAkAAAIIBQNpbnYIZnVuY3Rpb24CBGluaXQEDGlzbm9QYXltZW50cwkAAAIJAJADAQgFA2ludghwYXltZW50cwAAAwMDAwUKaXNSaWdodEZlZQUKaXNJbml0Q2FsbAcFBmlzU2VsZgcFDGlzbm9QYXltZW50cwcGBRNtdWx0aVNpZ25lZEJ5QWRtaW5zBRNtdWx0aVNpZ25lZEJ5QWRtaW5zgwBALA==", "height": 3797584, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 3YtdhMqNaQt6gzBs3QxTYH2YoyKZVioisbVUgW3Pxd9y Next: 3S48ZLhuAiAYiKXJbtNAxzVmHpUmV3wAtRMGSTo5KD9S Diff:
OldNewDifferences
357357 }
358358
359359
360+func getAxlyPriceOnSwopfi () = {
361+ let aBalance = getIntegerValue(addressFromStringValue(axlyPool), "A_asset_balance")
362+ let bBalance = getIntegerValue(addressFromStringValue(axlyPool), "B_asset_balance")
363+ let wPrice = getAssetPrice("WAVES")
364+ fraction(bBalance, wPrice, aBalance)
365+ }
366+
367+
368+func getAxlySharePrice () = {
369+ let poolAddr = addressFromStringValue(axlyPool)
370+ let aBalance = getIntegerValue(addressFromStringValue(axlyPool), "A_asset_balance")
371+ let bBalance = getIntegerValue(addressFromStringValue(axlyPool), "B_asset_balance")
372+ let dPriceA = getAxlyPriceOnSwopfi()
373+ let dPriceB = getAssetPrice("WAVES")
374+ if (if ((0 > dPriceA))
375+ then true
376+ else (0 > dPriceB))
377+ then -1
378+ else {
379+ let shareSupply = valueOrErrorMessage(getIntegerValue(poolAddr, "share_asset_supply"), "Can't get share asset supply")
380+ let APrecision = pow(10, 0, 8, 0, 0, DOWN)
381+ let BPrecision = pow(10, 0, 8, 0, 0, DOWN)
382+ let sharePrecision = pow(10, 0, 8, 0, 0, DOWN)
383+ let sum = (fraction(aBalance, dPriceA, APrecision) + fraction(bBalance, dPriceB, BPrecision))
384+ fraction(sum, sharePrecision, shareSupply)
385+ }
386+ }
387+
388+
360389 func getTokensAPRs () = {
361- let axlyPrice = getAssetPrice(axlyId)
390+ let axlyPrice = getAxlyPriceOnSwopfi()
362391 let axlyPrecision = getAssetPrecision(axlyId)
363392 func tokensAprs (apr,tokenId) = {
364393 let rwpb = valueOrElse(getInteger(this, (tokenId + kTokenRewardPerBlock)), 0)
385414 let lpTotalSupply = getIntegerValue(sfFarmingContract, (axlyPool + kSFTotalSupply))
386415 let lpId = getStringValue(addressFromStringValue(axlyPool), kLpId)
387416 let lpPrecision = getAssetPrecision(lpId)
388- let lpPrice = {
389- let @ = invoke(mainContract, "getShareAssetPriceREADONLY", [lpId], nil)
390- if ($isInstanceOf(@, "Int"))
391- then @
392- else throw(($getType(@) + " couldn't be cast to Int"))
393- }
417+ let lpPrice = getAxlySharePrice()
394418 let lpTotalSupplyUsd = fraction(lpTotalSupply, lpPrice, lpPrecision)
395419 let rwpb = valueOrElse(getInteger(this, kLpRewardPerBlock), 0)
396420 let rwpbUsd = fraction(rwpb, axlyPrice, axlyPrecision)
433457 @Callable(i)
434458 func lendAction (user,tokenId) = valueOrElse(isLandCall(i), {
435459 let userAvailableClaim = valueOrElse(getInteger(this, (((tokenId + "_") + user) + kUserLendAvailableClaim)), 0)
436- let $t01241812485 = calcLendUserReward(user, tokenId)
437- let uReward = $t01241812485._1
438- let newTokenInterest = $t01241812485._2
460+ let $t01355513622 = calcLendUserReward(user, tokenId)
461+ let uReward = $t01355513622._1
462+ let newTokenInterest = $t01355513622._2
439463 [IntegerEntry((((tokenId + "_") + user) + kUserLendInterest), newTokenInterest), IntegerEntry((((tokenId + "_") + user) + kUserLendAvailableClaim), (userAvailableClaim + uReward)), IntegerEntry((tokenId + kTokenInterest), newTokenInterest), IntegerEntry((tokenId + kTokenInterestHeight), height)]
440464 })
441465
444468 @Callable(i)
445469 func lpAction (user) = valueOrElse(isSFFarmingCall(i), {
446470 let userAvailableClaim = valueOrElse(getInteger(this, (user + kUserLpAvailableClaim)), 0)
447- let $t01295713010 = calcLpUserReward(user)
448- let uReward = $t01295713010._1
449- let newLpInterest = $t01295713010._2
471+ let $t01409414147 = calcLpUserReward(user)
472+ let uReward = $t01409414147._1
473+ let newLpInterest = $t01409414147._2
450474 [IntegerEntry((user + kUserLpInterest), newLpInterest), IntegerEntry((user + kUserLpAvailableClaim), (userAvailableClaim + uReward)), IntegerEntry(kLpInterest, newLpInterest), IntegerEntry(kLpInterestHeight, height)]
451475 })
452476
487511 else false)
488512 then throw("rewards alredy updated in this period")
489513 else {
490- let $t01495415034 = getTotalSupplyAllTokens()
491- let totalSupply = $t01495415034._1
492- let totalSupplyUsd = $t01495415034._2
493- let totalSupplyUsdAll = $t01495415034._3
494- let axlyPrice = getAssetPrice(axlyId)
514+ let $t01609116212 = getTotalSupplyAllTokens()
515+ let totalSupply = $t01609116212._1
516+ let totalSupplyUsd = $t01609116212._2
517+ let totalSupplyUsdAll = $t01609116212._3
518+ let axlyPrice = getAxlyPriceOnSwopfi()
495519 let axlyPrecision = getAssetPrecision(axlyId)
496520 let maxAPR = getAdoptedAPRByPeriod(curPeriod, LENDERS_APR_PERIODS, LENDERS_APR)
497521 func updateReward (a,tokenId) = {
498- let $t01528315327 = a
499- let enteries = $t01528315327._1
500- let totalPeriodReward = $t01528315327._2
501- let index = $t01528315327._3
522+ let $t01646216506 = a
523+ let enteries = $t01646216506._1
524+ let totalPeriodReward = $t01646216506._2
525+ let index = $t01646216506._3
502526 if ((totalSupply[index] == 0))
503527 then $Tuple3((enteries ++ [IntegerEntry((tokenId + kPrevLendTokenSupply), totalSupply[index]), IntegerEntry((tokenId + kTokenRewardPerBlock), 0), IntegerEntry((tokenId + kTokenInterest), calcNewTokenInterest(tokenId, totalSupply[index])), IntegerEntry((tokenId + kTokenInterestHeight), max([startHeight, height]))]), totalPeriodReward, (index + 1))
504528 else {
519543 }
520544 }
521545
522- let $t01701917111 = {
546+ let $t01819818290 = {
523547 let $l = getAllTokens()
524548 let $s = size($l)
525549 let $acc0 = $Tuple3(nil, 0, 0)
533557
534558 $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)
535559 }
536- let tokensEnteries = $t01701917111._1
537- let totalTokenReward = $t01701917111._2
560+ let tokensEnteries = $t01819818290._1
561+ let totalTokenReward = $t01819818290._2
538562 let lpMaxAPR = getAdoptedAPRByPeriod(curPeriod, LP_APR_PERIODS, LP_APR)
539563 let lpTotalSupply = getIntegerValue(sfFarmingContract, (axlyPool + kSFTotalSupply))
540564 let preLPSupply = valueOrElse(getInteger(this, kPrevLPSupply), 0)
541565 let lpId = getStringValue(addressFromStringValue(axlyPool), kLpId)
542566 let lpPrecision = getAssetPrecision(lpId)
543- let lpPrice = {
544- let @ = invoke(mainContract, "getShareAssetPriceREADONLY", [lpId], nil)
545- if ($isInstanceOf(@, "Int"))
546- then @
547- else throw(($getType(@) + " couldn't be cast to Int"))
548- }
567+ let lpPrice = getAxlySharePrice()
549568 let lpTotalSupplyUsd = fraction(lpTotalSupply, lpPrice, lpPrecision)
550569 let maxLPRewardUsd = fraction(lpMaxPeriodAmount, axlyPrice, axlyPrecision)
551570 let rtLPCoef = if (if ((preLPSupply == 0))
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SCALE8 = 100000000
55
66 let LENDERS_APR = [150, 120, 100, 80, 60, 40, 30, 20, 10]
77
88 let LENDERS_APR_PERIODS = ["1-1", "2-2", "3-3", "4-4", "5-8", "9-12", "14-16", "17-20", "20-104"]
99
1010 let LENDERS_MAX_PERIODS = 104
1111
1212 let LP_APR = [150, 120, 100, 80, 60, 40]
1313
1414 let LP_APR_PERIODS = ["1-1", "2-2", "3-3", "4-4", "5-8", "9-12"]
1515
1616 let LP_MAX_PERIODS = 12
1717
1818 let kStartHeight = "startHeight"
1919
2020 let kPeriodLength = "periodLength"
2121
2222 let kLendersMaxAmount = "lendRewardsAmount"
2323
2424 let kLPMaxAmount = "lpRewardAmount"
2525
2626 let kTokens = "tokens"
2727
2828 let kUserSupply = "_userTotalSupply"
2929
3030 let kTokenInterest = "_tokenInterest"
3131
3232 let kTokenInterestHeight = "_tokenInterestHeight"
3333
3434 let kTokenRewardPerBlock = "_tokenRewardPerBlock"
3535
3636 let kLastUpdatePeriod = "rewardUpdatePeriod"
3737
3838 let kUserLendInterest = "_userLandInterest"
3939
4040 let kUserLendAvailableClaim = "_userLendAvailableClaim"
4141
4242 let kUserLpAvailableClaim = "_userLpAvailableClaim"
4343
4444 let kLpInterest = "lpInterest"
4545
4646 let kLpInterestHeight = "lpInterestHeight"
4747
4848 let kPrevLPSupply = "prevLPTotalSupply"
4949
5050 let kLpRewardPerBlock = "lpRewardPerBlock"
5151
5252 let kUserLpInterest = "_userLpInterest"
5353
5454 let kPriceInOracle = "_twap5B"
5555
5656 let kPrevLendTokenSupply = "_prevLendTotalSupply"
5757
5858 let kAXLYTokenId = "axlyTokenId"
5959
6060 let kLendTokenSupply = "total_supplied_"
6161
6262 let kLendUserSupply = "_supplied_"
6363
6464 let kLendSetupTokens = "setup_tokens"
6565
6666 let kSFTotalSupply = "_total_share_tokens_locked"
6767
6868 let kSFUserTotalSupply = "_share_tokens_locked"
6969
7070 let kAxlyPool = "axlyPool"
7171
7272 let kLpId = "share_asset_id"
7373
7474 let kPriceOracle = "price_oracle"
7575
7676 let kAxlyMainContract = "mainContract"
7777
7878 let kAxlyTokenomicContract = "tokenomicContract"
7979
8080 let kSFFarmingContract = "swopfi_farming_addr"
8181
8282 let kLendContract = "lend_service_addr"
8383
8484 let kAdmin1PK = "group1_admin1_pub_key"
8585
8686 let kAdmin2PK = "group1_admin2_pub_key"
8787
8888 let kAdmin3PK = "group1_admin3_pub_key"
8989
9090 let kOperatorCallPK = "admin_call_pub_key"
9191
9292 let axlyPool = valueOrErrorMessage(getString(this, kAxlyPool), "Can't get axlyPool key")
9393
9494 let mainContract = addressFromStringValue(valueOrErrorMessage(getString(this, kAxlyMainContract), "Can't get mainContact key"))
9595
9696 let tokenContract = addressFromStringValue(valueOrErrorMessage(getString(this, kAxlyTokenomicContract), "Can't get tokenomicContract key"))
9797
9898 let lendContract = addressFromStringValue(valueOrErrorMessage(getString(mainContract, kLendContract), "Can't get lend_service_addr key"))
9999
100100 let sfFarmingContract = addressFromStringValue(valueOrErrorMessage(getString(mainContract, kSFFarmingContract), "Can't get swopfi_farming_addr key"))
101101
102102 let priceOracleAddr = addressFromStringValue(valueOrErrorMessage(getString(mainContract, kPriceOracle), "Can't get price_oracle key"))
103103
104104 let admin1PK = fromBase58String(valueOrErrorMessage(getString(mainContract, kAdmin1PK), "Can't get admin1PK"))
105105
106106 let admin2PK = fromBase58String(valueOrErrorMessage(getString(mainContract, kAdmin2PK), "Can't get admin2PK"))
107107
108108 let admin3PK = fromBase58String(valueOrErrorMessage(getString(mainContract, kAdmin3PK), "Can't get admin3PK"))
109109
110110 let operatorPK = fromBase58String(valueOrErrorMessage(getString(mainContract, 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 lendMaxAmount = getIntegerValue(tokenContract, kLendersMaxAmount)
119119
120120 let lendMaxPeriodAmount = (lendMaxAmount / LENDERS_MAX_PERIODS)
121121
122122 let lpMaxAmount = getIntegerValue(tokenContract, kLPMaxAmount)
123123
124124 let lpMaxPeriodAmount = (lpMaxAmount / LP_MAX_PERIODS)
125125
126126 func isAdminCall (i) = if (containsElement([admin1PK, admin2PK, admin3PK], i.callerPublicKey))
127127 then unit
128128 else throw("Only admin group1 can call this function")
129129
130130
131131 func isSelfCall (i) = if ((i.caller == this))
132132 then unit
133133 else throw("Only contract itself can call this function")
134134
135135
136136 func isOperatorCall (i) = if ((i.callerPublicKey == operatorPK))
137137 then unit
138138 else throw("Only operator can call this function")
139139
140140
141141 func isLandCall (i) = if ((i.caller == lendContract))
142142 then unit
143143 else throw("Only land contract can call this function")
144144
145145
146146 func isSFFarmingCall (i) = if ((i.caller == sfFarmingContract))
147147 then unit
148148 else throw("Only land contract can call this function")
149149
150150
151151 func getAllTokens () = {
152152 let tokens = valueOrElse(getString(this, kTokens), "")
153153 if ((tokens == ""))
154154 then nil
155155 else split(tokens, ",")
156156 }
157157
158158
159159 func getAssetPrice (assetId) = getIntegerValue(priceOracleAddr, (assetId + kPriceInOracle))
160160
161161
162162 func getAssetDecimals (assetId) = if ((assetId == "WAVES"))
163163 then 8
164164 else match assetInfo(fromBase58String(assetId)) {
165165 case asset: Asset =>
166166 asset.decimals
167167 case _ =>
168168 throw("Can't find asset")
169169 }
170170
171171
172172 func getAssetPrecision (assetId) = pow(10, 0, getAssetDecimals(assetId), 0, 0, DOWN)
173173
174174
175175 func getAdoptedAPRByPeriod (period,aprPeriods,apr) = {
176176 func for (a,aperiod) = {
177177 let $t053685390 = a
178178 let index = $t053685390._1
179179 let found = $t053685390._2
180180 let ft = split(aperiod, "-")
181181 let $t054275490 = $Tuple2(parseIntValue(ft[0]), parseIntValue(ft[1]))
182182 let from = $t054275490._1
183183 let to = $t054275490._2
184184 if (found)
185185 then a
186186 else if (if ((period >= from))
187187 then (to >= period)
188188 else false)
189189 then $Tuple2(index, true)
190190 else $Tuple2((index + 1), false)
191191 }
192192
193193 let $t056275693 = {
194194 let $l = LENDERS_APR_PERIODS
195195 let $s = size($l)
196196 let $acc0 = $Tuple2(0, false)
197197 func $f0_1 ($a,$i) = if (($i >= $s))
198198 then $a
199199 else for($a, $l[$i])
200200
201201 func $f0_2 ($a,$i) = if (($i >= $s))
202202 then $a
203203 else throw("List size exceeds 9")
204204
205205 $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)
206206 }
207207 let index = $t056275693._1
208208 let found = $t056275693._2
209209 if (found)
210210 then fraction((LENDERS_APR[index] * SCALE8), 7, 365)
211211 else 0
212212 }
213213
214214
215215 func getTotalSupplyAllTokens () = {
216216 func for (a,tokenId) = {
217217 let $t058815937 = a
218218 let totalSupply = $t058815937._1
219219 let totalSupplyUsd = $t058815937._2
220220 let totalSupplyUsdAll = $t058815937._3
221221 let tSupply = valueOrElse(getInteger(lendContract, (kLendTokenSupply + tokenId)), 0)
222222 let assetPrice = getAssetPrice(tokenId)
223223 let assetPrecision = getAssetPrecision(tokenId)
224224 let tSupplyUsd = fraction(tSupply, assetPrice, assetPrecision)
225225 $Tuple3((totalSupply :+ tSupply), (totalSupplyUsd :+ tSupplyUsd), (totalSupplyUsdAll + tSupplyUsd))
226226 }
227227
228228 let $l = getAllTokens()
229229 let $s = size($l)
230230 let $acc0 = $Tuple3(nil, nil, 0)
231231 func $f0_1 ($a,$i) = if (($i >= $s))
232232 then $a
233233 else for($a, $l[$i])
234234
235235 func $f0_2 ($a,$i) = if (($i >= $s))
236236 then $a
237237 else throw("List size exceeds 30")
238238
239239 $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)
240240 }
241241
242242
243243 func getTotalSupplyUsd (tokenId) = {
244244 let tSupply = valueOrElse(getInteger(lendContract, (kLendTokenSupply + tokenId)), 0)
245245 let assetPrice = getAssetPrice(tokenId)
246246 let assetPrecision = getAssetPrecision(tokenId)
247247 fraction(tSupply, assetPrice, assetPrecision)
248248 }
249249
250250
251251 func calcNewTokenInterest (tokenId,totalSupply) = if ((startHeight >= height))
252252 then 0
253253 else {
254254 let rewardPerBlock = getIntegerValue(this, (tokenId + kTokenRewardPerBlock))
255255 let oldInterest = getIntegerValue(this, (tokenId + kTokenInterest))
256256 let updateHeight = getIntegerValue(this, (tokenId + kTokenInterestHeight))
257257 let reward = ((height - updateHeight) * rewardPerBlock)
258258 let interest = if ((totalSupply > 0))
259259 then fraction(reward, SCALE8, totalSupply)
260260 else 0
261261 (oldInterest + interest)
262262 }
263263
264264
265265 func calcNewLpInterest (totalSupply) = if ((startHeight >= height))
266266 then 0
267267 else {
268268 let rewardPerBlock = valueOrElse(getInteger(this, kLpRewardPerBlock), 0)
269269 let oldInterest = valueOrElse(getInteger(this, kLpInterest), 0)
270270 let updateHeight = valueOrElse(getInteger(this, kLpInterestHeight), height)
271271 let reward = ((height - updateHeight) * rewardPerBlock)
272272 let interest = if ((totalSupply > 0))
273273 then fraction(reward, SCALE8, totalSupply)
274274 else 0
275275 (oldInterest + interest)
276276 }
277277
278278
279279 func calcLendUserReward (user,tokenId) = {
280280 let totalSupply = valueOrElse(getInteger(lendContract, (kLendTokenSupply + tokenId)), 0)
281281 let tokenInterest = calcNewTokenInterest(tokenId, totalSupply)
282282 let userSupply = valueOrElse(getInteger(lendContract, ((user + kLendUserSupply) + tokenId)), 0)
283283 let userTokenInterest = valueOrElse(getInteger(this, (((tokenId + "_") + user) + kUserLendInterest)), if ((userSupply == 0))
284284 then tokenInterest
285285 else 0)
286286 let reward = fraction(userSupply, (tokenInterest - userTokenInterest), SCALE8)
287287 $Tuple3(reward, tokenInterest, userSupply)
288288 }
289289
290290
291291 func calcLpUserReward (user) = {
292292 let totalSupply = valueOrElse(getInteger(sfFarmingContract, (axlyPool + kSFTotalSupply)), 0)
293293 let tokenInterest = calcNewLpInterest(totalSupply)
294294 let userSupply = valueOrElse(getInteger(sfFarmingContract, (((axlyPool + "_") + user) + kSFUserTotalSupply)), 0)
295295 let userTokenInterest = valueOrElse(getInteger(this, (user + kUserLpInterest)), if ((userSupply == 0))
296296 then tokenInterest
297297 else 0)
298298 let reward = fraction(userSupply, (tokenInterest - userTokenInterest), SCALE8)
299299 $Tuple3(reward, tokenInterest, userSupply)
300300 }
301301
302302
303303 func claimLenderRewardsCommon (user,readOnly) = {
304304 func claim (a,tokenId) = {
305305 let $t088268870 = a
306306 let tokenIds = $t088268870._1
307307 let cAmount = $t088268870._2
308308 let total = $t088268870._3
309309 let enteries = $t088268870._4
310310 let userAvailableClaim = valueOrElse(getInteger(this, (((tokenId + "_") + user) + kUserLendAvailableClaim)), 0)
311311 let $t089839062 = calcLendUserReward(user, tokenId)
312312 let uReward = $t089839062._1
313313 let newTokenInterest = $t089839062._2
314314 let userSupply = $t089839062._3
315315 let totalToClaim = (userAvailableClaim + uReward)
316316 if (if ((totalToClaim > 0))
317317 then true
318318 else (userSupply > 0))
319319 then {
320320 let newEntreries = if (if (readOnly)
321321 then true
322322 else (totalToClaim == 0))
323323 then enteries
324324 else (enteries ++ [IntegerEntry((((tokenId + "_") + user) + kUserLendInterest), newTokenInterest), IntegerEntry((((tokenId + "_") + user) + kUserLendAvailableClaim), 0), IntegerEntry((tokenId + kTokenInterest), newTokenInterest), IntegerEntry((tokenId + kTokenInterestHeight), height)])
325325 $Tuple4((tokenIds :+ tokenId), (cAmount :+ totalToClaim), (total + totalToClaim), newEntreries)
326326 }
327327 else $Tuple4(tokenIds, cAmount, total, enteries)
328328 }
329329
330330 let $l = getAllTokens()
331331 let $s = size($l)
332332 let $acc0 = $Tuple4(nil, nil, 0, nil)
333333 func $f0_1 ($a,$i) = if (($i >= $s))
334334 then $a
335335 else claim($a, $l[$i])
336336
337337 func $f0_2 ($a,$i) = if (($i >= $s))
338338 then $a
339339 else throw("List size exceeds 30")
340340
341341 $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)
342342 }
343343
344344
345345 func claimLpRewardsCommon (user,readOnly) = {
346346 let userAvailableClaim = valueOrElse(getInteger(this, (user + kUserLpAvailableClaim)), 0)
347347 let $t0999310058 = calcLpUserReward(user)
348348 let uReward = $t0999310058._1
349349 let newLpInterest = $t0999310058._2
350350 let userSupply = $t0999310058._3
351351 let totalToClaim = (userAvailableClaim + uReward)
352352 if (if (readOnly)
353353 then true
354354 else (totalToClaim == 0))
355355 then $Tuple2(totalToClaim, nil)
356356 else $Tuple2(totalToClaim, [IntegerEntry((user + kUserLpInterest), newLpInterest), IntegerEntry((user + kUserLpAvailableClaim), 0), IntegerEntry(kLpInterest, newLpInterest), IntegerEntry(kLpInterestHeight, height)])
357357 }
358358
359359
360+func getAxlyPriceOnSwopfi () = {
361+ let aBalance = getIntegerValue(addressFromStringValue(axlyPool), "A_asset_balance")
362+ let bBalance = getIntegerValue(addressFromStringValue(axlyPool), "B_asset_balance")
363+ let wPrice = getAssetPrice("WAVES")
364+ fraction(bBalance, wPrice, aBalance)
365+ }
366+
367+
368+func getAxlySharePrice () = {
369+ let poolAddr = addressFromStringValue(axlyPool)
370+ let aBalance = getIntegerValue(addressFromStringValue(axlyPool), "A_asset_balance")
371+ let bBalance = getIntegerValue(addressFromStringValue(axlyPool), "B_asset_balance")
372+ let dPriceA = getAxlyPriceOnSwopfi()
373+ let dPriceB = getAssetPrice("WAVES")
374+ if (if ((0 > dPriceA))
375+ then true
376+ else (0 > dPriceB))
377+ then -1
378+ else {
379+ let shareSupply = valueOrErrorMessage(getIntegerValue(poolAddr, "share_asset_supply"), "Can't get share asset supply")
380+ let APrecision = pow(10, 0, 8, 0, 0, DOWN)
381+ let BPrecision = pow(10, 0, 8, 0, 0, DOWN)
382+ let sharePrecision = pow(10, 0, 8, 0, 0, DOWN)
383+ let sum = (fraction(aBalance, dPriceA, APrecision) + fraction(bBalance, dPriceB, BPrecision))
384+ fraction(sum, sharePrecision, shareSupply)
385+ }
386+ }
387+
388+
360389 func getTokensAPRs () = {
361- let axlyPrice = getAssetPrice(axlyId)
390+ let axlyPrice = getAxlyPriceOnSwopfi()
362391 let axlyPrecision = getAssetPrecision(axlyId)
363392 func tokensAprs (apr,tokenId) = {
364393 let rwpb = valueOrElse(getInteger(this, (tokenId + kTokenRewardPerBlock)), 0)
365394 let rwpbUsd = fraction(rwpb, axlyPrice, axlyPrecision)
366395 let rwYear = ((rwpbUsd * periodLength) * 52)
367396 let totalSupplyUsd = getTotalSupplyUsd(tokenId)
368397 (apr :+ fraction(rwYear, SCALE8, totalSupplyUsd))
369398 }
370399
371400 let aprs = {
372401 let $l = getAllTokens()
373402 let $s = size($l)
374403 let $acc0 = nil
375404 func $f0_1 ($a,$i) = if (($i >= $s))
376405 then $a
377406 else tokensAprs($a, $l[$i])
378407
379408 func $f0_2 ($a,$i) = if (($i >= $s))
380409 then $a
381410 else throw("List size exceeds 30")
382411
383412 $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)
384413 }
385414 let lpTotalSupply = getIntegerValue(sfFarmingContract, (axlyPool + kSFTotalSupply))
386415 let lpId = getStringValue(addressFromStringValue(axlyPool), kLpId)
387416 let lpPrecision = getAssetPrecision(lpId)
388- let lpPrice = {
389- let @ = invoke(mainContract, "getShareAssetPriceREADONLY", [lpId], nil)
390- if ($isInstanceOf(@, "Int"))
391- then @
392- else throw(($getType(@) + " couldn't be cast to Int"))
393- }
417+ let lpPrice = getAxlySharePrice()
394418 let lpTotalSupplyUsd = fraction(lpTotalSupply, lpPrice, lpPrecision)
395419 let rwpb = valueOrElse(getInteger(this, kLpRewardPerBlock), 0)
396420 let rwpbUsd = fraction(rwpb, axlyPrice, axlyPrecision)
397421 let rwYear = ((rwpbUsd * periodLength) * 52)
398422 let lpApr = fraction(rwYear, SCALE8, lpTotalSupplyUsd)
399423 $Tuple3(getAllTokens(), aprs, lpApr)
400424 }
401425
402426
403427 @Callable(i)
404428 func claimLenderRewards () = {
405429 let claimRes = claimLenderRewardsCommon(toString(i.caller), false)
406430 if ((claimRes._3 == 0))
407431 then throw("claim amount must be greater than 0")
408432 else {
409433 let inv = invoke(tokenContract, "withdrawLendReward", [claimRes._3, toString(i.caller)], nil)
410434 if ((inv == inv))
411435 then claimRes._4
412436 else throw("Strict value is not equal to itself.")
413437 }
414438 }
415439
416440
417441
418442 @Callable(i)
419443 func claimLpRewards () = {
420444 let claimRes = claimLpRewardsCommon(toString(i.caller), false)
421445 if ((claimRes._1 == 0))
422446 then throw("claim amount must be greater than 0")
423447 else {
424448 let inv = invoke(tokenContract, "withdrawLpReward", [claimRes._1, toString(i.caller)], nil)
425449 if ((inv == inv))
426450 then claimRes._2
427451 else throw("Strict value is not equal to itself.")
428452 }
429453 }
430454
431455
432456
433457 @Callable(i)
434458 func lendAction (user,tokenId) = valueOrElse(isLandCall(i), {
435459 let userAvailableClaim = valueOrElse(getInteger(this, (((tokenId + "_") + user) + kUserLendAvailableClaim)), 0)
436- let $t01241812485 = calcLendUserReward(user, tokenId)
437- let uReward = $t01241812485._1
438- let newTokenInterest = $t01241812485._2
460+ let $t01355513622 = calcLendUserReward(user, tokenId)
461+ let uReward = $t01355513622._1
462+ let newTokenInterest = $t01355513622._2
439463 [IntegerEntry((((tokenId + "_") + user) + kUserLendInterest), newTokenInterest), IntegerEntry((((tokenId + "_") + user) + kUserLendAvailableClaim), (userAvailableClaim + uReward)), IntegerEntry((tokenId + kTokenInterest), newTokenInterest), IntegerEntry((tokenId + kTokenInterestHeight), height)]
440464 })
441465
442466
443467
444468 @Callable(i)
445469 func lpAction (user) = valueOrElse(isSFFarmingCall(i), {
446470 let userAvailableClaim = valueOrElse(getInteger(this, (user + kUserLpAvailableClaim)), 0)
447- let $t01295713010 = calcLpUserReward(user)
448- let uReward = $t01295713010._1
449- let newLpInterest = $t01295713010._2
471+ let $t01409414147 = calcLpUserReward(user)
472+ let uReward = $t01409414147._1
473+ let newLpInterest = $t01409414147._2
450474 [IntegerEntry((user + kUserLpInterest), newLpInterest), IntegerEntry((user + kUserLpAvailableClaim), (userAvailableClaim + uReward)), IntegerEntry(kLpInterest, newLpInterest), IntegerEntry(kLpInterestHeight, height)]
451475 })
452476
453477
454478
455479 @Callable(i)
456480 func init (axlyMainContractAddr,axlyTokenomicContractAddr,axlyPoolAddr,farmingStartHeight,periodLength) = valueOrElse(isSelfCall(i), if (!(isDefined(addressFromString(axlyMainContractAddr))))
457481 then throw("Wrong farming address")
458482 else if (!(isDefined(addressFromString(axlyTokenomicContractAddr))))
459483 then throw("Wrong main contract address")
460484 else [StringEntry(kAxlyMainContract, axlyMainContractAddr), StringEntry(kAxlyTokenomicContract, axlyTokenomicContractAddr), StringEntry(kAxlyPool, axlyPoolAddr), IntegerEntry(kStartHeight, farmingStartHeight), IntegerEntry(kPeriodLength, periodLength)])
461485
462486
463487
464488 @Callable(i)
465489 func initNewToken (tokenId) = valueOrElse(isAdminCall(i), if (isDefined(getInteger(this, (tokenId + kTokenInterest))))
466490 then throw("token already inited")
467491 else if (!(contains(getStringValue(lendContract, kLendSetupTokens), tokenId)))
468492 then throw("no token on landing")
469493 else {
470494 let newAllTokens = (getAllTokens() :+ tokenId)
471495 [IntegerEntry((tokenId + kTokenInterest), 0), IntegerEntry((tokenId + kTokenInterestHeight), max([startHeight, height])), StringEntry(kTokens, makeString(newAllTokens, ",")), IntegerEntry((tokenId + kTokenRewardPerBlock), 0)]
472496 })
473497
474498
475499
476500 @Callable(i)
477501 func updateRewards () = valueOrElse(isOperatorCall(i), {
478502 let lastUpdatePeriod = valueOrElse(getInteger(this, kLastUpdatePeriod), 0)
479503 let calcPeriod = (((height - startHeight) / periodLength) + 1)
480504 let curPeriod = if ((0 >= calcPeriod))
481505 then 1
482506 else calcPeriod
483507 if ((curPeriod > 104))
484508 then throw("max period is 104")
485509 else if (if ((lastUpdatePeriod >= curPeriod))
486510 then (lastUpdatePeriod != 0)
487511 else false)
488512 then throw("rewards alredy updated in this period")
489513 else {
490- let $t01495415034 = getTotalSupplyAllTokens()
491- let totalSupply = $t01495415034._1
492- let totalSupplyUsd = $t01495415034._2
493- let totalSupplyUsdAll = $t01495415034._3
494- let axlyPrice = getAssetPrice(axlyId)
514+ let $t01609116212 = getTotalSupplyAllTokens()
515+ let totalSupply = $t01609116212._1
516+ let totalSupplyUsd = $t01609116212._2
517+ let totalSupplyUsdAll = $t01609116212._3
518+ let axlyPrice = getAxlyPriceOnSwopfi()
495519 let axlyPrecision = getAssetPrecision(axlyId)
496520 let maxAPR = getAdoptedAPRByPeriod(curPeriod, LENDERS_APR_PERIODS, LENDERS_APR)
497521 func updateReward (a,tokenId) = {
498- let $t01528315327 = a
499- let enteries = $t01528315327._1
500- let totalPeriodReward = $t01528315327._2
501- let index = $t01528315327._3
522+ let $t01646216506 = a
523+ let enteries = $t01646216506._1
524+ let totalPeriodReward = $t01646216506._2
525+ let index = $t01646216506._3
502526 if ((totalSupply[index] == 0))
503527 then $Tuple3((enteries ++ [IntegerEntry((tokenId + kPrevLendTokenSupply), totalSupply[index]), IntegerEntry((tokenId + kTokenRewardPerBlock), 0), IntegerEntry((tokenId + kTokenInterest), calcNewTokenInterest(tokenId, totalSupply[index])), IntegerEntry((tokenId + kTokenInterestHeight), max([startHeight, height]))]), totalPeriodReward, (index + 1))
504528 else {
505529 let share = fraction(totalSupplyUsd[index], SCALE8, totalSupplyUsdAll)
506530 let maxReward = fraction(share, lendMaxPeriodAmount, SCALE8)
507531 let maxRewardUsd = fraction(maxReward, axlyPrice, axlyPrecision)
508532 let prevTotalSupply = valueOrElse(getInteger(this, (tokenId + kPrevLendTokenSupply)), 0)
509533 let rtCoef = if (if ((prevTotalSupply == 0))
510534 then true
511535 else (totalSupply[index] == 0))
512536 then 0
513537 else (fraction(totalSupply[index], SCALE8, prevTotalSupply) - SCALE8)
514538 let reward = ((min([(maxAPR * (SCALE8 + max([rtCoef, 0]))), fraction(maxAPR, (15 * SCALE8), 10)]) / SCALE8) / 100)
515539 let rewardUsd = min([maxRewardUsd, fraction(totalSupplyUsd[index], reward, SCALE8)])
516540 let rewardPeriod = fraction(rewardUsd, axlyPrecision, axlyPrice)
517541 let rewardPerBlock = (rewardPeriod / periodLength)
518542 $Tuple3((enteries ++ [IntegerEntry((tokenId + kPrevLendTokenSupply), totalSupply[index]), IntegerEntry((tokenId + kTokenRewardPerBlock), rewardPerBlock), IntegerEntry((tokenId + kTokenInterest), calcNewTokenInterest(tokenId, totalSupply[index])), IntegerEntry((tokenId + kTokenInterestHeight), max([startHeight, height]))]), (totalPeriodReward + rewardPeriod), (index + 1))
519543 }
520544 }
521545
522- let $t01701917111 = {
546+ let $t01819818290 = {
523547 let $l = getAllTokens()
524548 let $s = size($l)
525549 let $acc0 = $Tuple3(nil, 0, 0)
526550 func $f0_1 ($a,$i) = if (($i >= $s))
527551 then $a
528552 else updateReward($a, $l[$i])
529553
530554 func $f0_2 ($a,$i) = if (($i >= $s))
531555 then $a
532556 else throw("List size exceeds 30")
533557
534558 $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)
535559 }
536- let tokensEnteries = $t01701917111._1
537- let totalTokenReward = $t01701917111._2
560+ let tokensEnteries = $t01819818290._1
561+ let totalTokenReward = $t01819818290._2
538562 let lpMaxAPR = getAdoptedAPRByPeriod(curPeriod, LP_APR_PERIODS, LP_APR)
539563 let lpTotalSupply = getIntegerValue(sfFarmingContract, (axlyPool + kSFTotalSupply))
540564 let preLPSupply = valueOrElse(getInteger(this, kPrevLPSupply), 0)
541565 let lpId = getStringValue(addressFromStringValue(axlyPool), kLpId)
542566 let lpPrecision = getAssetPrecision(lpId)
543- let lpPrice = {
544- let @ = invoke(mainContract, "getShareAssetPriceREADONLY", [lpId], nil)
545- if ($isInstanceOf(@, "Int"))
546- then @
547- else throw(($getType(@) + " couldn't be cast to Int"))
548- }
567+ let lpPrice = getAxlySharePrice()
549568 let lpTotalSupplyUsd = fraction(lpTotalSupply, lpPrice, lpPrecision)
550569 let maxLPRewardUsd = fraction(lpMaxPeriodAmount, axlyPrice, axlyPrecision)
551570 let rtLPCoef = if (if ((preLPSupply == 0))
552571 then true
553572 else (lpTotalSupply == 0))
554573 then 0
555574 else (fraction(lpTotalSupply, SCALE8, preLPSupply) - SCALE8)
556575 let rewardLp = ((min([(lpMaxAPR * (SCALE8 + max([rtLPCoef, 0]))), fraction(lpMaxAPR, (15 * SCALE8), 10)]) / SCALE8) / 100)
557576 let rewardLpUsd = min([maxLPRewardUsd, fraction(lpTotalSupplyUsd, rewardLp, SCALE8)])
558577 let rewardLpPeriod = fraction(rewardLpUsd, axlyPrecision, axlyPrice)
559578 let rewardLpPerBlock = (rewardLpPeriod / periodLength)
560579 let burnLend = (lendMaxPeriodAmount - totalTokenReward)
561580 let burnLp = (lpMaxPeriodAmount - rewardLpPeriod)
562581 let inv = invoke(tokenContract, "withdrawLpReward", [(burnLend + burnLp), toString(this)], nil)
563582 if ((inv == inv))
564583 then {
565584 let lpEnteries = if ((12 >= curPeriod))
566585 then [IntegerEntry(kPrevLPSupply, lpTotalSupply), IntegerEntry(kLpRewardPerBlock, rewardLpPerBlock), IntegerEntry(kLpInterest, calcNewLpInterest(lpTotalSupply)), IntegerEntry(kLpInterestHeight, max([startHeight, height])), ScriptTransfer(Address(base58'3MsXJ3BesPECkYejzBQGHZPJT8GVYy4Fd3Q'), burnLend, fromBase58String(axlyId)), ScriptTransfer(Address(base58'3MsXJ3BesPECkYejzBQGHZPJT8GVYy4Fd3Q'), burnLp, fromBase58String(axlyId))]
567586 else nil
568587 ((lpEnteries ++ tokensEnteries) :+ IntegerEntry(kLastUpdatePeriod, curPeriod))
569588 }
570589 else throw("Strict value is not equal to itself.")
571590 }
572591 })
573592
574593
575594 @Verifier(tx)
576595 func verify () = {
577596 let multiSignedByAdmins = {
578597 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], admin1PK))
579598 then 1
580599 else 0
581600 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], admin2PK))
582601 then 1
583602 else 0
584603 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], admin3PK))
585604 then 1
586605 else 0
587606 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
588607 }
589608 match tx {
590609 case inv: InvokeScriptTransaction =>
591610 let isSelf = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
592611 let isRightFee = if ((inv.fee == 900000))
593612 then (inv.feeAssetId == unit)
594613 else false
595614 let isInitCall = (inv.function == "init")
596615 let isnoPayments = (size(inv.payments) == 0)
597616 if (if (if (if (isRightFee)
598617 then isInitCall
599618 else false)
600619 then isSelf
601620 else false)
602621 then isnoPayments
603622 else false)
604623 then true
605624 else multiSignedByAdmins
606625 case _ =>
607626 multiSignedByAdmins
608627 }
609628 }
610629

github/deemru/w8io/3ef1775 
71.08 ms