tx · 8v4KsueGK5vNdu62MrW6Q2LanaHUA5UwQYdRTJVW2Nf8

3MrMbQwr3cpCvWMWCFjqUZzqRgxg8En6Jd5:  -0.05100000 Waves

2022.08.02 21:30 [2167233] smart account 3MrMbQwr3cpCvWMWCFjqUZzqRgxg8En6Jd5 > SELF 0.00000000 Waves

{ "type": 13, "id": "8v4KsueGK5vNdu62MrW6Q2LanaHUA5UwQYdRTJVW2Nf8", "fee": 5100000, "feeAssetId": null, "timestamp": 1659465034105, "version": 2, "chainId": 84, "sender": "3MrMbQwr3cpCvWMWCFjqUZzqRgxg8En6Jd5", "senderPublicKey": "8WTLBzi1s9cZm76TPZ9czV6poaHGWvpZ7sCBeTBaa7uh", "proofs": [ "2JiWmoP3dUzYyZmtx2RVytquNT7wGSyLUuqQMLAFiuKNfoECCKcxR7Z4rZvX86NRoYB1EmqMV7PbDCS1WRbXLgQw" ], "script": "base64:BgIpCAISBAoCCAgSBQoDCAgBEgQKAggBEgYKBAgIAQESBAoCCAESBAoCCAFHABNrX3RvdGFsRmVlc0luUGVyaW9kAhNrX3RvdGFsRmVlc0luUGVyaW9kABRrX3RyYWRlckZlZXNJblBlcmlvZAIUa190cmFkZXJGZWVzSW5QZXJpb2QADmtfbGFzdE5vdGlvbmFsAg5rX2xhc3ROb3Rpb25hbAASa19sYXN0RGF0ZUluUGVyaW9kAhJrX2xhc3REYXRlSW5QZXJpb2QAFGtfdG90YWxTY29yZUluUGVyaW9kAhRrX3RvdGFsU2NvcmVJblBlcmlvZAAVa190cmFkZXJTY29yZUluUGVyaW9kAhVrX3RyYWRlclNjb3JlSW5QZXJpb2QAH2tfdHJhZGVyQXZlcmFnZU5vdGlvbmFsSW5QZXJpb2QCH2tfdHJhZGVyQXZlcmFnZU5vdGlvbmFsSW5QZXJpb2QAD2tfYW1tUmV3YXJkUmF0ZQIPa19hbW1SZXdhcmRSYXRlABdrX2FtbU1heEFtb3VudFBlclBlcmlvZAIXa19hbW1NYXhBbW91bnRQZXJQZXJpb2QAEGtfcmV3YXJkQXNzZXRJZHMCEGtfcmV3YXJkQXNzZXRJZHMABmtfYW1tcwIGa19hbW1zABdrX2NsYWltZWRBc3NldEFuZFBlcmlvZAIXa19jbGFpbWVkQXNzZXRBbmRQZXJpb2QAD2tfb3JhY2xlQWRkcmVzcwIPa19vcmFjbGVBZGRyZXNzAA1rX29yYWNsZVByaWNlAgVwcmljZQANa19pbml0aWFsaXplZAINa19pbml0aWFsaXplZAAUa19jb29yZGluYXRvckFkZHJlc3MCFGtfY29vcmRpbmF0b3JBZGRyZXNzABJrX2dvdmVybmFuY2VfYXNzZXQCC2tfZ292X2Fzc2V0AA1rX3F1b3RlX2Fzc2V0Ag1rX3F1b3RlX2Fzc2V0ABJrX2FkbWluX3B1YmxpY19rZXkCEmtfYWRtaW5fcHVibGljX2tleQAPa19hZG1pbl9hZGRyZXNzAg9rX2FkbWluX2FkZHJlc3MABWtfYW1tAgVrX2FtbQAMREVDSU1BTF9VTklUCQBoAgABCQBoAgkAaAIJAGgCCQBoAgkAaAIJAGgCCQBoAgAKAAoACgAKAAoACgAKAAoAAUEAgLuwIQAKTVNfSU5fV0VFSwkAaAIA6AcAgPUkAQlsaXN0VG9TdHIBBV9saXN0CgEFX2pvaW4CC2FjY3VtdWxhdG9yA3ZhbAkArAICCQCsAgIFC2FjY3VtdWxhdG9yBQN2YWwCASwECm5ld0xpc3RTdHIKAAIkbAUFX2xpc3QKAAIkcwkAkAMBBQIkbAoABSRhY2MwAgAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBBV9qb2luAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhVMaXN0IHNpemUgZXhjZWVkcyAxMDAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyADMANAA1ADYANwA4ADkAOgA7ADwAPQA+AD8AQABBAEIAQwBEAEUARgBHAEgASQBKAEsATABNAE4ATwBQAFEAUgBTAFQAVQBWAFcAWABZAFoAWwBcAF0AXgBfAGAAYQBiAGMAZAQLbmV3TGlzdFN0clUJALMCAgUKbmV3TGlzdFN0cgABBAtuZXdMaXN0U3RyUgMJAAACCQCvAgIFC25ld0xpc3RTdHJVAAECASwJALACAgULbmV3TGlzdFN0clUAAQULbmV3TGlzdFN0clUFC25ld0xpc3RTdHJSAQlzdHJUb0xpc3QBBF9zdHIDCQAAAgUEX3N0cgIABQNuaWwJALUJAgUEX3N0cgIBLAEEZGl2ZAICX3gCX3kJAG4EBQJfeAUMREVDSU1BTF9VTklUBQJfeQUISEFMRkVWRU4BBG11bGQCAl94Al95CQBuBAUCX3gFAl95BQxERUNJTUFMX1VOSVQFCEhBTEZFVkVOAQRwb3dkAgJfeAJfeQkAbAYFAl94AAgFAl95AAgACAUISEFMRkVWRU4BA2FicwECX3gDCQBmAgUCX3gAAAUCX3gJAQEtAQUCX3gBBG1pbnYCAl94Al95AwkAZgIFAl94BQJfeQUCX3kFAl94AQ50b0NvbXBvc2l0ZUtleQIEX2tleQhfYWRkcmVzcwkArAICCQCsAgIFBF9rZXkCAV8FCF9hZGRyZXNzAQtjb29yZGluYXRvcgAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzBRRrX2Nvb3JkaW5hdG9yQWRkcmVzcwITQ29vcmRpbmF0b3Igbm90IHNldAEOYWRtaW5QdWJsaWNLZXkACQDZBAEJARFAZXh0ck5hdGl2ZSgxMDUzKQIJAQtjb29yZGluYXRvcgAFEmtfYWRtaW5fcHVibGljX2tleQEMYWRtaW5BZGRyZXNzAAkApggBCQERQGV4dHJOYXRpdmUoMTA1MykCCQELY29vcmRpbmF0b3IABQ9rX2FkbWluX2FkZHJlc3MBC2lzV2hpdGVsaXN0AQhfYWRkcmVzcwkBC3ZhbHVlT3JFbHNlAgkAmwgCCQELY29vcmRpbmF0b3IACQEOdG9Db21wb3NpdGVLZXkCBQVrX2FtbQUIX2FkZHJlc3MHAQNpbnQBAWsJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQR0aGlzBQFrCQCsAgICDW5vIHZhbHVlIGZvciAFAWsBBGludDABAWsJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUBawAAAQtpbml0aWFsaXplZAAJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwUNa19pbml0aWFsaXplZAcBEmdldEZlZXNJblBlcmlvZEtleQMEX2FtbQdfdHJhZGVyB193ZWVrSWQJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFFGtfdHJhZGVyRmVlc0luUGVyaW9kAgFfBQRfYW1tAgFfBQdfdHJhZGVyAgFfCQCkAwEFB193ZWVrSWQBF2dldFRvdGFsRmVlc0luUGVyaW9kS2V5AgRfYW1tB193ZWVrSWQJAKwCAgkArAICCQCsAgIJAKwCAgUTa190b3RhbEZlZXNJblBlcmlvZAIBXwUEX2FtbQIBXwkApAMBBQdfd2Vla0lkARJnZXRMYXN0Tm90aW9uYWxLZXkCBF9hbW0HX3RyYWRlcgkArAICCQCsAgIJAKwCAgkArAICBQ5rX2xhc3ROb3Rpb25hbAIBXwUEX2FtbQIBXwUHX3RyYWRlcgEWZ2V0TGFzdERhdGVJblBlcmlvZEtleQMEX2FtbQdfdHJhZGVyB193ZWVrSWQJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFEmtfbGFzdERhdGVJblBlcmlvZAIBXwUEX2FtbQIBXwUHX3RyYWRlcgIBXwkApAMBBQdfd2Vla0lkARlnZXRUcmFkZXJTY29yZUluUGVyaW9kS2V5AwRfYW1tB190cmFkZXIHX3dlZWtJZAkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUVa190cmFkZXJTY29yZUluUGVyaW9kAgFfBQRfYW1tAgFfBQdfdHJhZGVyAgFfCQCkAwEFB193ZWVrSWQBGGdldFRvdGFsU2NvcmVJblBlcmlvZEtleQIEX2FtbQdfd2Vla0lkCQCsAgIJAKwCAgkArAICCQCsAgIFFGtfdG90YWxTY29yZUluUGVyaW9kAgFfBQRfYW1tAgFfCQCkAwEFB193ZWVrSWQBI2dldFRyYWRlckF2ZXJhZ2VOb3Rpb25hbEluUGVyaW9kS2V5AwRfYW1tB190cmFkZXIHX3dlZWtJZAkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUfa190cmFkZXJBdmVyYWdlTm90aW9uYWxJblBlcmlvZAIBXwUEX2FtbQIBXwUHX3RyYWRlcgIBXwkApAMBBQdfd2Vla0lkARNnZXRBbW1SZXdhcmRSYXRlS2V5AgRfYW1tCF9hc3NldElkCQCsAgIJAKwCAgkArAICCQCsAgIFD2tfYW1tUmV3YXJkUmF0ZQIBXwUEX2FtbQIBXwUIX2Fzc2V0SWQBG2dldEFtbU1heEFtb3VudFBlclBlcmlvZEtleQIEX2FtbQhfYXNzZXRJZAkArAICCQCsAgIJAKwCAgkArAICBRdrX2FtbU1heEFtb3VudFBlclBlcmlvZAIBXwUEX2FtbQIBXwUIX2Fzc2V0SWQBHmdldENsYWltZWRUcmFkZXJBc3NldFBlcmlvZEtleQMHX3RyYWRlcghfYXNzZXRJZAdfcGVyaW9kCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBRdrX2NsYWltZWRBc3NldEFuZFBlcmlvZAIBXwUHX3RyYWRlcgIBXwUIX2Fzc2V0SWQCAV8JAKQDAQUHX3BlcmlvZAERZ2V0T3JhY2xlUHJpY2VLZXkCCF9hc3NldElkB19wZXJpb2QJAKwCAgkArAICCQCsAgIJAKwCAgUNa19vcmFjbGVQcmljZQIBXwkApAMBBQdfcGVyaW9kAgFfBQhfYXNzZXRJZAENdXBkYXRlQW1tRmVlcwUEX2FtbQdfdHJhZGVyB193ZWVrSWQLX3RyYWRlckZlZXMKX3RvdGFsRmVlcwQNdHJhZGVyRmVlc0tleQkBEmdldEZlZXNJblBlcmlvZEtleQMFBF9hbW0FB190cmFkZXIFB193ZWVrSWQEDHRvdGFsRmVlc0tleQkBF2dldFRvdGFsRmVlc0luUGVyaW9kS2V5AgUEX2FtbQUHX3dlZWtJZAkAzAgCCQEMSW50ZWdlckVudHJ5AgUNdHJhZGVyRmVlc0tleQULX3RyYWRlckZlZXMJAMwIAgkBDEludGVnZXJFbnRyeQIFDHRvdGFsRmVlc0tleQUKX3RvdGFsRmVlcwUDbmlsAQ11cGRhdGVBbW1EYXRhCARfYW1tB190cmFkZXIHX3dlZWtJZBdfdHJhZGVyTGFzdERhdGVJblBlcmlvZA5fdHJhZGVyQXZlcmFnZRNfdHJhZGVyTGFzdE5vdGlvbmFsDF90cmFkZXJTY29yZQtfdG90YWxTY29yZQQVdG90YWxTY29yZUluUGVyaW9kS2V5CQEYZ2V0VG90YWxTY29yZUluUGVyaW9kS2V5AgUEX2FtbQUHX3dlZWtJZAQWdHJhZGVyU2NvcmVJblBlcmlvZEtleQkBGWdldFRyYWRlclNjb3JlSW5QZXJpb2RLZXkDBQRfYW1tBQdfdHJhZGVyBQdfd2Vla0lkBBNsYXN0RGF0ZUluUGVyaW9kS2V5CQEWZ2V0TGFzdERhdGVJblBlcmlvZEtleQMFBF9hbW0FB190cmFkZXIFB193ZWVrSWQED2xhc3ROb3Rpb25hbEtleQkBEmdldExhc3ROb3Rpb25hbEtleQIFBF9hbW0FB190cmFkZXIEIHRyYWRlckF2ZXJhZ2VOb3Rpb25hbEluUGVyaW9kS2V5CQEjZ2V0VHJhZGVyQXZlcmFnZU5vdGlvbmFsSW5QZXJpb2RLZXkDBQRfYW1tBQdfdHJhZGVyBQdfd2Vla0lkCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRV0b3RhbFNjb3JlSW5QZXJpb2RLZXkFC190b3RhbFNjb3JlCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRZ0cmFkZXJTY29yZUluUGVyaW9kS2V5BQxfdHJhZGVyU2NvcmUJAMwIAgkBDEludGVnZXJFbnRyeQIFE2xhc3REYXRlSW5QZXJpb2RLZXkFF190cmFkZXJMYXN0RGF0ZUluUGVyaW9kCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ9sYXN0Tm90aW9uYWxLZXkFE190cmFkZXJMYXN0Tm90aW9uYWwJAMwIAgkBDEludGVnZXJFbnRyeQIFIHRyYWRlckF2ZXJhZ2VOb3Rpb25hbEluUGVyaW9kS2V5BQ5fdHJhZGVyQXZlcmFnZQUDbmlsAQ51c2RuVG9EZWNpbWFscwEHX2Ftb3VudAkAaAIFB19hbW91bnQAZAEMZ2V0V2Vla1N0YXJ0AQdfd2Vla0lkCQBoAgUHX3dlZWtJZAUKTVNfSU5fV0VFSwEKZ2V0V2Vla0VuZAEHX3dlZWtJZAkAaAIJAGQCBQdfd2Vla0lkAAEFCk1TX0lOX1dFRUsBCWdldFdlZWtJZAEDX3RzCQBpAgUDX3RzBQpNU19JTl9XRUVLAQ9nZXRGZWVzSW5QZXJpb2QDBF9hbW0HX3RyYWRlcgdfd2Vla0lkBANrZXkJARJnZXRGZWVzSW5QZXJpb2RLZXkDBQRfYW1tBQdfdHJhZGVyBQdfd2Vla0lkCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFA2tleQAAARRnZXRUb3RhbEZlZXNJblBlcmlvZAIEX2FtbQdfd2Vla0lkBANrZXkJARdnZXRUb3RhbEZlZXNJblBlcmlvZEtleQIFBF9hbW0FB193ZWVrSWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUDa2V5AAABD2dldExhc3ROb3Rpb25hbAIEX2FtbQdfdHJhZGVyBANrZXkJARJnZXRMYXN0Tm90aW9uYWxLZXkCBQRfYW1tBQdfdHJhZGVyCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFA2tleQAAARNnZXRMYXN0RGF0ZUluUGVyaW9kBARfYW1tB190cmFkZXIHX3dlZWtJZApfd2Vla1N0YXJ0BANrZXkJARZnZXRMYXN0RGF0ZUluUGVyaW9kS2V5AwUEX2FtbQUHX3RyYWRlcgUHX3dlZWtJZAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQNrZXkFCl93ZWVrU3RhcnQBFmdldFRyYWRlclNjb3JlSW5QZXJpb2QDBF9hbW0HX3RyYWRlcgdfd2Vla0lkBANrZXkJARlnZXRUcmFkZXJTY29yZUluUGVyaW9kS2V5AwUEX2FtbQUHX3RyYWRlcgUHX3dlZWtJZAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQNrZXkAAAEVZ2V0VG90YWxTY29yZUluUGVyaW9kAgRfYW1tB193ZWVrSWQEA2tleQkBGGdldFRvdGFsU2NvcmVJblBlcmlvZEtleQIFBF9hbW0FB193ZWVrSWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUDa2V5AAABB2dldEFtbXMACQEJc3RyVG9MaXN0AQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwUGa19hbW1zARFnZXRSZXdhcmRBc3NldElkcwAJAQlzdHJUb0xpc3QBCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzBRBrX3Jld2FyZEFzc2V0SWRzARBnZXRBbW1SZXdhcmRSYXRlAgRfYW1tCF9hc3NldElkBANrZXkJARNnZXRBbW1SZXdhcmRSYXRlS2V5AgUEX2FtbQUIX2Fzc2V0SWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUDa2V5AAABGGdldEFtbU1heEFtb3VudFBlclBlcmlvZAIEX2FtbQhfYXNzZXRJZAQDa2V5CQEbZ2V0QW1tTWF4QW1vdW50UGVyUGVyaW9kS2V5AgUEX2FtbQUIX2Fzc2V0SWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUDa2V5AAABE2dldFJld2FyZEFzc2V0UHJpY2UCCF9hc3NldElkB193ZWVrSWQEEG9yYWNsZUFkZHJlc3NTdHIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQ9rX29yYWNsZUFkZHJlc3MCDk9yYWNsZSBub3Qgc2V0BA1vcmFjbGVBZGRyZXNzCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQUQb3JhY2xlQWRkcmVzc1N0cgIWSW52YWxpZCBvcmFjbGUgYWRkcmVzcwQIcHJpY2VLZXkJARFnZXRPcmFjbGVQcmljZUtleQIFCF9hc3NldElkBQdfd2Vla0lkCQEOdXNkblRvRGVjaW1hbHMBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUNb3JhY2xlQWRkcmVzcwUIcHJpY2VLZXkJAKwCAgkArAICCQCsAgICGk5vIG9yYWNsZSBwcmljZSBmb3IgYXNzZXQgBQhfYXNzZXRJZAIIIHBlcmlvZCAJAKQDAQUHX3dlZWtJZAEecmV3YXJkRm9yVHJhZGVySW5Bc3NldEluUGVyaW9kBARfYW1tB190cmFkZXIIX2Fzc2V0SWQHX3dlZWtJZAQPcmV3YXJkQXNzZXRSYXRlCQEQZ2V0QW1tUmV3YXJkUmF0ZQIFBF9hbW0FCF9hc3NldElkAwkAAAIFD3Jld2FyZEFzc2V0UmF0ZQAAAAAEEXRvdGFsRmVlc0luUGVyaW9kCQEUZ2V0VG90YWxGZWVzSW5QZXJpb2QCBQRfYW1tBQdfd2Vla0lkBBByZXdhcmRBc3NldFByaWNlCQETZ2V0UmV3YXJkQXNzZXRQcmljZQIFCF9hc3NldElkBQdfd2Vla0lkBBxtYXhBbW91bnRPZkFzc2V0VG9EaXN0cmlidXRlCQEYZ2V0QW1tTWF4QW1vdW50UGVyUGVyaW9kAgUEX2FtbQUIX2Fzc2V0SWQEC3RyYWRlclNjb3JlCQEWZ2V0VHJhZGVyU2NvcmVJblBlcmlvZAMFBF9hbW0FB190cmFkZXIFB193ZWVrSWQEEHRvdGFsVHJhZGVyU2NvcmUJARVnZXRUb3RhbFNjb3JlSW5QZXJpb2QCBQRfYW1tBQdfd2Vla0lkAwkAAAIFEHRvdGFsVHJhZGVyU2NvcmUAAAAABBZ0b3RhbEFzc2V0VG9EaXN0cmlidXRlCQEEbXVsZAIJAQRkaXZkAgURdG90YWxGZWVzSW5QZXJpb2QFEHJld2FyZEFzc2V0UHJpY2UFD3Jld2FyZEFzc2V0UmF0ZQQcYWN0dWFsVG90YWxBc3NldFRvRGlzdHJpYnV0ZQkBBG1pbnYCBRZ0b3RhbEFzc2V0VG9EaXN0cmlidXRlBRxtYXhBbW91bnRPZkFzc2V0VG9EaXN0cmlidXRlBBR0cmFkZXJTaGFyZUluUmV3YXJkcwkBBGRpdmQCCQEEbXVsZAIFHGFjdHVhbFRvdGFsQXNzZXRUb0Rpc3RyaWJ1dGUFC3RyYWRlclNjb3JlBRB0b3RhbFRyYWRlclNjb3JlBRR0cmFkZXJTaGFyZUluUmV3YXJkcwEjdG90YWxSZXdhcmRGb3JUcmFkZXJJbkFzc2V0SW5QZXJpb2QDB190cmFkZXIIX2Fzc2V0SWQHX3dlZWtJZAQEYW1tcwkBB2dldEFtbXMACgEHY29tcHV0ZQIEX2FjYwRfYW1tCQBkAgUEX2FjYwkBHnJld2FyZEZvclRyYWRlckluQXNzZXRJblBlcmlvZAQFBF9hbW0FB190cmFkZXIFCF9hc3NldElkBQdfd2Vla0lkCgACJGwFBGFtbXMKAAIkcwkAkAMBBQIkbAoABSRhY2MwAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBB2NvbXB1dGUCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDIwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAEbdG90YWxSZXdhcmRGb3JUcmFkZXJJbkFzc2V0AwdfdHJhZGVyCF9hc3NldElkCF9wZXJpb2RzCgEHY29tcHV0ZQIEX2FjYwdfd2Vla0lkCQBkAgUEX2FjYwkBI3RvdGFsUmV3YXJkRm9yVHJhZGVySW5Bc3NldEluUGVyaW9kAwUHX3RyYWRlcgUIX2Fzc2V0SWQFB193ZWVrSWQKAAIkbAUIX3BlcmlvZHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBB2NvbXB1dGUCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoBCWlzQ2xhaW1lZAMHX3RyYWRlcghfYXNzZXRJZAdfcGVyaW9kBANrZXkJAR5nZXRDbGFpbWVkVHJhZGVyQXNzZXRQZXJpb2RLZXkDBQdfdHJhZGVyBQhfYXNzZXRJZAUHX3BlcmlvZAkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQNrZXkHBgFpAQppbml0aWFsaXplAgxfY29vcmRpbmF0b3IHX29yYWNsZQMJAQtpbml0aWFsaXplZAAJAAIBAhNBbHJlYWR5IGluaXRpYWxpemVkCQDMCAIJAQtTdHJpbmdFbnRyeQIFFGtfY29vcmRpbmF0b3JBZGRyZXNzBQxfY29vcmRpbmF0b3IJAMwIAgkBC1N0cmluZ0VudHJ5AgUPa19vcmFjbGVBZGRyZXNzBQdfb3JhY2xlCQDMCAIJAQxCb29sZWFuRW50cnkCBQ1rX2luaXRpYWxpemVkBgUDbmlsAWkBEXZpZXdfY2xhaW1SZXdhcmRzAwdfdHJhZGVyCF9hc3NldElkB19wZXJpb2QJAAIBCQCkAwEJARt0b3RhbFJld2FyZEZvclRyYWRlckluQXNzZXQDBQdfdHJhZGVyBQhfYXNzZXRJZAkAzAgCBQdfcGVyaW9kBQNuaWwBaQEMY2xhaW1SZXdhcmRzAghfYXNzZXRJZAdfcGVyaW9kBAZ0cmFkZXIJAKUIAQgFAWkGY2FsbGVyAwkBCWlzQ2xhaW1lZAMFBnRyYWRlcgUIX2Fzc2V0SWQFB19wZXJpb2QJAAIBAg9BbHJlYWR5IGNsYWltZWQEDWN1cnJlbnRXZWVrSWQJAQlnZXRXZWVrSWQBCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAMJAGcCBQdfcGVyaW9kBQ1jdXJyZW50V2Vla0lkCQACAQkArAICAj1VbmFibGUgdG8gY2xhaW0gcmV3YXJkcyBpbiBmdXR1cmUgcGVyaW9kcywgY3VycmVudCBwZXJpb2QgaXMgCQCkAwEFDWN1cnJlbnRXZWVrSWQEBmFtb3VudAkBG3RvdGFsUmV3YXJkRm9yVHJhZGVySW5Bc3NldAMFBnRyYWRlcgUIX2Fzc2V0SWQJAMwIAgUHX3BlcmlvZAUDbmlsAwkAAAIFBmFtb3VudAAACQACAQIQTm90aGluZyB0byBjbGFpbQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFBmFtb3VudAkA2QQBBQhfYXNzZXRJZAkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBHmdldENsYWltZWRUcmFkZXJBc3NldFBlcmlvZEtleQMFBnRyYWRlcgUIX2Fzc2V0SWQFB19wZXJpb2QGBQNuaWwBaQENYXR0YWNoUmV3YXJkcwQEX2FtbQhfYXNzZXRJZBNfbWF4QW1vdW50UGVyUGVyaW9kC19yZXdhcmRSYXRlAwMJAQEhAQkBC2luaXRpYWxpemVkAAYJAQIhPQIIBQFpBmNhbGxlcgkBDGFkbWluQWRkcmVzcwAJAAIBAhxJbnZhbGlkIGF0dGFjaFJld2FyZHMgcGFyYW1zBARhbW1zCQEHZ2V0QW1tcwAEDnJld2FyZEFzc2V0SWRzCQERZ2V0UmV3YXJkQXNzZXRJZHMABAduZXdBbW1zAwkBD2NvbnRhaW5zRWxlbWVudAIFBGFtbXMFBF9hbW0FBGFtbXMJAM0IAgUEYW1tcwUEX2FtbQQRbmV3UmV3YXJkQXNzZXRJZHMDCQEPY29udGFpbnNFbGVtZW50AgUOcmV3YXJkQXNzZXRJZHMFCF9hc3NldElkBQ5yZXdhcmRBc3NldElkcwkAzQgCBQ5yZXdhcmRBc3NldElkcwUIX2Fzc2V0SWQJAMwIAgkBDEludGVnZXJFbnRyeQIJARNnZXRBbW1SZXdhcmRSYXRlS2V5AgUEX2FtbQUIX2Fzc2V0SWQFC19yZXdhcmRSYXRlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEbZ2V0QW1tTWF4QW1vdW50UGVyUGVyaW9kS2V5AgUEX2FtbQUIX2Fzc2V0SWQFE19tYXhBbW91bnRQZXJQZXJpb2QJAMwIAgkBC1N0cmluZ0VudHJ5AgUGa19hbW1zCQEJbGlzdFRvU3RyAQUHbmV3QW1tcwkAzAgCCQELU3RyaW5nRW50cnkCBRBrX3Jld2FyZEFzc2V0SWRzCQEJbGlzdFRvU3RyAQURbmV3UmV3YXJkQXNzZXRJZHMFA25pbAFpAQpub3RpZnlGZWVzAgdfdHJhZGVyBF9mZWUEA2FtbQkApQgBCAUBaQZjYWxsZXIDAwkBASEBCQELaXNXaGl0ZWxpc3QBBQNhbW0GCQEBIQEJAQtpbml0aWFsaXplZAAJAAIBAhlJbnZhbGlkIG5vdGlmeUZlZXMgcGFyYW1zBAlhY3R1YWxGZWUJAQ51c2RuVG9EZWNpbWFscwEFBF9mZWUEAnRzCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAQGd2Vla0lkCQEJZ2V0V2Vla0lkAQUCdHMEDGZlZXNJblBlcmlvZAkBD2dldEZlZXNJblBlcmlvZAMFA2FtbQUHX3RyYWRlcgUGd2Vla0lkBBF0b3RhbEZlZXNJblBlcmlvZAkBFGdldFRvdGFsRmVlc0luUGVyaW9kAgUDYW1tBQZ3ZWVrSWQED25ld0ZlZXNJblBlcmlvZAkAZAIFDGZlZXNJblBlcmlvZAUJYWN0dWFsRmVlBBRuZXdUb3RhbEZlZXNJblBlcmlvZAkAZAIFEXRvdGFsRmVlc0luUGVyaW9kBQlhY3R1YWxGZWUJAQ11cGRhdGVBbW1GZWVzBQUDYW1tBQdfdHJhZGVyBQZ3ZWVrSWQFD25ld0ZlZXNJblBlcmlvZAUUbmV3VG90YWxGZWVzSW5QZXJpb2QBaQEObm90aWZ5Tm90aW9uYWwCB190cmFkZXIJX25vdGlvbmFsBANhbW0JAKUIAQgFAWkGY2FsbGVyAwMJAQEhAQkBC2lzV2hpdGVsaXN0AQUDYW1tBgkBASEBCQELaW5pdGlhbGl6ZWQACQACAQIdSW52YWxpZCBub3RpZnlOb3Rpb25hbCBwYXJhbXMEDmFjdHVhbE5vdGlvbmFsCQEOdXNkblRvRGVjaW1hbHMBBQlfbm90aW9uYWwEAnRzCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAQMbGFzdE5vdGlvbmFsCQEPZ2V0TGFzdE5vdGlvbmFsAgUDYW1tBQdfdHJhZGVyBAZ3ZWVrSWQJAQlnZXRXZWVrSWQBBQJ0cwQJd2Vla1N0YXJ0CQEMZ2V0V2Vla1N0YXJ0AQUGd2Vla0lkBAd3ZWVrRW5kCQEKZ2V0V2Vla0VuZAEFBndlZWtJZAQBdAkAZQIFB3dlZWtFbmQFCXdlZWtTdGFydAQQbGFzdERhdGVJblBlcmlvZAkBE2dldExhc3REYXRlSW5QZXJpb2QEBQNhbW0FB190cmFkZXIFBndlZWtJZAUJd2Vla1N0YXJ0BAJkdAkAZQIFAnRzBRBsYXN0RGF0ZUluUGVyaW9kBBFvbGRUcmFkZXJBbW1TY29yZQkBFmdldFRyYWRlclNjb3JlSW5QZXJpb2QDBQNhbW0FB190cmFkZXIFBndlZWtJZAQQb2xkVG90YWxBbW1TY29yZQkBFWdldFRvdGFsU2NvcmVJblBlcmlvZAIFA2FtbQUGd2Vla0lkBARmZWVzCQEPZ2V0RmVlc0luUGVyaW9kAwUDYW1tBQdfdHJhZGVyBQZ3ZWVrSWQEEW5ld1J1bm5pbmdBdmVyYWdlCQBkAgkBBG11bGQCBQxsYXN0Tm90aW9uYWwJAQRkaXZkAgUCZHQFAXQJAQRtdWxkAgUOYWN0dWFsTm90aW9uYWwJAQRkaXZkAgkAZQIFAXQFAmR0BQF0BBFuZXdUcmFkZXJBbW1TY29yZQkBBG11bGQCCQEEcG93ZAIFBGZlZXMFAUEJAQRwb3dkAgURbmV3UnVubmluZ0F2ZXJhZ2UJAGUCBQxERUNJTUFMX1VOSVQFAUEEGG5ld1RvdGFsQW1tU2NvcmVJblBlcmlvZAkAZAIJAGUCBRBvbGRUb3RhbEFtbVNjb3JlBRFvbGRUcmFkZXJBbW1TY29yZQURbmV3VHJhZGVyQW1tU2NvcmUJAQ11cGRhdGVBbW1EYXRhCAUDYW1tBQdfdHJhZGVyBQZ3ZWVrSWQFAnRzBRFuZXdSdW5uaW5nQXZlcmFnZQUOYWN0dWFsTm90aW9uYWwFEW5ld1RyYWRlckFtbVNjb3JlBRhuZXdUb3RhbEFtbVNjb3JlSW5QZXJpb2QBAnR4AQZ2ZXJpZnkACQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACQEOYWRtaW5QdWJsaWNLZXkAv+1Vcw==", "height": 2167233, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: DJ89iyNcHzRojWQU3bseWv4XxN2V9PS8iRL5WHbPxMey Next: 3EhGYRqwHA8v9rr75b2ZDnCUdQkdQd6LdWsDHCd7Ko1S Diff:
OldNewDifferences
4646 let DECIMAL_UNIT = (1 * (((((((10 * 10) * 10) * 10) * 10) * 10) * 10) * 10))
4747
4848 let A = 70000000
49-
50-let DURATION = ((60 * 60) * 24)
51-
52-let NO_ADDRESS = ""
53-
54-let NO_STAKER = 0
5549
5650 let MS_IN_WEEK = (1000 * 604800)
5751
226220 }
227221
228222
229-func getAmms () = strToList(k_amms)
223+func getAmms () = strToList(getStringValue(this, k_amms))
230224
231225
232-func getRewardAssetIds () = strToList(k_rewardAssetIds)
226+func getRewardAssetIds () = strToList(getStringValue(this, k_rewardAssetIds))
233227
234228
235229 func getAmmRewardRate (_amm,_assetId) = {
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let k_totalFeesInPeriod = "k_totalFeesInPeriod"
55
66 let k_traderFeesInPeriod = "k_traderFeesInPeriod"
77
88 let k_lastNotional = "k_lastNotional"
99
1010 let k_lastDateInPeriod = "k_lastDateInPeriod"
1111
1212 let k_totalScoreInPeriod = "k_totalScoreInPeriod"
1313
1414 let k_traderScoreInPeriod = "k_traderScoreInPeriod"
1515
1616 let k_traderAverageNotionalInPeriod = "k_traderAverageNotionalInPeriod"
1717
1818 let k_ammRewardRate = "k_ammRewardRate"
1919
2020 let k_ammMaxAmountPerPeriod = "k_ammMaxAmountPerPeriod"
2121
2222 let k_rewardAssetIds = "k_rewardAssetIds"
2323
2424 let k_amms = "k_amms"
2525
2626 let k_claimedAssetAndPeriod = "k_claimedAssetAndPeriod"
2727
2828 let k_oracleAddress = "k_oracleAddress"
2929
3030 let k_oraclePrice = "price"
3131
3232 let k_initialized = "k_initialized"
3333
3434 let k_coordinatorAddress = "k_coordinatorAddress"
3535
3636 let k_governance_asset = "k_gov_asset"
3737
3838 let k_quote_asset = "k_quote_asset"
3939
4040 let k_admin_public_key = "k_admin_public_key"
4141
4242 let k_admin_address = "k_admin_address"
4343
4444 let k_amm = "k_amm"
4545
4646 let DECIMAL_UNIT = (1 * (((((((10 * 10) * 10) * 10) * 10) * 10) * 10) * 10))
4747
4848 let A = 70000000
49-
50-let DURATION = ((60 * 60) * 24)
51-
52-let NO_ADDRESS = ""
53-
54-let NO_STAKER = 0
5549
5650 let MS_IN_WEEK = (1000 * 604800)
5751
5852 func listToStr (_list) = {
5953 func _join (accumulator,val) = ((accumulator + val) + ",")
6054
6155 let newListStr = {
6256 let $l = _list
6357 let $s = size($l)
6458 let $acc0 = ""
6559 func $f0_1 ($a,$i) = if (($i >= $s))
6660 then $a
6761 else _join($a, $l[$i])
6862
6963 func $f0_2 ($a,$i) = if (($i >= $s))
7064 then $a
7165 else throw("List size exceeds 100")
7266
7367 $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($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($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), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64), 65), 66), 67), 68), 69), 70), 71), 72), 73), 74), 75), 76), 77), 78), 79), 80), 81), 82), 83), 84), 85), 86), 87), 88), 89), 90), 91), 92), 93), 94), 95), 96), 97), 98), 99), 100)
7468 }
7569 let newListStrU = dropRight(newListStr, 1)
7670 let newListStrR = if ((take(newListStrU, 1) == ","))
7771 then drop(newListStrU, 1)
7872 else newListStrU
7973 newListStrR
8074 }
8175
8276
8377 func strToList (_str) = if ((_str == ""))
8478 then nil
8579 else split(_str, ",")
8680
8781
8882 func divd (_x,_y) = fraction(_x, DECIMAL_UNIT, _y, HALFEVEN)
8983
9084
9185 func muld (_x,_y) = fraction(_x, _y, DECIMAL_UNIT, HALFEVEN)
9286
9387
9488 func powd (_x,_y) = pow(_x, 8, _y, 8, 8, HALFEVEN)
9589
9690
9791 func abs (_x) = if ((_x > 0))
9892 then _x
9993 else -(_x)
10094
10195
10296 func minv (_x,_y) = if ((_x > _y))
10397 then _y
10498 else _x
10599
106100
107101 func toCompositeKey (_key,_address) = ((_key + "_") + _address)
108102
109103
110104 func coordinator () = valueOrErrorMessage(addressFromString(getStringValue(this, k_coordinatorAddress)), "Coordinator not set")
111105
112106
113107 func adminPublicKey () = fromBase58String(getStringValue(coordinator(), k_admin_public_key))
114108
115109
116110 func adminAddress () = addressFromString(getStringValue(coordinator(), k_admin_address))
117111
118112
119113 func isWhitelist (_address) = valueOrElse(getBoolean(coordinator(), toCompositeKey(k_amm, _address)), false)
120114
121115
122116 func int (k) = valueOrErrorMessage(getInteger(this, k), ("no value for " + k))
123117
124118
125119 func int0 (k) = valueOrElse(getInteger(this, k), 0)
126120
127121
128122 func initialized () = valueOrElse(getBoolean(this, k_initialized), false)
129123
130124
131125 func getFeesInPeriodKey (_amm,_trader,_weekId) = ((((((k_traderFeesInPeriod + "_") + _amm) + "_") + _trader) + "_") + toString(_weekId))
132126
133127
134128 func getTotalFeesInPeriodKey (_amm,_weekId) = ((((k_totalFeesInPeriod + "_") + _amm) + "_") + toString(_weekId))
135129
136130
137131 func getLastNotionalKey (_amm,_trader) = ((((k_lastNotional + "_") + _amm) + "_") + _trader)
138132
139133
140134 func getLastDateInPeriodKey (_amm,_trader,_weekId) = ((((((k_lastDateInPeriod + "_") + _amm) + "_") + _trader) + "_") + toString(_weekId))
141135
142136
143137 func getTraderScoreInPeriodKey (_amm,_trader,_weekId) = ((((((k_traderScoreInPeriod + "_") + _amm) + "_") + _trader) + "_") + toString(_weekId))
144138
145139
146140 func getTotalScoreInPeriodKey (_amm,_weekId) = ((((k_totalScoreInPeriod + "_") + _amm) + "_") + toString(_weekId))
147141
148142
149143 func getTraderAverageNotionalInPeriodKey (_amm,_trader,_weekId) = ((((((k_traderAverageNotionalInPeriod + "_") + _amm) + "_") + _trader) + "_") + toString(_weekId))
150144
151145
152146 func getAmmRewardRateKey (_amm,_assetId) = ((((k_ammRewardRate + "_") + _amm) + "_") + _assetId)
153147
154148
155149 func getAmmMaxAmountPerPeriodKey (_amm,_assetId) = ((((k_ammMaxAmountPerPeriod + "_") + _amm) + "_") + _assetId)
156150
157151
158152 func getClaimedTraderAssetPeriodKey (_trader,_assetId,_period) = ((((((k_claimedAssetAndPeriod + "_") + _trader) + "_") + _assetId) + "_") + toString(_period))
159153
160154
161155 func getOraclePriceKey (_assetId,_period) = ((((k_oraclePrice + "_") + toString(_period)) + "_") + _assetId)
162156
163157
164158 func updateAmmFees (_amm,_trader,_weekId,_traderFees,_totalFees) = {
165159 let traderFeesKey = getFeesInPeriodKey(_amm, _trader, _weekId)
166160 let totalFeesKey = getTotalFeesInPeriodKey(_amm, _weekId)
167161 [IntegerEntry(traderFeesKey, _traderFees), IntegerEntry(totalFeesKey, _totalFees)]
168162 }
169163
170164
171165 func updateAmmData (_amm,_trader,_weekId,_traderLastDateInPeriod,_traderAverage,_traderLastNotional,_traderScore,_totalScore) = {
172166 let totalScoreInPeriodKey = getTotalScoreInPeriodKey(_amm, _weekId)
173167 let traderScoreInPeriodKey = getTraderScoreInPeriodKey(_amm, _trader, _weekId)
174168 let lastDateInPeriodKey = getLastDateInPeriodKey(_amm, _trader, _weekId)
175169 let lastNotionalKey = getLastNotionalKey(_amm, _trader)
176170 let traderAverageNotionalInPeriodKey = getTraderAverageNotionalInPeriodKey(_amm, _trader, _weekId)
177171 [IntegerEntry(totalScoreInPeriodKey, _totalScore), IntegerEntry(traderScoreInPeriodKey, _traderScore), IntegerEntry(lastDateInPeriodKey, _traderLastDateInPeriod), IntegerEntry(lastNotionalKey, _traderLastNotional), IntegerEntry(traderAverageNotionalInPeriodKey, _traderAverage)]
178172 }
179173
180174
181175 func usdnToDecimals (_amount) = (_amount * 100)
182176
183177
184178 func getWeekStart (_weekId) = (_weekId * MS_IN_WEEK)
185179
186180
187181 func getWeekEnd (_weekId) = ((_weekId + 1) * MS_IN_WEEK)
188182
189183
190184 func getWeekId (_ts) = (_ts / MS_IN_WEEK)
191185
192186
193187 func getFeesInPeriod (_amm,_trader,_weekId) = {
194188 let key = getFeesInPeriodKey(_amm, _trader, _weekId)
195189 valueOrElse(getInteger(this, key), 0)
196190 }
197191
198192
199193 func getTotalFeesInPeriod (_amm,_weekId) = {
200194 let key = getTotalFeesInPeriodKey(_amm, _weekId)
201195 valueOrElse(getInteger(this, key), 0)
202196 }
203197
204198
205199 func getLastNotional (_amm,_trader) = {
206200 let key = getLastNotionalKey(_amm, _trader)
207201 valueOrElse(getInteger(this, key), 0)
208202 }
209203
210204
211205 func getLastDateInPeriod (_amm,_trader,_weekId,_weekStart) = {
212206 let key = getLastDateInPeriodKey(_amm, _trader, _weekId)
213207 valueOrElse(getInteger(this, key), _weekStart)
214208 }
215209
216210
217211 func getTraderScoreInPeriod (_amm,_trader,_weekId) = {
218212 let key = getTraderScoreInPeriodKey(_amm, _trader, _weekId)
219213 valueOrElse(getInteger(this, key), 0)
220214 }
221215
222216
223217 func getTotalScoreInPeriod (_amm,_weekId) = {
224218 let key = getTotalScoreInPeriodKey(_amm, _weekId)
225219 valueOrElse(getInteger(this, key), 0)
226220 }
227221
228222
229-func getAmms () = strToList(k_amms)
223+func getAmms () = strToList(getStringValue(this, k_amms))
230224
231225
232-func getRewardAssetIds () = strToList(k_rewardAssetIds)
226+func getRewardAssetIds () = strToList(getStringValue(this, k_rewardAssetIds))
233227
234228
235229 func getAmmRewardRate (_amm,_assetId) = {
236230 let key = getAmmRewardRateKey(_amm, _assetId)
237231 valueOrElse(getInteger(this, key), 0)
238232 }
239233
240234
241235 func getAmmMaxAmountPerPeriod (_amm,_assetId) = {
242236 let key = getAmmMaxAmountPerPeriodKey(_amm, _assetId)
243237 valueOrElse(getInteger(this, key), 0)
244238 }
245239
246240
247241 func getRewardAssetPrice (_assetId,_weekId) = {
248242 let oracleAddressStr = valueOrErrorMessage(getString(this, k_oracleAddress), "Oracle not set")
249243 let oracleAddress = valueOrErrorMessage(addressFromString(oracleAddressStr), "Invalid oracle address")
250244 let priceKey = getOraclePriceKey(_assetId, _weekId)
251245 usdnToDecimals(valueOrErrorMessage(getInteger(oracleAddress, priceKey), ((("No oracle price for asset " + _assetId) + " period ") + toString(_weekId))))
252246 }
253247
254248
255249 func rewardForTraderInAssetInPeriod (_amm,_trader,_assetId,_weekId) = {
256250 let rewardAssetRate = getAmmRewardRate(_amm, _assetId)
257251 if ((rewardAssetRate == 0))
258252 then 0
259253 else {
260254 let totalFeesInPeriod = getTotalFeesInPeriod(_amm, _weekId)
261255 let rewardAssetPrice = getRewardAssetPrice(_assetId, _weekId)
262256 let maxAmountOfAssetToDistribute = getAmmMaxAmountPerPeriod(_amm, _assetId)
263257 let traderScore = getTraderScoreInPeriod(_amm, _trader, _weekId)
264258 let totalTraderScore = getTotalScoreInPeriod(_amm, _weekId)
265259 if ((totalTraderScore == 0))
266260 then 0
267261 else {
268262 let totalAssetToDistribute = muld(divd(totalFeesInPeriod, rewardAssetPrice), rewardAssetRate)
269263 let actualTotalAssetToDistribute = minv(totalAssetToDistribute, maxAmountOfAssetToDistribute)
270264 let traderShareInRewards = divd(muld(actualTotalAssetToDistribute, traderScore), totalTraderScore)
271265 traderShareInRewards
272266 }
273267 }
274268 }
275269
276270
277271 func totalRewardForTraderInAssetInPeriod (_trader,_assetId,_weekId) = {
278272 let amms = getAmms()
279273 func compute (_acc,_amm) = (_acc + rewardForTraderInAssetInPeriod(_amm, _trader, _assetId, _weekId))
280274
281275 let $l = amms
282276 let $s = size($l)
283277 let $acc0 = 0
284278 func $f0_1 ($a,$i) = if (($i >= $s))
285279 then $a
286280 else compute($a, $l[$i])
287281
288282 func $f0_2 ($a,$i) = if (($i >= $s))
289283 then $a
290284 else throw("List size exceeds 20")
291285
292286 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
293287 }
294288
295289
296290 func totalRewardForTraderInAsset (_trader,_assetId,_periods) = {
297291 func compute (_acc,_weekId) = (_acc + totalRewardForTraderInAssetInPeriod(_trader, _assetId, _weekId))
298292
299293 let $l = _periods
300294 let $s = size($l)
301295 let $acc0 = 0
302296 func $f0_1 ($a,$i) = if (($i >= $s))
303297 then $a
304298 else compute($a, $l[$i])
305299
306300 func $f0_2 ($a,$i) = if (($i >= $s))
307301 then $a
308302 else throw("List size exceeds 10")
309303
310304 $f0_2($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)
311305 }
312306
313307
314308 func isClaimed (_trader,_assetId,_period) = {
315309 let key = getClaimedTraderAssetPeriodKey(_trader, _assetId, _period)
316310 valueOrElse(getBoolean(this, key), false)
317311 }
318312
319313
320314 @Callable(i)
321315 func initialize (_coordinator,_oracle) = if (initialized())
322316 then throw("Already initialized")
323317 else [StringEntry(k_coordinatorAddress, _coordinator), StringEntry(k_oracleAddress, _oracle), BooleanEntry(k_initialized, true)]
324318
325319
326320
327321 @Callable(i)
328322 func view_claimRewards (_trader,_assetId,_period) = throw(toString(totalRewardForTraderInAsset(_trader, _assetId, [_period])))
329323
330324
331325
332326 @Callable(i)
333327 func claimRewards (_assetId,_period) = {
334328 let trader = toString(i.caller)
335329 if (isClaimed(trader, _assetId, _period))
336330 then throw("Already claimed")
337331 else {
338332 let currentWeekId = getWeekId(lastBlock.timestamp)
339333 if ((_period >= currentWeekId))
340334 then throw(("Unable to claim rewards in future periods, current period is " + toString(currentWeekId)))
341335 else {
342336 let amount = totalRewardForTraderInAsset(trader, _assetId, [_period])
343337 if ((amount == 0))
344338 then throw("Nothing to claim")
345339 else [ScriptTransfer(i.caller, amount, fromBase58String(_assetId)), BooleanEntry(getClaimedTraderAssetPeriodKey(trader, _assetId, _period), true)]
346340 }
347341 }
348342 }
349343
350344
351345
352346 @Callable(i)
353347 func attachRewards (_amm,_assetId,_maxAmountPerPeriod,_rewardRate) = if (if (!(initialized()))
354348 then true
355349 else (i.caller != adminAddress()))
356350 then throw("Invalid attachRewards params")
357351 else {
358352 let amms = getAmms()
359353 let rewardAssetIds = getRewardAssetIds()
360354 let newAmms = if (containsElement(amms, _amm))
361355 then amms
362356 else (amms :+ _amm)
363357 let newRewardAssetIds = if (containsElement(rewardAssetIds, _assetId))
364358 then rewardAssetIds
365359 else (rewardAssetIds :+ _assetId)
366360 [IntegerEntry(getAmmRewardRateKey(_amm, _assetId), _rewardRate), IntegerEntry(getAmmMaxAmountPerPeriodKey(_amm, _assetId), _maxAmountPerPeriod), StringEntry(k_amms, listToStr(newAmms)), StringEntry(k_rewardAssetIds, listToStr(newRewardAssetIds))]
367361 }
368362
369363
370364
371365 @Callable(i)
372366 func notifyFees (_trader,_fee) = {
373367 let amm = toString(i.caller)
374368 if (if (!(isWhitelist(amm)))
375369 then true
376370 else !(initialized()))
377371 then throw("Invalid notifyFees params")
378372 else {
379373 let actualFee = usdnToDecimals(_fee)
380374 let ts = lastBlock.timestamp
381375 let weekId = getWeekId(ts)
382376 let feesInPeriod = getFeesInPeriod(amm, _trader, weekId)
383377 let totalFeesInPeriod = getTotalFeesInPeriod(amm, weekId)
384378 let newFeesInPeriod = (feesInPeriod + actualFee)
385379 let newTotalFeesInPeriod = (totalFeesInPeriod + actualFee)
386380 updateAmmFees(amm, _trader, weekId, newFeesInPeriod, newTotalFeesInPeriod)
387381 }
388382 }
389383
390384
391385
392386 @Callable(i)
393387 func notifyNotional (_trader,_notional) = {
394388 let amm = toString(i.caller)
395389 if (if (!(isWhitelist(amm)))
396390 then true
397391 else !(initialized()))
398392 then throw("Invalid notifyNotional params")
399393 else {
400394 let actualNotional = usdnToDecimals(_notional)
401395 let ts = lastBlock.timestamp
402396 let lastNotional = getLastNotional(amm, _trader)
403397 let weekId = getWeekId(ts)
404398 let weekStart = getWeekStart(weekId)
405399 let weekEnd = getWeekEnd(weekId)
406400 let t = (weekEnd - weekStart)
407401 let lastDateInPeriod = getLastDateInPeriod(amm, _trader, weekId, weekStart)
408402 let dt = (ts - lastDateInPeriod)
409403 let oldTraderAmmScore = getTraderScoreInPeriod(amm, _trader, weekId)
410404 let oldTotalAmmScore = getTotalScoreInPeriod(amm, weekId)
411405 let fees = getFeesInPeriod(amm, _trader, weekId)
412406 let newRunningAverage = (muld(lastNotional, divd(dt, t)) + muld(actualNotional, divd((t - dt), t)))
413407 let newTraderAmmScore = muld(powd(fees, A), powd(newRunningAverage, (DECIMAL_UNIT - A)))
414408 let newTotalAmmScoreInPeriod = ((oldTotalAmmScore - oldTraderAmmScore) + newTraderAmmScore)
415409 updateAmmData(amm, _trader, weekId, ts, newRunningAverage, actualNotional, newTraderAmmScore, newTotalAmmScoreInPeriod)
416410 }
417411 }
418412
419413
420414 @Verifier(tx)
421415 func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], adminPublicKey())
422416

github/deemru/w8io/873ac7e 
67.95 ms