tx · 5rEDt5C5KF4SQefPB5Xw1KSyPQJj7pYx6Px6RbouyJjV 3PFQjjDMiZKQZdu5JqTHD7HwgSXyp9Rw9By: -0.01200000 Waves 2022.12.08 18:00 [3416984] smart account 3PFQjjDMiZKQZdu5JqTHD7HwgSXyp9Rw9By > SELF 0.00000000 Waves
{ "type": 13, "id": "5rEDt5C5KF4SQefPB5Xw1KSyPQJj7pYx6Px6RbouyJjV", "fee": 1200000, "feeAssetId": null, "timestamp": 1670511639089, "version": 2, "chainId": 87, "sender": "3PFQjjDMiZKQZdu5JqTHD7HwgSXyp9Rw9By", "senderPublicKey": "A2fujmmHBBAFrVGCyHBHVbzEtHvDsFniNoiovp2N4fES", "proofs": [ "8T6PYbjcDRQF8y9ckUsEDYqgwEr8iPb7Lv5vwQFGwx69ywgtnukrivyqaVzwabD658kn2BUUw7uQ8jfuSXv5RMm" ], "script": "base64:BgIjCAISBgoECAgICBIKCggICAgICAEICBIDCgEIEgASBAoCCAgOABptYXJrZXRwbGFjZUNvbnRyYWN0QWRkcmVzcwkBB0FkZHJlc3MBARoBV12L8V/LKCBrH2ajyG7aC6iX7Q/o/clE8QAQaXNzdWVyc1doaXRlbGlzdAkAzAgCAiMzUDNpVjg1ZVhma2NBM0RkMTNFcFpCWXZzMXZrS1g2QVlFTgkAzAgCAiMzUEhGQWF2eGoyZVBKcUZCNDZIMmFSR0E3b1FMNmt6MXJKSgkAzAgCAiMzUDZwZW92QWtWTjNweDZadXY4eTJub1RXSEZNNFI1V2pqOAkAzAgCAiMzUDVDUWt2azhQdTZyR1AzUWF2NEx3c2t3YThwTGhOd1RiUgkAzAgCAiMzUEhLRENRU2N2U1BIdmRDVWV1Y0ZreDVRMXhNVVJBOWticgkAzAgCAiMzUE1raTVzSEJzUWI0S2dEa25iVXdzTDNZZ3hhQ3phWm5DSgkAzAgCAiMzUDJ3TUNEanR4ZUxkZlFycFI4V1VlNXpOZVNjTTRVYUwzbwkAzAgCAiMzUDNwRG9zcTRHQ3dmSmt2cTR5cUt2dm9Ud21vcWM5cVBtbwkAzAgCAiMzUFBnZVlUV01SWjdTN2pTTHBuVnVLS0I5cjZYdURrM25kQwkAzAgCAiMzUEtWZ2Q2ZHMxeGVydks2YlBYYkVIQnFnOGliVGNmNUhaawkAzAgCAiMzUEQxc2Q1NVBZem1HVXJRODk2UXQzdXZkYnRnakNWcGFqRQkAzAgCAiMzUEZrZ3ZDOXk2ekh5NjR6RUFzY0tLZ2FOWTN5aXBpTHFiVwkAzAgCAiMzUEdHU2lMdXdHbW03Q2hmakRybUVaQmQ2SHhRSm44TjFOTQkAzAgCAiMzUEpLbVhvSEp2VmVRWGpTSmRodGtVY0ZEdGRpUXFNYlVURAkAzAgCAiMzUDViTDZWNG9HVFp0TVRpcmo5V3h0YnhVbnRxWGRqZXZBRQkAzAgCAiMzUEN5anFIaHRxOWY5SG1uNExOc1d3QTY4ZEZWc3ZRNmlOaQkAzAgCAiMzUEtIRlg2VzRhQXIxZTFiOE1VVHo1SG1kV1ZVY2pXaGdZNAkAzAgCAiMzUEpWa3g3WFJvODZ6VTg4c2hMdUtHbWJScjdSa01TeGpIagkAzAgCAiMzUEx1N2NvTU5WNG5hQ3hXa1JlbXFnYTZvOXpVaFFwcHhzQQkAzAgCAiMzUEdLRWU0eTU5VjNXTG5Id1BFVWFNV2Rienk4c2I5ODJmRwkAzAgCAiMzUDVkOGExSDJtMnpGUWFraGFhb3czdURFNzdVWUxHZDg5dgUDbmlsABBlZGl0b3JzV2hpdGVMaXN0CQDMCAICIzNQR0tFZTR5NTlWM1dMbkh3UEVVYU1XZGJ6eThzYjk4MmZHCQDMCAICIzNQN05obUR0MzFla1EySnJ5eHRtZGdaMURYZ1ZQd3lvY0pLCQDMCAICIzNQQ3lqcUhodHE5ZjlIbW40TE5zV3dBNjhkRlZzdlE2aU5pBQNuaWwAFm5mdFVsdHJhU3Rha2luZ1dyYXBwZXIJAQdBZGRyZXNzAQEaAVfArcJtMs2Rr6VXRdiH8lPBWo7IvSaKygsAFG5mdFdhdmVzUHVua3NXcmFwcGVyCQEHQWRkcmVzcwEBGgFXeZqKMBoJ1Z2oyidoI9kb1aHnNJDG6IMtABFMSU1JVF9NSU5UX0NPUElFUwCQTgENdHJ5R2V0SW50ZWdlcgEDa2V5BAckbWF0Y2gwCQCaCAIFBHRoaXMFA2tleQMJAAECBQckbWF0Y2gwAgNJbnQEAWIFByRtYXRjaDAFAWIAAAEMdHJ5R2V0U3RyaW5nAQNrZXkEByRtYXRjaDAJAJ0IAgUEdGhpcwUDa2V5AwkAAQIFByRtYXRjaDACBlN0cmluZwQBYgUHJG1hdGNoMAUBYgIAAQhjaGVja05GVAEFYXNzZXQDAwMJAAACCAgFBWFzc2V0Bmlzc3VlcgVieXRlcwgFBHRoaXMFYnl0ZXMJAAACCAUFYXNzZXQIZGVjaW1hbHMAAAcJAAACCAUFYXNzZXQKcmVpc3N1YWJsZQcHCQAAAggFBWFzc2V0CHF1YW50aXR5AAEHAQ9nZXRSYW5kb21OdW1iZXIECHZhcmlhbnRzBHR4SWQUaGF0Y2hpbmdGaW5pc2hIZWlnaHQGb2Zmc2V0BA9yYW5kb21TZWVkQmxvY2sJAQV2YWx1ZQEJAO0HAQkAZQIFFGhhdGNoaW5nRmluaXNoSGVpZ2h0AAEECnJhbmRvbUhhc2gJAPcDAQkAywECBQR0eElkCQEFdmFsdWUBCAUPcmFuZG9tU2VlZEJsb2NrA3ZyZgkAagIJALIJAgUKcmFuZG9tSGFzaAkAaAIFBm9mZnNldAAIBQh2YXJpYW50cwELaXNTdWJTdHJpbmcCA3N0cgZzdWJTdHIEByRtYXRjaDAJALMJAgUDc3RyBQZzdWJTdHIDCQABAgUHJG1hdGNoMAIDSW50BAF0BQckbWF0Y2gwBgcBEmlzVWx0cmFTdGFraW5nTmFtZQEEbmFtZQMJAQtpc1N1YlN0cmluZwIFBG5hbWUCCkJvcmVkIEFuaWEGAwkBC2lzU3ViU3RyaW5nAgUEbmFtZQIMQm9yZWQgQW5pYSAjBgMJAQtpc1N1YlN0cmluZwIFBG5hbWUCEFBVWlpMRSBFYXJseSBFYWcGBwEQaXNXYXZlc1B1bmtzTmFtZQEEbmFtZQMJAQtpc1N1YlN0cmluZwIFBG5hbWUCCk1lbWFsaWVuICMGAwkBC2lzU3ViU3RyaW5nAgUEbmFtZQIMWm9tYmllUHVuayAjBgMJAQtpc1N1YlN0cmluZwIFBG5hbWUCCU1hZFB1bmsgIwYDCQELaXNTdWJTdHJpbmcCBQRuYW1lAgtXYXZlc1B1bmsgIwYHAQtpc1ZhbGlkTmFtZQIEbmFtZQZjYWxsZXIDAwkAZgIABAkAsQIBBQRuYW1lBgkAZgIJALECAQUEbmFtZQAQCQACAQIoTmFtZSBtdXN0IGJlIGJldHdlZW4gNCBhbmQgMTYgY2hhcmFjdGVycwQMYWxsb3dDYWxsZXJzCQDMCAIFFm5mdFVsdHJhU3Rha2luZ1dyYXBwZXIJAMwIAgUUbmZ0V2F2ZXNQdW5rc1dyYXBwZXIFA25pbAQHJG1hdGNoMAkAzwgCBQxhbGxvd0NhbGxlcnMFBmNhbGxlcgMJAAECBQckbWF0Y2gwAgNJbnQEAXQFByRtYXRjaDAGAwkBASEBCQESaXNVbHRyYVN0YWtpbmdOYW1lAQUEbmFtZQkBASEBCQEQaXNXYXZlc1B1bmtzTmFtZQEFBG5hbWUHBQFpAQljcmVhdGVORlQEB25mdE5hbWUHbmZ0RGVzYwVpbWFnZQ5jb2xsZWN0aW9uTmFtZQMJAQEhAQkBC2lzVmFsaWROYW1lAgUHbmZ0TmFtZQgFAWkGY2FsbGVyCQACAQIQSW52YWxpZCBuZnQgbmFtZQMJAQIhPQIJALMJAgUFaW1hZ2UCCGh0dHBzOi8vAAAJAAIBAhxodHRwcyBsaW5rIHRvIGltYWdlIHJlcXVpcmVkBAVhc3NldAkAwwgHBQduZnROYW1lBQduZnREZXNjAAEAAAcFBHVuaXQAAAQHYXNzZXRJZAkAuAgBBQVhc3NldAQKYXNzZXRJZFN0cgkA2AQBBQdhc3NldElkBBBjb2xsZWN0aW9uRG9tYWluCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8DCQBmAgkAsQIBBQ5jb2xsZWN0aW9uTmFtZQAABQ5jb2xsZWN0aW9uTmFtZQIFYmFzaWMEBm5mdE51bQkAZAIJAQ10cnlHZXRJbnRlZ2VyAQkArAICCQCsAgICC2NvbGxlY3Rpb25fBRBjb2xsZWN0aW9uRG9tYWluAgVfc2l6ZQABCQCUCgIJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgICBG5mdF8FCmFzc2V0SWRTdHICBV9kYXRhCQCsAgIJAKwCAgkArAICCQCsAgICEHsnY29sbGVjdGlvbic6ICcFEGNvbGxlY3Rpb25Eb21haW4CCicsICdudW0nOiAJAKQDAQUGbmZ0TnVtAgF9CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICAgRuZnRfBQphc3NldElkU3RyAgZfaW1hZ2UFBWltYWdlCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICAgRuZnRfBQphc3NldElkU3RyAgdfaXNzdWVyCQClCAEIBQFpBmNhbGxlcgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgICC2NvbGxlY3Rpb25fBRBjb2xsZWN0aW9uRG9tYWluAgVfc2l6ZQUGbmZ0TnVtCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCsAgICC2NvbGxlY3Rpb25fBRBjb2xsZWN0aW9uRG9tYWluAglfYXNzZXRJZF8FCmFzc2V0SWRTdHIFCmFzc2V0SWRTdHIJAMwIAgUFYXNzZXQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyAAEFB2Fzc2V0SWQFA25pbAUKYXNzZXRJZFN0cgFpAQRtaW50CARuYW1lBGRlc2MKY29sbGVjdGlvbgdwcmV2aWV3CG9yaWdpbmFsBmFtb3VudApzb3VyY2VMaXN0DXJhbmRJbmRleExpc3QEB25mdERlc2MFBGRlc2MEDmNvbGxlY3Rpb25OYW1lBQpjb2xsZWN0aW9uBAtwcmV2aWV3RmlsZQMJAGYCCQCxAgEFB3ByZXZpZXcAAAUHcHJldmlldwUIb3JpZ2luYWwDCQEBIQEJAQtpc1ZhbGlkTmFtZQIFBG5hbWUIBQFpBmNhbGxlcgkAAgECEEludmFsaWQgbmZ0IG5hbWUDCQAAAgkAsQIBBQ5jb2xsZWN0aW9uTmFtZQAACQACAQIZSW5jb3JyZWN0IGNvbGxlY3Rpb24gbmFtZQMDCQECIT0CCQCzCQIFCG9yaWdpbmFsAghodHRwczovLwAABgkBAiE9AgkAswkCBQtwcmV2aWV3RmlsZQIIaHR0cHM6Ly8AAAkAAgECG2h0dHBzIGxpbmsgdG8gZmlsZSByZXF1aXJlZAQFYXNzZXQJAMMIBwUEbmFtZQUHbmZ0RGVzYwABAAAHBQR1bml0AAAEB2Fzc2V0SWQJALgIAQUFYXNzZXQECmFzc2V0SWRTdHIJANgEAQUHYXNzZXRJZAMJAAACBQZhbW91bnQAAQQQY29sbGVjdGlvbkRvbWFpbgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfAwkAZgIJALECAQUOY29sbGVjdGlvbk5hbWUAAAUOY29sbGVjdGlvbk5hbWUCBWJhc2ljBAZuZnROdW0JAGQCCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgkArAICAgtjb2xsZWN0aW9uXwUQY29sbGVjdGlvbkRvbWFpbgIFX3NpemUAAQkAlAoCCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICAgRuZnRfBQphc3NldElkU3RyAgVfZGF0YQkArAICCQCsAgIJAKwCAgkArAICAhB7J2NvbGxlY3Rpb24nOiAnBRBjb2xsZWN0aW9uRG9tYWluAgonLCAnbnVtJzogCQCkAwEFBm5mdE51bQIBfQkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgIEbmZ0XwUKYXNzZXRJZFN0cgIGX2ltYWdlBQtwcmV2aWV3RmlsZQkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgIEbmZ0XwUKYXNzZXRJZFN0cgIJX29yaWdpbmFsBQhvcmlnaW5hbAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgIEbmZ0XwUKYXNzZXRJZFN0cgIHX2lzc3VlcgkApQgBCAUBaQZjYWxsZXIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICAgtjb2xsZWN0aW9uXwUQY29sbGVjdGlvbkRvbWFpbgIFX3NpemUFBm5mdE51bQkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICAgtjb2xsZWN0aW9uXwUQY29sbGVjdGlvbkRvbWFpbgIJX2Fzc2V0SWRfBQphc3NldElkU3RyBQphc3NldElkU3RyCQDMCAIFBWFzc2V0CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgABBQdhc3NldElkBQNuaWwFCmFzc2V0SWRTdHIDCQBmAgUGYW1vdW50AAEDCQBnAgURTElNSVRfTUlOVF9DT1BJRVMFBmFtb3VudAQQY29sbGVjdGlvbkRvbWFpbgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfBQ5jb2xsZWN0aW9uTmFtZQQIcmFuZERhdGEDAwkAZgIJALECAQUNcmFuZEluZGV4TGlzdAAACQBmAgkAsQIBBQpzb3VyY2VMaXN0AAAHAwkBAiE9AgkAkAMBCQC1CQIFDXJhbmRJbmRleExpc3QCASwFBmFtb3VudAkAAgECPHJhbmRvbSBsaXN0IGlzIG5vdCBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBlbGVtZW50cwkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgIGZ3JvdXBfBQphc3NldElkU3RyAgtfc291cmNlTGlzdAUKc291cmNlTGlzdAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgIGZ3JvdXBfBQphc3NldElkU3RyAg5fcmFuZEluZGV4TGlzdAUNcmFuZEluZGV4TGlzdAUDbmlsAwMDCQBmAgkAsQIBBQ1yYW5kSW5kZXhMaXN0AAAJAAACCQCxAgEFCnNvdXJjZUxpc3QAAAcGAwkAAAIJALECAQUNcmFuZEluZGV4TGlzdAAACQBmAgkAsQIBBQpzb3VyY2VMaXN0AAAHCQACAQI2dGhlIGxpc3Qgb2YgcmVzb3VyY2VzIG9yIHJhbmRvbSBzZXF1ZW5jZSBpcyBub3QgZmlsbGVkBQNuaWwJAJQKAgkAzggCCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICAgRuZnRfBQphc3NldElkU3RyAgVfZGF0YQkArAICCQCsAgICEHsnY29sbGVjdGlvbic6ICcFEGNvbGxlY3Rpb25Eb21haW4CAid9CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICAgRuZnRfBQphc3NldElkU3RyAgZfaW1hZ2UFC3ByZXZpZXdGaWxlCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICAgRuZnRfBQphc3NldElkU3RyAglfb3JpZ2luYWwFCG9yaWdpbmFsCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICAgRuZnRfBQphc3NldElkU3RyAgdfaXNzdWVyCQClCAEIBQFpBmNhbGxlcgkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICCQCsAgICBG5mdF8FCmFzc2V0SWRTdHICCF9pc0dyb3VwBgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgICBmdyb3VwXwUKYXNzZXRJZFN0cgIFX3NpemUFBmFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgICBmdyb3VwXwUKYXNzZXRJZFN0cgIKX2F2YWlsYWJsZQUGYW1vdW50CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICAgZncm91cF8FCmFzc2V0SWRTdHICEV9jb2xsZWN0aW9uRG9tYWluBRBjb2xsZWN0aW9uRG9tYWluCQDMCAIFBWFzc2V0CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgABBQdhc3NldElkBQNuaWwFCHJhbmREYXRhBQphc3NldElkU3RyCQACAQkArAICAllXaGVuIGNyZWF0aW5nIGEgbXVsdGlwbGUgY29sbGVjdGlvbiwgdGhlIG51bWJlciBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAxIGFuZCBsZXNzIG9yIGVxdWFsIAkApAMBBRFMSU1JVF9NSU5UX0NPUElFUwkAAgECFVdyb25nIGFtb3VudCBhcmd1bWVudAFpAQ1taW50RnJvbUdyb3VwAQ9ncm91cEFzc2V0SWRTdHIECmdyb3VwQXNzZXQJAQV2YWx1ZQEJAOwHAQkA2QQBBQ9ncm91cEFzc2V0SWRTdHIDCQEIY2hlY2tORlQBBQpncm91cEFzc2V0AwkAAAIIBQFpBmNhbGxlcgUabWFya2V0cGxhY2VDb250cmFjdEFkZHJlc3MEB2lzR3JvdXAJAQt2YWx1ZU9yRWxzZQIJAKAIAQkArAICCQCsAgICBG5mdF8FD2dyb3VwQXNzZXRJZFN0cgIIX2lzR3JvdXAHAwUHaXNHcm91cAQJZ3JvdXBTaXplCQELdmFsdWVPckVsc2UCCQCfCAEJAKwCAgkArAICAgZncm91cF8FD2dyb3VwQXNzZXRJZFN0cgIFX3NpemUAAAQOZ3JvdXBBdmFpbGFibGUJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkArAICCQCsAgICBmdyb3VwXwUPZ3JvdXBBc3NldElkU3RyAgpfYXZhaWxhYmxlAAADAwkAZgIFDmdyb3VwQXZhaWxhYmxlAAAJAGYCBQlncm91cFNpemUAAAcEEGNvbGxlY3Rpb25Eb21haW4JAQV2YWx1ZQEJAKIIAQkArAICCQCsAgICBmdyb3VwXwUPZ3JvdXBBc3NldElkU3RyAhFfY29sbGVjdGlvbkRvbWFpbgQIb3JpZ0ZpbGUJAQV2YWx1ZQEJAKIIAQkArAICCQCsAgICBG5mdF8FD2dyb3VwQXNzZXRJZFN0cgIJX29yaWdpbmFsBAtwcmV2aWV3RmlsZQkBBXZhbHVlAQkAoggBCQCsAgIJAKwCAgIEbmZ0XwUPZ3JvdXBBc3NldElkU3RyAgZfaW1hZ2UEBm5mdE51bQkAZAIJAQ10cnlHZXRJbnRlZ2VyAQkArAICCQCsAgICC2NvbGxlY3Rpb25fBRBjb2xsZWN0aW9uRG9tYWluAgVfc2l6ZQABBAVhc3NldAkAwwgHCAUKZ3JvdXBBc3NldARuYW1lCAUKZ3JvdXBBc3NldAtkZXNjcmlwdGlvbgABAAAHBQR1bml0AAAEB2Fzc2V0SWQJALgIAQUFYXNzZXQECmFzc2V0SWRTdHIJANgEAQUHYXNzZXRJZAQQcmFuZEluZGV4TGlzdFN0cgkBC3ZhbHVlT3JFbHNlAgkAoggBCQCsAgIJAKwCAgIGZ3JvdXBfBQ9ncm91cEFzc2V0SWRTdHICDl9yYW5kSW5kZXhMaXN0AgAEDXNvdXJjZUxpc3RTdHIJAQt2YWx1ZU9yRWxzZQIJAKIIAQkArAICCQCsAgICBmdyb3VwXwUPZ3JvdXBBc3NldElkU3RyAgtfc291cmNlTGlzdAIABAtjb21tb25TdGF0ZQkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgIEbmZ0XwUKYXNzZXRJZFN0cgIFX2RhdGEJAKwCAgkArAICCQCsAgIJAKwCAgIQeydjb2xsZWN0aW9uJzogJwUQY29sbGVjdGlvbkRvbWFpbgIKJywgJ251bSc6IAkApAMBBQZuZnROdW0CAX0JAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgICBG5mdF8FCmFzc2V0SWRTdHICB19pc3N1ZXIJAKUIAQgFAWkGY2FsbGVyCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgILY29sbGVjdGlvbl8FEGNvbGxlY3Rpb25Eb21haW4CBV9zaXplBQZuZnROdW0JAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgILY29sbGVjdGlvbl8FEGNvbGxlY3Rpb25Eb21haW4CCV9hc3NldElkXwUKYXNzZXRJZFN0cgUKYXNzZXRJZFN0cgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgICBmdyb3VwXwUPZ3JvdXBBc3NldElkU3RyAgpfYXZhaWxhYmxlCQBlAgUOZ3JvdXBBdmFpbGFibGUAAQkAzAgCBQVhc3NldAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIAAQUHYXNzZXRJZAUDbmlsAwkAZgIJALECAQUNc291cmNlTGlzdFN0cgAAAwkAAAIJALECAQUQcmFuZEluZGV4TGlzdFN0cgAACQACAQISTWludCBub3QgYXZhaWxhYmxlBA1yYW5kSW5kZXhMaXN0CQC1CQIFEHJhbmRJbmRleExpc3RTdHICASwECnNvdXJjZUxpc3QJALUJAgUNc291cmNlTGlzdFN0cgIBLAQEcmFuZAkBD2dldFJhbmRvbU51bWJlcgQFDmdyb3VwQXZhaWxhYmxlCAUBaQ10cmFuc2FjdGlvbklkBQZoZWlnaHQAAAQJcmFuZEluZGV4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJALYJAQkAkQMCBQ1yYW5kSW5kZXhMaXN0BQRyYW5kAhJJbnZhbGlkIHJhbmQgaW5kZXgJAJQKAgkAzggCBQtjb21tb25TdGF0ZQkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgIEbmZ0XwUKYXNzZXRJZFN0cgIGX2ltYWdlCQCRAwIFCnNvdXJjZUxpc3QFCXJhbmRJbmRleAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgIGZ3JvdXBfBQ9ncm91cEFzc2V0SWRTdHICDl9yYW5kSW5kZXhMaXN0CQC5CQIJANEIAgUNcmFuZEluZGV4TGlzdAUEcmFuZAIBLAUDbmlsBQphc3NldElkU3RyCQCUCgIJAM4IAgULY29tbW9uU3RhdGUJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgICBG5mdF8FCmFzc2V0SWRTdHICBl9pbWFnZQULcHJldmlld0ZpbGUJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgICBG5mdF8FCmFzc2V0SWRTdHICCV9vcmlnaW5hbAUIb3JpZ0ZpbGUFA25pbAUKYXNzZXRJZFN0cgkAAgECEk1pbnQgbm90IGF2YWlsYWJsZQkAAgECFkludmFsaWQgTkZUIGlkZW50aWZpZXIJAAIBAhZJbnZhbGlkIGNhbGxlciBhZGRyZXNzCQACAQIMV3JvbmcgTkZUIElkAWkBB2J1cm5ORlQABAdhc3NldElkCQEFdmFsdWUBCAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQEBWFzc2V0CQEFdmFsdWUBCQDsBwEFB2Fzc2V0SWQDAwkAAAIICQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50AAEJAQhjaGVja05GVAEFBWFzc2V0BwQKYXNzZXRJZFN0cgkA2AQBBQdhc3NldElkBAZpc3N1ZXIJAQx0cnlHZXRTdHJpbmcBCQCsAgIJAKwCAgIEbmZ0XwUKYXNzZXRJZFN0cgIHX2lzc3VlcgQEZGF0YQkBDHRyeUdldFN0cmluZwEJAKwCAgkArAICAgRuZnRfBQphc3NldElkU3RyAgVfZGF0YQQJcGFydHNEYXRhCQC1CQIFBGRhdGECAiwgBA9wYXJ0c0NvbGxlY3Rpb24JALUJAgkAkQMCBQlwYXJ0c0RhdGEAAAICOiAEEGNvbGxlY3Rpb25Eb21haW4JALMCAgkAsAICCQCRAwIFD3BhcnRzQ29sbGVjdGlvbgABAAEAAQQHaXNHcm91cAkBC3ZhbHVlT3JFbHNlAgkAoAgBCQCsAgIJAKwCAgIEbmZ0XwUKYXNzZXRJZFN0cgIIX2lzR3JvdXAHAwkBASEBBQdpc0dyb3VwBAZuZnROdW0JAQ10cnlHZXRJbnRlZ2VyAQkArAICCQCsAgICC2NvbGxlY3Rpb25fBRBjb2xsZWN0aW9uRG9tYWluAgVfc2l6ZQMJAGYCBQZuZnROdW0AAAQQdXBkYXRlQ29sbGVjdGlvbgMJAAACBQZuZnROdW0AAQkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgICC2NvbGxlY3Rpb25fBRBjb2xsZWN0aW9uRG9tYWluAgVfc2l6ZQkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICAgtjb2xsZWN0aW9uXwUQY29sbGVjdGlvbkRvbWFpbgIFX3NpemUJAGUCBQZuZnROdW0AAQkAzAgCBRB1cGRhdGVDb2xsZWN0aW9uCQDMCAIJAQRCdXJuAgUHYXNzZXRJZAABCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICAgRuZnRfBQphc3NldElkU3RyAgVfZGF0YQkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgIEbmZ0XwUKYXNzZXRJZFN0cgIGX2ltYWdlCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICAgRuZnRfBQphc3NldElkU3RyAglfb3JpZ2luYWwJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgICBG5mdF8FCmFzc2V0SWRTdHICB19pc3N1ZXIJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgICBG5mdF8FCmFzc2V0SWRTdHICCF9pc0dyb3VwCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICAgZncm91cF8FCmFzc2V0SWRTdHICBV9zaXplCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICAgZncm91cF8FCmFzc2V0SWRTdHICCl9hdmFpbGFibGUJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgICBmdyb3VwXwUKYXNzZXRJZFN0cgIRX2NvbGxlY3Rpb25Eb21haW4JAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgIJAKwCAgILY29sbGVjdGlvbl8FEGNvbGxlY3Rpb25Eb21haW4CCV9hc3NldElkXwUKYXNzZXRJZFN0cgUDbmlsCQACAQIWSXZhbGlkIGNvbGxlY3Rpb24gbmFtZQkAzAgCCQEEQnVybgIFB2Fzc2V0SWQAAQkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgIEbmZ0XwUKYXNzZXRJZFN0cgIFX2RhdGEJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgICBG5mdF8FCmFzc2V0SWRTdHICBl9pbWFnZQkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgIEbmZ0XwUKYXNzZXRJZFN0cgIJX29yaWdpbmFsCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICAgRuZnRfBQphc3NldElkU3RyAgdfaXNzdWVyCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICAgRuZnRfBQphc3NldElkU3RyAghfaXNHcm91cAkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgIGZ3JvdXBfBQphc3NldElkU3RyAgVfc2l6ZQkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgIGZ3JvdXBfBQphc3NldElkU3RyAgpfYXZhaWxhYmxlCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICAgZncm91cF8FCmFzc2V0SWRTdHICEV9jb2xsZWN0aW9uRG9tYWluCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICAgZncm91cF8FCmFzc2V0SWRTdHICC19zb3VyY2VMaXN0CQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICAgZncm91cF8FCmFzc2V0SWRTdHICDl9yYW5kSW5kZXhMaXN0BQNuaWwJAAIBAhNJdmFsaWQgTkZUIGF0dGFjaGVkAWkBDGVkaXRJbWFnZU5GVAICaWQLbmV3SW1hZ2VVcmwDCQAAAgkAzwgCBRBlZGl0b3JzV2hpdGVMaXN0CQClCAEIBQFpBmNhbGxlcgUEdW5pdAkAAgECF0VkaXRpbmcgTkZUcyBpcyBsaW1pdGVkAwkBAiE9AgkAswkCBQtuZXdJbWFnZVVybAIIaHR0cHM6Ly8AAAkAAgECHGh0dHBzIGxpbmsgdG8gaW1hZ2UgcmVxdWlyZWQEBWFzc2V0CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQkA2QQBBQJpZAIOTkZUIG5vdCBmb3VkZWQECWFsZXhhbmRyYQkBB0FkZHJlc3MBARoBV3kzNKWWSa49fxnYw58/cJf/9NlZPGCRhwQNdHN1bmFtaUlzc3VlcgkBB0FkZHJlc3MBARoBV+rYzkzwGGpdiSkuJ2HgRKdeMHMz+1kJ/AMDCQAAAggFAWkGY2FsbGVyBQlhbGV4YW5kcmEJAQIhPQIIBQVhc3NldAZpc3N1ZXIFDXRzdW5hbWlJc3N1ZXIHCQACAQIUVXNlIG9ubHkgdHN1bmFtaSBORlQECmFzc2V0SWRTdHIJANgEAQgFBWFzc2V0AmlkBAlkYXRhRXhpc3QJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBCQCsAgIJAKwCAgIEbmZ0XwUKYXNzZXRJZFN0cgIFX2RhdGECE05GVCBkYXRhIG5vdCBmb3VkZWQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgICBG5mdF8FCmFzc2V0SWRTdHICBl9pbWFnZQULbmV3SW1hZ2VVcmwFA25pbAECdHgBBnZlcmlmeQAJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXmjjM3x", "height": 3416984, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: D9iEXJY3LDVaCXSdEFB14Eo9uGhCZGQuKURAfa2mo3Hi Next: 9EM4ot5dea7mAFFw46TTrZpZDPBdgrR2dx2buomoaLWA Diff:
Old | New | Differences | |
---|---|---|---|
5 | 5 | ||
6 | 6 | let issuersWhitelist = ["3P3iV85eXfkcA3Dd13EpZBYvs1vkKX6AYEN", "3PHFAavxj2ePJqFB46H2aRGA7oQL6kz1rJJ", "3P6peovAkVN3px6Zuv8y2noTWHFM4R5Wjj8", "3P5CQkvk8Pu6rGP3Qav4Lwskwa8pLhNwTbR", "3PHKDCQScvSPHvdCUeucFkx5Q1xMURA9kbr", "3PMki5sHBsQb4KgDknbUwsL3YgxaCzaZnCJ", "3P2wMCDjtxeLdfQrpR8WUe5zNeScM4UaL3o", "3P3pDosq4GCwfJkvq4yqKvvoTwmoqc9qPmo", "3PPgeYTWMRZ7S7jSLpnVuKKB9r6XuDk3ndC", "3PKVgd6ds1xervK6bPXbEHBqg8ibTcf5HZk", "3PD1sd55PYzmGUrQ896Qt3uvdbtgjCVpajE", "3PFkgvC9y6zHy64zEAscKKgaNY3yipiLqbW", "3PGGSiLuwGmm7ChfjDrmEZBd6HxQJn8N1NM", "3PJKmXoHJvVeQXjSJdhtkUcFDtdiQqMbUTD", "3P5bL6V4oGTZtMTirj9WxtbxUntqXdjevAE", "3PCyjqHhtq9f9Hmn4LNsWwA68dFVsvQ6iNi", "3PKHFX6W4aAr1e1b8MUTz5HmdWVUcjWhgY4", "3PJVkx7XRo86zU88shLuKGmbRr7RkMSxjHj", "3PLu7coMNV4naCxWkRemqga6o9zUhQppxsA", "3PGKEe4y59V3WLnHwPEUaMWdbzy8sb982fG", "3P5d8a1H2m2zFQakhaaow3uDE77UYLGd89v"] | |
7 | 7 | ||
8 | - | let editorsWhiteList = ["3PGKEe4y59V3WLnHwPEUaMWdbzy8sb982fG", "3P7NhmDt31ekQ2JryxtmdgZ1DXgVPwyocJK"] | |
8 | + | let editorsWhiteList = ["3PGKEe4y59V3WLnHwPEUaMWdbzy8sb982fG", "3P7NhmDt31ekQ2JryxtmdgZ1DXgVPwyocJK", "3PCyjqHhtq9f9Hmn4LNsWwA68dFVsvQ6iNi"] | |
9 | 9 | ||
10 | 10 | let nftUltraStakingWrapper = Address(base58'3PKVgd6ds1xervK6bPXbEHBqg8ibTcf5HZk') | |
11 | 11 | ||
251 | 251 | then throw("https link to image required") | |
252 | 252 | else { | |
253 | 253 | let asset = valueOrErrorMessage(assetInfo(fromBase58String(id)), "NFT not fouded") | |
254 | - | let assetIdStr = toBase58String(asset.id) | |
255 | - | let dataExist = valueOrErrorMessage(getString((("nft_" + assetIdStr) + "_data")), "NFT data not fouded") | |
254 | + | let alexandra = Address(base58'3PCyjqHhtq9f9Hmn4LNsWwA68dFVsvQ6iNi') | |
255 | + | let tsunamiIssuer = Address(base58'3PPLea51cvcmmLAhMqT7r4VmarDMf7Y5iVH') | |
256 | + | if (if ((i.caller == alexandra)) | |
257 | + | then (asset.issuer != tsunamiIssuer) | |
258 | + | else false) | |
259 | + | then throw("Use only tsunami NFT") | |
260 | + | else { | |
261 | + | let assetIdStr = toBase58String(asset.id) | |
262 | + | let dataExist = valueOrErrorMessage(getString((("nft_" + assetIdStr) + "_data")), "NFT data not fouded") | |
256 | 263 | [StringEntry((("nft_" + assetIdStr) + "_image"), newImageUrl)] | |
264 | + | } | |
257 | 265 | } | |
258 | 266 | ||
259 | 267 |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 6 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | let marketplaceContractAddress = Address(base58'3PATXDVE53rKJtkwXYV3tvuLVS2fDtGtKCc') | |
5 | 5 | ||
6 | 6 | let issuersWhitelist = ["3P3iV85eXfkcA3Dd13EpZBYvs1vkKX6AYEN", "3PHFAavxj2ePJqFB46H2aRGA7oQL6kz1rJJ", "3P6peovAkVN3px6Zuv8y2noTWHFM4R5Wjj8", "3P5CQkvk8Pu6rGP3Qav4Lwskwa8pLhNwTbR", "3PHKDCQScvSPHvdCUeucFkx5Q1xMURA9kbr", "3PMki5sHBsQb4KgDknbUwsL3YgxaCzaZnCJ", "3P2wMCDjtxeLdfQrpR8WUe5zNeScM4UaL3o", "3P3pDosq4GCwfJkvq4yqKvvoTwmoqc9qPmo", "3PPgeYTWMRZ7S7jSLpnVuKKB9r6XuDk3ndC", "3PKVgd6ds1xervK6bPXbEHBqg8ibTcf5HZk", "3PD1sd55PYzmGUrQ896Qt3uvdbtgjCVpajE", "3PFkgvC9y6zHy64zEAscKKgaNY3yipiLqbW", "3PGGSiLuwGmm7ChfjDrmEZBd6HxQJn8N1NM", "3PJKmXoHJvVeQXjSJdhtkUcFDtdiQqMbUTD", "3P5bL6V4oGTZtMTirj9WxtbxUntqXdjevAE", "3PCyjqHhtq9f9Hmn4LNsWwA68dFVsvQ6iNi", "3PKHFX6W4aAr1e1b8MUTz5HmdWVUcjWhgY4", "3PJVkx7XRo86zU88shLuKGmbRr7RkMSxjHj", "3PLu7coMNV4naCxWkRemqga6o9zUhQppxsA", "3PGKEe4y59V3WLnHwPEUaMWdbzy8sb982fG", "3P5d8a1H2m2zFQakhaaow3uDE77UYLGd89v"] | |
7 | 7 | ||
8 | - | let editorsWhiteList = ["3PGKEe4y59V3WLnHwPEUaMWdbzy8sb982fG", "3P7NhmDt31ekQ2JryxtmdgZ1DXgVPwyocJK"] | |
8 | + | let editorsWhiteList = ["3PGKEe4y59V3WLnHwPEUaMWdbzy8sb982fG", "3P7NhmDt31ekQ2JryxtmdgZ1DXgVPwyocJK", "3PCyjqHhtq9f9Hmn4LNsWwA68dFVsvQ6iNi"] | |
9 | 9 | ||
10 | 10 | let nftUltraStakingWrapper = Address(base58'3PKVgd6ds1xervK6bPXbEHBqg8ibTcf5HZk') | |
11 | 11 | ||
12 | 12 | let nftWavesPunksWrapper = Address(base58'3PD1sd55PYzmGUrQ896Qt3uvdbtgjCVpajE') | |
13 | 13 | ||
14 | 14 | let LIMIT_MINT_COPIES = 10000 | |
15 | 15 | ||
16 | 16 | func tryGetInteger (key) = match getInteger(this, key) { | |
17 | 17 | case b: Int => | |
18 | 18 | b | |
19 | 19 | case _ => | |
20 | 20 | 0 | |
21 | 21 | } | |
22 | 22 | ||
23 | 23 | ||
24 | 24 | func tryGetString (key) = match getString(this, key) { | |
25 | 25 | case b: String => | |
26 | 26 | b | |
27 | 27 | case _ => | |
28 | 28 | "" | |
29 | 29 | } | |
30 | 30 | ||
31 | 31 | ||
32 | 32 | func checkNFT (asset) = if (if (if ((asset.issuer.bytes == this.bytes)) | |
33 | 33 | then (asset.decimals == 0) | |
34 | 34 | else false) | |
35 | 35 | then (asset.reissuable == false) | |
36 | 36 | else false) | |
37 | 37 | then (asset.quantity == 1) | |
38 | 38 | else false | |
39 | 39 | ||
40 | 40 | ||
41 | 41 | func getRandomNumber (variants,txId,hatchingFinishHeight,offset) = { | |
42 | 42 | let randomSeedBlock = value(blockInfoByHeight((hatchingFinishHeight - 1))) | |
43 | 43 | let randomHash = sha256((txId + value(randomSeedBlock.vrf))) | |
44 | 44 | (toInt(randomHash, (offset * 8)) % variants) | |
45 | 45 | } | |
46 | 46 | ||
47 | 47 | ||
48 | 48 | func isSubString (str,subStr) = match indexOf(str, subStr) { | |
49 | 49 | case t: Int => | |
50 | 50 | true | |
51 | 51 | case _ => | |
52 | 52 | false | |
53 | 53 | } | |
54 | 54 | ||
55 | 55 | ||
56 | 56 | func isUltraStakingName (name) = if (isSubString(name, "Bored Ania")) | |
57 | 57 | then true | |
58 | 58 | else if (isSubString(name, "Bored Ania #")) | |
59 | 59 | then true | |
60 | 60 | else if (isSubString(name, "PUZZLE Early Eag")) | |
61 | 61 | then true | |
62 | 62 | else false | |
63 | 63 | ||
64 | 64 | ||
65 | 65 | func isWavesPunksName (name) = if (isSubString(name, "Memalien #")) | |
66 | 66 | then true | |
67 | 67 | else if (isSubString(name, "ZombiePunk #")) | |
68 | 68 | then true | |
69 | 69 | else if (isSubString(name, "MadPunk #")) | |
70 | 70 | then true | |
71 | 71 | else if (isSubString(name, "WavesPunk #")) | |
72 | 72 | then true | |
73 | 73 | else false | |
74 | 74 | ||
75 | 75 | ||
76 | 76 | func isValidName (name,caller) = if (if ((4 > size(name))) | |
77 | 77 | then true | |
78 | 78 | else (size(name) > 16)) | |
79 | 79 | then throw("Name must be between 4 and 16 characters") | |
80 | 80 | else { | |
81 | 81 | let allowCallers = [nftUltraStakingWrapper, nftWavesPunksWrapper] | |
82 | 82 | match indexOf(allowCallers, caller) { | |
83 | 83 | case t: Int => | |
84 | 84 | true | |
85 | 85 | case _ => | |
86 | 86 | if (!(isUltraStakingName(name))) | |
87 | 87 | then !(isWavesPunksName(name)) | |
88 | 88 | else false | |
89 | 89 | } | |
90 | 90 | } | |
91 | 91 | ||
92 | 92 | ||
93 | 93 | @Callable(i) | |
94 | 94 | func createNFT (nftName,nftDesc,image,collectionName) = if (!(isValidName(nftName, i.caller))) | |
95 | 95 | then throw("Invalid nft name") | |
96 | 96 | else if ((indexOf(image, "https://") != 0)) | |
97 | 97 | then throw("https link to image required") | |
98 | 98 | else { | |
99 | 99 | let asset = Issue(nftName, nftDesc, 1, 0, false, unit, 0) | |
100 | 100 | let assetId = calculateAssetId(asset) | |
101 | 101 | let assetIdStr = toBase58String(assetId) | |
102 | 102 | let collectionDomain = ((toString(i.caller) + "_") + (if ((size(collectionName) > 0)) | |
103 | 103 | then collectionName | |
104 | 104 | else "basic")) | |
105 | 105 | let nftNum = (tryGetInteger((("collection_" + collectionDomain) + "_size")) + 1) | |
106 | 106 | $Tuple2([StringEntry((("nft_" + assetIdStr) + "_data"), (((("{'collection': '" + collectionDomain) + "', 'num': ") + toString(nftNum)) + "}")), StringEntry((("nft_" + assetIdStr) + "_image"), image), StringEntry((("nft_" + assetIdStr) + "_issuer"), toString(i.caller)), IntegerEntry((("collection_" + collectionDomain) + "_size"), nftNum), StringEntry(((("collection_" + collectionDomain) + "_assetId_") + assetIdStr), assetIdStr), asset, ScriptTransfer(i.caller, 1, assetId)], assetIdStr) | |
107 | 107 | } | |
108 | 108 | ||
109 | 109 | ||
110 | 110 | ||
111 | 111 | @Callable(i) | |
112 | 112 | func mint (name,desc,collection,preview,original,amount,sourceList,randIndexList) = { | |
113 | 113 | let nftDesc = desc | |
114 | 114 | let collectionName = collection | |
115 | 115 | let previewFile = if ((size(preview) > 0)) | |
116 | 116 | then preview | |
117 | 117 | else original | |
118 | 118 | if (!(isValidName(name, i.caller))) | |
119 | 119 | then throw("Invalid nft name") | |
120 | 120 | else if ((size(collectionName) == 0)) | |
121 | 121 | then throw("Incorrect collection name") | |
122 | 122 | else if (if ((indexOf(original, "https://") != 0)) | |
123 | 123 | then true | |
124 | 124 | else (indexOf(previewFile, "https://") != 0)) | |
125 | 125 | then throw("https link to file required") | |
126 | 126 | else { | |
127 | 127 | let asset = Issue(name, nftDesc, 1, 0, false, unit, 0) | |
128 | 128 | let assetId = calculateAssetId(asset) | |
129 | 129 | let assetIdStr = toBase58String(assetId) | |
130 | 130 | if ((amount == 1)) | |
131 | 131 | then { | |
132 | 132 | let collectionDomain = ((toString(i.caller) + "_") + (if ((size(collectionName) > 0)) | |
133 | 133 | then collectionName | |
134 | 134 | else "basic")) | |
135 | 135 | let nftNum = (tryGetInteger((("collection_" + collectionDomain) + "_size")) + 1) | |
136 | 136 | $Tuple2([StringEntry((("nft_" + assetIdStr) + "_data"), (((("{'collection': '" + collectionDomain) + "', 'num': ") + toString(nftNum)) + "}")), StringEntry((("nft_" + assetIdStr) + "_image"), previewFile), StringEntry((("nft_" + assetIdStr) + "_original"), original), StringEntry((("nft_" + assetIdStr) + "_issuer"), toString(i.caller)), IntegerEntry((("collection_" + collectionDomain) + "_size"), nftNum), StringEntry(((("collection_" + collectionDomain) + "_assetId_") + assetIdStr), assetIdStr), asset, ScriptTransfer(i.caller, 1, assetId)], assetIdStr) | |
137 | 137 | } | |
138 | 138 | else if ((amount > 1)) | |
139 | 139 | then if ((LIMIT_MINT_COPIES >= amount)) | |
140 | 140 | then { | |
141 | 141 | let collectionDomain = ((toString(i.caller) + "_") + collectionName) | |
142 | 142 | let randData = if (if ((size(randIndexList) > 0)) | |
143 | 143 | then (size(sourceList) > 0) | |
144 | 144 | else false) | |
145 | 145 | then if ((size(split(randIndexList, ",")) != amount)) | |
146 | 146 | then throw("random list is not equal to the number of available elements") | |
147 | 147 | else [StringEntry((("group_" + assetIdStr) + "_sourceList"), sourceList), StringEntry((("group_" + assetIdStr) + "_randIndexList"), randIndexList)] | |
148 | 148 | else if (if (if ((size(randIndexList) > 0)) | |
149 | 149 | then (size(sourceList) == 0) | |
150 | 150 | else false) | |
151 | 151 | then true | |
152 | 152 | else if ((size(randIndexList) == 0)) | |
153 | 153 | then (size(sourceList) > 0) | |
154 | 154 | else false) | |
155 | 155 | then throw("the list of resources or random sequence is not filled") | |
156 | 156 | else nil | |
157 | 157 | $Tuple2(([StringEntry((("nft_" + assetIdStr) + "_data"), (("{'collection': '" + collectionDomain) + "'}")), StringEntry((("nft_" + assetIdStr) + "_image"), previewFile), StringEntry((("nft_" + assetIdStr) + "_original"), original), StringEntry((("nft_" + assetIdStr) + "_issuer"), toString(i.caller)), BooleanEntry((("nft_" + assetIdStr) + "_isGroup"), true), IntegerEntry((("group_" + assetIdStr) + "_size"), amount), IntegerEntry((("group_" + assetIdStr) + "_available"), amount), StringEntry((("group_" + assetIdStr) + "_collectionDomain"), collectionDomain), asset, ScriptTransfer(i.caller, 1, assetId)] ++ randData), assetIdStr) | |
158 | 158 | } | |
159 | 159 | else throw(("When creating a multiple collection, the number must be greater than 1 and less or equal " + toString(LIMIT_MINT_COPIES))) | |
160 | 160 | else throw("Wrong amount argument") | |
161 | 161 | } | |
162 | 162 | } | |
163 | 163 | ||
164 | 164 | ||
165 | 165 | ||
166 | 166 | @Callable(i) | |
167 | 167 | func mintFromGroup (groupAssetIdStr) = { | |
168 | 168 | let groupAsset = value(assetInfo(fromBase58String(groupAssetIdStr))) | |
169 | 169 | if (checkNFT(groupAsset)) | |
170 | 170 | then if ((i.caller == marketplaceContractAddress)) | |
171 | 171 | then { | |
172 | 172 | let isGroup = valueOrElse(getBoolean((("nft_" + groupAssetIdStr) + "_isGroup")), false) | |
173 | 173 | if (isGroup) | |
174 | 174 | then { | |
175 | 175 | let groupSize = valueOrElse(getInteger((("group_" + groupAssetIdStr) + "_size")), 0) | |
176 | 176 | let groupAvailable = valueOrElse(getInteger((("group_" + groupAssetIdStr) + "_available")), 0) | |
177 | 177 | if (if ((groupAvailable > 0)) | |
178 | 178 | then (groupSize > 0) | |
179 | 179 | else false) | |
180 | 180 | then { | |
181 | 181 | let collectionDomain = value(getString((("group_" + groupAssetIdStr) + "_collectionDomain"))) | |
182 | 182 | let origFile = value(getString((("nft_" + groupAssetIdStr) + "_original"))) | |
183 | 183 | let previewFile = value(getString((("nft_" + groupAssetIdStr) + "_image"))) | |
184 | 184 | let nftNum = (tryGetInteger((("collection_" + collectionDomain) + "_size")) + 1) | |
185 | 185 | let asset = Issue(groupAsset.name, groupAsset.description, 1, 0, false, unit, 0) | |
186 | 186 | let assetId = calculateAssetId(asset) | |
187 | 187 | let assetIdStr = toBase58String(assetId) | |
188 | 188 | let randIndexListStr = valueOrElse(getString((("group_" + groupAssetIdStr) + "_randIndexList")), "") | |
189 | 189 | let sourceListStr = valueOrElse(getString((("group_" + groupAssetIdStr) + "_sourceList")), "") | |
190 | 190 | let commonState = [StringEntry((("nft_" + assetIdStr) + "_data"), (((("{'collection': '" + collectionDomain) + "', 'num': ") + toString(nftNum)) + "}")), StringEntry((("nft_" + assetIdStr) + "_issuer"), toString(i.caller)), IntegerEntry((("collection_" + collectionDomain) + "_size"), nftNum), StringEntry(((("collection_" + collectionDomain) + "_assetId_") + assetIdStr), assetIdStr), IntegerEntry((("group_" + groupAssetIdStr) + "_available"), (groupAvailable - 1)), asset, ScriptTransfer(i.caller, 1, assetId)] | |
191 | 191 | if ((size(sourceListStr) > 0)) | |
192 | 192 | then if ((size(randIndexListStr) == 0)) | |
193 | 193 | then throw("Mint not available") | |
194 | 194 | else { | |
195 | 195 | let randIndexList = split(randIndexListStr, ",") | |
196 | 196 | let sourceList = split(sourceListStr, ",") | |
197 | 197 | let rand = getRandomNumber(groupAvailable, i.transactionId, height, 0) | |
198 | 198 | let randIndex = valueOrErrorMessage(parseInt(randIndexList[rand]), "Invalid rand index") | |
199 | 199 | $Tuple2((commonState ++ [StringEntry((("nft_" + assetIdStr) + "_image"), sourceList[randIndex]), StringEntry((("group_" + groupAssetIdStr) + "_randIndexList"), makeString(removeByIndex(randIndexList, rand), ","))]), assetIdStr) | |
200 | 200 | } | |
201 | 201 | else $Tuple2((commonState ++ [StringEntry((("nft_" + assetIdStr) + "_image"), previewFile), StringEntry((("nft_" + assetIdStr) + "_original"), origFile)]), assetIdStr) | |
202 | 202 | } | |
203 | 203 | else throw("Mint not available") | |
204 | 204 | } | |
205 | 205 | else throw("Invalid NFT identifier") | |
206 | 206 | } | |
207 | 207 | else throw("Invalid caller address") | |
208 | 208 | else throw("Wrong NFT Id") | |
209 | 209 | } | |
210 | 210 | ||
211 | 211 | ||
212 | 212 | ||
213 | 213 | @Callable(i) | |
214 | 214 | func burnNFT () = { | |
215 | 215 | let assetId = value(value(i.payments[0]).assetId) | |
216 | 216 | let asset = value(assetInfo(assetId)) | |
217 | 217 | if (if ((value(i.payments[0]).amount == 1)) | |
218 | 218 | then checkNFT(asset) | |
219 | 219 | else false) | |
220 | 220 | then { | |
221 | 221 | let assetIdStr = toBase58String(assetId) | |
222 | 222 | let issuer = tryGetString((("nft_" + assetIdStr) + "_issuer")) | |
223 | 223 | let data = tryGetString((("nft_" + assetIdStr) + "_data")) | |
224 | 224 | let partsData = split(data, ", ") | |
225 | 225 | let partsCollection = split(partsData[0], ": ") | |
226 | 226 | let collectionDomain = dropRight(drop(partsCollection[1], 1), 1) | |
227 | 227 | let isGroup = valueOrElse(getBoolean((("nft_" + assetIdStr) + "_isGroup")), false) | |
228 | 228 | if (!(isGroup)) | |
229 | 229 | then { | |
230 | 230 | let nftNum = tryGetInteger((("collection_" + collectionDomain) + "_size")) | |
231 | 231 | if ((nftNum > 0)) | |
232 | 232 | then { | |
233 | 233 | let updateCollection = if ((nftNum == 1)) | |
234 | 234 | then DeleteEntry((("collection_" + collectionDomain) + "_size")) | |
235 | 235 | else IntegerEntry((("collection_" + collectionDomain) + "_size"), (nftNum - 1)) | |
236 | 236 | [updateCollection, Burn(assetId, 1), DeleteEntry((("nft_" + assetIdStr) + "_data")), DeleteEntry((("nft_" + assetIdStr) + "_image")), DeleteEntry((("nft_" + assetIdStr) + "_original")), DeleteEntry((("nft_" + assetIdStr) + "_issuer")), DeleteEntry((("nft_" + assetIdStr) + "_isGroup")), DeleteEntry((("group_" + assetIdStr) + "_size")), DeleteEntry((("group_" + assetIdStr) + "_available")), DeleteEntry((("group_" + assetIdStr) + "_collectionDomain")), DeleteEntry(((("collection_" + collectionDomain) + "_assetId_") + assetIdStr))] | |
237 | 237 | } | |
238 | 238 | else throw("Ivalid collection name") | |
239 | 239 | } | |
240 | 240 | else [Burn(assetId, 1), DeleteEntry((("nft_" + assetIdStr) + "_data")), DeleteEntry((("nft_" + assetIdStr) + "_image")), DeleteEntry((("nft_" + assetIdStr) + "_original")), DeleteEntry((("nft_" + assetIdStr) + "_issuer")), DeleteEntry((("nft_" + assetIdStr) + "_isGroup")), DeleteEntry((("group_" + assetIdStr) + "_size")), DeleteEntry((("group_" + assetIdStr) + "_available")), DeleteEntry((("group_" + assetIdStr) + "_collectionDomain")), DeleteEntry((("group_" + assetIdStr) + "_sourceList")), DeleteEntry((("group_" + assetIdStr) + "_randIndexList"))] | |
241 | 241 | } | |
242 | 242 | else throw("Ivalid NFT attached") | |
243 | 243 | } | |
244 | 244 | ||
245 | 245 | ||
246 | 246 | ||
247 | 247 | @Callable(i) | |
248 | 248 | func editImageNFT (id,newImageUrl) = if ((indexOf(editorsWhiteList, toString(i.caller)) == unit)) | |
249 | 249 | then throw("Editing NFTs is limited") | |
250 | 250 | else if ((indexOf(newImageUrl, "https://") != 0)) | |
251 | 251 | then throw("https link to image required") | |
252 | 252 | else { | |
253 | 253 | let asset = valueOrErrorMessage(assetInfo(fromBase58String(id)), "NFT not fouded") | |
254 | - | let assetIdStr = toBase58String(asset.id) | |
255 | - | let dataExist = valueOrErrorMessage(getString((("nft_" + assetIdStr) + "_data")), "NFT data not fouded") | |
254 | + | let alexandra = Address(base58'3PCyjqHhtq9f9Hmn4LNsWwA68dFVsvQ6iNi') | |
255 | + | let tsunamiIssuer = Address(base58'3PPLea51cvcmmLAhMqT7r4VmarDMf7Y5iVH') | |
256 | + | if (if ((i.caller == alexandra)) | |
257 | + | then (asset.issuer != tsunamiIssuer) | |
258 | + | else false) | |
259 | + | then throw("Use only tsunami NFT") | |
260 | + | else { | |
261 | + | let assetIdStr = toBase58String(asset.id) | |
262 | + | let dataExist = valueOrErrorMessage(getString((("nft_" + assetIdStr) + "_data")), "NFT data not fouded") | |
256 | 263 | [StringEntry((("nft_" + assetIdStr) + "_image"), newImageUrl)] | |
264 | + | } | |
257 | 265 | } | |
258 | 266 | ||
259 | 267 | ||
260 | 268 | @Verifier(tx) | |
261 | 269 | func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) | |
262 | 270 |
github/deemru/w8io/3ef1775 276.78 ms ◑