tx · EvEDNvmDJHR8tGshwqMx2ifHLktBmh2VAWkUx7zyWGbS

3PH75p2rmMKCV2nyW4TsAdFgFtmc61mJaqA:  -0.03100000 Waves

2023.04.29 17:19 [3621550] smart account 3PH75p2rmMKCV2nyW4TsAdFgFtmc61mJaqA > SELF 0.00000000 Waves

{ "type": 13, "id": "EvEDNvmDJHR8tGshwqMx2ifHLktBmh2VAWkUx7zyWGbS", "fee": 3100000, "feeAssetId": null, "timestamp": 1682778025896, "version": 2, "chainId": 87, "sender": "3PH75p2rmMKCV2nyW4TsAdFgFtmc61mJaqA", "senderPublicKey": "3GtkwhnMmG1yeozW51o4dJ1x3BDToPaLBXyBWKGdAc2e", "proofs": [ "4xLoGraETUiuzjbsxC6ys2R5C94oQAKYtL2pA6kD9J6Se7hU3shGrj4d9VcR3SjzLVcezqZToBFej49KpUpf95hp" ], "script": "base64:AAIFAAAAAAAAADcIAhIDCgEIEgASBAoCCAgSBAoCCAgSABIAEgMKAQgSAwoBCBIDCgEIEgMKAQgSAwoBCBIDCgEIAAAARgAAAAAKcGVyY2hQcmljZQkAAGgAAAACAAAAAAAAAABkAAAAAAAAD0JAAAAAAAVzY2FsZQAAAAAAAAAnEAAAAAAGc2NhbGUyAAAAAAAAD0JAAQAAAAppc1NpY2tEdWNrAAAAAQAAAAZkdWNrSWQJAAEsAAAAAgUAAAAGZHVja0lkAgAAAAVfc2ljawEAAAAUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwAAAACAAAAB2FkZHJlc3MAAAADa2V5BAAAAAckbWF0Y2gwCQAEHQAAAAIFAAAAB2FkZHJlc3MFAAAAA2tleQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAGU3RyaW5nBAAAAAFhBQAAAAckbWF0Y2gwBQAAAAFhAgAAAAABAAAADHRyeUdldFN0cmluZwAAAAEAAAADa2V5CQEAAAAUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwAAAACBQAAAAR0aGlzBQAAAANrZXkBAAAAF3N0YXRpY0tleV9vcmFjbGVBZGRyZXNzAAAAAAIAAAAUc3RhdGljX29yYWNsZUFkZHJlc3MBAAAAFHN0YXRpY0tleV9lZ2dBc3NldElkAAAAAAIAAAARc3RhdGljX2VnZ0Fzc2V0SWQBAAAAGnN0YXRpY0tleV9pbmN1YmF0b3JBZGRyZXNzAAAAAAIAAAAXc3RhdGljX2luY3ViYXRvckFkZHJlc3MBAAAAGHN0YXRpY0tleV9yZWJpcnRoQWRkcmVzcwAAAAACAAAAFXN0YXRpY19yZWJpcnRoQWRkcmVzcwEAAAAac3RhdGljS2V5X3N3b3BQcm9tb0FkZHJlc3MAAAAAAgAAABdzdGF0aWNfc3dvcFByb21vQWRkcmVzcwEAAAAYc3RhdGljS2V5X2JyZWVkZXJBZGRyZXNzAAAAAAIAAAAVc3RhdGljX2JyZWVkZXJBZGRyZXNzAQAAABxzdGF0aWNLZXlfcmVmQ29udHJhY3RBZGRyZXNzAAAAAAIAAAAZc3RhdGljX3JlZkNvbnRyYWN0QWRkcmVzcwEAAAAWc3RhdGljS2V5X2l0ZW1zQWRkcmVzcwAAAAACAAAAE3N0YXRpY19pdGVtc0FkZHJlc3MBAAAAGXN0YXRpY0tleV9tZXRhUmFjZUFkZHJlc3MAAAAAAgAAABZzdGF0aWNfbWV0YVJhY2VBZGRyZXNzAQAAABtzdGF0aWNLZXlfYWNjQm9vc3RlckFkZHJlc3MAAAAAAgAAABhzdGF0aWNfYWNjQm9vc3RlckFkZHJlc3MBAAAAH3N0YXRpY0tleV9wcm94eVN0YWtpbmdDb250cmFjdHMAAAAAAgAAABxzdGF0aWNfcHJveHlTdGFraW5nQ29udHJhY3RzAQAAABVzdGF0aWNLZXlfbWFpbnRlbmFuY2UAAAAAAgAAABJzdGF0aWNfbWFpbnRlbmFuY2UBAAAAGXN0YXRpY0tleV9jZk1hc3RlckFkZHJlc3MAAAAAAgAAABZzdGF0aWNfY2ZNYXN0ZXJBZGRyZXNzAQAAABVzdGF0aWNLZXlfZHVja1dyYXBwZXIAAAAAAgAAABJzdGF0aWNfZHVja1dyYXBwZXIBAAAAGHN0YXRpY0tleV9jb3Vwb25zQWRkcmVzcwAAAAACAAAAFXN0YXRpY19jb3Vwb25zQWRkcmVzcwEAAAAVc3RhdGljS2V5X2J1cm5BZGRyZXNzAAAAAAIAAAASc3RhdGljX2J1cm5BZGRyZXNzAQAAABJzdGF0aWNLZXlfZXh0cmFGZWUAAAAAAgAAAA9zdGF0aWNfZXh0cmFGZWUBAAAAF3N0YXRpY0tleV9mZWVBZ2dyZWdhdG9yAAAAAAIAAAAUc3RhdGljX2ZlZUFnZ3JlZ2F0b3IBAAAAFXN0YXRpY0tleV9odW50QWRkcmVzcwAAAAACAAAAEnN0YXRpY19odW50QWRkcmVzcwEAAAAJZ2V0T3JhY2xlAAAAAAkBAAAAB0FkZHJlc3MAAAABCQACWQAAAAEJAQAAAAx0cnlHZXRTdHJpbmcAAAABCQEAAAAXc3RhdGljS2V5X29yYWNsZUFkZHJlc3MAAAAAAQAAAA1nZXRFZ2dBc3NldElkAAAAAAkAAlkAAAABCQEAAAAUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwAAAACCQEAAAAJZ2V0T3JhY2xlAAAAAAkBAAAAFHN0YXRpY0tleV9lZ2dBc3NldElkAAAAAAEAAAATZ2V0SW5jdWJhdG9yQWRkcmVzcwAAAAAJAQAAAAdBZGRyZXNzAAAAAQkAAlkAAAABCQEAAAAUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwAAAACCQEAAAAJZ2V0T3JhY2xlAAAAAAkBAAAAGnN0YXRpY0tleV9pbmN1YmF0b3JBZGRyZXNzAAAAAAEAAAARZ2V0UmViaXJ0aEFkZHJlc3MAAAAACQEAAAAHQWRkcmVzcwAAAAEJAAJZAAAAAQkBAAAAFHRyeUdldFN0cmluZ0V4dGVybmFsAAAAAgkBAAAACWdldE9yYWNsZQAAAAAJAQAAABhzdGF0aWNLZXlfcmViaXJ0aEFkZHJlc3MAAAAAAQAAABNnZXRTd29wUHJvbW9BZGRyZXNzAAAAAAkBAAAAB0FkZHJlc3MAAAABCQACWQAAAAEJAQAAABR0cnlHZXRTdHJpbmdFeHRlcm5hbAAAAAIJAQAAAAlnZXRPcmFjbGUAAAAACQEAAAAac3RhdGljS2V5X3N3b3BQcm9tb0FkZHJlc3MAAAAAAQAAABFnZXRCcmVlZGVyQWRkcmVzcwAAAAAJAQAAAAdBZGRyZXNzAAAAAQkAAlkAAAABCQEAAAAUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwAAAACCQEAAAAJZ2V0T3JhY2xlAAAAAAkBAAAAGHN0YXRpY0tleV9icmVlZGVyQWRkcmVzcwAAAAABAAAAFWdldFJlZkNvbnRyYWN0QWRkcmVzcwAAAAAJAQAAAAdBZGRyZXNzAAAAAQkAAlkAAAABCQEAAAAUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwAAAACCQEAAAAJZ2V0T3JhY2xlAAAAAAkBAAAAHHN0YXRpY0tleV9yZWZDb250cmFjdEFkZHJlc3MAAAAAAQAAAA9nZXRJdGVtc0FkZHJlc3MAAAAACQEAAAAHQWRkcmVzcwAAAAEJAAJZAAAAAQkBAAAAFHRyeUdldFN0cmluZ0V4dGVybmFsAAAAAgkBAAAACWdldE9yYWNsZQAAAAAJAQAAABZzdGF0aWNLZXlfaXRlbXNBZGRyZXNzAAAAAAEAAAASZ2V0TWV0YXJhY2VBZGRyZXNzAAAAAAkBAAAAB0FkZHJlc3MAAAABCQACWQAAAAEJAQAAABR0cnlHZXRTdHJpbmdFeHRlcm5hbAAAAAIJAQAAAAlnZXRPcmFjbGUAAAAACQEAAAAZc3RhdGljS2V5X21ldGFSYWNlQWRkcmVzcwAAAAABAAAAFGdldEFjY0Jvb3N0ZXJBZGRyZXNzAAAAAAkBAAAAB0FkZHJlc3MAAAABCQACWQAAAAEJAQAAABR0cnlHZXRTdHJpbmdFeHRlcm5hbAAAAAIJAQAAAAlnZXRPcmFjbGUAAAAACQEAAAAbc3RhdGljS2V5X2FjY0Jvb3N0ZXJBZGRyZXNzAAAAAAEAAAAPZ2V0UHJveHlTdGFraW5nAAAAAAkBAAAAFHRyeUdldFN0cmluZ0V4dGVybmFsAAAAAgkBAAAACWdldE9yYWNsZQAAAAAJAQAAAB9zdGF0aWNLZXlfcHJveHlTdGFraW5nQ29udHJhY3RzAAAAAAEAAAAOZ2V0TWFpbnRlbmFuY2UAAAAACQEAAAAUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwAAAACCQEAAAAJZ2V0T3JhY2xlAAAAAAkBAAAAFXN0YXRpY0tleV9tYWludGVuYW5jZQAAAAABAAAAEmdldENmTWFzdGVyQWRkcmVzcwAAAAAJAQAAAAdBZGRyZXNzAAAAAQkAAlkAAAABCQEAAAAUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwAAAACCQEAAAAJZ2V0T3JhY2xlAAAAAAkBAAAAGXN0YXRpY0tleV9jZk1hc3RlckFkZHJlc3MAAAAAAQAAABBnZXREdWNrV3JhcHBlclNjAAAAAAkBAAAAB0FkZHJlc3MAAAABCQACWQAAAAEJAQAAABR0cnlHZXRTdHJpbmdFeHRlcm5hbAAAAAIJAQAAAAlnZXRPcmFjbGUAAAAACQEAAAAVc3RhdGljS2V5X2R1Y2tXcmFwcGVyAAAAAAEAAAARZ2V0Q291cG9uc0FkZHJlc3MAAAAACQEAAAAHQWRkcmVzcwAAAAEJAAJZAAAAAQkBAAAAFHRyeUdldFN0cmluZ0V4dGVybmFsAAAAAgkBAAAACWdldE9yYWNsZQAAAAAJAQAAABhzdGF0aWNLZXlfY291cG9uc0FkZHJlc3MAAAAAAQAAAA5nZXRCdXJuQWRkcmVzcwAAAAAJAQAAAAdBZGRyZXNzAAAAAQkAAlkAAAABCQEAAAAUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwAAAACCQEAAAAJZ2V0T3JhY2xlAAAAAAkBAAAAFXN0YXRpY0tleV9idXJuQWRkcmVzcwAAAAABAAAAEGdldEZlZUFnZ3Jl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AAAAAXMJAQAAAAx0cnlHZXRTdHJpbmcAAAABCQABLAAAAAICAAAAB2Fzc2V0c18FAAAAA2dlbgMJAAAAAAAAAgUAAAABcwIAAAAABQAAAANuaWwJAAS1AAAAAgUAAAABcwIAAAABLAEAAAAMY2FsY0ludGVyZXN0AAAAAwAAABBwcmV2aW91c0ludGVyZXN0AAAAFnByZXZpb3VzSW50ZXJlc3RIZWlnaHQAAAARdG90YWxGYXJtaW5nUG93ZXIJAABkAAAAAgUAAAAQcHJldmlvdXNJbnRlcmVzdAkAAGkAAAACCQAAaAAAAAIJAABoAAAAAgUAAAAFc2NhbGUJAQAAABFnZXRSZXdhcmRQZXJCbG9jawAAAAAJAABlAAAAAgUAAAAGaGVpZ2h0BQAAABZwcmV2aW91c0ludGVyZXN0SGVpZ2h0BQAAABF0b3RhbEZhcm1pbmdQb3dlcgEAAAASZ2V0Q3VycmVudEludGVyZXN0AAAAAAMJAABmAAAAAgkBAAAADXRyeUdldEludGVnZXIAAAABAgAAABJ0b3RhbF9mYXJtaW5nUG93ZXIAAAAAAAAAAAAEAAAAEHByZXZpb3VzSW50ZXJlc3QJAQAAAA10cnlHZXRJbnRlZ2VyAAAAAQIAAAAXdG90YWxfbGFzdENoZWNrSW50ZXJlc3QEAAAAFnByZXZpb3VzSW50ZXJlc3RIZWlnaHQJAQAAAA10cnlHZXRJbnRlZ2VyAAAAAQIAAAAddG90YWxfbGFzdENoZWNrSW50ZXJlc3RIZWlnaHQEAAAAEXRvdGFsRmFybWluZ1Bvd2VyCQEAAAANdHJ5R2V0SW50ZWdlcgAAAAECAAAAEnRvdGFsX2Zhcm1pbmdQb3dlcgkBAAAADGNhbGNJbnRlcmVzdAAAAAMFAAAAEHByZXZpb3VzSW50ZXJlc3QFAAAAFnByZXZpb3VzSW50ZXJlc3RIZWlnaHQFAAAAEXRvdGFsRmFybWluZ1Bvd2VyAwkBAAAAAiE9AAAAAgkBAAAADXRyeUdldEludGVnZXIAAAABAgAAABF0b3RhbF9zdGFydEhlaWdodAAAAAAAAAAAAAkBAAAADXRyeUdldEludGVnZXIAAAABAgAAABd0b3RhbF9sYXN0Q2hlY2tJbnRlcmVzdAkAAAIAAAABAgAAABxmYXJtaW5nIGlzIG5vdCBsYXVuY2hlZCwgeWV0AQAAABRjYWxjQXNzZXRSZXdhcmREZWx0YQAAAAMAAAAHYWRkcmVzcwAAAAdhc3NldElkAAAAEWFzc2V0RmFybWluZ1Bvd2VyBAAAABZsYXN0Q2hlY2tBc3NldEludGVyZXN0CQEAAAANdHJ5R2V0SW50ZWdlcgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAIYWRkcmVzc18FAAAAB2FkZHJlc3MCAAAAB19hc3NldF8FAAAAB2Fzc2V0SWQCAAAAEl9sYXN0Q2hlY2tJbnRlcmVzdAQAAAAPY3VycmVudEludGVyZXN0CQEAAAASZ2V0Q3VycmVudEludGVyZXN0AAAAAAkAAGgAAAACBQAAABFhc3NldEZhcm1pbmdQb3dlcgkAAGUAAAACBQAAAA9jdXJyZW50SW50ZXJlc3QFAAAAFmxhc3RDaGVja0Fzc2V0SW50ZXJlc3QBAAAAFGFkZEFzc2V0SWRUb0dlbkVudHJ5AAAAAgAAAAdhc3NldElkAAAACGFzc2V0R2VuBAAAAAxjdXJyZW50VmFsdWUJAQAAAAx0cnlHZXRTdHJpbmcAAAABCQABLAAAAAIJAAEsAAAAAgIAAAAHYXNzZXRzXwUAAAAIYXNzZXRHZW4CAAAAB19sb2NrZWQDCQAAAAAAAAIFAAAADGN1cnJlbnRWYWx1ZQIAAAAABQAAAAdhc3NldElkCQABLAAAAAIJAAEsAAAAAgUAAAAMY3VycmVudFZhbHVlAgAAAAEsBQAAAAdhc3NldElkAQAAAA5nZXRTdGFrZVJlc3VsdAAAAAQAAAAHYWRkcmVzcwAAAAdhc3NldElkAAAAEWFzc2V0RmFybWluZ1Bvd2VyAAAACHVuc3Rha2VyBAAAAAVhc3NldAkAAlgAAAABBQAAAAdhc3NldElkCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACAgAAABJ0b3RhbF9mYXJtaW5nUG93ZXIJAABkAAAAAgkBAAAADXRyeUdldEludGVnZXIAAAABAgAAABJ0b3RhbF9mYXJtaW5nUG93ZXIFAAAAEWFzc2V0RmFybWluZ1Bvd2VyCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACAgAAABd0b3RhbF9sYXN0Q2hlY2tJbnRlcmVzdAkBAAAAEmdldEN1cnJlbnRJbnRlcmVzdAAAAAAJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAICAAAAHXRvdGFsX2xhc3RDaGVja0ludGVyZXN0SGVpZ2h0BQAAAAZoZWlnaHQJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkAASwAAAACCQABLAAAAAICAAAABmFzc2V0XwUAAAAFYXNzZXQCAAAABl9vd25lcgUAAAAHYWRkcmVzcwkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAhhZGRyZXNzXwUAAAAHYWRkcmVzcwIAAAAHX2Fzc2V0XwUAAAAFYXNzZXQCAAAADV9mYXJtaW5nUG93ZXIFAAAAEWFzc2V0RmFybWluZ1Bvd2VyCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAACGFkZHJlc3NfBQAAAAdhZGRyZXNzAgAAAAdfYXNzZXRfBQAAAAVhc3NldAIAAAASX2xhc3RDaGVja0ludGVyZXN0CQEAAAASZ2V0Q3VycmVudEludGVyZXN0AAAAAAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAACGFkZHJlc3NfBQAAAAdhZGRyZXNzAgAAAAdfYXNzZXRfBQAAAAVhc3NldAIAAAAJX3Vuc3Rha2VyBQAAAAh1bnN0YWtlcgUAAAADbmlsAQAAABBnZXRVbnN0YWtlUmVzdWx0AAAABgAAAAdhZGRyZXNzAAAAB2Fzc2V0SWQAAAAFY29sb3IAAAAGY2FsbGVyAAAACnJlYWxDYWxsZXIAAAAJY2xhaW1FZ2dzBAAAAAZsb2NrZWQJAQAAAAhpc0xvY2tlZAAAAAADCQAAAAAAAAIFAAAABmxvY2tlZAUAAAAGbG9ja2VkBAAAAAVhc3NldAkAAlgAAAABBQAAAAdhc3NldElkBAAAAAh1bnN0YWtlcgkBAAAADHRyeUdldFN0cmluZwAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAIYWRkcmVzc18FAAAAB2FkZHJlc3MCAAAAB19hc3NldF8FAAAABWFzc2V0AgAAAAlfdW5zdGFrZXIDAwkBAAAAAiE9AAAAAgUAAAAIdW5zdGFrZXICAAAAAAkBAAAAAiE9AAAAAgUAAAAIdW5zdGFrZXIFAAAACnJlYWxDYWxsZXIHCQAAAgAAAAECAAAAV0ZVTjogSXQgc2VlbXMgZHVjayB3YXMgc3Rha2VkIHRocm91aCBhIGRhcHAsIG5vdCBkaXJlY3RseSwgcGxlYXNlIHVuc3Rha2UgdGhyb3VnaCBkYXBwIQQAAAARYXNzZXRGYXJtaW5nUG93ZXIJAQAAAB1nZXRMYXN0S25vd25Bc3NldEZhcm1pbmdQb3dlcgAAAAIFAAAAB2FkZHJlc3MFAAAABWFzc2V0AwkBAAAAASEAAAABCQAAZgAAAAIFAAAAEWFzc2V0RmFybWluZ1Bvd2VyAAAAAAAAAAAACQAAAgAAAAECAAAAKkZHVTogQXNzZXQgZmFybWluZyBwb3dlciBub3QgYmlnZ2VyIHRoZW4gMAQAAAAQYXNzZXRSZXdhcmREZWx0YQkBAAAAFGNhbGNBc3NldFJld2FyZERlbHRhAAAAAwUAAAAHYWRkcmVzcwUAAAAFYXNzZXQFAAAAEWFzc2V0RmFybWluZ1Bvd2VyBAAAAAxmYXJtZWRBbW91bnQJAABkAAAAAgUAAAAQYXNzZXRSZXdhcmREZWx0YQkBAAAADXRyeUdldEludGVnZXIAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAACGFkZHJlc3NfBQAAAAdhZGRyZXNzAgAAAAdfYXNzZXRfBQAAAAVhc3NldAIAAAAWX2xhc3RDaGVja0Zhcm1lZEFtb3VudAQAAAAPd2l0aGRyYXduQW1vdW50CQEAAAANdHJ5R2V0SW50ZWdlcgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAIYWRkcmVzc18FAAAAB2FkZHJlc3MCAAAAB19hc3NldF8FAAAABWFzc2V0AgAAABBfd2l0aGRyYXduQW1vdW50BAAAAAZyZXdhcmQJAABpAAAAAgkAAGUAAAACBQAAAAxmYXJtZWRBbW91bnQFAAAAD3dpdGhkcmF3bkFtb3Vu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bkNhbGxlcgkBAAAAEmdldENmTWFzdGVyQWRkcmVzcwAAAAAJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyCQAEJQAAAAEIBQAAAAFpAAAADG9yaWdpbkNhbGxlcgQAAAAHYXNzZXRJZAkAAlkAAAABBQAAAAVhc3NldAQAAAANc2lja25lc3NDaGVjawcDBQAAAA1zaWNrbmVzc0NoZWNrBAAAABFhc3NldEZhcm1pbmdQb3dlcgkBAAAAHWdldExhc3RLbm93bkFzc2V0RmFybWluZ1Bvd2VyAAAAAgUAAAAHYWRkcmVzcwUAAAAFYXNzZXQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAICAAAAEnRvdGFsX2Zhcm1pbmdQb3dlcgkAAGUAAAACCQEAAAANdHJ5R2V0SW50ZWdlcgAAAAECAAAAEnRvdGFsX2Zhcm1pbmdQb3dlcgUAAAARYXNzZXRGYXJtaW5nUG93ZXIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAIYWRkcmVzc18FAAAAB2FkZHJlc3MCAAAAB19hc3NldF8FAAAABWFzc2V0AgAAAA1fZmFybWluZ1Bvd2VyAAAAAAAAAAAABQAAAANuaWwEAAAAEWFzc2V0RmFybWluZ1Bvd2VyCQEAAAAdZ2V0TGFzdEtub3duQXNzZXRGYXJtaW5nUG93ZXIAAAACBQAAAAdhZGRyZXNzBQAAAAVhc3NldAQAAAAQYXNzZXRSZXdhcmREZWx0YQkBAAAAFGNhbGNBc3NldFJld2FyZERlbHRhAAAAAwUAAAAHYWRkcmVzcwUAAAAFYXNzZXQFAAAAEWFzc2V0RmFybWluZ1Bvd2VyBAAAAAxmYXJtZWRBbW91bnQJAABkAAAAAgUAAAAQYXNzZXRSZXdhcmREZWx0YQkBAAAADXRyeUdldEludGVnZXIAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAACGFkZHJlc3NfBQAAAAdhZGRyZXNzAgAAAAdfYXNzZXRfBQAAAAVhc3NldAIAAAAWX2xhc3RDaGVja0Zhcm1lZEFtb3VudAQAAAAPd2l0aGRyYXduQW1vdW50CQEAAAANdHJ5R2V0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", "height": 3621550, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 2xj1Y6Zc8aGSYGRbcLLYGSY2W2zATUcdHBXWM3pPPXsq Next: 7W7VGRogKfMt88xD2LFDCkcYQcNLikdmsvhEKv3ZcATb Diff:
OldNewDifferences
7575 func staticKey_feeAggregator () = "static_feeAggregator"
7676
7777
78+func staticKey_huntAddress () = "static_huntAddress"
79+
80+
7881 func getOracle () = Address(fromBase58String(tryGetString(staticKey_oracleAddress())))
7982
8083
126129 func getFeeAggregator () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_feeAggregator())))
127130
128131
132+func getHuntAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_huntAddress())))
133+
134+
129135 let RefererReward = 5
130136
131137 func checkAdditionalPayment (payment) = if (isDefined(payment.assetId))
132138 then throw("FCAP: Please attach waves")
133139 else {
134- let feeAmount = getIntegerValue(this, staticKey_extraFee())
140+ let feeAmount = getIntegerValue(getOracle(), staticKey_extraFee())
135141 if ((payment.amount != feeAmount))
136142 then throw((("FCAP: Please attach exactly " + toString(feeAmount)) + " amount of wavelets"))
137143 else [ScriptTransfer(getFeeAggregator(), feeAmount, unit)]
400406 let locked = isLocked()
401407 if ((locked == locked))
402408 then {
403- let validPayment = checkAdditionalPayment(i.payments[0])
409+ let validPayment = if (if ((i.caller == getHuntAddress()))
410+ then true
411+ else (i.caller == getMetaraceAddress()))
412+ then nil
413+ else checkAdditionalPayment(i.payments[0])
404414 if ((validPayment == validPayment))
405415 then {
406416 let color = if ((colorI == "U"))
482492 let locked = isLocked()
483493 if ((locked == locked))
484494 then {
485- let validPayment = checkAdditionalPayment(i.payments[1])
495+ let validPayment = if (if ((i.caller == getHuntAddress()))
496+ then true
497+ else (i.caller == getMetaraceAddress()))
498+ then nil
499+ else checkAdditionalPayment(i.payments[1])
486500 if ((validPayment == validPayment))
487501 then {
488502 let pmt = value(i.payments[0])
498512 else if ((0 >= availablePerches))
499513 then throw(("no perches available for the color " + color))
500514 else {
501- let $t01665916732 = getAssetFarmingPower(assetId, address)
502- let assetGen = $t01665916732._1
503- let assetFarmingPower = $t01665916732._2
515+ let $t01699017063 = getAssetFarmingPower(assetId, address)
516+ let assetGen = $t01699017063._1
517+ let assetFarmingPower = $t01699017063._2
504518 ((getStakeResult(address, assetId, assetFarmingPower, realCaller) ++ [IntegerEntry(((("address_" + address) + "_perchesAvailable_") + color), (availablePerches - 1))]) ++ validPayment)
505519 }
506520 }
526540 if ((pmt.amount != 1))
527541 then throw("NFT is not attached")
528542 else {
529- let $t01737017443 = getAssetFarmingPower(assetId, address)
530- let assetGen = $t01737017443._1
531- let assetFarmingPower = $t01737017443._2
543+ let $t01770117774 = getAssetFarmingPower(assetId, address)
544+ let assetGen = $t01770117774._1
545+ let assetFarmingPower = $t01770117774._2
532546 let asset = toBase58String(assetId)
533547 let realCaller = toString(i.caller)
534548 (getStakeResult(address, assetId, assetFarmingPower, realCaller) ++ [BooleanEntry((((("address_" + address) + "_asset_") + asset) + "_without_perch"), true)])
563577 let locked = isLocked()
564578 if ((locked == locked))
565579 then {
566- let validPayment = checkAdditionalPayment(i.payments[1])
580+ let validPayment = if (if ((i.caller == getHuntAddress()))
581+ then true
582+ else (i.caller == getMetaraceAddress()))
583+ then nil
584+ else checkAdditionalPayment(i.payments[1])
567585 if ((validPayment == validPayment))
568586 then {
569587 let pmt = value(i.payments[0])
651669 }
652670
653671
654-
655-@Callable(i)
656-func healDuck (duckId) = {
657- let address = if (isProxyStakingSc(toString(i.caller)))
658- then toString(i.originCaller)
659- else toString(i.caller)
660- let farmingPower = getAssetFarmingPower(toBytes(duckId), address)._2
661-[IntegerEntry("total_farmingPower", (tryGetInteger("total_farmingPower") + farmingPower)), IntegerEntry((((("address_" + address) + "_asset_") + duckId) + "_farmingPower"), farmingPower)]
662- }
663-
664-
665672 @Verifier(tx)
666673 func verify () = if (isTestEnv())
667674 then sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let perchPrice = (100 * 1000000)
55
66 let scale = 10000
77
88 let scale2 = 1000000
99
1010 func isSickDuck (duckId) = (duckId + "_sick")
1111
1212
1313 func tryGetStringExternal (address,key) = match getString(address, key) {
1414 case a: String =>
1515 a
1616 case _ =>
1717 ""
1818 }
1919
2020
2121 func tryGetString (key) = tryGetStringExternal(this, key)
2222
2323
2424 func staticKey_oracleAddress () = "static_oracleAddress"
2525
2626
2727 func staticKey_eggAssetId () = "static_eggAssetId"
2828
2929
3030 func staticKey_incubatorAddress () = "static_incubatorAddress"
3131
3232
3333 func staticKey_rebirthAddress () = "static_rebirthAddress"
3434
3535
3636 func staticKey_swopPromoAddress () = "static_swopPromoAddress"
3737
3838
3939 func staticKey_breederAddress () = "static_breederAddress"
4040
4141
4242 func staticKey_refContractAddress () = "static_refContractAddress"
4343
4444
4545 func staticKey_itemsAddress () = "static_itemsAddress"
4646
4747
4848 func staticKey_metaRaceAddress () = "static_metaRaceAddress"
4949
5050
5151 func staticKey_accBoosterAddress () = "static_accBoosterAddress"
5252
5353
5454 func staticKey_proxyStakingContracts () = "static_proxyStakingContracts"
5555
5656
5757 func staticKey_maintenance () = "static_maintenance"
5858
5959
6060 func staticKey_cfMasterAddress () = "static_cfMasterAddress"
6161
6262
6363 func staticKey_duckWrapper () = "static_duckWrapper"
6464
6565
6666 func staticKey_couponsAddress () = "static_couponsAddress"
6767
6868
6969 func staticKey_burnAddress () = "static_burnAddress"
7070
7171
7272 func staticKey_extraFee () = "static_extraFee"
7373
7474
7575 func staticKey_feeAggregator () = "static_feeAggregator"
7676
7777
78+func staticKey_huntAddress () = "static_huntAddress"
79+
80+
7881 func getOracle () = Address(fromBase58String(tryGetString(staticKey_oracleAddress())))
7982
8083
8184 func getEggAssetId () = fromBase58String(tryGetStringExternal(getOracle(), staticKey_eggAssetId()))
8285
8386
8487 func getIncubatorAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_incubatorAddress())))
8588
8689
8790 func getRebirthAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_rebirthAddress())))
8891
8992
9093 func getSwopPromoAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_swopPromoAddress())))
9194
9295
9396 func getBreederAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_breederAddress())))
9497
9598
9699 func getRefContractAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_refContractAddress())))
97100
98101
99102 func getItemsAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_itemsAddress())))
100103
101104
102105 func getMetaraceAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_metaRaceAddress())))
103106
104107
105108 func getAccBoosterAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_accBoosterAddress())))
106109
107110
108111 func getProxyStaking () = tryGetStringExternal(getOracle(), staticKey_proxyStakingContracts())
109112
110113
111114 func getMaintenance () = tryGetStringExternal(getOracle(), staticKey_maintenance())
112115
113116
114117 func getCfMasterAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_cfMasterAddress())))
115118
116119
117120 func getDuckWrapperSc () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_duckWrapper())))
118121
119122
120123 func getCouponsAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_couponsAddress())))
121124
122125
123126 func getBurnAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_burnAddress())))
124127
125128
126129 func getFeeAggregator () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_feeAggregator())))
127130
128131
132+func getHuntAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_huntAddress())))
133+
134+
129135 let RefererReward = 5
130136
131137 func checkAdditionalPayment (payment) = if (isDefined(payment.assetId))
132138 then throw("FCAP: Please attach waves")
133139 else {
134- let feeAmount = getIntegerValue(this, staticKey_extraFee())
140+ let feeAmount = getIntegerValue(getOracle(), staticKey_extraFee())
135141 if ((payment.amount != feeAmount))
136142 then throw((("FCAP: Please attach exactly " + toString(feeAmount)) + " amount of wavelets"))
137143 else [ScriptTransfer(getFeeAggregator(), feeAmount, unit)]
138144 }
139145
140146
141147 func getRewardPerBlock () = 548
142148
143149
144150 func isLocked () = if ((getMaintenance() != ""))
145151 then throw(getMaintenance())
146152 else 0
147153
148154
149155 func tryGetInteger (key) = match getInteger(this, key) {
150156 case b: Int =>
151157 b
152158 case _ =>
153159 0
154160 }
155161
156162
157163 func tryGetBoolean (key) = match getBoolean(this, key) {
158164 case b: Boolean =>
159165 b
160166 case _ =>
161167 false
162168 }
163169
164170
165171 func tryGetBooleanExternal (address,key) = match getBoolean(address, key) {
166172 case b: Boolean =>
167173 b
168174 case _ =>
169175 false
170176 }
171177
172178
173179 func getAssetOrigin (generation) = if ((generation == "G"))
174180 then getIncubatorAddress()
175181 else getBreederAddress()
176182
177183
178184 func getAssetRarity (genotype,generation) = {
179185 let quantity = valueOrErrorMessage(getInteger(getAssetOrigin(generation), (("stats_" + genotype) + "_quantity")), (("stats_" + genotype) + "_quantity not found"))
180186 let power = pow((10000 / quantity), 4, 5, 1, 2, FLOOR)
181187 if ((power > 0))
182188 then power
183189 else 2
184190 }
185191
186192
187193 func asString (value) = match value {
188194 case string: String =>
189195 string
190196 case _ =>
191197 throw("FAS: wrong type, expected: String")
192198 }
193199
194200
195201 func asInt (value) = match value {
196202 case int: Int =>
197203 int
198204 case _ =>
199205 throw("FAI: wrong type, expected: Int")
200206 }
201207
202208
203209 func asBoolean (value) = match value {
204210 case boolean: Boolean =>
205211 boolean
206212 case _ =>
207213 throw("FAB: wrong type, expected: Boolean")
208214 }
209215
210216
211217 func getAssetFarmingPower (assetId,address) = if (if ((value(assetInfo(assetId)).issuer == getBreederAddress()))
212218 then true
213219 else (value(assetInfo(assetId)).issuer == getIncubatorAddress()))
214220 then {
215221 let farmBoost = asInt(invoke(getItemsAddress(), "calculateFarmingPowerBoost", [toBase58String(assetId), address], nil))
216222 if ((farmBoost == farmBoost))
217223 then {
218224 let assetName = value(assetInfo(assetId)).name
219225 let isJackpot = (takeRight(value(assetName), 1) == "U")
220226 let farmGen = if (isJackpot)
221227 then ""
222228 else asString(invoke(getBreederAddress(), "getGenFromName", [assetName], nil))
223229 if ((farmGen == farmGen))
224230 then {
225231 let rarity = if (isJackpot)
226232 then 100
227233 else {
228234 let generation = take(takeRight(assetName, 2), 1)
229235 getAssetRarity(farmGen, generation)
230236 }
231237 let totalFarmingPower = (rarity + fraction(rarity, farmBoost, 100))
232238 $Tuple2(farmGen, totalFarmingPower)
233239 }
234240 else throw("Strict value is not equal to itself.")
235241 }
236242 else throw("Strict value is not equal to itself.")
237243 }
238244 else throw("not valid NFT")
239245
240246
241247 func getLastKnownAssetFarmingPower (address,assetId) = tryGetInteger((((("address_" + address) + "_asset_") + assetId) + "_farmingPower"))
242248
243249
244250 func getAssetsByGen (gen) = {
245251 let s = tryGetString(("assets_" + gen))
246252 if ((s == ""))
247253 then nil
248254 else split(s, ",")
249255 }
250256
251257
252258 func calcInterest (previousInterest,previousInterestHeight,totalFarmingPower) = (previousInterest + (((scale * getRewardPerBlock()) * (height - previousInterestHeight)) / totalFarmingPower))
253259
254260
255261 func getCurrentInterest () = if ((tryGetInteger("total_farmingPower") > 0))
256262 then {
257263 let previousInterest = tryGetInteger("total_lastCheckInterest")
258264 let previousInterestHeight = tryGetInteger("total_lastCheckInterestHeight")
259265 let totalFarmingPower = tryGetInteger("total_farmingPower")
260266 calcInterest(previousInterest, previousInterestHeight, totalFarmingPower)
261267 }
262268 else if ((tryGetInteger("total_startHeight") != 0))
263269 then tryGetInteger("total_lastCheckInterest")
264270 else throw("farming is not launched, yet")
265271
266272
267273 func calcAssetRewardDelta (address,assetId,assetFarmingPower) = {
268274 let lastCheckAssetInterest = tryGetInteger((((("address_" + address) + "_asset_") + assetId) + "_lastCheckInterest"))
269275 let currentInterest = getCurrentInterest()
270276 (assetFarmingPower * (currentInterest - lastCheckAssetInterest))
271277 }
272278
273279
274280 func addAssetIdToGenEntry (assetId,assetGen) = {
275281 let currentValue = tryGetString((("assets_" + assetGen) + "_locked"))
276282 if ((currentValue == ""))
277283 then assetId
278284 else ((currentValue + ",") + assetId)
279285 }
280286
281287
282288 func getStakeResult (address,assetId,assetFarmingPower,unstaker) = {
283289 let asset = toBase58String(assetId)
284290 [IntegerEntry("total_farmingPower", (tryGetInteger("total_farmingPower") + assetFarmingPower)), IntegerEntry("total_lastCheckInterest", getCurrentInterest()), IntegerEntry("total_lastCheckInterestHeight", height), StringEntry((("asset_" + asset) + "_owner"), address), IntegerEntry((((("address_" + address) + "_asset_") + asset) + "_farmingPower"), assetFarmingPower), IntegerEntry((((("address_" + address) + "_asset_") + asset) + "_lastCheckInterest"), getCurrentInterest()), StringEntry((((("address_" + address) + "_asset_") + asset) + "_unstaker"), unstaker)]
285291 }
286292
287293
288294 func getUnstakeResult (address,assetId,color,caller,realCaller,claimEggs) = {
289295 let locked = isLocked()
290296 if ((locked == locked))
291297 then {
292298 let asset = toBase58String(assetId)
293299 let unstaker = tryGetString((((("address_" + address) + "_asset_") + asset) + "_unstaker"))
294300 if (if ((unstaker != ""))
295301 then (unstaker != realCaller)
296302 else false)
297303 then throw("FUN: It seems duck was staked throuh a dapp, not directly, please unstake through dapp!")
298304 else {
299305 let assetFarmingPower = getLastKnownAssetFarmingPower(address, asset)
300306 if (!((assetFarmingPower > 0)))
301307 then throw("FGU: Asset farming power not bigger then 0")
302308 else {
303309 let assetRewardDelta = calcAssetRewardDelta(address, asset, assetFarmingPower)
304310 let farmedAmount = (assetRewardDelta + tryGetInteger((((("address_" + address) + "_asset_") + asset) + "_lastCheckFarmedAmount")))
305311 let withdrawnAmount = tryGetInteger((((("address_" + address) + "_asset_") + asset) + "_withdrawnAmount"))
306312 let reward = ((farmedAmount - withdrawnAmount) / (scale * 100))
307313 let isWithoutPerch = tryGetBoolean((((("address_" + address) + "_asset_") + asset) + "_without_perch"))
308314 let sicknessCheck = false
309315 let rewardAfterSickNess = if (sicknessCheck)
310316 then 0
311317 else reward
312318 let appendPerches = if (isWithoutPerch)
313319 then [DeleteEntry((((("address_" + address) + "_asset_") + asset) + "_without_perch"))]
314320 else [IntegerEntry(((("address_" + address) + "_perchesAvailable_") + color), (tryGetInteger(((("address_" + address) + "_perchesAvailable_") + color)) + 1))]
315321 let sendTx = if (claimEggs)
316322 then $Tuple2([ScriptTransfer(caller, (rewardAfterSickNess * 1000000), getEggAssetId())], (rewardAfterSickNess * 1000000))
317323 else $Tuple2(nil, 0)
318324 $Tuple2(((([IntegerEntry("total_farmingPower", (tryGetInteger("total_farmingPower") - assetFarmingPower)), IntegerEntry("total_lastCheckInterest", getCurrentInterest()), IntegerEntry("total_lastCheckInterestHeight", height), DeleteEntry((("asset_" + asset) + "_owner")), DeleteEntry((((("address_" + address) + "_asset_") + asset) + "_unstaker")), IntegerEntry((((("address_" + address) + "_asset_") + asset) + "_farmingPower"), 0), IntegerEntry((((("address_" + address) + "_asset_") + asset) + "_lastCheckInterest"), getCurrentInterest()), IntegerEntry((((("address_" + address) + "_asset_") + asset) + "_withdrawnAmount"), (withdrawnAmount + (rewardAfterSickNess * scale2))), IntegerEntry((((("address_" + address) + "_asset_") + asset) + "_lastCheckFarmedAmount"), (tryGetInteger((((("address_" + address) + "_asset_") + asset) + "_lastCheckFarmedAmount")) + assetRewardDelta))] ++ appendPerches) ++ [ScriptTransfer(caller, 1, assetId)]) ++ sendTx._1), sendTx._2)
319325 }
320326 }
321327 }
322328 else throw("Strict value is not equal to itself.")
323329 }
324330
325331
326332 func calculatePerchPrice (address) = {
327333 let hasArtefactStaked = tryGetStringExternal(getAccBoosterAddress(), (("ART-XMISTL_" + address) + "_owner"))
328334 if ((hasArtefactStaked == ""))
329335 then perchPrice
330336 else ((perchPrice / 10) * 9)
331337 }
332338
333339
334340 func isProxyStakingSc (address) = {
335341 let allowedContracts = getProxyStaking()
336342 let allowedContractsList = split(allowedContracts, ";")
337343 (indexOf(allowedContractsList, address) != unit)
338344 }
339345
340346
341347 func unstakeNFTInternal (asset,i,claimEgg) = {
342348 let assetId = fromBase58String(asset)
343349 let realCaller = toString(i.caller)
344350 let address = if (isProxyStakingSc(toString(i.caller)))
345351 then toString(i.originCaller)
346352 else realCaller
347353 let color = takeRight(value(assetInfo(assetId)).name, 1)
348354 if ((color == "U"))
349355 then throw("FUN: use another function to unstake Jackpot NFT")
350356 else {
351357 let result = getUnstakeResult(address, assetId, color, i.caller, realCaller, claimEgg)
352358 result
353359 }
354360 }
355361
356362
357363 func unstakeJackpotInternal (asset,i,claimEgg) = {
358364 let assetId = fromBase58String(asset)
359365 let realCaller = toString(i.caller)
360366 let address = if (isProxyStakingSc(toString(i.caller)))
361367 then toString(i.originCaller)
362368 else realCaller
363369 let color = tryGetString((((("address_" + address) + "_asset_") + asset) + "_perchColor"))
364370 if ((takeRight(value(value(assetInfo(assetId)).name), 1) != "U"))
365371 then throw("jackpot only")
366372 else {
367373 let result = getUnstakeResult(address, assetId, color, i.caller, realCaller, claimEgg)
368374 result
369375 }
370376 }
371377
372378
373379 func getBool (key) = match getBoolean(this, key) {
374380 case b: Boolean =>
375381 b
376382 case _ =>
377383 false
378384 }
379385
380386
381387 func isTestEnv () = getBool("TESTENV")
382388
383389
384390 @Callable(i)
385391 func configureOracle (oracle) = if ((i.caller != this))
386392 then throw("FCO: admin only")
387393 else [StringEntry(staticKey_oracleAddress(), oracle)]
388394
389395
390396
391397 @Callable(i)
392398 func init () = if ((i.caller != this))
393399 then throw("FI: admin only")
394400 else [IntegerEntry("total_startHeight", height)]
395401
396402
397403
398404 @Callable(i)
399405 func buyPerch (colorI,refererAddress) = {
400406 let locked = isLocked()
401407 if ((locked == locked))
402408 then {
403- let validPayment = checkAdditionalPayment(i.payments[0])
409+ let validPayment = if (if ((i.caller == getHuntAddress()))
410+ then true
411+ else (i.caller == getMetaraceAddress()))
412+ then nil
413+ else checkAdditionalPayment(i.payments[0])
404414 if ((validPayment == validPayment))
405415 then {
406416 let color = if ((colorI == "U"))
407417 then "B"
408418 else colorI
409419 if ((0 > value(indexOf(["B", "R", "G", "Y"], color))))
410420 then throw("you need to set color properly")
411421 else {
412422 let exactPrice = calculatePerchPrice(toString(i.caller))
413423 let leftToPay = if ((i.originCaller == i.caller))
414424 then {
415425 let amountPaidByCoupons = asInt(invoke(getCouponsAddress(), "useCoupons", [exactPrice], nil))
416426 if ((amountPaidByCoupons == amountPaidByCoupons))
417427 then (exactPrice - amountPaidByCoupons)
418428 else throw("Strict value is not equal to itself.")
419429 }
420430 else exactPrice
421431 let payment = if ((leftToPay != 0))
422432 then {
423433 let firstPayment = value(i.payments[1])
424434 if ((firstPayment.assetId != getEggAssetId()))
425435 then throw(("FBP: You can attach only EGG tokens with the following asset id: " + toBase58String(getEggAssetId())))
426436 else if ((firstPayment.amount != leftToPay))
427437 then throw(((("FBP: To buy a perch you currently need the following amount of EGGlets: " + toString(leftToPay)) + " ") + toString(i.caller)))
428438 else {
429439 let refererRewardForPerch = fraction(leftToPay, RefererReward, 100)
430440 let refCall = invoke(getRefContractAddress(), "refPayment", [refererAddress], [AttachedPayment(getEggAssetId(), refererRewardForPerch)])
431441 if ((refCall == refCall))
432442 then {
433443 let burnCall = invoke(getBurnAddress(), "burnAttachedPayments", nil, [AttachedPayment(getEggAssetId(), (leftToPay - refererRewardForPerch))])
434444 if ((burnCall == burnCall))
435445 then leftToPay
436446 else throw("Strict value is not equal to itself.")
437447 }
438448 else throw("Strict value is not equal to itself.")
439449 }
440450 }
441451 else 0
442452 if ((payment == payment))
443453 then {
444454 let perchAmountKey = ((("address_" + toString(i.caller)) + "_perchesAvailable_") + color)
445455 let perchAmount = tryGetInteger(perchAmountKey)
446456 ([IntegerEntry(perchAmountKey, (perchAmount + 1))] ++ validPayment)
447457 }
448458 else throw("Strict value is not equal to itself.")
449459 }
450460 }
451461 else throw("Strict value is not equal to itself.")
452462 }
453463 else throw("Strict value is not equal to itself.")
454464 }
455465
456466
457467
458468 @Callable(i)
459469 func addFreePerch (address,color) = {
460470 let locked = isLocked()
461471 if ((locked == locked))
462472 then if ((0 > value(indexOf(["B", "R", "G", "Y"], color))))
463473 then throw("you need to set color properly")
464474 else if (if (if ((i.caller != getRebirthAddress()))
465475 then (i.caller != this)
466476 else false)
467477 then (i.caller != getSwopPromoAddress())
468478 else false)
469479 then throw("rebirth and swop promo only")
470480 else {
471481 let perchAmountKey = ((("address_" + address) + "_perchesAvailable_") + color)
472482 let perchAmount = tryGetInteger(perchAmountKey)
473483 $Tuple2([IntegerEntry(perchAmountKey, (perchAmount + 1))], "")
474484 }
475485 else throw("Strict value is not equal to itself.")
476486 }
477487
478488
479489
480490 @Callable(i)
481491 func stakeNFT () = {
482492 let locked = isLocked()
483493 if ((locked == locked))
484494 then {
485- let validPayment = checkAdditionalPayment(i.payments[1])
495+ let validPayment = if (if ((i.caller == getHuntAddress()))
496+ then true
497+ else (i.caller == getMetaraceAddress()))
498+ then nil
499+ else checkAdditionalPayment(i.payments[1])
486500 if ((validPayment == validPayment))
487501 then {
488502 let pmt = value(i.payments[0])
489503 let assetId = value(value(i.payments[0]).assetId)
490504 let realCaller = toString(i.caller)
491505 let address = if (isProxyStakingSc(toString(i.caller)))
492506 then toString(i.originCaller)
493507 else realCaller
494508 let color = takeRight(value(assetInfo(assetId)).name, 1)
495509 let availablePerches = tryGetInteger(((("address_" + address) + "_perchesAvailable_") + color))
496510 if ((pmt.amount != 1))
497511 then throw("NFT is not attached")
498512 else if ((0 >= availablePerches))
499513 then throw(("no perches available for the color " + color))
500514 else {
501- let $t01665916732 = getAssetFarmingPower(assetId, address)
502- let assetGen = $t01665916732._1
503- let assetFarmingPower = $t01665916732._2
515+ let $t01699017063 = getAssetFarmingPower(assetId, address)
516+ let assetGen = $t01699017063._1
517+ let assetFarmingPower = $t01699017063._2
504518 ((getStakeResult(address, assetId, assetFarmingPower, realCaller) ++ [IntegerEntry(((("address_" + address) + "_perchesAvailable_") + color), (availablePerches - 1))]) ++ validPayment)
505519 }
506520 }
507521 else throw("Strict value is not equal to itself.")
508522 }
509523 else throw("Strict value is not equal to itself.")
510524 }
511525
512526
513527
514528 @Callable(i)
515529 func stakeNFTWithoutPerch () = {
516530 let locked = isLocked()
517531 if ((locked == locked))
518532 then {
519533 let dappToCall = toString(i.caller)
520534 if (!(isProxyStakingSc(dappToCall)))
521535 then throw("FSNWP: Only trusted smart contracts can stake without a perch!")
522536 else {
523537 let pmt = value(i.payments[0])
524538 let assetId = value(value(i.payments[0]).assetId)
525539 let address = toString(i.originCaller)
526540 if ((pmt.amount != 1))
527541 then throw("NFT is not attached")
528542 else {
529- let $t01737017443 = getAssetFarmingPower(assetId, address)
530- let assetGen = $t01737017443._1
531- let assetFarmingPower = $t01737017443._2
543+ let $t01770117774 = getAssetFarmingPower(assetId, address)
544+ let assetGen = $t01770117774._1
545+ let assetFarmingPower = $t01770117774._2
532546 let asset = toBase58String(assetId)
533547 let realCaller = toString(i.caller)
534548 (getStakeResult(address, assetId, assetFarmingPower, realCaller) ++ [BooleanEntry((((("address_" + address) + "_asset_") + asset) + "_without_perch"), true)])
535549 }
536550 }
537551 }
538552 else throw("Strict value is not equal to itself.")
539553 }
540554
541555
542556
543557 @Callable(i)
544558 func unstakeNFT (asset) = {
545559 let validPayment = checkAdditionalPayment(i.payments[0])
546560 if ((validPayment == validPayment))
547561 then {
548562 let result = unstakeNFTInternal(asset, i, true)
549563 $Tuple2((result._1 ++ validPayment), result._2)
550564 }
551565 else throw("Strict value is not equal to itself.")
552566 }
553567
554568
555569
556570 @Callable(i)
557571 func unstakeNFTWithoutClaim (asset) = unstakeNFTInternal(asset, i, false)
558572
559573
560574
561575 @Callable(i)
562576 func stakeJackpot (color) = {
563577 let locked = isLocked()
564578 if ((locked == locked))
565579 then {
566- let validPayment = checkAdditionalPayment(i.payments[1])
580+ let validPayment = if (if ((i.caller == getHuntAddress()))
581+ then true
582+ else (i.caller == getMetaraceAddress()))
583+ then nil
584+ else checkAdditionalPayment(i.payments[1])
567585 if ((validPayment == validPayment))
568586 then {
569587 let pmt = value(i.payments[0])
570588 let assetId = value(pmt.assetId)
571589 let realCaller = toString(i.caller)
572590 let address = if (isProxyStakingSc(toString(i.caller)))
573591 then toString(i.originCaller)
574592 else realCaller
575593 let availablePerches = tryGetInteger(((("address_" + address) + "_perchesAvailable_") + color))
576594 let assetIssuer = value(assetInfo(assetId)).issuer
577595 if ((pmt.amount != 1))
578596 then throw("NFT is not attached")
579597 else if (if ((assetIssuer == getIncubatorAddress()))
580598 then true
581599 else (assetIssuer == getBreederAddress()))
582600 then if ((takeRight(value(value(assetInfo(assetId)).name), 1) != "U"))
583601 then throw("jackpot only")
584602 else if ((0 >= availablePerches))
585603 then throw(("FSJ: no perches available for the color " + color))
586604 else {
587605 let farmingPower = getAssetFarmingPower(assetId, address)
588606 ((getStakeResult(address, assetId, farmingPower._2, realCaller) ++ [IntegerEntry(((("address_" + address) + "_perchesAvailable_") + color), (availablePerches - 1)), StringEntry((((("address_" + address) + "_asset_") + toBase58String(assetId)) + "_perchColor"), color)]) ++ validPayment)
589607 }
590608 else throw("asset is not valid")
591609 }
592610 else throw("Strict value is not equal to itself.")
593611 }
594612 else throw("Strict value is not equal to itself.")
595613 }
596614
597615
598616
599617 @Callable(i)
600618 func unstakeJackpot (asset) = {
601619 let validPayment = checkAdditionalPayment(i.payments[0])
602620 if ((validPayment == validPayment))
603621 then {
604622 let result = unstakeJackpotInternal(asset, i, true)
605623 $Tuple2((result._1 ++ validPayment), result._2)
606624 }
607625 else throw("Strict value is not equal to itself.")
608626 }
609627
610628
611629
612630 @Callable(i)
613631 func unstakeJackpotWithoutClaimEgg (asset) = unstakeJackpotInternal(asset, i, false)
614632
615633
616634
617635 @Callable(i)
618636 func claimReward (asset) = {
619637 let locked = isLocked()
620638 if ((locked == locked))
621639 then {
622640 let validPayment = if ((i.originCaller == getCfMasterAddress()))
623641 then nil
624642 else checkAdditionalPayment(i.payments[0])
625643 if ((validPayment == validPayment))
626644 then {
627645 let address = if ((i.originCaller == getCfMasterAddress()))
628646 then toString(i.caller)
629647 else toString(i.originCaller)
630648 let assetId = fromBase58String(asset)
631649 let sicknessCheck = false
632650 if (sicknessCheck)
633651 then {
634652 let assetFarmingPower = getLastKnownAssetFarmingPower(address, asset)
635653 [IntegerEntry("total_farmingPower", (tryGetInteger("total_farmingPower") - assetFarmingPower)), IntegerEntry((((("address_" + address) + "_asset_") + asset) + "_farmingPower"), 0)]
636654 }
637655 else {
638656 let assetFarmingPower = getLastKnownAssetFarmingPower(address, asset)
639657 let assetRewardDelta = calcAssetRewardDelta(address, asset, assetFarmingPower)
640658 let farmedAmount = (assetRewardDelta + tryGetInteger((((("address_" + address) + "_asset_") + asset) + "_lastCheckFarmedAmount")))
641659 let withdrawnAmount = tryGetInteger((((("address_" + address) + "_asset_") + asset) + "_withdrawnAmount"))
642660 let reward = ((farmedAmount - withdrawnAmount) / (scale * 100))
643661 if ((0 >= reward))
644662 then throw("FCR: you have no EGGs to withdraw")
645663 else $Tuple2(([IntegerEntry((((("address_" + address) + "_asset_") + asset) + "_withdrawnAmount"), (tryGetInteger((((("address_" + address) + "_asset_") + asset) + "_withdrawnAmount")) + (reward * scale2))), ScriptTransfer(Address(fromBase58String(address)), (reward * 1000000), getEggAssetId())] ++ validPayment), (reward * 1000000))
646664 }
647665 }
648666 else throw("Strict value is not equal to itself.")
649667 }
650668 else throw("Strict value is not equal to itself.")
651669 }
652670
653671
654-
655-@Callable(i)
656-func healDuck (duckId) = {
657- let address = if (isProxyStakingSc(toString(i.caller)))
658- then toString(i.originCaller)
659- else toString(i.caller)
660- let farmingPower = getAssetFarmingPower(toBytes(duckId), address)._2
661-[IntegerEntry("total_farmingPower", (tryGetInteger("total_farmingPower") + farmingPower)), IntegerEntry((((("address_" + address) + "_asset_") + duckId) + "_farmingPower"), farmingPower)]
662- }
663-
664-
665672 @Verifier(tx)
666673 func verify () = if (isTestEnv())
667674 then sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
668675 else {
669676 let firstUser = base58'FzsTVRXqD46KW5yj6qGNVrsouvWjpCQvD1446A96iGt4'
670677 let secondUser = base58'E23yUg8eun5nXB1nZRDf7RTyRADKxQhGNXdpTYonEvtU'
671678 let thirdUser = base58'Ga8WEBTPXbHuoXRD355mQ6ms8PsM2RFYKeA1mEP32CFe'
672679 let firstUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], firstUser))
673680 then 1
674681 else if (sigVerify(tx.bodyBytes, tx.proofs[1], firstUser))
675682 then 1
676683 else if (sigVerify(tx.bodyBytes, tx.proofs[2], firstUser))
677684 then 1
678685 else 0
679686 let secondUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], secondUser))
680687 then 1
681688 else if (sigVerify(tx.bodyBytes, tx.proofs[1], secondUser))
682689 then 1
683690 else if (sigVerify(tx.bodyBytes, tx.proofs[2], secondUser))
684691 then 1
685692 else 0
686693 let thirdUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], thirdUser))
687694 then 1
688695 else if (sigVerify(tx.bodyBytes, tx.proofs[1], thirdUser))
689696 then 1
690697 else if (sigVerify(tx.bodyBytes, tx.proofs[2], thirdUser))
691698 then 1
692699 else 0
693700 let signaturesCount = ((firstUserSigned + secondUserSigned) + thirdUserSigned)
694701 match tx {
695702 case _ =>
696703 (signaturesCount >= 2)
697704 }
698705 }
699706

github/deemru/w8io/3ef1775 
77.27 ms