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