tx · HCxDMm7x1iCs8tght6zzg5AJ8emCzFGWUb8Jzpp25Kr1

3MyVvNfXht9piazyf1e5BVFsqv1R7z5cWJL:  -0.03100000 Waves

2022.06.09 14:32 [2088772] smart account 3MyVvNfXht9piazyf1e5BVFsqv1R7z5cWJL > SELF 0.00000000 Waves

{ "type": 13, "id": "HCxDMm7x1iCs8tght6zzg5AJ8emCzFGWUb8Jzpp25Kr1", "fee": 3100000, "feeAssetId": null, "timestamp": 1654774340939, "version": 1, "sender": "3MyVvNfXht9piazyf1e5BVFsqv1R7z5cWJL", "senderPublicKey": "DnPyGWCgpQChvoQrnXQRcC9FtN32mPGrcog2wcKHdkVn", "proofs": [ "2PU89QRqE2oyBQdZEH1djtDdgGisTNxZNiCYUPcKWYkt6973tDvGSdieY7W1dEUvNCDD4n3Ldk3HPMVQds3YKNTj" ], "script": "base64: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AAACAAAAAQIAAAALTWF0Y2ggZXJyb3IBAAAAHXBlbmRpbmdNYW5hZ2VyUHVibGljS2V5T3JVbml0AAAAAAQAAAAHJG1hdGNoMAkABCIAAAABCQEAAAAaa2V5UGVuZGluZ01hbmFnZXJQdWJsaWNLZXkAAAAAAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAZTdHJpbmcEAAAAAXMFAAAAByRtYXRjaDAJAAJZAAAAAQUAAAABcwMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAEVW5pdAUAAAAEdW5pdAkAAAIAAAABAgAAAAtNYXRjaCBlcnJvcgAAAAAVcGVybWlzc2lvbkRlbmllZEVycm9yCQAAAgAAAAECAAAAEVBlcm1pc3Npb24gZGVuaWVkAQAAAAhtdXN0VGhpcwAAAAEAAAABaQMJAAAAAAAAAggFAAAAAWkAAAAGY2FsbGVyBQAAAAR0aGlzBgUAAAAVcGVybWlzc2lvbkRlbmllZEVycm9yAQAAAAttdXN0TWFuYWdlcgAAAAEAAAABaQQAAAAHJG1hdGNoMAkBAAAAFm1hbmFnZXJQdWJsaWNLZXlPclVuaXQAAAAAAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAApCeXRlVmVjdG9yBAAAAAJwawUAAAAHJG1hdGNoMAMJAAAAAAAAAggFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5BQAAAAJwawYFAAAAFXBlcm1pc3Npb25EZW5pZWRFcnJvcgMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAEVW5pdAkBAAAACG11c3RUaGlzAAAAAQUAAAABaQkAAAIAAAABAgAAAAtNYXRjaCBlcnJvcgAAAA8AAAABaQEAAAAKc2V0TWFuYWdlcgAAAAEAAAAXcGVuZGluZ01hbmFnZXJQdWJsaWNLZXkEAAAAC2NoZWNrQ2FsbGVyCQEAAAALbXVzdE1hbmFnZXIAAAABBQAAAAFpAwkAAAAAAAACBQAAAAtjaGVja0NhbGxlcgUAAAALY2hlY2tDYWxsZXIEAAAAFWNoZWNrTWFuYWdlclB1YmxpY0tleQkAAlkAAAABBQAAABdwZW5kaW5nTWFuYWdlclB1YmxpY0tleQMJAAAAAAAAAgUAAAAVY2hlY2tNYW5hZ2VyUHVibGljS2V5BQAAABVjaGVja01hbmFnZXJQdWJsaWNLZXkJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAGmtleVBlbmRpbmdNYW5hZ2VyUHVibGljS2V5AAAAAAUAAAAXcGVuZGluZ01hbmFnZXJQdWJsaWNLZXkFAAAAA25pbAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAWkBAAAADmNvbmZpcm1NYW5hZ2VyAAAAAAQAAAACcG0JAQAAAB1wZW5kaW5nTWFuYWdlclB1YmxpY0tleU9yVW5pdAAAAAAEAAAABWhhc1BNAwkBAAAACWlzRGVmaW5lZAAAAAEFAAAAAnBtBgkAAAIAAAABAgAAABJObyBwZW5kaW5nIG1hbmFnZXIDCQAAAAAAAAIFAAAABWhhc1BNBQAAAAVoYXNQTQQAAAAHY2hlY2tQTQMJAAAAAAAAAggFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5CQEAAAAFdmFsdWUAAAABBQAAAAJwbQYJAAACAAAAAQIAAAAbWW91IGFyZSBub3QgcGVuZGluZyBtYW5hZ2VyAwkAAAAAAAACBQAAAAdjaGVja1BNBQAAAAdjaGVja1BNCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABNrZXlNYW5hZ2VyUHVibGljS2V5AAAAAAkAAlgAAAABCQEAAAAFdmFsdWUAAAABBQAAAAJwbQkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABCQEAAAAaa2V5UGVuZGluZ01hbmFnZXJQdWJsaWNLZXkAAAAABQAAAANuaWwJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgAAAAFpAQAAABhnZXRVc2VyR3d4QW1vdW50QXRIZWlnaHQAAAACAAAAC3VzZXJBZGRyZXNzAAAADHRhcmdldEhlaWdodAQAAAAXYm9vc3RpbmdDb250cmFjdEFkZHJlc3MJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABCYAAAABCQEAAAAMZ2V0U3RyT3JGYWlsAAAAAgUAAAAEdGhpcwUAAAATa2V5Qm9vc3RpbmdDb250cmFjdAIAAAAhaW52YWxpZCBib29zdGluZyBjb250cmFjdCBhZGRyZXNzCQAFFAAAAAIFAAAAA25pbAoAAAAAAUAJAAP8AAAABAUAAAAXYm9vc3RpbmdDb250cmFjdEFkZHJlc3MCAAAAIGdldFVzZXJHd3hBbW91bnRBdEhlaWdodFJFQURPTkxZCQAETAAAAAIFAAAAC3VzZXJBZGRyZXNzCQAETAAAAAIFAAAADHRhcmdldEhlaWdodAUAAAADbmlsBQAAAANuaWwDCQAAAQAAAAIFAAAAAUACAAAAA0ludAUAAAABQAkAAAIAAAABAgAAABhDb3VsZG4ndCBjYXN0IEFueSB0byBJbnQAAAABaQEAAAALY29uc3RydWN0b3IAAAADAAAAH3ZvdGluZ0VtaXNzaW9uQ2FuZGlkYXRlQ29udHJhY3QAAAAQYm9vc3RpbmdDb250cmFjdAAAAAtlcG9jaExlbmd0aAQAAAAFY2hla3MJAARMAAAAAgkBAAAAC211c3RNYW5hZ2VyAAAAAQUAAAABaQkABEwAAAACAwkBAAAAAiE9AAAAAgkABCYAAAABBQAAAB92b3RpbmdFbWlzc2lvbkNhbmRpZGF0ZUNvbnRyYWN0BQAAAAR1bml0BgIAAAAyaW52YWxpZCB2b3RpbmcgZW1pc3Npb24gY2FuZGlkYXRlIGNvbnRyYWN0IGFkZHJlc3MJAARMAAAAAgMJAQAAAAIhPQAAAAIJAAQmAAAAAQUAAAAQYm9vc3RpbmdDb250cmFjdAUAAAAEdW5pdAYCAAAAIWludmFsaWQgYm9vc3RpbmcgY29udHJhY3QgYWRkcmVzcwkABEwAAAACAwkAAGYAAAACBQAAAAtlcG9jaExlbmd0aAAAAAAAAAAAAAYJAAACAAAAAQIAAAAUaW52YWxpZCBlcG9jaCBsZW5ndGgFAAAAA25pbAMJAAAAAAAAAgUAAAAFY2hla3MFAAAABWNoZWtzCQAFFAAAAAIJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAAia2V5Vm90aW5nRW1pc3Npb25DYW5kaWRhdGVDb250cmFjdAUAAAAfdm90aW5nRW1pc3Npb25DYW5kaWRhdGVDb250cmFjdAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACBQAAABNrZXlCb29zdGluZ0NvbnRyYWN0BQAAABBib29zdGluZ0NvbnRyYWN0CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAA5rZXlFcG9jaExlbmd0aAUAAAALZXBvY2hMZW5ndGgFAAAAA25pbAUAAAAEdW5pdAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAABaQEAAAAGY3JlYXRlAAAAAgAAAA1hbW91bnRBc3NldElkAAAADHByaWNlQXNzZXRJZAQAAAAGY2hlY2tzCQAETAAAAAIDCQAAAAAAAAIJAAJYAAAAAQgIBQAAAAFpAAAABmNhbGxlcgAAAAVieXRlcwkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABB0AAAACBQAAAAR0aGlzBQAAACJrZXlWb3RpbmdFbWlzc2lvbkNhbmRpZGF0ZUNvbnRyYWN0AgAAAAAGCQEAAAALbXVzdE1hbmFnZXIAAAABBQAAAAFpBQAAAANuaWwDCQAAAAAAAAIFAAAABmNoZWNrcwUAAAAGY2hlY2tzBAAAAARwb29sCQAFFAAAAAIFAAAADWFtb3VudEFzc2V0SWQFAAAADHByaWNlQXNzZXRJZAQAAAANaW5MaXN0QWN0aW9ucwkABE4AAAACCQAETAAAAAIJAQAAAAxCb29sZWFuRW50cnkAAAACCQEAAAAJa2V5SW5MaXN0AAAAAQUAAAAEcG9vbAYFAAAAA25pbAkBAAAAEWluc2VydE5vZGVBY3Rpb25zAAAAAgUAAAANcG9vbHNMaXN0TmFtZQkBAAAADHBvb2xUb1N0cmluZwAAAAEFAAAABHBvb2wEAAAAGGN1cnJlbnRFcG9jaElzTm90RGVmaW5lZAkAAAAAAAACCQAEHQAAAAIFAAAABHRoaXMFAAAAD2tleUN1cnJlbnRFcG9jaAUAAAAEdW5pdAQAAAASc3RhcnRIZWlnaHRBY3Rpb25zAwUAAAAYY3VycmVudEVwb2NoSXNOb3REZWZpbmVkBAAAAAVlcG9jaAAAAAAAAAAAAAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAPa2V5Q3VycmVudEVwb2NoBQAAAAVlcG9jaAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAFWtleVN0YXJ0SGVpZ2h0QnlFcG9jaAAAAAEFAAAABWVwb2NoBQAAAAZoZWlnaHQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAADmtleVN0YXJ0SGVpZ2h0BQAAAAZoZWlnaHQFAAAAA25pbAUAAAADbmlsCQAFFAAAAAIJAAROAAAAAgUAAAANaW5MaXN0QWN0aW9ucwUAAAASc3RhcnRIZWlnaHRBY3Rpb25zBQAAAAR1bml0CQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgAAAAFpAQAAAAR2b3RlAAAAAwAAAA1hbW91bnRBc3NldElkAAAADHByaWNlQXNzZXRJZAAAAAZhbW91bnQEAAAABHBvb2wJAAUUAAAAAgUAAAANYW1vdW50QXNzZXRJZAUAAAAMcHJpY2VBc3NldElkBAAAAAVlcG9jaAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzBQAAAA9rZXlDdXJyZW50RXBvY2gAAAAAAAAAAAAEAAAAC3N0YXJ0SGVpZ2h0CQEAAAAMZ2V0SW50T3JGYWlsAAAAAgUAAAAEdGhpcwkBAAAAFWtleVN0YXJ0SGVpZ2h0QnlFcG9jaAAAAAEFAAAABWVwb2NoBAAAAAtlcG9jaExlbmd0aAkBAAAADGdldEludE9yRmFpbAAAAAIFAAAABHRoaXMFAAAADmtleUVwb2NoTGVuZ3RoBAAAAAllbmRIZWlnaHQJAABkAAAAAgUAAAALc3RhcnRIZWlnaHQFAAAAC2Vwb2NoTGVuZ3RoBAAAABdmaW5hbGl6YXRpb25TdGFnZU9yVW5pdAkABBoAAAACBQAAAAR0aGlzBQAAABRrZXlGaW5hbGl6YXRpb25TdGFnZQQAAAAEdXNlZAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzCQEAAAAHa2V5VXNlZAAAAAIIBQAAAAFpAAAABmNhbGxlcgUAAAAFZXBvY2gAAAAAAAAAAAAEAAAABHZvdGUJAQAAAAt2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AAAABHVuaXQJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAWkBAAAACmNhbmNlbFZvdGUAAAACAAAADWFtb3VudEFzc2V0SWQAAAAMcHJpY2VBc3NldElkBAAAAARwb29sCQAFFAAAAAIFAAAADWFtb3VudEFzc2V0SWQFAAAADHByaWNlQXNzZXRJZAQAAAAFZXBvY2gJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwUAAAAPa2V5Q3VycmVudEVwb2NoAAAAAAAAAAAABAAAAAtzdGFydEhlaWdodAkBAAAADGdldEludE9yRmFpbAAAAAIFAAAABHRoaXMJAQAAABVrZXlTdGFydEhlaWdodEJ5RXBvY2gAAAABBQAAAAVlcG9jaAQAAAALZXBvY2hMZW5ndGgJAQAAAAxnZXRJbnRPckZhaWwAAAACBQAAAAR0aGlzBQAAAA5rZXlFcG9jaExlbmd0aAQAAAAJZW5kSGVpZ2h0CQAAZAAAAAIFAAAAC3N0YXJ0SGVpZ2h0BQAAAAtlcG9jaExlbmd0aAQAAAAXZmluYWxpemF0aW9uU3RhZ2VPclVuaXQJAAQaAAAAAgUAAAAEdGhpcwUAAAAUa2V5RmluYWxpemF0aW9uU3RhZ2UEAAAABHVzZWQJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwkBAAAAB2tleVVzZWQAAAACCAUAAAABaQAAAAZjYWxsZXIFAAAABWVwb2NoAAAAAAAAAAAABAAAAAR2b3RlCQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMJAQAAAAdrZXlWb3RlAAAAAwUAAAAEcG9vbAgFAAAAAWkAAAAGY2FsbGVyBQAAAAVlcG9jaAAAAAAAAAAAAAQAAAAKcG9vbFJlc3VsdAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzCQEAAAAPa2V5Vm90aW5nUmVzdWx0AAAAAgUAAAAEcG9vbAUAAAAFZXBvY2gAAAAAAAAAAAAEAAAACnRvdGFsVm90ZXMJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwkBAAAADWtleVRv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dHIEAAAAC2NoZWNrQ2FsbGVyCQEAAAAIbXVzdFRoaXMAAAABBQAAAAFpAwkAAAAAAAACBQAAAAtjaGVja0NhbGxlcgUAAAALY2hlY2tDYWxsZXIEAAAAC3VzZXJBZGRyZXNzCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQmAAAAAQUAAAAOdXNlckFkZHJlc3NTdHIJAAEsAAAAAgIAAAAqcHJvY2Vzc1ZvdGVJTlRFUk5BTDogaW52YWxpZCB1c2VyIGFkZHJlc3MgBQAAAA51c2VyQWRkcmVzc1N0cgQAAAAFZXBvY2gJAQAAAAxnZXRJbnRPckZhaWwAAAACBQAAAAR0aGlzBQAAAA9rZXlDdXJyZW50RXBvY2gEAAAADWVwb2NoUHJldmlvdXMJAABlAAAAAgUAAAAFZXBvY2gAAAAAAAAAAAEEAAAAC2Vwb2NoTGVuZ3RoCQEAAAAMZ2V0SW50T3JGYWlsAAAAAgUAAAAEdGhpcwUAAAAOa2V5RXBvY2hMZW5ndGgEAAAAC3N0YXJ0SGVpZ2h0CQEAAAAMZ2V0SW50T3JGYWlsAAAAAgUAAAAEdGhpcwkBAAAAFWtleVN0YXJ0SGVpZ2h0QnlFcG9jaAAAAAEFAAAABWVwb2NoBAAAAAllbmRIZWlnaHQJAABkAAAAAgUAAAALc3RhcnRIZWlnaHQFAAAAC2Vwb2NoTGVuZ3RoBAAAABNzdGFydEhlaWdodFByZXZpb3VzCQEAAAAMZ2V0SW50T3JGYWlsAAAAAgUAAAAEdGhpcwkBAAAAFWtleVN0YXJ0SGVpZ2h0QnlFcG9jaAAAAAEFAAAADWVwb2NoUHJldmlvdXMEAAAAEWVuZEhlaWdodFByZXZpb3VzCQAAZAAAAAIFAAAAE3N0YXJ0SGVpZ2h0UHJldmlvdXMFAAAAC2Vwb2NoTGVuZ3RoBAAAABBjaGVja1RhcmdldEVwb2NoAwkAAGcAAAACBQAAAA1lcG9jaFByZXZpb3VzAAAAAAAAAAAABgkAAAIAAAABAgAAACtwcm9jZXNzVm90ZUlOVEVSTkFMOiBpbnZhbGlkIHByZXZpb3VzIGVwb2NoAwkAAAAAAAACBQAAABBjaGVja1RhcmdldEVwb2NoBQAAABBjaGVja1RhcmdldEVwb2NoBAAAAARwb29sCQEAAAAMc3RyaW5nVG9Qb29sAAAAAQUAAAAHcG9vbFN0cgQAAAATZ3d4QW1vdW50QXRFbmRUb3RhbAoAAAAAAUAJAAP8AAAABAUAAAAEdGhpcwIAAAAYZ2V0VXNlckd3eEFtb3VudEF0SGVpZ2h0CQAETAAAAAIFAAAADnVzZXJBZGRyZXNzU3RyCQAETAAAAAIFAAAACWVuZEhlaWdodAUAAAADbmlsBQAAAANuaWwDCQAAAQAAAAIFAAAAAUACAAAAA0ludAUAAAABQAkAAAIAAAABAgAAABhDb3VsZG4ndCBjYXN0IEFueSB0byBJbnQEAAAAG2d3eEFtb3VudEF0RW5kVG90YWxQcmV2aW91cwoAAAAAAUAJAAP8AAAABAUAAAAEdGhpcwIAAAAYZ2V0VXNlckd3eEFtb3VudEF0SGVpZ2h0CQAETAAAAAIFAAAADnVzZXJBZGRyZXNzU3RyCQAETAAAAAIFAAAAEWVuZEhlaWdodFByZXZpb3VzBQAAAANuaWwFAAAAA25pbAMJAAABAAAAAgUAAAABQAIAAAADSW50BQAAAAFACQAAAgAAAAECAAAAGENvdWxkbid0IGNhc3QgQW55IHRvIEludAQAAAAKdG90YWxWb3RlcwkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABB8AAAABCQEAAAANa2V5VG90YWxWb3RlcwAAAAEFAAAABWVwb2NoAAAAAAAAAAAABAAAAAx2b3RpbmdSZXN1bHQJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQfAAAAAQkBAAAAD2tleVZvdGluZ1Jlc3VsdAAAAAIFAAAABHBvb2wFAAAABWVwb2NoAAAAAAAAAAAABAAAAAx2b3RlUHJldmlvdXMJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB8AAAABCQEAAAAHa2V5Vm90ZQAAAAMFAAAABHBvb2wFAAAAC3VzZXJBZGRyZXNzBQAAAA1lcG9jaFByZXZpb3VzCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAFHByb2Nlc3NWb3RlSU5URVJOQUwgBQAAAAdwb29sU3RyAgAAAAEgBQAAAA51c2VyQWRkcmVzc1N0cgIAAAASOiBubyBwcmV2aW91cyB2b3RlBAAAAAR1c2VkCQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMJAQAAAAdrZXlVc2VkAAAAAgUAAAALdXNlckFkZHJlc3MFAAAABWVwb2NoAAAAAAAAAAAABAAAAAduZXdWb3RlCQAAawAAAAMFAAAADHZvdGVQcmV2aW91cwUAAAATZ3d4QW1vdW50QXRFbmRUb3RhbAUAAAAbZ3d4QW1vdW50QXRFbmRUb3RhbFByZXZpb3VzBAAAAAdhY3Rpb25zAwkAAGYAAAACBQAAAAduZXdWb3RlAAAAAAAAAAAACQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAHa2V5Vm90ZQAAAAMFAAAABHBvb2wFAAAAC3VzZXJBZGRyZXNzBQAAAAVlcG9jaAUAAAAHbmV3Vm90ZQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAADWtleVRvdGFsVm90ZXMAAAABBQAAAAVlcG9jaAkAAGQAAAACBQAAAAp0b3RhbFZvdGVzBQAAAAduZXdWb3RlCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAPa2V5Vm90aW5nUmVzdWx0AAAAAgUAAAAEcG9vbAUAAAAFZXBvY2gJAABkAAAAAgUAAAAMdm90aW5nUmVzdWx0BQAAAAduZXdWb3RlCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAHa2V5VXNlZAAAAAIFAAAAC3VzZXJBZGRyZXNzBQAAAAVlcG9jaAkAAGQAAAACBQAAAAR1c2VkBQAAAAduZXdWb3RlBQAAAANuaWwJAQAAABFkZWxldGVOb2RlQWN0aW9ucwAAAAIJAQAAABBnZXRWb3Rlc0xpc3ROYW1lAAAAAQUAAAAEcG9vbAUAAAAOdXNlckFkZHJlc3NTdHIJAAUUAAAAAgUAAAAHYWN0aW9ucwUAAAAEdW5pdAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAWkBAAAAE3Byb2Nlc3NQb29sSU5URVJOQUwAAAABAAAAB3Bvb2xTdHIEAAAAC2NoZWNrQ2FsbGVyCQEAAAAIbXVzdFRoaXMAAAABBQAAAAFpAwkAAAAAAAACBQAAAAtjaGVja0NhbGxlcgUAAAALY2hlY2tDYWxsZXIEAAAAC3RhcmdldEVwb2NoCQAAZQAAAAIJAQAAAAxnZXRJbnRPckZhaWwAAAACBQAAAAR0aGlzBQAAAA9rZXlDdXJyZW50RXBvY2gAAAAAAAAAAAEEAAAAEGNoZWNrVGFyZ2V0RXBvY2gDCQAAZwAAAAIFAAAAC3RhcmdldEVwb2NoAAAAAAAAAAAABgkAAAIAAAABAgAAAClwcm9jZXNzUG9vbElOVEVSTkFMOiBpbnZhbGlkIHRhcmdldCBlcG9jaAMJAAAAAAAAAgUAAAAQY2hlY2tUYXJnZXRFcG9jaAUAAAAQY2hlY2tUYXJnZXRFcG9jaAQAAAAEcG9vbAkBAAAADHN0cmluZ1RvUG9vbAAAAAEFAAAAB3Bvb2xTdHIEAAAACnRvdGFsVm90ZXMJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwkBAAAADWtleVRvdGFsVm90ZXMAAAABBQAAAAt0YXJnZXRFcG9jaAAAAAAAAAAAAAQAAAAMdm90aW5nUmVzdWx0CQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMJAQAAAA9rZXlWb3RpbmdSZXN1bHQAAAACBQAAAARwb29sBQAAAAt0YXJnZXRFcG9jaAAAAAAAAAAAAAQAAAAFc2hhcmUDCQAAAAAAAAIFAAAACnRvdGFsVm90ZXMAAAAAAAAAAAAAAAAAAAAAAAAJAABrAAAAAwUAAAAMdm90aW5nUmVzdWx0BQAAAA5wb29sV2VpZ2h0TXVsdAUAAAAKdG90YWxWb3RlcwkABRQAAAACCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAMa2V5UG9vbFNoYXJlAAAAAgUAAAAEcG9vbAUAAAALdGFyZ2V0RXBvY2gFAAAABXNoYXJlBQAAAANuaWwFAAAABHVuaXQJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgAAAAFpAQAAAA5maW5hbGl6ZUhlbHBlcgAAAAAEAAAABWVwb2NoCQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMFAAAAD2tleUN1cnJlbnRFcG9jaAAAAAAAAAAAAAQAAAANcHJldmlvdXNFcG9jaAkAAGUAAAACBQAAAAVlcG9jaAAAAAAAAAAAAQQAAAALc3RhcnRIZWlnaHQJAQAAAAxnZXRJbnRPckZhaWwAAAACBQAAAAR0aGlzCQEAAAAVa2V5U3RhcnRIZWlnaHRCeUVwb2NoAAAAAQUAAAAFZXBvY2gEAAAAC2Vwb2NoTGVuZ3RoCQEAAAAMZ2V0SW50T3JGYWlsAAAAAgUAAAAEdGhpcwUAAAAOa2V5RXBvY2hMZW5ndGgEAAAACWVuZEhlaWdodAkAAGQAAAACBQAAAAtzdGFydEhlaWdodAUAAAALZXBvY2hMZW5ndGgEAAAAF2ZpbmFsaXphdGlvblN0YWdlT3JVbml0CQAEGgAAAAIFAAAABHRoaXMFAAAAFGtleUZpbmFsaXphdGlvblN0YWdlAwkAAGcAAAACBQAAAAZoZWlnaHQFAAAACWVuZEhlaWdodAQAAAAIbmV3RXBvY2gJAABkAAAAAgUAAAAFZXBvY2gAAAAAAAAAAAEJAAUUAAAAAgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAFWtleVN0YXJ0SGVpZ2h0QnlFcG9jaAAAAAEFAAAACG5ld0Vwb2NoBQAAAAZoZWlnaHQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAADmtleVN0YXJ0SGVpZ2h0BQAAAAZoZWlnaHQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAD2tleUN1cnJlbnRFcG9jaAUAAAAIbmV3RXBvY2gJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAFGtleUZpbmFsaXphdGlvblN0YWdlBQAAABZmaW5hbGl6YXRpb25TdGFnZVRvdGFsBQAAAANuaWwGAwkAAAAAAAACBQAAABdmaW5hbGl6YXRpb25TdGFnZU9yVW5pdAUAAAAEdW5pdAkABRQAAAACBQAAAANuaWwHAwkAAAAAAAACBQAAABdmaW5hbGl6YXRpb25TdGFnZU9yVW5pdAUAAAAWZmluYWxpemF0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", "chainId": 84, "height": 2088772, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 2ckhnPmFDhBrmzLc95dfUtfFKT4RYizrSE15CyVDUmSu Next: E39yjHdr7KJv59ACF6inmmafxx8SGNXUnQWkMYRnA7Wf Diff:
OldNewDifferences
3232 func keyStartHeightByEpoch (epoch) = makeString(["%s%d", "startHeight", toString(epoch)], separator)
3333
3434
35+func keyFinalized (epoch) = makeString(["%s%d", "finalized", toString(epoch)], separator)
36+
37+
3538 func keyInList (pool) = {
36- let $t010801120 = pool
37- let amountAssetId = $t010801120._1
38- let priceAssetId = $t010801120._2
39+ let $t011741214 = pool
40+ let amountAssetId = $t011741214._1
41+ let priceAssetId = $t011741214._2
3942 makeString(["%s%s%s", "inList", amountAssetId, priceAssetId], separator)
4043 }
4144
4447
4548
4649 func keyVote (pool,address,epoch) = {
47- let $t013941434 = pool
48- let amountAssetId = $t013941434._1
49- let priceAssetId = $t013941434._2
50+ let $t014881528 = pool
51+ let amountAssetId = $t014881528._1
52+ let priceAssetId = $t014881528._2
5053 makeString(["%s%s%s%s%d", "vote", amountAssetId, priceAssetId, toString(address), toString(epoch)], separator)
5154 }
5255
5356
5457 func keyVotingResult (pool,epoch) = {
55- let $t016161656 = pool
56- let amountAssetId = $t016161656._1
57- let priceAssetId = $t016161656._2
58+ let $t017101750 = pool
59+ let amountAssetId = $t017101750._1
60+ let priceAssetId = $t017101750._2
5861 makeString(["%s%s%s%d", "votingResult", amountAssetId, priceAssetId, toString(epoch)], separator)
5962 }
6063
6164
6265 func keyPoolShare (pool,epoch) = {
63- let $t018211861 = pool
64- let amountAssetId = $t018211861._1
65- let priceAssetId = $t018211861._2
66+ let $t019151955 = pool
67+ let amountAssetId = $t019151955._1
68+ let priceAssetId = $t019151955._2
6669 makeString(["%s%s%s%d", "poolShare", amountAssetId, priceAssetId, toString(epoch)], separator)
6770 }
6871
113116 let poolsListName = "pools"
114117
115118 func getVotesListName (pool) = {
116- let $t029673007 = pool
117- let amountAssetId = $t029673007._1
118- let priceAssetId = $t029673007._2
119+ let $t030613101 = pool
120+ let amountAssetId = $t030613101._1
121+ let priceAssetId = $t030613101._2
119122 makeString(["votes", amountAssetId, priceAssetId], separator)
120123 }
121124
509512 @Callable(i)
510513 func finalizeHelper () = {
511514 let epoch = valueOrElse(getInteger(this, keyCurrentEpoch), 0)
515+ let previousEpoch = (epoch - 1)
512516 let startHeight = getIntOrFail(this, keyStartHeightByEpoch(epoch))
513517 let epochLength = getIntOrFail(this, keyEpochLength)
514518 let endHeight = (startHeight + epochLength)
574578 case _: Unit =>
575579 match getString(keyListHead(poolsListName)) {
576580 case _: Unit =>
577- $Tuple2([DeleteEntry(keyFinalizationStage)], true)
581+ $Tuple2([DeleteEntry(keyFinalizationStage), BooleanEntry(keyFinalized(previousEpoch), true)], true)
578582 case nextPoolStr: String =>
579583 $Tuple2([StringEntry(keyNextPool, nextPoolStr)], true)
580584 case _ =>
587591 let nextPoolOrUnit = getString(keyListNext(poolsListName, poolStr))
588592 match nextPoolOrUnit {
589593 case _: Unit =>
590- $Tuple2([DeleteEntry(keyFinalizationStage), DeleteEntry(keyNextPool)], true)
594+ $Tuple2([DeleteEntry(keyFinalizationStage), DeleteEntry(keyNextPool), BooleanEntry(keyFinalized(previousEpoch), true)], true)
591595 case nextPoolStr: String =>
592596 $Tuple2([StringEntry(keyNextPool, nextPoolStr)], true)
593597 case _ =>
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let separator = "__"
55
66 let poolWeightMult = 100000000
77
88 let maxDepthDefault = 10
99
1010 let finalizationStageTotal = 0
1111
1212 let finalizationStageShares = 1
1313
1414 let keyEpochLength = makeString(["%s", "epochLength"], separator)
1515
1616 let keyCurrentEpoch = makeString(["%s", "currentEpoch"], separator)
1717
1818 let keyMaxDepth = makeString(["%s", "maxDepth"], separator)
1919
2020 let keyVotingEmissionCandidateContract = makeString(["%s", "votingEmissionCandidateContract"], separator)
2121
2222 let keyBoostingContract = makeString(["%s", "boostingContract"], separator)
2323
2424 let keyFinalizationStage = makeString(["%s", "finalizationStage"], separator)
2525
2626 let keyNextPool = makeString(["%s", "nextPool"], separator)
2727
2828 let keyNextUser = makeString(["%s", "nextUser"], separator)
2929
3030 let keyStartHeight = makeString(["%s", "startHeight"], separator)
3131
3232 func keyStartHeightByEpoch (epoch) = makeString(["%s%d", "startHeight", toString(epoch)], separator)
3333
3434
35+func keyFinalized (epoch) = makeString(["%s%d", "finalized", toString(epoch)], separator)
36+
37+
3538 func keyInList (pool) = {
36- let $t010801120 = pool
37- let amountAssetId = $t010801120._1
38- let priceAssetId = $t010801120._2
39+ let $t011741214 = pool
40+ let amountAssetId = $t011741214._1
41+ let priceAssetId = $t011741214._2
3942 makeString(["%s%s%s", "inList", amountAssetId, priceAssetId], separator)
4043 }
4144
4245
4346 func keyUsed (address,epoch) = makeString(["%s%s%d", "used", toString(address), toString(epoch)], separator)
4447
4548
4649 func keyVote (pool,address,epoch) = {
47- let $t013941434 = pool
48- let amountAssetId = $t013941434._1
49- let priceAssetId = $t013941434._2
50+ let $t014881528 = pool
51+ let amountAssetId = $t014881528._1
52+ let priceAssetId = $t014881528._2
5053 makeString(["%s%s%s%s%d", "vote", amountAssetId, priceAssetId, toString(address), toString(epoch)], separator)
5154 }
5255
5356
5457 func keyVotingResult (pool,epoch) = {
55- let $t016161656 = pool
56- let amountAssetId = $t016161656._1
57- let priceAssetId = $t016161656._2
58+ let $t017101750 = pool
59+ let amountAssetId = $t017101750._1
60+ let priceAssetId = $t017101750._2
5861 makeString(["%s%s%s%d", "votingResult", amountAssetId, priceAssetId, toString(epoch)], separator)
5962 }
6063
6164
6265 func keyPoolShare (pool,epoch) = {
63- let $t018211861 = pool
64- let amountAssetId = $t018211861._1
65- let priceAssetId = $t018211861._2
66+ let $t019151955 = pool
67+ let amountAssetId = $t019151955._1
68+ let priceAssetId = $t019151955._2
6669 makeString(["%s%s%s%d", "poolShare", amountAssetId, priceAssetId, toString(epoch)], separator)
6770 }
6871
6972
7073 func keyTotalVotes (epoch) = makeString(["%s%d", "totalVotes", toString(epoch)], separator)
7174
7275
7376 func getValueOrFail (address,key,type) = {
7477 let error = makeString(["mandatory ", toString(address), ".", key, " is not defined"], "")
7578 valueOrErrorMessage( match type {
7679 case str: String =>
7780 getString(address, key)
7881 case int: Int =>
7982 getInteger(address, key)
8083 case _ =>
8184 throw("invalid entry type")
8285 }, error)
8386 }
8487
8588
8689 func getStrOrFail (address,key) = {
8790 let @ = getValueOrFail(address, key, "")
8891 if ($isInstanceOf(@, "String"))
8992 then @
9093 else throw("Couldn't cast Int|String to String")
9194 }
9295
9396
9497 func getIntOrFail (address,key) = {
9598 let @ = getValueOrFail(address, key, 0)
9699 if ($isInstanceOf(@, "Int"))
97100 then @
98101 else throw("Couldn't cast Int|String to Int")
99102 }
100103
101104
102105 func poolToString (pool) = ((pool._1 + separator) + pool._2)
103106
104107
105108 func stringToPool (str) = {
106109 let parts = split(str, separator)
107110 if ((size(parts) == 2))
108111 then $Tuple2(parts[0], parts[1])
109112 else throw("invalid pool string")
110113 }
111114
112115
113116 let poolsListName = "pools"
114117
115118 func getVotesListName (pool) = {
116- let $t029673007 = pool
117- let amountAssetId = $t029673007._1
118- let priceAssetId = $t029673007._2
119+ let $t030613101 = pool
120+ let amountAssetId = $t030613101._1
121+ let priceAssetId = $t030613101._2
119122 makeString(["votes", amountAssetId, priceAssetId], separator)
120123 }
121124
122125
123126 func keyListHead (listName) = {
124127 let meta = if ((listName == poolsListName))
125128 then "%s%s"
126129 else "%s%s%s%s"
127130 makeString([meta, listName, "head"], separator)
128131 }
129132
130133
131134 func keyListSize (listName) = {
132135 let meta = if ((listName == poolsListName))
133136 then "%s%s"
134137 else "%s%s%s%s"
135138 makeString([meta, listName, "size"], separator)
136139 }
137140
138141
139142 func keyListPrev (listName,id) = {
140143 let meta = if ((listName == poolsListName))
141144 then "%s%s%s%s"
142145 else "%s%s%s%s%s"
143146 makeString([meta, listName, id, "prev"], separator)
144147 }
145148
146149
147150 func keyListNext (listName,id) = {
148151 let meta = if ((listName == poolsListName))
149152 then "%s%s%s%s"
150153 else "%s%s%s%s%s"
151154 makeString([meta, listName, id, "next"], separator)
152155 }
153156
154157
155158 func containsNode (listName,id) = {
156159 let headOrUnit = getString(this, keyListHead(listName))
157160 let prevOrUnit = getString(this, keyListPrev(listName, id))
158161 let nextOrUnit = getString(this, keyListNext(listName, id))
159162 if (if ((id == valueOrElse(headOrUnit, "")))
160163 then true
161164 else (prevOrUnit != unit))
162165 then true
163166 else (nextOrUnit != unit)
164167 }
165168
166169
167170 func insertNodeActions (listName,id) = {
168171 let headOrUnit = getString(this, keyListHead(listName))
169172 let listSize = valueOrElse(getInteger(this, keyListSize(listName)), 0)
170173 let checkNode = if (!(containsNode(listName, id)))
171174 then true
172175 else throw("Node exists")
173176 if ((checkNode == checkNode))
174177 then (([IntegerEntry(keyListSize(listName), (listSize + 1))] ++ (if ((headOrUnit != unit))
175178 then [StringEntry(keyListNext(listName, id), value(headOrUnit)), StringEntry(keyListPrev(listName, value(headOrUnit)), id)]
176179 else nil)) ++ [StringEntry(keyListHead(listName), id)])
177180 else throw("Strict value is not equal to itself.")
178181 }
179182
180183
181184 func deleteNodeActions (listName,id) = {
182185 let headOrUnit = getString(this, keyListHead(listName))
183186 let listSize = valueOrElse(getInteger(this, keyListSize(listName)), 0)
184187 let prevOrUnit = getString(this, keyListPrev(listName, id))
185188 let nextOrUnit = getString(this, keyListNext(listName, id))
186189 ([IntegerEntry(keyListSize(listName), (listSize - 1))] ++ (if (if ((prevOrUnit != unit))
187190 then (nextOrUnit != unit)
188191 else false)
189192 then [StringEntry(keyListNext(listName, value(prevOrUnit)), value(nextOrUnit)), StringEntry(keyListPrev(listName, value(nextOrUnit)), value(prevOrUnit)), DeleteEntry(keyListPrev(listName, id)), DeleteEntry(keyListNext(listName, id))]
190193 else if ((nextOrUnit != unit))
191194 then [StringEntry(keyListHead(listName), value(nextOrUnit)), DeleteEntry(keyListNext(listName, id)), DeleteEntry(keyListPrev(listName, value(nextOrUnit)))]
192195 else if ((prevOrUnit != unit))
193196 then [DeleteEntry(keyListPrev(listName, id)), DeleteEntry(keyListNext(listName, value(prevOrUnit)))]
194197 else if ((id == valueOrElse(headOrUnit, "")))
195198 then [DeleteEntry(keyListHead(listName))]
196199 else throw(((("invalid node: " + listName) + ".") + id))))
197200 }
198201
199202
200203 func keyManagerPublicKey () = "%s__managerPublicKey"
201204
202205
203206 func keyPendingManagerPublicKey () = "%s__pendingManagerPublicKey"
204207
205208
206209 func managerPublicKeyOrUnit () = match getString(keyManagerPublicKey()) {
207210 case s: String =>
208211 fromBase58String(s)
209212 case _: Unit =>
210213 unit
211214 case _ =>
212215 throw("Match error")
213216 }
214217
215218
216219 func pendingManagerPublicKeyOrUnit () = match getString(keyPendingManagerPublicKey()) {
217220 case s: String =>
218221 fromBase58String(s)
219222 case _: Unit =>
220223 unit
221224 case _ =>
222225 throw("Match error")
223226 }
224227
225228
226229 let permissionDeniedError = throw("Permission denied")
227230
228231 func mustThis (i) = if ((i.caller == this))
229232 then true
230233 else permissionDeniedError
231234
232235
233236 func mustManager (i) = match managerPublicKeyOrUnit() {
234237 case pk: ByteVector =>
235238 if ((i.callerPublicKey == pk))
236239 then true
237240 else permissionDeniedError
238241 case _: Unit =>
239242 mustThis(i)
240243 case _ =>
241244 throw("Match error")
242245 }
243246
244247
245248 @Callable(i)
246249 func setManager (pendingManagerPublicKey) = {
247250 let checkCaller = mustManager(i)
248251 if ((checkCaller == checkCaller))
249252 then {
250253 let checkManagerPublicKey = fromBase58String(pendingManagerPublicKey)
251254 if ((checkManagerPublicKey == checkManagerPublicKey))
252255 then [StringEntry(keyPendingManagerPublicKey(), pendingManagerPublicKey)]
253256 else throw("Strict value is not equal to itself.")
254257 }
255258 else throw("Strict value is not equal to itself.")
256259 }
257260
258261
259262
260263 @Callable(i)
261264 func confirmManager () = {
262265 let pm = pendingManagerPublicKeyOrUnit()
263266 let hasPM = if (isDefined(pm))
264267 then true
265268 else throw("No pending manager")
266269 if ((hasPM == hasPM))
267270 then {
268271 let checkPM = if ((i.callerPublicKey == value(pm)))
269272 then true
270273 else throw("You are not pending manager")
271274 if ((checkPM == checkPM))
272275 then [StringEntry(keyManagerPublicKey(), toBase58String(value(pm))), DeleteEntry(keyPendingManagerPublicKey())]
273276 else throw("Strict value is not equal to itself.")
274277 }
275278 else throw("Strict value is not equal to itself.")
276279 }
277280
278281
279282
280283 @Callable(i)
281284 func getUserGwxAmountAtHeight (userAddress,targetHeight) = {
282285 let boostingContractAddress = valueOrErrorMessage(addressFromString(getStrOrFail(this, keyBoostingContract)), "invalid boosting contract address")
283286 $Tuple2(nil, {
284287 let @ = invoke(boostingContractAddress, "getUserGwxAmountAtHeightREADONLY", [userAddress, targetHeight], nil)
285288 if ($isInstanceOf(@, "Int"))
286289 then @
287290 else throw("Couldn't cast Any to Int")
288291 })
289292 }
290293
291294
292295
293296 @Callable(i)
294297 func constructor (votingEmissionCandidateContract,boostingContract,epochLength) = {
295298 let cheks = [mustManager(i), if ((addressFromString(votingEmissionCandidateContract) != unit))
296299 then true
297300 else "invalid voting emission candidate contract address", if ((addressFromString(boostingContract) != unit))
298301 then true
299302 else "invalid boosting contract address", if ((epochLength > 0))
300303 then true
301304 else throw("invalid epoch length")]
302305 if ((cheks == cheks))
303306 then $Tuple2([StringEntry(keyVotingEmissionCandidateContract, votingEmissionCandidateContract), StringEntry(keyBoostingContract, boostingContract), IntegerEntry(keyEpochLength, epochLength)], unit)
304307 else throw("Strict value is not equal to itself.")
305308 }
306309
307310
308311
309312 @Callable(i)
310313 func create (amountAssetId,priceAssetId) = {
311314 let checks = [if ((toBase58String(i.caller.bytes) == valueOrElse(getString(this, keyVotingEmissionCandidateContract), "")))
312315 then true
313316 else mustManager(i)]
314317 if ((checks == checks))
315318 then {
316319 let pool = $Tuple2(amountAssetId, priceAssetId)
317320 let inListActions = ([BooleanEntry(keyInList(pool), true)] ++ insertNodeActions(poolsListName, poolToString(pool)))
318321 let currentEpochIsNotDefined = (getString(this, keyCurrentEpoch) == unit)
319322 let startHeightActions = if (currentEpochIsNotDefined)
320323 then {
321324 let epoch = 0
322325 [IntegerEntry(keyCurrentEpoch, epoch), IntegerEntry(keyStartHeightByEpoch(epoch), height), IntegerEntry(keyStartHeight, height)]
323326 }
324327 else nil
325328 $Tuple2((inListActions ++ startHeightActions), unit)
326329 }
327330 else throw("Strict value is not equal to itself.")
328331 }
329332
330333
331334
332335 @Callable(i)
333336 func vote (amountAssetId,priceAssetId,amount) = {
334337 let pool = $Tuple2(amountAssetId, priceAssetId)
335338 let epoch = valueOrElse(getInteger(this, keyCurrentEpoch), 0)
336339 let startHeight = getIntOrFail(this, keyStartHeightByEpoch(epoch))
337340 let epochLength = getIntOrFail(this, keyEpochLength)
338341 let endHeight = (startHeight + epochLength)
339342 let finalizationStageOrUnit = getInteger(this, keyFinalizationStage)
340343 let used = valueOrElse(getInteger(this, keyUsed(i.caller, epoch)), 0)
341344 let vote = valueOrElse(getInteger(this, keyVote(pool, i.caller, epoch)), 0)
342345 let poolResult = valueOrElse(getInteger(this, keyVotingResult(pool, epoch)), 0)
343346 let totalVotes = valueOrElse(getInteger(this, keyTotalVotes(epoch)), 0)
344347 let gwxAmountAtEndTotal = {
345348 let @ = invoke(this, "getUserGwxAmountAtHeight", [toBase58String(i.caller.bytes), endHeight], nil)
346349 if ($isInstanceOf(@, "Int"))
347350 then @
348351 else throw("Couldn't cast Any to Int")
349352 }
350353 let available = (gwxAmountAtEndTotal - used)
351354 let newVote = (vote + amount)
352355 let checks = [if ((getBoolean(keyInList(pool)) != unit))
353356 then true
354357 else throw("invalid assets"), if ((endHeight > height))
355358 then true
356359 else throw("invalid height"), if ((finalizationStageOrUnit == unit))
357360 then true
358361 else throw("finalization in progress"), if ((gwxAmountAtEndTotal > 0))
359362 then true
360363 else throw("you do not have gWX"), if (if ((amount > 0))
361364 then (available >= amount)
362365 else false)
363366 then true
364367 else throw("invalid amount")]
365368 if ((checks == checks))
366369 then {
367370 let votesListName = getVotesListName(pool)
368371 let userAddressStr = toString(i.caller)
369372 let votesListActions = if (containsNode(votesListName, userAddressStr))
370373 then nil
371374 else insertNodeActions(votesListName, userAddressStr)
372375 $Tuple2(([IntegerEntry(keyUsed(i.caller, epoch), (used + amount)), IntegerEntry(keyVote(pool, i.caller, epoch), newVote), IntegerEntry(keyVotingResult(pool, epoch), (poolResult + amount)), IntegerEntry(keyTotalVotes(epoch), (totalVotes + amount))] ++ votesListActions), unit)
373376 }
374377 else throw("Strict value is not equal to itself.")
375378 }
376379
377380
378381
379382 @Callable(i)
380383 func cancelVote (amountAssetId,priceAssetId) = {
381384 let pool = $Tuple2(amountAssetId, priceAssetId)
382385 let epoch = valueOrElse(getInteger(this, keyCurrentEpoch), 0)
383386 let startHeight = getIntOrFail(this, keyStartHeightByEpoch(epoch))
384387 let epochLength = getIntOrFail(this, keyEpochLength)
385388 let endHeight = (startHeight + epochLength)
386389 let finalizationStageOrUnit = getInteger(this, keyFinalizationStage)
387390 let used = valueOrElse(getInteger(this, keyUsed(i.caller, epoch)), 0)
388391 let vote = valueOrElse(getInteger(this, keyVote(pool, i.caller, epoch)), 0)
389392 let poolResult = valueOrElse(getInteger(this, keyVotingResult(pool, epoch)), 0)
390393 let totalVotes = valueOrElse(getInteger(this, keyTotalVotes(epoch)), 0)
391394 let checks = [if ((getBoolean(keyInList(pool)) != unit))
392395 then true
393396 else throw("invalid assets"), if ((endHeight > height))
394397 then true
395398 else throw("invalid height"), if ((finalizationStageOrUnit == unit))
396399 then true
397400 else throw("finalization in progress"), if ((vote > 0))
398401 then true
399402 else throw("no vote")]
400403 if ((checks == checks))
401404 then {
402405 let votesListName = getVotesListName(pool)
403406 let userAddressStr = toString(i.caller)
404407 $Tuple2(([IntegerEntry(keyUsed(i.caller, epoch), max([(used - vote), 0])), DeleteEntry(keyVote(pool, i.caller, epoch)), IntegerEntry(keyVotingResult(pool, epoch), (poolResult - vote)), IntegerEntry(keyTotalVotes(epoch), (totalVotes - vote))] ++ deleteNodeActions(votesListName, userAddressStr)), unit)
405408 }
406409 else throw("Strict value is not equal to itself.")
407410 }
408411
409412
410413
411414 @Callable(i)
412415 func setEpochLength (newEpochLength) = {
413416 let cheks = [mustManager(i), if ((newEpochLength > 0))
414417 then true
415418 else throw("invalid epoch length")]
416419 if ((cheks == cheks))
417420 then $Tuple2([IntegerEntry(keyEpochLength, newEpochLength)], unit)
418421 else throw("Strict value is not equal to itself.")
419422 }
420423
421424
422425
423426 @Callable(i)
424427 func setMaxDepth (newMaxDepth) = {
425428 let cheks = [mustManager(i), if ((newMaxDepth > 0))
426429 then true
427430 else throw("invalid max depth")]
428431 if ((cheks == cheks))
429432 then $Tuple2([IntegerEntry(keyMaxDepth, newMaxDepth)], unit)
430433 else throw("Strict value is not equal to itself.")
431434 }
432435
433436
434437
435438 @Callable(i)
436439 func processVoteINTERNAL (poolStr,userAddressStr) = {
437440 let checkCaller = mustThis(i)
438441 if ((checkCaller == checkCaller))
439442 then {
440443 let userAddress = valueOrErrorMessage(addressFromString(userAddressStr), ("processVoteINTERNAL: invalid user address " + userAddressStr))
441444 let epoch = getIntOrFail(this, keyCurrentEpoch)
442445 let epochPrevious = (epoch - 1)
443446 let epochLength = getIntOrFail(this, keyEpochLength)
444447 let startHeight = getIntOrFail(this, keyStartHeightByEpoch(epoch))
445448 let endHeight = (startHeight + epochLength)
446449 let startHeightPrevious = getIntOrFail(this, keyStartHeightByEpoch(epochPrevious))
447450 let endHeightPrevious = (startHeightPrevious + epochLength)
448451 let checkTargetEpoch = if ((epochPrevious >= 0))
449452 then true
450453 else throw("processVoteINTERNAL: invalid previous epoch")
451454 if ((checkTargetEpoch == checkTargetEpoch))
452455 then {
453456 let pool = stringToPool(poolStr)
454457 let gwxAmountAtEndTotal = {
455458 let @ = invoke(this, "getUserGwxAmountAtHeight", [userAddressStr, endHeight], nil)
456459 if ($isInstanceOf(@, "Int"))
457460 then @
458461 else throw("Couldn't cast Any to Int")
459462 }
460463 let gwxAmountAtEndTotalPrevious = {
461464 let @ = invoke(this, "getUserGwxAmountAtHeight", [userAddressStr, endHeightPrevious], nil)
462465 if ($isInstanceOf(@, "Int"))
463466 then @
464467 else throw("Couldn't cast Any to Int")
465468 }
466469 let totalVotes = valueOrElse(getInteger(keyTotalVotes(epoch)), 0)
467470 let votingResult = valueOrElse(getInteger(keyVotingResult(pool, epoch)), 0)
468471 let votePrevious = valueOrErrorMessage(getInteger(keyVote(pool, userAddress, epochPrevious)), (((("processVoteINTERNAL " + poolStr) + " ") + userAddressStr) + ": no previous vote"))
469472 let used = valueOrElse(getInteger(this, keyUsed(userAddress, epoch)), 0)
470473 let newVote = fraction(votePrevious, gwxAmountAtEndTotal, gwxAmountAtEndTotalPrevious)
471474 let actions = if ((newVote > 0))
472475 then [IntegerEntry(keyVote(pool, userAddress, epoch), newVote), IntegerEntry(keyTotalVotes(epoch), (totalVotes + newVote)), IntegerEntry(keyVotingResult(pool, epoch), (votingResult + newVote)), IntegerEntry(keyUsed(userAddress, epoch), (used + newVote))]
473476 else deleteNodeActions(getVotesListName(pool), userAddressStr)
474477 $Tuple2(actions, unit)
475478 }
476479 else throw("Strict value is not equal to itself.")
477480 }
478481 else throw("Strict value is not equal to itself.")
479482 }
480483
481484
482485
483486 @Callable(i)
484487 func processPoolINTERNAL (poolStr) = {
485488 let checkCaller = mustThis(i)
486489 if ((checkCaller == checkCaller))
487490 then {
488491 let targetEpoch = (getIntOrFail(this, keyCurrentEpoch) - 1)
489492 let checkTargetEpoch = if ((targetEpoch >= 0))
490493 then true
491494 else throw("processPoolINTERNAL: invalid target epoch")
492495 if ((checkTargetEpoch == checkTargetEpoch))
493496 then {
494497 let pool = stringToPool(poolStr)
495498 let totalVotes = valueOrElse(getInteger(this, keyTotalVotes(targetEpoch)), 0)
496499 let votingResult = valueOrElse(getInteger(this, keyVotingResult(pool, targetEpoch)), 0)
497500 let share = if ((totalVotes == 0))
498501 then 0
499502 else fraction(votingResult, poolWeightMult, totalVotes)
500503 $Tuple2([IntegerEntry(keyPoolShare(pool, targetEpoch), share)], unit)
501504 }
502505 else throw("Strict value is not equal to itself.")
503506 }
504507 else throw("Strict value is not equal to itself.")
505508 }
506509
507510
508511
509512 @Callable(i)
510513 func finalizeHelper () = {
511514 let epoch = valueOrElse(getInteger(this, keyCurrentEpoch), 0)
515+ let previousEpoch = (epoch - 1)
512516 let startHeight = getIntOrFail(this, keyStartHeightByEpoch(epoch))
513517 let epochLength = getIntOrFail(this, keyEpochLength)
514518 let endHeight = (startHeight + epochLength)
515519 let finalizationStageOrUnit = getInteger(this, keyFinalizationStage)
516520 if ((height >= endHeight))
517521 then {
518522 let newEpoch = (epoch + 1)
519523 $Tuple2([IntegerEntry(keyStartHeightByEpoch(newEpoch), height), IntegerEntry(keyStartHeight, height), IntegerEntry(keyCurrentEpoch, newEpoch), IntegerEntry(keyFinalizationStage, finalizationStageTotal)], true)
520524 }
521525 else if ((finalizationStageOrUnit == unit))
522526 then $Tuple2(nil, false)
523527 else if ((finalizationStageOrUnit == finalizationStageTotal))
524528 then {
525529 let poolOrUnit = getString(keyNextPool)
526530 let userOrUnit = getString(keyNextUser)
527531 match poolOrUnit {
528532 case _: Unit =>
529533 match getString(keyListHead(poolsListName)) {
530534 case _: Unit =>
531535 $Tuple2([IntegerEntry(keyFinalizationStage, finalizationStageShares), DeleteEntry(keyNextPool), DeleteEntry(keyNextUser)], true)
532536 case poolsHeadStr: String =>
533537 $Tuple2([StringEntry(keyNextPool, poolsHeadStr)], true)
534538 case _ =>
535539 throw("Match error")
536540 }
537541 case poolStr: String =>
538542 let pool = stringToPool(poolStr)
539543 let nextUserOrUnit = match userOrUnit {
540544 case _: Unit =>
541545 getString(keyListHead(getVotesListName(pool)))
542546 case user: String =>
543547 let processVoteInv = invoke(this, "processVoteINTERNAL", [poolStr, user], nil)
544548 if ((processVoteInv == processVoteInv))
545549 then getString(keyListNext(getVotesListName(pool), user))
546550 else throw("Strict value is not equal to itself.")
547551 case _ =>
548552 throw("Match error")
549553 }
550554 match nextUserOrUnit {
551555 case _: Unit =>
552556 let nextPoolOrUnit = getString(keyListNext(poolsListName, poolStr))
553557 match nextPoolOrUnit {
554558 case _: Unit =>
555559 $Tuple2([IntegerEntry(keyFinalizationStage, finalizationStageShares), DeleteEntry(keyNextPool), DeleteEntry(keyNextUser)], true)
556560 case s: String =>
557561 $Tuple2([StringEntry(keyNextPool, s), DeleteEntry(keyNextUser)], true)
558562 case _ =>
559563 throw("Match error")
560564 }
561565 case nextUser: String =>
562566 $Tuple2([StringEntry(keyNextUser, nextUser)], true)
563567 case _ =>
564568 throw("Match error")
565569 }
566570 case _ =>
567571 throw("Match error")
568572 }
569573 }
570574 else if ((finalizationStageOrUnit == finalizationStageShares))
571575 then {
572576 let poolOrUnit = getString(keyNextPool)
573577 match poolOrUnit {
574578 case _: Unit =>
575579 match getString(keyListHead(poolsListName)) {
576580 case _: Unit =>
577- $Tuple2([DeleteEntry(keyFinalizationStage)], true)
581+ $Tuple2([DeleteEntry(keyFinalizationStage), BooleanEntry(keyFinalized(previousEpoch), true)], true)
578582 case nextPoolStr: String =>
579583 $Tuple2([StringEntry(keyNextPool, nextPoolStr)], true)
580584 case _ =>
581585 throw("Match error")
582586 }
583587 case poolStr: String =>
584588 let processPoolInv = invoke(this, "processPoolINTERNAL", [poolStr], nil)
585589 if ((processPoolInv == processPoolInv))
586590 then {
587591 let nextPoolOrUnit = getString(keyListNext(poolsListName, poolStr))
588592 match nextPoolOrUnit {
589593 case _: Unit =>
590- $Tuple2([DeleteEntry(keyFinalizationStage), DeleteEntry(keyNextPool)], true)
594+ $Tuple2([DeleteEntry(keyFinalizationStage), DeleteEntry(keyNextPool), BooleanEntry(keyFinalized(previousEpoch), true)], true)
591595 case nextPoolStr: String =>
592596 $Tuple2([StringEntry(keyNextPool, nextPoolStr)], true)
593597 case _ =>
594598 throw("Match error")
595599 }
596600 }
597601 else throw("Strict value is not equal to itself.")
598602 case _ =>
599603 throw("Match error")
600604 }
601605 }
602606 else throw("finalization is broken")
603607 }
604608
605609
606610
607611 @Callable(i)
608612 func finalizeWrapper (counter) = {
609613 let result = {
610614 let @ = invoke(this, "finalizeHelper", nil, nil)
611615 if ($isInstanceOf(@, "Boolean"))
612616 then @
613617 else throw("Couldn't cast Any to Boolean")
614618 }
615619 if ((result == result))
616620 then if (!(result))
617621 then if ((counter == 0))
618622 then throw("Current voting is not over yet")
619623 else $Tuple2(nil, unit)
620624 else {
621625 let maxDepth = valueOrElse(getInteger(this, keyMaxDepth), maxDepthDefault)
622626 if ((maxDepth > counter))
623627 then {
624628 let inv = invoke(this, "finalizeWrapper", [(counter + 1)], nil)
625629 if ((inv == inv))
626630 then $Tuple2(nil, unit)
627631 else throw("Strict value is not equal to itself.")
628632 }
629633 else $Tuple2(nil, unit)
630634 }
631635 else throw("Strict value is not equal to itself.")
632636 }
633637
634638
635639
636640 @Callable(i)
637641 func finalize () = {
638642 let inv = invoke(this, "finalizeWrapper", [0], nil)
639643 if ((inv == inv))
640644 then $Tuple2(nil, unit)
641645 else throw("Strict value is not equal to itself.")
642646 }
643647
644648
645649
646650 @Callable(i)
647651 func onVerificationLoss (assetId) = $Tuple2(nil, unit)
648652
649653
650654 @Verifier(tx)
651655 func verify () = {
652656 let targetPublicKey = match managerPublicKeyOrUnit() {
653657 case pk: ByteVector =>
654658 pk
655659 case _: Unit =>
656660 tx.senderPublicKey
657661 case _ =>
658662 throw("Match error")
659663 }
660664 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
661665 }
662666

github/deemru/w8io/169f3d6 
88.14 ms