tx · H3taGjmNoyFNt69DDoMdQMm6YDtDRVWUKQopSLUWVhop

3MvJDKBFzztnd7KCU78zgJ8qUuzVux4c9yw:  -0.01000000 Waves

2022.10.22 15:55 [2283634] smart account 3MvJDKBFzztnd7KCU78zgJ8qUuzVux4c9yw > SELF 0.00000000 Waves

{ "type": 13, "id": "H3taGjmNoyFNt69DDoMdQMm6YDtDRVWUKQopSLUWVhop", "fee": 1000000, "feeAssetId": null, "timestamp": 1666443342227, "version": 2, "chainId": 84, "sender": "3MvJDKBFzztnd7KCU78zgJ8qUuzVux4c9yw", "senderPublicKey": "9gVuyFNzke49pnadJxJ312ZWhYudDhdcqP5hsm5pGQw6", "proofs": [ "2pgY93qBnY4kynX2EP4gDvUrDr2Jp1A6H6BRMizrRrwuqHLWiuxoyJV9yX7wkdz4JZG3DeHXjbEYytXpPd71NBr4" ], "script": "base64:BgIyCAISAwoBCBIDCgEIEgYKBAgBAQgSBQoDCAEIEgUKAwgIARIAEgQKAggEEgQKAggEEgAtAAl1bmRlZmluZWQCCXVuZGVmaW5lZAAJc2VwYXJhdG9yAgE7ABBjb25maWdBZGRyZXNzS2V5AgZjb25maWcAE2NvbGxlY3RvckFkZHJlc3NLZXkCEWNvbGxlY3Rvcl9hZGRyZXNzABFoaXN0b3J5QWRkcmVzc0tleQIPaGlzdG9yeV9hZGRyZXNzABJwYXltYWtlckFkZHJlc3NLZXkCEHBheW1ha2VyX2FkZHJlc3MACWFkbWluc0tleQIGYWRtaW5zAA1jb25maWdBZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA2MikBCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzBRBjb25maWdBZGRyZXNzS2V5ABBjb2xsZWN0b3JBZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA2MikBCQERQGV4dHJOYXRpdmUoMTA1MykCBQ1jb25maWdBZGRyZXNzBRNjb2xsZWN0b3JBZGRyZXNzS2V5AA5oaXN0b3J5QWRkcmVzcwkBEUBleHRyTmF0aXZlKDEwNjIpAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUNY29uZmlnQWRkcmVzcwURaGlzdG9yeUFkZHJlc3NLZXkAD3BheW1ha2VyQWRkcmVzcwkBEUBleHRyTmF0aXZlKDEwNjIpAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUNY29uZmlnQWRkcmVzcwUScGF5bWFrZXJBZGRyZXNzS2V5AQdpc0FkbWluAQZjYWxsZXIEBmFkbVJvdwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ1jb25maWdBZGRyZXNzBQlhZG1pbnNLZXkCAAMDCQAAAgUGY2FsbGVyBQR0aGlzBgkBCGNvbnRhaW5zAgUGYWRtUm93CQClCAEFBmNhbGxlcgYHAQ1nZXRDaGVja2VyS2V5AQdjaGVja2VyCQCsAgICCGNoZWNrZXJfBQdjaGVja2VyAQlpc0NoZWNrZXIBB2NoZWNrZXIECGlzRXhpc3RzCQEJaXNEZWZpbmVkAQkAmwgCBQ1jb25maWdBZGRyZXNzCQENZ2V0Q2hlY2tlcktleQEFB2NoZWNrZXIFCGlzRXhpc3RzAARVU0ROASC2JinDBPXOU5GkDkt1JC9kjFGx+t+vVCm9SNIdKrKq0QAJbWluQW1vdW50AICt4gQADGZlZU51bWVyYXRvcgAFAA5mZWVEZW5vbWluYXRvcgBkAA5tYXhCZXRzT25QcmljZQADAA1maXJzdEV2ZW50S2V5AgtmaXJzdF9ldmVudAAMbGFzdEV2ZW50S2V5AgpsYXN0X2V2ZW50ABVmaXNydEZpbmlzaGVkRXZlbnRLZXkCFGZpcnN0X2ZpbmlzaGVkX2V2ZW50ABRsYXN0RmluaXNoZWRFdmVudEtleQITbGFzdF9maW5pc2hlZF9ldmVudAATZmlzcnRBY3RpdmVFdmVudEtleQISZmlyc3RfYWN0aXZlX2V2ZW50ABJsYXN0QWN0aXZlRXZlbnRLZXkCEWxhc3RfYWN0aXZlX2V2ZW50ARBnZXRTdGFydEJsb2NrS2V5AQdldmVudElkCQCsAgIFB2V2ZW50SWQCDF9zdGFydF9ibG9jawEOZ2V0RW5kQmxvY2tLZXkBB2V2ZW50SWQJAKwCAgUHZXZlbnRJZAIKX2VuZF9ibG9jawEOZ2V0RmluaXNoQXRLZXkBB2V2ZW50SWQJAKwCAgUHZXZlbnRJZAIQX2ZpbmlzaF9hdF9ibG9jawEIZ2V0SWRLZXkBB2V2ZW50SWQJAKwCAgUHZXZlbnRJZAIDX2lkAQxnZXRTdGF0dXNLZXkBB2V2ZW50SWQJAKwCAgUHZXZlbnRJZAIHX3N0YXR1cwEKZ2V0RGVzY0tleQEHZXZlbnRJZAkArAICBQdldmVudElkAgxfZGVzY3JpcHRpb24BD2dldFByZXZFdmVudEtleQEHZXZlbnRJZAkArAICBQdldmVudElkAgtfcHJldl9ldmVudAEPZ2V0TmV4dEV2ZW50S2V5AQdldmVudElkCQCsAgIFB2V2ZW50SWQCC19uZXh0X2V2ZW50AQ1nZXRBc3NldElkS2V5AQdldmVudElkCQCsAgIFB2V2ZW50SWQCCV9hc3NldF9pZAERZ2V0VG90YWxBbW91bnRLZXkBB2V2ZW50SWQJAKwCAgUHZXZlbnRJZAINX3RvdGFsX2Ftb3VudAEXZ2V0UHJpY2VzR3JvdXBzQ291bnRLZXkBB2V2ZW50SWQJAKwCAgUHZXZlbnRJZAITX3ByaWNlc19ncm91cF9jb3VudAEWZ2V0UHJpY2VzTGlzdHNDb3VudEtleQEHZXZlbnRJZAkArAICBQdldmVudElkAhJfcHJpY2VzX2xpc3RfY291bnQBEWdldFByaWNlc0xpc3ROS2V5AgdldmVudElkAW4JAKwCAgkArAICBQdldmVudElkAg1fcHJpY2VzX2xpc3RfCQCkAwEFAW4BEWdldFByaWNlQmV0c0NvdW50AgdldmVudElkBXByaWNlCQCsAgIJAKwCAgkArAICBQdldmVudElkAgFfCQCkAwEFBXByaWNlAgtfYmV0c19jb3VudAESZ2V0UHJpY2VBZGRyZXNzS2V5AgdldmVudElkB2FkZHJlc3MJAKwCAgkArAICCQCsAgIFB2V2ZW50SWQCAV8FB2FkZHJlc3MCBl9wcmljZQEFYXNJbnQBAXYEByRtYXRjaDAFAXYDCQABAgUHJG1hdGNoMAIDSW50BAF4BQckbWF0Y2gwBQF4BAF0BQckbWF0Y2gwCQACAQIEI2VycgEIYXNTdHJpbmcBAXYEByRtYXRjaDAFAXYDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAF4BQckbWF0Y2gwBQF4CQACAQIEI2VycgEMZ2V0QXNzZXRJbmZvAQhhc3NldFN0cgQHYXNzZXRJZAkA2QQBBQhhc3NldFN0cgQBeAQHJG1hdGNoMAkA7AcBBQdhc3NldElkAwkAAQIFByRtYXRjaDACBUFzc2V0BAVhc3NldAUHJG1hdGNoMAkAlAoCBQhhc3NldFN0cggFBWFzc2V0CGRlY2ltYWxzCQCUCgICBVdBVkVTAAAFAXgBCWdldFN0YXR1cwEHZXZlbnRJZAQGc3RhdHVzCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzCQEMZ2V0U3RhdHVzS2V5AQUHZXZlbnRJZAMDAwkAAAIFBnN0YXR1cwIIZmluaXNoZWQGCQAAAgUGc3RhdHVzAgEjBgkAAAIFBnN0YXR1cwIFZW5kZWQFBnN0YXR1cwQIZmluaXNoQXQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAQ5nZXRGaW5pc2hBdEtleQEFB2V2ZW50SWQECnN0YXJ0QmxvY2sJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJARBnZXRTdGFydEJsb2NrS2V5AQUHZXZlbnRJZAQIZW5kQmxvY2sJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAQ5nZXRFbmRCbG9ja0tleQEFB2V2ZW50SWQDCQBmAgUKc3RhcnRCbG9jawUGaGVpZ2h0Aghhd2FpdGluZwMDCQBnAgUGaGVpZ2h0BQpzdGFydEJsb2NrCQBnAgUIZW5kQmxvY2sFBmhlaWdodAcCBmFjdGl2ZQMDCQBmAgUGaGVpZ2h0BQhlbmRCbG9jawkAZwIFCGZpbmlzaEF0BQZoZWlnaHQHAgxjb25maXJtYXRpb24DCQBmAgUGaGVpZ2h0BQhmaW5pc2hBdAIIZmluaXNoZWQJAAIBAg51bmtub3duIHN0YXR1cwENcmVnaXN0ZXJFdmVudAYEdHhpZARkZXNjCnN0YXJ0QmxvY2sIZW5kQmxvY2sIZmluaXNoQXQIYXNzZXRTdHIEB2V2ZW50SWQFBHR4aWQEBmluc2VydAkA/AcEBQR0aGlzAgxpbnNlcnRUb0xpc3QJAMwIAgUHZXZlbnRJZAkAzAgCBgUDbmlsBQNuaWwDCQAAAgUGaW5zZXJ0BQZpbnNlcnQEBmNvbmNhdAkA/AcEBQR0aGlzAgtjb25jYXRMaXN0cwUDbmlsBQNuaWwDCQAAAgUGY29uY2F0BQZjb25jYXQECyR0MDQ4Njc0OTIwCQEMZ2V0QXNzZXRJbmZvAQUIYXNzZXRTdHIEB2Fzc2V0SWQIBQskdDA0ODY3NDkyMAJfMQQNYXNzZXREZWNpbWFscwgFCyR0MDQ4Njc0OTIwAl8yCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEQZ2V0U3RhcnRCbG9ja0tleQEFB2V2ZW50SWQFCnN0YXJ0QmxvY2sJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ5nZXRFbmRCbG9ja0tleQEFB2V2ZW50SWQFCGVuZEJsb2NrCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEOZ2V0RmluaXNoQXRLZXkBBQdldmVudElkBQhmaW5pc2hBdAkAzAgCCQELU3RyaW5nRW50cnkCCQEKZ2V0RGVzY0tleQEFB2V2ZW50SWQFBGRlc2MJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDGdldFN0YXR1c0tleQEFB2V2ZW50SWQCA25ldwkAzAgCCQELU3RyaW5nRW50cnkCCQEIZ2V0SWRLZXkBBQdldmVudElkBQdldmVudElkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ1nZXRBc3NldElkS2V5AQUHZXZlbnRJZAUHYXNzZXRJZAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQFpAQRpbml0AQZjb25maWcDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhBvbmx5IG1haW4gY2FuIGRvBAhpc0V4aXN0cwkBCWlzRGVmaW5lZAEJAJ0IAgUEdGhpcwUQY29uZmlnQWRkcmVzc0tleQMJAQEhAQUIaXNFeGlzdHMJAMwIAgkBC1N0cmluZ0VudHJ5AgUQY29uZmlnQWRkcmVzc0tleQUGY29uZmlnBQNuaWwJAAIBAg5hbHJlYWR5IGluaXRlZAFpAQ1hcHBlbmRFdmVudGVyAQRkZXNjAwkBASEBCQEHaXNBZG1pbgEIBQFpBmNhbGxlcgkAAgECEW9ubHkgYWRtaW4gY2FuIGRvBANpbnYJAPwHBAUNY29uZmlnQWRkcmVzcwIKc2V0RXZlbnRlcgkAzAgCCQClCAEFBHRoaXMJAMwIAgUEZGVzYwUDbmlsBQNuaWwDCQAAAgUDaW52BQNpbnYFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARFmdWxsUmVnaXN0ZXJFdmVudAQEZGVzYwpzdGFydEJsb2NrCGR1cmF0aW9uCGFzc2V0U3RyBA1uZXdTdGFydEJsb2NrAwkAAAIFCnN0YXJ0QmxvY2sAAAUGaGVpZ2h0BQpzdGFydEJsb2NrBAhlbmRCbG9jawkAZAIFDW5ld1N0YXJ0QmxvY2sFCGR1cmF0aW9uBAhmaW5pc2hBdAkAZAIFCGVuZEJsb2NrAKALAwkBASEBCQEHaXNBZG1pbgEIBQFpBmNhbGxlcgkAAgECEW9ubHkgYWRtaW4gY2FuIGRvBAR0eGlkCQDYBAEIBQFpDXRyYW5zYWN0aW9uSWQJAQ1yZWdpc3RlckV2ZW50BgUEdHhpZAUEZGVzYwUNbmV3U3RhcnRCbG9jawUIZW5kQmxvY2sFCGZpbmlzaEF0BQhhc3NldFN0cgFpAQZjaG9pY2UDB2V2ZW50SWQFcHJpY2UHYWRkcmVzcwQGc3RhdHVzCQEJZ2V0U3RhdHVzAQUHZXZlbnRJZAMJAAACBQZzdGF0dXMCBmFjdGl2ZQMDCQAAAgkAkAMBCAUBaQhwYXltZW50cwABCQAAAggJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBQRVU0ROBwQNcGF1bWVudEFtb3VudAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQDCQBmAgUJbWluQW1vdW50BQ1wYXVtZW50QW1vdW50CQACAQIbYW1vdW50IGlzIGxlc3MgdGhhbiBhbGxvd2VkBAlpbnZBcHBlbmQJAPwHBAUEdGhpcwIOYXBwZW5kQmV0c0xpc3QJAMwIAgUHZXZlbnRJZAkAzAgCBQdhZGRyZXNzCQDMCAIFBXByaWNlBQNuaWwFA25pbAMJAAACBQlpbnZBcHBlbmQFCWludkFwcGVuZAQEc2F2ZQkA/AcEBQ5oaXN0b3J5QWRkcmVzcwINc2F2ZVRvSGlzdG9yeQkAzAgCBQdldmVudElkCQDMCAIFB2FkZHJlc3MFA25pbAUDbmlsAwkAAAIFBHNhdmUFBHNhdmUEDGN1cnJlbnRUb3RhbAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQERZ2V0VG90YWxBbW91bnRLZXkBBQdldmVudElkAAAJAMwIAgkBDEludGVnZXJFbnRyeQIJARFnZXRUb3RhbEFtb3VudEtleQEFB2V2ZW50SWQJAGQCBQxjdXJyZW50VG90YWwFDXBhdW1lbnRBbW91bnQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECC0JhZCBwYXltZW50CQACAQIPWW91IGNhbmB0IGRvIGl0AWkBDmFwcGVuZEJldHNMaXN0AwdldmVudElkCmFkZHJlc3NTdHIFcHJpY2UDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhBvbmx5IG1haW4gY2FuIGRvAwkBCWlzRGVmaW5lZAEJAJ0IAgUEdGhpcwkBEmdldFByaWNlQWRkcmVzc0tleQIFB2V2ZW50SWQFCmFkZHJlc3NTdHIJAAIBAiNiZXR0aW5nIGZyb20gdGhpcyBhZGRyZXNzIGlzIGV4aXN0cwQOY291bnRCZXRzUHJpY2UJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBEWdldFByaWNlQmV0c0NvdW50AgUHZXZlbnRJZAUFcHJpY2UAAAMJAGcCBQ5jb3VudEJldHNQcmljZQUObWF4QmV0c09uUHJpY2UJAAIBAgx0byBtYW55IGJldHMECWxpc3RJbmRleAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEWZ2V0UHJpY2VzTGlzdHNDb3VudEtleQEFB2V2ZW50SWQAAQQNY3VycmVudFByaWNlcwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQERZ2V0UHJpY2VzTGlzdE5LZXkCBQdldmVudElkBQlsaXN0SW5kZXgCAAQRY3VycmVudFByaWNlc0xpc3QJALwJAgUNY3VycmVudFByaWNlcwUJc2VwYXJhdG9yBAhsaXN0U2l6ZQkAkAMBBRFjdXJyZW50UHJpY2VzTGlzdAQJbmV3UHJpY2VzAwkAAAIFDmNvdW50QmV0c1ByaWNlAAADCQBmAgBkBQhsaXN0U2l6ZQMJAAACCQCxAgEFDWN1cnJlbnRQcmljZXMAAAkApAMBBQVwcmljZQkArAICCQCsAgIFDWN1cnJlbnRQcmljZXMFCXNlcGFyYXRvcgkApAMBBQVwcmljZQkApAMBBQVwcmljZQUNY3VycmVudFByaWNlcwQMbmV3TGlzdEluZGV4AwMJAGcCBQhsaXN0U2l6ZQBkCQAAAgUOY291bnRCZXRzUHJpY2UAAAcFCWxpc3RJbmRleAkAZAIFCWxpc3RJbmRleAABBA5uZXdHcm91cHNDb3VudAkAZAIJAGkCCQBlAgUMbmV3TGlzdEluZGV4AAEACgABCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQESZ2V0UHJpY2VBZGRyZXNzS2V5AgUHZXZlbnRJZAUKYWRkcmVzc1N0cgUFcHJpY2UJAMwIAgkBDEludGVnZXJFbnRyeQIJARZnZXRQcmljZXNMaXN0c0NvdW50S2V5AQUHZXZlbnRJZAUMbmV3TGlzdEluZGV4CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEXZ2V0UHJpY2VzR3JvdXBzQ291bnRLZXkBBQdldmVudElkBQ5uZXdHcm91cHNDb3VudAkAzAgCCQELU3RyaW5nRW50cnkCCQERZ2V0UHJpY2VzTGlzdE5LZXkCBQdldmVudElkBQxuZXdMaXN0SW5kZXgFCW5ld1ByaWNlcwUDbmlsAWkBCXJlc2V0TGlzdAADCQEBIQEJAQdpc0FkbWluAQgFAWkGY2FsbGVyCQACAQIRb25seSBhZG1pbiBjYW4gZG8JAMwIAgkBC1N0cmluZ0VudHJ5AgUNZmlyc3RFdmVudEtleQUJdW5kZWZpbmVkCQDMCAIJAQtTdHJpbmdFbnRyeQIFDGxhc3RFdmVudEtleQUJdW5kZWZpbmVkCQDMCAIJAQtTdHJpbmdFbnRyeQIFE2Zpc3J0QWN0aXZlRXZlbnRLZXkFCXVuZGVmaW5lZAkAzAgCCQELU3RyaW5nRW50cnkCBRJsYXN0QWN0aXZlRXZlbnRLZXkFCXVuZGVmaW5lZAkAzAgCCQELU3RyaW5nRW50cnkCBRVmaXNydEZpbmlzaGVkRXZlbnRLZXkFCXVuZGVmaW5lZAkAzAgCCQELU3RyaW5nRW50cnkCBRRsYXN0RmluaXNoZWRFdmVudEtleQUJdW5kZWZpbmVkBQNuaWwBaQEMaW5zZXJ0VG9MaXN0AgdldmVudElkCGlzQWN0aXZlAwkBAiE9AgUEdGhpcwgFAWkGY2FsbGVyCQACAQIQb25seSBtYWluIGNhbiBkbwQHbGFzdEtleQMFCGlzQWN0aXZlBRJsYXN0QWN0aXZlRXZlbnRLZXkFFGxhc3RGaW5pc2hlZEV2ZW50S2V5BAhmaXJzdEtleQMFCGlzQWN0aXZlBRNmaXNydEFjdGl2ZUV2ZW50S2V5BRVmaXNydEZpbmlzaGVkRXZlbnRLZXkECmZpcnN0RXZlbnQJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwUIZmlyc3RLZXkFCXVuZGVmaW5lZAQJbGFzdEV2ZW50CQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFB2xhc3RLZXkFCXVuZGVmaW5lZAQQbmV3TGFzdE9yUHJldktleQMJAAACBQlsYXN0RXZlbnQFCXVuZGVmaW5lZAUHbGFzdEtleQkBD2dldFByZXZFdmVudEtleQEFCmZpcnN0RXZlbnQJAMwIAgkBC1N0cmluZ0VudHJ5AgUIZmlyc3RLZXkFB2V2ZW50SWQJAMwIAgkBC1N0cmluZ0VudHJ5AgUQbmV3TGFzdE9yUHJldktleQUHZXZlbnRJZAkAzAgCCQELU3RyaW5nRW50cnkCCQEPZ2V0TmV4dEV2ZW50S2V5AQUHZXZlbnRJZAUKZmlyc3RFdmVudAUDbmlsAWkBDmRlbGV0ZUZyb21MaXN0AgdldmVudElkCGlzQWN0aXZlAwkBAiE9AgUEdGhpcwgFAWkGY2FsbGVyCQACAQIQb25seSBtYWluIGNhbiBkbwQHbGFzdEtleQMFCGlzQWN0aXZlBRJsYXN0QWN0aXZlRXZlbnRLZXkFFGxhc3RGaW5pc2hlZEV2ZW50S2V5BAhmaXJzdEtleQMFCGlzQWN0aXZlBRNmaXNydEFjdGl2ZUV2ZW50S2V5BRVmaXNydEZpbmlzaGVkRXZlbnRLZXkECmZpcnN0RXZlbnQJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwUIZmlyc3RLZXkFCXVuZGVmaW5lZAQJbGFzdEV2ZW50CQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFB2xhc3RLZXkFCXVuZGVmaW5lZAQNcHJldkV2ZW50VGVtcAkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQEPZ2V0UHJldkV2ZW50S2V5AQUHZXZlbnRJZAUJdW5kZWZpbmVkBA1uZXh0RXZlbnRUZW1wCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAQ9nZXROZXh0RXZlbnRLZXkBBQdldmVudElkBQl1bmRlZmluZWQECXByZXZFdmVudAMJAAACBQdldmVudElkBQpmaXJzdEV2ZW50BQl1bmRlZmluZWQFDXByZXZFdmVudFRlbXAECW5leHRFdmVudAMJAAACBQdldmVudElkBQlsYXN0RXZlbnQFCXVuZGVmaW5lZAUNbmV4dEV2ZW50VGVtcAMDCQAAAgUJcHJldkV2ZW50BQl1bmRlZmluZWQJAAACBQluZXh0RXZlbnQFCXVuZGVmaW5lZAcJAMwIAgkBC1N0cmluZ0VudHJ5AgUIZmlyc3RLZXkFCXVuZGVmaW5lZAkAzAgCCQELU3RyaW5nRW50cnkCBQdsYXN0S2V5BQl1bmRlZmluZWQFA25pbAMDCQECIT0CBQlwcmV2RXZlbnQFCXVuZGVmaW5lZAkBAiE9AgUJbmV4dEV2ZW50BQl1bmRlZmluZWQHCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ9nZXRQcmV2RXZlbnRLZXkBBQluZXh0RXZlbnQFCXByZXZFdmVudAkAzAgCCQELU3RyaW5nRW50cnkCCQEPZ2V0TmV4dEV2ZW50S2V5AQUJcHJldkV2ZW50BQluZXh0RXZlbnQFA25pbAMJAQIhPQIFCXByZXZFdmVudAUJdW5kZWZpbmVkCQDMCAIJAQtTdHJpbmdFbnRyeQIFB2xhc3RLZXkFCXByZXZFdmVudAkAzAgCCQELU3RyaW5nRW50cnkCCQEPZ2V0TmV4dEV2ZW50S2V5AQUJcHJldkV2ZW50BQl1bmRlZmluZWQFA25pbAkAzAgCCQELU3RyaW5nRW50cnkCBQhmaXJzdEtleQUJbmV4dEV2ZW50CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ9nZXRQcmV2RXZlbnRLZXkBBQluZXh0RXZlbnQFCXVuZGVmaW5lZAUDbmlsAWkBC2NvbmNhdExpc3RzAAMJAQEhAQkBB2lzQWRtaW4BCAUBaQZjYWxsZXIJAAIBAhFvbmx5IGFkbWluIGNhbiBkbwQQZmlyc3RBY3RpdmVFdmVudAkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBRNmaXNydEFjdGl2ZUV2ZW50S2V5BQl1bmRlZmluZWQED2xhc3RBY3RpdmVFdmVudAkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBRJsYXN0QWN0aXZlRXZlbnRLZXkFCXVuZGVmaW5lZAQSZmlyc3RGaW5pc2hlZEV2ZW50CQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFFWZpc3J0RmluaXNoZWRFdmVudEtleQUJdW5kZWZpbmVkBBFsYXN0RmluaXNoZWRFdmVudAkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBRRsYXN0RmluaXNoZWRFdmVudEtleQUJdW5kZWZpbmVkBApmaXJzdEV2ZW50AwkBAiE9AgUQZmlyc3RBY3RpdmVFdmVudAUJdW5kZWZpbmVkBRBmaXJzdEFjdGl2ZUV2ZW50BRJmaXJzdEZpbmlzaGVkRXZlbnQECWxhc3RFdmVudAMJAQIhPQIFEWxhc3RGaW5pc2hlZEV2ZW50BQl1bmRlZmluZWQFEWxhc3RGaW5pc2hlZEV2ZW50BQ9sYXN0QWN0aXZlRXZlbnQDAwkBAiE9AgUSZmlyc3RGaW5pc2hlZEV2ZW50BQl1bmRlZmluZWQJAQIhPQIFD2xhc3RBY3RpdmVFdmVudAUJdW5kZWZpbmVkBwkAzAgCCQELU3RyaW5nRW50cnkCBQ1maXJzdEV2ZW50S2V5BQpmaXJzdEV2ZW50CQDMCAIJAQtTdHJpbmdFbnRyeQIFDGxhc3RFdmVudEtleQUJbGFzdEV2ZW50CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ9nZXROZXh0RXZlbnRLZXkBBQ9sYXN0QWN0aXZlRXZlbnQFEmZpcnN0RmluaXNoZWRFdmVudAkAzAgCCQELU3RyaW5nRW50cnkCCQEPZ2V0UHJldkV2ZW50S2V5AQUSZmlyc3RGaW5pc2hlZEV2ZW50BQ9sYXN0QWN0aXZlRXZlbnQFA25pbAkAzAgCCQELU3RyaW5nRW50cnkCBQ1maXJzdEV2ZW50S2V5BQpmaXJzdEV2ZW50CQDMCAIJAQtTdHJpbmdFbnRyeQIFDGxhc3RFdmVudEtleQUJbGFzdEV2ZW50BQNuaWwAg8q2xA==", "height": 2283634, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: none Next: GVYMmqts5DKYxqJvC6jo5JagdRyYQ98DLn4rbEKcjaNM Full:
OldNewDifferences
1-# no script
1+{-# STDLIB_VERSION 6 #-}
2+{-# SCRIPT_TYPE ACCOUNT #-}
3+{-# CONTENT_TYPE DAPP #-}
4+let undefined = "undefined"
5+
6+let separator = ";"
7+
8+let configAddressKey = "config"
9+
10+let collectorAddressKey = "collector_address"
11+
12+let historyAddressKey = "history_address"
13+
14+let paymakerAddressKey = "paymaker_address"
15+
16+let adminsKey = "admins"
17+
18+let configAddress = addressFromStringValue(getStringValue(this, configAddressKey))
19+
20+let collectorAddress = addressFromStringValue(getStringValue(configAddress, collectorAddressKey))
21+
22+let historyAddress = addressFromStringValue(getStringValue(configAddress, historyAddressKey))
23+
24+let paymakerAddress = addressFromStringValue(getStringValue(configAddress, paymakerAddressKey))
25+
26+func isAdmin (caller) = {
27+ let admRow = valueOrElse(getString(configAddress, adminsKey), "")
28+ if (if ((caller == this))
29+ then true
30+ else contains(admRow, toString(caller)))
31+ then true
32+ else false
33+ }
34+
35+
36+func getCheckerKey (checker) = ("checker_" + checker)
37+
38+
39+func isChecker (checker) = {
40+ let isExists = isDefined(getBoolean(configAddress, getCheckerKey(checker)))
41+ isExists
42+ }
43+
44+
45+let USDN = base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p'
46+
47+let minAmount = 10000000
48+
49+let feeNumerator = 5
50+
51+let feeDenominator = 100
52+
53+let maxBetsOnPrice = 3
54+
55+let firstEventKey = "first_event"
56+
57+let lastEventKey = "last_event"
58+
59+let fisrtFinishedEventKey = "first_finished_event"
60+
61+let lastFinishedEventKey = "last_finished_event"
62+
63+let fisrtActiveEventKey = "first_active_event"
64+
65+let lastActiveEventKey = "last_active_event"
66+
67+func getStartBlockKey (eventId) = (eventId + "_start_block")
68+
69+
70+func getEndBlockKey (eventId) = (eventId + "_end_block")
71+
72+
73+func getFinishAtKey (eventId) = (eventId + "_finish_at_block")
74+
75+
76+func getIdKey (eventId) = (eventId + "_id")
77+
78+
79+func getStatusKey (eventId) = (eventId + "_status")
80+
81+
82+func getDescKey (eventId) = (eventId + "_description")
83+
84+
85+func getPrevEventKey (eventId) = (eventId + "_prev_event")
86+
87+
88+func getNextEventKey (eventId) = (eventId + "_next_event")
89+
90+
91+func getAssetIdKey (eventId) = (eventId + "_asset_id")
92+
93+
94+func getTotalAmountKey (eventId) = (eventId + "_total_amount")
95+
96+
97+func getPricesGroupsCountKey (eventId) = (eventId + "_prices_group_count")
98+
99+
100+func getPricesListsCountKey (eventId) = (eventId + "_prices_list_count")
101+
102+
103+func getPricesListNKey (eventId,n) = ((eventId + "_prices_list_") + toString(n))
104+
105+
106+func getPriceBetsCount (eventId,price) = (((eventId + "_") + toString(price)) + "_bets_count")
107+
108+
109+func getPriceAddressKey (eventId,address) = (((eventId + "_") + address) + "_price")
110+
111+
112+func asInt (v) = match v {
113+ case x: Int =>
114+ x
115+ case t =>
116+ throw("#err")
117+}
118+
119+
120+func asString (v) = match v {
121+ case x: String =>
122+ x
123+ case _ =>
124+ throw("#err")
125+}
126+
127+
128+func getAssetInfo (assetStr) = {
129+ let assetId = fromBase58String(assetStr)
130+ let x = match assetInfo(assetId) {
131+ case asset: Asset =>
132+ $Tuple2(assetStr, asset.decimals)
133+ case _ =>
134+ $Tuple2("WAVES", 0)
135+ }
136+ x
137+ }
138+
139+
140+func getStatus (eventId) = {
141+ let status = getStringValue(this, getStatusKey(eventId))
142+ if (if (if ((status == "finished"))
143+ then true
144+ else (status == "#"))
145+ then true
146+ else (status == "ended"))
147+ then status
148+ else {
149+ let finishAt = getIntegerValue(this, getFinishAtKey(eventId))
150+ let startBlock = getIntegerValue(this, getStartBlockKey(eventId))
151+ let endBlock = getIntegerValue(this, getEndBlockKey(eventId))
152+ if ((startBlock > height))
153+ then "awaiting"
154+ else if (if ((height >= startBlock))
155+ then (endBlock >= height)
156+ else false)
157+ then "active"
158+ else if (if ((height > endBlock))
159+ then (finishAt >= height)
160+ else false)
161+ then "confirmation"
162+ else if ((height > finishAt))
163+ then "finished"
164+ else throw("unknown status")
165+ }
166+ }
167+
168+
169+func registerEvent (txid,desc,startBlock,endBlock,finishAt,assetStr) = {
170+ let eventId = txid
171+ let insert = invoke(this, "insertToList", [eventId, true], nil)
172+ if ((insert == insert))
173+ then {
174+ let concat = invoke(this, "concatLists", nil, nil)
175+ if ((concat == concat))
176+ then {
177+ let $t048674920 = getAssetInfo(assetStr)
178+ let assetId = $t048674920._1
179+ let assetDecimals = $t048674920._2
180+[IntegerEntry(getStartBlockKey(eventId), startBlock), IntegerEntry(getEndBlockKey(eventId), endBlock), IntegerEntry(getFinishAtKey(eventId), finishAt), StringEntry(getDescKey(eventId), desc), StringEntry(getStatusKey(eventId), "new"), StringEntry(getIdKey(eventId), eventId), StringEntry(getAssetIdKey(eventId), assetId)]
181+ }
182+ else throw("Strict value is not equal to itself.")
183+ }
184+ else throw("Strict value is not equal to itself.")
185+ }
186+
187+
188+@Callable(i)
189+func init (config) = if ((i.caller != this))
190+ then throw("only main can do")
191+ else {
192+ let isExists = isDefined(getString(this, configAddressKey))
193+ if (!(isExists))
194+ then [StringEntry(configAddressKey, config)]
195+ else throw("already inited")
196+ }
197+
198+
199+
200+@Callable(i)
201+func appendEventer (desc) = if (!(isAdmin(i.caller)))
202+ then throw("only admin can do")
203+ else {
204+ let inv = invoke(configAddress, "setEventer", [toString(this), desc], nil)
205+ if ((inv == inv))
206+ then nil
207+ else throw("Strict value is not equal to itself.")
208+ }
209+
210+
211+
212+@Callable(i)
213+func fullRegisterEvent (desc,startBlock,duration,assetStr) = {
214+ let newStartBlock = if ((startBlock == 0))
215+ then height
216+ else startBlock
217+ let endBlock = (newStartBlock + duration)
218+ let finishAt = (endBlock + 1440)
219+ if (!(isAdmin(i.caller)))
220+ then throw("only admin can do")
221+ else {
222+ let txid = toBase58String(i.transactionId)
223+ registerEvent(txid, desc, newStartBlock, endBlock, finishAt, assetStr)
224+ }
225+ }
226+
227+
228+
229+@Callable(i)
230+func choice (eventId,price,address) = {
231+ let status = getStatus(eventId)
232+ if ((status == "active"))
233+ then if (if ((size(i.payments) == 1))
234+ then (i.payments[0].assetId == USDN)
235+ else false)
236+ then {
237+ let paumentAmount = i.payments[0].amount
238+ if ((minAmount > paumentAmount))
239+ then throw("amount is less than allowed")
240+ else {
241+ let invAppend = invoke(this, "appendBetsList", [eventId, address, price], nil)
242+ if ((invAppend == invAppend))
243+ then {
244+ let save = invoke(historyAddress, "saveToHistory", [eventId, address], nil)
245+ if ((save == save))
246+ then {
247+ let currentTotal = valueOrElse(getInteger(this, getTotalAmountKey(eventId)), 0)
248+[IntegerEntry(getTotalAmountKey(eventId), (currentTotal + paumentAmount))]
249+ }
250+ else throw("Strict value is not equal to itself.")
251+ }
252+ else throw("Strict value is not equal to itself.")
253+ }
254+ }
255+ else throw("Bad payment")
256+ else throw("You can`t do it")
257+ }
258+
259+
260+
261+@Callable(i)
262+func appendBetsList (eventId,addressStr,price) = if ((i.caller != this))
263+ then throw("only main can do")
264+ else if (isDefined(getString(this, getPriceAddressKey(eventId, addressStr))))
265+ then throw("betting from this address is exists")
266+ else {
267+ let countBetsPrice = valueOrElse(getInteger(this, getPriceBetsCount(eventId, price)), 0)
268+ if ((countBetsPrice >= maxBetsOnPrice))
269+ then throw("to many bets")
270+ else {
271+ let listIndex = valueOrElse(getInteger(this, getPricesListsCountKey(eventId)), 1)
272+ let currentPrices = valueOrElse(getString(this, getPricesListNKey(eventId, listIndex)), "")
273+ let currentPricesList = split_4C(currentPrices, separator)
274+ let listSize = size(currentPricesList)
275+ let newPrices = if ((countBetsPrice == 0))
276+ then if ((100 > listSize))
277+ then if ((size(currentPrices) == 0))
278+ then toString(price)
279+ else ((currentPrices + separator) + toString(price))
280+ else toString(price)
281+ else currentPrices
282+ let newListIndex = if (if ((listSize >= 100))
283+ then (countBetsPrice == 0)
284+ else false)
285+ then listIndex
286+ else (listIndex + 1)
287+ let newGroupsCount = (((newListIndex - 1) / 10) + 1)
288+[IntegerEntry(getPriceAddressKey(eventId, addressStr), price), IntegerEntry(getPricesListsCountKey(eventId), newListIndex), IntegerEntry(getPricesGroupsCountKey(eventId), newGroupsCount), StringEntry(getPricesListNKey(eventId, newListIndex), newPrices)]
289+ }
290+ }
291+
292+
293+
294+@Callable(i)
295+func resetList () = if (!(isAdmin(i.caller)))
296+ then throw("only admin can do")
297+ else [StringEntry(firstEventKey, undefined), StringEntry(lastEventKey, undefined), StringEntry(fisrtActiveEventKey, undefined), StringEntry(lastActiveEventKey, undefined), StringEntry(fisrtFinishedEventKey, undefined), StringEntry(lastFinishedEventKey, undefined)]
298+
299+
300+
301+@Callable(i)
302+func insertToList (eventId,isActive) = if ((this != i.caller))
303+ then throw("only main can do")
304+ else {
305+ let lastKey = if (isActive)
306+ then lastActiveEventKey
307+ else lastFinishedEventKey
308+ let firstKey = if (isActive)
309+ then fisrtActiveEventKey
310+ else fisrtFinishedEventKey
311+ let firstEvent = valueOrElse(getString(this, firstKey), undefined)
312+ let lastEvent = valueOrElse(getString(this, lastKey), undefined)
313+ let newLastOrPrevKey = if ((lastEvent == undefined))
314+ then lastKey
315+ else getPrevEventKey(firstEvent)
316+[StringEntry(firstKey, eventId), StringEntry(newLastOrPrevKey, eventId), StringEntry(getNextEventKey(eventId), firstEvent)]
317+ }
318+
319+
320+
321+@Callable(i)
322+func deleteFromList (eventId,isActive) = if ((this != i.caller))
323+ then throw("only main can do")
324+ else {
325+ let lastKey = if (isActive)
326+ then lastActiveEventKey
327+ else lastFinishedEventKey
328+ let firstKey = if (isActive)
329+ then fisrtActiveEventKey
330+ else fisrtFinishedEventKey
331+ let firstEvent = valueOrElse(getString(this, firstKey), undefined)
332+ let lastEvent = valueOrElse(getString(this, lastKey), undefined)
333+ let prevEventTemp = valueOrElse(getString(this, getPrevEventKey(eventId)), undefined)
334+ let nextEventTemp = valueOrElse(getString(this, getNextEventKey(eventId)), undefined)
335+ let prevEvent = if ((eventId == firstEvent))
336+ then undefined
337+ else prevEventTemp
338+ let nextEvent = if ((eventId == lastEvent))
339+ then undefined
340+ else nextEventTemp
341+ if (if ((prevEvent == undefined))
342+ then (nextEvent == undefined)
343+ else false)
344+ then [StringEntry(firstKey, undefined), StringEntry(lastKey, undefined)]
345+ else if (if ((prevEvent != undefined))
346+ then (nextEvent != undefined)
347+ else false)
348+ then [StringEntry(getPrevEventKey(nextEvent), prevEvent), StringEntry(getNextEventKey(prevEvent), nextEvent)]
349+ else if ((prevEvent != undefined))
350+ then [StringEntry(lastKey, prevEvent), StringEntry(getNextEventKey(prevEvent), undefined)]
351+ else [StringEntry(firstKey, nextEvent), StringEntry(getPrevEventKey(nextEvent), undefined)]
352+ }
353+
354+
355+
356+@Callable(i)
357+func concatLists () = if (!(isAdmin(i.caller)))
358+ then throw("only admin can do")
359+ else {
360+ let firstActiveEvent = valueOrElse(getString(this, fisrtActiveEventKey), undefined)
361+ let lastActiveEvent = valueOrElse(getString(this, lastActiveEventKey), undefined)
362+ let firstFinishedEvent = valueOrElse(getString(this, fisrtFinishedEventKey), undefined)
363+ let lastFinishedEvent = valueOrElse(getString(this, lastFinishedEventKey), undefined)
364+ let firstEvent = if ((firstActiveEvent != undefined))
365+ then firstActiveEvent
366+ else firstFinishedEvent
367+ let lastEvent = if ((lastFinishedEvent != undefined))
368+ then lastFinishedEvent
369+ else lastActiveEvent
370+ if (if ((firstFinishedEvent != undefined))
371+ then (lastActiveEvent != undefined)
372+ else false)
373+ then [StringEntry(firstEventKey, firstEvent), StringEntry(lastEventKey, lastEvent), StringEntry(getNextEventKey(lastActiveEvent), firstFinishedEvent), StringEntry(getPrevEventKey(firstFinishedEvent), lastActiveEvent)]
374+ else [StringEntry(firstEventKey, firstEvent), StringEntry(lastEventKey, lastEvent)]
375+ }
376+
377+

github/deemru/w8io/169f3d6 
35.35 ms