tx · BcPFDyubc2ihgkYLp1VB1bBPkxM84L2kSdyBQdEwtXkb

3P37f8Y3rNpKzSkHNVZMAStXdpmNBgftHN9:  -0.02300000 Waves

2023.11.20 17:25 [3917697] smart account 3P37f8Y3rNpKzSkHNVZMAStXdpmNBgftHN9 > SELF 0.00000000 Waves

{ "type": 13, "id": "BcPFDyubc2ihgkYLp1VB1bBPkxM84L2kSdyBQdEwtXkb", "fee": 2300000, "feeAssetId": null, "timestamp": 1700490354908, "version": 2, "chainId": 87, "sender": "3P37f8Y3rNpKzSkHNVZMAStXdpmNBgftHN9", "senderPublicKey": "9WT32oFSZterQbwJTDArqGxecguq4u3AVfYJfdLYZLy8", "proofs": [ "", "2bhD9kEE9tAyxTRyF3B1ZRptZMM3Q2CLCGtjAggy3iAiFJM6DJn8oyGH9wHhNperdF9QSmw7acMVChyF8pThAsRb", "4Qgdap7AUyABaKgP6GB36hs7Vz6t75NFBrmbAuBAAg4KYBefexT5rRD3GD8Y8VZX9cRjYbprq5wpFwJArsnzuRpn" ], "script": "base64:BgIhCAISABIAEgQKAggIEgMKAQgSBwoFCAgIAQESAwoBCBIAUwAGU0NBTEU4AIDC1y8AC0xFTkRFUlNfQVBSCQDMCAIAlgEJAMwIAgB4CQDMCAIAZAkAzAgCAFAJAMwIAgA8CQDMCAIAKAkAzAgCAB4JAMwIAgAUCQDMCAIACgUDbmlsABNMRU5ERVJTX0FQUl9QRVJJT0RTCQDMCAICAzEtMQkAzAgCAgMyLTIJAMwIAgIDMy0zCQDMCAICAzQtNAkAzAgCAgM1LTgJAMwIAgIEOS0xMgkAzAgCAgUxNC0xNgkAzAgCAgUxNy0yMAkAzAgCAgYyMC0xMDQFA25pbAATTEVOREVSU19NQVhfUEVSSU9EUwBoAAZMUF9BUFIJAMwIAgCWAQkAzAgCAHgJAMwIAgBkCQDMCAIAUAkAzAgCADwJAMwIAgAoBQNuaWwADkxQX0FQUl9QRVJJT0RTCQDMCAICAzEtMQkAzAgCAgMyLTIJAMwIAgIDMy0zCQDMCAICAzQtNAkAzAgCAgM1LTgJAMwIAgIEOS0xMgUDbmlsAA5MUF9NQVhfUEVSSU9EUwAMAAxrU3RhcnRIZWlnaHQCC3N0YXJ0SGVpZ2h0AA1rUGVyaW9kTGVuZ3RoAgxwZXJpb2RMZW5ndGgAEWtMZW5kZXJzTWF4QW1vdW50AhFsZW5kUmV3YXJkc0Ftb3VudAAMa0xQTWF4QW1vdW50Ag5scFJld2FyZEFtb3VudAAHa1Rva2VucwIGdG9rZW5zAAtrVXNlclN1cHBseQIQX3VzZXJUb3RhbFN1cHBseQAOa1Rva2VuSW50ZXJlc3QCDl90b2tlbkludGVyZXN0ABRrVG9rZW5JbnRlcmVzdEhlaWdodAIUX3Rva2VuSW50ZXJlc3RIZWlnaHQAFGtUb2tlblJld2FyZFBlckJsb2NrAhRfdG9rZW5SZXdhcmRQZXJCbG9jawARa0xhc3RVcGRhdGVQZXJpb2QCEnJld2FyZFVwZGF0ZVBlcmlvZAARa1VzZXJMZW5kSW50ZXJlc3QCEV91c2VyTGFuZEludGVyZXN0ABdrVXNlckxlbmRBdmFpbGFibGVDbGFpbQIXX3VzZXJMZW5kQXZhaWxhYmxlQ2xhaW0AFWtVc2VyTHBBdmFpbGFibGVDbGFpbQIVX3VzZXJMcEF2YWlsYWJsZUNsYWltAAtrTHBJbnRlcmVzdAIKbHBJbnRlcmVzdAARa0xwSW50ZXJlc3RIZWlnaHQCEGxwSW50ZXJlc3RIZWlnaHQADWtQcmV2TFBTdXBwbHkCEXByZXZMUFRvdGFsU3VwcGx5ABFrTHBSZXdhcmRQZXJCbG9jawIQbHBSZXdhcmRQZXJCbG9jawAPa1VzZXJMcEludGVyZXN0Ag9fdXNlckxwSW50ZXJlc3QADmtQcmljZUluT3JhY2xlAgdfdHdhcDVCABRrUHJldkxlbmRUb2tlblN1cHBseQIUX3ByZXZMZW5kVG90YWxTdXBwbHkADGtBWExZVG9rZW5JZAILYXhseVRva2VuSWQAEGtMZW5kVG9rZW5TdXBwbHkCD3RvdGFsX3N1cHBsaWVkXwAPa0xlbmRVc2VyU3VwcGx5Agpfc3VwcGxpZWRfABBrTGVuZFNldHVwVG9rZW5zAgxzZXR1cF90b2tlbnMADmtTRlRvdGFsU3VwcGx5AhpfdG90YWxfc2hhcmVfdG9rZW5zX2xvY2tlZAASa1NGVXNlclRvdGFsU3VwcGx5AhRfc2hhcmVfdG9rZW5zX2xvY2tlZAAJa0F4bHlQb29sAghheGx5UG9vbAAFa0xwSWQCDnNoYXJlX2Fzc2V0X2lkAAxrUHJpY2VPcmFjbGUCDHByaWNlX29yYWNsZQARa0F4bHlNYWluQ29udHJhY3QCDG1haW5Db250cmFjdAAWa0F4bHlUb2tlbm9taWNDb250cmFjdAIRdG9rZW5vbWljQ29udHJhY3QAEmtTRkZhcm1pbmdDb250cmFjdAITc3dvcGZpX2Zhcm1pbmdfYWRkcgANa0xlbmRDb250cmFjdAIRbGVuZF9zZXJ2aWNlX2FkZHIACWtBZG1pbjFQSwIVZ3JvdXAxX2FkbWluMV9wdWJfa2V5AAlrQWRtaW4yUEsCFWdyb3VwMV9hZG1pbjJfcHViX2tleQAJa0FkbWluM1BLAhVncm91cDFfYWRtaW4zX3B1Yl9rZXkAD2tPcGVyYXRvckNhbGxQSwISYWRtaW5fY2FsbF9wdWJfa2V5AAhheGx5UG9vbAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMFCWtBeGx5UG9vbAIWQ2FuJ3QgZ2V0IGF4bHlQb29sIGtleQAMbWFpbkNvbnRyYWN0CQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwURa0F4bHlNYWluQ29udHJhY3QCGUNhbid0IGdldCBtYWluQ29udGFjdCBrZXkADXRva2VuQ29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBRZrQXhseVRva2Vub21pY0NvbnRyYWN0Ah9DYW4ndCBnZXQgdG9rZW5vbWljQ29udHJhY3Qga2V5AAxsZW5kQ29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQxtYWluQ29udHJhY3QFDWtMZW5kQ29udHJhY3QCH0Nhbid0IGdldCBsZW5kX3NlcnZpY2VfYWRkciBrZXkAEXNmRmFybWluZ0NvbnRyYWN0CQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUMbWFpbkNvbnRyYWN0BRJrU0ZGYXJtaW5nQ29udHJhY3QCIUNhbid0IGdldCBzd29wZmlfZmFybWluZ19hZGRyIGtleQAPcHJpY2VPcmFjbGVBZGRyCQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUMbWFpbkNvbnRyYWN0BQxrUHJpY2VPcmFjbGUCGkNhbid0IGdldCBwcmljZV9vcmFjbGUga2V5AAhhZG1pbjFQSwkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUMbWFpbkNvbnRyYWN0BQlrQWRtaW4xUEsCEkNhbid0IGdldCBhZG1pbjFQSwAIYWRtaW4yUEsJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFDG1haW5Db250cmFjdAUJa0FkbWluMlBLAhJDYW4ndCBnZXQgYWRtaW4yUEsACGFkbWluM1BLCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQxtYWluQ29udHJhY3QFCWtBZG1pbjNQSwISQ2FuJ3QgZ2V0IGFkbWluM1BLAApvcGVyYXRvclBLCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQxtYWluQ29udHJhY3QFD2tPcGVyYXRvckNhbGxQSwIUQ2FuJ3QgZ2V0IG9wZXJhdG9yUEsADGF4bHlCdXJuQWRkcgkBB0FkZHJlc3MBARoBVwgkZWmAGBjJEHKKbzsG2JrwbQ6DOYDN+wAGYXhseUlkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUNdG9rZW5Db250cmFjdAUMa0FYTFlUb2tlbklkAhdDYW4ndCBnZXQgQXhseSB0b2tlbiBpZAALc3RhcnRIZWlnaHQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMFDGtTdGFydEhlaWdodAAMcGVyaW9kTGVuZ3RoCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzBQ1rUGVyaW9kTGVuZ3RoAA1sZW5kTWF4QW1vdW50CQERQGV4dHJOYXRpdmUoMTA1MCkCBQ10b2tlbkNvbnRyYWN0BRFrTGVuZGVyc01heEFtb3VudAATbGVuZE1heFBlcmlvZEFtb3VudAkAaQIFDWxlbmRNYXhBbW91bnQFE0xFTkRFUlNfTUFYX1BFUklPRFMAC2xwTWF4QW1vdW50CQERQGV4dHJOYXRpdmUoMTA1MCkCBQ10b2tlbkNvbnRyYWN0BQxrTFBNYXhBbW91bnQAEWxwTWF4UGVyaW9kQW1vdW50CQBpAgULbHBNYXhBbW91bnQFDkxQX01BWF9QRVJJT0RTAQtpc0FkbWluQ2FsbAEBaQMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFCGFkbWluMVBLCQDMCAIFCGFkbWluMlBLCQDMCAIFCGFkbWluM1BLBQNuaWwIBQFpD2NhbGxlclB1YmxpY0tleQUEdW5pdAkAAgECKE9ubHkgYWRtaW4gZ3JvdXAxIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24BCmlzU2VsZkNhbGwBAWkDCQAAAggFAWkGY2FsbGVyBQR0aGlzBQR1bml0CQACAQIrT25seSBjb250cmFjdCBpdHNlbGYgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgEOaXNPcGVyYXRvckNhbGwBAWkDCQAAAggFAWkPY2FsbGVyUHVibGljS2V5BQpvcGVyYXRvclBLBQR1bml0CQACAQIkT25seSBvcGVyYXRvciBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uAQppc0xhbmRDYWxsAQFpAwkAAAIIBQFpBmNhbGxlcgUMbGVuZENvbnRyYWN0BQR1bml0CQACAQIpT25seSBsYW5kIGNvbnRyYWN0IGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24BD2lzU0ZGYXJtaW5nQ2FsbAEBaQMJAAACCAUBaQZjYWxsZXIFEXNmRmFybWluZ0NvbnRyYWN0BQR1bml0CQACAQIpT25seSBsYW5kIGNvbnRyYWN0IGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24BDGdldEFsbFRva2VucwAEBnRva2VucwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBQdrVG9rZW5zAgADCQAAAgUGdG9rZW5zAgAFA25pbAkAtQkCBQZ0b2tlbnMCASwBDWdldEFzc2V0UHJpY2UBB2Fzc2V0SWQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFD3ByaWNlT3JhY2xlQWRkcgkArAICBQdhc3NldElkBQ5rUHJpY2VJbk9yYWNsZQEQZ2V0QXNzZXREZWNpbWFscwEHYXNzZXRJZAMJAAACBQdhc3NldElkAgVXQVZFUwAIBAckbWF0Y2gwCQDsBwEJANkEAQUHYXNzZXRJZAMJAAECBQckbWF0Y2gwAgVBc3NldAQFYXNzZXQFByRtYXRjaDAIBQVhc3NldAhkZWNpbWFscwkAAgECEENhbid0IGZpbmQgYXNzZXQBEWdldEFzc2V0UHJlY2lzaW9uAQdhc3NldElkCQBsBgAKAAAJARBnZXRBc3NldERlY2ltYWxzAQUHYXNzZXRJZAAAAAAFBERPV04BFWdldEFkb3B0ZWRBUFJCeVBlcmlvZAMGcGVyaW9kCmFwclBlcmlvZHMDYXByCgEDZm9yAgFhB2FwZXJpb2QECyR0MDU0NDA1NDYyBQFhBAVpbmRleAgFCyR0MDU0NDA1NDYyAl8xBAVmb3VuZAgFCyR0MDU0NDA1NDYyAl8yBAJmdAkAtQkCBQdhcGVyaW9kAgEtBAskdDA1NDk5NTU2MgkAlAoCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCZnQAAAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmZ0AAEEBGZyb20IBQskdDA1NDk5NTU2MgJfMQQCdG8IBQskdDA1NDk5NTU2MgJfMgMFBWZvdW5kBQFhAwMJAGcCBQZwZXJpb2QFBGZyb20JAGcCBQJ0bwUGcGVyaW9kBwkAlAoCBQVpbmRleAYJAJQKAgkAZAIFBWluZGV4AAEHBAskdDA1Njk5NTc2NQoAAiRsBRNMRU5ERVJTX0FQUl9QRVJJT0RTCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCAAAHCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQNmb3ICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDkJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkEBWluZGV4CAULJHQwNTY5OTU3NjUCXzEEBWZvdW5kCAULJHQwNTY5OTU3NjUCXzIDBQVmb3VuZAkAawMJAGgCCQCRAwIFC0xFTkRFUlNfQVBSBQVpbmRleAUGU0NBTEU4AAcA7QIAAAEXZ2V0VG90YWxTdXBwbHlBbGxUb2tlbnMACgEDZm9yAgFhB3Rva2VuSWQECyR0MDU5NTM2MDA5BQFhBAt0b3RhbFN1cHBseQgFCyR0MDU5NTM2MDA5Al8xBA50b3RhbFN1cHBseVVzZAgFCyR0MDU5NTM2MDA5Al8yBBF0b3RhbFN1cHBseVVzZEFsbAgFCyR0MDU5NTM2MDA5Al8zBAd0U3VwcGx5CQELdmFsdWVPckVsc2UCCQCaCAIFDGxlbmRDb250cmFjdAkArAICBRBrTGVuZFRva2VuU3VwcGx5BQd0b2tlbklkAAAECmFzc2V0UHJpY2UJAQ1nZXRBc3NldFByaWNlAQUHdG9rZW5JZAQOYXNzZXRQcmVjaXNpb24JARFnZXRBc3NldFByZWNpc2lvbgEFB3Rva2VuSWQECnRTdXBwbHlVc2QJAGsDBQd0U3VwcGx5BQphc3NldFByaWNlBQ5hc3NldFByZWNpc2lvbgkAlQoDCQDNCAIFC3RvdGFsU3VwcGx5BQd0U3VwcGx5CQDNCAIFDnRvdGFsU3VwcGx5VXNkBQp0U3VwcGx5VXNkCQBkAgURdG90YWxTdXBwbHlVc2RBbGwFCnRTdXBwbHlVc2QKAAIkbAkBDGdldEFsbFRva2VucwAKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCVCgMFA25pbAUDbmlsAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBA2ZvcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMzAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsAHAAdAB4BEWdldFRvdGFsU3VwcGx5VXNkAQd0b2tlbklkBAd0U3VwcGx5CQELdmFsdWVPckVsc2UCCQCaCAIFDGxlbmRDb250cmFjdAkArAICBRBrTGVuZFRva2VuU3VwcGx5BQd0b2tlbklkAAAECmFzc2V0UHJpY2UJAQ1nZXRBc3NldFByaWNlAQUHdG9rZW5JZAQOYXNzZXRQcmVjaXNpb24JARFnZXRBc3NldFByZWNpc2lvbgEFB3Rva2VuSWQJAGsDBQd0U3VwcGx5BQphc3NldFByaWNlBQ5hc3NldFByZWNpc2lvbgEUY2FsY05ld1Rva2VuSW50ZXJlc3QCB3Rva2VuSWQLdG90YWxTdXBwbHkDCQBnAgULc3RhcnRIZWlnaHQFBmhlaWdodAAABA5yZXdhcmRQZXJCbG9jawkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICBQd0b2tlbklkBRRrVG9rZW5SZXdhcmRQZXJCbG9jawQLb2xkSW50ZXJlc3QJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgUHdG9rZW5JZAUOa1Rva2VuSW50ZXJlc3QEDHVwZGF0ZUhlaWdodAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICBQd0b2tlbklkBRRrVG9rZW5JbnRlcmVzdEhlaWdodAQGcmV3YXJkCQBoAgkAZQIFBmhlaWdodAUMdXBkYXRlSGVpZ2h0BQ5yZXdhcmRQZXJCbG9jawQIaW50ZXJlc3QDCQBmAgULdG90YWxTdXBwbHkAAAkAawMFBnJld2FyZAUGU0NBTEU4BQt0b3RhbFN1cHBseQAACQBkAgULb2xkSW50ZXJlc3QFCGludGVyZXN0ARFjYWxjTmV3THBJbnRlcmVzdAELdG90YWxTdXBwbHkDCQBnAgULc3RhcnRIZWlnaHQFBmhlaWdodAAABA5yZXdhcmRQZXJCbG9jawkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBRFrTHBSZXdhcmRQZXJCbG9jawAABAtvbGRJbnRlcmVzdAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQtrTHBJbnRlcmVzdAAABAx1cGRhdGVIZWlnaHQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwURa0xwSW50ZXJlc3RIZWlnaHQFBmhlaWdodAQGcmV3YXJkCQBoAgkAZQIFBmhlaWdodAUMdXBkYXRlSGVpZ2h0BQ5yZXdhcmRQZXJCbG9jawQIaW50ZXJlc3QDCQBmAgULdG90YWxTdXBwbHkAAAkAawMFBnJld2FyZAUGU0NBTEU4BQt0b3RhbFN1cHBseQAACQBkAgULb2xkSW50ZXJlc3QFCGludGVyZXN0ARJjYWxjTGVuZFVzZXJSZXdhcmQCBHVzZXIHdG9rZW5JZAQLdG90YWxTdXBwbHkJAQt2YWx1ZU9yRWxzZQIJAJoIAgUMbGVuZENvbnRyYWN0CQCsAgIFEGtMZW5kVG9rZW5TdXBwbHkFB3Rva2VuSWQAAAQNdG9rZW5JbnRlcmVzdAkBFGNhbGNOZXdUb2tlbkludGVyZXN0AgUHdG9rZW5JZAULdG90YWxTdXBwbHkECnVzZXJTdXBwbHkJAQt2YWx1ZU9yRWxzZQIJAJoIAgUMbGVuZENvbnRyYWN0CQCsAgIJAKwCAgUEdXNlcgUPa0xlbmRVc2VyU3VwcGx5BQd0b2tlbklkAAAEEXVzZXJUb2tlbkludGVyZXN0CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIFB3Rva2VuSWQCAV8FBHVzZXIFEWtVc2VyTGVuZEludGVyZXN0AwkAAAIFCnVzZXJTdXBwbHkAAAUNdG9rZW5JbnRlcmVzdAAABAZyZXdhcmQJAGsDBQp1c2VyU3VwcGx5CQBlAgUNdG9rZW5JbnRlcmVzdAURdXNlclRva2VuSW50ZXJlc3QFBlNDQUxFOAkAlQoDBQZyZXdhcmQFDXRva2VuSW50ZXJlc3QFCnVzZXJTdXBwbHkBEGNhbGNMcFVzZXJSZXdhcmQBBHVzZXIEC3RvdGFsU3VwcGx5CQELdmFsdWVPckVsc2UCCQCaCAIFEXNmRmFybWluZ0NvbnRyYWN0CQCsAgIFCGF4bHlQb29sBQ5rU0ZUb3RhbFN1cHBseQAABA10b2tlbkludGVyZXN0CQERY2FsY05ld0xwSW50ZXJlc3QBBQt0b3RhbFN1cHBseQQKdXNlclN1cHBseQkBC3ZhbHVlT3JFbHNlAgkAmggCBRFzZkZhcm1pbmdDb250cmFjdAkArAICCQCsAgIJAKwCAgUIYXhseVBvb2wCAV8FBHVzZXIFEmtTRlVzZXJUb3RhbFN1cHBseQAABBF1c2VyVG9rZW5JbnRlcmVzdAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHVzZXIFD2tVc2VyTHBJbnRlcmVzdAMJAAACBQp1c2VyU3VwcGx5AAAFDXRva2VuSW50ZXJlc3QAAAQGcmV3YXJkCQBrAwUKdXNlclN1cHBseQkAZQIFDXRva2VuSW50ZXJlc3QFEXVzZXJUb2tlbkludGVyZXN0BQZTQ0FMRTgJAJUKAwUGcmV3YXJkBQ10b2tlbkludGVyZXN0BQp1c2VyU3VwcGx5ARhjbGFpbUxlbmRlclJld2FyZHNDb21tb24CBHVzZXIIcmVhZE9ubHkKAQVjbGFpbQIBYQd0b2tlbklkBAskdDA4ODk4ODk0MgUBYQQIdG9rZW5JZHMIBQskdDA4ODk4ODk0MgJfMQQHY0Ftb3VudAgFCyR0MDg4OTg4OTQyAl8yBAV0b3RhbAgFCyR0MDg4OTg4OTQyAl8zBAhlbnRlcmllcwgFCyR0MDg4OTg4OTQyAl80BBJ1c2VyQXZhaWxhYmxlQ2xhaW0JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgUHdG9rZW5JZAIBXwUEdXNlcgUXa1VzZXJMZW5kQXZhaWxhYmxlQ2xhaW0AAAQLJHQwOTA1NTkxMzQJARJjYWxjTGVuZFVzZXJSZXdhcmQCBQR1c2VyBQd0b2tlbklkBAd1UmV3YXJkCAULJHQwOTA1NTkxMzQCXzEEEG5ld1Rva2VuSW50ZXJlc3QIBQskdDA5MDU1OTEzNAJfMgQKdXNlclN1cHBseQgFCyR0MDkwNTU5MTM0Al8zBAx0b3RhbFRvQ2xhaW0JAGQCBRJ1c2VyQXZhaWxhYmxlQ2xhaW0FB3VSZXdhcmQDAwkAZgIFDHRvdGFsVG9DbGFpbQAABgkAZgIFCnVzZXJTdXBwbHkAAAQMbmV3RW50cmVyaWVzAwMFCHJlYWRPbmx5BgkAAAIFDHRvdGFsVG9DbGFpbQAABQhlbnRlcmllcwkAzggCBQhlbnRlcmllcwkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgUHdG9rZW5JZAIBXwUEdXNlcgURa1VzZXJMZW5kSW50ZXJlc3QFEG5ld1Rva2VuSW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIFB3Rva2VuSWQCAV8FBHVzZXIFF2tVc2VyTGVuZEF2YWlsYWJsZUNsYWltAAAJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUHdG9rZW5JZAUOa1Rva2VuSW50ZXJlc3QFEG5ld1Rva2VuSW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUHdG9rZW5JZAUUa1Rva2VuSW50ZXJlc3RIZWlnaHQFBmhlaWdodAUDbmlsCQCWCgQJAM0IAgUIdG9rZW5JZHMFB3Rva2VuSWQJAM0IAgUHY0Ftb3VudAUMdG90YWxUb0NsYWltCQBkAgUFdG90YWwFDHRvdGFsVG9DbGFpbQUMbmV3RW50cmVyaWVzCQCWCgQFCHRva2VuSWRzBQdjQW1vdW50BQV0b3RhbAUIZW50ZXJpZXMKAAIkbAkBDGdldEFsbFRva2VucwAKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCWCgQFA25pbAUDbmlsAAAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEFY2xhaW0CBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDMwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAAVABYAFwAYABkAGgAbABwAHQAeARRjbGFpbUxwUmV3YXJkc0NvbW1vbgIEdXNlcghyZWFkT25seQQSdXNlckF2YWlsYWJsZUNsYWltCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEdXNlcgUVa1VzZXJMcEF2YWlsYWJsZUNsYWltAAAEDSR0MDEwMDY1MTAxMzAJARBjYWxjTHBVc2VyUmV3YXJkAQUEdXNlcgQHdVJld2FyZAgFDSR0MDEwMDY1MTAxMzACXzEEDW5ld0xwSW50ZXJlc3QIBQ0kdDAxMDA2NTEwMTMwAl8yBAp1c2VyU3VwcGx5CAUNJHQwMTAwNjUxMDEzMAJfMwQMdG90YWxUb0NsYWltCQBkAgUSdXNlckF2YWlsYWJsZUNsYWltBQd1UmV3YXJkAwMFCHJlYWRPbmx5BgkAAAIFDHRvdGFsVG9DbGFpbQAACQCUCgIFDHRvdGFsVG9DbGFpbQUDbmlsCQCUCgIFDHRvdGFsVG9DbGFpbQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQR1c2VyBQ9rVXNlckxwSW50ZXJlc3QFDW5ld0xwSW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEdXNlcgUVa1VzZXJMcEF2YWlsYWJsZUNsYWltAAAJAMwIAgkBDEludGVnZXJFbnRyeQIFC2tMcEludGVyZXN0BQ1uZXdMcEludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRFrTHBJbnRlcmVzdEhlaWdodAUGaGVpZ2h0BQNuaWwBFGdldEF4bHlQcmljZU9uU3dvcGZpAAQIYUJhbGFuY2UJARFAZXh0ck5hdGl2ZSgxMDUwKQIJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCGF4bHlQb29sAg9BX2Fzc2V0X2JhbGFuY2UECGJCYWxhbmNlCQERQGV4dHJOYXRpdmUoMTA1MCkCCQERQGV4dHJOYXRpdmUoMTA2MikBBQhheGx5UG9vbAIPQl9hc3NldF9iYWxhbmNlBAZ3UHJpY2UJAQ1nZXRBc3NldFByaWNlAQIFV0FWRVMJAGsDBQhiQmFsYW5jZQUGd1ByaWNlBQhhQmFsYW5jZQERZ2V0QXhseVNoYXJlUHJpY2UABAhwb29sQWRkcgkBEUBleHRyTmF0aXZlKDEwNjIpAQUIYXhseVBvb2wECGFCYWxhbmNlCQERQGV4dHJOYXRpdmUoMTA1MCkCCQERQGV4dHJOYXRpdmUoMTA2MikBBQhheGx5UG9vbAIPQV9hc3NldF9iYWxhbmNlBAhiQmFsYW5jZQkBEUBleHRyTmF0aXZlKDEwNTApAgkBEUBleHRyTmF0aXZlKDEwNjIpAQUIYXhseVBvb2wCD0JfYXNzZXRfYmFsYW5jZQQHZFByaWNlQQkBFGdldEF4bHlQcmljZU9uU3dvcGZpAAQHZFByaWNlQgkBDWdldEFzc2V0UHJpY2UBAgVXQVZFUwMDCQBmAgAABQdkUHJpY2VBBgkAZgIAAAUHZFByaWNlQgD///////////8BBAtzaGFyZVN1cHBseQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQERQGV4dHJOYXRpdmUoMTA1MCkCBQhwb29sQWRkcgISc2hhcmVfYXNzZXRfc3VwcGx5AhxDYW4ndCBnZXQgc2hhcmUgYXNzZXQgc3VwcGx5BApBUHJlY2lzaW9uCQBsBgAKAAAACAAAAAAFBERPV04ECkJQcmVjaXNpb24JAGwGAAoAAAAIAAAAAAUERE9XTgQOc2hhcmVQcmVjaXNpb24JAGwGAAoAAAAIAAAAAAUERE9XTgQDc3VtCQBkAgkAawMFCGFCYWxhbmNlBQdkUHJpY2VBBQpBUHJlY2lzaW9uCQBrAwUIYkJhbGFuY2UFB2RQcmljZUIFCkJQcmVjaXNpb24JAGsDBQNzdW0FDnNoYXJlUHJlY2lzaW9uBQtzaGFyZVN1cHBseQENZ2V0VG9rZW5zQVBScwAECWF4bHlQcmljZQkBFGdldEF4bHlQcmljZU9uU3dvcGZpAAQNYXhseVByZWNpc2lvbgkBEWdldEFzc2V0UHJlY2lzaW9uAQUGYXhseUlkCgEKdG9rZW5zQXBycwIDYXByB3Rva2VuSWQEBHJ3cGIJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQd0b2tlbklkBRRrVG9rZW5SZXdhcmRQZXJCbG9jawAABAdyd3BiVXNkCQBrAwUEcndwYgUJYXhseVByaWNlBQ1heGx5UHJlY2lzaW9uBAZyd1llYXIJAGgCCQBoAgUHcndwYlVzZAUMcGVyaW9kTGVuZ3RoADQEDnRvdGFsU3VwcGx5VXNkCQERZ2V0VG90YWxTdXBwbHlVc2QBBQd0b2tlbklkCQDNCAIFA2FwcgkAawMFBnJ3WWVhcgUGU0NBTEU4BQ50b3RhbFN1cHBseVVzZAQEYXBycwoAAiRsCQEMZ2V0QWxsVG9rZW5zAAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEKdG9rZW5zQXBycwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMzAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsAHAAdAB4EDWxwVG90YWxTdXBwbHkJARFAZXh0ck5hdGl2ZSgxMDUwKQIFEXNmRmFybWluZ0NvbnRyYWN0CQCsAgIFCGF4bHlQb29sBQ5rU0ZUb3RhbFN1cHBseQQEbHBJZAkBEUBleHRyTmF0aXZlKDEwNTMpAgkBEUBleHRyTmF0aXZlKDEwNjIpAQUIYXhseVBvb2wFBWtMcElkBAtscFByZWNpc2lvbgkBEWdldEFzc2V0UHJlY2lzaW9uAQUEbHBJZAQHbHBQcmljZQkBEWdldEF4bHlTaGFyZVByaWNlAAQQbHBUb3RhbFN1cHBseVVzZAkAawMFDWxwVG90YWxTdXBwbHkFB2xwUHJpY2UFC2xwUHJlY2lzaW9uBARyd3BiCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFEWtMcFJld2FyZFBlckJsb2NrAAAEB3J3cGJVc2QJAGsDBQRyd3BiBQlheGx5UHJpY2UFDWF4bHlQcmVjaXNpb24EBnJ3WWVhcgkAaAIJAGgCBQdyd3BiVXNkBQxwZXJpb2RMZW5ndGgANAQFbHBBcHIJAGsDBQZyd1llYXIFBlNDQUxFOAUQbHBUb3RhbFN1cHBseVVzZAkAlQoDCQEMZ2V0QWxsVG9rZW5zAAUEYXBycwUFbHBBcHIHAWkBEmNsYWltTGVuZGVyUmV3YXJkcwAECGNsYWltUmVzCQEYY2xhaW1MZW5kZXJSZXdhcmRzQ29tbW9uAgkApQgBCAUBaQZjYWxsZXIHAwkAAAIIBQhjbGFpbVJlcwJfMwAACQACAQIjY2xhaW0gYW1vdW50IG11c3QgYmUgZ3JlYXRlciB0aGFuIDAEA2ludgkA/AcEBQ10b2tlbkNvbnRyYWN0AhJ3aXRoZHJhd0xlbmRSZXdhcmQJAMwIAggFCGNsYWltUmVzAl8zCQDMCAIJAKUIAQgFAWkGY2FsbGVyBQNuaWwFA25pbAMJAAACBQNpbnYFA2ludggFCGNsYWltUmVzAl80CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDmNsYWltTHBSZXdhcmRzAAQIY2xhaW1SZXMJARRjbGFpbUxwUmV3YXJkc0NvbW1vbgIJAKUIAQgFAWkGY2FsbGVyBwMJAAACCAUIY2xhaW1SZXMCXzEAAAkAAgECI2NsYWltIGFtb3VudCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwBANpbnYJAPwHBAUNdG9rZW5Db250cmFjdAIQd2l0aGRyYXdMcFJld2FyZAkAzAgCCAUIY2xhaW1SZXMCXzEJAMwIAgkApQgBCAUBaQZjYWxsZXIFA25pbAUDbmlsAwkAAAIFA2ludgUDaW52CAUIY2xhaW1SZXMCXzIJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEKbGVuZEFjdGlvbgIEdXNlcgd0b2tlbklkCQELdmFsdWVPckVsc2UCCQEKaXNMYW5kQ2FsbAEFAWkEEnVzZXJBdmFpbGFibGVDbGFpbQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICBQd0b2tlbklkAgFfBQR1c2VyBRdrVXNlckxlbmRBdmFpbGFibGVDbGFpbQAABA0kdDAxMzYyNzEzNjk0CQESY2FsY0xlbmRVc2VyUmV3YXJkAgUEdXNlcgUHdG9rZW5JZAQHdVJld2FyZAgFDSR0MDEzNjI3MTM2OTQCXzEEEG5ld1Rva2VuSW50ZXJlc3QIBQ0kdDAxMzYyNzEzNjk0Al8yCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICBQd0b2tlbklkAgFfBQR1c2VyBRFrVXNlckxlbmRJbnRlcmVzdAUQbmV3VG9rZW5JbnRlcmVzdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgUHdG9rZW5JZAIBXwUEdXNlcgUXa1VzZXJMZW5kQXZhaWxhYmxlQ2xhaW0JAGQCBRJ1c2VyQXZhaWxhYmxlQ2xhaW0FB3VSZXdhcmQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUHdG9rZW5JZAUOa1Rva2VuSW50ZXJlc3QFEG5ld1Rva2VuSW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUHdG9rZW5JZAUUa1Rva2VuSW50ZXJlc3RIZWlnaHQFBmhlaWdodAUDbmlsAWkBCGxwQWN0aW9uAQR1c2VyCQELdmFsdWVPckVsc2UCCQEPaXNTRkZhcm1pbmdDYWxsAQUBaQQSdXNlckF2YWlsYWJsZUNsYWltCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEdXNlcgUVa1VzZXJMcEF2YWlsYWJsZUNsYWltAAAEDSR0MDE0MTY2MTQyMTkJARBjYWxjTHBVc2VyUmV3YXJkAQUEdXNlcgQHdVJld2FyZAgFDSR0MDE0MTY2MTQyMTkCXzEEDW5ld0xwSW50ZXJlc3QIBQ0kdDAxNDE2NjE0MjE5Al8yCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHVzZXIFD2tVc2VyTHBJbnRlcmVzdAUNbmV3THBJbnRlcmVzdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQR1c2VyBRVrVXNlckxwQXZhaWxhYmxlQ2xhaW0JAGQCBRJ1c2VyQXZhaWxhYmxlQ2xhaW0FB3VSZXdhcmQJAMwIAgkBDEludGVnZXJFbnRyeQIFC2tMcEludGVyZXN0BQ1uZXdMcEludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRFrTHBJbnRlcmVzdEhlaWdodAUGaGVpZ2h0BQNuaWwBaQEEaW5pdAUUYXhseU1haW5Db250cmFjdEFkZHIZYXhseVRva2Vub21pY0NvbnRyYWN0QWRkcgxheGx5UG9vbEFkZHISZmFybWluZ1N0YXJ0SGVpZ2h0DHBlcmlvZExlbmd0aAkBC3ZhbHVlT3JFbHNlAgkBCmlzU2VsZkNhbGwBBQFpAwkBASEBCQEJaXNEZWZpbmVkAQkApggBBRRheGx5TWFpbkNvbnRyYWN0QWRkcgkAAgECFVdyb25nIGZhcm1pbmcgYWRkcmVzcwMJAQEhAQkBCWlzRGVmaW5lZAEJAKYIAQUZYXhseVRva2Vub21pY0NvbnRyYWN0QWRkcgkAAgECG1dyb25nIG1haW4gY29udHJhY3QgYWRkcmVzcwkAzAgCCQELU3RyaW5nRW50cnkCBRFrQXhseU1haW5Db250cmFjdAUUYXhseU1haW5Db250cmFjdEFkZHIJAMwIAgkBC1N0cmluZ0VudHJ5AgUWa0F4bHlUb2tlbm9taWNDb250cmFjdAUZYXhseVRva2Vub21pY0NvbnRyYWN0QWRkcgkAzAgCCQELU3RyaW5nRW50cnkCBQlrQXhseVBvb2wFDGF4bHlQb29sQWRkcgkAzAgCCQEMSW50ZWdlckVudHJ5AgUMa1N0YXJ0SGVpZ2h0BRJmYXJtaW5nU3RhcnRIZWlnaHQJAMwIAgkBDEludGVnZXJFbnRyeQIFDWtQZXJpb2RMZW5ndGgFDHBlcmlvZExlbmd0aAUDbmlsAWkBDGluaXROZXdUb2tlbgEHdG9rZW5JZAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMJAQlpc0RlZmluZWQBCQCaCAIFBHRoaXMJAKwCAgUHdG9rZW5JZAUOa1Rva2VuSW50ZXJlc3QJAAIBAhR0b2tlbiBhbHJlYWR5IGluaXRlZAMJAQEhAQkBCGNvbnRhaW5zAgkBEUBleHRyTmF0aXZlKDEwNTMpAgUMbGVuZENvbnRyYWN0BRBrTGVuZFNldHVwVG9rZW5zBQd0b2tlbklkCQACAQITbm8gdG9rZW4gb24gbGFuZGluZwQMbmV3QWxsVG9rZW5zCQDNCAIJAQxnZXRBbGxUb2tlbnMABQd0b2tlbklkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFB3Rva2VuSWQFDmtUb2tlbkludGVyZXN0AAAJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUHdG9rZW5JZAUUa1Rva2VuSW50ZXJlc3RIZWlnaHQJAJYDAQkAzAgCBQtzdGFydEhlaWdodAkAzAgCBQZoZWlnaHQFA25pbAkAzAgCCQELU3RyaW5nRW50cnkCBQdrVG9rZW5zCQC5CQIFDG5ld0FsbFRva2VucwIBLAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQd0b2tlbklkBRRrVG9rZW5SZXdhcmRQZXJCbG9jawAABQNuaWwBaQENdXBkYXRlUmV3YXJkcwAJAQt2YWx1ZU9yRWxzZQIJAQ5pc09wZXJhdG9yQ2FsbAEFAWkEEGxhc3RVcGRhdGVQZXJpb2QJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwURa0xhc3RVcGRhdGVQZXJpb2QAAAQKY2FsY1BlcmlvZAkAZAIJAGkCCQBlAgUGaGVpZ2h0BQtzdGFydEhlaWdodAUMcGVyaW9kTGVuZ3RoAAEECWN1clBlcmlvZAMJAGcCAAAFCmNhbGNQZXJpb2QAAQUKY2FsY1BlcmlvZAMJAGYCBQljdXJQZXJpb2QAaAkAAgECEW1heCBwZXJpb2QgaXMgMTA0AwMJAGcCBRBsYXN0VXBkYXRlUGVyaW9kBQljdXJQZXJpb2QJAQIhPQIFEGxhc3RVcGRhdGVQZXJpb2QAAAcJAAIBAiVyZXdhcmRzIGFscmVkeSB1cGRhdGVkIGluIHRoaXMgcGVyaW9kBA0kdDAxNjE2MzE2MjQzCQEXZ2V0VG90YWxTdXBwbHlBbGxUb2tlbnMABAt0b3RhbFN1cHBseQgFDSR0MDE2MTYzMTYyNDMCXzEEDnRvdGFsU3VwcGx5VXNkCAUNJHQwMTYxNjMxNjI0MwJfMgQRdG90YWxTdXBwbHlVc2RBbGwIBQ0kdDAxNjE2MzE2MjQzAl8zBAlheGx5UHJpY2UJARRnZXRBeGx5UHJpY2VPblN3b3BmaQAEDWF4bHlQcmVjaXNpb24JARFnZXRBc3NldFByZWNpc2lvbgEFBmF4bHlJZAQGbWF4QVBSCQEVZ2V0QWRvcHRlZEFQUkJ5UGVyaW9kAwUJY3VyUGVyaW9kBRNMRU5ERVJTX0FQUl9QRVJJT0RTBQtMRU5ERVJTX0FQUgoBDHVwZGF0ZVJld2FyZAIBYQd0b2tlbklkBA0kdDAxNjQ5MzE2NTM3BQFhBAhlbnRlcmllcwgFDSR0MDE2NDkzMTY1MzcCXzEEEXRvdGFsUGVyaW9kUmV3YXJkCAUNJHQwMTY0OTMxNjUzNwJfMgQFaW5kZXgIBQ0kdDAxNjQ5MzE2NTM3Al8zAwkAAAIJAJEDAgULdG90YWxTdXBwbHkFBWluZGV4AAAJAJUKAwkAzggCBQhlbnRlcmllcwkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQd0b2tlbklkBRRrUHJldkxlbmRUb2tlblN1cHBseQkAkQMCBQt0b3RhbFN1cHBseQUFaW5kZXgJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUHdG9rZW5JZAUUa1Rva2VuUmV3YXJkUGVyQmxvY2sAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQd0b2tlbklkBQ5rVG9rZW5JbnRlcmVzdAkBFGNhbGNOZXdUb2tlbkludGVyZXN0AgUHdG9rZW5JZAkAkQMCBQt0b3RhbFN1cHBseQUFaW5kZXgJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUHdG9rZW5JZAUUa1Rva2VuSW50ZXJlc3RIZWlnaHQJAJYDAQkAzAgCBQtzdGFydEhlaWdodAkAzAgCBQZoZWlnaHQFA25pbAUDbmlsBRF0b3RhbFBlcmlvZFJld2FyZAkAZAIFBWluZGV4AAEEBXNoYXJlCQBrAwkAkQMCBQ50b3RhbFN1cHBseVVzZAUFaW5kZXgFBlNDQUxFOAURdG90YWxTdXBwbHlVc2RBbGwECW1heFJld2FyZAkAawMFBXNoYXJlBRNsZW5kTWF4UGVyaW9kQW1vdW50BQZTQ0FMRTgEDG1heFJld2FyZFVzZAkAawMFCW1heFJld2FyZAUJYXhseVByaWNlBQ1heGx5UHJlY2lzaW9uBA9wcmV2VG90YWxTdXBwbHkJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQd0b2tlbklkBRRrUHJldkxlbmRUb2tlblN1cHBseQAABAZydENvZWYDAwkAAAIFD3ByZXZUb3RhbFN1cHBseQAABgkAAAIJAJEDAgULdG90YWxTdXBwbHkFBWluZGV4AAAAAAkAZQIJAGsDCQCRAwIFC3RvdGFsU3VwcGx5BQVpbmRleAUGU0NBTEU4BQ9wcmV2VG90YWxTdXBwbHkFBlNDQUxFOAQGcmV3YXJkCQBpAgkAaQIJAJcDAQkAzAgCCQBoAgUGbWF4QVBSCQBkAgUGU0NBTEU4CQCWAwEJAMwIAgUGcnRDb2VmCQDMCAIAAAUDbmlsCQDMCAIJAGsDBQZtYXhBUFIJAGgCAA8FBlNDQUxFOAAKBQNuaWwFBlNDQUxFOABkBAlyZXdhcmRVc2QJAJcDAQkAzAgCBQxtYXhSZXdhcmRVc2QJAMwIAgkAawMJAJEDAgUOdG90YWxTdXBwbHlVc2QFBWluZGV4BQZyZXdhcmQFBlNDQUxFOAUDbmlsBAxyZXdhcmRQZXJpb2QJAGsDBQlyZXdhcmRVc2QFDWF4bHlQcmVjaXNpb24FCWF4bHlQcmljZQQOcmV3YXJkUGVyQmxvY2sJAGkCBQxyZXdhcmRQZXJpb2QFDHBlcmlvZExlbmd0aAkAlQoDCQDOCAIFCGVudGVyaWVzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFB3Rva2VuSWQFFGtQcmV2TGVuZFRva2VuU3VwcGx5CQCRAwIFC3RvdGFsU3VwcGx5BQVpbmRleAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQd0b2tlbklkBRRrVG9rZW5SZXdhcmRQZXJCbG9jawUOcmV3YXJkUGVyQmxvY2sJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUHdG9rZW5JZAUOa1Rva2VuSW50ZXJlc3QJARRjYWxjTmV3VG9rZW5JbnRlcmVzdAIFB3Rva2VuSWQJAJEDAgULdG90YWxTdXBwbHkFBWluZGV4CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFB3Rva2VuSWQFFGtUb2tlbkludGVyZXN0SGVpZ2h0CQCWAwEJAMwIAgULc3RhcnRIZWlnaHQJAMwIAgUGaGVpZ2h0BQNuaWwFA25pbAkAZAIFEXRvdGFsUGVyaW9kUmV3YXJkBQxyZXdhcmRQZXJpb2QJAGQCBQVpbmRleAABBA0kdDAxODIyOTE4MzIxCgACJGwJAQxnZXRBbGxUb2tlbnMACgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlQoDBQNuaWwAAAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQx1cGRhdGVSZXdhcmQCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDMwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAAVABYAFwAYABkAGgAbABwAHQAeBA50b2tlbnNFbnRlcmllcwgFDSR0MDE4MjI5MTgzMjECXzEEEHRvdGFsVG9rZW5SZXdhcmQIBQ0kdDAxODIyOTE4MzIxAl8yBAhidXJuTGVuZAkAZQIFE2xlbmRNYXhQZXJpb2RBbW91bnQFEHRvdGFsVG9rZW5SZXdhcmQEA2ludgkA/AcEBQ10b2tlbkNvbnRyYWN0AhJ3aXRoZHJhd0xlbmRSZXdhcmQJAMwIAgUIYnVybkxlbmQJAMwIAgkApQgBBQR0aGlzBQNuaWwFA25pbAMJAAACBQNpbnYFA2ludgkAzQgCCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIFEWtMcFJld2FyZFBlckJsb2NrAAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUMYXhseUJ1cm5BZGRyBQhidXJuTGVuZAkA2QQBBQZheGx5SWQFA25pbAUOdG9rZW5zRW50ZXJpZXMJAQxJbnRlZ2VyRW50cnkCBRFrTGFzdFVwZGF0ZVBlcmlvZAUJY3VyUGVyaW9kCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJ0eAEGdmVyaWZ5AAQTbXVsdGlTaWduZWRCeUFkbWlucwQSYWRtaW5QdWJLZXkxU2lnbmVkAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAUIYWRtaW4xUEsAAQAABBJhZG1pblB1YktleTJTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwABBQhhZG1pbjJQSwABAAAEEmFkbWluUHViS2V5M1NpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAIFCGFkbWluM1BLAAEAAAkAZwIJAGQCCQBkAgUSYWRtaW5QdWJLZXkxU2lnbmVkBRJhZG1pblB1YktleTJTaWduZWQFEmFkbWluUHViS2V5M1NpZ25lZAACBAckbWF0Y2gwBQJ0eAMJAAECBQckbWF0Y2gwAhdJbnZva2VTY3JpcHRUcmFuc2FjdGlvbgQDaW52BQckbWF0Y2gwBAZpc1NlbGYJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXkECmlzUmlnaHRGZWUDCQAAAggFA2ludgNmZWUAoPc2CQAAAggFA2ludgpmZWVBc3NldElkBQR1bml0BwQKaXNJbml0Q2FsbAkAAAIIBQNpbnYIZnVuY3Rpb24CBGluaXQEDGlzbm9QYXltZW50cwkAAAIJAJADAQgFA2ludghwYXltZW50cwAAAwMDAwUKaXNSaWdodEZlZQUKaXNJbml0Q2FsbAcFBmlzU2VsZgcFDGlzbm9QYXltZW50cwcGBRNtdWx0aVNpZ25lZEJ5QWRtaW5zBRNtdWx0aVNpZ25lZEJ5QWRtaW5z85alVg==", "height": 3917697, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 3S48ZLhuAiAYiKXJbtNAxzVmHpUmV3wAtRMGSTo5KD9S Next: 81yPT2v3gtnDb3ujsqenrLFhLSqc28yd5QYWgbyo9LRp Diff:
OldNewDifferences
513513 else false)
514514 then throw("rewards alredy updated in this period")
515515 else {
516- let $t01616316284 = getTotalSupplyAllTokens()
517- let totalSupply = $t01616316284._1
518- let totalSupplyUsd = $t01616316284._2
519- let totalSupplyUsdAll = $t01616316284._3
516+ let $t01616316243 = getTotalSupplyAllTokens()
517+ let totalSupply = $t01616316243._1
518+ let totalSupplyUsd = $t01616316243._2
519+ let totalSupplyUsdAll = $t01616316243._3
520520 let axlyPrice = getAxlyPriceOnSwopfi()
521521 let axlyPrecision = getAssetPrecision(axlyId)
522522 let maxAPR = getAdoptedAPRByPeriod(curPeriod, LENDERS_APR_PERIODS, LENDERS_APR)
523523 func updateReward (a,tokenId) = {
524- let $t01653416578 = a
525- let enteries = $t01653416578._1
526- let totalPeriodReward = $t01653416578._2
527- let index = $t01653416578._3
524+ let $t01649316537 = a
525+ let enteries = $t01649316537._1
526+ let totalPeriodReward = $t01649316537._2
527+ let index = $t01649316537._3
528528 if ((totalSupply[index] == 0))
529529 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))
530530 else {
545545 }
546546 }
547547
548- let $t01827018362 = {
548+ let $t01822918321 = {
549549 let $l = getAllTokens()
550550 let $s = size($l)
551551 let $acc0 = $Tuple3(nil, 0, 0)
559559
560560 $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)
561561 }
562- let tokensEnteries = $t01827018362._1
563- let totalTokenReward = $t01827018362._2
564- let lpMaxAPR = getAdoptedAPRByPeriod(curPeriod, LP_APR_PERIODS, LP_APR)
565- let lpTotalSupply = getIntegerValue(sfFarmingContract, (axlyPool + kSFTotalSupply))
566- let preLPSupply = valueOrElse(getInteger(this, kPrevLPSupply), 0)
567- let lpId = getStringValue(addressFromStringValue(axlyPool), kLpId)
568- let lpPrecision = getAssetPrecision(lpId)
569- let lpPrice = getAxlySharePrice()
570- let lpTotalSupplyUsd = fraction(lpTotalSupply, lpPrice, lpPrecision)
571- let maxLPRewardUsd = fraction(lpMaxPeriodAmount, axlyPrice, axlyPrecision)
572- let rtLPCoef = if (if ((preLPSupply == 0))
573- then true
574- else (lpTotalSupply == 0))
575- then 0
576- else (fraction(lpTotalSupply, SCALE8, preLPSupply) - SCALE8)
577- let rewardLp = ((min([(lpMaxAPR * (SCALE8 + max([rtLPCoef, 0]))), fraction(lpMaxAPR, (15 * SCALE8), 10)]) / SCALE8) / 100)
578- let rewardLpUsd = min([maxLPRewardUsd, fraction(lpTotalSupplyUsd, rewardLp, SCALE8)])
579- let rewardLpPeriod = fraction(rewardLpUsd, axlyPrecision, axlyPrice)
580- let rewardLpPerBlock = (rewardLpPeriod / periodLength)
562+ let tokensEnteries = $t01822918321._1
563+ let totalTokenReward = $t01822918321._2
581564 let burnLend = (lendMaxPeriodAmount - totalTokenReward)
582- let burnLp = (lpMaxPeriodAmount - rewardLpPeriod)
583- let inv = invoke(tokenContract, "withdrawLpReward", [(burnLend + burnLp), toString(this)], nil)
565+ let inv = invoke(tokenContract, "withdrawLendReward", [burnLend, toString(this)], nil)
584566 if ((inv == inv))
585- then {
586- let lpEnteries = if ((12 >= curPeriod))
587- then [IntegerEntry(kPrevLPSupply, lpTotalSupply), IntegerEntry(kLpRewardPerBlock, rewardLpPerBlock), IntegerEntry(kLpInterest, calcNewLpInterest(lpTotalSupply)), IntegerEntry(kLpInterestHeight, max([startHeight, height])), ScriptTransfer(axlyBurnAddr, burnLend, fromBase58String(axlyId)), ScriptTransfer(axlyBurnAddr, burnLp, fromBase58String(axlyId))]
588- else nil
589- ((lpEnteries ++ tokensEnteries) :+ IntegerEntry(kLastUpdatePeriod, curPeriod))
590- }
567+ then (([IntegerEntry(kLpRewardPerBlock, 0), ScriptTransfer(axlyBurnAddr, burnLend, fromBase58String(axlyId))] ++ tokensEnteries) :+ IntegerEntry(kLastUpdatePeriod, curPeriod))
591568 else throw("Strict value is not equal to itself.")
592569 }
593570 })
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 axlyBurnAddr = Address(base58'3P2fwjdSkg1YS9xnNYgdbKZ4mG47mAyrjFY')
113113
114114 let axlyId = valueOrErrorMessage(getString(tokenContract, kAXLYTokenId), "Can't get Axly token id")
115115
116116 let startHeight = getIntegerValue(this, kStartHeight)
117117
118118 let periodLength = getIntegerValue(this, kPeriodLength)
119119
120120 let lendMaxAmount = getIntegerValue(tokenContract, kLendersMaxAmount)
121121
122122 let lendMaxPeriodAmount = (lendMaxAmount / LENDERS_MAX_PERIODS)
123123
124124 let lpMaxAmount = getIntegerValue(tokenContract, kLPMaxAmount)
125125
126126 let lpMaxPeriodAmount = (lpMaxAmount / LP_MAX_PERIODS)
127127
128128 func isAdminCall (i) = if (containsElement([admin1PK, admin2PK, admin3PK], i.callerPublicKey))
129129 then unit
130130 else throw("Only admin group1 can call this function")
131131
132132
133133 func isSelfCall (i) = if ((i.caller == this))
134134 then unit
135135 else throw("Only contract itself can call this function")
136136
137137
138138 func isOperatorCall (i) = if ((i.callerPublicKey == operatorPK))
139139 then unit
140140 else throw("Only operator can call this function")
141141
142142
143143 func isLandCall (i) = if ((i.caller == lendContract))
144144 then unit
145145 else throw("Only land contract can call this function")
146146
147147
148148 func isSFFarmingCall (i) = if ((i.caller == sfFarmingContract))
149149 then unit
150150 else throw("Only land contract can call this function")
151151
152152
153153 func getAllTokens () = {
154154 let tokens = valueOrElse(getString(this, kTokens), "")
155155 if ((tokens == ""))
156156 then nil
157157 else split(tokens, ",")
158158 }
159159
160160
161161 func getAssetPrice (assetId) = getIntegerValue(priceOracleAddr, (assetId + kPriceInOracle))
162162
163163
164164 func getAssetDecimals (assetId) = if ((assetId == "WAVES"))
165165 then 8
166166 else match assetInfo(fromBase58String(assetId)) {
167167 case asset: Asset =>
168168 asset.decimals
169169 case _ =>
170170 throw("Can't find asset")
171171 }
172172
173173
174174 func getAssetPrecision (assetId) = pow(10, 0, getAssetDecimals(assetId), 0, 0, DOWN)
175175
176176
177177 func getAdoptedAPRByPeriod (period,aprPeriods,apr) = {
178178 func for (a,aperiod) = {
179179 let $t054405462 = a
180180 let index = $t054405462._1
181181 let found = $t054405462._2
182182 let ft = split(aperiod, "-")
183183 let $t054995562 = $Tuple2(parseIntValue(ft[0]), parseIntValue(ft[1]))
184184 let from = $t054995562._1
185185 let to = $t054995562._2
186186 if (found)
187187 then a
188188 else if (if ((period >= from))
189189 then (to >= period)
190190 else false)
191191 then $Tuple2(index, true)
192192 else $Tuple2((index + 1), false)
193193 }
194194
195195 let $t056995765 = {
196196 let $l = LENDERS_APR_PERIODS
197197 let $s = size($l)
198198 let $acc0 = $Tuple2(0, false)
199199 func $f0_1 ($a,$i) = if (($i >= $s))
200200 then $a
201201 else for($a, $l[$i])
202202
203203 func $f0_2 ($a,$i) = if (($i >= $s))
204204 then $a
205205 else throw("List size exceeds 9")
206206
207207 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9)
208208 }
209209 let index = $t056995765._1
210210 let found = $t056995765._2
211211 if (found)
212212 then fraction((LENDERS_APR[index] * SCALE8), 7, 365)
213213 else 0
214214 }
215215
216216
217217 func getTotalSupplyAllTokens () = {
218218 func for (a,tokenId) = {
219219 let $t059536009 = a
220220 let totalSupply = $t059536009._1
221221 let totalSupplyUsd = $t059536009._2
222222 let totalSupplyUsdAll = $t059536009._3
223223 let tSupply = valueOrElse(getInteger(lendContract, (kLendTokenSupply + tokenId)), 0)
224224 let assetPrice = getAssetPrice(tokenId)
225225 let assetPrecision = getAssetPrecision(tokenId)
226226 let tSupplyUsd = fraction(tSupply, assetPrice, assetPrecision)
227227 $Tuple3((totalSupply :+ tSupply), (totalSupplyUsd :+ tSupplyUsd), (totalSupplyUsdAll + tSupplyUsd))
228228 }
229229
230230 let $l = getAllTokens()
231231 let $s = size($l)
232232 let $acc0 = $Tuple3(nil, nil, 0)
233233 func $f0_1 ($a,$i) = if (($i >= $s))
234234 then $a
235235 else for($a, $l[$i])
236236
237237 func $f0_2 ($a,$i) = if (($i >= $s))
238238 then $a
239239 else throw("List size exceeds 30")
240240
241241 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30)
242242 }
243243
244244
245245 func getTotalSupplyUsd (tokenId) = {
246246 let tSupply = valueOrElse(getInteger(lendContract, (kLendTokenSupply + tokenId)), 0)
247247 let assetPrice = getAssetPrice(tokenId)
248248 let assetPrecision = getAssetPrecision(tokenId)
249249 fraction(tSupply, assetPrice, assetPrecision)
250250 }
251251
252252
253253 func calcNewTokenInterest (tokenId,totalSupply) = if ((startHeight >= height))
254254 then 0
255255 else {
256256 let rewardPerBlock = getIntegerValue(this, (tokenId + kTokenRewardPerBlock))
257257 let oldInterest = getIntegerValue(this, (tokenId + kTokenInterest))
258258 let updateHeight = getIntegerValue(this, (tokenId + kTokenInterestHeight))
259259 let reward = ((height - updateHeight) * rewardPerBlock)
260260 let interest = if ((totalSupply > 0))
261261 then fraction(reward, SCALE8, totalSupply)
262262 else 0
263263 (oldInterest + interest)
264264 }
265265
266266
267267 func calcNewLpInterest (totalSupply) = if ((startHeight >= height))
268268 then 0
269269 else {
270270 let rewardPerBlock = valueOrElse(getInteger(this, kLpRewardPerBlock), 0)
271271 let oldInterest = valueOrElse(getInteger(this, kLpInterest), 0)
272272 let updateHeight = valueOrElse(getInteger(this, kLpInterestHeight), height)
273273 let reward = ((height - updateHeight) * rewardPerBlock)
274274 let interest = if ((totalSupply > 0))
275275 then fraction(reward, SCALE8, totalSupply)
276276 else 0
277277 (oldInterest + interest)
278278 }
279279
280280
281281 func calcLendUserReward (user,tokenId) = {
282282 let totalSupply = valueOrElse(getInteger(lendContract, (kLendTokenSupply + tokenId)), 0)
283283 let tokenInterest = calcNewTokenInterest(tokenId, totalSupply)
284284 let userSupply = valueOrElse(getInteger(lendContract, ((user + kLendUserSupply) + tokenId)), 0)
285285 let userTokenInterest = valueOrElse(getInteger(this, (((tokenId + "_") + user) + kUserLendInterest)), if ((userSupply == 0))
286286 then tokenInterest
287287 else 0)
288288 let reward = fraction(userSupply, (tokenInterest - userTokenInterest), SCALE8)
289289 $Tuple3(reward, tokenInterest, userSupply)
290290 }
291291
292292
293293 func calcLpUserReward (user) = {
294294 let totalSupply = valueOrElse(getInteger(sfFarmingContract, (axlyPool + kSFTotalSupply)), 0)
295295 let tokenInterest = calcNewLpInterest(totalSupply)
296296 let userSupply = valueOrElse(getInteger(sfFarmingContract, (((axlyPool + "_") + user) + kSFUserTotalSupply)), 0)
297297 let userTokenInterest = valueOrElse(getInteger(this, (user + kUserLpInterest)), if ((userSupply == 0))
298298 then tokenInterest
299299 else 0)
300300 let reward = fraction(userSupply, (tokenInterest - userTokenInterest), SCALE8)
301301 $Tuple3(reward, tokenInterest, userSupply)
302302 }
303303
304304
305305 func claimLenderRewardsCommon (user,readOnly) = {
306306 func claim (a,tokenId) = {
307307 let $t088988942 = a
308308 let tokenIds = $t088988942._1
309309 let cAmount = $t088988942._2
310310 let total = $t088988942._3
311311 let enteries = $t088988942._4
312312 let userAvailableClaim = valueOrElse(getInteger(this, (((tokenId + "_") + user) + kUserLendAvailableClaim)), 0)
313313 let $t090559134 = calcLendUserReward(user, tokenId)
314314 let uReward = $t090559134._1
315315 let newTokenInterest = $t090559134._2
316316 let userSupply = $t090559134._3
317317 let totalToClaim = (userAvailableClaim + uReward)
318318 if (if ((totalToClaim > 0))
319319 then true
320320 else (userSupply > 0))
321321 then {
322322 let newEntreries = if (if (readOnly)
323323 then true
324324 else (totalToClaim == 0))
325325 then enteries
326326 else (enteries ++ [IntegerEntry((((tokenId + "_") + user) + kUserLendInterest), newTokenInterest), IntegerEntry((((tokenId + "_") + user) + kUserLendAvailableClaim), 0), IntegerEntry((tokenId + kTokenInterest), newTokenInterest), IntegerEntry((tokenId + kTokenInterestHeight), height)])
327327 $Tuple4((tokenIds :+ tokenId), (cAmount :+ totalToClaim), (total + totalToClaim), newEntreries)
328328 }
329329 else $Tuple4(tokenIds, cAmount, total, enteries)
330330 }
331331
332332 let $l = getAllTokens()
333333 let $s = size($l)
334334 let $acc0 = $Tuple4(nil, nil, 0, nil)
335335 func $f0_1 ($a,$i) = if (($i >= $s))
336336 then $a
337337 else claim($a, $l[$i])
338338
339339 func $f0_2 ($a,$i) = if (($i >= $s))
340340 then $a
341341 else throw("List size exceeds 30")
342342
343343 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30)
344344 }
345345
346346
347347 func claimLpRewardsCommon (user,readOnly) = {
348348 let userAvailableClaim = valueOrElse(getInteger(this, (user + kUserLpAvailableClaim)), 0)
349349 let $t01006510130 = calcLpUserReward(user)
350350 let uReward = $t01006510130._1
351351 let newLpInterest = $t01006510130._2
352352 let userSupply = $t01006510130._3
353353 let totalToClaim = (userAvailableClaim + uReward)
354354 if (if (readOnly)
355355 then true
356356 else (totalToClaim == 0))
357357 then $Tuple2(totalToClaim, nil)
358358 else $Tuple2(totalToClaim, [IntegerEntry((user + kUserLpInterest), newLpInterest), IntegerEntry((user + kUserLpAvailableClaim), 0), IntegerEntry(kLpInterest, newLpInterest), IntegerEntry(kLpInterestHeight, height)])
359359 }
360360
361361
362362 func getAxlyPriceOnSwopfi () = {
363363 let aBalance = getIntegerValue(addressFromStringValue(axlyPool), "A_asset_balance")
364364 let bBalance = getIntegerValue(addressFromStringValue(axlyPool), "B_asset_balance")
365365 let wPrice = getAssetPrice("WAVES")
366366 fraction(bBalance, wPrice, aBalance)
367367 }
368368
369369
370370 func getAxlySharePrice () = {
371371 let poolAddr = addressFromStringValue(axlyPool)
372372 let aBalance = getIntegerValue(addressFromStringValue(axlyPool), "A_asset_balance")
373373 let bBalance = getIntegerValue(addressFromStringValue(axlyPool), "B_asset_balance")
374374 let dPriceA = getAxlyPriceOnSwopfi()
375375 let dPriceB = getAssetPrice("WAVES")
376376 if (if ((0 > dPriceA))
377377 then true
378378 else (0 > dPriceB))
379379 then -1
380380 else {
381381 let shareSupply = valueOrErrorMessage(getIntegerValue(poolAddr, "share_asset_supply"), "Can't get share asset supply")
382382 let APrecision = pow(10, 0, 8, 0, 0, DOWN)
383383 let BPrecision = pow(10, 0, 8, 0, 0, DOWN)
384384 let sharePrecision = pow(10, 0, 8, 0, 0, DOWN)
385385 let sum = (fraction(aBalance, dPriceA, APrecision) + fraction(bBalance, dPriceB, BPrecision))
386386 fraction(sum, sharePrecision, shareSupply)
387387 }
388388 }
389389
390390
391391 func getTokensAPRs () = {
392392 let axlyPrice = getAxlyPriceOnSwopfi()
393393 let axlyPrecision = getAssetPrecision(axlyId)
394394 func tokensAprs (apr,tokenId) = {
395395 let rwpb = valueOrElse(getInteger(this, (tokenId + kTokenRewardPerBlock)), 0)
396396 let rwpbUsd = fraction(rwpb, axlyPrice, axlyPrecision)
397397 let rwYear = ((rwpbUsd * periodLength) * 52)
398398 let totalSupplyUsd = getTotalSupplyUsd(tokenId)
399399 (apr :+ fraction(rwYear, SCALE8, totalSupplyUsd))
400400 }
401401
402402 let aprs = {
403403 let $l = getAllTokens()
404404 let $s = size($l)
405405 let $acc0 = nil
406406 func $f0_1 ($a,$i) = if (($i >= $s))
407407 then $a
408408 else tokensAprs($a, $l[$i])
409409
410410 func $f0_2 ($a,$i) = if (($i >= $s))
411411 then $a
412412 else throw("List size exceeds 30")
413413
414414 $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)
415415 }
416416 let lpTotalSupply = getIntegerValue(sfFarmingContract, (axlyPool + kSFTotalSupply))
417417 let lpId = getStringValue(addressFromStringValue(axlyPool), kLpId)
418418 let lpPrecision = getAssetPrecision(lpId)
419419 let lpPrice = getAxlySharePrice()
420420 let lpTotalSupplyUsd = fraction(lpTotalSupply, lpPrice, lpPrecision)
421421 let rwpb = valueOrElse(getInteger(this, kLpRewardPerBlock), 0)
422422 let rwpbUsd = fraction(rwpb, axlyPrice, axlyPrecision)
423423 let rwYear = ((rwpbUsd * periodLength) * 52)
424424 let lpApr = fraction(rwYear, SCALE8, lpTotalSupplyUsd)
425425 $Tuple3(getAllTokens(), aprs, lpApr)
426426 }
427427
428428
429429 @Callable(i)
430430 func claimLenderRewards () = {
431431 let claimRes = claimLenderRewardsCommon(toString(i.caller), false)
432432 if ((claimRes._3 == 0))
433433 then throw("claim amount must be greater than 0")
434434 else {
435435 let inv = invoke(tokenContract, "withdrawLendReward", [claimRes._3, toString(i.caller)], nil)
436436 if ((inv == inv))
437437 then claimRes._4
438438 else throw("Strict value is not equal to itself.")
439439 }
440440 }
441441
442442
443443
444444 @Callable(i)
445445 func claimLpRewards () = {
446446 let claimRes = claimLpRewardsCommon(toString(i.caller), false)
447447 if ((claimRes._1 == 0))
448448 then throw("claim amount must be greater than 0")
449449 else {
450450 let inv = invoke(tokenContract, "withdrawLpReward", [claimRes._1, toString(i.caller)], nil)
451451 if ((inv == inv))
452452 then claimRes._2
453453 else throw("Strict value is not equal to itself.")
454454 }
455455 }
456456
457457
458458
459459 @Callable(i)
460460 func lendAction (user,tokenId) = valueOrElse(isLandCall(i), {
461461 let userAvailableClaim = valueOrElse(getInteger(this, (((tokenId + "_") + user) + kUserLendAvailableClaim)), 0)
462462 let $t01362713694 = calcLendUserReward(user, tokenId)
463463 let uReward = $t01362713694._1
464464 let newTokenInterest = $t01362713694._2
465465 [IntegerEntry((((tokenId + "_") + user) + kUserLendInterest), newTokenInterest), IntegerEntry((((tokenId + "_") + user) + kUserLendAvailableClaim), (userAvailableClaim + uReward)), IntegerEntry((tokenId + kTokenInterest), newTokenInterest), IntegerEntry((tokenId + kTokenInterestHeight), height)]
466466 })
467467
468468
469469
470470 @Callable(i)
471471 func lpAction (user) = valueOrElse(isSFFarmingCall(i), {
472472 let userAvailableClaim = valueOrElse(getInteger(this, (user + kUserLpAvailableClaim)), 0)
473473 let $t01416614219 = calcLpUserReward(user)
474474 let uReward = $t01416614219._1
475475 let newLpInterest = $t01416614219._2
476476 [IntegerEntry((user + kUserLpInterest), newLpInterest), IntegerEntry((user + kUserLpAvailableClaim), (userAvailableClaim + uReward)), IntegerEntry(kLpInterest, newLpInterest), IntegerEntry(kLpInterestHeight, height)]
477477 })
478478
479479
480480
481481 @Callable(i)
482482 func init (axlyMainContractAddr,axlyTokenomicContractAddr,axlyPoolAddr,farmingStartHeight,periodLength) = valueOrElse(isSelfCall(i), if (!(isDefined(addressFromString(axlyMainContractAddr))))
483483 then throw("Wrong farming address")
484484 else if (!(isDefined(addressFromString(axlyTokenomicContractAddr))))
485485 then throw("Wrong main contract address")
486486 else [StringEntry(kAxlyMainContract, axlyMainContractAddr), StringEntry(kAxlyTokenomicContract, axlyTokenomicContractAddr), StringEntry(kAxlyPool, axlyPoolAddr), IntegerEntry(kStartHeight, farmingStartHeight), IntegerEntry(kPeriodLength, periodLength)])
487487
488488
489489
490490 @Callable(i)
491491 func initNewToken (tokenId) = valueOrElse(isAdminCall(i), if (isDefined(getInteger(this, (tokenId + kTokenInterest))))
492492 then throw("token already inited")
493493 else if (!(contains(getStringValue(lendContract, kLendSetupTokens), tokenId)))
494494 then throw("no token on landing")
495495 else {
496496 let newAllTokens = (getAllTokens() :+ tokenId)
497497 [IntegerEntry((tokenId + kTokenInterest), 0), IntegerEntry((tokenId + kTokenInterestHeight), max([startHeight, height])), StringEntry(kTokens, makeString(newAllTokens, ",")), IntegerEntry((tokenId + kTokenRewardPerBlock), 0)]
498498 })
499499
500500
501501
502502 @Callable(i)
503503 func updateRewards () = valueOrElse(isOperatorCall(i), {
504504 let lastUpdatePeriod = valueOrElse(getInteger(this, kLastUpdatePeriod), 0)
505505 let calcPeriod = (((height - startHeight) / periodLength) + 1)
506506 let curPeriod = if ((0 >= calcPeriod))
507507 then 1
508508 else calcPeriod
509509 if ((curPeriod > 104))
510510 then throw("max period is 104")
511511 else if (if ((lastUpdatePeriod >= curPeriod))
512512 then (lastUpdatePeriod != 0)
513513 else false)
514514 then throw("rewards alredy updated in this period")
515515 else {
516- let $t01616316284 = getTotalSupplyAllTokens()
517- let totalSupply = $t01616316284._1
518- let totalSupplyUsd = $t01616316284._2
519- let totalSupplyUsdAll = $t01616316284._3
516+ let $t01616316243 = getTotalSupplyAllTokens()
517+ let totalSupply = $t01616316243._1
518+ let totalSupplyUsd = $t01616316243._2
519+ let totalSupplyUsdAll = $t01616316243._3
520520 let axlyPrice = getAxlyPriceOnSwopfi()
521521 let axlyPrecision = getAssetPrecision(axlyId)
522522 let maxAPR = getAdoptedAPRByPeriod(curPeriod, LENDERS_APR_PERIODS, LENDERS_APR)
523523 func updateReward (a,tokenId) = {
524- let $t01653416578 = a
525- let enteries = $t01653416578._1
526- let totalPeriodReward = $t01653416578._2
527- let index = $t01653416578._3
524+ let $t01649316537 = a
525+ let enteries = $t01649316537._1
526+ let totalPeriodReward = $t01649316537._2
527+ let index = $t01649316537._3
528528 if ((totalSupply[index] == 0))
529529 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))
530530 else {
531531 let share = fraction(totalSupplyUsd[index], SCALE8, totalSupplyUsdAll)
532532 let maxReward = fraction(share, lendMaxPeriodAmount, SCALE8)
533533 let maxRewardUsd = fraction(maxReward, axlyPrice, axlyPrecision)
534534 let prevTotalSupply = valueOrElse(getInteger(this, (tokenId + kPrevLendTokenSupply)), 0)
535535 let rtCoef = if (if ((prevTotalSupply == 0))
536536 then true
537537 else (totalSupply[index] == 0))
538538 then 0
539539 else (fraction(totalSupply[index], SCALE8, prevTotalSupply) - SCALE8)
540540 let reward = ((min([(maxAPR * (SCALE8 + max([rtCoef, 0]))), fraction(maxAPR, (15 * SCALE8), 10)]) / SCALE8) / 100)
541541 let rewardUsd = min([maxRewardUsd, fraction(totalSupplyUsd[index], reward, SCALE8)])
542542 let rewardPeriod = fraction(rewardUsd, axlyPrecision, axlyPrice)
543543 let rewardPerBlock = (rewardPeriod / periodLength)
544544 $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))
545545 }
546546 }
547547
548- let $t01827018362 = {
548+ let $t01822918321 = {
549549 let $l = getAllTokens()
550550 let $s = size($l)
551551 let $acc0 = $Tuple3(nil, 0, 0)
552552 func $f0_1 ($a,$i) = if (($i >= $s))
553553 then $a
554554 else updateReward($a, $l[$i])
555555
556556 func $f0_2 ($a,$i) = if (($i >= $s))
557557 then $a
558558 else throw("List size exceeds 30")
559559
560560 $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)
561561 }
562- let tokensEnteries = $t01827018362._1
563- let totalTokenReward = $t01827018362._2
564- let lpMaxAPR = getAdoptedAPRByPeriod(curPeriod, LP_APR_PERIODS, LP_APR)
565- let lpTotalSupply = getIntegerValue(sfFarmingContract, (axlyPool + kSFTotalSupply))
566- let preLPSupply = valueOrElse(getInteger(this, kPrevLPSupply), 0)
567- let lpId = getStringValue(addressFromStringValue(axlyPool), kLpId)
568- let lpPrecision = getAssetPrecision(lpId)
569- let lpPrice = getAxlySharePrice()
570- let lpTotalSupplyUsd = fraction(lpTotalSupply, lpPrice, lpPrecision)
571- let maxLPRewardUsd = fraction(lpMaxPeriodAmount, axlyPrice, axlyPrecision)
572- let rtLPCoef = if (if ((preLPSupply == 0))
573- then true
574- else (lpTotalSupply == 0))
575- then 0
576- else (fraction(lpTotalSupply, SCALE8, preLPSupply) - SCALE8)
577- let rewardLp = ((min([(lpMaxAPR * (SCALE8 + max([rtLPCoef, 0]))), fraction(lpMaxAPR, (15 * SCALE8), 10)]) / SCALE8) / 100)
578- let rewardLpUsd = min([maxLPRewardUsd, fraction(lpTotalSupplyUsd, rewardLp, SCALE8)])
579- let rewardLpPeriod = fraction(rewardLpUsd, axlyPrecision, axlyPrice)
580- let rewardLpPerBlock = (rewardLpPeriod / periodLength)
562+ let tokensEnteries = $t01822918321._1
563+ let totalTokenReward = $t01822918321._2
581564 let burnLend = (lendMaxPeriodAmount - totalTokenReward)
582- let burnLp = (lpMaxPeriodAmount - rewardLpPeriod)
583- let inv = invoke(tokenContract, "withdrawLpReward", [(burnLend + burnLp), toString(this)], nil)
565+ let inv = invoke(tokenContract, "withdrawLendReward", [burnLend, toString(this)], nil)
584566 if ((inv == inv))
585- then {
586- let lpEnteries = if ((12 >= curPeriod))
587- then [IntegerEntry(kPrevLPSupply, lpTotalSupply), IntegerEntry(kLpRewardPerBlock, rewardLpPerBlock), IntegerEntry(kLpInterest, calcNewLpInterest(lpTotalSupply)), IntegerEntry(kLpInterestHeight, max([startHeight, height])), ScriptTransfer(axlyBurnAddr, burnLend, fromBase58String(axlyId)), ScriptTransfer(axlyBurnAddr, burnLp, fromBase58String(axlyId))]
588- else nil
589- ((lpEnteries ++ tokensEnteries) :+ IntegerEntry(kLastUpdatePeriod, curPeriod))
590- }
567+ then (([IntegerEntry(kLpRewardPerBlock, 0), ScriptTransfer(axlyBurnAddr, burnLend, fromBase58String(axlyId))] ++ tokensEnteries) :+ IntegerEntry(kLastUpdatePeriod, curPeriod))
591568 else throw("Strict value is not equal to itself.")
592569 }
593570 })
594571
595572
596573 @Verifier(tx)
597574 func verify () = {
598575 let multiSignedByAdmins = {
599576 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], admin1PK))
600577 then 1
601578 else 0
602579 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], admin2PK))
603580 then 1
604581 else 0
605582 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], admin3PK))
606583 then 1
607584 else 0
608585 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
609586 }
610587 match tx {
611588 case inv: InvokeScriptTransaction =>
612589 let isSelf = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
613590 let isRightFee = if ((inv.fee == 900000))
614591 then (inv.feeAssetId == unit)
615592 else false
616593 let isInitCall = (inv.function == "init")
617594 let isnoPayments = (size(inv.payments) == 0)
618595 if (if (if (if (isRightFee)
619596 then isInitCall
620597 else false)
621598 then isSelf
622599 else false)
623600 then isnoPayments
624601 else false)
625602 then true
626603 else multiSignedByAdmins
627604 case _ =>
628605 multiSignedByAdmins
629606 }
630607 }
631608

github/deemru/w8io/3ef1775 
66.22 ms