tx · FsB89Pp8n6eSv2e2e2TKbPvR7MhkiF46SfS7yh7Tycor

3N74cvawpTtuuCbAasBo7oMJYrohgZYFCTj:  -0.01400000 Waves

2021.11.18 17:36 [1796609] smart account 3N74cvawpTtuuCbAasBo7oMJYrohgZYFCTj > SELF 0.00000000 Waves

{ "type": 13, "id": "FsB89Pp8n6eSv2e2e2TKbPvR7MhkiF46SfS7yh7Tycor", "fee": 1400000, "feeAssetId": null, "timestamp": 1637246246540, "version": 1, "sender": "3N74cvawpTtuuCbAasBo7oMJYrohgZYFCTj", "senderPublicKey": "BgnyKECwUvFW1ThWpgKbmHMmJXJRgg5K56jKHZwVMbXL", "proofs": [ "2TbpkHGaMtfQQBerDha3eFjvs2zvwHuQKBLXuHWBGznVyMywwmsTDYnCm5euQvjMpa96EzSNg7JTAf2xYowqL2UG" ], "script": "base64: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AAAABAUAAAAHYWN0aW9ucwgFAAAAAXIAAAACXzEIBQAAAAFyAAAAAl8yCAUAAAABcgAAAAJfMwkAAAIAAAABAgAAABdJbmNvcnJlY3QgaW52b2tlIHJlc3VsdAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAAAAFWNoZWNrTGFzdFBhcnRPZlBlcmlvZAAAAAYAAAAQYm9vc3RpbmdDb250cmFjdAAAAA1jdXJyZW50UGVyaW9kAAAADGxhdGVzdFBlcmlvZAAAAAVkZXB0aAAAAA50b3RhbFdlaWdodEtleQAAAAZ3ZWlnaHQDCQAAZwAAAAIFAAAADGxhdGVzdFBlcmlvZAkAAGQAAAACBQAAAA1jdXJyZW50UGVyaW9kAAAAAAAAAAABCQEAAAANaW52b2tlUHJvY2VzcwAAAAYFAAAAEGJvb3N0aW5nQ29udHJhY3QJAABkAAAAAgUAAAANY3VycmVudFBlcmlvZAAAAAAAAAAAAQAAAAAAAAAAAAkAAGUAAAACBQAAAAVkZXB0aAAAAAAAAAAAAQAAAAAAAAAAAAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAOdG90YWxXZWlnaHRLZXkFAAAABndlaWdodAUAAAADbmlsCQAFFgAAAAQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAADnRvdGFsV2VpZ2h0S2V5BQAAAAZ3ZWlnaHQFAAAAA25pbAkAAGQAAAACBQAAAA1jdXJyZW50UGVyaW9kAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAQAAABhwcm9jZXNzTmV4dEJhdGNoSW50ZXJuYWwAAAAFAAAAEGJvb3N0aW5nQ29udHJhY3QAAAANY3VycmVudFBlcmlvZAAAAAtjdXJyZW50VXNlcgAAAAVkZXB0aAAAAAt0b3RhbFdlaWdodAQAAAAXYm9vc3RpbmdDb250cmFjdEFkZHJlc3MJAQAAAAdBZGRyZXNzAAAAAQUAAAAQYm9vc3RpbmdDb250cmFjdAQAAAAMbGF0ZXN0UGVyaW9kCQEAAAAOZ2V0TnVtYmVyQnlLZXkAAAABCQEAAAAPa2V5TGF0ZXN0UGVyaW9kAAAAAAQAAAAKdXNlcnNDb3VudAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAABdib29zdGluZ0NvbnRyYWN0QWRkcmVzcwkBAAAADWtleVVzZXJzQ291bnQAAAAAAAAAAAAAAAAABAAAAA50b3RhbFdlaWdodEtleQkBAAAAF2tleVRvdGFsV2VpZ2h0Rm9yUGVyaW9kAAAAAQUAAAANY3VycmVudFBlcmlvZAQAAAAPaGVpZ2h0Rm9yUGVyaW9kCQEAAAAOZ2V0TnVtYmVyQnlLZXkAAAABCQEAAAASa2V5SGVpZ2h0Rm9yUGVyaW9kAAAAAQUAAAANY3VycmVudFBlcmlvZAMDCQAAZgAAAAIFAAAABWRlcHRoAAAAAAAAAAAACQAAZwAAAAIFAAAADGxhdGVzdFBlcmlvZAUAAAANY3VycmVudFBlcmlvZAcEAAAACyR0MDYwODQ2MTg2CQEAAAAOY2FsY1VzZXJXZWlnaHQAAAAEBQAAABdib29zdGluZ0NvbnRyYWN0QWRkcmVzcwUAAAAPaGVpZ2h0Rm9yUGVyaW9kBQAAAA1jdXJyZW50UGVyaW9kBQAAAAtjdXJyZW50VXNlcgQAAAACdzAIBQAAAAskdDA2MDg0NjE4NgAAAAJfMQQAAAAFc2F2ZTAIBQAAAAskdDA2MDg0NjE4NgAAAAJfMgQAAAAHd2VpZ2h0MAkAAGQAAAACBQAAAAt0b3RhbFdlaWdodAUAAAACdzADCQAAZgAAAAIFAAAACnVzZXJzQ291bnQJAABkAAAAAgUAAAALY3VycmVudFVzZXIAAAAAAAAAAAEEAAAACyR0MDYyNzM2Mzg0CQEAAAAOY2FsY1VzZXJXZWlnaHQAAAAEBQAAABdib29zdGluZ0NvbnRyYWN0QWRkcmVzcwUAAAAPaGVpZ2h0Rm9yUGVyaW9kBQAAAA1jdXJyZW50UGVyaW9kCQAAZAAAAAIFAAAAC2N1cnJlbnRVc2VyAAAAAAAAAAABBAAAAAd3ZWlnaHQxCAUAAAALJHQwNjI3MzYzODQAAAACXzEEAAAABXNhdmUxCAUAAAALJHQwNjI3MzYzODQAAAACXzIDCQAAZgAAAAIFAAAACnVzZXJzQ291bnQJAABkAAAAAgUAAAALY3VycmVudFVzZXIAAAAAAAAAAAIEAAAACyR0MDY0NDA2NTUxCQEAAAAOY2FsY1VzZXJXZWlnaHQAAAAEBQAAABdib29zdGluZ0NvbnRyYWN0QWRkcmVzcwUAAAAPaGVpZ2h0Rm9yUGVyaW9kBQAAAA1jdXJyZW50UGVyaW9kCQAAZAAAAAIFAAAAC2N1cnJlbnRVc2VyAAAAAAAAAAACBAAAAAd3ZWlnaHQyCAUAAAALJHQwNjQ0MDY1NTEAAAACXzEEAAAABXNhdmUyCAUAAAALJHQwNjQ0MDY1NTEAAAACXzIDCQAAZgAAAAIFAAAACnVzZXJzQ291bnQJAABkAAAAAgUAAAALY3VycmVudFVzZXIAAAAAAAAAAAMEAAAACyR0MDY2MTE2NzIyCQEAAAAOY2FsY1VzZXJXZWlnaHQAAAAEBQAAABdib29zdGluZ0NvbnRyYWN0QWRkcmVzcwUAAAAPaGVpZ2h0Rm9yUGVyaW9kBQAAAA1jdXJyZW50UGVyaW9kCQAAZAAAAAIFAAAAC2N1cnJlbnRVc2VyAAAAAAAAAAADBAAAAAd3ZWlnaHQzCAUAAAALJHQwNjYxMTY3MjIAAAACXzEEAAAABXNhdmUzCAUAAAALJHQwNjYxMTY3MjIAAAACXzIDCQAAZgAAAAIFAAAACnVzZXJzQ291bnQJAABkAAAAAgUAAAALY3VycmVudFVzZXIAAAAAAAAAAAQEAAAACyR0MDY3ODY2ODk3CQEAAAAOY2FsY1VzZXJXZWlnaHQAAAAEBQAAABdib29zdGluZ0NvbnRyYWN0QWRkcmVzcwUAAAAPaGVpZ2h0Rm9yUGVyaW9kBQAAAA1jdXJyZW50UGVyaW9kCQAAZAAAAAIFAAAAC2N1cnJlbnRVc2VyAAAAAAAAAAAEBAAAAAd3ZWlnaHQ0CAUAAAALJHQwNjc4NjY4OTcAAAACXzEEAAAABXNhdmU0CAUAAAALJHQwNjc4NjY4OTcAAAACXzIDCQAAZgAAAAIFAAAACnVzZXJzQ291bnQJAABkAAAAAgUAAAALY3VycmVudFVzZXIAAAAAAAAAAAUEAAAACyR0MDY5NjU3MDc2CQEAAAAOY2FsY1VzZXJXZWlnaHQAAAAEBQAAABdib29zdGluZ0NvbnRyYWN0QWRkcmVzcwUAAAAPaGVpZ2h0Rm9yUGVyaW9kBQAAAA1jdXJyZW50UGVyaW9kCQAAZAAAAAIFAAAAC2N1cnJlbnRVc2VyAAAAAAAAAAAFBAAAAAd3ZWlnaHQ1CAUAAAALJHQwNjk2NTcwNzYAAAACXzEEAAAABXNhdmU1CAUAAAALJHQwNjk2NTcwNzYAAAACXzIDCQAAZgAAAAIFAAAACnVzZXJzQ291bnQJAABkAAAAAgUAAAALY3VycmVudFVzZXIAAAAAAAAAAAYEAAAACyR0MDcxOTU3MzUxCQEAAAANaW52b2tlUHJvY2VzcwAAAAYFAAAAEGJvb3N0aW5nQ29udHJhY3QFAAAADWN1cnJlbnRQZXJpb2QJAABkAAAAAgUAAAALY3VycmVudFVzZXIAAAAAAAAAAAYJAABlAAAAAgUAAAAFZGVwdGgAAAAAAAAAAAEJAABkAAAAAgkAAGQAAAACCQAAZAAAAAIJAABkAAAAAgkAAGQAAAACBQAAAAd3ZWlnaHQwBQAAAAd3ZWlnaHQxBQAAAAd3ZWlnaHQyBQAAAAd3ZWlnaHQzBQAAAAd3ZWlnaHQ0BQAAAAd3ZWlnaHQ1BQAAAANuaWwEAAAAAWEIBQAAAAskdDA3MTk1NzM1MQAAAAJfMQQAAAABcAgFAAAACyR0MDcxOTU3MzUxAAAAAl8yBAAAAAF1CAUAAAALJHQwNzE5NTczNTEAAAACXzMEAAAAAXcIBQAAAAskdDA3MTk1NzM1MQAAAAJfNAkABRYAAAAECQAETgAAAAIJAAROAAAAAgkABE4AAAACCQAETgAAAAIJAAROAAAAAgkABE4AAAACBQAAAAFhBQAAAAVzYXZlMAUAAAAFc2F2ZTEFAAAABXNhdmUyBQAAAAVzYXZlMwUAAAAFc2F2ZTQFAAAABXNhdmU1BQAAAAFwBQAAAAF1BQAAAAF3BAAAAAskdDA3NTE5NzY4OAkBAAAAFWNoZWNrTGFzdFBhcnRPZlBlcmlvZAAAAAYFAAAAEGJvb3N0aW5nQ29udHJhY3QFAAAADWN1cnJlbnRQZXJpb2QFAAAADGxhdGVzdFBlcmlvZAUAAAAFZGVwdGgFAAAADnRvdGFsV2VpZ2h0S2V5CQAAZAAAAAIJAABkAAAAAgkAAGQAAAACCQAAZAAAAAIJAABkAAAAAgUAAAAHd2VpZ2h0MAUAAAAHd2VpZ2h0MQUAAAAHd2VpZ2h0MgUAAAAHd2VpZ2h0MwUAAAAHd2VpZ2h0NAUAAAAHd2VpZ2h0NQQAAAABYQgFAAAACyR0MDc1MTk3Njg4AAAAAl8xBAAAAAFwCAUAAAALJHQwNzUxOTc2ODgAAAACXzIEAAAAAXUIBQAAAAskdDA3NTE5NzY4OAAAAAJfMwQAAAABdwgFAAAACyR0MDc1MTk3Njg4AAAAAl80CQAFFgAAAAQJAAROAAAAAgkABE4AAAACCQAETgAAAAIJAAROAAAAAgkABE4AAAACCQAETgAAAAIFAAAAAWEFAAAABXNhdmUwBQAAAAVzYXZlMQUAAAAFc2F2ZTIFAAAABXNhdmUzBQAAAAVzYXZlNAUAAAAFc2F2ZTUFAAAAAXAFAAAAAXUFAAAAAXcEAAAACyR0MDc4Njg4MDI3CQEAAAAVY2hlY2tMYXN0UGFydE9mUGVyaW9kAAAABgUAAAAQYm9vc3RpbmdDb250cmFjdAUAAAANY3VycmVudFBlcmlvZAUAAAAMbGF0ZXN0UGVyaW9kBQAAAAVkZXB0aAUAAAAOdG90YWxXZWlnaHRLZXkJAABkAAAAAgkAAGQAAAACCQAAZAAAAAIJAABkAAAAAgUAAAAHd2VpZ2h0MAUAAAAHd2VpZ2h0MQUAAAAHd2VpZ2h0MgUAAAAHd2VpZ2h0MwUAAAAHd2VpZ2h0NAQAAAABYQgFAAAACyR0MDc4Njg4MDI3AAAAAl8xBAAAAAFwCAUAAAALJHQwNzg2ODgwMjcAAAACXzIEAAAAAXUIBQAAAAskdDA3ODY4ODAyNwAAAAJfMwQAAAABdwgFAAAACyR0MDc4Njg4MDI3AAAAAl80CQAFFgAAAAQJAAROAAAAAgkABE4AAAACCQAETgAAAAIJAAROAAAAAgkABE4AAAACBQAAAAFhBQAAAAVzYXZlMAUAAAAFc2F2ZTEFAAAABXNhdmUyBQAAAAVzYXZlMwUAAAAFc2F2ZTQFAAAAAXAFAAAAAXUFAAAAAXcEAAAACyR0MDgxOTA4MzM5CQEAAAAVY2hlY2tMYXN0UGFydE9mUGVyaW9kAAAABgUAAAAQYm9vc3RpbmdDb250cmFjdAUAAAANY3VycmVudFBlcmlvZAUAAAAMbGF0ZXN0UGVyaW9kBQAAAAVkZXB0aAUAAAAOdG90YWxXZWlnaHRLZXkJAABkAAAAAgkAAGQAAAACCQAAZAAAAAIFAAAAB3dlaWdodDAFAAAAB3dlaWdodDEFAAAAB3dlaWdodDIFAAAAB3dlaWdodDMEAAAAAWEIBQAAAAskdDA4MTkwODMzOQAAAAJfMQQAAAABcAgFAAAACyR0MDgxOTA4MzM5AAAAAl8yBAAAAAF1CAUAAAALJHQwODE5MDgzMzkAAAACXzMEAAAAAXcIBQAAAAskdDA4MTkwODMzOQAAAAJfNAkABRYAAAAECQAETgAAAAIJAAROAAAAAgkABE4AAAACCQAETgAAAAIFAAAAAWEFAAAABXNhdmUwBQAAAAVzYXZlMQUAAAAFc2F2ZTIFAAAABXNhdmUzBQAAAAFwBQAAAAF1BQAAAAF3BAAAAAskdDA4NDg1ODYyNAkBAAAAFWNoZWNrTGFzdFBhcnRPZlBlcmlvZAAAAAYFAAAAEGJvb3N0aW5nQ29udHJhY3QFAAAADWN1cnJlbnRQZXJpb2QFAAAADGxhdGVzdFBlcmlvZAUAAAAFZGVwdGgFAAAADnRvdGFsV2VpZ2h0S2V5CQAAZAAAAAIJAABkAAAAAgUAAAAHd2VpZ2h0MAUAAAAHd2VpZ2h0MQUAAAAHd2VpZ2h0MgQAAAABYQgFAAAACyR0MDg0ODU4NjI0AAAAAl8xBAAAAAFwCAUAAAALJHQwODQ4NTg2MjQAAAACXzIEAAAAAXUIBQAAAAskdDA4NDg1ODYyNAAAAAJfMwQAAAABdwgFAAAACyR0MDg0ODU4NjI0AAAAAl80CQAFFgAAAAQJAAROAAAAAgkABE4AAAACCQAETgAAAAIFAAAAAWEFAAAABXNhdmUwBQAAAAVzYXZlMQUAAAAFc2F2ZTIFAAAAAXAFAAAAAXUFAAAAAXcEAAAACyR0MDg3NTM4ODgyCQEAAAAVY2hlY2tMYXN0UGFydE9mUGVyaW9kAAAABgUAAAAQYm9vc3RpbmdDb250cmFjdAUAAAANY3VycmVudFBlcmlvZAUAAAAMbGF0ZXN0UGVyaW9kBQAAAAVkZXB0aAUAAAAOdG90YWxXZWlnaHRLZXkJAABkAAAAAgUAAAAHd2VpZ2h0MAUAAAAHd2VpZ2h0MQQAAAABYQgFAAAACyR0MDg3NTM4ODgyAAAAAl8xBAAAAAFwCAUAAAALJHQwODc1Mzg4ODIAAAACXzIEAAAAAXUIBQAAAAskdDA4NzUzODg4MgAAAAJfMwQAAAABdwgFAAAACyR0MDg3NTM4ODgyAAAAAl80CQAFFgAAAAQJAAROAAAAAgkABE4AAAACBQAAAAFhBQAAAAVzYXZlMAUAAAAFc2F2ZTEFAAAAAXAFAAAAAXUFAAAAAXcEAAAACyR0MDkwMjM5MTQyCQEAAAAVY2hlY2tMYXN0UGFydE9mUGVyaW9kAAAABgUAAAAQYm9vc3RpbmdDb250cmFjdAUAAAANY3VycmVudFBlcmlvZAUAAAAMbGF0ZXN0UGVyaW9kBQAAAAVkZXB0aAUAAAAOdG90YWxXZWlnaHRLZXkFAAAAB3dlaWdodDAEAAAAAWEIBQAAAAskdDA5MDIzOTE0MgAAAAJfMQQAAAABcAgFAAAACyR0MDkwMjM5MTQyAAAAAl8yBAAAAAF1CAUAAAALJHQwOTAyMzkxNDIAAAACXzMEAAAAAXcIBQAAAAskdDA5MDIzOTE0MgAAAAJfNAkABRYAAAAECQAETgAAAAIFAAAAAWEFAAAABXNhdmUwBQAAAAFwBQAAAAF1BQAAAAF3AwkAAAAAAAACBQAAAAtjdXJyZW50VXNlcgAAAAAAAAAAAAkABRYAAAAEBQAAAANuaWwFAAAADWN1cnJlbnRQZXJpb2QAAAAAAAAAAAAAAAAAAAAAAAAJAAUWAAAABAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAOdG90YWxXZWlnaHRLZXkFAAAAC3RvdGFsV2VpZ2h0BQAAAANuaWwFAAAADWN1cnJlbnRQZXJpb2QFAAAAC2N1cnJlbnRVc2VyAAAAAAAAAAAAAQAAAAtpbnZva2VDbGFpbQAAAAUAAAAQYm9vc3RpbmdDb250cmFjdAAAAAZwZXJpb2QAAAAEdXNlcgAAAAVkZXB0aAAAAAV0b3RhbAQAAAAGcmVzdWx0CQAD/AAAAAQFAAAABHRoaXMCAAAADmNsYWltTmV4dEJhdGNoCQAETAAAAAIFAAAAEGJvb3N0aW5nQ29udHJhY3QJAARMAAAAAgUAAAAGcGVyaW9kCQAETAAAAAIFAAAABHVzZXIJAARMAAAAAgUAAAAFZGVwdGgJAARMAAAAAgUAAAAFdG90YWwFAAAAA25pbAUAAAADbmlsAwkAAAAAAAACBQAAAAZyZXN1bHQFAAAABnJlc3VsdAQAAAAHJG1hdGNoMAUAAAAGcmVzdWx0AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAooSW50LCBJbnQpBAAAAAFyBQAAAAckbWF0Y2gwBQAAAAFyCQAAAgAAAAECAAAAF0luY29ycmVjdCBpbnZva2UgcmVzdWx0CQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEAAAANY2xhaW1JbnRlcm5hbAAAAAUAAAAQYm9vc3RpbmdDb250cmFjdAAAAA1jdXJyZW50UGVyaW9kAAAAC2N1cnJlbnRVc2VyAAAABWRlcHRoAAAAD3VzZXJBY2N1bXVsYXRlZAQAAAAXYm9vc3RpbmdDb250cmFjdEFkZHJlc3MJAQAAAAdBZGRyZXNzAAAAAQUAAAAQYm9vc3RpbmdDb250cmFjdAQAAAAMbGF0ZXN0UGVyaW9kCQEAAAAOZ2V0TnVtYmVyQnlLZXkAAAABCQEAAAAWa2V5TmV4dFByb2Nlc3NlZFBlcmlvZAAAAAAEAAAAC3RvdGFsV2VpZ2h0CQEAAAAOZ2V0TnVtYmVyQnlLZXkAAAABCQEAAAAXa2V5VG90YWxXZWlnaHRGb3JQZXJpb2QAAAABBQAAAA1jdXJyZW50UGVyaW9kBAAAAA9oZWlnaHRGb3JQZXJpb2QJAQAAAA5nZXROdW1iZXJCeUtleQAAAAEJAQAAABJrZXlIZWlnaHRGb3JQZXJpb2QAAAABBQAAAA1jdXJyZW50UGVyaW9kBAAAAA0kdDAxMDIyNDEwMzM2CQEAAAAOY2FsY1VzZXJXZWlnaHQAAAAEBQAAABdib29zdGluZ0NvbnRyYWN0QWRkcmVzcwUAAAAPaGVpZ2h0Rm9yUGVyaW9kBQAAAA1jdXJyZW50UGVyaW9kBQAAAAtjdXJyZW50VXNlcgQAAAAKdXNlcldlaWdodAgFAAAADSR0MDEwMjI0MTAzMzYAAAACXzEEAAAAB2lnbm9yZWQIBQAAAA0kdDAxMDIyNDEwMzM2AAAAAl8yBAAAABN1c2VyQW1vdW5kRm9yUGVyaW9kCQAAawAAAAMJAQAAAA5nZXROdW1iZXJCeUtleQAAAAEJAQAAABdrZXlUb3RhbEFtb3VudEZvclBlcmlvZAAAAAEFAAAADWN1cnJlbnRQZXJpb2QFAAAACnVzZXJXZWlnaHQFAAAAC3RvdGFsV2VpZ2h0AwMJAABnAAAAAgAAAAAAAAAAAAUAAAAFZGVwdGgGCQAAZwAAAAIJAABkAAAAAgUAAAANY3VycmVudFBlcmlvZAAAAAAAAAAAAQUAAAAMbGF0ZXN0UGVyaW9kCQAFFAAAAAIJAABkAAAAAgUAAAANY3VycmVudFBlcmlvZAAAAAAAAAAAAQkAAGQAAAACBQAAAA91c2VyQWNjdW11bGF0ZWQFAAAAE3VzZXJBbW91bmRGb3JQZXJpb2QJAQAAAAtpbnZva2VDbGFpbQAAAAUFAAAAEGJvb3N0aW5nQ29udHJhY3QJAABkAAAAAgUAAAANY3VycmVudFBlcmlvZAAAAAAAAAAAAQUAAAALY3VycmVudFVzZXIJAABlAAAAAgUAAAAFZGVwdGgAAAAAAAAAAAEJAABkAAAAAgUAAAAPdXNlckFjY3VtdWxhdGVkBQAAABN1c2VyQW1vdW5kRm9yUGVyaW9kAQAAABFjb21tb25DbGFpbVJld2FyZAAAAAEAAAALdXNlckFkZHJlc3MEAAAACGNmZ0FycmF5CQEAAAAVcmVhZENvbmZpZ0FycmF5T3JGYWlsAAAAAAQAAAAHdXNlcklkeAkBAAAAFWdldFVzZXJJbmRleEJ5QWRkcmVzcwAAAAIJAAGRAAAAAgUAAAAIY2ZnQXJyYXkFAAAAFklkeENmZ0Jvb3N0aW5nQ29udHJhY3QFAAAAC3VzZXJBZGRyZXNzBAAAAA1jdXJyZW50UGVyaW9kCQEAAAAOZ2V0TnVtYmVyQnlLZXkAAAABCQEAAAAba2V5TmV4dFVubGFpbWVkUGVyaW9kT2ZVc2VyAAAAAQUAAAAHdXNlcklkeAMJAABnAAAAAgUAAAANY3VycmVudFBlcmlvZAkBAAAADmdldE51bWJlckJ5S2V5AAAAAQkBAAAAFmtleU5leHRQcm9jZXNzZWRQZXJpb2QAAAAACQAAAgAAAAECAAAAEE5vdGhpbmcgdG8gY2xhaW0EAAAAEGJvb3N0aW5nQ29udHJhY3QJAAJZAAAAAQkAAZEAAAACBQAAAAhjZmdBcnJheQUAAAAWSWR4Q2ZnQm9vc3RpbmdDb250cmFjdAkABRUAAAADCQEAAAANY2xhaW1JbnRlcm5hbAAAAAUFAAAAEGJvb3N0aW5nQ29udHJhY3QFAAAADWN1cnJlbnRQZXJpb2QFAAAAB3VzZXJJZHgFAAAACVVTRVJERVBUSAAAAAAAAAAAAAUAAAAHdXNlcklkeAUAAAAIY2ZnQXJyYXkAAAAIAAAAAWkBAAAAEHByb2Nlc3NOZXh0QmF0Y2gAAAAFAAAAEGJvb3N0aW5nQ29udHJhY3QAAAANY3VycmVudFBlcmlvZAAAAAtjdXJyZW50VXNlcgAAAAVkZXB0aAAAAAt0b3RhbFdlaWdodAMJAQAAAAIhPQAAAAIIBQAAAAFpAAAABmNhbGxlcgUAAAAEdGhpcwkAAAIAAAABAgAAACRTaG91bGQgYmUgY2FsbGVkIGJ5IHRoaXMgc2NyaXB0IG9ubHkEAAAAA3RwbAkBAAAAGHByb2Nlc3NOZXh0QmF0Y2hJbnRlcm5hbAAAAAUFAAAAEGJvb3N0aW5nQ29udHJhY3QFAAAADWN1cnJlbnRQZXJpb2QFAAAAC2N1cnJlbnRVc2VyBQAAAAVkZXB0aAUAAAALdG90YWxXZWlnaHQJAAUUAAAAAggFAAAAA3RwbAAAAAJfMQkABRUAAAADCAUAAAADdHBsAAAAAl8yCAUAAAADdHBsAAAAAl8zCAUAAAADdHBsAAAAAl80AAAAAWkBAAAAHXByb2Nlc3NQZW5kaW5nUGVyaW9kc0FuZFVzZXJzAAAAAQAAAAVkZXB0aAMJAABmAAAAAgUAAAAFZGVwdGgFAAAACE1BWERFUFRICQAAAgAAAAECAAAAFkRlcHRoIGV4Y2VlZHMgTUFYREVQVEgEAAAADWN1cnJlbnRQZXJpb2QJAQAAAA5nZXROdW1iZXJCeUtleQAAAAEJAQAAABZrZXlOZXh0UHJvY2Vzc2VkUGVyaW9kAAAAAAMJAABmAAAAAgUAAAANY3VycmVudFBlcmlvZAkBAAAADmdldE51bWJlckJ5S2V5AAAAAQkBAAAAD2tleUxhdGVzdFBlcmlvZAAAAAAJAAACAAAAAQIAAAASTm90aGluZyB0byBwcm9jZXNzBAAAABBib29zdGluZ0NvbnRyYWN0CQACWQAAAAEJAAGRAAAAAgkBAAAAFXJlYWRDb25maWdBcnJheU9yRmFpbAAAAAAFAAAAFklkeENmZ0Jvb3N0aW5nQ29udHJhY3QEAAAAC2N1cnJlbnRVc2VyCQEAAAAOZ2V0TnVtYmVyQnlLZXkAAAABCQEAAAAUa2V5TmV4dFByb2Nlc3NlZFVzZXIAAAAABAAAAAt0b3RhbFdlaWdodAkBAAAADmdldE51bWJlckJ5S2V5AAAAAQkBAAAAF2tleVRvdGFsV2VpZ2h0Rm9yUGVyaW9kAAAAAQUAAAANY3VycmVudFBlcmlvZAQAAAABcgkBAAAAGHByb2Nlc3NOZXh0QmF0Y2hJbnRlcm5hbAAAAAUFAAAAEGJvb3N0aW5nQ29udHJhY3QFAAAADWN1cnJlbnRQZXJpb2QFAAAAC2N1cnJlbnRVc2VyBQAAAAVkZXB0aAUAAAALdG90YWxXZWlnaHQJAARNAAAAAgkABE0AAAACCAUAAAABcgAAAAJfMQkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABZrZXlOZXh0UHJvY2Vzc2VkUGVyaW9kAAAAAAgFAAAAAXIAAAACXzIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAUa2V5TmV4dFByb2Nlc3NlZFVzZXIAAAAACAUAAAABcgAAAAJfMwAAAAFpAQAAAAdkZXBvc2l0AAAAAAQAAAAIY2ZnQXJyYXkJAQAAABVyZWFkQ29uZmlnQXJyYXlPckZhaWwAAAAABAAAAAdhc3NldElkCQEAAAAFdmFsdWUAAAABCAkBAAAABXZhbHVlAAAAAQkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAAAAAdhc3NldElkAwkBAAAAAiE9AAAAAgUAAAAHYXNzZXRJZAkAAlkAAAABCQABkQAAAAIFAAAACGNmZ0FycmF5BQAAAA1JZHhDZmdBc3NldElkCQAAAgAAAAECAAAAE1dyb25nIHBheW1lbnQgYXNzZXQEAAAABnBlcmlvZAkBAAAACm5leHRQZXJpb2QAAAAACQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAPa2V5TGF0ZXN0UGVyaW9kAAAAAAUAAAAGcGVyaW9kCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAASa2V5SGVpZ2h0Rm9yUGVyaW9kAAAAAQUAAAAGcGVyaW9kBQAAAAZoZWlnaHQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABdrZXlUb3RhbEFtb3VudEZvclBlcmlvZAAAAAEFAAAABnBlcmlvZAgJAQAAAAV2YWx1ZQAAAAEJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAGYW1vdW50CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAANa2V5TmV4dFBlcmlvZAAAAAAJAABkAAAAAgUAAAAGcGVyaW9kAAAAAAAAAAABBQAAAANuaWwAAAABaQEAAAAOY2xhaW1OZXh0QmF0Y2gAAAAFAAAAEGJvb3N0aW5nQ29udHJhY3QAAAANY3VycmVudFBlcmlvZAAAAAtjdXJyZW50VXNlcgAAAAVkZXB0aAAAAAt0b3RhbFdlaWdodAMJAQAAAAIhPQAAAAIIBQAAAAFpAAAABmNhbGxlcgUAAAAEdGhpcwkAAAIAAAABAgAAACRTaG91bGQgYmUgY2FsbGVkIGJ5IHRoaXMgc2NyaXB0IG9ubHkEAAAADnBlcmlvZEFuZFRvdGFsCQEAAAANY2xhaW1JbnRlcm5hbAAAAAUFAAAAEGJvb3N0aW5nQ29udHJhY3QFAAAADWN1cnJlbnRQZXJpb2QFAAAAC2N1cnJlbnRVc2VyBQAAAAVkZXB0aAUAAAALdG90YWxXZWlnaHQJAAUUAAAAAgUAAAADbmlsBQAAAA5wZXJpb2RBbmRUb3RhbAAAAAFpAQAAAAtjbGFpbVJld2FyZAAAAAAEAAAAB2FkZHJlc3MJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyBAAAAA1jb21tb25SZXN1bHRzCQEAAAARY29tbW9uQ2xhaW1SZXdhcmQAAAABBQAAAAdhZGRyZXNzBAAAAAFyCAUAAAANY29tbW9uUmVzdWx0cwAAAAJfMQQAAAAHdXNlcklkeAgFAAAADWNvbW1vblJlc3VsdHMAAAACXzIEAAAACGNmZ0FycmF5CAUAAAANY29tbW9uUmVzdWx0cwAAAAJfMwkABRQAAAACCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAba2V5TmV4dFVubGFpbWVkUGVyaW9kT2ZVc2VyAAAAAQUAAAAHdXNlcklkeAgFAAAAAXIAAAACXzEJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyCAUAAAABcgAAAAJfMgkAAlkAAAABCQABkQAAAAIFAAAACGNmZ0FycmF5BQAAAA1JZHhDZmdBc3NldElkBQAAAANuaWwIBQAAAAFyAAAAAl8yAAAAAWkBAAAAE2NsYWltUmV3YXJkUkVBRE9OTFkAAAABAAAAC3VzZXJBZGRyZXNzBAAAAA1jb21tb25SZXN1bHRzCQEAAAARY29tbW9uQ2xhaW1SZXdhcmQAAAABBQAAAAt1c2VyQWRkcmVzcwQAAAABcggFAAAADWNvbW1vblJlc3VsdHMAAAACXzEEAAAAB3VzZXJJZHgIBQAAAA1jb21tb25SZXN1bHRzAAAAAl8yBAAAAAhjZmdBcnJheQgFAAAADWNvbW1vblJlc3VsdHMAAAACXzMJAAUUAAAAAgUAAAADbmlsCAUAAAABcgAAAAJfMgAAAAFpAQAAABVjYWxjR3d4UGFyYW1zUkVBRE9OTFkAAAADAAAACHd4QW1vdW50AAAAD2xvY2tTdGFydEhlaWdodAAAABJsb2NrRHVyYXRpb25CbG9ja3MEAAAADWxvY2tFbmRIZWlnaHQJAABkAAAAAgUAAAAPbG9ja1N0YXJ0SGVpZ2h0BQAAABJsb2NrRHVyYXRpb25CbG9ja3MEAAAADHNjYWxlOFBhcmFtSwkBAAAAAS0AAAABCQAAawAAAAMFAAAACHd4QW1vdW50BQAAAAZTQ0FMRTYFAAAAEmxvY2tEdXJhdGlvbkJsb2NrcwQAAAAMc2NhbGU4UGFyYW1CCQAAaAAAAAIJAABrAAAAAwUAAAAId3hBbW91bnQFAAAABlNDQUxFNgUAAAASbG9ja0R1cmF0aW9uQmxvY2tzBQAAAA1sb2NrRW5kSGVpZ2h0CQAFFAAAAAIFAAAAA25pbAkABEwAAAACBQAAAAxzY2FsZThQYXJhbUsJAARMAAAAAgUAAAAMc2NhbGU4UGFyYW1CCQAETAAAAAIJAQAAAApuZXh0UGVyaW9kAAAAAAUAAAADbmlsAAAAAWkBAAAAC2NvbnN0cnVjdG9yAAAAAwAAAAx3eEFzc2V0SWRTdHIAAAAabWF0Y2hlclBhY2VtYWtlckFkZHJlc3NTdHIAAAAaYm9vc3RpbmdDb250cmFjdEFkZHJlc3NTdHIDCQEAAAACIT0AAAACBQAAAAR0aGlzCAUAAAABaQAAAAZjYWxsZXIJAAACAAAAAQIAAAAObm90IGF1dGhvcml6ZWQJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAACWtleUNvbmZpZwAAAAAJAQAAAAxmb3JtYXRDb25maWcAAAADBQAAAAx3eEFzc2V0SWRTdHIFAAAAGm1hdGNoZXJQYWNlbWFrZXJBZGRyZXNzU3RyBQAAABpib29zdGluZ0NvbnRyYWN0QWRkcmVzc1N0cgUAAAADbmlsAAAAAPT+bhE=", "chainId": 84, "height": 1796609, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: BBJCr3LuhhHqaUJXLTdi4nMYhLEzyjLBTtjz2s1apvC7 Next: HvuQNpjYC9Qz1tyJoRiELRgvoLz6WfWdHj5AR9ArzZa5 Diff:
OldNewDifferences
99
1010 let USERDEPTH = 26
1111
12-let SCALE = 1000
12+let SCALE6 = 1000000
1313
1414 func getNumberByKey (key) = valueOrElse(getInteger(this, key), 0)
1515
2626
2727 let IdxCfgBoostingContract = 3
2828
29-let IdxCfgMaxDepth = 4
30-
3129 func keyConfig () = "%s__config"
3230
3331
3432 func readConfigArrayOrFail () = split(getStringOrFail(keyConfig()), SEP)
3533
3634
37-func formatConfig (wxAssetIdStr,matcherPacemakerAddressStr,boostingContractAddressStr,maxDepth) = makeString(["%s%s%s%d", wxAssetIdStr, matcherPacemakerAddressStr, boostingContractAddressStr, toString(maxDepth)], SEP)
35+func formatConfig (wxAssetIdStr,matcherPacemakerAddressStr,boostingContractAddressStr) = makeString(["%s%s%s", wxAssetIdStr, matcherPacemakerAddressStr, boostingContractAddressStr], SEP)
3836
3937
40-func keyUsersCount () = "%s__nextUserNum"
38+func keyUsersCount () = makeString(["%s", "nextUserNum"], SEP)
4139
4240
43-func keyNextProcessedUser () = "%s__nextProcessedUser"
41+func keyNextProcessedUser () = makeString(["%s", "nextProcessedUser"], SEP)
4442
4543
46-func keyLatestPeriod () = "%s__latestPeriod"
44+func keyLatestPeriod () = makeString(["%s", "latestPeriod"], SEP)
4745
4846
49-func keyNextPeriod () = "%s__nextPeriod"
47+func keyNextPeriod () = makeString(["%s", "nextPeriod"], SEP)
5048
5149
52-func keyNextProcessedPeriod () = "%s__nextProcessedPeriod"
50+func keyNextProcessedPeriod () = makeString(["%s", "nextProcessedPeriod"], SEP)
5351
5452
55-func keyNextUnlaimedPeriodOfUser (userIndex) = makeString(["%s%d__nextClaimedPeriod", toString(userIndex)], SEP)
53+func keyNextUnlaimedPeriodOfUser (userIndex) = makeString(["%s%d", "nextClaimedPeriod", toString(userIndex)], SEP)
5654
5755
58-func keyLastProcessedPeriodOfUser (userIndex) = makeString(["%s%d__lastProcessedPeriod", toString(userIndex)], SEP)
56+func keyLastProcessedPeriodOfUser (userIndex) = makeString(["%s%d", "lastProcessedPeriod", toString(userIndex)], SEP)
5957
6058
61-func keyHeightForPeriod (period) = makeString(["%s%d__startHeightForPeriod", toString(period)], SEP)
59+func keyHeightForPeriod (period) = makeString(["%s%d", "startHeightForPeriod", toString(period)], SEP)
6260
6361
64-func keyTotalAmountForPeriod (period) = makeString(["%s%d__totalAmountForPeriod", toString(period)], SEP)
62+func keyTotalAmountForPeriod (period) = makeString(["%s%d", "totalAmountForPeriod", toString(period)], SEP)
6563
6664
67-func keyTotalWeightForPeriod (period) = makeString(["%s%d__totalWeightForPeriod", toString(period)], SEP)
65+func keyTotalWeightForPeriod (period) = makeString(["%s%d", "totalWeightForPeriod", toString(period)], SEP)
6866
6967
70-func keyUserKValueForPeriod (period,userIndex) = makeString(["%s%d%s%d__paramByPeriod", toString(userIndex), "k", toString(period)], SEP)
68+func keyUserKValueForPeriod (period,userIndex) = makeString(["%s%d%s%d", "paramByPeriod", toString(userIndex), "k", toString(period)], SEP)
7169
7270
73-func keyUserBValueForPeriod (period,userIndex) = makeString(["%s%d%s%d__paramByPeriod", toString(userIndex), "b", toString(period)], SEP)
74-
75-
76-func HistoryEntry (type,user,amount,currentPeriod,latestPeriod,i) = {
77- let historyKEY = makeString(["%s%s%s%s__history", type, user, toBase58String(i.transactionId)], SEP)
78- let historyDATA = makeString(["%d%d%d%d%d", toString(lastBlock.height), toString(lastBlock.timestamp), toString(amount), toString(currentPeriod), toString(latestPeriod)], SEP)
79- StringEntry(historyKEY, historyDATA)
80- }
71+func keyUserBValueForPeriod (period,userIndex) = makeString(["%s%d%s%d", "paramByPeriod", toString(userIndex), "b", toString(period)], SEP)
8172
8273
8374 func calcUserWeight (boostingContractAddress,heightForPeriod,period,userIndex) = {
9081 let b = value(getInteger(boostingContractAddress, keyUserBValueForPeriod(period, userIndex)))
9182 let w = ((k * heightForPeriod) + b)
9283 if ((w > 0))
93- then $Tuple2((w / SCALE), [IntegerEntry(kLast, period)])
84+ then $Tuple2((w / SCALE6), [IntegerEntry(kLast, period)])
9485 else $Tuple2(0, nil)
9586 }
9687 else {
10293 let b = value(getInteger(boostingContractAddress, keyUserBValueForPeriod(pv, userIndex)))
10394 let w = ((k * heightForPeriod) + b)
10495 if ((w > 0))
105- then $Tuple2((w / SCALE), nil)
96+ then $Tuple2((w / SCALE6), nil)
10697 else $Tuple2(0, nil)
10798 }
10899 else $Tuple2(0, nil)
119110 func nextPeriod () = getNumberByKey(keyNextPeriod())
120111
121112
122-func invokeProcess (boostingContract,period,user,depth,weight) = {
113+func invokeProcess (boostingContract,period,user,depth,weight,actions) = {
123114 let result = invoke(this, "processNextBatch", [boostingContract, period, user, depth, weight], nil)
124115 if ((result == result))
125116 then match result {
126117 case r: (Int, Int, Int) =>
127- r
118+ $Tuple4(actions, r._1, r._2, r._3)
128119 case _ =>
129120 throw("Incorrect invoke result")
130121 }
133124
134125
135126 func checkLastPartOfPeriod (boostingContract,currentPeriod,latestPeriod,depth,totalWeightKey,weight) = if ((latestPeriod >= (currentPeriod + 1)))
136- then invokeProcess(boostingContract, (currentPeriod + 1), 0, (depth - 1), 0)
137- else $Tuple3((currentPeriod + 1), 0, 0)
127+ then invokeProcess(boostingContract, (currentPeriod + 1), 0, (depth - 1), 0, [IntegerEntry(totalWeightKey, weight)])
128+ else $Tuple4([IntegerEntry(totalWeightKey, weight)], (currentPeriod + 1), 0, 0)
138129
139130
140131 func processNextBatchInternal (boostingContract,currentPeriod,currentUser,depth,totalWeight) = {
147138 then (latestPeriod >= currentPeriod)
148139 else false)
149140 then {
150- let t0 = calcUserWeight(boostingContractAddress, heightForPeriod, currentPeriod, currentUser)
151- let weight0 = (totalWeight + t0._1)
141+ let $t060846186 = calcUserWeight(boostingContractAddress, heightForPeriod, currentPeriod, currentUser)
142+ let w0 = $t060846186._1
143+ let save0 = $t060846186._2
144+ let weight0 = (totalWeight + w0)
152145 if ((usersCount > (currentUser + 1)))
153146 then {
154- let t1 = calcUserWeight(boostingContractAddress, heightForPeriod, currentPeriod, (currentUser + 1))
155- let weight1 = (weight0 + t1._1)
147+ let $t062736384 = calcUserWeight(boostingContractAddress, heightForPeriod, currentPeriod, (currentUser + 1))
148+ let weight1 = $t062736384._1
149+ let save1 = $t062736384._2
156150 if ((usersCount > (currentUser + 2)))
157151 then {
158- let t2 = calcUserWeight(boostingContractAddress, heightForPeriod, currentPeriod, (currentUser + 2))
159- let weight2 = (weight1 + t2._1)
152+ let $t064406551 = calcUserWeight(boostingContractAddress, heightForPeriod, currentPeriod, (currentUser + 2))
153+ let weight2 = $t064406551._1
154+ let save2 = $t064406551._2
160155 if ((usersCount > (currentUser + 3)))
161156 then {
162- let t3 = calcUserWeight(boostingContractAddress, heightForPeriod, currentPeriod, (currentUser + 3))
163- let weight3 = (weight2 + t3._1)
157+ let $t066116722 = calcUserWeight(boostingContractAddress, heightForPeriod, currentPeriod, (currentUser + 3))
158+ let weight3 = $t066116722._1
159+ let save3 = $t066116722._2
164160 if ((usersCount > (currentUser + 4)))
165161 then {
166- let t4 = calcUserWeight(boostingContractAddress, heightForPeriod, currentPeriod, (currentUser + 4))
167- let weight4 = (weight3 + t4._1)
162+ let $t067866897 = calcUserWeight(boostingContractAddress, heightForPeriod, currentPeriod, (currentUser + 4))
163+ let weight4 = $t067866897._1
164+ let save4 = $t067866897._2
168165 if ((usersCount > (currentUser + 5)))
169166 then {
170- let t5 = calcUserWeight(boostingContractAddress, heightForPeriod, currentPeriod, (currentUser + 5))
171- let weight5 = (weight4 + t5._1)
167+ let $t069657076 = calcUserWeight(boostingContractAddress, heightForPeriod, currentPeriod, (currentUser + 5))
168+ let weight5 = $t069657076._1
169+ let save5 = $t069657076._2
172170 if ((usersCount > (currentUser + 6)))
173171 then {
174- let r5 = invokeProcess(boostingContract, currentPeriod, (currentUser + 6), (depth - 1), weight5)
175- $Tuple4((((((t0._2 ++ t1._2) ++ t2._2) ++ t3._2) ++ t4._2) ++ t5._2), r5._1, r5._2, r5._3)
172+ let $t071957351 = invokeProcess(boostingContract, currentPeriod, (currentUser + 6), (depth - 1), (((((weight0 + weight1) + weight2) + weight3) + weight4) + weight5), nil)
173+ let a = $t071957351._1
174+ let p = $t071957351._2
175+ let u = $t071957351._3
176+ let w = $t071957351._4
177+ $Tuple4(((((((a ++ save0) ++ save1) ++ save2) ++ save3) ++ save4) ++ save5), p, u, w)
176178 }
177179 else {
178- let r5 = checkLastPartOfPeriod(boostingContract, currentPeriod, latestPeriod, depth, totalWeightKey, weight5)
179- $Tuple4((((((([IntegerEntry(totalWeightKey, weight5)] ++ t0._2) ++ t1._2) ++ t2._2) ++ t3._2) ++ t4._2) ++ t5._2), r5._1, r5._2, r5._3)
180+ let $t075197688 = checkLastPartOfPeriod(boostingContract, currentPeriod, latestPeriod, depth, totalWeightKey, (((((weight0 + weight1) + weight2) + weight3) + weight4) + weight5))
181+ let a = $t075197688._1
182+ let p = $t075197688._2
183+ let u = $t075197688._3
184+ let w = $t075197688._4
185+ $Tuple4(((((((a ++ save0) ++ save1) ++ save2) ++ save3) ++ save4) ++ save5), p, u, w)
180186 }
181187 }
182188 else {
183- let r4 = checkLastPartOfPeriod(boostingContract, currentPeriod, latestPeriod, depth, totalWeightKey, weight4)
184- $Tuple4(((((([IntegerEntry(totalWeightKey, weight4)] ++ t0._2) ++ t1._2) ++ t2._2) ++ t3._2) ++ t4._2), r4._1, r4._2, r4._3)
189+ let $t078688027 = checkLastPartOfPeriod(boostingContract, currentPeriod, latestPeriod, depth, totalWeightKey, ((((weight0 + weight1) + weight2) + weight3) + weight4))
190+ let a = $t078688027._1
191+ let p = $t078688027._2
192+ let u = $t078688027._3
193+ let w = $t078688027._4
194+ $Tuple4((((((a ++ save0) ++ save1) ++ save2) ++ save3) ++ save4), p, u, w)
185195 }
186196 }
187197 else {
188- let r3 = checkLastPartOfPeriod(boostingContract, currentPeriod, latestPeriod, depth, totalWeightKey, weight3)
189- $Tuple4((((([IntegerEntry(totalWeightKey, weight3)] ++ t0._2) ++ t1._2) ++ t2._2) ++ t3._2), r3._1, r3._2, r3._3)
198+ let $t081908339 = checkLastPartOfPeriod(boostingContract, currentPeriod, latestPeriod, depth, totalWeightKey, (((weight0 + weight1) + weight2) + weight3))
199+ let a = $t081908339._1
200+ let p = $t081908339._2
201+ let u = $t081908339._3
202+ let w = $t081908339._4
203+ $Tuple4(((((a ++ save0) ++ save1) ++ save2) ++ save3), p, u, w)
190204 }
191205 }
192206 else {
193- let r2 = checkLastPartOfPeriod(boostingContract, currentPeriod, latestPeriod, depth, totalWeightKey, weight2)
194- $Tuple4(((([IntegerEntry(totalWeightKey, weight2)] ++ t0._2) ++ t1._2) ++ t2._2), r2._1, r2._2, r2._3)
207+ let $t084858624 = checkLastPartOfPeriod(boostingContract, currentPeriod, latestPeriod, depth, totalWeightKey, ((weight0 + weight1) + weight2))
208+ let a = $t084858624._1
209+ let p = $t084858624._2
210+ let u = $t084858624._3
211+ let w = $t084858624._4
212+ $Tuple4((((a ++ save0) ++ save1) ++ save2), p, u, w)
195213 }
196214 }
197215 else {
198- let r1 = checkLastPartOfPeriod(boostingContract, currentPeriod, latestPeriod, depth, totalWeightKey, weight1)
199- $Tuple4((([IntegerEntry(totalWeightKey, weight1)] ++ t0._2) ++ t1._2), r1._1, r1._2, r1._3)
216+ let $t087538882 = checkLastPartOfPeriod(boostingContract, currentPeriod, latestPeriod, depth, totalWeightKey, (weight0 + weight1))
217+ let a = $t087538882._1
218+ let p = $t087538882._2
219+ let u = $t087538882._3
220+ let w = $t087538882._4
221+ $Tuple4(((a ++ save0) ++ save1), p, u, w)
200222 }
201223 }
202224 else {
203- let r0 = checkLastPartOfPeriod(boostingContract, currentPeriod, latestPeriod, depth, totalWeightKey, weight0)
204- $Tuple4(([IntegerEntry(totalWeightKey, weight0)] ++ t0._2), r0._1, r0._2, r0._3)
225+ let $t090239142 = checkLastPartOfPeriod(boostingContract, currentPeriod, latestPeriod, depth, totalWeightKey, weight0)
226+ let a = $t090239142._1
227+ let p = $t090239142._2
228+ let u = $t090239142._3
229+ let w = $t090239142._4
230+ $Tuple4((a ++ save0), p, u, w)
205231 }
206232 }
207233 else if ((currentUser == 0))
228254 let latestPeriod = getNumberByKey(keyNextProcessedPeriod())
229255 let totalWeight = getNumberByKey(keyTotalWeightForPeriod(currentPeriod))
230256 let heightForPeriod = getNumberByKey(keyHeightForPeriod(currentPeriod))
231- let $t01069910811 = calcUserWeight(boostingContractAddress, heightForPeriod, currentPeriod, currentUser)
232- let userWeight = $t01069910811._1
233- let ignored = $t01069910811._2
234- let userAmountForPeriod = fraction(getNumberByKey(keyTotalAmountForPeriod(currentPeriod)), userWeight, totalWeight)
257+ let $t01022410336 = calcUserWeight(boostingContractAddress, heightForPeriod, currentPeriod, currentUser)
258+ let userWeight = $t01022410336._1
259+ let ignored = $t01022410336._2
260+ let userAmoundForPeriod = fraction(getNumberByKey(keyTotalAmountForPeriod(currentPeriod)), userWeight, totalWeight)
235261 if (if ((0 >= depth))
236262 then true
237263 else ((currentPeriod + 1) >= latestPeriod))
238- then $Tuple2((currentPeriod + 1), (userAccumulated + userAmountForPeriod))
239- else invokeClaim(boostingContract, (currentPeriod + 1), currentUser, (depth - 1), (userAccumulated + userAmountForPeriod))
264+ then $Tuple2((currentPeriod + 1), (userAccumulated + userAmoundForPeriod))
265+ else invokeClaim(boostingContract, (currentPeriod + 1), currentUser, (depth - 1), (userAccumulated + userAmoundForPeriod))
266+ }
267+
268+
269+func commonClaimReward (userAddress) = {
270+ let cfgArray = readConfigArrayOrFail()
271+ let userIdx = getUserIndexByAddress(cfgArray[IdxCfgBoostingContract], userAddress)
272+ let currentPeriod = getNumberByKey(keyNextUnlaimedPeriodOfUser(userIdx))
273+ if ((currentPeriod >= getNumberByKey(keyNextProcessedPeriod())))
274+ then throw("Nothing to claim")
275+ else {
276+ let boostingContract = fromBase58String(cfgArray[IdxCfgBoostingContract])
277+ $Tuple3(claimInternal(boostingContract, currentPeriod, userIdx, USERDEPTH, 0), userIdx, cfgArray)
278+ }
240279 }
241280
242281
251290
252291
253292 @Callable(i)
254-func processPendingPeriodsAndUsers () = {
255- let currentPeriod = getNumberByKey(keyNextProcessedPeriod())
256- if ((currentPeriod > getNumberByKey(keyLatestPeriod())))
257- then throw("Nothing to process")
258- else {
259- let cfgArray = readConfigArrayOrFail()
260- let depth = parseIntValue(cfgArray[IdxCfgMaxDepth])
261- if ((depth > MAXDEPTH))
262- then throw("Depth exceeds MAXDEPTH")
263- else {
264- let boostingContract = fromBase58String(cfgArray[IdxCfgBoostingContract])
265- let currentUser = getNumberByKey(keyNextProcessedUser())
266- let totalWeight = getNumberByKey(keyTotalWeightForPeriod(currentPeriod))
267- let r = processNextBatchInternal(boostingContract, currentPeriod, currentUser, depth, totalWeight)
268- ((r._1 :+ IntegerEntry(keyNextProcessedPeriod(), r._2)) :+ IntegerEntry(keyNextProcessedUser(), r._3))
269- }
270- }
271- }
293+func processPendingPeriodsAndUsers (depth) = if ((depth > MAXDEPTH))
294+ then throw("Depth exceeds MAXDEPTH")
295+ else {
296+ let currentPeriod = getNumberByKey(keyNextProcessedPeriod())
297+ if ((currentPeriod > getNumberByKey(keyLatestPeriod())))
298+ then throw("Nothing to process")
299+ else {
300+ let boostingContract = fromBase58String(readConfigArrayOrFail()[IdxCfgBoostingContract])
301+ let currentUser = getNumberByKey(keyNextProcessedUser())
302+ let totalWeight = getNumberByKey(keyTotalWeightForPeriod(currentPeriod))
303+ let r = processNextBatchInternal(boostingContract, currentPeriod, currentUser, depth, totalWeight)
304+ ((r._1 :+ IntegerEntry(keyNextProcessedPeriod(), r._2)) :+ IntegerEntry(keyNextProcessedUser(), r._3))
305+ }
306+ }
272307
273308
274309
275310 @Callable(i)
276311 func deposit () = {
277312 let cfgArray = readConfigArrayOrFail()
278- if ((i.caller != Address(fromBase58String(cfgArray[IdxCfgPacemakerAddress]))))
279- then throw("Wrong caller address")
313+ let assetId = value(value(i.payments[0]).assetId)
314+ if ((assetId != fromBase58String(cfgArray[IdxCfgAssetId])))
315+ then throw("Wrong payment asset")
280316 else {
281- let assetId = value(value(i.payments[0]).assetId)
282- if ((assetId != fromBase58String(cfgArray[IdxCfgAssetId])))
283- then throw("Wrong payment asset")
284- else {
285- let period = nextPeriod()
317+ let period = nextPeriod()
286318 [IntegerEntry(keyLatestPeriod(), period), IntegerEntry(keyHeightForPeriod(period), height), IntegerEntry(keyTotalAmountForPeriod(period), value(i.payments[0]).amount), IntegerEntry(keyNextPeriod(), (period + 1))]
287- }
288319 }
289320 }
290321
302333
303334 @Callable(i)
304335 func claimReward () = {
305- let cfgArray = readConfigArrayOrFail()
306336 let address = toString(i.caller)
307- let userIdx = getUserIndexByAddress(cfgArray[IdxCfgBoostingContract], address)
308- let currentPeriod = getNumberByKey(keyNextUnlaimedPeriodOfUser(userIdx))
309- let latestPeriod = getNumberByKey(keyNextProcessedPeriod())
310- if ((currentPeriod >= latestPeriod))
311- then throw("Nothing to claim")
312- else {
313- let boostingContract = fromBase58String(cfgArray[IdxCfgBoostingContract])
314- let $t01456214654 = claimInternal(boostingContract, currentPeriod, userIdx, USERDEPTH, 0)
315- let period = $t01456214654._1
316- let amount = $t01456214654._2
317- $Tuple2([IntegerEntry(keyNextUnlaimedPeriodOfUser(userIdx), period), ScriptTransfer(i.caller, amount, fromBase58String(cfgArray[IdxCfgAssetId])), HistoryEntry("claim", address, amount, period, latestPeriod, i)], amount)
318- }
337+ let commonResults = commonClaimReward(address)
338+ let r = commonResults._1
339+ let userIdx = commonResults._2
340+ let cfgArray = commonResults._3
341+ $Tuple2([IntegerEntry(keyNextUnlaimedPeriodOfUser(userIdx), r._1), ScriptTransfer(i.caller, r._2, fromBase58String(cfgArray[IdxCfgAssetId]))], r._2)
342+ }
343+
344+
345+
346+@Callable(i)
347+func claimRewardREADONLY (userAddress) = {
348+ let commonResults = commonClaimReward(userAddress)
349+ let r = commonResults._1
350+ let userIdx = commonResults._2
351+ let cfgArray = commonResults._3
352+ $Tuple2(nil, r._2)
319353 }
320354
321355
323357 @Callable(i)
324358 func calcGwxParamsREADONLY (wxAmount,lockStartHeight,lockDurationBlocks) = {
325359 let lockEndHeight = (lockStartHeight + lockDurationBlocks)
326- let scale8ParamK = -(fraction(wxAmount, SCALE, lockDurationBlocks))
327- let scale8ParamB = (fraction(wxAmount, SCALE, lockDurationBlocks) * lockEndHeight)
360+ let scale8ParamK = -(fraction(wxAmount, SCALE6, lockDurationBlocks))
361+ let scale8ParamB = (fraction(wxAmount, SCALE6, lockDurationBlocks) * lockEndHeight)
328362 $Tuple2(nil, [scale8ParamK, scale8ParamB, nextPeriod()])
329363 }
330364
331365
332366
333367 @Callable(i)
334-func constructor (wxAssetIdStr,matcherPacemakerAddressStr,boostingContractAddressStr,maxDepth) = if ((this != i.caller))
368+func constructor (wxAssetIdStr,matcherPacemakerAddressStr,boostingContractAddressStr) = if ((this != i.caller))
335369 then throw("not authorized")
336- else [StringEntry(keyConfig(), formatConfig(wxAssetIdStr, matcherPacemakerAddressStr, boostingContractAddressStr, maxDepth))]
370+ else [StringEntry(keyConfig(), formatConfig(wxAssetIdStr, matcherPacemakerAddressStr, boostingContractAddressStr))]
337371
338372
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let revisionNum = ""
55
66 let SEP = "__"
77
88 let MAXDEPTH = 17
99
1010 let USERDEPTH = 26
1111
12-let SCALE = 1000
12+let SCALE6 = 1000000
1313
1414 func getNumberByKey (key) = valueOrElse(getInteger(this, key), 0)
1515
1616
1717 func getStringByKey (key) = valueOrElse(getString(this, key), "")
1818
1919
2020 func getStringOrFail (key) = valueOrErrorMessage(getString(key), (("mandatory this." + key) + " is not defined"))
2121
2222
2323 let IdxCfgAssetId = 1
2424
2525 let IdxCfgPacemakerAddress = 2
2626
2727 let IdxCfgBoostingContract = 3
2828
29-let IdxCfgMaxDepth = 4
30-
3129 func keyConfig () = "%s__config"
3230
3331
3432 func readConfigArrayOrFail () = split(getStringOrFail(keyConfig()), SEP)
3533
3634
37-func formatConfig (wxAssetIdStr,matcherPacemakerAddressStr,boostingContractAddressStr,maxDepth) = makeString(["%s%s%s%d", wxAssetIdStr, matcherPacemakerAddressStr, boostingContractAddressStr, toString(maxDepth)], SEP)
35+func formatConfig (wxAssetIdStr,matcherPacemakerAddressStr,boostingContractAddressStr) = makeString(["%s%s%s", wxAssetIdStr, matcherPacemakerAddressStr, boostingContractAddressStr], SEP)
3836
3937
40-func keyUsersCount () = "%s__nextUserNum"
38+func keyUsersCount () = makeString(["%s", "nextUserNum"], SEP)
4139
4240
43-func keyNextProcessedUser () = "%s__nextProcessedUser"
41+func keyNextProcessedUser () = makeString(["%s", "nextProcessedUser"], SEP)
4442
4543
46-func keyLatestPeriod () = "%s__latestPeriod"
44+func keyLatestPeriod () = makeString(["%s", "latestPeriod"], SEP)
4745
4846
49-func keyNextPeriod () = "%s__nextPeriod"
47+func keyNextPeriod () = makeString(["%s", "nextPeriod"], SEP)
5048
5149
52-func keyNextProcessedPeriod () = "%s__nextProcessedPeriod"
50+func keyNextProcessedPeriod () = makeString(["%s", "nextProcessedPeriod"], SEP)
5351
5452
55-func keyNextUnlaimedPeriodOfUser (userIndex) = makeString(["%s%d__nextClaimedPeriod", toString(userIndex)], SEP)
53+func keyNextUnlaimedPeriodOfUser (userIndex) = makeString(["%s%d", "nextClaimedPeriod", toString(userIndex)], SEP)
5654
5755
58-func keyLastProcessedPeriodOfUser (userIndex) = makeString(["%s%d__lastProcessedPeriod", toString(userIndex)], SEP)
56+func keyLastProcessedPeriodOfUser (userIndex) = makeString(["%s%d", "lastProcessedPeriod", toString(userIndex)], SEP)
5957
6058
61-func keyHeightForPeriod (period) = makeString(["%s%d__startHeightForPeriod", toString(period)], SEP)
59+func keyHeightForPeriod (period) = makeString(["%s%d", "startHeightForPeriod", toString(period)], SEP)
6260
6361
64-func keyTotalAmountForPeriod (period) = makeString(["%s%d__totalAmountForPeriod", toString(period)], SEP)
62+func keyTotalAmountForPeriod (period) = makeString(["%s%d", "totalAmountForPeriod", toString(period)], SEP)
6563
6664
67-func keyTotalWeightForPeriod (period) = makeString(["%s%d__totalWeightForPeriod", toString(period)], SEP)
65+func keyTotalWeightForPeriod (period) = makeString(["%s%d", "totalWeightForPeriod", toString(period)], SEP)
6866
6967
70-func keyUserKValueForPeriod (period,userIndex) = makeString(["%s%d%s%d__paramByPeriod", toString(userIndex), "k", toString(period)], SEP)
68+func keyUserKValueForPeriod (period,userIndex) = makeString(["%s%d%s%d", "paramByPeriod", toString(userIndex), "k", toString(period)], SEP)
7169
7270
73-func keyUserBValueForPeriod (period,userIndex) = makeString(["%s%d%s%d__paramByPeriod", toString(userIndex), "b", toString(period)], SEP)
74-
75-
76-func HistoryEntry (type,user,amount,currentPeriod,latestPeriod,i) = {
77- let historyKEY = makeString(["%s%s%s%s__history", type, user, toBase58String(i.transactionId)], SEP)
78- let historyDATA = makeString(["%d%d%d%d%d", toString(lastBlock.height), toString(lastBlock.timestamp), toString(amount), toString(currentPeriod), toString(latestPeriod)], SEP)
79- StringEntry(historyKEY, historyDATA)
80- }
71+func keyUserBValueForPeriod (period,userIndex) = makeString(["%s%d%s%d", "paramByPeriod", toString(userIndex), "b", toString(period)], SEP)
8172
8273
8374 func calcUserWeight (boostingContractAddress,heightForPeriod,period,userIndex) = {
8475 let kLast = keyLastProcessedPeriodOfUser(userIndex)
8576 let kKey = keyUserKValueForPeriod(period, userIndex)
8677 let kRaw = getInteger(boostingContractAddress, kKey)
8778 if (isDefined(kRaw))
8879 then {
8980 let k = value(kRaw)
9081 let b = value(getInteger(boostingContractAddress, keyUserBValueForPeriod(period, userIndex)))
9182 let w = ((k * heightForPeriod) + b)
9283 if ((w > 0))
93- then $Tuple2((w / SCALE), [IntegerEntry(kLast, period)])
84+ then $Tuple2((w / SCALE6), [IntegerEntry(kLast, period)])
9485 else $Tuple2(0, nil)
9586 }
9687 else {
9788 let p = getInteger(this, kLast)
9889 if (isDefined(p))
9990 then {
10091 let pv = value(p)
10192 let k = value(getInteger(boostingContractAddress, keyUserKValueForPeriod(pv, userIndex)))
10293 let b = value(getInteger(boostingContractAddress, keyUserBValueForPeriod(pv, userIndex)))
10394 let w = ((k * heightForPeriod) + b)
10495 if ((w > 0))
105- then $Tuple2((w / SCALE), nil)
96+ then $Tuple2((w / SCALE6), nil)
10697 else $Tuple2(0, nil)
10798 }
10899 else $Tuple2(0, nil)
109100 }
110101 }
111102
112103
113104 func getUserIndexByAddress (boostingContractAddressStr,userAddress) = {
114105 let key = makeString(["%s%s%s", "mapping", "user2num", userAddress], SEP)
115106 parseIntValue(valueOrErrorMessage(getString(Address(fromBase58String(boostingContractAddressStr)), key), ((("User address " + userAddress) + " is not found in boosting contract data, key=") + key)))
116107 }
117108
118109
119110 func nextPeriod () = getNumberByKey(keyNextPeriod())
120111
121112
122-func invokeProcess (boostingContract,period,user,depth,weight) = {
113+func invokeProcess (boostingContract,period,user,depth,weight,actions) = {
123114 let result = invoke(this, "processNextBatch", [boostingContract, period, user, depth, weight], nil)
124115 if ((result == result))
125116 then match result {
126117 case r: (Int, Int, Int) =>
127- r
118+ $Tuple4(actions, r._1, r._2, r._3)
128119 case _ =>
129120 throw("Incorrect invoke result")
130121 }
131122 else throw("Strict value is not equal to itself.")
132123 }
133124
134125
135126 func checkLastPartOfPeriod (boostingContract,currentPeriod,latestPeriod,depth,totalWeightKey,weight) = if ((latestPeriod >= (currentPeriod + 1)))
136- then invokeProcess(boostingContract, (currentPeriod + 1), 0, (depth - 1), 0)
137- else $Tuple3((currentPeriod + 1), 0, 0)
127+ then invokeProcess(boostingContract, (currentPeriod + 1), 0, (depth - 1), 0, [IntegerEntry(totalWeightKey, weight)])
128+ else $Tuple4([IntegerEntry(totalWeightKey, weight)], (currentPeriod + 1), 0, 0)
138129
139130
140131 func processNextBatchInternal (boostingContract,currentPeriod,currentUser,depth,totalWeight) = {
141132 let boostingContractAddress = Address(boostingContract)
142133 let latestPeriod = getNumberByKey(keyLatestPeriod())
143134 let usersCount = valueOrElse(getInteger(boostingContractAddress, keyUsersCount()), 0)
144135 let totalWeightKey = keyTotalWeightForPeriod(currentPeriod)
145136 let heightForPeriod = getNumberByKey(keyHeightForPeriod(currentPeriod))
146137 if (if ((depth > 0))
147138 then (latestPeriod >= currentPeriod)
148139 else false)
149140 then {
150- let t0 = calcUserWeight(boostingContractAddress, heightForPeriod, currentPeriod, currentUser)
151- let weight0 = (totalWeight + t0._1)
141+ let $t060846186 = calcUserWeight(boostingContractAddress, heightForPeriod, currentPeriod, currentUser)
142+ let w0 = $t060846186._1
143+ let save0 = $t060846186._2
144+ let weight0 = (totalWeight + w0)
152145 if ((usersCount > (currentUser + 1)))
153146 then {
154- let t1 = calcUserWeight(boostingContractAddress, heightForPeriod, currentPeriod, (currentUser + 1))
155- let weight1 = (weight0 + t1._1)
147+ let $t062736384 = calcUserWeight(boostingContractAddress, heightForPeriod, currentPeriod, (currentUser + 1))
148+ let weight1 = $t062736384._1
149+ let save1 = $t062736384._2
156150 if ((usersCount > (currentUser + 2)))
157151 then {
158- let t2 = calcUserWeight(boostingContractAddress, heightForPeriod, currentPeriod, (currentUser + 2))
159- let weight2 = (weight1 + t2._1)
152+ let $t064406551 = calcUserWeight(boostingContractAddress, heightForPeriod, currentPeriod, (currentUser + 2))
153+ let weight2 = $t064406551._1
154+ let save2 = $t064406551._2
160155 if ((usersCount > (currentUser + 3)))
161156 then {
162- let t3 = calcUserWeight(boostingContractAddress, heightForPeriod, currentPeriod, (currentUser + 3))
163- let weight3 = (weight2 + t3._1)
157+ let $t066116722 = calcUserWeight(boostingContractAddress, heightForPeriod, currentPeriod, (currentUser + 3))
158+ let weight3 = $t066116722._1
159+ let save3 = $t066116722._2
164160 if ((usersCount > (currentUser + 4)))
165161 then {
166- let t4 = calcUserWeight(boostingContractAddress, heightForPeriod, currentPeriod, (currentUser + 4))
167- let weight4 = (weight3 + t4._1)
162+ let $t067866897 = calcUserWeight(boostingContractAddress, heightForPeriod, currentPeriod, (currentUser + 4))
163+ let weight4 = $t067866897._1
164+ let save4 = $t067866897._2
168165 if ((usersCount > (currentUser + 5)))
169166 then {
170- let t5 = calcUserWeight(boostingContractAddress, heightForPeriod, currentPeriod, (currentUser + 5))
171- let weight5 = (weight4 + t5._1)
167+ let $t069657076 = calcUserWeight(boostingContractAddress, heightForPeriod, currentPeriod, (currentUser + 5))
168+ let weight5 = $t069657076._1
169+ let save5 = $t069657076._2
172170 if ((usersCount > (currentUser + 6)))
173171 then {
174- let r5 = invokeProcess(boostingContract, currentPeriod, (currentUser + 6), (depth - 1), weight5)
175- $Tuple4((((((t0._2 ++ t1._2) ++ t2._2) ++ t3._2) ++ t4._2) ++ t5._2), r5._1, r5._2, r5._3)
172+ let $t071957351 = invokeProcess(boostingContract, currentPeriod, (currentUser + 6), (depth - 1), (((((weight0 + weight1) + weight2) + weight3) + weight4) + weight5), nil)
173+ let a = $t071957351._1
174+ let p = $t071957351._2
175+ let u = $t071957351._3
176+ let w = $t071957351._4
177+ $Tuple4(((((((a ++ save0) ++ save1) ++ save2) ++ save3) ++ save4) ++ save5), p, u, w)
176178 }
177179 else {
178- let r5 = checkLastPartOfPeriod(boostingContract, currentPeriod, latestPeriod, depth, totalWeightKey, weight5)
179- $Tuple4((((((([IntegerEntry(totalWeightKey, weight5)] ++ t0._2) ++ t1._2) ++ t2._2) ++ t3._2) ++ t4._2) ++ t5._2), r5._1, r5._2, r5._3)
180+ let $t075197688 = checkLastPartOfPeriod(boostingContract, currentPeriod, latestPeriod, depth, totalWeightKey, (((((weight0 + weight1) + weight2) + weight3) + weight4) + weight5))
181+ let a = $t075197688._1
182+ let p = $t075197688._2
183+ let u = $t075197688._3
184+ let w = $t075197688._4
185+ $Tuple4(((((((a ++ save0) ++ save1) ++ save2) ++ save3) ++ save4) ++ save5), p, u, w)
180186 }
181187 }
182188 else {
183- let r4 = checkLastPartOfPeriod(boostingContract, currentPeriod, latestPeriod, depth, totalWeightKey, weight4)
184- $Tuple4(((((([IntegerEntry(totalWeightKey, weight4)] ++ t0._2) ++ t1._2) ++ t2._2) ++ t3._2) ++ t4._2), r4._1, r4._2, r4._3)
189+ let $t078688027 = checkLastPartOfPeriod(boostingContract, currentPeriod, latestPeriod, depth, totalWeightKey, ((((weight0 + weight1) + weight2) + weight3) + weight4))
190+ let a = $t078688027._1
191+ let p = $t078688027._2
192+ let u = $t078688027._3
193+ let w = $t078688027._4
194+ $Tuple4((((((a ++ save0) ++ save1) ++ save2) ++ save3) ++ save4), p, u, w)
185195 }
186196 }
187197 else {
188- let r3 = checkLastPartOfPeriod(boostingContract, currentPeriod, latestPeriod, depth, totalWeightKey, weight3)
189- $Tuple4((((([IntegerEntry(totalWeightKey, weight3)] ++ t0._2) ++ t1._2) ++ t2._2) ++ t3._2), r3._1, r3._2, r3._3)
198+ let $t081908339 = checkLastPartOfPeriod(boostingContract, currentPeriod, latestPeriod, depth, totalWeightKey, (((weight0 + weight1) + weight2) + weight3))
199+ let a = $t081908339._1
200+ let p = $t081908339._2
201+ let u = $t081908339._3
202+ let w = $t081908339._4
203+ $Tuple4(((((a ++ save0) ++ save1) ++ save2) ++ save3), p, u, w)
190204 }
191205 }
192206 else {
193- let r2 = checkLastPartOfPeriod(boostingContract, currentPeriod, latestPeriod, depth, totalWeightKey, weight2)
194- $Tuple4(((([IntegerEntry(totalWeightKey, weight2)] ++ t0._2) ++ t1._2) ++ t2._2), r2._1, r2._2, r2._3)
207+ let $t084858624 = checkLastPartOfPeriod(boostingContract, currentPeriod, latestPeriod, depth, totalWeightKey, ((weight0 + weight1) + weight2))
208+ let a = $t084858624._1
209+ let p = $t084858624._2
210+ let u = $t084858624._3
211+ let w = $t084858624._4
212+ $Tuple4((((a ++ save0) ++ save1) ++ save2), p, u, w)
195213 }
196214 }
197215 else {
198- let r1 = checkLastPartOfPeriod(boostingContract, currentPeriod, latestPeriod, depth, totalWeightKey, weight1)
199- $Tuple4((([IntegerEntry(totalWeightKey, weight1)] ++ t0._2) ++ t1._2), r1._1, r1._2, r1._3)
216+ let $t087538882 = checkLastPartOfPeriod(boostingContract, currentPeriod, latestPeriod, depth, totalWeightKey, (weight0 + weight1))
217+ let a = $t087538882._1
218+ let p = $t087538882._2
219+ let u = $t087538882._3
220+ let w = $t087538882._4
221+ $Tuple4(((a ++ save0) ++ save1), p, u, w)
200222 }
201223 }
202224 else {
203- let r0 = checkLastPartOfPeriod(boostingContract, currentPeriod, latestPeriod, depth, totalWeightKey, weight0)
204- $Tuple4(([IntegerEntry(totalWeightKey, weight0)] ++ t0._2), r0._1, r0._2, r0._3)
225+ let $t090239142 = checkLastPartOfPeriod(boostingContract, currentPeriod, latestPeriod, depth, totalWeightKey, weight0)
226+ let a = $t090239142._1
227+ let p = $t090239142._2
228+ let u = $t090239142._3
229+ let w = $t090239142._4
230+ $Tuple4((a ++ save0), p, u, w)
205231 }
206232 }
207233 else if ((currentUser == 0))
208234 then $Tuple4(nil, currentPeriod, 0, 0)
209235 else $Tuple4([IntegerEntry(totalWeightKey, totalWeight)], currentPeriod, currentUser, 0)
210236 }
211237
212238
213239 func invokeClaim (boostingContract,period,user,depth,total) = {
214240 let result = invoke(this, "claimNextBatch", [boostingContract, period, user, depth, total], nil)
215241 if ((result == result))
216242 then match result {
217243 case r: (Int, Int) =>
218244 r
219245 case _ =>
220246 throw("Incorrect invoke result")
221247 }
222248 else throw("Strict value is not equal to itself.")
223249 }
224250
225251
226252 func claimInternal (boostingContract,currentPeriod,currentUser,depth,userAccumulated) = {
227253 let boostingContractAddress = Address(boostingContract)
228254 let latestPeriod = getNumberByKey(keyNextProcessedPeriod())
229255 let totalWeight = getNumberByKey(keyTotalWeightForPeriod(currentPeriod))
230256 let heightForPeriod = getNumberByKey(keyHeightForPeriod(currentPeriod))
231- let $t01069910811 = calcUserWeight(boostingContractAddress, heightForPeriod, currentPeriod, currentUser)
232- let userWeight = $t01069910811._1
233- let ignored = $t01069910811._2
234- let userAmountForPeriod = fraction(getNumberByKey(keyTotalAmountForPeriod(currentPeriod)), userWeight, totalWeight)
257+ let $t01022410336 = calcUserWeight(boostingContractAddress, heightForPeriod, currentPeriod, currentUser)
258+ let userWeight = $t01022410336._1
259+ let ignored = $t01022410336._2
260+ let userAmoundForPeriod = fraction(getNumberByKey(keyTotalAmountForPeriod(currentPeriod)), userWeight, totalWeight)
235261 if (if ((0 >= depth))
236262 then true
237263 else ((currentPeriod + 1) >= latestPeriod))
238- then $Tuple2((currentPeriod + 1), (userAccumulated + userAmountForPeriod))
239- else invokeClaim(boostingContract, (currentPeriod + 1), currentUser, (depth - 1), (userAccumulated + userAmountForPeriod))
264+ then $Tuple2((currentPeriod + 1), (userAccumulated + userAmoundForPeriod))
265+ else invokeClaim(boostingContract, (currentPeriod + 1), currentUser, (depth - 1), (userAccumulated + userAmoundForPeriod))
266+ }
267+
268+
269+func commonClaimReward (userAddress) = {
270+ let cfgArray = readConfigArrayOrFail()
271+ let userIdx = getUserIndexByAddress(cfgArray[IdxCfgBoostingContract], userAddress)
272+ let currentPeriod = getNumberByKey(keyNextUnlaimedPeriodOfUser(userIdx))
273+ if ((currentPeriod >= getNumberByKey(keyNextProcessedPeriod())))
274+ then throw("Nothing to claim")
275+ else {
276+ let boostingContract = fromBase58String(cfgArray[IdxCfgBoostingContract])
277+ $Tuple3(claimInternal(boostingContract, currentPeriod, userIdx, USERDEPTH, 0), userIdx, cfgArray)
278+ }
240279 }
241280
242281
243282 @Callable(i)
244283 func processNextBatch (boostingContract,currentPeriod,currentUser,depth,totalWeight) = if ((i.caller != this))
245284 then throw("Should be called by this script only")
246285 else {
247286 let tpl = processNextBatchInternal(boostingContract, currentPeriod, currentUser, depth, totalWeight)
248287 $Tuple2(tpl._1, $Tuple3(tpl._2, tpl._3, tpl._4))
249288 }
250289
251290
252291
253292 @Callable(i)
254-func processPendingPeriodsAndUsers () = {
255- let currentPeriod = getNumberByKey(keyNextProcessedPeriod())
256- if ((currentPeriod > getNumberByKey(keyLatestPeriod())))
257- then throw("Nothing to process")
258- else {
259- let cfgArray = readConfigArrayOrFail()
260- let depth = parseIntValue(cfgArray[IdxCfgMaxDepth])
261- if ((depth > MAXDEPTH))
262- then throw("Depth exceeds MAXDEPTH")
263- else {
264- let boostingContract = fromBase58String(cfgArray[IdxCfgBoostingContract])
265- let currentUser = getNumberByKey(keyNextProcessedUser())
266- let totalWeight = getNumberByKey(keyTotalWeightForPeriod(currentPeriod))
267- let r = processNextBatchInternal(boostingContract, currentPeriod, currentUser, depth, totalWeight)
268- ((r._1 :+ IntegerEntry(keyNextProcessedPeriod(), r._2)) :+ IntegerEntry(keyNextProcessedUser(), r._3))
269- }
270- }
271- }
293+func processPendingPeriodsAndUsers (depth) = if ((depth > MAXDEPTH))
294+ then throw("Depth exceeds MAXDEPTH")
295+ else {
296+ let currentPeriod = getNumberByKey(keyNextProcessedPeriod())
297+ if ((currentPeriod > getNumberByKey(keyLatestPeriod())))
298+ then throw("Nothing to process")
299+ else {
300+ let boostingContract = fromBase58String(readConfigArrayOrFail()[IdxCfgBoostingContract])
301+ let currentUser = getNumberByKey(keyNextProcessedUser())
302+ let totalWeight = getNumberByKey(keyTotalWeightForPeriod(currentPeriod))
303+ let r = processNextBatchInternal(boostingContract, currentPeriod, currentUser, depth, totalWeight)
304+ ((r._1 :+ IntegerEntry(keyNextProcessedPeriod(), r._2)) :+ IntegerEntry(keyNextProcessedUser(), r._3))
305+ }
306+ }
272307
273308
274309
275310 @Callable(i)
276311 func deposit () = {
277312 let cfgArray = readConfigArrayOrFail()
278- if ((i.caller != Address(fromBase58String(cfgArray[IdxCfgPacemakerAddress]))))
279- then throw("Wrong caller address")
313+ let assetId = value(value(i.payments[0]).assetId)
314+ if ((assetId != fromBase58String(cfgArray[IdxCfgAssetId])))
315+ then throw("Wrong payment asset")
280316 else {
281- let assetId = value(value(i.payments[0]).assetId)
282- if ((assetId != fromBase58String(cfgArray[IdxCfgAssetId])))
283- then throw("Wrong payment asset")
284- else {
285- let period = nextPeriod()
317+ let period = nextPeriod()
286318 [IntegerEntry(keyLatestPeriod(), period), IntegerEntry(keyHeightForPeriod(period), height), IntegerEntry(keyTotalAmountForPeriod(period), value(i.payments[0]).amount), IntegerEntry(keyNextPeriod(), (period + 1))]
287- }
288319 }
289320 }
290321
291322
292323
293324 @Callable(i)
294325 func claimNextBatch (boostingContract,currentPeriod,currentUser,depth,totalWeight) = if ((i.caller != this))
295326 then throw("Should be called by this script only")
296327 else {
297328 let periodAndTotal = claimInternal(boostingContract, currentPeriod, currentUser, depth, totalWeight)
298329 $Tuple2(nil, periodAndTotal)
299330 }
300331
301332
302333
303334 @Callable(i)
304335 func claimReward () = {
305- let cfgArray = readConfigArrayOrFail()
306336 let address = toString(i.caller)
307- let userIdx = getUserIndexByAddress(cfgArray[IdxCfgBoostingContract], address)
308- let currentPeriod = getNumberByKey(keyNextUnlaimedPeriodOfUser(userIdx))
309- let latestPeriod = getNumberByKey(keyNextProcessedPeriod())
310- if ((currentPeriod >= latestPeriod))
311- then throw("Nothing to claim")
312- else {
313- let boostingContract = fromBase58String(cfgArray[IdxCfgBoostingContract])
314- let $t01456214654 = claimInternal(boostingContract, currentPeriod, userIdx, USERDEPTH, 0)
315- let period = $t01456214654._1
316- let amount = $t01456214654._2
317- $Tuple2([IntegerEntry(keyNextUnlaimedPeriodOfUser(userIdx), period), ScriptTransfer(i.caller, amount, fromBase58String(cfgArray[IdxCfgAssetId])), HistoryEntry("claim", address, amount, period, latestPeriod, i)], amount)
318- }
337+ let commonResults = commonClaimReward(address)
338+ let r = commonResults._1
339+ let userIdx = commonResults._2
340+ let cfgArray = commonResults._3
341+ $Tuple2([IntegerEntry(keyNextUnlaimedPeriodOfUser(userIdx), r._1), ScriptTransfer(i.caller, r._2, fromBase58String(cfgArray[IdxCfgAssetId]))], r._2)
342+ }
343+
344+
345+
346+@Callable(i)
347+func claimRewardREADONLY (userAddress) = {
348+ let commonResults = commonClaimReward(userAddress)
349+ let r = commonResults._1
350+ let userIdx = commonResults._2
351+ let cfgArray = commonResults._3
352+ $Tuple2(nil, r._2)
319353 }
320354
321355
322356
323357 @Callable(i)
324358 func calcGwxParamsREADONLY (wxAmount,lockStartHeight,lockDurationBlocks) = {
325359 let lockEndHeight = (lockStartHeight + lockDurationBlocks)
326- let scale8ParamK = -(fraction(wxAmount, SCALE, lockDurationBlocks))
327- let scale8ParamB = (fraction(wxAmount, SCALE, lockDurationBlocks) * lockEndHeight)
360+ let scale8ParamK = -(fraction(wxAmount, SCALE6, lockDurationBlocks))
361+ let scale8ParamB = (fraction(wxAmount, SCALE6, lockDurationBlocks) * lockEndHeight)
328362 $Tuple2(nil, [scale8ParamK, scale8ParamB, nextPeriod()])
329363 }
330364
331365
332366
333367 @Callable(i)
334-func constructor (wxAssetIdStr,matcherPacemakerAddressStr,boostingContractAddressStr,maxDepth) = if ((this != i.caller))
368+func constructor (wxAssetIdStr,matcherPacemakerAddressStr,boostingContractAddressStr) = if ((this != i.caller))
335369 then throw("not authorized")
336- else [StringEntry(keyConfig(), formatConfig(wxAssetIdStr, matcherPacemakerAddressStr, boostingContractAddressStr, maxDepth))]
370+ else [StringEntry(keyConfig(), formatConfig(wxAssetIdStr, matcherPacemakerAddressStr, boostingContractAddressStr))]
337371
338372

github/deemru/w8io/873ac7e 
85.89 ms