tx · 58zjRREcNt9CTGG6p5JLrq8AniaXRtnFGsfWyVtAt6Gz 3N6q7sCGSSLBUXDdjBdYGTJbZGZfhhh8cNg: -0.01000000 Waves 2021.04.02 16:02 [1464857] smart account 3N6q7sCGSSLBUXDdjBdYGTJbZGZfhhh8cNg > SELF 0.00000000 Waves
{ "type": 13, "id": "58zjRREcNt9CTGG6p5JLrq8AniaXRtnFGsfWyVtAt6Gz", "fee": 1000000, "feeAssetId": null, "timestamp": 1617368606717, "version": 2, "chainId": 84, "sender": "3N6q7sCGSSLBUXDdjBdYGTJbZGZfhhh8cNg", "senderPublicKey": "6RxCbWeRD4VWkRJtcAR8HBRkrBbEzZWucSBL6YrSFQrE", "proofs": [ "3nYVDTgZ5PMYMLFMK22wEFEpTRjBUKj28AL11sEU1hurCtQCEPVXHRfNRshjN9k996yufNb9qVaHeTXLXz8YtQyK" ], "script": "base64:AAIEAAAAAAAAAAIIAgAAABMAAAAAD25ldXRyaW5vQXNzZXRJZAEAAAAgbySjyqsw3FIpmOgsYVruWn8jTcItdbvpnapU4NLQB8EAAAAAC25zYnRBc3NldElkAQAAACAfMcqomheEmok3YjT1FeDjokifQYVi6vQeAO1aIhqpJAAAAAATTmV1dHJpbm9Db250cmFjdEtleQEAAAAaAVS5ic3PR3G6l3LsuEUPM7CqSYXRDXgyAm0AAAAACFVTRE5UWVBFAgAAAARVU0ROAAAAAAhOU0JUVFlQRQIAAAAETlNCVAAAAAAKQmFsYW5jZUtleQIAAAALcnBkX2JhbGFuY2UBAAAAEWdldFVzZXJCYWxhbmNlS2V5AAAAAgAAAAVvd25lcgAAAAdhc3NldElkCQAEuQAAAAIJAARMAAAAAgUAAAAKQmFsYW5jZUtleQkABEwAAAACBQAAAAdhc3NldElkCQAETAAAAAIFAAAABW93bmVyBQAAAANuaWwCAAAAAV8BAAAADmdldFN0cmluZ0J5S2V5AAAAAQAAAANrZXkJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQdAAAAAgUAAAAEdGhpcwUAAAADa2V5AgAAAAABAAAADmdldE51bWJlckJ5S2V5AAAAAQAAAANrZXkJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwUAAAADa2V5AAAAAAAAAAAAAQAAABtnZXRSZXdhcmRDb25maWdJbml0aWFsU2hhcmUAAAABAAAABW93bmVyCQABLAAAAAIFAAAABW93bmVyAgAAAA1faW5pdGlhbFNoYXJlAQAAABNnZXRSZXdhcmRzQ29uZmlnS2V5AAAAAwAAAAVvd25lcgAAAAVzaGFyZQAAAAhyZWNlaXZlcgkABLkAAAACCQAETAAAAAICAAAADXN0YWtpbmdjb25maWcJAARMAAAAAgUAAAAFb3duZXIJAARMAAAAAgkAAaQAAAABBQAAAAVzaGFyZQkABEwAAAACBQAAAAhyZWNlaXZlcgUAAAADbmlsAgAAAAFfAQAAAA5nZXRVc2VyQmFsYW5jZQAAAAIAAAAFb3duZXIAAAAHYXNzZXRJZAkBAAAADmdldE51bWJlckJ5S2V5AAAAAQkBAAAAEWdldFVzZXJCYWxhbmNlS2V5AAAAAgUAAAAFb3duZXIFAAAAB2Fzc2V0SWQBAAAAGmdldFZhbGlkU3Rha2luZ0Fzc2V0T3JGYWlsAAAAAgAAAAtzdGFraW5nVHlwZQAAAAdhc3NldElkAwMJAAAAAAAAAgUAAAALc3Rha2luZ1R5cGUFAAAACFVTRE5UWVBFCQEAAAACIT0AAAACBQAAAAdhc3NldElkBQAAAA9uZXV0cmlub0Fzc2V0SWQHCQAAAgAAAAECAAAAEWNhbiB1c2UgVVNETiBvbmx5AwMJAAAAAAAAAgUAAAALc3Rha2luZ1R5cGUFAAAACE5TQlRUWVBFCQEAAAACIT0AAAACBQAAAAdhc3NldElkBQAAAAtuc2J0QXNzZXRJZAcJAAACAAAAAQIAAAARY2FuIHVzZSBOU0JUIG9ubHkDAwkBAAAAAiE9AAAAAgUAAAALc3Rha2luZ1R5cGUFAAAACFVTRE5UWVBFCQEAAAACIT0AAAACBQAAAAtzdGFraW5nVHlwZQUAAAAITlNCVFRZUEUHCQAAAgAAAAEJAAEsAAAAAgIAAAAZdW5zdXBwb3J0ZWQgc3Rha2luZyB0eXBlIAUAAAALc3Rha2luZ1R5cGUFAAAAB2Fzc2V0SWQBAAAAGmdldEN1cnJlbnRSZXdhcmRzQ29uZmlnS2V5AAAAAQAAAAVvd25lcgkAASwAAAACAgAAABZzdGFraW5nY29uZmlnX2N1cnJlbnRfBQAAAAVvd25lcgEAAAAYZ2V0UmV3YXJkc0NvbmZpZ1N0YXJ0S2V5AAAAAgAAAAljb25maWdLZXkAAAAHaXNTdGFydAkAASwAAAACBQAAAAljb25maWdLZXkDBQAAAAdpc1N0YXJ0AgAAAAZfc3RhcnQCAAAABF9lbmQBAAAAFWdldENvbnRyYWN0QmFsYW5jZUtleQAAAAEAAAAHYXNzZXRJZAkAASwAAAACCQABLAAAAAIFAAAACkJhbGFuY2VLZXkCAAAAAV8FAAAAB2Fzc2V0SWQBAAAAEmdldENvbnRyYWN0QmFsYW5jZQAAAAEAAAAHYXNzZXRJZAkBAAAADmdldE51bWJlckJ5S2V5AAAAAQkBAAAAFWdldENvbnRyYWN0QmFsYW5jZUtleQAAAAEFAAAAB2Fzc2V0SWQBAAAADmludGVybmFsVW5sb2NrAAAABAAAAAtzdGFraW5nVHlwZQAAAAFpAAAADHVubG9ja0Ftb3VudAAAAAxhc3NldElkUGFyYW0EAAAAB2FjY291bnQJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyBAAAAAdhc3NldElkCQEAAAAaZ2V0VmFsaWRTdGFraW5nQXNzZXRPckZhaWwAAAACBQAAAAtzdGFraW5nVHlwZQkAAlkAAAABBQAAAAxhc3NldElkUGFyYW0EAAAADWFzc2V0SWRTdHJpbmcJAAJYAAAAAQUAAAAHYXNzZXRJZAQAAAAHYmFsYW5jZQkAAGUAAAACCQEAAAAOZ2V0VXNlckJhbGFuY2UAAAACBQAAAAdhY2NvdW50BQAAAA1hc3NldElkU3RyaW5nBQAAAAx1bmxvY2tBbW91bnQDCQAAZgAAAAIAAAAAAAAAAAAFAAAAB2JhbGFuY2UJAAACAAAAAQIAAAAOaW52YWxpZCBhbW91bnQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABVnZXRDb250cmFjdEJhbGFuY2VLZXkAAAABBQAAAA1hc3NldElkU3RyaW5nCQAAZQAAAAIJAQAAABJnZXRDb250cmFjdEJhbGFuY2UAAAABBQAAAA1hc3NldElkU3RyaW5nBQAAAAx1bmxvY2tBbW91bnQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABFnZXRVc2VyQmFsYW5jZUtleQAAAAIFAAAAB2FjY291bnQFAAAADWFzc2V0SWRTdHJpbmcFAAAAB2JhbGFuY2UJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQUAAAAHYWNjb3VudAUAAAAMdW5sb2NrQW1vdW50BQAAAAdhc3NldElkBQAAAANuaWwBAAAAFGludGVybmFsTG9ja05ldXRyaW5vAAAABAAAAAtzdGFraW5nVHlwZQAAAAFpAAAACHJlY2VpdmVyAAAABXNoYXJlBAAAAANwbXQJAQAAAAV2YWx1ZQAAAAEJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAEAAAAB2Fzc2V0SWQJAQAAABpnZXRWYWxpZFN0YWtpbmdBc3NldE9yRmFpbAAAAAIFAAAAC3N0YWtpbmdUeXBlCQEAAAAFdmFsdWUAAAABCAUAAAADcG10AAAAB2Fzc2V0SWQDCQEAAAABIQAAAAEJAQAAAAlpc0RlZmluZWQAAAABCQAEJgAAAAEFAAAACHJlY2VpdmVyCQAAAgAAAAEJAAEsAAAAAgIAAAAXSW52YWxpZCBhZGRyZXNzIGZvcm1hdCAFAAAACHJlY2VpdmVyAwkAAGYAAAACBQAAAAVzaGFyZQAAAAAAAAAAZAkAAAIAAAABAgAAADBzdGFraW5nIHJld2FyZHMgc2hhcmUgY2Fubm90IGJlIGhpZ2hlciB0aGFuIDEwMCUDCQAAZgAAAAIAAAAAAAAAAAEFAAAABXNoYXJlCQAAAgAAAAECAAAALXN0YWtpbmcgcmV3YXJkcyBzaGFyZSBjYW5ub3QgYmUgbG93ZXIgdGhhbiAxJQQAAAAHYWNjb3VudAkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIEAAAADWFzc2V0SWRTdHJpbmcJAAJYAAAAAQUAAAAHYXNzZXRJZAQAAAANY3VycmVudENvbmZpZwkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQkBAAAAGmdldEN1cnJlbnRSZXdhcmRzQ29uZmlnS2V5AAAAAQUAAAAHYWNjb3VudAQAAAALY29ycmVjdERhdGEDCQEAAAACIT0AAAACBQAAAA1jdXJyZW50Q29uZmlnAgAAAAAEAAAAEWN1cnJlbnRDb25maWdEYXRhCQAEtQAAAAIFAAAADWN1cnJlbnRDb25maWcCAAAAAV8EAAAACWN1cnJTaGFyZQkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAEWN1cnJlbnRDb25maWdEYXRhAAAAAAAAAAACBAAAAAxjdXJyUmVjZWl2ZXIJAAGRAAAAAgUAAAARY3VycmVudENvbmZpZ0RhdGEAAAAAAAAAAAMEAAAAF25vdE1pZ3JhdGVkSW5pdGlhbFNoYXJlCQEAAAAOZ2V0TnVtYmVyQnlLZXkAAAABCQEAAAAbZ2V0UmV3YXJkQ29uZmlnSW5pdGlhbFNoYXJlAAAAAQUAAAAHYWNjb3VudAQAAAASYWN0dWFsSW5pdGlhbFNoYXJlAwkAAAAAAAACBQAAABdub3RNaWdyYXRlZEluaXRpYWxTaGFyZQAAAAAAAAAAAAUAAAAJY3VyclNoYXJlBQAAABdub3RNaWdyYXRlZEluaXRpYWxTaGFyZQQAAAAIbmV3U2hhcmUDAwkAAGYAAAACBQAAABJhY3R1YWxJbml0aWFsU2hhcmUFAAAABXNoYXJlBgkBAAAAAiE9AAAAAgUAAAAMY3VyclJlY2VpdmVyBQAAAAhyZWNlaXZlcgUAAAASYWN0dWFsSW5pdGlhbFNoYXJlBQAAAAVzaGFyZQkABEwAAAACCQABpAAAAAEFAAAAEmFjdHVhbEluaXRpYWxTaGFyZQkABEwAAAACCQABpAAAAAEFAAAACG5ld1NoYXJlCQAETAAAAAIFAAAADGN1cnJSZWNlaXZlcgUAAAADbmlsCQAETAAAAAIJAAGkAAAAAQUAAAAFc2hhcmUJAARMAAAAAgkAAaQAAAABBQAAAAVzaGFyZQkABEwAAAACBQAAAAhyZWNlaXZlcgUAAAADbmlsBAAAABNjb3JyZWN0SW5pdGlhbFNoYXJlCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAALY29ycmVjdERhdGEAAAAAAAAAAAAEAAAADGNvcnJlY3RTaGFyZQkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAC2NvcnJlY3REYXRhAAAAAAAAAAABBAAAAA9jb3JyZWN0UmVjZWl2ZXIJAAGRAAAAAgUAAAALY29ycmVjdERhdGEAAAAAAAAAAAIEAAAAEG5ld0N1cnJlbnRDb25maWcJAQAAABNnZXRSZXdhcmRzQ29uZmlnS2V5AAAAAwUAAAAHYWNjb3VudAUAAAAMY29ycmVjdFNoYXJlBQAAAA9jb3JyZWN0UmVjZWl2ZXIEAAAAC2lzTmV3Q29uZmlnCQEAAAABIQAAAAEJAAAAAAAAAgUAAAANY3VycmVudENvbmZpZwUAAAAQbmV3Q3VycmVudENvbmZpZwQAAAADZW5kAwUAAAALaXNOZXdDb25maWcFAAAABmhlaWdodAAAAAAAAAAAAAQAAAAFc3RhcnQDBQAAAAtpc05ld0NvbmZpZwUAAAAGaGVpZ2h0CQEAAAAOZ2V0TnVtYmVyQnlLZXkAAAABCQEAAAAYZ2V0UmV3YXJkc0NvbmZpZ1N0YXJ0S2V5AAAAAgUAAAAQbmV3Q3VycmVudENvbmZpZwYJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABVnZXRDb250cmFjdEJhbGFuY2VLZXkAAAABBQAAAA1hc3NldElkU3RyaW5nCQAAZAAAAAIJAQAAABJnZXRDb250cmFjdEJhbGFuY2UAAAABBQAAAA1hc3NldElkU3RyaW5nCAUAAAADcG10AAAABmFtb3VudAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAEWdldFVzZXJCYWxhbmNlS2V5AAAAAgUAAAAHYWNjb3VudAUAAAANYXNzZXRJZFN0cmluZwkAAGQAAAACCQEAAAAOZ2V0VXNlckJhbGFuY2UAAAACBQAAAAdhY2NvdW50BQAAAA1hc3NldElkU3RyaW5nCAUAAAADcG10AAAABmFtb3VudAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAGGdldFJld2FyZHNDb25maWdTdGFydEtleQAAAAIFAAAADWN1cnJlbnRDb25maWcHBQAAAANlbmQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABhnZXRSZXdhcmRzQ29uZmlnU3RhcnRLZXkAAAACBQAAABBuZXdDdXJyZW50Q29uZmlnBgUAAAAFc3RhcnQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABtnZXRSZXdhcmRDb25maWdJbml0aWFsU2hhcmUAAAABBQAAAAdhY2NvdW50BQAAABNjb3JyZWN0SW5pdGlhbFNoYXJlCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABpnZXRDdXJyZW50UmV3YXJkc0NvbmZpZ0tleQAAAAEFAAAAB2FjY291bnQFAAAAEG5ld0N1cnJlbnRDb25maWcFAAAAA25pbAAAAAAAAAAAZDiu4w==", "height": 1464857, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: none Next: 8NWqnMqxqwuYUBfiu5kUMQkCpvLrEHx3AtZehYq2Z4J5 Full:
Old | New | Differences | |
---|---|---|---|
1 | - | # no script | |
1 | + | {-# STDLIB_VERSION 4 #-} | |
2 | + | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | + | {-# CONTENT_TYPE DAPP #-} | |
4 | + | let neutrinoAssetId = base58'8UrfDVd5GreeUwm7uPk7eYz1eMv376kzR52C6sANPkwS' | |
5 | + | ||
6 | + | let nsbtAssetId = base58'36mg8NZTaFRDygiVwb8uBnLR51hetJruUCZcxhaVcHj9' | |
7 | + | ||
8 | + | let NeutrinoContractKey = base58'3N6q7sCGSSLBUXDdjBdYGTJbZGZfhhh8cNg' | |
9 | + | ||
10 | + | let USDNTYPE = "USDN" | |
11 | + | ||
12 | + | let NSBTTYPE = "NSBT" | |
13 | + | ||
14 | + | let BalanceKey = "rpd_balance" | |
15 | + | ||
16 | + | func getUserBalanceKey (owner,assetId) = makeString([BalanceKey, assetId, owner], "_") | |
17 | + | ||
18 | + | ||
19 | + | func getStringByKey (key) = valueOrElse(getString(this, key), "") | |
20 | + | ||
21 | + | ||
22 | + | func getNumberByKey (key) = valueOrElse(getInteger(this, key), 0) | |
23 | + | ||
24 | + | ||
25 | + | func getRewardConfigInitialShare (owner) = (owner + "_initialShare") | |
26 | + | ||
27 | + | ||
28 | + | func getRewardsConfigKey (owner,share,receiver) = makeString(["stakingconfig", owner, toString(share), receiver], "_") | |
29 | + | ||
30 | + | ||
31 | + | func getUserBalance (owner,assetId) = getNumberByKey(getUserBalanceKey(owner, assetId)) | |
32 | + | ||
33 | + | ||
34 | + | func getValidStakingAssetOrFail (stakingType,assetId) = if (if ((stakingType == USDNTYPE)) | |
35 | + | then (assetId != neutrinoAssetId) | |
36 | + | else false) | |
37 | + | then throw("can use USDN only") | |
38 | + | else if (if ((stakingType == NSBTTYPE)) | |
39 | + | then (assetId != nsbtAssetId) | |
40 | + | else false) | |
41 | + | then throw("can use NSBT only") | |
42 | + | else if (if ((stakingType != USDNTYPE)) | |
43 | + | then (stakingType != NSBTTYPE) | |
44 | + | else false) | |
45 | + | then throw(("unsupported staking type " + stakingType)) | |
46 | + | else assetId | |
47 | + | ||
48 | + | ||
49 | + | func getCurrentRewardsConfigKey (owner) = ("stakingconfig_current_" + owner) | |
50 | + | ||
51 | + | ||
52 | + | func getRewardsConfigStartKey (configKey,isStart) = (configKey + (if (isStart) | |
53 | + | then "_start" | |
54 | + | else "_end")) | |
55 | + | ||
56 | + | ||
57 | + | func getContractBalanceKey (assetId) = ((BalanceKey + "_") + assetId) | |
58 | + | ||
59 | + | ||
60 | + | func getContractBalance (assetId) = getNumberByKey(getContractBalanceKey(assetId)) | |
61 | + | ||
62 | + | ||
63 | + | func internalUnlock (stakingType,i,unlockAmount,assetIdParam) = { | |
64 | + | let account = toString(i.caller) | |
65 | + | let assetId = getValidStakingAssetOrFail(stakingType, fromBase58String(assetIdParam)) | |
66 | + | let assetIdString = toBase58String(assetId) | |
67 | + | let balance = (getUserBalance(account, assetIdString) - unlockAmount) | |
68 | + | if ((0 > balance)) | |
69 | + | then throw("invalid amount") | |
70 | + | else [IntegerEntry(getContractBalanceKey(assetIdString), (getContractBalance(assetIdString) - unlockAmount)), IntegerEntry(getUserBalanceKey(account, assetIdString), balance), ScriptTransfer(addressFromStringValue(account), unlockAmount, assetId)] | |
71 | + | } | |
72 | + | ||
73 | + | ||
74 | + | func internalLockNeutrino (stakingType,i,receiver,share) = { | |
75 | + | let pmt = value(i.payments[0]) | |
76 | + | let assetId = getValidStakingAssetOrFail(stakingType, value(pmt.assetId)) | |
77 | + | if (!(isDefined(addressFromString(receiver)))) | |
78 | + | then throw(("Invalid address format " + receiver)) | |
79 | + | else if ((share > 100)) | |
80 | + | then throw("staking rewards share cannot be higher than 100%") | |
81 | + | else if ((1 > share)) | |
82 | + | then throw("staking rewards share cannot be lower than 1%") | |
83 | + | else { | |
84 | + | let account = toString(i.caller) | |
85 | + | let assetIdString = toBase58String(assetId) | |
86 | + | let currentConfig = getStringByKey(getCurrentRewardsConfigKey(account)) | |
87 | + | let correctData = if ((currentConfig != "")) | |
88 | + | then { | |
89 | + | let currentConfigData = split(currentConfig, "_") | |
90 | + | let currShare = parseIntValue(currentConfigData[2]) | |
91 | + | let currReceiver = currentConfigData[3] | |
92 | + | let notMigratedInitialShare = getNumberByKey(getRewardConfigInitialShare(account)) | |
93 | + | let actualInitialShare = if ((notMigratedInitialShare == 0)) | |
94 | + | then currShare | |
95 | + | else notMigratedInitialShare | |
96 | + | let newShare = if (if ((actualInitialShare > share)) | |
97 | + | then true | |
98 | + | else (currReceiver != receiver)) | |
99 | + | then actualInitialShare | |
100 | + | else share | |
101 | + | [toString(actualInitialShare), toString(newShare), currReceiver] | |
102 | + | } | |
103 | + | else [toString(share), toString(share), receiver] | |
104 | + | let correctInitialShare = parseIntValue(correctData[0]) | |
105 | + | let correctShare = parseIntValue(correctData[1]) | |
106 | + | let correctReceiver = correctData[2] | |
107 | + | let newCurrentConfig = getRewardsConfigKey(account, correctShare, correctReceiver) | |
108 | + | let isNewConfig = !((currentConfig == newCurrentConfig)) | |
109 | + | let end = if (isNewConfig) | |
110 | + | then height | |
111 | + | else 0 | |
112 | + | let start = if (isNewConfig) | |
113 | + | then height | |
114 | + | else getNumberByKey(getRewardsConfigStartKey(newCurrentConfig, true)) | |
115 | + | [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)] | |
116 | + | } | |
117 | + | } | |
118 | + | ||
119 | + | ||
120 | + |
github/deemru/w8io/026f985 18.07 ms ◑