tx · 7hmnd21idCYknowb9sEYeKDBrtGLDQeHpe8FTa2kj6MA

3MwyBKGZcdChEK9Z55HwLn3A2EgwEJJpqC1:  -0.01000000 Waves

2024.01.09 14:20 [2923870] smart account 3MwyBKGZcdChEK9Z55HwLn3A2EgwEJJpqC1 > SELF 0.00000000 Waves

{ "type": 13, "id": "7hmnd21idCYknowb9sEYeKDBrtGLDQeHpe8FTa2kj6MA", "fee": 1000000, "feeAssetId": null, "timestamp": 1704799264234, "version": 2, "chainId": 84, "sender": "3MwyBKGZcdChEK9Z55HwLn3A2EgwEJJpqC1", "senderPublicKey": "7c3qLtcJ7EaPS2JDjXv8MBbd4kpyc6R27wcn5GgvZhur", "proofs": [ "3DvS3D3jEsATfikQ48ykQnEvjMzsE2Az493dw5ZrhkoZY9RiPA7xwtcv77hNm7H9pmqWTEKuip3mUrwmbEyyYV5P" ], "script": "base64:BgIMCAISBgoECAEBARIAFQAMY29udHJhY3RGaWxlAhB2ZXN0aW5nX25lby5yaWRlAANTRVACAl9fAAhJRFNfTElTVAkAzAgCAAAJAMwIAgABCQDMCAIAAgkAzAgCAAMJAMwIAgAECQDMCAIABQkAzAgCAAYJAMwIAgAHCQDMCAIACAkAzAgCAAkJAMwIAgAKCQDMCAIACwkAzAgCAAwJAMwIAgANCQDMCAIADgkAzAgCAA8JAMwIAgAQCQDMCAIAEQkAzAgCABIJAMwIAgATCQDMCAIAFAkAzAgCABUJAMwIAgAWCQDMCAIAFwkAzAgCABgJAMwIAgAZCQDMCAIAGgkAzAgCABsJAMwIAgAcCQDMCAIAHQUDbmlsABFNQVhfVkVTVElOR19DT1VOVAkAkAMBBQhJRFNfTElTVAEIdGhyb3dFcnIBA21zZwkAAgEJAKwCAgkArAICBQxjb250cmFjdEZpbGUCAjogBQNtc2cACmtleUFzc2V0SWQJALkJAgkAzAgCAgIlcwkAzAgCAgdhc3NldElkBQNuaWwFA1NFUAANYXNzZXRJZFN0cmluZwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBQprZXlBc3NldElkAgVXQVZFUwAMYXNzZXRJZEJ5dGVzAwkAAAIFDWFzc2V0SWRTdHJpbmcCBVdBVkVTBQR1bml0CQDZBAEFDWFzc2V0SWRTdHJpbmcADGtleUFkbWluTGlzdAkAuQkCCQDMCAICAiVzCQDMCAICCWFkbWluTGlzdAUDbmlsBQNTRVAACWFkbWluTGlzdAQHJG1hdGNoMAkAnQgCBQR0aGlzBQxrZXlBZG1pbkxpc3QDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFzBQckbWF0Y2gwCQC1CQIFAXMFA1NFUAUDbmlsARRpc1ZhbGlkQWRkcmVzc1N0cmluZwENYWRkcmVzc1N0cmluZwQHJG1hdGNoMAkApggBBQ1hZGRyZXNzU3RyaW5nAwkAAQIFByRtYXRjaDACB0FkZHJlc3MEAWEFByRtYXRjaDAGBwEOa2V5VXNlclZlc3RpbmcCC3VzZXJBZGRyZXNzAmlkBAZjaGVja3MJAMwIAgMJARRpc1ZhbGlkQWRkcmVzc1N0cmluZwEFC3VzZXJBZGRyZXNzBgkBCHRocm93RXJyAQkAuQkCCQDMCAICFWFkZHJlc3MgaXMgbm90IHZhbGlkOgkAzAgCBQt1c2VyQWRkcmVzcwUDbmlsAgEgCQDMCAIDAwkAZwIFAmlkAAAJAGYCBRFNQVhfVkVTVElOR19DT1VOVAUCaWQHBgkBCHRocm93RXJyAQkAuQkCCQDMCAICFmlkIHNob3VsZCBiZSBsZXNzIHRoYW4JAMwIAgkApAMBBRFNQVhfVkVTVElOR19DT1VOVAkAzAgCAgRnb3Q6CQDMCAIJAKQDAQUCaWQFA25pbAIBIAUDbmlsAwkAAAIFBmNoZWNrcwUGY2hlY2tzCQC5CQIJAMwIAgIEJXMlZAkAzAgCBQt1c2VyQWRkcmVzcwkAzAgCCQCkAwEFAmlkBQNuaWwFA1NFUAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgERZm9ybWF0VXNlclZlc3RpbmcDDXZlc3RpbmdBbW91bnQKc3RhcnRCbG9jawpsb2NrTGVuZ3RoBAZjaGVja3MJAMwIAgMJAGcCBQ12ZXN0aW5nQW1vdW50AAAGCQEIdGhyb3dFcnIBAiF2ZXN0aW5nIGFtb3VudCBjYW5ub3QgYmUgbmVnYXRpdmUJAMwIAgMJAGcCBQpzdGFydEJsb2NrAAAGCQEIdGhyb3dFcnIBAh5zdGFydCBibG9jayBjYW5ub3QgYmUgbmVnYXRpdmUJAMwIAgMJAGcCBQpsb2NrTGVuZ3RoAAAGCQEIdGhyb3dFcnIBAh5sb2NrIGxlbmd0aCBjYW5ub3QgYmUgbmVnYXRpdmUFA25pbAMJAAACBQZjaGVja3MFBmNoZWNrcwkAuQkCCQDMCAICCiVkJWQlZCVkJWQJAMwIAgkApAMBBQ12ZXN0aW5nQW1vdW50CQDMCAIJAKQDAQUKc3RhcnRCbG9jawkAzAgCCQCkAwEFCmxvY2tMZW5ndGgFA25pbAUDU0VQCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuARBwYXJzZVVzZXJWZXN0aW5nAgt1c2VyQWRkcmVzcwJpZAQHJG1hdGNoMAkAnQgCBQR0aGlzCQEOa2V5VXNlclZlc3RpbmcCBQt1c2VyQWRkcmVzcwUCaWQDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAlyYXdTdHJpbmcFByRtYXRjaDAEC3NwbGl0U3RyaW5nCQC1CQIFCXJhd1N0cmluZwUDU0VQBA12ZXN0aW5nQW1vdW50CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgULc3BsaXRTdHJpbmcAAQQKc3RhcnRCbG9jawkBDXBhcnNlSW50VmFsdWUBCQCRAwIFC3NwbGl0U3RyaW5nAAIECmxvY2tMZW5ndGgJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQtzcGxpdFN0cmluZwADCQCVCgMFDXZlc3RpbmdBbW91bnQFCnN0YXJ0QmxvY2sFCmxvY2tMZW5ndGgJAJUKAwAAAAAAAAERa2V5VmVzdGluZ0hpc3RvcnkDBmFjdGlvbgt1c2VyQWRkcmVzcwR0eElkCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAIFBmFjdGlvbgkAzAgCBQt1c2VyQWRkcmVzcwkAzAgCBQR0eElkBQNuaWwFA1NFUAESY2FsY1VubG9ja2VkQW1vdW50AwZhbW91bnQKc3RhcnRCbG9jawpsb2NrTGVuZ3RoBA1lbGFwc2VkQmxvY2tzCQBlAgUGaGVpZ2h0BQpzdGFydEJsb2NrBA51bmxvY2tlZEFtb3VudAMDCQECIT0CBQpsb2NrTGVuZ3RoAAAJAGYCBQ1lbGFwc2VkQmxvY2tzAAAHCQCXAwEJAMwIAgkAawMFBmFtb3VudAUNZWxhcHNlZEJsb2NrcwUKbG9ja0xlbmd0aAkAzAgCBQZhbW91bnQFA25pbAAACQCUCgIFDnVubG9ja2VkQW1vdW50CQBlAgUGYW1vdW50BQ51bmxvY2tlZEFtb3VudAEVZ2V0VXNlclVubG9ja2VkQW1vdW50Agt1c2VyQWRkcmVzcwJpZAQLJHQwMjc0NzI4MjYJARBwYXJzZVVzZXJWZXN0aW5nAgULdXNlckFkZHJlc3MFAmlkBA12ZXN0aW5nQW1vdW50CAULJHQwMjc0NzI4MjYCXzEECnN0YXJ0QmxvY2sIBQskdDAyNzQ3MjgyNgJfMgQKbG9ja0xlbmd0aAgFCyR0MDI3NDcyODI2Al8zBAskdDAyODI5MjkyNgkBEmNhbGNVbmxvY2tlZEFtb3VudAMFDXZlc3RpbmdBbW91bnQFCnN0YXJ0QmxvY2sFCmxvY2tMZW5ndGgEDnVubG9ja2VkQW1vdW50CAULJHQwMjgyOTI5MjYCXzEED3JlbWFpbmluZ0Ftb3VudAgFCyR0MDI4MjkyOTI2Al8yCQCUCgIFDnVubG9ja2VkQW1vdW50BQ9yZW1haW5pbmdBbW91bnQBE2dldFVzZXJDbGFpbUFjdGlvbnMCC3VzZXJBZGRyZXNzAmlkBAskdDAzMDI5MzEwOAkBEHBhcnNlVXNlclZlc3RpbmcCBQt1c2VyQWRkcmVzcwUCaWQEDXZlc3RpbmdBbW91bnQIBQskdDAzMDI5MzEwOAJfMQQKc3RhcnRCbG9jawgFCyR0MDMwMjkzMTA4Al8yBApsb2NrTGVuZ3RoCAULJHQwMzAyOTMxMDgCXzMECyR0MDMxMTEzMTg5CQEVZ2V0VXNlclVubG9ja2VkQW1vdW50AgULdXNlckFkZHJlc3MFAmlkBA51bmxvY2tlZEFtb3VudAgFCyR0MDMxMTEzMTg5Al8xBA9yZW1haW5pbmdBbW91bnQIBQskdDAzMTExMzE4OQJfMgQPcmVtYWluaW5nQmxvY2tzCQCWAwEJAMwIAgkAZQIJAGQCBQpzdGFydEJsb2NrBQpsb2NrTGVuZ3RoBQZoZWlnaHQJAMwIAgAABQNuaWwEB2FjdGlvbnMDCQECIT0CBQ51bmxvY2tlZEFtb3VudAAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEFC3VzZXJBZGRyZXNzBQ51bmxvY2tlZEFtb3VudAUMYXNzZXRJZEJ5dGVzCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ5rZXlVc2VyVmVzdGluZwIFC3VzZXJBZGRyZXNzBQJpZAkBEWZvcm1hdFVzZXJWZXN0aW5nAwUPcmVtYWluaW5nQW1vdW50BQZoZWlnaHQFD3JlbWFpbmluZ0Jsb2NrcwUDbmlsBQNuaWwJAJQKAgUHYWN0aW9ucwUOdW5sb2NrZWRBbW91bnQBFGdldE5ld1Zlc3RpbmdBY3Rpb25zBQt1c2VyQWRkcmVzcwJpZA12ZXN0aW5nQW1vdW50CnN0YXJ0QmxvY2sKbG9ja0xlbmd0aAkAzAgCCQELU3RyaW5nRW50cnkCCQEOa2V5VXNlclZlc3RpbmcCBQt1c2VyQWRkcmVzcwUCaWQJARFmb3JtYXRVc2VyVmVzdGluZwMFDXZl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cmVzcwUDbmlsAgEgBQthdmFpbGFibGVJZAIBaQEOdmVzdGluZ0ZvclVzZXIEC3VzZXJBZGRyZXNzDXZlc3RpbmdBbW91bnQKc3RhcnRCbG9jawpsb2NrTGVuZ3RoBAVjaGVjawkAzAgCAwkAAAIJAJADAQgFAWkIcGF5bWVudHMAAQYJAQh0aHJvd0VycgECIHNob3VsZCBiZSB3aXRoIGV4YWN0bHkgMSBwYXltZW50CQDMCAIDCQAAAggJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBQxhc3NldElkQnl0ZXMGCQEIdGhyb3dFcnIBCQC5CQIJAMwIAgIbcGF5bWVudCBhc3NldElkIHNob3VsZCBiZTogCQDMCAIFDWFzc2V0SWRTdHJpbmcFA25pbAIBIAkAzAgCAwkAAAIICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BQ12ZXN0aW5nQW1vdW50BgkBCHRocm93RXJyAQIvcGF5bWVudCBhbW91bnQgc2hvdWxkIGJlIGVxdWFsIHRvIHZlc3RpbmdBbW91bnQJAMwIAgMDCQAAAgUJYWRtaW5MaXN0BQNuaWwGCQEPY29udGFpbnNFbGVtZW50AgUJYWRtaW5MaXN0CQClCAEIBQFpBmNhbGxlcgYJAQh0aHJvd0VycgECEXlvdSBtdXN0IGJlIGFkbWluBQNuaWwDCQAAAgUFY2hlY2sFBWNoZWNrBAJpZAkBFWdldEF2YWlsYWJsZVZlc3RpbmdJZAEFC3VzZXJBZGRyZXNzBA5oaXN0b3J5QWN0aW9ucwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBEWtleVZlc3RpbmdIaXN0b3J5AwIGdmVzdGVkBQt1c2VyQWRkcmVzcwkA2AQBCAUBaQ10cmFuc2FjdGlvbklkBQ12ZXN0aW5nQW1vdW50BQNuaWwJAM4IAgkBFGdldE5ld1Zlc3RpbmdBY3Rpb25zBQULdXNlckFkZHJlc3MFAmlkBQ12ZXN0aW5nQW1vdW50BQpzdGFydEJsb2NrBQpsb2NrTGVuZ3RoBQ5oaXN0b3J5QWN0aW9ucwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQhjbGFpbUFsbAAEC3VzZXJBZGRyZXNzCQClCAEIBQFpBmNhbGxlcgQLJHQwNTU4MTU2NTAJARZnZXRBbGxVc2VyQ2xhaW1BY3Rpb25zAQULdXNlckFkZHJlc3MEDGNsYWltQWN0aW9ucwgFCyR0MDU1ODE1NjUwAl8xBAt0b3RhbEFtb3VudAgFCyR0MDU1ODE1NjUwAl8yBA5oaXN0b3J5QWN0aW9ucwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBEWtleVZlc3RpbmdIaXN0b3J5AwIHY2xhaW1lZAULdXNlckFkZHJlc3MJANgEAQgFAWkNdHJhbnNhY3Rpb25JZAULdG90YWxBbW91bnQFA25pbAMJAGYCBQt0b3RhbEFtb3VudAAACQDOCAIFDGNsYWltQWN0aW9ucwUOaGlzdG9yeUFjdGlvbnMJAQh0aHJvd0VycgECEG5vdGhpbmcgdG8gY2xhaW0ARGKYrw==", "height": 2923870, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: Cn926qYzCguhiwet5fkjp8W14KPi4eEL1QDpW6xiatLh Next: Ber9vaDCWa8ar6yvgyDuEwc45ShDrSbTysEn4bj4xXnM Diff:
OldNewDifferences
212212 let claimActions = $t055815650._1
213213 let totalAmount = $t055815650._2
214214 let historyActions = [IntegerEntry(keyVestingHistory("claimed", userAddress, toBase58String(i.transactionId)), totalAmount)]
215- (claimActions ++ historyActions)
215+ if ((totalAmount > 0))
216+ then (claimActions ++ historyActions)
217+ else throwErr("nothing to claim")
216218 }
217219
218220
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let contractFile = "vesting_neo.ride"
55
66 let SEP = "__"
77
88 let IDS_LIST = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29]
99
1010 let MAX_VESTING_COUNT = size(IDS_LIST)
1111
1212 func throwErr (msg) = throw(((contractFile + ": ") + msg))
1313
1414
1515 let keyAssetId = makeString(["%s", "assetId"], SEP)
1616
1717 let assetIdString = valueOrElse(getString(this, keyAssetId), "WAVES")
1818
1919 let assetIdBytes = if ((assetIdString == "WAVES"))
2020 then unit
2121 else fromBase58String(assetIdString)
2222
2323 let keyAdminList = makeString(["%s", "adminList"], SEP)
2424
2525 let adminList = match getString(this, keyAdminList) {
2626 case s: String =>
2727 split(s, SEP)
2828 case _ =>
2929 nil
3030 }
3131
3232 func isValidAddressString (addressString) = match addressFromString(addressString) {
3333 case a: Address =>
3434 true
3535 case _ =>
3636 false
3737 }
3838
3939
4040 func keyUserVesting (userAddress,id) = {
4141 let checks = [if (isValidAddressString(userAddress))
4242 then true
4343 else throwErr(makeString(["address is not valid:", userAddress], " ")), if (if ((id >= 0))
4444 then (MAX_VESTING_COUNT > id)
4545 else false)
4646 then true
4747 else throwErr(makeString(["id should be less than", toString(MAX_VESTING_COUNT), "got:", toString(id)], " "))]
4848 if ((checks == checks))
4949 then makeString(["%s%d", userAddress, toString(id)], SEP)
5050 else throw("Strict value is not equal to itself.")
5151 }
5252
5353
5454 func formatUserVesting (vestingAmount,startBlock,lockLength) = {
5555 let checks = [if ((vestingAmount >= 0))
5656 then true
5757 else throwErr("vesting amount cannot be negative"), if ((startBlock >= 0))
5858 then true
5959 else throwErr("start block cannot be negative"), if ((lockLength >= 0))
6060 then true
6161 else throwErr("lock length cannot be negative")]
6262 if ((checks == checks))
6363 then makeString(["%d%d%d%d%d", toString(vestingAmount), toString(startBlock), toString(lockLength)], SEP)
6464 else throw("Strict value is not equal to itself.")
6565 }
6666
6767
6868 func parseUserVesting (userAddress,id) = match getString(this, keyUserVesting(userAddress, id)) {
6969 case rawString: String =>
7070 let splitString = split(rawString, SEP)
7171 let vestingAmount = parseIntValue(splitString[1])
7272 let startBlock = parseIntValue(splitString[2])
7373 let lockLength = parseIntValue(splitString[3])
7474 $Tuple3(vestingAmount, startBlock, lockLength)
7575 case _ =>
7676 $Tuple3(0, 0, 0)
7777 }
7878
7979
8080 func keyVestingHistory (action,userAddress,txId) = makeString(["%s%s%s", action, userAddress, txId], SEP)
8181
8282
8383 func calcUnlockedAmount (amount,startBlock,lockLength) = {
8484 let elapsedBlocks = (height - startBlock)
8585 let unlockedAmount = if (if ((lockLength != 0))
8686 then (elapsedBlocks > 0)
8787 else false)
8888 then min([fraction(amount, elapsedBlocks, lockLength), amount])
8989 else 0
9090 $Tuple2(unlockedAmount, (amount - unlockedAmount))
9191 }
9292
9393
9494 func getUserUnlockedAmount (userAddress,id) = {
9595 let $t027472826 = parseUserVesting(userAddress, id)
9696 let vestingAmount = $t027472826._1
9797 let startBlock = $t027472826._2
9898 let lockLength = $t027472826._3
9999 let $t028292926 = calcUnlockedAmount(vestingAmount, startBlock, lockLength)
100100 let unlockedAmount = $t028292926._1
101101 let remainingAmount = $t028292926._2
102102 $Tuple2(unlockedAmount, remainingAmount)
103103 }
104104
105105
106106 func getUserClaimActions (userAddress,id) = {
107107 let $t030293108 = parseUserVesting(userAddress, id)
108108 let vestingAmount = $t030293108._1
109109 let startBlock = $t030293108._2
110110 let lockLength = $t030293108._3
111111 let $t031113189 = getUserUnlockedAmount(userAddress, id)
112112 let unlockedAmount = $t031113189._1
113113 let remainingAmount = $t031113189._2
114114 let remainingBlocks = max([((startBlock + lockLength) - height), 0])
115115 let actions = if ((unlockedAmount != 0))
116116 then [ScriptTransfer(addressFromStringValue(userAddress), unlockedAmount, assetIdBytes), StringEntry(keyUserVesting(userAddress, id), formatUserVesting(remainingAmount, height, remainingBlocks))]
117117 else nil
118118 $Tuple2(actions, unlockedAmount)
119119 }
120120
121121
122122 func getNewVestingActions (userAddress,id,vestingAmount,startBlock,lockLength) = [StringEntry(keyUserVesting(userAddress, id), formatUserVesting(vestingAmount, startBlock, lockLength))]
123123
124124
125125 func getAllUserClaimActions (userAddress) = {
126126 func actionsHelper (acc,a) = {
127127 let $t039483975 = acc
128128 let allActions = $t039483975._1
129129 let sum = $t039483975._2
130130 let $t039804049 = getUserClaimActions(userAddress, a)
131131 let claimActions = $t039804049._1
132132 let claimAmount = $t039804049._2
133133 $Tuple2((allActions ++ claimActions), (sum + claimAmount))
134134 }
135135
136136 let $l = IDS_LIST
137137 let $s = size($l)
138138 let $acc0 = $Tuple2(nil, 0)
139139 func $f0_1 ($a,$i) = if (($i >= $s))
140140 then $a
141141 else actionsHelper($a, $l[$i])
142142
143143 func $f0_2 ($a,$i) = if (($i >= $s))
144144 then $a
145145 else throw("List size exceeds 30")
146146
147147 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30)
148148 }
149149
150150
151151 func getAvailableVestingId (userAddress) = {
152152 func helper (availableId,id) = {
153153 let $t042574336 = parseUserVesting(userAddress, id)
154154 let vestingAmount = $t042574336._1
155155 let startBlock = $t042574336._2
156156 let lockLength = $t042574336._3
157157 if ((vestingAmount > 0))
158158 then availableId
159159 else if ((availableId == -1))
160160 then id
161161 else min([availableId, id])
162162 }
163163
164164 let availableId = {
165165 let $l = IDS_LIST
166166 let $s = size($l)
167167 let $acc0 = -1
168168 func $f0_1 ($a,$i) = if (($i >= $s))
169169 then $a
170170 else helper($a, $l[$i])
171171
172172 func $f0_2 ($a,$i) = if (($i >= $s))
173173 then $a
174174 else throw("List size exceeds 30")
175175
176176 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30)
177177 }
178178 if ((availableId == -1))
179179 then throwErr(makeString(["user exceeded max active vesting count: ", userAddress], " "))
180180 else availableId
181181 }
182182
183183
184184 @Callable(i)
185185 func vestingForUser (userAddress,vestingAmount,startBlock,lockLength) = {
186186 let check = [if ((size(i.payments) == 1))
187187 then true
188188 else throwErr("should be with exactly 1 payment"), if ((i.payments[0].assetId == assetIdBytes))
189189 then true
190190 else throwErr(makeString(["payment assetId should be: ", assetIdString], " ")), if ((i.payments[0].amount == vestingAmount))
191191 then true
192192 else throwErr("payment amount should be equal to vestingAmount"), if (if ((adminList == nil))
193193 then true
194194 else containsElement(adminList, toString(i.caller)))
195195 then true
196196 else throwErr("you must be admin")]
197197 if ((check == check))
198198 then {
199199 let id = getAvailableVestingId(userAddress)
200200 let historyActions = [IntegerEntry(keyVestingHistory("vested", userAddress, toBase58String(i.transactionId)), vestingAmount)]
201201 (getNewVestingActions(userAddress, id, vestingAmount, startBlock, lockLength) ++ historyActions)
202202 }
203203 else throw("Strict value is not equal to itself.")
204204 }
205205
206206
207207
208208 @Callable(i)
209209 func claimAll () = {
210210 let userAddress = toString(i.caller)
211211 let $t055815650 = getAllUserClaimActions(userAddress)
212212 let claimActions = $t055815650._1
213213 let totalAmount = $t055815650._2
214214 let historyActions = [IntegerEntry(keyVestingHistory("claimed", userAddress, toBase58String(i.transactionId)), totalAmount)]
215- (claimActions ++ historyActions)
215+ if ((totalAmount > 0))
216+ then (claimActions ++ historyActions)
217+ else throwErr("nothing to claim")
216218 }
217219
218220

github/deemru/w8io/026f985 
29.45 ms