tx · DpKsZzT4vJhy2oahk5SHHU4LYS24oVaVRkrTdz6sKHLG

3N1Epwa6GQuTQr2K9WzeUcqSFCdERwuvL5T:  -0.01400000 Waves

2022.05.12 11:16 [2048207] smart account 3N1Epwa6GQuTQr2K9WzeUcqSFCdERwuvL5T > SELF 0.00000000 Waves

{ "type": 13, "id": "DpKsZzT4vJhy2oahk5SHHU4LYS24oVaVRkrTdz6sKHLG", "fee": 1400000, "feeAssetId": null, "timestamp": 1652343380190, "version": 1, "sender": "3N1Epwa6GQuTQr2K9WzeUcqSFCdERwuvL5T", "senderPublicKey": "7iXEgsFNsnbLZ3ca4tmz8jffnyxMu9keuBV6CuQPJLuA", "proofs": [ "5B5dQSVdXqzdv5B3nyuhPw6SBghS2t5R8jBWEAo3LGBQNNBj4Fzw1qj1Q8tZofXyeP3na9z9Dy12vSCBxB5tMrSg" ], "script": "base64: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AAAAEHVzZXJQb29sQ29udHJhY3QJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEJAQAAAA9nZXRTdHJpbmdPckZhaWwAAAABBQAAABNrZXl1c2VyUG9vbENvbnRyYWN0AAAAABBib29zdGluZ0NvbnRyYWN0CQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABCQEAAAAPZ2V0U3RyaW5nT3JGYWlsAAAAAQUAAAATa2V5Qm9vc3RpbmdDb250cmFjdAAAAAATYXNzZXRzU3RvcmVDb250cmFjdAkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQkBAAAAD2dldFN0cmluZ09yRmFpbAAAAAEFAAAAFmtleUFzc2V0c1N0b3JlQ29udHJhY3QBAAAAFm1hbmFnZXJQdWJsaWNLZXlPclVuaXQAAAAABAAAAAckbWF0Y2gwCQAEIgAAAAEJAQAAABNrZXlNYW5hZ2VyUHVibGljS2V5AAAAAAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAGU3RyaW5nBAAAAAFzBQAAAAckbWF0Y2gwCQACWQAAAAEFAAAAAXMDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABFVuaXQFAAAABHVuaXQJAAACAAAAAQIAAAALTWF0Y2ggZXJyb3IBAAAAHXBlbmRpbmdNYW5hZ2VyUHVibGljS2V5T3JVbml0AAAAAAQAAAAHJG1hdGNoMAkABCIAAAABCQEAAAAaa2V5UGVuZGluZ01hbmFnZXJQdWJsaWNLZXkAAAAAAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAZTdHJpbmcEAAAAAXMFAAAAByRtYXRjaDAJAAJZAAAAAQUAAAABcwMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAEVW5pdAUAAAAEdW5pdAkAAAIAAAABAgAAAAtNYXRjaCBlcnJvcgEAAAALbXVzdE1hbmFnZXIAAAABAAAAAWkEAAAAAnBkCQAAAgAAAAECAAAAEXBlcm1pc3Npb24gZGVuaWVkBAAAAAckbWF0Y2gwCQEAAAAWbWFuYWdlclB1YmxpY0tleU9yVW5pdAAAAAADCQAAAQAAAAIFAAAAByRtYXRjaDACAAAACkJ5dGVWZWN0b3IEAAAAAnBrBQAAAAckbWF0Y2gwAwkAAAAAAAACCAUAAAABaQAAAA9jYWxsZXJQdWJsaWNLZXkFAAAAAnBrBgUAAAACcGQDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABFVuaXQDCQAAAAAAAAIIBQAAAAFpAAAABmNhbGxlcgUAAAAEdGhpcwYFAAAAAnBkCQAAAgAAAAECAAAAC01hdGNoIGVycm9yAQAAAAVhc0ludAAAAAEAAAADdmFsBAAAAAckbWF0Y2gwBQAAAAN2YWwDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAA0ludAQAAAAGdmFsSW50BQAAAAckbWF0Y2gwBQAAAAZ2YWxJbnQJAAACAAAAAQIAAAAbZmFpbGVkIHRvIGNhc3QgaW50byBJbnRlZ2VyAAAACAAAAAFpAQAAAAtjb25zdHJ1Y3RvcgAAAAkAAAAWYXNzZXRzU3RvcmVDb250cmFjdFBybQAAABN1c2VyUG9vbENvbnRyYWN0UHJtAAAAE2Jvb3N0aW5nQ29udHJhY3RQcm0AAAATZW1pc3Npb25Db250cmFjdFBybQAAAAxmZWVBbW91bnRQcm0AAAAMd3hBc3NldElkUHJtAAAAEXZvdGluZ0R1cmF0aW9uUHJtAAAADnVzZG5Bc3NldElkUHJtAAAAEWZpbmFsaXplUmV3YXJkUHJtBAAAAAZjaGVja3MJAARMAAAAAgkBAAAAC211c3RNYW5hZ2VyAAAAAQUAAAABaQkABEwAAAACAwkBAAAACWlzRGVmaW5lZAAAAAEJAAQmAAAAAQUAAAAWYXNzZXRzU3RvcmVDb250cmFjdFBybQYJAAACAAAAAQIAAAAkSW52YWxpZCBhc3NldF9zdG9yZSBjb250cmFjdCBhZGRyZXNzCQAETAAAAAIDCQEAAAAJaXNEZWZpbmVkAAAAAQkABCYAAAABBQAAABNib29zdGluZ0NvbnRyYWN0UHJtBgkAAAIAAAABAgAAACFJbnZhbGlkIGJvb3N0aW5nIGNvbnRyYWN0IGFkZHJlc3MJAARMAAAAAgMJAQAAAAlpc0RlZmluZWQAAAABCQAEJgAAAAEFAAAAE3VzZXJQb29sQ29udHJhY3RQcm0GCQAAAgAAAAECAAAAI0ludmFsaWQgdXNlcl9wb29scyBjb250cmFjdCBhZGRyZXNzCQAETAAAAAIDCQEAAAAJaXNEZWZpbmVkAAAAAQkABCYA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AAAHJG1hdGNoMAIAAAAHQm9vbGVhbgQAAAABYgUAAAAHJG1hdGNoMAUAAAABYgkAAAIAAAABAgAAABVhc3NldCBpcyBub3QgdmVyaWZpZWQDCQAAAAAAAAIFAAAAGWVuc3VyZUFtb3VudEFzc2V0VmVyaWZpZWQFAAAAGWVuc3VyZUFtb3VudEFzc2V0VmVyaWZpZWQEAAAACmJ1cm5GZWVJbnYJAAP8AAAABAUAAAAQZW1pc3Npb25Db250cmFjdAIAAAAEYnVybgUAAAADbmlsCQAETAAAAAIJAQAAAA9BdHRhY2hlZFBheW1lbnQAAAACCAUAAAAHcGF5bWVudAAAAAdhc3NldElkCAUAAAAHcGF5bWVudAAAAAZhbW91bnQFAAAAA25pbAMJAAAAAAAAAgUAAAAKYnVybkZlZUludgUAAAAKYnVybkZlZUludgQAAAAPbmV3U3VnZ2VzdEluZGV4BAAAAAckbWF0Y2gwCQAEHwAAAAEJAQAAABVrZXlBc3NldHNTdWdnZXN0SW5kZXgAAAACBQAAAA1hbW91bnRBc3NldElkBQAAAAxwcmljZUFzc2V0SWQDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAA0ludAQAAAADaW50BQAAAAckbWF0Y2gwCQAAZAAAAAIFAAAAA2ludAAAAAAAAAAAAQAAAAAAAAAAAAkABRQAAAACCQAETAAAAAIJAQAAAAxCb29sZWFuRW50cnkAAAACCQEAAAAQa2V5SW5MaXN0QXNzZXRJZAAAAAIFAAAADWFtb3VudEFzc2V0SWQFAAAADHByaWNlQXNzZXRJZAYJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAAA5rZXlTdGFydEhlaWdodAAAAAMFAAAADWFtb3VudEFzc2V0SWQFAAAADHByaWNlQXNzZXRJZAUAAAAPbmV3U3VnZ2VzdEluZGV4BQAAAAZoZWlnaHQJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAD2tleVZvdGluZ1Jlc3VsdAAAAAMFAAAADWFtb3VudEFzc2V0SWQFAAAADHByaWNlQXNzZXRJZAUAAAAPbmV3U3VnZ2VzdEluZGV4CQEAAAAKdG90YWxWb3RlcwAAAAICAAAAATACAAAAATAJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABVrZXlBc3NldHNTdWdnZXN0SW5kZXgAAAACBQAAAA1hbW91bnRBc3NldElkBQAAAAxwcmljZUFzc2V0SWQFAAAAD25ld1N1Z2dlc3RJbmRleAUAAAADbmlsBQAAAAR1bml0CQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgAAAAFpAQAAAAR2b3RlAAAAAwAAAA1hbW91bnRBc3NldElkAAAADHByaWNlQXNzZXRJZAAAAAdpbkZhdm9yBAAAAAxzdWdnZXN0SW5kZXgJAQAAAAV2YWx1ZQAAAAEJAAQfAAAAAQkBAAAAFWtleUFzc2V0c1N1Z2dlc3RJbmRleAAAAAIFAAAADWFtb3VudEFzc2V0SWQFAAAADHByaWNlQXNzZXRJZAQAAAASdm90aW5nRmluaXNoSGVpZ2h0CQAAZAAAAAIJAQAAAAV2YWx1ZQAAAAEJAAQfAAAAAQkBAAAADmtleVN0YXJ0SGVpZ2h0AAAAAwUAAAANYW1vdW50QXNzZXRJZAUAAAAMcHJpY2VBc3NldElkBQAAAAxzdWdnZXN0SW5kZXgJAQAAAAV2YWx1ZQAAAAEJAAQfAAAAAQUAAAAOa2V5RXBvY2hMZW5ndGgEAAAABmNoZWNrcwkABEwAAAACAwkAAAAAAAACCQAEIgAAAAEJAQAAAAdrZXlWb3RlAAAABAUAAAANYW1vdW50QXNzZXRJZAUAAAAMcHJpY2VBc3NldElkBQAAAAxzdWdnZXN0SW5kZXgJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyBQAAAAR1bml0BgkAAAIAAAABAgAAABF5b3UgYWxyZWFkeSB2b3RlZAkABEwAAAACAwkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABCAAAAABCQEAAAAQa2V5SW5MaXN0QXNzZXRJZAAAAAIFAAAADWFtb3VudEFzc2V0SWQFAAAADHByaWNlQXNzZXRJZAcGCQAAAgAAAAECAAAAInRoZSB0b2tlbiBpc24ndCBvbiB0aGUgdm90aW5nIGxpc3QJAARMAAAAAgMJAABmAAAAAgUAAAASdm90aW5nRmluaXNoSGVpZ2h0BQAAAAZoZWlnaHQGCQAAAgAAAAECAAAAEHRvbyBsYXRlIHRvIHZvdGUFAAAAA25pbAMJAAAAAAAAAgUAAAAGY2hlY2tzBQAAAAZjaGVja3MEAAAADHZvdGluZ1Jlc3VsdAkABLUAAAACCQEAAAAFdmFsdWUAAAABCQAEIgAAAAEJAQAAAA9rZXlWb3RpbmdSZXN1bHQAAAADBQAAAA1hbW91bnRBc3NldElkBQAAAAxwcmljZUFzc2V0SWQFAAAADHN1Z2dlc3RJbmRleAUAAAAJc2VwYXJhdG9yBAAAAA1wb3NpdGl2ZVZvdGVzCQABkQAAAAIFAAAADHZvdGluZ1Jlc3VsdAAAAAAAAAAAAQQAAAANbmVnYXRpdmVWb3RlcwkAAZEAAAACBQAAAAx2b3RpbmdSZXN1bHQAAAAAAAAAAAIEAAAACWd3eEFtb3VudAkAA/wAAAAEBQAAABBib29zdGluZ0NvbnRyYWN0AgAAACBnZXRVc2VyR3d4QW1vdW50QXRIZWlnaHRSRUFET05MWQkABEwAAAACCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgkABEwAAAACBQAAABJ2b3RpbmdGaW5pc2hIZWlnaHQFAAAAA25pbAUAAAADbmlsBAAAAAdub3RaZXJvAwkAAGYAAAACCQEAAAAFYXNJbnQAAAABBQAAAAlnd3hBbW91bnQAAAAAAAAAAAAGCQAAAgAAAAECAAAAEnlvdSBkb24ndCBoYXZlIGd3eAMJAAAAAAAAAgUAAAAHbm90WmVybwUAAAAHbm90WmVybwQAAAAHZW50cmllcwMFAAAAB2luRmF2b3IEAAAAEG5ld1Bvc2l0aXZlVm90ZXMJAABkAAAAAgkBAAAADXBhcnNlSW50VmFsdWUAAAABBQAAAA1wb3NpdGl2ZVZvdGVzCQEAAAAFYXNJbnQAAAABBQAAAAlnd3hBbW91bnQEAAAACnllc1ZvdGVLZXkJAQAAAAdrZXlWb3RlAAAABAUAAAANYW1vdW50QXNzZXRJZAUAAAAMcHJpY2VBc3NldElkBQAAAAxzdWdnZXN0SW5kZXgJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyBAAAAAx5ZXNWb3RlVmFsdWUJAQAAAAxrZXlWb3RlVmFsdWUAAAACCQABpAAAAAEJAQAAAAVhc0ludAAAAAEFAAAACWd3eEFtb3VudAUAAAAHaW5GYXZvcgkABRQAAAACCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAAA9rZXlWb3RpbmdSZXN1bHQAAAADBQAAAA1hbW91bnRBc3NldElkBQAAAAxwcmljZUFzc2V0SWQFAAAADHN1Z2dlc3RJbmRleAkBAAAACnRvdGFsVm90ZXMAAAACCQABpAAAAAEFAAAAEG5ld1Bvc2l0aXZlVm90ZXMFAAAADW5lZ2F0aXZlVm90ZXMJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAAKeWVzVm90ZUtleQUAAAAMeWVzVm90ZVZhbHVlBQAAAANuaWwFAAAABHVuaXQEAAAAEG5ld05lZ2F0aXZlVm90ZXMJAABkAAAAAgkBAAAADXBhcnNlSW50VmFsdWUAAAABBQAAAA1uZWdhdGl2ZVZvdGVzCQEAAAAFYXNJbnQAAAABBQAAAAlnd3hBbW91bnQEAAAACW5vVm90ZUtleQkBAAAAB2tleVZvdGUAAAAEBQAAAA1hbW91bnRBc3NldElkBQAAAAxwcmljZUFzc2V0SWQFAAAADHN1Z2dlc3RJbmRleAkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIEAAAAC25vVm90ZVZhbHVlCQEAAAAMa2V5Vm90ZVZhbHVlAAAAAgkAAaQAAAABCQEAAAAFYXNJbnQAAAABBQAAAAlnd3hBbW91bnQFAAAAB2luRmF2b3IJAAUUAAAAAgkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAPa2V5Vm90aW5nUmVzdWx0AAAAAwUAAAANYW1vdW50QXNzZXRJZAUAAAAMcHJpY2VBc3NldElkBQAAAAxzdWdnZXN0SW5kZXgJAQAAAAp0b3RhbFZvdGVzAAAAAgUAAAANcG9zaXRpdmVWb3RlcwkAAaQAAAABBQAAABBuZXdOZWdhdGl2ZVZvdGVzCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAACW5vVm90ZUtleQUAAAALbm9Wb3RlVmFsdWUFAAAAA25pbAUAAAAEdW5pdAUAAAAHZW50cmllcwkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAWkBAAAACmNhbmNlbFZvdGUAAAACAAAADWFtb3VudEFzc2V0SWQAAAAMcHJpY2VBc3NldElkBAAAAAxzdWdnZXN0SW5kZXgJAQAAAAV2YWx1ZQAAAAEJAAQfAAAAAQkBAAAAFWtleUFzc2V0c1N1Z2dlc3RJbmRleAAAAAIFAAAADWFtb3VudEFzc2V0SWQFAAAADHByaWNlQXNzZXRJZAQAAAAGY2hlY2tzCQAETAAAAAIDCQEAAAAJaXNEZWZpbmVkAAAAAQkABCIAAAABCQEAAAAPa2V5Vm90aW5nUmVzdWx0AAAAAwUAAAANYW1vdW50QXNzZXRJZAUAAAAMcHJpY2VBc3NldElkBQAAAAxzdWdnZXN0SW5kZXgGCQAAAgAAAAECAAAAF25vIHZvdGUgZm9yIGFzc2V0cyBwYWlyBQAAAANuaWwDCQAAAAAAAAIFAAAABmNoZWNrcwUAAAAGY2hlY2tzBAAAAAR2b3RlCQAEtQAAAAIJAQAAAAV2YWx1ZQAAAAEJAAQiAAAAAQkBAAAAB2tleVZvdGUAAAAEBQAAAA1hbW91bnRBc3NldElkBQAAAAxwcmljZUFzc2V0SWQFAAAADHN1Z2dlc3RJbmRleAkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIFAAAACXNlcGFyYXRvcgQAAAAJdm90ZVZhbHVlCQABkQAAAAIFAAAABHZvdGUAAAAAAAAAAAEEAAAACHZvdGVUeXBlCQABkQAAAAIFAAAABHZvdGUAAAAAAAAAAAIEAAAADHZvdGluZ1Jlc3VsdAkABLUAAAACCQEAAAAFdmFsdWUAAAABCQAEIgAAAAEJAQAAAA9rZXlWb3RpbmdSZXN1bHQAAAADBQAAAA1hbW91bnRBc3NldElkBQAAAAxwcmljZUFzc2V0SWQFAAAADHN1Z2dlc3RJbmRleAUAAAAJc2VwYXJhdG9yBAAAAA1wb3NpdGl2ZVZvdGVzCQABkQAAAAIFAAAADHZvdGluZ1Jlc3VsdAAAAAAAAAAAAQQAAAANbmVnYXRpdmVWb3RlcwkAAZEAAAACBQAAAAx2b3RpbmdSZXN1bHQAAAAAAAAAAAIEAAAAB2FjdGlvbnMDCQAAAAAAAAIFAAAACHZvdGVUeXBlAgAAAAN5ZXMEAAAAEG5ld1Bvc2l0aXZlVm90ZXMJAABlAAAAAgkBAAAADXBhcnNlSW50VmFsdWUAAAABBQAAAA1wb3NpdGl2ZVZvdGVzCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEFAAAACXZvdGVWYWx1ZQkABRQAAAACCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAAA9rZXlWb3RpbmdSZXN1bHQAAAADBQAAAA1hbW91bnRBc3NldElkBQAAAAxwcmljZUFzc2V0SWQFAAAADHN1Z2dlc3RJbmRleAkBAAAACnRvdGFsVm90ZXMAAAACCQABpAAAAAEFAAAAEG5ld1Bvc2l0aXZlVm90ZXMFAAAADW5lZ2F0aXZlVm90ZXMJAARMAAAAAgkBAAAAC0RlbGV0ZUVudHJ5AAAAAQkBAAAAB2tleVZvdGUAAAAEBQAAAA1hbW91bnRBc3NldElkBQAAAAxwcmljZUFzc2V0SWQFAAAADHN1Z2dlc3RJbmRleAkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIFAAAAA25pbAUAAAAEdW5pdAQAAAAQbmV3TmVnYXRpdmVWb3RlcwkAAGUAAAACCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEFAAAADW5lZ2F0aXZlVm90ZXMJAQAAAA1wYXJzZUludFZhbHVlAAAAAQUAAAAJdm90ZVZhbHVlCQAFFAAAAAIJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAD2tleVZvdGluZ1Jlc3VsdAAAAAMFAAAADWFtb3VudEFzc2V0SWQFAAAADHByaWNlQXNzZXRJZAUAAAAMc3VnZ2VzdEluZGV4CQEAAAAKdG90YWxWb3RlcwAAAAIFAAAADXBvc2l0aXZlVm90ZXMJAAGkAAAAAQUAAAAQbmV3TmVnYXRpdmVWb3RlcwkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABCQEAAAAHa2V5Vm90ZQAAAAQF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bnMJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAWkBAAAACnNldE1hbmFnZXIAAAABAAAAF3BlbmRpbmdNYW5hZ2VyUHVibGljS2V5BAAAAAtjaGVja0NhbGxlcgkBAAAAC211c3RNYW5hZ2VyAAAAAQUAAAABaQMJAAAAAAAAAgUAAAALY2hlY2tDYWxsZXIFAAAAC2NoZWNrQ2FsbGVyBAAAABVjaGVja01hbmFnZXJQdWJsaWNLZXkJAAJZAAAAAQUAAAAXcGVuZGluZ01hbmFnZXJQdWJsaWNLZXkDCQAAAAAAAAIFAAAAFWNoZWNrTWFuYWdlclB1YmxpY0tleQUAAAAVY2hlY2tNYW5hZ2VyUHVibGljS2V5CQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABprZXlQZW5kaW5nTWFuYWdlclB1YmxpY0tleQAAAAAFAAAAF3BlbmRpbmdNYW5hZ2VyUHVibGljS2V5BQAAAANuaWwJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgAAAAFpAQAAAA5jb25maXJtTWFuYWdlcgAAAAAEAAAAAnBtCQEAAAAdcGVuZGluZ01hbmFnZXJQdWJsaWNLZXlPclVuaXQAAAAABAAAAAVoYXNQTQMJAQAAAAlpc0RlZmluZWQAAAABBQAAAAJwbQYJAAACAAAAAQIAAAASbm8gcGVuZGluZyBtYW5hZ2VyAwkAAAAAAAACBQAAAAVoYXNQTQUAAAAFaGFzUE0EAAAAB2NoZWNrUE0DCQAAAAAAAAIIBQAAAAFpAAAAD2NhbGxlclB1YmxpY0tleQkBAAAABXZhbHVlAAAAAQUAAAACcG0GCQAAAgAAAAECAAAAG3lvdSBhcmUgbm90IHBlbmRpbmcgbWFuYWdlcgMJAAAAAAAAAgUAAAAHY2hlY2tQTQUAAAAHY2hlY2tQTQkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAATa2V5TWFuYWdlclB1YmxpY0tleQAAAAAJAAJYAAAAAQkBAAAABXZhbHVlAAAAAQUAAAACcG0JAARMAAAAAgkBAAAAC0RlbGV0ZUVudHJ5AAAAAQkBAAAAGmtleVBlbmRpbmdNYW5hZ2VyUHVibGljS2V5AAAAAAUAAAADbmlsCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAABAAAAAnR4AQAAAAZ2ZXJpZnkAAAAABAAAAA90YXJnZXRQdWJsaWNLZXkEAAAAByRtYXRjaDAJAQAAABZtYW5hZ2VyUHVibGljS2V5T3JVbml0AAAAAAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAKQnl0ZVZlY3RvcgQAAAACcGsFAAAAByRtYXRjaDAFAAAAAnBrAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAARVbml0CAUAAAACdHgAAAAPc2VuZGVyUHVibGljS2V5CQAAAgAAAAECAAAAC01hdGNoIGVycm9yCQAB9AAAAAMIBQAAAAJ0eAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAnR4AAAABnByb29mcwAAAAAAAAAAAAUAAAAPdGFyZ2V0UHVibGljS2V53/2P4g==", "chainId": 84, "height": 2048207, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: EMY3noiCERkeoHPvN2aneYMCDo5RXpxNNbLDchkTnzxr Next: GzeGrLMgzM9o1KRvP8fxuWx7gdsjZAzjDuy8KbiEM2qF Diff:
OldNewDifferences
77
88 let keyUsdnAssetId = makeString(["%s", "usdnAssetId"], separator)
99
10-let keyVotingDuration = makeString(["%s", "epochLength"], separator)
10+let keyEpochLength = makeString(["%s", "epochLength"], separator)
1111
1212 let keyFinalizeReward = makeString(["%s", "finalizeReward"], separator)
1313
2727 func keyInListAssetId (amountAssetId,priceAssetId) = makeString(["%s%s%s", "inList", amountAssetId, priceAssetId], separator)
2828
2929
30-func keyStartHeight (amountAssetId,priceAssetId) = makeString(["%s%s%s", "startHeight", amountAssetId, priceAssetId], separator)
30+func keyStartHeight (amountAssetId,priceAssetId,suggestIndex) = makeString(["%s%s%s", "startHeight", amountAssetId, priceAssetId, toString(suggestIndex)], separator)
3131
3232
33-func keyVotingResult (amountAssetId,priceAssetId) = makeString(["%s%s%s", "votingResult", amountAssetId, priceAssetId], separator)
33+func keyVotingResult (amountAssetId,priceAssetId,suggestIndex) = makeString(["%s%s%s", "votingResult", amountAssetId, priceAssetId, toString(suggestIndex)], separator)
3434
3535
3636 func totalVotes (totalYes,totalNo) = makeString(["%d%d", totalYes, totalNo], separator)
3737
3838
39-func keyVote (amountAssetId,priceAssetId,voterAddress) = makeString(["%s%s%s%s", "vote", amountAssetId, priceAssetId, voterAddress], separator)
39+func keyVote (amountAssetId,priceAssetId,suggestIndex,voterAddress) = makeString(["%s%s%s%s", "vote", amountAssetId, priceAssetId, toString(suggestIndex), voterAddress], separator)
4040
4141
4242 func keyVoteValue (gwxAmount,vote) = {
4545 else makeString(["%d%s", gwxAmount, "no"], separator)
4646 key
4747 }
48+
49+
50+func keyAssetsSuggestIndex (amountAssetId,priceAssetId) = makeString(["%s%s%s", "index", amountAssetId, priceAssetId], separator)
4851
4952
5053 func keyManagerPublicKey () = "%s__managerPublicKey"
5962
6063 let boostingContract = addressFromStringValue(getStringOrFail(keyBoostingContract))
6164
62-let assetStoreContract = addressFromStringValue(getStringOrFail(keyAssetsStoreContract))
65+let assetsStoreContract = addressFromStringValue(getStringOrFail(keyAssetsStoreContract))
6366
6467 func managerPublicKeyOrUnit () = match getString(keyManagerPublicKey()) {
6568 case s: String =>
128131 then true
129132 else throw("Invalid USDN asset ID")]
130133 if ((checks == checks))
131- then $Tuple2([StringEntry(keyAssetsStoreContract, assetsStoreContractPrm), StringEntry(keyuserPoolContract, userPoolContractPrm), StringEntry(keyEmissionContract, emissionContractPrm), IntegerEntry(keyFeeAmount, feeAmountPrm), IntegerEntry(keyVotingDuration, votingDurationPrm), IntegerEntry(keyFinalizeReward, finalizeRewardPrm), StringEntry(keyWxAssetId, wxAssetIdPrm), StringEntry(keyUsdnAssetId, usdnAssetIdPrm), StringEntry(keyBoostingContract, boostingContractPrm)], unit)
134+ then $Tuple2([StringEntry(keyAssetsStoreContract, assetsStoreContractPrm), StringEntry(keyuserPoolContract, userPoolContractPrm), StringEntry(keyEmissionContract, emissionContractPrm), IntegerEntry(keyFeeAmount, feeAmountPrm), IntegerEntry(keyEpochLength, votingDurationPrm), IntegerEntry(keyFinalizeReward, finalizeRewardPrm), StringEntry(keyWxAssetId, wxAssetIdPrm), StringEntry(keyUsdnAssetId, usdnAssetIdPrm), StringEntry(keyBoostingContract, boostingContractPrm)], unit)
132135 else throw("Strict value is not equal to itself.")
133136 }
134137
163166 }
164167 if ((ensureActive == ensureActive))
165168 then {
166- let ensureAmountAssetVerified = match invoke(assetStoreContract, "isVerifiedREADONLY", [amountAssetId], nil) {
169+ let ensureAmountAssetVerified = match invoke(assetsStoreContract, "isVerifiedREADONLY", [amountAssetId], nil) {
167170 case b: Boolean =>
168171 b
169172 case _ =>
173176 then {
174177 let burnFeeInv = invoke(emissionContract, "burn", nil, [AttachedPayment(payment.assetId, payment.amount)])
175178 if ((burnFeeInv == burnFeeInv))
176- then [BooleanEntry(keyInListAssetId(amountAssetId, priceAssetId), true), IntegerEntry(keyStartHeight(amountAssetId, priceAssetId), height), StringEntry(keyVotingResult(amountAssetId, priceAssetId), totalVotes("0", "0"))]
179+ then {
180+ let newSuggestIndex = match getInteger(keyAssetsSuggestIndex(amountAssetId, priceAssetId)) {
181+ case int: Int =>
182+ (int + 1)
183+ case _ =>
184+ 0
185+ }
186+ $Tuple2([BooleanEntry(keyInListAssetId(amountAssetId, priceAssetId), true), IntegerEntry(keyStartHeight(amountAssetId, priceAssetId, newSuggestIndex), height), StringEntry(keyVotingResult(amountAssetId, priceAssetId, newSuggestIndex), totalVotes("0", "0")), IntegerEntry(keyAssetsSuggestIndex(amountAssetId, priceAssetId), newSuggestIndex)], unit)
187+ }
177188 else throw("Strict value is not equal to itself.")
178189 }
179190 else throw("Strict value is not equal to itself.")
187198
188199 @Callable(i)
189200 func vote (amountAssetId,priceAssetId,inFavor) = {
190- let votingFinishHeight = (value(getInteger(keyStartHeight(amountAssetId, priceAssetId))) + value(getInteger(keyVotingDuration)))
191- let checks = [if ((getString(keyVote(amountAssetId, priceAssetId, toString(i.caller))) == unit))
201+ let suggestIndex = value(getInteger(keyAssetsSuggestIndex(amountAssetId, priceAssetId)))
202+ let votingFinishHeight = (value(getInteger(keyStartHeight(amountAssetId, priceAssetId, suggestIndex))) + value(getInteger(keyEpochLength)))
203+ let checks = [if ((getString(keyVote(amountAssetId, priceAssetId, suggestIndex, toString(i.caller))) == unit))
192204 then true
193205 else throw("you already voted"), if (valueOrElse(getBoolean(keyInListAssetId(amountAssetId, priceAssetId)), false))
194206 then true
197209 else throw("too late to vote")]
198210 if ((checks == checks))
199211 then {
200- let votingResult = split(value(getString(keyVotingResult(amountAssetId, priceAssetId))), separator)
212+ let votingResult = split(value(getString(keyVotingResult(amountAssetId, priceAssetId, suggestIndex))), separator)
201213 let positiveVotes = votingResult[1]
202214 let negativeVotes = votingResult[2]
203215 let gwxAmount = invoke(boostingContract, "getUserGwxAmountAtHeightREADONLY", [toString(i.caller), votingFinishHeight], nil)
209221 let entries = if (inFavor)
210222 then {
211223 let newPositiveVotes = (parseIntValue(positiveVotes) + asInt(gwxAmount))
212- let yesVoteKey = keyVote(amountAssetId, priceAssetId, toString(i.caller))
224+ let yesVoteKey = keyVote(amountAssetId, priceAssetId, suggestIndex, toString(i.caller))
213225 let yesVoteValue = keyVoteValue(toString(asInt(gwxAmount)), inFavor)
214- $Tuple2([StringEntry(keyVotingResult(amountAssetId, priceAssetId), totalVotes(toString(newPositiveVotes), negativeVotes)), StringEntry(yesVoteKey, yesVoteValue)], unit)
226+ $Tuple2([StringEntry(keyVotingResult(amountAssetId, priceAssetId, suggestIndex), totalVotes(toString(newPositiveVotes), negativeVotes)), StringEntry(yesVoteKey, yesVoteValue)], unit)
215227 }
216228 else {
217229 let newNegativeVotes = (parseIntValue(negativeVotes) + asInt(gwxAmount))
218- let noVoteKey = keyVote(amountAssetId, priceAssetId, toString(i.caller))
230+ let noVoteKey = keyVote(amountAssetId, priceAssetId, suggestIndex, toString(i.caller))
219231 let noVoteValue = keyVoteValue(toString(asInt(gwxAmount)), inFavor)
220- $Tuple2([StringEntry(keyVotingResult(amountAssetId, priceAssetId), totalVotes(positiveVotes, toString(newNegativeVotes))), StringEntry(noVoteKey, noVoteValue)], unit)
232+ $Tuple2([StringEntry(keyVotingResult(amountAssetId, priceAssetId, suggestIndex), totalVotes(positiveVotes, toString(newNegativeVotes))), StringEntry(noVoteKey, noVoteValue)], unit)
221233 }
222234 entries
223235 }
230242
231243 @Callable(i)
232244 func cancelVote (amountAssetId,priceAssetId) = {
233- let checks = [if (isDefined(getString(keyVotingResult(amountAssetId, priceAssetId))))
245+ let suggestIndex = value(getInteger(keyAssetsSuggestIndex(amountAssetId, priceAssetId)))
246+ let checks = [if (isDefined(getString(keyVotingResult(amountAssetId, priceAssetId, suggestIndex))))
234247 then true
235248 else throw("no vote for assets pair")]
236249 if ((checks == checks))
237250 then {
238- let vote = split(value(getString(keyVote(amountAssetId, priceAssetId, toString(i.caller)))), separator)
251+ let vote = split(value(getString(keyVote(amountAssetId, priceAssetId, suggestIndex, toString(i.caller)))), separator)
239252 let voteValue = vote[1]
240253 let voteType = vote[2]
241- let votingResult = split(value(getString(keyVotingResult(amountAssetId, priceAssetId))), separator)
254+ let votingResult = split(value(getString(keyVotingResult(amountAssetId, priceAssetId, suggestIndex))), separator)
242255 let positiveVotes = votingResult[1]
243256 let negativeVotes = votingResult[2]
244257 let actions = if ((voteType == "yes"))
245258 then {
246259 let newPositiveVotes = (parseIntValue(positiveVotes) - parseIntValue(voteValue))
247- $Tuple2([StringEntry(keyVotingResult(amountAssetId, priceAssetId), totalVotes(toString(newPositiveVotes), negativeVotes)), DeleteEntry(keyVote(amountAssetId, priceAssetId, toString(i.caller)))], unit)
260+ $Tuple2([StringEntry(keyVotingResult(amountAssetId, priceAssetId, suggestIndex), totalVotes(toString(newPositiveVotes), negativeVotes)), DeleteEntry(keyVote(amountAssetId, priceAssetId, suggestIndex, toString(i.caller)))], unit)
248261 }
249262 else {
250263 let newNegativeVotes = (parseIntValue(negativeVotes) - parseIntValue(voteValue))
251- $Tuple2([StringEntry(keyVotingResult(amountAssetId, priceAssetId), totalVotes(positiveVotes, toString(newNegativeVotes))), DeleteEntry(keyVote(amountAssetId, priceAssetId, toString(i.caller)))], unit)
264+ $Tuple2([StringEntry(keyVotingResult(amountAssetId, priceAssetId, suggestIndex), totalVotes(positiveVotes, toString(newNegativeVotes))), DeleteEntry(keyVote(amountAssetId, priceAssetId, suggestIndex, toString(i.caller)))], unit)
252265 }
253266 actions
254267 }
269282
270283 @Callable(i)
271284 func finalize (amountAssetId,priceAssetId) = {
272- let votingFinishHeight = (value(getInteger(keyStartHeight(amountAssetId, priceAssetId))) + value(getInteger(keyVotingDuration)))
285+ let suggestIndex = value(getInteger(keyAssetsSuggestIndex(amountAssetId, priceAssetId)))
286+ let votingFinishHeight = (value(getInteger(keyStartHeight(amountAssetId, priceAssetId, suggestIndex))) + value(getInteger(keyEpochLength)))
273287 let checks = [if (isDefined(getBoolean(keyInListAssetId(amountAssetId, priceAssetId))))
274288 then true
275289 else throw("no assets pair"), if ((height >= votingFinishHeight))
277291 else throw("insufficient height for completion")]
278292 if ((checks == checks))
279293 then {
280- let votingResult = split(value(getString(keyVotingResult(amountAssetId, priceAssetId))), separator)
294+ let votingResult = split(value(getString(keyVotingResult(amountAssetId, priceAssetId, suggestIndex))), separator)
281295 let positiveVotes = parseIntValue(votingResult[1])
282296 let negativeVotes = parseIntValue(votingResult[2])
283297 let actions = if ((positiveVotes > negativeVotes))
284298 then {
285- let res = invoke(assetStoreContract, "setPoolLabels", [amountAssetId, priceAssetId, "WX_EMISSION"], nil)
299+ let res = invoke(assetsStoreContract, "setPoolLabels", [amountAssetId, priceAssetId, "WX_EMISSION"], nil)
286300 if ((res == res))
287301 then $Tuple2([DeleteEntry(keyInListAssetId(amountAssetId, priceAssetId))], unit)
288302 else throw("Strict value is not equal to itself.")
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let separator = "__"
55
66 let keyFeeAmount = makeString(["%s", "fee"], separator)
77
88 let keyUsdnAssetId = makeString(["%s", "usdnAssetId"], separator)
99
10-let keyVotingDuration = makeString(["%s", "epochLength"], separator)
10+let keyEpochLength = makeString(["%s", "epochLength"], separator)
1111
1212 let keyFinalizeReward = makeString(["%s", "finalizeReward"], separator)
1313
1414 let keyWxAssetId = makeString(["%s", "wxAssetId"], separator)
1515
1616 let keyAssetsStoreContract = makeString(["%s", "assetsStoreContract"], separator)
1717
1818 let keyuserPoolContract = makeString(["%s", "userPoolContract"], separator)
1919
2020 let keyEmissionContract = makeString(["%s", "emissionContract"], separator)
2121
2222 let keyBoostingContract = makeString(["%s", "boostingContract"], separator)
2323
2424 func getStringOrFail (key) = valueOrErrorMessage(getString(this, key), (key + " is not defined"))
2525
2626
2727 func keyInListAssetId (amountAssetId,priceAssetId) = makeString(["%s%s%s", "inList", amountAssetId, priceAssetId], separator)
2828
2929
30-func keyStartHeight (amountAssetId,priceAssetId) = makeString(["%s%s%s", "startHeight", amountAssetId, priceAssetId], separator)
30+func keyStartHeight (amountAssetId,priceAssetId,suggestIndex) = makeString(["%s%s%s", "startHeight", amountAssetId, priceAssetId, toString(suggestIndex)], separator)
3131
3232
33-func keyVotingResult (amountAssetId,priceAssetId) = makeString(["%s%s%s", "votingResult", amountAssetId, priceAssetId], separator)
33+func keyVotingResult (amountAssetId,priceAssetId,suggestIndex) = makeString(["%s%s%s", "votingResult", amountAssetId, priceAssetId, toString(suggestIndex)], separator)
3434
3535
3636 func totalVotes (totalYes,totalNo) = makeString(["%d%d", totalYes, totalNo], separator)
3737
3838
39-func keyVote (amountAssetId,priceAssetId,voterAddress) = makeString(["%s%s%s%s", "vote", amountAssetId, priceAssetId, voterAddress], separator)
39+func keyVote (amountAssetId,priceAssetId,suggestIndex,voterAddress) = makeString(["%s%s%s%s", "vote", amountAssetId, priceAssetId, toString(suggestIndex), voterAddress], separator)
4040
4141
4242 func keyVoteValue (gwxAmount,vote) = {
4343 let key = if (vote)
4444 then makeString(["%d%s", gwxAmount, "yes"], separator)
4545 else makeString(["%d%s", gwxAmount, "no"], separator)
4646 key
4747 }
48+
49+
50+func keyAssetsSuggestIndex (amountAssetId,priceAssetId) = makeString(["%s%s%s", "index", amountAssetId, priceAssetId], separator)
4851
4952
5053 func keyManagerPublicKey () = "%s__managerPublicKey"
5154
5255
5356 func keyPendingManagerPublicKey () = "%s__pendingManagerPublicKey"
5457
5558
5659 let emissionContract = addressFromStringValue(getStringOrFail(keyEmissionContract))
5760
5861 let userPoolContract = addressFromStringValue(getStringOrFail(keyuserPoolContract))
5962
6063 let boostingContract = addressFromStringValue(getStringOrFail(keyBoostingContract))
6164
62-let assetStoreContract = addressFromStringValue(getStringOrFail(keyAssetsStoreContract))
65+let assetsStoreContract = addressFromStringValue(getStringOrFail(keyAssetsStoreContract))
6366
6467 func managerPublicKeyOrUnit () = match getString(keyManagerPublicKey()) {
6568 case s: String =>
6669 fromBase58String(s)
6770 case _: Unit =>
6871 unit
6972 case _ =>
7073 throw("Match error")
7174 }
7275
7376
7477 func pendingManagerPublicKeyOrUnit () = match getString(keyPendingManagerPublicKey()) {
7578 case s: String =>
7679 fromBase58String(s)
7780 case _: Unit =>
7881 unit
7982 case _ =>
8083 throw("Match error")
8184 }
8285
8386
8487 func mustManager (i) = {
8588 let pd = throw("permission denied")
8689 match managerPublicKeyOrUnit() {
8790 case pk: ByteVector =>
8891 if ((i.callerPublicKey == pk))
8992 then true
9093 else pd
9194 case _: Unit =>
9295 if ((i.caller == this))
9396 then true
9497 else pd
9598 case _ =>
9699 throw("Match error")
97100 }
98101 }
99102
100103
101104 func asInt (val) = match val {
102105 case valInt: Int =>
103106 valInt
104107 case _ =>
105108 throw("failed to cast into Integer")
106109 }
107110
108111
109112 @Callable(i)
110113 func constructor (assetsStoreContractPrm,userPoolContractPrm,boostingContractPrm,emissionContractPrm,feeAmountPrm,wxAssetIdPrm,votingDurationPrm,usdnAssetIdPrm,finalizeRewardPrm) = {
111114 let checks = [mustManager(i), if (isDefined(addressFromString(assetsStoreContractPrm)))
112115 then true
113116 else throw("Invalid asset_store contract address"), if (isDefined(addressFromString(boostingContractPrm)))
114117 then true
115118 else throw("Invalid boosting contract address"), if (isDefined(addressFromString(userPoolContractPrm)))
116119 then true
117120 else throw("Invalid user_pools contract address"), if (isDefined(addressFromString(emissionContractPrm)))
118121 then true
119122 else throw("Invalid emission contract address"), if ((feeAmountPrm >= 0))
120123 then true
121124 else throw("Invalid fee amount"), if ((votingDurationPrm > 0))
122125 then true
123126 else throw("Invalid voting duration"), if ((finalizeRewardPrm > 0))
124127 then true
125128 else throw("Invalid finalize reward"), if (isDefined(assetInfo(fromBase58String(wxAssetIdPrm))))
126129 then true
127130 else throw("Invalid WX asset ID"), if (isDefined(assetInfo(fromBase58String(usdnAssetIdPrm))))
128131 then true
129132 else throw("Invalid USDN asset ID")]
130133 if ((checks == checks))
131- then $Tuple2([StringEntry(keyAssetsStoreContract, assetsStoreContractPrm), StringEntry(keyuserPoolContract, userPoolContractPrm), StringEntry(keyEmissionContract, emissionContractPrm), IntegerEntry(keyFeeAmount, feeAmountPrm), IntegerEntry(keyVotingDuration, votingDurationPrm), IntegerEntry(keyFinalizeReward, finalizeRewardPrm), StringEntry(keyWxAssetId, wxAssetIdPrm), StringEntry(keyUsdnAssetId, usdnAssetIdPrm), StringEntry(keyBoostingContract, boostingContractPrm)], unit)
134+ then $Tuple2([StringEntry(keyAssetsStoreContract, assetsStoreContractPrm), StringEntry(keyuserPoolContract, userPoolContractPrm), StringEntry(keyEmissionContract, emissionContractPrm), IntegerEntry(keyFeeAmount, feeAmountPrm), IntegerEntry(keyEpochLength, votingDurationPrm), IntegerEntry(keyFinalizeReward, finalizeRewardPrm), StringEntry(keyWxAssetId, wxAssetIdPrm), StringEntry(keyUsdnAssetId, usdnAssetIdPrm), StringEntry(keyBoostingContract, boostingContractPrm)], unit)
132135 else throw("Strict value is not equal to itself.")
133136 }
134137
135138
136139
137140 @Callable(i)
138141 func suggest (amountAssetId,priceAssetId) = {
139142 let payment = value(i.payments[0])
140143 let info = valueOrErrorMessage(assetInfo(fromBase58String(amountAssetId)), "invalid amountAssetId ID")
141144 let checks = [if ((info.issuer == i.caller))
142145 then true
143146 else throw("asset can only be suggested by its issuer"), if ((info.scripted == false))
144147 then true
145148 else throw("asset is smart"), if ((toBase58String(value(payment.assetId)) == value(getString(keyWxAssetId))))
146149 then true
147150 else throw("invalid fee asset"), if ((payment.amount == value(getInteger(keyFeeAmount))))
148151 then true
149152 else throw("invalid fee amount"), if ((priceAssetId == value(getString(keyUsdnAssetId))))
150153 then true
151154 else throw("priceAssetId is not USDN"), if ((getBoolean(keyInListAssetId(amountAssetId, priceAssetId)) == unit))
152155 then true
153156 else throw("already in voting list")]
154157 if ((checks == checks))
155158 then {
156159 let ensureActive = match invoke(userPoolContract, "statusREADONLY", [amountAssetId, priceAssetId], nil) {
157160 case s: String =>
158161 if ((s == "active"))
159162 then true
160163 else throw("user pool is not active")
161164 case _ =>
162165 throw("user pool is not active")
163166 }
164167 if ((ensureActive == ensureActive))
165168 then {
166- let ensureAmountAssetVerified = match invoke(assetStoreContract, "isVerifiedREADONLY", [amountAssetId], nil) {
169+ let ensureAmountAssetVerified = match invoke(assetsStoreContract, "isVerifiedREADONLY", [amountAssetId], nil) {
167170 case b: Boolean =>
168171 b
169172 case _ =>
170173 throw("asset is not verified")
171174 }
172175 if ((ensureAmountAssetVerified == ensureAmountAssetVerified))
173176 then {
174177 let burnFeeInv = invoke(emissionContract, "burn", nil, [AttachedPayment(payment.assetId, payment.amount)])
175178 if ((burnFeeInv == burnFeeInv))
176- then [BooleanEntry(keyInListAssetId(amountAssetId, priceAssetId), true), IntegerEntry(keyStartHeight(amountAssetId, priceAssetId), height), StringEntry(keyVotingResult(amountAssetId, priceAssetId), totalVotes("0", "0"))]
179+ then {
180+ let newSuggestIndex = match getInteger(keyAssetsSuggestIndex(amountAssetId, priceAssetId)) {
181+ case int: Int =>
182+ (int + 1)
183+ case _ =>
184+ 0
185+ }
186+ $Tuple2([BooleanEntry(keyInListAssetId(amountAssetId, priceAssetId), true), IntegerEntry(keyStartHeight(amountAssetId, priceAssetId, newSuggestIndex), height), StringEntry(keyVotingResult(amountAssetId, priceAssetId, newSuggestIndex), totalVotes("0", "0")), IntegerEntry(keyAssetsSuggestIndex(amountAssetId, priceAssetId), newSuggestIndex)], unit)
187+ }
177188 else throw("Strict value is not equal to itself.")
178189 }
179190 else throw("Strict value is not equal to itself.")
180191 }
181192 else throw("Strict value is not equal to itself.")
182193 }
183194 else throw("Strict value is not equal to itself.")
184195 }
185196
186197
187198
188199 @Callable(i)
189200 func vote (amountAssetId,priceAssetId,inFavor) = {
190- let votingFinishHeight = (value(getInteger(keyStartHeight(amountAssetId, priceAssetId))) + value(getInteger(keyVotingDuration)))
191- let checks = [if ((getString(keyVote(amountAssetId, priceAssetId, toString(i.caller))) == unit))
201+ let suggestIndex = value(getInteger(keyAssetsSuggestIndex(amountAssetId, priceAssetId)))
202+ let votingFinishHeight = (value(getInteger(keyStartHeight(amountAssetId, priceAssetId, suggestIndex))) + value(getInteger(keyEpochLength)))
203+ let checks = [if ((getString(keyVote(amountAssetId, priceAssetId, suggestIndex, toString(i.caller))) == unit))
192204 then true
193205 else throw("you already voted"), if (valueOrElse(getBoolean(keyInListAssetId(amountAssetId, priceAssetId)), false))
194206 then true
195207 else throw("the token isn't on the voting list"), if ((votingFinishHeight > height))
196208 then true
197209 else throw("too late to vote")]
198210 if ((checks == checks))
199211 then {
200- let votingResult = split(value(getString(keyVotingResult(amountAssetId, priceAssetId))), separator)
212+ let votingResult = split(value(getString(keyVotingResult(amountAssetId, priceAssetId, suggestIndex))), separator)
201213 let positiveVotes = votingResult[1]
202214 let negativeVotes = votingResult[2]
203215 let gwxAmount = invoke(boostingContract, "getUserGwxAmountAtHeightREADONLY", [toString(i.caller), votingFinishHeight], nil)
204216 let notZero = if ((asInt(gwxAmount) > 0))
205217 then true
206218 else throw("you don't have gwx")
207219 if ((notZero == notZero))
208220 then {
209221 let entries = if (inFavor)
210222 then {
211223 let newPositiveVotes = (parseIntValue(positiveVotes) + asInt(gwxAmount))
212- let yesVoteKey = keyVote(amountAssetId, priceAssetId, toString(i.caller))
224+ let yesVoteKey = keyVote(amountAssetId, priceAssetId, suggestIndex, toString(i.caller))
213225 let yesVoteValue = keyVoteValue(toString(asInt(gwxAmount)), inFavor)
214- $Tuple2([StringEntry(keyVotingResult(amountAssetId, priceAssetId), totalVotes(toString(newPositiveVotes), negativeVotes)), StringEntry(yesVoteKey, yesVoteValue)], unit)
226+ $Tuple2([StringEntry(keyVotingResult(amountAssetId, priceAssetId, suggestIndex), totalVotes(toString(newPositiveVotes), negativeVotes)), StringEntry(yesVoteKey, yesVoteValue)], unit)
215227 }
216228 else {
217229 let newNegativeVotes = (parseIntValue(negativeVotes) + asInt(gwxAmount))
218- let noVoteKey = keyVote(amountAssetId, priceAssetId, toString(i.caller))
230+ let noVoteKey = keyVote(amountAssetId, priceAssetId, suggestIndex, toString(i.caller))
219231 let noVoteValue = keyVoteValue(toString(asInt(gwxAmount)), inFavor)
220- $Tuple2([StringEntry(keyVotingResult(amountAssetId, priceAssetId), totalVotes(positiveVotes, toString(newNegativeVotes))), StringEntry(noVoteKey, noVoteValue)], unit)
232+ $Tuple2([StringEntry(keyVotingResult(amountAssetId, priceAssetId, suggestIndex), totalVotes(positiveVotes, toString(newNegativeVotes))), StringEntry(noVoteKey, noVoteValue)], unit)
221233 }
222234 entries
223235 }
224236 else throw("Strict value is not equal to itself.")
225237 }
226238 else throw("Strict value is not equal to itself.")
227239 }
228240
229241
230242
231243 @Callable(i)
232244 func cancelVote (amountAssetId,priceAssetId) = {
233- let checks = [if (isDefined(getString(keyVotingResult(amountAssetId, priceAssetId))))
245+ let suggestIndex = value(getInteger(keyAssetsSuggestIndex(amountAssetId, priceAssetId)))
246+ let checks = [if (isDefined(getString(keyVotingResult(amountAssetId, priceAssetId, suggestIndex))))
234247 then true
235248 else throw("no vote for assets pair")]
236249 if ((checks == checks))
237250 then {
238- let vote = split(value(getString(keyVote(amountAssetId, priceAssetId, toString(i.caller)))), separator)
251+ let vote = split(value(getString(keyVote(amountAssetId, priceAssetId, suggestIndex, toString(i.caller)))), separator)
239252 let voteValue = vote[1]
240253 let voteType = vote[2]
241- let votingResult = split(value(getString(keyVotingResult(amountAssetId, priceAssetId))), separator)
254+ let votingResult = split(value(getString(keyVotingResult(amountAssetId, priceAssetId, suggestIndex))), separator)
242255 let positiveVotes = votingResult[1]
243256 let negativeVotes = votingResult[2]
244257 let actions = if ((voteType == "yes"))
245258 then {
246259 let newPositiveVotes = (parseIntValue(positiveVotes) - parseIntValue(voteValue))
247- $Tuple2([StringEntry(keyVotingResult(amountAssetId, priceAssetId), totalVotes(toString(newPositiveVotes), negativeVotes)), DeleteEntry(keyVote(amountAssetId, priceAssetId, toString(i.caller)))], unit)
260+ $Tuple2([StringEntry(keyVotingResult(amountAssetId, priceAssetId, suggestIndex), totalVotes(toString(newPositiveVotes), negativeVotes)), DeleteEntry(keyVote(amountAssetId, priceAssetId, suggestIndex, toString(i.caller)))], unit)
248261 }
249262 else {
250263 let newNegativeVotes = (parseIntValue(negativeVotes) - parseIntValue(voteValue))
251- $Tuple2([StringEntry(keyVotingResult(amountAssetId, priceAssetId), totalVotes(positiveVotes, toString(newNegativeVotes))), DeleteEntry(keyVote(amountAssetId, priceAssetId, toString(i.caller)))], unit)
264+ $Tuple2([StringEntry(keyVotingResult(amountAssetId, priceAssetId, suggestIndex), totalVotes(positiveVotes, toString(newNegativeVotes))), DeleteEntry(keyVote(amountAssetId, priceAssetId, suggestIndex, toString(i.caller)))], unit)
252265 }
253266 actions
254267 }
255268 else throw("Strict value is not equal to itself.")
256269 }
257270
258271
259272
260273 @Callable(i)
261274 func setFee (newFee) = {
262275 let checks = [mustManager(i)]
263276 if ((checks == checks))
264277 then [IntegerEntry(keyFeeAmount, newFee)]
265278 else throw("Strict value is not equal to itself.")
266279 }
267280
268281
269282
270283 @Callable(i)
271284 func finalize (amountAssetId,priceAssetId) = {
272- let votingFinishHeight = (value(getInteger(keyStartHeight(amountAssetId, priceAssetId))) + value(getInteger(keyVotingDuration)))
285+ let suggestIndex = value(getInteger(keyAssetsSuggestIndex(amountAssetId, priceAssetId)))
286+ let votingFinishHeight = (value(getInteger(keyStartHeight(amountAssetId, priceAssetId, suggestIndex))) + value(getInteger(keyEpochLength)))
273287 let checks = [if (isDefined(getBoolean(keyInListAssetId(amountAssetId, priceAssetId))))
274288 then true
275289 else throw("no assets pair"), if ((height >= votingFinishHeight))
276290 then true
277291 else throw("insufficient height for completion")]
278292 if ((checks == checks))
279293 then {
280- let votingResult = split(value(getString(keyVotingResult(amountAssetId, priceAssetId))), separator)
294+ let votingResult = split(value(getString(keyVotingResult(amountAssetId, priceAssetId, suggestIndex))), separator)
281295 let positiveVotes = parseIntValue(votingResult[1])
282296 let negativeVotes = parseIntValue(votingResult[2])
283297 let actions = if ((positiveVotes > negativeVotes))
284298 then {
285- let res = invoke(assetStoreContract, "setPoolLabels", [amountAssetId, priceAssetId, "WX_EMISSION"], nil)
299+ let res = invoke(assetsStoreContract, "setPoolLabels", [amountAssetId, priceAssetId, "WX_EMISSION"], nil)
286300 if ((res == res))
287301 then $Tuple2([DeleteEntry(keyInListAssetId(amountAssetId, priceAssetId))], unit)
288302 else throw("Strict value is not equal to itself.")
289303 }
290304 else $Tuple2([DeleteEntry(keyInListAssetId(amountAssetId, priceAssetId))], unit)
291305 actions
292306 }
293307 else throw("Strict value is not equal to itself.")
294308 }
295309
296310
297311
298312 @Callable(i)
299313 func setManager (pendingManagerPublicKey) = {
300314 let checkCaller = mustManager(i)
301315 if ((checkCaller == checkCaller))
302316 then {
303317 let checkManagerPublicKey = fromBase58String(pendingManagerPublicKey)
304318 if ((checkManagerPublicKey == checkManagerPublicKey))
305319 then [StringEntry(keyPendingManagerPublicKey(), pendingManagerPublicKey)]
306320 else throw("Strict value is not equal to itself.")
307321 }
308322 else throw("Strict value is not equal to itself.")
309323 }
310324
311325
312326
313327 @Callable(i)
314328 func confirmManager () = {
315329 let pm = pendingManagerPublicKeyOrUnit()
316330 let hasPM = if (isDefined(pm))
317331 then true
318332 else throw("no pending manager")
319333 if ((hasPM == hasPM))
320334 then {
321335 let checkPM = if ((i.callerPublicKey == value(pm)))
322336 then true
323337 else throw("you are not pending manager")
324338 if ((checkPM == checkPM))
325339 then [StringEntry(keyManagerPublicKey(), toBase58String(value(pm))), DeleteEntry(keyPendingManagerPublicKey())]
326340 else throw("Strict value is not equal to itself.")
327341 }
328342 else throw("Strict value is not equal to itself.")
329343 }
330344
331345
332346 @Verifier(tx)
333347 func verify () = {
334348 let targetPublicKey = match managerPublicKeyOrUnit() {
335349 case pk: ByteVector =>
336350 pk
337351 case _: Unit =>
338352 tx.senderPublicKey
339353 case _ =>
340354 throw("Match error")
341355 }
342356 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
343357 }
344358

github/deemru/w8io/169f3d6 
63.84 ms