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:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# 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)
135
146 let SEP = "__"
15-
16-let EMPTY = ""
177
188 let PoolActive = 1
199
2212 let PoolMatcherDisabled = 3
2313
2414 let PoolShutdown = 4
15+
16+let idxInternalAssetId = 1
17+
18+let idxResutActions = 2
19+
20+let idxIfAssetIdCalculationPerformed = 3
2521
2622 let idxPoolAddress = 1
2723
4339
4440 let idxLPAssetDcm = 10
4541
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
9643
9744 func keyFactoryConfig () = "%s__factoryConfig"
9845
9946
100-func keyMappingPoolContractAddressToPoolAssets (poolContractAddress) = (("%s%s%s__" + poolContractAddress) + "__mappings__poolContract2LpAsset")
47+func keyLpTokensList () = "%s__lpTokensList"
10148
10249
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))
10466
10567
10668 func keyMappingsBaseAsset2internalId (baseAssetStr) = ("%s%s%s__mappings__baseAsset2internalId__" + baseAssetStr)
10769
10870
109-func keyAllPoolsShutdown () = "%s__shutdown"
71+func keyPoolConfig (amountAssetInternal,priceAssetInternal) = (((("%d%d%s__" + amountAssetInternal) + "__") + priceAssetInternal) + "__config")
11072
11173
112-func keyPoolWeight (contractAddress) = ("%s%s__poolWeight__" + contractAddress)
74+func keyMappingLpAssetToPoolAssets (lpAssetStr) = (("%s%s%s__" + lpAssetStr) + "__mappings__lpAsset2Pool")
11375
11476
115-func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
77+func keyMappingPoolAssetsToLpasset (internalAmountAssetIdStr,internalPriceAssetIdStr) = (((("%d%d%s%s__" + internalAmountAssetIdStr) + "__") + internalPriceAssetIdStr) + "__mappings__PoolAssets2LpAsset")
11678
11779
118-func getIntOrFail (address,key) = valueOrErrorMessage(getInteger(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
80+func keyMappingPoolContractAddressToPoolAssets (poolContractAddress) = (("%s%s%s__" + poolContractAddress) + "__mappings__poolContract2PoolAssets")
11981
12082
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")
12484
12585
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)
132115 }
133116
134117
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
156128 }
157129
158130
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
170136 }
171137
172138
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-
373139 @Callable(i)
374-func constructor (factoryContract,managerPublicKey) = if ((i.caller != this))
140+func constructor (stakingContract,boostingContract,idoContract,teamContract,emissionContract,restContract,slpipageContract,priceDecimals) = if ((i.caller != this))
375141 then throw("permissions denied")
376- else [StringEntry(keyFactoryContract(), factoryContract), StringEntry(keyManagerPublicKey(), managerPublicKey)]
142+ else [StringEntry(keyFactoryConfig(), dataFactoryCfg(stakingContract, boostingContract, idoContract, teamContract, emissionContract, restContract, slpipageContract)), IntegerEntry(keyPriceDecimals(), priceDecimals)]
377143
378144
379145
380146 @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."))
387151 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")
421179 else throw("Strict value is not equal to itself.")
422180 }
423- else throw("Strict value is not equal to itself.")
424181 }
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
425214 }
426215
427216
428217
429218 @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.")
467230 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")
472233 }
473234 }
474235
475236
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-
661237 @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)
673239
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# 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)
135
146 let SEP = "__"
15-
16-let EMPTY = ""
177
188 let PoolActive = 1
199
2010 let PoolPutDisabled = 2
2111
2212 let PoolMatcherDisabled = 3
2313
2414 let PoolShutdown = 4
15+
16+let idxInternalAssetId = 1
17+
18+let idxResutActions = 2
19+
20+let idxIfAssetIdCalculationPerformed = 3
2521
2622 let idxPoolAddress = 1
2723
2824 let idxPoolStatus = 2
2925
3026 let idxPoolLPAssetId = 3
3127
3228 let idxAmtAssetId = 4
3329
3430 let idxPriceAssetId = 5
3531
3632 let idxAmtAssetDcm = 6
3733
3834 let idxPriceAssetDcm = 7
3935
4036 let idxIAmtAssetId = 8
4137
4238 let idxIPriceAssetId = 9
4339
4440 let idxLPAssetDcm = 10
4541
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
9643
9744 func keyFactoryConfig () = "%s__factoryConfig"
9845
9946
100-func keyMappingPoolContractAddressToPoolAssets (poolContractAddress) = (("%s%s%s__" + poolContractAddress) + "__mappings__poolContract2LpAsset")
47+func keyLpTokensList () = "%s__lpTokensList"
10148
10249
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))
10466
10567
10668 func keyMappingsBaseAsset2internalId (baseAssetStr) = ("%s%s%s__mappings__baseAsset2internalId__" + baseAssetStr)
10769
10870
109-func keyAllPoolsShutdown () = "%s__shutdown"
71+func keyPoolConfig (amountAssetInternal,priceAssetInternal) = (((("%d%d%s__" + amountAssetInternal) + "__") + priceAssetInternal) + "__config")
11072
11173
112-func keyPoolWeight (contractAddress) = ("%s%s__poolWeight__" + contractAddress)
74+func keyMappingLpAssetToPoolAssets (lpAssetStr) = (("%s%s%s__" + lpAssetStr) + "__mappings__lpAsset2Pool")
11375
11476
115-func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
77+func keyMappingPoolAssetsToLpasset (internalAmountAssetIdStr,internalPriceAssetIdStr) = (((("%d%d%s%s__" + internalAmountAssetIdStr) + "__") + internalPriceAssetIdStr) + "__mappings__PoolAssets2LpAsset")
11678
11779
118-func getIntOrFail (address,key) = valueOrErrorMessage(getInteger(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
80+func keyMappingPoolContractAddressToPoolAssets (poolContractAddress) = (("%s%s%s__" + poolContractAddress) + "__mappings__poolContract2PoolAssets")
11981
12082
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")
12484
12585
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)
132115 }
133116
134117
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
156128 }
157129
158130
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
170136 }
171137
172138
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-
373139 @Callable(i)
374-func constructor (factoryContract,managerPublicKey) = if ((i.caller != this))
140+func constructor (stakingContract,boostingContract,idoContract,teamContract,emissionContract,restContract,slpipageContract,priceDecimals) = if ((i.caller != this))
375141 then throw("permissions denied")
376- else [StringEntry(keyFactoryContract(), factoryContract), StringEntry(keyManagerPublicKey(), managerPublicKey)]
142+ else [StringEntry(keyFactoryConfig(), dataFactoryCfg(stakingContract, boostingContract, idoContract, teamContract, emissionContract, restContract, slpipageContract)), IntegerEntry(keyPriceDecimals(), priceDecimals)]
377143
378144
379145
380146 @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."))
387151 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")
421179 else throw("Strict value is not equal to itself.")
422180 }
423- else throw("Strict value is not equal to itself.")
424181 }
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
425214 }
426215
427216
428217
429218 @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.")
467230 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")
472233 }
473234 }
474235
475236
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-
661237 @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)
673239

github/deemru/w8io/c3f4982 
65.30 ms