tx · A7Ut3bNqxBuaJpCRbr2uewZT7odFPSLMT5xqfnroJTC1

3MpMuGN8rW9EpPwzETAQz88Pe9TQhSwiriq:  -0.01000000 Waves

2023.07.21 11:06 [2675346] smart account 3MpMuGN8rW9EpPwzETAQz88Pe9TQhSwiriq > SELF 0.00000000 Waves

{ "type": 13, "id": "A7Ut3bNqxBuaJpCRbr2uewZT7odFPSLMT5xqfnroJTC1", "fee": 1000000, "feeAssetId": null, "timestamp": 1689926828165, "version": 2, "chainId": 84, "sender": "3MpMuGN8rW9EpPwzETAQz88Pe9TQhSwiriq", "senderPublicKey": "57SkjQUEwC1ayCqLbXLuzBqifK6B6SR6rfxtGsbAo3zW", "proofs": [ "2izr6j9d4e85MKFELfB2mdAJ64E8cDjaV94PHuYU1Khy2eyWzqDtDmKPFjyLZiV1gzJYtsdvS3QZR8uQ2QrJXzQm" ], "script": "base64:BgIfCAISAwoBARIAEgMKAQgSAwoBARIDCgEIEgASAwoBCCcADGNvbnRyYWN0RmlsZQIQbXB0X3N0YWtpbmcucmlkZQADU0VQAgJfXwAGc2NhbGU4AIDC1y8AEkFERFJFU1NfQllURVNfU0laRQAaAQh0aHJvd0VycgEDbXNnCQACAQkArAICCQCsAgIFDGNvbnRyYWN0RmlsZQICOiAFA21zZwAKa2V5QXNzZXRJZAkAuQkCCQDMCAICAiVzCQDMCAICB2Fzc2V0SWQFA25pbAUDU0VQABNrZXlFbWlzc2lvblBlckJsb2NrCQC5CQIJAMwIAgICJXMJAMwIAgIQZW1pc3Npb25QZXJCbG9jawUDbmlsBQNTRVAADWtleVN0YXJ0QmxvY2sJALkJAgkAzAgCAgIlcwkAzAgCAgpzdGFydEJsb2NrBQNuaWwFA1NFUAAQa2V5VG90YWxMcEFtb3VudAkAuQkCCQDMCAICAiVzCQDMCAICDXRvdGFsTHBBbW91bnQFA25pbAUDU0VQABNrZXlUb3RhbEFzc2V0QW1vdW50CQC5CQIJAMwIAgICJXMJAMwIAgIQdG90YWxBc3NldEFtb3VudAUDbmlsBQNTRVABD2tleVVzZXJMcEFtb3VudAELdXNlckFkZHJlc3MJALkJAgkAzAgCAgQlcyVzCQDMCAICDHVzZXJMcEFtb3VudAkAzAgCBQt1c2VyQWRkcmVzcwUDbmlsBQNTRVABGmtleVVzZXJUb3RhbEFzc2V0V2l0aGRyYXduAQt1c2VyQWRkcmVzcwkAuQkCCQDMCAICBCVzJXMJAMwIAgITdG90YWxBc3NldFdpdGhkcmF3bgkAzAgCBQt1c2VyQWRkcmVzcwUDbmlsBQNTRVABF2tleVVzZXJUb3RhbEFzc2V0U3Rha2VkAQt1c2VyQWRkcmVzcwkAuQkCCQDMCAICBCVzJXMJAMwIAgIQdG90YWxBc3NldFN0YWtlZAkAzAgCBQt1c2VyQWRkcmVzcwUDbmlsBQNTRVAADXRvdGFsTHBBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUQa2V5VG90YWxMcEFtb3VudAAAABB0b3RhbEFzc2V0QW1vdW50CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFE2tleVRvdGFsQXNzZXRBbW91bnQAAAANYXNzZXRJZFN0cmluZwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBQprZXlBc3NldElkAgVXQVZFUwAMYXNzZXRJZEJ5dGVzAwkAAAIFDWFzc2V0SWRTdHJpbmcCBVdBVkVTBQR1bml0CQDZBAEFDWFzc2V0SWRTdHJpbmcBD2dldFVzZXJMcEFtb3VudAELdXNlckFkZHJlc3MJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBD2tleVVzZXJMcEFtb3VudAEFC3VzZXJBZGRyZXNzAAAAD0FETUlOX0xJU1RfU0laRQAFAAZRVU9SVU0AAwARVFhJRF9CWVRFU19MRU5HVEgAIAEYa2V5QWxsb3dlZFR4SWRWb3RlUHJlZml4AQR0eElkCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICCWFsbG93VHhJZAkAzAgCBQR0eElkBQNuaWwFA1NFUAEQa2V5RnVsbEFkbWluVm90ZQIGcHJlZml4DGFkbWluQWRkcmVzcwkAuQkCCQDMCAIFBnByZWZpeAkAzAgCBQxhZG1pbkFkZHJlc3MFA25pbAUDU0VQARNrZXlBZG1pbkFkZHJlc3NMaXN0AAkAuQkCCQDMCAICAiVzCQDMCAICEGFkbWluQWRkcmVzc0xpc3QFA25pbAUDU0VQAQ5rZXlBbGxvd2VkVHhJZAAJALkJAgkAzAgCAgIlcwkAzAgCAgR0eElkBQNuaWwFA1NFUAEMZ2V0QWRtaW5Wb3RlAgZwcmVmaXgFYWRtaW4EB3ZvdGVLZXkJARBrZXlGdWxsQWRtaW5Wb3RlAgUGcHJlZml4BQVhZG1pbgkBC3ZhbHVlT3JFbHNlAgkAnwgBBQd2b3RlS2V5AAABDWdldEFkbWluc0xpc3QABAckbWF0Y2gwCQCdCAIFBHRoaXMJARNrZXlBZG1pbkFkZHJlc3NMaXN0AAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAJALUJAgUBcwUDU0VQBQNuaWwBDWlzSW5BZG1pbkxpc3QBB2FkZHJlc3MJAQ9jb250YWluc0VsZW1lbnQCCQENZ2V0QWRtaW5zTGlzdAAFB2FkZHJlc3MBEmdlblZvdGVzS2V5c0hlbHBlcgIBYQxhZG1pbkFkZHJlc3MECyR0MDIzNDgyMzcyBQFhBAZyZXN1bHQIBQskdDAyMzQ4MjM3MgJfMQQGcHJlZml4CAULJHQwMjM0ODIzNzICXzIJAJQKAgkAzQgCBQZyZXN1bHQJARBrZXlGdWxsQWRtaW5Wb3RlAgUGcHJlZml4BQxhZG1pbkFkZHJlc3MFBnByZWZpeAEMZ2VuVm90ZXNLZXlzAQlrZXlQcmVmaXgECWFkbWluTGlzdAkBE2tleUFkbWluQWRkcmVzc0xpc3QABAskdDAyNTE5MjYwMwoAAiRsCQENZ2V0QWRtaW5zTGlzdAAKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIFA25pbAUJa2V5UHJlZml4CgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJARJnZW5Wb3Rlc0tleXNIZWxwZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDUJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFBAZyZXN1bHQIBQskdDAyNTE5MjYwMwJfMQQGcHJlZml4CAULJHQwMjUxOTI2MDMCXzIFBnJlc3VsdAEQY291bnRWb3Rlc0hlbHBlcgIGcmVzdWx0B3ZvdGVLZXkJAGQCBQZyZXN1bHQJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUHdm90ZUtleQAAAQpjb3VudFZvdGVzAQZwcmVmaXgEBXZvdGVzCQEMZ2VuVm90ZXNLZXlzAQUGcHJlZml4CgACJGwFBXZvdGVzCgACJHMJAJADAQUCJGwKAAUkYWNjMAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJARBjb3VudFZvdGVzSGVscGVyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA1CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQEQY2xlYXJWb3Rlc0hlbHBlcgIGcmVzdWx0A2tleQkAzQgCBQZyZXN1bHQJAQtEZWxldGVFbnRyeQEFA2tleQETZ2V0Q2xlYXJWb3RlRW50cmllcwEGcHJlZml4BAV2b3RlcwkBDGdlblZvdGVzS2V5cwEFBnByZWZpeAoAAiRsBQV2b3RlcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEQY2xlYXJWb3Rlc0hlbHBlcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUBDHZvdGVJTlRFUk5BTAQTY2FsbGVyQWRkcmVzc1N0cmluZwlrZXlQcmVmaXgIbWluVm90ZXMKdm90ZVJlc3VsdAQHdm90ZUtleQkBEGtleUZ1bGxBZG1pblZvdGUCBQlrZXlQcmVmaXgFE2NhbGxlckFkZHJlc3NTdHJpbmcEEGFkbWluQ3VycmVudFZvdGUJAQxnZXRBZG1pblZvdGUCBQlrZXlQcmVmaXgFE2NhbGxlckFkZHJlc3NTdHJpbmcEA2VycgMJAQEhAQkBDWlzSW5BZG1pbkxpc3QBBRNjYWxsZXJBZGRyZXNzU3RyaW5nCQEIdGhyb3dFcnIBCQCsAgIJAKwCAgIJQWRkcmVzczogBRNjYWxsZXJBZGRyZXNzU3RyaW5nAhIgbm90IGluIEFkbWluIGxpc3QDCQAAAgUQYWRtaW5DdXJyZW50Vm90ZQABCQEIdGhyb3dFcnIBCQCsAgIFB3ZvdGVLZXkCEiB5b3UgYWxyZWFkeSB2b3RlZAUEdW5pdAMJAAACBQNlcnIFA2VycgQFdm90ZXMJAQpjb3VudFZvdGVzAQUJa2V5UHJlZml4AwkAZwIJAGQCBQV2b3RlcwABBQhtaW5Wb3RlcwQQY2xlYXJWb3RlRW50cmllcwkBE2dldENsZWFyVm90ZUVudHJpZXMBBQlrZXlQcmVmaXgJAM4IAgUQY2xlYXJWb3RlRW50cmllcwUKdm90ZVJlc3VsdAkAzAgCCQEMSW50ZWdlckVudHJ5AgUHdm90ZUtleQABBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BD2NhbGNUb3RhbFByb2ZpdAAEEGVtaXNzaW9uUGVyQmxvY2sJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUTa2V5RW1pc3Npb25QZXJCbG9jawAABApzdGFydEJsb2NrCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFDWtleVN0YXJ0QmxvY2sAAAQNZWxhcHNlZEJsb2NrcwkAZQIFBmhlaWdodAUKc3RhcnRCbG9jawkAlgMBCQDMCAIAAAkAzAgCCQBoAgUQZW1pc3Npb25QZXJCbG9jawUNZWxhcHNlZEJsb2NrcwUDbmlsAStnZXRUb3RhbEFzc2V0QW1vdW50V2l0aFByb2ZpdE9yTWF4QXZhaWxhYmxlAAQadG90YWxBc3NldEFtb3VudFdpdGhQcm9maXQJAGQCBRB0b3RhbEFzc2V0QW1vdW50CQEPY2FsY1RvdGFsUHJvZml0AAQLdG90YWxBbW91bnQEByRtYXRjaDAFDGFzc2V0SWRCeXRlcwMJAAECBQckbWF0Y2gwAgRVbml0BAF1BQckbWF0Y2gwCQCXAwEJAMwIAgUadG90YWxBc3NldEFtb3VudFdpdGhQcm9maXQJAMwIAggJAO8HAQUEdGhpcwlhdmFpbGFibGUFA25pbAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAFiBQckbWF0Y2gwCQCXAwEJAMwIAgUadG90YWxBc3NldEFtb3VudFdpdGhQcm9maXQJAMwIAgkA8AcCBQR0aGlzBQFiBQNuaWwJAAIBAgtNYXRjaCBlcnJvcgMJAAACBQ10b3RhbExwQW1vdW50AAAAAAULdG90YWxBbW91bnQBD2dldEN1cnJlbnRQcmljZQADCQECIT0CBQ10b3RhbExwQW1vdW50AAAJAGsDCQErZ2V0VG90YWxBc3NldEFtb3VudFdpdGhQcm9maXRPck1heEF2YWlsYWJsZQAFBnNjYWxlOAUNdG90YWxMcEFtb3VudAkAaAIAAQUGc2NhbGU4AQ9nZXRTdGFrZUFjdGlvbnMCAWkLdXNlckFkZHJlc3MEBmNoZWNrcwkAzAgCAwkAAAIJAJADAQgFAWkIcGF5bWVudHMAAQYJAQh0aHJvd0VycgECGHNob3VsZCBpbmNsdWRlIDEgcGF5bWVudAkAzAgCAwkAAAIICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAUMYXNzZXRJZEJ5dGVzBgkBCHRocm93RXJyAQkArAICAhVwYXltZW50IHNob3VsZCBiZSBpbiAFDWFzc2V0SWRTdHJpbmcJAMwIAgMJAGYCCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAAABgIncGF5bWVudCBhbW91bnQgc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiAwBQNuaWwDCQAAAgUGY2hlY2tzBQZjaGVja3MEDXBheW1lbnRBbW91bnQICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BA9wYXltZW50THBBbW91bnQJAGsDBQ1wYXltZW50QW1vdW50BQZzY2FsZTgJAQ9nZXRDdXJyZW50UHJpY2UABAx1c2VyTHBBbW91bnQJAQ9nZXRVc2VyTHBBbW91bnQBBQt1c2VyQWRkcmVzcwQVdXNlclRvdGFsU3Rha2VkQW1vdW50CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJARdrZXlVc2VyVG90YWxBc3NldFN0YWtlZAEFC3VzZXJBZGRyZXNzAAAEEG5ld1RvdGFsTHBBbW91bnQJAGQCBQ10b3RhbExwQW1vdW50BQ9wYXltZW50THBBbW91bnQEE25ld1RvdGFsQXNzZXRBbW91bnQJAGQCBRB0b3RhbEFzc2V0QW1vdW50BQ1wYXltZW50QW1vdW50BA9uZXdVc2VyTHBBbW91bnQJAGQCBQx1c2VyTHBBbW91bnQFD3BheW1lbnRMcEFtb3VudAQYbmV3VXNlclRvdGFsU3Rha2VkQW1vdW50CQBkAgUVdXNlclRvdGFsU3Rha2VkQW1vdW50BQ1wYXltZW50QW1vdW50BBd1cGRhdGVTdGFydEhlaWdodEFjdGlvbgMJAAACBQ10b3RhbExwQW1vdW50AAAJAMwIAgkBDEludGVnZXJFbnRyeQIFDWtleVN0YXJ0QmxvY2sFBmhlaWdodAUDbmlsBQNuaWwJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgUQa2V5VG90YWxMcEFtb3VudAUQbmV3VG90YWxMcEFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgUTa2V5VG90YWxBc3NldEFtb3VudAUTbmV3VG90YWxBc3NldEFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBD2tleVVzZXJMcEFtb3VudAEFC3VzZXJBZGRyZXNzBQ9uZXdVc2VyTHBBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJARdrZXlVc2VyVG90YWxBc3NldFN0YWtlZAEFC3VzZXJBZGRyZXNzBRhuZXdVc2VyVG90YWxTdGFrZWRBbW91bnQFA25pbAUXdXBkYXRlU3RhcnRIZWlnaHRBY3Rpb24JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4HAWkBE3NldEVtaXNzaW9uUGVyQmxvY2sBEGVtaXNzaW9uUGVyQmxvY2sEBWNoZWNrCQDMCAIDCQAAAggFAWkGY2FsbGVyBQR0aGlzBgkBCHRocm93RXJyAQIRcGVybWlzc2lvbiBkZW5pZWQFA25pbAMJAAACBQVjaGVjawUFY2hlY2sJAMwIAgkBDEludGVnZXJFbnRyeQIFE2tleVRvdGFsQXNzZXRBbW91bnQJAStnZXRUb3RhbEFzc2V0QW1vdW50V2l0aFByb2ZpdE9yTWF4QXZhaWxhYmxlAAkAzAgCCQEMSW50ZWdlckVudHJ5AgUNa2V5U3RhcnRCbG9jawUGaGVpZ2h0CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRNrZXlFbWlzc2lvblBlckJsb2NrCQCWAwEJAMwIAgAACQDMCAIFEGVtaXNzaW9uUGVyQmxvY2sFA25pbAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBBXN0YWtlAAkBD2dldFN0YWtlQWN0aW9ucwIFAWkJAKUIAQgFAWkGY2FsbGVyAWkBCHN0YWtlRm9yAQt1c2VyQWRkcmVzcwQFY2hlY2sJAMwIAgMJAAACCQDIAQEJANkEAQULdXNlckFkZHJlc3MFEkFERFJFU1NfQllURVNfU0laRQYJAQh0aHJvd0VycgECFGFkZHJlc3MgaXMgbm90IHZhbGlkBQNuaWwDCQAAAgUFY2hlY2sFBWNoZWNrCQEPZ2V0U3Rha2VBY3Rpb25zAgUBaQULdXNlckFkZHJlc3MJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEId2l0aGRyYXcBFWxwQXNzZXRXaXRoZHJhd0Ftb3VudAQLdXNlckFkZHJlc3MJAKUIAQgFAWkGY2FsbGVyBAx1c2VyTHBBbW91bnQJAQ9nZXRVc2VyTHBBbW91bnQBBQt1c2VyQWRkcmVzcwQFY2hlY2sJAMwIAgMJAGYCBRVscEFzc2V0V2l0aGRyYXdBbW91bnQAAAYJAQh0aHJvd0VycgECHGFtb3VudCBzaG91bGQgYmUgbW9yZSB0aGFuIDAJAMwIAgMJAGcCBQx1c2VyTHBBbW91bnQFFWxwQXNzZXRXaXRoZHJhd0Ftb3VudAYJAQh0aHJvd0VycgEJAKwCAgkArAICAiVjYW5ub3Qgd2l0aGRyYXcgbW9yZSB0aGFuIGF2YWlsYWJsZSAoCQCkAwEFDHVzZXJMcEFtb3VudAIBKQUDbmlsAwkAAAIFBWNoZWNrBQVjaGVjawQPbmV3VXNlckxwQW1vdW50CQBlAgUMdXNlckxwQW1vdW50BRVscEFzc2V0V2l0aGRyYXdBbW91bnQEE3dpdGhkcmF3QXNzZXRBbW91bnQJAGsDBRVscEFzc2V0V2l0aGRyYXdBbW91bnQJAQ9nZXRDdXJyZW50UHJpY2UABQZzY2FsZTgEEG5ld1RvdGFsTHBBbW91bnQJAGUCBQ10b3RhbExwQW1vdW50BRVscEFzc2V0V2l0aGRyYXdBbW91bnQEE25ld1RvdGFsQXNzZXRBbW91bnQJAGsDBRBuZXdUb3RhbExwQW1vdW50CQEPZ2V0Q3VycmVudFByaWNlAAUGc2NhbGU4BBd1c2VyVG90YWxBc3NldFdpdGhkcmF3bgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEaa2V5VXNlclRvdGFsQXNzZXRXaXRoZHJhd24BBQt1c2VyQWRkcmVzcwAABBpuZXdVc2VyVG90YWxBc3NldFdpdGhkcmF3bgkAZAIFF3VzZXJUb3RhbEFzc2V0V2l0aGRyYXduBRN3aXRoZHJhd0Fzc2V0QW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRBrZXlUb3RhbExwQW1vdW50BRBuZXdUb3RhbExwQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRNrZXlUb3RhbEFzc2V0QW1vdW50BRNuZXdUb3RhbEFzc2V0QW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEPa2V5VXNlckxwQW1vdW50AQULdXNlckFkZHJlc3MFD25ld1VzZXJMcEFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBGmtleVVzZXJUb3RhbEFzc2V0V2l0aGRyYXduAQULdXNlckFkZHJlc3MFGm5ld1VzZXJUb3RhbEFzc2V0V2l0aGRyYXduCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ1rZXlTdGFydEJsb2NrBQZoZWlnaHQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBRN3aXRoZHJhd0Fzc2V0QW1vdW50BQxhc3NldElkQnl0ZXMFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARVnZXRVc2VyQXNzZXRzUkVBRE9OTFkBC3VzZXJBZGRyZXNzBAx1c2VyTHBBbW91bnQJAQ9nZXRVc2VyTHBBbW91bnQBBQt1c2VyQWRkcmVzcwQcdXNlckF2YWlsYWJsZUFzc2V0VG9XaXRoZHJhdwkAawMFDHVzZXJMcEFtb3VudAkBD2dldEN1cnJlbnRQcmljZQAFBnNjYWxlOAQVdXNlclRvdGFsU3Rha2VkQW1vdW50CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJARdrZXlVc2VyVG90YWxBc3NldFN0YWtlZAEFC3VzZXJBZGRyZXNzAAAEF3VzZXJUb3RhbEFzc2V0V2l0aGRyYXduCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJARprZXlVc2VyVG90YWxBc3NldFdpdGhkcmF3bgEFC3VzZXJBZGRyZXNzAAAJAJQKAgUDbmlsCQCXCgUFDHVzZXJMcEFtb3VudAUcdXNlckF2YWlsYWJsZUFzc2V0VG9XaXRoZHJhdwkBD2dldEN1cnJlbnRQcmljZQAFFXVzZXJUb3RhbFN0YWtlZEFtb3VudAUXdXNlclRvdGFsQXNzZXRXaXRoZHJhd24BaQEWZ2V0VG90YWxBc3NldHNSRUFET05MWQAJAJQKAgUDbmlsCQCVCgMFDXRvdGFsTHBBbW91bnQJAStnZXRUb3RhbEFzc2V0QW1vdW50V2l0aFByb2ZpdE9yTWF4QXZhaWxhYmxlAAkBD2dldEN1cnJlbnRQcmljZQABaQELdm90ZUZvclR4SWQBBHR4SWQEE2NhbGxlckFkZHJlc3NTdHJpbmcJANgEAQgIBQFpBmNhbGxlcgVieXRlcwQJa2V5UHJlZml4CQEYa2V5QWxsb3dlZFR4SWRWb3RlUHJlZml4AQUEdHhJZAQGcmVzdWx0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ5rZXlBbGxvd2VkVHhJZAAFBHR4SWQFA25pbAQRYWxsb3dlZFR4SWRPcHRpb24JAJ0IAgUEdGhpcwkBDmtleUFsbG93ZWRUeElkAAQDZXJyCQDMCAIDCQAAAgkAyAEBCQDZBAEFBHR4SWQFEVRYSURfQllURVNfTEVOR1RIBgkBCHRocm93RXJyAQkArAICBQR0eElkAhIgaXMgbm90IHZhbGlkIHR4SWQJAMwIAgMDCQAAAgURYWxsb3dlZFR4SWRPcHRpb24FBHVuaXQGCQECIT0CCQEFdmFsdWUBBRFhbGxvd2VkVHhJZE9wdGlvbgUEdHhJZAYJAQh0aHJvd0VycgEJAKwCAgUEdHhJZAITIGlzIGFscmVhZHkgYWxsb3dlZAUDbmlsAwkAAAIFA2VycgUDZXJyCQEMdm90ZUlOVEVSTkFMBAUTY2FsbGVyQWRkcmVzc1N0cmluZwUJa2V5UHJlZml4BQZRVU9SVU0FBnJlc3VsdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgECdHgBBnZlcmlmeQAECGJ5QWRtaW5zCQAAAggFAnR4AmlkCQDZBAEJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkBDmtleUFsbG93ZWRUeElkAAIABAdieU93bmVyAwkAZwIJAJADAQkBDWdldEFkbWluc0xpc3QABQZRVU9SVU0HCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACAUCdHgPc2VuZGVyUHVibGljS2V5AwUIYnlBZG1pbnMGBQdieU93bmVyVT5M0A==", "height": 2675346, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 8Fa8PH8xvgBTVuXa7AWViEpTjZ8rooSMzJf4SRfVELxi Next: 8HvaFzBZdGMTEy4mA3ZfQZNcQJXywSRjMpEbNT9Mqz9B Diff:
OldNewDifferences
4242 else fromBase58String(assetIdString)
4343
4444 func getUserLpAmount (userAddress) = valueOrElse(getInteger(this, keyUserLpAmount(userAddress)), 0)
45+
46+
47+let ADMIN_LIST_SIZE = 5
48+
49+let QUORUM = 3
50+
51+let TXID_BYTES_LENGTH = 32
52+
53+func keyAllowedTxIdVotePrefix (txId) = makeString(["%s%s%s", "allowTxId", txId], SEP)
54+
55+
56+func keyFullAdminVote (prefix,adminAddress) = makeString([prefix, adminAddress], SEP)
57+
58+
59+func keyAdminAddressList () = makeString(["%s", "adminAddressList"], SEP)
60+
61+
62+func keyAllowedTxId () = makeString(["%s", "txId"], SEP)
63+
64+
65+func getAdminVote (prefix,admin) = {
66+ let voteKey = keyFullAdminVote(prefix, admin)
67+ valueOrElse(getInteger(voteKey), 0)
68+ }
69+
70+
71+func getAdminsList () = match getString(this, keyAdminAddressList()) {
72+ case s: String =>
73+ split(s, SEP)
74+ case _ =>
75+ nil
76+}
77+
78+
79+func isInAdminList (address) = containsElement(getAdminsList(), address)
80+
81+
82+func genVotesKeysHelper (a,adminAddress) = {
83+ let $t023482372 = a
84+ let result = $t023482372._1
85+ let prefix = $t023482372._2
86+ $Tuple2((result :+ keyFullAdminVote(prefix, adminAddress)), prefix)
87+ }
88+
89+
90+func genVotesKeys (keyPrefix) = {
91+ let adminList = keyAdminAddressList()
92+ let $t025192603 = {
93+ let $l = getAdminsList()
94+ let $s = size($l)
95+ let $acc0 = $Tuple2(nil, keyPrefix)
96+ func $f0_1 ($a,$i) = if (($i >= $s))
97+ then $a
98+ else genVotesKeysHelper($a, $l[$i])
99+
100+ func $f0_2 ($a,$i) = if (($i >= $s))
101+ then $a
102+ else throw("List size exceeds 5")
103+
104+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
105+ }
106+ let result = $t025192603._1
107+ let prefix = $t025192603._2
108+ result
109+ }
110+
111+
112+func countVotesHelper (result,voteKey) = (result + valueOrElse(getInteger(voteKey), 0))
113+
114+
115+func countVotes (prefix) = {
116+ let votes = genVotesKeys(prefix)
117+ let $l = votes
118+ let $s = size($l)
119+ let $acc0 = 0
120+ func $f0_1 ($a,$i) = if (($i >= $s))
121+ then $a
122+ else countVotesHelper($a, $l[$i])
123+
124+ func $f0_2 ($a,$i) = if (($i >= $s))
125+ then $a
126+ else throw("List size exceeds 5")
127+
128+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
129+ }
130+
131+
132+func clearVotesHelper (result,key) = (result :+ DeleteEntry(key))
133+
134+
135+func getClearVoteEntries (prefix) = {
136+ let votes = genVotesKeys(prefix)
137+ let $l = votes
138+ let $s = size($l)
139+ let $acc0 = nil
140+ func $f0_1 ($a,$i) = if (($i >= $s))
141+ then $a
142+ else clearVotesHelper($a, $l[$i])
143+
144+ func $f0_2 ($a,$i) = if (($i >= $s))
145+ then $a
146+ else throw("List size exceeds 5")
147+
148+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
149+ }
150+
151+
152+func voteINTERNAL (callerAddressString,keyPrefix,minVotes,voteResult) = {
153+ let voteKey = keyFullAdminVote(keyPrefix, callerAddressString)
154+ let adminCurrentVote = getAdminVote(keyPrefix, callerAddressString)
155+ let err = if (!(isInAdminList(callerAddressString)))
156+ then throwErr((("Address: " + callerAddressString) + " not in Admin list"))
157+ else if ((adminCurrentVote == 1))
158+ then throwErr((voteKey + " you already voted"))
159+ else unit
160+ if ((err == err))
161+ then {
162+ let votes = countVotes(keyPrefix)
163+ if (((votes + 1) >= minVotes))
164+ then {
165+ let clearVoteEntries = getClearVoteEntries(keyPrefix)
166+ (clearVoteEntries ++ voteResult)
167+ }
168+ else [IntegerEntry(voteKey, 1)]
169+ }
170+ else throw("Strict value is not equal to itself.")
171+ }
45172
46173
47174 func calcTotalProfit () = {
168295 func getTotalAssetsREADONLY () = $Tuple2(nil, $Tuple3(totalLpAmount, getTotalAssetAmountWithProfitOrMaxAvailable(), getCurrentPrice()))
169296
170297
298+
299+@Callable(i)
300+func voteForTxId (txId) = {
301+ let callerAddressString = toBase58String(i.caller.bytes)
302+ let keyPrefix = keyAllowedTxIdVotePrefix(txId)
303+ let result = [StringEntry(keyAllowedTxId(), txId)]
304+ let allowedTxIdOption = getString(this, keyAllowedTxId())
305+ let err = [if ((size(fromBase58String(txId)) == TXID_BYTES_LENGTH))
306+ then true
307+ else throwErr((txId + " is not valid txId")), if (if ((allowedTxIdOption == unit))
308+ then true
309+ else (value(allowedTxIdOption) != txId))
310+ then true
311+ else throwErr((txId + " is already allowed"))]
312+ if ((err == err))
313+ then voteINTERNAL(callerAddressString, keyPrefix, QUORUM, result)
314+ else throw("Strict value is not equal to itself.")
315+ }
316+
317+
318+@Verifier(tx)
319+func verify () = {
320+ let byAdmins = (tx.id == fromBase58String(valueOrElse(getString(this, keyAllowedTxId()), "")))
321+ let byOwner = if ((size(getAdminsList()) >= QUORUM))
322+ then false
323+ else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
324+ if (byAdmins)
325+ then true
326+ else byOwner
327+ }
328+
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let contractFile = "mpt_staking.ride"
55
66 let SEP = "__"
77
88 let scale8 = 100000000
99
1010 let ADDRESS_BYTES_SIZE = 26
1111
1212 func throwErr (msg) = throw(((contractFile + ": ") + msg))
1313
1414
1515 let keyAssetId = makeString(["%s", "assetId"], SEP)
1616
1717 let keyEmissionPerBlock = makeString(["%s", "emissionPerBlock"], SEP)
1818
1919 let keyStartBlock = makeString(["%s", "startBlock"], SEP)
2020
2121 let keyTotalLpAmount = makeString(["%s", "totalLpAmount"], SEP)
2222
2323 let keyTotalAssetAmount = makeString(["%s", "totalAssetAmount"], SEP)
2424
2525 func keyUserLpAmount (userAddress) = makeString(["%s%s", "userLpAmount", userAddress], SEP)
2626
2727
2828 func keyUserTotalAssetWithdrawn (userAddress) = makeString(["%s%s", "totalAssetWithdrawn", userAddress], SEP)
2929
3030
3131 func keyUserTotalAssetStaked (userAddress) = makeString(["%s%s", "totalAssetStaked", userAddress], SEP)
3232
3333
3434 let totalLpAmount = valueOrElse(getInteger(this, keyTotalLpAmount), 0)
3535
3636 let totalAssetAmount = valueOrElse(getInteger(this, keyTotalAssetAmount), 0)
3737
3838 let assetIdString = valueOrElse(getString(this, keyAssetId), "WAVES")
3939
4040 let assetIdBytes = if ((assetIdString == "WAVES"))
4141 then unit
4242 else fromBase58String(assetIdString)
4343
4444 func getUserLpAmount (userAddress) = valueOrElse(getInteger(this, keyUserLpAmount(userAddress)), 0)
45+
46+
47+let ADMIN_LIST_SIZE = 5
48+
49+let QUORUM = 3
50+
51+let TXID_BYTES_LENGTH = 32
52+
53+func keyAllowedTxIdVotePrefix (txId) = makeString(["%s%s%s", "allowTxId", txId], SEP)
54+
55+
56+func keyFullAdminVote (prefix,adminAddress) = makeString([prefix, adminAddress], SEP)
57+
58+
59+func keyAdminAddressList () = makeString(["%s", "adminAddressList"], SEP)
60+
61+
62+func keyAllowedTxId () = makeString(["%s", "txId"], SEP)
63+
64+
65+func getAdminVote (prefix,admin) = {
66+ let voteKey = keyFullAdminVote(prefix, admin)
67+ valueOrElse(getInteger(voteKey), 0)
68+ }
69+
70+
71+func getAdminsList () = match getString(this, keyAdminAddressList()) {
72+ case s: String =>
73+ split(s, SEP)
74+ case _ =>
75+ nil
76+}
77+
78+
79+func isInAdminList (address) = containsElement(getAdminsList(), address)
80+
81+
82+func genVotesKeysHelper (a,adminAddress) = {
83+ let $t023482372 = a
84+ let result = $t023482372._1
85+ let prefix = $t023482372._2
86+ $Tuple2((result :+ keyFullAdminVote(prefix, adminAddress)), prefix)
87+ }
88+
89+
90+func genVotesKeys (keyPrefix) = {
91+ let adminList = keyAdminAddressList()
92+ let $t025192603 = {
93+ let $l = getAdminsList()
94+ let $s = size($l)
95+ let $acc0 = $Tuple2(nil, keyPrefix)
96+ func $f0_1 ($a,$i) = if (($i >= $s))
97+ then $a
98+ else genVotesKeysHelper($a, $l[$i])
99+
100+ func $f0_2 ($a,$i) = if (($i >= $s))
101+ then $a
102+ else throw("List size exceeds 5")
103+
104+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
105+ }
106+ let result = $t025192603._1
107+ let prefix = $t025192603._2
108+ result
109+ }
110+
111+
112+func countVotesHelper (result,voteKey) = (result + valueOrElse(getInteger(voteKey), 0))
113+
114+
115+func countVotes (prefix) = {
116+ let votes = genVotesKeys(prefix)
117+ let $l = votes
118+ let $s = size($l)
119+ let $acc0 = 0
120+ func $f0_1 ($a,$i) = if (($i >= $s))
121+ then $a
122+ else countVotesHelper($a, $l[$i])
123+
124+ func $f0_2 ($a,$i) = if (($i >= $s))
125+ then $a
126+ else throw("List size exceeds 5")
127+
128+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
129+ }
130+
131+
132+func clearVotesHelper (result,key) = (result :+ DeleteEntry(key))
133+
134+
135+func getClearVoteEntries (prefix) = {
136+ let votes = genVotesKeys(prefix)
137+ let $l = votes
138+ let $s = size($l)
139+ let $acc0 = nil
140+ func $f0_1 ($a,$i) = if (($i >= $s))
141+ then $a
142+ else clearVotesHelper($a, $l[$i])
143+
144+ func $f0_2 ($a,$i) = if (($i >= $s))
145+ then $a
146+ else throw("List size exceeds 5")
147+
148+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
149+ }
150+
151+
152+func voteINTERNAL (callerAddressString,keyPrefix,minVotes,voteResult) = {
153+ let voteKey = keyFullAdminVote(keyPrefix, callerAddressString)
154+ let adminCurrentVote = getAdminVote(keyPrefix, callerAddressString)
155+ let err = if (!(isInAdminList(callerAddressString)))
156+ then throwErr((("Address: " + callerAddressString) + " not in Admin list"))
157+ else if ((adminCurrentVote == 1))
158+ then throwErr((voteKey + " you already voted"))
159+ else unit
160+ if ((err == err))
161+ then {
162+ let votes = countVotes(keyPrefix)
163+ if (((votes + 1) >= minVotes))
164+ then {
165+ let clearVoteEntries = getClearVoteEntries(keyPrefix)
166+ (clearVoteEntries ++ voteResult)
167+ }
168+ else [IntegerEntry(voteKey, 1)]
169+ }
170+ else throw("Strict value is not equal to itself.")
171+ }
45172
46173
47174 func calcTotalProfit () = {
48175 let emissionPerBlock = valueOrElse(getInteger(this, keyEmissionPerBlock), 0)
49176 let startBlock = valueOrElse(getInteger(this, keyStartBlock), 0)
50177 let elapsedBlocks = (height - startBlock)
51178 max([0, (emissionPerBlock * elapsedBlocks)])
52179 }
53180
54181
55182 func getTotalAssetAmountWithProfitOrMaxAvailable () = {
56183 let totalAssetAmountWithProfit = (totalAssetAmount + calcTotalProfit())
57184 let totalAmount = match assetIdBytes {
58185 case u: Unit =>
59186 min([totalAssetAmountWithProfit, wavesBalance(this).available])
60187 case b: ByteVector =>
61188 min([totalAssetAmountWithProfit, assetBalance(this, b)])
62189 case _ =>
63190 throw("Match error")
64191 }
65192 if ((totalLpAmount == 0))
66193 then 0
67194 else totalAmount
68195 }
69196
70197
71198 func getCurrentPrice () = if ((totalLpAmount != 0))
72199 then fraction(getTotalAssetAmountWithProfitOrMaxAvailable(), scale8, totalLpAmount)
73200 else (1 * scale8)
74201
75202
76203 func getStakeActions (i,userAddress) = {
77204 let checks = [if ((size(i.payments) == 1))
78205 then true
79206 else throwErr("should include 1 payment"), if ((i.payments[0].assetId == assetIdBytes))
80207 then true
81208 else throwErr(("payment should be in " + assetIdString)), if ((i.payments[0].amount > 0))
82209 then true
83210 else "payment amount should be greater than 0"]
84211 if ((checks == checks))
85212 then {
86213 let paymentAmount = i.payments[0].amount
87214 let paymentLpAmount = fraction(paymentAmount, scale8, getCurrentPrice())
88215 let userLpAmount = getUserLpAmount(userAddress)
89216 let userTotalStakedAmount = valueOrElse(getInteger(this, keyUserTotalAssetStaked(userAddress)), 0)
90217 let newTotalLpAmount = (totalLpAmount + paymentLpAmount)
91218 let newTotalAssetAmount = (totalAssetAmount + paymentAmount)
92219 let newUserLpAmount = (userLpAmount + paymentLpAmount)
93220 let newUserTotalStakedAmount = (userTotalStakedAmount + paymentAmount)
94221 let updateStartHeightAction = if ((totalLpAmount == 0))
95222 then [IntegerEntry(keyStartBlock, height)]
96223 else nil
97224 ([IntegerEntry(keyTotalLpAmount, newTotalLpAmount), IntegerEntry(keyTotalAssetAmount, newTotalAssetAmount), IntegerEntry(keyUserLpAmount(userAddress), newUserLpAmount), IntegerEntry(keyUserTotalAssetStaked(userAddress), newUserTotalStakedAmount)] ++ updateStartHeightAction)
98225 }
99226 else throw("Strict value is not equal to itself.")
100227 }
101228
102229
103230 @Callable(i)
104231 func setEmissionPerBlock (emissionPerBlock) = {
105232 let check = [if ((i.caller == this))
106233 then true
107234 else throwErr("permission denied")]
108235 if ((check == check))
109236 then [IntegerEntry(keyTotalAssetAmount, getTotalAssetAmountWithProfitOrMaxAvailable()), IntegerEntry(keyStartBlock, height), IntegerEntry(keyEmissionPerBlock, max([0, emissionPerBlock]))]
110237 else throw("Strict value is not equal to itself.")
111238 }
112239
113240
114241
115242 @Callable(i)
116243 func stake () = getStakeActions(i, toString(i.caller))
117244
118245
119246
120247 @Callable(i)
121248 func stakeFor (userAddress) = {
122249 let check = [if ((size(fromBase58String(userAddress)) == ADDRESS_BYTES_SIZE))
123250 then true
124251 else throwErr("address is not valid")]
125252 if ((check == check))
126253 then getStakeActions(i, userAddress)
127254 else throw("Strict value is not equal to itself.")
128255 }
129256
130257
131258
132259 @Callable(i)
133260 func withdraw (lpAssetWithdrawAmount) = {
134261 let userAddress = toString(i.caller)
135262 let userLpAmount = getUserLpAmount(userAddress)
136263 let check = [if ((lpAssetWithdrawAmount > 0))
137264 then true
138265 else throwErr("amount should be more than 0"), if ((userLpAmount >= lpAssetWithdrawAmount))
139266 then true
140267 else throwErr((("cannot withdraw more than available (" + toString(userLpAmount)) + ")"))]
141268 if ((check == check))
142269 then {
143270 let newUserLpAmount = (userLpAmount - lpAssetWithdrawAmount)
144271 let withdrawAssetAmount = fraction(lpAssetWithdrawAmount, getCurrentPrice(), scale8)
145272 let newTotalLpAmount = (totalLpAmount - lpAssetWithdrawAmount)
146273 let newTotalAssetAmount = fraction(newTotalLpAmount, getCurrentPrice(), scale8)
147274 let userTotalAssetWithdrawn = valueOrElse(getInteger(this, keyUserTotalAssetWithdrawn(userAddress)), 0)
148275 let newUserTotalAssetWithdrawn = (userTotalAssetWithdrawn + withdrawAssetAmount)
149276 [IntegerEntry(keyTotalLpAmount, newTotalLpAmount), IntegerEntry(keyTotalAssetAmount, newTotalAssetAmount), IntegerEntry(keyUserLpAmount(userAddress), newUserLpAmount), IntegerEntry(keyUserTotalAssetWithdrawn(userAddress), newUserTotalAssetWithdrawn), IntegerEntry(keyStartBlock, height), ScriptTransfer(i.caller, withdrawAssetAmount, assetIdBytes)]
150277 }
151278 else throw("Strict value is not equal to itself.")
152279 }
153280
154281
155282
156283 @Callable(i)
157284 func getUserAssetsREADONLY (userAddress) = {
158285 let userLpAmount = getUserLpAmount(userAddress)
159286 let userAvailableAssetToWithdraw = fraction(userLpAmount, getCurrentPrice(), scale8)
160287 let userTotalStakedAmount = valueOrElse(getInteger(this, keyUserTotalAssetStaked(userAddress)), 0)
161288 let userTotalAssetWithdrawn = valueOrElse(getInteger(this, keyUserTotalAssetWithdrawn(userAddress)), 0)
162289 $Tuple2(nil, $Tuple5(userLpAmount, userAvailableAssetToWithdraw, getCurrentPrice(), userTotalStakedAmount, userTotalAssetWithdrawn))
163290 }
164291
165292
166293
167294 @Callable(i)
168295 func getTotalAssetsREADONLY () = $Tuple2(nil, $Tuple3(totalLpAmount, getTotalAssetAmountWithProfitOrMaxAvailable(), getCurrentPrice()))
169296
170297
298+
299+@Callable(i)
300+func voteForTxId (txId) = {
301+ let callerAddressString = toBase58String(i.caller.bytes)
302+ let keyPrefix = keyAllowedTxIdVotePrefix(txId)
303+ let result = [StringEntry(keyAllowedTxId(), txId)]
304+ let allowedTxIdOption = getString(this, keyAllowedTxId())
305+ let err = [if ((size(fromBase58String(txId)) == TXID_BYTES_LENGTH))
306+ then true
307+ else throwErr((txId + " is not valid txId")), if (if ((allowedTxIdOption == unit))
308+ then true
309+ else (value(allowedTxIdOption) != txId))
310+ then true
311+ else throwErr((txId + " is already allowed"))]
312+ if ((err == err))
313+ then voteINTERNAL(callerAddressString, keyPrefix, QUORUM, result)
314+ else throw("Strict value is not equal to itself.")
315+ }
316+
317+
318+@Verifier(tx)
319+func verify () = {
320+ let byAdmins = (tx.id == fromBase58String(valueOrElse(getString(this, keyAllowedTxId()), "")))
321+ let byOwner = if ((size(getAdminsList()) >= QUORUM))
322+ then false
323+ else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
324+ if (byAdmins)
325+ then true
326+ else byOwner
327+ }
328+

github/deemru/w8io/873ac7e 
52.53 ms