tx · HV3fFkUaikCTs9gUWtc5M4sitXDqQq2W9fdnPuw917Ti

3MuS6qVvhBR6wSynFRdcE3fVqmGBjoc7Hhx:  -0.01300000 Waves

2023.07.04 17:30 [2651279] smart account 3MuS6qVvhBR6wSynFRdcE3fVqmGBjoc7Hhx > SELF 0.00000000 Waves

{ "type": 13, "id": "HV3fFkUaikCTs9gUWtc5M4sitXDqQq2W9fdnPuw917Ti", "fee": 1300000, "feeAssetId": null, "timestamp": 1688481017507, "version": 1, "sender": "3MuS6qVvhBR6wSynFRdcE3fVqmGBjoc7Hhx", "senderPublicKey": "62CHk4MqTdq3LqeUycy7TPnpvwrjgerSa2FqAY2EafXn", "proofs": [ "3TCV1D5CAmfQShiEqJyAzrdE1hPkLjTbtKUvvvTHDonyXx35Yoz6V9nEnWUsMCvcqJBSEh656bVwWgNQGnj7hEjE" ], "script": "base64:BwJaCAISBAoCCAgSBAoCCAESBAoCCAQSBAoCCAISAwoBCBIDCgEBEgMKAQESBQoDAgECEgQKAgIBEgQKAgIBEgUKAwEBARIAEgMKAQgSABIAEgMKAQgSABIDCgEILwADU0VQAgJfXwAQY29udHJhY3RGaWxlbmFtZQIMZmFjdG9yeS5yaWRlAQd3cmFwRXJyAQFzCQCsAgIJAKwCAgUQY29udHJhY3RGaWxlbmFtZQICOiAFAXMBCHRocm93RXJyAQFzCQACAQkBB3dyYXBFcnIBBQFzAA9BRE1JTl9MSVNUX1NJWkUABQAGUVVPUlVNAAMAEVRYSURfQllURVNfTEVOR1RIACABGGtleUFsbG93ZWRUeElkVm90ZVByZWZpeAEEdHhJZAkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAglhbGxvd1R4SWQJAMwIAgUEdHhJZAUDbmlsBQNTRVABEGtleUZ1bGxBZG1pblZvdGUCBnByZWZpeAxhZG1pbkFkZHJlc3MJALkJAgkAzAgCBQZwcmVmaXgJAMwIAgUMYWRtaW5BZGRyZXNzBQNuaWwFA1NFUAETa2V5QWRtaW5BZGRyZXNzTGlzdAAJALkJAgkAzAgCAgIlcwkAzAgCAhBhZG1pbkFkZHJlc3NMaXN0BQNuaWwFA1NFUAEOa2V5QWxsb3dlZFR4SWQACQC5CQIJAMwIAgICJXMJAMwIAgIEdHhJZAUDbmlsBQNTRVABDGdldEFkbWluVm90ZQIGcHJlZml4BWFkbWluBAd2b3RlS2V5CQEQa2V5RnVsbEFkbWluVm90ZQIFBnByZWZpeAUFYWRtaW4JAQt2YWx1ZU9yRWxzZQIJAJ8IAQUHdm90ZUtleQAAAQ1nZXRBZG1pbnNMaXN0AAQHJG1hdGNoMAkAnQgCBQR0aGlzCQETa2V5QWRtaW5BZGRyZXNzTGlzdAADCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFzBQckbWF0Y2gwCQC1CQIFAXMFA1NFUAUDbmlsAQ1pc0luQWRtaW5MaXN0AQdhZGRyZXNzCQEPY29udGFpbnNFbGVtZW50AgkBDWdldEFkbWluc0xpc3QABQdhZGRyZXNzARJnZW5Wb3Rlc0tleXNIZWxwZXICAWEMYWRtaW5BZGRyZXNzBAskdDAxMjYyMTI4NgUBYQQGcmVzdWx0CAULJHQwMTI2MjEyODYCXzEEBnByZWZpeAgFCyR0MDEyNjIxMjg2Al8yCQCUCgIJAM0IAgUGcmVzdWx0CQEQa2V5RnVsbEFkbWluVm90ZQIFBnByZWZpeAUMYWRtaW5BZGRyZXNzBQZwcmVmaXgBDGdlblZvdGVzS2V5cwEJa2V5UHJlZml4BAlhZG1pbkxpc3QJARNrZXlBZG1pbkFkZHJlc3NMaXN0AAQLJHQwMTQzMzE1MTcKAAIkbAkBDWdldEFkbWluc0xpc3QACgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBQNuaWwFCWtleVByZWZpeAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQESZ2VuVm90ZXNLZXlzSGVscGVyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA1CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQQGcmVzdWx0CAULJHQwMTQzMzE1MTcCXzEEBnByZWZpeAgFCyR0MDE0MzMxNTE3Al8yBQZyZXN1bHQBEGNvdW50Vm90ZXNIZWxwZXICBnJlc3VsdAd2b3RlS2V5CQBkAgUGcmVzdWx0CQELdmFsdWVPckVsc2UCCQCfCAEFB3ZvdGVLZXkAAAEKY291bnRWb3RlcwEGcHJlZml4BAV2b3RlcwkBDGdlblZvdGVzS2V5cwEFBnByZWZpeAoAAiRsBQV2b3RlcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEQY291bnRWb3Rlc0hlbHBlcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUBEGNsZWFyVm90ZXNIZWxwZXICBnJlc3VsdANrZXkJAM0IAgUGcmVzdWx0CQELRGVsZXRlRW50cnkBBQNrZXkBE2dldENsZWFyVm90ZUVudHJpZXMBBnByZWZpeAQFdm90ZXMJAQxnZW5Wb3Rlc0tleXMBBQZwcmVmaXgKAAIkbAUFdm90ZXMKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBEGNsZWFyVm90ZXNIZWxwZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDUJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAQx2b3RlSU5URVJOQUwEE2NhbGxlckFkZHJlc3NTdHJpbmcJa2V5UHJlZml4CG1pblZvdGVzCnZvdGVSZXN1bHQEB3ZvdGVLZXkJARBrZXlGdWxsQWRtaW5Wb3RlAgUJa2V5UHJlZml4BRNjYWxsZXJBZGRyZXNzU3RyaW5nBBBhZG1pbkN1cnJlbnRWb3RlCQEMZ2V0QWRtaW5Wb3RlAgUJa2V5UHJlZml4BRNjYWxsZXJBZGRyZXNzU3RyaW5nBANlcnIDCQEBIQEJAQ1pc0luQWRtaW5MaXN0AQUTY2FsbGVyQWRkcmVzc1N0cmluZwkBCHRocm93RXJyAQkArAICCQCsAgICCUFkZHJlc3M6IAUTY2FsbGVyQWRkcmVzc1N0cmluZwISIG5vdCBpbiBBZG1pbiBsaXN0AwkAAAIFEGFkbWluQ3VycmVudFZvdGUAAQkBCHRocm93RXJyAQkArAICBQd2b3RlS2V5AhIgeW91IGFscmVhZHkgdm90ZWQFBHVuaXQDCQAAAgUDZXJyBQNlcnIEBXZvdGVzCQEKY291bnRWb3RlcwEFCWtleVByZWZpeAMJAGcCCQBkAgUFdm90ZXMAAQUIbWluVm90ZXMEEGNsZWFyVm90ZUVudHJpZXMJARNnZXRDbGVhclZvdGVFbnRyaWVzAQUJa2V5UHJlZml4CQDOCAIFEGNsZWFyVm90ZUVudHJpZXMFCnZvdGVSZXN1bHQJAMwIAgkBDEludGVnZXJFbnRyeQIFB3ZvdGVLZXkAAQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuARRrZXlDYWxjdWxhdG9yQWRkcmVzcwACDiVzX19jYWxjdWxhdG9yARdrZXlQcm94eVRyZWFzdXJ5QWRkcmVzcwACESVzX19wcm94eVRyZWFzdXJ5AQ9rZXlDaGlsZEFkZHJlc3MAAgklc19fY2hpbGQBGGtleUJsb2NrUHJvY2Vzc2luZ1Jld2FyZAACGSVzX19ibG9ja1Byb2Nlc3NpbmdSZXdhcmQBFWtleU5leHRCbG9ja1RvUHJvY2VzcwACFiVzX19uZXh0QmxvY2tUb1Byb2Nlc3MBDGtleUxwQXNzZXRJZAACDSVzX19scEFzc2V0SWQAF2NhbGN1bGF0b3JBZGRyZXNzT3B0aW9uBAckbWF0Y2gwCQCdCAIFBHRoaXMJARRrZXlDYWxjdWxhdG9yQWRkcmVzcwADCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFzBQckbWF0Y2gwCQCmCAEFAXMDCQABAgUHJG1hdGNoMAIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yABdjYWxjdWxhdG9yQWRkcmVzc09yRmFpbAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCBRdjYWxjdWxhdG9yQWRkcmVzc09wdGlvbgkBB3dyYXBFcnIBAhppbnZhbGlkIGNhbGN1bGF0b3IgYWRkcmVzcwAacHJveHlUcmVhc3VyeUFkZHJlc3NPcHRpb24EByRtYXRjaDAJAJ0IAgUEdGhpcwkBF2tleVByb3h5VHJlYXN1cnlBZGRyZXNzAAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAJAKYIAQUBcwMJAAECBQckbWF0Y2gwAgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IAGnByb3h5VHJlYXN1cnlBZGRyZXNzT3JGYWlsCQETdmFsdWVPckVycm9yTWVzc2FnZQIFGnByb3h5VHJlYXN1cnlBZGRyZXNzT3B0aW9uCQEHd3JhcEVycgECHmludmFsaWQgcHJveHkgdHJlYXN1cnkgYWRkcmVzcwEQa2V5Q29uZmlnQWRkcmVzcwACCiVzX19jb25maWcBEmtleUNoaWxkcmVuQWRkcmVzcwACEWNvbnRyYWN0X2NoaWxkcmVuARZrZXlWb3RpbmdSZXN1bHRBZGRyZXNzAAIWY29udHJhY3Rfdm90aW5nX3Jlc3VsdAEZa2V5UHJvcG9zYWxBbGxvd0Jyb2FkY2FzdAIHYWRkcmVzcwR0eElkCQCsAgIJAKwCAgkArAICAhlwcm9wb3NhbF9hbGxvd19icm9hZGNhc3RfCQClCAEFB2FkZHJlc3MCAV8JANgEAQUEdHhJZAERa2V5SW52ZXN0ZWRCeVVzZXICDGNoaWxkQWRkcmVzcwt1c2VyQWRkcmVzcwkAuQkCCQDMCAICCGludmVzdG9yCQDMCAIJAKUIAQUMY2hpbGRBZGRyZXNzCQDMCAIJAKUIAQULdXNlckFkZHJlc3MFA25pbAIBXwATY29uZmlnQWRkcmVzc09wdGlvbgQHJG1hdGNoMAkAnQgCBQR0aGlzCQEQa2V5Q29uZmlnQWRkcmVzcwADCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFzBQckbWF0Y2gwCQCmCAEFAXMDCQABAgUHJG1hdGNoMAIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yABNjb25maWdBZGRyZXNzT3JGYWlsCQETdmFsdWVPckVycm9yTWVzc2FnZQIFE2NvbmZpZ0FkZHJlc3NPcHRpb24JAQd3cmFwRXJyAQIWaW52YWxpZCBjb25maWcgYWRkcmVzcwAZdm90aW5nUmVzdWx0QWRkcmVzc09wdGlvbgQHJG1hdGNoMAUTY29uZmlnQWRkcmVzc09wdGlvbgMJAAECBQckbWF0Y2gwAgdBZGRyZXNzBAFhBQckbWF0Y2gwBAckbWF0Y2gxCQCdCAIFAWEJARZrZXlWb3RpbmdSZXN1bHRBZGRyZXNzAAMJAAECBQckbWF0Y2gxAgZTdHJpbmcEAXMFByRtYXRjaDEJAKYIAQUBcwMJAAECBQckbWF0Y2gxAgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IDCQABAgUHJG1hdGNoMAIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yABl2b3RpbmdSZXN1bHRBZGRyZXNzT3JGYWlsCQETdmFsdWVPckVycm9yTWVzc2FnZQIFGXZvdGluZ1Jlc3VsdEFkZHJlc3NPcHRpb24JAQd3cmFwRXJyAQIdaW52YWxpZCB2b3RpbmcgcmVzdWx0IGFkZHJlc3MAFWNoaWxkcmVuQWRkcmVzc09wdGlvbgQHJG1hdGNoMAUTY29uZmlnQWRkcmVzc09wdGlvbgMJAAECBQckbWF0Y2gwAgdBZGRyZXNzBAFhBQckbWF0Y2gwBAckbWF0Y2gxCQCdCAIFAWEJARJrZXlDaGlsZHJlbkFkZHJlc3MAAwkAAQIFByRtYXRjaDECBlN0cmluZwQBcwUHJG1hdGNoMQkApggBBQFzAwkAAQIFByRtYXRjaDECBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgMJAAECBQckbWF0Y2gwAgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IAFWNoaWxkcmVuQWRkcmVzc09yRmFpbAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCBRVjaGlsZHJlbkFkZHJlc3NPcHRpb24JAQd3cmFwRXJyAQIYaW52YWxpZCBjaGlsZHJlbiBhZGRyZXNzAA9scEFzc2V0SWRPcHRpb24EByRtYXRjaDAJAJ0IAgUEdGhpcwkBDGtleUxwQXNzZXRJZAADCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFzBQckbWF0Y2gwCQDZBAEFAXMDCQABAgUHJG1hdGNoMAIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yAA9scEFzc2V0SWRPckZhaWwJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgUPbHBBc3NldElkT3B0aW9uCQEHd3JhcEVycgECEWludmFsaWQgbHBBc3NldElkAQtvbmx5QWRkcmVzcwIBaQdhZGRyZXNzAwkAAAIIBQFpBmNhbGxlcgUHYWRkcmVzcwYJAQh0aHJvd0VycgECEXBlcm1pc3Npb24gZGVuaWVkAQhvbmx5VGhpcwEBaQkBC29ubHlBZGRyZXNzAgUBaQUEdGhpcwEOb25seUNhbGN1bGF0b3IBAWkJAQtvbmx5QWRkcmVzcwIFAWkFF2NhbGN1bGF0b3JBZGRyZXNzT3JGYWlsEgFpAQtzdHJpbmdFbnRyeQIDa2V5A3ZhbAMJAQ5vbmx5Q2FsY3VsYXRvcgEFAWkJAJQKAgkAzAgCCQELU3RyaW5nRW50cnkCBQNrZXkFA3ZhbAUDbmlsBQNrZXkJAJQKAgUDbmlsBQR1bml0AWkBDGludGVnZXJFbnRyeQIDa2V5A3ZhbAMJAQ5vbmx5Q2FsY3VsYXRvcgEFAWkJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgUDa2V5BQN2YWwFA25pbAUDa2V5CQCUCgIFA25pbAUEdW5pdAFpAQxib29sZWFuRW50cnkCA2tleQN2YWwDCQEOb25seUNhbGN1bGF0b3IBBQFpCQCUCgIJAMwIAgkBDEJvb2xlYW5FbnRyeQIFA2tleQUDdmFsBQNuaWwFA2tleQkAlAoCBQNuaWwFBHVuaXQBaQELYmluYXJ5RW50cnkCA2tleQN2YWwDCQEOb25seUNhbGN1bGF0b3IBBQFpCQCUCgIJAMwIAgkBC0JpbmFyeUVudHJ5AgUDa2V5BQN2YWwFA25pbAUDa2V5CQCUCgIFA25pbAUEdW5pdAFpAQtkZWxldGVFbnRyeQEDa2V5AwkBDm9ubHlDYWxjdWxhdG9yAQUBaQkAlAoCCQDMCAIJAQtEZWxldGVFbnRyeQEFA2tleQUDbmlsBQNrZXkJAJQKAgUDbmlsBQR1bml0AWkBB3JlaXNzdWUBBmFtb3VudAMJAQ5vbmx5Q2FsY3VsYXRvcgEFAWkJAJQKAgkAzAgCCQEHUmVpc3N1ZQMFD2xwQXNzZXRJZE9yRmFpbAUGYW1vdW50BgUDbmlsBQZhbW91bnQJAJQKAgUDbmlsBQR1bml0AWkBBGJ1cm4BBmFtb3VudAMJAQ5vbmx5Q2FsY3VsYXRvcgEFAWkJAJQKAgkAzAgCCQEEQnVybgIFD2xwQXNzZXRJZE9yRmFpbAUGYW1vdW50BQNuaWwFBmFtb3VudAkAlAoCBQNuaWwFBHVuaXQBaQENdHJhbnNmZXJBc3NldAMOcmVjZXBpZW50Qnl0ZXMGYW1vdW50B2Fzc2V0SWQDCQEOb25seUNhbGN1bGF0b3IBBQFpCQCUCgIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBBQ5yZWNlcGllbnRCeXRlcwUGYW1vdW50BQdhc3NldElkBQNuaWwFBmFtb3VudAkAlAoCBQNuaWwFBHVuaXQBaQENdHJhbnNmZXJXYXZlcwIOcmVjZXBpZW50Qnl0ZXMGYW1vdW50AwkBDm9ubHlDYWxjdWxhdG9yAQUBaQkAlAoCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQUOcmVjZXBpZW50Qnl0ZXMFBmFtb3VudAUEdW5pdAUDbmlsBQZhbW91bnQJAJQKAgUDbmlsBQR1bml0AWkBGXRyYW5zZmVyRnJvbVByb3h5VHJlYXN1cnkCDnJlY2lwaWVudEJ5dGVzDXJld2FyZHNBbW91bnQDCQEOb25seUNhbGN1bGF0b3IBBQFpCQCUCgIFA25pbAkA/AcEBRpwcm94eVRyZWFzdXJ5QWRkcmVzc09yRmFpbAINdHJhbnNmZXJXYXZlcwkAzAgCBQ5yZWNpcGllbnRCeXRlcwkAzAgCBQ1yZXdhcmRzQW1vdW50BQNuaWwFA25pbAkAlAoCBQNuaWwFBHVuaXQBaQEIZmluYWxpemUDGG5ld1RyZWFzdXJ5Vm9sdW1lSW5XYXZlcxdwd3JNYW5hZ2Vyc0JvbnVzSW5XYXZlcyB0cmVhc3VyeVZvbHVtZURpZmZBbGxvY2F0aW9uQ29lZgkAlAoCBQNuaWwJAP0HBAUXY2FsY3VsYXRvckFkZHJlc3NPckZhaWwCCGZpbmFsaXplCQDMCAIICAUBaQZjYWxsZXIFYnl0ZXMJAMwIAgUYbmV3VHJlYXN1cnlWb2x1bWVJbldhdmVzCQDMCAIFF3B3ck1hbmFnZXJzQm9udXNJbldhdmVzCQDMCAIFIHRyZWFzdXJ5Vm9sdW1lRGlmZkFsbG9jYXRpb25Db2VmBQNuaWwIBQFpCHBheW1lbnRzAWkBB2NsYWltTFAACQCUCgIFA25pbAkA/QcEBRdjYWxjdWxhdG9yQWRkcmVzc09yRmFpbAIHY2xhaW1MUAkAzAgCCAgFAWkGY2FsbGVyBWJ5dGVzBQNuaWwIBQFpCHBheW1lbnRzAWkBCmNsYWltV2F2ZXMBB3R4SWRTdHIJAJQKAgUDbmlsCQD9BwQFF2NhbGN1bGF0b3JBZGRyZXNzT3JGYWlsAgpjbGFpbVdhdmVzCQDMCAIICAUBaQZjYWxsZXIFYnl0ZXMJAMwIAgkA2QQBBQd0eElkU3RyBQNuaWwIBQFpCHBheW1lbnRzAWkBBmludmVzdAAJAJQKAgUDbmlsCQD9BwQFF2NhbGN1bGF0b3JBZGRyZXNzT3JGYWlsAgZpbnZlc3QJAMwIAggIBQFpBmNhbGxlcgVieXRlcwUDbmlsCAUBaQhwYXltZW50cwFpAQh3aXRoZHJhdwAJAJQKAgUDbmlsCQD9BwQFF2NhbGN1bGF0b3JBZGRyZXNzT3JGYWlsAgh3aXRoZHJhdwkAzAgCCAgFAWkGY2FsbGVyBWJ5dGVzBQNuaWwIBQFpCHBheW1lbnRzAWkBDmNhbmNlbFdpdGhkcmF3AQd0eElkU3RyCQCUCgIFA25pbAkA/QcEBRdjYWxjdWxhdG9yQWRkcmVzc09yRmFpbAIOY2FuY2VsV2l0aGRyYXcJAMwIAggIBQFpBmNhbGxlcgVieXRlcwkAzAgCCQDZBAEFB3R4SWRTdHIFA25pbAgFAWkIcGF5bWVudHMBaQENcHJvY2Vzc0Jsb2NrcwAJAJQKAgUDbmlsCQD9BwQFF2NhbGN1bGF0b3JBZGRyZXNzT3JGYWlsAg1wcm9jZXNzQmxvY2tzCQDMCAIICAUBaQZjYWxsZXIFYnl0ZXMFA25pbAgFAWkIcGF5bWVudHMBaQELdm90ZUZvclR4SWQBBHR4SWQEE2NhbGxlckFkZHJlc3NTdHJpbmcJANgEAQgIBQFpBmNhbGxlcgVieXRlcwQJa2V5UHJlZml4CQEYa2V5QWxsb3dlZFR4SWRWb3RlUHJlZml4AQUEdHhJZAQGcmVzdWx0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ5rZXlBbGxvd2VkVHhJZAAFBHR4SWQFA25pbAQRYWxsb3dlZFR4SWRPcHRpb24JAJ0IAgUEdGhpcwkBDmtleUFsbG93ZWRUeElkAAQDZXJyCQDMCAIDCQAAAgkAyAEBCQDZBAEFBHR4SWQFEVRYSURfQllURVNfTEVOR1RIBgkBCHRocm93RXJyAQkArAICBQR0eElkAhIgaXMgbm90IHZhbGlkIHR4SWQJAMwIAgMDCQAAAgURYWxsb3dlZFR4SWRPcHRpb24FBHVuaXQGCQECIT0CCQEFdmFsdWUBBRFhbGxvd2VkVHhJZE9wdGlvbgUEdHhJZAYJAQh0aHJvd0VycgEJAKwCAgUEdHhJZAITIGlzIGFscmVhZHkgYWxsb3dlZAUDbmlsAwkAAAIFA2VycgUDZXJyCQEMdm90ZUlOVEVSTkFMBAUTY2FsbGVyQWRkcmVzc1N0cmluZwUJa2V5UHJlZml4BQZRVU9SVU0FBnJlc3VsdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgECdHgBBnZlcmlmeQAECmJ5UHJvcG9zYWwEByRtYXRjaDAFGXZvdGluZ1Jlc3VsdEFkZHJlc3NPcHRpb24DCQABAgUHJG1hdGNoMAIHQWRkcmVzcwQPcHJvcG9zYWxBZGRyZXNzBQckbWF0Y2gwCQELdmFsdWVPckVsc2UCCQCbCAIFD3Byb3Bvc2FsQWRkcmVzcwkBGWtleVByb3Bvc2FsQWxsb3dCcm9hZGNhc3QCBQR0aGlzCAUCdHgCaWQHBwQIYnlBZG1pbnMJAAACCAUCdHgCaWQJANkEAQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQEOa2V5QWxsb3dlZFR4SWQAAgAEB2J5T3duZXIDCQBnAgkAkAMBCQENZ2V0QWRtaW5zTGlzdAAFBlFVT1JVTQcJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXkDAwUKYnlQcm9wb3NhbAYFCGJ5QWRtaW5zBgUHYnlPd25lcsGySmY=", "chainId": 84, "height": 2651279, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 6UzAfASQVx6Ecb3dsUB23K3RdxiobYfiwWjAXX1MSv9x Next: HKTE68oavY7L6zq5obn9VT2M2nJfeRK41Xcq2hUx9h5S Diff:
OldNewDifferences
99
1010
1111 func throwErr (s) = throw(wrapErr(s))
12+
13+
14+let ADMIN_LIST_SIZE = 5
15+
16+let QUORUM = 3
17+
18+let TXID_BYTES_LENGTH = 32
19+
20+func keyAllowedTxIdVotePrefix (txId) = makeString(["%s%s%s", "allowTxId", txId], SEP)
21+
22+
23+func keyFullAdminVote (prefix,adminAddress) = makeString([prefix, adminAddress], SEP)
24+
25+
26+func keyAdminAddressList () = makeString(["%s", "adminAddressList"], SEP)
27+
28+
29+func keyAllowedTxId () = makeString(["%s", "txId"], SEP)
30+
31+
32+func getAdminVote (prefix,admin) = {
33+ let voteKey = keyFullAdminVote(prefix, admin)
34+ valueOrElse(getInteger(voteKey), 0)
35+ }
36+
37+
38+func getAdminsList () = match getString(this, keyAdminAddressList()) {
39+ case s: String =>
40+ split(s, SEP)
41+ case _ =>
42+ nil
43+}
44+
45+
46+func isInAdminList (address) = containsElement(getAdminsList(), address)
47+
48+
49+func genVotesKeysHelper (a,adminAddress) = {
50+ let $t012621286 = a
51+ let result = $t012621286._1
52+ let prefix = $t012621286._2
53+ $Tuple2((result :+ keyFullAdminVote(prefix, adminAddress)), prefix)
54+ }
55+
56+
57+func genVotesKeys (keyPrefix) = {
58+ let adminList = keyAdminAddressList()
59+ let $t014331517 = {
60+ let $l = getAdminsList()
61+ let $s = size($l)
62+ let $acc0 = $Tuple2(nil, keyPrefix)
63+ func $f0_1 ($a,$i) = if (($i >= $s))
64+ then $a
65+ else genVotesKeysHelper($a, $l[$i])
66+
67+ func $f0_2 ($a,$i) = if (($i >= $s))
68+ then $a
69+ else throw("List size exceeds 5")
70+
71+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
72+ }
73+ let result = $t014331517._1
74+ let prefix = $t014331517._2
75+ result
76+ }
77+
78+
79+func countVotesHelper (result,voteKey) = (result + valueOrElse(getInteger(voteKey), 0))
80+
81+
82+func countVotes (prefix) = {
83+ let votes = genVotesKeys(prefix)
84+ let $l = votes
85+ let $s = size($l)
86+ let $acc0 = 0
87+ func $f0_1 ($a,$i) = if (($i >= $s))
88+ then $a
89+ else countVotesHelper($a, $l[$i])
90+
91+ func $f0_2 ($a,$i) = if (($i >= $s))
92+ then $a
93+ else throw("List size exceeds 5")
94+
95+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
96+ }
97+
98+
99+func clearVotesHelper (result,key) = (result :+ DeleteEntry(key))
100+
101+
102+func getClearVoteEntries (prefix) = {
103+ let votes = genVotesKeys(prefix)
104+ let $l = votes
105+ let $s = size($l)
106+ let $acc0 = nil
107+ func $f0_1 ($a,$i) = if (($i >= $s))
108+ then $a
109+ else clearVotesHelper($a, $l[$i])
110+
111+ func $f0_2 ($a,$i) = if (($i >= $s))
112+ then $a
113+ else throw("List size exceeds 5")
114+
115+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
116+ }
117+
118+
119+func voteINTERNAL (callerAddressString,keyPrefix,minVotes,voteResult) = {
120+ let voteKey = keyFullAdminVote(keyPrefix, callerAddressString)
121+ let adminCurrentVote = getAdminVote(keyPrefix, callerAddressString)
122+ let err = if (!(isInAdminList(callerAddressString)))
123+ then throwErr((("Address: " + callerAddressString) + " not in Admin list"))
124+ else if ((adminCurrentVote == 1))
125+ then throwErr((voteKey + " you already voted"))
126+ else unit
127+ if ((err == err))
128+ then {
129+ let votes = countVotes(keyPrefix)
130+ if (((votes + 1) >= minVotes))
131+ then {
132+ let clearVoteEntries = getClearVoteEntries(keyPrefix)
133+ (clearVoteEntries ++ voteResult)
134+ }
135+ else [IntegerEntry(voteKey, 1)]
136+ }
137+ else throw("Strict value is not equal to itself.")
138+ }
12139
13140
14141 func keyCalculatorAddress () = "%s__calculator"
239366 func processBlocks () = $Tuple2(nil, reentrantInvoke(calculatorAddressOrFail, "processBlocks", [i.caller.bytes], i.payments))
240367
241368
369+
370+@Callable(i)
371+func voteForTxId (txId) = {
372+ let callerAddressString = toBase58String(i.caller.bytes)
373+ let keyPrefix = keyAllowedTxIdVotePrefix(txId)
374+ let result = [StringEntry(keyAllowedTxId(), txId)]
375+ let allowedTxIdOption = getString(this, keyAllowedTxId())
376+ let err = [if ((size(fromBase58String(txId)) == TXID_BYTES_LENGTH))
377+ then true
378+ else throwErr((txId + " is not valid txId")), if (if ((allowedTxIdOption == unit))
379+ then true
380+ else (value(allowedTxIdOption) != txId))
381+ then true
382+ else throwErr((txId + " is already allowed"))]
383+ if ((err == err))
384+ then voteINTERNAL(callerAddressString, keyPrefix, QUORUM, result)
385+ else throw("Strict value is not equal to itself.")
386+ }
387+
388+
242389 @Verifier(tx)
243390 func verify () = {
244- let byProposal = valueOrElse(getBoolean(votingResultAddressOrFail, keyProposalAllowBroadcast(this, tx.id)), false)
245- let byOwner = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
246- if ((votingResultAddressOption != unit))
247- then if (byProposal)
248- then true
249- else byOwner
391+ let byProposal = match votingResultAddressOption {
392+ case proposalAddress: Address =>
393+ valueOrElse(getBoolean(proposalAddress, keyProposalAllowBroadcast(this, tx.id)), false)
394+ case _ =>
395+ false
396+ }
397+ let byAdmins = (tx.id == fromBase58String(valueOrElse(getString(this, keyAllowedTxId()), "")))
398+ let byOwner = if ((size(getAdminsList()) >= QUORUM))
399+ then false
400+ else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
401+ if (if (byProposal)
402+ then true
403+ else byAdmins)
404+ then true
250405 else byOwner
251406 }
252407
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 7 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SEP = "__"
55
66 let contractFilename = "factory.ride"
77
88 func wrapErr (s) = ((contractFilename + ": ") + s)
99
1010
1111 func throwErr (s) = throw(wrapErr(s))
12+
13+
14+let ADMIN_LIST_SIZE = 5
15+
16+let QUORUM = 3
17+
18+let TXID_BYTES_LENGTH = 32
19+
20+func keyAllowedTxIdVotePrefix (txId) = makeString(["%s%s%s", "allowTxId", txId], SEP)
21+
22+
23+func keyFullAdminVote (prefix,adminAddress) = makeString([prefix, adminAddress], SEP)
24+
25+
26+func keyAdminAddressList () = makeString(["%s", "adminAddressList"], SEP)
27+
28+
29+func keyAllowedTxId () = makeString(["%s", "txId"], SEP)
30+
31+
32+func getAdminVote (prefix,admin) = {
33+ let voteKey = keyFullAdminVote(prefix, admin)
34+ valueOrElse(getInteger(voteKey), 0)
35+ }
36+
37+
38+func getAdminsList () = match getString(this, keyAdminAddressList()) {
39+ case s: String =>
40+ split(s, SEP)
41+ case _ =>
42+ nil
43+}
44+
45+
46+func isInAdminList (address) = containsElement(getAdminsList(), address)
47+
48+
49+func genVotesKeysHelper (a,adminAddress) = {
50+ let $t012621286 = a
51+ let result = $t012621286._1
52+ let prefix = $t012621286._2
53+ $Tuple2((result :+ keyFullAdminVote(prefix, adminAddress)), prefix)
54+ }
55+
56+
57+func genVotesKeys (keyPrefix) = {
58+ let adminList = keyAdminAddressList()
59+ let $t014331517 = {
60+ let $l = getAdminsList()
61+ let $s = size($l)
62+ let $acc0 = $Tuple2(nil, keyPrefix)
63+ func $f0_1 ($a,$i) = if (($i >= $s))
64+ then $a
65+ else genVotesKeysHelper($a, $l[$i])
66+
67+ func $f0_2 ($a,$i) = if (($i >= $s))
68+ then $a
69+ else throw("List size exceeds 5")
70+
71+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
72+ }
73+ let result = $t014331517._1
74+ let prefix = $t014331517._2
75+ result
76+ }
77+
78+
79+func countVotesHelper (result,voteKey) = (result + valueOrElse(getInteger(voteKey), 0))
80+
81+
82+func countVotes (prefix) = {
83+ let votes = genVotesKeys(prefix)
84+ let $l = votes
85+ let $s = size($l)
86+ let $acc0 = 0
87+ func $f0_1 ($a,$i) = if (($i >= $s))
88+ then $a
89+ else countVotesHelper($a, $l[$i])
90+
91+ func $f0_2 ($a,$i) = if (($i >= $s))
92+ then $a
93+ else throw("List size exceeds 5")
94+
95+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
96+ }
97+
98+
99+func clearVotesHelper (result,key) = (result :+ DeleteEntry(key))
100+
101+
102+func getClearVoteEntries (prefix) = {
103+ let votes = genVotesKeys(prefix)
104+ let $l = votes
105+ let $s = size($l)
106+ let $acc0 = nil
107+ func $f0_1 ($a,$i) = if (($i >= $s))
108+ then $a
109+ else clearVotesHelper($a, $l[$i])
110+
111+ func $f0_2 ($a,$i) = if (($i >= $s))
112+ then $a
113+ else throw("List size exceeds 5")
114+
115+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
116+ }
117+
118+
119+func voteINTERNAL (callerAddressString,keyPrefix,minVotes,voteResult) = {
120+ let voteKey = keyFullAdminVote(keyPrefix, callerAddressString)
121+ let adminCurrentVote = getAdminVote(keyPrefix, callerAddressString)
122+ let err = if (!(isInAdminList(callerAddressString)))
123+ then throwErr((("Address: " + callerAddressString) + " not in Admin list"))
124+ else if ((adminCurrentVote == 1))
125+ then throwErr((voteKey + " you already voted"))
126+ else unit
127+ if ((err == err))
128+ then {
129+ let votes = countVotes(keyPrefix)
130+ if (((votes + 1) >= minVotes))
131+ then {
132+ let clearVoteEntries = getClearVoteEntries(keyPrefix)
133+ (clearVoteEntries ++ voteResult)
134+ }
135+ else [IntegerEntry(voteKey, 1)]
136+ }
137+ else throw("Strict value is not equal to itself.")
138+ }
12139
13140
14141 func keyCalculatorAddress () = "%s__calculator"
15142
16143
17144 func keyProxyTreasuryAddress () = "%s__proxyTreasury"
18145
19146
20147 func keyChildAddress () = "%s__child"
21148
22149
23150 func keyBlockProcessingReward () = "%s__blockProcessingReward"
24151
25152
26153 func keyNextBlockToProcess () = "%s__nextBlockToProcess"
27154
28155
29156 func keyLpAssetId () = "%s__lpAssetId"
30157
31158
32159 let calculatorAddressOption = match getString(this, keyCalculatorAddress()) {
33160 case s: String =>
34161 addressFromString(s)
35162 case _: Unit =>
36163 unit
37164 case _ =>
38165 throw("Match error")
39166 }
40167
41168 let calculatorAddressOrFail = valueOrErrorMessage(calculatorAddressOption, wrapErr("invalid calculator address"))
42169
43170 let proxyTreasuryAddressOption = match getString(this, keyProxyTreasuryAddress()) {
44171 case s: String =>
45172 addressFromString(s)
46173 case _: Unit =>
47174 unit
48175 case _ =>
49176 throw("Match error")
50177 }
51178
52179 let proxyTreasuryAddressOrFail = valueOrErrorMessage(proxyTreasuryAddressOption, wrapErr("invalid proxy treasury address"))
53180
54181 func keyConfigAddress () = "%s__config"
55182
56183
57184 func keyChildrenAddress () = "contract_children"
58185
59186
60187 func keyVotingResultAddress () = "contract_voting_result"
61188
62189
63190 func keyProposalAllowBroadcast (address,txId) = ((("proposal_allow_broadcast_" + toString(address)) + "_") + toBase58String(txId))
64191
65192
66193 func keyInvestedByUser (childAddress,userAddress) = makeString(["investor", toString(childAddress), toString(userAddress)], "_")
67194
68195
69196 let configAddressOption = match getString(this, keyConfigAddress()) {
70197 case s: String =>
71198 addressFromString(s)
72199 case _: Unit =>
73200 unit
74201 case _ =>
75202 throw("Match error")
76203 }
77204
78205 let configAddressOrFail = valueOrErrorMessage(configAddressOption, wrapErr("invalid config address"))
79206
80207 let votingResultAddressOption = match configAddressOption {
81208 case a: Address =>
82209 match getString(a, keyVotingResultAddress()) {
83210 case s: String =>
84211 addressFromString(s)
85212 case _: Unit =>
86213 unit
87214 case _ =>
88215 throw("Match error")
89216 }
90217 case _: Unit =>
91218 unit
92219 case _ =>
93220 throw("Match error")
94221 }
95222
96223 let votingResultAddressOrFail = valueOrErrorMessage(votingResultAddressOption, wrapErr("invalid voting result address"))
97224
98225 let childrenAddressOption = match configAddressOption {
99226 case a: Address =>
100227 match getString(a, keyChildrenAddress()) {
101228 case s: String =>
102229 addressFromString(s)
103230 case _: Unit =>
104231 unit
105232 case _ =>
106233 throw("Match error")
107234 }
108235 case _: Unit =>
109236 unit
110237 case _ =>
111238 throw("Match error")
112239 }
113240
114241 let childrenAddressOrFail = valueOrErrorMessage(childrenAddressOption, wrapErr("invalid children address"))
115242
116243 let lpAssetIdOption = match getString(this, keyLpAssetId()) {
117244 case s: String =>
118245 fromBase58String(s)
119246 case _: Unit =>
120247 unit
121248 case _ =>
122249 throw("Match error")
123250 }
124251
125252 let lpAssetIdOrFail = valueOrErrorMessage(lpAssetIdOption, wrapErr("invalid lpAssetId"))
126253
127254 func onlyAddress (i,address) = if ((i.caller == address))
128255 then true
129256 else throwErr("permission denied")
130257
131258
132259 func onlyThis (i) = onlyAddress(i, this)
133260
134261
135262 func onlyCalculator (i) = onlyAddress(i, calculatorAddressOrFail)
136263
137264
138265 @Callable(i)
139266 func stringEntry (key,val) = if (onlyCalculator(i))
140267 then $Tuple2([StringEntry(key, val)], key)
141268 else $Tuple2(nil, unit)
142269
143270
144271
145272 @Callable(i)
146273 func integerEntry (key,val) = if (onlyCalculator(i))
147274 then $Tuple2([IntegerEntry(key, val)], key)
148275 else $Tuple2(nil, unit)
149276
150277
151278
152279 @Callable(i)
153280 func booleanEntry (key,val) = if (onlyCalculator(i))
154281 then $Tuple2([BooleanEntry(key, val)], key)
155282 else $Tuple2(nil, unit)
156283
157284
158285
159286 @Callable(i)
160287 func binaryEntry (key,val) = if (onlyCalculator(i))
161288 then $Tuple2([BinaryEntry(key, val)], key)
162289 else $Tuple2(nil, unit)
163290
164291
165292
166293 @Callable(i)
167294 func deleteEntry (key) = if (onlyCalculator(i))
168295 then $Tuple2([DeleteEntry(key)], key)
169296 else $Tuple2(nil, unit)
170297
171298
172299
173300 @Callable(i)
174301 func reissue (amount) = if (onlyCalculator(i))
175302 then $Tuple2([Reissue(lpAssetIdOrFail, amount, true)], amount)
176303 else $Tuple2(nil, unit)
177304
178305
179306
180307 @Callable(i)
181308 func burn (amount) = if (onlyCalculator(i))
182309 then $Tuple2([Burn(lpAssetIdOrFail, amount)], amount)
183310 else $Tuple2(nil, unit)
184311
185312
186313
187314 @Callable(i)
188315 func transferAsset (recepientBytes,amount,assetId) = if (onlyCalculator(i))
189316 then $Tuple2([ScriptTransfer(Address(recepientBytes), amount, assetId)], amount)
190317 else $Tuple2(nil, unit)
191318
192319
193320
194321 @Callable(i)
195322 func transferWaves (recepientBytes,amount) = if (onlyCalculator(i))
196323 then $Tuple2([ScriptTransfer(Address(recepientBytes), amount, unit)], amount)
197324 else $Tuple2(nil, unit)
198325
199326
200327
201328 @Callable(i)
202329 func transferFromProxyTreasury (recipientBytes,rewardsAmount) = if (onlyCalculator(i))
203330 then $Tuple2(nil, invoke(proxyTreasuryAddressOrFail, "transferWaves", [recipientBytes, rewardsAmount], nil))
204331 else $Tuple2(nil, unit)
205332
206333
207334
208335 @Callable(i)
209336 func finalize (newTreasuryVolumeInWaves,pwrManagersBonusInWaves,treasuryVolumeDiffAllocationCoef) = $Tuple2(nil, reentrantInvoke(calculatorAddressOrFail, "finalize", [i.caller.bytes, newTreasuryVolumeInWaves, pwrManagersBonusInWaves, treasuryVolumeDiffAllocationCoef], i.payments))
210337
211338
212339
213340 @Callable(i)
214341 func claimLP () = $Tuple2(nil, reentrantInvoke(calculatorAddressOrFail, "claimLP", [i.caller.bytes], i.payments))
215342
216343
217344
218345 @Callable(i)
219346 func claimWaves (txIdStr) = $Tuple2(nil, reentrantInvoke(calculatorAddressOrFail, "claimWaves", [i.caller.bytes, fromBase58String(txIdStr)], i.payments))
220347
221348
222349
223350 @Callable(i)
224351 func invest () = $Tuple2(nil, reentrantInvoke(calculatorAddressOrFail, "invest", [i.caller.bytes], i.payments))
225352
226353
227354
228355 @Callable(i)
229356 func withdraw () = $Tuple2(nil, reentrantInvoke(calculatorAddressOrFail, "withdraw", [i.caller.bytes], i.payments))
230357
231358
232359
233360 @Callable(i)
234361 func cancelWithdraw (txIdStr) = $Tuple2(nil, reentrantInvoke(calculatorAddressOrFail, "cancelWithdraw", [i.caller.bytes, fromBase58String(txIdStr)], i.payments))
235362
236363
237364
238365 @Callable(i)
239366 func processBlocks () = $Tuple2(nil, reentrantInvoke(calculatorAddressOrFail, "processBlocks", [i.caller.bytes], i.payments))
240367
241368
369+
370+@Callable(i)
371+func voteForTxId (txId) = {
372+ let callerAddressString = toBase58String(i.caller.bytes)
373+ let keyPrefix = keyAllowedTxIdVotePrefix(txId)
374+ let result = [StringEntry(keyAllowedTxId(), txId)]
375+ let allowedTxIdOption = getString(this, keyAllowedTxId())
376+ let err = [if ((size(fromBase58String(txId)) == TXID_BYTES_LENGTH))
377+ then true
378+ else throwErr((txId + " is not valid txId")), if (if ((allowedTxIdOption == unit))
379+ then true
380+ else (value(allowedTxIdOption) != txId))
381+ then true
382+ else throwErr((txId + " is already allowed"))]
383+ if ((err == err))
384+ then voteINTERNAL(callerAddressString, keyPrefix, QUORUM, result)
385+ else throw("Strict value is not equal to itself.")
386+ }
387+
388+
242389 @Verifier(tx)
243390 func verify () = {
244- let byProposal = valueOrElse(getBoolean(votingResultAddressOrFail, keyProposalAllowBroadcast(this, tx.id)), false)
245- let byOwner = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
246- if ((votingResultAddressOption != unit))
247- then if (byProposal)
248- then true
249- else byOwner
391+ let byProposal = match votingResultAddressOption {
392+ case proposalAddress: Address =>
393+ valueOrElse(getBoolean(proposalAddress, keyProposalAllowBroadcast(this, tx.id)), false)
394+ case _ =>
395+ false
396+ }
397+ let byAdmins = (tx.id == fromBase58String(valueOrElse(getString(this, keyAllowedTxId()), "")))
398+ let byOwner = if ((size(getAdminsList()) >= QUORUM))
399+ then false
400+ else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
401+ if (if (byProposal)
402+ then true
403+ else byAdmins)
404+ then true
250405 else byOwner
251406 }
252407

github/deemru/w8io/3ef1775 
63.35 ms