tx · HSuraZZehPmJxi7MVzuyvyJvuzjnteD67u56tSC5kFR3

3MvJDKBFzztnd7KCU78zgJ8qUuzVux4c9yw:  -0.01000000 Waves

2022.10.23 14:32 [2284987] smart account 3MvJDKBFzztnd7KCU78zgJ8qUuzVux4c9yw > SELF 0.00000000 Waves

{ "type": 13, "id": "HSuraZZehPmJxi7MVzuyvyJvuzjnteD67u56tSC5kFR3", "fee": 1000000, "feeAssetId": null, "timestamp": 1666524826282, "version": 2, "chainId": 84, "sender": "3MvJDKBFzztnd7KCU78zgJ8qUuzVux4c9yw", "senderPublicKey": "9gVuyFNzke49pnadJxJ312ZWhYudDhdcqP5hsm5pGQw6", "proofs": [ "5WNRS4pJieqw3a55aurJDLNdCkhwwu1dAf4dc7zMNFCiP21fssceWHxEsMGT1hLZgPCFxZxLWuXtiLyqcNfDtFs8" ], "script": "base64:BgIyCAISAwoBCBIDCgEIEgYKBAgBAQgSBQoDCAEIEgUKAwgIARIAEgQKAggEEgQKAggEEgAtAAl1bmRlZmluZWQCCXVuZGVmaW5lZAAJc2VwYXJhdG9yAgE7ABBjb25maWdBZGRyZXNzS2V5AgZjb25maWcAE2NvbGxlY3RvckFkZHJlc3NLZXkCEWNvbGxlY3Rvcl9hZGRyZXNzABFoaXN0b3J5QWRkcmVzc0tleQIPaGlzdG9yeV9hZGRyZXNzABJwYXltYWtlckFkZHJlc3NLZXkCEHBheW1ha2VyX2FkZHJlc3MACWFkbWluc0tleQIGYWRtaW5zAA1jb25maWdBZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA2MikBCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzBRBjb25maWdBZGRyZXNzS2V5ABBjb2xsZWN0b3JBZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA2MikBCQERQGV4dHJOYXRpdmUoMTA1MykCBQ1jb25maWdBZGRyZXNzBRNjb2xsZWN0b3JBZGRyZXNzS2V5AA5oaXN0b3J5QWRkcmVzcwkBEUBleHRyTmF0aXZlKDEwNjIpAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUNY29uZmlnQWRkcmVzcwURaGlzdG9yeUFkZHJlc3NLZXkAD3BheW1ha2VyQWRkcmVzcwkBEUBleHRyTmF0aXZlKDEwNjIpAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUNY29uZmlnQWRkcmVzcwUScGF5bWFrZXJBZGRyZXNzS2V5AQdpc0FkbWluAQZjYWxsZXIEBmFkbVJvdwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ1jb25maWdBZGRyZXNzBQlhZG1pbnNLZXkCAAMDCQAAAgUGY2FsbGVyBQR0aGlzBgkBCGNvbnRhaW5zAgUGYWRtUm93CQClCAEFBmNhbGxlcgYHAQ1nZXRDaGVja2VyS2V5AQdjaGVja2VyCQCsAgICCGNoZWNrZXJfBQdjaGVja2VyAQlpc0NoZWNrZXIBB2NoZWNrZXIECGlzRXhpc3RzCQEJaXNEZWZpbmVkAQkAmwgCBQ1jb25maWdBZGRyZXNzCQENZ2V0Q2hlY2tlcktleQEFB2NoZWNrZXIFCGlzRXhpc3RzAARVU0ROASAYZnRB0PLZIchHiUNJCnGtXhPXO6NBZoIwBSXE8y+z0AAJbWluQW1vdW50AICt4gQADGZlZU51bWVyYXRvcgAFAA5mZWVEZW5vbWluYXRvcgBkAA5tYXhCZXRzT25QcmljZQADAA1maXJzdEV2ZW50S2V5AgtmaXJzdF9ldmVudAAMbGFzdEV2ZW50S2V5AgpsYXN0X2V2ZW50ABVmaXNydEZpbmlzaGVkRXZlbnRLZXkCFGZpcnN0X2ZpbmlzaGVkX2V2ZW50ABRsYXN0RmluaXNoZWRFdmVudEtleQITbGFzdF9maW5pc2hlZF9ldmVudAATZmlzcnRBY3RpdmVFdmVudEtleQISZmlyc3RfYWN0aXZlX2V2ZW50ABJsYXN0QWN0aXZlRXZlbnRLZXkCEWxhc3RfYWN0aXZlX2V2ZW50ARBnZXRTdGFydEJsb2NrS2V5AQdldmVudElkCQCsAgIFB2V2ZW50SWQCDF9zdGFydF9ibG9jawEOZ2V0RW5kQmxvY2tLZXkBB2V2ZW50SWQJAKwCAgUHZXZlbnRJZAIKX2VuZF9ibG9jawEOZ2V0RmluaXNoQXRLZXkBB2V2ZW50SWQJAKwCAgUHZXZlbnRJZAIQX2ZpbmlzaF9hdF9ibG9jawEIZ2V0SWRLZXkBB2V2ZW50SWQJAKwCAgUHZXZlbnRJZAIDX2lkAQxnZXRTdGF0dXNLZXkBB2V2ZW50SWQJAKwCAgUHZXZlbnRJZAIHX3N0YXR1cwEKZ2V0RGVzY0tleQEHZXZlbnRJZAkArAICBQdldmVudElkAgxfZGVzY3JpcHRpb24BD2dldFByZXZFdmVudEtleQEHZXZlbnRJZAkArAICBQdldmVudElkAgtfcHJldl9ldmVudAEPZ2V0TmV4dEV2ZW50S2V5AQdldmVudElkCQCsAgIFB2V2ZW50SWQCC19uZXh0X2V2ZW50AQ1nZXRBc3NldElkS2V5AQdldmVudElkCQCsAgIFB2V2ZW50SWQCCV9hc3NldF9pZAERZ2V0VG90YWxBbW91bnRLZXkBB2V2ZW50SWQJAKwCAgUHZXZlbnRJZAINX3RvdGFsX2Ftb3VudAEXZ2V0UHJpY2VzR3JvdXBzQ291bnRLZXkBB2V2ZW50SWQJAKwCAgUHZXZlbnRJZAITX3ByaWNlc19ncm91cF9jb3VudAEWZ2V0UHJpY2VzTGlzdHNDb3VudEtleQEHZXZlbnRJZAkArAICBQdldmVudElkAhJfcHJpY2VzX2xpc3RfY291bnQBEWdldFByaWNlc0xpc3ROS2V5AgdldmVudElkAW4JAKwCAgkArAICBQdldmVudElkAg1fcHJpY2VzX2xpc3RfCQCkAwEFAW4BEWdldFByaWNlQmV0c0NvdW50AgdldmVudElkBXByaWNlCQCsAgIJAKwCAgkArAICBQdldmVudElkAgFfCQCkAwEFBXByaWNlAgtfYmV0c19jb3VudAESZ2V0UHJpY2VBZGRyZXNzS2V5AgdldmVudElkB2FkZHJlc3MJAKwCAgkArAICCQCsAgIFB2V2ZW50SWQCAV8FB2FkZHJlc3MCBl9wcmljZQEFYXNJbnQBAXYEByRtYXRjaDAFAXYDCQABAgUHJG1hdGNoMAIDSW50BAF4BQckbWF0Y2gwBQF4BAF0BQckbWF0Y2gwCQACAQIEI2VycgEIYXNTdHJpbmcBAXYEByRtYXRjaDAFAXYDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAF4BQckbWF0Y2gwBQF4CQACAQIEI2VycgEMZ2V0QXNzZXRJbmZvAQhhc3NldFN0cgQHYXNzZXRJZAkA2QQBBQhhc3NldFN0cgQBeAQHJG1hdGNoMAkA7AcBBQdhc3NldElkAwkAAQIFByRtYXRjaDACBUFzc2V0BAVhc3NldAUHJG1hdGNoMAkAlAoCBQhhc3NldFN0cggFBWFzc2V0CGRlY2ltYWxzCQCUCgICBVdBVkVTAAAFAXgBCWdldFN0YXR1cwEHZXZlbnRJZAQGc3RhdHVzCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzCQEMZ2V0U3RhdHVzS2V5AQUHZXZlbnRJZAMDAwkAAAIFBnN0YXR1cwIIZmluaXNoZWQGCQAAAgUGc3RhdHVzAgEjBgkAAAIFBnN0YXR1cwIFZW5kZWQFBnN0YXR1cwQIZmluaXNoQXQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAQ5nZXRGaW5pc2hBdEtleQEFB2V2ZW50SWQECnN0YXJ0QmxvY2sJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJARBnZXRTdGFydEJsb2NrS2V5AQUHZXZlbnRJZAQIZW5kQmxvY2sJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAQ5nZXRFbmRCbG9ja0tleQEFB2V2ZW50SWQDCQBmAgUKc3RhcnRCbG9jawUGaGVpZ2h0Aghhd2FpdGluZwMDCQBnAgUGaGVpZ2h0BQpzdGFydEJsb2NrCQBnAgUIZW5kQmxvY2sFBmhlaWdodAcCBmFjdGl2ZQMDCQBmAgUGaGVpZ2h0BQhlbmRCbG9jawkAZwIFCGZpbmlzaEF0BQZoZWlnaHQHAgxjb25maXJtYXRpb24DCQBmAgUGaGVpZ2h0BQhmaW5pc2hBdAIIZmluaXNoZWQJAAIBAg51bmtub3duIHN0YXR1cwENcmVnaXN0ZXJFdmVudAYEdHhpZARkZXNjCnN0YXJ0QmxvY2sIZW5kQmxvY2sIZmluaXNoQXQIYXNzZXRTdHIEB2V2ZW50SWQFBHR4aWQEBmluc2VydAkA/AcEBQR0aGlzAgxpbnNlcnRUb0xpc3QJAMwIAgUHZXZlbnRJZAkAzAgCBgUDbmlsBQNuaWwDCQAAAgUGaW5zZXJ0BQZpbnNlcnQEBmNvbmNhdAkA/AcEBQR0aGlzAgtjb25jYXRMaXN0cwUDbmlsBQNuaWwDCQAAAgUGY29uY2F0BQZjb25jYXQECyR0MDQ4Njc0OTIwCQEMZ2V0QXNzZXRJbmZvAQUIYXNzZXRTdHIEB2Fzc2V0SWQIBQskdDA0ODY3NDkyMAJfMQQNYXNzZXREZWNpbWFscwgFCyR0MDQ4Njc0OTIwAl8yCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEQZ2V0U3RhcnRCbG9ja0tleQEFB2V2ZW50SWQFCnN0YXJ0QmxvY2sJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ5nZXRFbmRCbG9ja0tleQEFB2V2ZW50SWQFCGVuZEJsb2NrCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEOZ2V0RmluaXNoQXRLZXkBBQdldmVudElkBQhmaW5pc2hBdAkAzAgCCQELU3RyaW5nRW50cnkCCQEKZ2V0RGVzY0tleQEFB2V2ZW50SWQFBGRlc2MJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDGdldFN0YXR1c0tleQEFB2V2ZW50SWQCA25ldwkAzAgCCQELU3RyaW5nRW50cnkCCQEIZ2V0SWRLZXkBBQdldmVudElkBQdldmVudElkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ1nZXRBc3NldElkS2V5AQUHZXZlbnRJZAUHYXNzZXRJZAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQFpAQRpbml0AQZjb25maWcDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhBvbmx5IG1haW4gY2FuIGRvBAhpc0V4aXN0cwkBCWlzRGVmaW5lZAEJAJ0IAgUEdGhpcwUQY29uZmlnQWRkcmVzc0tleQMJAQEhAQUIaXNFeGlzdHMJAMwIAgkBC1N0cmluZ0VudHJ5AgUQY29uZmlnQWRkcmVzc0tleQUGY29uZmlnBQNuaWwJAAIBAg5hbHJlYWR5IGluaXRlZAFpAQ1hcHBlbmRFdmVudGVyAQRkZXNjAwkBASEBCQEHaXNBZG1pbgEIBQFpBmNhbGxlcgkAAgECEW9ubHkgYWRtaW4gY2FuIGRvBANpbnYJAPwHBAUNY29uZmlnQWRkcmVzcwIKc2V0RXZlbnRlcgkAzAgCCQClCAEFBHRoaXMJAMwIAgUEZGVzYwUDbmlsBQNuaWwDCQAAAgUDaW52BQNpbnYFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARFmdWxsUmVnaXN0ZXJFdmVudAQEZGVzYwpzdGFydEJsb2NrCGR1cmF0aW9uCGFzc2V0U3RyBA1uZXdTdGFydEJsb2NrAwkAAAIFCnN0YXJ0QmxvY2sAAAUGaGVpZ2h0BQpzdGFydEJsb2NrBAhlbmRCbG9jawkAZAIFDW5ld1N0YXJ0QmxvY2sFCGR1cmF0aW9uBAhmaW5pc2hBdAkAZAIFCGVuZEJsb2NrAKALAwkBASEBCQEHaXNBZG1pbgEIBQFpBmNhbGxlcgkAAgECEW9ubHkgYWRtaW4gY2FuIGRvBAR0eGlkCQDYBAEIBQFpDXRyYW5zYWN0aW9uSWQJAQ1yZWdpc3RlckV2ZW50BgUEdHhpZAUEZGVzYwUNbmV3U3RhcnRCbG9jawUIZW5kQmxvY2sFCGZpbmlzaEF0BQhhc3NldFN0cgFpAQZjaG9pY2UDB2V2ZW50SWQFcHJpY2UHYWRkcmVzcwQGc3RhdHVzCQEJZ2V0U3RhdHVzAQUHZXZlbnRJZAMJAAACBQZzdGF0dXMCBmFjdGl2ZQQMbmVlZGVkQW1vdW50AICt4gQEC25lZWRlZEFzc2V0BQRVU0ROAwMDCQAAAgkAkAMBCAUBaQhwYXltZW50cwABCQAAAggJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBQtuZWVkZWRBc3NldAcJAAACCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAUMbmVlZGVkQW1vdW50BwQJaW52QXBwZW5kCQD8BwQFBHRoaXMCDmFwcGVuZEJldHNMaXN0CQDMCAIFB2V2ZW50SWQJAMwIAgUHYWRkcmVzcwkAzAgCBQVwcmljZQUDbmlsBQNuaWwDCQAAAgUJaW52QXBwZW5kBQlpbnZBcHBlbmQEDGN1cnJlbnRUb3RhbAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQERZ2V0VG90YWxBbW91bnRLZXkBBQdldmVudElkAAAJAMwIAgkBDEludGVnZXJFbnRyeQIJARFnZXRUb3RhbEFtb3VudEtleQEFB2V2ZW50SWQJAGQCBQxjdXJyZW50VG90YWwICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAgtCYWQgcGF5bWVudAkAAgECD1lvdSBjYW5gdCBkbyBpdAFpAQ5hcHBlbmRCZXRzTGlzdAMHZXZlbnRJZAphZGRyZXNzU3RyBXByaWNlAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIQb25seSBtYWluIGNhbiBkbwMJAQlpc0RlZmluZWQBCQCdCAIFBHRoaXMJARJnZXRQcmljZUFkZHJlc3NLZXkCBQdldmVudElkBQphZGRyZXNzU3RyCQACAQIjYmV0dGluZyBmcm9tIHRoaXMgYWRkcmVzcyBpcyBleGlzdHMEDmNvdW50QmV0c1ByaWNlCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJARFnZXRQcmljZUJldHNDb3VudAIFB2V2ZW50SWQFBXByaWNlAAADCQBnAgUOY291bnRCZXRzUHJpY2UFDm1heEJldHNPblByaWNlCQACAQIMdG8gbWFueSBiZXRzBAlsaXN0SW5kZXgJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBFmdldFByaWNlc0xpc3RzQ291bnRLZXkBBQdldmVudElkAAEEDWN1cnJlbnRQcmljZXMJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkBEWdldFByaWNlc0xpc3ROS2V5AgUHZXZlbnRJZAUJbGlzdEluZGV4AgAEEWN1cnJlbnRQcmljZXNMaXN0CQC8CQIFDWN1cnJlbnRQcmljZXMFCXNlcGFyYXRvcgQIbGlzdFNpemUJAJADAQURY3VycmVudFByaWNlc0xpc3QECW5ld1ByaWNlcwMJAAACBQ5jb3VudEJldHNQcmljZQAAAwkAZgIAZAUIbGlzdFNpemUDCQAAAgkAsQIBBQ1jdXJyZW50UHJpY2VzAAAJAKQDAQUFcHJpY2UJAKwCAgkArAICBQ1jdXJyZW50UHJpY2VzBQlzZXBhcmF0b3IJAKQDAQUFcHJpY2UJAKQDAQUFcHJpY2UFDWN1cnJlbnRQcmljZXMEDG5ld0xpc3RJbmRleAMDCQBnAgUIbGlzdFNpemUAZAkAAAIFDmNvdW50QmV0c1ByaWNlAAAHCQBkAgUJbGlzdEluZGV4AAEFCWxpc3RJbmRleAQObmV3R3JvdXBzQ291bnQJAGQCCQBpAgkAZQIFDG5ld0xpc3RJbmRleAABAAoAAQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBEmdldFByaWNlQWRkcmVzc0tleQIFB2V2ZW50SWQFCmFkZHJlc3NTdHIFBXByaWNlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEWZ2V0UHJpY2VzTGlzdHNDb3VudEtleQEFB2V2ZW50SWQFDG5ld0xpc3RJbmRleAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBF2dldFByaWNlc0dyb3Vwc0NvdW50S2V5AQUHZXZlbnRJZAUObmV3R3JvdXBzQ291bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJARFnZXRQcmljZUJldHNDb3VudAIFB2V2ZW50SWQFBXByaWNlCQBkAgUOY291bnRCZXRzUHJpY2UAAQkAzAgCCQELU3RyaW5nRW50cnkCCQERZ2V0UHJpY2VzTGlzdE5LZXkCBQdldmVudElkBQxuZXdMaXN0SW5kZXgFCW5ld1ByaWNlcwUDbmlsAWkBCXJlc2V0TGlzdAADCQEBIQEJAQdpc0FkbWluAQgFAWkGY2FsbGVyCQACAQIRb25seSBhZG1pbiBjYW4gZG8JAMwIAgkBC1N0cmluZ0VudHJ5AgUNZmlyc3RFdmVudEtleQUJdW5kZWZpbmVkCQDMCAIJAQtTdHJpbmdFbnRyeQIFDGxhc3RFdmVudEtleQUJdW5kZWZpbmVkCQDMCAIJAQtTdHJpbmdFbnRyeQIFE2Zpc3J0QWN0aXZlRXZlbnRLZXkFCXVuZGVmaW5lZAkAzAgCCQELU3RyaW5nRW50cnkCBRJsYXN0QWN0aXZlRXZlbnRLZXkFCXVuZGVmaW5lZAkAzAgCCQELU3RyaW5nRW50cnkCBRVmaXNydEZpbmlzaGVkRXZlbnRLZXkFCXVuZGVmaW5lZAkAzAgCCQELU3RyaW5nRW50cnkCBRRsYXN0RmluaXNoZWRFdmVudEtleQUJdW5kZWZpbmVkBQNuaWwBaQEMaW5zZXJ0VG9MaXN0AgdldmVudElkCGlzQWN0aXZlAwkBAiE9AgUEdGhpcwgFAWkGY2FsbGVyCQACAQIQb25seSBtYWluIGNhbiBkbwQHbGFzdEtleQMFCGlzQWN0aXZlBRJsYXN0QWN0aXZlRXZlbnRLZXkFFGxhc3RGaW5pc2hlZEV2ZW50S2V5BAhmaXJzdEtleQMFCGlzQWN0aXZlBRNmaXNydEFjdGl2ZUV2ZW50S2V5BRVmaXNydEZpbmlzaGVkRXZlbnRLZXkECmZpcnN0RXZlbnQJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwUIZmlyc3RLZXkFCXVuZGVmaW5lZAQJbGFzdEV2ZW50CQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFB2xhc3RLZXkFCXVuZGVmaW5lZAQQbmV3TGFzdE9yUHJldktleQMJAAACBQlsYXN0RXZlbnQFCXVuZGVmaW5lZAUHbGFzdEtleQkBD2dldFByZXZFdmVudEtleQEFCmZpcnN0RXZlbnQJAMwIAgkBC1N0cmluZ0VudHJ5AgUIZmlyc3RLZXkFB2V2ZW50SWQJAMwIAgkBC1N0cmluZ0VudHJ5AgUQbmV3TGFzdE9yUHJldktleQUHZXZlbnRJZAkAzAgCCQELU3RyaW5nRW50cnkCCQEPZ2V0TmV4dEV2ZW50S2V5AQUHZXZlbnRJZAUKZmlyc3RFdmVudAUDbmlsAWkBDmRlbGV0ZUZyb21MaXN0AgdldmVudElkCGlzQWN0aXZlAwkBAiE9AgUEdGhpcwgFAWkGY2FsbGVyCQACAQIQb25seSBtYWluIGNhbiBkbwQHbGFzdEtleQMFCGlzQWN0aXZlBRJsYXN0QWN0aXZlRXZlbnRLZXkFFGxhc3RGaW5pc2hlZEV2ZW50S2V5BAhmaXJzdEtleQMFCGlzQWN0aXZlBRNmaXNydEFjdGl2ZUV2ZW50S2V5BRVmaXNydEZpbmlzaGVkRXZlbnRLZXkECmZpcnN0RXZlbnQJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwUIZmlyc3RLZXkFCXVuZGVmaW5lZAQJbGFzdEV2ZW50CQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFB2xhc3RLZXkFCXVuZGVmaW5lZAQNcHJldkV2ZW50VGVtcAkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQEPZ2V0UHJldkV2ZW50S2V5AQUHZXZlbnRJZAUJdW5kZWZpbmVkBA1uZXh0RXZlbnRUZW1wCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAQ9nZXROZXh0RXZlbnRLZXkBBQdldmVudElkBQl1bmRlZmluZWQECXByZXZFdmVudAMJAAACBQdldmVudElkBQpmaXJzdEV2ZW50BQl1bmRlZmluZWQFDXByZXZFdmVudFRlbXAECW5leHRFdmVudAMJAAACBQdldmVudElkBQlsYXN0RXZlbnQFCXVuZGVmaW5lZAUNbmV4dEV2ZW50VGVtcAMDCQAAAgUJcHJldkV2ZW50BQl1bmRlZmluZWQJAAACBQluZXh0RXZlbnQFCXVuZGVmaW5lZAcJAMwIAgkBC1N0cmluZ0VudHJ5AgUIZmlyc3RLZXkFCXVuZGVmaW5lZAkAzAgCCQELU3RyaW5nRW50cnkCBQdsYXN0S2V5BQl1bmRlZmluZWQFA25pbAMDCQECIT0CBQlwcmV2RXZlbnQFCXVuZGVmaW5lZAkBAiE9AgUJbmV4dEV2ZW50BQl1bmRlZmluZWQHCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ9nZXRQcmV2RXZlbnRLZXkBBQluZXh0RXZlbnQFCXByZXZFdmVudAkAzAgCCQELU3RyaW5nRW50cnkCCQEPZ2V0TmV4dEV2ZW50S2V5AQUJcHJldkV2ZW50BQluZXh0RXZlbnQFA25pbAMJAQIhPQIFCXByZXZFdmVudAUJdW5kZWZpbmVkCQDMCAIJAQtTdHJpbmdFbnRyeQIFB2xhc3RLZXkFCXByZXZFdmVudAkAzAgCCQELU3RyaW5nRW50cnkCCQEPZ2V0TmV4dEV2ZW50S2V5AQUJcHJldkV2ZW50BQl1bmRlZmluZWQFA25pbAkAzAgCCQELU3RyaW5nRW50cnkCBQhmaXJzdEtleQUJbmV4dEV2ZW50CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ9nZXRQcmV2RXZlbnRLZXkBBQluZXh0RXZlbnQFCXVuZGVmaW5lZAUDbmlsAWkBC2NvbmNhdExpc3RzAAMJAQEhAQkBB2lzQWRtaW4BCAUBaQZjYWxsZXIJAAIBAhFvbmx5IGFkbWluIGNhbiBkbwQQZmlyc3RBY3RpdmVFdmVudAkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBRNmaXNydEFjdGl2ZUV2ZW50S2V5BQl1bmRlZmluZWQED2xhc3RBY3RpdmVFdmVudAkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBRJsYXN0QWN0aXZlRXZlbnRLZXkFCXVuZGVmaW5lZAQSZmlyc3RGaW5pc2hlZEV2ZW50CQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFFWZpc3J0RmluaXNoZWRFdmVudEtleQUJdW5kZWZpbmVkBBFsYXN0RmluaXNoZWRFdmVudAkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBRRsYXN0RmluaXNoZWRFdmVudEtleQUJdW5kZWZpbmVkBApmaXJzdEV2ZW50AwkBAiE9AgUQZmlyc3RBY3RpdmVFdmVudAUJdW5kZWZpbmVkBRBmaXJzdEFjdGl2ZUV2ZW50BRJmaXJzdEZpbmlzaGVkRXZlbnQECWxhc3RFdmVudAMJAQIhPQIFEWxhc3RGaW5pc2hlZEV2ZW50BQl1bmRlZmluZWQFEWxhc3RGaW5pc2hlZEV2ZW50BQ9sYXN0QWN0aXZlRXZlbnQDAwkBAiE9AgUSZmlyc3RGaW5pc2hlZEV2ZW50BQl1bmRlZmluZWQJAQIhPQIFD2xhc3RBY3RpdmVFdmVudAUJdW5kZWZpbmVkBwkAzAgCCQELU3RyaW5nRW50cnkCBQ1maXJzdEV2ZW50S2V5BQpmaXJzdEV2ZW50CQDMCAIJAQtTdHJpbmdFbnRyeQIFDGxhc3RFdmVudEtleQUJbGFzdEV2ZW50CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ9nZXROZXh0RXZlbnRLZXkBBQ9sYXN0QWN0aXZlRXZlbnQFEmZpcnN0RmluaXNoZWRFdmVudAkAzAgCCQELU3RyaW5nRW50cnkCCQEPZ2V0UHJldkV2ZW50S2V5AQUSZmlyc3RGaW5pc2hlZEV2ZW50BQ9sYXN0QWN0aXZlRXZlbnQFA25pbAkAzAgCCQELU3RyaW5nRW50cnkCBQ1maXJzdEV2ZW50S2V5BQpmaXJzdEV2ZW50CQDMCAIJAQtTdHJpbmdFbnRyeQIFDGxhc3RFdmVudEtleQUJbGFzdEV2ZW50BQNuaWwAwt2ucw==", "height": 2284987, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: B1oeawy8RSFyDmshg5iATKRaoZRZL1gaKCnCAwhKtLj4 Next: ExNyL3Zr8xAWERCbhpUiq7WksvzsZ3V6rxuR2F4RmgpH Diff:
OldNewDifferences
281281 then (listIndex + 1)
282282 else listIndex
283283 let newGroupsCount = (((newListIndex - 1) / 10) + 1)
284-[IntegerEntry(getPriceAddressKey(eventId, addressStr), price), IntegerEntry(getPricesListsCountKey(eventId), newListIndex), IntegerEntry(getPricesGroupsCountKey(eventId), newGroupsCount), StringEntry(getPricesListNKey(eventId, newListIndex), newPrices)]
284+[IntegerEntry(getPriceAddressKey(eventId, addressStr), price), IntegerEntry(getPricesListsCountKey(eventId), newListIndex), IntegerEntry(getPricesGroupsCountKey(eventId), newGroupsCount), IntegerEntry(getPriceBetsCount(eventId, price), (countBetsPrice + 1)), StringEntry(getPricesListNKey(eventId, newListIndex), newPrices)]
285285 }
286286 }
287287
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let undefined = "undefined"
55
66 let separator = ";"
77
88 let configAddressKey = "config"
99
1010 let collectorAddressKey = "collector_address"
1111
1212 let historyAddressKey = "history_address"
1313
1414 let paymakerAddressKey = "paymaker_address"
1515
1616 let adminsKey = "admins"
1717
1818 let configAddress = addressFromStringValue(getStringValue(this, configAddressKey))
1919
2020 let collectorAddress = addressFromStringValue(getStringValue(configAddress, collectorAddressKey))
2121
2222 let historyAddress = addressFromStringValue(getStringValue(configAddress, historyAddressKey))
2323
2424 let paymakerAddress = addressFromStringValue(getStringValue(configAddress, paymakerAddressKey))
2525
2626 func isAdmin (caller) = {
2727 let admRow = valueOrElse(getString(configAddress, adminsKey), "")
2828 if (if ((caller == this))
2929 then true
3030 else contains(admRow, toString(caller)))
3131 then true
3232 else false
3333 }
3434
3535
3636 func getCheckerKey (checker) = ("checker_" + checker)
3737
3838
3939 func isChecker (checker) = {
4040 let isExists = isDefined(getBoolean(configAddress, getCheckerKey(checker)))
4141 isExists
4242 }
4343
4444
4545 let USDN = base58'2eFPx8M5qwNFRbW91pzsyBKMz1FZmYMUW3BVZzTQmbFD'
4646
4747 let minAmount = 10000000
4848
4949 let feeNumerator = 5
5050
5151 let feeDenominator = 100
5252
5353 let maxBetsOnPrice = 3
5454
5555 let firstEventKey = "first_event"
5656
5757 let lastEventKey = "last_event"
5858
5959 let fisrtFinishedEventKey = "first_finished_event"
6060
6161 let lastFinishedEventKey = "last_finished_event"
6262
6363 let fisrtActiveEventKey = "first_active_event"
6464
6565 let lastActiveEventKey = "last_active_event"
6666
6767 func getStartBlockKey (eventId) = (eventId + "_start_block")
6868
6969
7070 func getEndBlockKey (eventId) = (eventId + "_end_block")
7171
7272
7373 func getFinishAtKey (eventId) = (eventId + "_finish_at_block")
7474
7575
7676 func getIdKey (eventId) = (eventId + "_id")
7777
7878
7979 func getStatusKey (eventId) = (eventId + "_status")
8080
8181
8282 func getDescKey (eventId) = (eventId + "_description")
8383
8484
8585 func getPrevEventKey (eventId) = (eventId + "_prev_event")
8686
8787
8888 func getNextEventKey (eventId) = (eventId + "_next_event")
8989
9090
9191 func getAssetIdKey (eventId) = (eventId + "_asset_id")
9292
9393
9494 func getTotalAmountKey (eventId) = (eventId + "_total_amount")
9595
9696
9797 func getPricesGroupsCountKey (eventId) = (eventId + "_prices_group_count")
9898
9999
100100 func getPricesListsCountKey (eventId) = (eventId + "_prices_list_count")
101101
102102
103103 func getPricesListNKey (eventId,n) = ((eventId + "_prices_list_") + toString(n))
104104
105105
106106 func getPriceBetsCount (eventId,price) = (((eventId + "_") + toString(price)) + "_bets_count")
107107
108108
109109 func getPriceAddressKey (eventId,address) = (((eventId + "_") + address) + "_price")
110110
111111
112112 func asInt (v) = match v {
113113 case x: Int =>
114114 x
115115 case t =>
116116 throw("#err")
117117 }
118118
119119
120120 func asString (v) = match v {
121121 case x: String =>
122122 x
123123 case _ =>
124124 throw("#err")
125125 }
126126
127127
128128 func getAssetInfo (assetStr) = {
129129 let assetId = fromBase58String(assetStr)
130130 let x = match assetInfo(assetId) {
131131 case asset: Asset =>
132132 $Tuple2(assetStr, asset.decimals)
133133 case _ =>
134134 $Tuple2("WAVES", 0)
135135 }
136136 x
137137 }
138138
139139
140140 func getStatus (eventId) = {
141141 let status = getStringValue(this, getStatusKey(eventId))
142142 if (if (if ((status == "finished"))
143143 then true
144144 else (status == "#"))
145145 then true
146146 else (status == "ended"))
147147 then status
148148 else {
149149 let finishAt = getIntegerValue(this, getFinishAtKey(eventId))
150150 let startBlock = getIntegerValue(this, getStartBlockKey(eventId))
151151 let endBlock = getIntegerValue(this, getEndBlockKey(eventId))
152152 if ((startBlock > height))
153153 then "awaiting"
154154 else if (if ((height >= startBlock))
155155 then (endBlock >= height)
156156 else false)
157157 then "active"
158158 else if (if ((height > endBlock))
159159 then (finishAt >= height)
160160 else false)
161161 then "confirmation"
162162 else if ((height > finishAt))
163163 then "finished"
164164 else throw("unknown status")
165165 }
166166 }
167167
168168
169169 func registerEvent (txid,desc,startBlock,endBlock,finishAt,assetStr) = {
170170 let eventId = txid
171171 let insert = invoke(this, "insertToList", [eventId, true], nil)
172172 if ((insert == insert))
173173 then {
174174 let concat = invoke(this, "concatLists", nil, nil)
175175 if ((concat == concat))
176176 then {
177177 let $t048674920 = getAssetInfo(assetStr)
178178 let assetId = $t048674920._1
179179 let assetDecimals = $t048674920._2
180180 [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)]
181181 }
182182 else throw("Strict value is not equal to itself.")
183183 }
184184 else throw("Strict value is not equal to itself.")
185185 }
186186
187187
188188 @Callable(i)
189189 func init (config) = if ((i.caller != this))
190190 then throw("only main can do")
191191 else {
192192 let isExists = isDefined(getString(this, configAddressKey))
193193 if (!(isExists))
194194 then [StringEntry(configAddressKey, config)]
195195 else throw("already inited")
196196 }
197197
198198
199199
200200 @Callable(i)
201201 func appendEventer (desc) = if (!(isAdmin(i.caller)))
202202 then throw("only admin can do")
203203 else {
204204 let inv = invoke(configAddress, "setEventer", [toString(this), desc], nil)
205205 if ((inv == inv))
206206 then nil
207207 else throw("Strict value is not equal to itself.")
208208 }
209209
210210
211211
212212 @Callable(i)
213213 func fullRegisterEvent (desc,startBlock,duration,assetStr) = {
214214 let newStartBlock = if ((startBlock == 0))
215215 then height
216216 else startBlock
217217 let endBlock = (newStartBlock + duration)
218218 let finishAt = (endBlock + 1440)
219219 if (!(isAdmin(i.caller)))
220220 then throw("only admin can do")
221221 else {
222222 let txid = toBase58String(i.transactionId)
223223 registerEvent(txid, desc, newStartBlock, endBlock, finishAt, assetStr)
224224 }
225225 }
226226
227227
228228
229229 @Callable(i)
230230 func choice (eventId,price,address) = {
231231 let status = getStatus(eventId)
232232 if ((status == "active"))
233233 then {
234234 let neededAmount = 10000000
235235 let neededAsset = USDN
236236 if (if (if ((size(i.payments) == 1))
237237 then (i.payments[0].assetId == neededAsset)
238238 else false)
239239 then (i.payments[0].amount == neededAmount)
240240 else false)
241241 then {
242242 let invAppend = invoke(this, "appendBetsList", [eventId, address, price], nil)
243243 if ((invAppend == invAppend))
244244 then {
245245 let currentTotal = valueOrElse(getInteger(this, getTotalAmountKey(eventId)), 0)
246246 [IntegerEntry(getTotalAmountKey(eventId), (currentTotal + i.payments[0].amount))]
247247 }
248248 else throw("Strict value is not equal to itself.")
249249 }
250250 else throw("Bad payment")
251251 }
252252 else throw("You can`t do it")
253253 }
254254
255255
256256
257257 @Callable(i)
258258 func appendBetsList (eventId,addressStr,price) = if ((i.caller != this))
259259 then throw("only main can do")
260260 else if (isDefined(getString(this, getPriceAddressKey(eventId, addressStr))))
261261 then throw("betting from this address is exists")
262262 else {
263263 let countBetsPrice = valueOrElse(getInteger(this, getPriceBetsCount(eventId, price)), 0)
264264 if ((countBetsPrice >= maxBetsOnPrice))
265265 then throw("to many bets")
266266 else {
267267 let listIndex = valueOrElse(getInteger(this, getPricesListsCountKey(eventId)), 1)
268268 let currentPrices = valueOrElse(getString(this, getPricesListNKey(eventId, listIndex)), "")
269269 let currentPricesList = split_4C(currentPrices, separator)
270270 let listSize = size(currentPricesList)
271271 let newPrices = if ((countBetsPrice == 0))
272272 then if ((100 > listSize))
273273 then if ((size(currentPrices) == 0))
274274 then toString(price)
275275 else ((currentPrices + separator) + toString(price))
276276 else toString(price)
277277 else currentPrices
278278 let newListIndex = if (if ((listSize >= 100))
279279 then (countBetsPrice == 0)
280280 else false)
281281 then (listIndex + 1)
282282 else listIndex
283283 let newGroupsCount = (((newListIndex - 1) / 10) + 1)
284-[IntegerEntry(getPriceAddressKey(eventId, addressStr), price), IntegerEntry(getPricesListsCountKey(eventId), newListIndex), IntegerEntry(getPricesGroupsCountKey(eventId), newGroupsCount), StringEntry(getPricesListNKey(eventId, newListIndex), newPrices)]
284+[IntegerEntry(getPriceAddressKey(eventId, addressStr), price), IntegerEntry(getPricesListsCountKey(eventId), newListIndex), IntegerEntry(getPricesGroupsCountKey(eventId), newGroupsCount), IntegerEntry(getPriceBetsCount(eventId, price), (countBetsPrice + 1)), StringEntry(getPricesListNKey(eventId, newListIndex), newPrices)]
285285 }
286286 }
287287
288288
289289
290290 @Callable(i)
291291 func resetList () = if (!(isAdmin(i.caller)))
292292 then throw("only admin can do")
293293 else [StringEntry(firstEventKey, undefined), StringEntry(lastEventKey, undefined), StringEntry(fisrtActiveEventKey, undefined), StringEntry(lastActiveEventKey, undefined), StringEntry(fisrtFinishedEventKey, undefined), StringEntry(lastFinishedEventKey, undefined)]
294294
295295
296296
297297 @Callable(i)
298298 func insertToList (eventId,isActive) = if ((this != i.caller))
299299 then throw("only main can do")
300300 else {
301301 let lastKey = if (isActive)
302302 then lastActiveEventKey
303303 else lastFinishedEventKey
304304 let firstKey = if (isActive)
305305 then fisrtActiveEventKey
306306 else fisrtFinishedEventKey
307307 let firstEvent = valueOrElse(getString(this, firstKey), undefined)
308308 let lastEvent = valueOrElse(getString(this, lastKey), undefined)
309309 let newLastOrPrevKey = if ((lastEvent == undefined))
310310 then lastKey
311311 else getPrevEventKey(firstEvent)
312312 [StringEntry(firstKey, eventId), StringEntry(newLastOrPrevKey, eventId), StringEntry(getNextEventKey(eventId), firstEvent)]
313313 }
314314
315315
316316
317317 @Callable(i)
318318 func deleteFromList (eventId,isActive) = if ((this != i.caller))
319319 then throw("only main can do")
320320 else {
321321 let lastKey = if (isActive)
322322 then lastActiveEventKey
323323 else lastFinishedEventKey
324324 let firstKey = if (isActive)
325325 then fisrtActiveEventKey
326326 else fisrtFinishedEventKey
327327 let firstEvent = valueOrElse(getString(this, firstKey), undefined)
328328 let lastEvent = valueOrElse(getString(this, lastKey), undefined)
329329 let prevEventTemp = valueOrElse(getString(this, getPrevEventKey(eventId)), undefined)
330330 let nextEventTemp = valueOrElse(getString(this, getNextEventKey(eventId)), undefined)
331331 let prevEvent = if ((eventId == firstEvent))
332332 then undefined
333333 else prevEventTemp
334334 let nextEvent = if ((eventId == lastEvent))
335335 then undefined
336336 else nextEventTemp
337337 if (if ((prevEvent == undefined))
338338 then (nextEvent == undefined)
339339 else false)
340340 then [StringEntry(firstKey, undefined), StringEntry(lastKey, undefined)]
341341 else if (if ((prevEvent != undefined))
342342 then (nextEvent != undefined)
343343 else false)
344344 then [StringEntry(getPrevEventKey(nextEvent), prevEvent), StringEntry(getNextEventKey(prevEvent), nextEvent)]
345345 else if ((prevEvent != undefined))
346346 then [StringEntry(lastKey, prevEvent), StringEntry(getNextEventKey(prevEvent), undefined)]
347347 else [StringEntry(firstKey, nextEvent), StringEntry(getPrevEventKey(nextEvent), undefined)]
348348 }
349349
350350
351351
352352 @Callable(i)
353353 func concatLists () = if (!(isAdmin(i.caller)))
354354 then throw("only admin can do")
355355 else {
356356 let firstActiveEvent = valueOrElse(getString(this, fisrtActiveEventKey), undefined)
357357 let lastActiveEvent = valueOrElse(getString(this, lastActiveEventKey), undefined)
358358 let firstFinishedEvent = valueOrElse(getString(this, fisrtFinishedEventKey), undefined)
359359 let lastFinishedEvent = valueOrElse(getString(this, lastFinishedEventKey), undefined)
360360 let firstEvent = if ((firstActiveEvent != undefined))
361361 then firstActiveEvent
362362 else firstFinishedEvent
363363 let lastEvent = if ((lastFinishedEvent != undefined))
364364 then lastFinishedEvent
365365 else lastActiveEvent
366366 if (if ((firstFinishedEvent != undefined))
367367 then (lastActiveEvent != undefined)
368368 else false)
369369 then [StringEntry(firstEventKey, firstEvent), StringEntry(lastEventKey, lastEvent), StringEntry(getNextEventKey(lastActiveEvent), firstFinishedEvent), StringEntry(getPrevEventKey(firstFinishedEvent), lastActiveEvent)]
370370 else [StringEntry(firstEventKey, firstEvent), StringEntry(lastEventKey, lastEvent)]
371371 }
372372
373373

github/deemru/w8io/03bedc9 
59.03 ms