tx · 3uBZC5nWpDSyeuRW1Q791TGYXA6m6tE7aBXb7ykGxep5

3NBwZbvD45CscLGF78qTaDRBZ7mDBHt3Yib:  -0.00900000 Waves

2022.08.26 07:00 [2200940] smart account 3NBwZbvD45CscLGF78qTaDRBZ7mDBHt3Yib > SELF 0.00000000 Waves

{ "type": 13, "id": "3uBZC5nWpDSyeuRW1Q791TGYXA6m6tE7aBXb7ykGxep5", "fee": 900000, "feeAssetId": null, "timestamp": 1661486428749, "version": 2, "chainId": 84, "sender": "3NBwZbvD45CscLGF78qTaDRBZ7mDBHt3Yib", "senderPublicKey": "3q3N8Kv49DbzNHyTB4A87UYz2DdquXCgP3GNCcD9Zj66", "proofs": [ "7pxj1uRjTdhUYzi4nottRH3gFLYvbTGcgm2cHWKz9Fy9DxRrDF7sW2DginTQLwwQmHtsSw37RSBfya7wozKdz6A" ], "script": "base64:BgI4CAISCgoICAgICAgBCAgSBAoCCAgSBAoCCAESBAoCCAgSBQoDCAgIEgQKAggIEgQKAgQIEgMKAQg3AAd2ZXJzaW9uAgMxLjAAC0NPTkZfSU5JVF9LAgtjb25maWdfaW5pdAALQ09ORl9BTUlOX0sCDGNvbmZpZ19hZG1pbgANQ09ORl9PUkFDTEVfSwINY29uZmlnX29yYWNsZQATQ09ORl9BUlRXT1JLX0RBUFBfSwITY29uZmlnX2FydHdvcmtfZGFwcAARQ09ORl9VU0VSU19EQVBQX0sCEWNvbmZpZ191c2Vyc19kYXBwABBDT05GX0ZFRV9BU1NFVF9LAhBjb25maWdfZmVlX2Fzc2V0ABFDT05GX0ZFRV9BTU9VTlRfSwIRY29uZmlnX2ZlZV9hbW91bnQAFUNPTkZfU1dPUF9TSUdOX0RBUFBfSwIVY29uZmlnX3N3b3Bfc2lnbl9kYXBwABRDT05GX1NXT1BfRVRIX0RBUFBfSwIUY29uZmlnX3N3b3BfZXRoX2RhcHAADWRhcHBSdW5uaW5nX0sCFGNvbmZfZGFwcF9pc19ydW5uaW5nABBtYWludGVuYW5jZU1TR19LAhRjb25mX21haW50ZW5hbmNlX21zZwALZGFwcFJ1bm5pbmcJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwUNZGFwcFJ1bm5pbmdfSwYADm1haW50ZW5hbmNlTVNHCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFEG1haW50ZW5hbmNlTVNHX0sCAAANc3RhdHVzX0xPQ0tFRAIGTE9DS0VEAA9zdGF0dXNfVU5MT0NLRUQCCFVOTE9DS0VEAA5zdGF0dXNfUEVORElORwIHUEVORElORwANc3RhdHVzX0NMT1NFRAIGQ0xPU0VEABFjcmVhdG9yUmVnaXN0ZXJlZAIKUkVHSVNURVJFRAAPY3JlYXRvclZlcmlmaWVkAghWRVJJRklFRAAKYXJ0RmxhZ2dlZAIHRkxBR0dFRAAKYXJ0SWxsZWdhbAIHSUxMRUdBTAAKYXJ0UGVuZGluZwIPQ0hBTkdFX1JFUVVJUkVEAAhORVRXT1JLUwkAzAgCAgNFVEgFA25pbAEMa2V5TkZUc3RhdHVzAQVuZnRJZAkArAICCQCsAgICBG5mdF8FBW5mdElkAgdfc3RhdHVzAQ5rZXlUcmFuc2Zlck5GVAMFbmZ0SWQEdHhpZAZjYWxsZXIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAgl0cmFuc2Zlcl8FBW5mdElkAgFfBQR0eGlkAgFfBQZjYWxsZXIAD2tleUZlZU5vbk1pbnRlZAIPY29zdF9ub25fbWludGVkAAxrZXlGZWVNaW50ZWQCC2Nvc3RfbWludGVkAQ5nZXRTdHJpbmdCeUtleQEDa2V5CQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFA2tleQIAAQ9nZXRJbnRlZ2VyQnlLZXkBA2tleQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQNrZXkAAAEPZ2V0Qm9vbGVhbkJ5S2V5AQNrZXkJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwUDa2V5BwAFYWRtaW4JAQV2YWx1ZQEJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQ5nZXRTdHJpbmdCeUtleQEFC0NPTkZfQU1JTl9LAAxhcnR3b3Jrc0RhcHAJAQV2YWx1ZQEJAKYIAQkBDmdldFN0cmluZ0J5S2V5AQUTQ09ORl9BUlRXT1JLX0RBUFBfSwAJdXNlcnNEYXBwCQEFdmFsdWUBCQCmCAEJAQ5nZXRTdHJpbmdCeUtleQEFEUNPTkZfVVNFUlNfREFQUF9LAApvcmFjbGVBZGRyCQEFdmFsdWUBCQCmCAEJAQ5nZXRTdHJpbmdCeUtleQEFDUNPTkZfT1JBQ0xFX0sAEGZlZUFjY2VwdGVkQXNzZXQJAQ5nZXRTdHJpbmdCeUtleQEFEENPTkZfRkVFX0FTU0VUX0sAGGZlZUFjY2VwdGVkQW1vdW50Rm9yU2lnbgkBD2dldEludGVnZXJCeUtleQEFEUNPTkZfRkVFX0FNT1VOVF9LARdnZXRTdHJpbmdGcm9tVXNlcnNCeUtleQEDa2V5CQELdmFsdWVPckVsc2UCCQCdCAIFCXVzZXJzRGFwcAUDa2V5AgABGmdldFN0cmluZ0Zyb21BcnR3b3Jrc0J5S2V5AQNrZXkJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUMYXJ0d29ya3NEYXBwBQNrZXkCAAEZZ2V0SW50ZWdlckJ5S2V5RnJvbU9yYWNsZQEDa2V5CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUKb3JhY2xlQWRkcgUDa2V5AhtJbnRlZ2VyIHVuZGVmaW5lZCBpbiBvcmFjbGUBDGFzc2V0SXNWYWxpZAEMYXNzZXREZXRhaWxzAwMDCQAAAggFDGFzc2V0RGV0YWlscwhxdWFudGl0eQABCQAAAggFDGFzc2V0RGV0YWlscwhkZWNpbWFscwAABwkAAAIIBQxhc3NldERldGFpbHMKcmVpc3N1YWJsZQcHCQAAAggFDGFzc2V0RGV0YWlscwZpc3N1ZXIFDGFydHdvcmtzRGFwcAcBDGlzU2lnbkFydE5GVAECaWQEDGFzc2V0RGV0YWlscwkBBXZhbHVlAQkA7AcBBQJpZAkBDGFzc2V0SXNWYWxpZAEFDGFzc2V0RGV0YWlscwEJaXNQYXltZW50AQFpAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwACCQACAQIZTmVlZCB0byBhdHRhY2ggMiBwYXltZW50cwQLbmZ0X3BheW1lbnQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAQKbmZ0X2Ftb3VudAkBBXZhbHVlAQgFC25mdF9wYXltZW50BmFtb3VudAQPZ2F0ZXdheV9wYXltZW50CQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAEEDmdhdGV3YXlfYW1vdW50CQEFdmFsdWUBCAUPZ2F0ZXdheV9wYXltZW50BmFtb3VudAkAlgoEBQtuZnRfcGF5bWVudAUKbmZ0X2Ftb3VudAUPZ2F0ZXdheV9wYXltZW50BQ5nYXRld2F5X2Ftb3VudAAGaXNJbml0CQELdmFsdWVPckVsc2UCCQEPZ2V0Qm9vbGVhbkJ5S2V5AQULQ09ORl9JTklUX0sHAQlvd25lck9ubHkBAWkEBmNhbGxlcgkApQgBCAUBaQZjYWxsZXIEAmlkCQDYBAEIBQFpDXRyYW5zYWN0aW9uSWQECmFsbG93ZWRBcnIDBQZpc0luaXQJAMwIAgkApQgBBQVhZG1pbgkAzAgCCQClCAEFBHRoaXMFA25pbAkAzAgCCQClCAEFBHRoaXMFA25pbAkBD2NvbnRhaW5zRWxlbWVudAIFCmFsbG93ZWRBcnIFBmNhbGxlcgEMaWRDYWxsZXJEYXRlAQFpAwkBASEBBQtkYXBwUnVubmluZwkAAgEFDm1haW50ZW5hbmNlTVNHCQCVCgMJANgEAQgFAWkNdHJhbnNhY3Rpb25JZAkA2AQBCAgFAWkGY2FsbGVyBWJ5dGVzCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAETZ2V0Q3JlYXRvckZyb21ORlRpZAEFbmZ0aWQEB25mdERhdGEJARpnZXRTdHJpbmdGcm9tQXJ0d29ya3NCeUtleQEJAKwCAgIEbmZ0XwUFbmZ0aWQEB2NyZWF0b3IJAJEDAgkAtQkCBQduZnREYXRhAgFfAAYEBWFydElkCQCRAwIJALUJAgUHbmZ0RGF0YQIBXwAFCQCUCgIFB2NyZWF0b3IFBWFydElkARNnZXRDcmVhdG9yRVJDMjBBZGRyAQRhZGRyCQEXZ2V0U3RyaW5nRnJvbVVzZXJzQnlLZXkBCQCsAgICC3VzZXJfRVJDMjBfBQRhZGRyARBnZXRDcmVhdG9yU3RhdHVzAQRhZGRyCQEXZ2V0U3RyaW5nRnJvbVVzZXJzQnlLZXkBCQCsAgICDHVzZXJfc3RhdHVzXwUEYWRkcgEMZ2V0QXJ0U3RhdHVzAgVhcnRJZARhZGRyCQEaZ2V0U3RyaW5nRnJvbUFydHdvcmtzQnlLZXkBCQCsAgIJAKwCAgkArAICAglhcnRfZmxhZ18FBWFydElkAgFfBQRhZGRyAQ5pc1ZhbGlkQ3JlYXRvcgEGc3RhdHVzAwkAAAIFBnN0YXR1cwURY3JlYXRvclJlZ2lzdGVyZWQGCQAAAgUGc3RhdHVzBQ9jcmVhdG9yVmVyaWZpZWQBCmlzVmFsaWRBcnQBBnN0YXR1cwMDCQECIT0CBQZzdGF0dXMFCmFydEZsYWdnZWQJAQIhPQIFBnN0YXR1cwUKYXJ0SWxsZWdhbAcJAQIhPQIFBnN0YXR1cwUKYXJ0UGVuZGluZwcBDGlzRXZtQWRkcmVzcwEEYWRkcgMJAAACCQCxAgEFBGFkZHIAKgkAAAIJAK8CAgUEYWRkcgACAgIweAcBEHNldFN3b3BEYXBwc0Z1bmMCCHNpZ25EYXBwB2V0aERhcHAJAMwIAgkBC1N0cmluZ0VudHJ5AgUVQ09ORl9TV09QX1NJR05fREFQUF9LBQhzaWduRGFwcAkAzAgCCQELU3RyaW5nRW50cnkCBRRDT05GX1NXT1BfRVRIX0RBUFBfSwUHZXRoRGFwcAUDbmlsAQpzZXRGZWVGdW5jAghmZWVBc3NldAlmZWVBbW91bnQEDGFzc2V0RGV0YWlscwkA7AcBCQDZBAEFCGZlZUFzc2V0BAdkZWNpbWFsCAkBBXZhbHVlAQUMYXNzZXREZXRhaWxzCGRlY2ltYWxzBA9iYXNlMTBGZWVBbW91bnQJAGwGBQlmZWVBbW91bnQAAAAKAAEFB2RlY2ltYWwFBkhBTEZVUAkAzAgCCQELU3RyaW5nRW50cnkCBRBDT05GX0ZFRV9BU1NFVF9LBQhmZWVBc3NldAkAzAgCCQEMSW50ZWdlckVudHJ5AgURQ09ORl9GRUVfQU1PVU5UX0sFD2Jhc2UxMEZlZUFtb3VudAUDbmlsCAFpAQRpbml0CAlhZG1pbkFkZHIKb3JhY2xlQWRkcgxhcnR3b3Jrc0RhcHAJdXNlcnNEYXBwCGZlZUFzc2V0CWZlZUFtb3VudAhzaWduRGFwcAdldGhEYXBwAwkBCW93bmVyT25seQEFAWkEDHNldFN3b3BEYXBwcwkBEHNldFN3b3BEYXBwc0Z1bmMCBQhzaWduRGFwcAUHZXRoRGFwcAQGc2V0RmVlCQEKc2V0RmVlRnVuYwIFCGZlZUFzc2V0BQlmZWVBbW91bnQJAM4IAgkAzggCCQDMCAIJAQtTdHJpbmdFbnRyeQIFC0NPTkZfQU1JTl9LBQlhZG1pbkFkZHIJAMwIAgkBC1N0cmluZ0VudHJ5AgUNQ09ORl9PUkFDTEVfSwUKb3JhY2xlQWRkcgkAzAgCCQELU3RyaW5nRW50cnkCBRNDT05GX0FSVFdPUktfREFQUF9LBQxhcnR3b3Jrc0RhcHAJAMwIAgkBC1N0cmluZ0VudHJ5AgURQ09ORl9VU0VSU19EQVBQX0sFCXVzZXJzRGFwcAkAzAgCCQEMQm9vbGVhbkVudHJ5AgULQ09ORl9JTklUX0sGBQNuaWwFDHNldFN3b3BEYXBwcwUGc2V0RmVlCQACAQILTm90IGFsbG93ZWQBaQEMc2V0U3dvcERhcHBzAghzaWduRGFwcAdldGhEYXBwAwkBCW93bmVyT25seQEFAWkJARBzZXRTd29wRGFwcHNGdW5jAgUIc2lnbkRhcHAFB2V0aERhcHAJAAIBAgtOb3QgYWxsb3dlZAFpAQZzZXRGZWUCCGZlZUFzc2V0CWZlZUFtb3VudAMJAQlvd25lck9ubHkBBQFpCQEKc2V0RmVlRnVuYwIFCGZlZUFzc2V0BQlmZWVBbW91bnQJAAIBAgtOb3QgYWxsb3dlZAFpAQRsb2NrAglyZWNpcGllbnQHbmV0d29yawMJAQEhAQUGaXNJbml0CQACAQIOZEFwcCBub3QgcmVhZHkDCQEBIQEJAQ9jb250YWluc0VsZW1lbnQCBQhORVRXT1JLUwUHbmV0d29yawkAAgECFU5ldHdvcmsgbm90IHN1cHBvcnRlZAMJAQEhAQkBDGlzRXZtQWRkcmVzcwEFCXJlY2lwaWVudAkAAgECF1dyb25nIHJlY2lwaWVudCBhZGRyZXNzBAskdDA2MDc3NjExNgkBDGlkQ2FsbGVyRGF0ZQEFAWkEAmlkCAULJHQwNjA3NzYxMTYCXzEEBmNhbGxlcggFCyR0MDYwNzc2MTE2Al8yBARkYXRlCAULJHQwNjA3NzYxMTYCXzMECyR0MDYxMTk2MTk2CQEJaXNQYXltZW50AQUBaQQLbmZ0X3BheW1lbnQIBQskdDA2MTE5NjE5NgJfMQQKbmZ0X2Ftb3VudAgFCyR0MDYxMTk2MTk2Al8yBA9nYXRld2F5X3BheW1lbnQIBQskdDA2MTE5NjE5NgJfMwQOZ2F0ZXdheV9hbW91bnQIBQskdDA2MTE5NjE5NgJfNAMJAQIhPQIFCm5mdF9hbW91bnQAAQkAAgECD05vIE5GVCBhdHRhY2hlZAQFbmZ0SWQDAwkBCWlzRGVmaW5lZAEIBQtuZnRfcGF5bWVudAdhc3NldElkCQEMaXNTaWduQXJ0TkZUAQkBBXZhbHVlAQgFC25mdF9wYXltZW50B2Fzc2V0SWQHCQDYBAEJAQV2YWx1ZQEIBQtuZnRfcGF5bWVudAdhc3NldElkCQACAQIbT25seSBTSUdOIEFydCBORlQgYWNjZXB0ZWQuBAskdDA2NDgzNjU2NQkBE2dldENyZWF0b3JGcm9tTkZUaWQBBQVuZnRJZAQHY3JlYXRvcggFCyR0MDY0ODM2NTY1Al8xBAVhcnRJZAgFCyR0MDY0ODM2NTY1Al8yAwkBASEBCQEOaXNWYWxpZENyZWF0b3IBCQEQZ2V0Q3JlYXRvclN0YXR1cwEFB2NyZWF0b3IJAAIBCQCsAgICE0NyZWF0b3Igc3RhdHVzIGlzIDoJARBnZXRDcmVhdG9yU3RhdHVzAQUHY3JlYXRvcgMJAQEhAQkBCmlzVmFsaWRBcnQBCQEMZ2V0QXJ0U3RhdHVzAgUFYXJ0SWQFB2NyZWF0b3IJAAIBCQCsAgICE0FydHdvcmsgc3RhdHVzIGlzIDoJAQxnZXRBcnRTdGF0dXMCBQVhcnRJZAUHY3JlYXRvcgQJZXJjMjBBZGRyCQETZ2V0Q3JlYXRvckVSQzIwQWRkcgEFB2NyZWF0b3IDCQAAAgkAsQIBBQllcmMyMEFkZHIAAAkAAgECLFRoaXMgYXJ0aXN0IGRpZG4ndCBhbGxvdyBjcm9zc2NoYWluIHRyYW5zZmVyBAluZnRTdGF0dXMJAQ5nZXRTdHJpbmdCeUtleQEJAQxrZXlORlRzdGF0dXMBBQVuZnRJZAMDCQAAAgUJbmZ0U3RhdHVzBQ1zdGF0dXNfTE9DS0VEBgkAAAIFCW5mdFN0YXR1cwUOc3RhdHVzX1BFTkRJTkcJAAIBAhJORlQgYWxyZWFkeSBsb2NrZWQED2dhc0ZlZU5vbk1pbnRlZAkBGWdldEludGVnZXJCeUtleUZyb21PcmFjbGUBBQ9rZXlGZWVOb25NaW50ZWQEDGdhc0ZlZU1pbnRlZAkBGWdldEludGVnZXJCeUtleUZyb21PcmFjbGUBBQxrZXlGZWVNaW50ZWQECGlzTWludGVkAwkAAAIFCW5mdFN0YXR1cwUPc3RhdHVzX1VOTE9DS0VEBgcDAwkBASEBCQEJaXNEZWZpbmVkAQgFD2dhdGV3YXlfcGF5bWVudAdhc3NldElkBgkBAiE9AgkA2AQBCQEFdmFsdWUBCAUPZ2F0ZXdheV9wYXltZW50B2Fzc2V0SWQFEGZlZUFjY2VwdGVkQXNzZXQJAAIBAhNXcm9uZyBwYXltZW50IGFzc2V0AwMFCGlzTWludGVkCQBmAgUOZ2F0ZXdheV9hbW91bnQJAGQCBQxnYXNGZWVNaW50ZWQFGGZlZUFjY2VwdGVkQW1vdW50Rm9yU2lnbgcJAAIBAh5Xcm9uZyBwYXltZW50IGFtb3VudCB0byB1bmxvY2sDAwkBASEBBQhpc01pbnRlZAkAZgIFDmdhdGV3YXlfYW1vdW50CQBkAgUPZ2FzRmVlTm9uTWludGVkBRhmZWVBY2NlcHRlZEFtb3VudEZvclNpZ24HCQACAQInV3JvbmcgcGF5bWVudCBhbW91bnQgdG8gbWludCBhbmQgdW5sb2NrBBB1c2RuVG9Td2FwRm9yRXRoAwUIaXNNaW50ZWQFDGdhc0ZlZU1pbnRlZAUPZ2FzRmVlTm9uTWludGVkBBFzd2FwX3VzZG5fdG9fc2lnbgkA/AcECQERQGV4dHJOYXRpdmUoMTA2MikBCQEOZ2V0U3RyaW5nQnlLZXkBBRVDT05GX1NXT1BfU0lHTl9EQVBQX0sCCGV4Y2hhbmdlCQDMCAIAAQUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQDZBAEFEGZlZUFjY2VwdGVkQXNzZXQFGGZlZUFjY2VwdGVkQW1vdW50Rm9yU2lnbgUDbmlsAwkAAAIFEXN3YXBfdXNkbl90b19zaWduBRFzd2FwX3VzZG5fdG9fc2lnbgQQc3dhcF91c2RuX3RvX2V0aAkA/AcECQERQGV4dHJOYXRpdmUoMTA2MikBCQEOZ2V0U3RyaW5nQnlLZXkBBRRDT05GX1NXT1BfRVRIX0RBUFBfSwIIZXhjaGFuZ2UJAMwIAgABBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJANkEAQUQZmVlQWNjZXB0ZWRBc3NldAUQdXNkblRvU3dhcEZvckV0aAUDbmlsAwkAAAIFEHN3YXBfdXNkbl90b19ldGgFEHN3YXBfdXNkbl90b19ldGgJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDGtleU5GVHN0YXR1cwEFBW5mdElkBQ5zdGF0dXNfUEVORElORwkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkBDmtleVRyYW5zZmVyTkZUAwUFbmZ0SWQFAmlkBQZjYWxsZXICAV8FDnN0YXR1c19QRU5ESU5HCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQlyZWNpcGllbnQCAV8FB25ldHdvcmsCAV8FBmNhbGxlcgIBXwUCaWQCAV8ICQEFdmFsdWUBCQDsBwEJAQV2YWx1ZQEIBQtuZnRfcGF5bWVudAdhc3NldElkBG5hbWUCAV8JAKQDAQUEZGF0ZQIBXwkApAMBBQZoZWlnaHQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQtjb25maXJtTG9jawMFbmZ0SWQKdHJhbnNmZXJJZAZjYWxsZXIDCQEBIQEFBmlzSW5pdAkAAgECDmRBcHAgbm90IHJlYWR5AwkBCW93bmVyT25seQEFAWkECW5mdFN0YXR1cwkBDmdldFN0cmluZ0J5S2V5AQkBDGtleU5GVHN0YXR1cwEFBW5mdElkAwkBAiE9AgUJbmZ0U3RhdHVzBQ5zdGF0dXNfUEVORElORwkAAgECD05GVCBub3QgcGVuZGluZwQDdmFsCQEOZ2V0U3RyaW5nQnlLZXkBCQCsAgIJAKwCAgkBDmtleVRyYW5zZmVyTkZUAwUFbmZ0SWQFCnRyYW5zZmVySWQFBmNhbGxlcgIBXwUOc3RhdHVzX1BFTkRJTkcEBm5ld0tleQkArAICCQCsAgIJAQ5rZXlUcmFuc2Zlck5GVAMFBW5mdElkBQp0cmFuc2ZlcklkBQZjYWxsZXICAV8FDXN0YXR1c19DTE9TRUQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgIJAQ5rZXlUcmFuc2Zlck5GVAMFBW5mdElkBQp0cmFuc2ZlcklkBQZjYWxsZXICAV8FDnN0YXR1c19QRU5ESU5HCQDMCAIJAQtTdHJpbmdFbnRyeQIFBm5ld0tleQUDdmFsCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQxrZXlORlRzdGF0dXMBBQVuZnRJZAUNc3RhdHVzX0xPQ0tFRAUDbmlsCQACAQILTm90IGFsbG93ZWQBaQEGdW5sb2NrAglyZWNpcGllbnQFbmZ0SWQDCQEBIQEFBmlzSW5pdAkAAgECDmRBcHAgbm90IHJlYWR5AwkBCW93bmVyT25seQEFAWkECW5mdFN0YXR1cwkBDmdldFN0cmluZ0J5S2V5AQkBDGtleU5GVHN0YXR1cwEFBW5mdElkAwkBAiE9AgUJbmZ0U3RhdHVzBQ1zdGF0dXNfTE9DS0VECQACAQIpTkZUIG5vdCBsb2NrZWQsIGZpbmFsaXplIGZpcnN0IGlmIHBlbmRpbmcJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDGtleU5GVHN0YXR1cwEFBW5mdElkBQ9zdGF0dXNfVU5MT0NLRUQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFCXJlY2lwaWVudAABCQDZBAEFBW5mdElkBQNuaWwJAAIBAgtOb3QgYWxsb3dlZAFpAQphcHBSdW5uaW5nAgZpc0xpdmUHbWVzc2FnZQMJAQEhAQUGaXNJbml0CQACAQIOZEFwcCBub3QgcmVhZHkDCQEJb3duZXJPbmx5AQUBaQkAzAgCCQEMQm9vbGVhbkVudHJ5AgUNZGFwcFJ1bm5pbmdfSwUGaXNMaXZlCQDMCAIJAQtTdHJpbmdFbnRyeQIFEG1haW50ZW5hbmNlTVNHX0sFB21lc3NhZ2UFA25pbAkAAgECIllvdSBhcmUgbm90IGFsbG93ZWQgdG8gY2hhbmdlIHRoaXMBaQELZGVsZXRlRW50cnkBBWVudHJ5AwkBCW93bmVyT25seQEFAWkJAMwIAgkBC0RlbGV0ZUVudHJ5AQUFZW50cnkFA25pbAkAAgECAm5vAGQl9P4=", "height": 2200940, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: E5NQp91UsMqu9FYcXGTLnWV9eepSceM5XKumPAH5cgMs Next: 2MBpJFiBayanqWMKJAbd5PozsxAJA2kqGJ7gqh2VrBNh Diff:
OldNewDifferences
5252 func keyNFTstatus (nftId) = (("nft_" + nftId) + "_status")
5353
5454
55-func keyTransferNFT (nftId,txid) = ((("transfer_" + nftId) + "_") + txid)
55+func keyTransferNFT (nftId,txid,caller) = ((((("transfer_" + nftId) + "_") + txid) + "_") + caller)
5656
5757
5858 let keyFeeNonMinted = "cost_non_minted"
210210 else if (!(isEvmAddress(recipient)))
211211 then throw("Wrong recipient address")
212212 else {
213- let $t060506089 = idCallerDate(i)
214- let id = $t060506089._1
215- let caller = $t060506089._2
216- let date = $t060506089._3
217- let $t060926169 = isPayment(i)
218- let nft_payment = $t060926169._1
219- let nft_amount = $t060926169._2
220- let gateway_payment = $t060926169._3
221- let gateway_amount = $t060926169._4
213+ let $t060776116 = idCallerDate(i)
214+ let id = $t060776116._1
215+ let caller = $t060776116._2
216+ let date = $t060776116._3
217+ let $t061196196 = isPayment(i)
218+ let nft_payment = $t061196196._1
219+ let nft_amount = $t061196196._2
220+ let gateway_payment = $t061196196._3
221+ let gateway_amount = $t061196196._4
222222 if ((nft_amount != 1))
223223 then throw("No NFT attached")
224224 else {
227227 else false)
228228 then toBase58String(value(nft_payment.assetId))
229229 else throw("Only SIGN Art NFT accepted.")
230- let $t064566538 = getCreatorFromNFTid(nftId)
231- let creator = $t064566538._1
232- let artId = $t064566538._2
230+ let $t064836565 = getCreatorFromNFTid(nftId)
231+ let creator = $t064836565._1
232+ let artId = $t064836565._2
233233 if (!(isValidCreator(getCreatorStatus(creator))))
234234 then throw(("Creator status is :" + getCreatorStatus(creator)))
235235 else if (!(isValidArt(getArtStatus(artId, creator))))
271271 then {
272272 let swap_usdn_to_eth = invoke(addressFromStringValue(getStringByKey(CONF_SWOP_ETH_DAPP_K)), "exchange", [1], [AttachedPayment(fromBase58String(feeAcceptedAsset), usdnToSwapForEth)])
273273 if ((swap_usdn_to_eth == swap_usdn_to_eth))
274- then [StringEntry(keyNFTstatus(nftId), status_PENDING), StringEntry(((keyTransferNFT(nftId, id) + "_") + status_PENDING), ((((((((((((recipient + "_") + network) + "_") + caller) + "_") + id) + "_") + value(assetInfo(value(nft_payment.assetId))).name) + "_") + toString(date)) + "_") + toString(height)))]
274+ then [StringEntry(keyNFTstatus(nftId), status_PENDING), StringEntry(((keyTransferNFT(nftId, id, caller) + "_") + status_PENDING), ((((((((((((recipient + "_") + network) + "_") + caller) + "_") + id) + "_") + value(assetInfo(value(nft_payment.assetId))).name) + "_") + toString(date)) + "_") + toString(height)))]
275275 else throw("Strict value is not equal to itself.")
276276 }
277277 else throw("Strict value is not equal to itself.")
285285
286286
287287 @Callable(i)
288-func confirmLock (nftId,transferId) = if (!(isInit))
288+func confirmLock (nftId,transferId,caller) = if (!(isInit))
289289 then throw("dApp not ready")
290290 else if (ownerOnly(i))
291291 then {
293293 if ((nftStatus != status_PENDING))
294294 then throw("NFT not pending")
295295 else {
296- let val = getStringByKey(((keyTransferNFT(nftId, transferId) + "_") + status_PENDING))
297- let newKey = ((keyTransferNFT(nftId, transferId) + "_") + status_CLOSED)
298-[DeleteEntry(((keyTransferNFT(nftId, transferId) + "_") + status_PENDING)), StringEntry(newKey, val), StringEntry(keyNFTstatus(nftId), status_LOCKED)]
296+ let val = getStringByKey(((keyTransferNFT(nftId, transferId, caller) + "_") + status_PENDING))
297+ let newKey = ((keyTransferNFT(nftId, transferId, caller) + "_") + status_CLOSED)
298+[DeleteEntry(((keyTransferNFT(nftId, transferId, caller) + "_") + status_PENDING)), StringEntry(newKey, val), StringEntry(keyNFTstatus(nftId), status_LOCKED)]
299299 }
300300 }
301301 else throw("Not allowed")
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let version = "1.0"
55
66 let CONF_INIT_K = "config_init"
77
88 let CONF_AMIN_K = "config_admin"
99
1010 let CONF_ORACLE_K = "config_oracle"
1111
1212 let CONF_ARTWORK_DAPP_K = "config_artwork_dapp"
1313
1414 let CONF_USERS_DAPP_K = "config_users_dapp"
1515
1616 let CONF_FEE_ASSET_K = "config_fee_asset"
1717
1818 let CONF_FEE_AMOUNT_K = "config_fee_amount"
1919
2020 let CONF_SWOP_SIGN_DAPP_K = "config_swop_sign_dapp"
2121
2222 let CONF_SWOP_ETH_DAPP_K = "config_swop_eth_dapp"
2323
2424 let dappRunning_K = "conf_dapp_is_running"
2525
2626 let maintenanceMSG_K = "conf_maintenance_msg"
2727
2828 let dappRunning = valueOrElse(getBoolean(this, dappRunning_K), true)
2929
3030 let maintenanceMSG = valueOrElse(getString(this, maintenanceMSG_K), "")
3131
3232 let status_LOCKED = "LOCKED"
3333
3434 let status_UNLOCKED = "UNLOCKED"
3535
3636 let status_PENDING = "PENDING"
3737
3838 let status_CLOSED = "CLOSED"
3939
4040 let creatorRegistered = "REGISTERED"
4141
4242 let creatorVerified = "VERIFIED"
4343
4444 let artFlagged = "FLAGGED"
4545
4646 let artIllegal = "ILLEGAL"
4747
4848 let artPending = "CHANGE_REQUIRED"
4949
5050 let NETWORKS = ["ETH"]
5151
5252 func keyNFTstatus (nftId) = (("nft_" + nftId) + "_status")
5353
5454
55-func keyTransferNFT (nftId,txid) = ((("transfer_" + nftId) + "_") + txid)
55+func keyTransferNFT (nftId,txid,caller) = ((((("transfer_" + nftId) + "_") + txid) + "_") + caller)
5656
5757
5858 let keyFeeNonMinted = "cost_non_minted"
5959
6060 let keyFeeMinted = "cost_minted"
6161
6262 func getStringByKey (key) = valueOrElse(getString(this, key), "")
6363
6464
6565 func getIntegerByKey (key) = valueOrElse(getInteger(this, key), 0)
6666
6767
6868 func getBooleanByKey (key) = valueOrElse(getBoolean(this, key), false)
6969
7070
7171 let admin = value(addressFromStringValue(getStringByKey(CONF_AMIN_K)))
7272
7373 let artworksDapp = value(addressFromString(getStringByKey(CONF_ARTWORK_DAPP_K)))
7474
7575 let usersDapp = value(addressFromString(getStringByKey(CONF_USERS_DAPP_K)))
7676
7777 let oracleAddr = value(addressFromString(getStringByKey(CONF_ORACLE_K)))
7878
7979 let feeAcceptedAsset = getStringByKey(CONF_FEE_ASSET_K)
8080
8181 let feeAcceptedAmountForSign = getIntegerByKey(CONF_FEE_AMOUNT_K)
8282
8383 func getStringFromUsersByKey (key) = valueOrElse(getString(usersDapp, key), "")
8484
8585
8686 func getStringFromArtworksByKey (key) = valueOrElse(getString(artworksDapp, key), "")
8787
8888
8989 func getIntegerByKeyFromOracle (key) = valueOrErrorMessage(getInteger(oracleAddr, key), "Integer undefined in oracle")
9090
9191
9292 func assetIsValid (assetDetails) = if (if (if ((assetDetails.quantity == 1))
9393 then (assetDetails.decimals == 0)
9494 else false)
9595 then (assetDetails.reissuable == false)
9696 else false)
9797 then (assetDetails.issuer == artworksDapp)
9898 else false
9999
100100
101101 func isSignArtNFT (id) = {
102102 let assetDetails = value(assetInfo(id))
103103 assetIsValid(assetDetails)
104104 }
105105
106106
107107 func isPayment (i) = if ((size(i.payments) != 2))
108108 then throw("Need to attach 2 payments")
109109 else {
110110 let nft_payment = value(i.payments[0])
111111 let nft_amount = value(nft_payment.amount)
112112 let gateway_payment = value(i.payments[1])
113113 let gateway_amount = value(gateway_payment.amount)
114114 $Tuple4(nft_payment, nft_amount, gateway_payment, gateway_amount)
115115 }
116116
117117
118118 let isInit = valueOrElse(getBooleanByKey(CONF_INIT_K), false)
119119
120120 func ownerOnly (i) = {
121121 let caller = toString(i.caller)
122122 let id = toBase58String(i.transactionId)
123123 let allowedArr = if (isInit)
124124 then [toString(admin), toString(this)]
125125 else [toString(this)]
126126 containsElement(allowedArr, caller)
127127 }
128128
129129
130130 func idCallerDate (i) = if (!(dappRunning))
131131 then throw(maintenanceMSG)
132132 else $Tuple3(toBase58String(i.transactionId), toBase58String(i.caller.bytes), lastBlock.timestamp)
133133
134134
135135 func getCreatorFromNFTid (nftid) = {
136136 let nftData = getStringFromArtworksByKey(("nft_" + nftid))
137137 let creator = split(nftData, "_")[6]
138138 let artId = split(nftData, "_")[5]
139139 $Tuple2(creator, artId)
140140 }
141141
142142
143143 func getCreatorERC20Addr (addr) = getStringFromUsersByKey(("user_ERC20_" + addr))
144144
145145
146146 func getCreatorStatus (addr) = getStringFromUsersByKey(("user_status_" + addr))
147147
148148
149149 func getArtStatus (artId,addr) = getStringFromArtworksByKey(((("art_flag_" + artId) + "_") + addr))
150150
151151
152152 func isValidCreator (status) = if ((status == creatorRegistered))
153153 then true
154154 else (status == creatorVerified)
155155
156156
157157 func isValidArt (status) = if (if ((status != artFlagged))
158158 then (status != artIllegal)
159159 else false)
160160 then (status != artPending)
161161 else false
162162
163163
164164 func isEvmAddress (addr) = if ((size(addr) == 42))
165165 then (take(addr, 2) == "0x")
166166 else false
167167
168168
169169 func setSwopDappsFunc (signDapp,ethDapp) = [StringEntry(CONF_SWOP_SIGN_DAPP_K, signDapp), StringEntry(CONF_SWOP_ETH_DAPP_K, ethDapp)]
170170
171171
172172 func setFeeFunc (feeAsset,feeAmount) = {
173173 let assetDetails = assetInfo(fromBase58String(feeAsset))
174174 let decimal = value(assetDetails).decimals
175175 let base10FeeAmount = pow(feeAmount, 0, 10, 1, decimal, HALFUP)
176176 [StringEntry(CONF_FEE_ASSET_K, feeAsset), IntegerEntry(CONF_FEE_AMOUNT_K, base10FeeAmount)]
177177 }
178178
179179
180180 @Callable(i)
181181 func init (adminAddr,oracleAddr,artworksDapp,usersDapp,feeAsset,feeAmount,signDapp,ethDapp) = if (ownerOnly(i))
182182 then {
183183 let setSwopDapps = setSwopDappsFunc(signDapp, ethDapp)
184184 let setFee = setFeeFunc(feeAsset, feeAmount)
185185 (([StringEntry(CONF_AMIN_K, adminAddr), StringEntry(CONF_ORACLE_K, oracleAddr), StringEntry(CONF_ARTWORK_DAPP_K, artworksDapp), StringEntry(CONF_USERS_DAPP_K, usersDapp), BooleanEntry(CONF_INIT_K, true)] ++ setSwopDapps) ++ setFee)
186186 }
187187 else throw("Not allowed")
188188
189189
190190
191191 @Callable(i)
192192 func setSwopDapps (signDapp,ethDapp) = if (ownerOnly(i))
193193 then setSwopDappsFunc(signDapp, ethDapp)
194194 else throw("Not allowed")
195195
196196
197197
198198 @Callable(i)
199199 func setFee (feeAsset,feeAmount) = if (ownerOnly(i))
200200 then setFeeFunc(feeAsset, feeAmount)
201201 else throw("Not allowed")
202202
203203
204204
205205 @Callable(i)
206206 func lock (recipient,network) = if (!(isInit))
207207 then throw("dApp not ready")
208208 else if (!(containsElement(NETWORKS, network)))
209209 then throw("Network not supported")
210210 else if (!(isEvmAddress(recipient)))
211211 then throw("Wrong recipient address")
212212 else {
213- let $t060506089 = idCallerDate(i)
214- let id = $t060506089._1
215- let caller = $t060506089._2
216- let date = $t060506089._3
217- let $t060926169 = isPayment(i)
218- let nft_payment = $t060926169._1
219- let nft_amount = $t060926169._2
220- let gateway_payment = $t060926169._3
221- let gateway_amount = $t060926169._4
213+ let $t060776116 = idCallerDate(i)
214+ let id = $t060776116._1
215+ let caller = $t060776116._2
216+ let date = $t060776116._3
217+ let $t061196196 = isPayment(i)
218+ let nft_payment = $t061196196._1
219+ let nft_amount = $t061196196._2
220+ let gateway_payment = $t061196196._3
221+ let gateway_amount = $t061196196._4
222222 if ((nft_amount != 1))
223223 then throw("No NFT attached")
224224 else {
225225 let nftId = if (if (isDefined(nft_payment.assetId))
226226 then isSignArtNFT(value(nft_payment.assetId))
227227 else false)
228228 then toBase58String(value(nft_payment.assetId))
229229 else throw("Only SIGN Art NFT accepted.")
230- let $t064566538 = getCreatorFromNFTid(nftId)
231- let creator = $t064566538._1
232- let artId = $t064566538._2
230+ let $t064836565 = getCreatorFromNFTid(nftId)
231+ let creator = $t064836565._1
232+ let artId = $t064836565._2
233233 if (!(isValidCreator(getCreatorStatus(creator))))
234234 then throw(("Creator status is :" + getCreatorStatus(creator)))
235235 else if (!(isValidArt(getArtStatus(artId, creator))))
236236 then throw(("Artwork status is :" + getArtStatus(artId, creator)))
237237 else {
238238 let erc20Addr = getCreatorERC20Addr(creator)
239239 if ((size(erc20Addr) == 0))
240240 then throw("This artist didn't allow crosschain transfer")
241241 else {
242242 let nftStatus = getStringByKey(keyNFTstatus(nftId))
243243 if (if ((nftStatus == status_LOCKED))
244244 then true
245245 else (nftStatus == status_PENDING))
246246 then throw("NFT already locked")
247247 else {
248248 let gasFeeNonMinted = getIntegerByKeyFromOracle(keyFeeNonMinted)
249249 let gasFeeMinted = getIntegerByKeyFromOracle(keyFeeMinted)
250250 let isMinted = if ((nftStatus == status_UNLOCKED))
251251 then true
252252 else false
253253 if (if (!(isDefined(gateway_payment.assetId)))
254254 then true
255255 else (toBase58String(value(gateway_payment.assetId)) != feeAcceptedAsset))
256256 then throw("Wrong payment asset")
257257 else if (if (isMinted)
258258 then (gateway_amount > (gasFeeMinted + feeAcceptedAmountForSign))
259259 else false)
260260 then throw("Wrong payment amount to unlock")
261261 else if (if (!(isMinted))
262262 then (gateway_amount > (gasFeeNonMinted + feeAcceptedAmountForSign))
263263 else false)
264264 then throw("Wrong payment amount to mint and unlock")
265265 else {
266266 let usdnToSwapForEth = if (isMinted)
267267 then gasFeeMinted
268268 else gasFeeNonMinted
269269 let swap_usdn_to_sign = invoke(addressFromStringValue(getStringByKey(CONF_SWOP_SIGN_DAPP_K)), "exchange", [1], [AttachedPayment(fromBase58String(feeAcceptedAsset), feeAcceptedAmountForSign)])
270270 if ((swap_usdn_to_sign == swap_usdn_to_sign))
271271 then {
272272 let swap_usdn_to_eth = invoke(addressFromStringValue(getStringByKey(CONF_SWOP_ETH_DAPP_K)), "exchange", [1], [AttachedPayment(fromBase58String(feeAcceptedAsset), usdnToSwapForEth)])
273273 if ((swap_usdn_to_eth == swap_usdn_to_eth))
274- then [StringEntry(keyNFTstatus(nftId), status_PENDING), StringEntry(((keyTransferNFT(nftId, id) + "_") + status_PENDING), ((((((((((((recipient + "_") + network) + "_") + caller) + "_") + id) + "_") + value(assetInfo(value(nft_payment.assetId))).name) + "_") + toString(date)) + "_") + toString(height)))]
274+ then [StringEntry(keyNFTstatus(nftId), status_PENDING), StringEntry(((keyTransferNFT(nftId, id, caller) + "_") + status_PENDING), ((((((((((((recipient + "_") + network) + "_") + caller) + "_") + id) + "_") + value(assetInfo(value(nft_payment.assetId))).name) + "_") + toString(date)) + "_") + toString(height)))]
275275 else throw("Strict value is not equal to itself.")
276276 }
277277 else throw("Strict value is not equal to itself.")
278278 }
279279 }
280280 }
281281 }
282282 }
283283 }
284284
285285
286286
287287 @Callable(i)
288-func confirmLock (nftId,transferId) = if (!(isInit))
288+func confirmLock (nftId,transferId,caller) = if (!(isInit))
289289 then throw("dApp not ready")
290290 else if (ownerOnly(i))
291291 then {
292292 let nftStatus = getStringByKey(keyNFTstatus(nftId))
293293 if ((nftStatus != status_PENDING))
294294 then throw("NFT not pending")
295295 else {
296- let val = getStringByKey(((keyTransferNFT(nftId, transferId) + "_") + status_PENDING))
297- let newKey = ((keyTransferNFT(nftId, transferId) + "_") + status_CLOSED)
298-[DeleteEntry(((keyTransferNFT(nftId, transferId) + "_") + status_PENDING)), StringEntry(newKey, val), StringEntry(keyNFTstatus(nftId), status_LOCKED)]
296+ let val = getStringByKey(((keyTransferNFT(nftId, transferId, caller) + "_") + status_PENDING))
297+ let newKey = ((keyTransferNFT(nftId, transferId, caller) + "_") + status_CLOSED)
298+[DeleteEntry(((keyTransferNFT(nftId, transferId, caller) + "_") + status_PENDING)), StringEntry(newKey, val), StringEntry(keyNFTstatus(nftId), status_LOCKED)]
299299 }
300300 }
301301 else throw("Not allowed")
302302
303303
304304
305305 @Callable(i)
306306 func unlock (recipient,nftId) = if (!(isInit))
307307 then throw("dApp not ready")
308308 else if (ownerOnly(i))
309309 then {
310310 let nftStatus = getStringByKey(keyNFTstatus(nftId))
311311 if ((nftStatus != status_LOCKED))
312312 then throw("NFT not locked, finalize first if pending")
313313 else [StringEntry(keyNFTstatus(nftId), status_UNLOCKED), ScriptTransfer(Address(fromBase58String(recipient)), 1, fromBase58String(nftId))]
314314 }
315315 else throw("Not allowed")
316316
317317
318318
319319 @Callable(i)
320320 func appRunning (isLive,message) = if (!(isInit))
321321 then throw("dApp not ready")
322322 else if (ownerOnly(i))
323323 then [BooleanEntry(dappRunning_K, isLive), StringEntry(maintenanceMSG_K, message)]
324324 else throw("You are not allowed to change this")
325325
326326
327327
328328 @Callable(i)
329329 func deleteEntry (entry) = if (ownerOnly(i))
330330 then [DeleteEntry(entry)]
331331 else throw("no")
332332
333333

github/deemru/w8io/873ac7e 
58.11 ms