2020.06.09 18:59 [2099479] smart account 3PNikM6yp4NqcSU8guxQtmR5onr2D4e8yTJ > SELF 0.00000000 Waves

{ "type": 13, "id": "3vhkfofHAaHY3UATCfnGtDGvtAZg9mUXQNg9CpzwBWjX", "fee": 14000000, "feeAssetId": null, "timestamp": 1591720427059, "version": 1, "sender": "3PNikM6yp4NqcSU8guxQtmR5onr2D4e8yTJ", "senderPublicKey": "6E2n1DAd4jnydbL7hMWLtjfW6VKrAGnFrNzfddAUnWq7", "proofs": [ "", "VtcP55jq53d2qi9iEUoYH9f1xZN2gR9kmwzRDgHSBDvqm7iD4wZ3aon5bUfn76CMBpPxQL3he3zsZPYw89ZGC2k", "", "39Wk4Uy1kZJVMDVPQhtgYCjerdLfCt7LWH4oDdPYHTHXqDMRBRrdgp6N9SSoaewC9AHhSHm5Rwezr3N1vq2PVr4T" ], "script": "base64:AAIDAAAAAAAAABwIARIECgIIARIAEgQKAgEIEgQKAggBEgQKAggBAAAAHwEAAAAOZ2V0TnVtYmVyQnlLZXkAAAABAAAAA2tleQQAAAAHJG1hdGNoMAkABBoAAAACBQAAAAR0aGlzBQAAAANrZXkDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAA0ludAQAAAABYQUAAAAHJG1hdGNoMAUAAAABYQAAAAAAAAAAAAEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABAAAAA2tleQQAAAAHJG1hdGNoMAkABB0AAAACBQAAAAR0aGlzBQAAAANrZXkDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABlN0cmluZwQAAAABYQUAAAAHJG1hdGNoMAUAAAABYQIAAAAAAQAAAAxnZXRCb29sQnlLZXkAAAABAAAAA2tleQQAAAAHJG1hdGNoMAkABBsAAAACBQAAAAR0aGlzBQAAAANrZXkDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAB0Jvb2xlYW4EAAAAAWEFAAAAByRtYXRjaDAFAAAAAWEHAQAAABhnZXROdW1iZXJCeUFkZHJlc3NBbmRLZXkAAAACAAAAB2FkZHJlc3MAAAADa2V5BAAAAAckbWF0Y2gwCQAEGgAAAAIJAQAAABxAZXh0clVzZXIoYWRkcmVzc0Zyb21TdHJpbmcpAAAAAQUAAAAHYWRkcmVzcwUAAAADa2V5AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAANJbnQEAAAAAWEFAAAAByRtYXRjaDAFAAAAAWEAAAAAAAAAAAABAAAAGGdldFN0cmluZ0J5QWRkcmVzc0FuZEtleQAAAAIAAAAHYWRkcmVzcwAAAANrZXkEAAAAByRtYXRjaDAJAAQdAAAAAgUAAAAHYWRkcmVzcwUAAAADa2V5AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAZTdHJpbmcEAAAAAWEFAAAAByRtYXRjaDAFAAAAAWECAAAAAAAAAAASTmV1dHJpbm9Bc3NldElkS2V5AgAAABFuZXV0cmlub19hc3NldF9pZAAAAAATTmV1dHJpbm9Db250cmFjdEtleQIAAAARbmV1dHJpbm9fY29udHJhY3QAAAAACkJhbGFuY2VLZXkCAAAAC3JwZF9iYWxhbmNlAAAAABJDb250cm9sQ29udHJhY3RLZXkCAAAAEGNvbnRyb2xfY29udHJhY3QAAAAACUFkbWluc0tleQIAAAAGYWRtaW5zAQAAABFnZXRVc2VyQmFsYW5jZUtleQAAAAIAAAAFb3duZXIAAAAHYXNzZXRJZAkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACBQAAAApCYWxhbmNlS2V5AgAAAAFfBQAAAAdhc3NldElkAgAAAAFfBQAAAAVvd25lcgEAAAAVZ2V0Q29udHJhY3RCYWxhbmNlS2V5AAAAAQAAAAdhc3NldElkCQABLAAAAAIJAAEsAAAAAgUAAAAKQmFsYW5jZUtleQIAAAABXwUAAAAHYXNzZXRJZAEAAAAUZ2V0RXhwaXJlUHJvcG9zYWxLZXkAAAABAAAABGhhc2gJAAEsAAAAAgkAASwAAAACAgAAAA9wcm9wb3NhbF9leHBpcmUCAAAAAV8FAAAABGhhc2gBAAAAE2dldE93bmVyUHJvcG9zYWxLZXkAAAABAAAABGhhc2gJAAEsAAAAAgkAASwAAAACAgAAAA5wcm9wb3NhbF9vd25lcgIAAAABXwUAAAAEaGFzaAEAAAAXZ2V0QXJndW1lbnRzUHJvcG9zYWxLZXkAAAABAAAABGhhc2gJAAEsAAAAAgkAASwAAAACAgAAABJwcm9wb3NhbF9hcmd1bWVudHMCAAAAAV8FAAAABGhhc2gBAAAACmdldFZvdGVLZXkAAAACAAAABW93bmVyAAAABGhhc2gJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAANcHJvcG9zYWxfdm90ZQIAAAABXwUAAAAFb3duZXICAAAAAV8FAAAABGhhc2gBAAAAFmNvbnZlcnRKc29uQXJyYXlUb0xpc3QAAAABAAAACWpzb25BcnJheQkABLUAAAACBQAAAAlqc29uQXJyYXkCAAAAASwAAAAAEG5ldXRyaW5vQ29udHJhY3QJAQAAABxAZXh0clVzZXIoYWRkcmVzc0Zyb21TdHJpbmcpAAAAAQkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQUAAAATTmV1dHJpbm9Db250cmFjdEtleQAAAAAPY29udHJvbENvbnRyYWN0CQEAAAAcQGV4dHJVc2VyKGFkZHJlc3NGcm9tU3RyaW5nKQAAAAEJAQAAABhnZXRTdHJpbmdCeUFkZHJlc3NBbmRLZXkAAAACBQAAABBuZXV0cmlub0NvbnRyYWN0BQAAABJDb250cm9sQ29udHJhY3RLZXkAAAAAD25ldXRyaW5vQXNzZXRJZAkAAlkAAAABCQEAAAAYZ2V0U3RyaW5nQnlBZGRyZXNzQW5kS2V5AAAAAgUAAAAQbmV1dHJpbm9Db250cmFjdAUAAAASTmV1dHJpbm9Bc3NldElkS2V5AQAAABJnZXRDb250cmFjdEJhbGFuY2UAAAABAAAAB2Fzc2V0SWQJAQAAAA5nZXROdW1iZXJCeUtleQAAAAEJAQAAABVnZXRDb250cmFjdEJhbGFuY2VLZXkAAAABBQAAAAdhc3NldElkAQAAAA5nZXRVc2VyQmFsYW5jZQAAAAIAAAAFb3duZXIAAAAHYXNzZXRJZAkBAAAADmdldE51bWJlckJ5S2V5AAAAAQkBAAAAEWdldFVzZXJCYWxhbmNlS2V5AAAAAgUAAAAFb3duZXIFAAAAB2Fzc2V0SWQBAAAAEWdldEV4cGlyZVByb3Bvc2FsAAAAAQAAAARoYXNoCQEAAAAOZ2V0TnVtYmVyQnlLZXkAAAABCQEAAAAUZ2V0RXhwaXJlUHJvcG9zYWxLZXkAAAABBQAAAARoYXNoAQAAABBnZXRPd25lclByb3Bvc2FsAAAAAQAAAARoYXNoCQEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABCQEAAAATZ2V0T3duZXJQcm9wb3NhbEtleQAAAAEFAAAABGhhc2gBAAAAFGdldEFyZ3VtZW50c1Byb3Bvc2FsAAAAAQAAAARoYXNoCQEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABCQEAAAAXZ2V0QXJndW1lbnRzUHJvcG9zYWxLZXkAAAABBQAAAARoYXNoAQAAAAdnZXRWb3RlAAAAAgAAAAVvd25lcgAAAARoYXNoCQEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABCQEAAAAKZ2V0Vm90ZUtleQAAAAIFAAAABW93bmVyBQAAAARoYXNoAQAAABNnZXRSZXdhcmRzQ29uZmlnS2V5AAAAAwAAAAVvd25lcgAAAAVzaGFyZQAAAAhyZWNlaXZlcgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAADnN0YWtpbmdjb25maWdfBQAAAAVvd25lcgIAAAABXwkAAaQAAAABBQAAAAVzaGFyZQIAAAABXwUAAAAIcmVjZWl2ZXIBAAAAGmdldEN1cnJlbnRSZXdhcmRzQ29uZmlnS2V5AAAAAQAAAAVvd25lcgkAASwAAAACAgAAABZzdGFraW5nY29uZmlnX2N1cnJlbnRfBQAAAAVvd25lcgEAAAAYZ2V0UmV3YXJkc0NvbmZpZ1N0YXJ0S2V5AAAAAgAAAAljb25maWdLZXkAAAAHaXNTdGFydAkAASwAAAACBQAAAAljb25maWdLZXkDBQAAAAdpc1N0YXJ0AgAAAAZfc3RhcnQCAAAABF9lbmQBAAAAG2dldFJld2FyZENvbmZpZ0luaXRpYWxTaGFyZQAAAAEAAAAFb3duZXIJAAEsAAAAAgUAAAAFb3duZXICAAAADV9pbml0aWFsU2hhcmUBAAAAFGludGVybmFsbG9ja05ldXRyaW5vAAAAAwAAAAFpAAAACHJlY2VpdmVyAAAABXNoYXJlBAAAAANwbXQJAQAAAAdleHRyYWN0AAAAAQgFAAAAAWkAAAAHcGF5bWVudAMJAQAAAAEhAAAAAQkBAAAACWlzRGVmaW5lZAAAAAEJAQAAABFhZGRyZXNzRnJvbVN0cmluZwAAAAEFAAAACHJlY2VpdmVyCQAAAgAAAAEJAAEsAAAAAgIAAAAXSW52YWxpZCBhZGRyZXNzIGZvcm1hdCAFAAAACHJlY2VpdmVyAwkBAAAAAiE9AAAAAggFAAAAA3BtdAAAAAdhc3NldElkBQAAAA9uZXV0cmlub0Fzc2V0SWQJAAACAAAAAQIAAAAQY2FuIHVzZSB1c2Qgb25seQMJAABmAAAAAgUAAAAFc2hhcmUAAAAAAAAAAGQJAAACAAAAAQIAAAAwc3Rha2luZyByZXdhcmRzIHNoYXJlIGNhbm5vdCBiZSBoaWdoZXIgdGhhbiAxMDAlAwkAAGYAAAACAAAAAAAAAAABBQAAAAVzaGFyZQkAAAIAAAABAgAAAC1zdGFraW5nIHJld2FyZHMgc2hhcmUgY2Fubm90IGJlIGxvd2VyIHRoYW4gMSUEAAAAB2FjY291bnQJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyBAAAAA1hc3NldElkU3RyaW5nCQACWAAAAAEJAQAAAAV2YWx1ZQAAAAEIBQAAAANwbXQAAAAHYXNzZXRJZAQAAAANY3VycmVudENvbmZpZwkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQkBAAAAGmdldEN1cnJlbnRSZXdhcmRzQ29uZmlnS2V5AAAAAQUAAAAHYWNjb3VudAQAAAALY29ycmVjdERhdGEDCQEAAAACIT0AAAACBQAAAA1jdXJyZW50Q29uZmlnAgAAAAAEAAAAEWN1cnJlbnRDb25maWdEYXRhCQAEtQAAAAIFAAAADWN1cnJlbnRDb25maWcCAAAAAV8EAAAACWN1cnJTaGFyZQkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAEWN1cnJlbnRDb25maWdEYXRhAAAAAAAAAAACBAAAAAxjdXJyUmVjZWl2ZXIJAAGRAAAAAgUAAAARY3VycmVudENvbmZpZ0RhdGEAAAAAAAAAAAMEAAAAF25vdE1pZ3JhdGVkSW5pdGlhbFNoYXJlCQEAAAAOZ2V0TnVtYmVyQnlLZXkAAAABCQEAAAAbZ2V0UmV3YXJkQ29uZmlnSW5pdGlhbFNoYXJlAAAAAQUAAAAHYWNjb3VudAQAAAASYWN0dWFsSW5pdGlhbFNoYXJlAwkAAAAAAAACBQAAABdub3RNaWdyYXRlZEluaXRpYWxTaGFyZQAAAAAAAAAAAAUAAAAJY3VyclNoYXJlBQAAABdub3RNaWdyYXRlZEluaXRpYWxTaGFyZQQAAAAIbmV3U2hhcmUDCQAAZgAAAAIFAAAAEmFjdHVhbEluaXRpYWxTaGFyZQUAAAAFc2hhcmUFAAAAEmFjdHVhbEluaXRpYWxTaGFyZQUAAAAFc2hhcmUJAARMAAAAAgkAAaQAAAABBQAAABJhY3R1YWxJbml0aWFsU2hhcmUJAARMAAAAAgkAAaQAAAABBQAAAAhuZXdTaGFyZQkABEwAAAACBQAAAAxjdXJyUmVjZWl2ZXIFAAAAA25pbAkABEwAAAACCQABpAAAAAEFAAAABXNoYXJlCQAETAAAAAIJAAGkAAAAAQUAAAAFc2hhcmUJAARMAAAAAgUAAAAIcmVjZWl2ZXIFAAAAA25pbAQAAAATY29ycmVjdEluaXRpYWxTaGFyZQkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAC2NvcnJlY3REYXRhAAAAAAAAAAAABAAAAAxjb3JyZWN0U2hhcmUJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAAtjb3JyZWN0RGF0YQAAAAAAAAAAAQQAAAAPY29ycmVjdFJlY2VpdmVyCQABkQAAAAIFAAAAC2NvcnJlY3REYXRhAAAAAAAAAAACBAAAABBuZXdDdXJyZW50Q29uZmlnCQEAAAATZ2V0UmV3YXJkc0NvbmZpZ0tleQAAAAMFAAAAB2FjY291bnQFAAAADGNvcnJlY3RTaGFyZQUAAAAPY29ycmVjdFJlY2VpdmVyBAAAAAtpc05ld0NvbmZpZwkBAAAAASEAAAABCQAAAAAAAAIFAAAADWN1cnJlbnRDb25maWcFAAAAEG5ld0N1cnJlbnRDb25maWcEAAAAA2VuZAMFAAAAC2lzTmV3Q29uZmlnBQAAAAZoZWlnaHQAAAAAAAAAAAAEAAAABXN0YXJ0AwUAAAALaXNOZXdDb25maWcFAAAABmhlaWdodAkBAAAADmdldE51bWJlckJ5S2V5AAAAAQkBAAAAGGdldFJld2FyZHNDb25maWdTdGFydEtleQAAAAIFAAAAEG5ld0N1cnJlbnRDb25maWcGCQEAAAAIV3JpdGVTZXQAAAABCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQEAAAAVZ2V0Q29udHJhY3RCYWxhbmNlS2V5AAAAAQUAAAANYXNzZXRJZFN0cmluZwkAAGQAAAACCQEAAAASZ2V0Q29udHJhY3RCYWxhbmNlAAAAAQUAAAANYXNzZXRJZFN0cmluZwgFAAAAA3BtdAAAAAZhbW91bnQJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAQAAABFnZXRVc2VyQmFsYW5jZUtleQAAAAIFAAAAB2FjY291bnQFAAAADWFzc2V0SWRTdHJpbmcJAABkAAAAAgkBAAAADmdldFVzZXJCYWxhbmNlAAAAAgUAAAAHYWNjb3VudAUAAAANYXNzZXRJZFN0cmluZwgFAAAAA3BtdAAAAAZhbW91bnQJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAQAAABhnZXRSZXdhcmRzQ29uZmlnU3RhcnRLZXkAAAACBQAAAA1jdXJyZW50Q29uZmlnBwUAAAADZW5kCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQEAAAAYZ2V0UmV3YXJkc0NvbmZpZ1N0YXJ0S2V5AAAAAgUAAAAQbmV3Q3VycmVudENvbmZpZwYFAAAABXN0YXJ0CQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQEAAAAbZ2V0UmV3YXJkQ29uZmlnSW5pdGlhbFNoYXJlAAAAAQUAAAAHYWNjb3VudAUAAAATY29ycmVjdEluaXRpYWxTaGFyZQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkBAAAAGmdldEN1cnJlbnRSZXdhcmRzQ29uZmlnS2V5AAAAAQUAAAAHYWNjb3VudAUAAAAQbmV3Q3VycmVudENvbmZpZwUAAAADbmlsAAAABQAAAAFpAQAAAA5sb2NrTmV1dHJpbm9TUAAAAAIAAAAIcmVjZWl2ZXIAAAAFc2hhcmUJAQAAABRpbnRlcm5hbGxvY2tOZXV0cmlubwAAAAMFAAAAAWkFAAAACHJlY2VpdmVyBQAAAAVzaGFyZQAAAAFpAQAAAAxsb2NrTmV1dHJpbm8AAAAACQEAAAAUaW50ZXJuYWxsb2NrTmV1dHJpbm8AAAADBQAAAAFpCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgAAAAAAAAAAZAAAAAFpAQAAAA51bmxvY2tOZXV0cmlubwAAAAIAAAAMdW5sb2NrQW1vdW50AAAADWFzc2V0SWRTdHJpbmcEAAAAB2FjY291bnQJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyBAAAAAdhc3NldElkCQACWQAAAAEFAAAADWFzc2V0SWRTdHJpbmcEAAAAB2JhbGFuY2UJAABlAAAAAgkBAAAADmdldFVzZXJCYWxhbmNlAAAAAgUAAAAHYWNjb3VudAUAAAANYXNzZXRJZFN0cmluZwUAAAAMdW5sb2NrQW1vdW50AwkAAGYAAAACAAAAAAAAAAAABQAAAAdiYWxhbmNlCQAAAgAAAAECAAAADmludmFsaWQgYW1vdW50AwkBAAAAAiE9AAAAAgUAAAAHYXNzZXRJZAUAAAAPbmV1dHJpbm9Bc3NldElkCQAAAgAAAAECAAAAEGNhbiB1c2UgbmV1dHJpbm8JAQAAAAxTY3JpcHRSZXN1bHQAAAACCQEAAAAIV3JpdGVTZXQAAAAB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", "chainId": 87, "height": 2099479, "spentComplexity": 0 } View: original | compacted Prev: 92DQebwDAQiZWhh1QYkKtDJ82fUuMmmx1nhzoCzr4vGz Next: FKtZsnUBieo13BVgxL8adThsF4yU63Yt1qZeicfosDcR Diff:
OldNewDifferences
107107 else "_end"))
108108
109109
110+func getRewardConfigInitialShare (owner) = (owner + "_initialShare")
111+
112+
110113 func internallockNeutrino (i,receiver,share) = {
111114 let pmt = extract(i.payment)
112115 if (!(isDefined(addressFromString(receiver))))
121124 let account = toString(i.caller)
122125 let assetIdString = toBase58String(value(pmt.assetId))
123126 let currentConfig = getStringByKey(getCurrentRewardsConfigKey(account))
124- let newCurrentConfig = getRewardsConfigKey(account, share, receiver)
127+ let correctData = if ((currentConfig != ""))
128+ then {
129+ let currentConfigData = split(currentConfig, "_")
130+ let currShare = parseIntValue(currentConfigData[2])
131+ let currReceiver = currentConfigData[3]
132+ let notMigratedInitialShare = getNumberByKey(getRewardConfigInitialShare(account))
133+ let actualInitialShare = if ((notMigratedInitialShare == 0))
134+ then currShare
135+ else notMigratedInitialShare
136+ let newShare = if ((actualInitialShare > share))
137+ then actualInitialShare
138+ else share
139+[toString(actualInitialShare), toString(newShare), currReceiver]
140+ }
141+ else [toString(share), toString(share), receiver]
142+ let correctInitialShare = parseIntValue(correctData[0])
143+ let correctShare = parseIntValue(correctData[1])
144+ let correctReceiver = correctData[2]
145+ let newCurrentConfig = getRewardsConfigKey(account, correctShare, correctReceiver)
125146 let isNewConfig = !((currentConfig == newCurrentConfig))
126147 let end = if (isNewConfig)
127148 then height
129150 let start = if (isNewConfig)
130151 then height
131152 else getNumberByKey(getRewardsConfigStartKey(newCurrentConfig, true))
132- WriteSet([DataEntry(getContractBalanceKey(assetIdString), (getContractBalance(assetIdString) + pmt.amount)), DataEntry(getUserBalanceKey(account, assetIdString), (getUserBalance(account, assetIdString) + pmt.amount)), DataEntry(getRewardsConfigStartKey(currentConfig, false), end), DataEntry(getRewardsConfigStartKey(newCurrentConfig, true), start), DataEntry(getCurrentRewardsConfigKey(account), newCurrentConfig)])
153+ WriteSet([DataEntry(getContractBalanceKey(assetIdString), (getContractBalance(assetIdString) + pmt.amount)), DataEntry(getUserBalanceKey(account, assetIdString), (getUserBalance(account, assetIdString) + pmt.amount)), DataEntry(getRewardsConfigStartKey(currentConfig, false), end), DataEntry(getRewardsConfigStartKey(newCurrentConfig, true), start), DataEntry(getRewardConfigInitialShare(account), correctInitialShare), DataEntry(getCurrentRewardsConfigKey(account), newCurrentConfig)])
133154 }
134155 }
135156
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 3 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 func getNumberByKey (key) = match getInteger(this, key) {
55 case a: Int =>
66 a
77 case _ =>
88 0
99 }
1010
1111
1212 func getStringByKey (key) = match getString(this, key) {
1313 case a: String =>
1414 a
1515 case _ =>
1616 ""
1717 }
1818
1919
2020 func getBoolByKey (key) = match getBoolean(this, key) {
2121 case a: Boolean =>
2222 a
2323 case _ =>
2424 false
2525 }
2626
2727
2828 func getNumberByAddressAndKey (address,key) = match getInteger(addressFromStringValue(address), key) {
2929 case a: Int =>
3030 a
3131 case _ =>
3232 0
3333 }
3434
3535
3636 func getStringByAddressAndKey (address,key) = match getString(address, key) {
3737 case a: String =>
3838 a
3939 case _ =>
4040 ""
4141 }
4242
4343
4444 let NeutrinoAssetIdKey = "neutrino_asset_id"
4545
4646 let NeutrinoContractKey = "neutrino_contract"
4747
4848 let BalanceKey = "rpd_balance"
4949
5050 let ControlContractKey = "control_contract"
5151
5252 let AdminsKey = "admins"
5353
5454 func getUserBalanceKey (owner,assetId) = ((((BalanceKey + "_") + assetId) + "_") + owner)
5555
5656
5757 func getContractBalanceKey (assetId) = ((BalanceKey + "_") + assetId)
5858
5959
6060 func getExpireProposalKey (hash) = (("proposal_expire" + "_") + hash)
6161
6262
6363 func getOwnerProposalKey (hash) = (("proposal_owner" + "_") + hash)
6464
6565
6666 func getArgumentsProposalKey (hash) = (("proposal_arguments" + "_") + hash)
6767
6868
6969 func getVoteKey (owner,hash) = (((("proposal_vote" + "_") + owner) + "_") + hash)
7070
7171
7272 func convertJsonArrayToList (jsonArray) = split(jsonArray, ",")
7373
7474
7575 let neutrinoContract = addressFromStringValue(getStringByKey(NeutrinoContractKey))
7676
7777 let controlContract = addressFromStringValue(getStringByAddressAndKey(neutrinoContract, ControlContractKey))
7878
7979 let neutrinoAssetId = fromBase58String(getStringByAddressAndKey(neutrinoContract, NeutrinoAssetIdKey))
8080
8181 func getContractBalance (assetId) = getNumberByKey(getContractBalanceKey(assetId))
8282
8383
8484 func getUserBalance (owner,assetId) = getNumberByKey(getUserBalanceKey(owner, assetId))
8585
8686
8787 func getExpireProposal (hash) = getNumberByKey(getExpireProposalKey(hash))
8888
8989
9090 func getOwnerProposal (hash) = getStringByKey(getOwnerProposalKey(hash))
9191
9292
9393 func getArgumentsProposal (hash) = getStringByKey(getArgumentsProposalKey(hash))
9494
9595
9696 func getVote (owner,hash) = getStringByKey(getVoteKey(owner, hash))
9797
9898
9999 func getRewardsConfigKey (owner,share,receiver) = ((((("stakingconfig_" + owner) + "_") + toString(share)) + "_") + receiver)
100100
101101
102102 func getCurrentRewardsConfigKey (owner) = ("stakingconfig_current_" + owner)
103103
104104
105105 func getRewardsConfigStartKey (configKey,isStart) = (configKey + (if (isStart)
106106 then "_start"
107107 else "_end"))
108108
109109
110+func getRewardConfigInitialShare (owner) = (owner + "_initialShare")
111+
112+
110113 func internallockNeutrino (i,receiver,share) = {
111114 let pmt = extract(i.payment)
112115 if (!(isDefined(addressFromString(receiver))))
113116 then throw(("Invalid address format " + receiver))
114117 else if ((pmt.assetId != neutrinoAssetId))
115118 then throw("can use usd only")
116119 else if ((share > 100))
117120 then throw("staking rewards share cannot be higher than 100%")
118121 else if ((1 > share))
119122 then throw("staking rewards share cannot be lower than 1%")
120123 else {
121124 let account = toString(i.caller)
122125 let assetIdString = toBase58String(value(pmt.assetId))
123126 let currentConfig = getStringByKey(getCurrentRewardsConfigKey(account))
124- let newCurrentConfig = getRewardsConfigKey(account, share, receiver)
127+ let correctData = if ((currentConfig != ""))
128+ then {
129+ let currentConfigData = split(currentConfig, "_")
130+ let currShare = parseIntValue(currentConfigData[2])
131+ let currReceiver = currentConfigData[3]
132+ let notMigratedInitialShare = getNumberByKey(getRewardConfigInitialShare(account))
133+ let actualInitialShare = if ((notMigratedInitialShare == 0))
134+ then currShare
135+ else notMigratedInitialShare
136+ let newShare = if ((actualInitialShare > share))
137+ then actualInitialShare
138+ else share
139+[toString(actualInitialShare), toString(newShare), currReceiver]
140+ }
141+ else [toString(share), toString(share), receiver]
142+ let correctInitialShare = parseIntValue(correctData[0])
143+ let correctShare = parseIntValue(correctData[1])
144+ let correctReceiver = correctData[2]
145+ let newCurrentConfig = getRewardsConfigKey(account, correctShare, correctReceiver)
125146 let isNewConfig = !((currentConfig == newCurrentConfig))
126147 let end = if (isNewConfig)
127148 then height
128149 else 0
129150 let start = if (isNewConfig)
130151 then height
131152 else getNumberByKey(getRewardsConfigStartKey(newCurrentConfig, true))
132- WriteSet([DataEntry(getContractBalanceKey(assetIdString), (getContractBalance(assetIdString) + pmt.amount)), DataEntry(getUserBalanceKey(account, assetIdString), (getUserBalance(account, assetIdString) + pmt.amount)), DataEntry(getRewardsConfigStartKey(currentConfig, false), end), DataEntry(getRewardsConfigStartKey(newCurrentConfig, true), start), DataEntry(getCurrentRewardsConfigKey(account), newCurrentConfig)])
153+ WriteSet([DataEntry(getContractBalanceKey(assetIdString), (getContractBalance(assetIdString) + pmt.amount)), DataEntry(getUserBalanceKey(account, assetIdString), (getUserBalance(account, assetIdString) + pmt.amount)), DataEntry(getRewardsConfigStartKey(currentConfig, false), end), DataEntry(getRewardsConfigStartKey(newCurrentConfig, true), start), DataEntry(getRewardConfigInitialShare(account), correctInitialShare), DataEntry(getCurrentRewardsConfigKey(account), newCurrentConfig)])
133154 }
134155 }
135156
136157
137158 @Callable(i)
138159 func lockNeutrinoSP (receiver,share) = internallockNeutrino(i, receiver, share)
139160
140161
141162
142163 @Callable(i)
143164 func lockNeutrino () = internallockNeutrino(i, toString(i.caller), 100)
144165
145166
146167
147168 @Callable(i)
148169 func unlockNeutrino (unlockAmount,assetIdString) = {
149170 let account = toString(i.caller)
150171 let assetId = fromBase58String(assetIdString)
151172 let balance = (getUserBalance(account, assetIdString) - unlockAmount)
152173 if ((0 > balance))
153174 then throw("invalid amount")
154175 else if ((assetId != neutrinoAssetId))
155176 then throw("can use neutrino")
156177 else ScriptResult(WriteSet([DataEntry(getContractBalanceKey(assetIdString), (getContractBalance(assetIdString) - unlockAmount)), DataEntry(getUserBalanceKey(account, assetIdString), balance)]), TransferSet([ScriptTransfer(addressFromStringValue(account), unlockAmount, neutrinoAssetId)]))
157178 }
158179
159180
160181
161182 @Callable(i)
162183 func vote (hash,indexArgument) = {
163184 let arguments = split(getArgumentsProposal(hash), ",")
164185 let argument = arguments[indexArgument]
165186 if ((height > getExpireProposal(hash)))
166187 then throw("proposal is expired")
167188 else WriteSet([DataEntry(getVoteKey(toString(i.caller), hash), argument)])
168189 }
169190
170191
171192
172193 @Callable(i)
173194 func createProposal (arguments,expairHeight) = {
174195 let hash = toBase58String(keccak256(((toBytes(arguments) + toBytes(expairHeight)) + i.callerPublicKey)))
175196 if ((getOwnerProposal(hash) != ""))
176197 then throw("proposal is exist")
177198 else WriteSet([DataEntry(getExpireProposalKey(hash), expairHeight), DataEntry(getOwnerProposalKey(hash), toString(i.caller)), DataEntry(getArgumentsProposalKey(hash), arguments)])
178199 }
179200
180201
181202 @Verifier(tx)
182203 func verify () = {
183204 let pubKeyAdminsList = ["BLEoguzPVKVTfXxxT3W7Rqf8aUm2ggC9Vemd2MQawM2G", "FWVffYr2ALmHMejZm3WqeLz6Sdym3gLFGtJn4KTwyU5x", "3Wh2LaWcb5gg7K2pPcW3Ep6EAuRBzYkAgrdpt43jTDFa", "5WRXFSjwcTbNfKcJs8ZqXmSSWYsSVJUtMvMqZj5hH4Nc"]
184205 let count = ((((if (sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(pubKeyAdminsList[0])))
185206 then 1
186207 else 0) + (if (sigVerify(tx.bodyBytes, tx.proofs[1], fromBase58String(pubKeyAdminsList[1])))
187208 then 1
188209 else 0)) + (if (sigVerify(tx.bodyBytes, tx.proofs[2], fromBase58String(pubKeyAdminsList[2])))
189210 then 1
190211 else 0)) + (if (sigVerify(tx.bodyBytes, tx.proofs[3], fromBase58String(pubKeyAdminsList[3])))
191212 then 2
192213 else 0))
193214 (count >= 3)
194215 }
195216

github/deemru/w8io/786bc32 
68.18 ms