tx · cLn7pSKTvUPDA7kRF9LLbDscMU16HPvJLMnj8Fgp5Vi

3MvZpvvbmovEt3pvdDZKvhKRjjQxdbUD6Tv:  -0.02400000 Waves

2022.11.02 19:24 [2299724] smart account 3MvZpvvbmovEt3pvdDZKvhKRjjQxdbUD6Tv > SELF 0.00000000 Waves

{ "type": 13, "id": "cLn7pSKTvUPDA7kRF9LLbDscMU16HPvJLMnj8Fgp5Vi", "fee": 2400000, "feeAssetId": null, "timestamp": 1667406266734, "version": 1, "sender": "3MvZpvvbmovEt3pvdDZKvhKRjjQxdbUD6Tv", "senderPublicKey": "39YkRD2qWXTcdNBr4CbDnm8g8SAB2FKVaDeGYahcFHHx", "proofs": [ "3TtJUdrJdFhAAQNdC6FYUuvdo21CZzX79xWzDdzCtnUn6GKGHg2pSeZyAmdPWm6rdzBPa8my9M1epYU533PgdaEd" ], "script": "base64:AAIFAAAAAAAADecIAhIJCgcBAQEBAQgBEgASBAoCCAgSBAoCCAgSBAoCCAgSAwoBCBIAIg9nZXRTdHJpbmdPckZhaWwiA2tleSIDU0VQIghCVUZTQ0FMRSIGc2NhbGU4Ih1jb252ZXJ0UHJpY2VBc3NldEludG9JZG9Bc3NldCIQcHJpY2VBc3NldEFtb3VudCIOcHJpY2VBc3NldE1VTFQiBXByaWNlIglwcmljZU1VTFQiDGlkb0Fzc2V0TVVMVCIPYlByaWNlQXNzZXRNVUxUIg1iSWRvQXNzZXRNVUxUIg5iUHJpY2VBc3NldEJVRiIPYkFtb3VudEFzc2V0QlVGIg5JZHhDZmdJZG9TdGFydCIRSWR4Q2ZnSWRvRHVyYXRpb24iEElkeENmZ0NsYWltU3RhcnQiE0lkeENmZ0NsYWltRHVyYXRpb24iC0lkeENmZ1ByaWNlIg9JZHhDZmdQcmljZU11bHQiEElkeENmZ0lkb0Fzc2V0SWQiEklkeENmZ0lkb0Fzc2V0TXVsdCISSWR4Q2ZnUHJpY2VBc3NldElkIhRJZHhDZmdQcmljZUFzc2V0TXVsdCIVSWR4Q2ZnTWluSW52ZXN0QW1vdW50Ig1mcm9tYXRDb25maWdTIghpZG9TdGFydCILaWRvRHVyYXRpb24iCmNsYWltU3RhcnQiDWNsYWltRHVyYXRpb24iCXByaWNlTXVsdCIMaWRvQXNzZXRJZDU4IgxpZG9Bc3NldE11bHQiDnByaWNlQXNzZXRJZDU4Ig5wcmljZUFzc2V0TXVsdCIPbWluSW52ZXN0QW1vdW50IhN0b3RhbElkb0Fzc2V0VG9TZWxsIgxmcm9tYXRDb25maWciEUlkeEludlRvdGFsQW1vdW50IhVJZHhJbnZSZW1haW5pbmdBbW91bnQiHUlkeEludkNsYWltZWRQcmljZUFzc2V0QW1vdW50IhtJZHhJbnZDbGFpbWVkSWRvQXNzZXRBbW91bnQiF0lkeEludkxhc3RDbGFpbWVkSGVpZ2h0Ig9mb3JtYXRJbnZlc3RvclMiC3RvdGFsQW1vdW50Ig9yZW1haW5pbmdBbW91bnQiF2NsYWltZWRQcmljZUFzc2V0QW1vdW50IhVjbGFpbWVkSWRvQXNzZXRBbW91bnQiEWxhc3RDbGFpbWVkSGVpZ2h0Ig5mb3JtYXRJbnZlc3RvciITZm9ybWF0SGlzdG9yeVJlY29yZCIOaWRvQXNzZXRBbW91bnQiCWtleUNvbmZpZyILa2V5SW52ZXN0b3IiC3VzZXJBZGRyZXNzIglrZXlUb3RhbHMiGWtleU9wZXJhdGlvbkhpc3RvcnlSZWNvcmQiBHR5cGUiBnR4SWQ1OCIUa2V5VVNETkNsYWltRGlzYWJsZWQiFWtleVVTRE5DbGFpbUVuZEhlaWdodCIPa2V5UGVyaW9kTGVuZ3RoIhBrZXlDdXJyZW50UGVyaW9kIhRrZXlQZXJpb2RTdGFydEhlaWdodCIJcGVyaW9kTnVtIhJrZXlQZXJpb2RFbmRIZWlnaHQiH2tleVVzZHRQcmljZUFzc2V0QWxsb3dhYmxlUmF0aW8iF2tleVRvdGFsUGVyaW9kQWxsb3dhbmNlIgdhc3NldElkIhZrZXlVc2VyUGVyaW9kQWxsb3dhbmNlIh5rZXlQZXJpb2RUb3RhbEF2YWlsYWJsZVRvQ2xhaW0iHWtleVBlcmlvZFVzZXJBdmFpbGFibGVUb0NsYWltIhtrZXlVc2R0UHJpY2VBc3NldFN0YWJsZVBvb2wiDmtleVVzZHRBc3NldElkIhRrZXlQcmljZUFzc2V0QmFsYW5jZSIHYWRkcmVzcyITa2V5TWFuYWdlclB1YmxpY0tleSIaa2V5UGVuZGluZ01hbmFnZXJQdWJsaWNLZXkiD3JlYWRDb25maWdBcnJheSIjcmVhZFRvdGFsc0FycmF5T3JEZWZhdWx0QnlDdXN0b21LZXkiCWN1c3RvbUtleSIYcmVhZFRvdGFsc0FycmF5T3JEZWZhdWx0IhpyZWFkSW52ZXN0b3JBcnJheU9yRGVmYXVsdCIXcmVhZEludmVzdG9yQXJyYXlPckZhaWwiFUlkeERpZmZUb3RhbEluY3JlbWVudCIkSWR4RGlmZlJlbWFpbmluZ1ByaWNlQW1vdW50SW5jcmVtZW50IiJJZHhEaWZmQ2xhaW1lZFByaWNlQW1vdW50SW5jcmVtZW50IiVJZHhEaWZmQ2xhaW1lZElkb0Fzc2V0QW1vdW50SW5jcmVtZW50IgtUb3RhbHNFbnRyeSIJb3JpZ0FycmF5Ig1pbmNyZW1lbnREaWZmIhRuZXdMYXN0Q2xhaW1lZEhlaWdodCIObmV3VG90YWxBbW91bnQiEm5ld1JlbWFpbmluZ0Ftb3VudCIabmV3Q2xhaW1lZFByaWNlQXNzZXRBbW91bnQiGG5ld0NsYWltZWRJZG9Bc3NldEFtb3VudCIbSW52ZXN0T3BlcmF0aW9uSGlzdG9yeUVudHJ5IgR0eElkIhpDbGFpbU9wZXJhdGlvbkhpc3RvcnlFbnRyeSINaW50ZXJuYWxDbGFpbSIQY2xhaW1lZEFzc2V0SWQ1OCIIY2ZnQXJyYXkiCGNsYWltRW5kIgppZG9Bc3NldElkIgxwcmljZUFzc2V0SWQiDXVzZXJBZGRyZXNzNTgiD29yaWdJbnZlc3RBcnJheSIRaW52ZXN0VG90YWxBbW91bnQiGmludmVzdExhc3RDbGFpbWVkSGVpZ2h0VE1QIhdpbnZlc3RMYXN0Q2xhaW1lZEhlaWdodCIUbmV3Q2xhaW1QZXJpb2RIZWlnaHQiDmNsYWltaW5nQmxvY2tzIhhjbGFpbWluZ1ByaWNlQXNzZXRBbW91bnQiFmNsYWltaW5nSWRvQXNzZXRBbW91bnQiBmlzVVNETiITaXNVU0ROQ2xhaW1EaXNhYmxlZCIQaXNVU0ROQ2xhaW1FbmRlZCIHJG1hdGNoMCIDZW5kIgZjaGVja3MiD2ludGVybmFsQ2xhaW1WMiIJb3V0QW1vdW50Ihl0b3RhbFVzZXJBdmFpbGFibGVUb0NsYWltIh50b3RhbFBlcmlvZFByaWNlQXNzZXRBbGxvd2FuY2UiHXVzZXJQZXJpb2RQcmljZUFzc2V0QWxsb3dhbmNlIgxwZXJpb2RMZW5ndGgiDWN1cnJlbnRQZXJpb2QiDSR0MDExODc0MTI3OTIiFWxhc3RQZXJpb2RTdGFydEhlaWdodCITbGFzdFBlcmlvZEVuZEhlaWdodCINJHQwMTIxNDIxMjUyNCIUdXBkYXRlZEN1cnJlbnRQZXJpb2QiC3BlcmlvZFN0YXJ0IglwZXJpb2RFbmQiG3BlcmlvZFRvdGFsQXZhaWxhYmxlVG9DbGFpbSIacGVyaW9kVXNlckF2YWlsYWJsZVRvQ2xhaW0iGXBlcmlvZE1pbkF2YWlsYWJsZVRvQ2xhaW0iHHVzZHRQcmljZUFzc2V0QWxsb3dhYmxlUmF0aW8iG3B1dE9uZVRrblYyUHJpY2VBc3NldEFtb3VudCINJHQwMTM0MzUxMzY4OCIBQCIFYm9udXMiCWZlZUFtb3VudCIIbHBBbW91bnQiC3VzZHRBc3NldElkIg0kdDAxMzc1MDEzOTY4IhRnZXRPbmVUa25WMkZlZUFtb3VudCIKdXNkdEFtb3VudCIaY3VycmVudFVzZHRQcmljZUFzc2V0UmF0aW8iE2VuZFBlcmlvZEJsb2Nrc0xlZnQiFm1hbmFnZXJQdWJsaWNLZXlPclVuaXQiAXMiHXBlbmRpbmdNYW5hZ2VyUHVibGljS2V5T3JVbml0IgttdXN0TWFuYWdlciIBaSICcGQiAnBrIgZpZG9FbmQiA3BtdCIMaWRvQXNzZXRJbmZvIg5wcmljZUFzc2V0SW5mbyIPb3JpZ1RvdGFsc0FycmF5Igp0b3RhbHNEaWZmIg5taW5JdmVzdEFtb3VudCIKcG10QXNzZXRJZCIJcG10QW1vdW50IhFvcmlnSW52ZXN0b3JBcnJheSITbmV3UHJpY2VUb3RhbEFtb3VudCIWcmVxdWlyZWRJZG9Bc3NldEFtb3VudCIPY2FsbGVyQWRkcmVzczU4IhBjbGFpbVJlc3VsdFR1cGxlIgpvdXRBc3NldElkIhpjbGFpbWVkUHJpY2VBbW91bnRGcm9tRGlmZiIdY2xhaW1lZElkb0Fzc2V0QW1vdW50RnJvbURpZmYiB2VudHJpZXMiDSR0MDE5NjI0MjAwNjgiEXByaWNlQXNzZXRCYWxhbmNlIiJ1cGRhdGVkUGVyaW9kVG90YWxBdmFpbGFibGVUb0NsYWltIiF1cGRhdGVkUGVyaW9kVXNlckF2YWlsYWJsZVRvQ2xhaW0iGHVwZGF0ZWRQcmljZUFzc2V0QmFsYW5jZSIVYXZhaWxhYmxlVG9DbGFpbUFycmF5IhthdmFpbGFibGVQcmljZUFtb3VudFRvQ2xhaW0iGWF2YWlsYWJsZUlkb0Ftb3VudFRvQ2xhaW0iDSR0MDI1MzQ3MjU3NTkiDHJlc3VsdFN0cmluZyIXcGVuZGluZ01hbmFnZXJQdWJsaWNLZXkiC2NoZWNrQ2FsbGVyIhVjaGVja01hbmFnZXJQdWJsaWNLZXkiAnBtIgVoYXNQTSIHY2hlY2tQTSICdHgiBnZlcmlmeSIPdGFyZ2V0UHVibGljS2V5AAAAPwEAAAABYQAAAAEAAAABYgkBAAAAE3ZhbHVl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", "chainId": 84, "height": 2299724, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 8TsecpdEE6i1S8ux9PTHTQ8WFid6DyVhFPpQhu8yogGD Next: iVezS8psV1r55PtN5XbtJNZWqJh4tKZYsgsSNKrtzdN Diff:
OldNewDifferences
491491 let updatedCurrentPeriod = $t02534725759._8
492492 let periodStart = $t02534725759._9
493493 let periodEnd = $t02534725759._10
494- 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)
494+ let resultString = makeString(["%d%d%d%d%d%d%d", toString(availableIdoAmountToClaim), toString(periodMinAvailableToClaim), toString(periodTotalAvailableToClaim), toString(usdtPriceAssetAllowableRatio), toString(currentUsdtPriceAssetRatio), toString(endPeriodBlocksLeft)], SEP)
495495 $Tuple2(nil, resultString)
496496 }
497497
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
231231 func internalClaimV2 (priceAssetId58,userAddress58,outAmount,totalUserAvailableToClaim) = {
232232 let totalPeriodPriceAssetAllowance = value(getInteger(keyTotalPeriodAllowance(priceAssetId58)))
233233 let userPeriodPriceAssetAllowance = value(getInteger(keyUserPeriodAllowance(priceAssetId58)))
234234 let periodLength = value(getInteger(keyPeriodLength()))
235235 let currentPeriod = valueOrElse(getInteger(keyCurrentPeriod()), 0)
236236 let $t01187412792 = if ((currentPeriod > 0))
237237 then {
238238 let lastPeriodStartHeight = value(getInteger(keyPeriodStartHeight((currentPeriod - 1))))
239239 let lastPeriodEndHeight = value(getInteger(keyPeriodEndHeight((currentPeriod - 1))))
240240 let $t01214212524 = if ((height > lastPeriodEndHeight))
241241 then {
242242 let updatedCurrentPeriod = (currentPeriod + 1)
243243 let periodStart = (lastPeriodEndHeight + 1)
244244 let periodEnd = ((periodStart + periodLength) - 1)
245245 $Tuple3(updatedCurrentPeriod, periodStart, periodEnd)
246246 }
247247 else $Tuple3(currentPeriod, lastPeriodStartHeight, lastPeriodEndHeight)
248248 let updatedCurrentPeriod = $t01214212524._1
249249 let periodStart = $t01214212524._2
250250 let periodEnd = $t01214212524._3
251251 $Tuple3(updatedCurrentPeriod, periodStart, periodEnd)
252252 }
253253 else $Tuple3(currentPeriod, valueOrElse(getInteger(keyPeriodStartHeight(currentPeriod)), height), valueOrElse(getInteger(keyPeriodEndHeight(currentPeriod)), ((height + periodLength) - 1)))
254254 let updatedCurrentPeriod = $t01187412792._1
255255 let periodStart = $t01187412792._2
256256 let periodEnd = $t01187412792._3
257257 let periodTotalAvailableToClaim = valueOrElse(getInteger(keyPeriodTotalAvailableToClaim(priceAssetId58, updatedCurrentPeriod)), totalPeriodPriceAssetAllowance)
258258 let periodUserAvailableToClaim = valueOrElse(getInteger(keyPeriodUserAvailableToClaim(priceAssetId58, updatedCurrentPeriod, userAddress58)), userPeriodPriceAssetAllowance)
259259 let periodMinAvailableToClaim = min([outAmount, periodTotalAvailableToClaim, periodUserAvailableToClaim])
260260 let usdtPriceAssetAllowableRatio = value(getInteger(keyUsdtPriceAssetAllowableRatio()))
261261 let putOneTknV2PriceAssetAmount = scale8
262262 let $t01343513688 = {
263263 let @ = invoke(addressFromStringValue(value(getString(keyUsdtPriceAssetStablePool()))), "putOneTknV2WithoutTakeFeeREADONLY", [putOneTknV2PriceAssetAmount, priceAssetId58], nil)
264264 if ($isInstanceOf(@, "(Int, Int, Int)"))
265265 then @
266266 else throw("Couldn't cast Any to (Int, Int, Int)")
267267 }
268268 if (($t01343513688 == $t01343513688))
269269 then {
270270 let bonus = $t01343513688._3
271271 let feeAmount = $t01343513688._2
272272 let lpAmount = $t01343513688._1
273273 let usdtAssetId = value(getString(keyUsdtAssetId()))
274274 let $t01375013968 = {
275275 let @ = invoke(addressFromStringValue(value(getString(keyUsdtPriceAssetStablePool()))), "getOneTknV2READONLY", [usdtAssetId, lpAmount], nil)
276276 if ($isInstanceOf(@, "(Int, Int)"))
277277 then @
278278 else throw("Couldn't cast Any to (Int, Int)")
279279 }
280280 if (($t01375013968 == $t01375013968))
281281 then {
282282 let getOneTknV2FeeAmount = $t01375013968._2
283283 let usdtAmount = $t01375013968._1
284284 let currentUsdtPriceAssetRatio = fraction(usdtAmount, putOneTknV2PriceAssetAmount, scale8)
285285 let endPeriodBlocksLeft = (periodEnd - height)
286286 $Tuple10(periodMinAvailableToClaim, periodTotalAvailableToClaim, periodUserAvailableToClaim, totalUserAvailableToClaim, usdtPriceAssetAllowableRatio, currentUsdtPriceAssetRatio, endPeriodBlocksLeft, updatedCurrentPeriod, periodStart, periodEnd)
287287 }
288288 else throw("Strict value is not equal to itself.")
289289 }
290290 else throw("Strict value is not equal to itself.")
291291 }
292292
293293
294294 func managerPublicKeyOrUnit () = match getString(keyManagerPublicKey()) {
295295 case s: String =>
296296 fromBase58String(s)
297297 case _: Unit =>
298298 unit
299299 case _ =>
300300 throw("Match error")
301301 }
302302
303303
304304 func pendingManagerPublicKeyOrUnit () = match getString(keyPendingManagerPublicKey()) {
305305 case s: String =>
306306 fromBase58String(s)
307307 case _: Unit =>
308308 unit
309309 case _ =>
310310 throw("Match error")
311311 }
312312
313313
314314 func mustManager (i) = {
315315 let pd = throw("Permission denied")
316316 match managerPublicKeyOrUnit() {
317317 case pk: ByteVector =>
318318 if ((i.callerPublicKey == pk))
319319 then true
320320 else pd
321321 case _: Unit =>
322322 if ((i.caller == this))
323323 then true
324324 else pd
325325 case _ =>
326326 throw("Match error")
327327 }
328328 }
329329
330330
331331 @Callable(i)
332332 func constructor (idoStart,idoDuration,claimStart,claimDuration,price,priceAssetId58,minInvestAmount) = {
333333 let priceMult = ((100 * 1000) * 1000)
334334 let idoEnd = (idoStart + idoDuration)
335335 if (isDefined(getString(keyConfig())))
336336 then throw("already initialized")
337337 else if (("3PMEHLx1j6zerarZTYfsGqDeeZqQoMpxq5S" != toString(i.caller)))
338338 then throw("not authorized")
339339 else if ((size(i.payments) != 1))
340340 then throw("exactly 1 payment must be attached")
341341 else if ((idoEnd >= claimStart))
342342 then throw("claimStart must be greater than idoEnd")
343343 else {
344344 let pmt = value(i.payments[0])
345345 let idoAssetId = value(pmt.assetId)
346346 let idoAssetInfo = valueOrErrorMessage(assetInfo(idoAssetId), "fail to load ido asset info")
347347 let idoAssetId58 = toBase58String(idoAssetId)
348348 let idoAssetMult = pow(10, 0, idoAssetInfo.decimals, 0, 0, DOWN)
349349 let priceAssetId = fromBase58String(priceAssetId58)
350350 let priceAssetInfo = valueOrErrorMessage(assetInfo(priceAssetId), "fail to load price asset info")
351351 let priceAssetMult = pow(10, 0, priceAssetInfo.decimals, 0, 0, DOWN)
352352 let origTotalsArray = readTotalsArrayOrDefault()
353353 let totalsDiff = [0, 0, 0, 0]
354354 [StringEntry(keyConfig(), fromatConfig(idoStart, idoDuration, claimStart, claimDuration, price, priceMult, idoAssetId58, idoAssetMult, priceAssetId58, priceAssetMult, minInvestAmount, pmt.amount)), TotalsEntry(keyTotals(), origTotalsArray, totalsDiff, claimStart)]
355355 }
356356 }
357357
358358
359359
360360 @Callable(i)
361361 func invest () = {
362362 let cfgArray = readConfigArray()
363363 let idoStart = parseIntValue(cfgArray[IdxCfgIdoStart])
364364 let idoDuration = parseIntValue(cfgArray[IdxCfgIdoDuration])
365365 let idoEnd = (idoStart + idoDuration)
366366 let claimStart = parseIntValue(cfgArray[IdxCfgClaimStart])
367367 let claimDuration = parseIntValue(cfgArray[IdxCfgClaimDuration])
368368 let price = parseIntValue(cfgArray[IdxCfgPrice])
369369 let priceMult = parseIntValue(cfgArray[IdxCfgPriceMult])
370370 let idoAssetId58 = cfgArray[IdxCfgIdoAssetId]
371371 let idoAssetId = fromBase58String(idoAssetId58)
372372 let idoAssetMult = parseIntValue(cfgArray[IdxCfgIdoAssetMult])
373373 let priceAssetId58 = cfgArray[IdxCfgPriceAssetId]
374374 let priceAssetId = fromBase58String(priceAssetId58)
375375 let priceAssetMult = parseIntValue(cfgArray[IdxCfgPriceAssetMult])
376376 let minIvestAmount = parseIntValue(cfgArray[IdxCfgMinInvestAmount])
377377 let userAddress = toString(i.caller)
378378 if ((idoStart > height))
379379 then throw("ido has not been started yet")
380380 else if ((height > idoEnd))
381381 then throw("ido has been already ended")
382382 else if ((size(i.payments) != 1))
383383 then throw("exactly 1 payment is expected")
384384 else {
385385 let pmt = value(i.payments[0])
386386 let pmtAssetId = value(pmt.assetId)
387387 let pmtAmount = pmt.amount
388388 if ((pmtAssetId != priceAssetId))
389389 then throw((("invalid payment asset id: " + toBase58String(pmtAssetId)) + " is expected"))
390390 else {
391391 let origInvestorArray = readInvestorArrayOrDefault(userAddress)
392392 let origTotalsArray = readTotalsArrayOrDefault()
393393 let newPriceTotalAmount = (parseIntValue(origTotalsArray[IdxInvTotalAmount]) + pmtAmount)
394394 let requiredIdoAssetAmount = (newPriceTotalAmount * 100)
395395 if ((requiredIdoAssetAmount > assetBalance(this, idoAssetId)))
396396 then throw("IDO asset has been - sold consider to use smaller payment")
397397 else {
398398 let totalsDiff = [pmtAmount, pmtAmount, 0, 0]
399399 [TotalsEntry(keyInvestor(userAddress), origInvestorArray, totalsDiff, claimStart), TotalsEntry(keyTotals(), origTotalsArray, totalsDiff, claimStart), InvestOperationHistoryEntry(userAddress, pmtAmount, 0, i.transactionId)]
400400 }
401401 }
402402 }
403403 }
404404
405405
406406
407407 @Callable(i)
408408 func claim (claimedAssetId58,userAddress58) = {
409409 let callerAddress58 = toString(i.caller)
410410 if ((userAddress58 != callerAddress58))
411411 then throw("not authorized")
412412 else {
413413 let cfgArray = readConfigArray()
414414 let priceAssetId58 = cfgArray[IdxCfgPriceAssetId]
415415 let claimResultTuple = internalClaim(claimedAssetId58, i.caller, i.transactionId)
416416 let totalsDiff = claimResultTuple._1
417417 let outAmount = claimResultTuple._2
418418 let outAssetId = claimResultTuple._3
419419 let origInvestArray = claimResultTuple._4
420420 let newClaimPeriodHeight = claimResultTuple._5
421421 let claimedPriceAmountFromDiff = totalsDiff[IdxDiffClaimedPriceAmountIncrement]
422422 let claimedIdoAssetAmountFromDiff = totalsDiff[IdxDiffClaimedIdoAssetAmountIncrement]
423423 let entries = if ((claimedAssetId58 == priceAssetId58))
424424 then {
425425 let $t01962420068 = internalClaimV2(priceAssetId58, userAddress58, outAmount, totalsDiff[IdxDiffClaimedPriceAmountIncrement])
426426 let periodMinAvailableToClaim = $t01962420068._1
427427 let periodTotalAvailableToClaim = $t01962420068._2
428428 let periodUserAvailableToClaim = $t01962420068._3
429429 let totalUserAvailableToClaim = $t01962420068._4
430430 let usdtPriceAssetAllowableRatio = $t01962420068._5
431431 let currentUsdtPriceAssetRatio = $t01962420068._6
432432 let endPeriodBlocksLeft = $t01962420068._7
433433 let updatedCurrentPeriod = $t01962420068._8
434434 let periodStart = $t01962420068._9
435435 let periodEnd = $t01962420068._10
436436 let priceAssetBalance = valueOrElse(getInteger(keyPriceAssetBalance(userAddress58)), 0)
437437 let updatedPeriodTotalAvailableToClaim = (periodTotalAvailableToClaim - periodMinAvailableToClaim)
438438 let updatedPeriodUserAvailableToClaim = (periodUserAvailableToClaim - periodMinAvailableToClaim)
439439 let entries = if ((priceAssetBalance >= periodMinAvailableToClaim))
440440 then [ScriptTransfer(i.caller, periodMinAvailableToClaim, outAssetId), IntegerEntry(keyPriceAssetBalance(userAddress58), (priceAssetBalance - periodMinAvailableToClaim))]
441441 else {
442442 let updatedPriceAssetBalance = ((priceAssetBalance + outAmount) - periodMinAvailableToClaim)
443443 [ScriptTransfer(i.caller, periodMinAvailableToClaim, outAssetId), TotalsEntry(keyInvestor(userAddress58), origInvestArray, totalsDiff, newClaimPeriodHeight), TotalsEntry(keyTotals(), readTotalsArrayOrDefault(), totalsDiff, newClaimPeriodHeight), IntegerEntry(keyPriceAssetBalance(userAddress58), updatedPriceAssetBalance)]
444444 }
445445 $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)
446446 }
447447 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)
448448 entries
449449 }
450450 }
451451
452452
453453
454454 @Callable(i)
455455 func claimREADONLY (claimedAssetId58,userAddress58) = {
456456 let claimResultTuple = internalClaim(claimedAssetId58, addressFromStringValue(userAddress58), fromBase58String(""))
457457 let totalsDiff = claimResultTuple._1
458458 let outAmount = claimResultTuple._2
459459 let outAssetId = claimResultTuple._3
460460 let origInvestArray = claimResultTuple._4
461461 let newClaimPeriodHeight = claimResultTuple._5
462462 let availableToClaimArray = claimResultTuple._6
463463 let availablePriceAmountToClaim = availableToClaimArray[0]
464464 let availableIdoAmountToClaim = availableToClaimArray[1]
465465 $Tuple2(nil, makeString(["%s%d%d", userAddress58, toString(availablePriceAmountToClaim), toString(availableIdoAmountToClaim)], SEP))
466466 }
467467
468468
469469
470470 @Callable(i)
471471 func claimV2READONLY (claimedAssetId58,userAddress58) = {
472472 let claimResultTuple = internalClaim(claimedAssetId58, addressFromStringValue(userAddress58), fromBase58String(""))
473473 let totalsDiff = claimResultTuple._1
474474 let outAmount = claimResultTuple._2
475475 let outAssetId = claimResultTuple._3
476476 let origInvestArray = claimResultTuple._4
477477 let newClaimPeriodHeight = claimResultTuple._5
478478 let availableToClaimArray = claimResultTuple._6
479479 let availablePriceAmountToClaim = availableToClaimArray[0]
480480 let availableIdoAmountToClaim = availableToClaimArray[1]
481481 let cfgArray = readConfigArray()
482482 let priceAssetId58 = cfgArray[IdxCfgPriceAssetId]
483483 let $t02534725759 = internalClaimV2(priceAssetId58, userAddress58, outAmount, totalsDiff[IdxDiffClaimedPriceAmountIncrement])
484484 let periodMinAvailableToClaim = $t02534725759._1
485485 let periodTotalAvailableToClaim = $t02534725759._2
486486 let periodUserAvailableToClaim = $t02534725759._3
487487 let totalUserAvailableToClaim = $t02534725759._4
488488 let usdtPriceAssetAllowableRatio = $t02534725759._5
489489 let currentUsdtPriceAssetRatio = $t02534725759._6
490490 let endPeriodBlocksLeft = $t02534725759._7
491491 let updatedCurrentPeriod = $t02534725759._8
492492 let periodStart = $t02534725759._9
493493 let periodEnd = $t02534725759._10
494- 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)
494+ let resultString = makeString(["%d%d%d%d%d%d%d", toString(availableIdoAmountToClaim), toString(periodMinAvailableToClaim), toString(periodTotalAvailableToClaim), toString(usdtPriceAssetAllowableRatio), toString(currentUsdtPriceAssetRatio), toString(endPeriodBlocksLeft)], SEP)
495495 $Tuple2(nil, resultString)
496496 }
497497
498498
499499
500500 @Callable(i)
501501 func setManager (pendingManagerPublicKey) = {
502502 let checkCaller = mustManager(i)
503503 if ((checkCaller == checkCaller))
504504 then {
505505 let checkManagerPublicKey = fromBase58String(pendingManagerPublicKey)
506506 if ((checkManagerPublicKey == checkManagerPublicKey))
507507 then [StringEntry(keyPendingManagerPublicKey(), pendingManagerPublicKey)]
508508 else throw("Strict value is not equal to itself.")
509509 }
510510 else throw("Strict value is not equal to itself.")
511511 }
512512
513513
514514
515515 @Callable(i)
516516 func confirmManager () = {
517517 let pm = pendingManagerPublicKeyOrUnit()
518518 let hasPM = if (isDefined(pm))
519519 then true
520520 else throw("No pending manager")
521521 if ((hasPM == hasPM))
522522 then {
523523 let checkPM = if ((i.callerPublicKey == value(pm)))
524524 then true
525525 else throw("You are not pending manager")
526526 if ((checkPM == checkPM))
527527 then [StringEntry(keyManagerPublicKey(), toBase58String(value(pm))), DeleteEntry(keyPendingManagerPublicKey())]
528528 else throw("Strict value is not equal to itself.")
529529 }
530530 else throw("Strict value is not equal to itself.")
531531 }
532532
533533
534534 @Verifier(tx)
535535 func verify () = {
536536 let targetPublicKey = match managerPublicKeyOrUnit() {
537537 case pk: ByteVector =>
538538 pk
539539 case _: Unit =>
540540 tx.senderPublicKey
541541 case _ =>
542542 throw("Match error")
543543 }
544544 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
545545 }
546546

github/deemru/w8io/026f985 
307.66 ms