tx · 4qu85VzpzyAhm6yzJHoCWKsZQaD5kWJGBSBF6KLrbWHF 3PH75p2rmMKCV2nyW4TsAdFgFtmc61mJaqA: -0.01400000 Waves 2022.03.24 11:12 [3042924] smart account 3PH75p2rmMKCV2nyW4TsAdFgFtmc61mJaqA > SELF 0.00000000 Waves
{ "type": 13, "id": "4qu85VzpzyAhm6yzJHoCWKsZQaD5kWJGBSBF6KLrbWHF", "fee": 1400000, "feeAssetId": null, "timestamp": 1648109573791, "version": 2, "chainId": 87, "sender": "3PH75p2rmMKCV2nyW4TsAdFgFtmc61mJaqA", "senderPublicKey": "3GtkwhnMmG1yeozW51o4dJ1x3BDToPaLBXyBWKGdAc2e", "proofs": [ "4HPjWcMzZZtrRja7HELBsCiTorXhSWbMnoDH8trgyBhf623QQ4KDTzjdMyhLfSjNQhsCWYVGqXHc3ukT6U8x7eu6" ], "script": "base64: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AAABcwkBAAAADHRyeUdldFN0cmluZwAAAAEJAAEsAAAAAgIAAAAHYXNzZXRzXwUAAAADZ2VuAwkAAAAAAAACBQAAAAFzAgAAAAAFAAAAA25pbAkABLUAAAACBQAAAAFzAgAAAAEsAQAAAAxjYWxjSW50ZXJlc3QAAAADAAAAEHByZXZpb3VzSW50ZXJlc3QAAAAWcHJldmlvdXNJbnRlcmVzdEhlaWdodAAAABF0b3RhbEZhcm1pbmdQb3dlcgkAAGQAAAACBQAAABBwcmV2aW91c0ludGVyZXN0CQAAaQAAAAIJAABoAAAAAgkAAGgAAAACBQAAAAVzY2FsZQkBAAAAEWdldFJld2FyZFBlckJsb2NrAAAAAAkAAGUAAAACBQAAAAZoZWlnaHQFAAAAFnByZXZpb3VzSW50ZXJlc3RIZWlnaHQFAAAAEXRvdGFsRmFybWluZ1Bvd2VyAQAAABJnZXRDdXJyZW50SW50ZXJlc3QAAAAAAwkAAGYAAAACCQEAAAANdHJ5R2V0SW50ZWdlcgAAAAECAAAAEnRvdGFsX2Zhcm1pbmdQb3dlcgAAAAAAAAAAAAQAAAAQcHJldmlvdXNJbnRlcmVzdAkBAAAADXRyeUdldEludGVnZXIAAAABAgAAABd0b3RhbF9sYXN0Q2hlY2tJbnRlcmVzdAQAAAAWcHJldmlvdXNJbnRlcmVzdEhlaWdodAkBAAAADXRyeUdldEludGVnZXIAAAABAgAAAB10b3RhbF9sYXN0Q2hlY2tJbnRlcmVzdEhlaWdodAQAAAARdG90YWxGYXJtaW5nUG93ZXIJAQAAAA10cnlHZXRJbnRlZ2VyAAAAAQIAAAASdG90YWxfZmFybWluZ1Bvd2VyCQEAAAAMY2FsY0ludGVyZXN0AAAAAwUAAAAQcHJldmlvdXNJbnRlcmVzdAUAAAAWcHJldmlvdXNJbnRlcmVzdEhlaWdodAUAAAARdG90YWxGYXJtaW5nUG93ZXIDCQEAAAACIT0AAAACCQEAAAANdHJ5R2V0SW50ZWdlcgAAAAECAAAAEXRvdGFsX3N0YXJ0SGVpZ2h0AAAAAAAAAAAACQEAAAANdHJ5R2V0SW50ZWdlcgAAAAECAAAAF3RvdGFsX2xhc3RDaGVja0ludGVyZXN0CQAAAgAAAAECAAAAHGZhcm1pbmcgaXMgbm90IGxhdW5jaGVkLCB5ZXQBAAAAFGNhbGNBc3NldFJld2FyZERlbHRhAAAAAwAAAAdhZGRyZXNzAAAAB2Fzc2V0SWQAAAARYXNzZXRGYXJtaW5nUG93ZXIEAAAAFmxhc3RDaGVja0Fzc2V0SW50ZXJlc3QJAQAAAA10cnlHZXRJbnRlZ2VyAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAhhZGRyZXNzXwUAAAAHYWRkcmVzcwIAAAAHX2Fzc2V0XwUAAAAHYXNzZXRJZAIAAAASX2xhc3RDaGVja0ludGVyZXN0BAAAAA9jdXJyZW50SW50ZXJlc3QJAQAAABJnZXRDdXJyZW50SW50ZXJlc3QAAAAACQAAaAAAAAIFAAAAEWFzc2V0RmFybWluZ1Bvd2VyCQAAZQAAAAIFAAAAD2N1cnJlbnRJbnRlcmVzdAUAAAAWbGFzdENoZWNrQXNzZXRJbnRlcmVzdAEAAAAUYWRkQXNzZXRJZFRvR2VuRW50cnkAAAACAAAAB2Fzc2V0SWQAAAAIYXNzZXRHZW4EAAAADGN1cnJlbnRWYWx1ZQkBAAAADHRyeUdldFN0cmluZwAAAAEJAAEsAAAAAgkAASwAAAACAgAAAAdhc3NldHNfBQAAAAhhc3NldEdlbgIAAAAHX2xvY2tlZAMJAAAAAAAAAgUAAAAMY3VycmVudFZhbHVlAgAAAAAFAAAAB2Fzc2V0SWQJAAEsAAAAAgkAASwAAAACBQAAAAxjdXJyZW50VmFsdWUCAAAAASwFAAAAB2Fzc2V0SWQBAAAADmdldFN0YWtlUmVzdWx0AAAAAwAAAAdhZGRyZXNzAAAAB2Fzc2V0SWQAAAARYXNzZXRGYXJtaW5nUG93ZXIEAAAABWFzc2V0CQACWAAAAAEFAAAAB2Fzc2V0SWQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAICAAAAEnRvdGFsX2Zhcm1pbmdQb3dlcgkAAGQAAAACCQEAAAANdHJ5R2V0SW50ZWdlcgAAAAECAAAAEnRvdGFsX2Zhcm1pbmdQb3dlcgUAAAARYXNzZXRGYXJtaW5nUG93ZXIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAICAAAAF3RvdGFsX2xhc3RDaGVja0ludGVyZXN0CQEAAAASZ2V0Q3VycmVudEludGVyZXN0AAAAAAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgIAAAAddG90YWxfbGFzdENoZWNrSW50ZXJlc3RIZWlnaHQFAAAABmhlaWdodAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAhhZGRyZXNzXwUAAAAHYWRkcmVzcwIAAAAHX2Fzc2V0XwUAAAAFYXNzZXQCAAAADV9mYXJtaW5nUG93ZXIFAAAAEWFzc2V0RmFybWluZ1Bvd2VyCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAACGFkZHJlc3NfBQAAAAdhZGRyZXNzAgAAAAdfYXNzZXRfBQAAAAVhc3NldAIAAAASX2xhc3RDaGVja0ludGVyZXN0CQEAAAASZ2V0Q3VycmVudEludGVyZXN0AAAAAAUAAAADbmlsAQAAABBnZXRVbnN0YWtlUmVzdWx0AAAABQAAAAdhZGRyZXNzAAAAB2Fzc2V0SWQAAAALcmV3YXJkRGVsdGEAAAAPd2l0aGRyYXduQW1vdW50AAAAEWFzc2V0RmFybWluZ1Bvd2VyBAAAAAVhc3NldAkAAlgAAAABBQAAAAdhc3NldElkCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACAgAAABJ0b3RhbF9mYXJtaW5nUG93ZXIJAABlAAAAAgkBAAAADXRyeUdldEludGVnZXIAAAABAgAAABJ0b3RhbF9mYXJtaW5nUG93ZXIFAAAAEWFzc2V0RmFybWluZ1Bvd2VyCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACAgAAABd0b3RhbF9sYXN0Q2hlY2tJbnRlcmVzdAkBAAAAEmdldEN1cnJlbnRJbnRlcmVzdAAAAAAJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAICAAAAHXRvdGFsX2xhc3RDaGVja0ludGVyZXN0SGVpZ2h0BQAAAAZoZWlnaHQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAIYWRkcmVzc18FAAAAB2FkZHJlc3MCAAAAB19hc3NldF8FAAAABWFzc2V0AgAAAA1fZmFybWluZ1Bvd2VyAAAAAAAAAAAACQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAACGFkZHJlc3NfBQAAAAdhZGRyZXNzAgAAAAdfYXNzZXRfBQAAAAVhc3NldAIAAAASX2xhc3RDaGVja0ludGVyZXN0CQEAAAASZ2V0Q3VycmVudEludGVyZXN0AAAAAAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAhhZGRyZXNzXwUAAAAHYWRkcmVzcwIAAAAHX2Fzc2V0XwUAAAAFYXNzZXQCAAAAEF93aXRoZHJhd25BbW91bnQJAABkAAAAAgkBAAAADXRyeUdldEludGVnZXIAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAACGFkZHJlc3NfBQAAAAdhZGRyZXNzAgAAAAdfYXNzZXRfBQAAAAVhc3NldAIAAAAQX3dpdGhkcmF3bkFtb3VudAkAAGgAAAACBQAAAA93aXRoZHJhd25BbW91bnQFAAAABnNjYWxlMgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAhhZGRyZXNzXwUAAAAHYWRkcmVzcwIAAAAHX2Fzc2V0XwUAAAAFYXNzZXQCAAAAFl9sYXN0Q2hlY2tGYXJtZWRBbW91bnQJAABkAAAAAgkBAAAADXRyeUdldEludGVnZXIAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAACGFkZHJlc3NfBQAAAAdhZGRyZXNzAgAAAAdfYXNzZXRfBQAAAAVhc3NldAIAAAAWX2xhc3RDaGVja0Zhcm1lZEFtb3VudAUAAAALcmV3YXJkRGVsdGEFAAAAA25pbAEAAAATY2FsY3VsYXRlUGVyY2hQcmljZQAAAAEAAAAHYWRkcmVzcwQAAAARaGFzQXJ0ZWZhY3RTdGFrZWQJAQAAABR0cnlHZXRTdHJpbmdFeHRlcm5hbAAAAAIJAQAAAAdBZGRyZXNzAAAAAQkBAAAAD2dldEl0ZW1zQWRkcmVzcwAAAAAJAAEsAAAAAgkAASwAAAACAgAAAAtBUlQtWE1JU1RMXwUAAAAHYWRkcmVzcwIAAAAGX293bmVyAwkAAAAAAAACBQAAABFoYXNBcnRlZmFjdFN0YWtlZAIAAAAABQAAAApwZXJjaFByaWNlCQAAaAAAAAIJAABpAAAAAgUAAAAKcGVyY2hQcmljZQAAAAAAAAAACgAAAAAAAAAACQAAAAgAAAABaQEAAAAEaW5pdAAAAAADCQEAAAACIT0AAAACCAUAAAABaQAAAAZjYWxsZXIFAAAABHRoaXMJAAACAAAAAQIAAAAKYWRtaW4gb25seQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgIAAAARdG90YWxfc3RhcnRIZWlnaHQFAAAABmhlaWdodAUAAAADbmlsAAAAAWkBAAAACGJ1eVBlcmNoAAAAAgAAAAVjb2xvcgAAAA5yZWZlcmVyQWRkcmVzcwMJAABmAAAAAgkBAAAACGlzTG9ja2VkAAAAAAAAAAAAAAAAAAkAAAIAAAABAgAAACVFR0cgb3BlcmF0aW9ucyBhcmUgdGVtcG9yYXJpbHkgbG9ja2VkAwkAAGYAAAACAAAAAAAAAAAACQEAAAAFdmFsdWUAAAABCQAETwAAAAIJAARMAAAAAgIAAAABQgkABEwAAAACAgAAAAFSCQAETAAAAAICAAAAAUcJAARMAAAAAgIAAAABWQUAAAADbmlsBQAAAAVjb2xvcgkAAAIAAAABAgAAAB55b3UgbmVlZCB0byBzZXQgY29sb3IgcHJvcGVybHkEAAAADGZpcnN0UGF5bWVudAkBAAAABXZhbHVlAAAAAQkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAQAAAAKZXhhY3RQcmljZQkBAAAAE2NhbGN1bGF0ZVBlcmNoUHJpY2UAAAABCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgMJAQAAAAIhPQAAAAIIBQAAAAxmaXJzdFBheW1lbnQAAAAHYXNzZXRJZAUAAAALZWdnc0Fzc2V0SWQJAAACAAAAAQkAASwAAAACAgAAADxZb3UgY2FuIGF0dGFjaCBvbmx5IEVHRyB0b2tlbnMgd2l0aCB0aGUgZm9sbG93aW5nIGFzc2V0IGlkOiAJAAJYAAAAAQUAAAALZWdnc0Fzc2V0SWQDCQEAAAACIT0AAAACCAUAAAAMZmlyc3RQYXltZW50AAAABmFtb3VudAUAAAAKZXhhY3RQcmljZQkAAAIAAAABCQABLAAAAAICAAAAQ1RvIGJ1eSBhIHBlcmNoIHlvdSBjdXJyZW50bHkgbmVlZCB0aGUgZm9sbG93aW5nIGFtb3VudCBvZiBFR0dsZXRzOiAJAAGkAAAAAQUAAAAKZXhhY3RQcmljZQQAAAAVcmVmZXJlclJld2FyZEZvclBlcmNoCQAAawAAAAMIBQAAAAxmaXJzdFBheW1lbnQAAAAGYW1vdW50BQAAAA1SZWZlcmVyUmV3YXJkAAAAAAAAAABkBAAAAAdyZWZDYWxsCQAD/AAAAAQJAQAAAAdBZGRyZXNzAAAAAQUAAAAScmVmQ29udHJhY3RBZGRyZXNzAgAAAApyZWZQYXltZW50CQAETAAAAAIFAAAADnJlZmVyZXJBZGRyZXNzBQAAAANuaWwJAARMAAAAAgkBAAAAD0F0dGFjaGVkUGF5bWVudAAAAAIFAAAAC2VnZ3NBc3NldElkBQAAABVyZWZlcmVyUmV3YXJkRm9yUGVyY2gFAAAAA25pbAMJAAAAAAAAAgUAAAAHcmVmQ2FsbAUAAAAHcmVmQ2FsbAQAAAAOcGVyY2hBbW91bnRLZXkJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAACGFkZHJlc3NfCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgIAAAASX3BlcmNoZXNBdmFpbGFibGVfBQAAAAVjb2xvcgQAAAALcGVyY2hBbW91bnQJAQAAAA10cnlHZXRJbnRlZ2VyAAAAAQUAAAAOcGVyY2hBbW91bnRLZXkJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAADnBlcmNoQW1vdW50S2V5CQAAZAAAAAIFAAAAC3BlcmNoQW1vdW50AAAAAAAAAAABBQAAAANuaWwJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAWkBAAAADGFkZEZyZWVQZXJjaAAAAAIAAAAHYWRkcmVzcwAAAAVjb2xvcgMJAABmAAAAAgAAAAAAAAAAAAkBAAAABXZhbHVlAAAAAQkABE8AAAACCQAETAAAAAICAAAAAUIJAARMAAAAAgIAAAABUgkABEwAAAACAgAAAAFHCQAETAAAAAICAAAAAVkFAAAAA25pbAUAAAAFY29sb3IJAAACAAAAAQIAAAAeeW91IG5lZWQgdG8gc2V0IGNvbG9yIHByb3Blcmx5AwMDCQEAAAACIT0AAAACCAUAAAABaQAAAAZjYWxsZXIJAQAAAAdBZGRyZXNzAAAAAQUAAAAOcmViaXJ0aEFkZHJlc3MJAQAAAAIhPQAAAAIIBQAAAAFpAAAABmNhbGxlcgUAAAAEdGhpcwcJAQAAAAIhPQAAAAIIBQAAAAFpAAAABmNhbGxlcgkBAAAAB0FkZHJlc3MAAAABBQAAABBzd29wUHJvbW9BZGRyZXNzBwkAAAIAAAABAgAAABtyZWJpcnRoIGFuZCBzd29wIHByb21vIG9ubHkEAAAADnBlcmNoQW1vdW50S2V5CQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAhhZGRyZXNzXwUAAAAHYWRkcmVzcwIAAAASX3BlcmNoZXNBdmFpbGFibGVfBQAAAAVjb2xvcgQAAAALcGVyY2hBbW91bnQJAQAAAA10cnlHZXRJbnRlZ2VyAAAAAQUAAAAOcGVyY2hBbW91bnRLZXkJAAUUAAAAAgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAOcGVyY2hBbW91bnRLZXkJAABkAAAAAgUAAAALcGVyY2hBbW91bnQAAAAAAAAAAAEFAAAAA25pbAIAAAAAAAAAAWkBAAAACHN0YWtlTkZUAAAAAAMJAABmAAAAAgkBAAAACGlzTG9ja2VkAAAAAAAAAAAAAAAAAAkAAAIAAAABAgAAACVFR0cgb3BlcmF0aW9ucyBhcmUgdGVtcG9yYXJpbHkgbG9ja2VkBAAAAANwbXQJAQAAAAV2YWx1ZQAAAAEJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAEAAAAB2Fzc2V0SWQJAQAAAAV2YWx1ZQAAAAEICQEAAAAFdmFsdWUAAAABCQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAAAAAAB2Fzc2V0SWQEAAAAB2FkZHJlc3MJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyBAAAAAVjb2xvcgkBAAAACXRha2VSaWdodAAAAAIICQEAAAAFdmFsdWUAAAABCQAD7AAAAAEFAAAAB2Fzc2V0SWQAAAAEbmFtZQAAAAAAAAAAAQQAAAAQYXZhaWxhYmxlUGVyY2hlcwkBAAAADXRyeUdldEludGVnZXIAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAhhZGRyZXNzXwkABCUAAAABCAUAAAABaQAAAAZjYWxsZXICAAAAEl9wZXJjaGVzQXZhaWxhYmxlXwUAAAAFY29sb3IDCQEAAAACIT0AAAACCAUAAAADcG10AAAABmFtb3VudAAAAAAAAAAAAQkAAAIAAAABAgAAABNORlQgaXMgbm90IGF0dGFjaGVkAwkAAGcAAAACAAAAAAAAAAAABQAAABBhdmFpbGFibGVQZXJjaGVzCQAAAgAAAAEJAAEsAAAAAgIAAAAjbm8gcGVyY2hlcyBhdmFpbGFibGUgZm9yIHRoZSBjb2xvciAFAAAABWNvbG9yBAAAAAskdDA4NDIwODQ4NQkBAAAAFGdldEFzc2V0RmFybWluZ1Bvd2VyAAAAAQUAAAAHYXNzZXRJZAQAAAAIYXNzZXRHZW4IBQAAAAskdDA4NDIwODQ4NQAAAAJfMQQAAAARYXNzZXRGYXJtaW5nUG93ZXIIBQAAAAskdDA4NDIwODQ4NQAAAAJfMgQAAAAQYXNzZXRSZXdhcmREZWx0YQkBAAAAFGNhbGNBc3NldFJld2FyZERlbHRhAAAAAwUAAAAHYWRkcmVzcwkAAlgAAAABBQAAAAdhc3NldElkBQAAABFhc3NldEZhcm1pbmdQb3dlcgkABE4AAAACCQEAAAAOZ2V0U3Rha2VSZXN1bHQAAAADBQAAAAdhZGRyZXNzBQAAAAdhc3NldElkBQAAABFhc3NldEZhcm1pbmdQb3dlcgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAIYWRkcmVzc18JAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyAgAAABJfcGVyY2hlc0F2YWlsYWJsZV8FAAAABWNvbG9yCQAAZQAAAAIFAAAAEGF2YWlsYWJsZVBlcmNoZXMAAAAAAAAAAAEFAAAAA25pbAAAAAFpAQAAAAp1bnN0YWtlTkZUAAAAAQAAAAVhc3NldAMJAQAAABFpc1VzZXJCbGFja2xpc3RlZAAAAAEJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyCQAAAgAAAAECAAAA009vb3BzLCBsb29rcyBsaWtlIHlvdSBsb3N0IGluIG9uZSBvZiB0aGUgRHVja3NxdWlkIGdhbWVzISBBcyB5b3UgYWxyZWFkeSBrbm93LCBhbnkgbG9zcyBoYXMgaXRzIGNvbnNlcXVlbmNlcywgc28geW91IHdpbGwgYmUgbm90IGFibGUgdG8gY2xhaW0geW91ciBmYXJtaW5nIHJld2FyZHMgdGlsbCB0aGUgZW5kIG9mIER1Y2tTcXVpZCBnYW1lLiBRdWFjayBpbiBwZWFjZSEDCQAAZgAAAAIJAQAAAAhpc0xvY2tlZAAAAAAAAAAAAAAAAAAJAAACAAAAAQIAAAAlRUdHIG9wZXJhdGlvbnMgYXJlIHRlbXBvcmFyaWx5IGxvY2tlZAQAAAAHYXNzZXRJZAkAAlkAAAABBQAAAAVhc3NldAQAAAAHYWRkcmVzcwkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIEAAAAEWFzc2V0RmFybWluZ1Bvd2VyCQEAAAAdZ2V0TGFzdEtub3duQXNzZXRGYXJtaW5nUG93ZXIAAAACBQAAAAdhZGRyZXNzBQAAAAVhc3NldAQAAAAQYXNzZXRSZXdhcmREZWx0YQkBAAAAFGNhbGNBc3NldFJld2FyZERlbHRhAAAAAwUAAAAHYWRkcmVzcwUAAAAFYXNzZXQFAAAAEWFzc2V0RmFybWluZ1Bvd2VyBAAAAAxmYXJtZWRBbW91bnQJAABkAAAAAgUAAAAQYXNzZXRSZXdhcmREZWx0YQkBAAAADXRyeUdldEludGVnZXIAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAACGFkZHJlc3NfBQAAAAdhZGRyZXNzAgAAAAdfYXNzZXRfBQAAAAVhc3NldAIAAAAWX2xhc3RDaGVja0Zhcm1lZEFtb3VudAQAAAAPd2l0aGRyYXduQW1vdW50CQEAAAANdHJ5R2V0SW50ZWdlcgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAIYWRkcmVzc18FAAAAB2FkZHJlc3MCAAAAB19hc3NldF8FAAAABWFzc2V0AgAAABBfd2l0aGRyYXduQW1vdW50BAAAAAZyZXdhcmQJAABpAAAAAgkAAGUAAAACBQAAAAxmYXJtZWRBbW91bnQFAAAAD3dpdGhkcmF3bkFtb3VudAkAAGgAAAACBQAAAAVzY2FsZQAAAAAAAAAAZAQAAAAFY29sb3IJAQAAAAl0YWtlUmlnaHQAAAACCAkBAAAABXZhbHVlAAAAAQkAA+wAAAABBQAAAAdhc3NldElkAAAABG5hbWUAAAAAAAAAAAEDCQAAZwAAAAIAAAAAAAAAAAAFAAAAEWFzc2V0RmFybWluZ1Bvd2VyCQAAAgAAAAECAAAAE2Fzc2V0IG5vdCBhdmFpbGFibGUDCQAAAAAAAAIFAAAABWNvbG9yAgAAAAFVCQAAAgAAAAECAAAAK3VzZSBhbm90aGVyIGZ1bmN0aW9uIHRvIHVuc3Rha2UgSmFja3BvdCBORlQEAAAABnJlc3VsdAkBAAAAEGdldFVuc3Rha2VSZXN1bHQAAAAFBQAAAAdhZGRyZXNzBQAAAAdhc3NldElkBQAAABBhc3NldFJld2FyZERlbHRhBQAAAAZyZXdhcmQFAAAAEWFzc2V0RmFybWluZ1Bvd2VyCQAFFAAAAAIJAAROAAAAAgUAAAAGcmVzdWx0CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAhhZGRyZXNzXwkABCUAAAABCAUAAAABaQAAAAZjYWxsZXICAAAAEl9wZXJjaGVzQXZhaWxhYmxlXwUAAAAFY29sb3IJAABkAAAAAgkBAAAADXRyeUdldEludGVnZXIAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAhhZGRyZXNzXwkABCUAAAABCAUAAAABaQAAAAZjYWxsZXICAAAAEl9wZXJjaGVzQXZhaWxhYmxlXwUAAAAFY29sb3IAAAAAAAAAAAEJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyCQAAaAAAAAIFAAAABnJld2FyZAAAAAAAAA9CQAUAAAALZWdnc0Fzc2V0SWQJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyAAAAAAAAAAABBQAAAAdhc3NldElkBQAAAANuaWwJAABoAAAAAgUAAAAGcmV3YXJkAAAAAAAAD0JAAAAAAWkBAAAADHN0YWtlSmFja3BvdAAAAAEAAAAFY29sb3IDCQAAZgAAAAIJAQAAAAhpc0xvY2tlZAAAAAAAAAAAAAAAAAAJAAACAAAAAQIAAAAlRUdHIG9wZXJhdGlvbnMgYXJlIHRlbXBvcmFyaWx5IGxvY2tlZAQAAAADcG10CQEAAAAFdmFsdWUAAAABCQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAABAAAAAdhc3NldElkCQEAAAAFdmFsdWUAAAABCAUAAAADcG10AAAAB2Fzc2V0SWQEAAAAB2FkZHJlc3MJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyBAAAABBhdmFpbGFibGVQZXJjaGVzCQEAAAANdHJ5R2V0SW50ZWdlcgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAACGFkZHJlc3NfCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgIAAAASX3BlcmNoZXNBdmFpbGFibGVfBQAAAAVjb2xvcgQAAAALYXNzZXRJc3N1ZXIICAkBAAAABXZhbHVlAAAAAQkAA+wAAAABBQAAAAdhc3NldElkAAAABmlzc3VlcgAAAAVieXRlcwMJAQAAAAIhPQAAAAIIBQAAAANwbXQAAAAGYW1vdW50AAAAAAAAAAABCQAAAgAAAAECAAAAE05GVCBpcyBub3QgYXR0YWNoZWQDAwkAAAAAAAACBQAAAAthc3NldElzc3VlcgUAAAAQaW5jdWJhdG9yQWRkcmVzcwYJAAAAAAAAAgUAAAALYXNzZXRJc3N1ZXIFAAAADmJyZWVkZXJBZGRyZXNzAwkBAAAAAiE9AAAAAgkBAAAACXRha2VSaWdodAAAAAIJAQAAAAV2YWx1ZQAAAAEICQEAAAAFdmFsdWUAAAABCQAD7AAAAAEFAAAAB2Fzc2V0SWQAAAAEbmFtZQAAAAAAAAAAAQIAAAABVQkAAAIAAAABAgAAAAxqYWNrcG90IG9ubHkDCQAAZwAAAAIAAAAAAAAAAAAFAAAAEGF2YWlsYWJsZVBlcmNoZXMJAAACAAAAAQkAASwAAAACAgAAACNubyBwZXJjaGVzIGF2YWlsYWJsZSBmb3IgdGhlIGNvbG9yIAUAAAAFY29sb3IJAAROAAAAAgkBAAAADmdldFN0YWtlUmVzdWx0AAAAAwUAAAAHYWRkcmVzcwUAAAAHYXNzZXRJZAAAAAAAAAAAZAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAIYWRkcmVzc18JAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyAgAAABJfcGVyY2hlc0F2YWlsYWJsZV8FAAAABWNvbG9yCQAAZQAAAAIFAAAAEGF2YWlsYWJsZVBlcmNoZXMAAAAAAAAAAAEJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAhhZGRyZXNzXwkABCUAAAABCAUAAAABaQAAAAZjYWxsZXICAAAAB19hc3NldF8JAAJYAAAAAQUAAAAHYXNzZXRJZAIAAAALX3BlcmNoQ29sb3IFAAAABWNvbG9yBQAAAANuaWwJAAACAAAAAQIAAAASYXNzZXQgaXMgbm90IHZhbGlkAAAAAWkBAAAADnVuc3Rha2VKYWNrcG90AAAAAQAAAAVhc3NldAMJAQAAABFpc1VzZXJCbGFja2xpc3RlZAAAAAEJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyCQAAAgAAAAECAAAA009vb3BzLCBsb29rcyBsaWtlIHlvdSBsb3N0IGluIG9uZSBvZiB0aGUgRHVja3NxdWlkIGdhbWVzISBBcyB5b3UgYWxyZWFkeSBrbm93LCBhbnkgbG9zcyBoYXMgaXRzIGNvbnNlcXVlbmNlcywgc28geW91IHdpbGwgYmUgbm90IGFibGUgdG8gY2xhaW0geW91ciBmYXJtaW5nIHJld2FyZHMgdGlsbCB0aGUgZW5kIG9mIER1Y2tTcXVpZCBnYW1lLiBRdWFjayBpbiBwZWFjZSEDCQAAZgAAAAIJAQAAAAhpc0xvY2tlZAAAAAAAAAAAAAAAAAAJAAACAAAAAQIAAAAlRUdHIG9wZXJhdGlvbnMgYXJlIHRlbXBvcmFyaWx5IGxvY2tlZAQAAAAHYXNzZXRJZAkAAlkAAAABBQAAAAVhc3NldAQAAAAHYWRkcmVzcwkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIEAAAABWNvbG9yCQEAAAAMdHJ5R2V0U3RyaW5nAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAhhZGRyZXNzXwUAAAAHYWRkcmVzcwIAAAAHX2Fzc2V0XwUAAAAFYXNzZXQCAAAAC19wZXJjaENvbG9yBAAAABFhc3NldEZhcm1pbmdQb3dlcgkBAAAAHWdldExhc3RLbm93bkFzc2V0RmFybWluZ1Bvd2VyAAAAAgUAAAAHYWRkcmVzcwUAAAAFYXNzZXQEAAAAEGFzc2V0UmV3YXJkRGVsdGEJAQAAABRjYWxjQXNzZXRSZXdhcmREZWx0YQAAAAMFAAAAB2FkZHJlc3MFAAAABWFzc2V0BQAAABFhc3NldEZhcm1pbmdQb3dlcgQAAAAMZmFybWVkQW1vdW50CQAAZAAAAAIFAAAAEGFzc2V0UmV3YXJkRGVsdGEJAQAAAA10cnlHZXRJbnRlZ2VyAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAhhZGRyZXNzXwUAAAAHYWRkcmVzcwIAAAAHX2Fzc2V0XwUAAAAFYXNzZXQCAAAAFl9sYXN0Q2hlY2tGYXJtZWRBbW91bnQEAAAAD3dpdGhkcmF3bkFtb3VudAkBAAAADXRyeUdldEludGVnZXIAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAACGFkZHJlc3NfBQAAAAdhZGRyZXNzAgAAAAdfYXNzZXRfBQAAAAVhc3NldAIAAAAQX3dpdGhkcmF3bkFtb3VudAQAAAAGcmV3YXJkCQAAaQAAAAIJAABlAAAAAgUAAAAMZmFybWVkQW1vdW50BQAAAA93aXRoZHJhd25BbW91bnQJAABoAAAAAgUAAAAFc2NhbGUAAAAAAAAAAGQDCQEAAAACIT0AAAACCQEAAAAJdGFrZVJpZ2h0AAAAAgkBAAAABXZhbHVlAAAAAQgJAQAAAAV2YWx1ZQAAAAEJAAPsAAAAAQUAAAAHYXNzZXRJZAAAAARuYW1lAAAAAAAAAAABAgAAAAFVCQAAAgAAAAECAAAADGphY2twb3Qgb25seQMJAABmAAAAAgUAAAARYXNzZXRGYXJtaW5nUG93ZXIAAAAAAAAAAAAEAAAABnJlc3VsdAkBAAAAEGdldFVuc3Rha2VSZXN1bHQAAAAFBQAAAAdhZGRyZXNzBQAAAAdhc3NldElkBQAAABBhc3NldFJld2FyZERlbHRhBQAAAAZyZXdhcmQFAAAAEWFzc2V0RmFybWluZ1Bvd2VyCQAFFAAAAAIJAAROAAAAAgUAAAAGcmVzdWx0CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAhhZGRyZXNzXwkABCUAAAABCAUAAAABaQAAAAZjYWxsZXICAAAAEl9wZXJjaGVzQXZhaWxhYmxlXwUAAAAFY29sb3IJAABkAAAAAgkBAAAADXRyeUdldEludGVnZXIAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAhhZGRyZXNzXwkABCUAAAABCAUAAAABaQAAAAZjYWxsZXICAAAAEl9wZXJjaGVzQXZhaWxhYmxlXwUAAAAFY29sb3IAAAAAAAAAAAEJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyCQAAaAAAAAIFAAAABnJld2FyZAAAAAAAAA9CQAUAAAALZWdnc0Fzc2V0SWQJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyAAAAAAAAAAABBQAAAAdhc3NldElkBQAAAANuaWwJAABoAAAAAgUAAAAGcmV3YXJkAAAAAAAAD0JACQAAAgAAAAECAAAAAAAAAAFpAQAAAAtjbGFpbVJld2FyZAAAAAEAAAAFYXNzZXQDCQEAAAARaXNVc2VyQmxhY2tsaXN0ZWQAAAABCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgkAAAIAAAABAgAAANNPb29wcywgbG9va3MgbGlrZSB5b3UgbG9zdCBpbiBvbmUgb2YgdGhlIER1Y2tzcXVpZCBnYW1lcyEgQXMgeW91IGFscmVhZHkga25vdywgYW55IGxvc3MgaGFzIGl0cyBjb25zZXF1ZW5jZXMsIHNvIHlvdSB3aWxsIGJlIG5vdCBhYmxlIHRvIGNsYWltIHlvdXIgZmFybWluZyByZXdhcmRzIHRpbGwgdGhlIGVuZCBvZiBEdWNrU3F1aWQgZ2FtZS4gUXVhY2sgaW4gcGVhY2UhAwkAAGYAAAACCQEAAAAIaXNMb2NrZWQAAAAAAAAAAAAAAAAACQAAAgAAAAECAAAAJUVHRyBvcGVyYXRpb25zIGFyZSB0ZW1wb3JhcmlseSBsb2NrZWQEAAAAB2FkZHJlc3MJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyBAAAAAdhc3NldElkCQACWQAAAAEFAAAABWFzc2V0BAAAABFhc3NldEZhcm1pbmdQb3dlcgkBAAAAHWdldExhc3RLbm93bkFzc2V0RmFybWluZ1Bvd2VyAAAAAgUAAAAHYWRkcmVzcwUAAAAFYXNzZXQEAAAAEGFzc2V0UmV3YXJkRGVsdGEJAQAAABRjYWxjQXNzZXRSZXdhcmREZWx0YQAAAAMFAAAAB2FkZHJlc3MFAAAABWFzc2V0BQAAABFhc3NldEZhcm1pbmdQb3dlcgQAAAAMZmFybWVkQW1vdW50CQAAZAAAAAIFAAAAEGFzc2V0UmV3YXJkRGVsdGEJAQAAAA10cnlHZXRJbnRlZ2VyAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAhhZGRyZXNzXwUAAAAHYWRkcmVzcwIAAAAHX2Fzc2V0XwUAAAAFYXNzZXQCAAAAFl9sYXN0Q2hlY2tGYXJtZWRBbW91bnQEAAAAD3dpdGhkcmF3bkFtb3VudAkBAAAADXRyeUdldEludGVnZXIAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAACGFkZHJlc3NfBQAAAAdhZGRyZXNzAgAAAAdfYXNzZXRfBQAAAAVhc3NldAIAAAAQX3dpdGhkcmF3bkFtb3VudAQAAAAGcmV3YXJkCQAAaQAAAAIJAABlAAAAAgUAAAAMZmFybWVkQW1vdW50BQAAAA93aXRoZHJhd25BbW91bnQJAABoAAAAAgUAAAAFc2NhbGUAAAAAAAAAAGQDCQAAZwAAAAIAAAAAAAAAAAAFAAAABnJld2FyZAkAAAIAAAABAgAAABx5b3UgaGF2ZSBubyBFR0dzIHRvIHdpdGhkcmF3CQAFFAAAAAIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAIYWRkcmVzc18FAAAAB2FkZHJlc3MCAAAAB19hc3NldF8FAAAABWFzc2V0AgAAABBfd2l0aGRyYXduQW1vdW50CQAAZAAAAAIJAQAAAA10cnlHZXRJbnRlZ2VyAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAhhZGRyZXNzXwUAAAAHYWRkcmVzcwIAAAAHX2Fzc2V0XwUAAAAFYXNzZXQCAAAAEF93aXRoZHJhd25BbW91bnQJAABoAAAAAgUAAAAGcmV3YXJkBQAAAAZzY2FsZTIJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwkBAAAAB0FkZHJlc3MAAAABCQACWQAAAAEFAAAAB2FkZHJlc3MJAABoAAAAAgUAAAAGcmV3YXJkAAAAAAAAD0JABQAAAAtlZ2dzQXNzZXRJZAUAAAADbmlsCQAAaAAAAAIFAAAABnJld2FyZAAAAAAAAA9CQAAAAABLkZJE", "height": 3042924, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 9Zwn187BrkcBovLg9cvGqjvXPMfgGBbBVQMptqWpyD69 Next: 34hC1nFCpYA11V1ymfoMxAUSwJvs5oUwX47xoH7jc4yG Diff:
Old | New | Differences | |
---|---|---|---|
60 | 60 | func isUserBlacklisted (address) = false | |
61 | 61 | ||
62 | 62 | ||
63 | - | func isSymbolA (accumulated,sym) = if ((sym == "A")) | |
64 | - | then (accumulated + 1) | |
65 | - | else (accumulated + 0) | |
66 | - | ||
67 | - | ||
68 | - | func isSymbolB (accumulated,sym) = if ((sym == "B")) | |
69 | - | then (accumulated + 1) | |
70 | - | else (accumulated + 0) | |
71 | - | ||
72 | - | ||
73 | - | func isSymbolC (accumulated,sym) = if ((sym == "C")) | |
74 | - | then (accumulated + 1) | |
75 | - | else (accumulated + 0) | |
76 | - | ||
77 | - | ||
78 | - | func isSymbolD (accumulated,sym) = if ((sym == "D")) | |
79 | - | then (accumulated + 1) | |
80 | - | else (accumulated + 0) | |
81 | - | ||
82 | - | ||
83 | - | func isSymbolE (accumulated,sym) = if ((sym == "E")) | |
84 | - | then (accumulated + 1) | |
85 | - | else (accumulated + 0) | |
86 | - | ||
87 | - | ||
88 | - | func isSymbolF (accumulated,sym) = if ((sym == "F")) | |
89 | - | then (accumulated + 1) | |
90 | - | else (accumulated + 0) | |
91 | - | ||
92 | - | ||
93 | - | func isSymbolG (accumulated,sym) = if ((sym == "G")) | |
94 | - | then (accumulated + 1) | |
95 | - | else (accumulated + 0) | |
96 | - | ||
97 | - | ||
98 | - | func isSymbolH (accumulated,sym) = if ((sym == "H")) | |
99 | - | then (accumulated + 1) | |
100 | - | else (accumulated + 0) | |
101 | - | ||
102 | - | ||
103 | - | func isSymbolI (accumulated,sym) = if ((sym == "I")) | |
104 | - | then (accumulated + 1) | |
105 | - | else (accumulated + 0) | |
106 | - | ||
107 | - | ||
108 | - | func getAmountOrClear (amount) = if (contains(amount, "0")) | |
109 | - | then "" | |
110 | - | else amount | |
111 | - | ||
112 | - | ||
113 | - | func getGen (assetName) = { | |
114 | - | let genotype = split(dropRight(drop(assetName, 5), 3), "") | |
115 | - | ((((((((getAmountOrClear((toString({ | |
116 | - | let $l = genotype | |
117 | - | let $s = size($l) | |
118 | - | let $acc0 = 0 | |
119 | - | func $f0_1 ($a,$i) = if (($i >= $s)) | |
120 | - | then $a | |
121 | - | else isSymbolA($a, $l[$i]) | |
122 | - | ||
123 | - | func $f0_2 ($a,$i) = if (($i >= $s)) | |
124 | - | then $a | |
125 | - | else throw("List size exceeds 8") | |
126 | - | ||
127 | - | $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8) | |
128 | - | }) + "A")) + getAmountOrClear((toString({ | |
129 | - | let $l = genotype | |
130 | - | let $s = size($l) | |
131 | - | let $acc0 = 0 | |
132 | - | func $f1_1 ($a,$i) = if (($i >= $s)) | |
133 | - | then $a | |
134 | - | else isSymbolB($a, $l[$i]) | |
135 | - | ||
136 | - | func $f1_2 ($a,$i) = if (($i >= $s)) | |
137 | - | then $a | |
138 | - | else throw("List size exceeds 8") | |
139 | - | ||
140 | - | $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8) | |
141 | - | }) + "B"))) + getAmountOrClear((toString({ | |
142 | - | let $l = genotype | |
143 | - | let $s = size($l) | |
144 | - | let $acc0 = 0 | |
145 | - | func $f2_1 ($a,$i) = if (($i >= $s)) | |
146 | - | then $a | |
147 | - | else isSymbolC($a, $l[$i]) | |
148 | - | ||
149 | - | func $f2_2 ($a,$i) = if (($i >= $s)) | |
150 | - | then $a | |
151 | - | else throw("List size exceeds 8") | |
152 | - | ||
153 | - | $f2_2($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8) | |
154 | - | }) + "C"))) + getAmountOrClear((toString({ | |
155 | - | let $l = genotype | |
156 | - | let $s = size($l) | |
157 | - | let $acc0 = 0 | |
158 | - | func $f3_1 ($a,$i) = if (($i >= $s)) | |
159 | - | then $a | |
160 | - | else isSymbolD($a, $l[$i]) | |
161 | - | ||
162 | - | func $f3_2 ($a,$i) = if (($i >= $s)) | |
163 | - | then $a | |
164 | - | else throw("List size exceeds 8") | |
165 | - | ||
166 | - | $f3_2($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8) | |
167 | - | }) + "D"))) + getAmountOrClear((toString({ | |
168 | - | let $l = genotype | |
169 | - | let $s = size($l) | |
170 | - | let $acc0 = 0 | |
171 | - | func $f4_1 ($a,$i) = if (($i >= $s)) | |
172 | - | then $a | |
173 | - | else isSymbolE($a, $l[$i]) | |
174 | - | ||
175 | - | func $f4_2 ($a,$i) = if (($i >= $s)) | |
176 | - | then $a | |
177 | - | else throw("List size exceeds 8") | |
178 | - | ||
179 | - | $f4_2($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8) | |
180 | - | }) + "E"))) + getAmountOrClear((toString({ | |
181 | - | let $l = genotype | |
182 | - | let $s = size($l) | |
183 | - | let $acc0 = 0 | |
184 | - | func $f5_1 ($a,$i) = if (($i >= $s)) | |
185 | - | then $a | |
186 | - | else isSymbolF($a, $l[$i]) | |
187 | - | ||
188 | - | func $f5_2 ($a,$i) = if (($i >= $s)) | |
189 | - | then $a | |
190 | - | else throw("List size exceeds 8") | |
191 | - | ||
192 | - | $f5_2($f5_1($f5_1($f5_1($f5_1($f5_1($f5_1($f5_1($f5_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8) | |
193 | - | }) + "F"))) + getAmountOrClear((toString({ | |
194 | - | let $l = genotype | |
195 | - | let $s = size($l) | |
196 | - | let $acc0 = 0 | |
197 | - | func $f6_1 ($a,$i) = if (($i >= $s)) | |
198 | - | then $a | |
199 | - | else isSymbolG($a, $l[$i]) | |
200 | - | ||
201 | - | func $f6_2 ($a,$i) = if (($i >= $s)) | |
202 | - | then $a | |
203 | - | else throw("List size exceeds 8") | |
204 | - | ||
205 | - | $f6_2($f6_1($f6_1($f6_1($f6_1($f6_1($f6_1($f6_1($f6_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8) | |
206 | - | }) + "G"))) + getAmountOrClear((toString({ | |
207 | - | let $l = genotype | |
208 | - | let $s = size($l) | |
209 | - | let $acc0 = 0 | |
210 | - | func $f7_1 ($a,$i) = if (($i >= $s)) | |
211 | - | then $a | |
212 | - | else isSymbolH($a, $l[$i]) | |
213 | - | ||
214 | - | func $f7_2 ($a,$i) = if (($i >= $s)) | |
215 | - | then $a | |
216 | - | else throw("List size exceeds 8") | |
217 | - | ||
218 | - | $f7_2($f7_1($f7_1($f7_1($f7_1($f7_1($f7_1($f7_1($f7_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8) | |
219 | - | }) + "H"))) + getAmountOrClear((toString({ | |
220 | - | let $l = genotype | |
221 | - | let $s = size($l) | |
222 | - | let $acc0 = 0 | |
223 | - | func $f8_1 ($a,$i) = if (($i >= $s)) | |
224 | - | then $a | |
225 | - | else isSymbolI($a, $l[$i]) | |
226 | - | ||
227 | - | func $f8_2 ($a,$i) = if (($i >= $s)) | |
228 | - | then $a | |
229 | - | else throw("List size exceeds 8") | |
230 | - | ||
231 | - | $f8_2($f8_1($f8_1($f8_1($f8_1($f8_1($f8_1($f8_1($f8_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8) | |
232 | - | }) + "I"))) | |
233 | - | } | |
234 | - | ||
235 | - | ||
236 | 63 | func getAssetOrigin (generation) = if ((generation == "G")) | |
237 | 64 | then incubatorAddress | |
238 | 65 | else breederAddress | |
247 | 74 | } | |
248 | 75 | ||
249 | 76 | ||
77 | + | func asString (value) = match value { | |
78 | + | case string: String => | |
79 | + | string | |
80 | + | case _ => | |
81 | + | throw("wrong type, expected: String") | |
82 | + | } | |
83 | + | ||
84 | + | ||
250 | 85 | func getAssetFarmingPower (assetId) = if (if ((value(assetInfo(assetId)).issuer == Address(breederAddress))) | |
251 | 86 | then true | |
252 | 87 | else (value(assetInfo(assetId)).issuer == Address(incubatorAddress))) | |
253 | 88 | then { | |
254 | 89 | let assetName = value(assetInfo(assetId)).name | |
255 | 90 | let generation = take(takeRight(assetName, 2), 1) | |
256 | - | let gen = ((getGen(assetName) + "-") + generation) | |
257 | - | $Tuple2(gen, getAssetRarity(gen, generation)) | |
91 | + | let farmGen = asString(invoke(Address(breederAddress), "getGenFromName", [assetName], nil)) | |
92 | + | if ((farmGen == farmGen)) | |
93 | + | then { | |
94 | + | let gen = ((farmGen + "-") + generation) | |
95 | + | $Tuple2(gen, getAssetRarity(gen, generation)) | |
96 | + | } | |
97 | + | else throw("Strict value is not equal to itself.") | |
258 | 98 | } | |
259 | 99 | else throw("not valid NFT") | |
260 | 100 | ||
334 | 174 | then throw("you need to set color properly") | |
335 | 175 | else { | |
336 | 176 | let firstPayment = value(i.payments[0]) | |
337 | - | let exactPrice = calculatePerchPrice( | |
177 | + | let exactPrice = calculatePerchPrice(toString(i.caller)) | |
338 | 178 | if ((firstPayment.assetId != eggsAssetId)) | |
339 | 179 | then throw(("You can attach only EGG tokens with the following asset id: " + toBase58String(eggsAssetId))) | |
340 | 180 | else if ((firstPayment.amount != exactPrice)) | |
385 | 225 | else if ((0 >= availablePerches)) | |
386 | 226 | then throw(("no perches available for the color " + color)) | |
387 | 227 | else { | |
388 | - | let $ | |
389 | - | let assetGen = $ | |
390 | - | let assetFarmingPower = $ | |
228 | + | let $t084208485 = getAssetFarmingPower(assetId) | |
229 | + | let assetGen = $t084208485._1 | |
230 | + | let assetFarmingPower = $t084208485._2 | |
391 | 231 | let assetRewardDelta = calcAssetRewardDelta(address, toBase58String(assetId), assetFarmingPower) | |
392 | 232 | (getStakeResult(address, assetId, assetFarmingPower) ++ [IntegerEntry(((("address_" + toString(i.caller)) + "_perchesAvailable_") + color), (availablePerches - 1))]) | |
393 | 233 | } | |
490 | 330 | } | |
491 | 331 | ||
492 | 332 | ||
493 | - | @Verifier(tx) | |
494 | - | func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) | |
495 | - |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 5 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | let eggsAssetId = base58'3v7zGkeHS6KrsvmTRzEzvCxm5cdzkCtM7z5cM6efcjCB' | |
5 | 5 | ||
6 | 6 | let perchPrice = (100 * 1000000) | |
7 | 7 | ||
8 | 8 | let scale = 10000 | |
9 | 9 | ||
10 | 10 | let scale2 = 1000000 | |
11 | 11 | ||
12 | 12 | let incubatorAddress = base58'3P6TwNU39Ykkbeqhn5TE4a2736xsA1vXemM' | |
13 | 13 | ||
14 | 14 | let breederAddress = base58'3P9REuLBnYBafDqtEu6hfzs2Rv2haSU158y' | |
15 | 15 | ||
16 | 16 | let swopPromoAddress = base58'3P6s9C39Ak5FAQ3F5VapYJ3ULxgbsAReXWD' | |
17 | 17 | ||
18 | 18 | let refContractAddress = base58'3PGZyyPg7Mx91yaNT8k3MWxSQzuzusMUyzX' | |
19 | 19 | ||
20 | 20 | let RefererReward = 5 | |
21 | 21 | ||
22 | 22 | let rebirthAddress = base58'3PKL9tfUmNciXvbSA3zpXr6PnDNnhn936ba' | |
23 | 23 | ||
24 | 24 | func getRewardPerBlock () = 684 | |
25 | 25 | ||
26 | 26 | ||
27 | 27 | func isLocked () = { | |
28 | 28 | let masterAddress = Address(base58'3PEPftf2kWZDmAaWBjs6BUJa9957kiA2PkU') | |
29 | 29 | match getInteger(masterAddress, "egglock") { | |
30 | 30 | case b: Int => | |
31 | 31 | b | |
32 | 32 | case _ => | |
33 | 33 | 0 | |
34 | 34 | } | |
35 | 35 | } | |
36 | 36 | ||
37 | 37 | ||
38 | 38 | func tryGetInteger (key) = match getInteger(this, key) { | |
39 | 39 | case b: Int => | |
40 | 40 | b | |
41 | 41 | case _ => | |
42 | 42 | 0 | |
43 | 43 | } | |
44 | 44 | ||
45 | 45 | ||
46 | 46 | func tryGetStringExternal (address,key) = match getString(address, key) { | |
47 | 47 | case a: String => | |
48 | 48 | a | |
49 | 49 | case _ => | |
50 | 50 | "" | |
51 | 51 | } | |
52 | 52 | ||
53 | 53 | ||
54 | 54 | func tryGetString (key) = tryGetStringExternal(this, key) | |
55 | 55 | ||
56 | 56 | ||
57 | 57 | func getItemsAddress () = fromBase58String(tryGetString("static_itemsAddress")) | |
58 | 58 | ||
59 | 59 | ||
60 | 60 | func isUserBlacklisted (address) = false | |
61 | 61 | ||
62 | 62 | ||
63 | - | func isSymbolA (accumulated,sym) = if ((sym == "A")) | |
64 | - | then (accumulated + 1) | |
65 | - | else (accumulated + 0) | |
66 | - | ||
67 | - | ||
68 | - | func isSymbolB (accumulated,sym) = if ((sym == "B")) | |
69 | - | then (accumulated + 1) | |
70 | - | else (accumulated + 0) | |
71 | - | ||
72 | - | ||
73 | - | func isSymbolC (accumulated,sym) = if ((sym == "C")) | |
74 | - | then (accumulated + 1) | |
75 | - | else (accumulated + 0) | |
76 | - | ||
77 | - | ||
78 | - | func isSymbolD (accumulated,sym) = if ((sym == "D")) | |
79 | - | then (accumulated + 1) | |
80 | - | else (accumulated + 0) | |
81 | - | ||
82 | - | ||
83 | - | func isSymbolE (accumulated,sym) = if ((sym == "E")) | |
84 | - | then (accumulated + 1) | |
85 | - | else (accumulated + 0) | |
86 | - | ||
87 | - | ||
88 | - | func isSymbolF (accumulated,sym) = if ((sym == "F")) | |
89 | - | then (accumulated + 1) | |
90 | - | else (accumulated + 0) | |
91 | - | ||
92 | - | ||
93 | - | func isSymbolG (accumulated,sym) = if ((sym == "G")) | |
94 | - | then (accumulated + 1) | |
95 | - | else (accumulated + 0) | |
96 | - | ||
97 | - | ||
98 | - | func isSymbolH (accumulated,sym) = if ((sym == "H")) | |
99 | - | then (accumulated + 1) | |
100 | - | else (accumulated + 0) | |
101 | - | ||
102 | - | ||
103 | - | func isSymbolI (accumulated,sym) = if ((sym == "I")) | |
104 | - | then (accumulated + 1) | |
105 | - | else (accumulated + 0) | |
106 | - | ||
107 | - | ||
108 | - | func getAmountOrClear (amount) = if (contains(amount, "0")) | |
109 | - | then "" | |
110 | - | else amount | |
111 | - | ||
112 | - | ||
113 | - | func getGen (assetName) = { | |
114 | - | let genotype = split(dropRight(drop(assetName, 5), 3), "") | |
115 | - | ((((((((getAmountOrClear((toString({ | |
116 | - | let $l = genotype | |
117 | - | let $s = size($l) | |
118 | - | let $acc0 = 0 | |
119 | - | func $f0_1 ($a,$i) = if (($i >= $s)) | |
120 | - | then $a | |
121 | - | else isSymbolA($a, $l[$i]) | |
122 | - | ||
123 | - | func $f0_2 ($a,$i) = if (($i >= $s)) | |
124 | - | then $a | |
125 | - | else throw("List size exceeds 8") | |
126 | - | ||
127 | - | $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8) | |
128 | - | }) + "A")) + getAmountOrClear((toString({ | |
129 | - | let $l = genotype | |
130 | - | let $s = size($l) | |
131 | - | let $acc0 = 0 | |
132 | - | func $f1_1 ($a,$i) = if (($i >= $s)) | |
133 | - | then $a | |
134 | - | else isSymbolB($a, $l[$i]) | |
135 | - | ||
136 | - | func $f1_2 ($a,$i) = if (($i >= $s)) | |
137 | - | then $a | |
138 | - | else throw("List size exceeds 8") | |
139 | - | ||
140 | - | $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8) | |
141 | - | }) + "B"))) + getAmountOrClear((toString({ | |
142 | - | let $l = genotype | |
143 | - | let $s = size($l) | |
144 | - | let $acc0 = 0 | |
145 | - | func $f2_1 ($a,$i) = if (($i >= $s)) | |
146 | - | then $a | |
147 | - | else isSymbolC($a, $l[$i]) | |
148 | - | ||
149 | - | func $f2_2 ($a,$i) = if (($i >= $s)) | |
150 | - | then $a | |
151 | - | else throw("List size exceeds 8") | |
152 | - | ||
153 | - | $f2_2($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8) | |
154 | - | }) + "C"))) + getAmountOrClear((toString({ | |
155 | - | let $l = genotype | |
156 | - | let $s = size($l) | |
157 | - | let $acc0 = 0 | |
158 | - | func $f3_1 ($a,$i) = if (($i >= $s)) | |
159 | - | then $a | |
160 | - | else isSymbolD($a, $l[$i]) | |
161 | - | ||
162 | - | func $f3_2 ($a,$i) = if (($i >= $s)) | |
163 | - | then $a | |
164 | - | else throw("List size exceeds 8") | |
165 | - | ||
166 | - | $f3_2($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8) | |
167 | - | }) + "D"))) + getAmountOrClear((toString({ | |
168 | - | let $l = genotype | |
169 | - | let $s = size($l) | |
170 | - | let $acc0 = 0 | |
171 | - | func $f4_1 ($a,$i) = if (($i >= $s)) | |
172 | - | then $a | |
173 | - | else isSymbolE($a, $l[$i]) | |
174 | - | ||
175 | - | func $f4_2 ($a,$i) = if (($i >= $s)) | |
176 | - | then $a | |
177 | - | else throw("List size exceeds 8") | |
178 | - | ||
179 | - | $f4_2($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8) | |
180 | - | }) + "E"))) + getAmountOrClear((toString({ | |
181 | - | let $l = genotype | |
182 | - | let $s = size($l) | |
183 | - | let $acc0 = 0 | |
184 | - | func $f5_1 ($a,$i) = if (($i >= $s)) | |
185 | - | then $a | |
186 | - | else isSymbolF($a, $l[$i]) | |
187 | - | ||
188 | - | func $f5_2 ($a,$i) = if (($i >= $s)) | |
189 | - | then $a | |
190 | - | else throw("List size exceeds 8") | |
191 | - | ||
192 | - | $f5_2($f5_1($f5_1($f5_1($f5_1($f5_1($f5_1($f5_1($f5_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8) | |
193 | - | }) + "F"))) + getAmountOrClear((toString({ | |
194 | - | let $l = genotype | |
195 | - | let $s = size($l) | |
196 | - | let $acc0 = 0 | |
197 | - | func $f6_1 ($a,$i) = if (($i >= $s)) | |
198 | - | then $a | |
199 | - | else isSymbolG($a, $l[$i]) | |
200 | - | ||
201 | - | func $f6_2 ($a,$i) = if (($i >= $s)) | |
202 | - | then $a | |
203 | - | else throw("List size exceeds 8") | |
204 | - | ||
205 | - | $f6_2($f6_1($f6_1($f6_1($f6_1($f6_1($f6_1($f6_1($f6_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8) | |
206 | - | }) + "G"))) + getAmountOrClear((toString({ | |
207 | - | let $l = genotype | |
208 | - | let $s = size($l) | |
209 | - | let $acc0 = 0 | |
210 | - | func $f7_1 ($a,$i) = if (($i >= $s)) | |
211 | - | then $a | |
212 | - | else isSymbolH($a, $l[$i]) | |
213 | - | ||
214 | - | func $f7_2 ($a,$i) = if (($i >= $s)) | |
215 | - | then $a | |
216 | - | else throw("List size exceeds 8") | |
217 | - | ||
218 | - | $f7_2($f7_1($f7_1($f7_1($f7_1($f7_1($f7_1($f7_1($f7_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8) | |
219 | - | }) + "H"))) + getAmountOrClear((toString({ | |
220 | - | let $l = genotype | |
221 | - | let $s = size($l) | |
222 | - | let $acc0 = 0 | |
223 | - | func $f8_1 ($a,$i) = if (($i >= $s)) | |
224 | - | then $a | |
225 | - | else isSymbolI($a, $l[$i]) | |
226 | - | ||
227 | - | func $f8_2 ($a,$i) = if (($i >= $s)) | |
228 | - | then $a | |
229 | - | else throw("List size exceeds 8") | |
230 | - | ||
231 | - | $f8_2($f8_1($f8_1($f8_1($f8_1($f8_1($f8_1($f8_1($f8_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8) | |
232 | - | }) + "I"))) | |
233 | - | } | |
234 | - | ||
235 | - | ||
236 | 63 | func getAssetOrigin (generation) = if ((generation == "G")) | |
237 | 64 | then incubatorAddress | |
238 | 65 | else breederAddress | |
239 | 66 | ||
240 | 67 | ||
241 | 68 | func getAssetRarity (genotype,generation) = { | |
242 | 69 | let quantity = getIntegerValue(Address(getAssetOrigin(generation)), (("stats_" + genotype) + "_quantity")) | |
243 | 70 | let power = pow((10000 / quantity), 4, 5, 1, 2, FLOOR) | |
244 | 71 | if ((power > 0)) | |
245 | 72 | then power | |
246 | 73 | else 2 | |
247 | 74 | } | |
248 | 75 | ||
249 | 76 | ||
77 | + | func asString (value) = match value { | |
78 | + | case string: String => | |
79 | + | string | |
80 | + | case _ => | |
81 | + | throw("wrong type, expected: String") | |
82 | + | } | |
83 | + | ||
84 | + | ||
250 | 85 | func getAssetFarmingPower (assetId) = if (if ((value(assetInfo(assetId)).issuer == Address(breederAddress))) | |
251 | 86 | then true | |
252 | 87 | else (value(assetInfo(assetId)).issuer == Address(incubatorAddress))) | |
253 | 88 | then { | |
254 | 89 | let assetName = value(assetInfo(assetId)).name | |
255 | 90 | let generation = take(takeRight(assetName, 2), 1) | |
256 | - | let gen = ((getGen(assetName) + "-") + generation) | |
257 | - | $Tuple2(gen, getAssetRarity(gen, generation)) | |
91 | + | let farmGen = asString(invoke(Address(breederAddress), "getGenFromName", [assetName], nil)) | |
92 | + | if ((farmGen == farmGen)) | |
93 | + | then { | |
94 | + | let gen = ((farmGen + "-") + generation) | |
95 | + | $Tuple2(gen, getAssetRarity(gen, generation)) | |
96 | + | } | |
97 | + | else throw("Strict value is not equal to itself.") | |
258 | 98 | } | |
259 | 99 | else throw("not valid NFT") | |
260 | 100 | ||
261 | 101 | ||
262 | 102 | func getLastKnownAssetFarmingPower (address,assetId) = tryGetInteger((((("address_" + address) + "_asset_") + assetId) + "_farmingPower")) | |
263 | 103 | ||
264 | 104 | ||
265 | 105 | func getAssetsByGen (gen) = { | |
266 | 106 | let s = tryGetString(("assets_" + gen)) | |
267 | 107 | if ((s == "")) | |
268 | 108 | then nil | |
269 | 109 | else split(s, ",") | |
270 | 110 | } | |
271 | 111 | ||
272 | 112 | ||
273 | 113 | func calcInterest (previousInterest,previousInterestHeight,totalFarmingPower) = (previousInterest + (((scale * getRewardPerBlock()) * (height - previousInterestHeight)) / totalFarmingPower)) | |
274 | 114 | ||
275 | 115 | ||
276 | 116 | func getCurrentInterest () = if ((tryGetInteger("total_farmingPower") > 0)) | |
277 | 117 | then { | |
278 | 118 | let previousInterest = tryGetInteger("total_lastCheckInterest") | |
279 | 119 | let previousInterestHeight = tryGetInteger("total_lastCheckInterestHeight") | |
280 | 120 | let totalFarmingPower = tryGetInteger("total_farmingPower") | |
281 | 121 | calcInterest(previousInterest, previousInterestHeight, totalFarmingPower) | |
282 | 122 | } | |
283 | 123 | else if ((tryGetInteger("total_startHeight") != 0)) | |
284 | 124 | then tryGetInteger("total_lastCheckInterest") | |
285 | 125 | else throw("farming is not launched, yet") | |
286 | 126 | ||
287 | 127 | ||
288 | 128 | func calcAssetRewardDelta (address,assetId,assetFarmingPower) = { | |
289 | 129 | let lastCheckAssetInterest = tryGetInteger((((("address_" + address) + "_asset_") + assetId) + "_lastCheckInterest")) | |
290 | 130 | let currentInterest = getCurrentInterest() | |
291 | 131 | (assetFarmingPower * (currentInterest - lastCheckAssetInterest)) | |
292 | 132 | } | |
293 | 133 | ||
294 | 134 | ||
295 | 135 | func addAssetIdToGenEntry (assetId,assetGen) = { | |
296 | 136 | let currentValue = tryGetString((("assets_" + assetGen) + "_locked")) | |
297 | 137 | if ((currentValue == "")) | |
298 | 138 | then assetId | |
299 | 139 | else ((currentValue + ",") + assetId) | |
300 | 140 | } | |
301 | 141 | ||
302 | 142 | ||
303 | 143 | func getStakeResult (address,assetId,assetFarmingPower) = { | |
304 | 144 | let asset = toBase58String(assetId) | |
305 | 145 | [IntegerEntry("total_farmingPower", (tryGetInteger("total_farmingPower") + assetFarmingPower)), IntegerEntry("total_lastCheckInterest", getCurrentInterest()), IntegerEntry("total_lastCheckInterestHeight", height), IntegerEntry((((("address_" + address) + "_asset_") + asset) + "_farmingPower"), assetFarmingPower), IntegerEntry((((("address_" + address) + "_asset_") + asset) + "_lastCheckInterest"), getCurrentInterest())] | |
306 | 146 | } | |
307 | 147 | ||
308 | 148 | ||
309 | 149 | func getUnstakeResult (address,assetId,rewardDelta,withdrawnAmount,assetFarmingPower) = { | |
310 | 150 | let asset = toBase58String(assetId) | |
311 | 151 | [IntegerEntry("total_farmingPower", (tryGetInteger("total_farmingPower") - assetFarmingPower)), IntegerEntry("total_lastCheckInterest", getCurrentInterest()), IntegerEntry("total_lastCheckInterestHeight", height), IntegerEntry((((("address_" + address) + "_asset_") + asset) + "_farmingPower"), 0), IntegerEntry((((("address_" + address) + "_asset_") + asset) + "_lastCheckInterest"), getCurrentInterest()), IntegerEntry((((("address_" + address) + "_asset_") + asset) + "_withdrawnAmount"), (tryGetInteger((((("address_" + address) + "_asset_") + asset) + "_withdrawnAmount")) + (withdrawnAmount * scale2))), IntegerEntry((((("address_" + address) + "_asset_") + asset) + "_lastCheckFarmedAmount"), (tryGetInteger((((("address_" + address) + "_asset_") + asset) + "_lastCheckFarmedAmount")) + rewardDelta))] | |
312 | 152 | } | |
313 | 153 | ||
314 | 154 | ||
315 | 155 | func calculatePerchPrice (address) = { | |
316 | 156 | let hasArtefactStaked = tryGetStringExternal(Address(getItemsAddress()), (("ART-XMISTL_" + address) + "_owner")) | |
317 | 157 | if ((hasArtefactStaked == "")) | |
318 | 158 | then perchPrice | |
319 | 159 | else ((perchPrice / 10) * 9) | |
320 | 160 | } | |
321 | 161 | ||
322 | 162 | ||
323 | 163 | @Callable(i) | |
324 | 164 | func init () = if ((i.caller != this)) | |
325 | 165 | then throw("admin only") | |
326 | 166 | else [IntegerEntry("total_startHeight", height)] | |
327 | 167 | ||
328 | 168 | ||
329 | 169 | ||
330 | 170 | @Callable(i) | |
331 | 171 | func buyPerch (color,refererAddress) = if ((isLocked() > 0)) | |
332 | 172 | then throw("EGG operations are temporarily locked") | |
333 | 173 | else if ((0 > value(indexOf(["B", "R", "G", "Y"], color)))) | |
334 | 174 | then throw("you need to set color properly") | |
335 | 175 | else { | |
336 | 176 | let firstPayment = value(i.payments[0]) | |
337 | - | let exactPrice = calculatePerchPrice( | |
177 | + | let exactPrice = calculatePerchPrice(toString(i.caller)) | |
338 | 178 | if ((firstPayment.assetId != eggsAssetId)) | |
339 | 179 | then throw(("You can attach only EGG tokens with the following asset id: " + toBase58String(eggsAssetId))) | |
340 | 180 | else if ((firstPayment.amount != exactPrice)) | |
341 | 181 | then throw(("To buy a perch you currently need the following amount of EGGlets: " + toString(exactPrice))) | |
342 | 182 | else { | |
343 | 183 | let refererRewardForPerch = fraction(firstPayment.amount, RefererReward, 100) | |
344 | 184 | let refCall = invoke(Address(refContractAddress), "refPayment", [refererAddress], [AttachedPayment(eggsAssetId, refererRewardForPerch)]) | |
345 | 185 | if ((refCall == refCall)) | |
346 | 186 | then { | |
347 | 187 | let perchAmountKey = ((("address_" + toString(i.caller)) + "_perchesAvailable_") + color) | |
348 | 188 | let perchAmount = tryGetInteger(perchAmountKey) | |
349 | 189 | [IntegerEntry(perchAmountKey, (perchAmount + 1))] | |
350 | 190 | } | |
351 | 191 | else throw("Strict value is not equal to itself.") | |
352 | 192 | } | |
353 | 193 | } | |
354 | 194 | ||
355 | 195 | ||
356 | 196 | ||
357 | 197 | @Callable(i) | |
358 | 198 | func addFreePerch (address,color) = if ((0 > value(indexOf(["B", "R", "G", "Y"], color)))) | |
359 | 199 | then throw("you need to set color properly") | |
360 | 200 | else if (if (if ((i.caller != Address(rebirthAddress))) | |
361 | 201 | then (i.caller != this) | |
362 | 202 | else false) | |
363 | 203 | then (i.caller != Address(swopPromoAddress)) | |
364 | 204 | else false) | |
365 | 205 | then throw("rebirth and swop promo only") | |
366 | 206 | else { | |
367 | 207 | let perchAmountKey = ((("address_" + address) + "_perchesAvailable_") + color) | |
368 | 208 | let perchAmount = tryGetInteger(perchAmountKey) | |
369 | 209 | $Tuple2([IntegerEntry(perchAmountKey, (perchAmount + 1))], "") | |
370 | 210 | } | |
371 | 211 | ||
372 | 212 | ||
373 | 213 | ||
374 | 214 | @Callable(i) | |
375 | 215 | func stakeNFT () = if ((isLocked() > 0)) | |
376 | 216 | then throw("EGG operations are temporarily locked") | |
377 | 217 | else { | |
378 | 218 | let pmt = value(i.payments[0]) | |
379 | 219 | let assetId = value(value(i.payments[0]).assetId) | |
380 | 220 | let address = toString(i.caller) | |
381 | 221 | let color = takeRight(value(assetInfo(assetId)).name, 1) | |
382 | 222 | let availablePerches = tryGetInteger(((("address_" + toString(i.caller)) + "_perchesAvailable_") + color)) | |
383 | 223 | if ((pmt.amount != 1)) | |
384 | 224 | then throw("NFT is not attached") | |
385 | 225 | else if ((0 >= availablePerches)) | |
386 | 226 | then throw(("no perches available for the color " + color)) | |
387 | 227 | else { | |
388 | - | let $ | |
389 | - | let assetGen = $ | |
390 | - | let assetFarmingPower = $ | |
228 | + | let $t084208485 = getAssetFarmingPower(assetId) | |
229 | + | let assetGen = $t084208485._1 | |
230 | + | let assetFarmingPower = $t084208485._2 | |
391 | 231 | let assetRewardDelta = calcAssetRewardDelta(address, toBase58String(assetId), assetFarmingPower) | |
392 | 232 | (getStakeResult(address, assetId, assetFarmingPower) ++ [IntegerEntry(((("address_" + toString(i.caller)) + "_perchesAvailable_") + color), (availablePerches - 1))]) | |
393 | 233 | } | |
394 | 234 | } | |
395 | 235 | ||
396 | 236 | ||
397 | 237 | ||
398 | 238 | @Callable(i) | |
399 | 239 | func unstakeNFT (asset) = if (isUserBlacklisted(toString(i.caller))) | |
400 | 240 | then throw("Ooops, looks like you lost in one of the Ducksquid games! As you already know, any loss has its consequences, so you will be not able to claim your farming rewards till the end of DuckSquid game. Quack in peace!") | |
401 | 241 | else if ((isLocked() > 0)) | |
402 | 242 | then throw("EGG operations are temporarily locked") | |
403 | 243 | else { | |
404 | 244 | let assetId = fromBase58String(asset) | |
405 | 245 | let address = toString(i.caller) | |
406 | 246 | let assetFarmingPower = getLastKnownAssetFarmingPower(address, asset) | |
407 | 247 | let assetRewardDelta = calcAssetRewardDelta(address, asset, assetFarmingPower) | |
408 | 248 | let farmedAmount = (assetRewardDelta + tryGetInteger((((("address_" + address) + "_asset_") + asset) + "_lastCheckFarmedAmount"))) | |
409 | 249 | let withdrawnAmount = tryGetInteger((((("address_" + address) + "_asset_") + asset) + "_withdrawnAmount")) | |
410 | 250 | let reward = ((farmedAmount - withdrawnAmount) / (scale * 100)) | |
411 | 251 | let color = takeRight(value(assetInfo(assetId)).name, 1) | |
412 | 252 | if ((0 >= assetFarmingPower)) | |
413 | 253 | then throw("asset not available") | |
414 | 254 | else if ((color == "U")) | |
415 | 255 | then throw("use another function to unstake Jackpot NFT") | |
416 | 256 | else { | |
417 | 257 | let result = getUnstakeResult(address, assetId, assetRewardDelta, reward, assetFarmingPower) | |
418 | 258 | $Tuple2((result ++ [IntegerEntry(((("address_" + toString(i.caller)) + "_perchesAvailable_") + color), (tryGetInteger(((("address_" + toString(i.caller)) + "_perchesAvailable_") + color)) + 1)), ScriptTransfer(i.caller, (reward * 1000000), eggsAssetId), ScriptTransfer(i.caller, 1, assetId)]), (reward * 1000000)) | |
419 | 259 | } | |
420 | 260 | } | |
421 | 261 | ||
422 | 262 | ||
423 | 263 | ||
424 | 264 | @Callable(i) | |
425 | 265 | func stakeJackpot (color) = if ((isLocked() > 0)) | |
426 | 266 | then throw("EGG operations are temporarily locked") | |
427 | 267 | else { | |
428 | 268 | let pmt = value(i.payments[0]) | |
429 | 269 | let assetId = value(pmt.assetId) | |
430 | 270 | let address = toString(i.caller) | |
431 | 271 | let availablePerches = tryGetInteger(((("address_" + toString(i.caller)) + "_perchesAvailable_") + color)) | |
432 | 272 | let assetIssuer = value(assetInfo(assetId)).issuer.bytes | |
433 | 273 | if ((pmt.amount != 1)) | |
434 | 274 | then throw("NFT is not attached") | |
435 | 275 | else if (if ((assetIssuer == incubatorAddress)) | |
436 | 276 | then true | |
437 | 277 | else (assetIssuer == breederAddress)) | |
438 | 278 | then if ((takeRight(value(value(assetInfo(assetId)).name), 1) != "U")) | |
439 | 279 | then throw("jackpot only") | |
440 | 280 | else if ((0 >= availablePerches)) | |
441 | 281 | then throw(("no perches available for the color " + color)) | |
442 | 282 | else (getStakeResult(address, assetId, 100) ++ [IntegerEntry(((("address_" + toString(i.caller)) + "_perchesAvailable_") + color), (availablePerches - 1)), StringEntry((((("address_" + toString(i.caller)) + "_asset_") + toBase58String(assetId)) + "_perchColor"), color)]) | |
443 | 283 | else throw("asset is not valid") | |
444 | 284 | } | |
445 | 285 | ||
446 | 286 | ||
447 | 287 | ||
448 | 288 | @Callable(i) | |
449 | 289 | func unstakeJackpot (asset) = if (isUserBlacklisted(toString(i.caller))) | |
450 | 290 | then throw("Ooops, looks like you lost in one of the Ducksquid games! As you already know, any loss has its consequences, so you will be not able to claim your farming rewards till the end of DuckSquid game. Quack in peace!") | |
451 | 291 | else if ((isLocked() > 0)) | |
452 | 292 | then throw("EGG operations are temporarily locked") | |
453 | 293 | else { | |
454 | 294 | let assetId = fromBase58String(asset) | |
455 | 295 | let address = toString(i.caller) | |
456 | 296 | let color = tryGetString((((("address_" + address) + "_asset_") + asset) + "_perchColor")) | |
457 | 297 | let assetFarmingPower = getLastKnownAssetFarmingPower(address, asset) | |
458 | 298 | let assetRewardDelta = calcAssetRewardDelta(address, asset, assetFarmingPower) | |
459 | 299 | let farmedAmount = (assetRewardDelta + tryGetInteger((((("address_" + address) + "_asset_") + asset) + "_lastCheckFarmedAmount"))) | |
460 | 300 | let withdrawnAmount = tryGetInteger((((("address_" + address) + "_asset_") + asset) + "_withdrawnAmount")) | |
461 | 301 | let reward = ((farmedAmount - withdrawnAmount) / (scale * 100)) | |
462 | 302 | if ((takeRight(value(value(assetInfo(assetId)).name), 1) != "U")) | |
463 | 303 | then throw("jackpot only") | |
464 | 304 | else if ((assetFarmingPower > 0)) | |
465 | 305 | then { | |
466 | 306 | let result = getUnstakeResult(address, assetId, assetRewardDelta, reward, assetFarmingPower) | |
467 | 307 | $Tuple2((result ++ [IntegerEntry(((("address_" + toString(i.caller)) + "_perchesAvailable_") + color), (tryGetInteger(((("address_" + toString(i.caller)) + "_perchesAvailable_") + color)) + 1)), ScriptTransfer(i.caller, (reward * 1000000), eggsAssetId), ScriptTransfer(i.caller, 1, assetId)]), (reward * 1000000)) | |
468 | 308 | } | |
469 | 309 | else throw("") | |
470 | 310 | } | |
471 | 311 | ||
472 | 312 | ||
473 | 313 | ||
474 | 314 | @Callable(i) | |
475 | 315 | func claimReward (asset) = if (isUserBlacklisted(toString(i.caller))) | |
476 | 316 | then throw("Ooops, looks like you lost in one of the Ducksquid games! As you already know, any loss has its consequences, so you will be not able to claim your farming rewards till the end of DuckSquid game. Quack in peace!") | |
477 | 317 | else if ((isLocked() > 0)) | |
478 | 318 | then throw("EGG operations are temporarily locked") | |
479 | 319 | else { | |
480 | 320 | let address = toString(i.caller) | |
481 | 321 | let assetId = fromBase58String(asset) | |
482 | 322 | let assetFarmingPower = getLastKnownAssetFarmingPower(address, asset) | |
483 | 323 | let assetRewardDelta = calcAssetRewardDelta(address, asset, assetFarmingPower) | |
484 | 324 | let farmedAmount = (assetRewardDelta + tryGetInteger((((("address_" + address) + "_asset_") + asset) + "_lastCheckFarmedAmount"))) | |
485 | 325 | let withdrawnAmount = tryGetInteger((((("address_" + address) + "_asset_") + asset) + "_withdrawnAmount")) | |
486 | 326 | let reward = ((farmedAmount - withdrawnAmount) / (scale * 100)) | |
487 | 327 | if ((0 >= reward)) | |
488 | 328 | then throw("you have no EGGs to withdraw") | |
489 | 329 | else $Tuple2([IntegerEntry((((("address_" + address) + "_asset_") + asset) + "_withdrawnAmount"), (tryGetInteger((((("address_" + address) + "_asset_") + asset) + "_withdrawnAmount")) + (reward * scale2))), ScriptTransfer(Address(fromBase58String(address)), (reward * 1000000), eggsAssetId)], (reward * 1000000)) | |
490 | 330 | } | |
491 | 331 | ||
492 | 332 | ||
493 | - | @Verifier(tx) | |
494 | - | func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) | |
495 | - |
github/deemru/w8io/6500d08 71.53 ms ◑