tx · ERyukAmXp8XLQTQMQu4sZpBZMnZoQfWFSnYjxqMJT1Y6 3PATXDVE53rKJtkwXYV3tvuLVS2fDtGtKCc: -0.01400000 Waves 2022.12.31 12:59 [3449790] smart account 3PATXDVE53rKJtkwXYV3tvuLVS2fDtGtKCc > SELF 0.00000000 Waves
{ "type": 13, "id": "ERyukAmXp8XLQTQMQu4sZpBZMnZoQfWFSnYjxqMJT1Y6", "fee": 1400000, "feeAssetId": null, "timestamp": 1672480787520, "version": 2, "chainId": 87, "sender": "3PATXDVE53rKJtkwXYV3tvuLVS2fDtGtKCc", "senderPublicKey": "3pJsmGRpWHpqyaAjeX7BacMEfYx32LMNN4qwxQqASBmi", "proofs": [ "3x7eKDrsXKRFkwVbtq1s9BUWiRdpsEXyifo8xFtXEFu4nLEFrnSdBBCo4yRNNt89GvMZTsCC31HQNuuR7UNUNEnn" ], "script": "base64:BgIzCAISBQoDAQgIEgMKAQgSAwoBCBIDCgEIEgMKAQgSAwoBCBIDCgEIEgQKAggIEgQKAggIFAANY3JlYXRlTmZ0RGFwcAEaAVeT3cTSF+cgCv33IRJO8PB2ZyaDA3jUXEwAEG1hcmtldEZlZUFkZHJlc3MJAQdBZGRyZXNzAQEaAVfFZH+L2ULU1XLKUQvN1YRZ5quq9mW5UkgACkRBT0FkZHJlc3MJAQdBZGRyZXNzAQEaAVdOteUSRP6tBL+BzkCfn2vRKZLAsQRY3d4AEnB1enpsZVN0YWtlQWRkcmVzcwEaAVeUaIz57qK5qp/W9Y68qY9nGpwG9BYpibsAEHByb3h5RGFwcEFkZHJlc3MBGgFXM9+Gr0O+rRJs8z14r3WPA1a1W7U2WvQXAAxhZG1pbkFkZHJlc3MJAQdBZGRyZXNzAQEaAVez1ZJUSQmaKhD7xvifEHar7z8PcqWJFYwADm5mdER1Y2tXcmFwcGVyARoBVxStRFKbpf3/YRf/2Drn8WeKgJwUuC/PHgARbmZ0U2lnbkFydFdyYXBwZXIBGgFX7qEaFcPxtl9EZf9fyBU5xHlF1RhFRzAHAA5kdWNrRmVlQWRkcmVzcwEaAVcuggocfnMh8yGFPd6ZstDuF43Wf/PPG4UADGR1Y2tzUGVyY2VudAAeAA5yb3lhbHR5UGVyY2VudAAHAQVpc05GVAEFYXNzZXQDAwkAAAIIBQVhc3NldAhkZWNpbWFscwAACQAAAggFBWFzc2V0CnJlaXNzdWFibGUHBwkAAAIIBQVhc3NldAhxdWFudGl0eQABBwEIY2hlY2tORlQBBWFzc2V0AwMDCQAAAggIBQVhc3NldAZpc3N1ZXIFYnl0ZXMFDWNyZWF0ZU5mdERhcHAJAAACCAUFYXNzZXQIZGVjaW1hbHMAAAcJAAACCAUFYXNzZXQKcmVpc3N1YWJsZQcHCQAAAggFBWFzc2V0CHF1YW50aXR5AAEHAQ10cnlHZXRJbnRlZ2VyAQNrZXkEByRtYXRjaDAJAJoIAgUEdGhpcwUDa2V5AwkAAQIFByRtYXRjaDACA0ludAQBYgUHJG1hdGNoMAUBYgAAAQx0cnlHZXRTdHJpbmcBA2tleQQHJG1hdGNoMAkAnQgCBQR0aGlzBQNrZXkDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFiBQckbWF0Y2gwBQFiAgABD3RyeUdldEFzc2V0SW5mbwIHYXNzZXRJZAhlcnJvck1zZwQHJG1hdGNoMAkA7AcBCQDZBAEFB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIFQXNzZXQEAWEFByRtYXRjaDAFAWEJAAIBBQhlcnJvck1zZwEOZ2V0QXNzZXRTdHJpbmcBB2Fzc2V0SWQEByRtYXRjaDAFB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQBYgUHJG1hdGNoMAkA2AQBBQFiAgVXQVZFUwENZ2V0QXNzZXRCeXRlcwEKYXNzZXRJZFN0cgMJAAACBQphc3NldElkU3RyAgVXQVZFUwUEdW5pdAkA2QQBBQphc3NldElkU3RyARJhbGxUcmFuc2ZlcnNGb3JCaWQCBW5mdElkB2V4Y2x1ZGUECmF1Y3Rpb25LZXkJAKwCAgkArAICAghhdWN0aW9uXwUFbmZ0SWQCBV9iaWRzBAthdWN0aW9uRGF0YQkBDHRyeUdldFN0cmluZwEFCmF1Y3Rpb25LZXkECWV4Y2x1ZGVJZAMJAGYCCQCxAgEFB2V4Y2x1ZGUAAAUHZXhjbHVkZQIAAwkAAAIJALECAQULYXVjdGlvbkRhdGEAAAUDbmlsCgEVZ2V0UmV0dXJuVHJhbnNhY3Rpb25zAgVhY2N1bQRuZXh0BA1iZXRQYXJzZWREYXRhCQC1CQIFBG5leHQCAV8ECGJldE93bmVyCQCRAwIFDWJldFBhcnNlZERhdGEAAAQJYmV0QW1vdW50CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUNYmV0UGFyc2VkRGF0YQABBApiZXRBc3NldElkAwkAAAIJAJEDAgUNYmV0UGFyc2VkRGF0YQACAgVXQVZFUwUEdW5pdAkA2QQBCQCRAwIFDWJldFBhcnNlZERhdGEAAgMDCQBmAgkAsQIBBQlleGNsdWRlSWQAAAkAAAIFCWV4Y2x1ZGVJZAUEbmV4dAcFBWFjY3VtCQDNCAIFBWFjY3VtCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQUIYmV0T3duZXIFCWJldEFtb3VudAUKYmV0QXNzZXRJZAoAAiRsCQC1CQIFC2F1Y3Rpb25EYXRhAgEsCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJARVnZXRSZXR1cm5UcmFuc2FjdGlvbnMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDI2CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAAVABYAFwAYABkAGgEMaXNBZGRyZXNzQmFuAQdhZGRyZXNzBAckbWF0Y2gwCQCgCAEJAKwCAgkArAICAghhZGRyZXNzXwUHYWRkcmVzcwIHX2Jhbm5lZAMJAAECBQckbWF0Y2gwAgdCb29sZWFuBAF0BQckbWF0Y2gwBQF0BwkBaQEHc2VsbE5GVAMLYnV5T3V0UHJpY2UNYnV5T3V0QXNzZXRJZA1zZWxsZXJDb21tZW50BANwbXQDAwkAAAIJAJADAQgFAWkIcGF5bWVudHMAAQkAAAIICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50AAEHCQCRAwIIBQFpCHBheW1lbnRzAAAJAAIBAhlORlQgbm90IGxpc3RlZCBhcyBwYXltZW50BAZpc0ZyZWUJAAACBQ1idXlPdXRBc3NldElkAgRmcmVlBAtidXlPdXRBc3NldAMFBmlzRnJlZQUEdW5pdAkBDWdldEFzc2V0Qnl0ZXMBBQ1idXlPdXRBc3NldElkAwkBDGlzQWRkcmVzc0JhbgEJAKUIAQgFAWkMb3JpZ2luQ2FsbGVyCQACAQIOWW91IGFyZSBiYW5uZWQDCQEJaXNEZWZpbmVkAQgFA3BtdAdhc3NldElkBAVuZnRJZAkBBXZhbHVlAQgFA3BtdAdhc3NldElkBANuZnQEByRtYXRjaDAJAOwHAQUFbmZ0SWQDCQABAgUHJG1hdGNoMAIFQXNzZXQEAWEFByRtYXRjaDAFAWEJAAIBAg5DYW4ndCBmaW5kIE5GVAMJAQhjaGVja05GVAEFA25mdAMDBQZpc0ZyZWUGCQBmAgULYnV5T3V0UHJpY2UAAAQMYXNzZXROYW1lU3RyCQDYBAEIBQNuZnQCaWQECW5mdElzc3VlcgQHJG1hdGNoMAkAnQgCCQEHQWRkcmVzcwEFDWNyZWF0ZU5mdERhcHAJAKwCAgkArAICAgRuZnRfBQxhc3NldE5hbWVTdHICB19pc3N1ZXIDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwBQFhCQClCAEIBQFpBmNhbGxlcgQPcm95YWx0eVJlY2VpdmVyAwkBAiE9AgUJbmZ0SXNzdWVyCQDYBAEFEW5mdFNpZ25BcnRXcmFwcGVyBQluZnRJc3N1ZXIJAJEDAgkAvAkCCQCRAwIJALwJAggJAQV2YWx1ZQEJAOwHAQUFbmZ0SWQLZGVzY3JpcHRpb24CAS4AAAIBIAACCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgIEbmZ0XwUMYXNzZXROYW1lU3RyAgxfYnV5T3V0UHJpY2UDBQZpc0ZyZWUAAAULYnV5T3V0UHJpY2UJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgICBG5mdF8FDGFzc2V0TmFtZVN0cgIOX2J1eU91dEFzc2V0SWQDBQZpc0ZyZWUCBGZyZWUJAQ5nZXRBc3NldFN0cmluZwEFC2J1eU91dEFzc2V0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICAgRuZnRfBQxhc3NldE5hbWVTdHICEF9yb3lhbHR5UmVjZWl2ZXIFD3JveWFsdHlSZWNlaXZlcgkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgIEbmZ0XwUMYXNzZXROYW1lU3RyAg5fc2VsbGVyQ29tbWVudAUNc2VsbGVyQ29tbWVudAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgIEbmZ0XwUMYXNzZXROYW1lU3RyAgdfc2VsbGVyCQClCAEIBQFpDG9yaWdpbkNhbGxlcgkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwkApQgBCAUBaQxvcmlnaW5DYWxsZXICBV9uZnRfBQxhc3NldE5hbWVTdHIFDGFzc2V0TmFtZVN0cgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwkApQgBCAUBaQxvcmlnaW5DYWxsZXICBV9uZnRfBQxhc3NldE5hbWVTdHICDF9zdGFydFNhbGVBdAUGaGVpZ2h0BQNuaWwJAAIBAh9QcmljZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvCQACAQIaTkZUIGlzc3VlZCBieSBhbm90aGVyIGRhcHAJAAIBAiZORlQgaXMgbm90IGF0dGFjaGVkIHRvIHRoZSB0cmFuc2FjdGlvbgFpAQZidXlORlQBBW5mdElkBANwbXQDCQAAAgkAkAMBCAUBaQhwYXltZW50cwABCQCRAwIIBQFpCHBheW1lbnRzAAAJAAIBAhxBdHRhY2hlZCBwYXltZW50IGlzIHJlcXVpcmVkBAtidXlPdXRQcmljZQkBDXRyeUdldEludGVnZXIBCQCsAgIJAKwCAgIEbmZ0XwUFbmZ0SWQCDF9idXlPdXRQcmljZQQQYnV5T3V0QXNzZXRJZFN0cgkBDHRyeUdldFN0cmluZwEJAKwCAgkArAICAgRuZnRfBQVuZnRJZAIOX2J1eU91dEFzc2V0SWQED3JveWFsdHlSZWNlaXZlcgkBDHRyeUdldFN0cmluZwEJAKwCAgkArAICAgRuZnRfBQVuZnRJZAIQX3JveWFsdHlSZWNlaXZlcgQJc2VsbGVyU3RyCQEMdHJ5R2V0U3RyaW5nAQkArAICCQCsAgICBG5mdF8FBW5mdElkAgdfc2VsbGVyBAZpc0ZyZWUJAAACBRBidXlPdXRBc3NldElkU3RyAgRmcmVlBAhuZnRBc3NldAkBD3RyeUdldEFzc2V0SW5mbwIFBW5mdElkAg1ORlQgbm90IGZvdW5kBA1idXlPdXRBc3NldElkAwMFBmlzRnJlZQYJAAACBRBidXlPdXRBc3NldElkU3RyAgVXQVZFUwUEdW5pdAQHJG1hdGNoMAkA7AcBCQDZBAEFEGJ1eU91dEFzc2V0SWRTdHIDCQABAgUHJG1hdGNoMAIFQXNzZXQEAWEFByRtYXRjaDAIBQFhAmlkCQACAQIWQnV5b3V0IGFzc2V0IG5vdCBmb3VuZAQKYXVjdGlvbktleQkArAICCQCsAgICCGF1Y3Rpb25fCQDYBAEIBQhuZnRBc3NldAJpZAIFX2JpZHMDAwMFBmlzRnJlZQkAAAIFC2J1eU91dFByaWNlAAAHBgMJAGYCBQtidXlPdXRQcmljZQAACQBnAggFA3BtdAZhbW91bnQFC2J1eU91dFByaWNlBwQJZHVja05mdElkCQELdmFsdWVPckVsc2UCCQCdCAIJAQdBZGRyZXNzAQUObmZ0RHVja1dyYXBwZXIJAKwCAgkArAICAgRuZnRfBQVuZnRJZAIHX2R1Y2tJZAIABAx0cmFuc2ZlckZlZXMDCQBmAgkAsQIBBQlkdWNrTmZ0SWQAAAQHZHVja0ZlZQkAawMFC2J1eU91dFByaWNlBQxkdWNrc1BlcmNlbnQAZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQUJc2VsbGVyU3RyCQBlAgULYnV5T3V0UHJpY2UFB2R1Y2tGZWUFDWJ1eU91dEFzc2V0SWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBBQ5kdWNrRmVlQWRkcmVzcwUHZHVja0ZlZQUNYnV5T3V0QXNzZXRJZAUDbmlsBAtyb3lhbHR5UGFydAkAawMFC2J1eU91dFByaWNlBQ5yb3lhbHR5UGVyY2VudABkBAltYXJrZXRGZWUJAGsDBQtidXlPdXRQcmljZQABAGQEBkRBT0ZlZQkAawMFC2J1eU91dFByaWNlAAIAZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQUJc2VsbGVyU3RyCQBlAgkAZQIFC2J1eU91dFByaWNlBQtyb3lhbHR5UGFydAUJbWFya2V0RmVlBQ1idXlPdXRBc3NldElkCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQ9yb3lhbHR5UmVjZWl2ZXIFC3JveWFsdHlQYXJ0BQ1idXlPdXRBc3NldElkCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFEG1hcmtldEZlZUFkZHJlc3MFCW1hcmtldEZlZQUNYnV5T3V0QXNzZXRJZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQpEQU9BZGRyZXNzBQZEQU9GZWUFDWJ1eU91dEFzc2V0SWQFA25pbAMDBQZpc0ZyZWUGCQAAAggFA3BtdAdhc3NldElkBQ1idXlPdXRBc3NldElkBAdpc0dyb3VwCQELdmFsdWVPckVsc2UCCQCbCAIJAQdBZGRyZXNzAQUNY3JlYXRlTmZ0RGFwcAkArAICCQCsAgICBG5mdF8FBW5mdElkAghfaXNHcm91cAcDCQEBIQEFB2lzR3JvdXAJAJQKAgkAzggCCQDOCAIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyAAEIBQhuZnRBc3NldAJpZAkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgIEbmZ0XwUFbmZ0SWQCDF9idXlPdXRQcmljZQkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgIEbmZ0XwUFbmZ0SWQCDl9idXlPdXRBc3NldElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICAgRuZnRfBQVuZnRJZAIQX3JveWFsdHlSZWNlaXZlcgkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgIEbmZ0XwUFbmZ0SWQCDl9zZWxsZXJDb21tZW50CQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICAgRuZnRfBQVuZnRJZAIHX3NlbGxlcgkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUJc2VsbGVyU3RyAgVfbmZ0XwUFbmZ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUJc2VsbGVyU3RyAgVfbmZ0XwUFbmZ0SWQCDF9zdGFydFNhbGVBdAkAzAgCCQELRGVsZXRlRW50cnkBBQphdWN0aW9uS2V5BQNuaWwFDHRyYW5zZmVyRmVlcwkBEmFsbFRyYW5zZmVyc0ZvckJpZAIJANgEAQgFCG5mdEFzc2V0AmlkAgAJANgEAQgFCG5mdEFzc2V0AmlkBAtuZXdORlRJZFN0cgQHJG1hdGNoMAkA/AcECQEHQWRkcmVzcwEFDWNyZWF0ZU5mdERhcHACDW1pbnRGcm9tR3JvdXAJAMwIAgUFbmZ0SWQFA25pbAUDbmlsAwkAAQIFByRtYXRjaDACBlN0cmluZwQBcwUHJG1hdGNoMAUBcwkAAgECJVNvbXRoaW5nIHdyb25nIHdoZW4gbWludCBtdWx0aXBsZSBORlQDCQAAAgULbmV3TkZUSWRTdHIFC25ld05GVElkU3RyBA5ncm91cEF2YWlsYWJsZQkBBXZhbHVlAQkAmggCCQEHQWRkcmVzcwEFDWNyZWF0ZU5mdERhcHAJAKwCAgkArAICAgZncm91cF8FBW5mdElkAgpfYXZhaWxhYmxlAwkAAAIFDmdyb3VwQXZhaWxhYmxlBQ5ncm91cEF2YWlsYWJsZQMJAAACBQ5ncm91cEF2YWlsYWJsZQAABANpbnYJAPwHBAkBB0FkZHJlc3MBBQ1jcmVhdGVOZnREYXBwAgdidXJuTkZUBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJANkEAQUFbmZ0SWQAAQUDbmlsAwkAAAIFA2ludgUDaW52CQCUCgIJAM4IAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIAAQkA2QQBBQtuZXdORlRJZFN0cgkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgIEbmZ0XwUFbmZ0SWQCDF9idXlPdXRQcmljZQkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgIEbmZ0XwUFbmZ0SWQCDl9idXlPdXRBc3NldElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICAgRuZnRfBQVuZnRJZAIQX3JveWFsdHlSZWNlaXZlcgkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgIEbmZ0XwUFbmZ0SWQCDl9zZWxsZXJDb21tZW50CQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICAgRuZnRfBQVuZnRJZAIHX3NlbGxlcgkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUJc2VsbGVyU3RyAgVfbmZ0XwUFbmZ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUJc2VsbGVyU3RyAgVfbmZ0XwUFbmZ0SWQCDF9zdGFydFNhbGVBdAkAzAgCCQELRGVsZXRlRW50cnkBBQphdWN0aW9uS2V5BQNuaWwFDHRyYW5zZmVyRmVlcwULbmV3TkZUSWRTdHIJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAJQKAgkAzggCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgABCQDZBAEFC25ld05GVElkU3RyBQNuaWwFDHRyYW5zZmVyRmVlcwULbmV3TkZUSWRTdHIJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAjJUaGUgYnV5b3V0IGFzc2V0IGRvZXMgbm90IG1hdGNoIHRoZSBwdXJjaGFzZSBhc3NldAkAAgECKFBheW1lbnQgYW1vdW50IG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8BaQEKY2FuY2VsU2VsbAEFbmZ0SWQECXNlbGxlclN0cgkBDHRyeUdldFN0cmluZwEJAKwCAgkArAICAgRuZnRfBQVuZnRJZAIHX3NlbGxlcgQIbmZ0QXNzZXQJAQ90cnlHZXRBc3NldEluZm8CBQVuZnRJZAINTkZUIG5vdCBmb3VuZAQKYXVjdGlvbktleQkArAICCQCsAgICCGF1Y3Rpb25fCQDYBAEIBQhuZnRBc3NldAJpZAIFX2JpZHMDAwkAZgIJALECAQUJc2VsbGVyU3RyAAADCQAAAgUJc2VsbGVyU3RyCQClCAEIBQFpDG9yaWdpbkNhbGxlcgYJAAACBQxhZG1pbkFkZHJlc3MIBQFpDG9yaWdpbkNhbGxlcgcJAJQKAgkAzggCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgABCAUIbmZ0QXNzZXQCaWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgICBG5mdF8FBW5mdElkAgxfYnV5T3V0UHJpY2UJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgICBG5mdF8FBW5mdElkAg5fYnV5T3V0QXNzZXRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgIEbmZ0XwUFbmZ0SWQCEF9yb3lhbHR5UmVjZWl2ZXIJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgICBG5mdF8FBW5mdElkAg5fc2VsbGVyQ29tbWVudAkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgIEbmZ0XwUFbmZ0SWQCB19zZWxsZXIJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgIJAKwCAgIIYWRkcmVzc18FCXNlbGxlclN0cgIFX25mdF8FBW5mdElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICCQCsAgIJAKwCAgIIYWRkcmVzc18FCXNlbGxlclN0cgIFX25mdF8FBW5mdElkAgxfc3RhcnRTYWxlQXQJAMwIAgkBC0RlbGV0ZUVudHJ5AQUKYXVjdGlvbktleQUDbmlsCQESYWxsVHJhbnNmZXJzRm9yQmlkAgkA2AQBCAUIbmZ0QXNzZXQCaWQCAAUFbmZ0SWQJAAIBAhRZb3UgYXJlIG5vdCBhIHNlbGxlcgFpAQNiYW4BB2FkZHJlc3MDCQAAAggFAWkGY2FsbGVyBQxhZG1pbkFkZHJlc3MJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAKwCAgkArAICAghhZGRyZXNzXwUHYWRkcmVzcwIHX2Jhbm5lZAYFA25pbAkAAgECFEFsbG93IG9ubHkgZm9yIGFkbWluAWkBBXVuQmFuAQdhZGRyZXNzAwkAAAIIBQFpBmNhbGxlcgUMYWRtaW5BZGRyZXNzCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICAghhZGRyZXNzXwUHYWRkcmVzcwIHX2Jhbm5lZAUDbmlsCQACAQIUQWxsb3cgb25seSBmb3IgYWRtaW4BaQEEbGlrZQEFbmZ0SWQECG5mdEFzc2V0CQDsBwEJANkEAQUFbmZ0SWQECWR1Y2tOZnRJZAkBC3ZhbHVlT3JFbHNlAgkAnQgCCQEHQWRkcmVzcwEFDm5mdER1Y2tXcmFwcGVyCQCsAgIJAKwCAgIEbmZ0XwUFbmZ0SWQCB19kdWNrSWQCAAQMc2lnbkFydE5mdElkCQELdmFsdWVPckVsc2UCCQCdCAIJAQdBZGRyZXNzAQURbmZ0U2lnbkFydFdyYXBwZXIJAKwCAgkArAICAgtzaWduQXJ0TmZ0XwUFbmZ0SWQCCF9hc3NldElkAgAEDHVwZGF0ZWROZnRJZAMJAGYCCQCxAgEFCWR1Y2tOZnRJZAAABQlkdWNrTmZ0SWQDCQBmAgkAsQIBBQxzaWduQXJ0TmZ0SWQAAAUMc2lnbkFydE5mdElkBQVuZnRJZAMDCQEJaXNEZWZpbmVkAQUIbmZ0QXNzZXQJAQhjaGVja05GVAEJAQV2YWx1ZQEFCG5mdEFzc2V0BwQNY2FsbGVyQWRkcmVzcwkApQgBCAUBaQZjYWxsZXIEC2NvdW50U3Rha2VkBAckbWF0Y2gwCQCaCAIJAQdBZGRyZXNzAQUScHV6emxlU3Rha2VBZGRyZXNzCQCsAgIFDWNhbGxlckFkZHJlc3MCB19zdGFrZWQDCQABAgUHJG1hdGNoMAIDSW50BAFjBQckbWF0Y2gwBQFjAAADCQBnAgULY291bnRTdGFrZWQAgMLXLwQLbmZ0TGlrZXNLZXkJAKwCAgkArAICAgRuZnRfBQx1cGRhdGVkTmZ0SWQCBl9saWtlcwQNbmZ0TGlrZXNWYWx1ZQkBDHRyeUdldFN0cmluZwEJAKwCAgkArAICAgRuZnRfBQx1cGRhdGVkTmZ0SWQCBl9saWtlcwMJAQEhAQkBCWlzRGVmaW5lZAEJALMJAgUNbmZ0TGlrZXNWYWx1ZQUNY2FsbGVyQWRkcmVzcwQNbmV3TGlrZXNWYWx1ZQMJAAACCQCxAgEFDW5mdExpa2VzVmFsdWUAAAkApQgBCAUBaQZjYWxsZXIJAKwCAgkArAICBQ1uZnRMaWtlc1ZhbHVlAgEsBQ1jYWxsZXJBZGRyZXNzCQDMCAIJAQtTdHJpbmdFbnRyeQIFC25mdExpa2VzS2V5BQ1uZXdMaWtlc1ZhbHVlBQNuaWwJAAIBAhZZb3UgaGF2ZSBhbHJlYWR5IHZvdGVkCQACAQIrWW91IGNhbiBsaWtlIGlmIHlvdSBzdGFrZSAxIG9yIG1vcmUgUHV6emxlcwkAAgECDkludmFsaWQgTkZUIGlkAWkBCHBsYWNlQmlkAQVuZnRJZAQHaXNHcm91cAkBC3ZhbHVlT3JFbHNlAgkAmwgCCQEHQWRkcmVzcwEFDWNyZWF0ZU5mdERhcHAJAKwCAgkArAICAgRuZnRfBQVuZnRJZAIIX2lzR3JvdXAHAwUHaXNHcm91cAkAAgECPFRoaXMgZnVuY3Rpb24gaXMgbm90IHRlbXBvcmFyaWx5IGF2YWlsYWJsZSBmb3IgbXVsdGlwbGUgTkZUcwMDCQBmAggJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQAAAMJAQEhAQkBCWlzRGVmaW5lZAEICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAYJAQEhAQkBBWlzTkZUAQkBBXZhbHVlAQkA7AcBCQEFdmFsdWUBCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQHBAhuZnRBc3NldAkBD3RyeUdldEFzc2V0SW5mbwIFBW5mdElkAg1ORlQgbm90IGZvdW5kBAluZnRBbW91bnQEByRtYXRjaDAJAPAHAgUEdGhpcwgFCG5mdEFzc2V0AmlkAwkAAQIFByRtYXRjaDACA0ludAQBYwUHJG1hdGNoMAUBYwAABAlzZWxsZXJTdHIJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAKwCAgkArAICAgRuZnRfBQVuZnRJZAIHX3NlbGxlcgMJAQIhPQIFCXNlbGxlclN0cgkApQgBCAUBaQZjYWxsZXIDAwkAAAIFCW5mdEFtb3VudAABCQEIY2hlY2tORlQBBQhuZnRBc3NldAcECWNhbGxlclN0cgkApQgBCAUBaQZjYWxsZXIEC2Fzc2V0QW1vdW50CAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAQKYXNzZXRJZFN0cgkBDmdldEFzc2V0U3RyaW5nAQgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBAphdWN0aW9uS2V5CQCsAgIJAKwCAgIIYXVjdGlvbl8JANgEAQgFCG5mdEFzc2V0AmlkAgVfYmlkcwQLYXVjdGlvbkRhdGEJAQx0cnlHZXRTdHJpbmcBBQphdWN0aW9uS2V5BAlhZGRlZERhdGEJAKwCAgkArAICCQCsAgIJAKwCAgUJY2FsbGVyU3RyAgFfCQCkAwEFC2Fzc2V0QW1vdW50AgFfBQphc3NldElkU3RyAwkAZgIAFQkAZAIJAJADAQkAtQkCBQthdWN0aW9uRGF0YQIBLAABBAVleGlzdAkBCGNvbnRhaW5zAgULYXVjdGlvbkRhdGEJAKUIAQgFAWkGY2FsbGVyAwkBASEBBQVleGlzdAQLdXBkYXRlZERhdGEEByRtYXRjaDAJAKIIAQUKYXVjdGlvbktleQMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAJAKwCAgkArAICBQFzAgEsBQlhZGRlZERhdGEFCWFkZGVkRGF0YQkAzAgCCQELU3RyaW5nRW50cnkCBQphdWN0aW9uS2V5BQt1cGRhdGVkRGF0YQUDbmlsCQACAQIUWW91IGhhdmUgYWxyZWFkeSBiaWQJAAIBAi1Zb3UgY2Fubm90IGNyZWF0ZSBtb3JlIHRoYW4gMjcgYmV0cyBmb3IgMSBORlQJAAIBAg9JbnZhbGlkIE5GVCBJZC4JAAIBAhFTZWxsZXIgY2Fubm90IGJpZAkAAgECFFBheW1lbnQgbm90IGF0dGFjaGVkAWkBCWNhbmNlbEJpZAIFbmZ0SWQFYmV0SWQECG5mdEFzc2V0CQEPdHJ5R2V0QXNzZXRJbmZvAgUFbmZ0SWQCDU5GVCBub3QgZm91bmQECmF1Y3Rpb25LZXkJAKwCAgkArAICAghhdWN0aW9uXwkA2AQBCAUIbmZ0QXNzZXQCaWQCBV9iaWRzBAthdWN0aW9uRGF0YQkBDHRyeUdldFN0cmluZwEFCmF1Y3Rpb25LZXkDCQBmAgkAsQIBBQthdWN0aW9uRGF0YQAABAljYWxsZXJTdHIJAKUIAQgFAWkGY2FsbGVyBARiZXRzCQC1CQIFC2F1Y3Rpb25EYXRhAgEsBAhiZXRJbmRleAQHJG1hdGNoMAkAzwgCBQRiZXRzBQViZXRJZAMJAAECBQckbWF0Y2gwAgNJbnQEA2lkeAUHJG1hdGNoMAUDaWR4CQACAQITQmV0IG5vdCBmb3VuZCBieSBpZAQHYmV0RGF0YQkAkQMCBQRiZXRzBQhiZXRJbmRleAQNYmV0UGFyc2VkRGF0YQkAtQkCBQdiZXREYXRhAgFfBAhiZXRPd25lcgkAkQMCBQ1iZXRQYXJzZWREYXRhAAAECWJldEFtb3VudAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDWJldFBhcnNlZERhdGEAAQQKYmV0QXNzZXRJZAMJAAACCQCRAwIFDWJldFBhcnNlZERhdGEAAgIFV0FWRVMFBHVuaXQJANkEAQkAkQMCBQ1iZXRQYXJzZWREYXRhAAIDCQAAAgUIYmV0T3duZXIFCWNhbGxlclN0cgQHbmV3QmV0cwkA0QgCBQRiZXRzBQhiZXRJbmRleAQOdXBkYXRlRGF0YUxpc3QDCQAAAgkAkAMBBQduZXdCZXRzAAAJAMwIAgkBC0RlbGV0ZUVudHJ5AQUKYXVjdGlvbktleQUDbmlsCQDMCAIJAQtTdHJpbmdFbnRyeQIFCmF1Y3Rpb25LZXkJALkJAgUHbmV3QmV0cwIBLAUDbmlsCQDOCAIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQliZXRBbW91bnQFCmJldEFzc2V0SWQFA25pbAUOdXBkYXRlRGF0YUxpc3QJAAIBAhRUaGlzIGlzIG5vdCB5b3VyIGJldAkAAgECDUJldCBub3QgZm91bmQBaQEJYWNjZXB0QmlkAgVuZnRJZAViZXRJZAQIbmZ0QXNzZXQJAQ90cnlHZXRBc3NldEluZm8CBQVuZnRJZAINTkZUIG5vdCBmb3VuZAMJAAACCQDwBwIFBHRoaXMIBQhuZnRBc3NldAJpZAABBAlzZWxsZXJTdHIJAQx0cnlHZXRTdHJpbmcBCQCsAgIJAKwCAgIEbmZ0XwUFbmZ0SWQCB19zZWxsZXIECmF1Y3Rpb25LZXkJAKwCAgkArAICAghhdWN0aW9uXwkA2AQBCAUIbmZ0QXNzZXQCaWQCBV9iaWRzAwkAAAIFCXNlbGxlclN0cgkApQgBCAUBaQZjYWxsZXIEC2F1Y3Rpb25EYXRhCQEMdHJ5R2V0U3RyaW5nAQUKYXVjdGlvbktleQMJAGYCCQCxAgEFC2F1Y3Rpb25EYXRhAAAEBGJldHMJALUJAgULYXVjdGlvbkRhdGECASwEDWJldFBhcnNlZERhdGEJALUJAgUFYmV0SWQCAV8ECGJldE93bmVyCQCRAwIFDWJldFBhcnNlZERhdGEAAAQJYmV0QW1vdW50CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUNYmV0UGFyc2VkRGF0YQABBApiZXRBc3NldElkAwkAAAIJAJEDAgUNYmV0UGFyc2VkRGF0YQACAgVXQVZFUwUEdW5pdAkA2QQBCQCRAwIFDWJldFBhcnNlZERhdGEAAgQPcm95YWx0eVJlY2VpdmVyCQEMdHJ5R2V0U3RyaW5nAQkArAICCQCsAgICBG5mdF8FBW5mdElkAhBfcm95YWx0eVJlY2VpdmVyBAtyb3lhbHR5UGFydAkAawMFCWJldEFtb3VudAUOcm95YWx0eVBlcmNlbnQAZAQJbWFya2V0RmVlCQBrAwUJYmV0QW1vdW50AAEAZAQGREFPRmVlCQBrAwUJYmV0QW1vdW50AAIAZAQOdW5sb2NrZWROZnRTdHIEByRtYXRjaDAJAPwHBAkBB0FkZHJlc3MBBRBwcm94eURhcHBBZGRyZXNzAgZ1bmxvY2sFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkA2QQBBQVuZnRJZAABBQNuaWwDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFzBQckbWF0Y2gwBQFzCQACAQkArAICAitTb210aGluZyB3cm9uZyB3aGVuIHVubG9jayBORlQgaW4gYWRkcmVzczogCQDYBAEFEHByb3h5RGFwcEFkZHJlc3MDCQAAAgUOdW5sb2NrZWROZnRTdHIFDnVubG9ja2VkTmZ0U3RyAwMJAQ9jb250YWluc0VsZW1lbnQCBQRiZXRzBQViZXRJZAkAZgIFCWJldEFtb3VudAAABwkAzggCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQhiZXRPd25lcgABCQDZBAEFDnVubG9ja2VkTmZ0U3RyCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgkAZQIJAGUCBQliZXRBbW91bnQFC3JveWFsdHlQYXJ0BQltYXJrZXRGZWUFCmJldEFzc2V0SWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFD3JveWFsdHlSZWNlaXZlcgULcm95YWx0eVBhcnQFCmJldEFzc2V0SWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUQbWFya2V0RmVlQWRkcmVzcwUJbWFya2V0RmVlBQpiZXRBc3NldElkCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFCkRBT0FkZHJlc3MFBkRBT0ZlZQUKYmV0QXNzZXRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgIEbmZ0XwUFbmZ0SWQCDF9idXlPdXRQcmljZQkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgIEbmZ0XwUFbmZ0SWQCDl9idXlPdXRBc3NldElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICAgRuZnRfBQVuZnRJZAIQX3JveWFsdHlSZWNlaXZlcgkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgIEbmZ0XwUFbmZ0SWQCDl9zZWxsZXJDb21tZW50CQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICAgRuZnRfBQVuZnRJZAIHX3NlbGxlcgkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUJc2VsbGVyU3RyAgVfbmZ0XwUFbmZ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUJc2VsbGVyU3RyAgVfbmZ0XwUFbmZ0SWQCDF9zdGFydFNhbGVBdAkAzAgCCQELRGVsZXRlRW50cnkBBQphdWN0aW9uS2V5BQNuaWwJARJhbGxUcmFuc2ZlcnNGb3JCaWQCCQDYBAEIBQhuZnRBc3NldAJpZAUFYmV0SWQJAAIBAhNCZXQgbm90IGZvdW5kIGJ5IElkCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQINQmV0IG5vdCBmb3VuZAkAAgECFFlvdSBhcmUgbm90IGEgc2VsbGVyCQACAQIZTkZUIG5vdCBmb3VuZCBvbiBjb250cmFjdAECdHgBBnZlcmlmeQAJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXnMVgv9", "height": 3449790, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 8zmgViw2ysB3xjhRvzEKP32hhj3v3WSGA8posYuTzadh Next: C8rmsQ7yP8UPFMHASxXytiK8UnhW9u89kqidYc8C3tEm Diff:
Old | New | Differences | |
---|---|---|---|
10 | 10 | let puzzleStakeAddress = base58'3PFTbywqxtFfukX3HyT881g4iW5K4QL3FAS' | |
11 | 11 | ||
12 | 12 | let proxyDappAddress = base58'3P6fAxtw12pjFhayEfpcUWxgu2BHVCeP78A' | |
13 | + | ||
14 | + | let adminAddress = Address(base58'3PJKmXoHJvVeQXjSJdhtkUcFDtdiQqMbUTD') | |
13 | 15 | ||
14 | 16 | let nftDuckWrapper = base58'3P3pDosq4GCwfJkvq4yqKvvoTwmoqc9qPmo' | |
15 | 17 | ||
113 | 115 | } | |
114 | 116 | ||
115 | 117 | ||
118 | + | func isAddressBan (address) = match getBoolean((("address_" + address) + "_banned")) { | |
119 | + | case t: Boolean => | |
120 | + | t | |
121 | + | case _ => | |
122 | + | false | |
123 | + | } | |
124 | + | ||
125 | + | ||
116 | 126 | @Callable(i) | |
117 | 127 | func sellNFT (buyOutPrice,buyOutAssetId,sellerComment) = { | |
118 | 128 | let pmt = if (if ((size(i.payments) == 1)) | |
124 | 134 | let buyOutAsset = if (isFree) | |
125 | 135 | then unit | |
126 | 136 | else getAssetBytes(buyOutAssetId) | |
127 | - | if (isDefined(pmt.assetId)) | |
128 | - | then { | |
129 | - | let nftId = value(pmt.assetId) | |
130 | - | let nft = match assetInfo(nftId) { | |
131 | - | case a: Asset => | |
132 | - | a | |
133 | - | case _ => | |
134 | - | throw("Can't find NFT") | |
135 | - | } | |
136 | - | if (checkNFT(nft)) | |
137 | - | then if (if (isFree) | |
138 | - | then true | |
139 | - | else (buyOutPrice > 0)) | |
140 | - | then { | |
141 | - | let assetNameStr = toBase58String(nft.id) | |
142 | - | let nftIssuer = match getString(Address(createNftDapp), (("nft_" + assetNameStr) + "_issuer")) { | |
143 | - | case a: String => | |
144 | - | a | |
145 | - | case _ => | |
146 | - | toString(i.caller) | |
147 | - | } | |
148 | - | let royaltyReceiver = if ((nftIssuer != toBase58String(nftSignArtWrapper))) | |
149 | - | then nftIssuer | |
150 | - | else split_4C(split_4C(value(assetInfo(nftId)).description, ".")[0], " ")[2] | |
137 | + | if (isAddressBan(toString(i.originCaller))) | |
138 | + | then throw("You are banned") | |
139 | + | else if (isDefined(pmt.assetId)) | |
140 | + | then { | |
141 | + | let nftId = value(pmt.assetId) | |
142 | + | let nft = match assetInfo(nftId) { | |
143 | + | case a: Asset => | |
144 | + | a | |
145 | + | case _ => | |
146 | + | throw("Can't find NFT") | |
147 | + | } | |
148 | + | if (checkNFT(nft)) | |
149 | + | then if (if (isFree) | |
150 | + | then true | |
151 | + | else (buyOutPrice > 0)) | |
152 | + | then { | |
153 | + | let assetNameStr = toBase58String(nft.id) | |
154 | + | let nftIssuer = match getString(Address(createNftDapp), (("nft_" + assetNameStr) + "_issuer")) { | |
155 | + | case a: String => | |
156 | + | a | |
157 | + | case _ => | |
158 | + | toString(i.caller) | |
159 | + | } | |
160 | + | let royaltyReceiver = if ((nftIssuer != toBase58String(nftSignArtWrapper))) | |
161 | + | then nftIssuer | |
162 | + | else split_4C(split_4C(value(assetInfo(nftId)).description, ".")[0], " ")[2] | |
151 | 163 | [IntegerEntry((("nft_" + assetNameStr) + "_buyOutPrice"), if (isFree) | |
152 | - | then 0 | |
153 | - | else buyOutPrice), StringEntry((("nft_" + assetNameStr) + "_buyOutAssetId"), if (isFree) | |
154 | - | then "free" | |
155 | - | else getAssetString(buyOutAsset)), StringEntry((("nft_" + assetNameStr) + "_royaltyReceiver"), royaltyReceiver), StringEntry((("nft_" + assetNameStr) + "_sellerComment"), sellerComment), StringEntry((("nft_" + assetNameStr) + "_seller"), toString(i.originCaller)), StringEntry(((("address_" + toString(i.originCaller)) + "_nft_") + assetNameStr), assetNameStr), IntegerEntry((((("address_" + toString(i.originCaller)) + "_nft_") + assetNameStr) + "_startSaleAt"), height)] | |
156 | - | } | |
157 | - | else throw("Price must be greater than zero") | |
158 | - | else throw("NFT issued by another dapp") | |
159 | - | } | |
160 | - | else throw("NFT is not attached to the transaction") | |
164 | + | then 0 | |
165 | + | else buyOutPrice), StringEntry((("nft_" + assetNameStr) + "_buyOutAssetId"), if (isFree) | |
166 | + | then "free" | |
167 | + | else getAssetString(buyOutAsset)), StringEntry((("nft_" + assetNameStr) + "_royaltyReceiver"), royaltyReceiver), StringEntry((("nft_" + assetNameStr) + "_sellerComment"), sellerComment), StringEntry((("nft_" + assetNameStr) + "_seller"), toString(i.originCaller)), StringEntry(((("address_" + toString(i.originCaller)) + "_nft_") + assetNameStr), assetNameStr), IntegerEntry((((("address_" + toString(i.originCaller)) + "_nft_") + assetNameStr) + "_startSaleAt"), height)] | |
168 | + | } | |
169 | + | else throw("Price must be greater than zero") | |
170 | + | else throw("NFT issued by another dapp") | |
171 | + | } | |
172 | + | else throw("NFT is not attached to the transaction") | |
161 | 173 | } | |
162 | 174 | ||
163 | 175 | ||
248 | 260 | let nftAsset = tryGetAssetInfo(nftId, "NFT not found") | |
249 | 261 | let auctionKey = (("auction_" + toBase58String(nftAsset.id)) + "_bids") | |
250 | 262 | if (if ((size(sellerStr) > 0)) | |
251 | - | then (sellerStr == toString(i.originCaller)) | |
263 | + | then if ((sellerStr == toString(i.originCaller))) | |
264 | + | then true | |
265 | + | else (adminAddress == i.originCaller) | |
252 | 266 | else false) | |
253 | 267 | then $Tuple2(([ScriptTransfer(i.caller, 1, nftAsset.id), DeleteEntry((("nft_" + nftId) + "_buyOutPrice")), DeleteEntry((("nft_" + nftId) + "_buyOutAssetId")), DeleteEntry((("nft_" + nftId) + "_royaltyReceiver")), DeleteEntry((("nft_" + nftId) + "_sellerComment")), DeleteEntry((("nft_" + nftId) + "_seller")), DeleteEntry(((("address_" + sellerStr) + "_nft_") + nftId)), DeleteEntry((((("address_" + sellerStr) + "_nft_") + nftId) + "_startSaleAt")), DeleteEntry(auctionKey)] ++ allTransfersForBid(toBase58String(nftAsset.id), "")), nftId) | |
254 | 268 | else throw("You are not a seller") | |
255 | 269 | } | |
270 | + | ||
271 | + | ||
272 | + | ||
273 | + | @Callable(i) | |
274 | + | func ban (address) = if ((i.caller == adminAddress)) | |
275 | + | then [BooleanEntry((("address_" + address) + "_banned"), true)] | |
276 | + | else throw("Allow only for admin") | |
277 | + | ||
278 | + | ||
279 | + | ||
280 | + | @Callable(i) | |
281 | + | func unBan (address) = if ((i.caller == adminAddress)) | |
282 | + | then [DeleteEntry((("address_" + address) + "_banned"))] | |
283 | + | else throw("Allow only for admin") | |
256 | 284 | ||
257 | 285 | ||
258 | 286 |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 6 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | let createNftDapp = base58'3PFQjjDMiZKQZdu5JqTHD7HwgSXyp9Rw9By' | |
5 | 5 | ||
6 | 6 | let marketFeeAddress = Address(base58'3PKvcEmyHvo2PRsKhpKrDjmSNmnsuHn3UBR') | |
7 | 7 | ||
8 | 8 | let DAOAddress = Address(base58'3P975LUuqc7uBPiSxp3nemf2FZh62zfirSh') | |
9 | 9 | ||
10 | 10 | let puzzleStakeAddress = base58'3PFTbywqxtFfukX3HyT881g4iW5K4QL3FAS' | |
11 | 11 | ||
12 | 12 | let proxyDappAddress = base58'3P6fAxtw12pjFhayEfpcUWxgu2BHVCeP78A' | |
13 | + | ||
14 | + | let adminAddress = Address(base58'3PJKmXoHJvVeQXjSJdhtkUcFDtdiQqMbUTD') | |
13 | 15 | ||
14 | 16 | let nftDuckWrapper = base58'3P3pDosq4GCwfJkvq4yqKvvoTwmoqc9qPmo' | |
15 | 17 | ||
16 | 18 | let nftSignArtWrapper = base58'3PPgeYTWMRZ7S7jSLpnVuKKB9r6XuDk3ndC' | |
17 | 19 | ||
18 | 20 | let duckFeeAddress = base58'3P6AobNbcQ3ZjcRY37mJPKN8PP9Giz8kgeY' | |
19 | 21 | ||
20 | 22 | let ducksPercent = 30 | |
21 | 23 | ||
22 | 24 | let royaltyPercent = 7 | |
23 | 25 | ||
24 | 26 | func isNFT (asset) = if (if ((asset.decimals == 0)) | |
25 | 27 | then (asset.reissuable == false) | |
26 | 28 | else false) | |
27 | 29 | then (asset.quantity == 1) | |
28 | 30 | else false | |
29 | 31 | ||
30 | 32 | ||
31 | 33 | func checkNFT (asset) = if (if (if ((asset.issuer.bytes == createNftDapp)) | |
32 | 34 | then (asset.decimals == 0) | |
33 | 35 | else false) | |
34 | 36 | then (asset.reissuable == false) | |
35 | 37 | else false) | |
36 | 38 | then (asset.quantity == 1) | |
37 | 39 | else false | |
38 | 40 | ||
39 | 41 | ||
40 | 42 | func tryGetInteger (key) = match getInteger(this, key) { | |
41 | 43 | case b: Int => | |
42 | 44 | b | |
43 | 45 | case _ => | |
44 | 46 | 0 | |
45 | 47 | } | |
46 | 48 | ||
47 | 49 | ||
48 | 50 | func tryGetString (key) = match getString(this, key) { | |
49 | 51 | case b: String => | |
50 | 52 | b | |
51 | 53 | case _ => | |
52 | 54 | "" | |
53 | 55 | } | |
54 | 56 | ||
55 | 57 | ||
56 | 58 | func tryGetAssetInfo (assetId,errorMsg) = match assetInfo(fromBase58String(assetId)) { | |
57 | 59 | case a: Asset => | |
58 | 60 | a | |
59 | 61 | case _ => | |
60 | 62 | throw(errorMsg) | |
61 | 63 | } | |
62 | 64 | ||
63 | 65 | ||
64 | 66 | func getAssetString (assetId) = match assetId { | |
65 | 67 | case b: ByteVector => | |
66 | 68 | toBase58String(b) | |
67 | 69 | case _ => | |
68 | 70 | "WAVES" | |
69 | 71 | } | |
70 | 72 | ||
71 | 73 | ||
72 | 74 | func getAssetBytes (assetIdStr) = if ((assetIdStr == "WAVES")) | |
73 | 75 | then unit | |
74 | 76 | else fromBase58String(assetIdStr) | |
75 | 77 | ||
76 | 78 | ||
77 | 79 | func allTransfersForBid (nftId,exclude) = { | |
78 | 80 | let auctionKey = (("auction_" + nftId) + "_bids") | |
79 | 81 | let auctionData = tryGetString(auctionKey) | |
80 | 82 | let excludeId = if ((size(exclude) > 0)) | |
81 | 83 | then exclude | |
82 | 84 | else "" | |
83 | 85 | if ((size(auctionData) == 0)) | |
84 | 86 | then nil | |
85 | 87 | else { | |
86 | 88 | func getReturnTransactions (accum,next) = { | |
87 | 89 | let betParsedData = split(next, "_") | |
88 | 90 | let betOwner = betParsedData[0] | |
89 | 91 | let betAmount = parseIntValue(betParsedData[1]) | |
90 | 92 | let betAssetId = if ((betParsedData[2] == "WAVES")) | |
91 | 93 | then unit | |
92 | 94 | else fromBase58String(betParsedData[2]) | |
93 | 95 | if (if ((size(excludeId) > 0)) | |
94 | 96 | then (excludeId == next) | |
95 | 97 | else false) | |
96 | 98 | then accum | |
97 | 99 | else (accum :+ ScriptTransfer(Address(fromBase58String(betOwner)), betAmount, betAssetId)) | |
98 | 100 | } | |
99 | 101 | ||
100 | 102 | let $l = split(auctionData, ",") | |
101 | 103 | let $s = size($l) | |
102 | 104 | let $acc0 = nil | |
103 | 105 | func $f0_1 ($a,$i) = if (($i >= $s)) | |
104 | 106 | then $a | |
105 | 107 | else getReturnTransactions($a, $l[$i]) | |
106 | 108 | ||
107 | 109 | func $f0_2 ($a,$i) = if (($i >= $s)) | |
108 | 110 | then $a | |
109 | 111 | else throw("List size exceeds 26") | |
110 | 112 | ||
111 | 113 | $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26) | |
112 | 114 | } | |
113 | 115 | } | |
114 | 116 | ||
115 | 117 | ||
118 | + | func isAddressBan (address) = match getBoolean((("address_" + address) + "_banned")) { | |
119 | + | case t: Boolean => | |
120 | + | t | |
121 | + | case _ => | |
122 | + | false | |
123 | + | } | |
124 | + | ||
125 | + | ||
116 | 126 | @Callable(i) | |
117 | 127 | func sellNFT (buyOutPrice,buyOutAssetId,sellerComment) = { | |
118 | 128 | let pmt = if (if ((size(i.payments) == 1)) | |
119 | 129 | then (i.payments[0].amount == 1) | |
120 | 130 | else false) | |
121 | 131 | then i.payments[0] | |
122 | 132 | else throw("NFT not listed as payment") | |
123 | 133 | let isFree = (buyOutAssetId == "free") | |
124 | 134 | let buyOutAsset = if (isFree) | |
125 | 135 | then unit | |
126 | 136 | else getAssetBytes(buyOutAssetId) | |
127 | - | if (isDefined(pmt.assetId)) | |
128 | - | then { | |
129 | - | let nftId = value(pmt.assetId) | |
130 | - | let nft = match assetInfo(nftId) { | |
131 | - | case a: Asset => | |
132 | - | a | |
133 | - | case _ => | |
134 | - | throw("Can't find NFT") | |
135 | - | } | |
136 | - | if (checkNFT(nft)) | |
137 | - | then if (if (isFree) | |
138 | - | then true | |
139 | - | else (buyOutPrice > 0)) | |
140 | - | then { | |
141 | - | let assetNameStr = toBase58String(nft.id) | |
142 | - | let nftIssuer = match getString(Address(createNftDapp), (("nft_" + assetNameStr) + "_issuer")) { | |
143 | - | case a: String => | |
144 | - | a | |
145 | - | case _ => | |
146 | - | toString(i.caller) | |
147 | - | } | |
148 | - | let royaltyReceiver = if ((nftIssuer != toBase58String(nftSignArtWrapper))) | |
149 | - | then nftIssuer | |
150 | - | else split_4C(split_4C(value(assetInfo(nftId)).description, ".")[0], " ")[2] | |
137 | + | if (isAddressBan(toString(i.originCaller))) | |
138 | + | then throw("You are banned") | |
139 | + | else if (isDefined(pmt.assetId)) | |
140 | + | then { | |
141 | + | let nftId = value(pmt.assetId) | |
142 | + | let nft = match assetInfo(nftId) { | |
143 | + | case a: Asset => | |
144 | + | a | |
145 | + | case _ => | |
146 | + | throw("Can't find NFT") | |
147 | + | } | |
148 | + | if (checkNFT(nft)) | |
149 | + | then if (if (isFree) | |
150 | + | then true | |
151 | + | else (buyOutPrice > 0)) | |
152 | + | then { | |
153 | + | let assetNameStr = toBase58String(nft.id) | |
154 | + | let nftIssuer = match getString(Address(createNftDapp), (("nft_" + assetNameStr) + "_issuer")) { | |
155 | + | case a: String => | |
156 | + | a | |
157 | + | case _ => | |
158 | + | toString(i.caller) | |
159 | + | } | |
160 | + | let royaltyReceiver = if ((nftIssuer != toBase58String(nftSignArtWrapper))) | |
161 | + | then nftIssuer | |
162 | + | else split_4C(split_4C(value(assetInfo(nftId)).description, ".")[0], " ")[2] | |
151 | 163 | [IntegerEntry((("nft_" + assetNameStr) + "_buyOutPrice"), if (isFree) | |
152 | - | then 0 | |
153 | - | else buyOutPrice), StringEntry((("nft_" + assetNameStr) + "_buyOutAssetId"), if (isFree) | |
154 | - | then "free" | |
155 | - | else getAssetString(buyOutAsset)), StringEntry((("nft_" + assetNameStr) + "_royaltyReceiver"), royaltyReceiver), StringEntry((("nft_" + assetNameStr) + "_sellerComment"), sellerComment), StringEntry((("nft_" + assetNameStr) + "_seller"), toString(i.originCaller)), StringEntry(((("address_" + toString(i.originCaller)) + "_nft_") + assetNameStr), assetNameStr), IntegerEntry((((("address_" + toString(i.originCaller)) + "_nft_") + assetNameStr) + "_startSaleAt"), height)] | |
156 | - | } | |
157 | - | else throw("Price must be greater than zero") | |
158 | - | else throw("NFT issued by another dapp") | |
159 | - | } | |
160 | - | else throw("NFT is not attached to the transaction") | |
164 | + | then 0 | |
165 | + | else buyOutPrice), StringEntry((("nft_" + assetNameStr) + "_buyOutAssetId"), if (isFree) | |
166 | + | then "free" | |
167 | + | else getAssetString(buyOutAsset)), StringEntry((("nft_" + assetNameStr) + "_royaltyReceiver"), royaltyReceiver), StringEntry((("nft_" + assetNameStr) + "_sellerComment"), sellerComment), StringEntry((("nft_" + assetNameStr) + "_seller"), toString(i.originCaller)), StringEntry(((("address_" + toString(i.originCaller)) + "_nft_") + assetNameStr), assetNameStr), IntegerEntry((((("address_" + toString(i.originCaller)) + "_nft_") + assetNameStr) + "_startSaleAt"), height)] | |
168 | + | } | |
169 | + | else throw("Price must be greater than zero") | |
170 | + | else throw("NFT issued by another dapp") | |
171 | + | } | |
172 | + | else throw("NFT is not attached to the transaction") | |
161 | 173 | } | |
162 | 174 | ||
163 | 175 | ||
164 | 176 | ||
165 | 177 | @Callable(i) | |
166 | 178 | func buyNFT (nftId) = { | |
167 | 179 | let pmt = if ((size(i.payments) == 1)) | |
168 | 180 | then i.payments[0] | |
169 | 181 | else throw("Attached payment is required") | |
170 | 182 | let buyOutPrice = tryGetInteger((("nft_" + nftId) + "_buyOutPrice")) | |
171 | 183 | let buyOutAssetIdStr = tryGetString((("nft_" + nftId) + "_buyOutAssetId")) | |
172 | 184 | let royaltyReceiver = tryGetString((("nft_" + nftId) + "_royaltyReceiver")) | |
173 | 185 | let sellerStr = tryGetString((("nft_" + nftId) + "_seller")) | |
174 | 186 | let isFree = (buyOutAssetIdStr == "free") | |
175 | 187 | let nftAsset = tryGetAssetInfo(nftId, "NFT not found") | |
176 | 188 | let buyOutAssetId = if (if (isFree) | |
177 | 189 | then true | |
178 | 190 | else (buyOutAssetIdStr == "WAVES")) | |
179 | 191 | then unit | |
180 | 192 | else match assetInfo(fromBase58String(buyOutAssetIdStr)) { | |
181 | 193 | case a: Asset => | |
182 | 194 | a.id | |
183 | 195 | case _ => | |
184 | 196 | throw("Buyout asset not found") | |
185 | 197 | } | |
186 | 198 | let auctionKey = (("auction_" + toBase58String(nftAsset.id)) + "_bids") | |
187 | 199 | if (if (if (isFree) | |
188 | 200 | then (buyOutPrice == 0) | |
189 | 201 | else false) | |
190 | 202 | then true | |
191 | 203 | else if ((buyOutPrice > 0)) | |
192 | 204 | then (pmt.amount >= buyOutPrice) | |
193 | 205 | else false) | |
194 | 206 | then { | |
195 | 207 | let duckNftId = valueOrElse(getString(Address(nftDuckWrapper), (("nft_" + nftId) + "_duckId")), "") | |
196 | 208 | let transferFees = if ((size(duckNftId) > 0)) | |
197 | 209 | then { | |
198 | 210 | let duckFee = fraction(buyOutPrice, ducksPercent, 100) | |
199 | 211 | [ScriptTransfer(Address(fromBase58String(sellerStr)), (buyOutPrice - duckFee), buyOutAssetId), ScriptTransfer(Address(duckFeeAddress), duckFee, buyOutAssetId)] | |
200 | 212 | } | |
201 | 213 | else { | |
202 | 214 | let royaltyPart = fraction(buyOutPrice, royaltyPercent, 100) | |
203 | 215 | let marketFee = fraction(buyOutPrice, 1, 100) | |
204 | 216 | let DAOFee = fraction(buyOutPrice, 2, 100) | |
205 | 217 | [ScriptTransfer(Address(fromBase58String(sellerStr)), ((buyOutPrice - royaltyPart) - marketFee), buyOutAssetId), ScriptTransfer(Address(fromBase58String(royaltyReceiver)), royaltyPart, buyOutAssetId), ScriptTransfer(marketFeeAddress, marketFee, buyOutAssetId), ScriptTransfer(DAOAddress, DAOFee, buyOutAssetId)] | |
206 | 218 | } | |
207 | 219 | if (if (isFree) | |
208 | 220 | then true | |
209 | 221 | else (pmt.assetId == buyOutAssetId)) | |
210 | 222 | then { | |
211 | 223 | let isGroup = valueOrElse(getBoolean(Address(createNftDapp), (("nft_" + nftId) + "_isGroup")), false) | |
212 | 224 | if (!(isGroup)) | |
213 | 225 | then $Tuple2((([ScriptTransfer(i.caller, 1, nftAsset.id), DeleteEntry((("nft_" + nftId) + "_buyOutPrice")), DeleteEntry((("nft_" + nftId) + "_buyOutAssetId")), DeleteEntry((("nft_" + nftId) + "_royaltyReceiver")), DeleteEntry((("nft_" + nftId) + "_sellerComment")), DeleteEntry((("nft_" + nftId) + "_seller")), DeleteEntry(((("address_" + sellerStr) + "_nft_") + nftId)), DeleteEntry((((("address_" + sellerStr) + "_nft_") + nftId) + "_startSaleAt")), DeleteEntry(auctionKey)] ++ transferFees) ++ allTransfersForBid(toBase58String(nftAsset.id), "")), toBase58String(nftAsset.id)) | |
214 | 226 | else { | |
215 | 227 | let newNFTIdStr = match invoke(Address(createNftDapp), "mintFromGroup", [nftId], nil) { | |
216 | 228 | case s: String => | |
217 | 229 | s | |
218 | 230 | case _ => | |
219 | 231 | throw("Somthing wrong when mint multiple NFT") | |
220 | 232 | } | |
221 | 233 | if ((newNFTIdStr == newNFTIdStr)) | |
222 | 234 | then { | |
223 | 235 | let groupAvailable = value(getInteger(Address(createNftDapp), (("group_" + nftId) + "_available"))) | |
224 | 236 | if ((groupAvailable == groupAvailable)) | |
225 | 237 | then if ((groupAvailable == 0)) | |
226 | 238 | then { | |
227 | 239 | let inv = invoke(Address(createNftDapp), "burnNFT", nil, [AttachedPayment(fromBase58String(nftId), 1)]) | |
228 | 240 | if ((inv == inv)) | |
229 | 241 | then $Tuple2(([ScriptTransfer(i.caller, 1, fromBase58String(newNFTIdStr)), DeleteEntry((("nft_" + nftId) + "_buyOutPrice")), DeleteEntry((("nft_" + nftId) + "_buyOutAssetId")), DeleteEntry((("nft_" + nftId) + "_royaltyReceiver")), DeleteEntry((("nft_" + nftId) + "_sellerComment")), DeleteEntry((("nft_" + nftId) + "_seller")), DeleteEntry(((("address_" + sellerStr) + "_nft_") + nftId)), DeleteEntry((((("address_" + sellerStr) + "_nft_") + nftId) + "_startSaleAt")), DeleteEntry(auctionKey)] ++ transferFees), newNFTIdStr) | |
230 | 242 | else throw("Strict value is not equal to itself.") | |
231 | 243 | } | |
232 | 244 | else $Tuple2(([ScriptTransfer(i.caller, 1, fromBase58String(newNFTIdStr))] ++ transferFees), newNFTIdStr) | |
233 | 245 | else throw("Strict value is not equal to itself.") | |
234 | 246 | } | |
235 | 247 | else throw("Strict value is not equal to itself.") | |
236 | 248 | } | |
237 | 249 | } | |
238 | 250 | else throw("The buyout asset does not match the purchase asset") | |
239 | 251 | } | |
240 | 252 | else throw("Payment amount must be greater than zero") | |
241 | 253 | } | |
242 | 254 | ||
243 | 255 | ||
244 | 256 | ||
245 | 257 | @Callable(i) | |
246 | 258 | func cancelSell (nftId) = { | |
247 | 259 | let sellerStr = tryGetString((("nft_" + nftId) + "_seller")) | |
248 | 260 | let nftAsset = tryGetAssetInfo(nftId, "NFT not found") | |
249 | 261 | let auctionKey = (("auction_" + toBase58String(nftAsset.id)) + "_bids") | |
250 | 262 | if (if ((size(sellerStr) > 0)) | |
251 | - | then (sellerStr == toString(i.originCaller)) | |
263 | + | then if ((sellerStr == toString(i.originCaller))) | |
264 | + | then true | |
265 | + | else (adminAddress == i.originCaller) | |
252 | 266 | else false) | |
253 | 267 | then $Tuple2(([ScriptTransfer(i.caller, 1, nftAsset.id), DeleteEntry((("nft_" + nftId) + "_buyOutPrice")), DeleteEntry((("nft_" + nftId) + "_buyOutAssetId")), DeleteEntry((("nft_" + nftId) + "_royaltyReceiver")), DeleteEntry((("nft_" + nftId) + "_sellerComment")), DeleteEntry((("nft_" + nftId) + "_seller")), DeleteEntry(((("address_" + sellerStr) + "_nft_") + nftId)), DeleteEntry((((("address_" + sellerStr) + "_nft_") + nftId) + "_startSaleAt")), DeleteEntry(auctionKey)] ++ allTransfersForBid(toBase58String(nftAsset.id), "")), nftId) | |
254 | 268 | else throw("You are not a seller") | |
255 | 269 | } | |
270 | + | ||
271 | + | ||
272 | + | ||
273 | + | @Callable(i) | |
274 | + | func ban (address) = if ((i.caller == adminAddress)) | |
275 | + | then [BooleanEntry((("address_" + address) + "_banned"), true)] | |
276 | + | else throw("Allow only for admin") | |
277 | + | ||
278 | + | ||
279 | + | ||
280 | + | @Callable(i) | |
281 | + | func unBan (address) = if ((i.caller == adminAddress)) | |
282 | + | then [DeleteEntry((("address_" + address) + "_banned"))] | |
283 | + | else throw("Allow only for admin") | |
256 | 284 | ||
257 | 285 | ||
258 | 286 | ||
259 | 287 | @Callable(i) | |
260 | 288 | func like (nftId) = { | |
261 | 289 | let nftAsset = assetInfo(fromBase58String(nftId)) | |
262 | 290 | let duckNftId = valueOrElse(getString(Address(nftDuckWrapper), (("nft_" + nftId) + "_duckId")), "") | |
263 | 291 | let signArtNftId = valueOrElse(getString(Address(nftSignArtWrapper), (("signArtNft_" + nftId) + "_assetId")), "") | |
264 | 292 | let updatedNftId = if ((size(duckNftId) > 0)) | |
265 | 293 | then duckNftId | |
266 | 294 | else if ((size(signArtNftId) > 0)) | |
267 | 295 | then signArtNftId | |
268 | 296 | else nftId | |
269 | 297 | if (if (isDefined(nftAsset)) | |
270 | 298 | then checkNFT(value(nftAsset)) | |
271 | 299 | else false) | |
272 | 300 | then { | |
273 | 301 | let callerAddress = toString(i.caller) | |
274 | 302 | let countStaked = match getInteger(Address(puzzleStakeAddress), (callerAddress + "_staked")) { | |
275 | 303 | case c: Int => | |
276 | 304 | c | |
277 | 305 | case _ => | |
278 | 306 | 0 | |
279 | 307 | } | |
280 | 308 | if ((countStaked >= 100000000)) | |
281 | 309 | then { | |
282 | 310 | let nftLikesKey = (("nft_" + updatedNftId) + "_likes") | |
283 | 311 | let nftLikesValue = tryGetString((("nft_" + updatedNftId) + "_likes")) | |
284 | 312 | if (!(isDefined(indexOf(nftLikesValue, callerAddress)))) | |
285 | 313 | then { | |
286 | 314 | let newLikesValue = if ((size(nftLikesValue) == 0)) | |
287 | 315 | then toString(i.caller) | |
288 | 316 | else ((nftLikesValue + ",") + callerAddress) | |
289 | 317 | [StringEntry(nftLikesKey, newLikesValue)] | |
290 | 318 | } | |
291 | 319 | else throw("You have already voted") | |
292 | 320 | } | |
293 | 321 | else throw("You can like if you stake 1 or more Puzzles") | |
294 | 322 | } | |
295 | 323 | else throw("Invalid NFT id") | |
296 | 324 | } | |
297 | 325 | ||
298 | 326 | ||
299 | 327 | ||
300 | 328 | @Callable(i) | |
301 | 329 | func placeBid (nftId) = { | |
302 | 330 | let isGroup = valueOrElse(getBoolean(Address(createNftDapp), (("nft_" + nftId) + "_isGroup")), false) | |
303 | 331 | if (isGroup) | |
304 | 332 | then throw("This function is not temporarily available for multiple NFTs") | |
305 | 333 | else if (if ((i.payments[0].amount > 0)) | |
306 | 334 | then if (!(isDefined(i.payments[0].assetId))) | |
307 | 335 | then true | |
308 | 336 | else !(isNFT(value(assetInfo(value(i.payments[0].assetId))))) | |
309 | 337 | else false) | |
310 | 338 | then { | |
311 | 339 | let nftAsset = tryGetAssetInfo(nftId, "NFT not found") | |
312 | 340 | let nftAmount = match assetBalance(this, nftAsset.id) { | |
313 | 341 | case c: Int => | |
314 | 342 | c | |
315 | 343 | case _ => | |
316 | 344 | 0 | |
317 | 345 | } | |
318 | 346 | let sellerStr = getStringValue((("nft_" + nftId) + "_seller")) | |
319 | 347 | if ((sellerStr != toString(i.caller))) | |
320 | 348 | then if (if ((nftAmount == 1)) | |
321 | 349 | then checkNFT(nftAsset) | |
322 | 350 | else false) | |
323 | 351 | then { | |
324 | 352 | let callerStr = toString(i.caller) | |
325 | 353 | let assetAmount = i.payments[0].amount | |
326 | 354 | let assetIdStr = getAssetString(i.payments[0].assetId) | |
327 | 355 | let auctionKey = (("auction_" + toBase58String(nftAsset.id)) + "_bids") | |
328 | 356 | let auctionData = tryGetString(auctionKey) | |
329 | 357 | let addedData = ((((callerStr + "_") + toString(assetAmount)) + "_") + assetIdStr) | |
330 | 358 | if ((21 > (size(split(auctionData, ",")) + 1))) | |
331 | 359 | then { | |
332 | 360 | let exist = contains(auctionData, toString(i.caller)) | |
333 | 361 | if (!(exist)) | |
334 | 362 | then { | |
335 | 363 | let updatedData = match getString(auctionKey) { | |
336 | 364 | case s: String => | |
337 | 365 | ((s + ",") + addedData) | |
338 | 366 | case _ => | |
339 | 367 | addedData | |
340 | 368 | } | |
341 | 369 | [StringEntry(auctionKey, updatedData)] | |
342 | 370 | } | |
343 | 371 | else throw("You have already bid") | |
344 | 372 | } | |
345 | 373 | else throw("You cannot create more than 27 bets for 1 NFT") | |
346 | 374 | } | |
347 | 375 | else throw("Invalid NFT Id.") | |
348 | 376 | else throw("Seller cannot bid") | |
349 | 377 | } | |
350 | 378 | else throw("Payment not attached") | |
351 | 379 | } | |
352 | 380 | ||
353 | 381 | ||
354 | 382 | ||
355 | 383 | @Callable(i) | |
356 | 384 | func cancelBid (nftId,betId) = { | |
357 | 385 | let nftAsset = tryGetAssetInfo(nftId, "NFT not found") | |
358 | 386 | let auctionKey = (("auction_" + toBase58String(nftAsset.id)) + "_bids") | |
359 | 387 | let auctionData = tryGetString(auctionKey) | |
360 | 388 | if ((size(auctionData) > 0)) | |
361 | 389 | then { | |
362 | 390 | let callerStr = toString(i.caller) | |
363 | 391 | let bets = split(auctionData, ",") | |
364 | 392 | let betIndex = match indexOf(bets, betId) { | |
365 | 393 | case idx: Int => | |
366 | 394 | idx | |
367 | 395 | case _ => | |
368 | 396 | throw("Bet not found by id") | |
369 | 397 | } | |
370 | 398 | let betData = bets[betIndex] | |
371 | 399 | let betParsedData = split(betData, "_") | |
372 | 400 | let betOwner = betParsedData[0] | |
373 | 401 | let betAmount = parseIntValue(betParsedData[1]) | |
374 | 402 | let betAssetId = if ((betParsedData[2] == "WAVES")) | |
375 | 403 | then unit | |
376 | 404 | else fromBase58String(betParsedData[2]) | |
377 | 405 | if ((betOwner == callerStr)) | |
378 | 406 | then { | |
379 | 407 | let newBets = removeByIndex(bets, betIndex) | |
380 | 408 | let updateDataList = if ((size(newBets) == 0)) | |
381 | 409 | then [DeleteEntry(auctionKey)] | |
382 | 410 | else [StringEntry(auctionKey, makeString(newBets, ","))] | |
383 | 411 | ([ScriptTransfer(i.caller, betAmount, betAssetId)] ++ updateDataList) | |
384 | 412 | } | |
385 | 413 | else throw("This is not your bet") | |
386 | 414 | } | |
387 | 415 | else throw("Bet not found") | |
388 | 416 | } | |
389 | 417 | ||
390 | 418 | ||
391 | 419 | ||
392 | 420 | @Callable(i) | |
393 | 421 | func acceptBid (nftId,betId) = { | |
394 | 422 | let nftAsset = tryGetAssetInfo(nftId, "NFT not found") | |
395 | 423 | if ((assetBalance(this, nftAsset.id) == 1)) | |
396 | 424 | then { | |
397 | 425 | let sellerStr = tryGetString((("nft_" + nftId) + "_seller")) | |
398 | 426 | let auctionKey = (("auction_" + toBase58String(nftAsset.id)) + "_bids") | |
399 | 427 | if ((sellerStr == toString(i.caller))) | |
400 | 428 | then { | |
401 | 429 | let auctionData = tryGetString(auctionKey) | |
402 | 430 | if ((size(auctionData) > 0)) | |
403 | 431 | then { | |
404 | 432 | let bets = split(auctionData, ",") | |
405 | 433 | let betParsedData = split(betId, "_") | |
406 | 434 | let betOwner = betParsedData[0] | |
407 | 435 | let betAmount = parseIntValue(betParsedData[1]) | |
408 | 436 | let betAssetId = if ((betParsedData[2] == "WAVES")) | |
409 | 437 | then unit | |
410 | 438 | else fromBase58String(betParsedData[2]) | |
411 | 439 | let royaltyReceiver = tryGetString((("nft_" + nftId) + "_royaltyReceiver")) | |
412 | 440 | let royaltyPart = fraction(betAmount, royaltyPercent, 100) | |
413 | 441 | let marketFee = fraction(betAmount, 1, 100) | |
414 | 442 | let DAOFee = fraction(betAmount, 2, 100) | |
415 | 443 | let unlockedNftStr = match invoke(Address(proxyDappAddress), "unlock", nil, [AttachedPayment(fromBase58String(nftId), 1)]) { | |
416 | 444 | case s: String => | |
417 | 445 | s | |
418 | 446 | case _ => | |
419 | 447 | throw(("Somthing wrong when unlock NFT in address: " + toBase58String(proxyDappAddress))) | |
420 | 448 | } | |
421 | 449 | if ((unlockedNftStr == unlockedNftStr)) | |
422 | 450 | then if (if (containsElement(bets, betId)) | |
423 | 451 | then (betAmount > 0) | |
424 | 452 | else false) | |
425 | 453 | then ([ScriptTransfer(Address(fromBase58String(betOwner)), 1, fromBase58String(unlockedNftStr)), ScriptTransfer(i.caller, ((betAmount - royaltyPart) - marketFee), betAssetId), ScriptTransfer(Address(fromBase58String(royaltyReceiver)), royaltyPart, betAssetId), ScriptTransfer(marketFeeAddress, marketFee, betAssetId), ScriptTransfer(DAOAddress, DAOFee, betAssetId), DeleteEntry((("nft_" + nftId) + "_buyOutPrice")), DeleteEntry((("nft_" + nftId) + "_buyOutAssetId")), DeleteEntry((("nft_" + nftId) + "_royaltyReceiver")), DeleteEntry((("nft_" + nftId) + "_sellerComment")), DeleteEntry((("nft_" + nftId) + "_seller")), DeleteEntry(((("address_" + sellerStr) + "_nft_") + nftId)), DeleteEntry((((("address_" + sellerStr) + "_nft_") + nftId) + "_startSaleAt")), DeleteEntry(auctionKey)] ++ allTransfersForBid(toBase58String(nftAsset.id), betId)) | |
426 | 454 | else throw("Bet not found by Id") | |
427 | 455 | else throw("Strict value is not equal to itself.") | |
428 | 456 | } | |
429 | 457 | else throw("Bet not found") | |
430 | 458 | } | |
431 | 459 | else throw("You are not a seller") | |
432 | 460 | } | |
433 | 461 | else throw("NFT not found on contract") | |
434 | 462 | } | |
435 | 463 | ||
436 | 464 | ||
437 | 465 | @Verifier(tx) | |
438 | 466 | func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) | |
439 | 467 |
github/deemru/w8io/3ef1775 78.28 ms ◑