tx · HGEAZVpji3VEVbQzGMswap25Qrojeg5eZHAVBHpWYYNT 3PFQjjDMiZKQZdu5JqTHD7HwgSXyp9Rw9By: -0.01300000 Waves 2023.01.22 20:44 [3481986] smart account 3PFQjjDMiZKQZdu5JqTHD7HwgSXyp9Rw9By > SELF 0.00000000 Waves
{ "type": 13, "id": "HGEAZVpji3VEVbQzGMswap25Qrojeg5eZHAVBHpWYYNT", "fee": 1300000, "feeAssetId": null, "timestamp": 1674409458156, "version": 2, "chainId": 87, "sender": "3PFQjjDMiZKQZdu5JqTHD7HwgSXyp9Rw9By", "senderPublicKey": "A2fujmmHBBAFrVGCyHBHVbzEtHvDsFniNoiovp2N4fES", "proofs": [ "59WXuoPFjyXJXh6wgqXXqz9NycqLye7JyzieFEn6HoVR7W2YmKVFvmrAWn87shKYY2LXZbyYaRP6CNMCkMqUy8cq" ], "script": "base64:BgIpCAISBgoECAgICBILCgkICAgICAEICAgSAwoBCBIAEgQKAggIEgMKAQgOABBpc3N1ZXJzV2hpdGVsaXN0CQDMCAICIzNQM2lWODVlWGZrY0EzRGQxM0VwWkJZdnMxdmtLWDZBWUVOCQDMCAICIzNQSEZBYXZ4ajJlUEpxRkI0NkgyYVJHQTdvUUw2a3oxckpKCQDMCAICIzNQNnBlb3ZBa1ZOM3B4Nlp1djh5Mm5vVFdIRk00UjVXamo4CQDMCAICIzNQNUNRa3ZrOFB1NnJHUDNRYXY0THdza3dhOHBMaE53VGJSCQDMCAICIzNQSEtEQ1FTY3ZTUEh2ZENVZXVjRmt4NVExeE1VUkE5a2JyCQDMCAICIzNQTWtpNXNIQnNRYjRLZ0RrbmJVd3NMM1lneGFDemFabkNKCQDMCAICIzNQMndNQ0RqdHhlTGRmUXJwUjhXVWU1ek5lU2NNNFVhTDNvCQDMCAICIzNQM3BEb3NxNEdDd2ZKa3ZxNHlxS3Z2b1R3bW9xYzlxUG1vCQDMCAICIzNQUGdlWVRXTVJaN1M3alNMcG5WdUtLQjlyNlh1RGszbmRDCQDMCAICIzNQS1ZnZDZkczF4ZXJ2SzZiUFhiRUhCcWc4aWJUY2Y1SFprCQDMCAICIzNQRDFzZDU1UFl6bUdVclE4OTZRdDN1dmRidGdqQ1ZwYWpFCQDMCAICIzNQRmtndkM5eTZ6SHk2NHpFQXNjS0tnYU5ZM3lpcGlMcWJXCQDMCAICIzNQR0dTaUx1d0dtbTdDaGZqRHJtRVpCZDZIeFFKbjhOMU5NCQDMCAICIzNQSkttWG9ISnZWZVFYalNKZGh0a1VjRkR0ZGlRcU1iVVRECQDMCAICIzNQNWJMNlY0b0dUWnRNVGlyajlXeHRieFVudHFYZGpldkFFCQDMCAICIzNQQ3lqcUhodHE5ZjlIbW40TE5zV3dBNjhkRlZzdlE2aU5pCQDMCAICIzNQS0hGWDZXNGFBcjFlMWI4TVVUejVIbWRXVlVjaldoZ1k0CQDMCAICIzNQSlZreDdYUm84NnpVODhzaEx1S0dtYlJyN1JrTVN4akhqCQDMCAICIzNQTHU3Y29NTlY0bmFDeFdrUmVtcWdhNm85elVoUXBweHNBCQDMCAICIzNQR0tFZTR5NTlWM1dMbkh3UEVVYU1XZGJ6eThzYjk4MmZHCQDMCAICIzNQNWQ4YTFIMm0yekZRYWtoYWFvdzN1REU3N1VZTEdkODl2BQNuaWwAEGVkaXRvcnNXaGl0ZUxpc3QJAMwIAgIjM1BHS0VlNHk1OVYzV0xuSHdQRVVhTVdkYnp5OHNiOTgyZkcJAMwIAgIjM1A3TmhtRHQzMWVrUTJKcnl4dG1kZ1oxRFhnVlB3eW9jSksJAMwIAgIjM1BDeWpxSGh0cTlmOUhtbjRMTnNXd0E2OGRGVnN2UTZpTmkJAMwIAgIjM1A2WUFUdHJjVGtNb0VldVpWYVV4bkQ5OUR1SmVHMTV5YW8FA25pbAAWbWludEZyb21Hcm91cFdoaXRlTGlzdAkAzAgCCQEHQWRkcmVzcwEBGgFXXYvxX8soIGsfZqPIbtoLqJftD+j9yUTxCQDMCAIJAQdBZGRyZXNzAQEaAVez1ZJUSQmaKhD7xvifEHar7z8PcqWJFYwFA25pbAAWbmZ0VWx0cmFTdGFraW5nV3JhcHBlcgkBB0FkZHJlc3MBARoBV8Ctwm0yzZGvpVdF2IfyU8Fajsi9JorKCwAUbmZ0V2F2ZXNQdW5rc1dyYXBwZXIJAQdBZGRyZXNzAQEaAVd5moowGgnVnajKJ2gj2RvVoec0kMbogy0AEUxJTUlUX01JTlRfQ09QSUVTAJBOAQ10cnlHZXRJbnRlZ2VyAQNrZXkEByRtYXRjaDAJAJoIAgUEdGhpcwUDa2V5AwkAAQIFByRtYXRjaDACA0ludAQBYgUHJG1hdGNoMAUBYgAAAQx0cnlHZXRTdHJpbmcBA2tleQQHJG1hdGNoMAkAnQgCBQR0aGlzBQNrZXkDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFiBQckbWF0Y2gwBQFiAgABCGNoZWNrTkZUAQVhc3NldAMDAwkAAAIICAUFYXNzZXQGaXNzdWVyBWJ5dGVzCAUEdGhpcwVieXRlcwkAAAIIBQVhc3NldAhkZWNpbWFscwAABwkAAAIIBQVhc3NldApyZWlzc3VhYmxlBwcJAAACCAUFYXNzZXQIcXVhbnRpdHkAAQcBD2dldFJhbmRvbU51bWJlcgQIdmFyaWFudHMEdHhJZBRoYXRjaGluZ0ZpbmlzaEhlaWdodAZvZmZzZXQED3JhbmRvbVNlZWRCbG9jawkBBXZhbHVlAQkA7QcBCQBlAgUUaGF0Y2hpbmdGaW5pc2hIZWlnaHQAAQQKcmFuZG9tSGFzaAkA9wMBCQDLAQIFBHR4SWQJAQV2YWx1ZQEIBQ9yYW5kb21TZWVkQmxvY2sDdnJmCQBqAgkAsgkCBQpyYW5kb21IYXNoCQBoAgUGb2Zmc2V0AAgFCHZhcmlhbnRzAQtpc1N1YlN0cmluZwIDc3RyBnN1YlN0cgQHJG1hdGNoMAkAswkCBQNzdHIFBnN1YlN0cgMJAAECBQckbWF0Y2gwAgNJbnQEAXQFByRtYXRjaDAGBwESaXNVbHRyYVN0YWtpbmdOYW1lAQRuYW1lAwkBC2lzU3ViU3RyaW5nAgUEbmFtZQIKQm9yZWQgQW5pYQYDCQELaXNTdWJTdHJpbmcCBQRuYW1lAgxCb3JlZCBBbmlhICMGAwkBC2lzU3ViU3RyaW5nAgUEbmFtZQIQUFVaWkxFIEVhcmx5IEVhZwYHARBpc1dhdmVzUHVua3NOYW1lAQRuYW1lAwkBC2lzU3ViU3RyaW5nAgUEbmFtZQIKTWVtYWxpZW4gIwYDCQELaXNTdWJTdHJpbmcCBQRuYW1lAgxab21iaWVQdW5rICMGAwkBC2lzU3ViU3RyaW5nAgUEbmFtZQIJTWFkUHVuayAjBgMJAQtpc1N1YlN0cmluZwIFBG5hbWUCC1dhdmVzUHVuayAjBgcBC2lzVmFsaWROYW1lAgRuYW1lBmNhbGxlcgMDCQBmAgAECQCxAgEFBG5hbWUGCQBmAgkAsQIBBQRuYW1lABAJAAIBAihOYW1lIG11c3QgYmUgYmV0d2VlbiA0IGFuZCAxNiBjaGFyYWN0ZXJzBAxhbGxvd0NhbGxlcnMJAMwIAgUWbmZ0VWx0cmFTdGFraW5nV3JhcHBlcgkAzAgCBRRuZnRXYXZlc1B1bmtzV3JhcHBlcgUDbmlsBAckbWF0Y2gwCQDPCAIFDGFsbG93Q2FsbGVycwUGY2FsbGVyAwkAAQIFByRtYXRjaDACA0ludAQBdAUHJG1hdGNoMAYDCQEBIQEJARJpc1VsdHJhU3Rha2luZ05hbWUBBQRuYW1lCQEBIQEJARBpc1dhdmVzUHVua3NOYW1lAQUEbmFtZQcGAWkBCWNyZWF0ZU5GVAQHbmZ0TmFtZQduZnREZXNjBWltYWdlDmNvbGxlY3Rpb25OYW1lAwkBASEBCQELaXNWYWxpZE5hbWUCBQduZnROYW1lCAUBaQZjYWxsZXIJAAIBAhBJbnZhbGlkIG5mdCBuYW1lAwkBAiE9AgkAswkCBQVpbWFnZQIIaHR0cHM6Ly8AAAkAAgECHGh0dHBzIGxpbmsgdG8gaW1hZ2UgcmVxdWlyZWQEBWFzc2V0CQDDCAcFB25mdE5hbWUFB25mdERlc2MAAQAABwUEdW5pdAAABAdhc3NldElkCQC4CAEFBWFzc2V0BAphc3NldElkU3RyCQDYBAEFB2Fzc2V0SWQEEGNvbGxlY3Rpb25Eb21haW4JAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwMJAGYCCQCxAgEFDmNvbGxlY3Rpb25OYW1lAAAFDmNvbGxlY3Rpb25OYW1lAgViYXNpYwQGbmZ0TnVtCQBkAgkBDXRyeUdldEludGVnZXIBCQCsAgIJAKwCAgILY29sbGVjdGlvbl8FEGNvbGxlY3Rpb25Eb21haW4CBV9zaXplAAEJAJQKAgkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgIEbmZ0XwUKYXNzZXRJZFN0cgIFX2RhdGEJAKwCAgkArAICCQCsAgIJAKwCAgIQeydjb2xsZWN0aW9uJzogJwUQY29sbGVjdGlvbkRvbWFpbgIKJywgJ251bSc6IAkApAMBBQZuZnROdW0CAX0JAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgICBG5mdF8FCmFzc2V0SWRTdHICBl9pbWFnZQUFaW1hZ2UJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgICBG5mdF8FCmFzc2V0SWRTdHICB19pc3N1ZXIJAKUIAQgFAWkGY2FsbGVyCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgILY29sbGVjdGlvbl8FEGNvbGxlY3Rpb25Eb21haW4CBV9zaXplBQZuZnROdW0JAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgILY29sbGVjdGlvbl8FEGNvbGxlY3Rpb25Eb21haW4CCV9hc3NldElkXwUKYXNzZXRJZFN0cgUKYXNzZXRJZFN0cgkAzAgCBQVhc3NldAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIAAQUHYXNzZXRJZAUDbmlsBQphc3NldElkU3RyAWkBBG1pbnQJBG5hbWUEZGVzYwpjb2xsZWN0aW9uB3ByZXZpZXcIb3JpZ2luYWwGYW1vdW50CnNvdXJjZUxpc3QNcmFuZEluZGV4TGlzdApwYXJhbXNMaXN0BAduZnREZXNjBQRkZXNjBA5jb2xsZWN0aW9uTmFtZQUKY29sbGVjdGlvbgQLcHJldmlld0ZpbGUDCQBmAgkAsQIBBQdwcmV2aWV3AAAFB3ByZXZpZXcFCG9yaWdpbmFsAwkBASEBCQELaXNWYWxpZE5hbWUCBQRuYW1lCAUBaQZjYWxsZXIJAAIBAhBJbnZhbGlkIG5mdCBuYW1lAwkAAAIJALECAQUOY29sbGVjdGlvbk5hbWUAAAkAAgECGUluY29ycmVjdCBjb2xsZWN0aW9uIG5hbWUDAwkBAiE9AgkAswkCBQhvcmlnaW5hbAIIaHR0cHM6Ly8AAAYJAQIhPQIJALMJAgULcHJldmlld0ZpbGUCCGh0dHBzOi8vAAAJAAIBAhtodHRwcyBsaW5rIHRvIGZpbGUgcmVxdWlyZWQEBWFzc2V0CQDDCAcFBG5hbWUFB25mdERlc2MAAQAABwUEdW5pdAAABAdhc3NldElkCQC4CAEFBWFzc2V0BAphc3NldElkU3RyCQDYBAEFB2Fzc2V0SWQDCQAAAgUGYW1vdW50AAEEEGNvbGxlY3Rpb25Eb21haW4JAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwMJAGYCCQCxAgEFDmNvbGxlY3Rpb25OYW1lAAAFDmNvbGxlY3Rpb25OYW1lAgViYXNpYwQGbmZ0TnVtCQBkAgkBDXRyeUdldEludGVnZXIBCQCsAgIJAKwCAgILY29sbGVjdGlvbl8FEGNvbGxlY3Rpb25Eb21haW4CBV9zaXplAAEJAJQKAgkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgIEbmZ0XwUKYXNzZXRJZFN0cgIFX2RhdGEJAKwCAgkArAICCQCsAgIJAKwCAgIQeydjb2xsZWN0aW9uJzogJwUQY29sbGVjdGlvbkRvbWFpbgIKJywgJ251bSc6IAkApAMBBQZuZnROdW0CAX0JAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgICBG5mdF8FCmFzc2V0SWRTdHICBl9pbWFnZQULcHJldmlld0ZpbGUJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgICBG5mdF8FCmFzc2V0SWRTdHICCV9vcmlnaW5hbAUIb3JpZ2luYWwJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgICBG5mdF8FCmFzc2V0SWRTdHICB19pc3N1ZXIJAKUIAQgFAWkGY2FsbGVyCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgILY29sbGVjdGlvbl8FEGNvbGxlY3Rpb25Eb21haW4CBV9zaXplBQZuZnROdW0JAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgILY29sbGVjdGlvbl8FEGNvbGxlY3Rpb25Eb21haW4CCV9hc3NldElkXwUKYXNzZXRJZFN0cgUKYXNzZXRJZFN0cgkAzAgCBQVhc3NldAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIAAQUHYXNzZXRJZAUDbmlsBQphc3NldElkU3RyAwkAZgIFBmFtb3VudAABAwkAZwIFEUxJTUlUX01JTlRfQ09QSUVTBQZhbW91bnQEEGNvbGxlY3Rpb25Eb21haW4JAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwUOY29sbGVjdGlvbk5hbWUECHJhbmREYXRhAwMJAGYCCQCxAgEFDXJhbmRJbmRleExpc3QAAAkAZgIJALECAQUKc291cmNlTGlzdAAABwMJAQIhPQIJAJADAQkAvQkCBQ1yYW5kSW5kZXhMaXN0AgEsBQZhbW91bnQJAAIBAjxyYW5kb20gbGlzdCBpcyBub3QgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBhdmFpbGFibGUgZWxlbWVudHMDCQAAAgkAsQIBBQpwYXJhbXNMaXN0AAAJAAIBAhRwYXJhbXMgbGlzdCBpcyBlbXB0eQkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgIGZ3JvdXBfBQphc3NldElkU3RyAgtfc291cmNlTGlzdAUKc291cmNlTGlzdAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgIGZ3JvdXBfBQphc3NldElkU3RyAg5fcmFuZEluZGV4TGlzdAUNcmFuZEluZGV4TGlzdAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgIGZ3JvdXBfBQphc3NldElkU3RyAgtfcGFyYW1zTGlzdAUKcGFyYW1zTGlzdAUDbmlsAwMDCQBmAgkAsQIBBQ1yYW5kSW5kZXhMaXN0AAAJAAACCQCxAgEFCnNvdXJjZUxpc3QAAAcGAwkAAAIJALECAQUNcmFuZEluZGV4TGlzdAAACQBmAgkAsQIBBQpzb3VyY2VMaXN0AAAHCQACAQI2dGhlIGxpc3Qgb2YgcmVzb3VyY2VzIG9yIHJhbmRvbSBzZXF1ZW5jZSBpcyBub3QgZmlsbGVkBQNuaWwJAJQKAgkAzggCCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICAgRuZnRfBQphc3NldElkU3RyAgVfZGF0YQkArAICCQCsAgICEHsnY29sbGVjdGlvbic6ICcFEGNvbGxlY3Rpb25Eb21haW4CAid9CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICAgRuZnRfBQphc3NldElkU3RyAgZfaW1hZ2UFC3ByZXZpZXdGaWxlCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICAgRuZnRfBQphc3NldElkU3RyAglfb3JpZ2luYWwFCG9yaWdpbmFsCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICAgRuZnRfBQphc3NldElkU3RyAgdfaXNzdWVyCQClCAEIBQFpBmNhbGxlcgkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICCQCsAgICBG5mdF8FCmFzc2V0SWRTdHICCF9pc0dyb3VwBgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgICBmdyb3VwXwUKYXNzZXRJZFN0cgIFX3NpemUFBmFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgICBmdyb3VwXwUKYXNzZXRJZFN0cgIKX2F2YWlsYWJsZQUGYW1vdW50CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICAgZncm91cF8FCmFzc2V0SWRTdHICEV9jb2xsZWN0aW9uRG9tYWluBRBjb2xsZWN0aW9uRG9tYWluCQDMCAIFBWFzc2V0CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgABBQdhc3NldElkBQNuaWwFCHJhbmREYXRhBQphc3NldElkU3RyCQACAQkArAICAllXaGVuIGNyZWF0aW5nIGEgbXVsdGlwbGUgY29sbGVjdGlvbiwgdGhlIG51bWJlciBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAxIGFuZCBsZXNzIG9yIGVxdWFsIAkApAMBBRFMSU1JVF9NSU5UX0NPUElFUwkAAgECFVdyb25nIGFtb3VudCBhcmd1bWVudAFpAQ1taW50RnJvbUdyb3VwAQ9ncm91cEFzc2V0SWRTdHIECmdyb3VwQXNzZXQJAQV2YWx1ZQEJAOwHAQkA2QQBBQ9ncm91cEFzc2V0SWRTdHIDCQEIY2hlY2tORlQBBQpncm91cEFzc2V0AwkBCWlzRGVmaW5lZAEJAM8IAgUWbWludEZyb21Hcm91cFdoaXRlTGlzdAgFAWkGY2FsbGVyBAdpc0dyb3VwCQELdmFsdWVPckVsc2UCCQCgCAEJAKwCAgkArAICAgRuZnRfBQ9ncm91cEFzc2V0SWRTdHICCF9pc0dyb3VwBwMFB2lzR3JvdXAECWdyb3VwU2l6ZQkBC3ZhbHVlT3JFbHNlAgkAnwgBCQCsAgIJAKwCAgIGZ3JvdXBfBQ9ncm91cEFzc2V0SWRTdHICBV9zaXplAAAEDmdyb3VwQXZhaWxhYmxlCQELdmFsdWVPckVsc2UCCQCfCAEJAKwCAgkArAICAgZncm91cF8FD2dyb3VwQXNzZXRJZFN0cgIKX2F2YWlsYWJsZQAAAwMJAGYCBQ5ncm91cEF2YWlsYWJsZQAACQBmAgUJZ3JvdXBTaXplAAAHBBBjb2xsZWN0aW9uRG9tYWluCQEFdmFsdWUBCQCiCAEJAKwCAgkArAICAgZncm91cF8FD2dyb3VwQXNzZXRJZFN0cgIRX2NvbGxlY3Rpb25Eb21haW4ECG9yaWdGaWxlCQEFdmFsdWUBCQCiCAEJAKwCAgkArAICAgRuZnRfBQ9ncm91cEFzc2V0SWRTdHICCV9vcmlnaW5hbAQLcHJldmlld0ZpbGUJAQV2YWx1ZQEJAKIIAQkArAICCQCsAgICBG5mdF8FD2dyb3VwQXNzZXRJZFN0cgIGX2ltYWdlBAtncm91cElzc3VlcgkBBXZhbHVlAQkAoggBCQCsAgIJAKwCAgIEbmZ0XwUPZ3JvdXBBc3NldElkU3RyAgdfaXNzdWVyBAZuZnROdW0JAGQCCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgkArAICAgtjb2xsZWN0aW9uXwUQY29sbGVjdGlvbkRvbWFpbgIFX3NpemUAAQQFYXNzZXQJAMMIBwgFCmdyb3VwQXNzZXQEbmFtZQgFCmdyb3VwQXNzZXQLZGVzY3JpcHRpb24AAQAABwUEdW5pdAAABAdhc3NldElkCQC4CAEFBWFzc2V0BAphc3NldElkU3RyCQDYBAEFB2Fzc2V0SWQEEHJhbmRJbmRleExpc3RTdHIJAQt2YWx1ZU9yRWxzZQIJAKIIAQkArAICCQCsAgICBmdyb3VwXwUPZ3JvdXBBc3NldElkU3RyAg5fcmFuZEluZGV4TGlzdAIABA1zb3VyY2VMaXN0U3RyCQELdmFsdWVPckVsc2UCCQCiCAEJAKwCAgkArAICAgZncm91cF8FD2dyb3VwQXNzZXRJZFN0cgILX3NvdXJjZUxpc3QCAAQNcGFyYW1zTGlzdFN0cgkBC3ZhbHVlT3JFbHNlAgkAoggBCQCsAgIJAKwCAgIGZ3JvdXBfBQ9ncm91cEFzc2V0SWRTdHICC19wYXJhbXNMaXN0AgAEC2NvbW1vblN0YXRlCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICAgRuZnRfBQphc3NldElkU3RyAgVfZGF0YQkArAICCQCsAgIJAKwCAgkArAICAhB7J2NvbGxlY3Rpb24nOiAnBRBjb2xsZWN0aW9uRG9tYWluAgonLCAnbnVtJzogCQCkAwEFBm5mdE51bQIBfQkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgIEbmZ0XwUKYXNzZXRJZFN0cgIHX2lzc3VlcgULZ3JvdXBJc3N1ZXIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICAgtjb2xsZWN0aW9uXwUQY29sbGVjdGlvbkRvbWFpbgIFX3NpemUFBm5mdE51bQkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICAgtjb2xsZWN0aW9uXwUQY29sbGVjdGlvbkRvbWFpbgIJX2Fzc2V0SWRfBQphc3NldElkU3RyBQphc3NldElkU3RyCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgIGZ3JvdXBfBQ9ncm91cEFzc2V0SWRTdHICCl9hdmFpbGFibGUJAGUCBQ5ncm91cEF2YWlsYWJsZQABCQDMCAIFBWFzc2V0CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgABBQdhc3NldElkBQNuaWwDCQBmAgkAsQIBBQ1zb3VyY2VMaXN0U3RyAAADCQAAAgkAsQIBBRByYW5kSW5kZXhMaXN0U3RyAAAJAAIBAhJNaW50IG5vdCBhdmFpbGFibGUEDXJhbmRJbmRleExpc3QJAL0JAgUQcmFuZEluZGV4TGlzdFN0cgIBLAQKc291cmNlTGlzdAkAvQkCBQ1zb3VyY2VMaXN0U3RyAgEsBApwYXJhbXNMaXN0CQC9CQIFDXBhcmFtc0xpc3RTdHICASwEBHJhbmQJAQ9nZXRSYW5kb21OdW1iZXIEBQ5ncm91cEF2YWlsYWJsZQgFAWkNdHJhbnNhY3Rpb25JZAUGaGVpZ2h0AAAECXJhbmRJbmRleAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQC2CQEJAJEDAgUNcmFuZEluZGV4TGlzdAUEcmFuZAISSW52YWxpZCByYW5kIGluZGV4BAtwYXJhbXNFbnRyeQQHJG1hdGNoMAkAkQMCBQpwYXJhbXNMaXN0BQlyYW5kSW5kZXgDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAF0BQckbWF0Y2gwCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICAgRuZnRfBQphc3NldElkU3RyAgdfcGFyYW1zBQF0BQNuaWwFA25pbAkAlAoCCQDOCAIJAM4IAgULY29tbW9uU3RhdGUFC3BhcmFtc0VudHJ5CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICAgRuZnRfBQphc3NldElkU3RyAgZfaW1hZ2UJAJEDAgUKc291cmNlTGlzdAUJcmFuZEluZGV4CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICAgZncm91cF8FD2dyb3VwQXNzZXRJZFN0cgIOX3JhbmRJbmRleExpc3QJALsJAgkA0QgCBQ1yYW5kSW5kZXhMaXN0BQRyYW5kAgEsBQNuaWwFCmFzc2V0SWRTdHIJAJQKAgkAzggCBQtjb21tb25TdGF0ZQkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgIEbmZ0XwUKYXNzZXRJZFN0cgIGX2ltYWdlBQtwcmV2aWV3RmlsZQkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgIEbmZ0XwUKYXNzZXRJZFN0cgIJX29yaWdpbmFsBQhvcmlnRmlsZQUDbmlsBQphc3NldElkU3RyCQACAQISTWludCBub3QgYXZhaWxhYmxlCQACAQIWSW52YWxpZCBORlQgaWRlbnRpZmllcgkAAgECFkludmFsaWQgY2FsbGVyIGFkZHJlc3MJAAIBAgxXcm9uZyBORlQgSWQBaQEHYnVybk5GVAAEB2Fzc2V0SWQJAQV2YWx1ZQEICQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAQFYXNzZXQJAQV2YWx1ZQEJAOwHAQUHYXNzZXRJZAMDCQAAAggJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQAAQkBCGNoZWNrTkZUAQUFYXNzZXQHBAphc3NldElkU3RyCQDYBAEFB2Fzc2V0SWQEBmlzc3VlcgkBDHRyeUdldFN0cmluZwEJAKwCAgkArAICAgRuZnRfBQphc3NldElkU3RyAgdfaXNzdWVyBAdpc0dyb3VwCQELdmFsdWVPckVsc2UCCQCgCAEJAKwCAgkArAICAgRuZnRfBQphc3NldElkU3RyAghfaXNHcm91cAcDCQEBIQEFB2lzR3JvdXAEBGRhdGEJAQx0cnlHZXRTdHJpbmcBCQCsAgIJAKwCAgIEbmZ0XwUKYXNzZXRJZFN0cgIFX2RhdGEECXBhcnRzRGF0YQkAtQkCBQRkYXRhAgIsIAQPcGFydHNDb2xsZWN0aW9uCQC1CQIJAJEDAgUJcGFydHNEYXRhAAACAjogBBBjb2xsZWN0aW9uRG9tYWluCQCzAgIJALACAgkAkQMCBQ9wYXJ0c0NvbGxlY3Rpb24AAQABAAEEBm5mdE51bQkBDXRyeUdldEludGVnZXIBCQCsAgIJAKwCAgILY29sbGVjdGlvbl8FEGNvbGxlY3Rpb25Eb21haW4CBV9zaXplAwkAZgIFBm5mdE51bQAABBB1cGRhdGVDb2xsZWN0aW9uAwkAAAIFBm5mdE51bQABCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgILY29sbGVjdGlvbl8FEGNvbGxlY3Rpb25Eb21haW4CBV9zaXplCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgICC2NvbGxlY3Rpb25fBRBjb2xsZWN0aW9uRG9tYWluAgVfc2l6ZQkAZQIFBm5mdE51bQABCQDMCAIFEHVwZGF0ZUNvbGxlY3Rpb24JAMwIAgkBBEJ1cm4CBQdhc3NldElkAAEJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgICBG5mdF8FCmFzc2V0SWRTdHICBV9kYXRhCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICAgRuZnRfBQphc3NldElkU3RyAgZfaW1hZ2UJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgICBG5mdF8FCmFzc2V0SWRTdHICB19wYXJhbXMJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgICBG5mdF8FCmFzc2V0SWRTdHICCV9vcmlnaW5hbAkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgIEbmZ0XwUKYXNzZXRJZFN0cgIHX2lzc3VlcgkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgIEbmZ0XwUKYXNzZXRJZFN0cgIIX2lzR3JvdXAJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgICBmdyb3VwXwUKYXNzZXRJZFN0cgIFX3NpemUJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgICBmdyb3VwXwUKYXNzZXRJZFN0cgIKX2F2YWlsYWJsZQkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgIGZ3JvdXBfBQphc3NldElkU3RyAhFfY29sbGVjdGlvbkRvbWFpbgkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgkArAICAgtjb2xsZWN0aW9uXwUQY29sbGVjdGlvbkRvbWFpbgIJX2Fzc2V0SWRfBQphc3NldElkU3RyCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICAgtjb2xsZWN0aW9uXwUQY29sbGVjdGlvbkRvbWFpbgIIX2Fzc2V0SWQFA25pbAkAAgECFkl2YWxpZCBjb2xsZWN0aW9uIG5hbWUEEGNvbGxlY3Rpb25Eb21haW4JAQV2YWx1ZQEJAKIIAQkArAICCQCsAgICBmdyb3VwXwUKYXNzZXRJZFN0cgIRX2NvbGxlY3Rpb25Eb21haW4JAMwIAgkBBEJ1cm4CBQdhc3NldElkAAEJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgICBG5mdF8FCmFzc2V0SWRTdHICBV9kYXRhCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICAgRuZnRfBQphc3NldElkU3RyAgZfaW1hZ2UJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgICBG5mdF8FCmFzc2V0SWRTdHICCV9vcmlnaW5hbAkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgIEbmZ0XwUKYXNzZXRJZFN0cgIHX2lzc3VlcgkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgIEbmZ0XwUKYXNzZXRJZFN0cgIIX2lzR3JvdXAJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgICBmdyb3VwXwUKYXNzZXRJZFN0cgIFX3NpemUJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgICBmdyb3VwXwUKYXNzZXRJZFN0cgIKX2F2YWlsYWJsZQkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgIGZ3JvdXBfBQphc3NldElkU3RyAhFfY29sbGVjdGlvbkRvbWFpbgkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgIGZ3JvdXBfBQphc3NldElkU3RyAgtfc291cmNlTGlzdAkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgIGZ3JvdXBfBQphc3NldElkU3RyAg5fcmFuZEluZGV4TGlzdAkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgIGZ3JvdXBfBQphc3NldElkU3RyAgtfcGFyYW1zTGlzdAkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgILY29sbGVjdGlvbl8FEGNvbGxlY3Rpb25Eb21haW4CCF9hc3NldElkBQNuaWwJAAIBAhNJdmFsaWQgTkZUIGF0dGFjaGVkAWkBDGVkaXRJbWFnZU5GVAICaWQLbmV3SW1hZ2VVcmwDCQAAAgkAzwgCBRBlZGl0b3JzV2hpdGVMaXN0CQClCAEIBQFpBmNhbGxlcgUEdW5pdAkAAgECF0VkaXRpbmcgTkZUcyBpcyBsaW1pdGVkAwkBAiE9AgkAswkCBQtuZXdJbWFnZVVybAIIaHR0cHM6Ly8AAAkAAgECHGh0dHBzIGxpbmsgdG8gaW1hZ2UgcmVxdWlyZWQEBWFzc2V0CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQkA2QQBBQJpZAIOTkZUIG5vdCBmb3VkZWQECWFsZXhhbmRyYQkBB0FkZHJlc3MBARoBV3kzNKWWSa49fxnYw58/cJf/9NlZPGCRhwQNdHN1bmFtaU1lbWJlcgkBB0FkZHJlc3MBARoBVzKMMm1h4DpamC6EoPgEvhzToPKjDFi6SAQNdHN1bmFtaUlzc3VlcgIjM1BQTGVhNTFjdmNtbUxBaE1xVDdyNFZtYXJETWY3WTVpVkgEC2Fzc2V0SXNzdWVyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKIIAQkArAICCQCsAgICBG5mdF8JANgEAQgFBWFzc2V0AmlkAgdfaXNzdWVyAhBJc3N1ZXIgbm90IGZvdW5kAwMDCQAAAggFAWkGY2FsbGVyBQlhbGV4YW5kcmEGCQAAAggFAWkGY2FsbGVyBQ10c3VuYW1pTWVtYmVyCQECIT0CBQthc3NldElzc3VlcgUNdHN1bmFtaUlzc3VlcgcJAAIBAhRVc2Ugb25seSB0c3VuYW1pIE5GVAQKYXNzZXRJZFN0cgkA2AQBCAUFYXNzZXQCaWQECWRhdGFFeGlzdAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAEJAKwCAgkArAICAgRuZnRfBQphc3NldElkU3RyAgVfZGF0YQITTkZUIGRhdGEgbm90IGZvdWRlZAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgIEbmZ0XwUKYXNzZXRJZFN0cgIGX2ltYWdlBQtuZXdJbWFnZVVybAUDbmlsAWkBDHVwZGF0ZUZvcm1hdAECaWQEBWFzc2V0CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQkA2QQBBQJpZAIQaW52YWxpZCBhc3NldCBJZAQKYXNzZXRJZFN0cgkA2AQBCAUFYXNzZXQCaWQEBGRhdGEJAQx0cnlHZXRTdHJpbmcBCQCsAgIJAKwCAgIEbmZ0XwUKYXNzZXRJZFN0cgIFX2RhdGEECXBhcnRzRGF0YQkAtQkCBQRkYXRhAgIsIAQPcGFydHNDb2xsZWN0aW9uCQC1CQIJAJEDAgUJcGFydHNEYXRhAAACAjogBBBjb2xsZWN0aW9uRG9tYWluCQCzAgIJALACAgkAkQMCBQ9wYXJ0c0NvbGxlY3Rpb24AAQABAAEDCQBmAgkAsQIBBRBjb2xsZWN0aW9uRG9tYWluAAAJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgICC2NvbGxlY3Rpb25fBRBjb2xsZWN0aW9uRG9tYWluAghfYXNzZXRJZAUKYXNzZXRJZFN0cgUDbmlsCQACAQIXSW52YWxpZCBjb2xsZWN0aW9uIG5hbWUBAnR4AQZ2ZXJpZnkACQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACAUCdHgPc2VuZGVyUHVibGljS2V5HL50LQ==", "height": 3481986, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: F6g34ALWkF8guF8QnvhhLHU2PdDNENVCTLSU4E6Nystf Next: none Diff:
Old | New | Differences | |
---|---|---|---|
133 | 133 | then collectionName | |
134 | 134 | else "basic")) | |
135 | 135 | let nftNum = (tryGetInteger((("collection_" + collectionDomain) + "_size")) + 1) | |
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), | |
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)) | |
156 | 156 | else false) | |
157 | 157 | then throw("the list of resources or random sequence is not filled") | |
158 | 158 | else nil | |
159 | - | $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), | |
159 | + | $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) | |
160 | 160 | } | |
161 | 161 | else throw(("When creating a multiple collection, the number must be greater than 1 and less or equal " + toString(LIMIT_MINT_COPIES))) | |
162 | 162 | else throw("Wrong amount argument") |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 6 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | let issuersWhitelist = ["3P3iV85eXfkcA3Dd13EpZBYvs1vkKX6AYEN", "3PHFAavxj2ePJqFB46H2aRGA7oQL6kz1rJJ", "3P6peovAkVN3px6Zuv8y2noTWHFM4R5Wjj8", "3P5CQkvk8Pu6rGP3Qav4Lwskwa8pLhNwTbR", "3PHKDCQScvSPHvdCUeucFkx5Q1xMURA9kbr", "3PMki5sHBsQb4KgDknbUwsL3YgxaCzaZnCJ", "3P2wMCDjtxeLdfQrpR8WUe5zNeScM4UaL3o", "3P3pDosq4GCwfJkvq4yqKvvoTwmoqc9qPmo", "3PPgeYTWMRZ7S7jSLpnVuKKB9r6XuDk3ndC", "3PKVgd6ds1xervK6bPXbEHBqg8ibTcf5HZk", "3PD1sd55PYzmGUrQ896Qt3uvdbtgjCVpajE", "3PFkgvC9y6zHy64zEAscKKgaNY3yipiLqbW", "3PGGSiLuwGmm7ChfjDrmEZBd6HxQJn8N1NM", "3PJKmXoHJvVeQXjSJdhtkUcFDtdiQqMbUTD", "3P5bL6V4oGTZtMTirj9WxtbxUntqXdjevAE", "3PCyjqHhtq9f9Hmn4LNsWwA68dFVsvQ6iNi", "3PKHFX6W4aAr1e1b8MUTz5HmdWVUcjWhgY4", "3PJVkx7XRo86zU88shLuKGmbRr7RkMSxjHj", "3PLu7coMNV4naCxWkRemqga6o9zUhQppxsA", "3PGKEe4y59V3WLnHwPEUaMWdbzy8sb982fG", "3P5d8a1H2m2zFQakhaaow3uDE77UYLGd89v"] | |
5 | 5 | ||
6 | 6 | let editorsWhiteList = ["3PGKEe4y59V3WLnHwPEUaMWdbzy8sb982fG", "3P7NhmDt31ekQ2JryxtmdgZ1DXgVPwyocJK", "3PCyjqHhtq9f9Hmn4LNsWwA68dFVsvQ6iNi", "3P6YATtrcTkMoEeuZVaUxnD99DuJeG15yao"] | |
7 | 7 | ||
8 | 8 | let mintFromGroupWhiteList = [Address(base58'3PATXDVE53rKJtkwXYV3tvuLVS2fDtGtKCc'), Address(base58'3PJKmXoHJvVeQXjSJdhtkUcFDtdiQqMbUTD')] | |
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,paramsList) = { | |
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 | - | $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), | |
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_51C(randIndexList, ",")) != amount)) | |
146 | 146 | then throw("random list is not equal to the number of available elements") | |
147 | 147 | else if ((size(paramsList) == 0)) | |
148 | 148 | then throw("params list is empty") | |
149 | 149 | else [StringEntry((("group_" + assetIdStr) + "_sourceList"), sourceList), StringEntry((("group_" + assetIdStr) + "_randIndexList"), randIndexList), StringEntry((("group_" + assetIdStr) + "_paramsList"), paramsList)] | |
150 | 150 | else if (if (if ((size(randIndexList) > 0)) | |
151 | 151 | then (size(sourceList) == 0) | |
152 | 152 | else false) | |
153 | 153 | then true | |
154 | 154 | else if ((size(randIndexList) == 0)) | |
155 | 155 | then (size(sourceList) > 0) | |
156 | 156 | else false) | |
157 | 157 | then throw("the list of resources or random sequence is not filled") | |
158 | 158 | else nil | |
159 | - | $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), | |
159 | + | $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) | |
160 | 160 | } | |
161 | 161 | else throw(("When creating a multiple collection, the number must be greater than 1 and less or equal " + toString(LIMIT_MINT_COPIES))) | |
162 | 162 | else throw("Wrong amount argument") | |
163 | 163 | } | |
164 | 164 | } | |
165 | 165 | ||
166 | 166 | ||
167 | 167 | ||
168 | 168 | @Callable(i) | |
169 | 169 | func mintFromGroup (groupAssetIdStr) = { | |
170 | 170 | let groupAsset = value(assetInfo(fromBase58String(groupAssetIdStr))) | |
171 | 171 | if (checkNFT(groupAsset)) | |
172 | 172 | then if (isDefined(indexOf(mintFromGroupWhiteList, i.caller))) | |
173 | 173 | then { | |
174 | 174 | let isGroup = valueOrElse(getBoolean((("nft_" + groupAssetIdStr) + "_isGroup")), false) | |
175 | 175 | if (isGroup) | |
176 | 176 | then { | |
177 | 177 | let groupSize = valueOrElse(getInteger((("group_" + groupAssetIdStr) + "_size")), 0) | |
178 | 178 | let groupAvailable = valueOrElse(getInteger((("group_" + groupAssetIdStr) + "_available")), 0) | |
179 | 179 | if (if ((groupAvailable > 0)) | |
180 | 180 | then (groupSize > 0) | |
181 | 181 | else false) | |
182 | 182 | then { | |
183 | 183 | let collectionDomain = value(getString((("group_" + groupAssetIdStr) + "_collectionDomain"))) | |
184 | 184 | let origFile = value(getString((("nft_" + groupAssetIdStr) + "_original"))) | |
185 | 185 | let previewFile = value(getString((("nft_" + groupAssetIdStr) + "_image"))) | |
186 | 186 | let groupIssuer = value(getString((("nft_" + groupAssetIdStr) + "_issuer"))) | |
187 | 187 | let nftNum = (tryGetInteger((("collection_" + collectionDomain) + "_size")) + 1) | |
188 | 188 | let asset = Issue(groupAsset.name, groupAsset.description, 1, 0, false, unit, 0) | |
189 | 189 | let assetId = calculateAssetId(asset) | |
190 | 190 | let assetIdStr = toBase58String(assetId) | |
191 | 191 | let randIndexListStr = valueOrElse(getString((("group_" + groupAssetIdStr) + "_randIndexList")), "") | |
192 | 192 | let sourceListStr = valueOrElse(getString((("group_" + groupAssetIdStr) + "_sourceList")), "") | |
193 | 193 | let paramsListStr = valueOrElse(getString((("group_" + groupAssetIdStr) + "_paramsList")), "") | |
194 | 194 | let commonState = [StringEntry((("nft_" + assetIdStr) + "_data"), (((("{'collection': '" + collectionDomain) + "', 'num': ") + toString(nftNum)) + "}")), StringEntry((("nft_" + assetIdStr) + "_issuer"), groupIssuer), IntegerEntry((("collection_" + collectionDomain) + "_size"), nftNum), StringEntry(((("collection_" + collectionDomain) + "_assetId_") + assetIdStr), assetIdStr), IntegerEntry((("group_" + groupAssetIdStr) + "_available"), (groupAvailable - 1)), asset, ScriptTransfer(i.caller, 1, assetId)] | |
195 | 195 | if ((size(sourceListStr) > 0)) | |
196 | 196 | then if ((size(randIndexListStr) == 0)) | |
197 | 197 | then throw("Mint not available") | |
198 | 198 | else { | |
199 | 199 | let randIndexList = split_51C(randIndexListStr, ",") | |
200 | 200 | let sourceList = split_51C(sourceListStr, ",") | |
201 | 201 | let paramsList = split_51C(paramsListStr, ",") | |
202 | 202 | let rand = getRandomNumber(groupAvailable, i.transactionId, height, 0) | |
203 | 203 | let randIndex = valueOrErrorMessage(parseInt(randIndexList[rand]), "Invalid rand index") | |
204 | 204 | let paramsEntry = match paramsList[randIndex] { | |
205 | 205 | case t: String => | |
206 | 206 | [StringEntry((("nft_" + assetIdStr) + "_params"), t)] | |
207 | 207 | case _ => | |
208 | 208 | nil | |
209 | 209 | } | |
210 | 210 | $Tuple2(((commonState ++ paramsEntry) ++ [StringEntry((("nft_" + assetIdStr) + "_image"), sourceList[randIndex]), StringEntry((("group_" + groupAssetIdStr) + "_randIndexList"), makeString_11C(removeByIndex(randIndexList, rand), ","))]), assetIdStr) | |
211 | 211 | } | |
212 | 212 | else $Tuple2((commonState ++ [StringEntry((("nft_" + assetIdStr) + "_image"), previewFile), StringEntry((("nft_" + assetIdStr) + "_original"), origFile)]), assetIdStr) | |
213 | 213 | } | |
214 | 214 | else throw("Mint not available") | |
215 | 215 | } | |
216 | 216 | else throw("Invalid NFT identifier") | |
217 | 217 | } | |
218 | 218 | else throw("Invalid caller address") | |
219 | 219 | else throw("Wrong NFT Id") | |
220 | 220 | } | |
221 | 221 | ||
222 | 222 | ||
223 | 223 | ||
224 | 224 | @Callable(i) | |
225 | 225 | func burnNFT () = { | |
226 | 226 | let assetId = value(value(i.payments[0]).assetId) | |
227 | 227 | let asset = value(assetInfo(assetId)) | |
228 | 228 | if (if ((value(i.payments[0]).amount == 1)) | |
229 | 229 | then checkNFT(asset) | |
230 | 230 | else false) | |
231 | 231 | then { | |
232 | 232 | let assetIdStr = toBase58String(assetId) | |
233 | 233 | let issuer = tryGetString((("nft_" + assetIdStr) + "_issuer")) | |
234 | 234 | let isGroup = valueOrElse(getBoolean((("nft_" + assetIdStr) + "_isGroup")), false) | |
235 | 235 | if (!(isGroup)) | |
236 | 236 | then { | |
237 | 237 | let data = tryGetString((("nft_" + assetIdStr) + "_data")) | |
238 | 238 | let partsData = split(data, ", ") | |
239 | 239 | let partsCollection = split(partsData[0], ": ") | |
240 | 240 | let collectionDomain = dropRight(drop(partsCollection[1], 1), 1) | |
241 | 241 | let nftNum = tryGetInteger((("collection_" + collectionDomain) + "_size")) | |
242 | 242 | if ((nftNum > 0)) | |
243 | 243 | then { | |
244 | 244 | let updateCollection = if ((nftNum == 1)) | |
245 | 245 | then DeleteEntry((("collection_" + collectionDomain) + "_size")) | |
246 | 246 | else IntegerEntry((("collection_" + collectionDomain) + "_size"), (nftNum - 1)) | |
247 | 247 | [updateCollection, Burn(assetId, 1), DeleteEntry((("nft_" + assetIdStr) + "_data")), DeleteEntry((("nft_" + assetIdStr) + "_image")), DeleteEntry((("nft_" + assetIdStr) + "_params")), 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)), DeleteEntry((("collection_" + collectionDomain) + "_assetId"))] | |
248 | 248 | } | |
249 | 249 | else throw("Ivalid collection name") | |
250 | 250 | } | |
251 | 251 | else { | |
252 | 252 | let collectionDomain = value(getString((("group_" + assetIdStr) + "_collectionDomain"))) | |
253 | 253 | [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")), DeleteEntry((("group_" + assetIdStr) + "_paramsList")), DeleteEntry((("collection_" + collectionDomain) + "_assetId"))] | |
254 | 254 | } | |
255 | 255 | } | |
256 | 256 | else throw("Ivalid NFT attached") | |
257 | 257 | } | |
258 | 258 | ||
259 | 259 | ||
260 | 260 | ||
261 | 261 | @Callable(i) | |
262 | 262 | func editImageNFT (id,newImageUrl) = if ((indexOf(editorsWhiteList, toString(i.caller)) == unit)) | |
263 | 263 | then throw("Editing NFTs is limited") | |
264 | 264 | else if ((indexOf(newImageUrl, "https://") != 0)) | |
265 | 265 | then throw("https link to image required") | |
266 | 266 | else { | |
267 | 267 | let asset = valueOrErrorMessage(assetInfo(fromBase58String(id)), "NFT not fouded") | |
268 | 268 | let alexandra = Address(base58'3PCyjqHhtq9f9Hmn4LNsWwA68dFVsvQ6iNi') | |
269 | 269 | let tsunamiMember = Address(base58'3P6YATtrcTkMoEeuZVaUxnD99DuJeG15yao') | |
270 | 270 | let tsunamiIssuer = "3PPLea51cvcmmLAhMqT7r4VmarDMf7Y5iVH" | |
271 | 271 | let assetIssuer = valueOrErrorMessage(getString((("nft_" + toBase58String(asset.id)) + "_issuer")), "Issuer not found") | |
272 | 272 | if (if (if ((i.caller == alexandra)) | |
273 | 273 | then true | |
274 | 274 | else (i.caller == tsunamiMember)) | |
275 | 275 | then (assetIssuer != tsunamiIssuer) | |
276 | 276 | else false) | |
277 | 277 | then throw("Use only tsunami NFT") | |
278 | 278 | else { | |
279 | 279 | let assetIdStr = toBase58String(asset.id) | |
280 | 280 | let dataExist = valueOrErrorMessage(getString((("nft_" + assetIdStr) + "_data")), "NFT data not fouded") | |
281 | 281 | [StringEntry((("nft_" + assetIdStr) + "_image"), newImageUrl)] | |
282 | 282 | } | |
283 | 283 | } | |
284 | 284 | ||
285 | 285 | ||
286 | 286 | ||
287 | 287 | @Callable(i) | |
288 | 288 | func updateFormat (id) = { | |
289 | 289 | let asset = valueOrErrorMessage(assetInfo(fromBase58String(id)), "invalid asset Id") | |
290 | 290 | let assetIdStr = toBase58String(asset.id) | |
291 | 291 | let data = tryGetString((("nft_" + assetIdStr) + "_data")) | |
292 | 292 | let partsData = split(data, ", ") | |
293 | 293 | let partsCollection = split(partsData[0], ": ") | |
294 | 294 | let collectionDomain = dropRight(drop(partsCollection[1], 1), 1) | |
295 | 295 | if ((size(collectionDomain) > 0)) | |
296 | 296 | then [StringEntry((("collection_" + collectionDomain) + "_assetId"), assetIdStr)] | |
297 | 297 | else throw("Invalid collection name") | |
298 | 298 | } | |
299 | 299 | ||
300 | 300 | ||
301 | 301 | @Verifier(tx) | |
302 | 302 | func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) | |
303 | 303 |
github/deemru/w8io/3ef1775 70.46 ms ◑