tx · 77KJAL8VDeNbFfSetA4fcofxJnikByPZ6EeAhAUf3gEx 3N8Q6WBsfWqxrqru7j45a6mCQoerJXforKJ: -0.01400000 Waves 2021.11.02 13:18 [1773233] smart account 3N8Q6WBsfWqxrqru7j45a6mCQoerJXforKJ > SELF 0.00000000 Waves
{ "type": 13, "id": "77KJAL8VDeNbFfSetA4fcofxJnikByPZ6EeAhAUf3gEx", "fee": 1400000, "feeAssetId": null, "timestamp": 1635848373274, "version": 2, "chainId": 84, "sender": "3N8Q6WBsfWqxrqru7j45a6mCQoerJXforKJ", "senderPublicKey": "7nazYRegcPktaf9fWB4axLnqNzxbPqPVDVcsDouPTPyR", "proofs": [ "3wwdTeoKm2NJazVZci1KQZFZcSgKdEjf1jjpQg59u8SjCWvBxWcUGuS9XHfRMjHw6Y35mi4hLZcvz1dmFwySc2dt" ], "script": "base64:AAIFAAAAAAAAACkIAhIKCggICAgICAgIARIJCgcICAgICAEIEgQKAggBEgMKAQESAwoBAQAAAC0AAAAAEWRlY2ltYWxzTXVsdFByaWNlCQAAaAAAAAIJAABoAAAAAgAAAAAAAAAAZAAAAAAAAAAD6AAAAAAAAAAD6AAAAAADU0VQAgAAAAJfXwAAAAAKUG9vbEFjdGl2ZQAAAAAAAAAAAQAAAAAPUG9vbFB1dERpc2FibGVkAAAAAAAAAAACAAAAABNQb29sTWF0Y2hlckRpc2FibGVkAAAAAAAAAAADAAAAAAxQb29sU2h1dGRvd24AAAAAAAAAAAQAAAAAEmlkeEludGVybmFsQXNzZXRJZAAAAAAAAAAAAQAAAAAPaWR4UmVzdXRBY3Rpb25zAAAAAAAAAAACAAAAACBpZHhJZkFzc2V0SWRDYWxjdWxhdGlvblBlcmZvcm1lZAAAAAAAAAAAAwAAAAAOaWR4UG9vbEFkZHJlc3MAAAAAAAAAAAEAAAAADWlkeFBvb2xTdGF0dXMAAAAAAAAAAAIAAAAAEGlkeFBvb2xMUEFzc2V0SWQAAAAAAAAAAAMAAAAADWlkeEFtdEFzc2V0SWQAAAAAAAAAAAQAAAAAD2lkeFByaWNlQXNzZXRJZAAAAAAAAAAABQAAAAAOaWR4QW10QXNzZXREY20AAAAAAAAAAAYAAAAAEGlkeFByaWNlQXNzZXREY20AAAAAAAAAAAcAAAAADmlkeElBbXRBc3NldElkAAAAAAAAAAAIAAAAABBpZHhJUHJpY2VBc3NldElkAAAAAAAAAAAJAAAAAA1pZHhMUEFzc2V0RGNtAAAAAAAAAAAKAAAAAAtpZHhQb29sVHlwZQAAAAAAAAAACwEAAAAQa2V5RmFjdG9yeUNvbmZpZwAAAAACAAAAESVzX19mYWN0b3J5Q29uZmlnAQAAAA9rZXlMcFRva2Vuc0xpc3QAAAAAAgAAABAlc19fbHBUb2tlbnNMaXN0AQAAABFrZXlQb29sU2NyaXB0SGFzaAAAAAACAAAAFiVzJXNfX3Bvb2xfX3NjcmlwdEhhc2gBAAAAEGtleVByaWNlRGVjaW1hbHMAAAAAAgAAABElc19fcHJpY2VEZWNpbWFscwEAAAATa2V5QWxsUG9vbHNTaHV0ZG93bgAAAAACAAAADCVzX19zaHV0ZG93bgEAAAAWa2V5TmV4dEludGVybmFsQXNzZXRJZAAAAAACAAAAFyVzX19uZXh0SW50ZXJuYWxBc3NldElkAQAAAA9rZXlQb29sVG9XZWlnaHQAAAABAAAAC3Bvb2xBZGRyZXNzCQABLAAAAAICAAAAEiVzJXNfX3Bvb2xXZWlnaHRfXwUAAAALcG9vbEFkZHJlc3MBAAAAH2tleU1hcHBpbmdzSW50ZXJuYWwyYmFzZUFzc2V0SWQAAAABAAAAEWludGVybmFsQmFzZUFzc2V0CQABLAAAAAICAAAAKCVzJXMlZF9fbWFwcGluZ3NfX2ludGVybmFsMmJhc2VBc3NldElkX18JAAGkAAAAAQUAAAARaW50ZXJuYWxCYXNlQXNzZXQBAAAAH2tleU1hcHBpbmdzQmFzZUFzc2V0MmludGVybmFsSWQAAAABAAAADGJhc2VBc3NldFN0cgkAASwAAAACAgAAACglcyVzJXNfX21hcHBpbmdzX19iYXNlQXNzZXQyaW50ZXJuYWxJZF9fBQAAAAxiYXNlQXNzZXRTdHIBAAAADWtleVBvb2xDb25maWcAAAACAAAAE2Ftb3VudEFzc2V0SW50ZXJuYWwAAAAScHJpY2VBc3NldEludGVybmFsCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAACCVkJWQlc19fBQAAABNhbW91bnRBc3NldEludGVybmFsAgAAAAJfXwUAAAAScHJpY2VBc3NldEludGVybmFsAgAAAAhfX2NvbmZpZwEAAAAda2V5TWFwcGluZ0xwQXNzZXRUb1Bvb2xBc3NldHMAAAABAAAACmxwQXNzZXRTdHIJAAEsAAAAAgkAASwAAAACAgAAAAglcyVzJXNfXwUAAAAKbHBBc3NldFN0cgIAAAAYX19tYXBwaW5nc19fbHBBc3NldDJQb29sAQAAAB1rZXlNYXBwaW5nUG9vbEFzc2V0c1RvTHBhc3NldAAAAAIAAAAYaW50ZXJuYWxBbW91bnRBc3NldElkU3RyAAAAF2ludGVybmFsUHJpY2VBc3NldElkU3RyCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAACiVkJWQlcyVzX18FAAAAGGludGVybmFsQW1vdW50QXNzZXRJZFN0cgIAAAACX18FAAAAF2ludGVybmFsUHJpY2VBc3NldElkU3RyAgAAAB5fX21hcHBpbmdzX19Qb29sQXNzZXRzMkxwQXNzZXQBAAAAKWtleU1hcHBpbmdQb29sQ29udHJhY3RBZGRyZXNzVG9Qb29sQXNzZXRzAAAAAQAAABNwb29sQ29udHJhY3RBZGRyZXNzCQABLAAAAAIJAAEsAAAAAgIAAAAIJXMlcyVzX18FAAAAE3Bvb2xDb250cmFjdEFkZHJlc3MCAAAAI19fbWFwcGluZ3NfX3Bvb2xDb250cmFjdDJQb29sQXNzZXRzAQAAAClrZXlNYXBwaW5nUG9vbEFzc2V0c1RvUG9vbENvbnRyYWN0QWRkcmVzcwAAAAIAAAAYaW50ZXJuYWxBbW91bnRBc3NldElkU3RyAAAAF2ludGVybmFsUHJpY2VBc3NldElkU3RyCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAACiVkJWQlcyVzX18JAAGkAAAAAQUAAAAYaW50ZXJuYWxBbW91bnRBc3NldElkU3RyAgAAAAJfXwkAAaQAAAABBQAAABdpbnRlcm5hbFByaWNlQXNzZXRJZFN0cgIAAAAjX19tYXBwaW5nc19fcG9vbEFzc2V0czJQb29sQ29udHJhY3QBAAAAHmtleU1hcHBpbmdQb29sQ29udHJhY1RvTFBBc3NldAAAAAEAAAATcG9vbENvbnRyYWN0QWRkcmVzcwkAASwAAAACCQABLAAAAAICAAAACCVzJXMlc19fBQAAABNwb29sQ29udHJhY3RBZGRyZXNzAgAAACBfX21hcHBpbmdzX19wb29sQ29udHJhY3QyTHBBc3NldAEAAAAqa2V5TWFwcGluZ1Bvb2xMUEFzc2V0VG9Qb29sQ29udHJhY3RBZGRyZXNzAAAAAQAAAApscEFzc2V0U3RyCQABLAAAAAIJAAEsAAAAAgIAAAAIJXMlcyVzX18FAAAACmxwQXNzZXRTdHICAAAAIF9fbWFwcGluZ3NfX2xwQXNzZXQyUG9vbENvbnRyYWN0AQAAAA9nZXRTdHJpbmdPckZhaWwAAAABAAAAA2tleQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAABHRoaXMFAAAAA2tleQkAASwAAAACAgAAABVObyBkYXRhIGZvciB0aGlzLmtleT0FAAAAA2tleQEAAAAQZ2V0Qm9vbGVhbk9yRmFpbAAAAAEAAAADa2V5CQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQbAAAAAgUAAAAEdGhpcwUAAAADa2V5CQABLAAAAAICAAAAFU5vIGRhdGEgZm9yIHRoaXMua2V5PQUAAAADa2V5AQAAAAxnZXRJbnRPckZhaWwAAAABAAAAA2tleQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAABHRoaXMFAAAAA2tleQkAASwAAAACAgAAABVObyBkYXRhIGZvciB0aGlzLmtleT0FAAAAA2tleQEAAAAOZGF0YUZhY3RvcnlDZmcAAAAHAAAADnN0YWtpbmdBZGRyZXNzAAAAD2Jvb3N0aW5nQWRkcmVzcwAAAAtpZG9Db250cmFjdAAAAAx0ZWFtQ29udHJhY3QAAAAQZW1pc3Npb25Db250cmFjdAAAAAxyZXN0Q29udHJhY3QAAAAQc2xpcHBhZ2VDb250cmFjdAkABLkAAAACCQAETAAAAAICAAAADCVzJXMlcyVzJXMlcwkABEwAAAACBQAAAA5zdGFraW5nQWRkcmVzcwkABEwAAAACBQAAAA9ib29zdGluZ0FkZHJlc3MJAARMAAAAAgUAAAALaWRvQ29udHJhY3QJAARMAAAAAgUAAAAMdGVhbUNvbnRyYWN0CQAETAAAAAIFAAAAEGVtaXNzaW9uQ29udHJhY3QJAARMAAAAAgUAAAAMcmVzdENvbnRyYWN0CQAETAAAAAIFAAAAEHNsaXBwYWdlQ29udHJhY3QFAAAAA25pbAUAAAADU0VQAQAAAAtkYXRhUG9vbENmZwAAAAsAAAALcG9vbEFkZHJlc3MAAAAKcG9vbFN0YXR1cwAAAAlscEFzc2V0SWQAAAAOYW1vdW50QXNzZXRTdHIAAAANcHJpY2VBc3NldFN0cgAAABNhbW91bnRBc3NldERlY2ltYWxzAAAAEnByaWNlQXNzZXREZWNpbWFscwAAABVhbW91bnRBc3NldEludGVybmFsSWQAAAAUcHJpY2VBc3NldEludGVybmFsSWQAAAAPbHBBc3NldERlY2ltYWxzAAAACHBvb2xUeXBlCQAEuQAAAAIJAARMAAAAAgIAAAAWJXMlZCVzJXMlcyVkJWQlZCVkJWQlcwkABEwAAAACBQAAAAtwb29sQWRkcmVzcwkABEwAAAACBQAAAApwb29sU3RhdHVzCQAETAAAAAIFAAAACWxwQXNzZXRJZAkABEwAAAACBQAAAA5hbW91bnRBc3NldFN0cgkABEwAAAACBQAAAA1wcmljZUFzc2V0U3RyCQAETAAAAAIJAAGkAAAAAQUAAAATYW1vdW50QXNzZXREZWNpbWFscwkABEwAAAACCQABpAAAAAEFAAAAEnByaWNlQXNzZXREZWNpbWFscwkABEwAAAACCQABpAAAAAEFAAAAFWFtb3VudEFzc2V0SW50ZXJuYWxJZAkABEwAAAACCQABpAAAAAEFAAAAFHByaWNlQXNzZXRJbnRlcm5hbElkCQAETAAAAAIJAAGkAAAAAQUAAAAPbHBBc3NldERlY2ltYWxzCQAETAAAAAIFAAAACHBvb2xUeXBlBQAAAANuaWwFAAAAA1NFUAEAAAAVZGF0YU1hcHBpbmdQb29sQXNzZXRzAAAAAgAAABZpbnRlcm5hbEFtb3VudEFzc2V0U3RyAAAAFWludGVybmFsUHJpY2VBc3NldFN0cgkABLkAAAACCQAETAAAAAICAAAABCVkJWQJAARMAAAAAgkAAaQAAAABBQAAABZpbnRlcm5hbEFtb3VudEFzc2V0U3RyCQAETAAAAAIJAAGkAAAAAQUAAAAVaW50ZXJuYWxQcmljZUFzc2V0U3RyBQAAAANuaWwFAAAAA1NFUAEAAAANZ2V0UG9vbENvbmZpZwAAAAEAAAALcG9vbEFkZHJlc3MEAAAACnBvb2xBc3NldHMJAAS1AAAAAgkBAAAAD2dldFN0cmluZ09yRmFpbAAAAAEJAQAAAClrZXlNYXBwaW5nUG9vbENvbnRyYWN0QWRkcmVzc1RvUG9vbEFzc2V0cwAAAAEFAAAAC3Bvb2xBZGRyZXNzBQAAAANTRVAEAAAAE2Ftb3VudEFzc2V0SW50ZXJuYWwJAAGRAAAAAgUAAAAKcG9vbEFzc2V0cwAAAAAAAAAAAQQAAAAScHJpY2VBc3NldEludGVybmFsCQABkQAAAAIFAAAACnBvb2xBc3NldHMAAAAAAAAAAAIJAAS1AAAAAgkBAAAAD2dldFN0cmluZ09yRmFpbAAAAAEJAQAAAA1rZXlQb29sQ29uZmlnAAAAAgUAAAATYW1vdW50QXNzZXRJbnRlcm5hbAUAAAAScHJpY2VBc3NldEludGVybmFsBQAAAANTRVABAAAAGmdldEludGVybmFsQXNzZXRJZE9yQ3JlYXRlAAAAAgAAAAphc3NldElkU3RyAAAAC2luY3JlbWVudG9yBAAAAA9pbnRlcm5hbEFzc2V0SWQJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwkBAAAAH2tleU1hcHBpbmdzQmFzZUFzc2V0MmludGVybmFsSWQAAAABBQAAAAphc3NldElkU3RyAAAAAAAAAAAABAAAABhjdXJyZW50SW5kZXhPZkludGVybmFsSWQJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwkBAAAAFmtleU5leHRJbnRlcm5hbEFzc2V0SWQAAAAAAAAAAAAAAAAABAAAAAZyZXN1bHQDCQAAAAAAAAIFAAAAD2ludGVybmFsQXNzZXRJZAAAAAAAAAAAAAQAAAASbmV3SW50ZXJuYWxBc3NldElkCQAAZAAAAAIFAAAAGGN1cnJlbnRJbmRleE9mSW50ZXJuYWxJZAUAAAALaW5jcmVtZW50b3IJAAUVAAAAAwUAAAASbmV3SW50ZXJuYWxBc3NldElkCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAWa2V5TmV4dEludGVybmFsQXNzZXRJZAAAAAAFAAAAEm5ld0ludGVybmFsQXNzZXRJZAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAH2tleU1hcHBpbmdzQmFzZUFzc2V0MmludGVybmFsSWQAAAABBQAAAAphc3NldElkU3RyBQAAABJuZXdJbnRlcm5hbEFzc2V0SWQJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAH2tleU1hcHBpbmdzSW50ZXJuYWwyYmFzZUFzc2V0SWQAAAABBQAAABJuZXdJbnRlcm5hbEFzc2V0SWQFAAAACmFzc2V0SWRTdHIFAAAAA25pbAYJAAUVAAAAAwUAAAAPaW50ZXJuYWxBc3NldElkBQAAAANuaWwHBQAAAAZyZXN1bHQBAAAAF2NyZWF0ZUxwVG9rZW5zTGlzdEVudHJ5AAAAAQAAAApuZXdMcFRva2VuBAAAAAhscFRva2VucwkABB0AAAACBQAAAAR0aGlzCQEAAAAPa2V5THBUb2tlbnNMaXN0AAAAAAMJAQAAAAlpc0RlZmluZWQAAAABBQAAAAhscFRva2VucwkAASwAAAACCQABLAAAAAIJAQAAAAV2YWx1ZQAAAAEFAAAACGxwVG9rZW5zBQAAAANTRVAFAAAACm5ld0xwVG9rZW4FAAAACm5ld0xwVG9rZW4AAAAFAAAAAWkBAAAAC2NvbnN0cnVjdG9yAAAACAAAAA9zdGFraW5nQ29udHJhY3QAAAAQYm9vc3RpbmdDb250cmFjdAAAAAtpZG9Db250cmFjdAAAAAx0ZWFtQ29udHJhY3QAAAAQZW1pc3Npb25Db250cmFjdAAAAAxyZXN0Q29udHJhY3QAAAAQc2xwaXBhZ2VDb250cmFjdAAAAA1wcmljZURlY2ltYWxzAwkBAAAAAiE9AAAAAggFAAAAAWkAAAAGY2FsbGVyBQAAAAR0aGlzCQAAAgAAAAECAAAAEnBlcm1pc3Npb25zIGRlbmllZAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAQa2V5RmFjdG9yeUNvbmZpZwAAAAAJAQAAAA5kYXRhRmFjdG9yeUNmZwAAAAcFAAAAD3N0YWtpbmdDb250cmFjdAUAAAAQYm9vc3RpbmdDb250cmFjdAUAAAALaWRvQ29udHJhY3QFAAAADHRlYW1Db250cmFjdAUAAAAQZW1pc3Npb25Db250cmFjdAUAAAAMcmVzdENvbnRyYWN0BQAAABBzbHBpcGFnZUNvbnRyYWN0CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAQa2V5UHJpY2VEZWNpbWFscwAAAAAFAAAADXByaWNlRGVjaW1hbHMFAAAAA25pbAAAAAFpAQAAAA9hY3RpdmF0ZU5ld1Bvb2wAAAAHAAAAC3Bvb2xBZGRyZXNzAAAADmFtb3VudEFzc2V0U3RyAAAADXByaWNlQXNzZXRTdHIAAAALbHBBc3NldE5hbWUAAAAMbHBBc3NldERlc2NyAAAACnBvb2xXZWlnaHQAAAAIcG9vbFR5cGUDCQEAAAACIT0AAAACCAUAAAABaQAAAAZjYWxsZXIFAAAABHRoaXMJAAACAAAAAQIAAAAScGVybWlzc2lvbnMgZGVuaWVkAwkBAAAACWlzRGVmaW5lZAAAAAEJAAQiAAAAAQkBAAAAKWtleU1hcHBpbmdQb29sQ29udHJhY3RBZGRyZXNzVG9Qb29sQXNzZXRzAAAAAQUAAAALcG9vbEFkZHJlc3MJAAACAAAAAQkAASwAAAACCQABLAAAAAICAAAADVBvb2wgYWRkcmVzcyAFAAAAC3Bvb2xBZGRyZXNzAgAAABQgYWxyZWFkeSByZWdpc3RlcmVkLgQAAAAXaW50ZXJuYWxBbW91bnRBc3NldERhdGEJAQAAABpnZXRJbnRlcm5hbEFzc2V0SWRPckNyZWF0ZQAAAAIFAAAADmFtb3VudEFzc2V0U3RyAAAAAAAAAAABBAAAABVpbnRlcm5hbEFtb3VudEFzc2V0SWQIBQAAABdpbnRlcm5hbEFtb3VudEFzc2V0RGF0YQAAAAJfMQQAAAAWaW50ZXJuYWxQcmljZUFzc2V0RGF0YQkBAAAAGmdldEludGVybmFsQXNzZXRJZE9yQ3JlYXRlAAAAAgUAAAANcHJpY2VBc3NldFN0cgMIBQAAABdpbnRlcm5hbEFtb3VudEFzc2V0RGF0YQAAAAJfMwAAAAAAAAAAAgAAAAAAAAAAAQQAAAAUaW50ZXJuYWxQcmljZUFzc2V0SWQIBQAAABZpbnRlcm5hbFByaWNlQXNzZXREYXRhAAAAAl8xBAAAABVwb29sQWNjb3VudFNjcmlwdEhhc2gJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkAA/EAAAABCQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABBQAAAAtwb29sQWRkcmVzcwkAASwAAAACAgAAAClObyBzY3JpcHQgaGFzIGJlZW4gZm91bmQgb24gcG9vbCBhY2NvdW50IAUAAAALcG9vbEFkZHJlc3MEAAAAHGV0aGFsb25Qb29sQWNjb3VudFNjcmlwdEhhc2gJAQAAABFAZXh0ck5hdGl2ZSgxMDU3KQAAAAEJAQAAABFrZXlQb29sU2NyaXB0SGFzaAAAAAAEAAAACnBvb2xDb25maWcJAAQdAAAAAgUAAAAEdGhpcwkBAAAADWtleVBvb2xDb25maWcAAAACCQABpAAAAAEFAAAAFWludGVybmFsQW1vdW50QXNzZXRJZAkAAaQAAAABBQAAABRpbnRlcm5hbFByaWNlQXNzZXRJZAMJAQAAAAlpc0RlZmluZWQAAAABBQAAAApwb29sQ29uZmlnCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAFUG9vbCAFAAAADmFtb3VudEFzc2V0U3RyAgAAAAEvBQAAAA1wcmljZUFzc2V0U3RyAgAAABwgaGFzIGFscmVhZHkgYmVlbiBhY3RpdmF0ZWQuBAAAAA9wb29sQ29uZmlnVmFsdWUJAQAAAAV2YWx1ZQAAAAEJAAQdAAAAAgUAAAAEdGhpcwkBAAAADWtleVBvb2xDb25maWcAAAACCQABpAAAAAEFAAAAFWludGVybmFsQW1vdW50QXNzZXRJZAkAAaQAAAABBQAAABRpbnRlcm5hbFByaWNlQXNzZXRJZAQAAAAUYW1vdW50QXNzZXRzRGVjaW1hbHMDCQAAAAAAAAIFAAAADmFtb3VudEFzc2V0U3RyAgAAAAVXQVZFUwUAAAARZGVjaW1hbHNNdWx0UHJpY2UJAABsAAAABgAAAAAAAAAACgAAAAAAAAAAAAgJAQAAAAV2YWx1ZQAAAAEJAAPsAAAAAQkAAlkAAAABBQAAAA5hbW91bnRBc3NldFN0cgAAAAhkZWNpbWFscwAAAAAAAAAAAAAAAAAAAAAAAAUAAAAERE9XTgQAAAATcHJpY2VBc3NldHNEZWNpbWFscwMJAAAAAAAAAgUAAAANcHJpY2VBc3NldFN0cgIAAAAFV0FWRVMFAAAAEWRlY2ltYWxzTXVsdFByaWNlCQAAbAAAAAYAAAAAAAAAAAoAAAAAAAAAAAAICQEAAAAFdmFsdWUAAAABCQAD7AAAAAEJAAJZAAAAAQUAAAANcHJpY2VBc3NldFN0cgAAAAhkZWNpbWFscwAAAAAAAAAAAAAAAAAAAAAAAAUAAAAERE9XTgQAAAASbHBBc3NldElzc3VlQWN0aW9uCQAEQgAAAAUFAAAAC2xwQXNzZXROYW1lBQAAAAxscEFzc2V0RGVzY3IAAAAAAAAAAAEAAAAAAAAAAAgGBAAAAAlscEFzc2V0SWQJAAQ4AAAAAQUAAAASbHBBc3NldElzc3VlQWN0aW9uBAAAAAxscEFzc2V0SWRTdHIJAAJYAAAAAQUAAAAJbHBBc3NldElkBAAAABhwb29sQWN0aXZhdGVJbnZva2VSZXN1bHQJAAP8AAAABAkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQUAAAALcG9vbEFkZHJlc3MCAAAACGFjdGl2YXRlCQAETAAAAAIFAAAADmFtb3VudEFzc2V0U3RyCQAETAAAAAIFAAAADXByaWNlQXNzZXRTdHIFAAAAA25pbAUAAAADbmlsAwkAAAAAAAACBQAAABhwb29sQWN0aXZhdGVJbnZva2VSZXN1bHQFAAAAGHBvb2xBY3RpdmF0ZUludm9rZVJlc3VsdAMJAQAAAAIhPQAAAAIFAAAAGHBvb2xBY3RpdmF0ZUludm9rZVJlc3VsdAIAAAAHc3VjY2VzcwkAAAIAAAABAgAAACNQb29sIGluaXRpYWxpc2F0aW9uIGVycm9yIGhhcHBlbmVkLgkABRQAAAACCQAETgAAAAIJAAROAAAAAggFAAAAF2ludGVybmFsQW1vdW50QXNzZXREYXRhAAAAAl8yCAUAAAAWaW50ZXJuYWxQcmljZUFzc2V0RGF0YQAAAAJfMgkABEwAAAACBQAAABJscEFzc2V0SXNzdWVBY3Rpb24JAARMAAAAAgkBAAAABEJ1cm4AAAACBQAAAAlscEFzc2V0SWQAAAAAAAAAAAEJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAADWtleVBvb2xDb25maWcAAAACCQABpAAAAAEFAAAAFWludGVybmFsQW1vdW50QXNzZXRJZAkAAaQAAAABBQAAABRpbnRlcm5hbFByaWNlQXNzZXRJZAkBAAAAC2RhdGFQb29sQ2ZnAAAACwUAAAALcG9vbEFkZHJlc3MJAAGkAAAAAQUAAAAKUG9vbEFjdGl2ZQUAAAAMbHBBc3NldElkU3RyBQAAAA5hbW91bnRBc3NldFN0cgUAAAANcHJpY2VBc3NldFN0cgUAAAAUYW1vdW50QXNzZXRzRGVjaW1hbHMFAAAAE3ByaWNlQXNzZXRzRGVjaW1hbHMFAAAAFWludGVybmFsQW1vdW50QXNzZXRJZAUAAAAUaW50ZXJuYWxQcmljZUFzc2V0SWQFAAAAEWRlY2ltYWxzTXVsdFByaWNlBQAAAAhwb29sVHlwZQkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAda2V5TWFwcGluZ0xwQXNzZXRUb1Bvb2xBc3NldHMAAAABBQAAAAxscEFzc2V0SWRTdHIJAQAAABVkYXRhTWFwcGluZ1Bvb2xBc3NldHMAAAACBQAAABVpbnRlcm5hbEFtb3VudEFzc2V0SWQFAAAAFGludGVybmFsUHJpY2VBc3NldElkCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAAB1rZXlNYXBwaW5nUG9vbEFzc2V0c1RvTHBhc3NldAAAAAIJAAGkAAAAAQUAAAAVaW50ZXJuYWxBbW91bnRBc3NldElkCQABpAAAAAEFAAAAFGludGVybmFsUHJpY2VBc3NldElkCQABLAAAAAICAAAABCVzX18FAAAADGxwQXNzZXRJZFN0cgkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAApa2V5TWFwcGluZ1Bvb2xDb250cmFjdEFkZHJlc3NUb1Bvb2xBc3NldHMAAAABBQAAAAtwb29sQWRkcmVzcwkBAAAAFWRhdGFNYXBwaW5nUG9vbEFzc2V0cwAAAAIFAAAAFWludGVybmFsQW1vdW50QXNzZXRJZAUAAAAUaW50ZXJuYWxQcmljZUFzc2V0SWQJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAKWtleU1hcHBpbmdQb29sQXNzZXRzVG9Qb29sQ29udHJhY3RBZGRyZXNzAAAAAgUAAAAVaW50ZXJuYWxBbW91bnRBc3NldElkBQAAABRpbnRlcm5hbFByaWNlQXNzZXRJZAUAAAALcG9vbEFkZHJlc3MJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAKmtleU1hcHBpbmdQb29sTFBBc3NldFRvUG9vbENvbnRyYWN0QWRkcmVzcwAAAAEFAAAADGxwQXNzZXRJZFN0cgUAAAALcG9vbEFkZHJlc3MJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAHmtleU1hcHBpbmdQb29sQ29udHJhY1RvTFBBc3NldAAAAAEFAAAAC3Bvb2xBZGRyZXNzBQAAAAxscEFzc2V0SWRTdHIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAAA9rZXlQb29sVG9XZWlnaHQAAAABBQAAAAtwb29sQWRkcmVzcwUAAAAKcG9vbFdlaWdodAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAPa2V5THBUb2tlbnNMaXN0AAAAAAkBAAAAF2NyZWF0ZUxwVG9rZW5zTGlzdEVudHJ5AAAAAQUAAAAMbHBBc3NldElkU3RyBQAAAANuaWwCAAAAB3N1Y2Nlc3MJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAWkBAAAACm1hbmFnZVBvb2wAAAACAAAAC3Bvb2xBZGRyZXNzAAAACW5ld1N0YXR1cwMJAQAAAAIhPQAAAAIIBQAAAAFpAAAABmNhbGxlcgUAAAAEdGhpcwkAAAIAAAABAgAAABJwZXJtaXNzaW9ucyBkZW5pZWQEAAAACnBvb2xDb25maWcJAQAAAA1nZXRQb29sQ29uZmlnAAAAAQUAAAALcG9vbEFkZHJlc3MEAAAACnBvb2xTdGF0dXMJAAGRAAAAAgUAAAAKcG9vbENvbmZpZwUAAAANaWR4UG9vbFN0YXR1cwQAAAAMbHBBc3NldElkU3RyCQABkQAAAAIFAAAACnBvb2xDb25maWcFAAAAEGlkeFBvb2xMUEFzc2V0SWQEAAAADmFtb3VudEFzc2V0U3RyCQABkQAAAAIFAAAACnBvb2xDb25maWcFAAAADWlkeEFtdEFzc2V0SWQEAAAADXByaWNlQXNzZXRTdHIJAAGRAAAAAgUAAAAKcG9vbENvbmZpZwUAAAAPaWR4UHJpY2VBc3NldElkBAAAABRhbW91bnRBc3NldHNEZWNpbWFscwkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAACnBvb2xDb25maWcFAAAADmlkeEFtdEFzc2V0RGNtBAAAABNwcmljZUFzc2V0c0RlY2ltYWxzCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAKcG9vbENvbmZpZwUAAAAQaWR4UHJpY2VBc3NldERjbQQAAAAVaW50ZXJuYWxBbW91bnRBc3NldElkCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAKcG9vbENvbmZpZwUAAAAOaWR4SUFtdEFzc2V0SWQEAAAAFGludGVybmFsUHJpY2VBc3NldElkCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAKcG9vbENvbmZpZwUAAAAQaWR4SVByaWNlQXNzZXRJZAQAAAAKbHBBc3NldERjbQkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAACnBvb2xDb25maWcFAAAADWlkeExQQXNzZXREY20EAAAACHBvb2xUeXBlCQABkQAAAAIFAAAACnBvb2xDb25maWcFAAAAC2lkeFBvb2xUeXBlCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAAA1rZXlQb29sQ29uZmlnAAAAAgkAAaQAAAABBQAAABVpbnRlcm5hbEFtb3VudEFzc2V0SWQJAAGkAAAAAQUAAAAUaW50ZXJuYWxQcmljZUFzc2V0SWQJAQAAAAtkYXRhUG9vbENmZwAAAAsFAAAAC3Bvb2xBZGRyZXNzCQABpAAAAAEFAAAACW5ld1N0YXR1cwUAAAAMbHBBc3NldElkU3RyBQAAAA5hbW91bnRBc3NldFN0cgUAAAANcHJpY2VBc3NldFN0cgUAAAAUYW1vdW50QXNzZXRzRGVjaW1hbHMFAAAAE3ByaWNlQXNzZXRzRGVjaW1hbHMFAAAAFWludGVybmFsQW1vdW50QXNzZXRJZAUAAAAUaW50ZXJuYWxQcmljZUFzc2V0SWQFAAAACmxwQXNzZXREY20FAAAACHBvb2xUeXBlBQAAAANuaWwAAAABaQEAAAAEZW1pdAAAAAEAAAAMYW1vdW50VG9FbWl0BAAAAAZjYWxsZXIIBQAAAAFpAAAABmNhbGxlcgQAAAAMb3JpZ2luQ2FsbGVyCAUAAAABaQAAAAxvcmlnaW5DYWxsZXIEAAAAEGxwQXNzZXRSZXF1ZXN0ZWQJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABCIAAAABCQEAAAAea2V5TWFwcGluZ1Bvb2xDb250cmFjVG9MUEFzc2V0AAAAAQkABCUAAAABBQAAAAZjYWxsZXICAAAAHUludmFsaWQgTFAgYWRkcmVzcyBjYWxsZWQgbWUuBAAAAAdscEFzc2V0CQACWQAAAAEFAAAAEGxwQXNzZXRSZXF1ZXN0ZWQDCQAAZgAAAAIFAAAADGFtb3VudFRvRW1pdAAAAAAAAAAAAAkABRQAAAACCQAETAAAAAIJAQAAAAdSZWlzc3VlAAAAAwUAAAAHbHBBc3NldAUAAAAMYW1vdW50VG9FbWl0BgkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAADGFtb3VudFRvRW1pdAUAAAAHbHBBc3NldAUAAAADbmlsAgAAAAdzdWNjZXNzBQAAAANuaWwAAAABaQEAAAAEYnVybgAAAAEAAAAMYW1vdW50VG9CdXJuBAAAAAZjYWxsZXIIBQAAAAFpAAAABmNhbGxlcgQAAAAMb3JpZ2luQ2FsbGVyCAUAAAABaQAAAAxvcmlnaW5DYWxsZXIEAAAAB3BheW1lbnQJAQAAAAV2YWx1ZQAAAAEJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAEAAAADXBheW1lbnRBbW91bnQJAQAAAAV2YWx1ZQAAAAEIBQAAAAdwYXltZW50AAAABmFtb3VudAQAAAAPaW5BbW91bnRBc3NldElkCQACWAAAAAEJAQAAAAV2YWx1ZQAAAAEIBQAAAAdwYXltZW50AAAAB2Fzc2V0SWQEAAAAGmxwQXNzZXRSZXF1ZXN0ZWRGb3JCdXJuaW5nCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQiAAAAAQkBAAAAHmtleU1hcHBpbmdQb29sQ29udHJhY1RvTFBBc3NldAAAAAEJAAQlAAAAAQUAAAAGY2FsbGVyAgAAAB1JbnZhbGlkIExQIGFkZHJlc3MgY2FsbGVkIG1lLgMJAQAAAAIhPQAAAAIFAAAAD2luQW1vdW50QXNzZXRJZAUAAAAabHBBc3NldFJlcXVlc3RlZEZvckJ1cm5pbmcJAAACAAAAAQIAAAAVSW52YWxpZCBhc3NldCBwYXNzZWQuAwkBAAAAAiE9AAAAAgUAAAAMYW1vdW50VG9CdXJuBQAAAA1wYXltZW50QW1vdW50CQAAAgAAAAECAAAAFkludmFsaWQgYW1vdW50IHBhc3NlZC4EAAAAB2xwQXNzZXQJAAJZAAAAAQUAAAAabHBBc3NldFJlcXVlc3RlZEZvckJ1cm5pbmcJAAUUAAAAAgkABEwAAAACCQEAAAAEQnVybgAAAAIFAAAAB2xwQXNzZXQFAAAADGFtb3VudFRvQnVybgUAAAADbmlsAgAAAAdzdWNjZXNzAAAAAQAAAAJ0eAEAAAAGdmVyaWZ5AAAAAAkAAfQAAAADCAUAAAACdHgAAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJ0eAAAAAZwcm9vZnMAAAAAAAAAAAAIBQAAAAJ0eAAAAA9zZW5kZXJQdWJsaWNLZXnubYOh", "height": 1773233, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 4EwB5dXLTaW2Tb7mQQVhxrr4EkZ1EUFFgVSzE24Qd8cS Next: none Diff:
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 5 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | - | let lPdecimals = 8 | |
5 | - | ||
6 | - | let scale8 = 100000000 | |
7 | - | ||
8 | - | let scale8BigInt = toBigInt(100000000) | |
9 | - | ||
10 | - | let scale18 = toBigInt(1000000000000000000) | |
11 | - | ||
12 | - | let zeroBigInt = toBigInt(0) | |
4 | + | let decimalsMultPrice = ((100 * 1000) * 1000) | |
13 | 5 | ||
14 | 6 | let SEP = "__" | |
15 | - | ||
16 | - | let EMPTY = "" | |
17 | 7 | ||
18 | 8 | let PoolActive = 1 | |
19 | 9 | ||
22 | 12 | let PoolMatcherDisabled = 3 | |
23 | 13 | ||
24 | 14 | let PoolShutdown = 4 | |
15 | + | ||
16 | + | let idxInternalAssetId = 1 | |
17 | + | ||
18 | + | let idxResutActions = 2 | |
19 | + | ||
20 | + | let idxIfAssetIdCalculationPerformed = 3 | |
25 | 21 | ||
26 | 22 | let idxPoolAddress = 1 | |
27 | 23 | ||
43 | 39 | ||
44 | 40 | let idxLPAssetDcm = 10 | |
45 | 41 | ||
46 | - | let idxPoolAmtAssetAmt = 1 | |
47 | - | ||
48 | - | let idxPoolPriceAssetAmt = 2 | |
49 | - | ||
50 | - | let idxPoolLPAssetAmt = 3 | |
51 | - | ||
52 | - | let idxFactoryStakingContract = 1 | |
53 | - | ||
54 | - | let idxFactorySlippageContract = 7 | |
55 | - | ||
56 | - | func toX18 (origVal,origScaleMult) = fraction(toBigInt(origVal), scale18, toBigInt(origScaleMult)) | |
57 | - | ||
58 | - | ||
59 | - | func fromX18 (val,resultScaleMult) = toInt(fraction(val, toBigInt(resultScaleMult), scale18)) | |
60 | - | ||
61 | - | ||
62 | - | func toScale (amt,resScale,curScale) = fraction(amt, resScale, curScale) | |
63 | - | ||
64 | - | ||
65 | - | func abs (val) = if ((zeroBigInt > val)) | |
66 | - | then -(val) | |
67 | - | else val | |
68 | - | ||
69 | - | ||
70 | - | func keyFactoryContract () = "%s__factoryContract" | |
71 | - | ||
72 | - | ||
73 | - | func keyManagerPublicKey () = "%s__managerPublicKey" | |
74 | - | ||
75 | - | ||
76 | - | func keyPriceLast () = "%s%s__price__last" | |
77 | - | ||
78 | - | ||
79 | - | func keyPriceHistory (h,timestamp) = makeString(["%s%s%d%d__price__history", toString(h), toString(timestamp)], SEP) | |
80 | - | ||
81 | - | ||
82 | - | func keyPutActionByUser (userAddress,txId) = ((("%s%s%s__P__" + userAddress) + "__") + txId) | |
83 | - | ||
84 | - | ||
85 | - | func keyGetActionByUser (userAddress,txId) = ((("%s%s%s__G__" + userAddress) + "__") + txId) | |
86 | - | ||
87 | - | ||
88 | - | func keyAmtAsset () = "%s__amountAsset" | |
89 | - | ||
90 | - | ||
91 | - | func keyPriceAsset () = "%s__priceAsset" | |
92 | - | ||
93 | - | ||
94 | - | func keyKHistoric (h,timestamp) = makeString(["%s%s%d%d__K_history", toString(h), toString(timestamp)], SEP) | |
95 | - | ||
42 | + | let idxPoolType = 11 | |
96 | 43 | ||
97 | 44 | func keyFactoryConfig () = "%s__factoryConfig" | |
98 | 45 | ||
99 | 46 | ||
100 | - | func | |
47 | + | func keyLpTokensList () = "%s__lpTokensList" | |
101 | 48 | ||
102 | 49 | ||
103 | - | func keyPoolConfig (iAmtAsset,iPriceAsset) = (((("%d%d%s__" + iAmtAsset) + "__") + iPriceAsset) + "__config") | |
50 | + | func keyPoolScriptHash () = "%s%s__pool__scriptHash" | |
51 | + | ||
52 | + | ||
53 | + | func keyPriceDecimals () = "%s__priceDecimals" | |
54 | + | ||
55 | + | ||
56 | + | func keyAllPoolsShutdown () = "%s__shutdown" | |
57 | + | ||
58 | + | ||
59 | + | func keyNextInternalAssetId () = "%s__nextInternalAssetId" | |
60 | + | ||
61 | + | ||
62 | + | func keyPoolToWeight (poolAddress) = ("%s%s__poolWeight__" + poolAddress) | |
63 | + | ||
64 | + | ||
65 | + | func keyMappingsInternal2baseAssetId (internalBaseAsset) = ("%s%s%d__mappings__internal2baseAssetId__" + toString(internalBaseAsset)) | |
104 | 66 | ||
105 | 67 | ||
106 | 68 | func keyMappingsBaseAsset2internalId (baseAssetStr) = ("%s%s%s__mappings__baseAsset2internalId__" + baseAssetStr) | |
107 | 69 | ||
108 | 70 | ||
109 | - | func | |
71 | + | func keyPoolConfig (amountAssetInternal,priceAssetInternal) = (((("%d%d%s__" + amountAssetInternal) + "__") + priceAssetInternal) + "__config") | |
110 | 72 | ||
111 | 73 | ||
112 | - | func | |
74 | + | func keyMappingLpAssetToPoolAssets (lpAssetStr) = (("%s%s%s__" + lpAssetStr) + "__mappings__lpAsset2Pool") | |
113 | 75 | ||
114 | 76 | ||
115 | - | func | |
77 | + | func keyMappingPoolAssetsToLpasset (internalAmountAssetIdStr,internalPriceAssetIdStr) = (((("%d%d%s%s__" + internalAmountAssetIdStr) + "__") + internalPriceAssetIdStr) + "__mappings__PoolAssets2LpAsset") | |
116 | 78 | ||
117 | 79 | ||
118 | - | func | |
80 | + | func keyMappingPoolContractAddressToPoolAssets (poolContractAddress) = (("%s%s%s__" + poolContractAddress) + "__mappings__poolContract2PoolAssets") | |
119 | 81 | ||
120 | 82 | ||
121 | - | let factoryContract = addressFromStringValue(getStringOrFail(this, keyFactoryContract())) | |
122 | - | ||
123 | - | func isGlobalShutdown () = valueOrElse(getBoolean(factoryContract, keyAllPoolsShutdown()), false) | |
83 | + | func keyMappingPoolAssetsToPoolContractAddress (internalAmountAssetIdStr,internalPriceAssetIdStr) = (((("%d%d%s%s__" + toString(internalAmountAssetIdStr)) + "__") + toString(internalPriceAssetIdStr)) + "__mappings__poolAssets2PoolContract") | |
124 | 84 | ||
125 | 85 | ||
126 | - | func getPoolConfig () = { | |
127 | - | let amtAsset = getStringOrFail(this, keyAmtAsset()) | |
128 | - | let priceAsset = getStringOrFail(this, keyPriceAsset()) | |
129 | - | let iPriceAsset = getIntOrFail(factoryContract, keyMappingsBaseAsset2internalId(priceAsset)) | |
130 | - | let iAmtAsset = getIntOrFail(factoryContract, keyMappingsBaseAsset2internalId(amtAsset)) | |
131 | - | split(getStringOrFail(factoryContract, keyPoolConfig(toString(iAmtAsset), toString(iPriceAsset))), SEP) | |
86 | + | func keyMappingPoolContracToLPAsset (poolContractAddress) = (("%s%s%s__" + poolContractAddress) + "__mappings__poolContract2LpAsset") | |
87 | + | ||
88 | + | ||
89 | + | func keyMappingPoolLPAssetToPoolContractAddress (lpAssetStr) = (("%s%s%s__" + lpAssetStr) + "__mappings__lpAsset2PoolContract") | |
90 | + | ||
91 | + | ||
92 | + | func getStringOrFail (key) = valueOrErrorMessage(getString(this, key), ("No data for this.key=" + key)) | |
93 | + | ||
94 | + | ||
95 | + | func getBooleanOrFail (key) = valueOrErrorMessage(getBoolean(this, key), ("No data for this.key=" + key)) | |
96 | + | ||
97 | + | ||
98 | + | func getIntOrFail (key) = valueOrErrorMessage(getInteger(this, key), ("No data for this.key=" + key)) | |
99 | + | ||
100 | + | ||
101 | + | func dataFactoryCfg (stakingAddress,boostingAddress,idoContract,teamContract,emissionContract,restContract,slippageContract) = makeString(["%s%s%s%s%s%s", stakingAddress, boostingAddress, idoContract, teamContract, emissionContract, restContract, slippageContract], SEP) | |
102 | + | ||
103 | + | ||
104 | + | func dataPoolCfg (poolAddress,poolStatus,lpAssetId,amountAssetStr,priceAssetStr,amountAssetDecimals,priceAssetDecimals,amountAssetInternalId,priceAssetInternalId,lpAssetDecimals,poolType) = makeString(["%s%d%s%s%s%d%d%d%d%d%s", poolAddress, poolStatus, lpAssetId, amountAssetStr, priceAssetStr, toString(amountAssetDecimals), toString(priceAssetDecimals), toString(amountAssetInternalId), toString(priceAssetInternalId), toString(lpAssetDecimals), poolType], SEP) | |
105 | + | ||
106 | + | ||
107 | + | func dataMappingPoolAssets (internalAmountAssetStr,internalPriceAssetStr) = makeString(["%d%d", toString(internalAmountAssetStr), toString(internalPriceAssetStr)], SEP) | |
108 | + | ||
109 | + | ||
110 | + | func getPoolConfig (poolAddress) = { | |
111 | + | let poolAssets = split(getStringOrFail(keyMappingPoolContractAddressToPoolAssets(poolAddress)), SEP) | |
112 | + | let amountAssetInternal = poolAssets[1] | |
113 | + | let priceAssetInternal = poolAssets[2] | |
114 | + | split(getStringOrFail(keyPoolConfig(amountAssetInternal, priceAssetInternal)), SEP) | |
132 | 115 | } | |
133 | 116 | ||
134 | 117 | ||
135 | - | func getFactoryConfig () = split(getStringOrFail(factoryContract, keyFactoryConfig()), SEP) | |
136 | - | ||
137 | - | ||
138 | - | func dataPutActionInfo (inAmtAssetAmt,inPriceAssetAmt,outLpAmt,price,slippageTolerancePassedByUser,slippageToleranceReal,txHeight,txTimestamp,slipageAmtAssetAmt,slipagePriceAssetAmt) = makeString(["%d%d%d%d%d%d%d%d%d%d", toString(inAmtAssetAmt), toString(inPriceAssetAmt), toString(outLpAmt), toString(price), toString(slippageTolerancePassedByUser), toString(slippageToleranceReal), toString(txHeight), toString(txTimestamp), toString(slipageAmtAssetAmt), toString(slipagePriceAssetAmt)], SEP) | |
139 | - | ||
140 | - | ||
141 | - | func dataGetActionInfo (outAmtAssetAmt,outPriceAssetAmt,inLpAmt,price,txHeight,txTimestamp) = makeString(["%d%d%d%d%d%d", toString(outAmtAssetAmt), toString(outPriceAssetAmt), toString(inLpAmt), toString(price), toString(txHeight), toString(txTimestamp)], SEP) | |
142 | - | ||
143 | - | ||
144 | - | func getAccBalance (assetId) = if ((assetId == "WAVES")) | |
145 | - | then wavesBalance(this).available | |
146 | - | else assetBalance(this, fromBase58String(assetId)) | |
147 | - | ||
148 | - | ||
149 | - | func calcPriceBigInt (prAmtX18,amAmtX18) = fraction(prAmtX18, scale18, amAmtX18) | |
150 | - | ||
151 | - | ||
152 | - | func privateCalcPrice (amAssetDcm,prAssetDcm,amAmt,prAmt) = { | |
153 | - | let amtAssetAmtX18 = toX18(amAmt, amAssetDcm) | |
154 | - | let priceAssetAmtX18 = toX18(prAmt, prAssetDcm) | |
155 | - | calcPriceBigInt(priceAssetAmtX18, amtAssetAmtX18) | |
118 | + | func getInternalAssetIdOrCreate (assetIdStr,incrementor) = { | |
119 | + | let internalAssetId = valueOrElse(getInteger(this, keyMappingsBaseAsset2internalId(assetIdStr)), 0) | |
120 | + | let currentIndexOfInternalId = valueOrElse(getInteger(this, keyNextInternalAssetId()), 0) | |
121 | + | let result = if ((internalAssetId == 0)) | |
122 | + | then { | |
123 | + | let newInternalAssetId = (currentIndexOfInternalId + incrementor) | |
124 | + | $Tuple3(newInternalAssetId, [IntegerEntry(keyNextInternalAssetId(), newInternalAssetId), IntegerEntry(keyMappingsBaseAsset2internalId(assetIdStr), newInternalAssetId), StringEntry(keyMappingsInternal2baseAssetId(newInternalAssetId), assetIdStr)], true) | |
125 | + | } | |
126 | + | else $Tuple3(internalAssetId, nil, false) | |
127 | + | result | |
156 | 128 | } | |
157 | 129 | ||
158 | 130 | ||
159 | - | func calcPrices (amAmt,prAmt,lpAmt) = { | |
160 | - | let cfg = getPoolConfig() | |
161 | - | let amtAssetDcm = parseIntValue(cfg[idxAmtAssetDcm]) | |
162 | - | let priceAssetDcm = parseIntValue(cfg[idxPriceAssetDcm]) | |
163 | - | let priceX18 = privateCalcPrice(amtAssetDcm, priceAssetDcm, amAmt, prAmt) | |
164 | - | let amAmtX18 = toX18(amAmt, amtAssetDcm) | |
165 | - | let prAmtX18 = toX18(prAmt, priceAssetDcm) | |
166 | - | let lpAmtX18 = toX18(lpAmt, scale8) | |
167 | - | let lpPriceInAmAssetX18 = calcPriceBigInt(amAmtX18, lpAmtX18) | |
168 | - | let lpPriceInPrAssetX18 = calcPriceBigInt(prAmtX18, lpAmtX18) | |
169 | - | [priceX18, lpPriceInAmAssetX18, lpPriceInPrAssetX18] | |
131 | + | func createLpTokensListEntry (newLpToken) = { | |
132 | + | let lpTokens = getString(this, keyLpTokensList()) | |
133 | + | if (isDefined(lpTokens)) | |
134 | + | then ((value(lpTokens) + SEP) + newLpToken) | |
135 | + | else newLpToken | |
170 | 136 | } | |
171 | 137 | ||
172 | 138 | ||
173 | - | func calculatePrices (amAmt,prAmt,lpAmt) = { | |
174 | - | let prices = calcPrices(amAmt, prAmt, lpAmt) | |
175 | - | [fromX18(prices[0], scale8), fromX18(prices[1], scale8), fromX18(prices[2], scale8)] | |
176 | - | } | |
177 | - | ||
178 | - | ||
179 | - | func estimateGetOperation (txId58,pmtAssetId,pmtLpAmt,userAddress) = { | |
180 | - | let cfg = getPoolConfig() | |
181 | - | let lpAssetId = cfg[idxPoolLPAssetId] | |
182 | - | let amAssetId = cfg[idxAmtAssetId] | |
183 | - | let prAssetId = cfg[idxPriceAssetId] | |
184 | - | let amAssetDcm = parseIntValue(cfg[idxAmtAssetDcm]) | |
185 | - | let prAssetDcm = parseIntValue(cfg[idxPriceAssetDcm]) | |
186 | - | let poolStatus = cfg[idxPoolStatus] | |
187 | - | let lpEmission = valueOrErrorMessage(assetInfo(fromBase58String(lpAssetId)), (("Asset " + lpAssetId) + " doesn't exist")).quantity | |
188 | - | if ((lpAssetId != pmtAssetId)) | |
189 | - | then throw("Invalid asset passed.") | |
190 | - | else { | |
191 | - | let amBalance = getAccBalance(amAssetId) | |
192 | - | let amBalanceX18 = toX18(amBalance, amAssetDcm) | |
193 | - | let prBalance = getAccBalance(prAssetId) | |
194 | - | let prBalanceX18 = toX18(prBalance, prAssetDcm) | |
195 | - | let curPriceX18 = calcPriceBigInt(prBalanceX18, amBalanceX18) | |
196 | - | let curPrice = fromX18(curPriceX18, scale8) | |
197 | - | let pmtLpAmtX18 = toX18(pmtLpAmt, scale8) | |
198 | - | let lpEmissionX18 = toX18(lpEmission, scale8) | |
199 | - | let outAmAmtX18 = fraction(amBalanceX18, pmtLpAmtX18, lpEmissionX18) | |
200 | - | let outPrAmtX18 = fraction(prBalanceX18, pmtLpAmtX18, lpEmissionX18) | |
201 | - | let outAmAmt = fromX18(outAmAmtX18, amAssetDcm) | |
202 | - | let outPrAmt = fromX18(outPrAmtX18, prAssetDcm) | |
203 | - | let state = if ((txId58 == "")) | |
204 | - | then nil | |
205 | - | else [ScriptTransfer(userAddress, outAmAmt, if ((amAssetId == "WAVES")) | |
206 | - | then unit | |
207 | - | else fromBase58String(amAssetId)), ScriptTransfer(userAddress, outPrAmt, if ((prAssetId == "WAVES")) | |
208 | - | then unit | |
209 | - | else fromBase58String(prAssetId)), StringEntry(keyGetActionByUser(toString(userAddress), txId58), dataGetActionInfo(outAmAmt, outPrAmt, pmtLpAmt, curPrice, height, lastBlock.timestamp)), IntegerEntry(keyPriceLast(), curPrice), IntegerEntry(keyPriceHistory(height, lastBlock.timestamp), curPrice)] | |
210 | - | $Tuple10(outAmAmt, outPrAmt, amAssetId, prAssetId, amBalance, prBalance, lpEmission, curPriceX18, poolStatus, state) | |
211 | - | } | |
212 | - | } | |
213 | - | ||
214 | - | ||
215 | - | func estimatePutOperation (txId58,slippageTolerance,inAmAssetAmt,inAmAssetId,inPrAssetAmt,inPrAssetId,userAddress,isEvaluate,emitLp) = { | |
216 | - | let cfg = getPoolConfig() | |
217 | - | let lpAssetId = fromBase58String(cfg[idxPoolLPAssetId]) | |
218 | - | let amAssetIdStr = cfg[idxAmtAssetId] | |
219 | - | let prAssetIdStr = cfg[idxPriceAssetId] | |
220 | - | let iAmtAssetId = cfg[idxIAmtAssetId] | |
221 | - | let iPriceAssetId = cfg[idxIPriceAssetId] | |
222 | - | let amtAssetDcm = parseIntValue(cfg[idxAmtAssetDcm]) | |
223 | - | let priceAssetDcm = parseIntValue(cfg[idxPriceAssetDcm]) | |
224 | - | let poolStatus = cfg[idxPoolStatus] | |
225 | - | let lpEmission = valueOrErrorMessage(assetInfo(lpAssetId), (("Asset " + toBase58String(lpAssetId)) + " doesn't exist")).quantity | |
226 | - | let inAmAssetIdStr = toBase58String(valueOrElse(inAmAssetId, fromBase58String("WAVES"))) | |
227 | - | let inPrAssetIdStr = toBase58String(valueOrElse(inPrAssetId, fromBase58String("WAVES"))) | |
228 | - | if (if ((amAssetIdStr != inAmAssetIdStr)) | |
229 | - | then true | |
230 | - | else (prAssetIdStr != inPrAssetIdStr)) | |
231 | - | then throw("Invalid amt or price asset passed.") | |
232 | - | else { | |
233 | - | let amBalance = if (isEvaluate) | |
234 | - | then getAccBalance(amAssetIdStr) | |
235 | - | else (getAccBalance(amAssetIdStr) - inAmAssetAmt) | |
236 | - | let prBalance = if (isEvaluate) | |
237 | - | then getAccBalance(prAssetIdStr) | |
238 | - | else (getAccBalance(prAssetIdStr) - inPrAssetAmt) | |
239 | - | let inAmAssetAmtX18 = toX18(inAmAssetAmt, amtAssetDcm) | |
240 | - | let inPrAssetAmtX18 = toX18(inPrAssetAmt, priceAssetDcm) | |
241 | - | let userPriceX18 = calcPriceBigInt(inPrAssetAmtX18, inAmAssetAmtX18) | |
242 | - | let amBalanceX18 = toX18(amBalance, amtAssetDcm) | |
243 | - | let prBalanceX18 = toX18(prBalance, priceAssetDcm) | |
244 | - | let res = if ((lpEmission == 0)) | |
245 | - | then { | |
246 | - | let curPriceX18 = zeroBigInt | |
247 | - | let slippageX18 = zeroBigInt | |
248 | - | let lpAmtX18 = pow((inAmAssetAmtX18 * inPrAssetAmtX18), 0, toBigInt(5), 1, 0, DOWN) | |
249 | - | $Tuple5(fromX18(lpAmtX18, scale8), fromX18(inAmAssetAmtX18, amtAssetDcm), fromX18(inPrAssetAmtX18, priceAssetDcm), calcPriceBigInt((prBalanceX18 + inPrAssetAmtX18), (amBalanceX18 + inAmAssetAmtX18)), slippageX18) | |
250 | - | } | |
251 | - | else { | |
252 | - | let curPriceX18 = calcPriceBigInt(prBalanceX18, amBalanceX18) | |
253 | - | let slippageX18 = fraction(abs((curPriceX18 - userPriceX18)), scale18, curPriceX18) | |
254 | - | let slippageToleranceX18 = toX18(slippageTolerance, scale8) | |
255 | - | if (if ((curPriceX18 != zeroBigInt)) | |
256 | - | then (slippageX18 > slippageToleranceX18) | |
257 | - | else false) | |
258 | - | then throw(((("Price slippage " + toString(slippageX18)) + " exceeded the passed limit of ") + toString(slippageToleranceX18))) | |
259 | - | else { | |
260 | - | let lpEmissionX18 = toX18(lpEmission, scale8) | |
261 | - | let prViaAmX18 = fraction(inAmAssetAmtX18, curPriceX18, scale18) | |
262 | - | let amViaPrX18 = fraction(inPrAssetAmtX18, scale18, curPriceX18) | |
263 | - | let expectedAmts = if ((prViaAmX18 > inPrAssetAmtX18)) | |
264 | - | then $Tuple2(amViaPrX18, inPrAssetAmtX18) | |
265 | - | else $Tuple2(inAmAssetAmtX18, prViaAmX18) | |
266 | - | let expAmtAssetAmtX18 = expectedAmts._1 | |
267 | - | let expPriceAssetAmtX18 = expectedAmts._2 | |
268 | - | let lpAmtX18 = fraction(lpEmissionX18, expPriceAssetAmtX18, prBalanceX18) | |
269 | - | $Tuple5(fromX18(lpAmtX18, scale8), fromX18(expAmtAssetAmtX18, amtAssetDcm), fromX18(expPriceAssetAmtX18, priceAssetDcm), curPriceX18, slippageX18) | |
270 | - | } | |
271 | - | } | |
272 | - | let calcLpAmt = res._1 | |
273 | - | let calcAmAssetPmt = res._2 | |
274 | - | let calcPrAssetPmt = res._3 | |
275 | - | let curPrice = fromX18(res._4, scale8) | |
276 | - | let slippageCalc = fromX18(res._5, scale8) | |
277 | - | if ((0 >= calcLpAmt)) | |
278 | - | then throw("Invalid calculations. LP calculated is less than zero.") | |
279 | - | else { | |
280 | - | let emitLpAmt = if (!(emitLp)) | |
281 | - | then 0 | |
282 | - | else calcLpAmt | |
283 | - | let amDiff = (inAmAssetAmt - calcAmAssetPmt) | |
284 | - | let prDiff = (inPrAssetAmt - calcPrAssetPmt) | |
285 | - | let commonState = [IntegerEntry(keyPriceLast(), curPrice), IntegerEntry(keyPriceHistory(height, lastBlock.timestamp), curPrice), StringEntry(keyPutActionByUser(userAddress, txId58), dataPutActionInfo(calcAmAssetPmt, calcPrAssetPmt, emitLpAmt, curPrice, slippageTolerance, slippageCalc, height, lastBlock.timestamp, amDiff, prDiff))] | |
286 | - | $Tuple13(calcLpAmt, emitLpAmt, curPrice, amBalance, prBalance, lpEmission, lpAssetId, poolStatus, commonState, amDiff, prDiff, inAmAssetId, inPrAssetId) | |
287 | - | } | |
288 | - | } | |
289 | - | } | |
290 | - | ||
291 | - | ||
292 | - | func validateMatcherOrderAllowed (order) = { | |
293 | - | let cfg = getPoolConfig() | |
294 | - | let amtAssetId = cfg[idxAmtAssetId] | |
295 | - | let priceAssetId = cfg[idxPriceAssetId] | |
296 | - | let poolStatus = parseIntValue(cfg[idxPoolStatus]) | |
297 | - | let amtAssetDcm = parseIntValue(cfg[idxAmtAssetDcm]) | |
298 | - | let priceAssetDcm = parseIntValue(cfg[idxPriceAssetDcm]) | |
299 | - | let accAmtAssetBalance = getAccBalance(amtAssetId) | |
300 | - | let accPriceAssetBalance = getAccBalance(priceAssetId) | |
301 | - | let curPriceX18 = if ((order.orderType == Buy)) | |
302 | - | then privateCalcPrice(amtAssetDcm, priceAssetDcm, (accAmtAssetBalance + order.amount), accPriceAssetBalance) | |
303 | - | else privateCalcPrice(amtAssetDcm, priceAssetDcm, (accAmtAssetBalance - order.amount), accPriceAssetBalance) | |
304 | - | let curPrice = fromX18(curPriceX18, scale8) | |
305 | - | if (if (if (isGlobalShutdown()) | |
306 | - | then true | |
307 | - | else (poolStatus == PoolMatcherDisabled)) | |
308 | - | then true | |
309 | - | else (poolStatus == PoolShutdown)) | |
310 | - | then throw("Exchange operations disabled") | |
311 | - | else { | |
312 | - | let orderAmtAsset = order.assetPair.amountAsset | |
313 | - | let orderAmtAssetStr = if ((orderAmtAsset == unit)) | |
314 | - | then "WAVES" | |
315 | - | else toBase58String(value(orderAmtAsset)) | |
316 | - | let orderPriceAsset = order.assetPair.priceAsset | |
317 | - | let orderPriceAssetStr = if ((orderPriceAsset == unit)) | |
318 | - | then "WAVES" | |
319 | - | else toBase58String(value(orderPriceAsset)) | |
320 | - | if (if ((orderAmtAssetStr != amtAssetId)) | |
321 | - | then true | |
322 | - | else (orderPriceAssetStr != priceAssetId)) | |
323 | - | then throw("Wrong order assets.") | |
324 | - | else { | |
325 | - | let orderPrice = order.price | |
326 | - | let priceDcm = fraction(scale8, priceAssetDcm, amtAssetDcm) | |
327 | - | let castedOrderPrice = toScale(orderPrice, scale8, priceDcm) | |
328 | - | let isOrderPriceValid = if ((order.orderType == Buy)) | |
329 | - | then (curPrice >= castedOrderPrice) | |
330 | - | else (castedOrderPrice >= curPrice) | |
331 | - | true | |
332 | - | } | |
333 | - | } | |
334 | - | } | |
335 | - | ||
336 | - | ||
337 | - | func commonGet (i) = if ((size(i.payments) != 1)) | |
338 | - | then throw("exactly 1 payment is expected") | |
339 | - | else { | |
340 | - | let pmt = value(i.payments[0]) | |
341 | - | let pmtAssetId = value(pmt.assetId) | |
342 | - | let pmtAmt = pmt.amount | |
343 | - | let res = estimateGetOperation(toBase58String(i.transactionId), toBase58String(pmtAssetId), pmtAmt, i.caller) | |
344 | - | let outAmAmt = res._1 | |
345 | - | let outPrAmt = res._2 | |
346 | - | let poolStatus = parseIntValue(res._9) | |
347 | - | let state = res._10 | |
348 | - | if (if (isGlobalShutdown()) | |
349 | - | then true | |
350 | - | else (poolStatus == PoolShutdown)) | |
351 | - | then throw(("Get operation is blocked by admin. Status = " + toString(poolStatus))) | |
352 | - | else $Tuple5(outAmAmt, outPrAmt, pmtAmt, pmtAssetId, state) | |
353 | - | } | |
354 | - | ||
355 | - | ||
356 | - | func commonPut (i,slippageTolerance,emitLp) = if ((size(i.payments) != 2)) | |
357 | - | then throw("exactly 2 payments are expected") | |
358 | - | else { | |
359 | - | let amAssetPmt = value(i.payments[0]) | |
360 | - | let prAssetPmt = value(i.payments[1]) | |
361 | - | let estPut = estimatePutOperation(toBase58String(i.transactionId), slippageTolerance, amAssetPmt.amount, amAssetPmt.assetId, prAssetPmt.amount, prAssetPmt.assetId, toString(i.caller), false, emitLp) | |
362 | - | let poolStatus = parseIntValue(estPut._8) | |
363 | - | if (if (if (isGlobalShutdown()) | |
364 | - | then true | |
365 | - | else (poolStatus == PoolPutDisabled)) | |
366 | - | then true | |
367 | - | else (poolStatus == PoolShutdown)) | |
368 | - | then throw(("Put operation is blocked by admin. Status = " + toString(poolStatus))) | |
369 | - | else estPut | |
370 | - | } | |
371 | - | ||
372 | - | ||
373 | 139 | @Callable(i) | |
374 | - | func constructor ( | |
140 | + | func constructor (stakingContract,boostingContract,idoContract,teamContract,emissionContract,restContract,slpipageContract,priceDecimals) = if ((i.caller != this)) | |
375 | 141 | then throw("permissions denied") | |
376 | - | else [StringEntry( | |
142 | + | else [StringEntry(keyFactoryConfig(), dataFactoryCfg(stakingContract, boostingContract, idoContract, teamContract, emissionContract, restContract, slpipageContract)), IntegerEntry(keyPriceDecimals(), priceDecimals)] | |
377 | 143 | ||
378 | 144 | ||
379 | 145 | ||
380 | 146 | @Callable(i) | |
381 | - | func put (slippageTolerance,shouldAutoStake) = { | |
382 | - | let factoryCfg = getFactoryConfig() | |
383 | - | let stakingContract = valueOrErrorMessage(addressFromString(factoryCfg[idxFactoryStakingContract]), "Error. Incorrect staking address.") | |
384 | - | let slippageContract = valueOrErrorMessage(addressFromString(factoryCfg[idxFactorySlippageContract]), "Error. Incorrect slippage contract address.") | |
385 | - | if ((0 > slippageTolerance)) | |
386 | - | then throw("Invalid slippageTolerance passed") | |
147 | + | func activateNewPool (poolAddress,amountAssetStr,priceAssetStr,lpAssetName,lpAssetDescr,poolWeight,poolType) = if ((i.caller != this)) | |
148 | + | then throw("permissions denied") | |
149 | + | else if (isDefined(getString(keyMappingPoolContractAddressToPoolAssets(poolAddress)))) | |
150 | + | then throw((("Pool address " + poolAddress) + " already registered.")) | |
387 | 151 | else { | |
388 | - | let estPut = commonPut(i, slippageTolerance, true) | |
389 | - | let emitLpAmt = estPut._2 | |
390 | - | let lpAssetId = estPut._7 | |
391 | - | let state = estPut._9 | |
392 | - | let amDiff = estPut._10 | |
393 | - | let prDiff = estPut._11 | |
394 | - | let amId = estPut._12 | |
395 | - | let prId = estPut._13 | |
396 | - | let emitInv = invoke(factoryContract, "emit", [emitLpAmt], nil) | |
397 | - | if ((emitInv == emitInv)) | |
398 | - | then { | |
399 | - | let slippageAInv = if ((amDiff > 0)) | |
400 | - | then invoke(slippageContract, "put", nil, [AttachedPayment(amId, amDiff)]) | |
401 | - | else nil | |
402 | - | if ((slippageAInv == slippageAInv)) | |
403 | - | then { | |
404 | - | let slippagePInv = if ((prDiff > 0)) | |
405 | - | then invoke(slippageContract, "put", nil, [AttachedPayment(prId, prDiff)]) | |
406 | - | else nil | |
407 | - | if ((slippagePInv == slippagePInv)) | |
408 | - | then { | |
409 | - | let lpTransfer = if (shouldAutoStake) | |
410 | - | then { | |
411 | - | let slpStakeInv = invoke(stakingContract, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmt)]) | |
412 | - | if ((slpStakeInv == slpStakeInv)) | |
413 | - | then nil | |
414 | - | else throw("Strict value is not equal to itself.") | |
415 | - | } | |
416 | - | else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)] | |
417 | - | (state ++ lpTransfer) | |
418 | - | } | |
419 | - | else throw("Strict value is not equal to itself.") | |
420 | - | } | |
152 | + | let internalAmountAssetData = getInternalAssetIdOrCreate(amountAssetStr, 1) | |
153 | + | let internalAmountAssetId = internalAmountAssetData._1 | |
154 | + | let internalPriceAssetData = getInternalAssetIdOrCreate(priceAssetStr, if (internalAmountAssetData._3) | |
155 | + | then 2 | |
156 | + | else 1) | |
157 | + | let internalPriceAssetId = internalPriceAssetData._1 | |
158 | + | let poolAccountScriptHash = valueOrErrorMessage(scriptHash(addressFromStringValue(poolAddress)), ("No script has been found on pool account " + poolAddress)) | |
159 | + | let ethalonPoolAccountScriptHash = getBinaryValue(keyPoolScriptHash()) | |
160 | + | let poolConfig = getString(this, keyPoolConfig(toString(internalAmountAssetId), toString(internalPriceAssetId))) | |
161 | + | if (isDefined(poolConfig)) | |
162 | + | then throw((((("Pool " + amountAssetStr) + "/") + priceAssetStr) + " has already been activated.")) | |
163 | + | else { | |
164 | + | let poolConfigValue = value(getString(this, keyPoolConfig(toString(internalAmountAssetId), toString(internalPriceAssetId)))) | |
165 | + | let amountAssetsDecimals = if ((amountAssetStr == "WAVES")) | |
166 | + | then decimalsMultPrice | |
167 | + | else pow(10, 0, value(assetInfo(fromBase58String(amountAssetStr))).decimals, 0, 0, DOWN) | |
168 | + | let priceAssetsDecimals = if ((priceAssetStr == "WAVES")) | |
169 | + | then decimalsMultPrice | |
170 | + | else pow(10, 0, value(assetInfo(fromBase58String(priceAssetStr))).decimals, 0, 0, DOWN) | |
171 | + | let lpAssetIssueAction = Issue(lpAssetName, lpAssetDescr, 1, 8, true) | |
172 | + | let lpAssetId = calculateAssetId(lpAssetIssueAction) | |
173 | + | let lpAssetIdStr = toBase58String(lpAssetId) | |
174 | + | let poolActivateInvokeResult = invoke(addressFromStringValue(poolAddress), "activate", [amountAssetStr, priceAssetStr], nil) | |
175 | + | if ((poolActivateInvokeResult == poolActivateInvokeResult)) | |
176 | + | then if ((poolActivateInvokeResult != "success")) | |
177 | + | then throw("Pool initialisation error happened.") | |
178 | + | else $Tuple2(((internalAmountAssetData._2 ++ internalPriceAssetData._2) ++ [lpAssetIssueAction, Burn(lpAssetId, 1), StringEntry(keyPoolConfig(toString(internalAmountAssetId), toString(internalPriceAssetId)), dataPoolCfg(poolAddress, toString(PoolActive), lpAssetIdStr, amountAssetStr, priceAssetStr, amountAssetsDecimals, priceAssetsDecimals, internalAmountAssetId, internalPriceAssetId, decimalsMultPrice, poolType)), StringEntry(keyMappingLpAssetToPoolAssets(lpAssetIdStr), dataMappingPoolAssets(internalAmountAssetId, internalPriceAssetId)), StringEntry(keyMappingPoolAssetsToLpasset(toString(internalAmountAssetId), toString(internalPriceAssetId)), ("%s__" + lpAssetIdStr)), StringEntry(keyMappingPoolContractAddressToPoolAssets(poolAddress), dataMappingPoolAssets(internalAmountAssetId, internalPriceAssetId)), StringEntry(keyMappingPoolAssetsToPoolContractAddress(internalAmountAssetId, internalPriceAssetId), poolAddress), StringEntry(keyMappingPoolLPAssetToPoolContractAddress(lpAssetIdStr), poolAddress), StringEntry(keyMappingPoolContracToLPAsset(poolAddress), lpAssetIdStr), IntegerEntry(keyPoolToWeight(poolAddress), poolWeight), StringEntry(keyLpTokensList(), createLpTokensListEntry(lpAssetIdStr))]), "success") | |
421 | 179 | else throw("Strict value is not equal to itself.") | |
422 | 180 | } | |
423 | - | else throw("Strict value is not equal to itself.") | |
424 | 181 | } | |
182 | + | ||
183 | + | ||
184 | + | ||
185 | + | @Callable(i) | |
186 | + | func managePool (poolAddress,newStatus) = if ((i.caller != this)) | |
187 | + | then throw("permissions denied") | |
188 | + | else { | |
189 | + | let poolConfig = getPoolConfig(poolAddress) | |
190 | + | let poolStatus = poolConfig[idxPoolStatus] | |
191 | + | let lpAssetIdStr = poolConfig[idxPoolLPAssetId] | |
192 | + | let amountAssetStr = poolConfig[idxAmtAssetId] | |
193 | + | let priceAssetStr = poolConfig[idxPriceAssetId] | |
194 | + | let amountAssetsDecimals = parseIntValue(poolConfig[idxAmtAssetDcm]) | |
195 | + | let priceAssetsDecimals = parseIntValue(poolConfig[idxPriceAssetDcm]) | |
196 | + | let internalAmountAssetId = parseIntValue(poolConfig[idxIAmtAssetId]) | |
197 | + | let internalPriceAssetId = parseIntValue(poolConfig[idxIPriceAssetId]) | |
198 | + | let lpAssetDcm = parseIntValue(poolConfig[idxLPAssetDcm]) | |
199 | + | let poolType = poolConfig[idxPoolType] | |
200 | + | [StringEntry(keyPoolConfig(toString(internalAmountAssetId), toString(internalPriceAssetId)), dataPoolCfg(poolAddress, toString(newStatus), lpAssetIdStr, amountAssetStr, priceAssetStr, amountAssetsDecimals, priceAssetsDecimals, internalAmountAssetId, internalPriceAssetId, lpAssetDcm, poolType))] | |
201 | + | } | |
202 | + | ||
203 | + | ||
204 | + | ||
205 | + | @Callable(i) | |
206 | + | func emit (amountToEmit) = { | |
207 | + | let caller = i.caller | |
208 | + | let originCaller = i.originCaller | |
209 | + | let lpAssetRequested = valueOrErrorMessage(getString(keyMappingPoolContracToLPAsset(toString(caller))), "Invalid LP address called me.") | |
210 | + | let lpAsset = fromBase58String(lpAssetRequested) | |
211 | + | if ((amountToEmit > 0)) | |
212 | + | then $Tuple2([Reissue(lpAsset, amountToEmit, true), ScriptTransfer(i.caller, amountToEmit, lpAsset)], "success") | |
213 | + | else nil | |
425 | 214 | } | |
426 | 215 | ||
427 | 216 | ||
428 | 217 | ||
429 | 218 | @Callable(i) | |
430 | - | func putForFree (maxSlippage) = if ((0 > maxSlippage)) | |
431 | - | then throw("Invalid value passed") | |
432 | - | else { | |
433 | - | let estPut = commonPut(i, maxSlippage, false) | |
434 | - | estPut._9 | |
435 | - | } | |
436 | - | ||
437 | - | ||
438 | - | ||
439 | - | @Callable(i) | |
440 | - | func get () = { | |
441 | - | let res = commonGet(i) | |
442 | - | let outAmtAmt = res._1 | |
443 | - | let outPrAmt = res._2 | |
444 | - | let pmtAmt = res._3 | |
445 | - | let pmtAssetId = res._4 | |
446 | - | let state = res._5 | |
447 | - | let burnLPAssetOnFactory = invoke(factoryContract, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)]) | |
448 | - | if ((burnLPAssetOnFactory == burnLPAssetOnFactory)) | |
449 | - | then state | |
450 | - | else throw("Strict value is not equal to itself.") | |
451 | - | } | |
452 | - | ||
453 | - | ||
454 | - | ||
455 | - | @Callable(i) | |
456 | - | func getNoLess (noLessThenAmtAsset,noLessThenPriceAsset) = { | |
457 | - | let res = commonGet(i) | |
458 | - | let outAmAmt = res._1 | |
459 | - | let outPrAmt = res._2 | |
460 | - | let pmtAmt = res._3 | |
461 | - | let pmtAssetId = res._4 | |
462 | - | let state = res._5 | |
463 | - | if ((noLessThenAmtAsset > outAmAmt)) | |
464 | - | then throw(((("noLessThenAmtAsset failed: " + toString(outAmAmt)) + " < ") + toString(noLessThenAmtAsset))) | |
465 | - | else if ((noLessThenPriceAsset > outPrAmt)) | |
466 | - | then throw(((("noLessThenPriceAsset failed: " + toString(outPrAmt)) + " < ") + toString(noLessThenPriceAsset))) | |
219 | + | func burn (amountToBurn) = { | |
220 | + | let caller = i.caller | |
221 | + | let originCaller = i.originCaller | |
222 | + | let payment = value(i.payments[0]) | |
223 | + | let paymentAmount = value(payment.amount) | |
224 | + | let inAmountAssetId = toBase58String(value(payment.assetId)) | |
225 | + | let lpAssetRequestedForBurning = valueOrErrorMessage(getString(keyMappingPoolContracToLPAsset(toString(caller))), "Invalid LP address called me.") | |
226 | + | if ((inAmountAssetId != lpAssetRequestedForBurning)) | |
227 | + | then throw("Invalid asset passed.") | |
228 | + | else if ((amountToBurn != paymentAmount)) | |
229 | + | then throw("Invalid amount passed.") | |
467 | 230 | else { | |
468 | - | let burnLPAssetOnFactory = invoke(factoryContract, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)]) | |
469 | - | if ((burnLPAssetOnFactory == burnLPAssetOnFactory)) | |
470 | - | then state | |
471 | - | else throw("Strict value is not equal to itself.") | |
231 | + | let lpAsset = fromBase58String(lpAssetRequestedForBurning) | |
232 | + | $Tuple2([Burn(lpAsset, amountToBurn)], "success") | |
472 | 233 | } | |
473 | 234 | } | |
474 | 235 | ||
475 | 236 | ||
476 | - | ||
477 | - | @Callable(i) | |
478 | - | func activate (amtAssetStr,priceAssetStr) = if ((toString(i.caller) != toString(factoryContract))) | |
479 | - | then throw("permissions denied") | |
480 | - | else $Tuple2([StringEntry(keyAmtAsset(), amtAssetStr), StringEntry(keyPriceAsset(), priceAssetStr)], "success") | |
481 | - | ||
482 | - | ||
483 | - | ||
484 | - | @Callable(i) | |
485 | - | func getPoolConfigWrapperREADONLY () = $Tuple2(nil, getPoolConfig()) | |
486 | - | ||
487 | - | ||
488 | - | ||
489 | - | @Callable(i) | |
490 | - | func getAccBalanceWrapperREADONLY (assetId) = $Tuple2(nil, getAccBalance(assetId)) | |
491 | - | ||
492 | - | ||
493 | - | ||
494 | - | @Callable(i) | |
495 | - | func calcPricesWrapperREADONLY (amAmt,prAmt,lpAmt) = { | |
496 | - | let prices = calcPrices(amAmt, prAmt, lpAmt) | |
497 | - | $Tuple2(nil, [toString(prices[0]), toString(prices[1]), toString(prices[2])]) | |
498 | - | } | |
499 | - | ||
500 | - | ||
501 | - | ||
502 | - | @Callable(i) | |
503 | - | func toX18WrapperREADONLY (origVal,origScaleMult) = $Tuple2(nil, toString(toX18(origVal, origScaleMult))) | |
504 | - | ||
505 | - | ||
506 | - | ||
507 | - | @Callable(i) | |
508 | - | func fromX18WrapperREADONLY (val,resultScaleMult) = $Tuple2(nil, fromX18(parseBigIntValue(val), resultScaleMult)) | |
509 | - | ||
510 | - | ||
511 | - | ||
512 | - | @Callable(i) | |
513 | - | func calcPriceBigIntWrapperREADONLY (prAmtX18,amAmtX18) = $Tuple2(nil, toString(calcPriceBigInt(parseBigIntValue(prAmtX18), parseBigIntValue(amAmtX18)))) | |
514 | - | ||
515 | - | ||
516 | - | ||
517 | - | @Callable(i) | |
518 | - | func estimatePutOperationWrapperREADONLY (txId58,slippageTolerance,inAmAssetAmt,inAmAssetId,inPrAssetAmt,inPrAssetId,userAddress,isEvaluate,emitLp) = { | |
519 | - | let estimation = estimatePutOperation(txId58, slippageTolerance, inAmAssetAmt, inAmAssetId, inPrAssetAmt, inPrAssetId, userAddress, isEvaluate, emitLp) | |
520 | - | let $t02536825589 = estimation | |
521 | - | let calcLpAmt = $t02536825589._1 | |
522 | - | let emitLpAmt = $t02536825589._2 | |
523 | - | let curPrice = $t02536825589._3 | |
524 | - | let amBalance = $t02536825589._4 | |
525 | - | let prBalance = $t02536825589._5 | |
526 | - | let lpEmission = $t02536825589._6 | |
527 | - | let lpAssetId = $t02536825589._7 | |
528 | - | let poolStatus = $t02536825589._8 | |
529 | - | let commonState = $t02536825589._9 | |
530 | - | let amDiff = $t02536825589._10 | |
531 | - | let prDiff = $t02536825589._11 | |
532 | - | let inAmtAssetId = $t02536825589._12 | |
533 | - | let inPriceAssetId = $t02536825589._13 | |
534 | - | $Tuple2(nil, $Tuple13(calcLpAmt, emitLpAmt, curPrice, amBalance, prBalance, lpEmission, lpAssetId, poolStatus, commonState, amDiff, prDiff, inAmtAssetId, inPriceAssetId)) | |
535 | - | } | |
536 | - | ||
537 | - | ||
538 | - | ||
539 | - | @Callable(i) | |
540 | - | func estimateGetOperationWrapperREADONLY (txId58,pmtAssetId,pmtLpAmt,userAddress) = { | |
541 | - | let estimation = estimateGetOperation(txId58, pmtAssetId, pmtLpAmt, addressFromStringValue(userAddress)) | |
542 | - | let $t02610626275 = estimation | |
543 | - | let outAmAmt = $t02610626275._1 | |
544 | - | let outPrAmt = $t02610626275._2 | |
545 | - | let amAssetId = $t02610626275._3 | |
546 | - | let prAssetId = $t02610626275._4 | |
547 | - | let amBalance = $t02610626275._5 | |
548 | - | let prBalance = $t02610626275._6 | |
549 | - | let lpEmission = $t02610626275._7 | |
550 | - | let curPriceX18 = $t02610626275._8 | |
551 | - | let poolStatus = $t02610626275._9 | |
552 | - | let state = $t02610626275._10 | |
553 | - | $Tuple2(nil, $Tuple10(outAmAmt, outPrAmt, amAssetId, prAssetId, amBalance, prBalance, lpEmission, toString(curPriceX18), poolStatus, state)) | |
554 | - | } | |
555 | - | ||
556 | - | ||
557 | - | ||
558 | - | @Callable(i) | |
559 | - | func statsREADONLY () = { | |
560 | - | let cfg = getPoolConfig() | |
561 | - | let lpAssetId = fromBase58String(cfg[idxPoolLPAssetId]) | |
562 | - | let amtAssetId = cfg[idxAmtAssetId] | |
563 | - | let priceAssetId = cfg[idxPriceAssetId] | |
564 | - | let iAmtAssetId = cfg[idxIAmtAssetId] | |
565 | - | let iPriceAssetId = cfg[idxIPriceAssetId] | |
566 | - | let amtAssetDcm = parseIntValue(cfg[idxAmtAssetDcm]) | |
567 | - | let priceAssetDcm = parseIntValue(cfg[idxPriceAssetDcm]) | |
568 | - | let poolLPBalance = valueOrErrorMessage(assetInfo(lpAssetId), (("Asset " + toBase58String(lpAssetId)) + " doesn't exist")).quantity | |
569 | - | let accAmtAssetBalance = getAccBalance(amtAssetId) | |
570 | - | let accPriceAssetBalance = getAccBalance(priceAssetId) | |
571 | - | let pricesList = calcPrices(accAmtAssetBalance, accPriceAssetBalance, poolLPBalance) | |
572 | - | let curPrice = 0 | |
573 | - | let lpAmtAssetShare = fromX18(pricesList[1], scale8) | |
574 | - | let lpPriceAssetShare = fromX18(pricesList[2], scale8) | |
575 | - | let poolWeight = value(getInteger(factoryContract, keyPoolWeight(toString(this)))) | |
576 | - | $Tuple2(nil, makeString(["%d%d%d%d%d%d%d", toString(accAmtAssetBalance), toString(accPriceAssetBalance), toString(poolLPBalance), toString(curPrice), toString(lpAmtAssetShare), toString(lpPriceAssetShare), toString(poolWeight)], SEP)) | |
577 | - | } | |
578 | - | ||
579 | - | ||
580 | - | ||
581 | - | @Callable(i) | |
582 | - | func evaluatePutByAmountAssetREADONLY (inAmAssetAmt) = { | |
583 | - | let cfg = getPoolConfig() | |
584 | - | let lpAssetId = fromBase58String(cfg[idxPoolLPAssetId]) | |
585 | - | let amAssetIdStr = cfg[idxAmtAssetId] | |
586 | - | let amAssetId = fromBase58String(amAssetIdStr) | |
587 | - | let prAssetIdStr = cfg[idxPriceAssetId] | |
588 | - | let prAssetId = fromBase58String(prAssetIdStr) | |
589 | - | let amtAssetDcm = parseIntValue(cfg[idxAmtAssetDcm]) | |
590 | - | let priceAssetDcm = parseIntValue(cfg[idxPriceAssetDcm]) | |
591 | - | let poolStatus = cfg[idxPoolStatus] | |
592 | - | let poolLPBalance = valueOrErrorMessage(assetInfo(lpAssetId), (("Asset " + toBase58String(lpAssetId)) + " doesn't exist")).quantity | |
593 | - | let accAmtAssetBalance = getAccBalance(amAssetIdStr) | |
594 | - | let accPriceAssetBalance = getAccBalance(prAssetIdStr) | |
595 | - | let amtAssetAmtX18 = toX18(accAmtAssetBalance, amtAssetDcm) | |
596 | - | let priceAssetAmtX18 = toX18(accPriceAssetBalance, priceAssetDcm) | |
597 | - | let curPriceX18 = if ((poolLPBalance == 0)) | |
598 | - | then zeroBigInt | |
599 | - | else calcPriceBigInt(priceAssetAmtX18, amtAssetAmtX18) | |
600 | - | let inAmAssetAmtX18 = toX18(inAmAssetAmt, amtAssetDcm) | |
601 | - | let inPrAssetAmtX18 = fraction(inAmAssetAmtX18, curPriceX18, scale18) | |
602 | - | let inPrAssetAmt = fromX18(inPrAssetAmtX18, priceAssetDcm) | |
603 | - | let estPut = estimatePutOperation("", 500000, inAmAssetAmt, amAssetId, inPrAssetAmt, prAssetId, "", true, false) | |
604 | - | let calcLpAmt = estPut._1 | |
605 | - | let curPriceCalc = estPut._3 | |
606 | - | let amBalance = estPut._4 | |
607 | - | let prBalance = estPut._5 | |
608 | - | let lpEmission = estPut._6 | |
609 | - | $Tuple2(nil, makeString(["%d%d%d%d%d%d%d%d", toString(calcLpAmt), toString(fromX18(curPriceX18, scale8)), toString(amBalance), toString(prBalance), toString(lpEmission), poolStatus, toString(inAmAssetAmt), toString(inPrAssetAmt)], SEP)) | |
610 | - | } | |
611 | - | ||
612 | - | ||
613 | - | ||
614 | - | @Callable(i) | |
615 | - | func evaluatePutByPriceAssetREADONLY (inPrAssetAmt) = { | |
616 | - | let cfg = getPoolConfig() | |
617 | - | let lpAssetId = fromBase58String(cfg[idxPoolLPAssetId]) | |
618 | - | let amAssetIdStr = cfg[idxAmtAssetId] | |
619 | - | let amAssetId = fromBase58String(amAssetIdStr) | |
620 | - | let prAssetIdStr = cfg[idxPriceAssetId] | |
621 | - | let prAssetId = fromBase58String(prAssetIdStr) | |
622 | - | let amtAssetDcm = parseIntValue(cfg[idxAmtAssetDcm]) | |
623 | - | let priceAssetDcm = parseIntValue(cfg[idxPriceAssetDcm]) | |
624 | - | let poolStatus = cfg[idxPoolStatus] | |
625 | - | let poolLPBalance = valueOrErrorMessage(assetInfo(lpAssetId), (("Asset " + toBase58String(lpAssetId)) + " doesn't exist")).quantity | |
626 | - | let amBalanceRaw = getAccBalance(amAssetIdStr) | |
627 | - | let prBalanceRaw = getAccBalance(prAssetIdStr) | |
628 | - | let amBalanceRawX18 = toX18(amBalanceRaw, amtAssetDcm) | |
629 | - | let prBalanceRawX18 = toX18(prBalanceRaw, priceAssetDcm) | |
630 | - | let curPriceX18 = if ((poolLPBalance == 0)) | |
631 | - | then zeroBigInt | |
632 | - | else calcPriceBigInt(prBalanceRawX18, amBalanceRawX18) | |
633 | - | let inPrAssetAmtX18 = toX18(inPrAssetAmt, priceAssetDcm) | |
634 | - | let inAmAssetAmtX18 = fraction(inPrAssetAmtX18, scale18, curPriceX18) | |
635 | - | let inAmAssetAmt = fromX18(inAmAssetAmtX18, amtAssetDcm) | |
636 | - | let estPut = estimatePutOperation("", 500000, inAmAssetAmt, amAssetId, inPrAssetAmt, prAssetId, "", true, false) | |
637 | - | let calcLpAmt = estPut._1 | |
638 | - | let curPriceCalc = estPut._3 | |
639 | - | let amBalance = estPut._4 | |
640 | - | let prBalance = estPut._5 | |
641 | - | let lpEmission = estPut._6 | |
642 | - | $Tuple2(nil, makeString(["%d%d%d%d%d%d%d%d", toString(calcLpAmt), toString(fromX18(curPriceX18, scale8)), toString(amBalance), toString(prBalance), toString(lpEmission), poolStatus, toString(inAmAssetAmt), toString(inPrAssetAmt)], SEP)) | |
643 | - | } | |
644 | - | ||
645 | - | ||
646 | - | ||
647 | - | @Callable(i) | |
648 | - | func evaluateGetREADONLY (paymentLpAssetId,paymentLpAmt) = { | |
649 | - | let res = estimateGetOperation("", paymentLpAssetId, paymentLpAmt, this) | |
650 | - | let outAmAmt = res._1 | |
651 | - | let outPrAmt = res._2 | |
652 | - | let amBalance = res._5 | |
653 | - | let prBalance = res._6 | |
654 | - | let lpEmission = res._7 | |
655 | - | let curPrice = res._8 | |
656 | - | let poolStatus = parseIntValue(res._9) | |
657 | - | $Tuple2(nil, makeString(["%d%d%d%d%d%d%d", toString(outAmAmt), toString(outPrAmt), toString(amBalance), toString(prBalance), toString(lpEmission), toString(curPrice), toString(poolStatus)], SEP)) | |
658 | - | } | |
659 | - | ||
660 | - | ||
661 | 237 | @Verifier(tx) | |
662 | - | func verify () = match tx { | |
663 | - | case order: Order => | |
664 | - | if (validateMatcherOrderAllowed(order)) | |
665 | - | then sigVerify(order.bodyBytes, order.proofs[0], order.senderPublicKey) | |
666 | - | else false | |
667 | - | case _ => | |
668 | - | let managerPublic = valueOrElse(getString(this, keyManagerPublicKey()), EMPTY) | |
669 | - | if ((managerPublic == EMPTY)) | |
670 | - | then sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) | |
671 | - | else sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(managerPublic)) | |
672 | - | } | |
238 | + | func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) | |
673 | 239 |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 5 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | - | let lPdecimals = 8 | |
5 | - | ||
6 | - | let scale8 = 100000000 | |
7 | - | ||
8 | - | let scale8BigInt = toBigInt(100000000) | |
9 | - | ||
10 | - | let scale18 = toBigInt(1000000000000000000) | |
11 | - | ||
12 | - | let zeroBigInt = toBigInt(0) | |
4 | + | let decimalsMultPrice = ((100 * 1000) * 1000) | |
13 | 5 | ||
14 | 6 | let SEP = "__" | |
15 | - | ||
16 | - | let EMPTY = "" | |
17 | 7 | ||
18 | 8 | let PoolActive = 1 | |
19 | 9 | ||
20 | 10 | let PoolPutDisabled = 2 | |
21 | 11 | ||
22 | 12 | let PoolMatcherDisabled = 3 | |
23 | 13 | ||
24 | 14 | let PoolShutdown = 4 | |
15 | + | ||
16 | + | let idxInternalAssetId = 1 | |
17 | + | ||
18 | + | let idxResutActions = 2 | |
19 | + | ||
20 | + | let idxIfAssetIdCalculationPerformed = 3 | |
25 | 21 | ||
26 | 22 | let idxPoolAddress = 1 | |
27 | 23 | ||
28 | 24 | let idxPoolStatus = 2 | |
29 | 25 | ||
30 | 26 | let idxPoolLPAssetId = 3 | |
31 | 27 | ||
32 | 28 | let idxAmtAssetId = 4 | |
33 | 29 | ||
34 | 30 | let idxPriceAssetId = 5 | |
35 | 31 | ||
36 | 32 | let idxAmtAssetDcm = 6 | |
37 | 33 | ||
38 | 34 | let idxPriceAssetDcm = 7 | |
39 | 35 | ||
40 | 36 | let idxIAmtAssetId = 8 | |
41 | 37 | ||
42 | 38 | let idxIPriceAssetId = 9 | |
43 | 39 | ||
44 | 40 | let idxLPAssetDcm = 10 | |
45 | 41 | ||
46 | - | let idxPoolAmtAssetAmt = 1 | |
47 | - | ||
48 | - | let idxPoolPriceAssetAmt = 2 | |
49 | - | ||
50 | - | let idxPoolLPAssetAmt = 3 | |
51 | - | ||
52 | - | let idxFactoryStakingContract = 1 | |
53 | - | ||
54 | - | let idxFactorySlippageContract = 7 | |
55 | - | ||
56 | - | func toX18 (origVal,origScaleMult) = fraction(toBigInt(origVal), scale18, toBigInt(origScaleMult)) | |
57 | - | ||
58 | - | ||
59 | - | func fromX18 (val,resultScaleMult) = toInt(fraction(val, toBigInt(resultScaleMult), scale18)) | |
60 | - | ||
61 | - | ||
62 | - | func toScale (amt,resScale,curScale) = fraction(amt, resScale, curScale) | |
63 | - | ||
64 | - | ||
65 | - | func abs (val) = if ((zeroBigInt > val)) | |
66 | - | then -(val) | |
67 | - | else val | |
68 | - | ||
69 | - | ||
70 | - | func keyFactoryContract () = "%s__factoryContract" | |
71 | - | ||
72 | - | ||
73 | - | func keyManagerPublicKey () = "%s__managerPublicKey" | |
74 | - | ||
75 | - | ||
76 | - | func keyPriceLast () = "%s%s__price__last" | |
77 | - | ||
78 | - | ||
79 | - | func keyPriceHistory (h,timestamp) = makeString(["%s%s%d%d__price__history", toString(h), toString(timestamp)], SEP) | |
80 | - | ||
81 | - | ||
82 | - | func keyPutActionByUser (userAddress,txId) = ((("%s%s%s__P__" + userAddress) + "__") + txId) | |
83 | - | ||
84 | - | ||
85 | - | func keyGetActionByUser (userAddress,txId) = ((("%s%s%s__G__" + userAddress) + "__") + txId) | |
86 | - | ||
87 | - | ||
88 | - | func keyAmtAsset () = "%s__amountAsset" | |
89 | - | ||
90 | - | ||
91 | - | func keyPriceAsset () = "%s__priceAsset" | |
92 | - | ||
93 | - | ||
94 | - | func keyKHistoric (h,timestamp) = makeString(["%s%s%d%d__K_history", toString(h), toString(timestamp)], SEP) | |
95 | - | ||
42 | + | let idxPoolType = 11 | |
96 | 43 | ||
97 | 44 | func keyFactoryConfig () = "%s__factoryConfig" | |
98 | 45 | ||
99 | 46 | ||
100 | - | func | |
47 | + | func keyLpTokensList () = "%s__lpTokensList" | |
101 | 48 | ||
102 | 49 | ||
103 | - | func keyPoolConfig (iAmtAsset,iPriceAsset) = (((("%d%d%s__" + iAmtAsset) + "__") + iPriceAsset) + "__config") | |
50 | + | func keyPoolScriptHash () = "%s%s__pool__scriptHash" | |
51 | + | ||
52 | + | ||
53 | + | func keyPriceDecimals () = "%s__priceDecimals" | |
54 | + | ||
55 | + | ||
56 | + | func keyAllPoolsShutdown () = "%s__shutdown" | |
57 | + | ||
58 | + | ||
59 | + | func keyNextInternalAssetId () = "%s__nextInternalAssetId" | |
60 | + | ||
61 | + | ||
62 | + | func keyPoolToWeight (poolAddress) = ("%s%s__poolWeight__" + poolAddress) | |
63 | + | ||
64 | + | ||
65 | + | func keyMappingsInternal2baseAssetId (internalBaseAsset) = ("%s%s%d__mappings__internal2baseAssetId__" + toString(internalBaseAsset)) | |
104 | 66 | ||
105 | 67 | ||
106 | 68 | func keyMappingsBaseAsset2internalId (baseAssetStr) = ("%s%s%s__mappings__baseAsset2internalId__" + baseAssetStr) | |
107 | 69 | ||
108 | 70 | ||
109 | - | func | |
71 | + | func keyPoolConfig (amountAssetInternal,priceAssetInternal) = (((("%d%d%s__" + amountAssetInternal) + "__") + priceAssetInternal) + "__config") | |
110 | 72 | ||
111 | 73 | ||
112 | - | func | |
74 | + | func keyMappingLpAssetToPoolAssets (lpAssetStr) = (("%s%s%s__" + lpAssetStr) + "__mappings__lpAsset2Pool") | |
113 | 75 | ||
114 | 76 | ||
115 | - | func | |
77 | + | func keyMappingPoolAssetsToLpasset (internalAmountAssetIdStr,internalPriceAssetIdStr) = (((("%d%d%s%s__" + internalAmountAssetIdStr) + "__") + internalPriceAssetIdStr) + "__mappings__PoolAssets2LpAsset") | |
116 | 78 | ||
117 | 79 | ||
118 | - | func | |
80 | + | func keyMappingPoolContractAddressToPoolAssets (poolContractAddress) = (("%s%s%s__" + poolContractAddress) + "__mappings__poolContract2PoolAssets") | |
119 | 81 | ||
120 | 82 | ||
121 | - | let factoryContract = addressFromStringValue(getStringOrFail(this, keyFactoryContract())) | |
122 | - | ||
123 | - | func isGlobalShutdown () = valueOrElse(getBoolean(factoryContract, keyAllPoolsShutdown()), false) | |
83 | + | func keyMappingPoolAssetsToPoolContractAddress (internalAmountAssetIdStr,internalPriceAssetIdStr) = (((("%d%d%s%s__" + toString(internalAmountAssetIdStr)) + "__") + toString(internalPriceAssetIdStr)) + "__mappings__poolAssets2PoolContract") | |
124 | 84 | ||
125 | 85 | ||
126 | - | func getPoolConfig () = { | |
127 | - | let amtAsset = getStringOrFail(this, keyAmtAsset()) | |
128 | - | let priceAsset = getStringOrFail(this, keyPriceAsset()) | |
129 | - | let iPriceAsset = getIntOrFail(factoryContract, keyMappingsBaseAsset2internalId(priceAsset)) | |
130 | - | let iAmtAsset = getIntOrFail(factoryContract, keyMappingsBaseAsset2internalId(amtAsset)) | |
131 | - | split(getStringOrFail(factoryContract, keyPoolConfig(toString(iAmtAsset), toString(iPriceAsset))), SEP) | |
86 | + | func keyMappingPoolContracToLPAsset (poolContractAddress) = (("%s%s%s__" + poolContractAddress) + "__mappings__poolContract2LpAsset") | |
87 | + | ||
88 | + | ||
89 | + | func keyMappingPoolLPAssetToPoolContractAddress (lpAssetStr) = (("%s%s%s__" + lpAssetStr) + "__mappings__lpAsset2PoolContract") | |
90 | + | ||
91 | + | ||
92 | + | func getStringOrFail (key) = valueOrErrorMessage(getString(this, key), ("No data for this.key=" + key)) | |
93 | + | ||
94 | + | ||
95 | + | func getBooleanOrFail (key) = valueOrErrorMessage(getBoolean(this, key), ("No data for this.key=" + key)) | |
96 | + | ||
97 | + | ||
98 | + | func getIntOrFail (key) = valueOrErrorMessage(getInteger(this, key), ("No data for this.key=" + key)) | |
99 | + | ||
100 | + | ||
101 | + | func dataFactoryCfg (stakingAddress,boostingAddress,idoContract,teamContract,emissionContract,restContract,slippageContract) = makeString(["%s%s%s%s%s%s", stakingAddress, boostingAddress, idoContract, teamContract, emissionContract, restContract, slippageContract], SEP) | |
102 | + | ||
103 | + | ||
104 | + | func dataPoolCfg (poolAddress,poolStatus,lpAssetId,amountAssetStr,priceAssetStr,amountAssetDecimals,priceAssetDecimals,amountAssetInternalId,priceAssetInternalId,lpAssetDecimals,poolType) = makeString(["%s%d%s%s%s%d%d%d%d%d%s", poolAddress, poolStatus, lpAssetId, amountAssetStr, priceAssetStr, toString(amountAssetDecimals), toString(priceAssetDecimals), toString(amountAssetInternalId), toString(priceAssetInternalId), toString(lpAssetDecimals), poolType], SEP) | |
105 | + | ||
106 | + | ||
107 | + | func dataMappingPoolAssets (internalAmountAssetStr,internalPriceAssetStr) = makeString(["%d%d", toString(internalAmountAssetStr), toString(internalPriceAssetStr)], SEP) | |
108 | + | ||
109 | + | ||
110 | + | func getPoolConfig (poolAddress) = { | |
111 | + | let poolAssets = split(getStringOrFail(keyMappingPoolContractAddressToPoolAssets(poolAddress)), SEP) | |
112 | + | let amountAssetInternal = poolAssets[1] | |
113 | + | let priceAssetInternal = poolAssets[2] | |
114 | + | split(getStringOrFail(keyPoolConfig(amountAssetInternal, priceAssetInternal)), SEP) | |
132 | 115 | } | |
133 | 116 | ||
134 | 117 | ||
135 | - | func getFactoryConfig () = split(getStringOrFail(factoryContract, keyFactoryConfig()), SEP) | |
136 | - | ||
137 | - | ||
138 | - | func dataPutActionInfo (inAmtAssetAmt,inPriceAssetAmt,outLpAmt,price,slippageTolerancePassedByUser,slippageToleranceReal,txHeight,txTimestamp,slipageAmtAssetAmt,slipagePriceAssetAmt) = makeString(["%d%d%d%d%d%d%d%d%d%d", toString(inAmtAssetAmt), toString(inPriceAssetAmt), toString(outLpAmt), toString(price), toString(slippageTolerancePassedByUser), toString(slippageToleranceReal), toString(txHeight), toString(txTimestamp), toString(slipageAmtAssetAmt), toString(slipagePriceAssetAmt)], SEP) | |
139 | - | ||
140 | - | ||
141 | - | func dataGetActionInfo (outAmtAssetAmt,outPriceAssetAmt,inLpAmt,price,txHeight,txTimestamp) = makeString(["%d%d%d%d%d%d", toString(outAmtAssetAmt), toString(outPriceAssetAmt), toString(inLpAmt), toString(price), toString(txHeight), toString(txTimestamp)], SEP) | |
142 | - | ||
143 | - | ||
144 | - | func getAccBalance (assetId) = if ((assetId == "WAVES")) | |
145 | - | then wavesBalance(this).available | |
146 | - | else assetBalance(this, fromBase58String(assetId)) | |
147 | - | ||
148 | - | ||
149 | - | func calcPriceBigInt (prAmtX18,amAmtX18) = fraction(prAmtX18, scale18, amAmtX18) | |
150 | - | ||
151 | - | ||
152 | - | func privateCalcPrice (amAssetDcm,prAssetDcm,amAmt,prAmt) = { | |
153 | - | let amtAssetAmtX18 = toX18(amAmt, amAssetDcm) | |
154 | - | let priceAssetAmtX18 = toX18(prAmt, prAssetDcm) | |
155 | - | calcPriceBigInt(priceAssetAmtX18, amtAssetAmtX18) | |
118 | + | func getInternalAssetIdOrCreate (assetIdStr,incrementor) = { | |
119 | + | let internalAssetId = valueOrElse(getInteger(this, keyMappingsBaseAsset2internalId(assetIdStr)), 0) | |
120 | + | let currentIndexOfInternalId = valueOrElse(getInteger(this, keyNextInternalAssetId()), 0) | |
121 | + | let result = if ((internalAssetId == 0)) | |
122 | + | then { | |
123 | + | let newInternalAssetId = (currentIndexOfInternalId + incrementor) | |
124 | + | $Tuple3(newInternalAssetId, [IntegerEntry(keyNextInternalAssetId(), newInternalAssetId), IntegerEntry(keyMappingsBaseAsset2internalId(assetIdStr), newInternalAssetId), StringEntry(keyMappingsInternal2baseAssetId(newInternalAssetId), assetIdStr)], true) | |
125 | + | } | |
126 | + | else $Tuple3(internalAssetId, nil, false) | |
127 | + | result | |
156 | 128 | } | |
157 | 129 | ||
158 | 130 | ||
159 | - | func calcPrices (amAmt,prAmt,lpAmt) = { | |
160 | - | let cfg = getPoolConfig() | |
161 | - | let amtAssetDcm = parseIntValue(cfg[idxAmtAssetDcm]) | |
162 | - | let priceAssetDcm = parseIntValue(cfg[idxPriceAssetDcm]) | |
163 | - | let priceX18 = privateCalcPrice(amtAssetDcm, priceAssetDcm, amAmt, prAmt) | |
164 | - | let amAmtX18 = toX18(amAmt, amtAssetDcm) | |
165 | - | let prAmtX18 = toX18(prAmt, priceAssetDcm) | |
166 | - | let lpAmtX18 = toX18(lpAmt, scale8) | |
167 | - | let lpPriceInAmAssetX18 = calcPriceBigInt(amAmtX18, lpAmtX18) | |
168 | - | let lpPriceInPrAssetX18 = calcPriceBigInt(prAmtX18, lpAmtX18) | |
169 | - | [priceX18, lpPriceInAmAssetX18, lpPriceInPrAssetX18] | |
131 | + | func createLpTokensListEntry (newLpToken) = { | |
132 | + | let lpTokens = getString(this, keyLpTokensList()) | |
133 | + | if (isDefined(lpTokens)) | |
134 | + | then ((value(lpTokens) + SEP) + newLpToken) | |
135 | + | else newLpToken | |
170 | 136 | } | |
171 | 137 | ||
172 | 138 | ||
173 | - | func calculatePrices (amAmt,prAmt,lpAmt) = { | |
174 | - | let prices = calcPrices(amAmt, prAmt, lpAmt) | |
175 | - | [fromX18(prices[0], scale8), fromX18(prices[1], scale8), fromX18(prices[2], scale8)] | |
176 | - | } | |
177 | - | ||
178 | - | ||
179 | - | func estimateGetOperation (txId58,pmtAssetId,pmtLpAmt,userAddress) = { | |
180 | - | let cfg = getPoolConfig() | |
181 | - | let lpAssetId = cfg[idxPoolLPAssetId] | |
182 | - | let amAssetId = cfg[idxAmtAssetId] | |
183 | - | let prAssetId = cfg[idxPriceAssetId] | |
184 | - | let amAssetDcm = parseIntValue(cfg[idxAmtAssetDcm]) | |
185 | - | let prAssetDcm = parseIntValue(cfg[idxPriceAssetDcm]) | |
186 | - | let poolStatus = cfg[idxPoolStatus] | |
187 | - | let lpEmission = valueOrErrorMessage(assetInfo(fromBase58String(lpAssetId)), (("Asset " + lpAssetId) + " doesn't exist")).quantity | |
188 | - | if ((lpAssetId != pmtAssetId)) | |
189 | - | then throw("Invalid asset passed.") | |
190 | - | else { | |
191 | - | let amBalance = getAccBalance(amAssetId) | |
192 | - | let amBalanceX18 = toX18(amBalance, amAssetDcm) | |
193 | - | let prBalance = getAccBalance(prAssetId) | |
194 | - | let prBalanceX18 = toX18(prBalance, prAssetDcm) | |
195 | - | let curPriceX18 = calcPriceBigInt(prBalanceX18, amBalanceX18) | |
196 | - | let curPrice = fromX18(curPriceX18, scale8) | |
197 | - | let pmtLpAmtX18 = toX18(pmtLpAmt, scale8) | |
198 | - | let lpEmissionX18 = toX18(lpEmission, scale8) | |
199 | - | let outAmAmtX18 = fraction(amBalanceX18, pmtLpAmtX18, lpEmissionX18) | |
200 | - | let outPrAmtX18 = fraction(prBalanceX18, pmtLpAmtX18, lpEmissionX18) | |
201 | - | let outAmAmt = fromX18(outAmAmtX18, amAssetDcm) | |
202 | - | let outPrAmt = fromX18(outPrAmtX18, prAssetDcm) | |
203 | - | let state = if ((txId58 == "")) | |
204 | - | then nil | |
205 | - | else [ScriptTransfer(userAddress, outAmAmt, if ((amAssetId == "WAVES")) | |
206 | - | then unit | |
207 | - | else fromBase58String(amAssetId)), ScriptTransfer(userAddress, outPrAmt, if ((prAssetId == "WAVES")) | |
208 | - | then unit | |
209 | - | else fromBase58String(prAssetId)), StringEntry(keyGetActionByUser(toString(userAddress), txId58), dataGetActionInfo(outAmAmt, outPrAmt, pmtLpAmt, curPrice, height, lastBlock.timestamp)), IntegerEntry(keyPriceLast(), curPrice), IntegerEntry(keyPriceHistory(height, lastBlock.timestamp), curPrice)] | |
210 | - | $Tuple10(outAmAmt, outPrAmt, amAssetId, prAssetId, amBalance, prBalance, lpEmission, curPriceX18, poolStatus, state) | |
211 | - | } | |
212 | - | } | |
213 | - | ||
214 | - | ||
215 | - | func estimatePutOperation (txId58,slippageTolerance,inAmAssetAmt,inAmAssetId,inPrAssetAmt,inPrAssetId,userAddress,isEvaluate,emitLp) = { | |
216 | - | let cfg = getPoolConfig() | |
217 | - | let lpAssetId = fromBase58String(cfg[idxPoolLPAssetId]) | |
218 | - | let amAssetIdStr = cfg[idxAmtAssetId] | |
219 | - | let prAssetIdStr = cfg[idxPriceAssetId] | |
220 | - | let iAmtAssetId = cfg[idxIAmtAssetId] | |
221 | - | let iPriceAssetId = cfg[idxIPriceAssetId] | |
222 | - | let amtAssetDcm = parseIntValue(cfg[idxAmtAssetDcm]) | |
223 | - | let priceAssetDcm = parseIntValue(cfg[idxPriceAssetDcm]) | |
224 | - | let poolStatus = cfg[idxPoolStatus] | |
225 | - | let lpEmission = valueOrErrorMessage(assetInfo(lpAssetId), (("Asset " + toBase58String(lpAssetId)) + " doesn't exist")).quantity | |
226 | - | let inAmAssetIdStr = toBase58String(valueOrElse(inAmAssetId, fromBase58String("WAVES"))) | |
227 | - | let inPrAssetIdStr = toBase58String(valueOrElse(inPrAssetId, fromBase58String("WAVES"))) | |
228 | - | if (if ((amAssetIdStr != inAmAssetIdStr)) | |
229 | - | then true | |
230 | - | else (prAssetIdStr != inPrAssetIdStr)) | |
231 | - | then throw("Invalid amt or price asset passed.") | |
232 | - | else { | |
233 | - | let amBalance = if (isEvaluate) | |
234 | - | then getAccBalance(amAssetIdStr) | |
235 | - | else (getAccBalance(amAssetIdStr) - inAmAssetAmt) | |
236 | - | let prBalance = if (isEvaluate) | |
237 | - | then getAccBalance(prAssetIdStr) | |
238 | - | else (getAccBalance(prAssetIdStr) - inPrAssetAmt) | |
239 | - | let inAmAssetAmtX18 = toX18(inAmAssetAmt, amtAssetDcm) | |
240 | - | let inPrAssetAmtX18 = toX18(inPrAssetAmt, priceAssetDcm) | |
241 | - | let userPriceX18 = calcPriceBigInt(inPrAssetAmtX18, inAmAssetAmtX18) | |
242 | - | let amBalanceX18 = toX18(amBalance, amtAssetDcm) | |
243 | - | let prBalanceX18 = toX18(prBalance, priceAssetDcm) | |
244 | - | let res = if ((lpEmission == 0)) | |
245 | - | then { | |
246 | - | let curPriceX18 = zeroBigInt | |
247 | - | let slippageX18 = zeroBigInt | |
248 | - | let lpAmtX18 = pow((inAmAssetAmtX18 * inPrAssetAmtX18), 0, toBigInt(5), 1, 0, DOWN) | |
249 | - | $Tuple5(fromX18(lpAmtX18, scale8), fromX18(inAmAssetAmtX18, amtAssetDcm), fromX18(inPrAssetAmtX18, priceAssetDcm), calcPriceBigInt((prBalanceX18 + inPrAssetAmtX18), (amBalanceX18 + inAmAssetAmtX18)), slippageX18) | |
250 | - | } | |
251 | - | else { | |
252 | - | let curPriceX18 = calcPriceBigInt(prBalanceX18, amBalanceX18) | |
253 | - | let slippageX18 = fraction(abs((curPriceX18 - userPriceX18)), scale18, curPriceX18) | |
254 | - | let slippageToleranceX18 = toX18(slippageTolerance, scale8) | |
255 | - | if (if ((curPriceX18 != zeroBigInt)) | |
256 | - | then (slippageX18 > slippageToleranceX18) | |
257 | - | else false) | |
258 | - | then throw(((("Price slippage " + toString(slippageX18)) + " exceeded the passed limit of ") + toString(slippageToleranceX18))) | |
259 | - | else { | |
260 | - | let lpEmissionX18 = toX18(lpEmission, scale8) | |
261 | - | let prViaAmX18 = fraction(inAmAssetAmtX18, curPriceX18, scale18) | |
262 | - | let amViaPrX18 = fraction(inPrAssetAmtX18, scale18, curPriceX18) | |
263 | - | let expectedAmts = if ((prViaAmX18 > inPrAssetAmtX18)) | |
264 | - | then $Tuple2(amViaPrX18, inPrAssetAmtX18) | |
265 | - | else $Tuple2(inAmAssetAmtX18, prViaAmX18) | |
266 | - | let expAmtAssetAmtX18 = expectedAmts._1 | |
267 | - | let expPriceAssetAmtX18 = expectedAmts._2 | |
268 | - | let lpAmtX18 = fraction(lpEmissionX18, expPriceAssetAmtX18, prBalanceX18) | |
269 | - | $Tuple5(fromX18(lpAmtX18, scale8), fromX18(expAmtAssetAmtX18, amtAssetDcm), fromX18(expPriceAssetAmtX18, priceAssetDcm), curPriceX18, slippageX18) | |
270 | - | } | |
271 | - | } | |
272 | - | let calcLpAmt = res._1 | |
273 | - | let calcAmAssetPmt = res._2 | |
274 | - | let calcPrAssetPmt = res._3 | |
275 | - | let curPrice = fromX18(res._4, scale8) | |
276 | - | let slippageCalc = fromX18(res._5, scale8) | |
277 | - | if ((0 >= calcLpAmt)) | |
278 | - | then throw("Invalid calculations. LP calculated is less than zero.") | |
279 | - | else { | |
280 | - | let emitLpAmt = if (!(emitLp)) | |
281 | - | then 0 | |
282 | - | else calcLpAmt | |
283 | - | let amDiff = (inAmAssetAmt - calcAmAssetPmt) | |
284 | - | let prDiff = (inPrAssetAmt - calcPrAssetPmt) | |
285 | - | let commonState = [IntegerEntry(keyPriceLast(), curPrice), IntegerEntry(keyPriceHistory(height, lastBlock.timestamp), curPrice), StringEntry(keyPutActionByUser(userAddress, txId58), dataPutActionInfo(calcAmAssetPmt, calcPrAssetPmt, emitLpAmt, curPrice, slippageTolerance, slippageCalc, height, lastBlock.timestamp, amDiff, prDiff))] | |
286 | - | $Tuple13(calcLpAmt, emitLpAmt, curPrice, amBalance, prBalance, lpEmission, lpAssetId, poolStatus, commonState, amDiff, prDiff, inAmAssetId, inPrAssetId) | |
287 | - | } | |
288 | - | } | |
289 | - | } | |
290 | - | ||
291 | - | ||
292 | - | func validateMatcherOrderAllowed (order) = { | |
293 | - | let cfg = getPoolConfig() | |
294 | - | let amtAssetId = cfg[idxAmtAssetId] | |
295 | - | let priceAssetId = cfg[idxPriceAssetId] | |
296 | - | let poolStatus = parseIntValue(cfg[idxPoolStatus]) | |
297 | - | let amtAssetDcm = parseIntValue(cfg[idxAmtAssetDcm]) | |
298 | - | let priceAssetDcm = parseIntValue(cfg[idxPriceAssetDcm]) | |
299 | - | let accAmtAssetBalance = getAccBalance(amtAssetId) | |
300 | - | let accPriceAssetBalance = getAccBalance(priceAssetId) | |
301 | - | let curPriceX18 = if ((order.orderType == Buy)) | |
302 | - | then privateCalcPrice(amtAssetDcm, priceAssetDcm, (accAmtAssetBalance + order.amount), accPriceAssetBalance) | |
303 | - | else privateCalcPrice(amtAssetDcm, priceAssetDcm, (accAmtAssetBalance - order.amount), accPriceAssetBalance) | |
304 | - | let curPrice = fromX18(curPriceX18, scale8) | |
305 | - | if (if (if (isGlobalShutdown()) | |
306 | - | then true | |
307 | - | else (poolStatus == PoolMatcherDisabled)) | |
308 | - | then true | |
309 | - | else (poolStatus == PoolShutdown)) | |
310 | - | then throw("Exchange operations disabled") | |
311 | - | else { | |
312 | - | let orderAmtAsset = order.assetPair.amountAsset | |
313 | - | let orderAmtAssetStr = if ((orderAmtAsset == unit)) | |
314 | - | then "WAVES" | |
315 | - | else toBase58String(value(orderAmtAsset)) | |
316 | - | let orderPriceAsset = order.assetPair.priceAsset | |
317 | - | let orderPriceAssetStr = if ((orderPriceAsset == unit)) | |
318 | - | then "WAVES" | |
319 | - | else toBase58String(value(orderPriceAsset)) | |
320 | - | if (if ((orderAmtAssetStr != amtAssetId)) | |
321 | - | then true | |
322 | - | else (orderPriceAssetStr != priceAssetId)) | |
323 | - | then throw("Wrong order assets.") | |
324 | - | else { | |
325 | - | let orderPrice = order.price | |
326 | - | let priceDcm = fraction(scale8, priceAssetDcm, amtAssetDcm) | |
327 | - | let castedOrderPrice = toScale(orderPrice, scale8, priceDcm) | |
328 | - | let isOrderPriceValid = if ((order.orderType == Buy)) | |
329 | - | then (curPrice >= castedOrderPrice) | |
330 | - | else (castedOrderPrice >= curPrice) | |
331 | - | true | |
332 | - | } | |
333 | - | } | |
334 | - | } | |
335 | - | ||
336 | - | ||
337 | - | func commonGet (i) = if ((size(i.payments) != 1)) | |
338 | - | then throw("exactly 1 payment is expected") | |
339 | - | else { | |
340 | - | let pmt = value(i.payments[0]) | |
341 | - | let pmtAssetId = value(pmt.assetId) | |
342 | - | let pmtAmt = pmt.amount | |
343 | - | let res = estimateGetOperation(toBase58String(i.transactionId), toBase58String(pmtAssetId), pmtAmt, i.caller) | |
344 | - | let outAmAmt = res._1 | |
345 | - | let outPrAmt = res._2 | |
346 | - | let poolStatus = parseIntValue(res._9) | |
347 | - | let state = res._10 | |
348 | - | if (if (isGlobalShutdown()) | |
349 | - | then true | |
350 | - | else (poolStatus == PoolShutdown)) | |
351 | - | then throw(("Get operation is blocked by admin. Status = " + toString(poolStatus))) | |
352 | - | else $Tuple5(outAmAmt, outPrAmt, pmtAmt, pmtAssetId, state) | |
353 | - | } | |
354 | - | ||
355 | - | ||
356 | - | func commonPut (i,slippageTolerance,emitLp) = if ((size(i.payments) != 2)) | |
357 | - | then throw("exactly 2 payments are expected") | |
358 | - | else { | |
359 | - | let amAssetPmt = value(i.payments[0]) | |
360 | - | let prAssetPmt = value(i.payments[1]) | |
361 | - | let estPut = estimatePutOperation(toBase58String(i.transactionId), slippageTolerance, amAssetPmt.amount, amAssetPmt.assetId, prAssetPmt.amount, prAssetPmt.assetId, toString(i.caller), false, emitLp) | |
362 | - | let poolStatus = parseIntValue(estPut._8) | |
363 | - | if (if (if (isGlobalShutdown()) | |
364 | - | then true | |
365 | - | else (poolStatus == PoolPutDisabled)) | |
366 | - | then true | |
367 | - | else (poolStatus == PoolShutdown)) | |
368 | - | then throw(("Put operation is blocked by admin. Status = " + toString(poolStatus))) | |
369 | - | else estPut | |
370 | - | } | |
371 | - | ||
372 | - | ||
373 | 139 | @Callable(i) | |
374 | - | func constructor ( | |
140 | + | func constructor (stakingContract,boostingContract,idoContract,teamContract,emissionContract,restContract,slpipageContract,priceDecimals) = if ((i.caller != this)) | |
375 | 141 | then throw("permissions denied") | |
376 | - | else [StringEntry( | |
142 | + | else [StringEntry(keyFactoryConfig(), dataFactoryCfg(stakingContract, boostingContract, idoContract, teamContract, emissionContract, restContract, slpipageContract)), IntegerEntry(keyPriceDecimals(), priceDecimals)] | |
377 | 143 | ||
378 | 144 | ||
379 | 145 | ||
380 | 146 | @Callable(i) | |
381 | - | func put (slippageTolerance,shouldAutoStake) = { | |
382 | - | let factoryCfg = getFactoryConfig() | |
383 | - | let stakingContract = valueOrErrorMessage(addressFromString(factoryCfg[idxFactoryStakingContract]), "Error. Incorrect staking address.") | |
384 | - | let slippageContract = valueOrErrorMessage(addressFromString(factoryCfg[idxFactorySlippageContract]), "Error. Incorrect slippage contract address.") | |
385 | - | if ((0 > slippageTolerance)) | |
386 | - | then throw("Invalid slippageTolerance passed") | |
147 | + | func activateNewPool (poolAddress,amountAssetStr,priceAssetStr,lpAssetName,lpAssetDescr,poolWeight,poolType) = if ((i.caller != this)) | |
148 | + | then throw("permissions denied") | |
149 | + | else if (isDefined(getString(keyMappingPoolContractAddressToPoolAssets(poolAddress)))) | |
150 | + | then throw((("Pool address " + poolAddress) + " already registered.")) | |
387 | 151 | else { | |
388 | - | let estPut = commonPut(i, slippageTolerance, true) | |
389 | - | let emitLpAmt = estPut._2 | |
390 | - | let lpAssetId = estPut._7 | |
391 | - | let state = estPut._9 | |
392 | - | let amDiff = estPut._10 | |
393 | - | let prDiff = estPut._11 | |
394 | - | let amId = estPut._12 | |
395 | - | let prId = estPut._13 | |
396 | - | let emitInv = invoke(factoryContract, "emit", [emitLpAmt], nil) | |
397 | - | if ((emitInv == emitInv)) | |
398 | - | then { | |
399 | - | let slippageAInv = if ((amDiff > 0)) | |
400 | - | then invoke(slippageContract, "put", nil, [AttachedPayment(amId, amDiff)]) | |
401 | - | else nil | |
402 | - | if ((slippageAInv == slippageAInv)) | |
403 | - | then { | |
404 | - | let slippagePInv = if ((prDiff > 0)) | |
405 | - | then invoke(slippageContract, "put", nil, [AttachedPayment(prId, prDiff)]) | |
406 | - | else nil | |
407 | - | if ((slippagePInv == slippagePInv)) | |
408 | - | then { | |
409 | - | let lpTransfer = if (shouldAutoStake) | |
410 | - | then { | |
411 | - | let slpStakeInv = invoke(stakingContract, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmt)]) | |
412 | - | if ((slpStakeInv == slpStakeInv)) | |
413 | - | then nil | |
414 | - | else throw("Strict value is not equal to itself.") | |
415 | - | } | |
416 | - | else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)] | |
417 | - | (state ++ lpTransfer) | |
418 | - | } | |
419 | - | else throw("Strict value is not equal to itself.") | |
420 | - | } | |
152 | + | let internalAmountAssetData = getInternalAssetIdOrCreate(amountAssetStr, 1) | |
153 | + | let internalAmountAssetId = internalAmountAssetData._1 | |
154 | + | let internalPriceAssetData = getInternalAssetIdOrCreate(priceAssetStr, if (internalAmountAssetData._3) | |
155 | + | then 2 | |
156 | + | else 1) | |
157 | + | let internalPriceAssetId = internalPriceAssetData._1 | |
158 | + | let poolAccountScriptHash = valueOrErrorMessage(scriptHash(addressFromStringValue(poolAddress)), ("No script has been found on pool account " + poolAddress)) | |
159 | + | let ethalonPoolAccountScriptHash = getBinaryValue(keyPoolScriptHash()) | |
160 | + | let poolConfig = getString(this, keyPoolConfig(toString(internalAmountAssetId), toString(internalPriceAssetId))) | |
161 | + | if (isDefined(poolConfig)) | |
162 | + | then throw((((("Pool " + amountAssetStr) + "/") + priceAssetStr) + " has already been activated.")) | |
163 | + | else { | |
164 | + | let poolConfigValue = value(getString(this, keyPoolConfig(toString(internalAmountAssetId), toString(internalPriceAssetId)))) | |
165 | + | let amountAssetsDecimals = if ((amountAssetStr == "WAVES")) | |
166 | + | then decimalsMultPrice | |
167 | + | else pow(10, 0, value(assetInfo(fromBase58String(amountAssetStr))).decimals, 0, 0, DOWN) | |
168 | + | let priceAssetsDecimals = if ((priceAssetStr == "WAVES")) | |
169 | + | then decimalsMultPrice | |
170 | + | else pow(10, 0, value(assetInfo(fromBase58String(priceAssetStr))).decimals, 0, 0, DOWN) | |
171 | + | let lpAssetIssueAction = Issue(lpAssetName, lpAssetDescr, 1, 8, true) | |
172 | + | let lpAssetId = calculateAssetId(lpAssetIssueAction) | |
173 | + | let lpAssetIdStr = toBase58String(lpAssetId) | |
174 | + | let poolActivateInvokeResult = invoke(addressFromStringValue(poolAddress), "activate", [amountAssetStr, priceAssetStr], nil) | |
175 | + | if ((poolActivateInvokeResult == poolActivateInvokeResult)) | |
176 | + | then if ((poolActivateInvokeResult != "success")) | |
177 | + | then throw("Pool initialisation error happened.") | |
178 | + | else $Tuple2(((internalAmountAssetData._2 ++ internalPriceAssetData._2) ++ [lpAssetIssueAction, Burn(lpAssetId, 1), StringEntry(keyPoolConfig(toString(internalAmountAssetId), toString(internalPriceAssetId)), dataPoolCfg(poolAddress, toString(PoolActive), lpAssetIdStr, amountAssetStr, priceAssetStr, amountAssetsDecimals, priceAssetsDecimals, internalAmountAssetId, internalPriceAssetId, decimalsMultPrice, poolType)), StringEntry(keyMappingLpAssetToPoolAssets(lpAssetIdStr), dataMappingPoolAssets(internalAmountAssetId, internalPriceAssetId)), StringEntry(keyMappingPoolAssetsToLpasset(toString(internalAmountAssetId), toString(internalPriceAssetId)), ("%s__" + lpAssetIdStr)), StringEntry(keyMappingPoolContractAddressToPoolAssets(poolAddress), dataMappingPoolAssets(internalAmountAssetId, internalPriceAssetId)), StringEntry(keyMappingPoolAssetsToPoolContractAddress(internalAmountAssetId, internalPriceAssetId), poolAddress), StringEntry(keyMappingPoolLPAssetToPoolContractAddress(lpAssetIdStr), poolAddress), StringEntry(keyMappingPoolContracToLPAsset(poolAddress), lpAssetIdStr), IntegerEntry(keyPoolToWeight(poolAddress), poolWeight), StringEntry(keyLpTokensList(), createLpTokensListEntry(lpAssetIdStr))]), "success") | |
421 | 179 | else throw("Strict value is not equal to itself.") | |
422 | 180 | } | |
423 | - | else throw("Strict value is not equal to itself.") | |
424 | 181 | } | |
182 | + | ||
183 | + | ||
184 | + | ||
185 | + | @Callable(i) | |
186 | + | func managePool (poolAddress,newStatus) = if ((i.caller != this)) | |
187 | + | then throw("permissions denied") | |
188 | + | else { | |
189 | + | let poolConfig = getPoolConfig(poolAddress) | |
190 | + | let poolStatus = poolConfig[idxPoolStatus] | |
191 | + | let lpAssetIdStr = poolConfig[idxPoolLPAssetId] | |
192 | + | let amountAssetStr = poolConfig[idxAmtAssetId] | |
193 | + | let priceAssetStr = poolConfig[idxPriceAssetId] | |
194 | + | let amountAssetsDecimals = parseIntValue(poolConfig[idxAmtAssetDcm]) | |
195 | + | let priceAssetsDecimals = parseIntValue(poolConfig[idxPriceAssetDcm]) | |
196 | + | let internalAmountAssetId = parseIntValue(poolConfig[idxIAmtAssetId]) | |
197 | + | let internalPriceAssetId = parseIntValue(poolConfig[idxIPriceAssetId]) | |
198 | + | let lpAssetDcm = parseIntValue(poolConfig[idxLPAssetDcm]) | |
199 | + | let poolType = poolConfig[idxPoolType] | |
200 | + | [StringEntry(keyPoolConfig(toString(internalAmountAssetId), toString(internalPriceAssetId)), dataPoolCfg(poolAddress, toString(newStatus), lpAssetIdStr, amountAssetStr, priceAssetStr, amountAssetsDecimals, priceAssetsDecimals, internalAmountAssetId, internalPriceAssetId, lpAssetDcm, poolType))] | |
201 | + | } | |
202 | + | ||
203 | + | ||
204 | + | ||
205 | + | @Callable(i) | |
206 | + | func emit (amountToEmit) = { | |
207 | + | let caller = i.caller | |
208 | + | let originCaller = i.originCaller | |
209 | + | let lpAssetRequested = valueOrErrorMessage(getString(keyMappingPoolContracToLPAsset(toString(caller))), "Invalid LP address called me.") | |
210 | + | let lpAsset = fromBase58String(lpAssetRequested) | |
211 | + | if ((amountToEmit > 0)) | |
212 | + | then $Tuple2([Reissue(lpAsset, amountToEmit, true), ScriptTransfer(i.caller, amountToEmit, lpAsset)], "success") | |
213 | + | else nil | |
425 | 214 | } | |
426 | 215 | ||
427 | 216 | ||
428 | 217 | ||
429 | 218 | @Callable(i) | |
430 | - | func putForFree (maxSlippage) = if ((0 > maxSlippage)) | |
431 | - | then throw("Invalid value passed") | |
432 | - | else { | |
433 | - | let estPut = commonPut(i, maxSlippage, false) | |
434 | - | estPut._9 | |
435 | - | } | |
436 | - | ||
437 | - | ||
438 | - | ||
439 | - | @Callable(i) | |
440 | - | func get () = { | |
441 | - | let res = commonGet(i) | |
442 | - | let outAmtAmt = res._1 | |
443 | - | let outPrAmt = res._2 | |
444 | - | let pmtAmt = res._3 | |
445 | - | let pmtAssetId = res._4 | |
446 | - | let state = res._5 | |
447 | - | let burnLPAssetOnFactory = invoke(factoryContract, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)]) | |
448 | - | if ((burnLPAssetOnFactory == burnLPAssetOnFactory)) | |
449 | - | then state | |
450 | - | else throw("Strict value is not equal to itself.") | |
451 | - | } | |
452 | - | ||
453 | - | ||
454 | - | ||
455 | - | @Callable(i) | |
456 | - | func getNoLess (noLessThenAmtAsset,noLessThenPriceAsset) = { | |
457 | - | let res = commonGet(i) | |
458 | - | let outAmAmt = res._1 | |
459 | - | let outPrAmt = res._2 | |
460 | - | let pmtAmt = res._3 | |
461 | - | let pmtAssetId = res._4 | |
462 | - | let state = res._5 | |
463 | - | if ((noLessThenAmtAsset > outAmAmt)) | |
464 | - | then throw(((("noLessThenAmtAsset failed: " + toString(outAmAmt)) + " < ") + toString(noLessThenAmtAsset))) | |
465 | - | else if ((noLessThenPriceAsset > outPrAmt)) | |
466 | - | then throw(((("noLessThenPriceAsset failed: " + toString(outPrAmt)) + " < ") + toString(noLessThenPriceAsset))) | |
219 | + | func burn (amountToBurn) = { | |
220 | + | let caller = i.caller | |
221 | + | let originCaller = i.originCaller | |
222 | + | let payment = value(i.payments[0]) | |
223 | + | let paymentAmount = value(payment.amount) | |
224 | + | let inAmountAssetId = toBase58String(value(payment.assetId)) | |
225 | + | let lpAssetRequestedForBurning = valueOrErrorMessage(getString(keyMappingPoolContracToLPAsset(toString(caller))), "Invalid LP address called me.") | |
226 | + | if ((inAmountAssetId != lpAssetRequestedForBurning)) | |
227 | + | then throw("Invalid asset passed.") | |
228 | + | else if ((amountToBurn != paymentAmount)) | |
229 | + | then throw("Invalid amount passed.") | |
467 | 230 | else { | |
468 | - | let burnLPAssetOnFactory = invoke(factoryContract, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)]) | |
469 | - | if ((burnLPAssetOnFactory == burnLPAssetOnFactory)) | |
470 | - | then state | |
471 | - | else throw("Strict value is not equal to itself.") | |
231 | + | let lpAsset = fromBase58String(lpAssetRequestedForBurning) | |
232 | + | $Tuple2([Burn(lpAsset, amountToBurn)], "success") | |
472 | 233 | } | |
473 | 234 | } | |
474 | 235 | ||
475 | 236 | ||
476 | - | ||
477 | - | @Callable(i) | |
478 | - | func activate (amtAssetStr,priceAssetStr) = if ((toString(i.caller) != toString(factoryContract))) | |
479 | - | then throw("permissions denied") | |
480 | - | else $Tuple2([StringEntry(keyAmtAsset(), amtAssetStr), StringEntry(keyPriceAsset(), priceAssetStr)], "success") | |
481 | - | ||
482 | - | ||
483 | - | ||
484 | - | @Callable(i) | |
485 | - | func getPoolConfigWrapperREADONLY () = $Tuple2(nil, getPoolConfig()) | |
486 | - | ||
487 | - | ||
488 | - | ||
489 | - | @Callable(i) | |
490 | - | func getAccBalanceWrapperREADONLY (assetId) = $Tuple2(nil, getAccBalance(assetId)) | |
491 | - | ||
492 | - | ||
493 | - | ||
494 | - | @Callable(i) | |
495 | - | func calcPricesWrapperREADONLY (amAmt,prAmt,lpAmt) = { | |
496 | - | let prices = calcPrices(amAmt, prAmt, lpAmt) | |
497 | - | $Tuple2(nil, [toString(prices[0]), toString(prices[1]), toString(prices[2])]) | |
498 | - | } | |
499 | - | ||
500 | - | ||
501 | - | ||
502 | - | @Callable(i) | |
503 | - | func toX18WrapperREADONLY (origVal,origScaleMult) = $Tuple2(nil, toString(toX18(origVal, origScaleMult))) | |
504 | - | ||
505 | - | ||
506 | - | ||
507 | - | @Callable(i) | |
508 | - | func fromX18WrapperREADONLY (val,resultScaleMult) = $Tuple2(nil, fromX18(parseBigIntValue(val), resultScaleMult)) | |
509 | - | ||
510 | - | ||
511 | - | ||
512 | - | @Callable(i) | |
513 | - | func calcPriceBigIntWrapperREADONLY (prAmtX18,amAmtX18) = $Tuple2(nil, toString(calcPriceBigInt(parseBigIntValue(prAmtX18), parseBigIntValue(amAmtX18)))) | |
514 | - | ||
515 | - | ||
516 | - | ||
517 | - | @Callable(i) | |
518 | - | func estimatePutOperationWrapperREADONLY (txId58,slippageTolerance,inAmAssetAmt,inAmAssetId,inPrAssetAmt,inPrAssetId,userAddress,isEvaluate,emitLp) = { | |
519 | - | let estimation = estimatePutOperation(txId58, slippageTolerance, inAmAssetAmt, inAmAssetId, inPrAssetAmt, inPrAssetId, userAddress, isEvaluate, emitLp) | |
520 | - | let $t02536825589 = estimation | |
521 | - | let calcLpAmt = $t02536825589._1 | |
522 | - | let emitLpAmt = $t02536825589._2 | |
523 | - | let curPrice = $t02536825589._3 | |
524 | - | let amBalance = $t02536825589._4 | |
525 | - | let prBalance = $t02536825589._5 | |
526 | - | let lpEmission = $t02536825589._6 | |
527 | - | let lpAssetId = $t02536825589._7 | |
528 | - | let poolStatus = $t02536825589._8 | |
529 | - | let commonState = $t02536825589._9 | |
530 | - | let amDiff = $t02536825589._10 | |
531 | - | let prDiff = $t02536825589._11 | |
532 | - | let inAmtAssetId = $t02536825589._12 | |
533 | - | let inPriceAssetId = $t02536825589._13 | |
534 | - | $Tuple2(nil, $Tuple13(calcLpAmt, emitLpAmt, curPrice, amBalance, prBalance, lpEmission, lpAssetId, poolStatus, commonState, amDiff, prDiff, inAmtAssetId, inPriceAssetId)) | |
535 | - | } | |
536 | - | ||
537 | - | ||
538 | - | ||
539 | - | @Callable(i) | |
540 | - | func estimateGetOperationWrapperREADONLY (txId58,pmtAssetId,pmtLpAmt,userAddress) = { | |
541 | - | let estimation = estimateGetOperation(txId58, pmtAssetId, pmtLpAmt, addressFromStringValue(userAddress)) | |
542 | - | let $t02610626275 = estimation | |
543 | - | let outAmAmt = $t02610626275._1 | |
544 | - | let outPrAmt = $t02610626275._2 | |
545 | - | let amAssetId = $t02610626275._3 | |
546 | - | let prAssetId = $t02610626275._4 | |
547 | - | let amBalance = $t02610626275._5 | |
548 | - | let prBalance = $t02610626275._6 | |
549 | - | let lpEmission = $t02610626275._7 | |
550 | - | let curPriceX18 = $t02610626275._8 | |
551 | - | let poolStatus = $t02610626275._9 | |
552 | - | let state = $t02610626275._10 | |
553 | - | $Tuple2(nil, $Tuple10(outAmAmt, outPrAmt, amAssetId, prAssetId, amBalance, prBalance, lpEmission, toString(curPriceX18), poolStatus, state)) | |
554 | - | } | |
555 | - | ||
556 | - | ||
557 | - | ||
558 | - | @Callable(i) | |
559 | - | func statsREADONLY () = { | |
560 | - | let cfg = getPoolConfig() | |
561 | - | let lpAssetId = fromBase58String(cfg[idxPoolLPAssetId]) | |
562 | - | let amtAssetId = cfg[idxAmtAssetId] | |
563 | - | let priceAssetId = cfg[idxPriceAssetId] | |
564 | - | let iAmtAssetId = cfg[idxIAmtAssetId] | |
565 | - | let iPriceAssetId = cfg[idxIPriceAssetId] | |
566 | - | let amtAssetDcm = parseIntValue(cfg[idxAmtAssetDcm]) | |
567 | - | let priceAssetDcm = parseIntValue(cfg[idxPriceAssetDcm]) | |
568 | - | let poolLPBalance = valueOrErrorMessage(assetInfo(lpAssetId), (("Asset " + toBase58String(lpAssetId)) + " doesn't exist")).quantity | |
569 | - | let accAmtAssetBalance = getAccBalance(amtAssetId) | |
570 | - | let accPriceAssetBalance = getAccBalance(priceAssetId) | |
571 | - | let pricesList = calcPrices(accAmtAssetBalance, accPriceAssetBalance, poolLPBalance) | |
572 | - | let curPrice = 0 | |
573 | - | let lpAmtAssetShare = fromX18(pricesList[1], scale8) | |
574 | - | let lpPriceAssetShare = fromX18(pricesList[2], scale8) | |
575 | - | let poolWeight = value(getInteger(factoryContract, keyPoolWeight(toString(this)))) | |
576 | - | $Tuple2(nil, makeString(["%d%d%d%d%d%d%d", toString(accAmtAssetBalance), toString(accPriceAssetBalance), toString(poolLPBalance), toString(curPrice), toString(lpAmtAssetShare), toString(lpPriceAssetShare), toString(poolWeight)], SEP)) | |
577 | - | } | |
578 | - | ||
579 | - | ||
580 | - | ||
581 | - | @Callable(i) | |
582 | - | func evaluatePutByAmountAssetREADONLY (inAmAssetAmt) = { | |
583 | - | let cfg = getPoolConfig() | |
584 | - | let lpAssetId = fromBase58String(cfg[idxPoolLPAssetId]) | |
585 | - | let amAssetIdStr = cfg[idxAmtAssetId] | |
586 | - | let amAssetId = fromBase58String(amAssetIdStr) | |
587 | - | let prAssetIdStr = cfg[idxPriceAssetId] | |
588 | - | let prAssetId = fromBase58String(prAssetIdStr) | |
589 | - | let amtAssetDcm = parseIntValue(cfg[idxAmtAssetDcm]) | |
590 | - | let priceAssetDcm = parseIntValue(cfg[idxPriceAssetDcm]) | |
591 | - | let poolStatus = cfg[idxPoolStatus] | |
592 | - | let poolLPBalance = valueOrErrorMessage(assetInfo(lpAssetId), (("Asset " + toBase58String(lpAssetId)) + " doesn't exist")).quantity | |
593 | - | let accAmtAssetBalance = getAccBalance(amAssetIdStr) | |
594 | - | let accPriceAssetBalance = getAccBalance(prAssetIdStr) | |
595 | - | let amtAssetAmtX18 = toX18(accAmtAssetBalance, amtAssetDcm) | |
596 | - | let priceAssetAmtX18 = toX18(accPriceAssetBalance, priceAssetDcm) | |
597 | - | let curPriceX18 = if ((poolLPBalance == 0)) | |
598 | - | then zeroBigInt | |
599 | - | else calcPriceBigInt(priceAssetAmtX18, amtAssetAmtX18) | |
600 | - | let inAmAssetAmtX18 = toX18(inAmAssetAmt, amtAssetDcm) | |
601 | - | let inPrAssetAmtX18 = fraction(inAmAssetAmtX18, curPriceX18, scale18) | |
602 | - | let inPrAssetAmt = fromX18(inPrAssetAmtX18, priceAssetDcm) | |
603 | - | let estPut = estimatePutOperation("", 500000, inAmAssetAmt, amAssetId, inPrAssetAmt, prAssetId, "", true, false) | |
604 | - | let calcLpAmt = estPut._1 | |
605 | - | let curPriceCalc = estPut._3 | |
606 | - | let amBalance = estPut._4 | |
607 | - | let prBalance = estPut._5 | |
608 | - | let lpEmission = estPut._6 | |
609 | - | $Tuple2(nil, makeString(["%d%d%d%d%d%d%d%d", toString(calcLpAmt), toString(fromX18(curPriceX18, scale8)), toString(amBalance), toString(prBalance), toString(lpEmission), poolStatus, toString(inAmAssetAmt), toString(inPrAssetAmt)], SEP)) | |
610 | - | } | |
611 | - | ||
612 | - | ||
613 | - | ||
614 | - | @Callable(i) | |
615 | - | func evaluatePutByPriceAssetREADONLY (inPrAssetAmt) = { | |
616 | - | let cfg = getPoolConfig() | |
617 | - | let lpAssetId = fromBase58String(cfg[idxPoolLPAssetId]) | |
618 | - | let amAssetIdStr = cfg[idxAmtAssetId] | |
619 | - | let amAssetId = fromBase58String(amAssetIdStr) | |
620 | - | let prAssetIdStr = cfg[idxPriceAssetId] | |
621 | - | let prAssetId = fromBase58String(prAssetIdStr) | |
622 | - | let amtAssetDcm = parseIntValue(cfg[idxAmtAssetDcm]) | |
623 | - | let priceAssetDcm = parseIntValue(cfg[idxPriceAssetDcm]) | |
624 | - | let poolStatus = cfg[idxPoolStatus] | |
625 | - | let poolLPBalance = valueOrErrorMessage(assetInfo(lpAssetId), (("Asset " + toBase58String(lpAssetId)) + " doesn't exist")).quantity | |
626 | - | let amBalanceRaw = getAccBalance(amAssetIdStr) | |
627 | - | let prBalanceRaw = getAccBalance(prAssetIdStr) | |
628 | - | let amBalanceRawX18 = toX18(amBalanceRaw, amtAssetDcm) | |
629 | - | let prBalanceRawX18 = toX18(prBalanceRaw, priceAssetDcm) | |
630 | - | let curPriceX18 = if ((poolLPBalance == 0)) | |
631 | - | then zeroBigInt | |
632 | - | else calcPriceBigInt(prBalanceRawX18, amBalanceRawX18) | |
633 | - | let inPrAssetAmtX18 = toX18(inPrAssetAmt, priceAssetDcm) | |
634 | - | let inAmAssetAmtX18 = fraction(inPrAssetAmtX18, scale18, curPriceX18) | |
635 | - | let inAmAssetAmt = fromX18(inAmAssetAmtX18, amtAssetDcm) | |
636 | - | let estPut = estimatePutOperation("", 500000, inAmAssetAmt, amAssetId, inPrAssetAmt, prAssetId, "", true, false) | |
637 | - | let calcLpAmt = estPut._1 | |
638 | - | let curPriceCalc = estPut._3 | |
639 | - | let amBalance = estPut._4 | |
640 | - | let prBalance = estPut._5 | |
641 | - | let lpEmission = estPut._6 | |
642 | - | $Tuple2(nil, makeString(["%d%d%d%d%d%d%d%d", toString(calcLpAmt), toString(fromX18(curPriceX18, scale8)), toString(amBalance), toString(prBalance), toString(lpEmission), poolStatus, toString(inAmAssetAmt), toString(inPrAssetAmt)], SEP)) | |
643 | - | } | |
644 | - | ||
645 | - | ||
646 | - | ||
647 | - | @Callable(i) | |
648 | - | func evaluateGetREADONLY (paymentLpAssetId,paymentLpAmt) = { | |
649 | - | let res = estimateGetOperation("", paymentLpAssetId, paymentLpAmt, this) | |
650 | - | let outAmAmt = res._1 | |
651 | - | let outPrAmt = res._2 | |
652 | - | let amBalance = res._5 | |
653 | - | let prBalance = res._6 | |
654 | - | let lpEmission = res._7 | |
655 | - | let curPrice = res._8 | |
656 | - | let poolStatus = parseIntValue(res._9) | |
657 | - | $Tuple2(nil, makeString(["%d%d%d%d%d%d%d", toString(outAmAmt), toString(outPrAmt), toString(amBalance), toString(prBalance), toString(lpEmission), toString(curPrice), toString(poolStatus)], SEP)) | |
658 | - | } | |
659 | - | ||
660 | - | ||
661 | 237 | @Verifier(tx) | |
662 | - | func verify () = match tx { | |
663 | - | case order: Order => | |
664 | - | if (validateMatcherOrderAllowed(order)) | |
665 | - | then sigVerify(order.bodyBytes, order.proofs[0], order.senderPublicKey) | |
666 | - | else false | |
667 | - | case _ => | |
668 | - | let managerPublic = valueOrElse(getString(this, keyManagerPublicKey()), EMPTY) | |
669 | - | if ((managerPublic == EMPTY)) | |
670 | - | then sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) | |
671 | - | else sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(managerPublic)) | |
672 | - | } | |
238 | + | func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) | |
673 | 239 |
github/deemru/w8io/169f3d6 69.39 ms ◑