tx · BtqRat7zqcEVN4TbxMheQkMMncrG3sdEy3LnM8vnanzL

3N6q7sCGSSLBUXDdjBdYGTJbZGZfhhh8cNg:  -0.01400000 Waves

2021.04.27 18:02 [1501016] smart account 3N6q7sCGSSLBUXDdjBdYGTJbZGZfhhh8cNg > SELF 0.00000000 Waves

{ "type": 13, "id": "BtqRat7zqcEVN4TbxMheQkMMncrG3sdEy3LnM8vnanzL", "fee": 1400000, "feeAssetId": null, "timestamp": 1619535779739, "version": 2, "chainId": 84, "sender": "3N6q7sCGSSLBUXDdjBdYGTJbZGZfhhh8cNg", "senderPublicKey": "6RxCbWeRD4VWkRJtcAR8HBRkrBbEzZWucSBL6YrSFQrE", "proofs": [ "XVrwLKfGoBfYTNwcP8mfJkAU5jjh9XeGhmRhr3LVdLTF5uVB2MjgX2DN9uY7nWmni4gPygKEFpBE9wtr6L2qHTx" ], "script": "base64:AAIEAAAAAAAAABIIAhIAEgASBAoCAQgSBAoCAQgAAAATAAAAAA9uZXV0cmlub0Fzc2V0SWQBAAAAIG8ko8qrMNxSKZjoLGFa7lp/I03CLXW76Z2qVODS0AfBAAAAAAtuc2J0QXNzZXRJZAEAAAAgHzHKqJoXhJqJN2I09RXg46JIn0GFYur0HgDtWiIaqSQAAAAAE05ldXRyaW5vQ29udHJhY3RLZXkBAAAAGgFUuYnNz0dxupdy7LhFDzOwqkmF0Q14MgJtAAAAAAhVU0ROVFlQRQIAAAAEVVNETgAAAAAITlNCVFRZUEUCAAAABE5TQlQAAAAACkJhbGFuY2VLZXkCAAAAC3JwZF9iYWxhbmNlAQAAABFnZXRVc2VyQmFsYW5jZUtleQAAAAIAAAAFb3duZXIAAAAHYXNzZXRJZAkABLkAAAACCQAETAAAAAIFAAAACkJhbGFuY2VLZXkJAARMAAAAAgUAAAAHYXNzZXRJZAkABEwAAAACBQAAAAVvd25lcgUAAAADbmlsAgAAAAFfAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEAAAADa2V5CQEAAAALdmFsdWVPckVsc2UAAAACCQAEHQAAAAIFAAAABHRoaXMFAAAAA2tleQIAAAAAAQAAAA5nZXROdW1iZXJCeUtleQAAAAEAAAADa2V5CQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMFAAAAA2tleQAAAAAAAAAAAAEAAAAbZ2V0UmV3YXJkQ29uZmlnSW5pdGlhbFNoYXJlAAAAAQAAAAVvd25lcgkAASwAAAACBQAAAAVvd25lcgIAAAANX2luaXRpYWxTaGFyZQEAAAATZ2V0UmV3YXJkc0NvbmZpZ0tleQAAAAMAAAAFb3duZXIAAAAFc2hhcmUAAAAIcmVjZWl2ZXIJAAS5AAAAAgkABEwAAAACAgAAAA1zdGFraW5nY29uZmlnCQAETAAAAAIFAAAABW93bmVyCQAETAAAAAIJAAGkAAAAAQUAAAAFc2hhcmUJAARMAAAAAgUAAAAIcmVjZWl2ZXIFAAAAA25pbAIAAAABXwEAAAAOZ2V0VXNlckJhbGFuY2UAAAACAAAABW93bmVyAAAAB2Fzc2V0SWQJAQAAAA5nZXROdW1iZXJCeUtleQAAAAEJAQAAABFnZXRVc2VyQmFsYW5jZUtleQAAAAIFAAAABW93bmVyBQAAAAdhc3NldElkAQAAABpnZXRWYWxpZFN0YWtpbmdBc3NldE9yRmFpbAAAAAIAAAALc3Rha2luZ1R5cGUAAAAHYXNzZXRJZAMDCQAAAAAAAAIFAAAAC3N0YWtpbmdUeXBlBQAAAAhVU0ROVFlQRQkBAAAAAiE9AAAAAgUAAAAHYXNzZXRJZAUAAAAPbmV1dHJpbm9Bc3NldElkBwkAAAIAAAABAgAAABFjYW4gdXNlIFVTRE4gb25seQMDCQAAAAAAAAIFAAAAC3N0YWtpbmdUeXBlBQAAAAhOU0JUVFlQRQkBAAAAAiE9AAAAAgUAAAAHYXNzZXRJZAUAAAALbnNidEFzc2V0SWQHCQAAAgAAAAECAAAAEWNhbiB1c2UgTlNCVCBvbmx5AwMJAQAAAAIhPQAAAAIFAAAAC3N0YWtpbmdUeXBlBQAAAAhVU0ROVFlQRQkBAAAAAiE9AAAAAgUAAAALc3Rha2luZ1R5cGUFAAAACE5TQlRUWVBFBwkAAAIAAAABCQABLAAAAAICAAAAGXVuc3VwcG9ydGVkIHN0YWtpbmcgdHlwZSAFAAAAC3N0YWtpbmdUeXBlBQAAAAdhc3NldElkAQAAABpnZXRDdXJyZW50UmV3YXJkc0NvbmZpZ0tleQAAAAEAAAAFb3duZXIJAAEsAAAAAgIAAAAWc3Rha2luZ2NvbmZpZ19jdXJyZW50XwUAAAAFb3duZXIBAAAAGGdldFJld2FyZHNDb25maWdTdGFydEtleQAAAAIAAAAJY29uZmlnS2V5AAAAB2lzU3RhcnQJAAEsAAAAAgUAAAAJY29uZmlnS2V5AwUAAAAHaXNTdGFydAIAAAAGX3N0YXJ0AgAAAARfZW5kAQAAABVnZXRDb250cmFjdEJhbGFuY2VLZXkAAAABAAAAB2Fzc2V0SWQJAAEsAAAAAgkAASwAAAACBQAAAApCYWxhbmNlS2V5AgAAAAFfBQAAAAdhc3NldElkAQAAABJnZXRDb250cmFjdEJhbGFuY2UAAAABAAAAB2Fzc2V0SWQJAQAAAA5nZXROdW1iZXJCeUtleQAAAAEJAQAAABVnZXRDb250cmFjdEJhbGFuY2VLZXkAAAABBQAAAAdhc3NldElkAQAAAA5pbnRlcm5hbFVubG9jawAAAAQAAAALc3Rha2luZ1R5cGUAAAABaQAAAAx1bmxvY2tBbW91bnQAAAAMYXNzZXRJZFBhcmFtBAAAAAdhY2NvdW50CQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgQAAAAHYXNzZXRJZAkBAAAAGmdldFZhbGlkU3Rha2luZ0Fzc2V0T3JGYWlsAAAAAgUAAAALc3Rha2luZ1R5cGUJAAJZAAAAAQUAAAAMYXNzZXRJZFBhcmFtBAAAAA1hc3NldElkU3RyaW5nCQACWAAAAAEFAAAAB2Fzc2V0SWQEAAAAB2JhbGFuY2UJAABlAAAAAgkBAAAADmdldFVzZXJCYWxhbmNlAAAAAgUAAAAHYWNjb3VudAUAAAANYXNzZXRJZFN0cmluZwUAAAAMdW5sb2NrQW1vdW50AwkAAGYAAAACAAAAAAAAAAAABQAAAAdiYWxhbmNlCQAAAgAAAAECAAAADmludmFsaWQgYW1vdW50CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAVZ2V0Q29udHJhY3RCYWxhbmNlS2V5AAAAAQUAAAANYXNzZXRJZFN0cmluZwkAAGUAAAACCQEAAAASZ2V0Q29udHJhY3RCYWxhbmNlAAAAAQUAAAANYXNzZXRJZFN0cmluZwUAAAAMdW5sb2NrQW1vdW50CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAARZ2V0VXNlckJhbGFuY2VLZXkAAAACBQAAAAdhY2NvdW50BQAAAA1hc3NldElkU3RyaW5nBQAAAAdiYWxhbmNlCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEFAAAAB2FjY291bnQFAAAADHVubG9ja0Ftb3VudAUAAAAHYXNzZXRJZAUAAAADbmlsAQAAABRpbnRlcm5hbExvY2tOZXV0cmlubwAAAAQAAAALc3Rha2luZ1R5cGUAAAABaQAAAAhyZWNlaXZlcgAAAAVzaGFyZQQAAAADcG10CQEAAAAFdmFsdWUAAAABCQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAABAAAAAdhc3NldElkCQEAAAAaZ2V0VmFsaWRTdGFraW5nQXNzZXRPckZhaWwAAAACBQAAAAtzdGFraW5nVHlwZQkBAAAABXZhbHVlAAAAAQgFAAAAA3BtdAAAAAdhc3NldElkAwkBAAAAASEAAAABCQEAAAAJaXNEZWZpbmVkAAAAAQkABCYAAAABBQAAAAhyZWNlaXZlcgkAAAIAAAABCQABLAAAAAICAAAAF0ludmFsaWQgYWRkcmVzcyBmb3JtYXQgBQAAAAhyZWNlaXZlcgMJAABmAAAAAgUAAAAFc2hhcmUAAAAAAAAAAGQJAAACAAAAAQIAAAAwc3Rha2luZyByZXdhcmRzIHNoYXJlIGNhbm5vdCBiZSBoaWdoZXIgdGhhbiAxMDAlAwkAAGYAAAACAAAAAAAAAAABBQAAAAVzaGFyZQkAAAIAAAABAgAAAC1zdGFraW5nIHJld2FyZHMgc2hhcmUgY2Fubm90IGJlIGxvd2VyIHRoYW4gMSUEAAAAB2FjY291bnQJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyBAAAAA1hc3NldElkU3RyaW5nCQACWAAAAAEFAAAAB2Fzc2V0SWQEAAAADWN1cnJlbnRDb25maWcJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEJAQAAABpnZXRDdXJyZW50UmV3YXJkc0NvbmZpZ0tleQAAAAEFAAAAB2FjY291bnQEAAAAC2NvcnJlY3REYXRhAwkBAAAAAiE9AAAAAgUAAAANY3VycmVudENvbmZpZwIAAAAABAAAABFjdXJyZW50Q29uZmlnRGF0YQkABLUAAAACBQAAAA1jdXJyZW50Q29uZmlnAgAAAAFfBAAAAAljdXJyU2hhcmUJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAABFjdXJyZW50Q29uZmlnRGF0YQAAAAAAAAAAAgQAAAAMY3VyclJlY2VpdmVyCQABkQAAAAIFAAAAEWN1cnJlbnRDb25maWdEYXRhAAAAAAAAAAADBAAAABdub3RNaWdyYXRlZEluaXRpYWxTaGFyZQkBAAAADmdldE51bWJlckJ5S2V5AAAAAQkBAAAAG2dldFJld2FyZENvbmZpZ0luaXRpYWxTaGFyZQAAAAEFAAAAB2FjY291bnQEAAAAEmFjdHVhbEluaXRpYWxTaGFyZQMJAAAAAAAAAgUAAAAXbm90TWlncmF0ZWRJbml0aWFsU2hhcmUAAAAAAAAAAAAFAAAACWN1cnJTaGFyZQUAAAAXbm90TWlncmF0ZWRJbml0aWFsU2hhcmUEAAAACG5ld1NoYXJlAwMJAABmAAAAAgUAAAASYWN0dWFsSW5pdGlhbFNoYXJlBQAAAAVzaGFyZQYJAQAAAAIhPQAAAAIFAAAADGN1cnJSZWNlaXZlcgUAAAAIcmVjZWl2ZXIFAAAAEmFjdHVhbEluaXRpYWxTaGFyZQUAAAAFc2hhcmUJAARMAAAAAgkAAaQAAAABBQAAABJhY3R1YWxJbml0aWFsU2hhcmUJAARMAAAAAgkAAaQAAAABBQAAAAhuZXdTaGFyZQkABEwAAAACBQAAAAxjdXJyUmVjZWl2ZXIFAAAAA25pbAkABEwAAAACCQABpAAAAAEFAAAABXNoYXJlCQAETAAAAAIJAAGkAAAAAQUAAAAFc2hhcmUJAARMAAAAAgUAAAAIcmVjZWl2ZXIFAAAAA25pbAQAAAATY29ycmVjdEluaXRpYWxTaGFyZQkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAC2NvcnJlY3REYXRhAAAAAAAAAAAABAAAAAxjb3JyZWN0U2hhcmUJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAAtjb3JyZWN0RGF0YQAAAAAAAAAAAQQAAAAPY29ycmVjdFJlY2VpdmVyCQABkQAAAAIFAAAAC2NvcnJlY3REYXRhAAAAAAAAAAACBAAAABBuZXdDdXJyZW50Q29uZmlnCQEAAAATZ2V0UmV3YXJkc0NvbmZpZ0tleQAAAAMFAAAAB2FjY291bnQFAAAADGNvcnJlY3RTaGFyZQUAAAAPY29ycmVjdFJlY2VpdmVyBAAAAAtpc05ld0NvbmZpZwkBAAAAASEAAAABCQAAAAAAAAIFAAAADWN1cnJlbnRDb25maWcFAAAAEG5ld0N1cnJlbnRDb25maWcEAAAAA2VuZAMFAAAAC2lzTmV3Q29uZmlnBQAAAAZoZWlnaHQAAAAAAAAAAAAEAAAABXN0YXJ0AwUAAAALaXNOZXdDb25maWcFAAAABmhlaWdodAkBAAAADmdldE51bWJlckJ5S2V5AAAAAQkBAAAAGGdldFJld2FyZHNDb25maWdTdGFydEtleQAAAAIFAAAAEG5ld0N1cnJlbnRDb25maWcGCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAVZ2V0Q29udHJhY3RCYWxhbmNlS2V5AAAAAQUAAAANYXNzZXRJZFN0cmluZwkAAGQAAAACCQEAAAASZ2V0Q29udHJhY3RCYWxhbmNlAAAAAQUAAAANYXNzZXRJZFN0cmluZwgFAAAAA3BtdAAAAAZhbW91bnQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABFnZXRVc2VyQmFsYW5jZUtleQAAAAIFAAAAB2FjY291bnQFAAAADWFzc2V0SWRTdHJpbmcJAABkAAAAAgkBAAAADmdldFVzZXJCYWxhbmNlAAAAAgUAAAAHYWNjb3VudAUAAAANYXNzZXRJZFN0cmluZwgFAAAAA3BtdAAAAAZhbW91bnQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABhnZXRSZXdhcmRzQ29uZmlnU3RhcnRLZXkAAAACBQAAAA1jdXJyZW50Q29uZmlnBwUAAAADZW5kCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAYZ2V0UmV3YXJkc0NvbmZpZ1N0YXJ0S2V5AAAAAgUAAAAQbmV3Q3VycmVudENvbmZpZwYFAAAABXN0YXJ0CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAbZ2V0UmV3YXJkQ29uZmlnSW5pdGlhbFNoYXJlAAAAAQUAAAAHYWNjb3VudAUAAAATY29ycmVjdEluaXRpYWxTaGFyZQkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAaZ2V0Q3VycmVudFJld2FyZHNDb25maWdLZXkAAAABBQAAAAdhY2NvdW50BQAAABBuZXdDdXJyZW50Q29uZmlnBQAAAANuaWwAAAAEAAAAAWkBAAAADGxvY2tOZXV0cmlubwAAAAAJAQAAABRpbnRlcm5hbExvY2tOZXV0cmlubwAAAAQFAAAACFVTRE5UWVBFBQAAAAFpCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgAAAAAAAAAAZAAAAAFpAQAAAAhsb2NrTnNidAAAAAAJAQAAABRpbnRlcm5hbExvY2tOZXV0cmlubwAAAAQFAAAACE5TQlRUWVBFBQAAAAFpCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgAAAAAAAAAAZAAAAAFpAQAAAA51bmxvY2tOZXV0cmlubwAAAAIAAAAMdW5sb2NrQW1vdW50AAAADWFzc2V0SWRTdHJpbmcJAQAAAA5pbnRlcm5hbFVubG9jawAAAAQFAAAACFVTRE5UWVBFBQAAAAFpBQAAAAx1bmxvY2tBbW91bnQFAAAADWFzc2V0SWRTdHJpbmcAAAABaQEAAAAKdW5sb2NrTnNidAAAAAIAAAAMdW5sb2NrQW1vdW50AAAADWFzc2V0SWRTdHJpbmcJAQAAAA5pbnRlcm5hbFVubG9jawAAAAQFAAAACE5TQlRUWVBFBQAAAAFpBQAAAAx1bmxvY2tBbW91bnQFAAAADWFzc2V0SWRTdHJpbmcAAAABAAAAAnR4AQAAAAZ2ZXJpZnkAAAAABAAAAAckbWF0Y2gwBQAAAAJ0eAkAAfQAAAADCAUAAAACdHgAAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJ0eAAAAAZwcm9vZnMAAAAAAAAAAAAIBQAAAAJ0eAAAAA9zZW5kZXJQdWJsaWNLZXkGr/lA", "height": 1501016, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 8NWqnMqxqwuYUBfiu5kUMQkCpvLrEHx3AtZehYq2Z4J5 Next: GsTfzVaPPc7f16tY2WR4j3kQK6rPs3FxFn7kxrUea4sE Diff:
OldNewDifferences
126126 func lockNsbt () = internalLockNeutrino(NSBTTYPE, i, toString(i.caller), 100)
127127
128128
129+
130+@Callable(i)
131+func unlockNeutrino (unlockAmount,assetIdString) = internalUnlock(USDNTYPE, i, unlockAmount, assetIdString)
132+
133+
134+
135+@Callable(i)
136+func unlockNsbt (unlockAmount,assetIdString) = internalUnlock(NSBTTYPE, i, unlockAmount, assetIdString)
137+
138+
139+@Verifier(tx)
140+func verify () = match tx {
141+ case _ =>
142+ sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
143+}
144+
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 4 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let neutrinoAssetId = base58'8UrfDVd5GreeUwm7uPk7eYz1eMv376kzR52C6sANPkwS'
55
66 let nsbtAssetId = base58'36mg8NZTaFRDygiVwb8uBnLR51hetJruUCZcxhaVcHj9'
77
88 let NeutrinoContractKey = base58'3N6q7sCGSSLBUXDdjBdYGTJbZGZfhhh8cNg'
99
1010 let USDNTYPE = "USDN"
1111
1212 let NSBTTYPE = "NSBT"
1313
1414 let BalanceKey = "rpd_balance"
1515
1616 func getUserBalanceKey (owner,assetId) = makeString([BalanceKey, assetId, owner], "_")
1717
1818
1919 func getStringByKey (key) = valueOrElse(getString(this, key), "")
2020
2121
2222 func getNumberByKey (key) = valueOrElse(getInteger(this, key), 0)
2323
2424
2525 func getRewardConfigInitialShare (owner) = (owner + "_initialShare")
2626
2727
2828 func getRewardsConfigKey (owner,share,receiver) = makeString(["stakingconfig", owner, toString(share), receiver], "_")
2929
3030
3131 func getUserBalance (owner,assetId) = getNumberByKey(getUserBalanceKey(owner, assetId))
3232
3333
3434 func getValidStakingAssetOrFail (stakingType,assetId) = if (if ((stakingType == USDNTYPE))
3535 then (assetId != neutrinoAssetId)
3636 else false)
3737 then throw("can use USDN only")
3838 else if (if ((stakingType == NSBTTYPE))
3939 then (assetId != nsbtAssetId)
4040 else false)
4141 then throw("can use NSBT only")
4242 else if (if ((stakingType != USDNTYPE))
4343 then (stakingType != NSBTTYPE)
4444 else false)
4545 then throw(("unsupported staking type " + stakingType))
4646 else assetId
4747
4848
4949 func getCurrentRewardsConfigKey (owner) = ("stakingconfig_current_" + owner)
5050
5151
5252 func getRewardsConfigStartKey (configKey,isStart) = (configKey + (if (isStart)
5353 then "_start"
5454 else "_end"))
5555
5656
5757 func getContractBalanceKey (assetId) = ((BalanceKey + "_") + assetId)
5858
5959
6060 func getContractBalance (assetId) = getNumberByKey(getContractBalanceKey(assetId))
6161
6262
6363 func internalUnlock (stakingType,i,unlockAmount,assetIdParam) = {
6464 let account = toString(i.caller)
6565 let assetId = getValidStakingAssetOrFail(stakingType, fromBase58String(assetIdParam))
6666 let assetIdString = toBase58String(assetId)
6767 let balance = (getUserBalance(account, assetIdString) - unlockAmount)
6868 if ((0 > balance))
6969 then throw("invalid amount")
7070 else [IntegerEntry(getContractBalanceKey(assetIdString), (getContractBalance(assetIdString) - unlockAmount)), IntegerEntry(getUserBalanceKey(account, assetIdString), balance), ScriptTransfer(addressFromStringValue(account), unlockAmount, assetId)]
7171 }
7272
7373
7474 func internalLockNeutrino (stakingType,i,receiver,share) = {
7575 let pmt = value(i.payments[0])
7676 let assetId = getValidStakingAssetOrFail(stakingType, value(pmt.assetId))
7777 if (!(isDefined(addressFromString(receiver))))
7878 then throw(("Invalid address format " + receiver))
7979 else if ((share > 100))
8080 then throw("staking rewards share cannot be higher than 100%")
8181 else if ((1 > share))
8282 then throw("staking rewards share cannot be lower than 1%")
8383 else {
8484 let account = toString(i.caller)
8585 let assetIdString = toBase58String(assetId)
8686 let currentConfig = getStringByKey(getCurrentRewardsConfigKey(account))
8787 let correctData = if ((currentConfig != ""))
8888 then {
8989 let currentConfigData = split(currentConfig, "_")
9090 let currShare = parseIntValue(currentConfigData[2])
9191 let currReceiver = currentConfigData[3]
9292 let notMigratedInitialShare = getNumberByKey(getRewardConfigInitialShare(account))
9393 let actualInitialShare = if ((notMigratedInitialShare == 0))
9494 then currShare
9595 else notMigratedInitialShare
9696 let newShare = if (if ((actualInitialShare > share))
9797 then true
9898 else (currReceiver != receiver))
9999 then actualInitialShare
100100 else share
101101 [toString(actualInitialShare), toString(newShare), currReceiver]
102102 }
103103 else [toString(share), toString(share), receiver]
104104 let correctInitialShare = parseIntValue(correctData[0])
105105 let correctShare = parseIntValue(correctData[1])
106106 let correctReceiver = correctData[2]
107107 let newCurrentConfig = getRewardsConfigKey(account, correctShare, correctReceiver)
108108 let isNewConfig = !((currentConfig == newCurrentConfig))
109109 let end = if (isNewConfig)
110110 then height
111111 else 0
112112 let start = if (isNewConfig)
113113 then height
114114 else getNumberByKey(getRewardsConfigStartKey(newCurrentConfig, true))
115115 [IntegerEntry(getContractBalanceKey(assetIdString), (getContractBalance(assetIdString) + pmt.amount)), IntegerEntry(getUserBalanceKey(account, assetIdString), (getUserBalance(account, assetIdString) + pmt.amount)), IntegerEntry(getRewardsConfigStartKey(currentConfig, false), end), IntegerEntry(getRewardsConfigStartKey(newCurrentConfig, true), start), IntegerEntry(getRewardConfigInitialShare(account), correctInitialShare), StringEntry(getCurrentRewardsConfigKey(account), newCurrentConfig)]
116116 }
117117 }
118118
119119
120120 @Callable(i)
121121 func lockNeutrino () = internalLockNeutrino(USDNTYPE, i, toString(i.caller), 100)
122122
123123
124124
125125 @Callable(i)
126126 func lockNsbt () = internalLockNeutrino(NSBTTYPE, i, toString(i.caller), 100)
127127
128128
129+
130+@Callable(i)
131+func unlockNeutrino (unlockAmount,assetIdString) = internalUnlock(USDNTYPE, i, unlockAmount, assetIdString)
132+
133+
134+
135+@Callable(i)
136+func unlockNsbt (unlockAmount,assetIdString) = internalUnlock(NSBTTYPE, i, unlockAmount, assetIdString)
137+
138+
139+@Verifier(tx)
140+func verify () = match tx {
141+ case _ =>
142+ sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
143+}
144+

github/deemru/w8io/873ac7e 
24.30 ms