tx · ERvswQ6XDy5xjMvC1oBeMZbf2AiX16vNEKryiocJUvTW

3MvJDKBFzztnd7KCU78zgJ8qUuzVux4c9yw:  -0.01000000 Waves

2022.10.23 14:15 [2284971] smart account 3MvJDKBFzztnd7KCU78zgJ8qUuzVux4c9yw > SELF 0.00000000 Waves

{ "type": 13, "id": "ERvswQ6XDy5xjMvC1oBeMZbf2AiX16vNEKryiocJUvTW", "fee": 1000000, "feeAssetId": null, "timestamp": 1666523790999, "version": 2, "chainId": 84, "sender": "3MvJDKBFzztnd7KCU78zgJ8qUuzVux4c9yw", "senderPublicKey": "9gVuyFNzke49pnadJxJ312ZWhYudDhdcqP5hsm5pGQw6", "proofs": [ "2UXDGY264mCcqwD8JoVSSJQhfAwLvAiCQpFB42gMzP84LRZqU1z7zUZudC2uMikdev2txp9vvvkBipd6JgX1ybzJ" ], "script": "base64:BgIyCAISAwoBCBIDCgEIEgYKBAgBAQgSBQoDCAEIEgUKAwgIARIAEgQKAggEEgQKAggEEgAtAAl1bmRlZmluZWQCCXVuZGVmaW5lZAAJc2VwYXJhdG9yAgE7ABBjb25maWdBZGRyZXNzS2V5AgZjb25maWcAE2NvbGxlY3RvckFkZHJlc3NLZXkCEWNvbGxlY3Rvcl9hZGRyZXNzABFoaXN0b3J5QWRkcmVzc0tleQIPaGlzdG9yeV9hZGRyZXNzABJwYXltYWtlckFkZHJlc3NLZXkCEHBheW1ha2VyX2FkZHJlc3MACWFkbWluc0tleQIGYWRtaW5zAA1jb25maWdBZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA2MikBCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzBRBjb25maWdBZGRyZXNzS2V5ABBjb2xsZWN0b3JBZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA2MikBCQERQGV4dHJOYXRpdmUoMTA1MykCBQ1jb25maWdBZGRyZXNzBRNjb2xsZWN0b3JBZGRyZXNzS2V5AA5oaXN0b3J5QWRkcmVzcwkBEUBleHRyTmF0aXZlKDEwNjIpAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUNY29uZmlnQWRkcmVzcwURaGlzdG9yeUFkZHJlc3NLZXkAD3BheW1ha2VyQWRkcmVzcwkBEUBleHRyTmF0aXZlKDEwNjIpAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUNY29uZmlnQWRkcmVzcwUScGF5bWFrZXJBZGRyZXNzS2V5AQdpc0FkbWluAQZjYWxsZXIEBmFkbVJvdwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ1jb25maWdBZGRyZXNzBQlhZG1pbnNLZXkCAAMDCQAAAgUGY2FsbGVyBQR0aGlzBgkBCGNvbnRhaW5zAgUGYWRtUm93CQClCAEFBmNhbGxlcgYHAQ1nZXRDaGVja2VyS2V5AQdjaGVja2VyCQCsAgICCGNoZWNrZXJfBQdjaGVja2VyAQlpc0NoZWNrZXIBB2NoZWNrZXIECGlzRXhpc3RzCQEJaXNEZWZpbmVkAQkAmwgCBQ1jb25maWdBZGRyZXNzCQENZ2V0Q2hlY2tlcktleQEFB2NoZWNrZXIFCGlzRXhpc3RzAARVU0ROASAYZnRB0PLZIchHiUNJCnGtXhPXO6NBZoIwBSXE8y+z0AAJbWluQW1vdW50AICt4gQADGZlZU51bWVyYXRvcgAFAA5mZWVEZW5vbWluYXRvcgBkAA5tYXhCZXRzT25QcmljZQADAA1maXJzdEV2ZW50S2V5AgtmaXJzdF9ldmVudAAMbGFzdEV2ZW50S2V5AgpsYXN0X2V2ZW50ABVmaXNydEZpbmlzaGVkRXZlbnRLZXkCFGZpcnN0X2ZpbmlzaGVkX2V2ZW50ABRsYXN0RmluaXNoZWRFdmVudEtleQITbGFzdF9maW5pc2hlZF9ldmVudAATZmlzcnRBY3RpdmVFdmVudEtleQISZmlyc3RfYWN0aXZlX2V2ZW50ABJsYXN0QWN0aXZlRXZlbnRLZXkCEWxhc3RfYWN0aXZlX2V2ZW50ARBnZXRTdGFydEJsb2NrS2V5AQdldmVudElkCQCsAgIFB2V2ZW50SWQCDF9zdGFydF9ibG9jawEOZ2V0RW5kQmxvY2tLZXkBB2V2ZW50SWQJAKwCAgUHZXZlbnRJZAIKX2VuZF9ibG9jawEOZ2V0RmluaXNoQXRLZXkBB2V2ZW50SWQJAKwCAgUHZXZlbnRJZAIQX2ZpbmlzaF9hdF9ibG9jawEIZ2V0SWRLZXkBB2V2ZW50SWQJAKwCAgUHZXZlbnRJZAIDX2lkAQxnZXRTdGF0dXNLZXkBB2V2ZW50SWQJAKwCAgUHZXZlbnRJZAIHX3N0YXR1cwEKZ2V0RGVzY0tleQEHZXZlbnRJZAkArAICBQdldmVudElkAgxfZGVzY3JpcHRpb24BD2dldFByZXZFdmVudEtleQEHZXZlbnRJZAkArAICBQdldmVudElkAgtfcHJldl9ldmVudAEPZ2V0TmV4dEV2ZW50S2V5AQdldmVudElkCQCsAgIFB2V2ZW50SWQCC19uZXh0X2V2ZW50AQ1nZXRBc3NldElkS2V5AQdldmVudElkCQCsAgIFB2V2ZW50SWQCCV9hc3NldF9pZAERZ2V0VG90YWxBbW91bnRLZXkBB2V2ZW50SWQJAKwCAgUHZXZlbnRJZAINX3RvdGFsX2Ftb3VudAEXZ2V0UHJpY2VzR3JvdXBzQ291bnRLZXkBB2V2ZW50SWQJAKwCAgUHZXZlbnRJZAITX3ByaWNlc19ncm91cF9jb3VudAEWZ2V0UHJpY2VzTGlzdHNDb3VudEtleQEHZXZlbnRJZAkArAICBQdldmVudElkAhJfcHJpY2VzX2xpc3RfY291bnQBEWdldFByaWNlc0xpc3ROS2V5AgdldmVudElkAW4JAKwCAgkArAICBQdldmVudElkAg1fcHJpY2VzX2xpc3RfCQCkAwEFAW4BEWdldFByaWNlQmV0c0NvdW50AgdldmVudElkBXByaWNlCQCsAgIJAKwCAgkArAICBQdldmVudElkAgFfCQCkAwEFBXByaWNlAgtfYmV0c19jb3VudAESZ2V0UHJpY2VBZGRyZXNzS2V5AgdldmVudElkB2FkZHJlc3MJAKwCAgkArAICCQCsAgIFB2V2ZW50SWQCAV8FB2FkZHJlc3MCBl9wcmljZQEFYXNJbnQBAXYEByRtYXRjaDAFAXYDCQABAgUHJG1hdGNoMAIDSW50BAF4BQckbWF0Y2gwBQF4BAF0BQckbWF0Y2gwCQACAQIEI2VycgEIYXNTdHJpbmcBAXYEByRtYXRjaDAFAXYDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAF4BQckbWF0Y2gwBQF4CQACAQIEI2VycgEMZ2V0QXNzZXRJbmZvAQhhc3NldFN0cgQHYXNzZXRJZAkA2QQBBQhhc3NldFN0cgQBeAQHJG1hdGNoMAkA7AcBBQdhc3NldElkAwkAAQIFByRtYXRjaDACBUFzc2V0BAVhc3NldAUHJG1hdGNoMAkAlAoCBQhhc3NldFN0cggFBWFzc2V0CGRlY2ltYWxzCQCUCgICBVdBVkVTAAAFAXgBCWdldFN0YXR1cwEHZXZlbnRJZAQGc3RhdHVzCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzCQEMZ2V0U3RhdHVzS2V5AQUHZXZlbnRJZAMDAwkAAAIFBnN0YXR1cwIIZmluaXNoZWQGCQAAAgUGc3RhdHVzAgEjBgkAAAIFBnN0YXR1cwIFZW5kZWQFBnN0YXR1cwQIZmluaXNoQXQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAQ5nZXRGaW5pc2hBdEtleQEFB2V2ZW50SWQECnN0YXJ0QmxvY2sJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJARBnZXRTdGFydEJsb2NrS2V5AQUHZXZlbnRJZAQIZW5kQmxvY2sJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAQ5nZXRFbmRCbG9ja0tleQEFB2V2ZW50SWQDCQBmAgUKc3RhcnRCbG9jawUGaGVpZ2h0Aghhd2FpdGluZwMDCQBnAgUGaGVpZ2h0BQpzdGFydEJsb2NrCQBnAgUIZW5kQmxvY2sFBmhlaWdodAcCBmFjdGl2ZQMDCQBmAgUGaGVpZ2h0BQhlbmRCbG9jawkAZwIFCGZpbmlzaEF0BQZoZWlnaHQHAgxjb25maXJtYXRpb24DCQBmAgUGaGVpZ2h0BQhmaW5pc2hBdAIIZmluaXNoZWQJAAIBAg51bmtub3duIHN0YXR1cwENcmVnaXN0ZXJFdmVudAYEdHhpZARkZXNjCnN0YXJ0QmxvY2sIZW5kQmxvY2sIZmluaXNoQXQIYXNzZXRTdHIEB2V2ZW50SWQFBHR4aWQEBmluc2VydAkA/AcEBQR0aGlzAgxpbnNlcnRUb0xpc3QJAMwIAgUHZXZlbnRJZAkAzAgCBgUDbmlsBQNuaWwDCQAAAgUGaW5zZXJ0BQZpbnNlcnQEBmNvbmNhdAkA/AcEBQR0aGlzAgtjb25jYXRMaXN0cwUDbmlsBQNuaWwDCQAAAgUGY29uY2F0BQZjb25jYXQECyR0MDQ4Njc0OTIwCQEMZ2V0QXNzZXRJbmZvAQUIYXNzZXRTdHIEB2Fzc2V0SWQIBQskdDA0ODY3NDkyMAJfMQQNYXNzZXREZWNpbWFscwgFCyR0MDQ4Njc0OTIwAl8yCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEQZ2V0U3RhcnRCbG9ja0tleQEFB2V2ZW50SWQFCnN0YXJ0QmxvY2sJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ5nZXRFbmRCbG9ja0tleQEFB2V2ZW50SWQFCGVuZEJsb2NrCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEOZ2V0RmluaXNoQXRLZXkBBQdldmVudElkBQhmaW5pc2hBdAkAzAgCCQELU3RyaW5nRW50cnkCCQEKZ2V0RGVzY0tleQEFB2V2ZW50SWQFBGRlc2MJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDGdldFN0YXR1c0tleQEFB2V2ZW50SWQCA25ldwkAzAgCCQELU3RyaW5nRW50cnkCCQEIZ2V0SWRLZXkBBQdldmVudElkBQdldmVudElkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ1nZXRBc3NldElkS2V5AQUHZXZlbnRJZAUHYXNzZXRJZAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQFpAQRpbml0AQZjb25maWcDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhBvbmx5IG1haW4gY2FuIGRvBAhpc0V4aXN0cwkBCWlzRGVmaW5lZAEJAJ0IAgUEdGhpcwUQY29uZmlnQWRkcmVzc0tleQMJAQEhAQUIaXNFeGlzdHMJAMwIAgkBC1N0cmluZ0VudHJ5AgUQY29uZmlnQWRkcmVzc0tleQUGY29uZmlnBQNuaWwJAAIBAg5hbHJlYWR5IGluaXRlZAFpAQ1hcHBlbmRFdmVudGVyAQRkZXNjAwkBASEBCQEHaXNBZG1pbgEIBQFpBmNhbGxlcgkAAgECEW9ubHkgYWRtaW4gY2FuIGRvBANpbnYJAPwHBAUNY29uZmlnQWRkcmVzcwIKc2V0RXZlbnRlcgkAzAgCCQClCAEFBHRoaXMJAMwIAgUEZGVzYwUDbmlsBQNuaWwDCQAAAgUDaW52BQNpbnYFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARFmdWxsUmVnaXN0ZXJFdmVudAQEZGVzYwpzdGFydEJsb2NrCGR1cmF0aW9uCGFzc2V0U3RyBA1uZXdTdGFydEJsb2NrAwkAAAIFCnN0YXJ0QmxvY2sAAAUGaGVpZ2h0BQpzdGFydEJsb2NrBAhlbmRCbG9jawkAZAIFDW5ld1N0YXJ0QmxvY2sFCGR1cmF0aW9uBAhmaW5pc2hBdAkAZAIFCGVuZEJsb2NrAKALAwkBASEBCQEHaXNBZG1pbgEIBQFpBmNhbGxlcgkAAgECEW9ubHkgYWRtaW4gY2FuIGRvBAR0eGlkCQDYBAEIBQFpDXRyYW5zYWN0aW9uSWQJAQ1yZWdpc3RlckV2ZW50BgUEdHhpZAUEZGVzYwUNbmV3U3RhcnRCbG9jawUIZW5kQmxvY2sFCGZpbmlzaEF0BQhhc3NldFN0cgFpAQZjaG9pY2UDB2V2ZW50SWQFcHJpY2UHYWRkcmVzcwQGc3RhdHVzCQEJZ2V0U3RhdHVzAQUHZXZlbnRJZAMJAAACBQZzdGF0dXMCBmFjdGl2ZQQMbmVlZGVkQW1vdW50AICt4gQEC25lZWRlZEFzc2V0BQRVU0ROAwMDCQAAAgkAkAMBCAUBaQhwYXltZW50cwABCQAAAggJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBQtuZWVkZWRBc3NldAcJAAACCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAUMbmVlZGVkQW1vdW50BwQJaW52QXBwZW5kCQD8BwQFBHRoaXMCDmFwcGVuZEJldHNMaXN0CQDMCAIFB2V2ZW50SWQJAMwIAgUHYWRkcmVzcwkAzAgCBQVwcmljZQUDbmlsBQNuaWwDCQAAAgUJaW52QXBwZW5kBQlpbnZBcHBlbmQEDGN1cnJlbnRUb3RhbAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQERZ2V0VG90YWxBbW91bnRLZXkBBQdldmVudElkAAAJAMwIAgkBDEludGVnZXJFbnRyeQIJARFnZXRUb3RhbEFtb3VudEtleQEFB2V2ZW50SWQJAGQCBQxjdXJyZW50VG90YWwICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAgtCYWQgcGF5bWVudAkAAgECD1lvdSBjYW5gdCBkbyBpdAFpAQ5hcHBlbmRCZXRzTGlzdAMHZXZlbnRJZAphZGRyZXNzU3RyBXByaWNlAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIQb25seSBtYWluIGNhbiBkbwMJAQlpc0RlZmluZWQBCQCdCAIFBHRoaXMJARJnZXRQcmljZUFkZHJlc3NLZXkCBQdldmVudElkBQphZGRyZXNzU3RyCQACAQIjYmV0dGluZyBmcm9tIHRoaXMgYWRkcmVzcyBpcyBleGlzdHMEDmNvdW50QmV0c1ByaWNlCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJARFnZXRQcmljZUJldHNDb3VudAIFB2V2ZW50SWQFBXByaWNlAAADCQBnAgUOY291bnRCZXRzUHJpY2UFDm1heEJldHNPblByaWNlCQACAQIMdG8gbWFueSBiZXRzBAlsaXN0SW5kZXgJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBFmdldFByaWNlc0xpc3RzQ291bnRLZXkBBQdldmVudElkAAEEDWN1cnJlbnRQcmljZXMJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkBEWdldFByaWNlc0xpc3ROS2V5AgUHZXZlbnRJZAUJbGlzdEluZGV4AgAEEWN1cnJlbnRQcmljZXNMaXN0CQC8CQIFDWN1cnJlbnRQcmljZXMFCXNlcGFyYXRvcgQIbGlzdFNpemUJAJADAQURY3VycmVudFByaWNlc0xpc3QECW5ld1ByaWNlcwMJAAACBQ5jb3VudEJldHNQcmljZQAAAwkAZgIAZAUIbGlzdFNpemUDCQAAAgkAsQIBBQ1jdXJyZW50UHJpY2VzAAAJAKQDAQUFcHJpY2UJAKwCAgkArAICBQ1jdXJyZW50UHJpY2VzBQlzZXBhcmF0b3IJAKQDAQUFcHJpY2UJAKQDAQUFcHJpY2UFDWN1cnJlbnRQcmljZXMEDG5ld0xpc3RJbmRleAMDCQBnAgUIbGlzdFNpemUAZAkAAAIFDmNvdW50QmV0c1ByaWNlAAAHBQlsaXN0SW5kZXgJAGQCBQlsaXN0SW5kZXgAAQQObmV3R3JvdXBzQ291bnQJAGQCCQBpAgkAZQIFDG5ld0xpc3RJbmRleAABAAoAAQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBEmdldFByaWNlQWRkcmVzc0tleQIFB2V2ZW50SWQFCmFkZHJlc3NTdHIFBXByaWNlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEWZ2V0UHJpY2VzTGlzdHNDb3VudEtleQEFB2V2ZW50SWQFDG5ld0xpc3RJbmRleAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBF2dldFByaWNlc0dyb3Vwc0NvdW50S2V5AQUHZXZlbnRJZAUObmV3R3JvdXBzQ291bnQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBEWdldFByaWNlc0xpc3ROS2V5AgUHZXZlbnRJZAUMbmV3TGlzdEluZGV4BQluZXdQcmljZXMFA25pbAFpAQlyZXNldExpc3QAAwkBASEBCQEHaXNBZG1pbgEIBQFpBmNhbGxlcgkAAgECEW9ubHkgYWRtaW4gY2FuIGRvCQDMCAIJAQtTdHJpbmdFbnRyeQIFDWZpcnN0RXZlbnRLZXkFCXVuZGVmaW5lZAkAzAgCCQELU3RyaW5nRW50cnkCBQxsYXN0RXZlbnRLZXkFCXVuZGVmaW5lZAkAzAgCCQELU3RyaW5nRW50cnkCBRNmaXNydEFjdGl2ZUV2ZW50S2V5BQl1bmRlZmluZWQJAMwIAgkBC1N0cmluZ0VudHJ5AgUSbGFzdEFjdGl2ZUV2ZW50S2V5BQl1bmRlZmluZWQJAMwIAgkBC1N0cmluZ0VudHJ5AgUVZmlzcnRGaW5pc2hlZEV2ZW50S2V5BQl1bmRlZmluZWQJAMwIAgkBC1N0cmluZ0VudHJ5AgUUbGFzdEZpbmlzaGVkRXZlbnRLZXkFCXVuZGVmaW5lZAUDbmlsAWkBDGluc2VydFRvTGlzdAIHZXZlbnRJZAhpc0FjdGl2ZQMJAQIhPQIFBHRoaXMIBQFpBmNhbGxlcgkAAgECEG9ubHkgbWFpbiBjYW4gZG8EB2xhc3RLZXkDBQhpc0FjdGl2ZQUSbGFzdEFjdGl2ZUV2ZW50S2V5BRRsYXN0RmluaXNoZWRFdmVudEtleQQIZmlyc3RLZXkDBQhpc0FjdGl2ZQUTZmlzcnRBY3RpdmVFdmVudEtleQUVZmlzcnRGaW5pc2hlZEV2ZW50S2V5BApmaXJzdEV2ZW50CQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFCGZpcnN0S2V5BQl1bmRlZmluZWQECWxhc3RFdmVudAkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBQdsYXN0S2V5BQl1bmRlZmluZWQEEG5ld0xhc3RPclByZXZLZXkDCQAAAgUJbGFzdEV2ZW50BQl1bmRlZmluZWQFB2xhc3RLZXkJAQ9nZXRQcmV2RXZlbnRLZXkBBQpmaXJzdEV2ZW50CQDMCAIJAQtTdHJpbmdFbnRyeQIFCGZpcnN0S2V5BQdldmVudElkCQDMCAIJAQtTdHJpbmdFbnRyeQIFEG5ld0xhc3RPclByZXZLZXkFB2V2ZW50SWQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBD2dldE5leHRFdmVudEtleQEFB2V2ZW50SWQFCmZpcnN0RXZlbnQFA25pbAFpAQ5kZWxldGVGcm9tTGlzdAIHZXZlbnRJZAhpc0FjdGl2ZQMJAQIhPQIFBHRoaXMIBQFpBmNhbGxlcgkAAgECEG9ubHkgbWFpbiBjYW4gZG8EB2xhc3RLZXkDBQhpc0FjdGl2ZQUSbGFzdEFjdGl2ZUV2ZW50S2V5BRRsYXN0RmluaXNoZWRFdmVudEtleQQIZmlyc3RLZXkDBQhpc0FjdGl2ZQUTZmlzcnRBY3RpdmVFdmVudEtleQUVZmlzcnRGaW5pc2hlZEV2ZW50S2V5BApmaXJzdEV2ZW50CQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFCGZpcnN0S2V5BQl1bmRlZmluZWQECWxhc3RFdmVudAkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBQdsYXN0S2V5BQl1bmRlZmluZWQEDXByZXZFdmVudFRlbXAJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkBD2dldFByZXZFdmVudEtleQEFB2V2ZW50SWQFCXVuZGVmaW5lZAQNbmV4dEV2ZW50VGVtcAkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQEPZ2V0TmV4dEV2ZW50S2V5AQUHZXZlbnRJZAUJdW5kZWZpbmVkBAlwcmV2RXZlbnQDCQAAAgUHZXZlbnRJZAUKZmlyc3RFdmVudAUJdW5kZWZpbmVkBQ1wcmV2RXZlbnRUZW1wBAluZXh0RXZlbnQDCQAAAgUHZXZlbnRJZAUJbGFzdEV2ZW50BQl1bmRlZmluZWQFDW5leHRFdmVudFRlbXADAwkAAAIFCXByZXZFdmVudAUJdW5kZWZpbmVkCQAAAgUJbmV4dEV2ZW50BQl1bmRlZmluZWQHCQDMCAIJAQtTdHJpbmdFbnRyeQIFCGZpcnN0S2V5BQl1bmRlZmluZWQJAMwIAgkBC1N0cmluZ0VudHJ5AgUHbGFzdEtleQUJdW5kZWZpbmVkBQNuaWwDAwkBAiE9AgUJcHJldkV2ZW50BQl1bmRlZmluZWQJAQIhPQIFCW5leHRFdmVudAUJdW5kZWZpbmVkBwkAzAgCCQELU3RyaW5nRW50cnkCCQEPZ2V0UHJldkV2ZW50S2V5AQUJbmV4dEV2ZW50BQlwcmV2RXZlbnQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBD2dldE5leHRFdmVudEtleQEFCXByZXZFdmVudAUJbmV4dEV2ZW50BQNuaWwDCQECIT0CBQlwcmV2RXZlbnQFCXVuZGVmaW5lZAkAzAgCCQELU3RyaW5nRW50cnkCBQdsYXN0S2V5BQlwcmV2RXZlbnQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBD2dldE5leHRFdmVudEtleQEFCXByZXZFdmVudAUJdW5kZWZpbmVkBQNuaWwJAMwIAgkBC1N0cmluZ0VudHJ5AgUIZmlyc3RLZXkFCW5leHRFdmVudAkAzAgCCQELU3RyaW5nRW50cnkCCQEPZ2V0UHJldkV2ZW50S2V5AQUJbmV4dEV2ZW50BQl1bmRlZmluZWQFA25pbAFpAQtjb25jYXRMaXN0cwADCQEBIQEJAQdpc0FkbWluAQgFAWkGY2FsbGVyCQACAQIRb25seSBhZG1pbiBjYW4gZG8EEGZpcnN0QWN0aXZlRXZlbnQJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwUTZmlzcnRBY3RpdmVFdmVudEtleQUJdW5kZWZpbmVkBA9sYXN0QWN0aXZlRXZlbnQJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwUSbGFzdEFjdGl2ZUV2ZW50S2V5BQl1bmRlZmluZWQEEmZpcnN0RmluaXNoZWRFdmVudAkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBRVmaXNydEZpbmlzaGVkRXZlbnRLZXkFCXVuZGVmaW5lZAQRbGFzdEZpbmlzaGVkRXZlbnQJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwUUbGFzdEZpbmlzaGVkRXZlbnRLZXkFCXVuZGVmaW5lZAQKZmlyc3RFdmVudAMJAQIhPQIFEGZpcnN0QWN0aXZlRXZlbnQFCXVuZGVmaW5lZAUQZmlyc3RBY3RpdmVFdmVudAUSZmlyc3RGaW5pc2hlZEV2ZW50BAlsYXN0RXZlbnQDCQECIT0CBRFsYXN0RmluaXNoZWRFdmVudAUJdW5kZWZpbmVkBRFsYXN0RmluaXNoZWRFdmVudAUPbGFzdEFjdGl2ZUV2ZW50AwMJAQIhPQIFEmZpcnN0RmluaXNoZWRFdmVudAUJdW5kZWZpbmVkCQECIT0CBQ9sYXN0QWN0aXZlRXZlbnQFCXVuZGVmaW5lZAcJAMwIAgkBC1N0cmluZ0VudHJ5AgUNZmlyc3RFdmVudEtleQUKZmlyc3RFdmVudAkAzAgCCQELU3RyaW5nRW50cnkCBQxsYXN0RXZlbnRLZXkFCWxhc3RFdmVudAkAzAgCCQELU3RyaW5nRW50cnkCCQEPZ2V0TmV4dEV2ZW50S2V5AQUPbGFzdEFjdGl2ZUV2ZW50BRJmaXJzdEZpbmlzaGVkRXZlbnQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBD2dldFByZXZFdmVudEtleQEFEmZpcnN0RmluaXNoZWRFdmVudAUPbGFzdEFjdGl2ZUV2ZW50BQNuaWwJAMwIAgkBC1N0cmluZ0VudHJ5AgUNZmlyc3RFdmVudEtleQUKZmlyc3RFdmVudAkAzAgCCQELU3RyaW5nRW50cnkCBQxsYXN0RXZlbnRLZXkFCWxhc3RFdmVudAUDbmlsAEXaAcE=", "height": 2284971, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: GVYMmqts5DKYxqJvC6jo5JagdRyYQ98DLn4rbEKcjaNM Next: B1oeawy8RSFyDmshg5iATKRaoZRZL1gaKCnCAwhKtLj4 Diff:
OldNewDifferences
242242 let invAppend = invoke(this, "appendBetsList", [eventId, address, price], nil)
243243 if ((invAppend == invAppend))
244244 then {
245- let save = invoke(historyAddress, "saveToHistory", [eventId, address], nil)
246- if ((save == save))
247- then {
248- let currentTotal = valueOrElse(getInteger(this, getTotalAmountKey(eventId)), 0)
245+ let currentTotal = valueOrElse(getInteger(this, getTotalAmountKey(eventId)), 0)
249246 [IntegerEntry(getTotalAmountKey(eventId), (currentTotal + i.payments[0].amount))]
250- }
251- else throw("Strict value is not equal to itself.")
252247 }
253248 else throw("Strict value is not equal to itself.")
254249 }
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 {
245- let save = invoke(historyAddress, "saveToHistory", [eventId, address], nil)
246- if ((save == save))
247- then {
248- let currentTotal = valueOrElse(getInteger(this, getTotalAmountKey(eventId)), 0)
245+ let currentTotal = valueOrElse(getInteger(this, getTotalAmountKey(eventId)), 0)
249246 [IntegerEntry(getTotalAmountKey(eventId), (currentTotal + i.payments[0].amount))]
250- }
251- else throw("Strict value is not equal to itself.")
252247 }
253248 else throw("Strict value is not equal to itself.")
254249 }
255250 else throw("Bad payment")
256251 }
257252 else throw("You can`t do it")
258253 }
259254
260255
261256
262257 @Callable(i)
263258 func appendBetsList (eventId,addressStr,price) = if ((i.caller != this))
264259 then throw("only main can do")
265260 else if (isDefined(getString(this, getPriceAddressKey(eventId, addressStr))))
266261 then throw("betting from this address is exists")
267262 else {
268263 let countBetsPrice = valueOrElse(getInteger(this, getPriceBetsCount(eventId, price)), 0)
269264 if ((countBetsPrice >= maxBetsOnPrice))
270265 then throw("to many bets")
271266 else {
272267 let listIndex = valueOrElse(getInteger(this, getPricesListsCountKey(eventId)), 1)
273268 let currentPrices = valueOrElse(getString(this, getPricesListNKey(eventId, listIndex)), "")
274269 let currentPricesList = split_4C(currentPrices, separator)
275270 let listSize = size(currentPricesList)
276271 let newPrices = if ((countBetsPrice == 0))
277272 then if ((100 > listSize))
278273 then if ((size(currentPrices) == 0))
279274 then toString(price)
280275 else ((currentPrices + separator) + toString(price))
281276 else toString(price)
282277 else currentPrices
283278 let newListIndex = if (if ((listSize >= 100))
284279 then (countBetsPrice == 0)
285280 else false)
286281 then listIndex
287282 else (listIndex + 1)
288283 let newGroupsCount = (((newListIndex - 1) / 10) + 1)
289284 [IntegerEntry(getPriceAddressKey(eventId, addressStr), price), IntegerEntry(getPricesListsCountKey(eventId), newListIndex), IntegerEntry(getPricesGroupsCountKey(eventId), newGroupsCount), StringEntry(getPricesListNKey(eventId, newListIndex), newPrices)]
290285 }
291286 }
292287
293288
294289
295290 @Callable(i)
296291 func resetList () = if (!(isAdmin(i.caller)))
297292 then throw("only admin can do")
298293 else [StringEntry(firstEventKey, undefined), StringEntry(lastEventKey, undefined), StringEntry(fisrtActiveEventKey, undefined), StringEntry(lastActiveEventKey, undefined), StringEntry(fisrtFinishedEventKey, undefined), StringEntry(lastFinishedEventKey, undefined)]
299294
300295
301296
302297 @Callable(i)
303298 func insertToList (eventId,isActive) = if ((this != i.caller))
304299 then throw("only main can do")
305300 else {
306301 let lastKey = if (isActive)
307302 then lastActiveEventKey
308303 else lastFinishedEventKey
309304 let firstKey = if (isActive)
310305 then fisrtActiveEventKey
311306 else fisrtFinishedEventKey
312307 let firstEvent = valueOrElse(getString(this, firstKey), undefined)
313308 let lastEvent = valueOrElse(getString(this, lastKey), undefined)
314309 let newLastOrPrevKey = if ((lastEvent == undefined))
315310 then lastKey
316311 else getPrevEventKey(firstEvent)
317312 [StringEntry(firstKey, eventId), StringEntry(newLastOrPrevKey, eventId), StringEntry(getNextEventKey(eventId), firstEvent)]
318313 }
319314
320315
321316
322317 @Callable(i)
323318 func deleteFromList (eventId,isActive) = if ((this != i.caller))
324319 then throw("only main can do")
325320 else {
326321 let lastKey = if (isActive)
327322 then lastActiveEventKey
328323 else lastFinishedEventKey
329324 let firstKey = if (isActive)
330325 then fisrtActiveEventKey
331326 else fisrtFinishedEventKey
332327 let firstEvent = valueOrElse(getString(this, firstKey), undefined)
333328 let lastEvent = valueOrElse(getString(this, lastKey), undefined)
334329 let prevEventTemp = valueOrElse(getString(this, getPrevEventKey(eventId)), undefined)
335330 let nextEventTemp = valueOrElse(getString(this, getNextEventKey(eventId)), undefined)
336331 let prevEvent = if ((eventId == firstEvent))
337332 then undefined
338333 else prevEventTemp
339334 let nextEvent = if ((eventId == lastEvent))
340335 then undefined
341336 else nextEventTemp
342337 if (if ((prevEvent == undefined))
343338 then (nextEvent == undefined)
344339 else false)
345340 then [StringEntry(firstKey, undefined), StringEntry(lastKey, undefined)]
346341 else if (if ((prevEvent != undefined))
347342 then (nextEvent != undefined)
348343 else false)
349344 then [StringEntry(getPrevEventKey(nextEvent), prevEvent), StringEntry(getNextEventKey(prevEvent), nextEvent)]
350345 else if ((prevEvent != undefined))
351346 then [StringEntry(lastKey, prevEvent), StringEntry(getNextEventKey(prevEvent), undefined)]
352347 else [StringEntry(firstKey, nextEvent), StringEntry(getPrevEventKey(nextEvent), undefined)]
353348 }
354349
355350
356351
357352 @Callable(i)
358353 func concatLists () = if (!(isAdmin(i.caller)))
359354 then throw("only admin can do")
360355 else {
361356 let firstActiveEvent = valueOrElse(getString(this, fisrtActiveEventKey), undefined)
362357 let lastActiveEvent = valueOrElse(getString(this, lastActiveEventKey), undefined)
363358 let firstFinishedEvent = valueOrElse(getString(this, fisrtFinishedEventKey), undefined)
364359 let lastFinishedEvent = valueOrElse(getString(this, lastFinishedEventKey), undefined)
365360 let firstEvent = if ((firstActiveEvent != undefined))
366361 then firstActiveEvent
367362 else firstFinishedEvent
368363 let lastEvent = if ((lastFinishedEvent != undefined))
369364 then lastFinishedEvent
370365 else lastActiveEvent
371366 if (if ((firstFinishedEvent != undefined))
372367 then (lastActiveEvent != undefined)
373368 else false)
374369 then [StringEntry(firstEventKey, firstEvent), StringEntry(lastEventKey, lastEvent), StringEntry(getNextEventKey(lastActiveEvent), firstFinishedEvent), StringEntry(getPrevEventKey(firstFinishedEvent), lastActiveEvent)]
375370 else [StringEntry(firstEventKey, firstEvent), StringEntry(lastEventKey, lastEvent)]
376371 }
377372
378373

github/deemru/w8io/c3f4982 
38.18 ms