tx · AidDSdTaQpnve98VSxJd3jVnTDLyuJoTwJyUyFdnPRaP

3GgTgarB4mvEUWB2VaZZR2eAuCccpK9f1FZ:  -0.07000000 Gic

2025.06.12 04:55 [5826] smart account 3GgTgarB4mvEUWB2VaZZR2eAuCccpK9f1FZ > SELF 0.00000000 Gic

{ "type": 13, "id": "AidDSdTaQpnve98VSxJd3jVnTDLyuJoTwJyUyFdnPRaP", "fee": 7000000, "feeAssetId": null, "timestamp": 1749693414350, "version": 2, "chainId": 71, "sender": "3GgTgarB4mvEUWB2VaZZR2eAuCccpK9f1FZ", "senderPublicKey": "8dNEACURBe9HFX8kgDH2MVb1mxkFC7Txoqvi4ymdPiNd", "proofs": [ "2y9oXZub1HAQkquNYhoyZJXo9NT9iBzQrKiMDQujtjShMpq7aNZTgxViQZLXwKzfqjyYqPjNfUXxzcGUkgHps6wH" ], "script": "base64:AAIFAAAAAAAAAGQIAhIGCgQICAEEEgMKAQgSAwoBBBIGCgQEBAQEEgMKAQESBAoCCAQSBwoFCAgBAQESBAoCCAgSBQoDCAgIEgQKAggIEgUKAwgIARIFCgMICAESBAoCCAgSBAoCCAgSBQoDCAgBAAAAJgAAAAAEbWFpbgIAAAAKbWFpbl9hc3NldAAAAAAMYWRtaW5BZGRyZXNzAgAAAA1hZG1pbl9hZGRyZXNzAAAAAAJscAIAAAAJbHBfYXNzZXRfAAAAAARwb29sAgAAAAZwb29sX18AAAAABGZhcm0CAAAABmZhcm1fXwAAAAAGc3Rha2VkAgAAAAdzdGFrZWRfAAAAAA1yZXdhcmRDbGFpbWVkAgAAAA9yZXdhcmRfY2xhaW1lZF8AAAAADWRlcG9zaXRIZWlnaHQCAAAAD2RlcG9zaXRfaGVpZ2h0XwAAAAAKZmFybUhlaWdodAIAAAAMZmFybV9oZWlnaHRfAAAAAAt0b3RhbExvY2tlZAIAAAANdG90YWxfbG9ja2VkXwAAAAAHc3dhcEZlZQIAAAAIc3dhcF9mZWUAAAAADmZhcm1SZXdhcmRQb29sAgAAABFmYXJtX3Jld2FyZF9wb29sXwAAAAAHZmFybUFwcgIAAAAJZmFybV9hcHJfAAAAAA5mYXJtTG9ja0Jsb2NrcwIAAAARZmFybV9sb2NrX2Jsb2Nrc18AAAAAD2Zhcm1Ub3RhbFN0YWtlZAIAAAASZmFybV90b3RhbF9zdGFrZWRfAAAAABFibGFja2xpc3RlZFRva2VucwIAAAAMYmxhY2tsaXN0ZWRfAAAAAA50b3RhbFVzZXJzRmFybQIAAAARdG90YWxfdXNlcnNfZmFybV8AAAAAAkQ4AAAAAAAF9eEAAAAAAA9jb250cmFjdEFkZHJlc3MJAQAAAAdBZGRyZXNzAAAAAQgFAAAABHRoaXMAAAAFYnl0ZXMAAAAAAmFjAgAAAAhhY3RpdmF0ZQAAAAAGcG9vbEFjAgAAAA5hY3RpdmF0ZV9wb29scwAAAAAGc3dhcEFjAgAAAA1hY3RpdmF0ZV9zd2FwAAAAAAtsaXF1aWRpdHlBYwIAAAASYWN0aXZhdGVfbGlxdWlkaXR5AAAAAAZmYXJtQWMCAAAADmFjdGl2YXRlX2Zhcm1zAQAAAAJrcAAAAAIAAAAGYXNzZXQxAAAABmFzc2V0MgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgUAAAAEcG9vbAUAAAAGYXNzZXQxAgAAAAFfBQAAAAZhc3NldDIBAAAAAmZrAAAAAgAAAAZhc3NldDEAAAAGYXNzZXQyCQABLAAAAAIJAAEsAAAAAgkAASwAAAACBQAAAARmYXJtBQAAAAZhc3NldDECAAAAAV8FAAAABmFzc2V0MgEAAAACc2sAAAADAAAABmFzc2V0MQAAAAZhc3NldDIAAAAHYWRkcmVzcwkAASwAAAACCQABLAAAAAIJAAEsAAAAAgUAAAAGc3Rha2VkCQEAAAACa3AAAAACBQAAAAZhc3NldDEFAAAABmFzc2V0MgIAAAABXwUAAAAHYWRkcmVzcwEAAAACcmsAAAADAAAABmFzc2V0MQAAAAZhc3NldDIAAAAHYWRkcmVzcwkAASwAAAACCQABLAAAAAIJAAEsAAAAAgUAAAANcmV3YXJkQ2xhaW1lZAkBAAAAAmtwAAAAAgUAAAAGYXNzZXQxBQAAAAZhc3NldDICAAAAAV8FAAAAB2FkZHJlc3MBAAAAAmRoAAAAAwAAAAZhc3NldDEAAAAGYXNzZXQyAAAAB2FkZHJlc3MJAAEsAAAAAgkAASwAAAACCQABLAAAAAIFAAAADWRlcG9zaXRIZWlnaHQJAQAAAAJrcAAAAAIFAAAABmFzc2V0MQUAAAAGYXNzZXQyAgAAAAFfBQAAAAdhZGRyZXNzAQAAAAJmaAAAAAMAAAAGYXNzZXQxAAAABmFzc2V0MgAAAAdhZGRyZXNzCQABLAAAAAIJAAEsAAAAAgkAASwAAAACBQAAAApmYXJtSGVpZ2h0CQEAAAACa3AAAAACBQAAAAZhc3NldDEFAAAABmFzc2V0MgIAAAABXwUAAAAHYWRkcmVzcwEAAAAMaXNWYWxpZEFzc2V0AAAAAQAAAAdhc3NldElkAwkAAAAAAAACBQAAAAdhc3NldElkAgAAAANHSUMGBAAAAAckbWF0Y2gwCQAD7AAAAAEJAAJZAAAAAQUAAAAHYXNzZXRJZAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAFQXNzZXQEAAAAAWEFAAAAByRtYXRjaDAGBwEAAAANaXNCbGFja2xpc3RlZAAAAAEAAAAHYXNzZXRJZAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBsAAAACBQAAAAR0aGlzCQABLAAAAAIFAAAAEWJsYWNrbGlzdGVkVG9rZW5zBQAAAAdhc3NldElkBwEAAAAQZ2V0QXNzZXREZWNpbWFscwAAAAEAAAAHYXNzZXRJZAMJAAAAAAAAAgUAAAAHYXNzZXRJZAIAAAADR0lDAAAAAAAAAAAIBAAAAAckbWF0Y2gwCQAD7AAAAAEJAAJZAAAAAQUAAAAHYXNzZXRJZAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAFQXNzZXQEAAAAAWEFAAAAByRtYXRjaDAIBQAAAAFhAAAACGRlY2ltYWxzAAAAAAAAAAAIAQAAABFnZXRBZGRyZXNzSWZWYWxpZAAAAAEAAAAHYWRkcmVzcwkABCUAAAABCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQmAAAAAQUAAAAHYWRkcmVzcwkAASwAAAACCQABLAAAAAICAAAADENhbid0IHBhcnNlIAUAAAAHYWRkcmVzcwIAAAALIGFzIGFkZHJlc3MBAAAACnZhbGlkUG9vbEsAAAABAAAAA2tleQQAAAAHJG1hdGNoMAkABBoAAAACBQAAAAR0aGlzBQAAAANrZXkDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAA0ludAQAAAABdAUAAAAHJG1hdGNoMAUAAAABdAAAAAAAAAAAAAEAAAAGcG9vbEFBAAAAAgAAAANrZXkAAAAFYXNzZXQEAAAAByRtYXRjaDAJAAQaAAAAAgUAAAAEdGhpcwkAASwAAAACCQABLAAAAAIFAAAAA2tleQIAAAABXwUAAAAFYXNzZXQDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAA0ludAQAAAABdAUAAAAHJG1hdGNoMAUAAAABdAAAAAAAAAAAAAEAAAANdXNlckxpcXVpZGl0eQAAAAMAAAAHYWRkcmVzcwAAAANrZXkAAAAFYXNzZXQEAAAAByRtYXRjaDAJAAQaAAAAAgUAAAAEdGhpcwkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACBQAAAANrZXkCAAAAAV8FAAAAB2FkZHJlc3MCAAAAAV8FAAAABWFzc2V0AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAANJbnQEAAAAAXQFAAAAByRtYXRjaDAFAAAAAXQAAAAAAAAAAAABAAAAD2dldEFkbWluQWRkcmVzcwAAAAADCQAAAAAAAAIJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAQAAABFAZXh0ck5hdGl2ZSgxMDU4KQAAAAEFAAAADGFkbWluQWRkcmVzcwIAAAAAAgAAAAAJAAACAAAAAQIAAAApQ29uc3RydWN0b3IgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkIHlldCEJAQAAABFAZXh0ck5hdGl2ZSgxMDU4KQAAAAEFAAAADGFkbWluQWRkcmVzcwAAAA8AAAABaQEAAAALY29uc3RydWN0b3IAAAAEAAAAC01haW5Bc3NldElkAAAADEFkbWluQWRkcmVzcwAAAApTd2FwRmVlQnBzAAAACWFjY2VwdEdpYwMJAQAAAAIhPQAAAAIIBQAAAAFpAAAABmNhbGxlcgUAAAAEdGhpcwkAAAIAAAABAgAAADFPbmx5IHRoZSBjb250cmFjdCBpdHNlbGYgY2FuIGludm9rZSB0aGlzIGZ1bmN0aW9uAwkBAAAAASEAAAABCQEAAAAMaXNWYWxpZEFzc2V0AAAAAQUAAAALTWFpbkFzc2V0SWQJAAACAAAAAQIAAAATSW52YWxpZCBNYWluQXNzZXRJZAMJAAAAAAAAAgUAAAAMQWRtaW5BZGRyZXNzAgAAAAAJAAACAAAAAQIAAAAUSW52YWxpZCBBZG1pbkFkZHJlc3MDAwkAAGYAAAACAAAAAAAAAAAABQAAAApTd2FwRmVlQnBzBgkAAGYAAAACBQAAAApTd2FwRmVlQnBzAAAAAAAAAAPoCQAAAgAAAAECAAAAJVN3YXBGZWVCcHMgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDEwMDAJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAAEbWFpbgUAAAALTWFpbkFzc2V0SWQJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAAMYWRtaW5BZGRyZXNzBQAAAAxBZG1pbkFkZHJlc3MJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAB3N3YXBGZWUFAAAAClN3YXBGZWVCcHMJAARMAAAAAgkBAAAADEJvb2xlYW5FbnRyeQAAAAIFAAAAAmFjBgkABEwAAAACCQEAAAAMQm9vbGVhbkVudHJ5AAAAAgUAAAAGcG9vbEFjBwkABEwAAAACCQEAAAAMQm9vbGVhbkVudHJ5AAAAAgUAAAAGc3dhcEFjBwkABEwAAAACCQEAAAAMQm9vbGVhbkVudHJ5AAAAAgUAAAALbGlxdWlkaXR5QWMHCQAETAAAAAIJAQAAAAxCb29sZWFuRW50cnkAAAACBQAAAAZmYXJtQWMHCQAETAAAAAIJAQAAAAxCb29sZWFuRW50cnkAAAACAgAAAAphY2NlcHRfZ2ljBQAAAAlhY2NlcHRHaWMFAAAAA25pbAAAAAFpAQAAAAtjaGFuZ2VBZG1pbgAAAAEAAAAHYWRkcmVzcwQAAAAFYWRtaW4JAQAAAA9nZXRBZG1pbkFkZHJlc3MAAAAAAwkBAAAAAiE9AAAAAgkAAlgAAAABCAgFAAAAAWkAAAAGY2FsbGVyAAAABWJ5dGVzBQAAAAVhZG1pbgkAAAIAAAABAgAAAC9Pbmx5IHRoZSBBZG1pbiBpdHNlbGYgY2FuIGludm9rZSB0aGlzIGZ1bmN0aW9uLgkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACBQAAAAxhZG1pbkFkZHJlc3MFAAAAB2FkZHJlc3MFAAAAA25pbAAAAAFpAQAAAAhhY3RpdmF0ZQAAAAEAAAABdgQAAAAFYWRtaW4JAQAAAA9nZXRBZG1pbkFkZHJlc3MAAAAAAwkBAAAAAiE9AAAAAgkAAlgAAAABCAgFAAAAAWkAAAAGY2FsbGVyAAAABWJ5dGVzBQAAAAVhZG1pbgkAAAIAAAABAgAAAC5Pbmx5IHRoZSBBZG1pbiBpdHNlbGYgY2FuIGludm9rZSB0aGlzIGZ1bmN0aW9uCQAETAAAAAIJAQAAAAxCb29sZWFuRW50cnkAAAACBQAAAAJhYwUAAAABdgUAAAADbmlsAAAAAWkBAAAAC21haW50ZW5hbmNlAAAABAAAAAVwb29scwAAAARzd2FwAAAABXN0YWtlAAAABWZhcm1zBAAAAAVhZG1pbgkBAAAAD2dldEFkbWluQWRkcmVzcwAAAAADCQEAAAACIT0AAAACCQACWAAAAAEICAUAAAABaQAAAAZjYWxsZXIAAAAFYnl0ZXMFAAAABWFkbWluCQAAAgAAAAECAAAALk9ubHkgdGhlIEFkbWluIGl0c2VsZiBjYW4gaW52b2tlIHRoaXMgZnVuY3Rpb24JAARMAAAAAgkBAAAADEJvb2xlYW5FbnRyeQAAAAIFAAAABnBvb2xBYwUAAAAFcG9vbHMJAARMAAAAAgkBAAAADEJvb2xlYW5FbnRyeQAAAAIFAAAABnN3YXBBYwUAAAAEc3dhcAkABEwAAAACCQEAAAAMQm9vbGVhbkVudHJ5AAAAAgUAAAALbGlxdWlkaXR5QWMFAAAABXN0YWtlCQAETAAAAAIJAQAAAAxCb29sZWFuRW50cnkAAAACBQAAAAZmYXJtQWMFAAAABWZhcm1zBQAAAANuaWwAAAABaQEAAAAKc2V0U3dhcEZlZQAAAAEAAAAGZmVlQnBzBAAAAAVhZG1pbgkBAAAAD2dldEFkbWluQWRkcmVzcwAAAAADCQEAAAACIT0AAAACCQACWAAAAAEICAUAAAABaQAAAAZjYWxsZXIAAAAFYnl0ZXMFAAAABWFkbWluCQAAAgAAAAECAAAALk9ubHkgdGhlIEFkbWluIGl0c2VsZiBjYW4gaW52b2tlIHRoaXMgZnVuY3Rpb24DAwkAAGYAAAACAAAAAAAAAAAABQAAAAZmZWVCcHMGCQAAZgAAAAIFAAAABmZlZUJwcwAAAAAAAAAD6AkAAAIAAAABAgAAACtGZWUgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDEwMDAgYmFzaXMgcG9pbnRzCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAdzd2FwRmVlBQAAAAZmZWVCcHMFAAAAA25pbAAAAAFpAQAAAA5ibGFja2xpc3RUb2tlbgAAAAIAAAAHYXNzZXRJZAAAAAlibGFja2xpc3QEAAAABWFkbWluCQEAAAAPZ2V0QWRtaW5BZGRyZXNzAAAAAAMJAQAAAAIhPQAAAAIJAAJYAAAAAQgIBQAAAAFpAAAABmNhbGxlcgAAAAVieXRlcwUAAAAFYWRtaW4JAAACAAAAAQIAAAAuT25seSB0aGUgQWRtaW4gaXRzZWxmIGNhbiBpbnZva2UgdGhpcyBmdW5jdGlvbgMDCQEAAAABIQAAAAEJAQAAAAxpc1ZhbGlkQXNzZXQAAAABBQAAAAdhc3NldElkCQEAAAACIT0AAAACBQAAAAdhc3NldElkAgAAAANHSUMHCQAAAgAAAAECAAAAD0ludmFsaWQgYXNzZXRJZAkABEwAAAACCQEAAAAMQm9vbGVhbkVudHJ5AAAAAgkAASwAAAACBQAAABFibGFja2xpc3RlZFRva2VucwUAAAAHYXNzZXRJZAUAAAAJYmxhY2tsaXN0BQAAAANuaWwAAAABaQEAAAAKY3JlYXRlRmFybQAAAAUAAAAGYXNzZXQxAAAABmFzc2V0MgAAAANhcHIAAAAKbG9ja0Jsb2NrcwAAAAxyZXdhcmRBbW91bnQEAAAABWFkbWluCQEAAAAPZ2V0QWRtaW5BZGRyZXNzAAAAAAMJAQAAAAIhPQAAAAIJAAJYAAAAAQgIBQAAAAFpAAAABmNhbGxlcgAAAAVieXRlcwUAAAAFYWRtaW4JAAACAAAAAQIAAAAuT25seSB0aGUgQWRtaW4gaXRzZWxmIGNhbiBpbnZva2UgdGhpcyBmdW5jdGlvbgMJAQAAAAEhAAAAAQkBAAAADGlzVmFsaWRBc3NldAAAAAEFAAAABmFzc2V0MQkAAAIAAAABAgAAAA5JbnZhbGlkIGFzc2V0MQMJAQAAAAEhAAAAAQkBAAAADGlzVmFsaWRBc3NldAAAAAEFAAAABmFzc2V0MgkAAAIAAAABAgAAAA5JbnZhbGlkIGFzc2V0MgMJAAAAAAAAAgUAAAAGYXNzZXQxBQAAAAZhc3NldDIJAAACAAAAAQIAAAAgQXNzZXQxIGNhbm5vdCBiZSBlcXVhbCB0byBBc3NldDIDCQAAZwAAAAIAAAAAAAAAAAAFAAAAA2FwcgkAAAIAAAABAgAAABRBUFIgbXVzdCBiZSBwb3NpdGl2ZQMJAABnAAAAAgAAAAAAAAAAAAUAAAAKbG9ja0Jsb2NrcwkAAAIAAAABAgAAABxMb2NrIGJsb2NrcyBtdXN0IGJlIHBvc2l0aXZlAwkAAGcAAAACAAAAAAAAAAAABQAAAAxyZXdhcmRBbW91bnQJAAACAAAAAQIAAAAeUmV3YXJkIGFtb3VudCBtdXN0IGJlIHBvc2l0aXZlBAAAAAdwb29sS2V5CQEAAAACa3AAAAACBQAAAAZhc3NldDEFAAAABmFzc2V0MgMJAAAAAAAAAgkBAAAACnZhbGlkUG9vbEsAAAABBQAAAAdwb29sS2V5AAAAAAAAAAAACQAAAgAAAAECAAAAE1Bvb2wgZG9lcyBub3QgZXhpc3QEAAAAB2Zhcm1LZXkJAQAAAAJmawAAAAIFAAAABmFzc2V0MQUAAAAGYXNzZXQyCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAdmYXJtS2V5AAAAAAAAAAABCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQABLAAAAAIFAAAAB2Zhcm1BcHIFAAAAB3Bvb2xLZXkFAAAAA2FwcgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkAASwAAAACBQAAAA5mYXJtTG9ja0Jsb2NrcwUAAAAHcG9vbEtleQUAAAAKbG9ja0Jsb2NrcwkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkAASwAAAACBQAAAA5mYXJtUmV3YXJkUG9vbAUAAAAHcG9vbEtleQUAAAAMcmV3YXJkQW1vdW50CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQABLAAAAAIFAAAAD2Zhcm1Ub3RhbFN0YWtlZAUAAAAHcG9vbEtleQAAAAAAAAAAAAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkAASwAAAACBQAAAA50b3RhbFVzZXJzRmFybQUAAAAHcG9vbEtleQAAAAAAAAAAAAUAAAADbmlsAAAAAWkBAAAACGZ1bmRGYXJtAAAAAgAAAAZhc3NldDEAAAAGYXNzZXQyBAAAAAVhZG1pbgkBAAAAD2dldEFkbWluQWRkcmVzcwAAAAADCQEAAAACIT0AAAACCQACWAAAAAEICAUAAAABaQAAAAZjYWxsZXIAAAAFYnl0ZXMFAAAABWFkbWluCQAAAgAAAAECAAAALk9ubHkgdGhlIEFkbWluIGl0c2VsZiBjYW4gaW52b2tlIHRoaXMgZnVuY3Rpb24EAAAAA3BtdAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAQAAAAKcG10QXNzZXRJZAQAAAAHJG1hdGNoMAgFAAAAA3BtdAAAAAdhc3NldElkAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAApCeXRlVmVjdG9yBAAAAAFhBQAAAAckbWF0Y2gwCQACWAAAAAEFAAAAAWECAAAAA0dJQwMJAQAAAAIhPQAAAAIJAAJYAAAAAQgIBQAAAAFpAAAABmNhbGxlcgAAAAVieXRlcwUAAAAFYWRtaW4JAAACAAAAAQIAAAAuT25seSB0aGUgQWRtaW4gaXRzZWxmIGNhbiBpbnZva2UgdGhpcyBmdW5jdGlvbgMJAQAAAAIhPQAAAAIFAAAACnBtdEFzc2V0SWQCAAAAA0dJQwkAAAIAAAABAgAAABZSZXdhcmRzIG11c3QgYmUgaW4gR0lDBAAAAAdwb29sS2V5CQEAAAACa3AAAAACBQAAAAZhc3NldDEFAAAABmFzc2V0MgQAAAAHZmFybUtleQkBAAAAAmZrAAAAAgUAAAAGYXNzZXQxBQAAAAZhc3NldDIDCQAAAAAAAAIJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwUAAAAHZmFybUtleQAAAAAAAAAAAAAAAAAAAAAAAAkAAAIAAAABAgAAABNGYXJtIGRvZXMgbm90IGV4aXN0BAAAABFjdXJyZW50UmV3YXJkUG9vbAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzCQABLAAAAAIFAAAADmZhcm1SZXdhcmRQb29sBQAAAAdwb29sS2V5AAAAAAAAAAAABAAAAA1uZXdSZXdhcmRQb29sCQAAZAAAAAIFAAAAEWN1cnJlbnRSZXdhcmRQb29sCAUAAAADcG10AAAABmFtb3VudAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkAASwAAAACBQAAAA5mYXJtUmV3YXJkUG9vbAUAAAAHcG9vbEtleQUAAAANbmV3UmV3YXJkUG9vbAUAAAADbmlsAAAAAWkBAAAACmNyZWF0ZVBvb2wAAAADAAAABmFzc2V0MQAAAAZhc3NldDIAAAAGbmFtZUxwBAAAAAdwb29sS2V5CQEAAAACa3AAAAACBQAAAAZhc3NldDEFAAAABmFzc2V0MgQAAAAFYWRtaW4JAQAAAA9nZXRBZG1pbkFkZHJlc3MAAAAAAwkBAAAAAiE9AAAAAgkAAlgAAAABCAgFAAAAAWkAAAAGY2FsbGVyAAAABWJ5dGVzBQAAAAVhZG1pbgkAAAIAAAABAgAAAC5Pbmx5IHRoZSBBZG1pbiBpdHNlbGYgY2FuIGludm9rZSB0aGlzIGZ1bmN0aW9uAwkBAAAAASEAAAABCQEAAAAMaXNWYWxpZEFzc2V0AAAAAQUAAAAGYXNzZXQxCQAAAgAAAAECAAAADkludmFsaWQgYXNzZXQxAwkBAAAAASEAAAABCQEAAAAMaXNWYWxpZEFzc2V0AAAAAQUAAAAGYXNzZXQyCQAAAgAAAAECAAAADkludmFsaWQgYXNzZXQyAwkAAAAAAAACBQAAAAZhc3NldDEFAAAABmFzc2V0MgkAAAIAAAABAgAAACBBc3NldDEgY2Fubm90IGJlIGVxdWFsIHRvIEFzc2V0MgMDCQEAAAANaXNCbGFja2xpc3RlZAAAAAEFAAAABmFzc2V0MQYJAQAAAA1pc0JsYWNrbGlzdGVkAAAAAQUAAAAGYXNzZXQyCQAAAgAAAAECAAAAIk9uZSBvciBib3RoIGFzc2V0cyBhcmUgYmxhY2tsaXN0ZWQDCQEAAAACIT0AAAACCQEAAAAKdmFsaWRQb29sSwAAAAEFAAAAB3Bvb2xLZXkAAAAAAAAAAAAJAAACAAAAAQIAAAATUG9vbCBhbHJlYWR5IGV4aXN0cwQAAAANYXNzZXRMcENyZWF0ZQkABEIAAAAFBQAAAAZuYW1lTHAJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAEkxQIGFzc2V0IGZvciBwb29sIAUAAAAGYXNzZXQxAgAAAAFfBQAAAAZhc3NldDIAAAAAAAAAAAEAAAAAAAAAAAgGBAAAAAlpZEFzc2V0THAJAAQ4AAAAAQUAAAANYXNzZXRMcENyZWF0ZQkABEwAAAACBQAAAA1hc3NldExwQ3JlYXRlCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAAEsAAAAAgUAAAACbHAFAAAAB3Bvb2xLZXkJAAJYAAAAAQUAAAAJaWRBc3NldExwCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAdwb29sS2V5AAAAAAAAAAABBQAAAANuaWwAAAABaQEAAAAMYWRkTGlxdWlkaXR5AAAAAgAAAAZhc3NldDEAAAAGYXNzZXQyBAAAAAVwb3dlcgkBAAAAEUBleHRyTmF0aXZlKDEwNTEpAAAAAgUAAAAEdGhpcwUAAAACYWMEAAAADmxpcXVpZGl0eVBvd2VyCQEAAAARQGV4dHJOYXRpdmUoMTA1MSkAAAACBQAAAAR0aGlzBQAAAAtsaXF1aWRpdHlBYwQAAAAFYWNHaWMJAQAAABFAZXh0ck5hdGl2ZSgxMDUxKQAAAAIFAAAABHRoaXMCAAAACmFjY2VwdF9naWMEAAAAB3Bvb2xLZXkJAQAAAAJrcAAAAAIFAAAABmFzc2V0MQUAAAAGYXNzZXQyBAAAAARwbXQxCQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAABAAAAARwbXQyCQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAABBAAAAAhhc3NldDFJZAQAAAAHJG1hdGNoMAgFAAAABHBtdDEAAAAHYXNzZXRJZAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAKQnl0ZVZlY3RvcgQAAAABYQUAAAAHJG1hdGNoMAkAAlgAAAABBQAAAAFhAgAAAANHSUMEAAAACGFzc2V0MklkBAAAAAckbWF0Y2gwCAUAAAAEcG10MgAAAAdhc3NldElkAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAApCeXRlVmVjdG9yBAAAAAFhBQAAAAckbWF0Y2gwCQACWAAAAAEFAAAAAWECAAAAA0dJQwQAAAAJZGVjaW1hbHMxCQEAAAAQZ2V0QXNzZXREZWNpbWFscwAAAAEFAAAACGFzc2V0MUlkBAAAAAlkZWNpbWFsczIJAQAAABBnZXRBc3NldERlY2ltYWxzAAAAAQUAAAAIYXNzZXQySWQDCQEAAAABIQAAAAEFAAAABXBvd2VyCQAAAgAAAAECAAAAI2RBcHAgaXMgY3VycmVudGx5IHVuZGVyIG1haW50ZW5hbmNlAwUAAAAObGlxdWlkaXR5UG93ZXIJAAACAAAAAQIAAAAoTGlxdWlkaXR5IGlzIGN1cnJlbnRseSB1bmRlciBtYWludGVuYW5jZQMDCQEAAAACIT0AAAACBQAAAAhhc3NldDFJZAUAAAAGYXNzZXQxBgkBAAAAAiE9AAAAAgUAAAAIYXNzZXQySWQFAAAABmFzc2V0MgkAAAIAAAABAgAAACxQYXltZW50IGFzc2V0cyBkbyBub3QgbWF0Y2ggc3BlY2lmaWVkIGFzc2V0cwMJAAAAAAAAAgUAAAAGYXNzZXQxBQAAAAZhc3NldDIJAAACAAAAAQIAAAAgQXNzZXQxIGNhbm5vdCBiZSBlcXVhbCB0byBBc3NldDIDCQEAAAABIQAAAAEJAQAAAAxpc1ZhbGlkQXNzZXQAAAABBQAAAAZhc3NldDEJAAACAAAAAQIAAAAOSW52YWxpZCBhc3NldDEDCQEAAAABIQAAAAEJAQAAAAxpc1ZhbGlkQXNzZXQAAAABBQAAAAZhc3NldDIJAAACAAAAAQIAAAAOSW52YWxpZCBhc3NldDIDAwkBAAAADWlzQmxhY2tsaXN0ZWQAAAABBQAAAAZhc3NldDEGCQEAAAANaXNCbGFja2xpc3RlZAAAAAEFAAAABmFzc2V0MgkAAAIAAAABAgAAACJPbmUgb3IgYm90aCBhc3NldHMgYXJlIGJsYWNrbGlzdGVkAwMDCQAAAAAAAAIFAAAABmFzc2V0MQIAAAADR0lDBgkAAAAAAAACBQAAAAZhc3NldDICAAAAA0dJQwkBAAAAASEAAAABBQAAAAVhY0dpYwcJAAACAAAAAQIAAAAPR0lDIG5vdCBhbGxvd2VkAwkAAAAAAAACCQEAAAAKdmFsaWRQb29sSwAAAAEFAAAAB3Bvb2xLZXkAAAAAAAAAAAAJAAACAAAAAQIAAAAkUG9vbCBkb2VzIG5vdCBleGlzdC4gQ3JlYXRlIGl0IGZpcnN0BAAAAAtwb29sQW1vdW50MQkBAAAABnBvb2xBQQAAAAIFAAAAB3Bvb2xLZXkFAAAABmFzc2V0MQQAAAALcG9vbEFtb3VudDIJAQAAAAZwb29sQUEAAAACBQAAAAdwb29sS2V5BQAAAAZhc3NldDIEAAAAB2Ftb3VudDEIBQAAAARwbXQxAAAABmFtb3VudAQAAAAHYW1vdW50MggFAAAABHBtdDIAAAAGYW1vdW50BAAAAAhscEFtb3VudAMDCQAAAAAAAAIFAAAAC3Bvb2xBbW91bnQxAAAAAAAAAAAABgkAAAAAAAACBQAAAAtwb29sQW1vdW50MgAAAAAAAAAAAAkAATYAAAABBQAAAAdhbW91bnQxCQABOgAAAAIJAAE5AAAAAgkAATYAAAABBQAAAAdhbW91bnQxCQABNgAAAAEFAAAAC3Bvb2xBbW91bnQyCQABNgAAAAEFAAAAC3Bvb2xBbW91bnQxBAAAAApjdXJyZW50S2V5CQACWAAAAAEICAUAAAABaQAAAAZjYWxsZXIAAAAFYnl0ZXMEAAAAE2N1cnJlbnRBbW91bnRBc3NldDEJAQAAAA11c2VyTGlxdWlkaXR5AAAAAwUAAAAKY3VycmVudEtleQUAAAAHcG9vbEtleQUAAAAGYXNzZXQxBAAAABNjdXJyZW50QW1vdW50QXNzZXQyCQEAAAANdXNlckxpcXVpZGl0eQAAAAMFAAAACmN1cnJlbnRLZXkFAAAAB3Bvb2xLZXkFAAAABmFzc2V0MgQAAAAPbmV3QW1vdW50QXNzZXQxCQABNwAAAAIJAAE2AAAAAQUAAAATY3VycmVudEFtb3VudEFzc2V0MQkAATYAAAABBQAAAAdhbW91bnQxBAAAAA9uZXdBbW91bnRBc3NldDIJAAE3AAAAAgkAATYAAAABBQAAABNjdXJyZW50QW1vdW50QXNzZXQyCQABNgAAAAEFAAAAB2Ftb3VudDIEAAAADm5ld1Bvb2xBbW91bnQxCQABNwAAAAIJAAE2AAAAAQUAAAALcG9vbEFtb3VudDEJAAE2AAAAAQUAAAAHYW1vdW50MQQAAAAObmV3UG9vbEFtb3VudDIJAAE3AAAAAgkAATYAAAABBQAAAAtwb29sQW1vdW50MgkAATYAAAABBQAAAAdhbW91bnQyBAAAAAlscEFzc2V0SWQJAQAAABFAZXh0ck5hdGl2ZSgxMDUzKQAAAAIFAAAABHRoaXMJAAEsAAAAAgUAAAACbHAFAAAAB3Bvb2xLZXkEAAAAD29sZEFzc2V0THBUb3RhbAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkBAAAAEUBleHRyTmF0aXZlKDEwNTUpAAAAAQUAAAAHcG9vbEtleQAAAAAAAAAAAAQAAAAHbHBBc3NldAMJAAAAAAAAAgUAAAAJbHBBc3NldElkAgAAAAAJAAACAAAAAQIAAAAyUG9vbCBkb2VzIG5vdCBoYXZlIGEgbGlxdWlkaXR5IHBhaXIsIGNvbnRhY3QgYWRtaW4JAAJZAAAAAQUAAAAJbHBBc3NldElkCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIFAAAAB3Bvb2xLZXkCAAAAAV8FAAAACmN1cnJlbnRLZXkCAAAAAV8FAAAABmFzc2V0MQkAAaAAAAABBQAAAA9uZXdBbW91bnRBc3NldDEJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgUAAAAHcG9vbEtleQIAAAABXwUAAAAKY3VycmVudEtleQIAAAABXwUAAAAGYXNzZXQyCQABoAAAAAEFAAAAD25ld0Ftb3VudEFzc2V0MgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkAASwAAAACCQABLAAAAAIFAAAAB3Bvb2xLZXkCAAAAAV8FAAAABmFzc2V0MQkAAaAAAAABBQAAAA5uZXdQb29sQW1vdW50MQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkAASwAAAACCQABLAAAAAIFAAAAB3Bvb2xLZXkCAAAAAV8FAAAABmFzc2V0MgkAAaAAAAABBQAAAA5uZXdQb29sQW1vdW50MgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgUAAAANZGVwb3NpdEhlaWdodAUAAAAHcG9vbEtleQIAAAABXwUAAAAKY3VycmVudEtleQUAAAAGaGVpZ2h0CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAdwb29sS2V5CQAAZAAAAAIFAAAAD29sZEFzc2V0THBUb3RhbAkAAaAAAAABBQAAAAhscEFtb3VudAkABEwAAAACCQEAAAAHUmVpc3N1ZQAAAAMFAAAAB2xwQXNzZXQJAAGgAAAAAQUAAAAIbHBBbW91bnQGCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgkAAaAAAAABBQAAAAhscEFtb3VudAUAAAAHbHBBc3NldAUAAAADbmlsAAAAAWkBAAAAD3JlbW92ZUxpcXVpZGl0eQAAAAMAAAAGYXNzZXQxAAAABmFzc2V0MgAAAAhscEFtb3VudAQAAAAFcG93ZXIJAQAAABFAZXh0ck5hdGl2ZSgxMDUxKQAAAAIFAAAABHRoaXMFAAAAAmFjBAAAAA5saXF1aWRpdHlQb3dlcgkBAAAAEUBleHRyTmF0aXZlKDEwNTEpAAAAAgUAAAAEdGhpcwUAAAALbGlxdWlkaXR5QWMEAAAAB3Bvb2xLZXkJAQAAAAJrcAAAAAIFAAAABmFzc2V0MQUAAAAGYXNzZXQyBAAAAAlscEFzc2V0SWQJAQAAABFAZXh0ck5hdGl2ZSgxMDUzKQAAAAIFAAAABHRoaXMJAAEsAAAAAgUAAAACbHAFAAAAB3Bvb2xLZXkEAAAAB2xwQXNzZXQJAAJZAAAAAQUAAAAJbHBBc3NldElkBAAAAANwbXQJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAEAAAACnBtdEFzc2V0SWQEAAAAByRtYXRjaDAIBQAAAANwbXQAAAAHYXNzZXRJZAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAKQnl0ZVZlY3RvcgQAAAABYQUAAAAHJG1hdGNoMAkAAlgAAAABBQAAAAFhAgAAAANHSUMEAAAACWRlY2ltYWxzMQkBAAAAEGdldEFzc2V0RGVjaW1hbHMAAAABBQAAAAZhc3NldDEEAAAACWRlY2ltYWxzMgkBAAAAEGdldEFzc2V0RGVjaW1hbHMAAAABBQAAAAZhc3NldDIDCQEAAAABIQAAAAEFAAAABXBvd2VyCQAAAgAAAAECAAAAI2RBcHAgaXMgY3VycmVudGx5IHVuZGVyIG1haW50ZW5hbmNlAwUAAAAObGlxdWlkaXR5UG93ZXIJAAACAAAAAQIAAAAoTGlxdWlkaXR5IGlzIGN1cnJlbnRseSB1bmRlciBtYWludGVuYW5jZQMJAAAAAAAAAgUAAAAJbHBBc3NldElkAgAAAAAJAAACAAAAAQIAAAAQSW52YWxpZCBMUCBhc3NldAMJAQAAAAIhPQAAAAIFAAAACnBtdEFzc2V0SWQFAAAACWxwQXNzZXRJZAkAAAIAAAABAgAAABBJbnZhbGlkIExQIHRva2VuAwkAAAAAAAACCQEAAAAKdmFsaWRQb29sSwAAAAEFAAAAB3Bvb2xLZXkAAAAAAAAAAAAJAAACAAAAAQIAAAATUG9vbCBkb2VzIG5vdCBleGlzdAMJAABnAAAAAgAAAAAAAAAAAAUAAAAIbHBBbW91bnQJAAACAAAAAQIAAAAaTFAgYW1vdW50IG11c3QgYmUgcG9zaXRpdmUEAAAAC3Bvb2xBbW91bnQxCQEAAAAGcG9vbEFBAAAAAgUAAAAHcG9vbEtleQUAAAAGYXNzZXQxBAAAAAtwb29sQW1vdW50MgkBAAAABnBvb2xBQQAAAAIFAAAAB3Bvb2xLZXkFAAAABmFzc2V0MgQAAAANdG90YWxMcFN1cHBseQQAAAAHJG1hdGNoMAkAA+wAAAABCQACWQAAAAEFAAAACWxwQXNzZXRJZAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAFQXNzZXQEAAAAAWEFAAAAByRtYXRjaDAIBQAAAAFhAAAACHF1YW50aXR5AAAAAAAAAAAABAAAAAdhbW91bnQxCQAAaQAAAAIJAABoAAAAAgUAAAAIbHBBbW91bnQFAAAAC3Bvb2xBbW91bnQxBQAAAA10b3RhbExwU3VwcGx5BAAAAAdhbW91bnQyCQAAaQAAAAIJAABoAAAAAgUAAAAIbHBBbW91bnQFAAAAC3Bvb2xBbW91bnQyBQAAAA10b3RhbExwU3VwcGx5BAAAAApjdXJyZW50S2V5CQACWAAAAAEICAUAAAABaQAAAAZjYWxsZXIAAAAFYnl0ZXMEAAAAE2N1cnJlbnRBbW91bnRBc3NldDEJAQAAAA11c2VyTGlxdWlkaXR5AAAAAwUAAAAKY3VycmVudEtleQUAAAAHcG9vbEtleQUAAAAGYXNzZXQxBAAAABNjdXJyZW50QW1vdW50QXNzZXQyCQEAAAANdXNlckxpcXVpZGl0eQAAAAMFAAAACmN1cnJlbnRLZXkFAAAAB3Bvb2xLZXkFAAAABmFzc2V0MgQAAAAPbmV3QW1vdW50QXNzZXQxCQAAZQAAAAIFAAAAE2N1cnJlbnRBbW91bnRBc3NldDEFAAAAB2Ftb3VudDEEAAAAD25ld0Ftb3VudEFzc2V0MgkAAGUAAAACBQAAABNjdXJyZW50QW1vdW50QXNzZXQyBQAAAAdhbW91bnQyAwMJAABmAAAAAgAAAAAAAAAAAAUAAAAPbmV3QW1vdW50QXNzZXQxBgkAAGYAAAACAAAAAAAAAAAABQAAAA9uZXdBbW91bnRBc3NldDIJAAACAAAAAQIAAAAeSW5zdWZmaWNpZW50IGxpcXVpZGl0eSBiYWxhbmNlBAAAAA5uZXdQb29sQW1vdW50MQkAAGUAAAACBQAAAAtwb29sQW1vdW50MQUAAAAHYW1vdW50MQQAAAAObmV3UG9vbEFtb3VudDIJAABlAAAAAgUAAAALcG9vbEFtb3VudDIFAAAAB2Ftb3VudDIEAAAAC2Fzc2V0MUJ5dGVzAwkA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AAZoZWlnaHQFAAAAD2xhc3RDbGFpbUhlaWdodAQAAAAOcmV3YXJkUGVyQmxvY2sJAABpAAAAAgkAAGgAAAACBQAAAApyZXdhcmRQb29sBQAAAANhcHIJAABoAAAAAgkAAGgAAAACAAAAAAAAACcQBQAAAApsb2NrQmxvY2tzBQAAAAp0b3RhbFVzZXJzBAAAAAZyZXdhcmQDCQAAZwAAAAIFAAAAFGJsb2Nrc1NpbmNlTGFzdENsYWltAAAAAAAAAAABCQAAaQAAAAIJAABoAAAAAgkAAGgAAAACBQAAAA5yZXdhcmRQZXJCbG9jawUAAAAUYmxvY2tzU2luY2VMYXN0Q2xhaW0FAAAADWN1cnJlbnRTdGFrZWQFAAAAAkQ4AAAAAAAAAAAABAAAAA1uZXdSZXdhcmRQb29sCQAAZQAAAAIFAAAACnJld2FyZFBvb2wFAAAABnJld2FyZAQAAAAJbmV3U3Rha2VkCQAAZQAAAAIFAAAADWN1cnJlbnRTdGFrZWQFAAAABmFtb3VudAQAAAAOdG90YWxTdGFrZWRLZXkJAAEsAAAAAgUAAAAPZmFybVRvdGFsU3Rha2VkBQAAAAdwb29sS2V5BAAAABNwcmV2aW91c1RvdGFsU3Rha2VkCQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMFAAAADnRvdGFsU3Rha2VkS2V5AAAAAAAAAAAABAAAAA5uZXdUb3RhbFN0YWtlZAkAAGUAAAACBQAAABNwcmV2aW91c1RvdGFsU3Rha2VkBQAAAAZhbW91bnQEAAAADW5ld1RvdGFsVXNlcnMDCQAAAAAAAAIFAAAACW5ld1N0YWtlZAAAAAAAAAAAAAkAAGUAAAACBQAAAAp0b3RhbFVzZXJzAAAAAAAAAAABBQAAAAp0b3RhbFVzZXJzCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAlzdGFrZWRLZXkFAAAACW5ld1N0YWtlZAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAOdG90YWxTdGFrZWRLZXkFAAAADm5ld1RvdGFsU3Rha2VkCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQABLAAAAAIFAAAADnRvdGFsVXNlcnNGYXJtBQAAAAdwb29sS2V5BQAAAA1uZXdUb3RhbFVzZXJzCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAlyZXdhcmRLZXkAAAAAAAAAAAAJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAAEsAAAAAgUAAAAOZmFybVJld2FyZFBvb2wFAAAAB3Bvb2xLZXkFAAAADW5ld1Jld2FyZFBvb2wJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAACWhlaWdodEtleQUAAAAGaGVpZ2h0CQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAGYW1vdW50BQAAAAdscEFzc2V0CQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAGcmV3YXJkBQAAAAR1bml0BQAAAANuaWwAAAABAAAAAnR4AQAAAAZ2ZXJpZnkAAAAABAAAAAckbWF0Y2gwBQAAAAJ0eAkAAfQAAAADCAUAAAACdHgAAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJ0eAAAAAZwcm9vZnMAAAAAAAAAAAAIBQAAAAJ0eAAAAA9zZW5kZXJQdWJsaWNLZXl2ek0c", "height": 5826, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: F8cEEMDw68p1DyxitiPZARKcGvcZPnqyQP1yuH3HGQQx Next: E31Z43H8J6QmXybShK9N8ZHfdptLSW3bev97TSEuc4U3 Diff:
OldNewDifferences
175175 else if (if ((0 > feeBps))
176176 then true
177177 else (feeBps > 1000))
178- then throw("Fee must be between 0 and 1000 basis points. 100=1%, 1000=10%")
178+ then throw("Fee must be between 0 and 1000 basis points")
179179 else [IntegerEntry(swapFee, feeBps)]
180180 }
181181
489489 else ((amountInAdjusted * poolAmount2) / poolAmount1)
490490 let fee = ((amountOut * feeBps) / toBigInt(10000))
491491 let amountOutAfterFee = (amountOut - fee)
492+ let feeToSend = ((amountInAdjusted * feeBps) / toBigInt(10000))
492493 let minAmountOut = ((amountOutAfterFee * toBigInt((10000 - maxSlippage))) / toBigInt(10000))
493494 if ((minAmountOut > amountOutAfterFee))
494495 then throw("Slippage exceeded")
500501 let assetOutBytes = if ((assetOut == "GIC"))
501502 then unit
502503 else fromBase58String(assetOut)
503-[IntegerEntry(((key + "_") + poolAsset1), toInt(newPoolAmount1)), IntegerEntry(((key + "_") + poolAsset2), toInt(newPoolAmount2)), ScriptTransfer(i.caller, toInt(amountOutAfterFee), assetOutBytes), ScriptTransfer(adminAddr, toInt(fee), assetOutBytes)]
504+[IntegerEntry(((key + "_") + poolAsset1), toInt(newPoolAmount1)), IntegerEntry(((key + "_") + poolAsset2), toInt(newPoolAmount2)), ScriptTransfer(i.caller, toInt(amountOutAfterFee), assetOutBytes), ScriptTransfer(adminAddr, toInt(feeToSend), assetOutBytes)]
504505 }
505506 }
506507 }
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let main = "main_asset"
55
66 let adminAddress = "admin_address"
77
88 let lp = "lp_asset_"
99
1010 let pool = "pool__"
1111
1212 let farm = "farm__"
1313
1414 let staked = "staked_"
1515
1616 let rewardClaimed = "reward_claimed_"
1717
1818 let depositHeight = "deposit_height_"
1919
2020 let farmHeight = "farm_height_"
2121
2222 let totalLocked = "total_locked_"
2323
2424 let swapFee = "swap_fee"
2525
2626 let farmRewardPool = "farm_reward_pool_"
2727
2828 let farmApr = "farm_apr_"
2929
3030 let farmLockBlocks = "farm_lock_blocks_"
3131
3232 let farmTotalStaked = "farm_total_staked_"
3333
3434 let blacklistedTokens = "blacklisted_"
3535
3636 let totalUsersFarm = "total_users_farm_"
3737
3838 let D8 = 100000000
3939
4040 let contractAddress = Address(this.bytes)
4141
4242 let ac = "activate"
4343
4444 let poolAc = "activate_pools"
4545
4646 let swapAc = "activate_swap"
4747
4848 let liquidityAc = "activate_liquidity"
4949
5050 let farmAc = "activate_farms"
5151
5252 func kp (asset1,asset2) = (((pool + asset1) + "_") + asset2)
5353
5454
5555 func fk (asset1,asset2) = (((farm + asset1) + "_") + asset2)
5656
5757
5858 func sk (asset1,asset2,address) = (((staked + kp(asset1, asset2)) + "_") + address)
5959
6060
6161 func rk (asset1,asset2,address) = (((rewardClaimed + kp(asset1, asset2)) + "_") + address)
6262
6363
6464 func dh (asset1,asset2,address) = (((depositHeight + kp(asset1, asset2)) + "_") + address)
6565
6666
6767 func fh (asset1,asset2,address) = (((farmHeight + kp(asset1, asset2)) + "_") + address)
6868
6969
7070 func isValidAsset (assetId) = if ((assetId == "GIC"))
7171 then true
7272 else match assetInfo(fromBase58String(assetId)) {
7373 case a: Asset =>
7474 true
7575 case _ =>
7676 false
7777 }
7878
7979
8080 func isBlacklisted (assetId) = valueOrElse(getBoolean(this, (blacklistedTokens + assetId)), false)
8181
8282
8383 func getAssetDecimals (assetId) = if ((assetId == "GIC"))
8484 then 8
8585 else match assetInfo(fromBase58String(assetId)) {
8686 case a: Asset =>
8787 a.decimals
8888 case _ =>
8989 8
9090 }
9191
9292
9393 func getAddressIfValid (address) = toString(valueOrErrorMessage(addressFromString(address), (("Can't parse " + address) + " as address")))
9494
9595
9696 func validPoolK (key) = match getInteger(this, key) {
9797 case t: Int =>
9898 t
9999 case _ =>
100100 0
101101 }
102102
103103
104104 func poolAA (key,asset) = match getInteger(this, ((key + "_") + asset)) {
105105 case t: Int =>
106106 t
107107 case _ =>
108108 0
109109 }
110110
111111
112112 func userLiquidity (address,key,asset) = match getInteger(this, ((((key + "_") + address) + "_") + asset)) {
113113 case t: Int =>
114114 t
115115 case _ =>
116116 0
117117 }
118118
119119
120120 func getAdminAddress () = if ((valueOrElse(getStringValue(adminAddress), "") == ""))
121121 then throw("Constructor has not been initialized yet!")
122122 else getStringValue(adminAddress)
123123
124124
125125 @Callable(i)
126126 func constructor (MainAssetId,AdminAddress,SwapFeeBps,acceptGic) = if ((i.caller != this))
127127 then throw("Only the contract itself can invoke this function")
128128 else if (!(isValidAsset(MainAssetId)))
129129 then throw("Invalid MainAssetId")
130130 else if ((AdminAddress == ""))
131131 then throw("Invalid AdminAddress")
132132 else if (if ((0 > SwapFeeBps))
133133 then true
134134 else (SwapFeeBps > 1000))
135135 then throw("SwapFeeBps must be between 0 and 1000")
136136 else [StringEntry(main, MainAssetId), StringEntry(adminAddress, AdminAddress), IntegerEntry(swapFee, SwapFeeBps), BooleanEntry(ac, true), BooleanEntry(poolAc, false), BooleanEntry(swapAc, false), BooleanEntry(liquidityAc, false), BooleanEntry(farmAc, false), BooleanEntry("accept_gic", acceptGic)]
137137
138138
139139
140140 @Callable(i)
141141 func changeAdmin (address) = {
142142 let admin = getAdminAddress()
143143 if ((toBase58String(i.caller.bytes) != admin))
144144 then throw("Only the Admin itself can invoke this function.")
145145 else [StringEntry(adminAddress, address)]
146146 }
147147
148148
149149
150150 @Callable(i)
151151 func activate (v) = {
152152 let admin = getAdminAddress()
153153 if ((toBase58String(i.caller.bytes) != admin))
154154 then throw("Only the Admin itself can invoke this function")
155155 else [BooleanEntry(ac, v)]
156156 }
157157
158158
159159
160160 @Callable(i)
161161 func maintenance (pools,swap,stake,farms) = {
162162 let admin = getAdminAddress()
163163 if ((toBase58String(i.caller.bytes) != admin))
164164 then throw("Only the Admin itself can invoke this function")
165165 else [BooleanEntry(poolAc, pools), BooleanEntry(swapAc, swap), BooleanEntry(liquidityAc, stake), BooleanEntry(farmAc, farms)]
166166 }
167167
168168
169169
170170 @Callable(i)
171171 func setSwapFee (feeBps) = {
172172 let admin = getAdminAddress()
173173 if ((toBase58String(i.caller.bytes) != admin))
174174 then throw("Only the Admin itself can invoke this function")
175175 else if (if ((0 > feeBps))
176176 then true
177177 else (feeBps > 1000))
178- then throw("Fee must be between 0 and 1000 basis points. 100=1%, 1000=10%")
178+ then throw("Fee must be between 0 and 1000 basis points")
179179 else [IntegerEntry(swapFee, feeBps)]
180180 }
181181
182182
183183
184184 @Callable(i)
185185 func blacklistToken (assetId,blacklist) = {
186186 let admin = getAdminAddress()
187187 if ((toBase58String(i.caller.bytes) != admin))
188188 then throw("Only the Admin itself can invoke this function")
189189 else if (if (!(isValidAsset(assetId)))
190190 then (assetId != "GIC")
191191 else false)
192192 then throw("Invalid assetId")
193193 else [BooleanEntry((blacklistedTokens + assetId), blacklist)]
194194 }
195195
196196
197197
198198 @Callable(i)
199199 func createFarm (asset1,asset2,apr,lockBlocks,rewardAmount) = {
200200 let admin = getAdminAddress()
201201 if ((toBase58String(i.caller.bytes) != admin))
202202 then throw("Only the Admin itself can invoke this function")
203203 else if (!(isValidAsset(asset1)))
204204 then throw("Invalid asset1")
205205 else if (!(isValidAsset(asset2)))
206206 then throw("Invalid asset2")
207207 else if ((asset1 == asset2))
208208 then throw("Asset1 cannot be equal to Asset2")
209209 else if ((0 >= apr))
210210 then throw("APR must be positive")
211211 else if ((0 >= lockBlocks))
212212 then throw("Lock blocks must be positive")
213213 else if ((0 >= rewardAmount))
214214 then throw("Reward amount must be positive")
215215 else {
216216 let poolKey = kp(asset1, asset2)
217217 if ((validPoolK(poolKey) == 0))
218218 then throw("Pool does not exist")
219219 else {
220220 let farmKey = fk(asset1, asset2)
221221 [IntegerEntry(farmKey, 1), IntegerEntry((farmApr + poolKey), apr), IntegerEntry((farmLockBlocks + poolKey), lockBlocks), IntegerEntry((farmRewardPool + poolKey), rewardAmount), IntegerEntry((farmTotalStaked + poolKey), 0), IntegerEntry((totalUsersFarm + poolKey), 0)]
222222 }
223223 }
224224 }
225225
226226
227227
228228 @Callable(i)
229229 func fundFarm (asset1,asset2) = {
230230 let admin = getAdminAddress()
231231 if ((toBase58String(i.caller.bytes) != admin))
232232 then throw("Only the Admin itself can invoke this function")
233233 else {
234234 let pmt = i.payments[0]
235235 let pmtAssetId = match pmt.assetId {
236236 case a: ByteVector =>
237237 toBase58String(a)
238238 case _ =>
239239 "GIC"
240240 }
241241 if ((toBase58String(i.caller.bytes) != admin))
242242 then throw("Only the Admin itself can invoke this function")
243243 else if ((pmtAssetId != "GIC"))
244244 then throw("Rewards must be in GIC")
245245 else {
246246 let poolKey = kp(asset1, asset2)
247247 let farmKey = fk(asset1, asset2)
248248 if ((valueOrElse(getInteger(this, farmKey), 0) == 0))
249249 then throw("Farm does not exist")
250250 else {
251251 let currentRewardPool = valueOrElse(getInteger(this, (farmRewardPool + poolKey)), 0)
252252 let newRewardPool = (currentRewardPool + pmt.amount)
253253 [IntegerEntry((farmRewardPool + poolKey), newRewardPool)]
254254 }
255255 }
256256 }
257257 }
258258
259259
260260
261261 @Callable(i)
262262 func createPool (asset1,asset2,nameLp) = {
263263 let poolKey = kp(asset1, asset2)
264264 let admin = getAdminAddress()
265265 if ((toBase58String(i.caller.bytes) != admin))
266266 then throw("Only the Admin itself can invoke this function")
267267 else if (!(isValidAsset(asset1)))
268268 then throw("Invalid asset1")
269269 else if (!(isValidAsset(asset2)))
270270 then throw("Invalid asset2")
271271 else if ((asset1 == asset2))
272272 then throw("Asset1 cannot be equal to Asset2")
273273 else if (if (isBlacklisted(asset1))
274274 then true
275275 else isBlacklisted(asset2))
276276 then throw("One or both assets are blacklisted")
277277 else if ((validPoolK(poolKey) != 0))
278278 then throw("Pool already exists")
279279 else {
280280 let assetLpCreate = Issue(nameLp, ((("LP asset for pool " + asset1) + "_") + asset2), 1, 8, true)
281281 let idAssetLp = calculateAssetId(assetLpCreate)
282282 [assetLpCreate, StringEntry((lp + poolKey), toBase58String(idAssetLp)), IntegerEntry(poolKey, 1)]
283283 }
284284 }
285285
286286
287287
288288 @Callable(i)
289289 func addLiquidity (asset1,asset2) = {
290290 let power = getBooleanValue(this, ac)
291291 let liquidityPower = getBooleanValue(this, liquidityAc)
292292 let acGic = getBooleanValue(this, "accept_gic")
293293 let poolKey = kp(asset1, asset2)
294294 let pmt1 = i.payments[0]
295295 let pmt2 = i.payments[1]
296296 let asset1Id = match pmt1.assetId {
297297 case a: ByteVector =>
298298 toBase58String(a)
299299 case _ =>
300300 "GIC"
301301 }
302302 let asset2Id = match pmt2.assetId {
303303 case a: ByteVector =>
304304 toBase58String(a)
305305 case _ =>
306306 "GIC"
307307 }
308308 let decimals1 = getAssetDecimals(asset1Id)
309309 let decimals2 = getAssetDecimals(asset2Id)
310310 if (!(power))
311311 then throw("dApp is currently under maintenance")
312312 else if (liquidityPower)
313313 then throw("Liquidity is currently under maintenance")
314314 else if (if ((asset1Id != asset1))
315315 then true
316316 else (asset2Id != asset2))
317317 then throw("Payment assets do not match specified assets")
318318 else if ((asset1 == asset2))
319319 then throw("Asset1 cannot be equal to Asset2")
320320 else if (!(isValidAsset(asset1)))
321321 then throw("Invalid asset1")
322322 else if (!(isValidAsset(asset2)))
323323 then throw("Invalid asset2")
324324 else if (if (isBlacklisted(asset1))
325325 then true
326326 else isBlacklisted(asset2))
327327 then throw("One or both assets are blacklisted")
328328 else if (if (if ((asset1 == "GIC"))
329329 then true
330330 else (asset2 == "GIC"))
331331 then !(acGic)
332332 else false)
333333 then throw("GIC not allowed")
334334 else if ((validPoolK(poolKey) == 0))
335335 then throw("Pool does not exist. Create it first")
336336 else {
337337 let poolAmount1 = poolAA(poolKey, asset1)
338338 let poolAmount2 = poolAA(poolKey, asset2)
339339 let amount1 = pmt1.amount
340340 let amount2 = pmt2.amount
341341 let lpAmount = if (if ((poolAmount1 == 0))
342342 then true
343343 else (poolAmount2 == 0))
344344 then toBigInt(amount1)
345345 else ((toBigInt(amount1) * toBigInt(poolAmount2)) / toBigInt(poolAmount1))
346346 let currentKey = toBase58String(i.caller.bytes)
347347 let currentAmountAsset1 = userLiquidity(currentKey, poolKey, asset1)
348348 let currentAmountAsset2 = userLiquidity(currentKey, poolKey, asset2)
349349 let newAmountAsset1 = (toBigInt(currentAmountAsset1) + toBigInt(amount1))
350350 let newAmountAsset2 = (toBigInt(currentAmountAsset2) + toBigInt(amount2))
351351 let newPoolAmount1 = (toBigInt(poolAmount1) + toBigInt(amount1))
352352 let newPoolAmount2 = (toBigInt(poolAmount2) + toBigInt(amount2))
353353 let lpAssetId = getStringValue(this, (lp + poolKey))
354354 let oldAssetLpTotal = valueOrElse(getIntegerValue(poolKey), 0)
355355 let lpAsset = if ((lpAssetId == ""))
356356 then throw("Pool does not have a liquidity pair, contact admin")
357357 else fromBase58String(lpAssetId)
358358 [IntegerEntry(((((poolKey + "_") + currentKey) + "_") + asset1), toInt(newAmountAsset1)), IntegerEntry(((((poolKey + "_") + currentKey) + "_") + asset2), toInt(newAmountAsset2)), IntegerEntry(((poolKey + "_") + asset1), toInt(newPoolAmount1)), IntegerEntry(((poolKey + "_") + asset2), toInt(newPoolAmount2)), IntegerEntry((((depositHeight + poolKey) + "_") + currentKey), height), IntegerEntry(poolKey, (oldAssetLpTotal + toInt(lpAmount))), Reissue(lpAsset, toInt(lpAmount), true), ScriptTransfer(i.caller, toInt(lpAmount), lpAsset)]
359359 }
360360 }
361361
362362
363363
364364 @Callable(i)
365365 func removeLiquidity (asset1,asset2,lpAmount) = {
366366 let power = getBooleanValue(this, ac)
367367 let liquidityPower = getBooleanValue(this, liquidityAc)
368368 let poolKey = kp(asset1, asset2)
369369 let lpAssetId = getStringValue(this, (lp + poolKey))
370370 let lpAsset = fromBase58String(lpAssetId)
371371 let pmt = i.payments[0]
372372 let pmtAssetId = match pmt.assetId {
373373 case a: ByteVector =>
374374 toBase58String(a)
375375 case _ =>
376376 "GIC"
377377 }
378378 let decimals1 = getAssetDecimals(asset1)
379379 let decimals2 = getAssetDecimals(asset2)
380380 if (!(power))
381381 then throw("dApp is currently under maintenance")
382382 else if (liquidityPower)
383383 then throw("Liquidity is currently under maintenance")
384384 else if ((lpAssetId == ""))
385385 then throw("Invalid LP asset")
386386 else if ((pmtAssetId != lpAssetId))
387387 then throw("Invalid LP token")
388388 else if ((validPoolK(poolKey) == 0))
389389 then throw("Pool does not exist")
390390 else if ((0 >= lpAmount))
391391 then throw("LP amount must be positive")
392392 else {
393393 let poolAmount1 = poolAA(poolKey, asset1)
394394 let poolAmount2 = poolAA(poolKey, asset2)
395395 let totalLpSupply = match assetInfo(fromBase58String(lpAssetId)) {
396396 case a: Asset =>
397397 a.quantity
398398 case _ =>
399399 0
400400 }
401401 let amount1 = ((lpAmount * poolAmount1) / totalLpSupply)
402402 let amount2 = ((lpAmount * poolAmount2) / totalLpSupply)
403403 let currentKey = toBase58String(i.caller.bytes)
404404 let currentAmountAsset1 = userLiquidity(currentKey, poolKey, asset1)
405405 let currentAmountAsset2 = userLiquidity(currentKey, poolKey, asset2)
406406 let newAmountAsset1 = (currentAmountAsset1 - amount1)
407407 let newAmountAsset2 = (currentAmountAsset2 - amount2)
408408 if (if ((0 > newAmountAsset1))
409409 then true
410410 else (0 > newAmountAsset2))
411411 then throw("Insufficient liquidity balance")
412412 else {
413413 let newPoolAmount1 = (poolAmount1 - amount1)
414414 let newPoolAmount2 = (poolAmount2 - amount2)
415415 let asset1Bytes = if ((asset1 == "GIC"))
416416 then unit
417417 else fromBase58String(asset1)
418418 let asset2Bytes = if ((asset2 == "GIC"))
419419 then unit
420420 else fromBase58String(asset2)
421421 let oldAssetLpTotal = getIntegerValue(poolKey)
422422 [IntegerEntry(((((poolKey + "_") + currentKey) + "_") + asset1), newAmountAsset1), IntegerEntry(((((poolKey + "_") + currentKey) + "_") + asset2), newAmountAsset2), IntegerEntry(((poolKey + "_") + asset1), newPoolAmount1), IntegerEntry(((poolKey + "_") + asset2), newPoolAmount2), IntegerEntry(poolKey, (oldAssetLpTotal - lpAmount)), Burn(lpAsset, lpAmount), ScriptTransfer(i.caller, amount1, asset1Bytes), ScriptTransfer(i.caller, amount2, asset2Bytes)]
423423 }
424424 }
425425 }
426426
427427
428428
429429 @Callable(i)
430430 func swap (assetIn,assetOut,maxSlippage) = {
431431 let power = getBooleanValue(this, ac)
432432 let swapActivate = getBooleanValue(this, swapAc)
433433 let acGic = getBooleanValue(this, "accept_gic")
434434 let poolKey = kp(assetIn, assetOut)
435435 let reversePoolKey = kp(assetOut, assetIn)
436436 let key = if ((validPoolK(poolKey) != 0))
437437 then poolKey
438438 else if ((validPoolK(reversePoolKey) != 0))
439439 then reversePoolKey
440440 else ""
441441 let pmt = i.payments[0]
442442 let pmtAssetId = match pmt.assetId {
443443 case a: ByteVector =>
444444 toBase58String(a)
445445 case _ =>
446446 "GIC"
447447 }
448448 let decimalsIn = getAssetDecimals(assetIn)
449449 let decimalsOut = getAssetDecimals(assetOut)
450450 let feeBps = toBigInt(getIntegerValue(this, swapFee))
451451 let adminAddr = addressFromStringValue(getStringValue(this, adminAddress))
452452 if (!(power))
453453 then throw("dApp is currently under maintenance")
454454 else if (swapActivate)
455455 then throw("Swap is currently under maintenance")
456456 else if ((pmtAssetId != assetIn))
457457 then throw("Payment asset does not match assetIn")
458458 else if (!(isValidAsset(assetIn)))
459459 then throw("Invalid assetIn")
460460 else if (!(isValidAsset(assetOut)))
461461 then throw("Invalid assetOut")
462462 else if (if (isBlacklisted(assetIn))
463463 then true
464464 else isBlacklisted(assetOut))
465465 then throw("One or both assets are blacklisted")
466466 else if ((assetIn == assetOut))
467467 then throw("assetIn cannot be equal to assetOut")
468468 else if (if (if ((assetIn == "GIC"))
469469 then true
470470 else (assetOut == "GIC"))
471471 then !(acGic)
472472 else false)
473473 then throw("GIC not allowed")
474474 else if ((key == ""))
475475 then throw("Pool does not exist")
476476 else {
477477 let isReverse = (key == reversePoolKey)
478478 let poolAsset1 = if (isReverse)
479479 then assetOut
480480 else assetIn
481481 let poolAsset2 = if (isReverse)
482482 then assetIn
483483 else assetOut
484484 let poolAmount1 = toBigInt(poolAA(key, poolAsset1))
485485 let poolAmount2 = toBigInt(poolAA(key, poolAsset2))
486486 let amountInAdjusted = toBigInt(pmt.amount)
487487 let amountOut = if (isReverse)
488488 then ((amountInAdjusted * poolAmount2) / (poolAmount1 + amountInAdjusted))
489489 else ((amountInAdjusted * poolAmount2) / poolAmount1)
490490 let fee = ((amountOut * feeBps) / toBigInt(10000))
491491 let amountOutAfterFee = (amountOut - fee)
492+ let feeToSend = ((amountInAdjusted * feeBps) / toBigInt(10000))
492493 let minAmountOut = ((amountOutAfterFee * toBigInt((10000 - maxSlippage))) / toBigInt(10000))
493494 if ((minAmountOut > amountOutAfterFee))
494495 then throw("Slippage exceeded")
495496 else {
496497 let newPoolAmount1 = (poolAmount1 + (if (isReverse)
497498 then toBigInt(0)
498499 else amountInAdjusted))
499500 let newPoolAmount2 = (poolAmount2 - amountOut)
500501 let assetOutBytes = if ((assetOut == "GIC"))
501502 then unit
502503 else fromBase58String(assetOut)
503-[IntegerEntry(((key + "_") + poolAsset1), toInt(newPoolAmount1)), IntegerEntry(((key + "_") + poolAsset2), toInt(newPoolAmount2)), ScriptTransfer(i.caller, toInt(amountOutAfterFee), assetOutBytes), ScriptTransfer(adminAddr, toInt(fee), assetOutBytes)]
504+[IntegerEntry(((key + "_") + poolAsset1), toInt(newPoolAmount1)), IntegerEntry(((key + "_") + poolAsset2), toInt(newPoolAmount2)), ScriptTransfer(i.caller, toInt(amountOutAfterFee), assetOutBytes), ScriptTransfer(adminAddr, toInt(feeToSend), assetOutBytes)]
504505 }
505506 }
506507 }
507508
508509
509510
510511 @Callable(i)
511512 func farmsAddLP (asset1,asset2) = {
512513 let power = getBooleanValue(this, ac)
513514 let farmPower = getBooleanValue(this, farmAc)
514515 let poolKey = kp(asset1, asset2)
515516 let farmKey = fk(asset1, asset2)
516517 let pmt = i.payments[0]
517518 let lpAssetId = getStringValue(this, (lp + poolKey))
518519 let pmtAssetId = match pmt.assetId {
519520 case a: ByteVector =>
520521 toBase58String(a)
521522 case _ =>
522523 "GIC"
523524 }
524525 if (!(power))
525526 then throw("dApp is currently under maintenance")
526527 else if (farmPower)
527528 then throw("Farms are currently under maintenance")
528529 else if ((pmtAssetId != lpAssetId))
529530 then throw("Invalid LP token")
530531 else if ((validPoolK(poolKey) == 0))
531532 then throw("Pool does not exist")
532533 else if ((valueOrElse(getInteger(this, farmKey), 0) == 0))
533534 then throw("Farm does not exist")
534535 else {
535536 let currentKey = toBase58String(i.caller.bytes)
536537 let stakedKey = sk(asset1, asset2, currentKey)
537538 let currentStaked = valueOrElse(getInteger(this, stakedKey), 0)
538539 let newStaked = (currentStaked + pmt.amount)
539540 let totalStakedKey = (farmTotalStaked + poolKey)
540541 let previousTotalStaked = valueOrElse(getInteger(this, totalStakedKey), 0)
541542 let newTotalStaked = (previousTotalStaked + pmt.amount)
542543 let totalUsers = valueOrElse(getInteger(this, (totalUsersFarm + poolKey)), 0)
543544 let newTotalUsers = if ((currentStaked == 0))
544545 then (totalUsers + 1)
545546 else totalUsers
546547 [IntegerEntry(stakedKey, newStaked), IntegerEntry(totalStakedKey, newTotalStaked), IntegerEntry((totalUsersFarm + poolKey), newTotalUsers), IntegerEntry(fh(asset1, asset2, currentKey), height)]
547548 }
548549 }
549550
550551
551552
552553 @Callable(i)
553554 func farmsClaimLP (asset1,asset2) = {
554555 let power = getBooleanValue(this, ac)
555556 let farmPower = getBooleanValue(this, farmAc)
556557 let poolKey = kp(asset1, asset2)
557558 let farmKey = fk(asset1, asset2)
558559 let currentKey = toBase58String(i.caller.bytes)
559560 let stakedKey = sk(asset1, asset2, currentKey)
560561 let heightKey = fh(asset1, asset2, currentKey)
561562 let rewardKey = rk(asset1, asset2, currentKey)
562563 if (!(power))
563564 then throw("dApp is currently under maintenance")
564565 else if (farmPower)
565566 then throw("Farms are currently under maintenance")
566567 else if ((validPoolK(poolKey) == 0))
567568 then throw("Pool does not exist")
568569 else if ((valueOrElse(getInteger(this, farmKey), 0) == 0))
569570 then throw("Farm does not exist")
570571 else {
571572 let currentStaked = valueOrElse(getInteger(this, stakedKey), 0)
572573 if ((0 >= currentStaked))
573574 then throw("No staked LP tokens")
574575 else {
575576 let rewardPool = valueOrElse(getInteger(this, (farmRewardPool + poolKey)), 0)
576577 let totalUsers = valueOrElse(getInteger(this, (totalUsersFarm + poolKey)), 1)
577578 let lockBlocks = getIntegerValue(this, (farmLockBlocks + poolKey))
578579 let apr = getIntegerValue(this, (farmApr + poolKey))
579580 let lastClaimHeight = valueOrElse(getInteger(this, heightKey), height)
580581 let blocksSinceLastClaim = (height - lastClaimHeight)
581582 if ((1 > blocksSinceLastClaim))
582583 then throw("Must wait at least 1 block since last claim")
583584 else {
584585 let rewardPerBlock = ((rewardPool * apr) / ((10000 * lockBlocks) * totalUsers))
585586 let reward = (((rewardPerBlock * blocksSinceLastClaim) * currentStaked) / D8)
586587 if ((reward > rewardPool))
587588 then throw("Insufficient reward pool")
588589 else {
589590 let newRewardPool = (rewardPool - reward)
590591 [IntegerEntry(rewardKey, 0), IntegerEntry((farmRewardPool + poolKey), newRewardPool), IntegerEntry(heightKey, height), ScriptTransfer(i.caller, reward, unit)]
591592 }
592593 }
593594 }
594595 }
595596 }
596597
597598
598599
599600 @Callable(i)
600601 func farmsRemoveLP (asset1,asset2,amount) = {
601602 let power = getBooleanValue(this, ac)
602603 let farmPower = getBooleanValue(this, farmAc)
603604 let poolKey = kp(asset1, asset2)
604605 let farmKey = fk(asset1, asset2)
605606 let lpAssetId = getStringValue(this, (lp + poolKey))
606607 let lpAsset = if ((lpAssetId == ""))
607608 then unit
608609 else fromBase58String(lpAssetId)
609610 let currentKey = toBase58String(i.caller.bytes)
610611 let stakedKey = sk(asset1, asset2, currentKey)
611612 let heightKey = fh(asset1, asset2, currentKey)
612613 let rewardKey = rk(asset1, asset2, currentKey)
613614 if (!(power))
614615 then throw("dApp is currently under maintenance")
615616 else if (farmPower)
616617 then throw("Farms are currently under maintenance")
617618 else if ((validPoolK(poolKey) == 0))
618619 then throw("Pool does not exist")
619620 else if ((valueOrElse(getInteger(this, farmKey), 0) == 0))
620621 then throw("Farm does not exist")
621622 else {
622623 let currentStaked = valueOrElse(getInteger(this, stakedKey), 0)
623624 if ((0 >= amount))
624625 then throw("Amount must be positive")
625626 else if ((amount > currentStaked))
626627 then throw("Insufficient staked LP tokens")
627628 else {
628629 let rewardPool = valueOrElse(getInteger(this, (farmRewardPool + poolKey)), 0)
629630 let totalUsers = valueOrElse(getInteger(this, (totalUsersFarm + poolKey)), 1)
630631 let lockBlocks = getIntegerValue(this, (farmLockBlocks + poolKey))
631632 let apr = getIntegerValue(this, (farmApr + poolKey))
632633 let lastClaimHeight = valueOrElse(getInteger(this, heightKey), height)
633634 let blocksSinceLastClaim = (height - lastClaimHeight)
634635 let rewardPerBlock = ((rewardPool * apr) / ((10000 * lockBlocks) * totalUsers))
635636 let reward = if ((blocksSinceLastClaim >= 1))
636637 then (((rewardPerBlock * blocksSinceLastClaim) * currentStaked) / D8)
637638 else 0
638639 let newRewardPool = (rewardPool - reward)
639640 let newStaked = (currentStaked - amount)
640641 let totalStakedKey = (farmTotalStaked + poolKey)
641642 let previousTotalStaked = valueOrElse(getInteger(this, totalStakedKey), 0)
642643 let newTotalStaked = (previousTotalStaked - amount)
643644 let newTotalUsers = if ((newStaked == 0))
644645 then (totalUsers - 1)
645646 else totalUsers
646647 [IntegerEntry(stakedKey, newStaked), IntegerEntry(totalStakedKey, newTotalStaked), IntegerEntry((totalUsersFarm + poolKey), newTotalUsers), IntegerEntry(rewardKey, 0), IntegerEntry((farmRewardPool + poolKey), newRewardPool), IntegerEntry(heightKey, height), ScriptTransfer(i.caller, amount, lpAsset), ScriptTransfer(i.caller, reward, unit)]
647648 }
648649 }
649650 }
650651
651652
652653 @Verifier(tx)
653654 func verify () = match tx {
654655 case _ =>
655656 sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
656657 }
657658

github/gicsportsofficial/g8-explorer
98.21 ms