tx · GcNTymb54ZHYuWE3MUqwZHDVe7gaCGuec4MmU29E2ecg

3N9Q1fto4gNiBzBhunuF57xU7chekeJBzJb:  -0.01000000 Waves

2021.11.24 14:17 [1805058] smart account 3N9Q1fto4gNiBzBhunuF57xU7chekeJBzJb > SELF 0.00000000 Waves

{ "type": 13, "id": "GcNTymb54ZHYuWE3MUqwZHDVe7gaCGuec4MmU29E2ecg", "fee": 1000000, "feeAssetId": null, "timestamp": 1637752745736, "version": 1, "sender": "3N9Q1fto4gNiBzBhunuF57xU7chekeJBzJb", "senderPublicKey": "5LCbyfeLnA6WFFq4M6L7AEzy8ktT8sL9A5JXoyuaxCCJ", "proofs": [ "kS1LNfVw7d83kuj435D3wrjteSuTkYp9YhJe2Hk5chNUPauotUrJ7Htf8ENSxRvDzdHssZ3B4mPTMVRVCzwzr5L" ], "script": "base64:AAIFAAAAAAAAABoIAhIDCgEIEgASBAoCCAESAwoBCBIECgIICAAAACcAAAAABlNDQUxFOAAAAAAAAAAACAAAAAAFTVVMVDgAAAAAAAX14QAAAAAAB1NDQUxFMTgAAAAAAAAAABIAAAAABk1VTFQxOAkAATYAAAABAA3gtrOnZAAAAAAAAANTRVACAAAAAl9fAQAAAA9nZXRTdHJpbmdPckZhaWwAAAABAAAAA2tleQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEIgAAAAEFAAAAA2tleQkAASwAAAACCQABLAAAAAICAAAAD21hbmRhdG9yeSB0aGlzLgUAAAADa2V5AgAAAA8gaXMgbm90IGRlZmluZWQBAAAAGGdldFN0cmluZ0J5QWRkcmVzc09yRmFpbAAAAAIAAAAHYWRkcmVzcwAAAANrZXkJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACBQAAAAdhZGRyZXNzBQAAAANrZXkJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAKbWFuZGF0b3J5IAkABCUAAAABBQAAAAdhZGRyZXNzAgAAAAEuBQAAAANrZXkCAAAADyBpcyBub3QgZGVmaW5lZAEAAAAMZ2V0SW50T3JaZXJvAAAAAgAAAAdhZGRyZXNzAAAAA2tleQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAdhZGRyZXNzBQAAAANrZXkAAAAAAAAAAAABAAAADGdldEludE9yRmFpbAAAAAIAAAAHYWRkcmVzcwAAAANrZXkJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAAdhZGRyZXNzBQAAAANrZXkJAAEsAAAAAgkAASwAAAACAgAAAA9tYW5kYXRvcnkgdGhpcy4FAAAAA2tleQIAAAAPIGlzIG5vdCBkZWZpbmVkAQAAABFrZXlGYWN0b3J5QWRkcmVzcwAAAAACAAAAHCVzJXNfX2NvbmZpZ19fZmFjdG9yeUFkZHJlc3MAAAAAGElkeEZhY3RvcnlDZmdTdGFraW5nRGFwcAAAAAAAAAAAAQAAAAAZSWR4RmFjdG9yeUNmZ0Jvb3N0aW5nRGFwcAAAAAAAAAAAAgAAAAAUSWR4RmFjdG9yeUNmZ0lkb0RhcHAAAAAAAAAAAAMAAAAAFUlkeEZhY3RvcnlDZmdUZWFtRGFwcAAAAAAAAAAABAAAAAAZSWR4RmFjdG9yeUNmZ0VtaXNzaW9uRGFwcAAAAAAAAAAABQAAAAAVSWR4RmFjdG9yeUNmZ1Jlc3REYXBwAAAAAAAAAAAGAAAAABlJZHhGYWN0b3J5Q2ZnU2xpcHBhZ2VEYXBwAAAAAAAAAAAHAQAAAA1rZXlGYWN0b3J5Q2ZnAAAAAAIAAAARJXNfX2ZhY3RvcnlDb25maWcBAAAAGmtleUZhY3RvcnlMcDJBc3NldHNNYXBwaW5nAAAAAQAAAApscEFzc2V0U3RyCQAEuQAAAAIJAARMAAAAAgIAAAAGJXMlcyVzCQAETAAAAAIFAAAACmxwQXNzZXRTdHIJAARMAAAAAgIAAAAebWFwcGluZ3NfX2xwQXNzZXQyUG9vbENvbnRyYWN0BQAAAANuaWwFAAAAA1NFUAEAAAAQa2V5RmFjdG9yeUxwTGlzdAAAAAACAAAAECVzX19scFRva2Vuc0xpc3QBAAAAJmtleUZhY3RvcnlMcEFzc2V0VG9Qb29sQ29udHJhY3RBZGRyZXNzAAAAAQAAAApscEFzc2V0U3RyCQAEuQAAAAIJAARMAAAAAgIAAAAGJXMlcyVzCQAETAAAAAIFAAAACmxwQXNzZXRTdHIJAARMAAAAAgIAAAAebWFwcGluZ3NfX2xwQXNzZXQyUG9vbENvbnRyYWN0BQAAAANuaWwFAAAAA1NFUAEAAAAUa2V5RmFjdG9yeVBvb2xXZWlnaHQAAAABAAAAD2NvbnRyYWN0QWRkcmVzcwkABLkAAAACCQAETAAAAAICAAAABCVzJXMJAARMAAAAAgIAAAAKcG9vbFdlaWdodAkABEwAAAACBQAAAA9jb250cmFjdEFkZHJlc3MFAAAAA25pbAUAAAADU0VQAQAAABhyZWFkRmFjdG9yeUFkZHJlc3NPckZhaWwAAAAACQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABCQEAAAAPZ2V0U3RyaW5nT3JGYWlsAAAAAQkBAAAAEWtleUZhY3RvcnlBZGRyZXNzAAAAAAEAAAAKcmVhZExwTGlzdAAAAAAJAAS1AAAAAgkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABB0AAAACCQEAAAAYcmVhZEZhY3RvcnlBZGRyZXNzT3JGYWlsAAAAAAkBAAAAEGtleUZhY3RvcnlMcExpc3QAAAAAAgAAAAAFAAAAA1NFUAEAAAAUcmVhZEZhY3RvcnlDZmdPckZhaWwAAAABAAAAB2ZhY3RvcnkJAAS1AAAAAgkBAAAAGGdldFN0cmluZ0J5QWRkcmVzc09yRmFpbAAAAAIFAAAAB2ZhY3RvcnkJAQAAAA1rZXlGYWN0b3J5Q2ZnAAAAAAUAAAADU0VQAQAAABhnZXRCb29zdGluZ0FkZHJlc3NPckZhaWwAAAABAAAACmZhY3RvcnlDZmcJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEJAAGRAAAAAgUAAAAKZmFjdG9yeUNmZwUAAAAZSWR4RmFjdG9yeUNmZ0Jvb3N0aW5nRGFwcAEAAAAYZ2V0RW1pc3Npb25BZGRyZXNzT3JGYWlsAAAAAQAAAApmYWN0b3J5Q2ZnCQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABCQABkQAAAAIFAAAACmZhY3RvcnlDZmcFAAAAGUlkeEZhY3RvcnlDZmdFbWlzc2lvbkRhcHABAAAAF2dldFN0YWtpbmdBZGRyZXNzT3JGYWlsAAAAAQAAAApmYWN0b3J5Q2ZnCQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABCQABkQAAAAIFAAAACmZhY3RvcnlDZmcFAAAAGElkeEZhY3RvcnlDZmdTdGFraW5nRGFwcAEAAAAea2V5RW1pc3Npb25SYXRlUGVyQmxvY2tDdXJyZW50AAAAAAIAAAAbJXMlc19fcmF0ZVBlckJsb2NrX19jdXJyZW50AQAAACFrZXlFbWlzc2lvblJhdGVQZXJCbG9ja01heEN1cnJlbnQAAAAAAgAAAB4lcyVzX19yYXRlUGVyQmxvY2tNYXhfX2N1cnJlbnQBAAAAFWtleUVtaXNzaW9uU3RhcnRCbG9jawAAAAACAAAAGiVzJXNfX2VtaXNzaW9uX19zdGFydEJsb2NrAQAAABtrZXlFbWlzc2lvbkR1cmF0aW9uSW5CbG9ja3MAAAAAAgAAABglcyVzX19lbWlzc2lvbl9fZHVyYXRpb24BAAAAE2tleUVtaXNzaW9uRW5kQmxvY2sAAAAAAgAAABglcyVzX19lbWlzc2lvbl9fZW5kQmxv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aQAAAAZjYWxsZXIEAAAADnVzZXJBZGRyZXNzU3RyAwkAAAAAAAACBQAAAAljYWxsZXJTdHIFAAAACWxwRGFwcFN0cgkABCUAAAABCAUAAAABaQAAAAxvcmlnaW5DYWxsZXIFAAAACWNhbGxlclN0cgQAAAAPc3Rha2VkQnlVc2VyS0VZCQEAAAAPa2V5U3Rha2VkQnlVc2VyAAAAAgUAAAAOdXNlckFkZHJlc3NTdHIFAAAADGxwQXNzZXRJZFN0cgQAAAAOc3Rha2VkVG90YWxLRVkJAQAAAA5rZXlTdGFrZWRUb3RhbAAAAAEFAAAADGxwQXNzZXRJZFN0cgQAAAAMc3Rha2VkQnlVc2VyCQEAAAAKcmVhZFN0YWtlZAAAAAEFAAAAD3N0YWtlZEJ5VXNlcktFWQQAAAALc3Rha2VkVG90YWwJAQAAAApyZWFkU3Rha2VkAAAAAQUAAAAOc3Rha2VkVG90YWxLRVkJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAD3N0YWtlZEJ5VXNlcktFWQkAAGQAAAACBQAAAAxzdGFrZWRCeVVzZXIFAAAABmFtb3VudAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAOc3Rha2VkVG90YWxLRVkJAABkAAAAAgUAAAALc3Rha2VkVG90YWwFAAAABmFtb3VudAkABEwAAAACCQEAAAAVT3BlcmF0aW9uSGlzdG9yeUVudHJ5AAAABQIAAAAFc3Rha2UFAAAADnVzZXJBZGRyZXNzU3RyBQAAAAxscEFzc2V0SWRTdHIFAAAABmFtb3VudAgFAAAAAWkAAAANdHJhbnNhY3Rpb25JZAUAAAADbmlsAAAAAWkBAAAAB3Vuc3Rha2UAAAACAAAADGxwQXNzZXRJZFN0cgAAAAZhbW91bnQEAAAAB2ZhY3RvcnkJAQAAABhyZWFkRmFjdG9yeUFkZHJlc3NPckZhaWwAAAAABAAAAA51c2VyQWRkcmVzc1N0cgkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIEAAAACWxwQXNzZXRJZAkAAlkAAAABBQAAAAxscEFzc2V0SWRTdHIDCQEAAAABIQAAAAEJAQAAAAlpc0RlZmluZWQAAAABCQAEHQAAAAIFAAAAB2ZhY3RvcnkJAQAAABprZXlGYWN0b3J5THAyQXNzZXRzTWFwcGluZwAAAAEFAAAADGxwQXNzZXRJZFN0cgkAAAIAAAABCQABLAAAAAICAAAAFXVuc3VwcG9ydGVkIGxwIGFzc2V0IAUAAAAMbHBBc3NldElkU3RyBAAAAA9zdGFrZWRCeVVzZXJLRVkJAQAAAA9rZXlTdGFrZWRCeVVzZXIAAAACBQAAAA51c2VyQWRkcmVzc1N0cgUAAAAMbHBBc3NldElkU3RyBAAAAA5zdGFrZWRUb3RhbEtFWQkBAAAADmtleVN0YWtlZFRvdGFsAAAAAQUAAAAMbHBBc3NldElkU3RyBAAAAAxzdGFrZWRCeVVzZXIJAQAAAApyZWFkU3Rha2VkAAAAAQUAAAAPc3Rha2VkQnlVc2VyS0VZBAAAAAtzdGFrZWRUb3RhbAkBAAAACnJlYWRTdGFrZWQAAAABBQAAAA5zdGFrZWRUb3RhbEtFWQMJAABmAAAAAgUAAAAGYW1vdW50BQAAAAxzdGFrZWRCeVVzZXIJAAACAAAAAQIAAAAkcGFzc2VkIGFtb3VudCBpcyBsZXNzIHRoZW4gYXZhaWxhYmxlCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAA9zdGFrZWRCeVVzZXJLRVkJAABlAAAAAgUAAAAMc3Rha2VkQnlVc2VyBQAAAAZhbW91bnQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAADnN0YWtlZFRvdGFsS0VZCQAAZQAAAAIFAAAAC3N0YWtlZFRvdGFsBQAAAAZhbW91bnQJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAAZhbW91bnQFAAAACWxwQXNzZXRJZAkABEwAAAACCQEAAAAVT3BlcmF0aW9uSGlzdG9yeUVudHJ5AAAABQIAAAAHdW5zdGFrZQUAAAAOdXNlckFkZHJlc3NTdHIFAAAADGxwQXNzZXRJZFN0cgUAAAAGYW1vdW50CAUAAAABaQAAAA10cmFuc2FjdGlvbklkBQAAAANuaWwAAAABaQEAAAAHY2xhaW1XeAAAAAEAAAAMbHBBc3NldElkU3RyCQAAAgAAAAECAAAAEXRlbW9yYXJ5IGRpc2FibGVkAAAAAWkBAAAAD2NsYWltV3hSRUFET05MWQAAAAIAAAAMbHBBc3NldElkU3RyAAAAC3VzZXJBZGRyZXNzBAAAAA9mYWN0b3J5Q29udHJhY3QJAQAAABhyZWFkRmFjdG9yeUFkZHJlc3NPckZhaWwAAAAABAAAAApmYWN0b3J5Q2ZnCQEAAAAUcmVhZEZhY3RvcnlDZmdPckZhaWwAAAABBQAAAA9mYWN0b3J5Q29udHJhY3QEAAAAEGVtaXNzaW9uQ29udHJhY3QJAQAAABhnZXRFbWlzc2lvbkFkZHJlc3NPckZhaWwAAAABBQAAAApmYWN0b3J5Q2ZnBAAAAA9zdGFrZWRCeVVzZXJLRVkJAQAAAA9rZXlTdGFrZWRCeVVzZXIAAAACBQAAAAt1c2VyQWRkcmVzcwUAAAAMbHBBc3NldElkU3RyBAAAAA5zdGFrZWRUb3RhbEtFWQkBAAAADmtleVN0YWtlZFRvdGFsAAAAAQUAAAAMbHBBc3NldElkU3RyBAAAAAxzdGFrZWRCeVVzZXIJAQAAAApyZWFkU3Rha2VkAAAAAQUAAAAPc3Rha2VkQnlVc2VyS0VZBAAAAAtzdGFrZWRUb3RhbAkBAAAACnJlYWRTdGFrZWQAAAABBQAAAA5zdGFrZWRUb3RhbEtFWQQAAAAOcG9vbEFkZHJlc3NTdHIJAQAAABhnZXRTdHJpbmdCeUFkZHJlc3NPckZhaWwAAAACBQAAAA9mYWN0b3J5Q29udHJhY3QJAQAAACZrZXlGYWN0b3J5THBBc3NldFRvUG9vbENvbnRyYWN0QWRkcmVzcwAAAAEFAAAADGxwQXNzZXRJZFN0cgQAAAAOcG9vbFdlaWdodE11bHQFAAAABU1VTFQ4BAAAAApwb29sV2VpZ2h0CQEAAAARQGV4dHJOYXRpdmUoMTA1MCkAAAACBQAAAA9mYWN0b3J5Q29udHJhY3QJAQAAABRrZXlGYWN0b3J5UG9vbFdlaWdodAAAAAEFAAAADnBvb2xBZGRyZXNzU3RyBAAAABJ3eEVtaXNzaW9uUGVyQmxvY2sJAQAAAAxnZXRJbnRPckZhaWwAAAACBQAAABBlbWlzc2lvbkNvbnRyYWN0CQEAAAAea2V5RW1pc3Npb25SYXRlUGVyQmxvY2tDdXJyZW50AAAAAAQAAAASZW1pc3Npb25TdGFydEJsb2NrCQEAAAAMZ2V0SW50T3JGYWlsAAAAAgUAAAAQZW1pc3Npb25Db250cmFjdAkBAAAAFWtleUVtaXNzaW9uU3RhcnRCbG9jawAAAAAEAAAADHBhc3NlZEJsb2NrcwMJAABmAAAAAgUAAAASZW1pc3Npb25TdGFydEJsb2NrBQAAAAZoZWlnaHQAAAAAAAAAAAAJAABlAAAAAgUAAAAGaGVpZ2h0BQAAABJlbWlzc2lvblN0YXJ0QmxvY2sEAAAADnBvb2xXeEVtaXNzaW9uCQAAawAAAAMJAABoAAAAAgUAAAASd3hFbWlzc2lvblBlckJsb2NrBQAAAAxwYXNzZWRCbG9ja3MFAAAACnBvb2xXZWlnaHQFAAAADnBvb2xXZWlnaHRNdWx0BAAAAAx1c2VyV3hSZXdhcmQJAABrAAAAAwUAAAAOcG9vbFd4RW1pc3Npb24FAAAADHN0YWtlZEJ5VXNlcgUAAAALc3Rha2VkVG90YWwJAAUUAAAAAgUAAAADbmlsCQAEuQAAAAIJAARMAAAAAgIAAAAGJXMlcyVkCQAETAAAAAIFAAAADGxwQXNzZXRJZFN0cgkABEwAAAACBQAAAAt1c2VyQWRkcmVzcwkABEwAAAACCQABpAAAAAEFAAAADHVzZXJXeFJld2FyZAUAAAADbmlsBQAAAANTRVAAAAAAWCZNQg==", "chainId": 84, "height": 1805058, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 5xNBsHSf5W9QoN4KjxcnY2r5FHEWEDNJhvu9VHxoV5qd Next: none Diff:
OldNewDifferences
1111
1212 let SEP = "__"
1313
14-let POOLWEIGHTMULT = MULT8
15-
16-func asAnyList (val) = match val {
17- case valAnyLyst: List[Any] =>
18- valAnyLyst
19- case _ =>
20- throw("fail to cast into List[Any]")
21-}
22-
23-
24-func asByteVector (val) = match val {
25- case valBin: ByteVector =>
26- valBin
27- case _ =>
28- throw("fail to cast into Int")
29-}
30-
31-
3214 func getStringOrFail (key) = valueOrErrorMessage(getString(key), (("mandatory this." + key) + " is not defined"))
3315
3416
3618
3719
3820 func getIntOrZero (address,key) = valueOrElse(getInteger(address, key), 0)
39-
40-
41-func getIntOrDefault (address,key,defaultVal) = valueOrElse(getInteger(address, key), defaultVal)
4221
4322
4423 func getIntOrFail (address,key) = valueOrErrorMessage(getInteger(address, key), (("mandatory this." + key) + " is not defined"))
11594 func keyStakedTotal (lpAssetIdStr) = ("%s%s%s__staked__total__" + lpAssetIdStr)
11695
11796
118-func keyClaimedByUser (userAddressStr,lpAssetIdStr) = makeString(["%s%s%s__claimed", userAddressStr, lpAssetIdStr], SEP)
119-
120-
121-func keyClaimedTotal (lpAssetIdStr) = makeString(["%s%s%s__claimed", "total", lpAssetIdStr], SEP)
122-
123-
12497 func readStaked (key) = valueOrElse(getInteger(this, key), 0)
125-
126-
127-func keyLastTotalLpBalance (lpAssetId) = makeString(["%s%s%s", lpAssetId, "total", "bal"], SEP)
128-
129-
130-func keyLastUserLpBalance (lpAssetId,userAddress) = makeString(["%s%s%s", lpAssetId, userAddress, "bal"], SEP)
131-
132-
133-func keyTotalLpBalanceIntegral (lpAssetId) = makeString(["%s%s%s", lpAssetId, "total", "balINT"], SEP)
134-
135-
136-func keyUserLpBalanceIntegral (lpAssetId,userAddress) = makeString(["%s%s%s", lpAssetId, userAddress, "balINT"], SEP)
137-
138-
139-func keyTotalLpBalanceIntegralLastUpdHeight (lpAssetId) = makeString(["%s%s%s", lpAssetId, "total", "lastUpd"], SEP)
140-
141-
142-func keyUserLpBalanceIntegralLastUpdHeight (lpAssetId,userAddress) = makeString(["%s%s%s", lpAssetId, userAddress, "lastUpd"], SEP)
143-
144-
145-func keyWxPerLpIntegral (lpAssetId) = makeString(["%s%s%s%s", lpAssetId, "common", "lpInt"], SEP)
146-
147-
148-func keyWxPerLpIntegralLastUpdHeight (lpAssetId) = makeString(["%s%s%s%s", lpAssetId, "common", "lpIntH"], SEP)
149-
150-
151-func keyWxToClaimUser (lpAssetId,userAddress) = makeString(["%s%s%s%s", lpAssetId, userAddress, "lpInt"], SEP)
152-
153-
154-func keyWxPerLpIntegralUserLastUpdHeight (lpAssetId,userAddress) = makeString(["%s%s%s%s", lpAssetId, userAddress, "lpIntH"], SEP)
155-
156-
157-func keyWxPerLp (lpAssetId) = makeString(["%s", lpAssetId, "wxPerLp"], SEP)
158-
159-
160-func keyWxPerLpIntegralUserLast (lpAssetId,userAddress) = makeString(["%s%s%s%s", lpAssetId, userAddress, "uIntL"], SEP)
16198
16299
163100 func keyOperationHistoryRecord (type,userAddress,txId58) = makeString(["%s%s%s%s__history", type, userAddress, txId58], SEP)
169106 func OperationHistoryEntry (type,userAddress,lpAssetId,amount,txId) = StringEntry(keyOperationHistoryRecord(type, userAddress, toBase58String(txId)), formatHistoryRecord(userAddress, lpAssetId, type, amount))
170107
171108
172-let factoryContract = readFactoryAddressOrFail()
173-
174-let factoryCfg = readFactoryCfgOrFail(factoryContract)
175-
176-let emissionContract = getEmissionAddressOrFail(factoryCfg)
177-
178-func calcWxPerLpIntegralUserLast (stakedByUser,wxPerLpIntegralUserLastUpdHeightOrZero,wxPerLpIntegralNew,wxPerLpIntegralUserLastKEY) = if (if ((wxPerLpIntegralUserLastUpdHeightOrZero == 0))
179- then (stakedByUser > 0)
180- else false)
181- then 0
182- else if ((stakedByUser == 0))
183- then wxPerLpIntegralNew
184- else if (if ((wxPerLpIntegralUserLastUpdHeightOrZero > 0))
185- then (stakedByUser > 0)
186- else false)
187- then getIntOrFail(this, wxPerLpIntegralUserLastKEY)
188- else throw("calcWxPerLpIntegralUserLast: unexpected state")
189-
190-
191-func refreshINTEGRALS (lpAssetIdStr,userAddressStr,poolAddressStr,lpDeltaAmount) = {
192- let stakedByUserKEY = keyStakedByUser(userAddressStr, lpAssetIdStr)
193- let stakedTotalKEY = keyStakedTotal(lpAssetIdStr)
194- let stakedByUser = readStaked(stakedByUserKEY)
195- let stakedTotal = readStaked(stakedTotalKEY)
196- let poolWeight = getIntegerValue(factoryContract, keyFactoryPoolWeight(poolAddressStr))
197- let emissionStartBlock = getIntOrFail(emissionContract, keyEmissionStartBlock())
198- let wxEmissionPerBlock = getIntOrFail(emissionContract, keyEmissionRatePerBlockCurrent())
199- let poolWxEmissionPerBlock = fraction(wxEmissionPerBlock, poolWeight, POOLWEIGHTMULT)
200- let wxPerLpIntegralKEY = keyWxPerLpIntegral(lpAssetIdStr)
201- let wxPerLpIntegralLastUpdHeightKEY = keyWxPerLpIntegralLastUpdHeight(lpAssetIdStr)
202- let wxToClaimUserKEY = keyWxToClaimUser(lpAssetIdStr, userAddressStr)
203- let wxPerLpIntegralUserLastUpdHeightKEY = keyWxPerLpIntegralUserLastUpdHeight(lpAssetIdStr, userAddressStr)
204- let wxPerLpKEY = keyWxPerLp(lpAssetIdStr)
205- let wxPerLpIntegralUserLastKEY = keyWxPerLpIntegralUserLast(lpAssetIdStr, userAddressStr)
206- let wxPerLpIntegralLastUpdHeight = getIntOrDefault(this, wxPerLpIntegralLastUpdHeightKEY, emissionStartBlock)
207- let wxPerLpIntegral = getIntOrZero(this, wxPerLpIntegralKEY)
208- let wxToClaimUser = getIntOrZero(this, wxToClaimUserKEY)
209- let wxPerLpIntegralUserLastUpdHeightOrZero = getIntOrZero(this, wxPerLpIntegralUserLastUpdHeightKEY)
210- let wxPerLpOrZero = getIntOrZero(this, wxPerLpKEY)
211- let dh = max([(height - wxPerLpIntegralLastUpdHeight), 0])
212- let wxPerLp = if ((wxPerLpOrZero != 0))
213- then wxPerLpOrZero
214- else fraction(poolWxEmissionPerBlock, MULT8, stakedTotal)
215- let stakedTotalNew = (stakedTotal + lpDeltaAmount)
216- let wxPerLpIntegralNew = (wxPerLpIntegral + (wxPerLp * dh))
217- let wxPerLpIntegralUserLast = calcWxPerLpIntegralUserLast(stakedByUser, wxPerLpIntegralUserLastUpdHeightOrZero, wxPerLpIntegralNew, wxPerLpIntegralUserLastKEY)
218- let wxToClaimUserNew = (wxToClaimUser + fraction((wxPerLpIntegralNew - wxPerLpIntegralUserLast), stakedByUser, MULT8))
219- let wxPerLpIntegralUserLastNew = wxPerLpIntegralNew
220- let wxPerLpNew = (poolWxEmissionPerBlock / stakedTotalNew)
221- let wxPerLpIntegralLastUpdHeightNew = height
222- let wxPerLpIntegralUserLastUpdHeightNew = height
223- let debug = makeString([toString(wxToClaimUserNew), toString(wxPerLpIntegralNew), toString(wxPerLpIntegralUserLast), toString(stakedByUser), toString(dh), toString(wxPerLp), toString(stakedTotal), toString(poolWxEmissionPerBlock), toString(wxEmissionPerBlock), toString(poolWeight), toString(height)], "::")
224- $Tuple3(wxToClaimUserNew, [IntegerEntry(wxPerLpIntegralKEY, wxPerLpIntegralNew), IntegerEntry(wxPerLpIntegralLastUpdHeightKEY, wxPerLpIntegralLastUpdHeightNew), IntegerEntry(wxToClaimUserKEY, wxToClaimUserNew), IntegerEntry(wxPerLpIntegralUserLastUpdHeightKEY, wxPerLpIntegralUserLastUpdHeightNew), IntegerEntry(wxPerLpKEY, wxPerLpNew), IntegerEntry(wxPerLpIntegralUserLastKEY, wxPerLpIntegralUserLastNew)], debug)
225- }
226-
227-
228109 @Callable(i)
229110 func constructor (factoryAddressStr) = if ((i.caller != this))
230111 then throw("not authorized")
233114
234115
235116 @Callable(i)
236-func stake () = if ((size(i.payments) != 1))
237- then throw("invalid payment - exact one payment must be attached")
238- else {
239- let pmt = i.payments[0]
240- let lpAssetId = value(pmt.assetId)
241- let lpAssetIdStr = toBase58String(lpAssetId)
242- let amount = pmt.amount
243- let poolAddressStr = valueOrErrorMessage(getString(factoryContract, keyFactoryLp2AssetsMapping(lpAssetIdStr)), ("unsupported lp asset " + lpAssetIdStr))
244- let callerStr = toString(i.caller)
245- let userAddressStr = if ((callerStr == poolAddressStr))
246- then toString(i.originCaller)
247- else callerStr
248- let stakedByUserKEY = keyStakedByUser(userAddressStr, lpAssetIdStr)
249- let stakedTotalKEY = keyStakedTotal(lpAssetIdStr)
250- let stakedByUser = readStaked(stakedByUserKEY)
251- let stakedTotal = readStaked(stakedTotalKEY)
252- let $t01155411671 = refreshINTEGRALS(lpAssetIdStr, userAddressStr, poolAddressStr, amount)
253- let wxToClaimUserNew = $t01155411671._1
254- let integralSTATE = $t01155411671._2
255- let debug = $t01155411671._3
256- ([IntegerEntry(stakedByUserKEY, (stakedByUser + amount)), IntegerEntry(stakedTotalKEY, (stakedTotal + amount)), OperationHistoryEntry("stake", userAddressStr, lpAssetIdStr, amount, i.transactionId)] ++ integralSTATE)
257- }
258-
259-
260-
261-@Callable(i)
262-func unstake (lpAssetIdStr,amount) = {
263- let userAddressStr = toString(i.caller)
264- let lpAssetId = fromBase58String(lpAssetIdStr)
265- let poolAddressStr = valueOrErrorMessage(getString(factoryContract, keyFactoryLp2AssetsMapping(lpAssetIdStr)), ("unsupported lp asset " + lpAssetIdStr))
266- let stakedByUserKEY = keyStakedByUser(userAddressStr, lpAssetIdStr)
267- let stakedTotalKEY = keyStakedTotal(lpAssetIdStr)
268- let stakedByUser = readStaked(stakedByUserKEY)
269- let stakedTotal = readStaked(stakedTotalKEY)
270- let $t01248812606 = refreshINTEGRALS(lpAssetIdStr, userAddressStr, poolAddressStr, -(amount))
271- let wxToClaimUserNew = $t01248812606._1
272- let integralSTATE = $t01248812606._2
273- let debug = $t01248812606._3
274- if ((amount > stakedByUser))
275- then throw("passed amount is less then available")
276- else ([IntegerEntry(stakedByUserKEY, (stakedByUser - amount)), IntegerEntry(stakedTotalKEY, (stakedTotal - amount)), ScriptTransfer(i.caller, amount, lpAssetId), OperationHistoryEntry("unstake", userAddressStr, lpAssetIdStr, amount, i.transactionId)] ++ integralSTATE)
277- }
278-
279-
280-
281-@Callable(i)
282-func claimWx (lpAssetIdStr) = {
283- let userAddress = i.caller
284- let userAddressStr = toString(i.caller)
285- let poolAddressStr = getStringByAddressOrFail(factoryContract, keyFactoryLpAssetToPoolContractAddress(lpAssetIdStr))
286- let claimedByUserKEY = keyClaimedByUser(lpAssetIdStr, userAddressStr)
287- let claimedTotalKEY = keyClaimedTotal(lpAssetIdStr)
288- let claimedByUser = getIntOrZero(this, claimedByUserKEY)
289- let claimedTotal = getIntOrZero(this, claimedTotalKEY)
290- let $t01345813570 = refreshINTEGRALS(lpAssetIdStr, userAddressStr, poolAddressStr, 0)
291- let wxToClaimUserNew = $t01345813570._1
292- let integralSTATE = $t01345813570._2
293- let debug = $t01345813570._3
294- let availableToClaim = (wxToClaimUserNew - claimedByUser)
295- if ((0 >= availableToClaim))
296- then throw("nothing to claim")
117+func stake () = {
118+ let factory = readFactoryAddressOrFail()
119+ if ((size(i.payments) != 1))
120+ then throw("invalid payment - exact one payment must be attached")
297121 else {
298- let wxAssetId = asByteVector(asAnyList(invoke(emissionContract, "emit", [availableToClaim], nil))[0])
299-[IntegerEntry(claimedByUserKEY, (claimedByUser + availableToClaim)), IntegerEntry(claimedTotalKEY, (claimedTotal + availableToClaim)), ScriptTransfer(userAddress, availableToClaim, wxAssetId), OperationHistoryEntry("claim", userAddressStr, lpAssetIdStr, availableToClaim, i.transactionId)]
122+ let pmt = i.payments[0]
123+ let lpAssetId = value(pmt.assetId)
124+ let lpAssetIdStr = toBase58String(lpAssetId)
125+ let amount = pmt.amount
126+ let lpDappStr = valueOrErrorMessage(getString(factory, keyFactoryLp2AssetsMapping(lpAssetIdStr)), ("unsupported lp asset " + lpAssetIdStr))
127+ let callerStr = toString(i.caller)
128+ let userAddressStr = if ((callerStr == lpDappStr))
129+ then toString(i.originCaller)
130+ else callerStr
131+ let stakedByUserKEY = keyStakedByUser(userAddressStr, lpAssetIdStr)
132+ let stakedTotalKEY = keyStakedTotal(lpAssetIdStr)
133+ let stakedByUser = readStaked(stakedByUserKEY)
134+ let stakedTotal = readStaked(stakedTotalKEY)
135+[IntegerEntry(stakedByUserKEY, (stakedByUser + amount)), IntegerEntry(stakedTotalKEY, (stakedTotal + amount)), OperationHistoryEntry("stake", userAddressStr, lpAssetIdStr, amount, i.transactionId)]
300136 }
301137 }
302138
303139
304140
305141 @Callable(i)
306-func claimWxREADONLY (lpAssetIdStr,userAddressStr) = {
307- let stakedByUserKEY = keyStakedByUser(userAddressStr, lpAssetIdStr)
142+func unstake (lpAssetIdStr,amount) = {
143+ let factory = readFactoryAddressOrFail()
144+ let userAddressStr = toString(i.caller)
145+ let lpAssetId = fromBase58String(lpAssetIdStr)
146+ if (!(isDefined(getString(factory, keyFactoryLp2AssetsMapping(lpAssetIdStr)))))
147+ then throw(("unsupported lp asset " + lpAssetIdStr))
148+ else {
149+ let stakedByUserKEY = keyStakedByUser(userAddressStr, lpAssetIdStr)
150+ let stakedTotalKEY = keyStakedTotal(lpAssetIdStr)
151+ let stakedByUser = readStaked(stakedByUserKEY)
152+ let stakedTotal = readStaked(stakedTotalKEY)
153+ if ((amount > stakedByUser))
154+ then throw("passed amount is less then available")
155+ else [IntegerEntry(stakedByUserKEY, (stakedByUser - amount)), IntegerEntry(stakedTotalKEY, (stakedTotal - amount)), ScriptTransfer(i.caller, amount, lpAssetId), OperationHistoryEntry("unstake", userAddressStr, lpAssetIdStr, amount, i.transactionId)]
156+ }
157+ }
158+
159+
160+
161+@Callable(i)
162+func claimWx (lpAssetIdStr) = throw("temorary disabled")
163+
164+
165+
166+@Callable(i)
167+func claimWxREADONLY (lpAssetIdStr,userAddress) = {
168+ let factoryContract = readFactoryAddressOrFail()
169+ let factoryCfg = readFactoryCfgOrFail(factoryContract)
170+ let emissionContract = getEmissionAddressOrFail(factoryCfg)
171+ let stakedByUserKEY = keyStakedByUser(userAddress, lpAssetIdStr)
308172 let stakedTotalKEY = keyStakedTotal(lpAssetIdStr)
309- let claimedByUserKEY = keyClaimedByUser(lpAssetIdStr, userAddressStr)
310173 let stakedByUser = readStaked(stakedByUserKEY)
311174 let stakedTotal = readStaked(stakedTotalKEY)
312- let claimedByUser = getIntOrZero(this, claimedByUserKEY)
313175 let poolAddressStr = getStringByAddressOrFail(factoryContract, keyFactoryLpAssetToPoolContractAddress(lpAssetIdStr))
314176 let poolWeightMult = MULT8
315177 let poolWeight = getIntegerValue(factoryContract, keyFactoryPoolWeight(poolAddressStr))
320182 else (height - emissionStartBlock)
321183 let poolWxEmission = fraction((wxEmissionPerBlock * passedBlocks), poolWeight, poolWeightMult)
322184 let userWxReward = fraction(poolWxEmission, stakedByUser, stakedTotal)
323- let $t01523915351 = refreshINTEGRALS(lpAssetIdStr, userAddressStr, poolAddressStr, 0)
324- let wxToClaimUserNew = $t01523915351._1
325- let integralSTATE = $t01523915351._2
326- let debug = $t01523915351._3
327- let availableToClaim = (wxToClaimUserNew - claimedByUser)
328- $Tuple2(nil, makeString(["%s%s%d%d%s", lpAssetIdStr, userAddressStr, toString(availableToClaim), toString(claimedByUser), ((debug + "::") + toString(userWxReward))], SEP))
185+ $Tuple2(nil, makeString(["%s%s%d", lpAssetIdStr, userAddress, toString(userWxReward)], SEP))
329186 }
330187
331188
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SCALE8 = 8
55
66 let MULT8 = 100000000
77
88 let SCALE18 = 18
99
1010 let MULT18 = toBigInt(1000000000000000000)
1111
1212 let SEP = "__"
1313
14-let POOLWEIGHTMULT = MULT8
15-
16-func asAnyList (val) = match val {
17- case valAnyLyst: List[Any] =>
18- valAnyLyst
19- case _ =>
20- throw("fail to cast into List[Any]")
21-}
22-
23-
24-func asByteVector (val) = match val {
25- case valBin: ByteVector =>
26- valBin
27- case _ =>
28- throw("fail to cast into Int")
29-}
30-
31-
3214 func getStringOrFail (key) = valueOrErrorMessage(getString(key), (("mandatory this." + key) + " is not defined"))
3315
3416
3517 func getStringByAddressOrFail (address,key) = valueOrErrorMessage(getString(address, key), (((("mandatory " + toString(address)) + ".") + key) + " is not defined"))
3618
3719
3820 func getIntOrZero (address,key) = valueOrElse(getInteger(address, key), 0)
39-
40-
41-func getIntOrDefault (address,key,defaultVal) = valueOrElse(getInteger(address, key), defaultVal)
4221
4322
4423 func getIntOrFail (address,key) = valueOrErrorMessage(getInteger(address, key), (("mandatory this." + key) + " is not defined"))
4524
4625
4726 func keyFactoryAddress () = "%s%s__config__factoryAddress"
4827
4928
5029 let IdxFactoryCfgStakingDapp = 1
5130
5231 let IdxFactoryCfgBoostingDapp = 2
5332
5433 let IdxFactoryCfgIdoDapp = 3
5534
5635 let IdxFactoryCfgTeamDapp = 4
5736
5837 let IdxFactoryCfgEmissionDapp = 5
5938
6039 let IdxFactoryCfgRestDapp = 6
6140
6241 let IdxFactoryCfgSlippageDapp = 7
6342
6443 func keyFactoryCfg () = "%s__factoryConfig"
6544
6645
6746 func keyFactoryLp2AssetsMapping (lpAssetStr) = makeString(["%s%s%s", lpAssetStr, "mappings__lpAsset2PoolContract"], SEP)
6847
6948
7049 func keyFactoryLpList () = "%s__lpTokensList"
7150
7251
7352 func keyFactoryLpAssetToPoolContractAddress (lpAssetStr) = makeString(["%s%s%s", lpAssetStr, "mappings__lpAsset2PoolContract"], SEP)
7453
7554
7655 func keyFactoryPoolWeight (contractAddress) = makeString(["%s%s", "poolWeight", contractAddress], SEP)
7756
7857
7958 func readFactoryAddressOrFail () = addressFromStringValue(getStringOrFail(keyFactoryAddress()))
8059
8160
8261 func readLpList () = split(valueOrElse(getString(readFactoryAddressOrFail(), keyFactoryLpList()), ""), SEP)
8362
8463
8564 func readFactoryCfgOrFail (factory) = split(getStringByAddressOrFail(factory, keyFactoryCfg()), SEP)
8665
8766
8867 func getBoostingAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgBoostingDapp])
8968
9069
9170 func getEmissionAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgEmissionDapp])
9271
9372
9473 func getStakingAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgStakingDapp])
9574
9675
9776 func keyEmissionRatePerBlockCurrent () = "%s%s__ratePerBlock__current"
9877
9978
10079 func keyEmissionRatePerBlockMaxCurrent () = "%s%s__ratePerBlockMax__current"
10180
10281
10382 func keyEmissionStartBlock () = "%s%s__emission__startBlock"
10483
10584
10685 func keyEmissionDurationInBlocks () = "%s%s__emission__duration"
10786
10887
10988 func keyEmissionEndBlock () = "%s%s__emission__endBlock"
11089
11190
11291 func keyStakedByUser (userAddressStr,lpAssetIdStr) = makeString(["%s%s%s__staked", userAddressStr, lpAssetIdStr], SEP)
11392
11493
11594 func keyStakedTotal (lpAssetIdStr) = ("%s%s%s__staked__total__" + lpAssetIdStr)
11695
11796
118-func keyClaimedByUser (userAddressStr,lpAssetIdStr) = makeString(["%s%s%s__claimed", userAddressStr, lpAssetIdStr], SEP)
119-
120-
121-func keyClaimedTotal (lpAssetIdStr) = makeString(["%s%s%s__claimed", "total", lpAssetIdStr], SEP)
122-
123-
12497 func readStaked (key) = valueOrElse(getInteger(this, key), 0)
125-
126-
127-func keyLastTotalLpBalance (lpAssetId) = makeString(["%s%s%s", lpAssetId, "total", "bal"], SEP)
128-
129-
130-func keyLastUserLpBalance (lpAssetId,userAddress) = makeString(["%s%s%s", lpAssetId, userAddress, "bal"], SEP)
131-
132-
133-func keyTotalLpBalanceIntegral (lpAssetId) = makeString(["%s%s%s", lpAssetId, "total", "balINT"], SEP)
134-
135-
136-func keyUserLpBalanceIntegral (lpAssetId,userAddress) = makeString(["%s%s%s", lpAssetId, userAddress, "balINT"], SEP)
137-
138-
139-func keyTotalLpBalanceIntegralLastUpdHeight (lpAssetId) = makeString(["%s%s%s", lpAssetId, "total", "lastUpd"], SEP)
140-
141-
142-func keyUserLpBalanceIntegralLastUpdHeight (lpAssetId,userAddress) = makeString(["%s%s%s", lpAssetId, userAddress, "lastUpd"], SEP)
143-
144-
145-func keyWxPerLpIntegral (lpAssetId) = makeString(["%s%s%s%s", lpAssetId, "common", "lpInt"], SEP)
146-
147-
148-func keyWxPerLpIntegralLastUpdHeight (lpAssetId) = makeString(["%s%s%s%s", lpAssetId, "common", "lpIntH"], SEP)
149-
150-
151-func keyWxToClaimUser (lpAssetId,userAddress) = makeString(["%s%s%s%s", lpAssetId, userAddress, "lpInt"], SEP)
152-
153-
154-func keyWxPerLpIntegralUserLastUpdHeight (lpAssetId,userAddress) = makeString(["%s%s%s%s", lpAssetId, userAddress, "lpIntH"], SEP)
155-
156-
157-func keyWxPerLp (lpAssetId) = makeString(["%s", lpAssetId, "wxPerLp"], SEP)
158-
159-
160-func keyWxPerLpIntegralUserLast (lpAssetId,userAddress) = makeString(["%s%s%s%s", lpAssetId, userAddress, "uIntL"], SEP)
16198
16299
163100 func keyOperationHistoryRecord (type,userAddress,txId58) = makeString(["%s%s%s%s__history", type, userAddress, txId58], SEP)
164101
165102
166103 func formatHistoryRecord (userAddress,lpAssetId,type,amount) = makeString(["%s%s%s%d%d%d", userAddress, lpAssetId, type, toString(height), toString(lastBlock.timestamp), toString(amount)], SEP)
167104
168105
169106 func OperationHistoryEntry (type,userAddress,lpAssetId,amount,txId) = StringEntry(keyOperationHistoryRecord(type, userAddress, toBase58String(txId)), formatHistoryRecord(userAddress, lpAssetId, type, amount))
170107
171108
172-let factoryContract = readFactoryAddressOrFail()
173-
174-let factoryCfg = readFactoryCfgOrFail(factoryContract)
175-
176-let emissionContract = getEmissionAddressOrFail(factoryCfg)
177-
178-func calcWxPerLpIntegralUserLast (stakedByUser,wxPerLpIntegralUserLastUpdHeightOrZero,wxPerLpIntegralNew,wxPerLpIntegralUserLastKEY) = if (if ((wxPerLpIntegralUserLastUpdHeightOrZero == 0))
179- then (stakedByUser > 0)
180- else false)
181- then 0
182- else if ((stakedByUser == 0))
183- then wxPerLpIntegralNew
184- else if (if ((wxPerLpIntegralUserLastUpdHeightOrZero > 0))
185- then (stakedByUser > 0)
186- else false)
187- then getIntOrFail(this, wxPerLpIntegralUserLastKEY)
188- else throw("calcWxPerLpIntegralUserLast: unexpected state")
189-
190-
191-func refreshINTEGRALS (lpAssetIdStr,userAddressStr,poolAddressStr,lpDeltaAmount) = {
192- let stakedByUserKEY = keyStakedByUser(userAddressStr, lpAssetIdStr)
193- let stakedTotalKEY = keyStakedTotal(lpAssetIdStr)
194- let stakedByUser = readStaked(stakedByUserKEY)
195- let stakedTotal = readStaked(stakedTotalKEY)
196- let poolWeight = getIntegerValue(factoryContract, keyFactoryPoolWeight(poolAddressStr))
197- let emissionStartBlock = getIntOrFail(emissionContract, keyEmissionStartBlock())
198- let wxEmissionPerBlock = getIntOrFail(emissionContract, keyEmissionRatePerBlockCurrent())
199- let poolWxEmissionPerBlock = fraction(wxEmissionPerBlock, poolWeight, POOLWEIGHTMULT)
200- let wxPerLpIntegralKEY = keyWxPerLpIntegral(lpAssetIdStr)
201- let wxPerLpIntegralLastUpdHeightKEY = keyWxPerLpIntegralLastUpdHeight(lpAssetIdStr)
202- let wxToClaimUserKEY = keyWxToClaimUser(lpAssetIdStr, userAddressStr)
203- let wxPerLpIntegralUserLastUpdHeightKEY = keyWxPerLpIntegralUserLastUpdHeight(lpAssetIdStr, userAddressStr)
204- let wxPerLpKEY = keyWxPerLp(lpAssetIdStr)
205- let wxPerLpIntegralUserLastKEY = keyWxPerLpIntegralUserLast(lpAssetIdStr, userAddressStr)
206- let wxPerLpIntegralLastUpdHeight = getIntOrDefault(this, wxPerLpIntegralLastUpdHeightKEY, emissionStartBlock)
207- let wxPerLpIntegral = getIntOrZero(this, wxPerLpIntegralKEY)
208- let wxToClaimUser = getIntOrZero(this, wxToClaimUserKEY)
209- let wxPerLpIntegralUserLastUpdHeightOrZero = getIntOrZero(this, wxPerLpIntegralUserLastUpdHeightKEY)
210- let wxPerLpOrZero = getIntOrZero(this, wxPerLpKEY)
211- let dh = max([(height - wxPerLpIntegralLastUpdHeight), 0])
212- let wxPerLp = if ((wxPerLpOrZero != 0))
213- then wxPerLpOrZero
214- else fraction(poolWxEmissionPerBlock, MULT8, stakedTotal)
215- let stakedTotalNew = (stakedTotal + lpDeltaAmount)
216- let wxPerLpIntegralNew = (wxPerLpIntegral + (wxPerLp * dh))
217- let wxPerLpIntegralUserLast = calcWxPerLpIntegralUserLast(stakedByUser, wxPerLpIntegralUserLastUpdHeightOrZero, wxPerLpIntegralNew, wxPerLpIntegralUserLastKEY)
218- let wxToClaimUserNew = (wxToClaimUser + fraction((wxPerLpIntegralNew - wxPerLpIntegralUserLast), stakedByUser, MULT8))
219- let wxPerLpIntegralUserLastNew = wxPerLpIntegralNew
220- let wxPerLpNew = (poolWxEmissionPerBlock / stakedTotalNew)
221- let wxPerLpIntegralLastUpdHeightNew = height
222- let wxPerLpIntegralUserLastUpdHeightNew = height
223- let debug = makeString([toString(wxToClaimUserNew), toString(wxPerLpIntegralNew), toString(wxPerLpIntegralUserLast), toString(stakedByUser), toString(dh), toString(wxPerLp), toString(stakedTotal), toString(poolWxEmissionPerBlock), toString(wxEmissionPerBlock), toString(poolWeight), toString(height)], "::")
224- $Tuple3(wxToClaimUserNew, [IntegerEntry(wxPerLpIntegralKEY, wxPerLpIntegralNew), IntegerEntry(wxPerLpIntegralLastUpdHeightKEY, wxPerLpIntegralLastUpdHeightNew), IntegerEntry(wxToClaimUserKEY, wxToClaimUserNew), IntegerEntry(wxPerLpIntegralUserLastUpdHeightKEY, wxPerLpIntegralUserLastUpdHeightNew), IntegerEntry(wxPerLpKEY, wxPerLpNew), IntegerEntry(wxPerLpIntegralUserLastKEY, wxPerLpIntegralUserLastNew)], debug)
225- }
226-
227-
228109 @Callable(i)
229110 func constructor (factoryAddressStr) = if ((i.caller != this))
230111 then throw("not authorized")
231112 else [StringEntry(keyFactoryAddress(), factoryAddressStr)]
232113
233114
234115
235116 @Callable(i)
236-func stake () = if ((size(i.payments) != 1))
237- then throw("invalid payment - exact one payment must be attached")
238- else {
239- let pmt = i.payments[0]
240- let lpAssetId = value(pmt.assetId)
241- let lpAssetIdStr = toBase58String(lpAssetId)
242- let amount = pmt.amount
243- let poolAddressStr = valueOrErrorMessage(getString(factoryContract, keyFactoryLp2AssetsMapping(lpAssetIdStr)), ("unsupported lp asset " + lpAssetIdStr))
244- let callerStr = toString(i.caller)
245- let userAddressStr = if ((callerStr == poolAddressStr))
246- then toString(i.originCaller)
247- else callerStr
248- let stakedByUserKEY = keyStakedByUser(userAddressStr, lpAssetIdStr)
249- let stakedTotalKEY = keyStakedTotal(lpAssetIdStr)
250- let stakedByUser = readStaked(stakedByUserKEY)
251- let stakedTotal = readStaked(stakedTotalKEY)
252- let $t01155411671 = refreshINTEGRALS(lpAssetIdStr, userAddressStr, poolAddressStr, amount)
253- let wxToClaimUserNew = $t01155411671._1
254- let integralSTATE = $t01155411671._2
255- let debug = $t01155411671._3
256- ([IntegerEntry(stakedByUserKEY, (stakedByUser + amount)), IntegerEntry(stakedTotalKEY, (stakedTotal + amount)), OperationHistoryEntry("stake", userAddressStr, lpAssetIdStr, amount, i.transactionId)] ++ integralSTATE)
257- }
258-
259-
260-
261-@Callable(i)
262-func unstake (lpAssetIdStr,amount) = {
263- let userAddressStr = toString(i.caller)
264- let lpAssetId = fromBase58String(lpAssetIdStr)
265- let poolAddressStr = valueOrErrorMessage(getString(factoryContract, keyFactoryLp2AssetsMapping(lpAssetIdStr)), ("unsupported lp asset " + lpAssetIdStr))
266- let stakedByUserKEY = keyStakedByUser(userAddressStr, lpAssetIdStr)
267- let stakedTotalKEY = keyStakedTotal(lpAssetIdStr)
268- let stakedByUser = readStaked(stakedByUserKEY)
269- let stakedTotal = readStaked(stakedTotalKEY)
270- let $t01248812606 = refreshINTEGRALS(lpAssetIdStr, userAddressStr, poolAddressStr, -(amount))
271- let wxToClaimUserNew = $t01248812606._1
272- let integralSTATE = $t01248812606._2
273- let debug = $t01248812606._3
274- if ((amount > stakedByUser))
275- then throw("passed amount is less then available")
276- else ([IntegerEntry(stakedByUserKEY, (stakedByUser - amount)), IntegerEntry(stakedTotalKEY, (stakedTotal - amount)), ScriptTransfer(i.caller, amount, lpAssetId), OperationHistoryEntry("unstake", userAddressStr, lpAssetIdStr, amount, i.transactionId)] ++ integralSTATE)
277- }
278-
279-
280-
281-@Callable(i)
282-func claimWx (lpAssetIdStr) = {
283- let userAddress = i.caller
284- let userAddressStr = toString(i.caller)
285- let poolAddressStr = getStringByAddressOrFail(factoryContract, keyFactoryLpAssetToPoolContractAddress(lpAssetIdStr))
286- let claimedByUserKEY = keyClaimedByUser(lpAssetIdStr, userAddressStr)
287- let claimedTotalKEY = keyClaimedTotal(lpAssetIdStr)
288- let claimedByUser = getIntOrZero(this, claimedByUserKEY)
289- let claimedTotal = getIntOrZero(this, claimedTotalKEY)
290- let $t01345813570 = refreshINTEGRALS(lpAssetIdStr, userAddressStr, poolAddressStr, 0)
291- let wxToClaimUserNew = $t01345813570._1
292- let integralSTATE = $t01345813570._2
293- let debug = $t01345813570._3
294- let availableToClaim = (wxToClaimUserNew - claimedByUser)
295- if ((0 >= availableToClaim))
296- then throw("nothing to claim")
117+func stake () = {
118+ let factory = readFactoryAddressOrFail()
119+ if ((size(i.payments) != 1))
120+ then throw("invalid payment - exact one payment must be attached")
297121 else {
298- let wxAssetId = asByteVector(asAnyList(invoke(emissionContract, "emit", [availableToClaim], nil))[0])
299-[IntegerEntry(claimedByUserKEY, (claimedByUser + availableToClaim)), IntegerEntry(claimedTotalKEY, (claimedTotal + availableToClaim)), ScriptTransfer(userAddress, availableToClaim, wxAssetId), OperationHistoryEntry("claim", userAddressStr, lpAssetIdStr, availableToClaim, i.transactionId)]
122+ let pmt = i.payments[0]
123+ let lpAssetId = value(pmt.assetId)
124+ let lpAssetIdStr = toBase58String(lpAssetId)
125+ let amount = pmt.amount
126+ let lpDappStr = valueOrErrorMessage(getString(factory, keyFactoryLp2AssetsMapping(lpAssetIdStr)), ("unsupported lp asset " + lpAssetIdStr))
127+ let callerStr = toString(i.caller)
128+ let userAddressStr = if ((callerStr == lpDappStr))
129+ then toString(i.originCaller)
130+ else callerStr
131+ let stakedByUserKEY = keyStakedByUser(userAddressStr, lpAssetIdStr)
132+ let stakedTotalKEY = keyStakedTotal(lpAssetIdStr)
133+ let stakedByUser = readStaked(stakedByUserKEY)
134+ let stakedTotal = readStaked(stakedTotalKEY)
135+[IntegerEntry(stakedByUserKEY, (stakedByUser + amount)), IntegerEntry(stakedTotalKEY, (stakedTotal + amount)), OperationHistoryEntry("stake", userAddressStr, lpAssetIdStr, amount, i.transactionId)]
300136 }
301137 }
302138
303139
304140
305141 @Callable(i)
306-func claimWxREADONLY (lpAssetIdStr,userAddressStr) = {
307- let stakedByUserKEY = keyStakedByUser(userAddressStr, lpAssetIdStr)
142+func unstake (lpAssetIdStr,amount) = {
143+ let factory = readFactoryAddressOrFail()
144+ let userAddressStr = toString(i.caller)
145+ let lpAssetId = fromBase58String(lpAssetIdStr)
146+ if (!(isDefined(getString(factory, keyFactoryLp2AssetsMapping(lpAssetIdStr)))))
147+ then throw(("unsupported lp asset " + lpAssetIdStr))
148+ else {
149+ let stakedByUserKEY = keyStakedByUser(userAddressStr, lpAssetIdStr)
150+ let stakedTotalKEY = keyStakedTotal(lpAssetIdStr)
151+ let stakedByUser = readStaked(stakedByUserKEY)
152+ let stakedTotal = readStaked(stakedTotalKEY)
153+ if ((amount > stakedByUser))
154+ then throw("passed amount is less then available")
155+ else [IntegerEntry(stakedByUserKEY, (stakedByUser - amount)), IntegerEntry(stakedTotalKEY, (stakedTotal - amount)), ScriptTransfer(i.caller, amount, lpAssetId), OperationHistoryEntry("unstake", userAddressStr, lpAssetIdStr, amount, i.transactionId)]
156+ }
157+ }
158+
159+
160+
161+@Callable(i)
162+func claimWx (lpAssetIdStr) = throw("temorary disabled")
163+
164+
165+
166+@Callable(i)
167+func claimWxREADONLY (lpAssetIdStr,userAddress) = {
168+ let factoryContract = readFactoryAddressOrFail()
169+ let factoryCfg = readFactoryCfgOrFail(factoryContract)
170+ let emissionContract = getEmissionAddressOrFail(factoryCfg)
171+ let stakedByUserKEY = keyStakedByUser(userAddress, lpAssetIdStr)
308172 let stakedTotalKEY = keyStakedTotal(lpAssetIdStr)
309- let claimedByUserKEY = keyClaimedByUser(lpAssetIdStr, userAddressStr)
310173 let stakedByUser = readStaked(stakedByUserKEY)
311174 let stakedTotal = readStaked(stakedTotalKEY)
312- let claimedByUser = getIntOrZero(this, claimedByUserKEY)
313175 let poolAddressStr = getStringByAddressOrFail(factoryContract, keyFactoryLpAssetToPoolContractAddress(lpAssetIdStr))
314176 let poolWeightMult = MULT8
315177 let poolWeight = getIntegerValue(factoryContract, keyFactoryPoolWeight(poolAddressStr))
316178 let wxEmissionPerBlock = getIntOrFail(emissionContract, keyEmissionRatePerBlockCurrent())
317179 let emissionStartBlock = getIntOrFail(emissionContract, keyEmissionStartBlock())
318180 let passedBlocks = if ((emissionStartBlock > height))
319181 then 0
320182 else (height - emissionStartBlock)
321183 let poolWxEmission = fraction((wxEmissionPerBlock * passedBlocks), poolWeight, poolWeightMult)
322184 let userWxReward = fraction(poolWxEmission, stakedByUser, stakedTotal)
323- let $t01523915351 = refreshINTEGRALS(lpAssetIdStr, userAddressStr, poolAddressStr, 0)
324- let wxToClaimUserNew = $t01523915351._1
325- let integralSTATE = $t01523915351._2
326- let debug = $t01523915351._3
327- let availableToClaim = (wxToClaimUserNew - claimedByUser)
328- $Tuple2(nil, makeString(["%s%s%d%d%s", lpAssetIdStr, userAddressStr, toString(availableToClaim), toString(claimedByUser), ((debug + "::") + toString(userWxReward))], SEP))
185+ $Tuple2(nil, makeString(["%s%s%d", lpAssetIdStr, userAddress, toString(userWxReward)], SEP))
329186 }
330187
331188

github/deemru/w8io/c3f4982 
40.41 ms