tx · 7ymi4VA8L6BBGzUEHZWwPCUYSdHywrG4wqYa36sz8Kn6

3MyVvNfXht9piazyf1e5BVFsqv1R7z5cWJL:  -0.01800000 Waves

2022.06.01 15:17 [2077272] smart account 3MyVvNfXht9piazyf1e5BVFsqv1R7z5cWJL > SELF 0.00000000 Waves

{ "type": 13, "id": "7ymi4VA8L6BBGzUEHZWwPCUYSdHywrG4wqYa36sz8Kn6", "fee": 1800000, "feeAssetId": null, "timestamp": 1654085838977, "version": 1, "sender": "3MyVvNfXht9piazyf1e5BVFsqv1R7z5cWJL", "senderPublicKey": "DnPyGWCgpQChvoQrnXQRcC9FtN32mPGrcog2wcKHdkVn", "proofs": [ "4QskA3Gd6Bfzt5HwYhf8PKx1V4qULLPoR5TTn1PRgRYYg1pAFgqXk3ofKD4Ce1VP9b1S2DPEPNBRXHRktVdXhse6" ], "script": "base64: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IGRlbmllZAQAAAAHJG1hdGNoMAkBAAAAFm1hbmFnZXJQdWJsaWNLZXlPclVuaXQAAAAAAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAApCeXRlVmVjdG9yBAAAAAJwawUAAAAHJG1hdGNoMAMJAAAAAAAAAggFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5BQAAAAJwawYFAAAAAnBkAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAARVbml0AwkAAAAAAAACCAUAAAABaQAAAAZjYWxsZXIFAAAABHRoaXMGBQAAAAJwZAkAAAIAAAABAgAAAAtNYXRjaCBlcnJvcgAAAAoAAAABaQEAAAAKc2V0TWFuYWdlcgAAAAEAAAAXcGVuZGluZ01hbmFnZXJQdWJsaWNLZXkEAAAAC2NoZWNrQ2FsbGVyCQEAAAALbXVzdE1hbmFnZXIAAAABBQAAAAFpAwkAAAAAAAACBQAAAAtjaGVja0NhbGxlcgUAAAALY2hlY2tDYWxsZXIEAAAAFWNoZWNrTWFuYWdlclB1YmxpY0tleQkAAlkAAAABBQAAABdwZW5kaW5nTWFuYWdlclB1YmxpY0tleQMJAAAAAAAAAgUAAAAVY2hlY2tNYW5hZ2VyUHVibGljS2V5BQAAABVjaGVja01hbmFnZXJQdWJsaWNLZXkJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAGmtleVBlbmRpbmdNYW5hZ2VyUHVibGljS2V5AAAAAAUAAAAXcGVuZGluZ01hbmFnZXJQdWJsaWNLZXkFAAAAA25pbAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAWkBAAAADmNvbmZpcm1NYW5hZ2VyAAAAAAQAAAACcG0JAQAAAB1wZW5kaW5nTWFuYWdlclB1YmxpY0tleU9yVW5pdAAAAAAEAAAABWhhc1BNAwkBAAAACWlzRGVmaW5lZAAAAAEFAAAAAnBtBgkAAAIAAAABAgAAABJObyBwZW5kaW5nIG1hbmFnZXIDCQAAAAAAAAIFAAAABWhhc1BNBQAAAAVoYXNQTQQAAAAHY2hlY2tQTQMJAAAAAAAAAggFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5CQEAAAAFdmFsdWUAAAABBQAAAAJwbQYJAAACAAAAAQIAAAAbWW91IGFyZSBub3QgcGVuZGluZyBtYW5hZ2VyAwkAAAAAAAACBQAAAAdjaGVja1BNBQAAAAdjaGVja1BNCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABNrZXlNYW5hZ2VyUHVibGljS2V5AAAAAAkAAlgAAAABCQEAAAAFdmFsdWUAAAABBQAAAAJwbQkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABCQEAAAAaa2V5UGVuZGluZ01hbmFnZXJQdWJsaWNLZXkAAAAABQAAAANuaWwJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgAAAAFpAQAAABhnZXRVc2VyR3d4QW1vdW50QXRIZWlnaHQAAAACAAAAC3VzZXJBZGRyZXNzAAAADHRhcmdldEhlaWdodAQAAAAXYm9vc3RpbmdDb250cmFjdEFkZHJlc3MJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABCYAAAABCQEAAAAMZ2V0U3RyT3JGYWlsAAAAAgUAAAAEdGhpcwUAAAATa2V5Qm9vc3RpbmdDb250cmFjdAIAAAAhaW52YWxpZCBib29zdGluZyBjb250cmFjdCBhZGRyZXNzCQAFFAAAAAIFAAAAA25pbAoAAAAAAUAJAAP8AAAABAUAAAAXYm9vc3RpbmdDb250cmFjdEFkZHJlc3MCAAAAIGdldFVzZXJHd3hBbW91bnRBdEhlaWdodFJFQURPTkxZCQAETAAAAAIFAAAAC3VzZXJBZGRyZXNzCQAETAAAAAIFAAAADHRhcmdldEhlaWdodAUAAAADbmlsBQAAAANuaWwDCQAAAQAAAAIFAAAAAUACAAAAA0ludAUAAAABQAkAAAIAAAABAgAAABhDb3VsZG4ndCBjYXN0IEFueSB0byBJbnQAAAABaQEAAAALY29uc3RydWN0b3IAAAADAAAAH3ZvdGluZ0VtaXNzaW9uQ2FuZGlkYXRlQ29udHJhY3QAAAAQYm9vc3RpbmdDb250cmFjdAAAAAtlcG9jaExlbmd0aAQAAAAFY2hla3MJAARMAAAAAgkBAAAAC211c3RNYW5hZ2VyAAAAAQUAAAABaQkABEwAAAACAwkBAAAAAiE9AAAAAgkABCYAAAABBQAAAB92b3RpbmdFbWlzc2lvbkNhbmRpZGF0ZUNvbnRyYWN0BQAAAAR1bml0BgIAAAAyaW52YWxpZCB2b3RpbmcgZW1pc3Npb24gY2FuZGlkYXRlIGNvbnRyYWN0IGFkZHJlc3MJAARMAAAAAgMJAQAAAAIhPQAAAAIJAAQmAAAAAQUAAAAQYm9vc3RpbmdDb250cmFjdAUAAAAEdW5pdAYCAAAAIWludmFsaWQgYm9vc3RpbmcgY29udHJhY3QgYWRkcmVzcwkABEwAAAACAwkAAGYAAAACBQAAAAtlcG9jaExlbmd0aAAAAAAAAAAAAAYJAAACAAAAAQIAAAAUaW52YWxpZCBlcG9jaCBsZW5ndGgFAAAAA25pbAMJAAAAAAAAAgUAAAAFY2hla3MFAAAABWNoZWtzCQAFFAAAAAIJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAAia2V5Vm90aW5nRW1pc3Npb25DYW5kaWRhdGVDb250cmFjdAUAAAAfdm90aW5nRW1pc3Npb25DYW5kaWRhdGVDb250cmFjdAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACBQAAABNrZXlCb29zdGluZ0NvbnRyYWN0BQAAABBib29zdGluZ0NvbnRyYWN0CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAA5rZXlFcG9jaExlbmd0aAUAAAALZXBvY2hMZW5ndGgFAAAAA25pbAUAAAAEdW5pdAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAABaQEAAAAGY3JlYXRlAAAAAgAAAA1hbW91bnRBc3NldElkAAAADHByaWNlQXNzZXRJZAQAAAAGY2hlY2tzCQAETAAAAAIDCQAAAAAAAAIJAAJYAAAAAQgIBQAAAAFpAAAABmNhbGxlcgAAAAVieXRlcwkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABB0AAAACBQAAAAR0aGlzBQAAACJrZXlWb3RpbmdFbWlzc2lvbkNhbmRpZGF0ZUNvbnRyYWN0AgAAAAAGCQEAAAALbXVzdE1hbmFnZXIAAAABBQAAAAFpBQAAAANuaWwDCQAAAAAAAAIFAAAABmNoZWNrcwUAAAAGY2hlY2tzBAAAAARwb29sCQAFFAAAAAIFAAAADWFtb3VudEFzc2V0SWQFAAAADHByaWNlQXNzZXRJZAQAAAANaW5MaXN0QWN0aW9ucwkABEwAAAACCQEAAAAMQm9vbGVhbkVudHJ5AAAAAgkBAAAACWtleUluTGlzdAAAAAEFAAAABHBvb2wGBQAAAANuaWwEAAAAF3N0YXJ0SGVpZ2h0SXNOb3REZWZpbmVkCQAAAAAAAAIJAAQdAAAAAgUAAAAEdGhpcwUAAAAOa2V5U3RhcnRIZWlnaHQFAAAABHVuaXQEAAAAEnN0YXJ0SGVpZ2h0QWN0aW9ucwMFAAAAF3N0YXJ0SGVpZ2h0SXNOb3REZWZpbmVkCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAA9rZXlDdXJyZW50RXBvY2gAAAAAAAAAAAAJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAADmtleVN0YXJ0SGVpZ2h0BQAAAAZoZWlnaHQFAAAAA25pbAUAAAADbmlsCQAFFAAAAAIJAAROAAAAAgUAAAANaW5MaXN0QWN0aW9ucwUAAAASc3RhcnRIZWlnaHRBY3Rpb25zBQAAAAR1bml0CQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgAAAAFpAQAAAAR2b3RlAAAAAwAAAA1hbW91bnRBc3NldElkAAAADHByaWNlQXNzZXRJZAAAAAVzaGFyZQQAAAAEcG9vbAkABRQAAAACBQAAAA1hbW91bnRBc3NldElkBQAAAAxwcmljZUFzc2V0SWQEAAAAC3N0YXJ0SGVpZ2h0CQEAAAAMZ2V0SW50T3JGYWlsAAAAAgUAAAAEdGhpcwUAAAAOa2V5U3RhcnRIZWlnaHQEAAAAC2Vwb2NoTGVuZ3RoCQEAAAAMZ2V0SW50T3JGYWlsAAAAAgUAAAAEdGhpcwUAAAAOa2V5RXBvY2hMZW5ndGgEAAAACWVuZEhlaWdodAkAAGQAAAACBQAAAAtzdGFydEhlaWdodAUAAAALZXBvY2hMZW5ndGgEAAAACXNoYXJlVXNlZAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzCQEAAAAMa2V5U2hhcmVVc2VkAAAAAQgFAAAAAWkAAAAGY2FsbGVyAAAAAAAAAAAABAAAAA1wb29sVm90ZVNoYXJlCQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMJAQAAAAxrZXlWb3RlU2hhcmUAAAACCAUAAAABaQAAAAZjYWxsZXIFAAAABHBvb2wAAAAAAAAAAAAEAAAADHVzZXJNYXhTaGFyZQkAAGUAAAACBQAAAAhtYXhTaGFyZQUAAAAJc2hhcmVVc2VkBAAAAAhuZXdTaGFyZQkAAGQAAAACBQAAAA1wb29sVm90ZVNoYXJlBQAAAAVzaGFyZQQAAAATZ3d4QW1vdW50QXRFbmRUb3RhbAoAAAAAAUAJAAP8AAAABAUAAAAEdGhpcwIAAAAYZ2V0VXNlckd3eEFtb3VudEF0SGVpZ2h0CQAETAAAAAIJAAJYAAAAAQgIBQAAAAFpAAAABmNhbGxlcgAAAAVieXRlcwkABEwAAAACBQAAAAllbmRIZWlnaHQFAAAAA25pbAUAAAADbmlsAwkAAAEAAAACBQAAAAFAAgAAAANJbnQFAAAAAUAJAAACAAAAAQIAAAAYQ291bGRuJ3QgY2FzdCBBbnkgdG8gSW50BAAAAA5nd3hBbW91bnRBdEVuZAkAAGsAAAADBQAAABNnd3hBbW91bnRBdEVuZFRvdGFsBQAAAAhuZXdTaGFyZQUAAAAIbWF4U2hhcmUEAAAABmNoZWNrcwkABEwAAAACAwkBAAAAAiE9AAAAAgkABCAAAAABCQEAAAAJa2V5SW5MaXN0AAAAAQUAAAAEcG9vbAUAAAAEdW5pdAYJAAACAAAAAQIAAAAOaW52YWxpZCBhc3NldHMJAARMAAAAAgMJAABmAAAAAgUAAAAJZW5kSGVpZ2h0BQAAAAZoZWlnaHQGCQAAAgAAAAECAAAADmludmFsaWQgaGVpZ2h0CQAETAAAAAIDCQAAZgAAAAIFAAAADmd3eEFtb3VudEF0RW5kAAAAAAAAAAAABgkAAAIAAAABAgAAABN5b3UgZG8gbm90IGhhdmUgZ1dYCQAETAAAAAIDAwkAAGYAAAACBQAAAAVzaGFyZQAAAAAAAAAAAAkAAGcAAAACBQAAAAx1c2VyTWF4U2hhcmUFAAAABXNoYXJlBwYJAAACAAAAAQIAAAANaW52YWxpZCBzaGFyZQUAAAADbmlsAwkAAAAAAAACBQAAAAZjaGVja3MFAAAABmNoZWNrcwkABRQAAAACCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAMa2V5U2hhcmVVc2VkAAAAAQgFAAAAAWkAAAAGY2FsbGVyCQAAZAAAAAIFAAAACXNoYXJlVXNlZAUAAAAFc2hhcmUJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAAAxrZXlWb3RlU2hhcmUAAAACCAUAAAABaQAAAAZjYWxsZXIFAAAABHBvb2wFAAAACG5ld1NoYXJlBQAAAANuaWwFAAAABHVuaXQJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAWkBAAAACmNhbmNlbFZvdGUAAAACAAAADWFtb3VudEFzc2V0SWQAAAAMcHJpY2VBc3NldElkBAAAAARwb29sCQAFFAAAAAIFAAAADWFtb3VudEFzc2V0SWQFAAAADHByaWNlQXNzZXRJZAQAAAALc3RhcnRIZWlnaHQJAQAAAAxnZXRJbnRPckZhaWwAAAACBQAAAAR0aGlzBQAAAA5rZXlTdGFydEhlaWdodAQAAAALZXBvY2hMZW5ndGgJAQAAAAxnZXRJbnRPckZhaWwAAAACBQAAAAR0aGlzBQAAAA5rZXlFcG9jaExlbmd0aAQAAAAJZW5kSGVpZ2h0CQAAZAAAAAIFAAAAC3N0YXJ0SGVpZ2h0BQAAAAtlcG9jaExlbmd0aAQAAAANcG9vbFZvdGVTaGFyZQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzCQEAAAAMa2V5Vm90ZVNoYXJlAAAAAggFAAAAAWkAAAAGY2FsbGVyBQAAAARwb29sAAAAAAAAAAAABAAAAAlzaGFyZVVzZWQJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwkBAAAADGtleVNoYXJlVXNlZAAAAAEIBQAAAAFpAAAABmNhbGxlcgAAAAAAAAAAAAQAAAAGY2hlY2tzCQAETAAAAAIDCQEAAAACIT0AAAACCQAEIAAAAAEJAQAAAAlrZXlJbkxpc3QAAAABBQAAAARwb29sBQAAAAR1bml0BgkAAAIAAAABAgAAAA5pbnZhbGlkIGFzc2V0cwkABEwAAAACAwkAAGYAAAACBQAAAAllbmRIZWlnaHQFAAAABmhlaWdodAYJAAACAAAAAQIAAAAOaW52YWxpZCBoZWlnaHQJAARMAAAAAgMJAABmAAAAAgUAAAANcG9vbFZvdGVTaGFyZQAAAAAAAAAAAAYJAAACAAAAAQIAAAAHbm8gdm90ZQUAAAADbmlsAwkAAAAAAAACBQAAAAZjaGVja3MFAAAABmNoZWNrcwkABRQAAAACCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAMa2V5U2hhcmVVc2VkAAAAAQgFAAAAAWkAAAAGY2FsbGVyCQABlgAAAAEJAARMAAAAAgkAAGUAAAACBQAAAAlzaGFyZVVzZWQFAAAADXBvb2xWb3RlU2hhcmUJAARMAAAAAgAAAAAAAAAAAAUAAAADbmlsCQAETAAAAAIJAQAAAAtEZWxldGVFbnRyeQAAAAEJAQAAAAxrZXlWb3RlU2hhcmUAAAACCAUAAAABaQAAAAZjYWxsZXIFAAAABHBvb2wFAAAAA25pbAUAAAAEdW5pdAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAABaQEAAAAOc2V0RXBvY2hMZW5ndGgAAAABAAAADm5ld0Vwb2NoTGVuZ3RoBAAAAAVjaGVrcwkABEwAAAACCQEAAAALbXVzdE1hbmFnZXIAAAABBQAAAAFpCQAETAAAAAIDCQAAZgAAAAIFAAAADm5ld0Vwb2NoTGVuZ3RoAAAAAAAAAAAABgkAAAIAAAABAgAAABRpbnZhbGlkIGVwb2NoIGxlbmd0aAUAAAADbmlsAwkAAAAAAAACBQAAAAVjaGVrcwUAAAAFY2hla3MJAAUUAAAAAgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAOa2V5RXBvY2hMZW5ndGgFAAAADm5ld0Vwb2NoTGVuZ3RoBQAAAANuaWwFAAAABHVuaXQJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAWkBAAAACGZpbmFsaXplAAAAAAkABRQAAAACBQAAAANuaWwFAAAABHVuaXQAAAABaQEAAAASb25WZXJpZmljYXRpb25Mb3NzAAAAAQAAAAdhc3NldElkCQAFFAAAAAIFAAAAA25pbAUAAAAEdW5pdAAAAAEAAAACdHgBAAAABnZlcmlmeQAAAAAEAAAAD3RhcmdldFB1YmxpY0tleQQAAAAHJG1hdGNoMAkBAAAAFm1hbmFnZXJQdWJsaWNLZXlPclVuaXQAAAAAAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAApCeXRlVmVjdG9yBAAAAAJwawUAAAAHJG1hdGNoMAUAAAACcGsDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABFVuaXQIBQAAAAJ0eAAAAA9zZW5kZXJQdWJsaWNLZXkJAAACAAAAAQIAAAALTWF0Y2ggZXJyb3IJAAH0AAAAAwgFAAAAAnR4AAAACWJvZHlCeXRlcwkAAZEAAAACCAUAAAACdHgAAAAGcHJvb2ZzAAAAAAAAAAAABQAAAA90YXJnZXRQdWJsaWNLZXnO/8E4", "chainId": 84, "height": 2077272, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 6gee9Wyas6LnQ3geZHBsiPxAP8auvDfivvZUZakMeV4i Next: AcP9fHThEBmPtsUuoQ7o4yrnxLXhSXkaAKGnc3jRNGvr Diff:
OldNewDifferences
77
88 let keyEpochLength = makeString(["%s", "epochLength"], separator)
99
10+let keyCurrentEpoch = makeString(["%s", "currentEpoch"], separator)
11+
1012 let keyStartHeight = makeString(["%s", "startHeight"], separator)
1113
1214 let keyVotingEmissionCandidateContract = makeString(["%s", "votingEmissionCandidateContract"], separator)
1416 let keyBoostingContract = makeString(["%s", "boostingContract"], separator)
1517
1618 func keyInList (pool) = {
17- let $t0527567 = pool
18- let amountAssetId = $t0527567._1
19- let priceAssetId = $t0527567._2
19+ let $t0594634 = pool
20+ let amountAssetId = $t0594634._1
21+ let priceAssetId = $t0594634._2
2022 makeString(["%s%s%s", "inList", amountAssetId, priceAssetId], separator)
2123 }
2224
2527
2628
2729 func keyVoteShare (address,pool) = {
28- let $t0812852 = pool
29- let amountAssetId = $t0812852._1
30- let priceAssetId = $t0812852._2
30+ let $t0879919 = pool
31+ let amountAssetId = $t0879919._1
32+ let priceAssetId = $t0879919._2
3133 makeString(["%s%s%s%s", "voteShare", amountAssetId, priceAssetId, toString(address)], separator)
3234 }
3335
3436
35-func keyVoteGwx (address,pool) = {
36- let $t010421082 = pool
37- let amountAssetId = $t010421082._1
38- let priceAssetId = $t010421082._2
39- makeString(["%s%s%s%s", "voteGwx", amountAssetId, priceAssetId, toString(address)], separator)
40- }
41-
42-
4337 func keyVotingResult (pool) = {
44- let $t012341274 = pool
45- let amountAssetId = $t012341274._1
46- let priceAssetId = $t012341274._2
38+ let $t013181358 = pool
39+ let amountAssetId = $t013181358._1
40+ let priceAssetId = $t013181358._2
4741 makeString(["%s%s%s", "votingResult", amountAssetId, priceAssetId], separator)
4842 }
4943
6256
6357
6458 func getStrOrFail (address,key) = {
65- let @ = getValueOrFail(address, key, 0)
59+ let @ = getValueOrFail(address, key, "")
6660 if ($isInstanceOf(@, "String"))
6761 then @
6862 else throw("Couldn't cast Int|String to String")
69- }
70-
71-
72-func getStrOrUnit (address,key) = {
73- let @ = getValueOrFail(address, key, 0)
74- if ($isInstanceOf(@, "String"))
75- then @
76- else unit
7763 }
7864
7965
8571 }
8672
8773
88-func getIntOrUnit (address,key) = {
89- let @ = getValueOrFail(address, key, 0)
90- if ($isInstanceOf(@, "Int"))
91- then @
92- else unit
74+let poolsListName = "__pools"
75+
76+func getVotesListName (pool) = {
77+ let $t021112151 = pool
78+ let amountAssetId = $t021112151._1
79+ let priceAssetId = $t021112151._2
80+ makeString(["%s%s__votes", amountAssetId, priceAssetId], separator)
81+ }
82+
83+
84+func keyListHead (listName) = makeString([("%s%s" + listName), "head"], separator)
85+
86+
87+func keyListSize (listName) = makeString([("%s%s" + listName), "size"], separator)
88+
89+
90+func keyListPrev (listName,id) = makeString([("%s%s%s" + listName), id, "prev"], separator)
91+
92+
93+func keyListNext (listName,id) = makeString([("%s%s%s" + listName), id, "next"], separator)
94+
95+
96+func containsNode (listName,id) = {
97+ let head = 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))
101+ then true
102+ else (prev != unit))
103+ then true
104+ else (next != unit)
105+ }
106+
107+
108+func insertNodeActions (listName,id) = {
109+ let head = getString(this, keyListHead(listName))
110+ let listSize = valueOrElse(getInteger(this, keyListSize(listName)), 0)
111+ let checkNode = if (!(containsNode(listName, id)))
112+ then true
113+ else throw("Node exists")
114+ 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)]
117+ else nil)) ++ [StringEntry(keyListHead(listName), id)])
118+ else throw("Strict value is not equal to itself.")
119+ }
120+
121+
122+func deleteNodeActions (listName,id) = {
123+ let head = getString(this, keyListHead(listName))
124+ 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)
129+ 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))
136+ then [DeleteEntry(keyListHead(listName))]
137+ else throw("Invalid node")))
93138 }
94139
95140
211256 let inListActions = [BooleanEntry(keyInList(pool), true)]
212257 let startHeightIsNotDefined = (getString(this, keyStartHeight) == unit)
213258 let startHeightActions = if (startHeightIsNotDefined)
214- then [IntegerEntry(keyStartHeight, height)]
259+ then [IntegerEntry(keyCurrentEpoch, 0), IntegerEntry(keyStartHeight, height)]
215260 else nil
216261 $Tuple2((inListActions ++ startHeightActions), unit)
217262 }
226271 let startHeight = getIntOrFail(this, keyStartHeight)
227272 let epochLength = getIntOrFail(this, keyEpochLength)
228273 let endHeight = (startHeight + epochLength)
229- let shareUsed = valueOrElse(getIntOrUnit(this, keyShareUsed(i.caller)), 0)
230- let poolVoteShare = valueOrElse(getIntOrUnit(this, keyVoteShare(i.caller, pool)), 0)
274+ let shareUsed = valueOrElse(getInteger(this, keyShareUsed(i.caller)), 0)
275+ let poolVoteShare = valueOrElse(getInteger(this, keyVoteShare(i.caller, pool)), 0)
231276 let userMaxShare = (maxShare - shareUsed)
232277 let newShare = (poolVoteShare + share)
233278 let gwxAmountAtEndTotal = {
249294 then true
250295 else throw("invalid share")]
251296 if ((checks == checks))
252- then $Tuple2([IntegerEntry(keyShareUsed(i.caller), (shareUsed + share)), IntegerEntry(keyVoteShare(i.caller, pool), newShare), IntegerEntry(keyVoteGwx(i.caller, pool), gwxAmountAtEnd)], unit)
297+ then $Tuple2([IntegerEntry(keyShareUsed(i.caller), (shareUsed + share)), IntegerEntry(keyVoteShare(i.caller, pool), newShare)], unit)
253298 else throw("Strict value is not equal to itself.")
254299 }
255300
261306 let startHeight = getIntOrFail(this, keyStartHeight)
262307 let epochLength = getIntOrFail(this, keyEpochLength)
263308 let endHeight = (startHeight + epochLength)
264- let poolVoteShare = valueOrElse(getIntOrUnit(this, keyVoteShare(i.caller, pool)), 0)
265- let shareUsed = valueOrElse(getIntOrUnit(this, keyShareUsed(i.caller)), 0)
309+ let poolVoteShare = valueOrElse(getInteger(this, keyVoteShare(i.caller, pool)), 0)
310+ let shareUsed = valueOrElse(getInteger(this, keyShareUsed(i.caller)), 0)
266311 let checks = [if ((getBoolean(keyInList(pool)) != unit))
267312 then true
268313 else throw("invalid assets"), if ((endHeight > height))
271316 then true
272317 else throw("no vote")]
273318 if ((checks == checks))
274- then $Tuple2([IntegerEntry(keyShareUsed(i.caller), max([(shareUsed - poolVoteShare), 0])), DeleteEntry(keyVoteShare(i.caller, pool)), DeleteEntry(keyVoteGwx(i.caller, pool))], unit)
319+ then $Tuple2([IntegerEntry(keyShareUsed(i.caller), max([(shareUsed - poolVoteShare), 0])), DeleteEntry(keyVoteShare(i.caller, pool))], unit)
275320 else throw("Strict value is not equal to itself.")
276321 }
277322
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let separator = "__"
55
66 let maxShare = 100
77
88 let keyEpochLength = makeString(["%s", "epochLength"], separator)
99
10+let keyCurrentEpoch = makeString(["%s", "currentEpoch"], separator)
11+
1012 let keyStartHeight = makeString(["%s", "startHeight"], separator)
1113
1214 let keyVotingEmissionCandidateContract = makeString(["%s", "votingEmissionCandidateContract"], separator)
1315
1416 let keyBoostingContract = makeString(["%s", "boostingContract"], separator)
1517
1618 func keyInList (pool) = {
17- let $t0527567 = pool
18- let amountAssetId = $t0527567._1
19- let priceAssetId = $t0527567._2
19+ let $t0594634 = pool
20+ let amountAssetId = $t0594634._1
21+ let priceAssetId = $t0594634._2
2022 makeString(["%s%s%s", "inList", amountAssetId, priceAssetId], separator)
2123 }
2224
2325
2426 func keyShareUsed (address) = makeString(["%s%s", "shareUsed", toString(address)], separator)
2527
2628
2729 func keyVoteShare (address,pool) = {
28- let $t0812852 = pool
29- let amountAssetId = $t0812852._1
30- let priceAssetId = $t0812852._2
30+ let $t0879919 = pool
31+ let amountAssetId = $t0879919._1
32+ let priceAssetId = $t0879919._2
3133 makeString(["%s%s%s%s", "voteShare", amountAssetId, priceAssetId, toString(address)], separator)
3234 }
3335
3436
35-func keyVoteGwx (address,pool) = {
36- let $t010421082 = pool
37- let amountAssetId = $t010421082._1
38- let priceAssetId = $t010421082._2
39- makeString(["%s%s%s%s", "voteGwx", amountAssetId, priceAssetId, toString(address)], separator)
40- }
41-
42-
4337 func keyVotingResult (pool) = {
44- let $t012341274 = pool
45- let amountAssetId = $t012341274._1
46- let priceAssetId = $t012341274._2
38+ let $t013181358 = pool
39+ let amountAssetId = $t013181358._1
40+ let priceAssetId = $t013181358._2
4741 makeString(["%s%s%s", "votingResult", amountAssetId, priceAssetId], separator)
4842 }
4943
5044
5145 func getValueOrFail (address,key,type) = {
5246 let error = makeString(["mandatory ", toString(address), ".", key, " is not defined"], "")
5347 valueOrErrorMessage( match type {
5448 case str: String =>
5549 getString(address, key)
5650 case int: Int =>
5751 getInteger(address, key)
5852 case _ =>
5953 throw("invalid entry type")
6054 }, error)
6155 }
6256
6357
6458 func getStrOrFail (address,key) = {
65- let @ = getValueOrFail(address, key, 0)
59+ let @ = getValueOrFail(address, key, "")
6660 if ($isInstanceOf(@, "String"))
6761 then @
6862 else throw("Couldn't cast Int|String to String")
69- }
70-
71-
72-func getStrOrUnit (address,key) = {
73- let @ = getValueOrFail(address, key, 0)
74- if ($isInstanceOf(@, "String"))
75- then @
76- else unit
7763 }
7864
7965
8066 func getIntOrFail (address,key) = {
8167 let @ = getValueOrFail(address, key, 0)
8268 if ($isInstanceOf(@, "Int"))
8369 then @
8470 else throw("Couldn't cast Int|String to Int")
8571 }
8672
8773
88-func getIntOrUnit (address,key) = {
89- let @ = getValueOrFail(address, key, 0)
90- if ($isInstanceOf(@, "Int"))
91- then @
92- else unit
74+let poolsListName = "__pools"
75+
76+func getVotesListName (pool) = {
77+ let $t021112151 = pool
78+ let amountAssetId = $t021112151._1
79+ let priceAssetId = $t021112151._2
80+ makeString(["%s%s__votes", amountAssetId, priceAssetId], separator)
81+ }
82+
83+
84+func keyListHead (listName) = makeString([("%s%s" + listName), "head"], separator)
85+
86+
87+func keyListSize (listName) = makeString([("%s%s" + listName), "size"], separator)
88+
89+
90+func keyListPrev (listName,id) = makeString([("%s%s%s" + listName), id, "prev"], separator)
91+
92+
93+func keyListNext (listName,id) = makeString([("%s%s%s" + listName), id, "next"], separator)
94+
95+
96+func containsNode (listName,id) = {
97+ let head = 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))
101+ then true
102+ else (prev != unit))
103+ then true
104+ else (next != unit)
105+ }
106+
107+
108+func insertNodeActions (listName,id) = {
109+ let head = getString(this, keyListHead(listName))
110+ let listSize = valueOrElse(getInteger(this, keyListSize(listName)), 0)
111+ let checkNode = if (!(containsNode(listName, id)))
112+ then true
113+ else throw("Node exists")
114+ 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)]
117+ else nil)) ++ [StringEntry(keyListHead(listName), id)])
118+ else throw("Strict value is not equal to itself.")
119+ }
120+
121+
122+func deleteNodeActions (listName,id) = {
123+ let head = getString(this, keyListHead(listName))
124+ 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)
129+ 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))
136+ then [DeleteEntry(keyListHead(listName))]
137+ else throw("Invalid node")))
93138 }
94139
95140
96141 func keyManagerPublicKey () = "%s__managerPublicKey"
97142
98143
99144 func keyPendingManagerPublicKey () = "%s__pendingManagerPublicKey"
100145
101146
102147 func managerPublicKeyOrUnit () = match getString(keyManagerPublicKey()) {
103148 case s: String =>
104149 fromBase58String(s)
105150 case _: Unit =>
106151 unit
107152 case _ =>
108153 throw("Match error")
109154 }
110155
111156
112157 func pendingManagerPublicKeyOrUnit () = match getString(keyPendingManagerPublicKey()) {
113158 case s: String =>
114159 fromBase58String(s)
115160 case _: Unit =>
116161 unit
117162 case _ =>
118163 throw("Match error")
119164 }
120165
121166
122167 func mustManager (i) = {
123168 let pd = throw("Permission denied")
124169 match managerPublicKeyOrUnit() {
125170 case pk: ByteVector =>
126171 if ((i.callerPublicKey == pk))
127172 then true
128173 else pd
129174 case _: Unit =>
130175 if ((i.caller == this))
131176 then true
132177 else pd
133178 case _ =>
134179 throw("Match error")
135180 }
136181 }
137182
138183
139184 @Callable(i)
140185 func setManager (pendingManagerPublicKey) = {
141186 let checkCaller = mustManager(i)
142187 if ((checkCaller == checkCaller))
143188 then {
144189 let checkManagerPublicKey = fromBase58String(pendingManagerPublicKey)
145190 if ((checkManagerPublicKey == checkManagerPublicKey))
146191 then [StringEntry(keyPendingManagerPublicKey(), pendingManagerPublicKey)]
147192 else throw("Strict value is not equal to itself.")
148193 }
149194 else throw("Strict value is not equal to itself.")
150195 }
151196
152197
153198
154199 @Callable(i)
155200 func confirmManager () = {
156201 let pm = pendingManagerPublicKeyOrUnit()
157202 let hasPM = if (isDefined(pm))
158203 then true
159204 else throw("No pending manager")
160205 if ((hasPM == hasPM))
161206 then {
162207 let checkPM = if ((i.callerPublicKey == value(pm)))
163208 then true
164209 else throw("You are not pending manager")
165210 if ((checkPM == checkPM))
166211 then [StringEntry(keyManagerPublicKey(), toBase58String(value(pm))), DeleteEntry(keyPendingManagerPublicKey())]
167212 else throw("Strict value is not equal to itself.")
168213 }
169214 else throw("Strict value is not equal to itself.")
170215 }
171216
172217
173218
174219 @Callable(i)
175220 func getUserGwxAmountAtHeight (userAddress,targetHeight) = {
176221 let boostingContractAddress = valueOrErrorMessage(addressFromString(getStrOrFail(this, keyBoostingContract)), "invalid boosting contract address")
177222 $Tuple2(nil, {
178223 let @ = invoke(boostingContractAddress, "getUserGwxAmountAtHeightREADONLY", [userAddress, targetHeight], nil)
179224 if ($isInstanceOf(@, "Int"))
180225 then @
181226 else throw("Couldn't cast Any to Int")
182227 })
183228 }
184229
185230
186231
187232 @Callable(i)
188233 func constructor (votingEmissionCandidateContract,boostingContract,epochLength) = {
189234 let cheks = [mustManager(i), if ((addressFromString(votingEmissionCandidateContract) != unit))
190235 then true
191236 else "invalid voting emission candidate contract address", if ((addressFromString(boostingContract) != unit))
192237 then true
193238 else "invalid boosting contract address", if ((epochLength > 0))
194239 then true
195240 else throw("invalid epoch length")]
196241 if ((cheks == cheks))
197242 then $Tuple2([StringEntry(keyVotingEmissionCandidateContract, votingEmissionCandidateContract), StringEntry(keyBoostingContract, boostingContract), IntegerEntry(keyEpochLength, epochLength)], unit)
198243 else throw("Strict value is not equal to itself.")
199244 }
200245
201246
202247
203248 @Callable(i)
204249 func create (amountAssetId,priceAssetId) = {
205250 let checks = [if ((toBase58String(i.caller.bytes) == valueOrElse(getString(this, keyVotingEmissionCandidateContract), "")))
206251 then true
207252 else mustManager(i)]
208253 if ((checks == checks))
209254 then {
210255 let pool = $Tuple2(amountAssetId, priceAssetId)
211256 let inListActions = [BooleanEntry(keyInList(pool), true)]
212257 let startHeightIsNotDefined = (getString(this, keyStartHeight) == unit)
213258 let startHeightActions = if (startHeightIsNotDefined)
214- then [IntegerEntry(keyStartHeight, height)]
259+ then [IntegerEntry(keyCurrentEpoch, 0), IntegerEntry(keyStartHeight, height)]
215260 else nil
216261 $Tuple2((inListActions ++ startHeightActions), unit)
217262 }
218263 else throw("Strict value is not equal to itself.")
219264 }
220265
221266
222267
223268 @Callable(i)
224269 func vote (amountAssetId,priceAssetId,share) = {
225270 let pool = $Tuple2(amountAssetId, priceAssetId)
226271 let startHeight = getIntOrFail(this, keyStartHeight)
227272 let epochLength = getIntOrFail(this, keyEpochLength)
228273 let endHeight = (startHeight + epochLength)
229- let shareUsed = valueOrElse(getIntOrUnit(this, keyShareUsed(i.caller)), 0)
230- let poolVoteShare = valueOrElse(getIntOrUnit(this, keyVoteShare(i.caller, pool)), 0)
274+ let shareUsed = valueOrElse(getInteger(this, keyShareUsed(i.caller)), 0)
275+ let poolVoteShare = valueOrElse(getInteger(this, keyVoteShare(i.caller, pool)), 0)
231276 let userMaxShare = (maxShare - shareUsed)
232277 let newShare = (poolVoteShare + share)
233278 let gwxAmountAtEndTotal = {
234279 let @ = invoke(this, "getUserGwxAmountAtHeight", [toBase58String(i.caller.bytes), endHeight], nil)
235280 if ($isInstanceOf(@, "Int"))
236281 then @
237282 else throw("Couldn't cast Any to Int")
238283 }
239284 let gwxAmountAtEnd = fraction(gwxAmountAtEndTotal, newShare, maxShare)
240285 let checks = [if ((getBoolean(keyInList(pool)) != unit))
241286 then true
242287 else throw("invalid assets"), if ((endHeight > height))
243288 then true
244289 else throw("invalid height"), if ((gwxAmountAtEnd > 0))
245290 then true
246291 else throw("you do not have gWX"), if (if ((share > 0))
247292 then (userMaxShare >= share)
248293 else false)
249294 then true
250295 else throw("invalid share")]
251296 if ((checks == checks))
252- then $Tuple2([IntegerEntry(keyShareUsed(i.caller), (shareUsed + share)), IntegerEntry(keyVoteShare(i.caller, pool), newShare), IntegerEntry(keyVoteGwx(i.caller, pool), gwxAmountAtEnd)], unit)
297+ then $Tuple2([IntegerEntry(keyShareUsed(i.caller), (shareUsed + share)), IntegerEntry(keyVoteShare(i.caller, pool), newShare)], unit)
253298 else throw("Strict value is not equal to itself.")
254299 }
255300
256301
257302
258303 @Callable(i)
259304 func cancelVote (amountAssetId,priceAssetId) = {
260305 let pool = $Tuple2(amountAssetId, priceAssetId)
261306 let startHeight = getIntOrFail(this, keyStartHeight)
262307 let epochLength = getIntOrFail(this, keyEpochLength)
263308 let endHeight = (startHeight + epochLength)
264- let poolVoteShare = valueOrElse(getIntOrUnit(this, keyVoteShare(i.caller, pool)), 0)
265- let shareUsed = valueOrElse(getIntOrUnit(this, keyShareUsed(i.caller)), 0)
309+ let poolVoteShare = valueOrElse(getInteger(this, keyVoteShare(i.caller, pool)), 0)
310+ let shareUsed = valueOrElse(getInteger(this, keyShareUsed(i.caller)), 0)
266311 let checks = [if ((getBoolean(keyInList(pool)) != unit))
267312 then true
268313 else throw("invalid assets"), if ((endHeight > height))
269314 then true
270315 else throw("invalid height"), if ((poolVoteShare > 0))
271316 then true
272317 else throw("no vote")]
273318 if ((checks == checks))
274- then $Tuple2([IntegerEntry(keyShareUsed(i.caller), max([(shareUsed - poolVoteShare), 0])), DeleteEntry(keyVoteShare(i.caller, pool)), DeleteEntry(keyVoteGwx(i.caller, pool))], unit)
319+ then $Tuple2([IntegerEntry(keyShareUsed(i.caller), max([(shareUsed - poolVoteShare), 0])), DeleteEntry(keyVoteShare(i.caller, pool))], unit)
275320 else throw("Strict value is not equal to itself.")
276321 }
277322
278323
279324
280325 @Callable(i)
281326 func setEpochLength (newEpochLength) = {
282327 let cheks = [mustManager(i), if ((newEpochLength > 0))
283328 then true
284329 else throw("invalid epoch length")]
285330 if ((cheks == cheks))
286331 then $Tuple2([IntegerEntry(keyEpochLength, newEpochLength)], unit)
287332 else throw("Strict value is not equal to itself.")
288333 }
289334
290335
291336
292337 @Callable(i)
293338 func finalize () = $Tuple2(nil, unit)
294339
295340
296341
297342 @Callable(i)
298343 func onVerificationLoss (assetId) = $Tuple2(nil, unit)
299344
300345
301346 @Verifier(tx)
302347 func verify () = {
303348 let targetPublicKey = match managerPublicKeyOrUnit() {
304349 case pk: ByteVector =>
305350 pk
306351 case _: Unit =>
307352 tx.senderPublicKey
308353 case _ =>
309354 throw("Match error")
310355 }
311356 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
312357 }
313358

github/deemru/w8io/873ac7e 
62.27 ms