tx · HN36wJ4qUfWSUcRcrSAeuFvwtUGjqHYkfhxeSAAmEjFd

3MsryPHGVR5NWpGqXNw1LbqEYUx3Vk88yxN:  -0.05000000 Waves

2021.08.10 20:21 [1652541] smart account 3MsryPHGVR5NWpGqXNw1LbqEYUx3Vk88yxN > SELF 0.00000000 Waves

{ "type": 13, "id": "HN36wJ4qUfWSUcRcrSAeuFvwtUGjqHYkfhxeSAAmEjFd", "fee": 5000000, "feeAssetId": null, "timestamp": 1628616101499, "version": 2, "chainId": 84, "sender": "3MsryPHGVR5NWpGqXNw1LbqEYUx3Vk88yxN", "senderPublicKey": "EkxY8bYYRAdDeo26yCeHLGSzDnPpuye9m2yxFRQGpXVy", "proofs": [ "4SvJ5JbjAfyhR7bG9wNyZx8gR1kTSmUPovuQ4kSWSfHGWMPeYkGYJqeJLoMXi1mtePCDx9THQpyv8iEPfyo1TbTK" ], "script": "base64:AAIFAAAAAAAAACMIAhIAEgMKAQESABIAEgcKBQgICAgBEgMKAQESABIAEgASAAAAACUAAAAACmxQZGVjaW1hbHMAAAAAAAAAAAgAAAAAEWRlY2ltYWxzTXVsdFByaWNlCQAAaAAAAAIJAABoAAAAAgAAAAAAAAAAZAAAAAAAAAAD6AAAAAAAAAAD6AAAAAADU0VQAgAAAAJfXwAAAAAKUG9vbEFjdGl2ZQAAAAAAAAAAAQAAAAAPUG9vbFB1dERpc2FibGVkAAAAAAAAAAACAAAAABNQb29sTWF0Y2hlckRpc2FibGVkAAAAAAAAAAADAAAAAAxQb29sU2h1dGRvd24AAAAAAAAAAAQAAAAAEGZhY3RvcnlQdWJsaWNLZXkJAAJZAAAAAQIAAAArTWltUXRCeDdhemhTdEFIMlI1UVY3VWs4aFdFYm03cTg5NzkzZmsxajFtaAAAAAAOaWR4UG9vbEFkZHJlc3MAAAAAAAAAAAIAAAAADWlkeFBvb2xTdGF0dXMAAAAAAAAAAAMAAAAAEGlkeFBvb2xMUEFzc2V0SWQAAAAAAAAAAAQAAAAAEGlkeEFtb3VudEFzc2V0SWQAAAAAAAAAAAUAAAAAD2lkeFByaWNlQXNzZXRJZAAAAAAAAAAABgAAAAAWaWR4QW1vdW50QXNzZXREZWNpbWFscwAAAAAAAAAABwAAAAAVaWR4UHJpY2VBc3NldERlY2ltYWxzAAAAAAAAAAAIAAAAABhpZHhBbW91bnRBc3NldEludGVybmFsSWQAAAAAAAAAAAkAAAAAF2lkeFByaWNlQXNzZXRJbnRlcm5hbElkAAAAAAAAAAAKAAAAAA1pZHhQb29sV2VpZ2h0AAAAAAAAAAALAAAAABVpZHhQb29sQW1vdW50QXNzZXRBbXQAAAAAAAAAAAIAAAAAFGlkeFBvb2xQcmljZUFzc2V0QW10AAAAAAAAAAADAAAAABFpZHhQb29sTFBBc3NldEFtdAAAAAAAAAAABAEAAAAMa2V5UHJpY2VMYXN0AAAAAAIAAAARJXMlc19fcHJpY2VfX2xhc3QBAAAAD2tleVByaWNlSGlzdG9yeQAAAAIAAAABaAAAAAl0aW1lc3RhbXAJAAS5AAAAAgkABEwAAAACAgAAABglcyVzJWQlZF9fcHJpY2VfX2hpc3RvcnkJAARMAAAAAgkAAaQAAAABBQAAAAFoCQAETAAAAAIJAAGkAAAAAQUAAAAJdGltZXN0YW1wBQAAAANuaWwFAAAAA1NFUAEAAAAQa2V5UG9vbExpcXVpZGl0eQAAAAIAAAATaW50ZXJuYWxBbW91bnRBc3NldAAAABJpbnRlcm5hbFByaWNlQXNzZXQJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAIJWQlZCVzX18FAAAAE2ludGVybmFsQW1vdW50QXNzZXQCAAAAAl9fBQAAABJpbnRlcm5hbFByaWNlQXNzZXQCAAAACF9fbG9ja2VkAQAAABZrZXlQb29sTGlxdWlkaXR5QnlVc2VyAAAAAwAAABNpbnRlcm5hbEFtb3VudEFzc2V0AAAAEmludGVybmFsUHJpY2VBc3NldAAAAAt1c2VyQWRkcmVzcwkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAKJWQlZCVzJXNfXwUAAAATaW50ZXJuYWxBbW91bnRBc3NldAIAAAACX18FAAAAEmludGVybmFsUHJpY2VBc3NldAIAAAACX18FAAAAC3VzZXJBZGRyZXNzAgAAAAhfX2xvY2tlZAEAAAASa2V5UHV0QWN0aW9uQnlVc2VyAAAAAgAAAAt1c2VyQWRkcmVzcwAAAAR0eElkCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAslcyVzJXNfX1BfXwUAAAALdXNlckFkZHJlc3MCAAAAAl9fBQAAAAR0eElkAQAAABJrZXlHZXRBY3Rpb25CeVVzZXIAAAACAAAAC3VzZXJBZGRyZXNzAAAABHR4SWQJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAACyVzJXMlc19fR19fBQAAAAt1c2VyQWRkcmVzcwIAAAACX18FAAAABHR4SWQBAAAAKWtleU1hcHBpbmdQb29sQ29udHJhY3RBZGRyZXNzVG9Qb29sQXNzZXRzAAAAAQAAABNwb29sQ29udHJhY3RBZGRyZXNzCQABLAAAAAIJAAEsAAAAAgIAAAAIJXMlcyVzX18FAAAAE3Bvb2xDb250cmFjdEFkZHJlc3MCAAAAIF9fbWFwcGluZ3NfX3Bvb2xDb250cmFjdDJMcEFzc2V0AQAAAA1rZXlQb29sQ29uZmlnAAAAAgAAABNhbW91bnRBc3NldEludGVybmFsAAAAEnByaWNlQXNzZXRJbnRlcm5hbAkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAolcyVkJWQlc19fBQAAABNhbW91bnRBc3NldEludGVybmFsAgAAAAJfXwUAAAAScHJpY2VBc3NldEludGVybmFsAgAAAAhfX2NvbmZpZwEAAAANZ2V0UG9vbENvbmZpZwAAAAAEAAAADmZhY3RvcnlBZGRyZXNzCQEAAAAUYWRkcmVzc0Zyb21QdWJsaWNLZXkAAAABBQAAABBmYWN0b3J5UHVibGljS2V5BAAAABFjdXJyZW50UG9vbEFzc2V0cwkABLUAAAACCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQdAAAAAgUAAAAOZmFjdG9yeUFkZHJlc3MJAQAAAClrZXlNYXBwaW5nUG9vbENvbnRyYWN0QWRkcmVzc1RvUG9vbEFzc2V0cwAAAAEJAAQlAAAAAQUAAAAEdGhpcwIAAAApTm8gZmFjdG9yeSBjb25maWcgZm91bmQgZm9yIHBvb2wgYWRkcmVzcy4FAAAAA1NFUAQAAAARY3VycmVudFBvb2xDb25maWcJAAS1AAAAAgkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAADmZhY3RvcnlBZGRyZXNzCQEAAAANa2V5UG9vbENvbmZpZwAAAAIJAAGRAAAAAgUAAAARY3VycmVudFBvb2xBc3NldHMAAAAAAAAAAAIJAAGRAAAAAgUAAAARY3VycmVudFBvb2xBc3NldHMAAAAAAAAAAAMCAAAAKE5vIGZhY3RvcnkgY29uZmlnIGZvdW5kIGZvciBwb29sIGFzc2V0cy4FAAAAA1NFUAUAAAARY3VycmVudFBvb2xDb25maWcBAAAAEGdldFBvb2xMaXF1aWRpdHkAAAACAAAAFWFtb3VudEFzc2V0SW50ZXJuYWxJZAAAABRwcmljZUFzc2V0SW50ZXJuYWxJZAQAAAAZY3VycmVudFBvb2xMaXF1aWRpdHlWYWx1ZQkABCIAAAABCQEAAAAQa2V5UG9vbExpcXVpZGl0eQAAAAIFAAAAFWFtb3VudEFzc2V0SW50ZXJuYWxJZAUAAAAUcHJpY2VBc3NldEludGVybmFsSWQDCQEAAAABIQAAAAEJAQAAAAlpc0RlZmluZWQAAAABBQAAABljdXJyZW50UG9vbExpcXVpZGl0eVZhbHVlBQAAAANuaWwEAAAAFGN1cnJlbnRQb29sTGlxdWlkaXR5CQAEtQAAAAIJAQAAAAV2YWx1ZQAAAAEFAAAAGWN1cnJlbnRQb29sTGlxdWlkaXR5VmFsdWUFAAAAA1NFUAUAAAAUY3VycmVudFBvb2xMaXF1aWRpdHkBAAAAFmdldFBvb2xMaXF1aWRpdHlCeVVzZXIAAAADAAAAFWFtb3VudEFzc2V0SW50ZXJuYWxJZAAAABRwcmljZUFzc2V0SW50ZXJuYWxJZAAAAAt1c2VyQWRkcmVzcwMGCQAAAgAAAAECAAAABUdTREZTBAAAABljdXJyZW50UG9vbExpcXVpZGl0eVZhbHVlCQAEIgAAAAEJAQAAABZrZXlQb29sTGlxdWlkaXR5QnlVc2VyAAAAAwUAAAAVYW1vdW50QXNzZXRJbnRlcm5hbElkBQAAABRwcmljZUFzc2V0SW50ZXJuYWxJZAUAAAALdXNlckFkZHJlc3MDCQEAAAABIQAAAAEJAQAAAAlpc0RlZmluZWQAAAABBQAAABljdXJyZW50UG9vbExpcXVpZGl0eVZhbHVlCQAETAAAAAICAAAAAAkABEwAAAACAgAAAAEwCQAETAAAAAICAAAAATAJAARMAAAAAgIAAAABMAUAAAADbmlsBAAAABRjdXJyZW50UG9vbExpcXVpZGl0eQkABLUAAAACCQEAAAAFdmFsdWUAAAABBQAAABljdXJyZW50UG9vbExpcXVpZGl0eVZhbHVlBQAAAANTRVAFAAAAFGN1cnJlbnRQb29sTGlxdWlkaXR5AQAAABFkYXRhUG9vbExpcXVpZGl0eQAAAAMAAAARYW1vdW50QXNzZXRMb2NrZWQAAAAQcHJpY2VBc3NldExvY2tlZAAAAA1scFRva2VuTG9ja2VkCQAEuQAAAAIJAARMAAAAAgIAAAAGJWQlZCVkCQAETAAAAAIJAAGkAAAAAQUAAAARYW1vdW50QXNzZXRMb2NrZWQJAARMAAAAAgkAAaQAAAABBQAAABBwcmljZUFzc2V0TG9ja2VkCQAETAAAAAIJAAGkAAAAAQUAAAANbHBUb2tlbkxvY2tlZAUAAAADbmlsBQAAAANTRVABAAAAEWRhdGFQdXRBY3Rpb25JbmZvAAAABwAAABBpbkFtb3VudEFzc2V0QW10AAAAD2luUHJpY2VBc3NldEFtdAAAAAhvdXRMcEFtdAAAAAVwcmljZQAAAB1zbGlwcGFnZVRvbGVyYW5jZVBhc3NlZEJ5VXNlcgAAAAh0eEhlaWdodAAAAAt0eFRpbWVzdGFtcAkABLkAAAACCQAETAAAAAICAAAADiVkJWQlZCVkJWQlZCVkCQAETAAAAAIJAAGkAAAAAQUAAAAQaW5BbW91bnRBc3NldEFtdAkABEwAAAACCQABpAAAAAEFAAAAD2luUHJpY2VBc3NldEFtdAkABEwAAAACCQABpAAAAAEFAAAACG91dExwQW10CQAETAAAAAIJAAGkAAAAAQUAAAAFcHJpY2UJAARMAAAAAgkAAaQAAAABBQAAAB1zbGlwcGFnZVRvbGVyYW5jZVBhc3NlZEJ5VXNlcgkABEwAAAACCQABpAAAAAEFAAAACHR4SGVpZ2h0CQAETAAAAAIJAAGkAAAAAQUAAAALdHhUaW1lc3RhbXAFAAAAA25pbAUAAAADU0VQAQAAABFkYXRhR2V0QWN0aW9uSW5mbwAAAAYAAAARb3V0QW1vdW50QXNzZXRBbXQAAAAQb3V0UHJpY2VBc3NldEFtdAAAAAdpbkxwQW10AAAABXByaWNlAAAACHR4SGVpZ2h0AAAAC3R4VGltZXN0YW1wCQAEuQAAAAIJAARMAAAAAgIAAAAMJWQlZCVkJWQlZCVkCQAETAAAAAIJAAGkAAAAAQUAAAARb3V0QW1vdW50QXNzZXRBbXQJAARMAAAAAgkAAaQAAAABBQAAABBvdXRQcmljZUFzc2V0QW10CQAETAAAAAIJAAGkAAAAAQUAAAAHaW5McEFtdAkABEwAAAACCQABpAAAAAEFAAAABXByaWNlCQAETAAAAAIJAAGkAAAAAQUAAAAIdHhIZWlnaHQJAARMAAAAAgkAAaQAAAABBQAAAAt0eFRpbWVzdGFtcAUAAAADbmlsBQAAAANTRVABAAAAF2RhdGFQb29sTGlxdWlkaXR5QnlVc2VyAAAABAAAABFhbW91bnRBc3NldExvY2tlZAAAABBwcmljZUFzc2V0TG9ja2VkAAAADWxwVG9rZW5Mb2NrZWQAAAALdXNlckFkZHJlc3MJAAS5AAAAAgkABEwAAAACAgAAAAYlZCVkJWQJAARMAAAAAgkAAaQAAAABBQAAABFhbW91bnRBc3NldExvY2tlZAkABEwAAAACCQABpAAAAAEFAAAAEHByaWNlQXNzZXRMb2NrZWQJAARMAAAAAgkAAaQAAAABBQAAAA1scFRva2VuTG9ja2VkBQAAAANuaWwFAAAAA1NFUAEAAAAOY2FsY3VsYXRlUHJpY2UAAAAEAAAADmFtb3VudEFzc2V0QW10AAAAE2Ftb3VudEFzc2V0RGVjaW1hbHMAAAANcHJpY2VBc3NldEFtdAAAABJwcmljZUFzc2V0RGVjaW1hbHMEAAAAGGRlY2ltYWxzTXVsdDRBbW91bnRBc3NldAkAAGwAAAAGAAAAAAAAAAAKAAAAAAAAAAAACQAAZQAAAAIFAAAACmxQZGVjaW1hbHMFAAAAE2Ftb3VudEFzc2V0RGVjaW1hbHMAAAAAAAAAAAAAAAAAAAAAAAAFAAAABERPV04EAAAAF2RlY2ltYWxzTXVsdDRQcmljZUFzc2V0CQAAbAAAAAYAAAAAAAAAAAoAAAAAAAAAAAAJAABlAAAAAgUAAAAKbFBkZWNpbWFscwUAAAAScHJpY2VBc3NldERlY2ltYWxzAAAAAAAAAAAAAAAAAAAAAAAABQAAAARET1dOBAAAABVpbkFtb3VudEFzc2V0QW10RmluYWwJAABoAAAAAgUAAAAOYW1vdW50QXNzZXRBbXQFAAAAGGRlY2ltYWxzTXVsdDRBbW91bnRBc3NldAQAAAAPaW5QcmljZUFtdEZpbmFsCQAAaAAAAAIFAAAADXByaWNlQXNzZXRBbXQFAAAAF2RlY2ltYWxzTXVsdDRQcmljZUFzc2V0BAAAAAVwcmljZQkAAGsAAAADBQAAAA9pblByaWNlQW10RmluYWwFAAAAEWRlY2ltYWxzTXVsdFByaWNlBQAAABVpbkFtb3VudEFzc2V0QW10RmluYWwFAAAABXByaWNlAAAACgAAAAFpAQAAAA1nZXRTY3JpcHRIYXNoAAAAAAQAAAAEaGFzaAkAAloAAAABCQEAAAAFdmFsdWUAAAABCQAD8QAAAAEFAAAABHRoaXMJAAACAAAAAQUAAAAEaGFzaAAAAAFpAQAAAANwdXQAAAABAAAAEXNsaXBwYWdlVG9sZXJhbmNlBAAAABJwb29sQ29uZmlnRGF0YUxpc3QJAQAAAA1nZXRQb29sQ29uZmlnAAAAAAQAAAAJbHBBc3NldElkCQACWQAAAAEJAAGRAAAAAgUAAAAScG9vbENvbmZpZ0RhdGFMaXN0BQAAABBpZHhQb29sTFBBc3NldElkBAAAAA1hbW91bnRBc3NldElkCQABkQAAAAIFAAAAEnBvb2xDb25maWdEYXRhTGlzdAUAAAAQaWR4QW1vdW50QXNzZXRJZAQAAAAMcHJpY2VBc3NldElkCQABkQAAAAIFAAAAEnBvb2xDb25maWdEYXRhTGlzdAUAAAAPaWR4UHJpY2VBc3NldElkBAAAABVhbW91bnRBc3NldEludGVybmFsSWQJAAGRAAAAAgUAAAAScG9vbENvbmZpZ0RhdGFMaXN0BQAAABhpZHhBbW91bnRBc3NldEludGVybmFsSWQEAAAAFHByaWNlQXNzZXRJbnRlcm5hbElkCQABkQAAAAIFAAAAEnBvb2xDb25maWdEYXRhTGlzdAUAAAAXaWR4UHJpY2VBc3NldEludGVybmFsSWQEAAAAEmFtb3V0QXNzZXREZWNpbWFscwkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAEnBvb2xDb25maWdEYXRhTGlzdAUAAAAWaWR4QW1vdW50QXNzZXREZWNpbWFscwQAAAAScHJpY2VBc3NldERlY2ltYWxzCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAScG9vbENvbmZpZ0RhdGFMaXN0BQAAABVpZHhQcmljZUFzc2V0RGVjaW1hbHMEAAAADnBtdEFtb3VudEFzc2V0CQEAAAAFdmFsdWUAAAABCQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAABAAAABBpbkFtb3VudEFzc2V0QW10CAUAAAAOcG10QW1vdW50QXNzZXQAAAAGYW1vdW50BAAAAA9pbkFtb3VudEFzc2V0SWQJAQAAAAV2YWx1ZQAAAAEIBQAAAA5wbXRBbW91bnRBc3NldAAAAAdhc3NldElkBAAAAA1wbXRQcmljZUFzc2V0CQEAAAAFdmFsdWUAAAABCQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAABBAAAAA9pblByaWNlQXNzZXRBbXQIBQAAAA1wbXRQcmljZUFzc2V0AAAABmFtb3VudAQAAAAOaW5QcmljZUFzc2V0SWQJAQAAAAV2YWx1ZQAAAAEIBQAAAA1wbXRQcmljZUFzc2V0AAAAB2Fzc2V0SWQEAAAAFXBvb2xMaXF1aWRpdHlEYXRhTGlzdAkBAAAAEGdldFBvb2xMaXF1aWRpdHkAAAACBQAAABVhbW91bnRBc3NldEludGVybmFsSWQFAAAAFHByaWNlQXNzZXRJbnRlcm5hbElkBAAAABZwb29sQW1vdW50QXNzZXRCYWxhbmNlCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAVcG9vbExpcXVpZGl0eURhdGFMaXN0BQAAABVpZHhQb29sQW1vdW50QXNzZXRBbXQEAAAAFXBvb2xQcmljZUFzc2V0QmFsYW5jZQkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAFXBvb2xMaXF1aWRpdHlEYXRhTGlzdAUAAAAUaWR4UG9vbFByaWNlQXNzZXRBbXQEAAAADXBvb2xMUEJhbGFuY2UJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAABVwb29sTGlxdWlkaXR5RGF0YUxpc3QFAAAAEWlkeFBvb2xMUEFzc2V0QW10BAAAABV1c2VyTGlxdWlkaXR5RGF0YUxpc3QJAQAAABZnZXRQb29sTGlxdWlkaXR5QnlVc2VyAAAAAwUAAAAVYW1vdW50QXNzZXRJbnRlcm5hbElkBQAAABRwcmljZUFzc2V0SW50ZXJuYWxJZAkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIEAAAAFnVzZXJBbW91bnRBc3NldEJhbGFuY2UJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAABV1c2VyTGlxdWlkaXR5RGF0YUxpc3QFAAAAFWlkeFBvb2xBbW91bnRBc3NldEFtdAQAAAAVdXNlclByaWNlQXNzZXRCYWxhbmNlCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAVdXNlckxpcXVpZGl0eURhdGFMaXN0BQAAABRpZHhQb29sUHJpY2VBc3NldEFtdAQAAAANdXNlckxQQmFsYW5jZQkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAFXVzZXJMaXF1aWRpdHlEYXRhTGlzdAUAAAARaWR4UG9vbExQQXNzZXRBbXQDAwkBAAAAAiE9AAAAAgUAAAANYW1vdW50QXNzZXRJZAkAAlgAAAABBQAAAA9pbkFtb3VudEFzc2V0SWQGCQEAAAACIT0AAAACBQAAAAxwcmljZUFzc2V0SWQJAAJYAAAAAQUAAAAOaW5QcmljZUFzc2V0SWQJAAACAAAAAQIAAAAlSW52YWxpZCBhbW91bnQgb3IgcHJpY2UgYXNzZXQgcGFzc2VkLgQAAAAYZGVjaW1hbHNNdWx0NEFtb3VudEFzc2V0CQAAbAAAAAYAAAAAAAAAAAoAAAAAAAAAAAAJAABlAAAAAgUAAAAKbFBkZWNpbWFscwUAAAASYW1vdXRBc3NldERlY2ltYWxzAAAAAAAAAAAAAAAAAAAAAAAABQAAAARET1dOBAAAABdkZWNpbWFsc011bHQ0UHJpY2VBc3NldAkAAGwAAAAGAAAAAAAAAAAKAAAAAAAAAAAACQAAZQAAAAIFAAAACmxQZGVjaW1hbHMFAAAAEnByaWNlQXNzZXREZWNpbWFscwAAAAAAAAAAAAAAAAAAAAAAAAUAAAAERE9XTgQAAAAaaW5BbW91bnRBc3NldEFtdENhbGN1bGF0ZWQJAABoAAAAAgUAAAAQaW5BbW91bnRBc3NldEFtdAUAAAAYZGVjaW1hbHNNdWx0NEFtb3VudEFzc2V0BAAAABlpblByaWNlQXNzZXRBbXRDYWxjdWxhdGVkCQAAaAAAAAIFAAAAD2luUHJpY2VBc3NldEFtdAUAAAAXZGVjaW1hbHNNdWx0NFByaWNlQXNzZXQEAAAAEWV4cGVjdGVkVXNlclByaWNlCQAAawAAAAMFAAAAGWluUHJpY2VBc3NldEFtdENhbGN1bGF0ZWQFAAAAEWRlY2ltYWxzTXVsdFByaWNlBQAAABppbkFtb3VudEFzc2V0QW10Q2FsY3VsYXRlZAQAAAAYYW1vdW50QXNzZXRQb29sTG9ja2VkQW10CQAAaAAAAAIFAAAAFnBvb2xBbW91bnRBc3NldEJhbGFuY2UFAAAAGGRlY2ltYWxzTXVsdDRBbW91bnRBc3NldAQAAAAXcHJpY2VBc3NldFBvb2xMb2NrZWRBbXQJAABoAAAAAgUAAAAVcG9vbFByaWNlQXNzZXRCYWxhbmNlBQAAABdkZWNpbWFsc011bHQ0UHJpY2VBc3NldAQAAAAQY3VycmVudFBvb2xQcmljZQkAAGsAAAADBQAAABdwcmljZUFzc2V0UG9vbExvY2tlZEFtdAUAAAARZGVjaW1hbHNNdWx0UHJpY2UFAAAAGGFtb3VudEFzc2V0UG9vbExvY2tlZEFtdAMJAAAAAAAAAgkAAZAAAAABBQAAABVwb29sTGlxdWlkaXR5RGF0YUxpc3QAAAAAAAAAAAAEAAAABXBhcnRBCQAAbAAAAAYFAAAAGmluQW1vdW50QXNzZXRBbXRDYWxjdWxhdGVkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyAAAAAAAAAAABBQAAAARET1dOBAAAAAVwYXJ0QgkAAGwAAAAGBQAAABlpblByaWNlQXNzZXRBbXRDYWxjdWxhdGVkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyAAAAAAAAAAABBQAAAARET1dOBAAAABBscEFzc2V0c1RvUmV0dXJuCQAAaAAAAAIFAAAABXBhcnRBBQAAAAVwYXJ0QgkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAMa2V5UHJpY2VMYXN0AAAAAAkAASwAAAACAgAAAAQlc19fCQABpAAAAAEFAAAAEGN1cnJlbnRQb29sUHJpY2UJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAD2tleVByaWNlSGlzdG9yeQAAAAIFAAAABmhlaWdodAgFAAAACWxhc3RCbG9jawAAAAl0aW1lc3RhbXAJAAEsAAAAAgIAAAAEJXNfXwkAAaQAAAABBQAAABBjdXJyZW50UG9vbFByaWNlCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABJrZXlQdXRBY3Rpb25CeVVzZXIAAAACCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgkAAlgAAAABCAUAAAABaQAAAA10cmFuc2FjdGlvbklkCQEAAAARZGF0YVB1dEFjdGlvbkluZm8AAAAHBQAAABBpbkFtb3VudEFzc2V0QW10BQAAAA9pblByaWNlQXNzZXRBbXQFAAAAEGxwQXNzZXRzVG9SZXR1cm4FAAAAEGN1cnJlbnRQb29sUHJpY2UFAAAAEXNsaXBwYWdlVG9sZXJhbmNlBQAAAAZoZWlnaHQIBQAAAAlsYXN0QmxvY2sAAAAJdGltZXN0YW1wCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABZrZXlQb29sTGlxdWlkaXR5QnlVc2VyAAAAAwUAAAAVYW1vdW50QXNzZXRJbnRlcm5hbElkBQAAABRwcmljZUFzc2V0SW50ZXJuYWxJZAkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIJAQAAABFkYXRhUG9vbExpcXVpZGl0eQAAAAMFAAAAEGluQW1vdW50QXNzZXRBbXQFAAAAD2luUHJpY2VBc3NldEFtdAUAAAAQbHBBc3NldHNUb1JldHVybgkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAQa2V5UG9vbExpcXVpZGl0eQAAAAIFAAAAFWFtb3VudEFzc2V0SW50ZXJuYWxJZAUAAAAUcHJpY2VBc3NldEludGVybmFsSWQJAQAAABFkYXRhUG9vbExpcXVpZGl0eQAAAAMFAAAAEGluQW1vdW50QXNzZXRBbXQFAAAAD2luUHJpY2VBc3NldEFtdAUAAAAQbHBBc3NldHNUb1JldHVybgkABEwAAAACCQEAAAAHUmVpc3N1ZQAAAAMFAAAACWxwQXNzZXRJZAUAAAAQbHBBc3NldHNUb1JldHVybgYJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAABBscEFzc2V0c1RvUmV0dXJuBQAAAAlscEFzc2V0SWQFAAAAA25pbAQAAAAIc2xpcHBhZ2UJAABrAAAAAwUAAAAQY3VycmVudFBvb2xQcmljZQAAAAAAAAAAZAUAAAARZXhwZWN0ZWRVc2VyUHJpY2UDCQAAZgAAAAIFAAAACHNsaXBwYWdlBQAAABFzbGlwcGFnZVRvbGVyYW5jZQkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAA9QcmljZSBzbGlwcGFnZSAJAAGkAAAAAQUAAAAIc2xpcHBhZ2UCAAAAHiBleGNlZWRlZCB0aGUgcGFzc2VkIGxpbWl0IG9mIAkAAaQAAAABBQAAABFzbGlwcGFnZVRvbGVyYW5jZQQAAAASbHBBbXRCeUFtb3VudEFzc2V0CQAAawAAAAMFAAAADXBvb2xMUEJhbGFuY2UFAAAAGmluQW1vdW50QXNzZXRBbXRDYWxjdWxhdGVkBQAAABhhbW91bnRBc3NldFBvb2xMb2NrZWRBbXQEAAAAEWxwQW10QnlQcmljZUFzc2V0CQAAawAAAAMFAAAADXBvb2xMUEJhbGFuY2UFAAAAGWluUHJpY2VBc3NldEFtdENhbGN1bGF0ZWQFAAAAF3ByaWNlQXNzZXRQb29sTG9ja2VkQW10BAAAAAx0b3RhbExwNFVzZXIDCQAAZgAAAAIFAAAAEWxwQW10QnlQcmljZUFzc2V0BQAAABJscEFtdEJ5QW1vdW50QXNzZXQFAAAAEmxwQW10QnlBbW91bnRBc3NldAUAAAARbHBBbXRCeVByaWNlQXNzZXQJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAADGtleVByaWNlTGFzdAAAAAAJAAEsAAAAAgIAAAAEJXNfXwkAAaQAAAABBQAAABBjdXJyZW50UG9vbFByaWNlCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAAA9rZXlQcmljZUhpc3RvcnkAAAACBQAAAAZoZWlnaHQIBQAAAAlsYXN0QmxvY2sAAAAJdGltZXN0YW1wCQABLAAAAAICAAAABCVzX18JAAGkAAAAAQUAAAAQY3VycmVudFBvb2xQcmljZQkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAASa2V5UHV0QWN0aW9uQnlVc2VyAAAAAgkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIJAAJYAAAAAQgFAAAAAWkAAAANdHJhbnNhY3Rpb25JZAkBAAAAEWRhdGFQdXRBY3Rpb25JbmZvAAAABwUAAAAQaW5BbW91bnRBc3NldEFtdAUAAAAPaW5QcmljZUFzc2V0QW10BQAAAAx0b3RhbExwNFVzZXIFAAAAEGN1cnJlbnRQb29sUHJpY2UFAAAAEXNsaXBwYWdlVG9sZXJhbmNlBQAAAAZoZWlnaHQIBQAAAAlsYXN0QmxvY2sAAAAJdGltZXN0YW1wCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABZrZXlQb29sTGlxdWlkaXR5QnlVc2VyAAAAAwUAAAAVYW1vdW50QXNzZXRJbnRlcm5hbElkBQAAABRwcmljZUFzc2V0SW50ZXJuYWxJZAkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIJAQAAABFkYXRhUG9vbExpcXVpZGl0eQAAAAMJAABkAAAAAgUAAAAWdXNlckFtb3VudEFzc2V0QmFsYW5jZQUAAAAQaW5BbW91bnRBc3NldEFtdAkAAGQAAAACBQAAABV1c2VyUHJpY2VBc3NldEJhbGFuY2UFAAAAD2luUHJpY2VBc3NldEFtdAkAAGQAAAACBQAAAA11c2VyTFBCYWxhbmNlBQAAAAx0b3RhbExwNFVzZXIJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAEGtleVBvb2xMaXF1aWRpdHkAAAACBQAAABVhbW91bnRBc3NldEludGVybmFsSWQFAAAAFHByaWNlQXNzZXRJbnRlcm5hbElkCQEAAAARZGF0YVBvb2xMaXF1aWRpdHkAAAADCQAAZAAAAAIFAAAAFnBvb2xBbW91bnRBc3NldEJhbGFuY2UFAAAAEGluQW1vdW50QXNzZXRBbXQJAABkAAAAAgUAAAAVcG9vbFByaWNlQXNzZXRCYWxhbmNlBQAAAA9pblByaWNlQXNzZXRBbXQJAABkAAAAAgUAAAANcG9vbExQQmFsYW5jZQUAAAAMdG90YWxMcDRVc2VyCQAETAAAAAIJAQAAAAdSZWlzc3VlAAAAAwUAAAAJbHBBc3NldElkBQAAAAx0b3RhbExwNFVzZXIGCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAMdG90YWxMcDRVc2VyBQAAAAlscEFzc2V0SWQFAAAAA25pbAAAAAFpAQAAAANnZXQAAAAABAAAAA5wb29sQ29uZmlnTGlzdAkBAAAADWdldFBvb2xDb25maWcAAAAABAAAAAlscEFzc2V0SWQJAAGRAAAAAgUAAAAOcG9vbENvbmZpZ0xpc3QFAAAAEGlkeFBvb2xMUEFzc2V0SWQEAAAADWFtb3VudEFzc2V0SWQJAAGRAAAAAgUAAAAOcG9vbENvbmZpZ0xpc3QFAAAAEGlkeEFtb3VudEFzc2V0SWQEAAAADHByaWNlQXNzZXRJZAkAAZEAAAACBQAAAA5wb29sQ29uZmlnTGlzdAUAAAAPaWR4UHJpY2VBc3NldElkBAAAABVhbW91bnRBc3NldEludGVybmFsSWQJAAGRAAAAAgUAAAAOcG9vbENvbmZpZ0xpc3QFAAAAGGlkeEFtb3VudEFzc2V0SW50ZXJuYWxJZAQAAAAUcHJpY2VBc3NldEludGVybmFsSWQJAAGRAAAAAgUAAAAOcG9vbENvbmZpZ0xpc3QFAAAAF2lkeFByaWNlQXNzZXRJbnRlcm5hbElkBAAAABF1c2VyTGlxdWlkaXR5TGlzdAkBAAAAFmdldFBvb2xMaXF1aWRpdHlCeVVzZXIAAAADBQAAABVhbW91bnRBc3NldEludGVybmFsSWQFAAAAFHByaWNlQXNzZXRJbnRlcm5hbElkCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgQAAAANdXNlckxQQmFsYW5jZQkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAEXVzZXJMaXF1aWRpdHlMaXN0BQAAABFpZHhQb29sTFBBc3NldEFtdAQAAAAWdXNlckFtb3VudEFzc2V0QmFsYW5jZQkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAEXVzZXJMaXF1aWRpdHlMaXN0BQAAABVpZHhQb29sQW1vdW50QXNzZXRBbXQEAAAAFXVzZXJQcmljZUFzc2V0QmFsYW5jZQkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAEXVzZXJMaXF1aWRpdHlMaXN0BQAAABRpZHhQb29sUHJpY2VBc3NldEFtdAQAAAARcG9vbExpcXVpZGl0eUxpc3QJAQAAABBnZXRQb29sTGlxdWlkaXR5AAAAAgUAAAAVYW1vdW50QXNzZXRJbnRlcm5hbElkBQAAABRwcmljZUFzc2V0SW50ZXJuYWxJZAQAAAANcG9vbExQQmFsYW5jZQkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAEXBvb2xMaXF1aWRpdHlMaXN0BQAAABFpZHhQb29sTFBBc3NldEFtdAQAAAAWcG9vbEFtb3VudEFzc2V0QmFsYW5jZQkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAEXBvb2xMaXF1aWRpdHlMaXN0BQAAABVpZHhQb29sQW1vdW50QXNzZXRBbXQEAAAAFXBvb2xQcmljZUFzc2V0QmFsYW5jZQkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAEXBvb2xMaXF1aWRpdHlMaXN0BQAAABRpZHhQb29sUHJpY2VBc3NldEFtdAQAAAAOcG10QW1vdW50QXNzZXQJAQAAAAV2YWx1ZQAAAAEJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAEAAAACnBtdEFzc2V0SWQJAQAAAAV2YWx1ZQAAAAEIBQAAAA5wbXRBbW91bnRBc3NldAAAAAdhc3NldElkBAAAAA5wbXRBc3NldEFtb3VudAgFAAAADnBtdEFtb3VudEFzc2V0AAAABmFtb3VudAMJAQAAAAIhPQAAAAIFAAAACWxwQXNzZXRJZAkAAlgAAAABBQAAAApwbXRBc3NldElkCQAAAgAAAAECAAAAFUludmFsaWQgYXNzZXQgcGFzc2VkLgMJAABmAAAAAgUAAAAOcG10QXNzZXRBbW91bnQFAAAADXVzZXJMUEJhbGFuY2UJAAACAAAAAQIAAAAySW52YWxpZCBhbW91bnQgcGFzc2VkLiBBbW91bnQgbGVzcyB0aGFuIGF2YWlsYWJsZS4EAAAAEW91dEFtb3VudEFzc2V0QW10CQAAawAAAAMFAAAAFnBvb2xBbW91bnRBc3NldEJhbGFuY2UFAAAADnBtdEFzc2V0QW1vdW50BQAAAA1wb29sTFBCYWxhbmNlBAAAABBvdXRQcmljZUFzc2V0QW10CQAAawAAAAMFAAAAFXBvb2xQcmljZUFzc2V0QmFsYW5jZQUAAAAOcG10QXNzZXRBbW91bnQFAAAADXBvb2xMUEJhbGFuY2UEAAAADGN1cnJlbnRQcmljZQkAAGsAAAADBQAAABVwb29sUHJpY2VBc3NldEJhbGFuY2UFAAAAEWRlY2ltYWxzTXVsdFByaWNlBQAAABZwb29sQW1vdW50QXNzZXRCYWxhbmNlCQAETAAAAAIJAQAAAARCdXJuAAAAAgUAAAAKcG10QXNzZXRJZAUAAAAOcG10QXNzZXRBbW91bnQJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAABFvdXRBbW91bnRBc3NldEFtdAkAAlkAAAABBQAAAA1hbW91bnRBc3NldElkCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAQb3V0UHJpY2VBc3NldEFtdAkAAlkAAAABBQAAAAxwcmljZUFzc2V0SWQJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAFmtleVBvb2xMaXF1aWRpdHlCeVVzZXIAAAADBQAAABVhbW91bnRBc3NldEludGVybmFsSWQFAAAAFHByaWNlQXNzZXRJbnRlcm5hbElkCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgkBAAAAEWRhdGFQb29sTGlxdWlkaXR5AAAAAwkAAGUAAAACBQAAABZ1c2VyQW1vdW50QXNzZXRCYWxhbmNlBQAAABFvdXRBbW91bnRBc3NldEFtdAkAAGUAAAACBQAAABV1c2VyUHJpY2VBc3NldEJhbGFuY2UFAAAAEG91dFByaWNlQXNzZXRBbXQJAABlAAAAAgUAAAANdXNlckxQQmFsYW5jZQUAAAAOcG10QXNzZXRBbW91bnQJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAEGtleVBvb2xMaXF1aWRpdHkAAAACBQAAABVhbW91bnRBc3NldEludGVybmFsSWQFAAAAFHByaWNlQXNzZXRJbnRlcm5hbElkCQEAAAARZGF0YVBvb2xMaXF1aWRpdHkAAAADCQAAZQAAAAIFAAAAFnBvb2xBbW91bnRBc3NldEJhbGFuY2UFAAAAEW91dEFtb3VudEFzc2V0QW10CQAAZQAAAAIFAAAAFXBvb2xQcmljZUFzc2V0QmFsYW5jZQUAAAAQb3V0UHJpY2VBc3NldEFtdAkAAGUAAAACBQAAAA1wb29sTFBCYWxhbmNlBQAAAA5wbXRBc3NldEFtb3VudAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAASa2V5R2V0QWN0aW9uQnlVc2VyAAAAAgkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIJAAJYAAAAAQgFAAAAAWkAAAANdHJhbnNhY3Rpb25JZAkBAAAAEWRhdGFHZXRBY3Rpb25JbmZvAAAABgUAAAARb3V0QW1vdW50QXNzZXRBbXQFAAAAEG91dFByaWNlQXNzZXRBbXQFAAAADnBtdEFzc2V0QW1vdW50BQAAAAxjdXJyZW50UHJpY2UFAAAABmhlaWdodAgFAAAACWxhc3RCbG9jawAAAAl0aW1lc3RhbXAJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAADGtleVByaWNlTGFzdAAAAAAJAAEsAAAAAgIAAAAEJXNfXwkAAaQAAAABBQAAAAxjdXJyZW50UHJpY2UJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAD2tleVByaWNlSGlzdG9yeQAAAAIFAAAABmhlaWdodAgFAAAACWxhc3RCbG9jawAAAAl0aW1lc3RhbXAJAAEsAAAAAgIAAAAEJXNfXwkAAaQAAAABBQAAAAxjdXJyZW50UHJpY2UFAAAAA25pbAAAAAFpAQAAAAV0b3B1cAAAAAAFAAAAA25pbAAAAAFpAQAAAAhhY3RpdmF0ZQAAAAUAAAAOYW1vdW50QXNzZXRTdHIAAAANcHJpY2VBc3NldFN0cgAAAAtscEFzc2V0TmFtZQAAAAxscEFzc2V0RGVzY3IAAAAKcG9vbFdlaWdodAMJAQAAAAIhPQAAAAIIBQAAAAFpAAAAD2NhbGxlclB1YmxpY0tleQUAAAAQZmFjdG9yeVB1YmxpY0tleQkAAAIAAAABAgAAABJwZXJtaXNzaW9ucyBkZW5pZWQEAAAADWFtb3VudEFzc2V0SWQJAAJZAAAAAQUAAAAOYW1vdW50QXNzZXRTdHIEAAAAE2Ftb3VudEFzc2V0RGVjaW1hbHMICQEAAAAFdmFsdWUAAAABCQAD7AAAAAEFAAAADWFtb3VudEFzc2V0SWQAAAAIZGVjaW1hbHMEAAAADHByaWNlQXNzZXRJZAkAAlkAAAABBQAAAA1wcmljZUFzc2V0U3RyBAAAABJwcmljZUFzc2V0RGVjaW1hbHMICQEAAAAFdmFsdWUAAAABCQAD7AAAAAEFAAAADHByaWNlQXNzZXRJZAAAAAhkZWNpbWFscwQAAAASbHBBc3NldElzc3VlQWN0aW9uCQAEQgAAAAUFAAAAC2xwQXNzZXROYW1lBQAAAAxscEFzc2V0RGVzY3IAAAAAAAAAAAEAAAAAAAAAAAgGBAAAAAlscEFzc2V0SWQJAAQ4AAAAAQUAAAASbHBBc3NldElzc3VlQWN0aW9uBAAAABFscEFzc2V0SWRBc1N0cmluZwkAAlgAAAABBQAAAAlscEFzc2V0SWQJAAUUAAAAAgkABEwAAAACBQAAABJscEFzc2V0SXNzdWVBY3Rpb24JAARMAAAAAgkBAAAABEJ1cm4AAAACBQAAAAlscEFzc2V0SWQAAAAAAAAAAAEFAAAAA25pbAUAAAARbHBBc3NldElkQXNTdHJpbmcAAAABaQEAAAAGbWFuYWdlAAAAAQAAAAZzdGF0dXMFAAAAA25pbAAAAAFpAQAAAAxlc3RpbWF0ZWRQdXQAAAAABQAAAANuaWwAAAABaQEAAAAFc3RhdHMAAAAABQAAAANuaWwAAAABaQEAAAAMZXN0aW1hdGVkR2V0AAAAAAUAAAADbmlsAAAAAWkBAAAABXByaWNlAAAAAAUAAAADbmlsAAAAAQAAAAJ0eAEAAAAGdmVyaWZ5AAAAAAkAAfQAAAADCAUAAAACdHgAAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJ0eAAAAAZwcm9vZnMAAAAAAAAAAAAIBQAAAAJ0eAAAAA9zZW5kZXJQdWJsaWNLZXn5BLrY", "height": 1652541, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: ALyeZe67M68TadrwBzgZNJPyYJ1fGB9tw23hqEVg26q1 Next: 2X6Bz4fjS2AXJBV1gsfaLPia5ibnkubpAfAP99fLEjaF Diff:
OldNewDifferences
8686 }
8787
8888
89-func getPoolLiquidityByUser (amountAssetInternalId,priceAssetInternalId,userAddress) = {
90- let currentPoolLiquidityValue = getString(keyPoolLiquidityByUser(amountAssetInternalId, priceAssetInternalId, userAddress))
91- if (!(isDefined(currentPoolLiquidityValue)))
92- then ["", "0", "0", "0"]
93- else {
94- let currentPoolLiquidity = split(value(currentPoolLiquidityValue), SEP)
95- currentPoolLiquidity
96- }
97- }
89+func getPoolLiquidityByUser (amountAssetInternalId,priceAssetInternalId,userAddress) = if (true)
90+ then throw("GSDFS")
91+ else {
92+ let currentPoolLiquidityValue = getString(keyPoolLiquidityByUser(amountAssetInternalId, priceAssetInternalId, userAddress))
93+ if (!(isDefined(currentPoolLiquidityValue)))
94+ then ["", "0", "0", "0"]
95+ else {
96+ let currentPoolLiquidity = split(value(currentPoolLiquidityValue), SEP)
97+ currentPoolLiquidity
98+ }
99+ }
98100
99101
100102 func dataPoolLiquidity (amountAssetLocked,priceAssetLocked,lpTokenLocked) = makeString(["%d%d%d", toString(amountAssetLocked), toString(priceAssetLocked), toString(lpTokenLocked)], SEP)
147149 let poolAmountAssetBalance = parseIntValue(poolLiquidityDataList[idxPoolAmountAssetAmt])
148150 let poolPriceAssetBalance = parseIntValue(poolLiquidityDataList[idxPoolPriceAssetAmt])
149151 let poolLPBalance = parseIntValue(poolLiquidityDataList[idxPoolLPAssetAmt])
150- if (true)
151- then throw("GSDFS")
152+ let userLiquidityDataList = getPoolLiquidityByUser(amountAssetInternalId, priceAssetInternalId, toString(i.caller))
153+ let userAmountAssetBalance = parseIntValue(userLiquidityDataList[idxPoolAmountAssetAmt])
154+ let userPriceAssetBalance = parseIntValue(userLiquidityDataList[idxPoolPriceAssetAmt])
155+ let userLPBalance = parseIntValue(userLiquidityDataList[idxPoolLPAssetAmt])
156+ if (if ((amountAssetId != toBase58String(inAmountAssetId)))
157+ then true
158+ else (priceAssetId != toBase58String(inPriceAssetId)))
159+ then throw("Invalid amount or price asset passed.")
152160 else {
153- let userLiquidityDataList = getPoolLiquidityByUser(amountAssetInternalId, priceAssetInternalId, toString(i.caller))
154- let userAmountAssetBalance = parseIntValue(userLiquidityDataList[idxPoolAmountAssetAmt])
155- let userPriceAssetBalance = parseIntValue(userLiquidityDataList[idxPoolPriceAssetAmt])
156- let userLPBalance = parseIntValue(userLiquidityDataList[idxPoolLPAssetAmt])
157- if (if ((amountAssetId != toBase58String(inAmountAssetId)))
158- then true
159- else (priceAssetId != toBase58String(inPriceAssetId)))
160- then throw("Invalid amount or price asset passed.")
161+ let decimalsMult4AmountAsset = pow(10, 0, (lPdecimals - amoutAssetDecimals), 0, 0, DOWN)
162+ let decimalsMult4PriceAsset = pow(10, 0, (lPdecimals - priceAssetDecimals), 0, 0, DOWN)
163+ let inAmountAssetAmtCalculated = (inAmountAssetAmt * decimalsMult4AmountAsset)
164+ let inPriceAssetAmtCalculated = (inPriceAssetAmt * decimalsMult4PriceAsset)
165+ let expectedUserPrice = fraction(inPriceAssetAmtCalculated, decimalsMultPrice, inAmountAssetAmtCalculated)
166+ let amountAssetPoolLockedAmt = (poolAmountAssetBalance * decimalsMult4AmountAsset)
167+ let priceAssetPoolLockedAmt = (poolPriceAssetBalance * decimalsMult4PriceAsset)
168+ let currentPoolPrice = fraction(priceAssetPoolLockedAmt, decimalsMultPrice, amountAssetPoolLockedAmt)
169+ if ((size(poolLiquidityDataList) == 0))
170+ then {
171+ let partA = pow(inAmountAssetAmtCalculated, 0, 0, 50, 1, DOWN)
172+ let partB = pow(inPriceAssetAmtCalculated, 0, 0, 50, 1, DOWN)
173+ let lpAssetsToReturn = (partA * partB)
174+[StringEntry(keyPriceLast(), ("%s__" + toString(currentPoolPrice))), StringEntry(keyPriceHistory(height, lastBlock.timestamp), ("%s__" + toString(currentPoolPrice))), StringEntry(keyPutActionByUser(toString(i.caller), toBase58String(i.transactionId)), dataPutActionInfo(inAmountAssetAmt, inPriceAssetAmt, lpAssetsToReturn, currentPoolPrice, slippageTolerance, height, lastBlock.timestamp)), StringEntry(keyPoolLiquidityByUser(amountAssetInternalId, priceAssetInternalId, toString(i.caller)), dataPoolLiquidity(inAmountAssetAmt, inPriceAssetAmt, lpAssetsToReturn)), StringEntry(keyPoolLiquidity(amountAssetInternalId, priceAssetInternalId), dataPoolLiquidity(inAmountAssetAmt, inPriceAssetAmt, lpAssetsToReturn)), Reissue(lpAssetId, lpAssetsToReturn, true), ScriptTransfer(i.caller, lpAssetsToReturn, lpAssetId)]
175+ }
161176 else {
162- let decimalsMult4AmountAsset = pow(10, 0, (lPdecimals - amoutAssetDecimals), 0, 0, DOWN)
163- let decimalsMult4PriceAsset = pow(10, 0, (lPdecimals - priceAssetDecimals), 0, 0, DOWN)
164- let inAmountAssetAmtCalculated = (inAmountAssetAmt * decimalsMult4AmountAsset)
165- let inPriceAssetAmtCalculated = (inPriceAssetAmt * decimalsMult4PriceAsset)
166- let expectedUserPrice = fraction(inPriceAssetAmtCalculated, decimalsMultPrice, inAmountAssetAmtCalculated)
167- let amountAssetPoolLockedAmt = (poolAmountAssetBalance * decimalsMult4AmountAsset)
168- let priceAssetPoolLockedAmt = (poolPriceAssetBalance * decimalsMult4PriceAsset)
169- let currentPoolPrice = fraction(priceAssetPoolLockedAmt, decimalsMultPrice, amountAssetPoolLockedAmt)
170- if ((size(poolLiquidityDataList) == 0))
171- then {
172- let partA = pow(inAmountAssetAmtCalculated, 0, 0, 50, 1, DOWN)
173- let partB = pow(inPriceAssetAmtCalculated, 0, 0, 50, 1, DOWN)
174- let lpAssetsToReturn = (partA * partB)
175-[StringEntry(keyPriceLast(), ("%s__" + toString(currentPoolPrice))), StringEntry(keyPriceHistory(height, lastBlock.timestamp), ("%s__" + toString(currentPoolPrice))), StringEntry(keyPutActionByUser(toString(i.caller), toBase58String(i.transactionId)), dataPutActionInfo(inAmountAssetAmt, inPriceAssetAmt, lpAssetsToReturn, currentPoolPrice, slippageTolerance, height, lastBlock.timestamp)), StringEntry(keyPoolLiquidityByUser(amountAssetInternalId, priceAssetInternalId, toString(i.caller)), dataPoolLiquidity(inAmountAssetAmt, inPriceAssetAmt, lpAssetsToReturn)), StringEntry(keyPoolLiquidity(amountAssetInternalId, priceAssetInternalId), dataPoolLiquidity(inAmountAssetAmt, inPriceAssetAmt, lpAssetsToReturn)), Reissue(lpAssetId, lpAssetsToReturn, true), ScriptTransfer(i.caller, lpAssetsToReturn, lpAssetId)]
176- }
177+ let slippage = fraction(currentPoolPrice, 100, expectedUserPrice)
178+ if ((slippage > slippageTolerance))
179+ then throw(((("Price slippage " + toString(slippage)) + " exceeded the passed limit of ") + toString(slippageTolerance)))
177180 else {
178- let slippage = fraction(currentPoolPrice, 100, expectedUserPrice)
179- if ((slippage > slippageTolerance))
180- then throw(((("Price slippage " + toString(slippage)) + " exceeded the passed limit of ") + toString(slippageTolerance)))
181- else {
182- let lpAmtByAmountAsset = fraction(poolLPBalance, inAmountAssetAmtCalculated, amountAssetPoolLockedAmt)
183- let lpAmtByPriceAsset = fraction(poolLPBalance, inPriceAssetAmtCalculated, priceAssetPoolLockedAmt)
184- let totalLp4User = if ((lpAmtByPriceAsset > lpAmtByAmountAsset))
185- then lpAmtByAmountAsset
186- else lpAmtByPriceAsset
181+ let lpAmtByAmountAsset = fraction(poolLPBalance, inAmountAssetAmtCalculated, amountAssetPoolLockedAmt)
182+ let lpAmtByPriceAsset = fraction(poolLPBalance, inPriceAssetAmtCalculated, priceAssetPoolLockedAmt)
183+ let totalLp4User = if ((lpAmtByPriceAsset > lpAmtByAmountAsset))
184+ then lpAmtByAmountAsset
185+ else lpAmtByPriceAsset
187186 [StringEntry(keyPriceLast(), ("%s__" + toString(currentPoolPrice))), StringEntry(keyPriceHistory(height, lastBlock.timestamp), ("%s__" + toString(currentPoolPrice))), StringEntry(keyPutActionByUser(toString(i.caller), toBase58String(i.transactionId)), dataPutActionInfo(inAmountAssetAmt, inPriceAssetAmt, totalLp4User, currentPoolPrice, slippageTolerance, height, lastBlock.timestamp)), StringEntry(keyPoolLiquidityByUser(amountAssetInternalId, priceAssetInternalId, toString(i.caller)), dataPoolLiquidity((userAmountAssetBalance + inAmountAssetAmt), (userPriceAssetBalance + inPriceAssetAmt), (userLPBalance + totalLp4User))), StringEntry(keyPoolLiquidity(amountAssetInternalId, priceAssetInternalId), dataPoolLiquidity((poolAmountAssetBalance + inAmountAssetAmt), (poolPriceAssetBalance + inPriceAssetAmt), (poolLPBalance + totalLp4User))), Reissue(lpAssetId, totalLp4User, true), ScriptTransfer(i.caller, totalLp4User, lpAssetId)]
188- }
189187 }
190188 }
191189 }
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let lPdecimals = 8
55
66 let decimalsMultPrice = ((100 * 1000) * 1000)
77
88 let SEP = "__"
99
1010 let PoolActive = 1
1111
1212 let PoolPutDisabled = 2
1313
1414 let PoolMatcherDisabled = 3
1515
1616 let PoolShutdown = 4
1717
1818 let factoryPublicKey = fromBase58String("MimQtBx7azhStAH2R5QV7Uk8hWEbm7q89793fk1j1mh")
1919
2020 let idxPoolAddress = 2
2121
2222 let idxPoolStatus = 3
2323
2424 let idxPoolLPAssetId = 4
2525
2626 let idxAmountAssetId = 5
2727
2828 let idxPriceAssetId = 6
2929
3030 let idxAmountAssetDecimals = 7
3131
3232 let idxPriceAssetDecimals = 8
3333
3434 let idxAmountAssetInternalId = 9
3535
3636 let idxPriceAssetInternalId = 10
3737
3838 let idxPoolWeight = 11
3939
4040 let idxPoolAmountAssetAmt = 2
4141
4242 let idxPoolPriceAssetAmt = 3
4343
4444 let idxPoolLPAssetAmt = 4
4545
4646 func keyPriceLast () = "%s%s__price__last"
4747
4848
4949 func keyPriceHistory (h,timestamp) = makeString(["%s%s%d%d__price__history", toString(h), toString(timestamp)], SEP)
5050
5151
5252 func keyPoolLiquidity (internalAmountAsset,internalPriceAsset) = (((("%d%d%s__" + internalAmountAsset) + "__") + internalPriceAsset) + "__locked")
5353
5454
5555 func keyPoolLiquidityByUser (internalAmountAsset,internalPriceAsset,userAddress) = (((((("%d%d%s%s__" + internalAmountAsset) + "__") + internalPriceAsset) + "__") + userAddress) + "__locked")
5656
5757
5858 func keyPutActionByUser (userAddress,txId) = ((("%s%s%s__P__" + userAddress) + "__") + txId)
5959
6060
6161 func keyGetActionByUser (userAddress,txId) = ((("%s%s%s__G__" + userAddress) + "__") + txId)
6262
6363
6464 func keyMappingPoolContractAddressToPoolAssets (poolContractAddress) = (("%s%s%s__" + poolContractAddress) + "__mappings__poolContract2LpAsset")
6565
6666
6767 func keyPoolConfig (amountAssetInternal,priceAssetInternal) = (((("%s%d%d%s__" + amountAssetInternal) + "__") + priceAssetInternal) + "__config")
6868
6969
7070 func getPoolConfig () = {
7171 let factoryAddress = addressFromPublicKey(factoryPublicKey)
7272 let currentPoolAssets = split(valueOrErrorMessage(getString(factoryAddress, keyMappingPoolContractAddressToPoolAssets(toString(this))), "No factory config found for pool address."), SEP)
7373 let currentPoolConfig = split(valueOrErrorMessage(getString(factoryAddress, keyPoolConfig(currentPoolAssets[2], currentPoolAssets[3])), "No factory config found for pool assets."), SEP)
7474 currentPoolConfig
7575 }
7676
7777
7878 func getPoolLiquidity (amountAssetInternalId,priceAssetInternalId) = {
7979 let currentPoolLiquidityValue = getString(keyPoolLiquidity(amountAssetInternalId, priceAssetInternalId))
8080 if (!(isDefined(currentPoolLiquidityValue)))
8181 then nil
8282 else {
8383 let currentPoolLiquidity = split(value(currentPoolLiquidityValue), SEP)
8484 currentPoolLiquidity
8585 }
8686 }
8787
8888
89-func getPoolLiquidityByUser (amountAssetInternalId,priceAssetInternalId,userAddress) = {
90- let currentPoolLiquidityValue = getString(keyPoolLiquidityByUser(amountAssetInternalId, priceAssetInternalId, userAddress))
91- if (!(isDefined(currentPoolLiquidityValue)))
92- then ["", "0", "0", "0"]
93- else {
94- let currentPoolLiquidity = split(value(currentPoolLiquidityValue), SEP)
95- currentPoolLiquidity
96- }
97- }
89+func getPoolLiquidityByUser (amountAssetInternalId,priceAssetInternalId,userAddress) = if (true)
90+ then throw("GSDFS")
91+ else {
92+ let currentPoolLiquidityValue = getString(keyPoolLiquidityByUser(amountAssetInternalId, priceAssetInternalId, userAddress))
93+ if (!(isDefined(currentPoolLiquidityValue)))
94+ then ["", "0", "0", "0"]
95+ else {
96+ let currentPoolLiquidity = split(value(currentPoolLiquidityValue), SEP)
97+ currentPoolLiquidity
98+ }
99+ }
98100
99101
100102 func dataPoolLiquidity (amountAssetLocked,priceAssetLocked,lpTokenLocked) = makeString(["%d%d%d", toString(amountAssetLocked), toString(priceAssetLocked), toString(lpTokenLocked)], SEP)
101103
102104
103105 func dataPutActionInfo (inAmountAssetAmt,inPriceAssetAmt,outLpAmt,price,slippageTolerancePassedByUser,txHeight,txTimestamp) = makeString(["%d%d%d%d%d%d%d", toString(inAmountAssetAmt), toString(inPriceAssetAmt), toString(outLpAmt), toString(price), toString(slippageTolerancePassedByUser), toString(txHeight), toString(txTimestamp)], SEP)
104106
105107
106108 func dataGetActionInfo (outAmountAssetAmt,outPriceAssetAmt,inLpAmt,price,txHeight,txTimestamp) = makeString(["%d%d%d%d%d%d", toString(outAmountAssetAmt), toString(outPriceAssetAmt), toString(inLpAmt), toString(price), toString(txHeight), toString(txTimestamp)], SEP)
107109
108110
109111 func dataPoolLiquidityByUser (amountAssetLocked,priceAssetLocked,lpTokenLocked,userAddress) = makeString(["%d%d%d", toString(amountAssetLocked), toString(priceAssetLocked), toString(lpTokenLocked)], SEP)
110112
111113
112114 func calculatePrice (amountAssetAmt,amountAssetDecimals,priceAssetAmt,priceAssetDecimals) = {
113115 let decimalsMult4AmountAsset = pow(10, 0, (lPdecimals - amountAssetDecimals), 0, 0, DOWN)
114116 let decimalsMult4PriceAsset = pow(10, 0, (lPdecimals - priceAssetDecimals), 0, 0, DOWN)
115117 let inAmountAssetAmtFinal = (amountAssetAmt * decimalsMult4AmountAsset)
116118 let inPriceAmtFinal = (priceAssetAmt * decimalsMult4PriceAsset)
117119 let price = fraction(inPriceAmtFinal, decimalsMultPrice, inAmountAssetAmtFinal)
118120 price
119121 }
120122
121123
122124 @Callable(i)
123125 func getScriptHash () = {
124126 let hash = toBase64String(value(scriptHash(this)))
125127 throw(hash)
126128 }
127129
128130
129131
130132 @Callable(i)
131133 func put (slippageTolerance) = {
132134 let poolConfigDataList = getPoolConfig()
133135 let lpAssetId = fromBase58String(poolConfigDataList[idxPoolLPAssetId])
134136 let amountAssetId = poolConfigDataList[idxAmountAssetId]
135137 let priceAssetId = poolConfigDataList[idxPriceAssetId]
136138 let amountAssetInternalId = poolConfigDataList[idxAmountAssetInternalId]
137139 let priceAssetInternalId = poolConfigDataList[idxPriceAssetInternalId]
138140 let amoutAssetDecimals = parseIntValue(poolConfigDataList[idxAmountAssetDecimals])
139141 let priceAssetDecimals = parseIntValue(poolConfigDataList[idxPriceAssetDecimals])
140142 let pmtAmountAsset = value(i.payments[0])
141143 let inAmountAssetAmt = pmtAmountAsset.amount
142144 let inAmountAssetId = value(pmtAmountAsset.assetId)
143145 let pmtPriceAsset = value(i.payments[1])
144146 let inPriceAssetAmt = pmtPriceAsset.amount
145147 let inPriceAssetId = value(pmtPriceAsset.assetId)
146148 let poolLiquidityDataList = getPoolLiquidity(amountAssetInternalId, priceAssetInternalId)
147149 let poolAmountAssetBalance = parseIntValue(poolLiquidityDataList[idxPoolAmountAssetAmt])
148150 let poolPriceAssetBalance = parseIntValue(poolLiquidityDataList[idxPoolPriceAssetAmt])
149151 let poolLPBalance = parseIntValue(poolLiquidityDataList[idxPoolLPAssetAmt])
150- if (true)
151- then throw("GSDFS")
152+ let userLiquidityDataList = getPoolLiquidityByUser(amountAssetInternalId, priceAssetInternalId, toString(i.caller))
153+ let userAmountAssetBalance = parseIntValue(userLiquidityDataList[idxPoolAmountAssetAmt])
154+ let userPriceAssetBalance = parseIntValue(userLiquidityDataList[idxPoolPriceAssetAmt])
155+ let userLPBalance = parseIntValue(userLiquidityDataList[idxPoolLPAssetAmt])
156+ if (if ((amountAssetId != toBase58String(inAmountAssetId)))
157+ then true
158+ else (priceAssetId != toBase58String(inPriceAssetId)))
159+ then throw("Invalid amount or price asset passed.")
152160 else {
153- let userLiquidityDataList = getPoolLiquidityByUser(amountAssetInternalId, priceAssetInternalId, toString(i.caller))
154- let userAmountAssetBalance = parseIntValue(userLiquidityDataList[idxPoolAmountAssetAmt])
155- let userPriceAssetBalance = parseIntValue(userLiquidityDataList[idxPoolPriceAssetAmt])
156- let userLPBalance = parseIntValue(userLiquidityDataList[idxPoolLPAssetAmt])
157- if (if ((amountAssetId != toBase58String(inAmountAssetId)))
158- then true
159- else (priceAssetId != toBase58String(inPriceAssetId)))
160- then throw("Invalid amount or price asset passed.")
161+ let decimalsMult4AmountAsset = pow(10, 0, (lPdecimals - amoutAssetDecimals), 0, 0, DOWN)
162+ let decimalsMult4PriceAsset = pow(10, 0, (lPdecimals - priceAssetDecimals), 0, 0, DOWN)
163+ let inAmountAssetAmtCalculated = (inAmountAssetAmt * decimalsMult4AmountAsset)
164+ let inPriceAssetAmtCalculated = (inPriceAssetAmt * decimalsMult4PriceAsset)
165+ let expectedUserPrice = fraction(inPriceAssetAmtCalculated, decimalsMultPrice, inAmountAssetAmtCalculated)
166+ let amountAssetPoolLockedAmt = (poolAmountAssetBalance * decimalsMult4AmountAsset)
167+ let priceAssetPoolLockedAmt = (poolPriceAssetBalance * decimalsMult4PriceAsset)
168+ let currentPoolPrice = fraction(priceAssetPoolLockedAmt, decimalsMultPrice, amountAssetPoolLockedAmt)
169+ if ((size(poolLiquidityDataList) == 0))
170+ then {
171+ let partA = pow(inAmountAssetAmtCalculated, 0, 0, 50, 1, DOWN)
172+ let partB = pow(inPriceAssetAmtCalculated, 0, 0, 50, 1, DOWN)
173+ let lpAssetsToReturn = (partA * partB)
174+[StringEntry(keyPriceLast(), ("%s__" + toString(currentPoolPrice))), StringEntry(keyPriceHistory(height, lastBlock.timestamp), ("%s__" + toString(currentPoolPrice))), StringEntry(keyPutActionByUser(toString(i.caller), toBase58String(i.transactionId)), dataPutActionInfo(inAmountAssetAmt, inPriceAssetAmt, lpAssetsToReturn, currentPoolPrice, slippageTolerance, height, lastBlock.timestamp)), StringEntry(keyPoolLiquidityByUser(amountAssetInternalId, priceAssetInternalId, toString(i.caller)), dataPoolLiquidity(inAmountAssetAmt, inPriceAssetAmt, lpAssetsToReturn)), StringEntry(keyPoolLiquidity(amountAssetInternalId, priceAssetInternalId), dataPoolLiquidity(inAmountAssetAmt, inPriceAssetAmt, lpAssetsToReturn)), Reissue(lpAssetId, lpAssetsToReturn, true), ScriptTransfer(i.caller, lpAssetsToReturn, lpAssetId)]
175+ }
161176 else {
162- let decimalsMult4AmountAsset = pow(10, 0, (lPdecimals - amoutAssetDecimals), 0, 0, DOWN)
163- let decimalsMult4PriceAsset = pow(10, 0, (lPdecimals - priceAssetDecimals), 0, 0, DOWN)
164- let inAmountAssetAmtCalculated = (inAmountAssetAmt * decimalsMult4AmountAsset)
165- let inPriceAssetAmtCalculated = (inPriceAssetAmt * decimalsMult4PriceAsset)
166- let expectedUserPrice = fraction(inPriceAssetAmtCalculated, decimalsMultPrice, inAmountAssetAmtCalculated)
167- let amountAssetPoolLockedAmt = (poolAmountAssetBalance * decimalsMult4AmountAsset)
168- let priceAssetPoolLockedAmt = (poolPriceAssetBalance * decimalsMult4PriceAsset)
169- let currentPoolPrice = fraction(priceAssetPoolLockedAmt, decimalsMultPrice, amountAssetPoolLockedAmt)
170- if ((size(poolLiquidityDataList) == 0))
171- then {
172- let partA = pow(inAmountAssetAmtCalculated, 0, 0, 50, 1, DOWN)
173- let partB = pow(inPriceAssetAmtCalculated, 0, 0, 50, 1, DOWN)
174- let lpAssetsToReturn = (partA * partB)
175-[StringEntry(keyPriceLast(), ("%s__" + toString(currentPoolPrice))), StringEntry(keyPriceHistory(height, lastBlock.timestamp), ("%s__" + toString(currentPoolPrice))), StringEntry(keyPutActionByUser(toString(i.caller), toBase58String(i.transactionId)), dataPutActionInfo(inAmountAssetAmt, inPriceAssetAmt, lpAssetsToReturn, currentPoolPrice, slippageTolerance, height, lastBlock.timestamp)), StringEntry(keyPoolLiquidityByUser(amountAssetInternalId, priceAssetInternalId, toString(i.caller)), dataPoolLiquidity(inAmountAssetAmt, inPriceAssetAmt, lpAssetsToReturn)), StringEntry(keyPoolLiquidity(amountAssetInternalId, priceAssetInternalId), dataPoolLiquidity(inAmountAssetAmt, inPriceAssetAmt, lpAssetsToReturn)), Reissue(lpAssetId, lpAssetsToReturn, true), ScriptTransfer(i.caller, lpAssetsToReturn, lpAssetId)]
176- }
177+ let slippage = fraction(currentPoolPrice, 100, expectedUserPrice)
178+ if ((slippage > slippageTolerance))
179+ then throw(((("Price slippage " + toString(slippage)) + " exceeded the passed limit of ") + toString(slippageTolerance)))
177180 else {
178- let slippage = fraction(currentPoolPrice, 100, expectedUserPrice)
179- if ((slippage > slippageTolerance))
180- then throw(((("Price slippage " + toString(slippage)) + " exceeded the passed limit of ") + toString(slippageTolerance)))
181- else {
182- let lpAmtByAmountAsset = fraction(poolLPBalance, inAmountAssetAmtCalculated, amountAssetPoolLockedAmt)
183- let lpAmtByPriceAsset = fraction(poolLPBalance, inPriceAssetAmtCalculated, priceAssetPoolLockedAmt)
184- let totalLp4User = if ((lpAmtByPriceAsset > lpAmtByAmountAsset))
185- then lpAmtByAmountAsset
186- else lpAmtByPriceAsset
181+ let lpAmtByAmountAsset = fraction(poolLPBalance, inAmountAssetAmtCalculated, amountAssetPoolLockedAmt)
182+ let lpAmtByPriceAsset = fraction(poolLPBalance, inPriceAssetAmtCalculated, priceAssetPoolLockedAmt)
183+ let totalLp4User = if ((lpAmtByPriceAsset > lpAmtByAmountAsset))
184+ then lpAmtByAmountAsset
185+ else lpAmtByPriceAsset
187186 [StringEntry(keyPriceLast(), ("%s__" + toString(currentPoolPrice))), StringEntry(keyPriceHistory(height, lastBlock.timestamp), ("%s__" + toString(currentPoolPrice))), StringEntry(keyPutActionByUser(toString(i.caller), toBase58String(i.transactionId)), dataPutActionInfo(inAmountAssetAmt, inPriceAssetAmt, totalLp4User, currentPoolPrice, slippageTolerance, height, lastBlock.timestamp)), StringEntry(keyPoolLiquidityByUser(amountAssetInternalId, priceAssetInternalId, toString(i.caller)), dataPoolLiquidity((userAmountAssetBalance + inAmountAssetAmt), (userPriceAssetBalance + inPriceAssetAmt), (userLPBalance + totalLp4User))), StringEntry(keyPoolLiquidity(amountAssetInternalId, priceAssetInternalId), dataPoolLiquidity((poolAmountAssetBalance + inAmountAssetAmt), (poolPriceAssetBalance + inPriceAssetAmt), (poolLPBalance + totalLp4User))), Reissue(lpAssetId, totalLp4User, true), ScriptTransfer(i.caller, totalLp4User, lpAssetId)]
188- }
189187 }
190188 }
191189 }
192190 }
193191
194192
195193
196194 @Callable(i)
197195 func get () = {
198196 let poolConfigList = getPoolConfig()
199197 let lpAssetId = poolConfigList[idxPoolLPAssetId]
200198 let amountAssetId = poolConfigList[idxAmountAssetId]
201199 let priceAssetId = poolConfigList[idxPriceAssetId]
202200 let amountAssetInternalId = poolConfigList[idxAmountAssetInternalId]
203201 let priceAssetInternalId = poolConfigList[idxPriceAssetInternalId]
204202 let userLiquidityList = getPoolLiquidityByUser(amountAssetInternalId, priceAssetInternalId, toString(i.caller))
205203 let userLPBalance = parseIntValue(userLiquidityList[idxPoolLPAssetAmt])
206204 let userAmountAssetBalance = parseIntValue(userLiquidityList[idxPoolAmountAssetAmt])
207205 let userPriceAssetBalance = parseIntValue(userLiquidityList[idxPoolPriceAssetAmt])
208206 let poolLiquidityList = getPoolLiquidity(amountAssetInternalId, priceAssetInternalId)
209207 let poolLPBalance = parseIntValue(poolLiquidityList[idxPoolLPAssetAmt])
210208 let poolAmountAssetBalance = parseIntValue(poolLiquidityList[idxPoolAmountAssetAmt])
211209 let poolPriceAssetBalance = parseIntValue(poolLiquidityList[idxPoolPriceAssetAmt])
212210 let pmtAmountAsset = value(i.payments[0])
213211 let pmtAssetId = value(pmtAmountAsset.assetId)
214212 let pmtAssetAmount = pmtAmountAsset.amount
215213 if ((lpAssetId != toBase58String(pmtAssetId)))
216214 then throw("Invalid asset passed.")
217215 else if ((pmtAssetAmount > userLPBalance))
218216 then throw("Invalid amount passed. Amount less than available.")
219217 else {
220218 let outAmountAssetAmt = fraction(poolAmountAssetBalance, pmtAssetAmount, poolLPBalance)
221219 let outPriceAssetAmt = fraction(poolPriceAssetBalance, pmtAssetAmount, poolLPBalance)
222220 let currentPrice = fraction(poolPriceAssetBalance, decimalsMultPrice, poolAmountAssetBalance)
223221 [Burn(pmtAssetId, pmtAssetAmount), ScriptTransfer(i.caller, outAmountAssetAmt, fromBase58String(amountAssetId)), ScriptTransfer(i.caller, outPriceAssetAmt, fromBase58String(priceAssetId)), StringEntry(keyPoolLiquidityByUser(amountAssetInternalId, priceAssetInternalId, toString(i.caller)), dataPoolLiquidity((userAmountAssetBalance - outAmountAssetAmt), (userPriceAssetBalance - outPriceAssetAmt), (userLPBalance - pmtAssetAmount))), StringEntry(keyPoolLiquidity(amountAssetInternalId, priceAssetInternalId), dataPoolLiquidity((poolAmountAssetBalance - outAmountAssetAmt), (poolPriceAssetBalance - outPriceAssetAmt), (poolLPBalance - pmtAssetAmount))), StringEntry(keyGetActionByUser(toString(i.caller), toBase58String(i.transactionId)), dataGetActionInfo(outAmountAssetAmt, outPriceAssetAmt, pmtAssetAmount, currentPrice, height, lastBlock.timestamp)), StringEntry(keyPriceLast(), ("%s__" + toString(currentPrice))), StringEntry(keyPriceHistory(height, lastBlock.timestamp), ("%s__" + toString(currentPrice)))]
224222 }
225223 }
226224
227225
228226
229227 @Callable(i)
230228 func topup () = nil
231229
232230
233231
234232 @Callable(i)
235233 func activate (amountAssetStr,priceAssetStr,lpAssetName,lpAssetDescr,poolWeight) = if ((i.callerPublicKey != factoryPublicKey))
236234 then throw("permissions denied")
237235 else {
238236 let amountAssetId = fromBase58String(amountAssetStr)
239237 let amountAssetDecimals = value(assetInfo(amountAssetId)).decimals
240238 let priceAssetId = fromBase58String(priceAssetStr)
241239 let priceAssetDecimals = value(assetInfo(priceAssetId)).decimals
242240 let lpAssetIssueAction = Issue(lpAssetName, lpAssetDescr, 1, 8, true)
243241 let lpAssetId = calculateAssetId(lpAssetIssueAction)
244242 let lpAssetIdAsString = toBase58String(lpAssetId)
245243 $Tuple2([lpAssetIssueAction, Burn(lpAssetId, 1)], lpAssetIdAsString)
246244 }
247245
248246
249247
250248 @Callable(i)
251249 func manage (status) = nil
252250
253251
254252
255253 @Callable(i)
256254 func estimatedPut () = nil
257255
258256
259257
260258 @Callable(i)
261259 func stats () = nil
262260
263261
264262
265263 @Callable(i)
266264 func estimatedGet () = nil
267265
268266
269267
270268 @Callable(i)
271269 func price () = nil
272270
273271
274272 @Verifier(tx)
275273 func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
276274

github/deemru/w8io/026f985 
50.92 ms