2020.09.07 06:30 [2230049] smart account 3PNikM6yp4NqcSU8guxQtmR5onr2D4e8yTJ > SELF 0.00000000 Waves
{ "type": 13, "id": "53nvN76T5dbK5h1TV6KUwLab22YSy91pDmryDCTsLCZg", "fee": 14000000, "feeAssetId": null, "timestamp": 1599451253682, "version": 1, "sender": "3PNikM6yp4NqcSU8guxQtmR5onr2D4e8yTJ", "senderPublicKey": "6E2n1DAd4jnydbL7hMWLtjfW6VKrAGnFrNzfddAUnWq7", "proofs": [ "", "2L2PF4LsF7gGg9CmwjWP35XU7aXp2RKRbEgaWbsNx8Bx7GzJAriTFoL6aQWSo5c328K21SDh6RtDwSi9hSET3aYN", "", "361jWq4qyzv5oASkj2cyM25Sadikd4RUdh9wECxbLtkwN1FPM1RZaETxZqFC3KproDSqB538Bd9kTDCdYQ34Gv1B" ], "script": "base64:AAIEAAAAAAAAABwIAhIECgIIARIAEgQKAgEIEgQKAggBEgQKAggBAAAAHwEAAAAOZ2V0TnVtYmVyQnlLZXkAAAABAAAAA2tleQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzBQAAAANrZXkAAAAAAAAAAAABAAAADmdldFN0cmluZ0J5S2V5AAAAAQAAAANrZXkJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQdAAAAAgUAAAAEdGhpcwUAAAADa2V5AgAAAAABAAAADGdldEJvb2xCeUtleQAAAAEAAAADa2V5CQEAAAALdmFsdWVPckVsc2UAAAACCQAEGwAAAAIFAAAABHRoaXMFAAAAA2tleQcBAAAAGGdldE51bWJlckJ5QWRkcmVzc0FuZEtleQAAAAIAAAAHYWRkcmVzcwAAAANrZXkJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQUAAAAHYWRkcmVzcwUAAAADa2V5AAAAAAAAAAAAAQAAABhnZXRTdHJpbmdCeUFkZHJlc3NBbmRLZXkAAAACAAAAB2FkZHJlc3MAAAADa2V5CQEAAAALdmFsdWVPckVsc2UAAAACCQAEHQAAAAIFAAAAB2FkZHJlc3MFAAAAA2tleQIAAAAAAAAAABJOZXV0cmlub0Fzc2V0SWRLZXkCAAAAEW5ldXRyaW5vX2Fzc2V0X2lkAAAAABNOZXV0cmlub0NvbnRyYWN0S2V5AgAAABFuZXV0cmlub19jb250cmFjdAAAAAAKQmFsYW5jZUtleQIAAAALcnBkX2JhbGFuY2UAAAAAEkNvbnRyb2xDb250cmFjdEtleQIAAAAQY29udHJvbF9jb250cmFjdAAAAAAJQWRtaW5zS2V5AgAAAAZhZG1pbnMBAAAAEWdldFVzZXJCYWxhbmNlS2V5AAAAAgAAAAVvd25lcgAAAAdhc3NldElkCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIFAAAACkJhbGFuY2VLZXkCAAAAAV8FAAAAB2Fzc2V0SWQCAAAAAV8FAAAABW93bmVyAQAAABVnZXRDb250cmFjdEJhbGFuY2VLZXkAAAABAAAAB2Fzc2V0SWQJAAEsAAAAAgkAASwAAAACBQAAAApCYWxhbmNlS2V5AgAAAAFfBQAAAAdhc3NldElkAQAAABRnZXRFeHBpcmVQcm9wb3NhbEtleQAAAAEAAAAEaGFzaAkAASwAAAACCQABLAAAAAICAAAAD3Byb3Bvc2FsX2V4cGlyZQIAAAABXwUAAAAEaGFzaAEAAAATZ2V0T3duZXJQcm9wb3NhbEtleQAAAAEAAAAEaGFzaAkAASwAAAACCQABLAAAAAICAAAADnByb3Bvc2FsX293bmVyAgAAAAFfBQAAAARoYXNoAQAAABdnZXRBcmd1bWVudHNQcm9wb3NhbEtleQAAAAEAAAAEaGFzaAkAASwAAAACCQABLAAAAAICAAAAEnByb3Bvc2FsX2FyZ3VtZW50cwIAAAABXwUAAAAEaGFzaAEAAAAKZ2V0Vm90ZUtleQAAAAIAAAAFb3duZXIAAAAEaGFzaAkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAA1wcm9wb3NhbF92b3RlAgAAAAFfBQAAAAVvd25lcgIAAAABXwUAAAAEaGFzaAEAAAAWY29udmVydEpzb25BcnJheVRvTGlzdAAAAAEAAAAJanNvbkFycmF5CQAEtQAAAAIFAAAACWpzb25BcnJheQIAAAABLAAAAAAQbmV1dHJpbm9Db250cmFjdAkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQUAAAATTmV1dHJpbm9Db250cmFjdEtleQAAAAAPY29udHJvbENvbnRyYWN0CQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABCQEAAAAYZ2V0U3RyaW5nQnlBZGRyZXNzQW5kS2V5AAAAAgUAAAAQbmV1dHJpbm9Db250cmFjdAUAAAASQ29udHJvbENvbnRyYWN0S2V5AAAAAA9uZXV0cmlub0Fzc2V0SWQJAAJZAAAAAQkBAAAAGGdldFN0cmluZ0J5QWRkcmVzc0FuZEtleQAAAAIFAAAAEG5ldXRyaW5vQ29udHJhY3QFAAAAEk5ldXRyaW5vQXNzZXRJZEtleQEAAAASZ2V0Q29udHJhY3RCYWxhbmNlAAAAAQAAAAdhc3NldElkCQEAAAAOZ2V0TnVtYmVyQnlLZXkAAAABCQEAAAAVZ2V0Q29udHJhY3RCYWxhbmNlS2V5AAAAAQUAAAAHYXNzZXRJZAEAAAAOZ2V0VXNlckJhbGFuY2UAAAACAAAABW93bmVyAAAAB2Fzc2V0SWQJAQAAAA5nZXROdW1iZXJCeUtleQAAAAEJAQAAABFnZXRVc2VyQmFsYW5jZUtleQAAAAIFAAAABW93bmVyBQAAAAdhc3NldElkAQAAABFnZXRFeHBpcmVQcm9wb3NhbAAAAAEAAAAEaGFzaAkBAAAADmdldE51bWJlckJ5S2V5AAAAAQkBAAAAFGdldEV4cGlyZVByb3Bvc2FsS2V5AAAAAQUAAAAEaGFzaAEAAAAQZ2V0T3duZXJQcm9wb3NhbAAAAAEAAAAEaGFzaAkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQkBAAAAE2dldE93bmVyUHJvcG9zYWxLZXkAAAABBQAAAARoYXNoAQAAABRnZXRBcmd1bWVudHNQcm9wb3NhbAAAAAEAAAAEaGFzaAkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQkBAAAAF2dldEFyZ3VtZW50c1Byb3Bvc2FsS2V5AAAAAQUAAAAEaGFzaAEAAAAHZ2V0Vm90ZQAAAAIAAAAFb3duZXIAAAAEaGFzaAkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQkBAAAACmdldFZvdGVLZXkAAAACBQAAAAVvd25lcgUAAAAEaGFzaAEAAAATZ2V0UmV3YXJkc0NvbmZpZ0tleQAAAAMAAAAFb3duZXIAAAAFc2hhcmUAAAAIcmVjZWl2ZXIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAA5zdGFraW5nY29uZmlnXwUAAAAFb3duZXICAAAAAV8JAAGkAAAAAQUAAAAFc2hhcmUCAAAAAV8FAAAACHJlY2VpdmVyAQAAABpnZXRDdXJyZW50UmV3YXJkc0NvbmZpZ0tleQAAAAEAAAAFb3duZXIJAAEsAAAAAgIAAAAWc3Rha2luZ2NvbmZpZ19jdXJyZW50XwUAAAAFb3duZXIBAAAAGGdldFJld2FyZHNDb25maWdTdGFydEtleQAAAAIAAAAJY29uZmlnS2V5AAAAB2lzU3RhcnQJAAEsAAAAAgUAAAAJY29uZmlnS2V5AwUAAAAHaXNTdGFydAIAAAAGX3N0YXJ0AgAAAARfZW5kAQAAABtnZXRSZXdhcmRDb25maWdJbml0aWFsU2hhcmUAAAABAAAABW93bmVyCQABLAAAAAIFAAAABW93bmVyAgAAAA1faW5pdGlhbFNoYXJlAQAAABRpbnRlcm5hbGxvY2tOZXV0cmlubwAAAAMAAAABaQAAAAhyZWNlaXZlcgAAAAVzaGFyZQQAAAADcG10CQEAAAAFdmFsdWUAAAABCQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAAAwkBAAAAASEAAAABCQEAAAAJaXNEZWZpbmVkAAAAAQkABCYAAAABBQAAAAhyZWNlaXZlcgkAAAIAAAABCQABLAAAAAICAAAAF0ludmFsaWQgYWRkcmVzcyBmb3JtYXQgBQAAAAhyZWNlaXZlcgMJAQAAAAIhPQAAAAIIBQAAAANwbXQAAAAHYXNzZXRJZAUAAAAPbmV1dHJpbm9Bc3NldElkCQAAAgAAAAECAAAAEGNhbiB1c2UgdXNkIG9ubHkDCQAAZgAAAAIFAAAABXNoYXJlAAAAAAAAAABkCQAAAgAAAAECAAAAMHN0YWtpbmcgcmV3YXJkcyBzaGFyZSBjYW5ub3QgYmUgaGlnaGVyIHRoYW4gMTAwJQMJAABmAAAAAgAAAAAAAAAAAQUAAAAFc2hhcmUJAAACAAAAAQIAAAAtc3Rha2luZyByZXdhcmRzIHNoYXJlIGNhbm5vdCBiZSBsb3dlciB0aGFuIDElBAAAAAdhY2NvdW50CQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgQAAAANYXNzZXRJZFN0cmluZwkAAlgAAAABCQEAAAAFdmFsdWUAAAABCAUAAAADcG10AAAAB2Fzc2V0SWQEAAAADWN1cnJlbnRDb25maWcJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEJAQAAABpnZXRDdXJyZW50UmV3YXJkc0NvbmZpZ0tleQAAAAEFAAAAB2FjY291bnQEAAAAC2NvcnJlY3REYXRhAwkBAAAAAiE9AAAAAgUAAAANY3VycmVudENvbmZpZwIAAAAABAAAABFjdXJyZW50Q29uZmlnRGF0YQkABLUAAAACBQAAAA1jdXJyZW50Q29uZmlnAgAAAAFfBAAAAAljdXJyU2hhcmUJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAABFjdXJyZW50Q29uZmlnRGF0YQAAAAAAAAAAAgQAAAAMY3VyclJlY2VpdmVyCQABkQAAAAIFAAAAEWN1cnJlbnRDb25maWdEYXRhAAAAAAAAAAADBAAAABdub3RNaWdyYXRlZEluaXRpYWxTaGFyZQkBAAAADmdldE51bWJlckJ5S2V5AAAAAQkBAAAAG2dldFJld2FyZENvbmZpZ0luaXRpYWxTaGFyZQAAAAEFAAAAB2FjY291bnQEAAAAEmFjdHVhbEluaXRpYWxTaGFyZQMJAAAAAAAAAgUAAAAXbm90TWlncmF0ZWRJbml0aWFsU2hhcmUAAAAAAAAAAAAFAAAACWN1cnJTaGFyZQUAAAAXbm90TWlncmF0ZWRJbml0aWFsU2hhcmUEAAAACG5ld1NoYXJlAwMJAABmAAAAAgUAAAASYWN0dWFsSW5pdGlhbFNoYXJlBQAAAAVzaGFyZQYJAQAAAAIhPQAAAAIFAAAADGN1cnJSZWNlaXZlcgUAAAAIcmVjZWl2ZXIFAAAAEmFjdHVhbEluaXRpYWxTaGFyZQUAAAAFc2hhcmUJAARMAAAAAgkAAaQAAAABBQAAABJhY3R1YWxJbml0aWFsU2hhcmUJAARMAAAAAgkAAaQAAAABBQAAAAhuZXdTaGFyZQkABEwAAAACBQAAAAxjdXJyUmVjZWl2ZXIFAAAAA25pbAkABEwAAAACCQABpAAAAAEFAAAABXNoYXJlCQAETAAAAAIJAAGkAAAAAQUAAAAFc2hhcmUJAARMAAAAAgUAAAAIcmVjZWl2ZXIFAAAAA25pbAQAAAATY29ycmVjdEluaXRpYWxTaGFyZQkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAC2NvcnJlY3REYXRhAAAAAAAAAAAABAAAAAxjb3JyZWN0U2hhcmUJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAAtjb3JyZWN0RGF0YQAAAAAAAAAAAQQAAAAPY29ycmVjdFJlY2VpdmVyCQABkQAAAAIFAAAAC2NvcnJlY3REYXRhAAAAAAAAAAACBAAAABBuZXdDdXJyZW50Q29uZmlnCQEAAAATZ2V0UmV3YXJkc0NvbmZpZ0tleQAAAAMFAAAAB2FjY291bnQFAAAADGNvcnJlY3RTaGFyZQUAAAAPY29ycmVjdFJlY2VpdmVyBAAAAAtpc05ld0NvbmZpZwkBAAAAASEAAAABCQAAAAAAAAIFAAAADWN1cnJlbnRDb25maWcFAAAAEG5ld0N1cnJlbnRDb25maWcEAAAAA2VuZAMFAAAAC2lzTmV3Q29uZmlnBQAAAAZoZWlnaHQAAAAAAAAAAAAEAAAABXN0YXJ0AwUAAAALaXNOZXdDb25maWcFAAAABmhlaWdodAkBAAAADmdldE51bWJlckJ5S2V5AAAAAQkBAAAAGGdldFJld2FyZHNDb25maWdTdGFydEtleQAAAAIFAAAAEG5ld0N1cnJlbnRDb25maWcGCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAVZ2V0Q29udHJhY3RCYWxhbmNlS2V5AAAAAQUAAAANYXNzZXRJZFN0cmluZwkAAGQAAAACCQEAAAASZ2V0Q29udHJhY3RCYWxhbmNlAAAAAQUAAAANYXNzZXRJZFN0cmluZwgFAAAAA3BtdAAAAAZhbW91bnQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABFnZXRVc2VyQmFsYW5jZUtleQAAAAIFAAAAB2FjY291bnQFAAAADWFzc2V0SWRTdHJpbmcJAABkAAAAAgkBAAAADmdldFVzZXJCYWxhbmNlAAAAAgUAAAAHYWNjb3VudAUAAAANYXNzZXRJZFN0cmluZwgFAAAAA3BtdAAAAAZhbW91bnQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABhnZXRSZXdhcmRzQ29uZmlnU3RhcnRLZXkAAAACBQAAAA1jdXJyZW50Q29uZmlnBwUAAAADZW5kCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAYZ2V0UmV3YXJkc0NvbmZpZ1N0YXJ0S2V5AAAAAgUAAAAQbmV3Q3VycmVudENvbmZpZwYFAAAABXN0YXJ0CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAbZ2V0UmV3YXJkQ29uZmlnSW5pdGlhbFNoYXJlAAAAAQUAAAAHYWNjb3VudAUAAAATY29ycmVjdEluaXRpYWxTaGFyZQkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAaZ2V0Q3VycmVudFJld2FyZHNDb25maWdLZXkAAAABBQAAAAdhY2NvdW50BQAAABBuZXdDdXJyZW50Q29uZmlnBQAAAANuaWwAAAAFAAAAAWkBAAAADmxvY2tOZXV0cmlub1NQAAAAAgAAAAhyZWNlaXZlcgAAAAVzaGFyZQkBAAAAFGludGVybmFsbG9ja05ldXRyaW5vAAAAAwUAAAABaQUAAAAIcmVjZWl2ZXIFAAAABXNoYXJlAAAAAWkBAAAADGxvY2tOZXV0cmlubwAAAAAJAQAAABRpbnRlcm5hbGxvY2tOZXV0cmlubwAAAAMFAAAAAWkJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyAAAAAAAAAABkAAAAAWkBAAAADnVubG9ja05ldXRyaW5vAAAAAgAAAAx1bmxvY2tBbW91bnQAAAANYXNzZXRJZFN0cmluZwQAAAAHYWNjb3VudAkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIEAAAAB2Fzc2V0SWQJAAJZAAAAAQUAAAANYXNzZXRJZFN0cmluZwQAAAAHYmFsYW5jZQkAAGUAAAACCQEAAAAOZ2V0VXNlckJhbGFuY2UAAAACBQAAAAdhY2NvdW50BQAAAA1hc3NldElkU3RyaW5nBQAAAAx1bmxvY2tBbW91bnQDCQAAZgAAAAIAAAAAAAAAAAAFAAAAB2JhbGFuY2UJAAACAAAAAQIAAAAOaW52YWxpZCBhbW91bnQDCQEAAAACIT0AAAACBQAAAAdhc3NldElkBQAAAA9uZXV0cmlub0Fzc2V0SWQJAAACAAAAAQIAAAAQY2FuIHVzZSBuZXV0cmlubwkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAFWdldENvbnRyYWN0QmFsYW5jZUtleQAAAAEFAAAADWFzc2V0SWRTdHJpbmcJAABlAAAAAgkBAAAAEmdldENvbnRyYWN0QmFsYW5jZQAAAAEFAAAADWFzc2V0SWRTdHJpbmcFAAAADHVubG9ja0Ftb3VudAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAEWdldFVzZXJCYWxhbmNlS2V5AAAAAgUAAAAHYWNjb3VudAUAAAANYXNzZXRJZFN0cmluZwUAAAAHYmFsYW5jZQkABEwAAAACCQEAAAAO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", "chainId": 87, "height": 2230049, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: FKtZsnUBieo13BVgxL8adThsF4yU63Yt1qZeicfosDcR Next: 5ZEv9K5bA6u8BZC7jkUyGTWeZX6MMLevHZ9VHzWTNjtd Diff:
Old | New | Differences | |
---|---|---|---|
1 | - | {-# STDLIB_VERSION | |
1 | + | {-# STDLIB_VERSION 4 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | - | func getNumberByKey (key) = match getInteger(this, key) { | |
5 | - | case a: Int => | |
6 | - | a | |
7 | - | case _ => | |
8 | - | 0 | |
9 | - | } | |
4 | + | func getNumberByKey (key) = valueOrElse(getInteger(this, key), 0) | |
10 | 5 | ||
11 | 6 | ||
12 | - | func getStringByKey (key) = match getString(this, key) { | |
13 | - | case a: String => | |
14 | - | a | |
15 | - | case _ => | |
16 | - | "" | |
17 | - | } | |
7 | + | func getStringByKey (key) = valueOrElse(getString(this, key), "") | |
18 | 8 | ||
19 | 9 | ||
20 | - | func getBoolByKey (key) = match getBoolean(this, key) { | |
21 | - | case a: Boolean => | |
22 | - | a | |
23 | - | case _ => | |
24 | - | false | |
25 | - | } | |
10 | + | func getBoolByKey (key) = valueOrElse(getBoolean(this, key), false) | |
26 | 11 | ||
27 | 12 | ||
28 | - | func getNumberByAddressAndKey (address,key) = match getInteger(addressFromStringValue(address), key) { | |
29 | - | case a: Int => | |
30 | - | a | |
31 | - | case _ => | |
32 | - | 0 | |
33 | - | } | |
13 | + | func getNumberByAddressAndKey (address,key) = valueOrElse(getInteger(addressFromStringValue(address), key), 0) | |
34 | 14 | ||
35 | 15 | ||
36 | - | func getStringByAddressAndKey (address,key) = match getString(address, key) { | |
37 | - | case a: String => | |
38 | - | a | |
39 | - | case _ => | |
40 | - | "" | |
41 | - | } | |
16 | + | func getStringByAddressAndKey (address,key) = valueOrElse(getString(address, key), "") | |
42 | 17 | ||
43 | 18 | ||
44 | 19 | let NeutrinoAssetIdKey = "neutrino_asset_id" | |
111 | 86 | ||
112 | 87 | ||
113 | 88 | func internallockNeutrino (i,receiver,share) = { | |
114 | - | let pmt = | |
89 | + | let pmt = value(i.payments[0]) | |
115 | 90 | if (!(isDefined(addressFromString(receiver)))) | |
116 | 91 | then throw(("Invalid address format " + receiver)) | |
117 | 92 | else if ((pmt.assetId != neutrinoAssetId)) | |
152 | 127 | let start = if (isNewConfig) | |
153 | 128 | then height | |
154 | 129 | else getNumberByKey(getRewardsConfigStartKey(newCurrentConfig, true)) | |
155 | - | ||
130 | + | [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)] | |
156 | 131 | } | |
157 | 132 | } | |
158 | 133 | ||
176 | 151 | then throw("invalid amount") | |
177 | 152 | else if ((assetId != neutrinoAssetId)) | |
178 | 153 | then throw("can use neutrino") | |
179 | - | else | |
154 | + | else [IntegerEntry(getContractBalanceKey(assetIdString), (getContractBalance(assetIdString) - unlockAmount)), IntegerEntry(getUserBalanceKey(account, assetIdString), balance), ScriptTransfer(addressFromStringValue(account), unlockAmount, neutrinoAssetId)] | |
180 | 155 | } | |
181 | 156 | ||
182 | 157 | ||
187 | 162 | let argument = arguments[indexArgument] | |
188 | 163 | if ((height > getExpireProposal(hash))) | |
189 | 164 | then throw("proposal is expired") | |
190 | - | else | |
165 | + | else [StringEntry(getVoteKey(toString(i.caller), hash), argument)] | |
191 | 166 | } | |
192 | 167 | ||
193 | 168 | ||
197 | 172 | let hash = toBase58String(keccak256(((toBytes(arguments) + toBytes(expairHeight)) + i.callerPublicKey))) | |
198 | 173 | if ((getOwnerProposal(hash) != "")) | |
199 | 174 | then throw("proposal is exist") | |
200 | - | else | |
175 | + | else [IntegerEntry(getExpireProposalKey(hash), expairHeight), StringEntry(getOwnerProposalKey(hash), toString(i.caller)), StringEntry(getArgumentsProposalKey(hash), arguments)] | |
201 | 176 | } | |
202 | 177 | ||
203 | 178 |
Old | New | Differences | |
---|---|---|---|
1 | - | {-# STDLIB_VERSION | |
1 | + | {-# STDLIB_VERSION 4 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | - | func getNumberByKey (key) = match getInteger(this, key) { | |
5 | - | case a: Int => | |
6 | - | a | |
7 | - | case _ => | |
8 | - | 0 | |
9 | - | } | |
4 | + | func getNumberByKey (key) = valueOrElse(getInteger(this, key), 0) | |
10 | 5 | ||
11 | 6 | ||
12 | - | func getStringByKey (key) = match getString(this, key) { | |
13 | - | case a: String => | |
14 | - | a | |
15 | - | case _ => | |
16 | - | "" | |
17 | - | } | |
7 | + | func getStringByKey (key) = valueOrElse(getString(this, key), "") | |
18 | 8 | ||
19 | 9 | ||
20 | - | func getBoolByKey (key) = match getBoolean(this, key) { | |
21 | - | case a: Boolean => | |
22 | - | a | |
23 | - | case _ => | |
24 | - | false | |
25 | - | } | |
10 | + | func getBoolByKey (key) = valueOrElse(getBoolean(this, key), false) | |
26 | 11 | ||
27 | 12 | ||
28 | - | func getNumberByAddressAndKey (address,key) = match getInteger(addressFromStringValue(address), key) { | |
29 | - | case a: Int => | |
30 | - | a | |
31 | - | case _ => | |
32 | - | 0 | |
33 | - | } | |
13 | + | func getNumberByAddressAndKey (address,key) = valueOrElse(getInteger(addressFromStringValue(address), key), 0) | |
34 | 14 | ||
35 | 15 | ||
36 | - | func getStringByAddressAndKey (address,key) = match getString(address, key) { | |
37 | - | case a: String => | |
38 | - | a | |
39 | - | case _ => | |
40 | - | "" | |
41 | - | } | |
16 | + | func getStringByAddressAndKey (address,key) = valueOrElse(getString(address, key), "") | |
42 | 17 | ||
43 | 18 | ||
44 | 19 | let NeutrinoAssetIdKey = "neutrino_asset_id" | |
45 | 20 | ||
46 | 21 | let NeutrinoContractKey = "neutrino_contract" | |
47 | 22 | ||
48 | 23 | let BalanceKey = "rpd_balance" | |
49 | 24 | ||
50 | 25 | let ControlContractKey = "control_contract" | |
51 | 26 | ||
52 | 27 | let AdminsKey = "admins" | |
53 | 28 | ||
54 | 29 | func getUserBalanceKey (owner,assetId) = ((((BalanceKey + "_") + assetId) + "_") + owner) | |
55 | 30 | ||
56 | 31 | ||
57 | 32 | func getContractBalanceKey (assetId) = ((BalanceKey + "_") + assetId) | |
58 | 33 | ||
59 | 34 | ||
60 | 35 | func getExpireProposalKey (hash) = (("proposal_expire" + "_") + hash) | |
61 | 36 | ||
62 | 37 | ||
63 | 38 | func getOwnerProposalKey (hash) = (("proposal_owner" + "_") + hash) | |
64 | 39 | ||
65 | 40 | ||
66 | 41 | func getArgumentsProposalKey (hash) = (("proposal_arguments" + "_") + hash) | |
67 | 42 | ||
68 | 43 | ||
69 | 44 | func getVoteKey (owner,hash) = (((("proposal_vote" + "_") + owner) + "_") + hash) | |
70 | 45 | ||
71 | 46 | ||
72 | 47 | func convertJsonArrayToList (jsonArray) = split(jsonArray, ",") | |
73 | 48 | ||
74 | 49 | ||
75 | 50 | let neutrinoContract = addressFromStringValue(getStringByKey(NeutrinoContractKey)) | |
76 | 51 | ||
77 | 52 | let controlContract = addressFromStringValue(getStringByAddressAndKey(neutrinoContract, ControlContractKey)) | |
78 | 53 | ||
79 | 54 | let neutrinoAssetId = fromBase58String(getStringByAddressAndKey(neutrinoContract, NeutrinoAssetIdKey)) | |
80 | 55 | ||
81 | 56 | func getContractBalance (assetId) = getNumberByKey(getContractBalanceKey(assetId)) | |
82 | 57 | ||
83 | 58 | ||
84 | 59 | func getUserBalance (owner,assetId) = getNumberByKey(getUserBalanceKey(owner, assetId)) | |
85 | 60 | ||
86 | 61 | ||
87 | 62 | func getExpireProposal (hash) = getNumberByKey(getExpireProposalKey(hash)) | |
88 | 63 | ||
89 | 64 | ||
90 | 65 | func getOwnerProposal (hash) = getStringByKey(getOwnerProposalKey(hash)) | |
91 | 66 | ||
92 | 67 | ||
93 | 68 | func getArgumentsProposal (hash) = getStringByKey(getArgumentsProposalKey(hash)) | |
94 | 69 | ||
95 | 70 | ||
96 | 71 | func getVote (owner,hash) = getStringByKey(getVoteKey(owner, hash)) | |
97 | 72 | ||
98 | 73 | ||
99 | 74 | func getRewardsConfigKey (owner,share,receiver) = ((((("stakingconfig_" + owner) + "_") + toString(share)) + "_") + receiver) | |
100 | 75 | ||
101 | 76 | ||
102 | 77 | func getCurrentRewardsConfigKey (owner) = ("stakingconfig_current_" + owner) | |
103 | 78 | ||
104 | 79 | ||
105 | 80 | func getRewardsConfigStartKey (configKey,isStart) = (configKey + (if (isStart) | |
106 | 81 | then "_start" | |
107 | 82 | else "_end")) | |
108 | 83 | ||
109 | 84 | ||
110 | 85 | func getRewardConfigInitialShare (owner) = (owner + "_initialShare") | |
111 | 86 | ||
112 | 87 | ||
113 | 88 | func internallockNeutrino (i,receiver,share) = { | |
114 | - | let pmt = | |
89 | + | let pmt = value(i.payments[0]) | |
115 | 90 | if (!(isDefined(addressFromString(receiver)))) | |
116 | 91 | then throw(("Invalid address format " + receiver)) | |
117 | 92 | else if ((pmt.assetId != neutrinoAssetId)) | |
118 | 93 | then throw("can use usd only") | |
119 | 94 | else if ((share > 100)) | |
120 | 95 | then throw("staking rewards share cannot be higher than 100%") | |
121 | 96 | else if ((1 > share)) | |
122 | 97 | then throw("staking rewards share cannot be lower than 1%") | |
123 | 98 | else { | |
124 | 99 | let account = toString(i.caller) | |
125 | 100 | let assetIdString = toBase58String(value(pmt.assetId)) | |
126 | 101 | let currentConfig = getStringByKey(getCurrentRewardsConfigKey(account)) | |
127 | 102 | let correctData = if ((currentConfig != "")) | |
128 | 103 | then { | |
129 | 104 | let currentConfigData = split(currentConfig, "_") | |
130 | 105 | let currShare = parseIntValue(currentConfigData[2]) | |
131 | 106 | let currReceiver = currentConfigData[3] | |
132 | 107 | let notMigratedInitialShare = getNumberByKey(getRewardConfigInitialShare(account)) | |
133 | 108 | let actualInitialShare = if ((notMigratedInitialShare == 0)) | |
134 | 109 | then currShare | |
135 | 110 | else notMigratedInitialShare | |
136 | 111 | let newShare = if (if ((actualInitialShare > share)) | |
137 | 112 | then true | |
138 | 113 | else (currReceiver != receiver)) | |
139 | 114 | then actualInitialShare | |
140 | 115 | else share | |
141 | 116 | [toString(actualInitialShare), toString(newShare), currReceiver] | |
142 | 117 | } | |
143 | 118 | else [toString(share), toString(share), receiver] | |
144 | 119 | let correctInitialShare = parseIntValue(correctData[0]) | |
145 | 120 | let correctShare = parseIntValue(correctData[1]) | |
146 | 121 | let correctReceiver = correctData[2] | |
147 | 122 | let newCurrentConfig = getRewardsConfigKey(account, correctShare, correctReceiver) | |
148 | 123 | let isNewConfig = !((currentConfig == newCurrentConfig)) | |
149 | 124 | let end = if (isNewConfig) | |
150 | 125 | then height | |
151 | 126 | else 0 | |
152 | 127 | let start = if (isNewConfig) | |
153 | 128 | then height | |
154 | 129 | else getNumberByKey(getRewardsConfigStartKey(newCurrentConfig, true)) | |
155 | - | ||
130 | + | [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)] | |
156 | 131 | } | |
157 | 132 | } | |
158 | 133 | ||
159 | 134 | ||
160 | 135 | @Callable(i) | |
161 | 136 | func lockNeutrinoSP (receiver,share) = internallockNeutrino(i, receiver, share) | |
162 | 137 | ||
163 | 138 | ||
164 | 139 | ||
165 | 140 | @Callable(i) | |
166 | 141 | func lockNeutrino () = internallockNeutrino(i, toString(i.caller), 100) | |
167 | 142 | ||
168 | 143 | ||
169 | 144 | ||
170 | 145 | @Callable(i) | |
171 | 146 | func unlockNeutrino (unlockAmount,assetIdString) = { | |
172 | 147 | let account = toString(i.caller) | |
173 | 148 | let assetId = fromBase58String(assetIdString) | |
174 | 149 | let balance = (getUserBalance(account, assetIdString) - unlockAmount) | |
175 | 150 | if ((0 > balance)) | |
176 | 151 | then throw("invalid amount") | |
177 | 152 | else if ((assetId != neutrinoAssetId)) | |
178 | 153 | then throw("can use neutrino") | |
179 | - | else | |
154 | + | else [IntegerEntry(getContractBalanceKey(assetIdString), (getContractBalance(assetIdString) - unlockAmount)), IntegerEntry(getUserBalanceKey(account, assetIdString), balance), ScriptTransfer(addressFromStringValue(account), unlockAmount, neutrinoAssetId)] | |
180 | 155 | } | |
181 | 156 | ||
182 | 157 | ||
183 | 158 | ||
184 | 159 | @Callable(i) | |
185 | 160 | func vote (hash,indexArgument) = { | |
186 | 161 | let arguments = split(getArgumentsProposal(hash), ",") | |
187 | 162 | let argument = arguments[indexArgument] | |
188 | 163 | if ((height > getExpireProposal(hash))) | |
189 | 164 | then throw("proposal is expired") | |
190 | - | else | |
165 | + | else [StringEntry(getVoteKey(toString(i.caller), hash), argument)] | |
191 | 166 | } | |
192 | 167 | ||
193 | 168 | ||
194 | 169 | ||
195 | 170 | @Callable(i) | |
196 | 171 | func createProposal (arguments,expairHeight) = { | |
197 | 172 | let hash = toBase58String(keccak256(((toBytes(arguments) + toBytes(expairHeight)) + i.callerPublicKey))) | |
198 | 173 | if ((getOwnerProposal(hash) != "")) | |
199 | 174 | then throw("proposal is exist") | |
200 | - | else | |
175 | + | else [IntegerEntry(getExpireProposalKey(hash), expairHeight), StringEntry(getOwnerProposalKey(hash), toString(i.caller)), StringEntry(getArgumentsProposalKey(hash), arguments)] | |
201 | 176 | } | |
202 | 177 | ||
203 | 178 | ||
204 | 179 | @Verifier(tx) | |
205 | 180 | func verify () = { | |
206 | 181 | let pubKeyAdminsList = ["BLEoguzPVKVTfXxxT3W7Rqf8aUm2ggC9Vemd2MQawM2G", "FWVffYr2ALmHMejZm3WqeLz6Sdym3gLFGtJn4KTwyU5x", "3Wh2LaWcb5gg7K2pPcW3Ep6EAuRBzYkAgrdpt43jTDFa", "5WRXFSjwcTbNfKcJs8ZqXmSSWYsSVJUtMvMqZj5hH4Nc"] | |
207 | 182 | let count = ((((if (sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(pubKeyAdminsList[0]))) | |
208 | 183 | then 1 | |
209 | 184 | else 0) + (if (sigVerify(tx.bodyBytes, tx.proofs[1], fromBase58String(pubKeyAdminsList[1]))) | |
210 | 185 | then 1 | |
211 | 186 | else 0)) + (if (sigVerify(tx.bodyBytes, tx.proofs[2], fromBase58String(pubKeyAdminsList[2]))) | |
212 | 187 | then 1 | |
213 | 188 | else 0)) + (if (sigVerify(tx.bodyBytes, tx.proofs[3], fromBase58String(pubKeyAdminsList[3]))) | |
214 | 189 | then 2 | |
215 | 190 | else 0)) | |
216 | 191 | (count >= 3) | |
217 | 192 | } | |
218 | 193 |
github/deemru/w8io/786bc32 67.35 ms ◑