tx · 4SrESDusAZaAofbzNhVehZUTPBBnBPPSojVoBGjiDReh

3MyVvNfXht9piazyf1e5BVFsqv1R7z5cWJL:  -0.03200000 Waves

2022.06.20 11:02 [2104433] smart account 3MyVvNfXht9piazyf1e5BVFsqv1R7z5cWJL > SELF 0.00000000 Waves

{ "type": 13, "id": "4SrESDusAZaAofbzNhVehZUTPBBnBPPSojVoBGjiDReh", "fee": 3200000, "feeAssetId": null, "timestamp": 1655712171624, "version": 1, "sender": "3MyVvNfXht9piazyf1e5BVFsqv1R7z5cWJL", "senderPublicKey": "DnPyGWCgpQChvoQrnXQRcC9FtN32mPGrcog2wcKHdkVn", "proofs": [ "367gRusKvWnwkoVKw8oSDoDWk1Letfvuf28ks6ZbbXWt3RpKow4LZ1bVniWynjJQ78J1VeZ4Ctf2rSWHJaKiBtYz" ], "script": "base64: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bWF0Y2gwAgAAAARVbml0BQAAAAR1bml0CQAAAgAAAAECAAAAC01hdGNoIGVycm9yAQAAAB1wZW5kaW5nTWFuYWdlclB1YmxpY0tleU9yVW5pdAAAAAAEAAAAByRtYXRjaDAJAAQiAAAAAQkBAAAAGmtleVBlbmRpbmdNYW5hZ2VyUHVibGljS2V5AAAAAAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAGU3RyaW5nBAAAAAFzBQAAAAckbWF0Y2gwCQACWQAAAAEFAAAAAXMDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABFVuaXQFAAAABHVuaXQJAAACAAAAAQIAAAALTWF0Y2ggZXJyb3IAAAAAFXBlcm1pc3Npb25EZW5pZWRFcnJvcgkAAAIAAAABAgAAABFQZXJtaXNzaW9uIGRlbmllZAEAAAAIbXVzdFRoaXMAAAABAAAAAWkDCQAAAAAAAAIIBQAAAAFpAAAABmNhbGxlcgUAAAAEdGhpcwYFAAAAFXBlcm1pc3Npb25EZW5pZWRFcnJvcgEAAAALbXVzdE1hbmFnZXIAAAABAAAAAWkEAAAAByRtYXRjaDAJAQAAABZtYW5hZ2VyUHVibGljS2V5T3JVbml0AAAAAAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAKQnl0ZVZlY3RvcgQAAAACcGsFAAAAByRtYXRjaDADCQAAAAAAAAIIBQAAAAFpAAAAD2NhbGxlclB1YmxpY0tleQUAAAACcGsGBQAAABVwZXJtaXNzaW9uRGVuaWVkRXJyb3IDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABFVuaXQJAQAAAAhtdXN0VGhpcwAAAAEFAAAAAWkJAAACAAAAAQIAAAALTWF0Y2ggZXJyb3IAAAASAAAAAWkBAAAACnNldE1hbmFnZXIAAAABAAAAF3BlbmRpbmdNYW5hZ2VyUHVibGljS2V5BAAAAAtjaGVja0NhbGxlcgkBAAAAC211c3RNYW5hZ2VyAAAAAQUAAAABaQMJAAAAAAAAAgUAAAALY2hlY2tDYWxsZXIFAAAAC2NoZWNrQ2FsbGVyBAAAABVjaGVja01hbmFnZXJQdWJsaWNLZXkJAAJZAAAAAQUAAAAXcGVuZGluZ01hbmFnZXJQdWJsaWNLZXkDCQAAAAAAAAIFAAAAFWNoZWNrTWFuYWdlclB1YmxpY0tleQUAAAAVY2hlY2tNYW5hZ2VyUHVibGljS2V5CQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABprZXlQZW5kaW5nTWFuYWdlclB1YmxpY0tleQAAAAAFAAAAF3BlbmRpbmdNYW5hZ2VyUHVibGljS2V5BQAAAANuaWwJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgAAAAFpAQAAAA5jb25maXJtTWFuYWdlcgAAAAAEAAAAAnBtCQEAAAAdcGVuZGluZ01hbmFnZXJQdWJsaWNLZXlPclVuaXQAAAAABAAAAAVoYXNQTQMJAQAAAAlpc0RlZmluZWQAAAABBQAAAAJwbQYJAAACAAAAAQIAAAASTm8gcGVuZGluZyBtYW5hZ2VyAwkAAAAAAAACBQAAAAVoYXNQTQUAAAAFaGFzUE0EAAAAB2NoZWNrUE0DCQAAAAAAAAIIBQAAAAFpAAAAD2NhbGxlclB1YmxpY0tleQkBAAAABXZhbHVlAAAAAQUAAAACcG0GCQAAAgAAAAECAAAAG1lvdSBhcmUgbm90IHBlbmRpbmcgbWFuYWdlcgMJAAAAAAAAAgUAAAAHY2hlY2tQTQUAAAAHY2hlY2tQTQkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAATa2V5TWFuYWdlclB1YmxpY0tleQAAAAAJAAJYAAAAAQkBAAAABXZhbHVlAAAAAQUAAAACcG0JAARMAAAAAgkBAAAAC0RlbGV0ZUVudHJ5AAAAAQkBAAAAGmtleVBlbmRpbmdNYW5hZ2VyUHVibGljS2V5AAAAAAUAAAADbmlsCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAABaQEAAAAYZ2V0VXNlckd3eEFtb3VudEF0SGVpZ2h0AAAAAgAAAAt1c2VyQWRkcmVzcwAAAAx0YXJnZXRIZWlnaHQEAAAAF2Jvb3N0aW5nQ29udHJhY3RBZGRyZXNzCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQmAAAAAQkBAAAADGdldFN0ck9yRmFpbAAAAAIFAAAABHRoaXMFAAAAE2tleUJvb3N0aW5nQ29udHJhY3QCAAAAIWludmFsaWQgYm9vc3RpbmcgY29udHJhY3QgYWRkcmVzcwkABRQAAAACBQAAAANuaWwKAAAAAAFACQAD/AAAAAQFAAAAF2Jvb3N0aW5nQ29udHJhY3RBZGRyZXNzAgAAACBnZXRVc2VyR3d4QW1vdW50QXRIZWlnaHRSRUFET05MWQkABEwAAAACBQAAAAt1c2VyQWRkcmVzcwkABEwAAAACBQAAAAx0YXJnZXRIZWlnaHQFAAAAA25pbAUAAAADbmlsAwkAAAEAAAACBQAAAAFAAgAAAANJbnQFAAAAAUAJAAACAAAAAQIAAAAYQ291bGRuJ3QgY2FzdCBBbnkgdG8gSW50AAAAAWkBAAAAC2NvbnN0cnVjdG9yAAAAAwAAAB92b3RpbmdFbWlzc2lvbkNhbmRpZGF0ZUNvbnRyYWN0AAAAEGJvb3N0aW5nQ29udHJhY3QAAAALZXBvY2hMZW5ndGgEAAAABWNoZWtzCQAETAAAAAIJAQAAAAttdXN0TWFuYWdlcgAAAAEFAAAAAWkJAARMAAAAAgMJAQAAAAIhPQAAAAIJAAQmAAAAAQUAAAAfdm90aW5nRW1pc3Npb25DYW5kaWRhdGVDb250cmFjdAUAAAAEdW5pdAYCAAAAMmludmFsaWQgdm90aW5nIGVtaXNzaW9uIGNhbmRpZGF0ZSBjb250cmFjdCBhZGRyZXNzCQAETAAAAAIDCQEAAAACIT0AAAACCQAEJgAAAAEFAAAAEGJvb3N0aW5nQ29udHJhY3QFAAAABHVuaXQGAgAAACFpbnZhbGlkIGJvb3N0aW5nIGNvbnRyYWN0IGFkZHJlc3MJAARMAAAAAgMJAABmAAAAAgUAAAALZXBvY2hMZW5ndGgAAAAAAAAAAAAGCQAAAgAAAAECAAAAFGludmFsaWQgZXBvY2ggbGVuZ3RoBQAAAANuaWwDCQAAAAAAAAIFAAAABWNoZWtzBQAAAAVjaGVrcwkABRQAAAACCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAAImtleVZvdGluZ0VtaXNzaW9uQ2FuZGlkYXRlQ29udHJhY3QFAAAAH3ZvdGluZ0VtaXNzaW9uQ2FuZGlkYXRlQ29udHJhY3QJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAATa2V5Qm9vc3RpbmdDb250cmFjdAUAAAAQYm9vc3RpbmdDb250cmFjdAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAOa2V5RXBvY2hMZW5ndGgFAAAAC2Vwb2NoTGVuZ3RoBQAAAANuaWwFAAAABHVuaXQJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAWkBAAAABmNyZWF0ZQAAAAIAAAANYW1vdW50QXNzZXRJZAAAAAxwcmljZUFzc2V0SWQEAAAABmNoZWNrcwkABEwAAAACAwkAAAAAAAACCQACWAAAAAEICAUAAAABaQAAAAZjYWxsZXIAAAAFYnl0ZXMJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQdAAAAAgUAAAAEdGhpcwUAAAAia2V5Vm90aW5nRW1pc3Npb25DYW5kaWRhdGVDb250cmFjdAIAAAAABgkBAAAAC211c3RNYW5hZ2VyAAAAAQUAAAABaQUAAAADbmlsAwkAAAAAAAACBQAAAAZjaGVja3MFAAAABmNoZWNrcwQAAAAEcG9vbAkABRQAAAACBQAAAA1hbW91bnRBc3NldElkBQAAAAxwcmljZUFzc2V0SWQEAAAADWluTGlzdEFjdGlvbnMJAAROAAAAAgkABEwAAAACCQEAAAAMQm9vbGVhbkVudHJ5AAAAAgkBAAAACWtleUluTGlzdAAAAAEFAAAABHBvb2wGBQAAAANuaWwJAQAAABFpbnNlcnROb2RlQWN0aW9ucwAAAAIFAAAADXBvb2xzTGlzdE5hbWUJAQAAAAxwb29sVG9TdHJpbmcAAAABBQAAAARwb29sBAAAABhjdXJyZW50RXBvY2hJc05vdERlZmluZWQJAAAAAAAAAgkABBoAAAACBQAAAAR0aGlzBQAAAA9rZXlDdXJyZW50RXBvY2gFAAAABHVuaXQEAAAAEnN0YXJ0SGVpZ2h0QWN0aW9ucwMFAAAAGGN1cnJlbnRFcG9jaElzTm90RGVmaW5lZAQAAAAFZXBvY2gAAAAAAAAAAAAJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAD2tleUN1cnJlbnRFcG9jaAUAAAAFZXBvY2gJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABVrZXlTdGFydEhlaWdodEJ5RXBvY2gAAAABBQAAAAVlcG9jaAUAAAAGaGVpZ2h0CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAA5rZXlTdGFydEhlaWdodAUAAAAGaGVpZ2h0CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABFrZXlDdXJyZW50RXBvY2hVaQUAAAAFZXBvY2gJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAEGtleVN0YXJ0SGVpZ2h0VWkFAAAABmhlaWdodAUAAAADbmlsBQAAAANuaWwJAAUUAAAAAgkABE4AAAACBQAAAA1pbkxpc3RBY3Rpb25zBQAAABJzdGFydEhlaWdodEFjdGlvbnMFAAAABHVuaXQJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAWkBAAAABHZvdGUAAAADAAAADWFtb3VudEFzc2V0SWQAAAAMcHJpY2VBc3NldElkAAAABmFtb3VudAQAAAAEcG9vbAkABRQAAAACBQAAAA1hbW91bnRBc3NldElkBQAAAAxwcmljZUFzc2V0SWQEAAAABWVwb2NoCQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMFAAAAD2tleUN1cnJlbnRFcG9jaAAAAAAAAAAAAAQAAAALc3RhcnRIZWlnaHQJAQAAAAxnZXRJbnRPckZhaWwAAAACBQAAAAR0aGlzCQEAAAAVa2V5U3RhcnRIZWlnaHRCeUVwb2NoAAAAAQUAAAAFZXBvY2gEAAAAC2Vwb2NoTGVuZ3RoCQEAAAAMZ2V0SW50T3JGYWlsAAAAAgUAAAAEdGhpcwUAAAAOa2V5RXBvY2hMZW5ndGgEAAAACWVuZEhlaWdodAkAAGQAAAACBQAAAAtzdGFydEhlaWdodAUAAAALZXBvY2hMZW5ndGgEAAAAF2ZpbmFsaXphdGlvblN0YWdlT3JVbml0CQAEGgAAAAIF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CnBvb2xSZXN1bHQFAAAABmFtb3VudAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAADWtleVRvdGFsVm90ZXMAAAABBQAAAAVlcG9jaAkAAGQAAAACBQAAAAp0b3RhbFZvdGVzBQAAAAZhbW91bnQFAAAAA25pbAUAAAAQdm90ZXNMaXN0QWN0aW9ucwUAAAAEdW5pdAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAABaQEAAAAKY2FuY2VsVm90ZQAAAAIAAAANYW1vdW50QXNzZXRJZAAAAAxwcmljZUFzc2V0SWQEAAAABHBvb2wJAAUUAAAAAgUAAAANYW1vdW50QXNzZXRJZAUAAAAMcHJpY2VBc3NldElkBAAAAAVlcG9jaAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzBQAAAA9rZXlDdXJyZW50RXBvY2gAAAAAAAAAAAAEAAAAC3N0YXJ0SGVpZ2h0CQEAAAAMZ2V0SW50T3JGYWlsAAAAAgUAAAAEdGhpcwkBAAAAFWtleVN0YXJ0SGVpZ2h0QnlFcG9jaAAAAAEFAAAABWVwb2NoBAAAAAtlcG9jaExlbmd0aAkBAAAADGdldEludE9yRmFpbAAAAAIFAAAABHRoaXMFAAAADmtleUVwb2NoTGVuZ3RoBAAAAAllbmRIZWlnaHQJAABkAAAAAgUAAAALc3RhcnRIZWlnaHQFAAAAC2Vwb2NoTGVuZ3RoBAAAABdmaW5hbGl6YXRpb25TdGFnZU9yVW5pdAkABBoAAAACBQAAAAR0aGlzBQAAABRrZXlGaW5hbGl6YXRpb25TdGFnZQQAAAAEdXNlZAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzCQEAAAAHa2V5VXNlZAAAAAIIBQAAAAFpAAAABmNhbGxlcgUAAAAFZXBvY2gAAAAAAAAAAAAEAAAABHZvdGUJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwkBAAAAB2tleVZvdGUAAAADBQAAAARwb29sCAUAAAABaQAAAAZjYWxsZXIFAAAABWVwb2NoAAAAAAAAAAAABAAAAApwb29sUmVzdWx0CQEAAAAL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YXhEZXB0aAUAAAALbmV3TWF4RGVwdGgFAAAAA25pbAUAAAAEdW5pdAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAABaQEAAAATcHJvY2Vzc1ZvdGVJTlRFUk5BTAAAAAIAAAAHcG9vbFN0cgAAAA51c2VyQWRkcmVzc1N0cgQAAAALY2hlY2tDYWxsZXIJAQAAAAhtdXN0VGhpcwAAAAEFAAAAAWkDCQAAAAAAAAIFAAAAC2NoZWNrQ2FsbGVyBQAAAAtjaGVja0NhbGxlcgQAAAALdXNlckFkZHJlc3MJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABCYAAAABBQAAAA51c2VyQWRkcmVzc1N0cgkAASwAAAACAgAAACpwcm9jZXNzVm90ZUlOVEVSTkFMOiBpbnZhbGlkIHVzZXIgYWRkcmVzcyAFAAAADnVzZXJBZGRyZXNzU3RyBAAAAAVlcG9jaAkBAAAADGdldEludE9yRmFpbAAAAAIFAAAABHRoaXMFAAAAD2tleUN1cnJlbnRFcG9jaAQAAAANZXBvY2hQcmV2aW91cwkAAGUAAAACBQAAAAVlcG9jaAAAAAAAAAAAAQQAAAALZXBvY2hMZW5ndGgJAQAAAAxnZXRJbnRPckZhaWwAAAACBQAAAAR0aGlzBQAAAA5rZXlFcG9jaExlbmd0aAQAAAALc3RhcnRIZWlnaHQJAQAAAAxnZXRJbnRPckZhaWwAAAACBQAAAAR0aGlzCQEAAAAVa2V5U3RhcnRIZWlnaHRCeUVwb2NoAAAAAQUAAAAFZXBvY2gEAAAACWVuZEhlaWdodAkAAGQAAAACBQAAAAtzdGFydEhlaWdodAUAAAALZXBvY2hMZW5ndGgEAAAAE3N0YXJ0SGVpZ2h0UHJldmlvdXMJAQAAAAxnZXRJbnRPckZhaWwAAAACBQAAAAR0aGlzCQEAAAAVa2V5U3RhcnRIZWlnaHRCeUVwb2NoAAAAAQUAAAANZXBvY2hQcmV2aW91cwQAAAARZW5kSGVpZ2h0UHJldmlvdXMJAABkAAAAAgUAAAATc3RhcnRIZWlnaHRQcmV2aW91cwUAAAALZXBvY2hMZW5ndGgEAAAAEGNoZWNrVGFyZ2V0RXBvY2gDCQAAZwAAAAIFAAAA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YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAABaQEAAAATcHJvY2Vzc1Bvb2xJTlRFUk5BTAAAAAEAAAAHcG9vbFN0cgQAAAALY2hlY2tDYWxsZXIJAQAAAAhtdXN0VGhpcwAAAAEFAAAAAWkDCQAAAAAAAAIFAAAAC2NoZWNrQ2FsbGVyBQAAAAtjaGVja0NhbGxlcgQAAAALdGFyZ2V0RXBvY2gJAABlAAAAAgkBAAAADGdldEludE9yRmFpbAAAAAIFAAAABHRoaXMFAAAAD2tleUN1cnJlbnRFcG9jaAAAAAAAAAAAAQQAAAAQY2hlY2tUYXJnZXRFcG9jaAMJAABnAAAAAgUAAAALdGFyZ2V0RXBvY2gAAAAAAAAAAAAGCQAAAgAAAAECAAAAKXByb2Nlc3NQb29sSU5URVJOQUw6IGludmFsaWQgdGFyZ2V0IGVwb2NoAwkAAAAAAAACBQAAABBjaGVja1RhcmdldEVwb2NoBQAAABBjaGVja1RhcmdldEVwb2NoBAAAAARwb29sCQEAAAAMc3RyaW5nVG9Qb29sAAAAAQUAAAAHcG9vbFN0cgQAAAAKdG90YWxWb3RlcwkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzCQEAAAANa2V5VG90YWxWb3RlcwAAAAEFAAAAC3RhcmdldEVwb2NoAAAAAAAAAAAABAAAAAx2b3RpbmdSZXN1bHQJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwkBAAAAD2tleVZvdGluZ1Jlc3VsdAAAAAIFAAAABHBvb2wFAAAAC3RhcmdldEVwb2NoAAAAAAAAAAAABAAAAAVzaGFyZQMJAAAAAAAAAgUAAAAKdG90YWxWb3RlcwAAAAAAAAAAAAAAAAAAAAAAAAkAAGsAAAADBQAAAAx2b3RpbmdSZXN1bHQFAAAADnBvb2xXZWlnaHRNdWx0BQAAAAp0b3RhbFZvdGVzCQAFFAAAAAIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAAAxrZXlQb29sU2hhcmUAAAACBQAAAARwb29sBQAAAAt0YXJnZXRFcG9jaAUAAAAFc2hhcmUFAAAAA25pbAUAAAAEdW5pdAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAWkBAAAADmZpbmFsaXplSGVscGVyAAAAAAQAAAAFZXBvY2gJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwUAAAAPa2V5Q3VycmVudEVwb2NoAAAAAAAAAAAABAAAAA1wcmV2aW91c0Vwb2NoCQAAZQAAAAIFAAAABWVwb2NoAAAAAAAAAAABBAAAAAtzdGFydEhlaWdodAkBAAAADGdldEludE9yRmFpbAAAAAIFAAAABHRoaXMJAQAAABVrZXlTdGFydEhlaWdodEJ5RXBvY2gAAAABBQAAAAVlcG9jaAQAAAALZXBvY2hMZW5ndGgJAQAAAAxnZXRJbnRPckZhaWwAAAACBQAAAAR0aGlzBQAAAA5rZXlFcG9jaExlbmd0aAQAAAAJZW5kSGVpZ2h0CQAAZAAAAAIFAAAAC3N0YXJ0SGVpZ2h0BQAAAAtlcG9jaExlbmd0aAQAAAAXZmluYWxpemF0aW9uU3RhZ2VPclVuaXQJAAQaAAAAAgUAAAAEdGhpcwUAAAAUa2V5RmluYWxpemF0aW9uU3RhZ2UDCQAAZwAAAAIFAAAABmhlaWdodAUAAAAJZW5kSGVpZ2h0BAAAAAhuZXdFcG9jaAkAAGQAAAACBQAAAAVlcG9jaAAAAAAAAAAAAQkABRQAAAACCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAVa2V5U3RhcnRIZWlnaHRCeUVwb2NoAAAAAQUAAAAIbmV3RXBvY2gFAAAABmhlaWdodAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAOa2V5U3RhcnRIZWlnaHQFAAAABmhlaWdodAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAPa2V5Q3VycmVudEVwb2NoBQAAAAhuZXdFcG9jaAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAUa2V5RmluYWxpemF0aW9uU3RhZ2UFAAAAFmZpbmFsaXphdGlvblN0YWdlVG90YWwFAAAAA25pbAYDCQAAAAAAAAIFAAAAF2ZpbmFsaXphdGlvblN0YWdlT3JVbml0BQAAAAR1bml0CQAFFAAAAAIFAAAAA25pbAcDCQAAAAAAAAIFAAAAF2ZpbmFsaXphdGlvblN0YWdlT3JVbml0BQAAABZmaW5hbGl6YXRpb25TdGFnZVRvdGFsBAAAAApwb29sT3JVbml0CQAEIgAAAAEFAAAAC2tleU5leHRQb29sBAAAAAp1c2VyT3JVbml0CQAEIgAAAAEFAAAAC2tleU5leHRVc2VyBAAAAAckbWF0Y2gwBQAAAApwb29sT3JVbml0AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAARVbml0BAAAAAckbWF0Y2gxCQAEIgAAAAEJAQAAAAtrZXlMaXN0SGVhZAAAAAEFAAAADXBvb2xzTGlzdE5hbWUDCQAAAQAAAAIFAAAAByRtYXRjaDECAAAABFVuaXQJAAUUAAAAAgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAUa2V5RmluYWxpemF0aW9uU3RhZ2UFAAAAF2ZpbmFsaXphdGlvblN0YWdlU2hhcmVzCQAETAAAAAIJAQAAAAtEZWxldGVFbnRyeQAAAAEFAAAAC2tleU5leHRQb29sCQAETAAAAAIJAQAAAAtEZWxldGVFbnRyeQAAAAEFAAAAC2tleU5leHRVc2VyBQAAAANuaWwGAwkAAAEAAAACBQAAAAckbWF0Y2gxAgAAAAZTdHJpbmcEAAAADHBvb2xzSGVhZFN0cgUAAAAHJG1hdGNoMQkABRQAAAACCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAAC2tleU5leHRQb29sBQAAAAxwb29sc0hlYWRTdHIFAAAAA25pbAYJAAACAAAAAQIAAAALTWF0Y2ggZXJyb3IDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABlN0cmluZwQAAAAHcG9vbFN0cgUAAAAHJG1hdGNoMAQAAAAEcG9vbAkBAAAADHN0cmluZ1RvUG9vbAAAAAEFAAAAB3Bvb2xTdHIEAAAADm5leHRVc2VyT3JVbml0BAAAAAckbWF0Y2gxBQAAAAp1c2VyT3JVbml0AwkAAAEAAAACBQAAAAck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", "chainId": 84, "height": 2104433, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: GguXJgQMjsd8gkGc1sPu7zKRMaht7qJ9PbiiqNmAi3FU Next: B1djKxLP76VofK9fCEDdr7KAX7THRFb4a8d2MLeusKV3 Diff:
OldNewDifferences
650650 func onVerificationLoss (assetId) = $Tuple2(nil, unit)
651651
652652
653+
654+@Callable(i)
655+func containsNodeREADONLY (listName,id) = {
656+ let checkCaller = mustManager(i)
657+ if ((checkCaller == checkCaller))
658+ then $Tuple2(nil, containsNode(listName, id))
659+ else throw("Strict value is not equal to itself.")
660+ }
661+
662+
663+
664+@Callable(i)
665+func insertNode (listName,id) = {
666+ let checkCaller = mustManager(i)
667+ if ((checkCaller == checkCaller))
668+ then $Tuple2(insertNodeActions(listName, id), unit)
669+ else throw("Strict value is not equal to itself.")
670+ }
671+
672+
673+
674+@Callable(i)
675+func deleteNode (listName,id) = {
676+ let checkCaller = mustManager(i)
677+ if ((checkCaller == checkCaller))
678+ then $Tuple2(deleteNodeActions(listName, id), unit)
679+ else throw("Strict value is not equal to itself.")
680+ }
681+
682+
653683 @Verifier(tx)
654684 func verify () = {
655685 let targetPublicKey = match managerPublicKeyOrUnit() {
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 let keyCurrentEpochUi = makeString(["%s", "currentEpochUi"], separator)
3333
3434 let keyStartHeightUi = makeString(["%s", "startHeightUi"], separator)
3535
3636 func keyStartHeightByEpoch (epoch) = makeString(["%s%d", "startHeight", toString(epoch)], separator)
3737
3838
3939 func keyFinalized (epoch) = makeString(["%s%d", "finalized", toString(epoch)], separator)
4040
4141
4242 func keyInList (pool) = {
4343 let $t012901330 = pool
4444 let amountAssetId = $t012901330._1
4545 let priceAssetId = $t012901330._2
4646 makeString(["%s%s%s", "inList", amountAssetId, priceAssetId], separator)
4747 }
4848
4949
5050 func keyUsed (address,epoch) = makeString(["%s%s%d", "used", toString(address), toString(epoch)], separator)
5151
5252
5353 func keyVote (pool,address,epoch) = {
5454 let $t016041644 = pool
5555 let amountAssetId = $t016041644._1
5656 let priceAssetId = $t016041644._2
5757 makeString(["%s%s%s%s%d", "vote", amountAssetId, priceAssetId, toString(address), toString(epoch)], separator)
5858 }
5959
6060
6161 func keyVotingResult (pool,epoch) = {
6262 let $t018261866 = pool
6363 let amountAssetId = $t018261866._1
6464 let priceAssetId = $t018261866._2
6565 makeString(["%s%s%s%d", "votingResult", amountAssetId, priceAssetId, toString(epoch)], separator)
6666 }
6767
6868
6969 func keyPoolShare (pool,epoch) = {
7070 let $t020312071 = pool
7171 let amountAssetId = $t020312071._1
7272 let priceAssetId = $t020312071._2
7373 makeString(["%s%s%s%d", "poolShare", amountAssetId, priceAssetId, toString(epoch)], separator)
7474 }
7575
7676
7777 func keyTotalVotes (epoch) = makeString(["%s%d", "totalVotes", toString(epoch)], separator)
7878
7979
8080 func getValueOrFail (address,key,type) = {
8181 let error = makeString(["mandatory ", toString(address), ".", key, " is not defined"], "")
8282 valueOrErrorMessage( match type {
8383 case str: String =>
8484 getString(address, key)
8585 case int: Int =>
8686 getInteger(address, key)
8787 case _ =>
8888 throw("invalid entry type")
8989 }, error)
9090 }
9191
9292
9393 func getStrOrFail (address,key) = {
9494 let @ = getValueOrFail(address, key, "")
9595 if ($isInstanceOf(@, "String"))
9696 then @
9797 else throw("Couldn't cast Int|String to String")
9898 }
9999
100100
101101 func getIntOrFail (address,key) = {
102102 let @ = getValueOrFail(address, key, 0)
103103 if ($isInstanceOf(@, "Int"))
104104 then @
105105 else throw("Couldn't cast Int|String to Int")
106106 }
107107
108108
109109 func poolToString (pool) = ((pool._1 + separator) + pool._2)
110110
111111
112112 func stringToPool (str) = {
113113 let parts = split(str, separator)
114114 if ((size(parts) == 2))
115115 then $Tuple2(parts[0], parts[1])
116116 else throw("invalid pool string")
117117 }
118118
119119
120120 let poolsListName = "pools"
121121
122122 func getVotesListName (pool) = {
123123 let $t031773217 = pool
124124 let amountAssetId = $t031773217._1
125125 let priceAssetId = $t031773217._2
126126 makeString(["votes", amountAssetId, priceAssetId], separator)
127127 }
128128
129129
130130 func keyListHead (listName) = {
131131 let meta = if ((listName == poolsListName))
132132 then "%s%s"
133133 else "%s%s%s%s"
134134 makeString([meta, listName, "head"], separator)
135135 }
136136
137137
138138 func keyListSize (listName) = {
139139 let meta = if ((listName == poolsListName))
140140 then "%s%s"
141141 else "%s%s%s%s"
142142 makeString([meta, listName, "size"], separator)
143143 }
144144
145145
146146 func keyListPrev (listName,id) = {
147147 let meta = if ((listName == poolsListName))
148148 then "%s%s%s%s"
149149 else "%s%s%s%s%s"
150150 makeString([meta, listName, id, "prev"], separator)
151151 }
152152
153153
154154 func keyListNext (listName,id) = {
155155 let meta = if ((listName == poolsListName))
156156 then "%s%s%s%s"
157157 else "%s%s%s%s%s"
158158 makeString([meta, listName, id, "next"], separator)
159159 }
160160
161161
162162 func containsNode (listName,id) = {
163163 let headOrUnit = getString(this, keyListHead(listName))
164164 let prevOrUnit = getString(this, keyListPrev(listName, id))
165165 let nextOrUnit = getString(this, keyListNext(listName, id))
166166 if (if ((id == valueOrElse(headOrUnit, "")))
167167 then true
168168 else (prevOrUnit != unit))
169169 then true
170170 else (nextOrUnit != unit)
171171 }
172172
173173
174174 func insertNodeActions (listName,id) = {
175175 let headOrUnit = getString(this, keyListHead(listName))
176176 let listSize = valueOrElse(getInteger(this, keyListSize(listName)), 0)
177177 (([IntegerEntry(keyListSize(listName), (listSize + 1))] ++ (if ((headOrUnit != unit))
178178 then [StringEntry(keyListNext(listName, id), value(headOrUnit)), StringEntry(keyListPrev(listName, value(headOrUnit)), id)]
179179 else nil)) ++ [StringEntry(keyListHead(listName), id)])
180180 }
181181
182182
183183 func deleteNodeActions (listName,id) = {
184184 let headOrUnit = getString(this, keyListHead(listName))
185185 let listSize = valueOrElse(getInteger(this, keyListSize(listName)), 0)
186186 let prevOrUnit = getString(this, keyListPrev(listName, id))
187187 let nextOrUnit = getString(this, keyListNext(listName, id))
188188 ([IntegerEntry(keyListSize(listName), (listSize - 1))] ++ (if (if ((prevOrUnit != unit))
189189 then (nextOrUnit != unit)
190190 else false)
191191 then [StringEntry(keyListNext(listName, value(prevOrUnit)), value(nextOrUnit)), StringEntry(keyListPrev(listName, value(nextOrUnit)), value(prevOrUnit)), DeleteEntry(keyListPrev(listName, id)), DeleteEntry(keyListNext(listName, id))]
192192 else if ((nextOrUnit != unit))
193193 then [StringEntry(keyListHead(listName), value(nextOrUnit)), DeleteEntry(keyListNext(listName, id)), DeleteEntry(keyListPrev(listName, value(nextOrUnit)))]
194194 else if ((prevOrUnit != unit))
195195 then [DeleteEntry(keyListPrev(listName, id)), DeleteEntry(keyListNext(listName, value(prevOrUnit)))]
196196 else if ((id == valueOrElse(headOrUnit, "")))
197197 then [DeleteEntry(keyListHead(listName))]
198198 else throw(((("invalid node: " + listName) + ".") + id))))
199199 }
200200
201201
202202 func keyManagerPublicKey () = "%s__managerPublicKey"
203203
204204
205205 func keyPendingManagerPublicKey () = "%s__pendingManagerPublicKey"
206206
207207
208208 func managerPublicKeyOrUnit () = match getString(keyManagerPublicKey()) {
209209 case s: String =>
210210 fromBase58String(s)
211211 case _: Unit =>
212212 unit
213213 case _ =>
214214 throw("Match error")
215215 }
216216
217217
218218 func pendingManagerPublicKeyOrUnit () = match getString(keyPendingManagerPublicKey()) {
219219 case s: String =>
220220 fromBase58String(s)
221221 case _: Unit =>
222222 unit
223223 case _ =>
224224 throw("Match error")
225225 }
226226
227227
228228 let permissionDeniedError = throw("Permission denied")
229229
230230 func mustThis (i) = if ((i.caller == this))
231231 then true
232232 else permissionDeniedError
233233
234234
235235 func mustManager (i) = match managerPublicKeyOrUnit() {
236236 case pk: ByteVector =>
237237 if ((i.callerPublicKey == pk))
238238 then true
239239 else permissionDeniedError
240240 case _: Unit =>
241241 mustThis(i)
242242 case _ =>
243243 throw("Match error")
244244 }
245245
246246
247247 @Callable(i)
248248 func setManager (pendingManagerPublicKey) = {
249249 let checkCaller = mustManager(i)
250250 if ((checkCaller == checkCaller))
251251 then {
252252 let checkManagerPublicKey = fromBase58String(pendingManagerPublicKey)
253253 if ((checkManagerPublicKey == checkManagerPublicKey))
254254 then [StringEntry(keyPendingManagerPublicKey(), pendingManagerPublicKey)]
255255 else throw("Strict value is not equal to itself.")
256256 }
257257 else throw("Strict value is not equal to itself.")
258258 }
259259
260260
261261
262262 @Callable(i)
263263 func confirmManager () = {
264264 let pm = pendingManagerPublicKeyOrUnit()
265265 let hasPM = if (isDefined(pm))
266266 then true
267267 else throw("No pending manager")
268268 if ((hasPM == hasPM))
269269 then {
270270 let checkPM = if ((i.callerPublicKey == value(pm)))
271271 then true
272272 else throw("You are not pending manager")
273273 if ((checkPM == checkPM))
274274 then [StringEntry(keyManagerPublicKey(), toBase58String(value(pm))), DeleteEntry(keyPendingManagerPublicKey())]
275275 else throw("Strict value is not equal to itself.")
276276 }
277277 else throw("Strict value is not equal to itself.")
278278 }
279279
280280
281281
282282 @Callable(i)
283283 func getUserGwxAmountAtHeight (userAddress,targetHeight) = {
284284 let boostingContractAddress = valueOrErrorMessage(addressFromString(getStrOrFail(this, keyBoostingContract)), "invalid boosting contract address")
285285 $Tuple2(nil, {
286286 let @ = invoke(boostingContractAddress, "getUserGwxAmountAtHeightREADONLY", [userAddress, targetHeight], nil)
287287 if ($isInstanceOf(@, "Int"))
288288 then @
289289 else throw("Couldn't cast Any to Int")
290290 })
291291 }
292292
293293
294294
295295 @Callable(i)
296296 func constructor (votingEmissionCandidateContract,boostingContract,epochLength) = {
297297 let cheks = [mustManager(i), if ((addressFromString(votingEmissionCandidateContract) != unit))
298298 then true
299299 else "invalid voting emission candidate contract address", if ((addressFromString(boostingContract) != unit))
300300 then true
301301 else "invalid boosting contract address", if ((epochLength > 0))
302302 then true
303303 else throw("invalid epoch length")]
304304 if ((cheks == cheks))
305305 then $Tuple2([StringEntry(keyVotingEmissionCandidateContract, votingEmissionCandidateContract), StringEntry(keyBoostingContract, boostingContract), IntegerEntry(keyEpochLength, epochLength)], unit)
306306 else throw("Strict value is not equal to itself.")
307307 }
308308
309309
310310
311311 @Callable(i)
312312 func create (amountAssetId,priceAssetId) = {
313313 let checks = [if ((toBase58String(i.caller.bytes) == valueOrElse(getString(this, keyVotingEmissionCandidateContract), "")))
314314 then true
315315 else mustManager(i)]
316316 if ((checks == checks))
317317 then {
318318 let pool = $Tuple2(amountAssetId, priceAssetId)
319319 let inListActions = ([BooleanEntry(keyInList(pool), true)] ++ insertNodeActions(poolsListName, poolToString(pool)))
320320 let currentEpochIsNotDefined = (getInteger(this, keyCurrentEpoch) == unit)
321321 let startHeightActions = if (currentEpochIsNotDefined)
322322 then {
323323 let epoch = 0
324324 [IntegerEntry(keyCurrentEpoch, epoch), IntegerEntry(keyStartHeightByEpoch(epoch), height), IntegerEntry(keyStartHeight, height), IntegerEntry(keyCurrentEpochUi, epoch), IntegerEntry(keyStartHeightUi, height)]
325325 }
326326 else nil
327327 $Tuple2((inListActions ++ startHeightActions), unit)
328328 }
329329 else throw("Strict value is not equal to itself.")
330330 }
331331
332332
333333
334334 @Callable(i)
335335 func vote (amountAssetId,priceAssetId,amount) = {
336336 let pool = $Tuple2(amountAssetId, priceAssetId)
337337 let epoch = valueOrElse(getInteger(this, keyCurrentEpoch), 0)
338338 let startHeight = getIntOrFail(this, keyStartHeightByEpoch(epoch))
339339 let epochLength = getIntOrFail(this, keyEpochLength)
340340 let endHeight = (startHeight + epochLength)
341341 let finalizationStageOrUnit = getInteger(this, keyFinalizationStage)
342342 let used = valueOrElse(getInteger(this, keyUsed(i.caller, epoch)), 0)
343343 let vote = valueOrElse(getInteger(this, keyVote(pool, i.caller, epoch)), 0)
344344 let poolResult = valueOrElse(getInteger(this, keyVotingResult(pool, epoch)), 0)
345345 let totalVotes = valueOrElse(getInteger(this, keyTotalVotes(epoch)), 0)
346346 let gwxAmountAtEndTotal = {
347347 let @ = invoke(this, "getUserGwxAmountAtHeight", [toBase58String(i.caller.bytes), endHeight], nil)
348348 if ($isInstanceOf(@, "Int"))
349349 then @
350350 else throw("Couldn't cast Any to Int")
351351 }
352352 let available = (gwxAmountAtEndTotal - used)
353353 let newVote = (vote + amount)
354354 let checks = [if ((getBoolean(keyInList(pool)) != unit))
355355 then true
356356 else throw("invalid assets"), if ((endHeight > height))
357357 then true
358358 else throw("invalid height"), if ((finalizationStageOrUnit == unit))
359359 then true
360360 else throw("finalization in progress"), if ((gwxAmountAtEndTotal > 0))
361361 then true
362362 else throw("you do not have gWX"), if (if ((amount > 0))
363363 then (available >= amount)
364364 else false)
365365 then true
366366 else throw("invalid amount")]
367367 if ((checks == checks))
368368 then {
369369 let votesListName = getVotesListName(pool)
370370 let userAddressStr = toString(i.caller)
371371 let votesListActions = if (containsNode(votesListName, userAddressStr))
372372 then nil
373373 else insertNodeActions(votesListName, userAddressStr)
374374 $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)
375375 }
376376 else throw("Strict value is not equal to itself.")
377377 }
378378
379379
380380
381381 @Callable(i)
382382 func cancelVote (amountAssetId,priceAssetId) = {
383383 let pool = $Tuple2(amountAssetId, priceAssetId)
384384 let epoch = valueOrElse(getInteger(this, keyCurrentEpoch), 0)
385385 let startHeight = getIntOrFail(this, keyStartHeightByEpoch(epoch))
386386 let epochLength = getIntOrFail(this, keyEpochLength)
387387 let endHeight = (startHeight + epochLength)
388388 let finalizationStageOrUnit = getInteger(this, keyFinalizationStage)
389389 let used = valueOrElse(getInteger(this, keyUsed(i.caller, epoch)), 0)
390390 let vote = valueOrElse(getInteger(this, keyVote(pool, i.caller, epoch)), 0)
391391 let poolResult = valueOrElse(getInteger(this, keyVotingResult(pool, epoch)), 0)
392392 let totalVotes = valueOrElse(getInteger(this, keyTotalVotes(epoch)), 0)
393393 let checks = [if ((getBoolean(keyInList(pool)) != unit))
394394 then true
395395 else throw("invalid assets"), if ((endHeight > height))
396396 then true
397397 else throw("invalid height"), if ((finalizationStageOrUnit == unit))
398398 then true
399399 else throw("finalization in progress"), if ((vote > 0))
400400 then true
401401 else throw("no vote")]
402402 if ((checks == checks))
403403 then {
404404 let votesListName = getVotesListName(pool)
405405 let userAddressStr = toString(i.caller)
406406 $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)
407407 }
408408 else throw("Strict value is not equal to itself.")
409409 }
410410
411411
412412
413413 @Callable(i)
414414 func setEpochLength (newEpochLength) = {
415415 let cheks = [mustManager(i), if ((newEpochLength > 0))
416416 then true
417417 else throw("invalid epoch length")]
418418 if ((cheks == cheks))
419419 then $Tuple2([IntegerEntry(keyEpochLength, newEpochLength)], unit)
420420 else throw("Strict value is not equal to itself.")
421421 }
422422
423423
424424
425425 @Callable(i)
426426 func setMaxDepth (newMaxDepth) = {
427427 let cheks = [mustManager(i), if ((newMaxDepth > 0))
428428 then true
429429 else throw("invalid max depth")]
430430 if ((cheks == cheks))
431431 then $Tuple2([IntegerEntry(keyMaxDepth, newMaxDepth)], unit)
432432 else throw("Strict value is not equal to itself.")
433433 }
434434
435435
436436
437437 @Callable(i)
438438 func processVoteINTERNAL (poolStr,userAddressStr) = {
439439 let checkCaller = mustThis(i)
440440 if ((checkCaller == checkCaller))
441441 then {
442442 let userAddress = valueOrErrorMessage(addressFromString(userAddressStr), ("processVoteINTERNAL: invalid user address " + userAddressStr))
443443 let epoch = getIntOrFail(this, keyCurrentEpoch)
444444 let epochPrevious = (epoch - 1)
445445 let epochLength = getIntOrFail(this, keyEpochLength)
446446 let startHeight = getIntOrFail(this, keyStartHeightByEpoch(epoch))
447447 let endHeight = (startHeight + epochLength)
448448 let startHeightPrevious = getIntOrFail(this, keyStartHeightByEpoch(epochPrevious))
449449 let endHeightPrevious = (startHeightPrevious + epochLength)
450450 let checkTargetEpoch = if ((epochPrevious >= 0))
451451 then true
452452 else throw("processVoteINTERNAL: invalid previous epoch")
453453 if ((checkTargetEpoch == checkTargetEpoch))
454454 then {
455455 let pool = stringToPool(poolStr)
456456 let gwxAmountAtEndTotal = {
457457 let @ = invoke(this, "getUserGwxAmountAtHeight", [userAddressStr, endHeight], nil)
458458 if ($isInstanceOf(@, "Int"))
459459 then @
460460 else throw("Couldn't cast Any to Int")
461461 }
462462 let gwxAmountAtEndTotalPrevious = {
463463 let @ = invoke(this, "getUserGwxAmountAtHeight", [userAddressStr, endHeightPrevious], nil)
464464 if ($isInstanceOf(@, "Int"))
465465 then @
466466 else throw("Couldn't cast Any to Int")
467467 }
468468 let totalVotes = valueOrElse(getInteger(keyTotalVotes(epoch)), 0)
469469 let votingResult = valueOrElse(getInteger(keyVotingResult(pool, epoch)), 0)
470470 let votePrevious = valueOrErrorMessage(getInteger(keyVote(pool, userAddress, epochPrevious)), (((("processVoteINTERNAL " + poolStr) + " ") + userAddressStr) + ": no previous vote"))
471471 let used = valueOrElse(getInteger(this, keyUsed(userAddress, epoch)), 0)
472472 let newVote = fraction(votePrevious, gwxAmountAtEndTotal, gwxAmountAtEndTotalPrevious)
473473 let actions = if ((newVote > 0))
474474 then [IntegerEntry(keyVote(pool, userAddress, epoch), newVote), IntegerEntry(keyTotalVotes(epoch), (totalVotes + newVote)), IntegerEntry(keyVotingResult(pool, epoch), (votingResult + newVote)), IntegerEntry(keyUsed(userAddress, epoch), (used + newVote))]
475475 else deleteNodeActions(getVotesListName(pool), userAddressStr)
476476 $Tuple2(actions, unit)
477477 }
478478 else throw("Strict value is not equal to itself.")
479479 }
480480 else throw("Strict value is not equal to itself.")
481481 }
482482
483483
484484
485485 @Callable(i)
486486 func processPoolINTERNAL (poolStr) = {
487487 let checkCaller = mustThis(i)
488488 if ((checkCaller == checkCaller))
489489 then {
490490 let targetEpoch = (getIntOrFail(this, keyCurrentEpoch) - 1)
491491 let checkTargetEpoch = if ((targetEpoch >= 0))
492492 then true
493493 else throw("processPoolINTERNAL: invalid target epoch")
494494 if ((checkTargetEpoch == checkTargetEpoch))
495495 then {
496496 let pool = stringToPool(poolStr)
497497 let totalVotes = valueOrElse(getInteger(this, keyTotalVotes(targetEpoch)), 0)
498498 let votingResult = valueOrElse(getInteger(this, keyVotingResult(pool, targetEpoch)), 0)
499499 let share = if ((totalVotes == 0))
500500 then 0
501501 else fraction(votingResult, poolWeightMult, totalVotes)
502502 $Tuple2([IntegerEntry(keyPoolShare(pool, targetEpoch), share)], unit)
503503 }
504504 else throw("Strict value is not equal to itself.")
505505 }
506506 else throw("Strict value is not equal to itself.")
507507 }
508508
509509
510510
511511 @Callable(i)
512512 func finalizeHelper () = {
513513 let epoch = valueOrElse(getInteger(this, keyCurrentEpoch), 0)
514514 let previousEpoch = (epoch - 1)
515515 let startHeight = getIntOrFail(this, keyStartHeightByEpoch(epoch))
516516 let epochLength = getIntOrFail(this, keyEpochLength)
517517 let endHeight = (startHeight + epochLength)
518518 let finalizationStageOrUnit = getInteger(this, keyFinalizationStage)
519519 if ((height >= endHeight))
520520 then {
521521 let newEpoch = (epoch + 1)
522522 $Tuple2([IntegerEntry(keyStartHeightByEpoch(newEpoch), height), IntegerEntry(keyStartHeight, height), IntegerEntry(keyCurrentEpoch, newEpoch), IntegerEntry(keyFinalizationStage, finalizationStageTotal)], true)
523523 }
524524 else if ((finalizationStageOrUnit == unit))
525525 then $Tuple2(nil, false)
526526 else if ((finalizationStageOrUnit == finalizationStageTotal))
527527 then {
528528 let poolOrUnit = getString(keyNextPool)
529529 let userOrUnit = getString(keyNextUser)
530530 match poolOrUnit {
531531 case _: Unit =>
532532 match getString(keyListHead(poolsListName)) {
533533 case _: Unit =>
534534 $Tuple2([IntegerEntry(keyFinalizationStage, finalizationStageShares), DeleteEntry(keyNextPool), DeleteEntry(keyNextUser)], true)
535535 case poolsHeadStr: String =>
536536 $Tuple2([StringEntry(keyNextPool, poolsHeadStr)], true)
537537 case _ =>
538538 throw("Match error")
539539 }
540540 case poolStr: String =>
541541 let pool = stringToPool(poolStr)
542542 let nextUserOrUnit = match userOrUnit {
543543 case _: Unit =>
544544 getString(keyListHead(getVotesListName(pool)))
545545 case user: String =>
546546 let processVoteInv = invoke(this, "processVoteINTERNAL", [poolStr, user], nil)
547547 if ((processVoteInv == processVoteInv))
548548 then getString(keyListNext(getVotesListName(pool), user))
549549 else throw("Strict value is not equal to itself.")
550550 case _ =>
551551 throw("Match error")
552552 }
553553 match nextUserOrUnit {
554554 case _: Unit =>
555555 let nextPoolOrUnit = getString(keyListNext(poolsListName, poolStr))
556556 match nextPoolOrUnit {
557557 case _: Unit =>
558558 $Tuple2([IntegerEntry(keyFinalizationStage, finalizationStageShares), DeleteEntry(keyNextPool), DeleteEntry(keyNextUser)], true)
559559 case s: String =>
560560 $Tuple2([StringEntry(keyNextPool, s), DeleteEntry(keyNextUser)], true)
561561 case _ =>
562562 throw("Match error")
563563 }
564564 case nextUser: String =>
565565 $Tuple2([StringEntry(keyNextUser, nextUser)], true)
566566 case _ =>
567567 throw("Match error")
568568 }
569569 case _ =>
570570 throw("Match error")
571571 }
572572 }
573573 else if ((finalizationStageOrUnit == finalizationStageShares))
574574 then {
575575 let poolOrUnit = getString(keyNextPool)
576576 match poolOrUnit {
577577 case _: Unit =>
578578 match getString(keyListHead(poolsListName)) {
579579 case _: Unit =>
580580 $Tuple2([DeleteEntry(keyFinalizationStage), BooleanEntry(keyFinalized(previousEpoch), true), IntegerEntry(keyCurrentEpochUi, epoch), IntegerEntry(keyStartHeightUi, startHeight)], true)
581581 case nextPoolStr: String =>
582582 $Tuple2([StringEntry(keyNextPool, nextPoolStr)], true)
583583 case _ =>
584584 throw("Match error")
585585 }
586586 case poolStr: String =>
587587 let processPoolInv = invoke(this, "processPoolINTERNAL", [poolStr], nil)
588588 if ((processPoolInv == processPoolInv))
589589 then {
590590 let nextPoolOrUnit = getString(keyListNext(poolsListName, poolStr))
591591 match nextPoolOrUnit {
592592 case _: Unit =>
593593 $Tuple2([DeleteEntry(keyFinalizationStage), BooleanEntry(keyFinalized(previousEpoch), true), IntegerEntry(keyCurrentEpochUi, epoch), IntegerEntry(keyStartHeightUi, startHeight), DeleteEntry(keyNextPool)], true)
594594 case nextPoolStr: String =>
595595 $Tuple2([StringEntry(keyNextPool, nextPoolStr)], true)
596596 case _ =>
597597 throw("Match error")
598598 }
599599 }
600600 else throw("Strict value is not equal to itself.")
601601 case _ =>
602602 throw("Match error")
603603 }
604604 }
605605 else throw("finalization is broken")
606606 }
607607
608608
609609
610610 @Callable(i)
611611 func finalizeWrapper (counter) = {
612612 let result = {
613613 let @ = invoke(this, "finalizeHelper", nil, nil)
614614 if ($isInstanceOf(@, "Boolean"))
615615 then @
616616 else throw("Couldn't cast Any to Boolean")
617617 }
618618 if ((result == result))
619619 then if (!(result))
620620 then if ((counter == 0))
621621 then throw("Current voting is not over yet")
622622 else $Tuple2(nil, unit)
623623 else {
624624 let maxDepth = valueOrElse(getInteger(this, keyMaxDepth), maxDepthDefault)
625625 if ((maxDepth > counter))
626626 then {
627627 let inv = invoke(this, "finalizeWrapper", [(counter + 1)], nil)
628628 if ((inv == inv))
629629 then $Tuple2(nil, unit)
630630 else throw("Strict value is not equal to itself.")
631631 }
632632 else $Tuple2(nil, unit)
633633 }
634634 else throw("Strict value is not equal to itself.")
635635 }
636636
637637
638638
639639 @Callable(i)
640640 func finalize () = {
641641 let inv = invoke(this, "finalizeWrapper", [0], nil)
642642 if ((inv == inv))
643643 then $Tuple2(nil, unit)
644644 else throw("Strict value is not equal to itself.")
645645 }
646646
647647
648648
649649 @Callable(i)
650650 func onVerificationLoss (assetId) = $Tuple2(nil, unit)
651651
652652
653+
654+@Callable(i)
655+func containsNodeREADONLY (listName,id) = {
656+ let checkCaller = mustManager(i)
657+ if ((checkCaller == checkCaller))
658+ then $Tuple2(nil, containsNode(listName, id))
659+ else throw("Strict value is not equal to itself.")
660+ }
661+
662+
663+
664+@Callable(i)
665+func insertNode (listName,id) = {
666+ let checkCaller = mustManager(i)
667+ if ((checkCaller == checkCaller))
668+ then $Tuple2(insertNodeActions(listName, id), unit)
669+ else throw("Strict value is not equal to itself.")
670+ }
671+
672+
673+
674+@Callable(i)
675+func deleteNode (listName,id) = {
676+ let checkCaller = mustManager(i)
677+ if ((checkCaller == checkCaller))
678+ then $Tuple2(deleteNodeActions(listName, id), unit)
679+ else throw("Strict value is not equal to itself.")
680+ }
681+
682+
653683 @Verifier(tx)
654684 func verify () = {
655685 let targetPublicKey = match managerPublicKeyOrUnit() {
656686 case pk: ByteVector =>
657687 pk
658688 case _: Unit =>
659689 tx.senderPublicKey
660690 case _ =>
661691 throw("Match error")
662692 }
663693 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
664694 }
665695

github/deemru/w8io/c3f4982 
64.49 ms