tx · 8BtWfTksDrcodFa3aCMbnt7DuXESFgbnX5Dk6jDrwevW

3MyVvNfXht9piazyf1e5BVFsqv1R7z5cWJL:  -0.02000000 Waves

2022.06.06 17:31 [2084618] smart account 3MyVvNfXht9piazyf1e5BVFsqv1R7z5cWJL > SELF 0.00000000 Waves

{ "type": 13, "id": "8BtWfTksDrcodFa3aCMbnt7DuXESFgbnX5Dk6jDrwevW", "fee": 2000000, "feeAssetId": null, "timestamp": 1654525873518, "version": 1, "sender": "3MyVvNfXht9piazyf1e5BVFsqv1R7z5cWJL", "senderPublicKey": "DnPyGWCgpQChvoQrnXQRcC9FtN32mPGrcog2wcKHdkVn", "proofs": [ "3XmV6fjKG5wNtMZZYshJLrgH9dfUiZGDUFPTJRsqbbqGtpFVL8pkNYrRvNQQa3rrinFNBND3oS1L9v1gQZvdNDy8" ], "script": "base64:AAIFAAAAAAAAADUIAhIDCgEIEgASBAoCCAESBQoDCAgBEgQKAggIEgUKAwgIARIECgIICBIDCgEBEgASAwoBCAAAAB4AAAAACXNlcGFyYXRvcgIAAAACX18AAAAADmtleUVwb2NoTGVuZ3RoCQAEuQAAAAIJAARMAAAAAgIAAAACJXMJAARMAAAAAgIAAAALZXBvY2hMZW5ndGgFAAAAA25pbAUAAAAJc2VwYXJhdG9yAAAAAA9rZXlDdXJyZW50RXBvY2gJAAS5AAAAAgkABEwAAAACAgAAAAIlcwkABEwAAAACAgAAAAxjdXJyZW50RXBvY2gFAAAAA25pbAUAAAAJc2VwYXJhdG9yAAAAAA5rZXlTdGFydEhlaWdodAkABLkAAAACCQAETAAAAAICAAAAAiVzCQAETAAAAAICAAAAC3N0YXJ0SGVpZ2h0BQAAAANuaWwFAAAACXNlcGFyYXRvcgAAAAAia2V5Vm90aW5nRW1pc3Npb25DYW5kaWRhdGVDb250cmFjdAkABLkAAAACCQAETAAAAAICAAAAAiVzCQAETAAAAAICAAAAH3ZvdGluZ0VtaXNzaW9uQ2FuZGlkYXRlQ29udHJhY3QFAAAAA25pbAUAAAAJc2VwYXJhdG9yAAAAABNrZXlCb29zdGluZ0NvbnRyYWN0CQAEuQAAAAIJAARMAAAAAgIAAAACJXMJAARMAAAAAgIAAAAQYm9vc3RpbmdDb250cmFjdAUAAAADbmlsBQAAAAlzZXBhcmF0b3IBAAAACWtleUluTGlzdAAAAAEAAAAEcG9vbAQAAAAJJHQwNTc1NjE1BQAAAARwb29sBAAAAA1hbW91bnRBc3NldElkCAUAAAAJJHQwNTc1NjE1AAAAAl8xBAAAAAxwcmljZUFzc2V0SWQIBQAAAAkkdDA1NzU2MTUAAAACXzIJAAS5AAAAAgkABEwAAAACAgAAAAYlcyVzJXMJAARMAAAAAgIAAAAGaW5MaXN0CQAETAAAAAIFAAAADWFtb3VudEFzc2V0SWQJAARMAAAAAgUAAAAMcHJpY2VBc3NldElkBQAAAANuaWwFAAAACXNlcGFyYXRvcgEAAAAHa2V5VXNlZAAAAAIAAAAHYWRkcmVzcwAAAAVlcG9jaAkABLkAAAACCQAETAAAAAICAAAABiVzJXMlZAkABEwAAAACAgAAAAR1c2VkCQAETAAAAAIJAAQlAAAAAQUAAAAHYWRkcmVzcwkABEwAAAACCQABpAAAAAEFAAAABWVwb2NoBQAAAANuaWwFAAAACXNlcGFyYXRvcgEAAAAHa2V5Vm90ZQAAAAMAAAAHYWRkcmVzcwAAAARwb29sAAAABWVwb2NoBAAAAAkkdDA4ODk5MjkFAAAABHBvb2wEAAAADWFtb3VudEFzc2V0SWQIBQAAAAkkdDA4ODk5MjkAAAACXzEEAAAADHByaWNlQXNzZXRJZAgFAAAACSR0MDg4OTkyOQAAAAJfMgkABLkAAAACCQAETAAAAAICAAAACiVzJXMlcyVzJWQJAARMAAAAAgIAAAAEdm90ZQkABEwAAAACBQAAAA1hbW91bnRBc3NldElkCQAETAAAAAIFAAAADHByaWNlQXNzZXRJZAkABEwAAAACCQAEJQAAAAEFAAAAB2FkZHJlc3MJAARMAAAAAgkAAaQAAAABBQAAAAVlcG9jaAUAAAADbmlsBQAAAAlzZXBhcmF0b3IBAAAAD2tleVZvdGluZ1Jlc3VsdAAAAAIAAAAEcG9vbAAAAAVlcG9jaAQAAAALJHQwMTExMTExNTEFAAAABHBvb2wEAAAADWFtb3VudEFzc2V0SWQIBQAAAAskdDAxMTExMTE1MQAAAAJfMQQAAAAMcHJpY2VBc3NldElkCAUAAAALJHQwMTExMTExNTEAAAACXzIJAAS5AAAAAgkABEwAAAACAgAAAAglcyVzJXMlZAkABEwAAAACAgAAAAx2b3RpbmdSZXN1bHQJAARMAAAAAgUAAAANYW1vdW50QXNzZXRJZAkABEwAAAACBQAAAAxwcmljZUFzc2V0SWQJAARMAAAAAgkAAaQAAAABBQAAAAVlcG9jaAUAAAADbmlsBQAAAAlzZXBhcmF0b3IBAAAADWtleVRvdGFsVm90ZXMAAAABAAAABWVwb2NoCQAEuQAAAAIJAARMAAAAAgIAAAAEJXMlZAkABEwAAAACAgAAAAp0b3RhbFZvdGVzCQAETAAAAAIJAAGkAAAAAQUAAAAFZXBvY2gFAAAAA25pbAUAAAAJc2VwYXJhdG9yAQAAAA5nZXRWYWx1ZU9yRmFpbAAAAAMAAAAHYWRkcmVzcwAAAANrZXkAAAAEdHlwZQQAAAAFZXJyb3IJAAS5AAAAAgkABEwAAAACAgAAAAptYW5kYXRvcnkgCQAETAAAAAIJAAQlAAAAAQUAAAAHYWRkcmVzcwkABEwAAAACAgAAAAEuCQAETAAAAAIFAAAAA2tleQkABEwAAAACAgAAAA8gaXMgbm90IGRlZmluZWQFAAAAA25pbAIAAAAACQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIEAAAAByRtYXRjaDAFAAAABHR5cGUDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABlN0cmluZwQAAAADc3RyBQAAAAckbWF0Y2gwCQAEHQAAAAIFAAAAB2FkZHJlc3MFAAAAA2tleQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAADSW50BAAAAANpbnQFAAAAByRtYXRjaDAJAAQaAAAAAgUAAAAHYWRkcmVzcwUAAAADa2V5CQAAAgAAAAECAAAAEmludmFsaWQgZW50cnkgdHlwZQUAAAAFZXJyb3IBAAAADGdldFN0ck9yRmFpbAAAAAIAAAAHYWRkcmVzcwAAAANrZXkKAAAAAAFACQEAAAAOZ2V0VmFsdWVPckZhaWwAAAADBQAAAAdhZGRyZXNzBQAAAANrZXkCAAAAAAMJAAABAAAAAgUAAAABQAIAAAAGU3RyaW5nBQAAAAFACQAAAgAAAAECAAAAIkNvdWxkbid0IGNhc3QgSW50fFN0cmluZyB0byBTdHJpbmcBAAAADGdldEludE9yRmFpbAAAAAIAAAAHYWRkcmVzcwAAAANrZXkKAAAAAAFACQEAAAAOZ2V0VmFsdWVPckZhaWwAAAADBQAAAAdhZGRyZXNzBQAAAANrZXkAAAAAAAAAAAADCQAAAQAAAAIFAAAAAUACAAAAA0ludAUAAAABQAkAAAIAAAABAgAAAB9Db3VsZG4ndCBjYXN0IEludHxTdHJpbmcgdG8gSW50AQAAAAxwb29sVG9TdHJpbmcAAAABAAAABHBvb2wJAAEsAAAAAgkAASwAAAACCAUAAAAEcG9vbAAAAAJfMQUAAAAJc2VwYXJhdG9yCAUAAAAEcG9vbAAAAAJfMgEAAAAMc3RyaW5nVG9Qb29sAAAAAQAAAANzdHIEAAAABXBhcnRzCQAEtQAAAAIFAAAAA3N0cgUAAAAJc2VwYXJhdG9yAwkAAAAAAAACCQABkAAAAAEFAAAABXBhcnRzAAAAAAAAAAACCQAFFAAAAAIJAAGRAAAAAgUAAAAFcGFydHMAAAAAAAAAAAAJAAGRAAAAAgUAAAAFcGFydHMAAAAAAAAAAAEJAAACAAAAAQIAAAATaW52YWxpZCBwb29sIHN0cmluZwAAAAANcG9vbHNMaXN0TmFtZQIAAAAFcG9vbHMBAAAAEGdldFZvdGVzTGlzdE5hbWUAAAABAAAABHBvb2wEAAAACyR0MDIyNjAyMzAwBQAAAARwb29sBAAAAA1hbW91bnRBc3NldElkCAUAAAALJHQwMjI2MDIzMDAAAAACXzEEAAAADHByaWNlQXNzZXRJZAgFAAAACyR0MDIyNjAyMzAwAAAAAl8yCQAEuQAAAAIJAARMAAAAAgIAAAAFdm90ZXMJAARMAAAAAgUAAAANYW1vdW50QXNzZXRJZAkABEwAAAACBQAAAAxwcmljZUFzc2V0SWQFAAAAA25pbAUAAAAJc2VwYXJhdG9yAQAAAAtrZXlMaXN0SGVhZAAAAAEAAAAIbGlzdE5hbWUEAAAABG1ldGEDCQAAAAAAAAIFAAAACGxpc3ROYW1lBQAAAA1wb29sc0xpc3ROYW1lAgAAAAQlcyVzAgAAAAglcyVzJXMlcwkABLkAAAACCQAETAAAAAIFAAAABG1ldGEJAARMAAAAAgUAAAAIbGlzdE5hbWUJAARMAAAAAgIAAAAEaGVhZAUAAAADbmlsBQAAAAlzZXBhcmF0b3IBAAAAC2tleUxpc3RTaXplAAAAAQAAAAhsaXN0TmFtZQQAAAAEbWV0YQMJAAAAAAAAAgUAAAAIbGlzdE5hbWUFAAAADXBvb2xzTGlzdE5hbWUCAAAABCVzJXMCAAAACCVzJXMlcyVzCQAEuQAAAAIJAARMAAAAAgUAAAAEbWV0YQkABEwAAAACBQAAAAhsaXN0TmFtZQkABEwAAAACAgAAAARzaXplBQAAAANuaWwFAAAACXNlcGFyYXRvcgEAAAALa2V5TGlzdFByZXYAAAACAAAACGxpc3ROYW1lAAAAAmlkBAAAAARtZXRhAwkAAAAAAAACBQAAAAhsaXN0TmFtZQUAAAANcG9vbHNMaXN0TmFtZQIAAAAIJXMlcyVzJXMCAAAACiVzJXMlcyVzJXMJAAS5AAAAAgkABEwAAAACBQAAAARtZXRhCQAETAAAAAIFAAAACGxpc3ROYW1lCQAETAAAAAIFAAAAAmlkCQAETAAAAAICAAAABHByZXYFAAAAA25pbAUAAAAJc2VwYXJhdG9yAQAAAAtrZXlMaXN0TmV4dAAAAAIAAAAIbGlzdE5hbWUAAAACaWQEAAAABG1ldGEDCQAAAAAAAAIFAAAACGxpc3ROYW1lBQAAAA1wb29sc0xpc3ROYW1lAgAAAAglcyVzJXMlcwIAAAAKJXMlcyVzJXMlcwkABLkAAAACCQAETAAAAAIFAAAABG1ldGEJAARMAAAAAgUAAAAIbGlzdE5hbWUJAARMAAAAAgUAAAACaWQJAARMAAAAAgIAAAAEbmV4dAUAAAADbmlsBQAAAAlzZXBhcmF0b3IBAAAADGNvbnRhaW5zTm9kZQAAAAIAAAAIbGlzdE5hbWUAAAACaWQEAAAACmhlYWRPclVuaXQJAAQdAAAAAgUAAAAEdGhpcwkBAAAAC2tleUxpc3RIZWFkAAAAAQUAAAAIbGlzdE5hbWUEAAAACnByZXZPclVuaXQJAAQdAAAAAgUAAAAEdGhpcwkBAAAAC2tleUxpc3RQcmV2AAAAAgUAAAAIbGlzdE5hbWUFAAAAAmlkBAAAAApuZXh0T3JVbml0CQAEHQAAAAIFAAAABHRoaXMJAQAAAAtrZXlMaXN0TmV4dAAAAAIFAAAACGxpc3ROYW1lBQAAAAJpZAMDCQAAAAAAAAIFAAAAAmlkCQEAAAALdmFsdWVPckVsc2UAAAACBQAAAApoZWFkT3JVbml0AgAAAAAGCQEAAAACIT0AAAACBQAAAApwcmV2T3JVbml0BQAAAAR1bml0BgkBAAAAAiE9AAAAAgUAAAAKbmV4dE9yVW5pdAUAAAAEdW5pdAEAAAARaW5zZXJ0Tm9kZUFjdGlvbnMAAAACAAAACGxpc3ROYW1lAAAAAmlkBAAAAApoZWFkT3JVbml0CQAEHQAAAAIFAAAABHRoaXMJAQAAAAtrZXlMaXN0SGVhZAAAAAEFAAAACGxpc3ROYW1lBAAAAAhsaXN0U2l6ZQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzCQEAAAALa2V5TGlzdFNpemUAAAABBQAAAAhsaXN0TmFtZQAAAAAAAAAAAAQAAAAJY2hlY2tOb2RlAwkBAAAAASEAAAABCQEAAAAMY29udGFpbnNOb2RlAAAAAgUAAAAIbGlzdE5hbWUFAAAAAmlkBgkAAAIAAAABAgAAAAtOb2RlIGV4aXN0cwMJAAAAAAAAAgUAAAAJY2hlY2tOb2RlBQAAAAljaGVja05vZGUJAAROAAAAAgkABE4AAAACCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAALa2V5TGlzdFNpemUAAAABBQAAAAhsaXN0TmFtZQkAAGQAAAACBQAAAAhsaXN0U2l6ZQAAAAAAAAAAAQUAAAADbmlsAwkBAAAAAiE9AAAAAgUAAAAKaGVhZE9yVW5pdAUAAAAEdW5pdAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAALa2V5TGlzdE5leHQAAAACBQAAAAhsaXN0TmFtZQUAAAACaWQJAQAAAAV2YWx1ZQAAAAEFAAAACmhlYWRPclVuaXQJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAC2tleUxpc3RQcmV2AAAAAgUAAAAIbGlzdE5hbWUJAQAAAAV2YWx1ZQAAAAEFAAAACmhlYWRPclVuaXQFAAAAAmlkBQAAAANuaWwFAAAAA25pbAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAALa2V5TGlzdEhlYWQAAAABBQAAAAhsaXN0TmFtZQUAAAACaWQFAAAAA25pbAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAAAAEWRlbGV0ZU5vZGVBY3Rpb25zAAAAAgAAAAhsaXN0TmFtZQAAAAJpZAQAAAAKaGVhZE9yVW5pdAkABB0AAAACBQAAAAR0aGlzCQEAAAALa2V5TGlzdEhlYWQAAAABBQAAAAhsaXN0TmFtZQQAAAAIbGlzdFNpemUJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwkBAAAAC2tleUxpc3RTaXplAAAAAQUAAAAIbGlzdE5hbWUAAAAAAAAAAAAEAAAACnByZXZPclVuaXQJAAQdAAAAAgUAAAAEdGhpcwkBAAAAC2tleUxpc3RQcmV2AAAAAgUAAAAIbGlzdE5hbWUFAAAAAmlkBAAAAApuZXh0T3JVbml0CQAEHQAAAAIFAAAABHRoaXMJAQAAAAtrZXlMaXN0TmV4dAAAAAIFAAAACGxpc3ROYW1lBQAAAAJpZAkABE4AAAACCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAALa2V5TGlzdFNpemUAAAABBQAAAAhsaXN0TmFtZQkAAGUAAAACBQAAAAhsaXN0U2l6ZQAAAAAAAAAAAQUAAAADbmlsAwMJAQAAAAIhPQAAAAIFAAAACnByZXZPclVuaXQFAAAABHVuaXQJAQAAAAIhPQAAAAIFAAAACm5leHRPclVuaXQFAAAABHVuaXQHCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAAAtrZXlMaXN0TmV4dAAAAAIFAAAACGxpc3ROYW1lCQEAAAAFdmFsdWUAAAABBQAAAApwcmV2T3JVbml0CQEAAAAFdmFsdWUAAAABBQAAAApuZXh0T3JVbml0CQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAAAtrZXlMaXN0UHJldgAAAAIFAAAACGxpc3ROYW1lCQEAAAAFdmFsdWUAAAABBQAAAApuZXh0T3JVbml0CQEAAAAFdmFsdWUAAAABBQAAAApwcmV2T3JVbml0CQAETAAAAAIJAQAAAAtEZWxldGVFbnRyeQAAAAEJAQAAAAtrZXlMaXN0UHJldgAAAAIFAAAACGxpc3ROYW1lBQAAAAJpZAkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABCQEAAAALa2V5TGlzdE5leHQAAAACBQAAAAhsaXN0TmFtZQUAAAACaWQFAAAAA25pbAMJAQAAAAIhPQAAAAIFAAAACm5leHRPclVuaXQFAAAABHVuaXQJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAC2tleUxpc3RIZWFkAAAAAQUAAAAIbGlzdE5hbWUJAQAAAAV2YWx1ZQAAAAEFAAAACm5leHRPclVuaXQJAARMAAAAAgkBAAAAC0RlbGV0ZUVudHJ5AAAAAQkBAAAAC2tleUxpc3ROZXh0AAAAAgUAAAAIbGlzdE5hbWUFAAAAAmlkCQAETAAAAAIJAQAAAAtEZWxldGVFbnRyeQAAAAEJAQAAAAtrZXlMaXN0UHJldgAAAAIFAAAACGxpc3ROYW1lCQEAAAAFdmFsdWUAAAABBQAAAApuZXh0T3JVbml0BQAAAANuaWwDCQEAAAACIT0AAAACBQAAAApwcmV2T3JVbml0BQAAAAR1bml0CQAETAAAAAIJAQAAAAtEZWxldGVFbnRyeQAAAAEJAQAAAAtrZXlMaXN0UHJldgAAAAIFAAAACGxpc3ROYW1lBQAAAAJpZAkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABCQEAAAALa2V5TGlzdE5leHQAAAACBQAAAAhsaXN0TmFtZQkBAAAABXZhbHVlAAAAAQUAAAAKcHJldk9yVW5pdAUAAAADbmlsAwkAAAAAAAACBQAAAAJpZAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgUAAAAKaGVhZE9yVW5pdAIAAAAACQAETAAAAAIJAQAAAAtEZWxldGVFbnRyeQAAAAEJAQAAAAtrZXlMaXN0SGVhZAAAAAEFAAAACGxpc3ROYW1lBQAAAANuaWwJAAACAAAAAQIAAAAMSW52YWxpZCBub2RlAQAAABNrZXlNYW5hZ2VyUHVibGljS2V5AAAAAAIAAAAUJXNfX21hbmFnZXJQdWJsaWNLZXkBAAAAGmtleVBlbmRpbmdNYW5hZ2VyUHVibGljS2V5AAAAAAIAAAAbJXNfX3BlbmRpbmdNYW5hZ2VyUHVibGljS2V5AQAAABZtYW5hZ2VyUHVibGljS2V5T3JVbml0AAAAAAQAAAAHJG1hdGNoMAkABCIAAAABCQEAAAATa2V5TWFuYWdlclB1YmxpY0tleQAAAAADCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABlN0cmluZwQAAAABcwUAAAAHJG1hdGNoMAkAAlkAAAABBQAAAAFzAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAARVbml0BQAAAAR1bml0CQAAAgAAAAECAAAAC01hdGNoIGVycm9yAQAAAB1wZW5kaW5nTWFuYWdlclB1YmxpY0tleU9yVW5pdAAAAAAEAAAAByRtYXRjaDAJAAQiAAAAAQkBAAAAGmtleVBlbmRpbmdNYW5hZ2VyUHVibGljS2V5AAAAAAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAGU3RyaW5nBAAAAAFzBQAAAAckbWF0Y2gwCQACWQAAAAEFAAAAAXMDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABFVuaXQFAAAABHVuaXQJAAACAAAAAQIAAAALTWF0Y2ggZXJyb3IBAAAAC211c3RNYW5hZ2VyAAAAAQAAAAFpBAAAAAJwZAkAAAIAAAABAgAAABFQZXJtaXNzaW9uIGRlbmllZAQAAAAHJG1hdGNoMAkBAAAAFm1hbmFnZXJQdWJsaWNLZXlPclVuaXQAAAAAAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAApCeXRlVmVjdG9yBAAAAAJwawUAAAAHJG1hdGNoMAMJAAAAAAAAAggFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5BQAAAAJwawYFAAAAAnBkAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAARVbml0AwkAAAAAAAACCAUAAAABaQAAAAZjYWxsZXIFAAAABHRoaXMGBQAAAAJwZAkAAAIAAAABAgAAAAtNYXRjaCBlcnJvcgAAAAoAAAABaQEAAAAKc2V0TWFuYWdlcgAAAAEAAAAXcGVuZGluZ01hbmFnZXJQdWJsaWNLZXkEAAAAC2NoZWNrQ2FsbGVyCQEAAAALbXVzdE1hbmFnZXIAAAABBQAAAAFpAwkAAAAAAAACBQAAAAtjaGVja0NhbGxlcgUAAAALY2hlY2tDYWxsZXIEAAAAFWNoZWNrTWFuYWdlclB1YmxpY0tleQkAAlkAAAABBQAAABdwZW5kaW5nTWFuYWdlclB1YmxpY0tleQMJAAAAAAAAAgUAAAAVY2hlY2tNYW5hZ2VyUHVibGljS2V5BQAAABVjaGVja01hbmFnZXJQdWJsaWNLZXkJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAGmtleVBlbmRpbmdNYW5hZ2VyUHVibGljS2V5AAAAAAUAAAAXcGVuZGluZ01hbmFnZXJQdWJsaWNLZXkFAAAAA25pbAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAWkBAAAADmNvbmZpcm1NYW5hZ2VyAAAAAAQAAAACcG0JAQAAAB1wZW5kaW5nTWFuYWdlclB1YmxpY0tleU9yVW5pdAAAAAAEAAAABWhhc1BNAwkBAAAACWlzRGVmaW5lZAAAAAEFAAAAAnBtBgkAAAIAAAABAgAAABJObyBwZW5kaW5nIG1hbmFnZXIDCQAAAAAAAAIFAAAABWhhc1BNBQAAAAVoYXNQTQQAAAAHY2hlY2tQTQMJAAAAAAAAAggFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5CQEAAAAFdmFsdWUAAAABBQAAAAJwbQYJAAACAAAAAQIAAAAbWW91IGFyZSBub3QgcGVuZGluZyBtYW5hZ2VyAwkAAAAAAAACBQAAAAdjaGVja1BNBQAAAAdjaGVja1BNCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABNrZXlNYW5hZ2VyUHVibGljS2V5AAAAAAkAAlgAAAABCQEAAAAFdmFsdWUAAAABBQAAAAJwbQkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABCQEAAAAaa2V5UGVuZGluZ01hbmFnZXJQdWJsaWNLZXkAAAAABQAAAANuaWwJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgAAAAFpAQAAABhnZXRVc2VyR3d4QW1vdW50QXRIZWlnaHQAAAACAAAAC3VzZXJBZGRyZXNzAAAADHRhcmdldEhlaWdodAQAAAAXYm9vc3RpbmdDb250cmFjdEFkZHJlc3MJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABCYAAAABCQEAAAAMZ2V0U3RyT3JGYWlsAAAAAgUAAAAEdGhpcwUAAAATa2V5Qm9vc3RpbmdDb250cmFjdAIAAAAhaW52YWxpZCBib29zdGluZyBjb250cmFjdCBhZGRyZXNzCQAFFAAAAAIFAAAAA25pbAoAAAAAAUAJAAP8AAAABAUAAAAXYm9vc3RpbmdDb250cmFjdEFkZHJlc3MCAAAAIGdldFVzZXJHd3hBbW91bnRBdEhlaWdodFJFQURPTkxZCQAETAAAAAIFAAAAC3VzZXJBZGRyZXNzCQAETAAAAAIFAAAADHRhcmdldEhlaWdodAUAAAADbmlsBQAAAANuaWwDCQAAAQAAAAIFAAAAAUACAAAAA0ludAUAAAABQAkAAAIAAAABAgAAABhDb3VsZG4ndCBjYXN0IEFueSB0byBJbnQAAAABaQEAAAALY29uc3RydWN0b3IAAAADAAAAH3ZvdGluZ0VtaXNzaW9uQ2FuZGlkYXRlQ29udHJhY3QAAAAQYm9vc3RpbmdDb250cmFjdAAAAAtlcG9jaExlbmd0aAQAAAAFY2hla3MJAARMAAAAAgkBAAAAC211c3RNYW5hZ2VyAAAAAQUAAAABaQkABEwAAAACAwkBAAAAAiE9AAAAAgkABCYAAAABBQAAAB92b3RpbmdFbWlzc2lvbkNhbmRpZGF0ZUNvbnRyYWN0BQAAAAR1bml0BgIAAAAyaW52YWxpZCB2b3RpbmcgZW1pc3Npb24gY2FuZGlkYXRlIGNvbnRyYWN0IGFkZHJlc3MJAARMAAAAAgMJAQAAAAIhPQAAAAIJAAQmAAAAAQUAAAAQYm9vc3RpbmdDb250cmFjdAUAAAAEdW5pdAYCAAAAIWludmFsaWQgYm9vc3RpbmcgY29udHJhY3QgYWRkcmVzcwkABEwAAAACAwkAAGYAAAACBQAAAAtlcG9jaExlbmd0aAAAAAAAAAAAAAYJAAACAAAAAQIAAAAUaW52YWxpZCBlcG9jaCBsZW5ndGgFAAAAA25pbAMJAAAAAAAAAgUAAAAFY2hla3MFAAAABWNoZWtzCQAFFAAAAAIJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAAia2V5Vm90aW5nRW1pc3Npb25DYW5kaWRhdGVDb250cmFjdAUAAAAfdm90aW5nRW1pc3Npb25DYW5kaWRhdGVDb250cmFjdAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACBQAAABNrZXlCb29zdGluZ0NvbnRyYWN0BQAAABBib29zdGluZ0NvbnRyYWN0CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAA5rZXlFcG9jaExlbmd0aAUAAAALZXBvY2hMZW5ndGgFAAAAA25pbAUAAAAEdW5pdAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAABaQEAAAAGY3JlYXRlAAAAAgAAAA1hbW91bnRBc3NldElkAAAADHByaWNlQXNzZXRJZAQAAAAGY2hlY2tzCQAETAAAAAIDCQAAAAAAAAIJAAJYAAAAAQgIBQAAAAFpAAAABmNhbGxlcgAAAAVieXRlcwkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABB0AAAACBQAAAAR0aGlzBQAAACJrZXlWb3RpbmdFbWlzc2lvbkNhbmRpZGF0ZUNvbnRyYWN0AgAAAAAGCQEAAAALbXVzdE1hbmFnZXIAAAABBQAAAAFpBQAAAANuaWwDCQAAAAAAAAIFAAAABmNoZWNrcwUAAAAGY2hlY2tzBAAAAARwb29sCQAFFAAAAAIFAAAADWFtb3VudEFzc2V0SWQFAAAADHByaWNlQXNzZXRJZAQAAAANaW5MaXN0QWN0aW9ucwkABE4AAAACCQAETAAAAAIJAQAAAAxCb29sZWFuRW50cnkAAAACCQEAAAAJa2V5SW5MaXN0AAAAAQUAAAAEcG9vbAYFAAAAA25pbAkBAAAAEWluc2VydE5vZGVBY3Rpb25zAAAAAgUAAAANcG9vbHNMaXN0TmFtZQkBAAAADHBvb2xUb1N0cmluZwAAAAEFAAAABHBvb2wEAAAAF3N0YXJ0SGVpZ2h0SXNOb3REZWZpbmVkCQAAAAAAAAIJAAQdAAAAAgUAAAAEdGhpcwUAAAAOa2V5U3RhcnRIZWlnaHQFAAAABHVuaXQEAAAAEnN0YXJ0SGVpZ2h0QWN0aW9ucwMFAAAAF3N0YXJ0SGVpZ2h0SXNOb3REZWZpbmVkCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAA9rZXlDdXJyZW50RXBvY2gAAAAAAAAAAAAJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAADmtleVN0YXJ0SGVpZ2h0BQAAAAZoZWlnaHQFAAAAA25pbAUAAAADbmlsCQAFFAAAAAIJAAROAAAAAgUAAAANaW5MaXN0QWN0aW9ucwUAAAASc3RhcnRIZWlnaHRBY3Rpb25zBQAAAAR1bml0CQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgAAAAFpAQAAAAR2b3RlAAAAAwAAAA1hbW91bnRBc3NldElkAAAADHByaWNlQXNzZXRJZAAAAAZhbW91bnQEAAAABHBvb2wJAAUUAAAAAgUAAAANYW1vdW50QXNzZXRJZAUAAAAMcHJpY2VBc3NldElkBAAAAAtzdGFydEhlaWdodAkBAAAADGdldEludE9yRmFpbAAAAAIFAAAABHRoaXMFAAAADmtleVN0YXJ0SGVpZ2h0BAAAAAtlcG9jaExlbmd0aAkBAAAADGdldEludE9yRmFpbAAAAAIFAAAABHRoaXMFAAAADmtleUVwb2NoTGVuZ3RoBAAAAAllbmRIZWlnaHQJAABkAAAAAgUAAAALc3RhcnRIZWlnaHQFAAAAC2Vwb2NoTGVuZ3RoBAAAAAVlcG9jaAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzBQAAAA9rZXlDdXJyZW50RXBvY2gAAAAAAAAAAAAEAAAABHVzZWQJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwkBAAAAB2tleVVzZWQAAAACCAUAAAABaQAAAAZjYWxsZXIFAAAABWVwb2NoAAAAAAAAAAAABAAAAAR2b3RlCQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMJAQAAAAdrZXlWb3RlAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAARwb29sBQAAAAVlcG9jaAAAAAAAAAAAAAQAAAAKcG9vbFJlc3VsdAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzCQEAAAAPa2V5Vm90aW5nUmVzdWx0AAAAAgUAAAAEcG9vbAUAAAAFZXBvY2gAAAAAAAAAAAAEAAAACnRvdGFsVm90ZXMJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwkBAAAADWtleVRvdGFsVm90ZXMAAAABBQAAAAVlcG9jaAAAAAAAAAAAAAQAAAATZ3d4QW1vdW50QXRFbmRUb3RhbAoAAAAAAUAJAAP8AAAABAUAAAAEdGhpcwIAAAAYZ2V0VXNlckd3eEFtb3VudEF0SGVpZ2h0CQAETAAAAAIJAAJYAAAAAQgIBQAAAAFpAAAABmNhbGxlcgAAAAVieXRlcwkABEwAAAACBQAAAAllbmRIZWlnaHQFAAAAA25pbAUAAAADbmlsAwkAAAEAAAACBQAAAAFAAgAAAANJbnQFAAAAAUAJAAACAAAAAQIAAAAYQ291bGRuJ3QgY2FzdCBBbnkgdG8gSW50BAAAAAlhdmFpbGFibGUJAABlAAAAAgUAAAATZ3d4QW1vdW50QXRFbmRUb3RhbAUAAAAEdXNlZAQAAAAHbmV3Vm90ZQkAAGQAAAACBQAAAAR2b3RlBQAAAAZhbW91bnQEAAAABmNoZWNrcwkABEwAAAACAwkBAAAAAiE9AAAAAgkABCAAAAABCQEAAAAJa2V5SW5MaXN0AAAAAQUAAAAEcG9vbAUAAAAEdW5pdAYJAAACAAAAAQIAAAAOaW52YWxpZCBhc3NldHMJAARMAAAAAgMJAABmAAAAAgUAAAAJZW5kSGVpZ2h0BQAAAAZoZWlnaHQGCQAAAgAAAAECAAAADmludmFsaWQgaGVpZ2h0CQAETAAAAAIDCQAAZgAAAAIFAAAAE2d3eEFtb3VudEF0RW5kVG90YWwAAAAAAAAAAAAGCQAAAgAAAAECAAAAE3lvdSBkbyBub3QgaGF2ZSBnV1gJAARMAAAAAgMDCQAAZgAAAAIFAAAABmFtb3VudAAAAAAAAAAAAAkAAGcAAAACBQAAAAlhdmFpbGFibGUFAAAABmFtb3VudAcGCQAAAgAAAAECAAAADmludmFsaWQgYW1vdW50BQAAAANuaWwDCQAAAAAAAAIFAAAABmNoZWNrcwUAAAAGY2hlY2tzBAAAAA12b3Rlc0xpc3ROYW1lCQEAAAAQZ2V0Vm90ZXNMaXN0TmFtZQAAAAEFAAAABHBvb2wEAAAACnBvb2xTdHJpbmcJAQAAAAxwb29sVG9TdHJpbmcAAAABBQAAAARwb29sBAAAABB2b3Rlc0xpc3RBY3Rpb25zAwkBAAAADGNvbnRhaW5zTm9kZQAAAAIFAAAADXZvdGVzTGlzdE5hbWUFAAAACnBvb2xTdHJpbmcFAAAAA25pbAkBAAAAEWluc2VydE5vZGVBY3Rpb25zAAAAAgUAAAANdm90ZXNMaXN0TmFtZQUAAAAKcG9vbFN0cmluZwkABRQAAAACCQAETgAAAAIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAAAdrZXlVc2VkAAAAAggFAAAAAWkAAAAGY2FsbGVyBQAAAAVlcG9jaAkAAGQAAAACBQAAAAR1c2VkBQAAAAZhbW91bnQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAAAdrZXlWb3RlAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAARwb29sBQAAAAVlcG9jaAUAAAAHbmV3Vm90ZQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAD2tleVZvdGluZ1Jlc3VsdAAAAAIFAAAABHBvb2wFAAAABWVwb2NoCQAAZAAAAAIFAAAACnBvb2xSZXN1bHQFAAAABmFtb3VudAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAADWtleVRvdGFsVm90ZXMAAAABBQAAAAVlcG9jaAkAAGQAAAACBQAAAAp0b3RhbFZvdGVzBQAAAAZhbW91bnQFAAAAA25pbAUAAAAQdm90ZXNMaXN0QWN0aW9ucwUAAAAEdW5pdAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAABaQEAAAAKY2FuY2VsVm90ZQAAAAIAAAANYW1vdW50QXNzZXRJZAAAAAxwcmljZUFzc2V0SWQEAAAABHBvb2wJAAUUAAAAAgUAAAANYW1vdW50QXNzZXRJZAUAAAAMcHJpY2VBc3NldElkBAAAAAtzdGFydEhlaWdodAkBAAAADGdldEludE9yRmFpbAAAAAIFAAAABHRoaXMFAAAADmtleVN0YXJ0SGVpZ2h0BAAAAAtlcG9jaExlbmd0aAkBAAAADGdldEludE9yRmFpbAAAAAIFAAAABHRoaXMFAAAADmtleUVwb2NoTGVuZ3RoBAAAAAllbmRIZWlnaHQJAABkAAAAAgUAAAALc3RhcnRIZWlnaHQFAAAAC2Vwb2NoTGVuZ3RoBAAAAAVlcG9jaAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzBQAAAA9rZXlDdXJyZW50RXBvY2gAAAAAAAAAAAAEAAAABHVzZWQJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwkBAAAAB2tleVVzZWQAAAACCAUAAAABaQAAAAZjYWxsZXIFAAAABWVwb2NoAAAAAAAAAAAABAAAAAR2b3RlCQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMJAQAAAAdrZXlWb3RlAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAARwb29sBQAAAAVlcG9jaAAAAAAAAAAAAAQAAAAKcG9vbFJlc3VsdAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzCQEAAAAPa2V5Vm90aW5nUmVzdWx0AAAAAgUAAAAEcG9vbAUAAAAFZXBvY2gAAAAAAAAAAAAEAAAACnRvdGFsVm90ZXMJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwkBAAAADWtleVRvdGFsVm90ZXMAAAABBQAAAAVlcG9jaAAAAAAAAAAAAAQAAAAGY2hlY2tzCQAETAAAAAIDCQEAAAACIT0AAAACCQAEIAAAAAEJAQAAAAlrZXlJbkxpc3QAAAABBQAAAARwb29sBQAAAAR1bml0BgkAAAIAAAABAgAAAA5pbnZhbGlkIGFzc2V0cwkABEwAAAACAwkAAGYAAAACBQAAAAllbmRIZWlnaHQFAAAABmhlaWdodAYJAAACAAAAAQIAAAAOaW52YWxpZCBoZWlnaHQJAARMAAAAAgMJAABmAAAAAgUAAAAEdm90ZQAAAAAAAAAAAAYJAAACAAAAAQIAAAAHbm8gdm90ZQUAAAADbmlsAwkAAAAAAAACBQAAAAZjaGVja3MFAAAABmNoZWNrcwQAAAANdm90ZXNMaXN0TmFtZQkBAAAAEGdldFZvdGVzTGlzdE5hbWUAAAABBQAAAARwb29sBAAAAApwb29sU3RyaW5nCQEAAAAMcG9vbFRvU3RyaW5nAAAAAQUAAAAEcG9vbAkABRQAAAACCQAETgAAAAIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAAAdrZXlVc2VkAAAAAggFAAAAAWkAAAAGY2FsbGVyBQAAAAVlcG9jaAkAAZYAAAABCQAETAAAAAIJAABlAAAAAgUAAAAEdXNlZAUAAAAEdm90ZQkABEwAAAACAAAAAAAAAAAABQAAAANuaWwJAARMAAAAAgkBAAAAC0RlbGV0ZUVudHJ5AAAAAQkBAAAAB2tleVZvdGUAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAABHBvb2wFAAAABWVwb2NoCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAPa2V5Vm90aW5nUmVzdWx0AAAAAgUAAAAEcG9vbAUAAAAFZXBvY2gJAABlAAAAAgUAAAAKcG9vbFJlc3VsdAUAAAAEdm90ZQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAADWtleVRvdGFsVm90ZXMAAAABBQAAAAVlcG9jaAkAAGUAAAACBQAAAAp0b3RhbFZvdGVzBQAAAAR2b3RlBQAAAANuaWwJAQAAABFkZWxldGVOb2RlQWN0aW9ucwAAAAIFAAAADXZvdGVzTGlzdE5hbWUFAAAACnBvb2xTdHJpbmcFAAAABHVuaXQJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAWkBAAAADnNldEVwb2NoTGVuZ3RoAAAAAQAAAA5uZXdFcG9jaExlbmd0aAQAAAAFY2hla3MJAARMAAAAAgkBAAAAC211c3RNYW5hZ2VyAAAAAQUAAAABaQkABEwAAAACAwkAAGYAAAACBQAAAA5uZXdFcG9jaExlbmd0aAAAAAAAAAAAAAYJAAACAAAAAQIAAAAUaW52YWxpZCBlcG9jaCBsZW5ndGgFAAAAA25pbAMJAAAAAAAAAgUAAAAFY2hla3MFAAAABWNoZWtzCQAFFAAAAAIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAADmtleUVwb2NoTGVuZ3RoBQAAAA5uZXdFcG9jaExlbmd0aAUAAAADbmlsBQAAAAR1bml0CQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgAAAAFpAQAAAAhmaW5hbGl6ZQAAAAAJAAUUAAAAAgUAAAADbmlsBQAAAAR1bml0AAAAAWkBAAAAEm9uVmVyaWZpY2F0aW9uTG9zcwAAAAEAAAAHYXNzZXRJZAkABRQAAAACBQAAAANuaWwFAAAABHVuaXQAAAABAAAAAnR4AQAAAAZ2ZXJpZnkAAAAABAAAAA90YXJnZXRQdWJsaWNLZXkEAAAAByRtYXRjaDAJAQAAABZtYW5hZ2VyUHVibGljS2V5T3JVbml0AAAAAAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAKQnl0ZVZlY3RvcgQAAAACcGsFAAAAByRtYXRjaDAFAAAAAnBrAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAARVbml0CAUAAAACdHgAAAAPc2VuZGVyUHVibGljS2V5CQAAAgAAAAECAAAAC01hdGNoIGVycm9yCQAB9AAAAAMIBQAAAAJ0eAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAnR4AAAABnByb29mcwAAAAAAAAAAAAUAAAAPdGFyZ2V0UHVibGljS2V5k2Xusw==", "chainId": 84, "height": 2084618, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: AcP9fHThEBmPtsUuoQ7o4yrnxLXhSXkaAKGnc3jRNGvr Next: 2ckhnPmFDhBrmzLc95dfUtfFKT4RYizrSE15CyVDUmSu Diff:
OldNewDifferences
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let separator = "__"
5-
6-let maxShare = 100
75
86 let keyEpochLength = makeString(["%s", "epochLength"], separator)
97
1614 let keyBoostingContract = makeString(["%s", "boostingContract"], separator)
1715
1816 func keyInList (pool) = {
19- let $t0594634 = pool
20- let amountAssetId = $t0594634._1
21- let priceAssetId = $t0594634._2
17+ let $t0575615 = pool
18+ let amountAssetId = $t0575615._1
19+ let priceAssetId = $t0575615._2
2220 makeString(["%s%s%s", "inList", amountAssetId, priceAssetId], separator)
2321 }
2422
2523
26-func keyShareUsed (address) = makeString(["%s%s", "shareUsed", toString(address)], separator)
24+func keyUsed (address,epoch) = makeString(["%s%s%d", "used", toString(address), toString(epoch)], separator)
2725
2826
29-func keyVoteShare (address,pool) = {
30- let $t0879919 = pool
31- let amountAssetId = $t0879919._1
32- let priceAssetId = $t0879919._2
33- makeString(["%s%s%s%s", "voteShare", amountAssetId, priceAssetId, toString(address)], separator)
27+func keyVote (address,pool,epoch) = {
28+ let $t0889929 = pool
29+ let amountAssetId = $t0889929._1
30+ let priceAssetId = $t0889929._2
31+ makeString(["%s%s%s%s%d", "vote", amountAssetId, priceAssetId, toString(address), toString(epoch)], separator)
3432 }
3533
3634
37-func keyVotingResult (pool) = {
38- let $t013181358 = pool
39- let amountAssetId = $t013181358._1
40- let priceAssetId = $t013181358._2
41- makeString(["%s%s%s", "votingResult", amountAssetId, priceAssetId], separator)
35+func keyVotingResult (pool,epoch) = {
36+ let $t011111151 = pool
37+ let amountAssetId = $t011111151._1
38+ let priceAssetId = $t011111151._2
39+ makeString(["%s%s%s%d", "votingResult", amountAssetId, priceAssetId, toString(epoch)], separator)
4240 }
41+
42+
43+func keyTotalVotes (epoch) = makeString(["%s%d", "totalVotes", toString(epoch)], separator)
4344
4445
4546 func getValueOrFail (address,key,type) = {
7172 }
7273
7374
74-let poolsListName = "__pools"
75+func poolToString (pool) = ((pool._1 + separator) + pool._2)
7576
76-func getVotesListName (pool) = {
77- let $t021122152 = pool
78- let amountAssetId = $t021122152._1
79- let priceAssetId = $t021122152._2
80- makeString(["%s%s__votes", amountAssetId, priceAssetId], separator)
77+
78+func stringToPool (str) = {
79+ let parts = split(str, separator)
80+ if ((size(parts) == 2))
81+ then $Tuple2(parts[0], parts[1])
82+ else throw("invalid pool string")
8183 }
8284
8385
84-func keyListHead (listName) = makeString([("%s%s" + listName), "head"], separator)
86+let poolsListName = "pools"
87+
88+func getVotesListName (pool) = {
89+ let $t022602300 = pool
90+ let amountAssetId = $t022602300._1
91+ let priceAssetId = $t022602300._2
92+ makeString(["votes", amountAssetId, priceAssetId], separator)
93+ }
8594
8695
87-func keyListSize (listName) = makeString([("%s%s" + listName), "size"], separator)
96+func keyListHead (listName) = {
97+ let meta = if ((listName == poolsListName))
98+ then "%s%s"
99+ else "%s%s%s%s"
100+ makeString([meta, listName, "head"], separator)
101+ }
88102
89103
90-func keyListPrev (listName,id) = makeString([("%s%s%s" + listName), id, "prev"], separator)
104+func keyListSize (listName) = {
105+ let meta = if ((listName == poolsListName))
106+ then "%s%s"
107+ else "%s%s%s%s"
108+ makeString([meta, listName, "size"], separator)
109+ }
91110
92111
93-func keyListNext (listName,id) = makeString([("%s%s%s" + listName), id, "next"], separator)
112+func keyListPrev (listName,id) = {
113+ let meta = if ((listName == poolsListName))
114+ then "%s%s%s%s"
115+ else "%s%s%s%s%s"
116+ makeString([meta, listName, id, "prev"], separator)
117+ }
118+
119+
120+func keyListNext (listName,id) = {
121+ let meta = if ((listName == poolsListName))
122+ then "%s%s%s%s"
123+ else "%s%s%s%s%s"
124+ makeString([meta, listName, id, "next"], separator)
125+ }
94126
95127
96128 func containsNode (listName,id) = {
97- let head = valueOrElse(getString(this, keyListHead(listName)), "")
98- let prev = getString(this, keyListPrev(listName, id))
99- let next = getString(this, keyListNext(listName, id))
100- if (if ((id == head))
129+ let headOrUnit = getString(this, keyListHead(listName))
130+ let prevOrUnit = getString(this, keyListPrev(listName, id))
131+ let nextOrUnit = getString(this, keyListNext(listName, id))
132+ if (if ((id == valueOrElse(headOrUnit, "")))
101133 then true
102- else (prev != unit))
134+ else (prevOrUnit != unit))
103135 then true
104- else (next != unit)
136+ else (nextOrUnit != unit)
105137 }
106138
107139
108140 func insertNodeActions (listName,id) = {
109- let head = getString(this, keyListHead(listName))
141+ let headOrUnit = getString(this, keyListHead(listName))
110142 let listSize = valueOrElse(getInteger(this, keyListSize(listName)), 0)
111143 let checkNode = if (!(containsNode(listName, id)))
112144 then true
113145 else throw("Node exists")
114146 if ((checkNode == checkNode))
115- then (([IntegerEntry(keyListSize(listName), (listSize + 1))] ++ (if (isDefined(head))
116- then [StringEntry(keyListNext(listName, id), value(head)), StringEntry(keyListPrev(listName, value(head)), id)]
147+ then (([IntegerEntry(keyListSize(listName), (listSize + 1))] ++ (if ((headOrUnit != unit))
148+ then [StringEntry(keyListNext(listName, id), value(headOrUnit)), StringEntry(keyListPrev(listName, value(headOrUnit)), id)]
117149 else nil)) ++ [StringEntry(keyListHead(listName), id)])
118150 else throw("Strict value is not equal to itself.")
119151 }
120152
121153
122154 func deleteNodeActions (listName,id) = {
123- let head = getString(this, keyListHead(listName))
155+ let headOrUnit = getString(this, keyListHead(listName))
124156 let listSize = valueOrElse(getInteger(this, keyListSize(listName)), 0)
125- let prev = getString(this, keyListPrev(listName, id))
126- let next = getString(this, keyListNext(listName, id))
127- ([IntegerEntry(keyListSize(listName), (listSize - 1))] ++ (if (if (isDefined(prev))
128- then isDefined(next)
157+ let prevOrUnit = getString(this, keyListPrev(listName, id))
158+ let nextOrUnit = getString(this, keyListNext(listName, id))
159+ ([IntegerEntry(keyListSize(listName), (listSize - 1))] ++ (if (if ((prevOrUnit != unit))
160+ then (nextOrUnit != unit)
129161 else false)
130- then [StringEntry(keyListNext(listName, value(prev)), value(next)), StringEntry(keyListPrev(listName, value(next)), value(prev)), DeleteEntry(keyListPrev(listName, id)), DeleteEntry(keyListNext(listName, id))]
131- else if (isDefined(next))
132- then [StringEntry(keyListHead(listName), value(next)), DeleteEntry(keyListNext(listName, id)), DeleteEntry(keyListPrev(listName, value(next)))]
133- else if (isDefined(prev))
134- then [DeleteEntry(keyListPrev(listName, id)), DeleteEntry(keyListNext(listName, value(prev)))]
135- else if ((id == head))
162+ then [StringEntry(keyListNext(listName, value(prevOrUnit)), value(nextOrUnit)), StringEntry(keyListPrev(listName, value(nextOrUnit)), value(prevOrUnit)), DeleteEntry(keyListPrev(listName, id)), DeleteEntry(keyListNext(listName, id))]
163+ else if ((nextOrUnit != unit))
164+ then [StringEntry(keyListHead(listName), value(nextOrUnit)), DeleteEntry(keyListNext(listName, id)), DeleteEntry(keyListPrev(listName, value(nextOrUnit)))]
165+ else if ((prevOrUnit != unit))
166+ then [DeleteEntry(keyListPrev(listName, id)), DeleteEntry(keyListNext(listName, value(prevOrUnit)))]
167+ else if ((id == valueOrElse(headOrUnit, "")))
136168 then [DeleteEntry(keyListHead(listName))]
137169 else throw("Invalid node")))
138170 }
253285 if ((checks == checks))
254286 then {
255287 let pool = $Tuple2(amountAssetId, priceAssetId)
256- let inListActions = [BooleanEntry(keyInList(pool), true)]
288+ let inListActions = ([BooleanEntry(keyInList(pool), true)] ++ insertNodeActions(poolsListName, poolToString(pool)))
257289 let startHeightIsNotDefined = (getString(this, keyStartHeight) == unit)
258290 let startHeightActions = if (startHeightIsNotDefined)
259291 then [IntegerEntry(keyCurrentEpoch, 0), IntegerEntry(keyStartHeight, height)]
266298
267299
268300 @Callable(i)
269-func vote (amountAssetId,priceAssetId,share) = {
301+func vote (amountAssetId,priceAssetId,amount) = {
270302 let pool = $Tuple2(amountAssetId, priceAssetId)
271303 let startHeight = getIntOrFail(this, keyStartHeight)
272304 let epochLength = getIntOrFail(this, keyEpochLength)
273305 let endHeight = (startHeight + epochLength)
274- let shareUsed = valueOrElse(getInteger(this, keyShareUsed(i.caller)), 0)
275- let poolVoteShare = valueOrElse(getInteger(this, keyVoteShare(i.caller, pool)), 0)
276- let userMaxShare = (maxShare - shareUsed)
277- let newShare = (poolVoteShare + share)
306+ let epoch = valueOrElse(getInteger(this, keyCurrentEpoch), 0)
307+ let used = valueOrElse(getInteger(this, keyUsed(i.caller, epoch)), 0)
308+ let vote = valueOrElse(getInteger(this, keyVote(i.caller, pool, epoch)), 0)
309+ let poolResult = valueOrElse(getInteger(this, keyVotingResult(pool, epoch)), 0)
310+ let totalVotes = valueOrElse(getInteger(this, keyTotalVotes(epoch)), 0)
278311 let gwxAmountAtEndTotal = {
279312 let @ = invoke(this, "getUserGwxAmountAtHeight", [toBase58String(i.caller.bytes), endHeight], nil)
280313 if ($isInstanceOf(@, "Int"))
281314 then @
282315 else throw("Couldn't cast Any to Int")
283316 }
284- let gwxAmountAtEnd = fraction(gwxAmountAtEndTotal, newShare, maxShare)
317+ let available = (gwxAmountAtEndTotal - used)
318+ let newVote = (vote + amount)
285319 let checks = [if ((getBoolean(keyInList(pool)) != unit))
286320 then true
287321 else throw("invalid assets"), if ((endHeight > height))
288322 then true
289- else throw("invalid height"), if ((gwxAmountAtEnd > 0))
323+ else throw("invalid height"), if ((gwxAmountAtEndTotal > 0))
290324 then true
291- else throw("you do not have gWX"), if (if ((share > 0))
292- then (userMaxShare >= share)
325+ else throw("you do not have gWX"), if (if ((amount > 0))
326+ then (available >= amount)
293327 else false)
294328 then true
295- else throw("invalid share")]
329+ else throw("invalid amount")]
296330 if ((checks == checks))
297- then $Tuple2([IntegerEntry(keyShareUsed(i.caller), (shareUsed + share)), IntegerEntry(keyVoteShare(i.caller, pool), newShare)], unit)
331+ then {
332+ let votesListName = getVotesListName(pool)
333+ let poolString = poolToString(pool)
334+ let votesListActions = if (containsNode(votesListName, poolString))
335+ then nil
336+ else insertNodeActions(votesListName, poolString)
337+ $Tuple2(([IntegerEntry(keyUsed(i.caller, epoch), (used + amount)), IntegerEntry(keyVote(i.caller, pool, epoch), newVote), IntegerEntry(keyVotingResult(pool, epoch), (poolResult + amount)), IntegerEntry(keyTotalVotes(epoch), (totalVotes + amount))] ++ votesListActions), unit)
338+ }
298339 else throw("Strict value is not equal to itself.")
299340 }
300341
306347 let startHeight = getIntOrFail(this, keyStartHeight)
307348 let epochLength = getIntOrFail(this, keyEpochLength)
308349 let endHeight = (startHeight + epochLength)
309- let poolVoteShare = valueOrElse(getInteger(this, keyVoteShare(i.caller, pool)), 0)
310- let shareUsed = valueOrElse(getInteger(this, keyShareUsed(i.caller)), 0)
350+ let epoch = valueOrElse(getInteger(this, keyCurrentEpoch), 0)
351+ let used = valueOrElse(getInteger(this, keyUsed(i.caller, epoch)), 0)
352+ let vote = valueOrElse(getInteger(this, keyVote(i.caller, pool, epoch)), 0)
353+ let poolResult = valueOrElse(getInteger(this, keyVotingResult(pool, epoch)), 0)
354+ let totalVotes = valueOrElse(getInteger(this, keyTotalVotes(epoch)), 0)
311355 let checks = [if ((getBoolean(keyInList(pool)) != unit))
312356 then true
313357 else throw("invalid assets"), if ((endHeight > height))
314358 then true
315- else throw("invalid height"), if ((poolVoteShare > 0))
359+ else throw("invalid height"), if ((vote > 0))
316360 then true
317361 else throw("no vote")]
318362 if ((checks == checks))
319- then $Tuple2([IntegerEntry(keyShareUsed(i.caller), max([(shareUsed - poolVoteShare), 0])), DeleteEntry(keyVoteShare(i.caller, pool))], unit)
363+ then {
364+ let votesListName = getVotesListName(pool)
365+ let poolString = poolToString(pool)
366+ $Tuple2(([IntegerEntry(keyUsed(i.caller, epoch), max([(used - vote), 0])), DeleteEntry(keyVote(i.caller, pool, epoch)), IntegerEntry(keyVotingResult(pool, epoch), (poolResult - vote)), IntegerEntry(keyTotalVotes(epoch), (totalVotes - vote))] ++ deleteNodeActions(votesListName, poolString)), unit)
367+ }
320368 else throw("Strict value is not equal to itself.")
321369 }
322370
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let separator = "__"
5-
6-let maxShare = 100
75
86 let keyEpochLength = makeString(["%s", "epochLength"], separator)
97
108 let keyCurrentEpoch = makeString(["%s", "currentEpoch"], separator)
119
1210 let keyStartHeight = makeString(["%s", "startHeight"], separator)
1311
1412 let keyVotingEmissionCandidateContract = makeString(["%s", "votingEmissionCandidateContract"], separator)
1513
1614 let keyBoostingContract = makeString(["%s", "boostingContract"], separator)
1715
1816 func keyInList (pool) = {
19- let $t0594634 = pool
20- let amountAssetId = $t0594634._1
21- let priceAssetId = $t0594634._2
17+ let $t0575615 = pool
18+ let amountAssetId = $t0575615._1
19+ let priceAssetId = $t0575615._2
2220 makeString(["%s%s%s", "inList", amountAssetId, priceAssetId], separator)
2321 }
2422
2523
26-func keyShareUsed (address) = makeString(["%s%s", "shareUsed", toString(address)], separator)
24+func keyUsed (address,epoch) = makeString(["%s%s%d", "used", toString(address), toString(epoch)], separator)
2725
2826
29-func keyVoteShare (address,pool) = {
30- let $t0879919 = pool
31- let amountAssetId = $t0879919._1
32- let priceAssetId = $t0879919._2
33- makeString(["%s%s%s%s", "voteShare", amountAssetId, priceAssetId, toString(address)], separator)
27+func keyVote (address,pool,epoch) = {
28+ let $t0889929 = pool
29+ let amountAssetId = $t0889929._1
30+ let priceAssetId = $t0889929._2
31+ makeString(["%s%s%s%s%d", "vote", amountAssetId, priceAssetId, toString(address), toString(epoch)], separator)
3432 }
3533
3634
37-func keyVotingResult (pool) = {
38- let $t013181358 = pool
39- let amountAssetId = $t013181358._1
40- let priceAssetId = $t013181358._2
41- makeString(["%s%s%s", "votingResult", amountAssetId, priceAssetId], separator)
35+func keyVotingResult (pool,epoch) = {
36+ let $t011111151 = pool
37+ let amountAssetId = $t011111151._1
38+ let priceAssetId = $t011111151._2
39+ makeString(["%s%s%s%d", "votingResult", amountAssetId, priceAssetId, toString(epoch)], separator)
4240 }
41+
42+
43+func keyTotalVotes (epoch) = makeString(["%s%d", "totalVotes", toString(epoch)], separator)
4344
4445
4546 func getValueOrFail (address,key,type) = {
4647 let error = makeString(["mandatory ", toString(address), ".", key, " is not defined"], "")
4748 valueOrErrorMessage( match type {
4849 case str: String =>
4950 getString(address, key)
5051 case int: Int =>
5152 getInteger(address, key)
5253 case _ =>
5354 throw("invalid entry type")
5455 }, error)
5556 }
5657
5758
5859 func getStrOrFail (address,key) = {
5960 let @ = getValueOrFail(address, key, "")
6061 if ($isInstanceOf(@, "String"))
6162 then @
6263 else throw("Couldn't cast Int|String to String")
6364 }
6465
6566
6667 func getIntOrFail (address,key) = {
6768 let @ = getValueOrFail(address, key, 0)
6869 if ($isInstanceOf(@, "Int"))
6970 then @
7071 else throw("Couldn't cast Int|String to Int")
7172 }
7273
7374
74-let poolsListName = "__pools"
75+func poolToString (pool) = ((pool._1 + separator) + pool._2)
7576
76-func getVotesListName (pool) = {
77- let $t021122152 = pool
78- let amountAssetId = $t021122152._1
79- let priceAssetId = $t021122152._2
80- makeString(["%s%s__votes", amountAssetId, priceAssetId], separator)
77+
78+func stringToPool (str) = {
79+ let parts = split(str, separator)
80+ if ((size(parts) == 2))
81+ then $Tuple2(parts[0], parts[1])
82+ else throw("invalid pool string")
8183 }
8284
8385
84-func keyListHead (listName) = makeString([("%s%s" + listName), "head"], separator)
86+let poolsListName = "pools"
87+
88+func getVotesListName (pool) = {
89+ let $t022602300 = pool
90+ let amountAssetId = $t022602300._1
91+ let priceAssetId = $t022602300._2
92+ makeString(["votes", amountAssetId, priceAssetId], separator)
93+ }
8594
8695
87-func keyListSize (listName) = makeString([("%s%s" + listName), "size"], separator)
96+func keyListHead (listName) = {
97+ let meta = if ((listName == poolsListName))
98+ then "%s%s"
99+ else "%s%s%s%s"
100+ makeString([meta, listName, "head"], separator)
101+ }
88102
89103
90-func keyListPrev (listName,id) = makeString([("%s%s%s" + listName), id, "prev"], separator)
104+func keyListSize (listName) = {
105+ let meta = if ((listName == poolsListName))
106+ then "%s%s"
107+ else "%s%s%s%s"
108+ makeString([meta, listName, "size"], separator)
109+ }
91110
92111
93-func keyListNext (listName,id) = makeString([("%s%s%s" + listName), id, "next"], separator)
112+func keyListPrev (listName,id) = {
113+ let meta = if ((listName == poolsListName))
114+ then "%s%s%s%s"
115+ else "%s%s%s%s%s"
116+ makeString([meta, listName, id, "prev"], separator)
117+ }
118+
119+
120+func keyListNext (listName,id) = {
121+ let meta = if ((listName == poolsListName))
122+ then "%s%s%s%s"
123+ else "%s%s%s%s%s"
124+ makeString([meta, listName, id, "next"], separator)
125+ }
94126
95127
96128 func containsNode (listName,id) = {
97- let head = valueOrElse(getString(this, keyListHead(listName)), "")
98- let prev = getString(this, keyListPrev(listName, id))
99- let next = getString(this, keyListNext(listName, id))
100- if (if ((id == head))
129+ let headOrUnit = getString(this, keyListHead(listName))
130+ let prevOrUnit = getString(this, keyListPrev(listName, id))
131+ let nextOrUnit = getString(this, keyListNext(listName, id))
132+ if (if ((id == valueOrElse(headOrUnit, "")))
101133 then true
102- else (prev != unit))
134+ else (prevOrUnit != unit))
103135 then true
104- else (next != unit)
136+ else (nextOrUnit != unit)
105137 }
106138
107139
108140 func insertNodeActions (listName,id) = {
109- let head = getString(this, keyListHead(listName))
141+ let headOrUnit = getString(this, keyListHead(listName))
110142 let listSize = valueOrElse(getInteger(this, keyListSize(listName)), 0)
111143 let checkNode = if (!(containsNode(listName, id)))
112144 then true
113145 else throw("Node exists")
114146 if ((checkNode == checkNode))
115- then (([IntegerEntry(keyListSize(listName), (listSize + 1))] ++ (if (isDefined(head))
116- then [StringEntry(keyListNext(listName, id), value(head)), StringEntry(keyListPrev(listName, value(head)), id)]
147+ then (([IntegerEntry(keyListSize(listName), (listSize + 1))] ++ (if ((headOrUnit != unit))
148+ then [StringEntry(keyListNext(listName, id), value(headOrUnit)), StringEntry(keyListPrev(listName, value(headOrUnit)), id)]
117149 else nil)) ++ [StringEntry(keyListHead(listName), id)])
118150 else throw("Strict value is not equal to itself.")
119151 }
120152
121153
122154 func deleteNodeActions (listName,id) = {
123- let head = getString(this, keyListHead(listName))
155+ let headOrUnit = getString(this, keyListHead(listName))
124156 let listSize = valueOrElse(getInteger(this, keyListSize(listName)), 0)
125- let prev = getString(this, keyListPrev(listName, id))
126- let next = getString(this, keyListNext(listName, id))
127- ([IntegerEntry(keyListSize(listName), (listSize - 1))] ++ (if (if (isDefined(prev))
128- then isDefined(next)
157+ let prevOrUnit = getString(this, keyListPrev(listName, id))
158+ let nextOrUnit = getString(this, keyListNext(listName, id))
159+ ([IntegerEntry(keyListSize(listName), (listSize - 1))] ++ (if (if ((prevOrUnit != unit))
160+ then (nextOrUnit != unit)
129161 else false)
130- then [StringEntry(keyListNext(listName, value(prev)), value(next)), StringEntry(keyListPrev(listName, value(next)), value(prev)), DeleteEntry(keyListPrev(listName, id)), DeleteEntry(keyListNext(listName, id))]
131- else if (isDefined(next))
132- then [StringEntry(keyListHead(listName), value(next)), DeleteEntry(keyListNext(listName, id)), DeleteEntry(keyListPrev(listName, value(next)))]
133- else if (isDefined(prev))
134- then [DeleteEntry(keyListPrev(listName, id)), DeleteEntry(keyListNext(listName, value(prev)))]
135- else if ((id == head))
162+ then [StringEntry(keyListNext(listName, value(prevOrUnit)), value(nextOrUnit)), StringEntry(keyListPrev(listName, value(nextOrUnit)), value(prevOrUnit)), DeleteEntry(keyListPrev(listName, id)), DeleteEntry(keyListNext(listName, id))]
163+ else if ((nextOrUnit != unit))
164+ then [StringEntry(keyListHead(listName), value(nextOrUnit)), DeleteEntry(keyListNext(listName, id)), DeleteEntry(keyListPrev(listName, value(nextOrUnit)))]
165+ else if ((prevOrUnit != unit))
166+ then [DeleteEntry(keyListPrev(listName, id)), DeleteEntry(keyListNext(listName, value(prevOrUnit)))]
167+ else if ((id == valueOrElse(headOrUnit, "")))
136168 then [DeleteEntry(keyListHead(listName))]
137169 else throw("Invalid node")))
138170 }
139171
140172
141173 func keyManagerPublicKey () = "%s__managerPublicKey"
142174
143175
144176 func keyPendingManagerPublicKey () = "%s__pendingManagerPublicKey"
145177
146178
147179 func managerPublicKeyOrUnit () = match getString(keyManagerPublicKey()) {
148180 case s: String =>
149181 fromBase58String(s)
150182 case _: Unit =>
151183 unit
152184 case _ =>
153185 throw("Match error")
154186 }
155187
156188
157189 func pendingManagerPublicKeyOrUnit () = match getString(keyPendingManagerPublicKey()) {
158190 case s: String =>
159191 fromBase58String(s)
160192 case _: Unit =>
161193 unit
162194 case _ =>
163195 throw("Match error")
164196 }
165197
166198
167199 func mustManager (i) = {
168200 let pd = throw("Permission denied")
169201 match managerPublicKeyOrUnit() {
170202 case pk: ByteVector =>
171203 if ((i.callerPublicKey == pk))
172204 then true
173205 else pd
174206 case _: Unit =>
175207 if ((i.caller == this))
176208 then true
177209 else pd
178210 case _ =>
179211 throw("Match error")
180212 }
181213 }
182214
183215
184216 @Callable(i)
185217 func setManager (pendingManagerPublicKey) = {
186218 let checkCaller = mustManager(i)
187219 if ((checkCaller == checkCaller))
188220 then {
189221 let checkManagerPublicKey = fromBase58String(pendingManagerPublicKey)
190222 if ((checkManagerPublicKey == checkManagerPublicKey))
191223 then [StringEntry(keyPendingManagerPublicKey(), pendingManagerPublicKey)]
192224 else throw("Strict value is not equal to itself.")
193225 }
194226 else throw("Strict value is not equal to itself.")
195227 }
196228
197229
198230
199231 @Callable(i)
200232 func confirmManager () = {
201233 let pm = pendingManagerPublicKeyOrUnit()
202234 let hasPM = if (isDefined(pm))
203235 then true
204236 else throw("No pending manager")
205237 if ((hasPM == hasPM))
206238 then {
207239 let checkPM = if ((i.callerPublicKey == value(pm)))
208240 then true
209241 else throw("You are not pending manager")
210242 if ((checkPM == checkPM))
211243 then [StringEntry(keyManagerPublicKey(), toBase58String(value(pm))), DeleteEntry(keyPendingManagerPublicKey())]
212244 else throw("Strict value is not equal to itself.")
213245 }
214246 else throw("Strict value is not equal to itself.")
215247 }
216248
217249
218250
219251 @Callable(i)
220252 func getUserGwxAmountAtHeight (userAddress,targetHeight) = {
221253 let boostingContractAddress = valueOrErrorMessage(addressFromString(getStrOrFail(this, keyBoostingContract)), "invalid boosting contract address")
222254 $Tuple2(nil, {
223255 let @ = invoke(boostingContractAddress, "getUserGwxAmountAtHeightREADONLY", [userAddress, targetHeight], nil)
224256 if ($isInstanceOf(@, "Int"))
225257 then @
226258 else throw("Couldn't cast Any to Int")
227259 })
228260 }
229261
230262
231263
232264 @Callable(i)
233265 func constructor (votingEmissionCandidateContract,boostingContract,epochLength) = {
234266 let cheks = [mustManager(i), if ((addressFromString(votingEmissionCandidateContract) != unit))
235267 then true
236268 else "invalid voting emission candidate contract address", if ((addressFromString(boostingContract) != unit))
237269 then true
238270 else "invalid boosting contract address", if ((epochLength > 0))
239271 then true
240272 else throw("invalid epoch length")]
241273 if ((cheks == cheks))
242274 then $Tuple2([StringEntry(keyVotingEmissionCandidateContract, votingEmissionCandidateContract), StringEntry(keyBoostingContract, boostingContract), IntegerEntry(keyEpochLength, epochLength)], unit)
243275 else throw("Strict value is not equal to itself.")
244276 }
245277
246278
247279
248280 @Callable(i)
249281 func create (amountAssetId,priceAssetId) = {
250282 let checks = [if ((toBase58String(i.caller.bytes) == valueOrElse(getString(this, keyVotingEmissionCandidateContract), "")))
251283 then true
252284 else mustManager(i)]
253285 if ((checks == checks))
254286 then {
255287 let pool = $Tuple2(amountAssetId, priceAssetId)
256- let inListActions = [BooleanEntry(keyInList(pool), true)]
288+ let inListActions = ([BooleanEntry(keyInList(pool), true)] ++ insertNodeActions(poolsListName, poolToString(pool)))
257289 let startHeightIsNotDefined = (getString(this, keyStartHeight) == unit)
258290 let startHeightActions = if (startHeightIsNotDefined)
259291 then [IntegerEntry(keyCurrentEpoch, 0), IntegerEntry(keyStartHeight, height)]
260292 else nil
261293 $Tuple2((inListActions ++ startHeightActions), unit)
262294 }
263295 else throw("Strict value is not equal to itself.")
264296 }
265297
266298
267299
268300 @Callable(i)
269-func vote (amountAssetId,priceAssetId,share) = {
301+func vote (amountAssetId,priceAssetId,amount) = {
270302 let pool = $Tuple2(amountAssetId, priceAssetId)
271303 let startHeight = getIntOrFail(this, keyStartHeight)
272304 let epochLength = getIntOrFail(this, keyEpochLength)
273305 let endHeight = (startHeight + epochLength)
274- let shareUsed = valueOrElse(getInteger(this, keyShareUsed(i.caller)), 0)
275- let poolVoteShare = valueOrElse(getInteger(this, keyVoteShare(i.caller, pool)), 0)
276- let userMaxShare = (maxShare - shareUsed)
277- let newShare = (poolVoteShare + share)
306+ let epoch = valueOrElse(getInteger(this, keyCurrentEpoch), 0)
307+ let used = valueOrElse(getInteger(this, keyUsed(i.caller, epoch)), 0)
308+ let vote = valueOrElse(getInteger(this, keyVote(i.caller, pool, epoch)), 0)
309+ let poolResult = valueOrElse(getInteger(this, keyVotingResult(pool, epoch)), 0)
310+ let totalVotes = valueOrElse(getInteger(this, keyTotalVotes(epoch)), 0)
278311 let gwxAmountAtEndTotal = {
279312 let @ = invoke(this, "getUserGwxAmountAtHeight", [toBase58String(i.caller.bytes), endHeight], nil)
280313 if ($isInstanceOf(@, "Int"))
281314 then @
282315 else throw("Couldn't cast Any to Int")
283316 }
284- let gwxAmountAtEnd = fraction(gwxAmountAtEndTotal, newShare, maxShare)
317+ let available = (gwxAmountAtEndTotal - used)
318+ let newVote = (vote + amount)
285319 let checks = [if ((getBoolean(keyInList(pool)) != unit))
286320 then true
287321 else throw("invalid assets"), if ((endHeight > height))
288322 then true
289- else throw("invalid height"), if ((gwxAmountAtEnd > 0))
323+ else throw("invalid height"), if ((gwxAmountAtEndTotal > 0))
290324 then true
291- else throw("you do not have gWX"), if (if ((share > 0))
292- then (userMaxShare >= share)
325+ else throw("you do not have gWX"), if (if ((amount > 0))
326+ then (available >= amount)
293327 else false)
294328 then true
295- else throw("invalid share")]
329+ else throw("invalid amount")]
296330 if ((checks == checks))
297- then $Tuple2([IntegerEntry(keyShareUsed(i.caller), (shareUsed + share)), IntegerEntry(keyVoteShare(i.caller, pool), newShare)], unit)
331+ then {
332+ let votesListName = getVotesListName(pool)
333+ let poolString = poolToString(pool)
334+ let votesListActions = if (containsNode(votesListName, poolString))
335+ then nil
336+ else insertNodeActions(votesListName, poolString)
337+ $Tuple2(([IntegerEntry(keyUsed(i.caller, epoch), (used + amount)), IntegerEntry(keyVote(i.caller, pool, epoch), newVote), IntegerEntry(keyVotingResult(pool, epoch), (poolResult + amount)), IntegerEntry(keyTotalVotes(epoch), (totalVotes + amount))] ++ votesListActions), unit)
338+ }
298339 else throw("Strict value is not equal to itself.")
299340 }
300341
301342
302343
303344 @Callable(i)
304345 func cancelVote (amountAssetId,priceAssetId) = {
305346 let pool = $Tuple2(amountAssetId, priceAssetId)
306347 let startHeight = getIntOrFail(this, keyStartHeight)
307348 let epochLength = getIntOrFail(this, keyEpochLength)
308349 let endHeight = (startHeight + epochLength)
309- let poolVoteShare = valueOrElse(getInteger(this, keyVoteShare(i.caller, pool)), 0)
310- let shareUsed = valueOrElse(getInteger(this, keyShareUsed(i.caller)), 0)
350+ let epoch = valueOrElse(getInteger(this, keyCurrentEpoch), 0)
351+ let used = valueOrElse(getInteger(this, keyUsed(i.caller, epoch)), 0)
352+ let vote = valueOrElse(getInteger(this, keyVote(i.caller, pool, epoch)), 0)
353+ let poolResult = valueOrElse(getInteger(this, keyVotingResult(pool, epoch)), 0)
354+ let totalVotes = valueOrElse(getInteger(this, keyTotalVotes(epoch)), 0)
311355 let checks = [if ((getBoolean(keyInList(pool)) != unit))
312356 then true
313357 else throw("invalid assets"), if ((endHeight > height))
314358 then true
315- else throw("invalid height"), if ((poolVoteShare > 0))
359+ else throw("invalid height"), if ((vote > 0))
316360 then true
317361 else throw("no vote")]
318362 if ((checks == checks))
319- then $Tuple2([IntegerEntry(keyShareUsed(i.caller), max([(shareUsed - poolVoteShare), 0])), DeleteEntry(keyVoteShare(i.caller, pool))], unit)
363+ then {
364+ let votesListName = getVotesListName(pool)
365+ let poolString = poolToString(pool)
366+ $Tuple2(([IntegerEntry(keyUsed(i.caller, epoch), max([(used - vote), 0])), DeleteEntry(keyVote(i.caller, pool, epoch)), IntegerEntry(keyVotingResult(pool, epoch), (poolResult - vote)), IntegerEntry(keyTotalVotes(epoch), (totalVotes - vote))] ++ deleteNodeActions(votesListName, poolString)), unit)
367+ }
320368 else throw("Strict value is not equal to itself.")
321369 }
322370
323371
324372
325373 @Callable(i)
326374 func setEpochLength (newEpochLength) = {
327375 let cheks = [mustManager(i), if ((newEpochLength > 0))
328376 then true
329377 else throw("invalid epoch length")]
330378 if ((cheks == cheks))
331379 then $Tuple2([IntegerEntry(keyEpochLength, newEpochLength)], unit)
332380 else throw("Strict value is not equal to itself.")
333381 }
334382
335383
336384
337385 @Callable(i)
338386 func finalize () = $Tuple2(nil, unit)
339387
340388
341389
342390 @Callable(i)
343391 func onVerificationLoss (assetId) = $Tuple2(nil, unit)
344392
345393
346394 @Verifier(tx)
347395 func verify () = {
348396 let targetPublicKey = match managerPublicKeyOrUnit() {
349397 case pk: ByteVector =>
350398 pk
351399 case _: Unit =>
352400 tx.senderPublicKey
353401 case _ =>
354402 throw("Match error")
355403 }
356404 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
357405 }
358406

github/deemru/w8io/873ac7e 
76.81 ms