tx · 7gHMLYbhBDXWsBx1p7fyP3bo9ytWYAeUxnFAT4MLdzym

3Mynj79w9PikhwUwMwFPk2vifkm8zkDt2Zt:  -0.02200000 Waves

2022.11.02 09:30 [2299123] smart account 3Mynj79w9PikhwUwMwFPk2vifkm8zkDt2Zt > SELF 0.00000000 Waves

{ "type": 13, "id": "7gHMLYbhBDXWsBx1p7fyP3bo9ytWYAeUxnFAT4MLdzym", "fee": 2200000, "feeAssetId": null, "timestamp": 1667370654481, "version": 1, "sender": "3Mynj79w9PikhwUwMwFPk2vifkm8zkDt2Zt", "senderPublicKey": "5195SwZ4ifX6bBstZ6tN31kEQFVHaKpFYLc1GCa3Myrh", "proofs": [ "3S1LSMrWxNMVofuoEoNkbxsyPX5KzVhDWsmyF7gjVtBi9Eww1jiCEhJXAw2AL93mjHeEoVPZW491YtmNNwuokCwg" ], "script": "base64:AAIFAAAAAAAADTAIAhIJCgcBAQEBAQgBEgASBAoCCAgSBAoCCAgSBAoCCAgSAwoBCBIAIg9nZXRTdHJpbmdPckZhaWwiA2tleSIDU0VQIghCVUZTQ0FMRSIGc2NhbGU4Igh0aHJvd0VyciIDbXNnIh1jb252ZXJ0UHJpY2VBc3NldEludG9JZG9Bc3NldCIQcHJpY2VBc3NldEFtb3VudCIOcHJpY2VBc3NldE1VTFQiBXByaWNlIglwcmljZU1VTFQiDGlkb0Fzc2V0TVVMVCIPYlByaWNlQXNzZXRNVUxUIg1iSWRvQXNzZXRNVUxUIg5iUHJpY2VBc3NldEJVRiIPYkFtb3VudEFzc2V0QlVGIg5JZHhDZmdJZG9TdGFydCIRSWR4Q2ZnSWRvRHVyYXRpb24iEElkeENmZ0NsYWltU3RhcnQiE0lkeENmZ0NsYWltRHVyYXRpb24iC0lkeENmZ1ByaWNlIg9JZHhDZmdQcmljZU11bHQiEElkeENmZ0lkb0Fzc2V0SWQiEklkeENmZ0lkb0Fzc2V0TXVsdCISSWR4Q2ZnUHJpY2VBc3NldElkIhRJZHhDZmdQcmljZUFzc2V0TXVsdCIVSWR4Q2ZnTWluSW52ZXN0QW1vdW50Ig1mcm9tYXRDb25maWdTIghpZG9TdGFydCILaWRvRHVyYXRpb24iCmNsYWltU3RhcnQiDWNsYWltRHVyYXRpb24iCXByaWNlTXVsdCIMaWRvQXNzZXRJZDU4IgxpZG9Bc3NldE11bHQiDnByaWNlQXNzZXRJZDU4Ig5wcmljZUFzc2V0TXVsdCIPbWluSW52ZXN0QW1vdW50IhN0b3RhbElkb0Fzc2V0VG9TZWxsIgxmcm9tYXRDb25maWciEUlkeEludlRvdGFsQW1vdW50IhVJZHhJbnZSZW1haW5pbmdBbW91bnQiHUlkeEludkNsYWltZWRQcmljZUFzc2V0QW1vdW50IhtJZHhJbnZDbGFpbWVkSWRvQXNzZXRBbW91bnQiF0lkeEludkxhc3RDbGFpbWVkSGVpZ2h0Ig9mb3JtYXRJbnZlc3RvclMiC3RvdGFsQW1vdW50Ig9yZW1haW5pbmdBbW91bnQiF2NsYWltZWRQcmljZUFzc2V0QW1vdW50IhVjbGFpbWVkSWRvQXNzZXRBbW91bnQiEWxhc3RDbGFpbWVkSGVpZ2h0Ig5mb3JtYXRJbnZlc3RvciITZm9ybWF0SGlzdG9yeVJlY29yZCIOaWRvQXNzZXRBbW91bnQiCWtleUNvbmZpZyILa2V5SW52ZXN0b3IiC3VzZXJBZGRyZXNzIglrZXlUb3RhbHMiGWtleU9wZXJhdGlvbkhpc3RvcnlSZWNvcmQiBHR5cGUiBnR4SWQ1OCIUa2V5VVNETkNsYWltRGlzYWJsZWQiFWtleVVTRE5DbGFpbUVuZEhlaWdodCIPa2V5UGVyaW9kTGVuZ3RoIhBrZXlDdXJybmV0UGVyaW9kIhRrZXlQZXJpb2RTdGFydEhlaWdodCIJcGVyaW9kTnVtIhJrZXlQZXJpb2RFbmRIZWlnaHQiH2tleVVzZHRQcmljZUFzc2V0QWxsb3dhYmxlUmF0aW8iF2tleVRvdGFsUGVyaW9kQWxsb3dhbmNlIgdhc3NldElkIhZrZXlVc2VyUGVyaW9kQWxsb3dhbmNlIh5rZXlQZXJpb2RUb3RhbEF2YWlsYWJsZVRvQ2xhaW0iHWtleVBlcmlvZFVzZXJBdmFpbGFibGVUb0NsYWltIhtrZXlVc2R0UHJpY2VBc3NldFN0YWJsZVBvb2wiDmtleVVzZHRBc3NldElkIhNrZXlNYW5hZ2VyUHVibGljS2V5IhprZXlQZW5kaW5nTWFuYWdlclB1YmxpY0tleSIPcmVhZENvbmZpZ0FycmF5IiNyZWFkVG90YWxzQXJyYXlPckRlZmF1bHRCeUN1c3RvbUtleSIJY3VzdG9tS2V5IhhyZWFkVG90YWxzQXJyYXlPckRlZmF1bHQiGnJlYWRJbnZlc3RvckFycmF5T3JEZWZhdWx0IhdyZWFkSW52ZXN0b3JBcnJheU9yRmFpbCIVSWR4RGlmZlRvdGFsSW5jcmVtZW50IiRJZHhEaWZmUmVtYWluaW5nUHJpY2VBbW91bnRJbmNyZW1lbnQiIklkeERpZmZDbGFpbWVkUHJpY2VBbW91bnRJbmNyZW1lbnQiJUlkeERpZmZDbGFpbWVkSWRvQXNzZXRBbW91bnRJbmNyZW1lbnQiC1RvdGFsc0VudHJ5IglvcmlnQXJyYXkiDWluY3JlbWVudERpZmYiFG5ld0xhc3RDbGFpbWVkSGVpZ2h0Ig5uZXdUb3RhbEFtb3VudCISbmV3UmVtYWluaW5nQW1vdW50IhpuZXdDbGFpbWVkUHJpY2VBc3NldEFtb3VudCIYbmV3Q2xhaW1lZElkb0Fzc2V0QW1vdW50IhtJbnZlc3RPcGVyYXRpb25IaXN0b3J5RW50cnkiBHR4SWQiGkNsYWltT3BlcmF0aW9uSGlzdG9yeUVudHJ5Ig1pbnRlcm5hbENsYWltIhBjbGFpbWVkQXNzZXRJZDU4IghjZmdBcnJheSIIY2xhaW1FbmQiCmlkb0Fzc2V0SWQiDHByaWNlQXNzZXRJZCINdXNlckFkZHJlc3M1OCIPb3JpZ0ludmVzdEFycmF5IhFpbnZlc3RUb3RhbEFtb3VudCIaaW52ZXN0TGFzdENsYWltZWRIZWlnaHRUTVAiF2ludmVzdExhc3RDbGFpbWVkSGVpZ2h0IhRuZXdDbGFpbVBlcmlvZEhlaWdodCIOY2xhaW1pbmdCbG9ja3MiGXRvdGFsVXNlckF2YWlsYWJsZVRvQ2xhaW0iFmNsYWltaW5nSWRvQXNzZXRBbW91bnQiBmlzVVNETiITaXNVU0ROQ2xhaW1EaXNhYmxlZCIQaXNVU0ROQ2xhaW1FbmRlZCIHJG1hdGNoMCIDZW5kIgZjaGVja3MiHnRvdGFsUGVyaW9kUHJpY2VBc3NldEFsbG93YW5jZSIddXNlclBlcmlvZFByaWNlQXNzZXRBbGxvd2FuY2UiDWN1cnJlbnRQZXJpb2QiG3BlcmlvZFRvdGFsQXZhaWxhYmxlVG9DbGFpbSIacGVyaW9kVXNlckF2YWlsYWJsZVRvQ2xhaW0iIWF2YWlsYWJsZUNsYWltaW5nUHJpY2VBc3NldEFtb3VudCIcdXNkdFByaWNlQXNzZXRBbGxvd2FibGVSYXRpbyIccHV0T25lVGtuVjJQcmljZUFzc2VzdEFtb3VudCINJHQwMTE2OTMxMTk0NSIBQCIFYm9udXMiCWZlZUFtb3VudCIIbHBBbW91bnQiC3VzZHRBc3NldElkIg0kdDAxMjAzNDEyMjUyIhRnZXRPbmVUa25WMkZlZUFtb3VudCIKdXNkdEFtb3VudCIaY3VycmVudFVzZHRQcmljZUFzc2V0UmF0aW8iE2VuZFBlcmlvZEJsb2Nrc0xlZnQiFm1hbmFnZXJQdWJsaWNLZXlPclVuaXQiAXMiHXBlbmRpbmdNYW5hZ2VyUHVibGljS2V5T3JVbml0IgttdXN0TWFuYWdlciIBaSICcGQiAnBrIgZpZG9FbmQiA3BtdCIMaWRvQXNzZXRJbmZvIg5wcmljZUFzc2V0SW5mbyIPb3JpZ1RvdGFsc0FycmF5Igp0b3RhbHNEaWZmIg5taW5JdmVzdEFtb3VudCIKcG10QXNzZXRJZCIJcG10QW1vdW50IhFvcmlnSW52ZXN0b3JBcnJheSITbmV3UHJpY2VUb3RhbEFtb3VudCIWcmVxdWlyZWRJZG9Bc3NldEFtb3VudCIPY2FsbGVyQWRkcmVzczU4IhBjbGFpbVJlc3VsdFR1cGxlIglvdXRBbW91bnQiCm91dEFzc2V0SWQiFWF2YWlsYWJsZVRvQ2xhaW1BcnJheSIfcGVyaW9kQXZhaWxhYmxlSWRvQW1vdW50VG9DbGFpbSIlcGVyaW9kQXZhaWxhYmxlVXNlclByaWNlQW1vdW50VG9DbGFpbSImcGVyaW9kQXZhaWxhYmxlVG90YWxQcmljZUFtb3VudFRvQ2xhaW0iGmNsYWltZWRQcmljZUFtb3VudEZyb21EaWZmIh1jbGFpbWVkSWRvQXNzZXRBbW91bnRGcm9tRGlmZiIbYXZhaWxhYmxlUHJpY2VBbW91bnRUb0NsYWltIhlhdmFpbGFibGVJZG9BbW91bnRUb0NsYWltIhZjdXJyZW50UHJpY2VBc3NldFJhdGlvIhJlbmRQcmlvZEJsb2Nrc0xlZnQiDHJlc3VsdFN0cmluZyIXcGVuZGluZ01hbmFnZXJQdWJsaWNLZXkiC2NoZWNrQ2FsbGVyIhVjaGVja01hbmFnZXJQdWJsaWNLZXkiAnBtIgVoYXNQTSIHY2hlY2tQTSICdHgiBnZlcmlmeSIPdGFyZ2V0UHVibGljS2V5AAAAPgEAAAABYQAAAAEAAAABYgkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEIgAAAAEFAAAAAWIJAAEsAAAAAgkAASwAAAACAgAAAA9tYW5kYXRvcnkgdGhpcy4FAAAAAWICAAAADyBpcyBub3QgZGVmaW5lZAAAAAABYwIAAAACX18AAAAAAWQJAAE2AAAAAQAN4Lazp2QAAAAAAAABZQAAAAAABfXhAAEAAAABZgAAAAEAAAABZwkAAAIAAAABCQAEuQAAAAIJAARMAAAA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", "chainId": 84, "height": 2299123, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 8voyBbNK7N3SXNsZfMDzyc3ZT5iv2anF3FjWUotpeGYU Next: none Diff:
OldNewDifferences
77 let SEP = "__"
88
99 let BUFSCALE = toBigInt(1000000000000000000)
10+
11+let scale8 = 100000000
12+
13+func throwErr (msg) = throw(makeString(["ido.ride:", msg], " "))
14+
1015
1116 func convertPriceAssetIntoIdoAsset (priceAssetAmount,priceAssetMULT,price,priceMULT,idoAssetMULT) = {
1217 let bPriceAssetMULT = toBigInt(priceAssetMULT)
8085
8186
8287 func keyUSDNClaimEndHeight () = "%s__usdnClaimEndHeight"
88+
89+
90+func keyPeriodLength () = makeString(["%s", "periodLength"], SEP)
91+
92+
93+func keyCurrnetPeriod () = makeString(["%s", "currentPeriod"], SEP)
94+
95+
96+func keyPeriodStartHeight (periodNum) = makeString(["%s%s", "periodStartHeight", toString(periodNum)], SEP)
97+
98+
99+func keyPeriodEndHeight (periodNum) = makeString(["%s%s", "periodEndHeight", toString(periodNum)], SEP)
100+
101+
102+func keyUsdtPriceAssetAllowableRatio () = makeString(["%s", "usdtPriceAssetAllowableRatio"], SEP)
103+
104+
105+func keyTotalPeriodAllowance (assetId) = makeString(["%s%s", "totalPeriodAllowance", assetId], SEP)
106+
107+
108+func keyUserPeriodAllowance (assetId) = makeString(["%s%s", "userPeriodAllowance", assetId], SEP)
109+
110+
111+func keyPeriodTotalAvailableToClaim (assetId,periodNum) = makeString(["%s%s%s", "periodTotalAvailableToClaim", assetId, toString(periodNum)], SEP)
112+
113+
114+func keyPeriodUserAvailableToClaim (assetId,periodNum,userAddress) = makeString(["%s%s%s%s", "periodUserAvailableToClaim", assetId, toString(periodNum), userAddress], SEP)
115+
116+
117+func keyUsdtPriceAssetStablePool () = makeString(["%s", "usdtPriceAssetStablePool"], SEP)
118+
119+
120+func keyUsdtAssetId () = makeString(["%s", "usdtAssetId"], SEP)
83121
84122
85123 func keyManagerPublicKey () = "%s__managerPublicKey"
159197 then claimStart
160198 else height
161199 let claimingBlocks = (newClaimPeriodHeight - investLastClaimedHeight)
162- let claimingPriceAssetAmount = fraction(investTotalAmount, claimingBlocks, claimDuration)
163- let claimingIdoAssetAmount = convertPriceAssetIntoIdoAsset(claimingPriceAssetAmount, priceAssetMult, price, priceMult, idoAssetMult)
200+ let totalUserAvailableToClaim = fraction(investTotalAmount, claimingBlocks, claimDuration)
201+ let claimingIdoAssetAmount = convertPriceAssetIntoIdoAsset(totalUserAvailableToClaim, priceAssetMult, price, priceMult, idoAssetMult)
164202 let isUSDN = (claimedAssetId58 == priceAssetId58)
165203 let isUSDNClaimDisabled = valueOrElse(getBoolean(keyUSDNClaimDisabled()), false)
166204 let isUSDNClaimEnded = match getInteger(keyUSDNClaimEndHeight()) {
175213 then isUSDNClaimDisabled
176214 else false))
177215 then true
178- else throw("USDN claim is disabled"), if (!(if (isUSDN)
216+ else throwErr("USDN claim is disabled"), if (!(if (isUSDN)
179217 then isUSDNClaimEnded
180218 else false))
181219 then true
182- else throw("USDN claim is ended")]
220+ else throwErr("USDN claim is ended")]
183221 if ((checks == checks))
184- then if ((claimedAssetId58 == priceAssetId58))
185- then $Tuple6([0, -(claimingPriceAssetAmount), claimingPriceAssetAmount, 0], claimingPriceAssetAmount, priceAssetId, origInvestArray, newClaimPeriodHeight, [claimingPriceAssetAmount, claimingIdoAssetAmount])
186- else if ((claimedAssetId58 == idoAssetId58))
187- then $Tuple6([0, -(claimingPriceAssetAmount), 0, claimingIdoAssetAmount], claimingIdoAssetAmount, idoAssetId, origInvestArray, newClaimPeriodHeight, [claimingPriceAssetAmount, claimingIdoAssetAmount])
188- else throw(("unsupported assetId: " + claimedAssetId58))
222+ then {
223+ let totalPeriodPriceAssetAllowance = value(getInteger(keyTotalPeriodAllowance(priceAssetId58)))
224+ let userPeriodPriceAssetAllowance = value(getInteger(keyUserPeriodAllowance(priceAssetId58)))
225+ let currentPeriod = valueOrElse(getInteger(keyCurrnetPeriod()), 0)
226+ let periodTotalAvailableToClaim = valueOrElse(getInteger(keyPeriodTotalAvailableToClaim(priceAssetId58, currentPeriod)), totalPeriodPriceAssetAllowance)
227+ let periodUserAvailableToClaim = valueOrElse(getInteger(keyPeriodUserAvailableToClaim(priceAssetId58, currentPeriod, userAddress58)), userPeriodPriceAssetAllowance)
228+ let availableClaimingPriceAssetAmount = min([totalUserAvailableToClaim, periodTotalAvailableToClaim, periodUserAvailableToClaim])
229+ let usdtPriceAssetAllowableRatio = value(getInteger(keyUsdtPriceAssetAllowableRatio()))
230+ let putOneTknV2PriceAssestAmount = scale8
231+ let $t01169311945 = {
232+ let @ = invoke(addressFromStringValue(value(getString(keyUsdtPriceAssetStablePool()))), "putOneTknV2WithoutTakeFeeREADONLY", [putOneTknV2PriceAssestAmount, priceAssetId], nil)
233+ if ($isInstanceOf(@, "(Int, Int, Int)"))
234+ then @
235+ else throw("Couldn't cast Any to (Int, Int, Int)")
236+ }
237+ if (($t01169311945 == $t01169311945))
238+ then {
239+ let bonus = $t01169311945._3
240+ let feeAmount = $t01169311945._2
241+ let lpAmount = $t01169311945._1
242+ let usdtAssetId = value(fromBase58String(value(getString(keyUsdtAssetId()))))
243+ let $t01203412252 = {
244+ let @ = invoke(addressFromStringValue(value(getString(keyUsdtPriceAssetStablePool()))), "getOneTknV2READONLY", [usdtAssetId, lpAmount], nil)
245+ if ($isInstanceOf(@, "(Int, Int)"))
246+ then @
247+ else throw("Couldn't cast Any to (Int, Int)")
248+ }
249+ if (($t01203412252 == $t01203412252))
250+ then {
251+ let getOneTknV2FeeAmount = $t01203412252._2
252+ let usdtAmount = $t01203412252._1
253+ let currentUsdtPriceAssetRatio = fraction(usdtAmount, putOneTknV2PriceAssestAmount, scale8)
254+ let endPeriodBlocksLeft = (valueOrElse(getInteger(keyPeriodEndHeight(currentPeriod)), claimEnd) - height)
255+ if ((claimedAssetId58 == priceAssetId58))
256+ then $Tuple6([0, -(availableClaimingPriceAssetAmount), availableClaimingPriceAssetAmount, 0], availableClaimingPriceAssetAmount, priceAssetId, origInvestArray, newClaimPeriodHeight, [totalUserAvailableToClaim, claimingIdoAssetAmount, availableClaimingPriceAssetAmount, periodTotalAvailableToClaim, usdtPriceAssetAllowableRatio, currentUsdtPriceAssetRatio, endPeriodBlocksLeft])
257+ else if ((claimedAssetId58 == idoAssetId58))
258+ then $Tuple6([0, -(availableClaimingPriceAssetAmount), 0, availableClaimingPriceAssetAmount], claimingIdoAssetAmount, idoAssetId, origInvestArray, newClaimPeriodHeight, [totalUserAvailableToClaim, claimingIdoAssetAmount, availableClaimingPriceAssetAmount, periodTotalAvailableToClaim, currentUsdtPriceAssetRatio, usdtPriceAssetAllowableRatio])
259+ else throwErr(makeString(["unsupported assetId:", claimedAssetId58], " "))
260+ }
261+ else throw("Strict value is not equal to itself.")
262+ }
263+ else throw("Strict value is not equal to itself.")
264+ }
189265 else throw("Strict value is not equal to itself.")
190266 }
191267
307383 func claim (claimedAssetId58,userAddress58) = {
308384 let callerAddress58 = toString(i.caller)
309385 if ((userAddress58 != callerAddress58))
310- then throw("not authorized")
386+ then throwErr("not authorized")
311387 else {
312388 let claimResultTuple = internalClaim(claimedAssetId58, i.caller, i.transactionId)
313389 let totalsDiff = claimResultTuple._1
315391 let outAssetId = claimResultTuple._3
316392 let origInvestArray = claimResultTuple._4
317393 let newClaimPeriodHeight = claimResultTuple._5
318- let claimedPriceAmountFromDiff = totalsDiff[IdxDiffClaimedPriceAmountIncrement]
319- let claimedIdoAssetAmountFromDiff = totalsDiff[IdxDiffClaimedIdoAssetAmountIncrement]
320- $Tuple2([ScriptTransfer(i.caller, outAmount, outAssetId), TotalsEntry(keyInvestor(userAddress58), origInvestArray, totalsDiff, newClaimPeriodHeight), TotalsEntry(keyTotals(), readTotalsArrayOrDefault(), totalsDiff, newClaimPeriodHeight), ClaimOperationHistoryEntry(userAddress58, claimedPriceAmountFromDiff, claimedIdoAssetAmountFromDiff, i.transactionId)], unit)
394+ let availableToClaimArray = claimResultTuple._6
395+ let totalUserAvailableToClaim = availableToClaimArray[0]
396+ let periodAvailableIdoAmountToClaim = availableToClaimArray[1]
397+ let periodAvailableUserPriceAmountToClaim = availableToClaimArray[2]
398+ let periodAvailableTotalPriceAmountToClaim = availableToClaimArray[3]
399+ let checks = [if (if ((totalUserAvailableToClaim > 0))
400+ then true
401+ else (periodAvailableIdoAmountToClaim > 0))
402+ then true
403+ else throwErr("nothing to claim"), if ((periodAvailableUserPriceAmountToClaim > 0))
404+ then true
405+ else throwErr("unavailable to claim because user period allowance reached"), if ((periodAvailableTotalPriceAmountToClaim > 0))
406+ then true
407+ else throwErr("unavailable to claim because total period allowance reached")]
408+ if ((checks == checks))
409+ then {
410+ let claimedPriceAmountFromDiff = totalsDiff[IdxDiffClaimedPriceAmountIncrement]
411+ let claimedIdoAssetAmountFromDiff = totalsDiff[IdxDiffClaimedIdoAssetAmountIncrement]
412+ $Tuple2([ScriptTransfer(i.caller, outAmount, outAssetId), TotalsEntry(keyInvestor(userAddress58), origInvestArray, totalsDiff, newClaimPeriodHeight), TotalsEntry(keyTotals(), readTotalsArrayOrDefault(), totalsDiff, newClaimPeriodHeight), ClaimOperationHistoryEntry(userAddress58, claimedPriceAmountFromDiff, claimedIdoAssetAmountFromDiff, i.transactionId)], unit)
413+ }
414+ else throw("Strict value is not equal to itself.")
321415 }
322416 }
323417
332426 let origInvestArray = claimResultTuple._4
333427 let newClaimPeriodHeight = claimResultTuple._5
334428 let availableToClaimArray = claimResultTuple._6
335- let availablePriceAmountToClaim = availableToClaimArray[0]
336- let availableIdoAmountToClaim = availableToClaimArray[1]
429+ let availablePriceAmountToClaim = availableToClaimArray[1]
430+ let availableIdoAmountToClaim = availableToClaimArray[2]
337431 $Tuple2(nil, makeString(["%s%d%d", userAddress58, toString(availablePriceAmountToClaim), toString(availableIdoAmountToClaim)], SEP))
432+ }
433+
434+
435+
436+@Callable(i)
437+func claimV2READONLY (claimedAssetId58,userAddress58) = {
438+ let claimResultTuple = internalClaim(claimedAssetId58, addressFromStringValue(userAddress58), fromBase58String(""))
439+ let totalsDiff = claimResultTuple._1
440+ let outAmount = claimResultTuple._2
441+ let outAssetId = claimResultTuple._3
442+ let origInvestArray = claimResultTuple._4
443+ let newClaimPeriodHeight = claimResultTuple._5
444+ let availableToClaimArray = claimResultTuple._6
445+ let totalUserAvailableToClaim = availableToClaimArray[0]
446+ let periodAvailableIdoAmountToClaim = availableToClaimArray[1]
447+ let periodAvailableUserPriceAmountToClaim = availableToClaimArray[2]
448+ let periodAvailableTotalPriceAmountToClaim = availableToClaimArray[3]
449+ let usdtPriceAssetAllowableRatio = availableToClaimArray[4]
450+ let currentPriceAssetRatio = availableToClaimArray[5]
451+ let endPriodBlocksLeft = availableToClaimArray[6]
452+ let resultString = makeString(["%d%d%d%d%d%d%d", toString(totalUserAvailableToClaim), toString(periodAvailableIdoAmountToClaim), toString(periodAvailableUserPriceAmountToClaim), toString(periodAvailableTotalPriceAmountToClaim), toString(usdtPriceAssetAllowableRatio), toString(currentPriceAssetRatio), toString(endPriodBlocksLeft)], SEP)
453+ $Tuple2(nil, resultString)
338454 }
339455
340456
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 func getStringOrFail (key) = valueOrErrorMessage(getString(key), (("mandatory this." + key) + " is not defined"))
55
66
77 let SEP = "__"
88
99 let BUFSCALE = toBigInt(1000000000000000000)
10+
11+let scale8 = 100000000
12+
13+func throwErr (msg) = throw(makeString(["ido.ride:", msg], " "))
14+
1015
1116 func convertPriceAssetIntoIdoAsset (priceAssetAmount,priceAssetMULT,price,priceMULT,idoAssetMULT) = {
1217 let bPriceAssetMULT = toBigInt(priceAssetMULT)
1318 let bIdoAssetMULT = toBigInt(idoAssetMULT)
1419 let bPriceAssetBUF = fraction(toBigInt(priceAssetAmount), BUFSCALE, bPriceAssetMULT)
1520 let bAmountAssetBUF = fraction(bPriceAssetBUF, toBigInt(priceMULT), toBigInt(price))
1621 toInt(fraction(bAmountAssetBUF, toBigInt(idoAssetMULT), BUFSCALE))
1722 }
1823
1924
2025 let IdxCfgIdoStart = 1
2126
2227 let IdxCfgIdoDuration = 2
2328
2429 let IdxCfgClaimStart = 3
2530
2631 let IdxCfgClaimDuration = 4
2732
2833 let IdxCfgPrice = 5
2934
3035 let IdxCfgPriceMult = 6
3136
3237 let IdxCfgIdoAssetId = 7
3338
3439 let IdxCfgIdoAssetMult = 8
3540
3641 let IdxCfgPriceAssetId = 9
3742
3843 let IdxCfgPriceAssetMult = 10
3944
4045 let IdxCfgMinInvestAmount = 11
4146
4247 func fromatConfigS (idoStart,idoDuration,claimStart,claimDuration,price,priceMult,idoAssetId58,idoAssetMult,priceAssetId58,priceAssetMult,minInvestAmount,totalIdoAssetToSell) = makeString(["%d%d%d%d%d%d%s%d%s%d%d%d", idoStart, idoDuration, claimStart, claimDuration, price, priceMult, idoAssetId58, idoAssetMult, priceAssetId58, priceAssetMult, minInvestAmount, totalIdoAssetToSell], SEP)
4348
4449
4550 func fromatConfig (idoStart,idoDuration,claimStart,claimDuration,price,priceMult,idoAssetId58,idoAssetMult,priceAssetId58,priceAssetMult,minInvestAmount,totalIdoAssetToSell) = fromatConfigS(toString(idoStart), toString(idoDuration), toString(claimStart), toString(claimDuration), toString(price), toString(priceMult), idoAssetId58, toString(idoAssetMult), priceAssetId58, toString(priceAssetMult), toString(minInvestAmount), toString(totalIdoAssetToSell))
4651
4752
4853 let IdxInvTotalAmount = 1
4954
5055 let IdxInvRemainingAmount = 2
5156
5257 let IdxInvClaimedPriceAssetAmount = 3
5358
5459 let IdxInvClaimedIdoAssetAmount = 4
5560
5661 let IdxInvLastClaimedHeight = 5
5762
5863 func formatInvestorS (totalAmount,remainingAmount,claimedPriceAssetAmount,claimedIdoAssetAmount,lastClaimedHeight) = makeString(["%d%d%d%d%d", totalAmount, remainingAmount, claimedPriceAssetAmount, claimedIdoAssetAmount, lastClaimedHeight], SEP)
5964
6065
6166 func formatInvestor (totalAmount,remainingAmount,claimedPriceAssetAmount,claimedIdoAssetAmount,lastClaimedHeight) = formatInvestorS(toString(totalAmount), toString(remainingAmount), toString(claimedPriceAssetAmount), toString(claimedIdoAssetAmount), toString(lastClaimedHeight))
6267
6368
6469 func formatHistoryRecord (priceAssetAmount,idoAssetAmount) = makeString(["%d%d%d%d", toString(height), toString(lastBlock.timestamp), toString(priceAssetAmount), toString(idoAssetAmount)], SEP)
6570
6671
6772 func keyConfig () = "%s__config"
6873
6974
7075 func keyInvestor (userAddress) = ("%s__" + userAddress)
7176
7277
7378 func keyTotals () = "%s__totals"
7479
7580
7681 func keyOperationHistoryRecord (type,userAddress,txId58) = makeString(["%s%s%s%s__history", type, userAddress, txId58], SEP)
7782
7883
7984 func keyUSDNClaimDisabled () = "%s__usdnClaimDisabled"
8085
8186
8287 func keyUSDNClaimEndHeight () = "%s__usdnClaimEndHeight"
88+
89+
90+func keyPeriodLength () = makeString(["%s", "periodLength"], SEP)
91+
92+
93+func keyCurrnetPeriod () = makeString(["%s", "currentPeriod"], SEP)
94+
95+
96+func keyPeriodStartHeight (periodNum) = makeString(["%s%s", "periodStartHeight", toString(periodNum)], SEP)
97+
98+
99+func keyPeriodEndHeight (periodNum) = makeString(["%s%s", "periodEndHeight", toString(periodNum)], SEP)
100+
101+
102+func keyUsdtPriceAssetAllowableRatio () = makeString(["%s", "usdtPriceAssetAllowableRatio"], SEP)
103+
104+
105+func keyTotalPeriodAllowance (assetId) = makeString(["%s%s", "totalPeriodAllowance", assetId], SEP)
106+
107+
108+func keyUserPeriodAllowance (assetId) = makeString(["%s%s", "userPeriodAllowance", assetId], SEP)
109+
110+
111+func keyPeriodTotalAvailableToClaim (assetId,periodNum) = makeString(["%s%s%s", "periodTotalAvailableToClaim", assetId, toString(periodNum)], SEP)
112+
113+
114+func keyPeriodUserAvailableToClaim (assetId,periodNum,userAddress) = makeString(["%s%s%s%s", "periodUserAvailableToClaim", assetId, toString(periodNum), userAddress], SEP)
115+
116+
117+func keyUsdtPriceAssetStablePool () = makeString(["%s", "usdtPriceAssetStablePool"], SEP)
118+
119+
120+func keyUsdtAssetId () = makeString(["%s", "usdtAssetId"], SEP)
83121
84122
85123 func keyManagerPublicKey () = "%s__managerPublicKey"
86124
87125
88126 func keyPendingManagerPublicKey () = "%s__pendingManagerPublicKey"
89127
90128
91129 func readConfigArray () = split(getStringOrFail(keyConfig()), SEP)
92130
93131
94132 func readTotalsArrayOrDefaultByCustomKey (customKey) = split(valueOrElse(getString(customKey), formatInvestorS("0", "0", "0", "0", "0")), SEP)
95133
96134
97135 func readTotalsArrayOrDefault () = readTotalsArrayOrDefaultByCustomKey(keyTotals())
98136
99137
100138 func readInvestorArrayOrDefault (userAddress) = readTotalsArrayOrDefaultByCustomKey(keyInvestor(userAddress))
101139
102140
103141 func readInvestorArrayOrFail (userAddress) = split(getStringOrFail(keyInvestor(userAddress)), SEP)
104142
105143
106144 let IdxDiffTotalIncrement = 0
107145
108146 let IdxDiffRemainingPriceAmountIncrement = 1
109147
110148 let IdxDiffClaimedPriceAmountIncrement = 2
111149
112150 let IdxDiffClaimedIdoAssetAmountIncrement = 3
113151
114152 func TotalsEntry (key,origArray,incrementDiff,newLastClaimedHeight) = {
115153 let totalAmount = parseIntValue(origArray[IdxInvTotalAmount])
116154 let remainingAmount = parseIntValue(origArray[IdxInvRemainingAmount])
117155 let claimedPriceAssetAmount = parseIntValue(origArray[IdxInvClaimedPriceAssetAmount])
118156 let claimedIdoAssetAmount = parseIntValue(origArray[IdxInvClaimedIdoAssetAmount])
119157 let lastClaimedHeight = parseIntValue(origArray[IdxInvLastClaimedHeight])
120158 let newTotalAmount = (totalAmount + incrementDiff[IdxDiffTotalIncrement])
121159 let newRemainingAmount = (remainingAmount + incrementDiff[IdxDiffRemainingPriceAmountIncrement])
122160 let newClaimedPriceAssetAmount = (claimedPriceAssetAmount + incrementDiff[IdxDiffClaimedPriceAmountIncrement])
123161 let newClaimedIdoAssetAmount = (claimedIdoAssetAmount + incrementDiff[IdxDiffClaimedIdoAssetAmountIncrement])
124162 if ((0 > newRemainingAmount))
125163 then throw("invalid math")
126164 else StringEntry(key, formatInvestor(newTotalAmount, newRemainingAmount, newClaimedPriceAssetAmount, newClaimedIdoAssetAmount, newLastClaimedHeight))
127165 }
128166
129167
130168 func InvestOperationHistoryEntry (userAddress,priceAssetAmount,idoAssetAmount,txId) = StringEntry(keyOperationHistoryRecord("invest", userAddress, toBase58String(txId)), formatHistoryRecord(priceAssetAmount, idoAssetAmount))
131169
132170
133171 func ClaimOperationHistoryEntry (userAddress,priceAssetAmount,idoAssetAmount,txId) = StringEntry(keyOperationHistoryRecord("claim", userAddress, toBase58String(txId)), formatHistoryRecord(priceAssetAmount, idoAssetAmount))
134172
135173
136174 func internalClaim (claimedAssetId58,userAddress,txId) = {
137175 let cfgArray = readConfigArray()
138176 let claimStart = parseIntValue(cfgArray[IdxCfgClaimStart])
139177 let claimDuration = parseIntValue(cfgArray[IdxCfgClaimDuration])
140178 let claimEnd = (claimStart + claimDuration)
141179 let price = parseIntValue(cfgArray[IdxCfgPrice])
142180 let priceMult = parseIntValue(cfgArray[IdxCfgPriceMult])
143181 let idoAssetId58 = cfgArray[IdxCfgIdoAssetId]
144182 let idoAssetId = fromBase58String(idoAssetId58)
145183 let idoAssetMult = parseIntValue(cfgArray[IdxCfgIdoAssetMult])
146184 let priceAssetId58 = cfgArray[IdxCfgPriceAssetId]
147185 let priceAssetId = fromBase58String(priceAssetId58)
148186 let priceAssetMult = parseIntValue(cfgArray[IdxCfgPriceAssetMult])
149187 let userAddress58 = toString(userAddress)
150188 let origInvestArray = readInvestorArrayOrFail(userAddress58)
151189 let investTotalAmount = parseIntValue(origInvestArray[IdxInvTotalAmount])
152190 let investLastClaimedHeightTMP = parseIntValue(origInvestArray[IdxInvLastClaimedHeight])
153191 let investLastClaimedHeight = if ((claimStart >= investLastClaimedHeightTMP))
154192 then claimStart
155193 else investLastClaimedHeightTMP
156194 let newClaimPeriodHeight = if ((height > claimEnd))
157195 then claimEnd
158196 else if ((claimStart > height))
159197 then claimStart
160198 else height
161199 let claimingBlocks = (newClaimPeriodHeight - investLastClaimedHeight)
162- let claimingPriceAssetAmount = fraction(investTotalAmount, claimingBlocks, claimDuration)
163- let claimingIdoAssetAmount = convertPriceAssetIntoIdoAsset(claimingPriceAssetAmount, priceAssetMult, price, priceMult, idoAssetMult)
200+ let totalUserAvailableToClaim = fraction(investTotalAmount, claimingBlocks, claimDuration)
201+ let claimingIdoAssetAmount = convertPriceAssetIntoIdoAsset(totalUserAvailableToClaim, priceAssetMult, price, priceMult, idoAssetMult)
164202 let isUSDN = (claimedAssetId58 == priceAssetId58)
165203 let isUSDNClaimDisabled = valueOrElse(getBoolean(keyUSDNClaimDisabled()), false)
166204 let isUSDNClaimEnded = match getInteger(keyUSDNClaimEndHeight()) {
167205 case end: Int =>
168206 (height > end)
169207 case _: Unit =>
170208 false
171209 case _ =>
172210 throw("Match error")
173211 }
174212 let checks = [if (!(if (isUSDN)
175213 then isUSDNClaimDisabled
176214 else false))
177215 then true
178- else throw("USDN claim is disabled"), if (!(if (isUSDN)
216+ else throwErr("USDN claim is disabled"), if (!(if (isUSDN)
179217 then isUSDNClaimEnded
180218 else false))
181219 then true
182- else throw("USDN claim is ended")]
220+ else throwErr("USDN claim is ended")]
183221 if ((checks == checks))
184- then if ((claimedAssetId58 == priceAssetId58))
185- then $Tuple6([0, -(claimingPriceAssetAmount), claimingPriceAssetAmount, 0], claimingPriceAssetAmount, priceAssetId, origInvestArray, newClaimPeriodHeight, [claimingPriceAssetAmount, claimingIdoAssetAmount])
186- else if ((claimedAssetId58 == idoAssetId58))
187- then $Tuple6([0, -(claimingPriceAssetAmount), 0, claimingIdoAssetAmount], claimingIdoAssetAmount, idoAssetId, origInvestArray, newClaimPeriodHeight, [claimingPriceAssetAmount, claimingIdoAssetAmount])
188- else throw(("unsupported assetId: " + claimedAssetId58))
222+ then {
223+ let totalPeriodPriceAssetAllowance = value(getInteger(keyTotalPeriodAllowance(priceAssetId58)))
224+ let userPeriodPriceAssetAllowance = value(getInteger(keyUserPeriodAllowance(priceAssetId58)))
225+ let currentPeriod = valueOrElse(getInteger(keyCurrnetPeriod()), 0)
226+ let periodTotalAvailableToClaim = valueOrElse(getInteger(keyPeriodTotalAvailableToClaim(priceAssetId58, currentPeriod)), totalPeriodPriceAssetAllowance)
227+ let periodUserAvailableToClaim = valueOrElse(getInteger(keyPeriodUserAvailableToClaim(priceAssetId58, currentPeriod, userAddress58)), userPeriodPriceAssetAllowance)
228+ let availableClaimingPriceAssetAmount = min([totalUserAvailableToClaim, periodTotalAvailableToClaim, periodUserAvailableToClaim])
229+ let usdtPriceAssetAllowableRatio = value(getInteger(keyUsdtPriceAssetAllowableRatio()))
230+ let putOneTknV2PriceAssestAmount = scale8
231+ let $t01169311945 = {
232+ let @ = invoke(addressFromStringValue(value(getString(keyUsdtPriceAssetStablePool()))), "putOneTknV2WithoutTakeFeeREADONLY", [putOneTknV2PriceAssestAmount, priceAssetId], nil)
233+ if ($isInstanceOf(@, "(Int, Int, Int)"))
234+ then @
235+ else throw("Couldn't cast Any to (Int, Int, Int)")
236+ }
237+ if (($t01169311945 == $t01169311945))
238+ then {
239+ let bonus = $t01169311945._3
240+ let feeAmount = $t01169311945._2
241+ let lpAmount = $t01169311945._1
242+ let usdtAssetId = value(fromBase58String(value(getString(keyUsdtAssetId()))))
243+ let $t01203412252 = {
244+ let @ = invoke(addressFromStringValue(value(getString(keyUsdtPriceAssetStablePool()))), "getOneTknV2READONLY", [usdtAssetId, lpAmount], nil)
245+ if ($isInstanceOf(@, "(Int, Int)"))
246+ then @
247+ else throw("Couldn't cast Any to (Int, Int)")
248+ }
249+ if (($t01203412252 == $t01203412252))
250+ then {
251+ let getOneTknV2FeeAmount = $t01203412252._2
252+ let usdtAmount = $t01203412252._1
253+ let currentUsdtPriceAssetRatio = fraction(usdtAmount, putOneTknV2PriceAssestAmount, scale8)
254+ let endPeriodBlocksLeft = (valueOrElse(getInteger(keyPeriodEndHeight(currentPeriod)), claimEnd) - height)
255+ if ((claimedAssetId58 == priceAssetId58))
256+ then $Tuple6([0, -(availableClaimingPriceAssetAmount), availableClaimingPriceAssetAmount, 0], availableClaimingPriceAssetAmount, priceAssetId, origInvestArray, newClaimPeriodHeight, [totalUserAvailableToClaim, claimingIdoAssetAmount, availableClaimingPriceAssetAmount, periodTotalAvailableToClaim, usdtPriceAssetAllowableRatio, currentUsdtPriceAssetRatio, endPeriodBlocksLeft])
257+ else if ((claimedAssetId58 == idoAssetId58))
258+ then $Tuple6([0, -(availableClaimingPriceAssetAmount), 0, availableClaimingPriceAssetAmount], claimingIdoAssetAmount, idoAssetId, origInvestArray, newClaimPeriodHeight, [totalUserAvailableToClaim, claimingIdoAssetAmount, availableClaimingPriceAssetAmount, periodTotalAvailableToClaim, currentUsdtPriceAssetRatio, usdtPriceAssetAllowableRatio])
259+ else throwErr(makeString(["unsupported assetId:", claimedAssetId58], " "))
260+ }
261+ else throw("Strict value is not equal to itself.")
262+ }
263+ else throw("Strict value is not equal to itself.")
264+ }
189265 else throw("Strict value is not equal to itself.")
190266 }
191267
192268
193269 func managerPublicKeyOrUnit () = match getString(keyManagerPublicKey()) {
194270 case s: String =>
195271 fromBase58String(s)
196272 case _: Unit =>
197273 unit
198274 case _ =>
199275 throw("Match error")
200276 }
201277
202278
203279 func pendingManagerPublicKeyOrUnit () = match getString(keyPendingManagerPublicKey()) {
204280 case s: String =>
205281 fromBase58String(s)
206282 case _: Unit =>
207283 unit
208284 case _ =>
209285 throw("Match error")
210286 }
211287
212288
213289 func mustManager (i) = {
214290 let pd = throw("Permission denied")
215291 match managerPublicKeyOrUnit() {
216292 case pk: ByteVector =>
217293 if ((i.callerPublicKey == pk))
218294 then true
219295 else pd
220296 case _: Unit =>
221297 if ((i.caller == this))
222298 then true
223299 else pd
224300 case _ =>
225301 throw("Match error")
226302 }
227303 }
228304
229305
230306 @Callable(i)
231307 func constructor (idoStart,idoDuration,claimStart,claimDuration,price,priceAssetId58,minInvestAmount) = {
232308 let priceMult = ((100 * 1000) * 1000)
233309 let idoEnd = (idoStart + idoDuration)
234310 if (isDefined(getString(keyConfig())))
235311 then throw("already initialized")
236312 else if (("3PMEHLx1j6zerarZTYfsGqDeeZqQoMpxq5S" != toString(i.caller)))
237313 then throw("not authorized")
238314 else if ((size(i.payments) != 1))
239315 then throw("exactly 1 payment must be attached")
240316 else if ((idoEnd >= claimStart))
241317 then throw("claimStart must be greater than idoEnd")
242318 else {
243319 let pmt = value(i.payments[0])
244320 let idoAssetId = value(pmt.assetId)
245321 let idoAssetInfo = valueOrErrorMessage(assetInfo(idoAssetId), "fail to load ido asset info")
246322 let idoAssetId58 = toBase58String(idoAssetId)
247323 let idoAssetMult = pow(10, 0, idoAssetInfo.decimals, 0, 0, DOWN)
248324 let priceAssetId = fromBase58String(priceAssetId58)
249325 let priceAssetInfo = valueOrErrorMessage(assetInfo(priceAssetId), "fail to load price asset info")
250326 let priceAssetMult = pow(10, 0, priceAssetInfo.decimals, 0, 0, DOWN)
251327 let origTotalsArray = readTotalsArrayOrDefault()
252328 let totalsDiff = [0, 0, 0, 0]
253329 [StringEntry(keyConfig(), fromatConfig(idoStart, idoDuration, claimStart, claimDuration, price, priceMult, idoAssetId58, idoAssetMult, priceAssetId58, priceAssetMult, minInvestAmount, pmt.amount)), TotalsEntry(keyTotals(), origTotalsArray, totalsDiff, claimStart)]
254330 }
255331 }
256332
257333
258334
259335 @Callable(i)
260336 func invest () = {
261337 let cfgArray = readConfigArray()
262338 let idoStart = parseIntValue(cfgArray[IdxCfgIdoStart])
263339 let idoDuration = parseIntValue(cfgArray[IdxCfgIdoDuration])
264340 let idoEnd = (idoStart + idoDuration)
265341 let claimStart = parseIntValue(cfgArray[IdxCfgClaimStart])
266342 let claimDuration = parseIntValue(cfgArray[IdxCfgClaimDuration])
267343 let price = parseIntValue(cfgArray[IdxCfgPrice])
268344 let priceMult = parseIntValue(cfgArray[IdxCfgPriceMult])
269345 let idoAssetId58 = cfgArray[IdxCfgIdoAssetId]
270346 let idoAssetId = fromBase58String(idoAssetId58)
271347 let idoAssetMult = parseIntValue(cfgArray[IdxCfgIdoAssetMult])
272348 let priceAssetId58 = cfgArray[IdxCfgPriceAssetId]
273349 let priceAssetId = fromBase58String(priceAssetId58)
274350 let priceAssetMult = parseIntValue(cfgArray[IdxCfgPriceAssetMult])
275351 let minIvestAmount = parseIntValue(cfgArray[IdxCfgMinInvestAmount])
276352 let userAddress = toString(i.caller)
277353 if ((idoStart > height))
278354 then throw("ido has not been started yet")
279355 else if ((height > idoEnd))
280356 then throw("ido has been already ended")
281357 else if ((size(i.payments) != 1))
282358 then throw("exactly 1 payment is expected")
283359 else {
284360 let pmt = value(i.payments[0])
285361 let pmtAssetId = value(pmt.assetId)
286362 let pmtAmount = pmt.amount
287363 if ((pmtAssetId != priceAssetId))
288364 then throw((("invalid payment asset id: " + toBase58String(pmtAssetId)) + " is expected"))
289365 else {
290366 let origInvestorArray = readInvestorArrayOrDefault(userAddress)
291367 let origTotalsArray = readTotalsArrayOrDefault()
292368 let newPriceTotalAmount = (parseIntValue(origTotalsArray[IdxInvTotalAmount]) + pmtAmount)
293369 let requiredIdoAssetAmount = (newPriceTotalAmount * 100)
294370 if ((requiredIdoAssetAmount > assetBalance(this, idoAssetId)))
295371 then throw("IDO asset has been - sold consider to use smaller payment")
296372 else {
297373 let totalsDiff = [pmtAmount, pmtAmount, 0, 0]
298374 [TotalsEntry(keyInvestor(userAddress), origInvestorArray, totalsDiff, claimStart), TotalsEntry(keyTotals(), origTotalsArray, totalsDiff, claimStart), InvestOperationHistoryEntry(userAddress, pmtAmount, 0, i.transactionId)]
299375 }
300376 }
301377 }
302378 }
303379
304380
305381
306382 @Callable(i)
307383 func claim (claimedAssetId58,userAddress58) = {
308384 let callerAddress58 = toString(i.caller)
309385 if ((userAddress58 != callerAddress58))
310- then throw("not authorized")
386+ then throwErr("not authorized")
311387 else {
312388 let claimResultTuple = internalClaim(claimedAssetId58, i.caller, i.transactionId)
313389 let totalsDiff = claimResultTuple._1
314390 let outAmount = claimResultTuple._2
315391 let outAssetId = claimResultTuple._3
316392 let origInvestArray = claimResultTuple._4
317393 let newClaimPeriodHeight = claimResultTuple._5
318- let claimedPriceAmountFromDiff = totalsDiff[IdxDiffClaimedPriceAmountIncrement]
319- let claimedIdoAssetAmountFromDiff = totalsDiff[IdxDiffClaimedIdoAssetAmountIncrement]
320- $Tuple2([ScriptTransfer(i.caller, outAmount, outAssetId), TotalsEntry(keyInvestor(userAddress58), origInvestArray, totalsDiff, newClaimPeriodHeight), TotalsEntry(keyTotals(), readTotalsArrayOrDefault(), totalsDiff, newClaimPeriodHeight), ClaimOperationHistoryEntry(userAddress58, claimedPriceAmountFromDiff, claimedIdoAssetAmountFromDiff, i.transactionId)], unit)
394+ let availableToClaimArray = claimResultTuple._6
395+ let totalUserAvailableToClaim = availableToClaimArray[0]
396+ let periodAvailableIdoAmountToClaim = availableToClaimArray[1]
397+ let periodAvailableUserPriceAmountToClaim = availableToClaimArray[2]
398+ let periodAvailableTotalPriceAmountToClaim = availableToClaimArray[3]
399+ let checks = [if (if ((totalUserAvailableToClaim > 0))
400+ then true
401+ else (periodAvailableIdoAmountToClaim > 0))
402+ then true
403+ else throwErr("nothing to claim"), if ((periodAvailableUserPriceAmountToClaim > 0))
404+ then true
405+ else throwErr("unavailable to claim because user period allowance reached"), if ((periodAvailableTotalPriceAmountToClaim > 0))
406+ then true
407+ else throwErr("unavailable to claim because total period allowance reached")]
408+ if ((checks == checks))
409+ then {
410+ let claimedPriceAmountFromDiff = totalsDiff[IdxDiffClaimedPriceAmountIncrement]
411+ let claimedIdoAssetAmountFromDiff = totalsDiff[IdxDiffClaimedIdoAssetAmountIncrement]
412+ $Tuple2([ScriptTransfer(i.caller, outAmount, outAssetId), TotalsEntry(keyInvestor(userAddress58), origInvestArray, totalsDiff, newClaimPeriodHeight), TotalsEntry(keyTotals(), readTotalsArrayOrDefault(), totalsDiff, newClaimPeriodHeight), ClaimOperationHistoryEntry(userAddress58, claimedPriceAmountFromDiff, claimedIdoAssetAmountFromDiff, i.transactionId)], unit)
413+ }
414+ else throw("Strict value is not equal to itself.")
321415 }
322416 }
323417
324418
325419
326420 @Callable(i)
327421 func claimREADONLY (claimedAssetId58,userAddress58) = {
328422 let claimResultTuple = internalClaim(claimedAssetId58, addressFromStringValue(userAddress58), fromBase58String(""))
329423 let totalsDiff = claimResultTuple._1
330424 let outAmount = claimResultTuple._2
331425 let outAssetId = claimResultTuple._3
332426 let origInvestArray = claimResultTuple._4
333427 let newClaimPeriodHeight = claimResultTuple._5
334428 let availableToClaimArray = claimResultTuple._6
335- let availablePriceAmountToClaim = availableToClaimArray[0]
336- let availableIdoAmountToClaim = availableToClaimArray[1]
429+ let availablePriceAmountToClaim = availableToClaimArray[1]
430+ let availableIdoAmountToClaim = availableToClaimArray[2]
337431 $Tuple2(nil, makeString(["%s%d%d", userAddress58, toString(availablePriceAmountToClaim), toString(availableIdoAmountToClaim)], SEP))
432+ }
433+
434+
435+
436+@Callable(i)
437+func claimV2READONLY (claimedAssetId58,userAddress58) = {
438+ let claimResultTuple = internalClaim(claimedAssetId58, addressFromStringValue(userAddress58), fromBase58String(""))
439+ let totalsDiff = claimResultTuple._1
440+ let outAmount = claimResultTuple._2
441+ let outAssetId = claimResultTuple._3
442+ let origInvestArray = claimResultTuple._4
443+ let newClaimPeriodHeight = claimResultTuple._5
444+ let availableToClaimArray = claimResultTuple._6
445+ let totalUserAvailableToClaim = availableToClaimArray[0]
446+ let periodAvailableIdoAmountToClaim = availableToClaimArray[1]
447+ let periodAvailableUserPriceAmountToClaim = availableToClaimArray[2]
448+ let periodAvailableTotalPriceAmountToClaim = availableToClaimArray[3]
449+ let usdtPriceAssetAllowableRatio = availableToClaimArray[4]
450+ let currentPriceAssetRatio = availableToClaimArray[5]
451+ let endPriodBlocksLeft = availableToClaimArray[6]
452+ let resultString = makeString(["%d%d%d%d%d%d%d", toString(totalUserAvailableToClaim), toString(periodAvailableIdoAmountToClaim), toString(periodAvailableUserPriceAmountToClaim), toString(periodAvailableTotalPriceAmountToClaim), toString(usdtPriceAssetAllowableRatio), toString(currentPriceAssetRatio), toString(endPriodBlocksLeft)], SEP)
453+ $Tuple2(nil, resultString)
338454 }
339455
340456
341457
342458 @Callable(i)
343459 func setManager (pendingManagerPublicKey) = {
344460 let checkCaller = mustManager(i)
345461 if ((checkCaller == checkCaller))
346462 then {
347463 let checkManagerPublicKey = fromBase58String(pendingManagerPublicKey)
348464 if ((checkManagerPublicKey == checkManagerPublicKey))
349465 then [StringEntry(keyPendingManagerPublicKey(), pendingManagerPublicKey)]
350466 else throw("Strict value is not equal to itself.")
351467 }
352468 else throw("Strict value is not equal to itself.")
353469 }
354470
355471
356472
357473 @Callable(i)
358474 func confirmManager () = {
359475 let pm = pendingManagerPublicKeyOrUnit()
360476 let hasPM = if (isDefined(pm))
361477 then true
362478 else throw("No pending manager")
363479 if ((hasPM == hasPM))
364480 then {
365481 let checkPM = if ((i.callerPublicKey == value(pm)))
366482 then true
367483 else throw("You are not pending manager")
368484 if ((checkPM == checkPM))
369485 then [StringEntry(keyManagerPublicKey(), toBase58String(value(pm))), DeleteEntry(keyPendingManagerPublicKey())]
370486 else throw("Strict value is not equal to itself.")
371487 }
372488 else throw("Strict value is not equal to itself.")
373489 }
374490
375491
376492 @Verifier(tx)
377493 func verify () = {
378494 let targetPublicKey = match managerPublicKeyOrUnit() {
379495 case pk: ByteVector =>
380496 pk
381497 case _: Unit =>
382498 tx.senderPublicKey
383499 case _ =>
384500 throw("Match error")
385501 }
386502 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
387503 }
388504

github/deemru/w8io/026f985 
66.60 ms