tx · CpbcRrsQL85Xk56XtbcjADsod9VcAmh9jjmfp5ie9WLg

3PM6Wsfm2ePMqbY5PQXMSDVpYfYgzHPWRhQ:  -0.01600000 Waves

2023.10.21 19:18 [3874450] smart account 3PM6Wsfm2ePMqbY5PQXMSDVpYfYgzHPWRhQ > SELF 0.00000000 Waves

{ "type": 13, "id": "CpbcRrsQL85Xk56XtbcjADsod9VcAmh9jjmfp5ie9WLg", "fee": 1600000, "feeAssetId": null, "timestamp": 1697905158360, "version": 1, "sender": "3PM6Wsfm2ePMqbY5PQXMSDVpYfYgzHPWRhQ", "senderPublicKey": "Azj6CQbpigVMo3cysDxKDiqtXexMNjVzgdMaoeXeEmar", "proofs": [ "2Hx6JdN9MjU6TrSvoT3MdH34y3PZi44JMcZaBV6Acuqc26yCwzEr2Cih8dESqsZ5NbUMbA2NMh9mgdxYELyMcUB6" ], "script": "base64:AAIFAAAAAAAAACEIAhIDCgEIEgQKAggIEgMKAQgSAwoBCBIDCgEIEgMKAQgAAAAyAQAAAAd0aHJvd0lmAAAAAgAAAAljb25kaXRpb24AAAAFZXJyb3IDBQAAAAljb25kaXRpb24JAAACAAAAAQUAAAAFZXJyb3IGAQAAAAh3cml0ZUludAAAAAIAAAADa2V5AAAABXZhbHVlAwkAAGYAAAACAAAAAAAAAAAABQAAAAV2YWx1ZQkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAABd3cml0aW5nIG5lZ2F0aXZlIHZhbHVlIAkAAaQAAAABBQAAAAV2YWx1ZQIAAAAJIGZvciBrZXkgBQAAAANrZXkJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAANrZXkFAAAABXZhbHVlAQAAABB3cml0ZUNvbnN0U3RyaW5nAAAAAgAAAANrZXkAAAAFdmFsdWUDCQEAAAABIQAAAAEJAQAAAAlpc0RlZmluZWQAAAABCQAEHQAAAAIFAAAABHRoaXMFAAAAA2tleQkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAADa2V5BQAAAAV2YWx1ZQkAAAIAAAABCQABLAAAAAICAAAAFWFscmVhZHkgaW5pdGlhbGl6ZWQ6IAUAAAADa2V5AQAAAA13cml0ZUNvbnN0SW50AAAAAgAAAANrZXkAAAAFdmFsdWUDCQEAAAABIQAAAAEJAQAAAAlpc0RlZmluZWQAAAABCQAEGgAAAAIFAAAABHRoaXMFAAAAA2tleQkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAA2tleQUAAAAFdmFsdWUJAAACAAAAAQkAASwAAAACAgAAABBhbHJlYWR5IGV4aXN0czogBQAAAANrZXkBAAAACGNoYW5nZUJ5AAAAAgAAAANrZXkAAAAFdmFsdWUJAQAAAAh3cml0ZUludAAAAAIFAAAAA2tleQkAAGQAAAACCQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMFAAAAA2tleQAAAAAAAAAAAAUAAAAFdmFsdWUBAAAABWFzSW50AAAAAQAAAAV2YWx1ZQQAAAAHJG1hdGNoMAUAAAAFdmFsdWUDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAA0ludAQAAAADaW50BQAAAAckbWF0Y2gwBQAAAANpbnQJAAACAAAAAQIAAAAZd3JvbmcgdHlwZSwgZXhwZWN0ZWQ6IEludAAAAAASY29uZmlnQWRkcmVzc1N0b3JlAgAAAA1jb25maWdBZGRyZXNzAAAAAA1jb25maWdBZGRyZXNzCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQmAAAAAQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAABHRoaXMFAAAAEmNvbmZpZ0FkZHJlc3NTdG9yZQIAAAAfbW90aGVyIHZvdGluZzogbm8gY29uZmlnQWRkcmVzcwIAAAAWaW52YWxpZCBjb25maWcgYWRkcmVzcwAAAAAUdm90aW5nUmVzdWx0Q29udHJhY3QJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABCYAAAABCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQdAAAAAgUAAAANY29uZmlnQWRkcmVzcwIAAAAWY29udHJhY3Rfdm90aW5nX3Jlc3VsdAIAAAAZbm8gY29udHJhY3Rfdm90aW5nX3Jlc3VsdAIAAAAeaW52YWxpZCBjb250cmFjdF92b3RpbmdfcmVzdWx0AAAAABV2b3RpbmdSZXdhcmRzQ29udHJhY3QJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABCYAAAABCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQdAAAAAgUAAAANY29uZmlnQWRkcmVzcwIAAAAXY29udHJhY3Rfdm90aW5nX3Jld2FyZHMCAAAAGm5vIGNvbnRyYWN0X3ZvdGluZ19yZXdhcmRzAgAAAB9pbnZhbGlkIGNvbnRyYWN0X3ZvdGluZ19yZXdhcmRzAAAAAA9zdGFraW5nQ29udHJhY3QJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABCYAAAABCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQdAAAAAgUAAAANY29uZmlnQWRkcmVzcwIAAAAQY29udHJhY3Rfc3Rha2luZwIAAAATbm8gc3Rha2luZ19jb250cmFjdAIAAAAXaW52YWxpZCBzdGFraW5nQ29udHJhY3QAAAAABkhFSUdIVAUAAAAGaGVpZ2h0AQAAAAZhZHZpc2UAAAAACQABLAAAAAICAAAACGhlaWdodDogCQABpAAAAAEFAAAABkhFSUdIVAAAAAAEQkFTRQAAAAAAAAAD6AEAAAAJb3BBbGxvd2VkAAAAAQAAAAJvcAQAAAABYQkAA/wAAAAEBQAAAA1jb25maWdBZGRyZXNzAgAAAAlvcEFsbG93ZWQJAARMAAAAAgUAAAACb3AFAAAAA25pbAUAAAADbmlsAwkAAAAAAAACBQAAAAFhBQAAAAFhBgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAAAAFHByb3Bvc2FsQWRkcmVzc1N0b3JlAAAAAQAAAAJpZAkAASwAAAACAgAAABFwcm9wb3NhbF9hZGRyZXNzXwUAAAACaWQBAAAAE3Byb3Bvc2FsSGVpZ2h0U3RvcmUAAAABAAAAAmlkCQABLAAAAAICAAAAEHByb3Bvc2FsX2hlaWdodF8FAAAAAmlkAQAAABhwcm9wb3NhbFZvdGluZ1N0YXJ0U3RvcmUAAAABAAAAAmlkCQABLAAAAAICAAAAFXByb3Bvc2FsX3ZvdGluZ3N0YXJ0XwUAAAACaWQBAAAAFnByb3Bvc2FsVm90aW5nRW5kU3RvcmUAAAABAAAAAmlkCQABLAAAAAICAAAAE3Byb3Bvc2FsX3ZvdGluZ2VuZF8FAAAAAmlkAQAAAA9wcm9wb3NhbEJ5U3RvcmUAAAABAAAAAmlkCQABLAAAAAICAAAADHByb3Bvc2FsX2J5XwUAAAACaWQBAAAAF3Byb3Bvc2FsVG90YWxQb3dlclN0b3JlAAAAAQAAAAJpZAkAASwAAAACAgAAAA9wcm9wb3NhbF9wb3dlcl8FAAAAAmlkAQAAABVwcm9wb3NhbFRvdGFsWWVzU3RvcmUAAAABAAAAAmlkCQABLAAAAAICAAAADXByb3Bvc2FsX3llc18FAAAAAmlkAQAAABRwcm9wb3NhbFRvdGFsTm9TdG9yZQAAAAEAAAACaWQJAAEsAAAAAgIAAAAMcHJvcG9zYWxfbm9fBQAAAAJpZAEAAAAUcHJvcG9zYWxVc2VyWWVzU3RvcmUAAAACAAAABHVzZXIAAAACaWQJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAEnVzZXJfcHJvcG9zYWxfeWVzXwUAAAAEdXNlcgIAAAABXwUAAAACaWQBAAAAE3Byb3Bvc2FsVXNlck5vU3RvcmUAAAACAAAABHVzZXIAAAACaWQJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAEXVzZXJfcHJvcG9zYWxfbm9fBQAAAAR1c2VyAgAAAAFfBQAAAAJpZAEAAAAadXNlckxhc3RQcm9wb3NlSGVpZ2h0U3RvcmUAAAABAAAABHVzZXIJAAEsAAAAAgIAAAATcHJvcG9zZV9sYXN0aGVpZ2h0XwUAAAAEdXNlcgEAAAAHdXNlclllcwAAAAIAAAAEdXNlcgAAAAJpZAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzCQEAAAAUcHJvcG9zYWxVc2VyWWVzU3RvcmUAAAACBQAAAAR1c2VyBQAAAAJpZAAAAAAAAAAAAAEAAAAGdXNlck5vAAAAAgAAAAR1c2VyAAAAAmlkCQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMJAQAAABNwcm9wb3NhbFVzZXJOb1N0b3JlAAAAAgUAAAAEdXNlcgUAAAACaWQAAAAAAAAAAAABAAAAFXVzZXJMYXN0UHJvcG9zZUhlaWdodAAAAAEAAAAEdXNlcgkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzCQEAAAAadXNlckxhc3RQcm9wb3NlSGVpZ2h0U3RvcmUAAAABBQAAAAR1c2VyAP//////////AAAAAAt0aGlzQWRkcmVzcwkABCUAAAABBQAAAAR0aGlzAAAAABB1c2VyUHJvcG9zZURlbGF5CQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAANY29uZmlnQWRkcmVzcwkAASwAAAACBQAAAAt0aGlzQWRkcmVzcwIAAAATX3VzZXJfcHJvcG9zZV9kZWxheQIAAAAhdXNlcl9wcm9wb3NlX2RlbGF5IGlzIG5vdCBkZWZpbmVkAAAAAAtxdW9ydW1SYXRpbwkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAADWNvbmZpZ0FkZHJlc3MJAAEsAAAAAgUAAAALdGhpc0FkZHJlc3MCAAAAFl9wcm9wb3NhbF9xdW9ydW1fcmF0aW8CAAAAInByb3Bvc2FsUXVvcnVtUmF0aW8gaXMgbm90IGRlZmluZWQBAAAAE3Byb3Bvc2FsUXVvcnVtU3RvcmUAAAABAAAABHR4aWQJAAEsAAAAAgIAAAAWcHJvcG9zYWxfcXVvcnVtX3JhdGlvXwUAAAAEdHhpZAAAAAALcGFzc2VkUmF0aW8JAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAA1jb25maWdBZGRyZXNzCQABLAAAAAIFAAAAC3RoaXNBZGRyZXNzAgAAABZfcHJvcG9zYWxfcGFzc2VkX3JhdGlvAgAAACVwcm9wb3NhbFRocmVzaG9sZFJhdGlvIGlzIG5vdCBkZWZpbmVkAAAAABNwcm9wb3NhbE1pblJlcXVpcmVkCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAANY29uZmlnQWRkcmVzcwkAASwAAAACBQAAAAt0aGlzQWRkcmVzcwIAAAAcX3Byb3Bvc2FsX21pbl9wb3dlcl9yZXF1aXJlZAIAAAAbbWluIHJlcXVpcmVkIGlzIG5vdCBkZWZpbmVkAAAAABF2b3RpbmdTdGFydE9mZnNldAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAADWNvbmZpZ0FkZHJlc3MJAAEsAAAAAgUAAAALdGhpc0FkZHJlc3MCAAAAHF9wcm9wb3NhbF92b3RpbmdzdGFydF9vZmZzZXQCAAAAKnByb3Bvc2FsX3ZvdGluZ3N0YXJ0X29mZnNldCBpcyBub3QgZGVmaW5lZAAAAAAPdm90aW5nRW5kT2Zmc2V0CQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAANY29uZmlnQWRkcmVzcwkAASwAAAACBQAAAAt0aGlzQWRkcmVzcwIAAAAaX3Byb3Bvc2FsX3ZvdGluZ2VuZF9vZmZzZXQCAAAAKHByb3Bvc2FsX3ZvdGluZ2VuZF9vZmZzZXQgaXMgbm90IGRlZmluZWQBAAAACnVzZXJTaGFyZXMAAAABAAAABHVzZXIJAQAAAAVhc0ludAAAAAEJAAP8AAAABAUAAAAPc3Rha2luZ0NvbnRy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T3JFbHNlAAAAAgkABB8AAAABCQABLAAAAAICAAAADHByb3Bvc2FsX25vXwUAAAACaWQAAAAAAAAAAAAFAAAABW5vSW5jBAAAAAp0b3RhbFBvd2VyCQEAAAAQdG90YWxWb3RpbmdQb3dlcgAAAAAEAAAACnRvdGFsVm90ZXMJAABkAAAAAgUAAAAIdm90ZXNZZXMFAAAAB3ZvdGVzTm8EAAAACWhhc1F1b3J1bQkAAGcAAAACCQAAaQAAAAIJAABoAAAAAgUAAAAKdG90YWxWb3RlcwUAAAAEQkFTRQUAAAAKdG90YWxQb3dlcgkBAAAABnF1b3J1bQAAAAEFAAAAAmlkBAAAAAloYXNQYXNzZWQJAABnAAAAAgkAAGkAAAACCQAAaAAAAAIFAAAACHZvdGVzWWVzBQAAAARCQVNFBQAAAAp0b3RhbFZvdGVzBQAAAAtwYXNzZWRSYXRpbwMFAAAACWhhc1F1b3J1bQUAAAAJaGFzUGFzc2VkBwEAAAAOYWR2aXNlUHJvcG9zYWwAAAABAAAABHR4SWQEAAAADnByb3Bvc2FsSGVpZ2h0CQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQfAAAAAQkBAAAAE3Byb3Bvc2FsSGVpZ2h0U3RvcmUAAAABBQAAAAR0eElkAgAAAAtubyBwcm9wb3NhbAQAAAALdm90aW5nU3RhcnQJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB8AAAABCQEAAAAYcHJvcG9zYWxWb3RpbmdTdGFydFN0b3JlAAAAAQUAAAAEdHhJZAIAAAALbm8gcHJvcG9zYWwEAAAACXZvdGluZ0VuZAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHwAAAAEJAQAAABZwcm9wb3NhbFZvdGluZ0VuZFN0b3JlAAAAAQUAAAAEdHhJZAIAAAALbm8gcHJvcG9zYWwEAAAACHZvdGVzWWVzCQEAAAALdmFsdWVPckVsc2UAAAACCQAEHwAAAAEJAQAAABVwcm9wb3NhbFRvdGFsWWVzU3RvcmUAAAABBQAAAAR0eElkAAAAAAAAAAAABAAAAAd2b3Rlc05vCQEAAAALdmFsdWVPckVsc2UAAAACCQAEHwAAAAEJAQAAABRwcm9wb3NhbFRvdGFsTm9TdG9yZQAAAAEFAAAABHR4SWQAAAAAAAAAAAAEAAAADnRvdGFsUG93ZXJTbmFwCQEAAAALdmFsdWVPckVsc2UAAAACCQAEHwAAAAEJAQAAABdwcm9wb3NhbFRvdGFsUG93ZXJTdG9yZQAAAAEFAAAABHR4SWQAAAAAAAAAAAAEAAAACnRvdGFsVm90ZXMJAABkAAAAAgUAAAAIdm90ZXNZZXMFAAAAB3ZvdGVzTm8EAAAACWhhc1F1b3J1bQMJAABmAAAAAgUAAAAKdG90YWxWb3RlcwAAAAAAAAAAAAkAAGcAAAACCQAAaQAAAAIJAABoAAAAAgUAAAAKdG90YWxWb3RlcwUAAAAEQkFTRQUAAAAOdG90YWxQb3dlclNuYXAJAQAAAAZxdW9ydW0AAAABBQAAAAR0eElkBwQAAAAJaGFzUGFzc2VkAwkAAGYAAAACBQAAAAp0b3RhbFZvdGVzAAAAAAAAAAAACQAAZwAAAAIJAABpAAAAAgkAAGgAAAACBQAAAAh2b3Rlc1llcwUAAAAEQkFTRQUAAAAKdG90YWxWb3RlcwUAAAALcGFzc2VkUmF0aW8HBAAAABJpbkJsb2NrY2hhaW5IZWlnaHQJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAPpAAAAAQkAAlkAAAABBQAAAAR0eElkAAAAAAAAAAAABAAAAAZzdGF0dXMDCQAAZgAAAAIFAAAAC3ZvdGluZ1N0YXJ0BQAAAAZIRUlHSFQCAAAACmRpc2N1c3Npb24DCQAAZwAAAAIFAAAACXZvdGluZ0VuZAUAAAAGSEVJR0hUAgAAAAZ2b3RpbmcDCQEAAAABIQAAAAEFAAAACWhhc1F1b3J1bQIAAAAIbm9RdW9ydW0DCQEAAAABIQAAAAEFAAAACWhhc1Bhc3NlZAIAAAAMdm90aW5nRmFpbGVkAwkAAGYAAAACBQAAABJpbkJsb2NrY2hhaW5IZWlnaHQAAAAAAAAAAAACAAAADGluQmxvY2tjaGFpbgIAAAAMd2FpdGluZ0ZvclR4CQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAA1wcm9wb3NhbF9pZDogBQAAAAR0eElkAgAAABQsIHByb3Bvc2FsX2FkZHJlc3M6IAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQEAAAAUcHJvcG9zYWxBZGRyZXNzU3RvcmUAAAABBQAAAAR0eElkAgAAAApubyBhZGRyZXNzAgAAABMsIHByb3Bvc2FsX3N0YXR1czogBQAAAAZzdGF0dXMCAAAADywgcHJvcG9zYWxfYnk6IAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAABHRoaXMJAQAAAA9wcm9wb3NhbEJ5U3RvcmUAAAABBQAAAAR0eElkAgAAAAtubyBwcm9wb3NhbAIAAAATLCBwcm9wb3NhbF9oZWlnaHQ6IAkAAaQAAAABBQAAAA5wcm9wb3NhbEhlaWdodAIAAAAVLCBwcm9wb3NhbF90eGhlaWdodDogCQABpAAAAAEFAAAAEmluQmxvY2tjaGFpbkhlaWdodAIAAAAYLCBwcm9wb3NhbF92b3RpbmdzdGFydDogCQABpAAAAAEFAAAAC3ZvdGluZ1N0YXJ0AgAAABYsIHByb3Bvc2FsX3ZvdGluZ2VuZDogCQABpAAAAAEFAAAACXZvdGluZ0VuZAIAAAASLCBwcm9wb3NhbF9wb3dlcjogCQABpAAAAAEFAAAADnRvdGFsUG93ZXJTbmFwAgAAAAwsIHZvdGVfeWVzOiAJAAGkAAAAAQUAAAAIdm90ZXNZZXMCAAAACywgdm90ZV9ubzogCQABpAAAAAEFAAAAB3ZvdGVzTm8BAAAAD2Jyb2FkY2FzdEhlaWdodAAAAAEAAAAEdHhJZAkAAGQAAAACCQEAAAARQGV4dHJOYXRpdmUoMTA1NSkAAAABCQEAAAAWcHJvcG9zYWxWb3RpbmdFbmRTdG9yZQAAAAEFAAAABHR4SWQAAAAAAAAAAAEBAAAAB3Jld2FyZHMAAAACAAAABHVzZXIAAAAFdm90ZXMJAAP8AAAABAUAAAAVdm90aW5nUmV3YXJkc0NvbnRyYWN0AgAAAAljb3VudFZvdGUJAARMAAAAAgUAAAAEdXNlcgkABEwAAAACBQAAAAV2b3RlcwUAAAAD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RW50cnkAAAABCQEAAAAPcHJvcG9zYWxCeVN0b3JlAAAAAQUAAAAEdHhJZAkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABCQEAAAAXcHJvcG9zYWxUb3RhbFBvd2VyU3RvcmUAAAABBQAAAAR0eElkCQAETAAAAAIJAQAAAAtEZWxldGVFbnRyeQAAAAEJAQAAABVwcm9wb3NhbFRvdGFsWWVzU3RvcmUAAAABBQAAAAR0eElkCQAETAAAAAIJAQAAAAtEZWxldGVFbnRyeQAAAAEJAQAAABRwcm9wb3NhbFRvdGFsTm9TdG9yZQAAAAEFAAAABHR4SWQJAARMAAAAAgkBAAAAC0RlbGV0ZUVudHJ5AAAAAQkBAAAAFHByb3Bvc2FsVXNlclllc1N0b3JlAAAAAgUAAAAEdXNlcgUAAAAEdHhJZAkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABCQEAAAATcHJvcG9zYWxVc2VyTm9TdG9yZQAAAAIFAAAABHVzZXIFAAAABHR4SWQJAARMAAAAAgkBAAAAC0RlbGV0ZUVudHJ5AAAAAQkBAAAAGnVzZXJMYXN0UHJvcG9zZUhlaWdodFN0b3JlAAAAAQUAAAAEdXNlcgkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABCQEAAAAUcHJvcG9zYWxBZGRyZXNzU3RvcmUAAAABBQAAAAR0eElkBQAAAANuaWwJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAPK7IB4=", "chainId": 87, "height": 3874450, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: HRVqwAbvjTNNZ2sbSfYn2mVUbgtGar2mBPmksLHrv7zZ Next: 6XaB8DfXtiKVLTwkGtUhtkA3pFU7QdshkSRRVkTte9ac Diff:
OldNewDifferences
105105
106106 let quorumRatio = valueOrErrorMessage(getInteger(configAddress, (thisAddress + "_proposal_quorum_ratio")), "proposalQuorumRatio is not defined")
107107
108+func proposalQuorumStore (txid) = ("proposal_quorum_ratio_" + txid)
109+
110+
108111 let passedRatio = valueOrErrorMessage(getInteger(configAddress, (thisAddress + "_proposal_passed_ratio")), "proposalThresholdRatio is not defined")
109112
110113 let proposalMinRequired = valueOrErrorMessage(getInteger(configAddress, (thisAddress + "_proposal_min_power_required")), "min required is not defined")
159162 func totalVotingPower () = asInt(invoke(stakingContract, "totalShares", nil, nil))
160163
161164
165+func quorum (txId) = valueOrElse(getInteger(proposalQuorumStore(txId)), quorumRatio)
166+
167+
162168 func canBroadcast (id,yesInc,noInc) = {
163169 let votesYes = (valueOrElse(getInteger(("proposal_yes_" + id)), 0) + yesInc)
164170 let votesNo = (valueOrElse(getInteger(("proposal_no_" + id)), 0) + noInc)
165171 let totalPower = totalVotingPower()
166172 let totalVotes = (votesYes + votesNo)
167- let hasQuorum = (((totalVotes * BASE) / totalPower) >= quorumRatio)
173+ let hasQuorum = (((totalVotes * BASE) / totalPower) >= quorum(id))
168174 let hasPassed = (((votesYes * BASE) / totalVotes) >= passedRatio)
169175 if (hasQuorum)
170176 then hasPassed
181187 let totalPowerSnap = valueOrElse(getInteger(proposalTotalPowerStore(txId)), 0)
182188 let totalVotes = (votesYes + votesNo)
183189 let hasQuorum = if ((totalVotes > 0))
184- then (((totalVotes * BASE) / totalPowerSnap) >= quorumRatio)
190+ then (((totalVotes * BASE) / totalPowerSnap) >= quorum(txId))
185191 else false
186192 let hasPassed = if ((totalVotes > 0))
187193 then (((votesYes * BASE) / totalVotes) >= passedRatio)
238244 let votingEnds = (HEIGHT + votingEndOffset)
239245 let e = invoke(votingRewardsContract, "votingEnds", [votingEnds], nil)
240246 if ((e == e))
241- then [writeConstInt(proposalHeightStore(txId), HEIGHT), writeConstInt(proposalVotingStartStore(txId), (HEIGHT + votingStartOffset)), writeConstInt(proposalVotingEndStore(txId), votingEnds), writeConstString(proposalByStore(txId), toString(i.caller)), writeInt(userLastProposeHeightStore(user), HEIGHT), writeConstString(proposalAddressStore(txId), address)]
247+ then [writeConstInt(proposalHeightStore(txId), HEIGHT), writeConstInt(proposalVotingStartStore(txId), (HEIGHT + votingStartOffset)), writeConstInt(proposalVotingEndStore(txId), votingEnds), writeConstString(proposalByStore(txId), toString(i.caller)), writeInt(userLastProposeHeightStore(user), HEIGHT), writeConstString(proposalAddressStore(txId), address), IntegerEntry(proposalQuorumStore(txId), quorumRatio)]
242248 else throw("Strict value is not equal to itself.")
243249 }
244250 }
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 func throwIf (condition,error) = if (condition)
55 then throw(error)
66 else true
77
88
99 func writeInt (key,value) = if ((0 > value))
1010 then throw(((("writing negative value " + toString(value)) + " for key ") + key))
1111 else IntegerEntry(key, value)
1212
1313
1414 func writeConstString (key,value) = if (!(isDefined(getString(this, key))))
1515 then StringEntry(key, value)
1616 else throw(("already initialized: " + key))
1717
1818
1919 func writeConstInt (key,value) = if (!(isDefined(getInteger(this, key))))
2020 then IntegerEntry(key, value)
2121 else throw(("already exists: " + key))
2222
2323
2424 func changeBy (key,value) = writeInt(key, (valueOrElse(getInteger(this, key), 0) + value))
2525
2626
2727 func asInt (value) = match value {
2828 case int: Int =>
2929 int
3030 case _ =>
3131 throw("wrong type, expected: Int")
3232 }
3333
3434
3535 let configAddressStore = "configAddress"
3636
3737 let configAddress = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(this, configAddressStore), "mother voting: no configAddress")), "invalid config address")
3838
3939 let votingResultContract = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "contract_voting_result"), "no contract_voting_result")), "invalid contract_voting_result")
4040
4141 let votingRewardsContract = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "contract_voting_rewards"), "no contract_voting_rewards")), "invalid contract_voting_rewards")
4242
4343 let stakingContract = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "contract_staking"), "no staking_contract")), "invalid stakingContract")
4444
4545 let HEIGHT = height
4646
4747 func advise () = ("height: " + toString(HEIGHT))
4848
4949
5050 let BASE = 1000
5151
5252 func opAllowed (op) = {
5353 let a = invoke(configAddress, "opAllowed", [op], nil)
5454 if ((a == a))
5555 then true
5656 else throw("Strict value is not equal to itself.")
5757 }
5858
5959
6060 func proposalAddressStore (id) = ("proposal_address_" + id)
6161
6262
6363 func proposalHeightStore (id) = ("proposal_height_" + id)
6464
6565
6666 func proposalVotingStartStore (id) = ("proposal_votingstart_" + id)
6767
6868
6969 func proposalVotingEndStore (id) = ("proposal_votingend_" + id)
7070
7171
7272 func proposalByStore (id) = ("proposal_by_" + id)
7373
7474
7575 func proposalTotalPowerStore (id) = ("proposal_power_" + id)
7676
7777
7878 func proposalTotalYesStore (id) = ("proposal_yes_" + id)
7979
8080
8181 func proposalTotalNoStore (id) = ("proposal_no_" + id)
8282
8383
8484 func proposalUserYesStore (user,id) = ((("user_proposal_yes_" + user) + "_") + id)
8585
8686
8787 func proposalUserNoStore (user,id) = ((("user_proposal_no_" + user) + "_") + id)
8888
8989
9090 func userLastProposeHeightStore (user) = ("propose_lastheight_" + user)
9191
9292
9393 func userYes (user,id) = valueOrElse(getInteger(this, proposalUserYesStore(user, id)), 0)
9494
9595
9696 func userNo (user,id) = valueOrElse(getInteger(this, proposalUserNoStore(user, id)), 0)
9797
9898
9999 func userLastProposeHeight (user) = valueOrElse(getInteger(this, userLastProposeHeightStore(user)), -1)
100100
101101
102102 let thisAddress = toString(this)
103103
104104 let userProposeDelay = valueOrErrorMessage(getInteger(configAddress, (thisAddress + "_user_propose_delay")), "user_propose_delay is not defined")
105105
106106 let quorumRatio = valueOrErrorMessage(getInteger(configAddress, (thisAddress + "_proposal_quorum_ratio")), "proposalQuorumRatio is not defined")
107107
108+func proposalQuorumStore (txid) = ("proposal_quorum_ratio_" + txid)
109+
110+
108111 let passedRatio = valueOrErrorMessage(getInteger(configAddress, (thisAddress + "_proposal_passed_ratio")), "proposalThresholdRatio is not defined")
109112
110113 let proposalMinRequired = valueOrErrorMessage(getInteger(configAddress, (thisAddress + "_proposal_min_power_required")), "min required is not defined")
111114
112115 let votingStartOffset = valueOrErrorMessage(getInteger(configAddress, (thisAddress + "_proposal_votingstart_offset")), "proposal_votingstart_offset is not defined")
113116
114117 let votingEndOffset = valueOrErrorMessage(getInteger(configAddress, (thisAddress + "_proposal_votingend_offset")), "proposal_votingend_offset is not defined")
115118
116119 func userShares (user) = asInt(invoke(stakingContract, "userShares", [user], nil))
117120
118121
119122 func userPower (user) = asInt(invoke(stakingContract, "userPower", [user], nil))
120123
121124
122125 func proposalExists (txId) = match getInteger(this, proposalHeightStore(txId)) {
123126 case start: Int =>
124127 true
125128 case _ =>
126129 false
127130 }
128131
129132
130133 func proposalOnVoting (txId) = {
131134 let nonExistErr = "proposal doesn't exist"
132135 if (!(proposalExists(txId)))
133136 then throw(nonExistErr)
134137 else {
135138 let votingStart = valueOrErrorMessage(getInteger(this, proposalVotingStartStore(txId)), nonExistErr)
136139 let votingEnd = valueOrErrorMessage(getInteger(this, proposalVotingEndStore(txId)), nonExistErr)
137140 if ((votingStart > HEIGHT))
138141 then throw(((("voting not started yet, discussion is in progress, voting will start at block " + toString(votingStart)) + ", now it's ") + toString(HEIGHT)))
139142 else if ((HEIGHT > votingEnd))
140143 then throw(((("voting ended at block " + toString(votingEnd)) + ", now it's ") + toString(HEIGHT)))
141144 else true
142145 }
143146 }
144147
145148
146149 func proposalBeforeVoting (txId) = {
147150 let nonExistErr = "proposal doesn't exist"
148151 if (!(proposalExists(txId)))
149152 then throw(nonExistErr)
150153 else {
151154 let votingStart = valueOrErrorMessage(getInteger(this, proposalVotingStartStore(txId)), nonExistErr)
152155 if ((HEIGHT >= votingStart))
153156 then throw("voting start is already happened")
154157 else true
155158 }
156159 }
157160
158161
159162 func totalVotingPower () = asInt(invoke(stakingContract, "totalShares", nil, nil))
160163
161164
165+func quorum (txId) = valueOrElse(getInteger(proposalQuorumStore(txId)), quorumRatio)
166+
167+
162168 func canBroadcast (id,yesInc,noInc) = {
163169 let votesYes = (valueOrElse(getInteger(("proposal_yes_" + id)), 0) + yesInc)
164170 let votesNo = (valueOrElse(getInteger(("proposal_no_" + id)), 0) + noInc)
165171 let totalPower = totalVotingPower()
166172 let totalVotes = (votesYes + votesNo)
167- let hasQuorum = (((totalVotes * BASE) / totalPower) >= quorumRatio)
173+ let hasQuorum = (((totalVotes * BASE) / totalPower) >= quorum(id))
168174 let hasPassed = (((votesYes * BASE) / totalVotes) >= passedRatio)
169175 if (hasQuorum)
170176 then hasPassed
171177 else false
172178 }
173179
174180
175181 func adviseProposal (txId) = {
176182 let proposalHeight = valueOrErrorMessage(getInteger(proposalHeightStore(txId)), "no proposal")
177183 let votingStart = valueOrErrorMessage(getInteger(proposalVotingStartStore(txId)), "no proposal")
178184 let votingEnd = valueOrErrorMessage(getInteger(proposalVotingEndStore(txId)), "no proposal")
179185 let votesYes = valueOrElse(getInteger(proposalTotalYesStore(txId)), 0)
180186 let votesNo = valueOrElse(getInteger(proposalTotalNoStore(txId)), 0)
181187 let totalPowerSnap = valueOrElse(getInteger(proposalTotalPowerStore(txId)), 0)
182188 let totalVotes = (votesYes + votesNo)
183189 let hasQuorum = if ((totalVotes > 0))
184- then (((totalVotes * BASE) / totalPowerSnap) >= quorumRatio)
190+ then (((totalVotes * BASE) / totalPowerSnap) >= quorum(txId))
185191 else false
186192 let hasPassed = if ((totalVotes > 0))
187193 then (((votesYes * BASE) / totalVotes) >= passedRatio)
188194 else false
189195 let inBlockchainHeight = valueOrElse(transactionHeightById(fromBase58String(txId)), 0)
190196 let status = if ((votingStart > HEIGHT))
191197 then "discussion"
192198 else if ((votingEnd >= HEIGHT))
193199 then "voting"
194200 else if (!(hasQuorum))
195201 then "noQuorum"
196202 else if (!(hasPassed))
197203 then "votingFailed"
198204 else if ((inBlockchainHeight > 0))
199205 then "inBlockchain"
200206 else "waitingForTx"
201207 ((((((((((((((((((((("proposal_id: " + txId) + ", proposal_address: ") + valueOrErrorMessage(proposalAddressStore(txId), "no address")) + ", proposal_status: ") + status) + ", proposal_by: ") + valueOrErrorMessage(getString(this, proposalByStore(txId)), "no proposal")) + ", proposal_height: ") + toString(proposalHeight)) + ", proposal_txheight: ") + toString(inBlockchainHeight)) + ", proposal_votingstart: ") + toString(votingStart)) + ", proposal_votingend: ") + toString(votingEnd)) + ", proposal_power: ") + toString(totalPowerSnap)) + ", vote_yes: ") + toString(votesYes)) + ", vote_no: ") + toString(votesNo))
202208 }
203209
204210
205211 func broadcastHeight (txId) = (getIntegerValue(proposalVotingEndStore(txId)) + 1)
206212
207213
208214 func rewards (user,votes) = invoke(votingRewardsContract, "countVote", [user, votes], nil)
209215
210216
211217 func setResult (txAddress,txId,result) = invoke(votingResultContract, "setResult", [txAddress, txId, result, broadcastHeight(txId)], nil)
212218
213219
214220 func setPower (txId) = IntegerEntry(proposalTotalPowerStore(txId), totalVotingPower())
215221
216222
217223 @Callable(i)
218224 func init (config) = [writeConstString(configAddressStore, config)]
219225
220226
221227
222228 @Callable(i)
223229 func propose (address,txId) = {
224230 let checks = opAllowed("governance_propose_tx")
225231 if ((checks == checks))
226232 then {
227233 let user = toString(i.caller)
228234 let gv = userPower(user)
229235 if ((proposalMinRequired > gv))
230236 then throw((((("not enough staked power to make proposal." + " Minimum required = ") + toString(proposalMinRequired)) + ", actual: = ") + toString(gv)))
231237 else {
232238 let last = userLastProposeHeight(user)
233239 if (if ((last > -1))
234240 then ((last + userProposeDelay) > HEIGHT)
235241 else false)
236242 then throw(((("can't propose too often, last proroposal height: " + toString(last)) + ", blocks to wait: ") + toString(((last + userProposeDelay) - HEIGHT))))
237243 else {
238244 let votingEnds = (HEIGHT + votingEndOffset)
239245 let e = invoke(votingRewardsContract, "votingEnds", [votingEnds], nil)
240246 if ((e == e))
241- then [writeConstInt(proposalHeightStore(txId), HEIGHT), writeConstInt(proposalVotingStartStore(txId), (HEIGHT + votingStartOffset)), writeConstInt(proposalVotingEndStore(txId), votingEnds), writeConstString(proposalByStore(txId), toString(i.caller)), writeInt(userLastProposeHeightStore(user), HEIGHT), writeConstString(proposalAddressStore(txId), address)]
247+ then [writeConstInt(proposalHeightStore(txId), HEIGHT), writeConstInt(proposalVotingStartStore(txId), (HEIGHT + votingStartOffset)), writeConstInt(proposalVotingEndStore(txId), votingEnds), writeConstString(proposalByStore(txId), toString(i.caller)), writeInt(userLastProposeHeightStore(user), HEIGHT), writeConstString(proposalAddressStore(txId), address), IntegerEntry(proposalQuorumStore(txId), quorumRatio)]
242248 else throw("Strict value is not equal to itself.")
243249 }
244250 }
245251 }
246252 else throw("Strict value is not equal to itself.")
247253 }
248254
249255
250256
251257 @Callable(i)
252258 func voteYes (txId) = {
253259 let checks = if (opAllowed("governance_vote_tx"))
254260 then proposalOnVoting(txId)
255261 else false
256262 if ((checks == checks))
257263 then {
258264 let user = toString(i.caller)
259265 if ((userNo(user, txId) > 0))
260266 then throw("already voted against, please retract your vote first")
261267 else {
262268 let yesDelta = (userShares(user) - userYes(user, txId))
263269 let restake = invoke(stakingContract, "restakeFor", [user], nil)
264270 if ((restake == restake))
265271 then {
266272 let txAddress = valueOrErrorMessage(getString(proposalAddressStore(txId)), "proposal address not found")
267273 let result = canBroadcast(txId, yesDelta, 0)
268274 let s = setResult(txAddress, txId, result)
269275 if ((s == s))
270276 then {
271277 let r = rewards(user, yesDelta)
272278 if ((r == r))
273279 then [setPower(txId), changeBy(proposalUserYesStore(user, txId), yesDelta), changeBy(proposalTotalYesStore(txId), yesDelta)]
274280 else throw("Strict value is not equal to itself.")
275281 }
276282 else throw("Strict value is not equal to itself.")
277283 }
278284 else throw("Strict value is not equal to itself.")
279285 }
280286 }
281287 else throw("Strict value is not equal to itself.")
282288 }
283289
284290
285291
286292 @Callable(i)
287293 func voteNo (txId) = {
288294 let checks = if (opAllowed("governance_vote_tx"))
289295 then proposalOnVoting(txId)
290296 else false
291297 if ((checks == checks))
292298 then {
293299 let user = toString(i.caller)
294300 if ((userYes(user, txId) > 0))
295301 then throw("already voted for, please retract your vote first")
296302 else {
297303 let noDelta = (userShares(user) - userNo(user, txId))
298304 let restake = invoke(stakingContract, "restakeFor", [user], nil)
299305 if ((restake == restake))
300306 then {
301307 let txAddress = valueOrErrorMessage(getString(proposalAddressStore(txId)), "proposal address not found")
302308 let result = canBroadcast(txId, 0, noDelta)
303309 let s = setResult(txAddress, txId, result)
304310 if ((s == s))
305311 then {
306312 let r = rewards(user, noDelta)
307313 if ((r == r))
308314 then [setPower(txId), changeBy(proposalUserNoStore(user, txId), noDelta), changeBy(proposalTotalNoStore(txId), noDelta)]
309315 else throw("Strict value is not equal to itself.")
310316 }
311317 else throw("Strict value is not equal to itself.")
312318 }
313319 else throw("Strict value is not equal to itself.")
314320 }
315321 }
316322 else throw("Strict value is not equal to itself.")
317323 }
318324
319325
320326
321327 @Callable(i)
322328 func retract (txId) = {
323329 let checks = if (opAllowed("governance_retract_vote"))
324330 then proposalOnVoting(txId)
325331 else false
326332 if ((checks == checks))
327333 then {
328334 let user = toString(i.caller)
329335 let yes = userYes(user, txId)
330336 let no = userNo(user, txId)
331337 let txAddress = valueOrErrorMessage(getString(proposalAddressStore(txId)), "proposal address not found")
332338 let result = canBroadcast(txId, -(yes), -(no))
333339 let s = setResult(txAddress, txId, result)
334340 if ((s == s))
335341 then {
336342 let r = rewards(user, (-(yes) - no))
337343 if ((r == r))
338344 then [changeBy(proposalTotalYesStore(txId), -(yes)), changeBy(proposalTotalNoStore(txId), -(no)), DeleteEntry(proposalUserYesStore(user, txId)), DeleteEntry(proposalUserNoStore(user, txId))]
339345 else throw("Strict value is not equal to itself.")
340346 }
341347 else throw("Strict value is not equal to itself.")
342348 }
343349 else throw("Strict value is not equal to itself.")
344350 }
345351
346352
347353
348354 @Callable(i)
349355 func retractProposal (txId) = {
350356 let checks = if (opAllowed("governance_retract_proposal_tx"))
351357 then proposalBeforeVoting(txId)
352358 else false
353359 if ((checks == checks))
354360 then {
355361 let by = valueOrErrorMessage(getString(this, proposalByStore(txId)), "proposal doesn't exist")
356362 let user = toString(i.caller)
357363 if ((by != user))
358364 then throw("only owner can retract proposal")
359365 else [DeleteEntry(proposalHeightStore(txId)), DeleteEntry(proposalVotingStartStore(txId)), DeleteEntry(proposalVotingEndStore(txId)), DeleteEntry(proposalByStore(txId)), DeleteEntry(proposalTotalPowerStore(txId)), DeleteEntry(proposalTotalYesStore(txId)), DeleteEntry(proposalTotalNoStore(txId)), DeleteEntry(proposalUserYesStore(user, txId)), DeleteEntry(proposalUserNoStore(user, txId)), DeleteEntry(userLastProposeHeightStore(user)), DeleteEntry(proposalAddressStore(txId))]
360366 }
361367 else throw("Strict value is not equal to itself.")
362368 }
363369
364370

github/deemru/w8io/3ef1775 
67.20 ms