tx · 8sBCkrg3ft7WBR5VAFn7k34TtiEaNPPaxUq6DkybBKcX

3MvZpvvbmovEt3pvdDZKvhKRjjQxdbUD6Tv:  -0.02400000 Waves

2022.11.02 18:52 [2299693] smart account 3MvZpvvbmovEt3pvdDZKvhKRjjQxdbUD6Tv > SELF 0.00000000 Waves

{ "type": 13, "id": "8sBCkrg3ft7WBR5VAFn7k34TtiEaNPPaxUq6DkybBKcX", "fee": 2400000, "feeAssetId": null, "timestamp": 1667404411885, "version": 1, "sender": "3MvZpvvbmovEt3pvdDZKvhKRjjQxdbUD6Tv", "senderPublicKey": "39YkRD2qWXTcdNBr4CbDnm8g8SAB2FKVaDeGYahcFHHx", "proofs": [ "37QruYYsh4ZzuHheXwo3s8s8vx8STazMQdsK7yLw2U6eL8gEmaxyjnNDRfGknQpGd4s7zdVZjRWreoArWxee9rKV" ], "script": "base64:AAIFAAAAAAAADecIAhIJCgcBAQEBAQgBEgASBAoCCAgSBAoCCAgSBAoCCAgSAwoBCBIAIg9nZXRTdHJpbmdPckZhaWwiA2tleSIDU0VQIghCVUZTQ0FMRSIGc2NhbGU4Ih1jb252ZXJ0UHJpY2VBc3NldEludG9JZG9Bc3NldCIQcHJpY2VBc3NldEFtb3VudCIOcHJpY2VBc3NldE1VTFQiBXByaWNlIglwcmljZU1VTFQiDGlkb0Fzc2V0TVVMVCIPYlByaWNlQXNzZXRNVUxUIg1iSWRvQXNzZXRNVUxUIg5iUHJpY2VBc3NldEJVRiIPYkFtb3VudEFzc2V0QlVGIg5JZHhDZmdJZG9TdGFydCIRSWR4Q2ZnSWRvRHVyYXRpb24iEElkeENmZ0NsYWltU3RhcnQiE0lkeENmZ0NsYWltRHVyYXRpb24iC0lkeENmZ1ByaWNlIg9JZHhDZmdQcmljZU11bHQiEElkeENmZ0lkb0Fzc2V0SWQiEklkeENmZ0lkb0Fzc2V0TXVsdCISSWR4Q2ZnUHJpY2VBc3NldElkIhRJZHhDZmdQcmljZUFzc2V0TXVsdCIVSWR4Q2ZnTWluSW52ZXN0QW1vdW50Ig1mcm9tYXRDb25maWdTIghpZG9TdGFydCILaWRvRHVyYXRpb24iCmNsYWltU3RhcnQiDWNsYWltRHVyYXRpb24iCXByaWNlTXVsdCIMaWRvQXNzZXRJZDU4IgxpZG9Bc3NldE11bHQiDnByaWNlQXNzZXRJZDU4Ig5wcmljZUFzc2V0TXVsdCIPbWluSW52ZXN0QW1vdW50IhN0b3RhbElkb0Fzc2V0VG9TZWxsIgxmcm9tYXRDb25maWciEUlkeEludlRvdGFsQW1vdW50IhVJZHhJbnZSZW1haW5pbmdBbW91bnQiHUlkeEludkNsYWltZWRQcmljZUFzc2V0QW1vdW50IhtJZHhJbnZDbGFpbWVkSWRvQXNzZXRBbW91bnQiF0lkeEludkxhc3RDbGFpbWVkSGVpZ2h0Ig9mb3JtYXRJbnZlc3RvclMiC3RvdGFsQW1vdW50Ig9yZW1haW5pbmdBbW91bnQiF2NsYWltZWRQcmljZUFzc2V0QW1vdW50IhVjbGFpbWVkSWRvQXNzZXRBbW91bnQiEWxhc3RDbGFpbWVkSGVpZ2h0Ig5mb3JtYXRJbnZlc3RvciITZm9ybWF0SGlzdG9yeVJlY29yZCIOaWRvQXNzZXRBbW91bnQiCWtleUNvbmZpZyILa2V5SW52ZXN0b3IiC3VzZXJBZGRyZXNzIglrZXlUb3RhbHMiGWtleU9wZXJhdGlvbkhpc3RvcnlSZWNvcmQiBHR5cGUiBnR4SWQ1OCIUa2V5VVNETkNsYWltRGlzYWJsZWQiFWtleVVTRE5DbGFpbUVuZEhlaWdodCIPa2V5UGVyaW9kTGVuZ3RoIhBrZXlDdXJyZW50UGVyaW9kIhRrZXlQZXJpb2RTdGFydEhlaWdodCIJcGVyaW9kTnVtIhJrZXlQZXJpb2RFbmRIZWlnaHQiH2tleVVzZHRQcmljZUFzc2V0QWxsb3dhYmxlUmF0aW8iF2tleVRvdGFsUGVyaW9kQWxsb3dhbmNlIgdhc3NldElkIhZrZXlVc2VyUGVyaW9kQWxsb3dhbmNlIh5rZXlQZXJpb2RUb3RhbEF2YWlsYWJsZVRvQ2xhaW0iHWtleVBlcmlvZFVzZXJBdmFpbGFibGVUb0NsYWltIhtrZXlVc2R0UHJpY2VBc3NldFN0YWJsZVBvb2wiDmtleVVzZHRBc3NldElkIhRrZXlQcmljZUFzc2V0QmFsYW5jZSIHYWRkcmVzcyITa2V5TWFuYWdlclB1YmxpY0tleSIaa2V5UGVuZGluZ01hbmFnZXJQdWJsaWNLZXkiD3JlYWRDb25maWdBcnJheSIjcmVhZFRvdGFsc0FycmF5T3JEZWZhdWx0QnlDdXN0b21LZXkiCWN1c3RvbUtleSIYcmVhZFRvdGFsc0FycmF5T3JEZWZhdWx0IhpyZWFkSW52ZXN0b3JBcnJheU9yRGVmYXVsdCIXcmVhZEludmVzdG9yQXJyYXlPckZhaWwiFUlkeERpZmZUb3RhbEluY3JlbWVudCIkSWR4RGlmZlJlbWFpbmluZ1ByaWNlQW1vdW50SW5jcmVtZW50IiJJZHhEaWZmQ2xhaW1lZFByaWNlQW1vdW50SW5jcmVtZW50IiVJZHhEaWZmQ2xhaW1lZElkb0Fzc2V0QW1vdW50SW5jcmVtZW50IgtUb3RhbHNFbnRyeSIJb3JpZ0FycmF5Ig1pbmNyZW1lbnREaWZmIhRuZXdMYXN0Q2xhaW1lZEhlaWdodCIObmV3VG90YWxBbW91bnQiEm5ld1JlbWFpbmluZ0Ftb3VudCIabmV3Q2xhaW1lZFByaWNlQXNzZXRBbW91bnQiGG5ld0NsYWltZWRJZG9Bc3NldEFtb3VudCIbSW52ZXN0T3BlcmF0aW9uSGlzdG9yeUVudHJ5IgR0eElkIhpDbGFpbU9wZXJhdGlvbkhpc3RvcnlFbnRyeSINaW50ZXJuYWxDbGFpbSIQY2xhaW1lZEFzc2V0SWQ1OCIIY2ZnQXJyYXkiCGNsYWltRW5kIgppZG9Bc3NldElkIgxwcmljZUFzc2V0SWQiDXVzZXJBZGRyZXNzNTgiD29yaWdJbnZlc3RBcnJheSIRaW52ZXN0VG90YWxBbW91bnQiGmludmVzdExhc3RDbGFpbWVkSGVpZ2h0VE1QIhdpbnZlc3RMYXN0Q2xhaW1lZEhlaWdodCIUbmV3Q2xhaW1QZXJpb2RIZWlnaHQiDmNsYWltaW5nQmxvY2tzIhhjbGFpbWluZ1ByaWNlQXNzZXRBbW91bnQiFmNsYWltaW5nSWRvQXNzZXRBbW91bnQiBmlzVVNETiITaXNVU0ROQ2xhaW1EaXNhYmxlZCIQaXNVU0ROQ2xhaW1FbmRlZCIHJG1hdGNoMCIDZW5kIgZjaGVja3MiD2ludGVybmFsQ2xhaW1WMiIJb3V0QW1vdW50Ihl0b3RhbFVzZXJBdmFpbGFibGVUb0NsYWltIh50b3RhbFBlcmlvZFByaWNlQXNzZXRBbGxvd2FuY2UiHXVzZXJQZXJpb2RQcmljZUFzc2V0QWxsb3dhbmNlIgxwZXJpb2RMZW5ndGgiDWN1cnJlbnRQZXJpb2QiDSR0MDExODc0MTI3OTIiFWxhc3RQZXJpb2RTdGFydEhlaWdodCITbGFzdFBlcmlvZEVuZEhlaWdodCINJHQwMTIxNDIxMjUyNCIUdXBkYXRlZEN1cnJlbnRQZXJpb2QiC3BlcmlvZFN0YXJ0IglwZXJpb2RFbmQiG3BlcmlvZFRvdGFsQXZhaWxhYmxlVG9DbGFpbSIacGVyaW9kVXNlckF2YWlsYWJsZVRvQ2xhaW0iGXBlcmlvZE1pbkF2YWlsYWJsZVRvQ2xhaW0iHHVzZHRQcmljZUFzc2V0QWxsb3dhYmxlUmF0aW8iG3B1dE9uZVRrblYyUHJpY2VBc3NldEFtb3VudCINJHQwMTM0MzUxMzY4OCIBQCIFYm9udXMiCWZlZUFtb3VudCIIbHBBbW91bnQiC3VzZHRBc3NldElkIg0kdDAxMzc1MDEzOTY4IhRnZXRPbmVUa25WMkZlZUFtb3VudCIKdXNkdEFtb3VudCIaY3VycmVudFVzZHRQcmljZUFzc2V0UmF0aW8iE2VuZFBlcmlvZEJsb2Nrc0xlZnQiFm1hbmFnZXJQdWJsaWNLZXlPclVuaXQiAXMiHXBlbmRpbmdNYW5hZ2VyUHVibGljS2V5T3JVbml0IgttdXN0TWFuYWdlciIBaSICcGQiAnBrIgZpZG9FbmQiA3BtdCIMaWRvQXNzZXRJbmZvIg5wcmljZUFzc2V0SW5mbyIPb3JpZ1RvdGFsc0FycmF5Igp0b3RhbHNEaWZmIg5taW5JdmVzdEFtb3VudCIKcG10QXNzZXRJZCIJcG10QW1vdW50IhFvcmlnSW52ZXN0b3JBcnJheSITbmV3UHJpY2VUb3RhbEFtb3VudCIWcmVxdWlyZWRJZG9Bc3NldEFtb3VudCIPY2FsbGVyQWRkcmVzczU4IhBjbGFpbVJlc3VsdFR1cGxlIgpvdXRBc3NldElkIhpjbGFpbWVkUHJpY2VBbW91bnRGcm9tRGlmZiIdY2xhaW1lZElkb0Fzc2V0QW1vdW50RnJvbURpZmYiB2VudHJpZXMiDSR0MDE5NjI0MjAwNjgiEXByaWNlQXNzZXRCYWxhbmNlIiJ1cGRhdGVkUGVyaW9kVG90YWxBdmFpbGFibGVUb0NsYWltIiF1cGRhdGVkUGVyaW9kVXNlckF2YWlsYWJsZVRvQ2xhaW0iGHVwZGF0ZWRQcmljZUFzc2V0QmFsYW5jZSIVYXZhaWxhYmxlVG9DbGFpbUFycmF5IhthdmFpbGFibGVQcmljZUFtb3VudFRvQ2xhaW0iGWF2YWlsYWJsZUlkb0Ftb3VudFRvQ2xhaW0iDSR0MDI1MjU5MjU2NzMiDHJlc3VsdFN0cmluZyIXcGVuZGluZ01hbmFnZXJQdWJsaWNLZXkiC2NoZWNrQ2FsbGVyIhVjaGVja01hbmFnZXJQdWJsaWNLZXkiAnBtIgVoYXNQTSIHY2hlY2tQTSICdHgiBnZlcmlmeSIPdGFyZ2V0UHVibGljS2V5AAAAPwEAAAABYQAAAAEAAAABYgkBAAAAE3ZhbHVl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", "chainId": 84, "height": 2299693, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: ZS1iqKrA77yiCHPZbuBfBNu8jVQzvGzjMZVcAxUHs7S Next: 8TsecpdEE6i1S8ux9PTHTQ8WFid6DyVhFPpQhu8yogGD Diff:
OldNewDifferences
228228 }
229229
230230
231+func internalClaimV2 (priceAssetId58,userAddress58,outAmount,totalUserAvailableToClaim) = {
232+ let totalPeriodPriceAssetAllowance = value(getInteger(keyTotalPeriodAllowance(priceAssetId58)))
233+ let userPeriodPriceAssetAllowance = value(getInteger(keyUserPeriodAllowance(priceAssetId58)))
234+ let periodLength = value(getInteger(keyPeriodLength()))
235+ let currentPeriod = valueOrElse(getInteger(keyCurrentPeriod()), 0)
236+ let $t01187412792 = if ((currentPeriod > 0))
237+ then {
238+ let lastPeriodStartHeight = value(getInteger(keyPeriodStartHeight((currentPeriod - 1))))
239+ let lastPeriodEndHeight = value(getInteger(keyPeriodEndHeight((currentPeriod - 1))))
240+ let $t01214212524 = if ((height > lastPeriodEndHeight))
241+ then {
242+ let updatedCurrentPeriod = (currentPeriod + 1)
243+ let periodStart = (lastPeriodEndHeight + 1)
244+ let periodEnd = ((periodStart + periodLength) - 1)
245+ $Tuple3(updatedCurrentPeriod, periodStart, periodEnd)
246+ }
247+ else $Tuple3(currentPeriod, lastPeriodStartHeight, lastPeriodEndHeight)
248+ let updatedCurrentPeriod = $t01214212524._1
249+ let periodStart = $t01214212524._2
250+ let periodEnd = $t01214212524._3
251+ $Tuple3(updatedCurrentPeriod, periodStart, periodEnd)
252+ }
253+ else $Tuple3(currentPeriod, valueOrElse(getInteger(keyPeriodStartHeight(currentPeriod)), height), valueOrElse(getInteger(keyPeriodEndHeight(currentPeriod)), ((height + periodLength) - 1)))
254+ let updatedCurrentPeriod = $t01187412792._1
255+ let periodStart = $t01187412792._2
256+ let periodEnd = $t01187412792._3
257+ let periodTotalAvailableToClaim = valueOrElse(getInteger(keyPeriodTotalAvailableToClaim(priceAssetId58, updatedCurrentPeriod)), totalPeriodPriceAssetAllowance)
258+ let periodUserAvailableToClaim = valueOrElse(getInteger(keyPeriodUserAvailableToClaim(priceAssetId58, updatedCurrentPeriod, userAddress58)), userPeriodPriceAssetAllowance)
259+ let periodMinAvailableToClaim = min([outAmount, periodTotalAvailableToClaim, periodUserAvailableToClaim])
260+ let usdtPriceAssetAllowableRatio = value(getInteger(keyUsdtPriceAssetAllowableRatio()))
261+ let putOneTknV2PriceAssetAmount = scale8
262+ let $t01343513688 = {
263+ let @ = invoke(addressFromStringValue(value(getString(keyUsdtPriceAssetStablePool()))), "putOneTknV2WithoutTakeFeeREADONLY", [putOneTknV2PriceAssetAmount, priceAssetId58], nil)
264+ if ($isInstanceOf(@, "(Int, Int, Int)"))
265+ then @
266+ else throw("Couldn't cast Any to (Int, Int, Int)")
267+ }
268+ if (($t01343513688 == $t01343513688))
269+ then {
270+ let bonus = $t01343513688._3
271+ let feeAmount = $t01343513688._2
272+ let lpAmount = $t01343513688._1
273+ let usdtAssetId = value(getString(keyUsdtAssetId()))
274+ let $t01375013968 = {
275+ let @ = invoke(addressFromStringValue(value(getString(keyUsdtPriceAssetStablePool()))), "getOneTknV2READONLY", [usdtAssetId, lpAmount], nil)
276+ if ($isInstanceOf(@, "(Int, Int)"))
277+ then @
278+ else throw("Couldn't cast Any to (Int, Int)")
279+ }
280+ if (($t01375013968 == $t01375013968))
281+ then {
282+ let getOneTknV2FeeAmount = $t01375013968._2
283+ let usdtAmount = $t01375013968._1
284+ let currentUsdtPriceAssetRatio = fraction(usdtAmount, putOneTknV2PriceAssetAmount, scale8)
285+ let endPeriodBlocksLeft = (periodEnd - height)
286+ $Tuple10(periodMinAvailableToClaim, periodTotalAvailableToClaim, periodUserAvailableToClaim, totalUserAvailableToClaim, usdtPriceAssetAllowableRatio, currentUsdtPriceAssetRatio, endPeriodBlocksLeft, updatedCurrentPeriod, periodStart, periodEnd)
287+ }
288+ else throw("Strict value is not equal to itself.")
289+ }
290+ else throw("Strict value is not equal to itself.")
291+ }
292+
293+
231294 func managerPublicKeyOrUnit () = match getString(keyManagerPublicKey()) {
232295 case s: String =>
233296 fromBase58String(s)
359422 let claimedIdoAssetAmountFromDiff = totalsDiff[IdxDiffClaimedIdoAssetAmountIncrement]
360423 let entries = if ((claimedAssetId58 == priceAssetId58))
361424 then {
362- let totalPeriodPriceAssetAllowance = value(getInteger(keyTotalPeriodAllowance(priceAssetId58)))
363- let userPeriodPriceAssetAllowance = value(getInteger(keyUserPeriodAllowance(priceAssetId58)))
364- let periodLength = value(getInteger(keyPeriodLength()))
365- let currentPeriod = valueOrElse(getInteger(keyCurrentPeriod()), 0)
366- let $t01698717941 = if ((currentPeriod > 0))
367- then {
368- let lastPeriodStartHeight = value(getInteger(keyPeriodStartHeight((currentPeriod - 1))))
369- let lastPeriodEndHeight = value(getInteger(keyPeriodEndHeight((currentPeriod - 1))))
370- let $t01726117657 = if ((height > lastPeriodEndHeight))
371- then {
372- let updatedCurrentPeriod = (currentPeriod + 1)
373- let periodStart = (lastPeriodEndHeight + 1)
374- let periodEnd = ((periodStart + periodLength) - 1)
375- $Tuple3(updatedCurrentPeriod, periodStart, periodEnd)
376- }
377- else $Tuple3(currentPeriod, lastPeriodStartHeight, lastPeriodEndHeight)
378- let updatedCurrentPeriod = $t01726117657._1
379- let periodStart = $t01726117657._2
380- let periodEnd = $t01726117657._3
381- $Tuple3(updatedCurrentPeriod, periodStart, periodEnd)
425+ let $t01962420068 = internalClaimV2(priceAssetId58, userAddress58, outAmount, totalsDiff[IdxDiffClaimedPriceAmountIncrement])
426+ let periodMinAvailableToClaim = $t01962420068._1
427+ let periodTotalAvailableToClaim = $t01962420068._2
428+ let periodUserAvailableToClaim = $t01962420068._3
429+ let totalUserAvailableToClaim = $t01962420068._4
430+ let usdtPriceAssetAllowableRatio = $t01962420068._5
431+ let currentUsdtPriceAssetRatio = $t01962420068._6
432+ let endPeriodBlocksLeft = $t01962420068._7
433+ let updatedCurrentPeriod = $t01962420068._8
434+ let periodStart = $t01962420068._9
435+ let periodEnd = $t01962420068._10
436+ let priceAssetBalance = valueOrElse(getInteger(keyPriceAssetBalance(userAddress58)), 0)
437+ let updatedPeriodTotalAvailableToClaim = (periodTotalAvailableToClaim - periodMinAvailableToClaim)
438+ let updatedPeriodUserAvailableToClaim = (periodUserAvailableToClaim - periodMinAvailableToClaim)
439+ let entries = if ((priceAssetBalance >= periodMinAvailableToClaim))
440+ then [ScriptTransfer(i.caller, periodMinAvailableToClaim, outAssetId), IntegerEntry(keyPriceAssetBalance(userAddress58), (priceAssetBalance - periodMinAvailableToClaim))]
441+ else {
442+ let updatedPriceAssetBalance = ((priceAssetBalance + outAmount) - periodMinAvailableToClaim)
443+[ScriptTransfer(i.caller, periodMinAvailableToClaim, outAssetId), TotalsEntry(keyInvestor(userAddress58), origInvestArray, totalsDiff, newClaimPeriodHeight), TotalsEntry(keyTotals(), readTotalsArrayOrDefault(), totalsDiff, newClaimPeriodHeight), IntegerEntry(keyPriceAssetBalance(userAddress58), updatedPriceAssetBalance)]
382444 }
383- else $Tuple3(currentPeriod, valueOrElse(getInteger(keyPeriodStartHeight(currentPeriod)), height), valueOrElse(getInteger(keyPeriodEndHeight(currentPeriod)), ((height + periodLength) - 1)))
384- let updatedCurrentPeriod = $t01698717941._1
385- let periodStart = $t01698717941._2
386- let periodEnd = $t01698717941._3
387- let periodTotalAvailableToClaim = valueOrElse(getInteger(keyPeriodTotalAvailableToClaim(priceAssetId58, updatedCurrentPeriod)), totalPeriodPriceAssetAllowance)
388- let periodUserAvailableToClaim = valueOrElse(getInteger(keyPeriodUserAvailableToClaim(priceAssetId58, updatedCurrentPeriod, userAddress58)), userPeriodPriceAssetAllowance)
389- let periodMinAvailableToClaim = min([outAmount, periodTotalAvailableToClaim, periodUserAvailableToClaim])
390- let totalUserAvailableToClaim = totalsDiff[IdxInvClaimedPriceAssetAmount]
391- let usdtPriceAssetAllowableRatio = value(getInteger(keyUsdtPriceAssetAllowableRatio()))
392- let putOneTknV2PriceAssetAmount = scale8
393- let $t01869718960 = {
394- let @ = invoke(addressFromStringValue(value(getString(keyUsdtPriceAssetStablePool()))), "putOneTknV2WithoutTakeFeeREADONLY", [putOneTknV2PriceAssetAmount, priceAssetId58], nil)
395- if ($isInstanceOf(@, "(Int, Int, Int)"))
396- then @
397- else throw("Couldn't cast Any to (Int, Int, Int)")
398- }
399- if (($t01869718960 == $t01869718960))
400- then {
401- let bonus = $t01869718960._3
402- let feeAmount = $t01869718960._2
403- let lpAmount = $t01869718960._1
404- let usdtAssetId = value(getString(keyUsdtAssetId()))
405- let $t01902619254 = {
406- let @ = invoke(addressFromStringValue(value(getString(keyUsdtPriceAssetStablePool()))), "getOneTknV2READONLY", [usdtAssetId, lpAmount], nil)
407- if ($isInstanceOf(@, "(Int, Int)"))
408- then @
409- else throw("Couldn't cast Any to (Int, Int)")
410- }
411- if (($t01902619254 == $t01902619254))
412- then {
413- let getOneTknV2FeeAmount = $t01902619254._2
414- let usdtAmount = $t01902619254._1
415- let currentUsdtPriceAssetRatio = fraction(usdtAmount, putOneTknV2PriceAssetAmount, scale8)
416- let endPeriodBlocksLeft = (periodEnd - height)
417- let priceAssetBalance = valueOrElse(getInteger(keyPriceAssetBalance(userAddress58)), 0)
418- let updatedPeriodTotalAvailableToClaim = (periodTotalAvailableToClaim - periodMinAvailableToClaim)
419- let updatedPeriodUserAvailableToClaim = (periodUserAvailableToClaim - periodMinAvailableToClaim)
420- let entries = if ((priceAssetBalance >= periodMinAvailableToClaim))
421- then [ScriptTransfer(i.caller, periodMinAvailableToClaim, outAssetId), IntegerEntry(keyPriceAssetBalance(userAddress58), (priceAssetBalance - periodMinAvailableToClaim))]
422- else {
423- let updatedPriceAssetBalance = ((priceAssetBalance + outAmount) - periodMinAvailableToClaim)
424-[ScriptTransfer(i.caller, periodMinAvailableToClaim, outAssetId), TotalsEntry(keyInvestor(userAddress58), origInvestArray, totalsDiff, newClaimPeriodHeight), TotalsEntry(keyTotals(), readTotalsArrayOrDefault(), totalsDiff, newClaimPeriodHeight), IntegerEntry(keyPriceAssetBalance(userAddress58), updatedPriceAssetBalance)]
425- }
426- $Tuple2(([IntegerEntry(keyCurrentPeriod(), currentPeriod), IntegerEntry(keyPeriodStartHeight(currentPeriod), periodStart), IntegerEntry(keyPeriodEndHeight(currentPeriod), periodEnd), IntegerEntry(keyPeriodTotalAvailableToClaim(priceAssetId58, currentPeriod), updatedPeriodTotalAvailableToClaim), IntegerEntry(keyPeriodUserAvailableToClaim(priceAssetId58, currentPeriod, userAddress58), updatedPeriodUserAvailableToClaim), ClaimOperationHistoryEntry(userAddress58, claimedPriceAmountFromDiff, claimedIdoAssetAmountFromDiff, i.transactionId)] ++ entries), unit)
427- }
428- else throw("Strict value is not equal to itself.")
429- }
430- else throw("Strict value is not equal to itself.")
445+ $Tuple2(([IntegerEntry(keyCurrentPeriod(), updatedCurrentPeriod), IntegerEntry(keyPeriodStartHeight(updatedCurrentPeriod), periodStart), IntegerEntry(keyPeriodEndHeight(updatedCurrentPeriod), periodEnd), IntegerEntry(keyPeriodTotalAvailableToClaim(priceAssetId58, updatedCurrentPeriod), updatedPeriodTotalAvailableToClaim), IntegerEntry(keyPeriodUserAvailableToClaim(priceAssetId58, updatedCurrentPeriod, userAddress58), updatedPeriodUserAvailableToClaim), ClaimOperationHistoryEntry(userAddress58, claimedPriceAmountFromDiff, claimedIdoAssetAmountFromDiff, i.transactionId)] ++ entries), unit)
431446 }
432447 else $Tuple2([ScriptTransfer(i.caller, outAmount, outAssetId), TotalsEntry(keyInvestor(userAddress58), origInvestArray, totalsDiff, newClaimPeriodHeight), TotalsEntry(keyTotals(), readTotalsArrayOrDefault(), totalsDiff, newClaimPeriodHeight), ClaimOperationHistoryEntry(userAddress58, claimedPriceAmountFromDiff, claimedIdoAssetAmountFromDiff, i.transactionId)], unit)
433448 entries
448463 let availablePriceAmountToClaim = availableToClaimArray[0]
449464 let availableIdoAmountToClaim = availableToClaimArray[1]
450465 $Tuple2(nil, makeString(["%s%d%d", userAddress58, toString(availablePriceAmountToClaim), toString(availableIdoAmountToClaim)], SEP))
466+ }
467+
468+
469+
470+@Callable(i)
471+func claimV2READONLY (claimedAssetId58,userAddress58) = {
472+ let claimResultTuple = internalClaim(claimedAssetId58, addressFromStringValue(userAddress58), fromBase58String(""))
473+ let totalsDiff = claimResultTuple._1
474+ let outAmount = claimResultTuple._2
475+ let outAssetId = claimResultTuple._3
476+ let origInvestArray = claimResultTuple._4
477+ let newClaimPeriodHeight = claimResultTuple._5
478+ let availableToClaimArray = claimResultTuple._6
479+ let availablePriceAmountToClaim = availableToClaimArray[0]
480+ let availableIdoAmountToClaim = availableToClaimArray[1]
481+ let $t02525925673 = internalClaimV2(claimedAssetId58, userAddress58, outAmount, totalsDiff[IdxDiffClaimedPriceAmountIncrement])
482+ let periodMinAvailableToClaim = $t02525925673._1
483+ let periodTotalAvailableToClaim = $t02525925673._2
484+ let periodUserAvailableToClaim = $t02525925673._3
485+ let totalUserAvailableToClaim = $t02525925673._4
486+ let usdtPriceAssetAllowableRatio = $t02525925673._5
487+ let currentUsdtPriceAssetRatio = $t02525925673._6
488+ let endPeriodBlocksLeft = $t02525925673._7
489+ let updatedCurrentPeriod = $t02525925673._8
490+ let periodStart = $t02525925673._9
491+ let periodEnd = $t02525925673._10
492+ let resultString = makeString(["%d%d%d%d%d%d%d", toString(totalUserAvailableToClaim), toString(availableIdoAmountToClaim), toString(periodMinAvailableToClaim), toString(periodTotalAvailableToClaim), toString(usdtPriceAssetAllowableRatio), toString(currentUsdtPriceAssetRatio), toString(endPeriodBlocksLeft)], SEP)
493+ $Tuple2(nil, resultString)
451494 }
452495
453496
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)
1010
1111 let scale8 = 100000000
1212
1313 func convertPriceAssetIntoIdoAsset (priceAssetAmount,priceAssetMULT,price,priceMULT,idoAssetMULT) = {
1414 let bPriceAssetMULT = toBigInt(priceAssetMULT)
1515 let bIdoAssetMULT = toBigInt(idoAssetMULT)
1616 let bPriceAssetBUF = fraction(toBigInt(priceAssetAmount), BUFSCALE, bPriceAssetMULT)
1717 let bAmountAssetBUF = fraction(bPriceAssetBUF, toBigInt(priceMULT), toBigInt(price))
1818 toInt(fraction(bAmountAssetBUF, toBigInt(idoAssetMULT), BUFSCALE))
1919 }
2020
2121
2222 let IdxCfgIdoStart = 1
2323
2424 let IdxCfgIdoDuration = 2
2525
2626 let IdxCfgClaimStart = 3
2727
2828 let IdxCfgClaimDuration = 4
2929
3030 let IdxCfgPrice = 5
3131
3232 let IdxCfgPriceMult = 6
3333
3434 let IdxCfgIdoAssetId = 7
3535
3636 let IdxCfgIdoAssetMult = 8
3737
3838 let IdxCfgPriceAssetId = 9
3939
4040 let IdxCfgPriceAssetMult = 10
4141
4242 let IdxCfgMinInvestAmount = 11
4343
4444 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)
4545
4646
4747 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))
4848
4949
5050 let IdxInvTotalAmount = 1
5151
5252 let IdxInvRemainingAmount = 2
5353
5454 let IdxInvClaimedPriceAssetAmount = 3
5555
5656 let IdxInvClaimedIdoAssetAmount = 4
5757
5858 let IdxInvLastClaimedHeight = 5
5959
6060 func formatInvestorS (totalAmount,remainingAmount,claimedPriceAssetAmount,claimedIdoAssetAmount,lastClaimedHeight) = makeString(["%d%d%d%d%d", totalAmount, remainingAmount, claimedPriceAssetAmount, claimedIdoAssetAmount, lastClaimedHeight], SEP)
6161
6262
6363 func formatInvestor (totalAmount,remainingAmount,claimedPriceAssetAmount,claimedIdoAssetAmount,lastClaimedHeight) = formatInvestorS(toString(totalAmount), toString(remainingAmount), toString(claimedPriceAssetAmount), toString(claimedIdoAssetAmount), toString(lastClaimedHeight))
6464
6565
6666 func formatHistoryRecord (priceAssetAmount,idoAssetAmount) = makeString(["%d%d%d%d", toString(height), toString(lastBlock.timestamp), toString(priceAssetAmount), toString(idoAssetAmount)], SEP)
6767
6868
6969 func keyConfig () = "%s__config"
7070
7171
7272 func keyInvestor (userAddress) = ("%s__" + userAddress)
7373
7474
7575 func keyTotals () = "%s__totals"
7676
7777
7878 func keyOperationHistoryRecord (type,userAddress,txId58) = makeString(["%s%s%s%s__history", type, userAddress, txId58], SEP)
7979
8080
8181 func keyUSDNClaimDisabled () = "%s__usdnClaimDisabled"
8282
8383
8484 func keyUSDNClaimEndHeight () = "%s__usdnClaimEndHeight"
8585
8686
8787 func keyPeriodLength () = makeString(["%s", "periodLength"], SEP)
8888
8989
9090 func keyCurrentPeriod () = makeString(["%s", "currentPeriod"], SEP)
9191
9292
9393 func keyPeriodStartHeight (periodNum) = makeString(["%s%s", "periodStartHeight", toString(periodNum)], SEP)
9494
9595
9696 func keyPeriodEndHeight (periodNum) = makeString(["%s%s", "periodEndHeight", toString(periodNum)], SEP)
9797
9898
9999 func keyUsdtPriceAssetAllowableRatio () = makeString(["%s", "usdtPriceAssetAllowableRatio"], SEP)
100100
101101
102102 func keyTotalPeriodAllowance (assetId) = makeString(["%s%s", "totalPeriodAllowance", assetId], SEP)
103103
104104
105105 func keyUserPeriodAllowance (assetId) = makeString(["%s%s", "userPeriodAllowance", assetId], SEP)
106106
107107
108108 func keyPeriodTotalAvailableToClaim (assetId,periodNum) = makeString(["%s%s%s", "periodTotalAvailableToClaim", assetId, toString(periodNum)], SEP)
109109
110110
111111 func keyPeriodUserAvailableToClaim (assetId,periodNum,userAddress) = makeString(["%s%s%s%s", "periodUserAvailableToClaim", assetId, toString(periodNum), userAddress], SEP)
112112
113113
114114 func keyUsdtPriceAssetStablePool () = makeString(["%s", "usdtPriceAssetStablePool"], SEP)
115115
116116
117117 func keyUsdtAssetId () = makeString(["%s", "usdtAssetId"], SEP)
118118
119119
120120 func keyPriceAssetBalance (address) = makeString(["%s%s", "priceAssetBalance", address], SEP)
121121
122122
123123 func keyManagerPublicKey () = "%s__managerPublicKey"
124124
125125
126126 func keyPendingManagerPublicKey () = "%s__pendingManagerPublicKey"
127127
128128
129129 func readConfigArray () = split(getStringOrFail(keyConfig()), SEP)
130130
131131
132132 func readTotalsArrayOrDefaultByCustomKey (customKey) = split(valueOrElse(getString(customKey), formatInvestorS("0", "0", "0", "0", "0")), SEP)
133133
134134
135135 func readTotalsArrayOrDefault () = readTotalsArrayOrDefaultByCustomKey(keyTotals())
136136
137137
138138 func readInvestorArrayOrDefault (userAddress) = readTotalsArrayOrDefaultByCustomKey(keyInvestor(userAddress))
139139
140140
141141 func readInvestorArrayOrFail (userAddress) = split(getStringOrFail(keyInvestor(userAddress)), SEP)
142142
143143
144144 let IdxDiffTotalIncrement = 0
145145
146146 let IdxDiffRemainingPriceAmountIncrement = 1
147147
148148 let IdxDiffClaimedPriceAmountIncrement = 2
149149
150150 let IdxDiffClaimedIdoAssetAmountIncrement = 3
151151
152152 func TotalsEntry (key,origArray,incrementDiff,newLastClaimedHeight) = {
153153 let totalAmount = parseIntValue(origArray[IdxInvTotalAmount])
154154 let remainingAmount = parseIntValue(origArray[IdxInvRemainingAmount])
155155 let claimedPriceAssetAmount = parseIntValue(origArray[IdxInvClaimedPriceAssetAmount])
156156 let claimedIdoAssetAmount = parseIntValue(origArray[IdxInvClaimedIdoAssetAmount])
157157 let lastClaimedHeight = parseIntValue(origArray[IdxInvLastClaimedHeight])
158158 let newTotalAmount = (totalAmount + incrementDiff[IdxDiffTotalIncrement])
159159 let newRemainingAmount = (remainingAmount + incrementDiff[IdxDiffRemainingPriceAmountIncrement])
160160 let newClaimedPriceAssetAmount = (claimedPriceAssetAmount + incrementDiff[IdxDiffClaimedPriceAmountIncrement])
161161 let newClaimedIdoAssetAmount = (claimedIdoAssetAmount + incrementDiff[IdxDiffClaimedIdoAssetAmountIncrement])
162162 if ((0 > newRemainingAmount))
163163 then throw("invalid math")
164164 else StringEntry(key, formatInvestor(newTotalAmount, newRemainingAmount, newClaimedPriceAssetAmount, newClaimedIdoAssetAmount, newLastClaimedHeight))
165165 }
166166
167167
168168 func InvestOperationHistoryEntry (userAddress,priceAssetAmount,idoAssetAmount,txId) = StringEntry(keyOperationHistoryRecord("invest", userAddress, toBase58String(txId)), formatHistoryRecord(priceAssetAmount, idoAssetAmount))
169169
170170
171171 func ClaimOperationHistoryEntry (userAddress,priceAssetAmount,idoAssetAmount,txId) = StringEntry(keyOperationHistoryRecord("claim", userAddress, toBase58String(txId)), formatHistoryRecord(priceAssetAmount, idoAssetAmount))
172172
173173
174174 func internalClaim (claimedAssetId58,userAddress,txId) = {
175175 let cfgArray = readConfigArray()
176176 let claimStart = parseIntValue(cfgArray[IdxCfgClaimStart])
177177 let claimDuration = parseIntValue(cfgArray[IdxCfgClaimDuration])
178178 let claimEnd = (claimStart + claimDuration)
179179 let price = parseIntValue(cfgArray[IdxCfgPrice])
180180 let priceMult = parseIntValue(cfgArray[IdxCfgPriceMult])
181181 let idoAssetId58 = cfgArray[IdxCfgIdoAssetId]
182182 let idoAssetId = fromBase58String(idoAssetId58)
183183 let idoAssetMult = parseIntValue(cfgArray[IdxCfgIdoAssetMult])
184184 let priceAssetId58 = cfgArray[IdxCfgPriceAssetId]
185185 let priceAssetId = fromBase58String(priceAssetId58)
186186 let priceAssetMult = parseIntValue(cfgArray[IdxCfgPriceAssetMult])
187187 let userAddress58 = toString(userAddress)
188188 let origInvestArray = readInvestorArrayOrFail(userAddress58)
189189 let investTotalAmount = parseIntValue(origInvestArray[IdxInvTotalAmount])
190190 let investLastClaimedHeightTMP = parseIntValue(origInvestArray[IdxInvLastClaimedHeight])
191191 let investLastClaimedHeight = if ((claimStart >= investLastClaimedHeightTMP))
192192 then claimStart
193193 else investLastClaimedHeightTMP
194194 let newClaimPeriodHeight = if ((height > claimEnd))
195195 then claimEnd
196196 else if ((claimStart > height))
197197 then claimStart
198198 else height
199199 let claimingBlocks = (newClaimPeriodHeight - investLastClaimedHeight)
200200 let claimingPriceAssetAmount = fraction(investTotalAmount, claimingBlocks, claimDuration)
201201 let claimingIdoAssetAmount = convertPriceAssetIntoIdoAsset(claimingPriceAssetAmount, priceAssetMult, price, priceMult, idoAssetMult)
202202 let isUSDN = (claimedAssetId58 == priceAssetId58)
203203 let isUSDNClaimDisabled = valueOrElse(getBoolean(keyUSDNClaimDisabled()), false)
204204 let isUSDNClaimEnded = match getInteger(keyUSDNClaimEndHeight()) {
205205 case end: Int =>
206206 (height > end)
207207 case _: Unit =>
208208 false
209209 case _ =>
210210 throw("Match error")
211211 }
212212 let checks = [if (!(if (isUSDN)
213213 then isUSDNClaimDisabled
214214 else false))
215215 then true
216216 else throw("USDN claim is disabled"), if (!(if (isUSDN)
217217 then isUSDNClaimEnded
218218 else false))
219219 then true
220220 else throw("USDN claim is ended")]
221221 if ((checks == checks))
222222 then if ((claimedAssetId58 == priceAssetId58))
223223 then $Tuple6([0, -(claimingPriceAssetAmount), claimingPriceAssetAmount, 0], claimingPriceAssetAmount, priceAssetId, origInvestArray, newClaimPeriodHeight, [claimingPriceAssetAmount, claimingIdoAssetAmount])
224224 else if ((claimedAssetId58 == idoAssetId58))
225225 then $Tuple6([0, -(claimingPriceAssetAmount), 0, claimingIdoAssetAmount], claimingIdoAssetAmount, idoAssetId, origInvestArray, newClaimPeriodHeight, [claimingPriceAssetAmount, claimingIdoAssetAmount])
226226 else throw(("unsupported assetId: " + claimedAssetId58))
227227 else throw("Strict value is not equal to itself.")
228228 }
229229
230230
231+func internalClaimV2 (priceAssetId58,userAddress58,outAmount,totalUserAvailableToClaim) = {
232+ let totalPeriodPriceAssetAllowance = value(getInteger(keyTotalPeriodAllowance(priceAssetId58)))
233+ let userPeriodPriceAssetAllowance = value(getInteger(keyUserPeriodAllowance(priceAssetId58)))
234+ let periodLength = value(getInteger(keyPeriodLength()))
235+ let currentPeriod = valueOrElse(getInteger(keyCurrentPeriod()), 0)
236+ let $t01187412792 = if ((currentPeriod > 0))
237+ then {
238+ let lastPeriodStartHeight = value(getInteger(keyPeriodStartHeight((currentPeriod - 1))))
239+ let lastPeriodEndHeight = value(getInteger(keyPeriodEndHeight((currentPeriod - 1))))
240+ let $t01214212524 = if ((height > lastPeriodEndHeight))
241+ then {
242+ let updatedCurrentPeriod = (currentPeriod + 1)
243+ let periodStart = (lastPeriodEndHeight + 1)
244+ let periodEnd = ((periodStart + periodLength) - 1)
245+ $Tuple3(updatedCurrentPeriod, periodStart, periodEnd)
246+ }
247+ else $Tuple3(currentPeriod, lastPeriodStartHeight, lastPeriodEndHeight)
248+ let updatedCurrentPeriod = $t01214212524._1
249+ let periodStart = $t01214212524._2
250+ let periodEnd = $t01214212524._3
251+ $Tuple3(updatedCurrentPeriod, periodStart, periodEnd)
252+ }
253+ else $Tuple3(currentPeriod, valueOrElse(getInteger(keyPeriodStartHeight(currentPeriod)), height), valueOrElse(getInteger(keyPeriodEndHeight(currentPeriod)), ((height + periodLength) - 1)))
254+ let updatedCurrentPeriod = $t01187412792._1
255+ let periodStart = $t01187412792._2
256+ let periodEnd = $t01187412792._3
257+ let periodTotalAvailableToClaim = valueOrElse(getInteger(keyPeriodTotalAvailableToClaim(priceAssetId58, updatedCurrentPeriod)), totalPeriodPriceAssetAllowance)
258+ let periodUserAvailableToClaim = valueOrElse(getInteger(keyPeriodUserAvailableToClaim(priceAssetId58, updatedCurrentPeriod, userAddress58)), userPeriodPriceAssetAllowance)
259+ let periodMinAvailableToClaim = min([outAmount, periodTotalAvailableToClaim, periodUserAvailableToClaim])
260+ let usdtPriceAssetAllowableRatio = value(getInteger(keyUsdtPriceAssetAllowableRatio()))
261+ let putOneTknV2PriceAssetAmount = scale8
262+ let $t01343513688 = {
263+ let @ = invoke(addressFromStringValue(value(getString(keyUsdtPriceAssetStablePool()))), "putOneTknV2WithoutTakeFeeREADONLY", [putOneTknV2PriceAssetAmount, priceAssetId58], nil)
264+ if ($isInstanceOf(@, "(Int, Int, Int)"))
265+ then @
266+ else throw("Couldn't cast Any to (Int, Int, Int)")
267+ }
268+ if (($t01343513688 == $t01343513688))
269+ then {
270+ let bonus = $t01343513688._3
271+ let feeAmount = $t01343513688._2
272+ let lpAmount = $t01343513688._1
273+ let usdtAssetId = value(getString(keyUsdtAssetId()))
274+ let $t01375013968 = {
275+ let @ = invoke(addressFromStringValue(value(getString(keyUsdtPriceAssetStablePool()))), "getOneTknV2READONLY", [usdtAssetId, lpAmount], nil)
276+ if ($isInstanceOf(@, "(Int, Int)"))
277+ then @
278+ else throw("Couldn't cast Any to (Int, Int)")
279+ }
280+ if (($t01375013968 == $t01375013968))
281+ then {
282+ let getOneTknV2FeeAmount = $t01375013968._2
283+ let usdtAmount = $t01375013968._1
284+ let currentUsdtPriceAssetRatio = fraction(usdtAmount, putOneTknV2PriceAssetAmount, scale8)
285+ let endPeriodBlocksLeft = (periodEnd - height)
286+ $Tuple10(periodMinAvailableToClaim, periodTotalAvailableToClaim, periodUserAvailableToClaim, totalUserAvailableToClaim, usdtPriceAssetAllowableRatio, currentUsdtPriceAssetRatio, endPeriodBlocksLeft, updatedCurrentPeriod, periodStart, periodEnd)
287+ }
288+ else throw("Strict value is not equal to itself.")
289+ }
290+ else throw("Strict value is not equal to itself.")
291+ }
292+
293+
231294 func managerPublicKeyOrUnit () = match getString(keyManagerPublicKey()) {
232295 case s: String =>
233296 fromBase58String(s)
234297 case _: Unit =>
235298 unit
236299 case _ =>
237300 throw("Match error")
238301 }
239302
240303
241304 func pendingManagerPublicKeyOrUnit () = match getString(keyPendingManagerPublicKey()) {
242305 case s: String =>
243306 fromBase58String(s)
244307 case _: Unit =>
245308 unit
246309 case _ =>
247310 throw("Match error")
248311 }
249312
250313
251314 func mustManager (i) = {
252315 let pd = throw("Permission denied")
253316 match managerPublicKeyOrUnit() {
254317 case pk: ByteVector =>
255318 if ((i.callerPublicKey == pk))
256319 then true
257320 else pd
258321 case _: Unit =>
259322 if ((i.caller == this))
260323 then true
261324 else pd
262325 case _ =>
263326 throw("Match error")
264327 }
265328 }
266329
267330
268331 @Callable(i)
269332 func constructor (idoStart,idoDuration,claimStart,claimDuration,price,priceAssetId58,minInvestAmount) = {
270333 let priceMult = ((100 * 1000) * 1000)
271334 let idoEnd = (idoStart + idoDuration)
272335 if (isDefined(getString(keyConfig())))
273336 then throw("already initialized")
274337 else if (("3PMEHLx1j6zerarZTYfsGqDeeZqQoMpxq5S" != toString(i.caller)))
275338 then throw("not authorized")
276339 else if ((size(i.payments) != 1))
277340 then throw("exactly 1 payment must be attached")
278341 else if ((idoEnd >= claimStart))
279342 then throw("claimStart must be greater than idoEnd")
280343 else {
281344 let pmt = value(i.payments[0])
282345 let idoAssetId = value(pmt.assetId)
283346 let idoAssetInfo = valueOrErrorMessage(assetInfo(idoAssetId), "fail to load ido asset info")
284347 let idoAssetId58 = toBase58String(idoAssetId)
285348 let idoAssetMult = pow(10, 0, idoAssetInfo.decimals, 0, 0, DOWN)
286349 let priceAssetId = fromBase58String(priceAssetId58)
287350 let priceAssetInfo = valueOrErrorMessage(assetInfo(priceAssetId), "fail to load price asset info")
288351 let priceAssetMult = pow(10, 0, priceAssetInfo.decimals, 0, 0, DOWN)
289352 let origTotalsArray = readTotalsArrayOrDefault()
290353 let totalsDiff = [0, 0, 0, 0]
291354 [StringEntry(keyConfig(), fromatConfig(idoStart, idoDuration, claimStart, claimDuration, price, priceMult, idoAssetId58, idoAssetMult, priceAssetId58, priceAssetMult, minInvestAmount, pmt.amount)), TotalsEntry(keyTotals(), origTotalsArray, totalsDiff, claimStart)]
292355 }
293356 }
294357
295358
296359
297360 @Callable(i)
298361 func invest () = {
299362 let cfgArray = readConfigArray()
300363 let idoStart = parseIntValue(cfgArray[IdxCfgIdoStart])
301364 let idoDuration = parseIntValue(cfgArray[IdxCfgIdoDuration])
302365 let idoEnd = (idoStart + idoDuration)
303366 let claimStart = parseIntValue(cfgArray[IdxCfgClaimStart])
304367 let claimDuration = parseIntValue(cfgArray[IdxCfgClaimDuration])
305368 let price = parseIntValue(cfgArray[IdxCfgPrice])
306369 let priceMult = parseIntValue(cfgArray[IdxCfgPriceMult])
307370 let idoAssetId58 = cfgArray[IdxCfgIdoAssetId]
308371 let idoAssetId = fromBase58String(idoAssetId58)
309372 let idoAssetMult = parseIntValue(cfgArray[IdxCfgIdoAssetMult])
310373 let priceAssetId58 = cfgArray[IdxCfgPriceAssetId]
311374 let priceAssetId = fromBase58String(priceAssetId58)
312375 let priceAssetMult = parseIntValue(cfgArray[IdxCfgPriceAssetMult])
313376 let minIvestAmount = parseIntValue(cfgArray[IdxCfgMinInvestAmount])
314377 let userAddress = toString(i.caller)
315378 if ((idoStart > height))
316379 then throw("ido has not been started yet")
317380 else if ((height > idoEnd))
318381 then throw("ido has been already ended")
319382 else if ((size(i.payments) != 1))
320383 then throw("exactly 1 payment is expected")
321384 else {
322385 let pmt = value(i.payments[0])
323386 let pmtAssetId = value(pmt.assetId)
324387 let pmtAmount = pmt.amount
325388 if ((pmtAssetId != priceAssetId))
326389 then throw((("invalid payment asset id: " + toBase58String(pmtAssetId)) + " is expected"))
327390 else {
328391 let origInvestorArray = readInvestorArrayOrDefault(userAddress)
329392 let origTotalsArray = readTotalsArrayOrDefault()
330393 let newPriceTotalAmount = (parseIntValue(origTotalsArray[IdxInvTotalAmount]) + pmtAmount)
331394 let requiredIdoAssetAmount = (newPriceTotalAmount * 100)
332395 if ((requiredIdoAssetAmount > assetBalance(this, idoAssetId)))
333396 then throw("IDO asset has been - sold consider to use smaller payment")
334397 else {
335398 let totalsDiff = [pmtAmount, pmtAmount, 0, 0]
336399 [TotalsEntry(keyInvestor(userAddress), origInvestorArray, totalsDiff, claimStart), TotalsEntry(keyTotals(), origTotalsArray, totalsDiff, claimStart), InvestOperationHistoryEntry(userAddress, pmtAmount, 0, i.transactionId)]
337400 }
338401 }
339402 }
340403 }
341404
342405
343406
344407 @Callable(i)
345408 func claim (claimedAssetId58,userAddress58) = {
346409 let callerAddress58 = toString(i.caller)
347410 if ((userAddress58 != callerAddress58))
348411 then throw("not authorized")
349412 else {
350413 let cfgArray = readConfigArray()
351414 let priceAssetId58 = cfgArray[IdxCfgPriceAssetId]
352415 let claimResultTuple = internalClaim(claimedAssetId58, i.caller, i.transactionId)
353416 let totalsDiff = claimResultTuple._1
354417 let outAmount = claimResultTuple._2
355418 let outAssetId = claimResultTuple._3
356419 let origInvestArray = claimResultTuple._4
357420 let newClaimPeriodHeight = claimResultTuple._5
358421 let claimedPriceAmountFromDiff = totalsDiff[IdxDiffClaimedPriceAmountIncrement]
359422 let claimedIdoAssetAmountFromDiff = totalsDiff[IdxDiffClaimedIdoAssetAmountIncrement]
360423 let entries = if ((claimedAssetId58 == priceAssetId58))
361424 then {
362- let totalPeriodPriceAssetAllowance = value(getInteger(keyTotalPeriodAllowance(priceAssetId58)))
363- let userPeriodPriceAssetAllowance = value(getInteger(keyUserPeriodAllowance(priceAssetId58)))
364- let periodLength = value(getInteger(keyPeriodLength()))
365- let currentPeriod = valueOrElse(getInteger(keyCurrentPeriod()), 0)
366- let $t01698717941 = if ((currentPeriod > 0))
367- then {
368- let lastPeriodStartHeight = value(getInteger(keyPeriodStartHeight((currentPeriod - 1))))
369- let lastPeriodEndHeight = value(getInteger(keyPeriodEndHeight((currentPeriod - 1))))
370- let $t01726117657 = if ((height > lastPeriodEndHeight))
371- then {
372- let updatedCurrentPeriod = (currentPeriod + 1)
373- let periodStart = (lastPeriodEndHeight + 1)
374- let periodEnd = ((periodStart + periodLength) - 1)
375- $Tuple3(updatedCurrentPeriod, periodStart, periodEnd)
376- }
377- else $Tuple3(currentPeriod, lastPeriodStartHeight, lastPeriodEndHeight)
378- let updatedCurrentPeriod = $t01726117657._1
379- let periodStart = $t01726117657._2
380- let periodEnd = $t01726117657._3
381- $Tuple3(updatedCurrentPeriod, periodStart, periodEnd)
425+ let $t01962420068 = internalClaimV2(priceAssetId58, userAddress58, outAmount, totalsDiff[IdxDiffClaimedPriceAmountIncrement])
426+ let periodMinAvailableToClaim = $t01962420068._1
427+ let periodTotalAvailableToClaim = $t01962420068._2
428+ let periodUserAvailableToClaim = $t01962420068._3
429+ let totalUserAvailableToClaim = $t01962420068._4
430+ let usdtPriceAssetAllowableRatio = $t01962420068._5
431+ let currentUsdtPriceAssetRatio = $t01962420068._6
432+ let endPeriodBlocksLeft = $t01962420068._7
433+ let updatedCurrentPeriod = $t01962420068._8
434+ let periodStart = $t01962420068._9
435+ let periodEnd = $t01962420068._10
436+ let priceAssetBalance = valueOrElse(getInteger(keyPriceAssetBalance(userAddress58)), 0)
437+ let updatedPeriodTotalAvailableToClaim = (periodTotalAvailableToClaim - periodMinAvailableToClaim)
438+ let updatedPeriodUserAvailableToClaim = (periodUserAvailableToClaim - periodMinAvailableToClaim)
439+ let entries = if ((priceAssetBalance >= periodMinAvailableToClaim))
440+ then [ScriptTransfer(i.caller, periodMinAvailableToClaim, outAssetId), IntegerEntry(keyPriceAssetBalance(userAddress58), (priceAssetBalance - periodMinAvailableToClaim))]
441+ else {
442+ let updatedPriceAssetBalance = ((priceAssetBalance + outAmount) - periodMinAvailableToClaim)
443+[ScriptTransfer(i.caller, periodMinAvailableToClaim, outAssetId), TotalsEntry(keyInvestor(userAddress58), origInvestArray, totalsDiff, newClaimPeriodHeight), TotalsEntry(keyTotals(), readTotalsArrayOrDefault(), totalsDiff, newClaimPeriodHeight), IntegerEntry(keyPriceAssetBalance(userAddress58), updatedPriceAssetBalance)]
382444 }
383- else $Tuple3(currentPeriod, valueOrElse(getInteger(keyPeriodStartHeight(currentPeriod)), height), valueOrElse(getInteger(keyPeriodEndHeight(currentPeriod)), ((height + periodLength) - 1)))
384- let updatedCurrentPeriod = $t01698717941._1
385- let periodStart = $t01698717941._2
386- let periodEnd = $t01698717941._3
387- let periodTotalAvailableToClaim = valueOrElse(getInteger(keyPeriodTotalAvailableToClaim(priceAssetId58, updatedCurrentPeriod)), totalPeriodPriceAssetAllowance)
388- let periodUserAvailableToClaim = valueOrElse(getInteger(keyPeriodUserAvailableToClaim(priceAssetId58, updatedCurrentPeriod, userAddress58)), userPeriodPriceAssetAllowance)
389- let periodMinAvailableToClaim = min([outAmount, periodTotalAvailableToClaim, periodUserAvailableToClaim])
390- let totalUserAvailableToClaim = totalsDiff[IdxInvClaimedPriceAssetAmount]
391- let usdtPriceAssetAllowableRatio = value(getInteger(keyUsdtPriceAssetAllowableRatio()))
392- let putOneTknV2PriceAssetAmount = scale8
393- let $t01869718960 = {
394- let @ = invoke(addressFromStringValue(value(getString(keyUsdtPriceAssetStablePool()))), "putOneTknV2WithoutTakeFeeREADONLY", [putOneTknV2PriceAssetAmount, priceAssetId58], nil)
395- if ($isInstanceOf(@, "(Int, Int, Int)"))
396- then @
397- else throw("Couldn't cast Any to (Int, Int, Int)")
398- }
399- if (($t01869718960 == $t01869718960))
400- then {
401- let bonus = $t01869718960._3
402- let feeAmount = $t01869718960._2
403- let lpAmount = $t01869718960._1
404- let usdtAssetId = value(getString(keyUsdtAssetId()))
405- let $t01902619254 = {
406- let @ = invoke(addressFromStringValue(value(getString(keyUsdtPriceAssetStablePool()))), "getOneTknV2READONLY", [usdtAssetId, lpAmount], nil)
407- if ($isInstanceOf(@, "(Int, Int)"))
408- then @
409- else throw("Couldn't cast Any to (Int, Int)")
410- }
411- if (($t01902619254 == $t01902619254))
412- then {
413- let getOneTknV2FeeAmount = $t01902619254._2
414- let usdtAmount = $t01902619254._1
415- let currentUsdtPriceAssetRatio = fraction(usdtAmount, putOneTknV2PriceAssetAmount, scale8)
416- let endPeriodBlocksLeft = (periodEnd - height)
417- let priceAssetBalance = valueOrElse(getInteger(keyPriceAssetBalance(userAddress58)), 0)
418- let updatedPeriodTotalAvailableToClaim = (periodTotalAvailableToClaim - periodMinAvailableToClaim)
419- let updatedPeriodUserAvailableToClaim = (periodUserAvailableToClaim - periodMinAvailableToClaim)
420- let entries = if ((priceAssetBalance >= periodMinAvailableToClaim))
421- then [ScriptTransfer(i.caller, periodMinAvailableToClaim, outAssetId), IntegerEntry(keyPriceAssetBalance(userAddress58), (priceAssetBalance - periodMinAvailableToClaim))]
422- else {
423- let updatedPriceAssetBalance = ((priceAssetBalance + outAmount) - periodMinAvailableToClaim)
424-[ScriptTransfer(i.caller, periodMinAvailableToClaim, outAssetId), TotalsEntry(keyInvestor(userAddress58), origInvestArray, totalsDiff, newClaimPeriodHeight), TotalsEntry(keyTotals(), readTotalsArrayOrDefault(), totalsDiff, newClaimPeriodHeight), IntegerEntry(keyPriceAssetBalance(userAddress58), updatedPriceAssetBalance)]
425- }
426- $Tuple2(([IntegerEntry(keyCurrentPeriod(), currentPeriod), IntegerEntry(keyPeriodStartHeight(currentPeriod), periodStart), IntegerEntry(keyPeriodEndHeight(currentPeriod), periodEnd), IntegerEntry(keyPeriodTotalAvailableToClaim(priceAssetId58, currentPeriod), updatedPeriodTotalAvailableToClaim), IntegerEntry(keyPeriodUserAvailableToClaim(priceAssetId58, currentPeriod, userAddress58), updatedPeriodUserAvailableToClaim), ClaimOperationHistoryEntry(userAddress58, claimedPriceAmountFromDiff, claimedIdoAssetAmountFromDiff, i.transactionId)] ++ entries), unit)
427- }
428- else throw("Strict value is not equal to itself.")
429- }
430- else throw("Strict value is not equal to itself.")
445+ $Tuple2(([IntegerEntry(keyCurrentPeriod(), updatedCurrentPeriod), IntegerEntry(keyPeriodStartHeight(updatedCurrentPeriod), periodStart), IntegerEntry(keyPeriodEndHeight(updatedCurrentPeriod), periodEnd), IntegerEntry(keyPeriodTotalAvailableToClaim(priceAssetId58, updatedCurrentPeriod), updatedPeriodTotalAvailableToClaim), IntegerEntry(keyPeriodUserAvailableToClaim(priceAssetId58, updatedCurrentPeriod, userAddress58), updatedPeriodUserAvailableToClaim), ClaimOperationHistoryEntry(userAddress58, claimedPriceAmountFromDiff, claimedIdoAssetAmountFromDiff, i.transactionId)] ++ entries), unit)
431446 }
432447 else $Tuple2([ScriptTransfer(i.caller, outAmount, outAssetId), TotalsEntry(keyInvestor(userAddress58), origInvestArray, totalsDiff, newClaimPeriodHeight), TotalsEntry(keyTotals(), readTotalsArrayOrDefault(), totalsDiff, newClaimPeriodHeight), ClaimOperationHistoryEntry(userAddress58, claimedPriceAmountFromDiff, claimedIdoAssetAmountFromDiff, i.transactionId)], unit)
433448 entries
434449 }
435450 }
436451
437452
438453
439454 @Callable(i)
440455 func claimREADONLY (claimedAssetId58,userAddress58) = {
441456 let claimResultTuple = internalClaim(claimedAssetId58, addressFromStringValue(userAddress58), fromBase58String(""))
442457 let totalsDiff = claimResultTuple._1
443458 let outAmount = claimResultTuple._2
444459 let outAssetId = claimResultTuple._3
445460 let origInvestArray = claimResultTuple._4
446461 let newClaimPeriodHeight = claimResultTuple._5
447462 let availableToClaimArray = claimResultTuple._6
448463 let availablePriceAmountToClaim = availableToClaimArray[0]
449464 let availableIdoAmountToClaim = availableToClaimArray[1]
450465 $Tuple2(nil, makeString(["%s%d%d", userAddress58, toString(availablePriceAmountToClaim), toString(availableIdoAmountToClaim)], SEP))
466+ }
467+
468+
469+
470+@Callable(i)
471+func claimV2READONLY (claimedAssetId58,userAddress58) = {
472+ let claimResultTuple = internalClaim(claimedAssetId58, addressFromStringValue(userAddress58), fromBase58String(""))
473+ let totalsDiff = claimResultTuple._1
474+ let outAmount = claimResultTuple._2
475+ let outAssetId = claimResultTuple._3
476+ let origInvestArray = claimResultTuple._4
477+ let newClaimPeriodHeight = claimResultTuple._5
478+ let availableToClaimArray = claimResultTuple._6
479+ let availablePriceAmountToClaim = availableToClaimArray[0]
480+ let availableIdoAmountToClaim = availableToClaimArray[1]
481+ let $t02525925673 = internalClaimV2(claimedAssetId58, userAddress58, outAmount, totalsDiff[IdxDiffClaimedPriceAmountIncrement])
482+ let periodMinAvailableToClaim = $t02525925673._1
483+ let periodTotalAvailableToClaim = $t02525925673._2
484+ let periodUserAvailableToClaim = $t02525925673._3
485+ let totalUserAvailableToClaim = $t02525925673._4
486+ let usdtPriceAssetAllowableRatio = $t02525925673._5
487+ let currentUsdtPriceAssetRatio = $t02525925673._6
488+ let endPeriodBlocksLeft = $t02525925673._7
489+ let updatedCurrentPeriod = $t02525925673._8
490+ let periodStart = $t02525925673._9
491+ let periodEnd = $t02525925673._10
492+ let resultString = makeString(["%d%d%d%d%d%d%d", toString(totalUserAvailableToClaim), toString(availableIdoAmountToClaim), toString(periodMinAvailableToClaim), toString(periodTotalAvailableToClaim), toString(usdtPriceAssetAllowableRatio), toString(currentUsdtPriceAssetRatio), toString(endPeriodBlocksLeft)], SEP)
493+ $Tuple2(nil, resultString)
451494 }
452495
453496
454497
455498 @Callable(i)
456499 func setManager (pendingManagerPublicKey) = {
457500 let checkCaller = mustManager(i)
458501 if ((checkCaller == checkCaller))
459502 then {
460503 let checkManagerPublicKey = fromBase58String(pendingManagerPublicKey)
461504 if ((checkManagerPublicKey == checkManagerPublicKey))
462505 then [StringEntry(keyPendingManagerPublicKey(), pendingManagerPublicKey)]
463506 else throw("Strict value is not equal to itself.")
464507 }
465508 else throw("Strict value is not equal to itself.")
466509 }
467510
468511
469512
470513 @Callable(i)
471514 func confirmManager () = {
472515 let pm = pendingManagerPublicKeyOrUnit()
473516 let hasPM = if (isDefined(pm))
474517 then true
475518 else throw("No pending manager")
476519 if ((hasPM == hasPM))
477520 then {
478521 let checkPM = if ((i.callerPublicKey == value(pm)))
479522 then true
480523 else throw("You are not pending manager")
481524 if ((checkPM == checkPM))
482525 then [StringEntry(keyManagerPublicKey(), toBase58String(value(pm))), DeleteEntry(keyPendingManagerPublicKey())]
483526 else throw("Strict value is not equal to itself.")
484527 }
485528 else throw("Strict value is not equal to itself.")
486529 }
487530
488531
489532 @Verifier(tx)
490533 func verify () = {
491534 let targetPublicKey = match managerPublicKeyOrUnit() {
492535 case pk: ByteVector =>
493536 pk
494537 case _: Unit =>
495538 tx.senderPublicKey
496539 case _ =>
497540 throw("Match error")
498541 }
499542 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
500543 }
501544

github/deemru/w8io/169f3d6 
63.20 ms