tx · 2xGeHG3MYXDTeAgborR4LnPtXsBD82oHNPPFxEuGjtAp 3PF8ihzUXp9QqvtcnpSveENQHqLDYGvbRvZ: -0.01000000 Waves 2023.03.10 20:11 [3549767] smart account 3PF8ihzUXp9QqvtcnpSveENQHqLDYGvbRvZ > SELF 0.00000000 Waves
{ "type": 13, "id": "2xGeHG3MYXDTeAgborR4LnPtXsBD82oHNPPFxEuGjtAp", "fee": 1000000, "feeAssetId": null, "timestamp": 1678468290353, "version": 2, "chainId": 87, "sender": "3PF8ihzUXp9QqvtcnpSveENQHqLDYGvbRvZ", "senderPublicKey": "9kcEZHonGr2aoSBCDgKiB7nf7C6dYThx4YnvpDKNSD77", "proofs": [ "2y6Cmi6RU9yfoRxNJozH3FkWyTVfAhFmTzJZaYapJrpDRtWDgQbYKcvW3kykvv7aEtn7m9Y8o6XeYzoVkz6tLsuo", "2C5SWwNmC9nqMPBppDNwXs4L12X7EKxHV8b1aKv3iV3Sde4iJn6N62zVENPG8wJywxczmH4rzeL5K6wYNFstDANw" ], "script": "base64:AAIFAAAAAAAAABUIAhIECgIBCBILCgkRGBgYAQEYAQgAAAANAQAAABBnZXRTdHJpbmdPclRocm93AAAAAgAAAAdhZGRyZXNzAAAAA2tleQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAAB2FkZHJlc3MFAAAAA2tleQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAMQ2FuJ3QgcmVhZCAnBQAAAANrZXkCAAAADScgYXQgYWRkcmVzcyAJAAQlAAAAAQUAAAAHYWRkcmVzcwEAAAATcGFyc2VBZGRyZXNzT3JUaHJvdwAAAAEAAAAMbWF5YmVBZGRyZXNzCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQmAAAAAQUAAAAMbWF5YmVBZGRyZXNzCQABLAAAAAIJAAEsAAAAAgIAAAAaQ2FuJ3QgcGFyc2UgYWRkcmVzcyBmcm9tICcFAAAADG1heWJlQWRkcmVzcwIAAAABJwEAAAAYa2V5X2xhc3RGZWVTd2FwVGltZXN0YW1wAAAAAQAAAAdhc3NldElkCQABLAAAAAIJAAEsAAAAAgIAAAAERmVlXwUAAAAHYXNzZXRJZAIAAAASX2xhc3RTd2FwVGltZXN0YW1wAAAAAAxwcm94eUFkZHJlc3MJAQAAABNwYXJzZUFkZHJlc3NPclRocm93AAAAAQkBAAAAEGdldFN0cmluZ09yVGhyb3cAAAACBQAAAAR0aGlzAgAAAA1wcm94eS1hZGRyZXNzAQAAAApnZXRBc3NldElkAAAAAQAAAAVhc3NldAMJAAAAAAAAAgUAAAAFYXNzZXQCAAAABVdBVkVTBQAAAAR1bml0CAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAD7AAAAAEJAAJZAAAAAQUAAAAFYXNzZXQJAAEsAAAAAgIAAAARQ2FuJ3QgZmluZCBhc3NldCAFAAAABWFzc2V0AAAAAmlkAAAAABJmZWVQcmlvcml0eUFzc2V0SWQEAAAAByRtYXRjaDAJAAQdAAAAAgUAAAAEdGhpcwIAAAARRmVlX3ByaW9yaXR5QXNzZXQDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABlN0cmluZwQAAAAQcHJpb3JpdHlBc3NldFN0cgUAAAAHJG1hdGNoMAkAAlkAAAABBQAAABBwcmlvcml0eUFzc2V0U3RyCQAAAgAAAAECAAAAIFdBVkVTIGNhbm5vdCBiZSBhIHByaW9yaXR5IGFzc2V0AAAAABZmZWVQcmlvcml0eU1pblJlY2VpdmVkCQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMCAAAAF0ZlZV9wcmlvcml0eU1pblJlY2VpdmVkAAAAAAAAAAAAAAAAAApmZWVNYW5hZ2VyBAAAAAckbWF0Y2gwCQAEHQAAAAIFAAAABHRoaXMCAAAAFEZlZV9tYW5hZ2VyUHVibGljS2V5AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAZTdHJpbmcEAAAAD21heWJlRmVlTWFuYWdlcgUAAAAHJG1hdGNoMAkAAlkAAAABBQAAAA9tYXliZUZlZU1hbmFnZXIFAAAABHVuaXQAAAAACnR4RmVlTGltaXQJAAQaAAAAAgUAAAAEdGhpcwIAAAAORmVlX3R4RmVlTGltaXQAAAAAD2ZlZVN3YXBJbnRlcnZhbAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzAgAAABBGZWVfc3dhcEludGVydmFsAAAAAAAAAAAAAQAAABRnZXRQcmlvcml0eUFzc2V0SW5mbwAAAAAEAAAAByRtYXRjaDAJAAPsAAAAAQUAAAASZmVlUHJpb3JpdHlBc3NldElkAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAVBc3NldAQAAAAQZmVlUHJpb3JpdHlBc3NldAUAAAAHJG1hdGNoMAkABRYAAAAECQACWAAAAAEIBQAAABBmZWVQcmlvcml0eUFzc2V0AAAAAmlkCAUAAAAQZmVlUHJpb3JpdHlBc3NldAAAAARuYW1lCQAAbAAAAAYAAAAAAAAAAAoAAAAAAAAAAAAIBQAAABBmZWVQcmlvcml0eUFzc2V0AAAACGRlY2ltYWxzAAAAAAAAAAAAAAAAAAAAAAAABQAAAARET1dOBQAAABZmZWVQcmlvcml0eU1pblJlY2VpdmVkCQAAAgAAAAECAAAAFFVuZXhwZWN0ZWQgYmVoYXZpb3VyAQAAABdnZXRMYXN0RmVlU3dhcFRpbWVzdGFtcAAAAAEAAAAHYXNzZXRJZAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzCQEAAAAYa2V5X2xhc3RGZWVTd2FwVGltZXN0YW1wAAAAAQkAAlgAAAABBQAAAAdhc3NldElkAAAAAAAAAAAAAQAAABdzZXRMYXN0RmVlU3dhcFRpbWVzdGFtcAAAAAIAAAAHYXNzZXRJZAAAAAl0aW1lc3RhbXAJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABhrZXlfbGFzdEZlZVN3YXBUaW1lc3RhbXAAAAABCQACWAAAAAEFAAAAB2Fzc2V0SWQFAAAACXRpbWVzdGFtcAUAAAADbmlsAAAAAgAAAANpbnYBAAAAE2NsYWltUmVmZXJyZXJSZXdhcmQAAAACAAAABmFtb3VudAAAAAdhc3NldElkBAAAAAVhc3NldAkBAAAACmdldEFzc2V0SWQAAAABBQAAAAdhc3NldElkAwkBAAAAAiE9AAAAAgUAAAAMcHJveHlBZGRyZXNzCAUAAAADaW52AAAABmNhbGxlcgkAAAIAAAABAgAAACtvbmx5IHNlbGYgY2FsbHMgb3IgYnkgY29sbGVjdG9yIGFyZSBhbGxvd2VkAwkAAGcAAAACAAAAAAAAAAAABQAAAAZhbW91bnQJAAACAAAAAQIAAAAXSW5jb3JyZWN0IHJld2FyZCBhbW91bnQJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAAMcHJveHlBZGRyZXNzBQAAAAZhbW91bnQFAAAABWFzc2V0BQAAAANuaWwAAAADaW52AQAAAAxQUklWQVRFX3N3YXAAAAAJAAAACWFtb3VudHNJbgAAAAlhZGRyZXNzZXMAAAAPYXNzZXRzVG9SZWNlaXZlAAAAC2VzdFJlY2VpdmVkAAAAEXNsaXBwYWdlVG9sZXJhbmNlAAAAC21pblJlY2VpdmVkAAAAB29wdGlvbnMAAAAJcG10QW1vdW50AAAAC3BtdEFzc2V0U3RyBAAAAApwbXRBc3NldElkCQACWQAAAAEFAAAAC3BtdEFzc2V0U3RyBAAAAANwbXQDAwkAAAAAAAACBQAAAAtwbXRBc3NldFN0cgIAAAAFV0FWRVMGCQAAAAAAAAIFAAAACnBtdEFzc2V0SWQFAAAAEmZlZVByaW9yaXR5QXNzZXRJZAkAAAIAAAAB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", "height": 3549767, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: BcYFnD6sqhrjR6WKDdcJTuvbEvNZ8cCp6tUQVWLBgWcf Next: none Diff:
Old | New | Differences | |
---|---|---|---|
33 | 33 | unit | |
34 | 34 | } | |
35 | 35 | ||
36 | - | let | |
36 | + | let txFeeLimit = getInteger(this, "Fee_txFeeLimit") | |
37 | 37 | ||
38 | - | let feeAssetSwapInterval = valueOrElse(getInteger(this, "Fee_assetSwapInterval"), 0) | |
38 | + | let feeSwapInterval = valueOrElse(getInteger(this, "Fee_swapInterval"), 0) | |
39 | + | ||
40 | + | func getPriorityAssetInfo () = match assetInfo(feePriorityAssetId) { | |
41 | + | case feePriorityAsset: Asset => | |
42 | + | $Tuple4(toBase58String(feePriorityAsset.id), feePriorityAsset.name, pow(10, 0, feePriorityAsset.decimals, 0, 0, DOWN), feePriorityMinReceived) | |
43 | + | case _ => | |
44 | + | throw("Unexpected behaviour") | |
45 | + | } | |
46 | + | ||
39 | 47 | ||
40 | 48 | func getLastFeeSwapTimestamp (assetId) = valueOrElse(getInteger(this, key_lastFeeSwapTimestamp(toBase58String(assetId))), 0) | |
41 | 49 | ||
69 | 77 | then throw("Only self calls are allowed") | |
70 | 78 | else if (isDefined(inv.feeAssetId)) | |
71 | 79 | then throw("Only WAVES allowed for feeAssetId") | |
72 | - | else if (if (isDefined( | |
73 | - | then (inv.fee > value( | |
80 | + | else if (if (isDefined(txFeeLimit)) | |
81 | + | then (inv.fee > value(txFeeLimit)) | |
74 | 82 | else false) | |
75 | - | then throw((("Maximum fee (" + toString(value( | |
76 | - | else if (( | |
77 | - | then throw((("Swap is only possible once every " + toString(( | |
83 | + | then throw((("Maximum fee (" + toString(value(txFeeLimit))) + ") is exceeded")) | |
84 | + | else if ((feeSwapInterval > (lastBlock.timestamp - getLastFeeSwapTimestamp(pmtAssetId)))) | |
85 | + | then throw((("Swap is only possible once every " + toString((feeSwapInterval / 3600000))) + " hours")) | |
78 | 86 | else { | |
79 | 87 | let balanceBefore = assetBalance(this, feePriorityAssetId) | |
80 | 88 | if ((balanceBefore == balanceBefore)) |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 5 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | func getStringOrThrow (address,key) = valueOrErrorMessage(getString(address, key), ((("Can't read '" + key) + "' at address ") + toString(address))) | |
5 | 5 | ||
6 | 6 | ||
7 | 7 | func parseAddressOrThrow (maybeAddress) = valueOrErrorMessage(addressFromString(maybeAddress), (("Can't parse address from '" + maybeAddress) + "'")) | |
8 | 8 | ||
9 | 9 | ||
10 | 10 | func key_lastFeeSwapTimestamp (assetId) = (("Fee_" + assetId) + "_lastSwapTimestamp") | |
11 | 11 | ||
12 | 12 | ||
13 | 13 | let proxyAddress = parseAddressOrThrow(getStringOrThrow(this, "proxy-address")) | |
14 | 14 | ||
15 | 15 | func getAssetId (asset) = if ((asset == "WAVES")) | |
16 | 16 | then unit | |
17 | 17 | else valueOrErrorMessage(assetInfo(fromBase58String(asset)), ("Can't find asset " + asset)).id | |
18 | 18 | ||
19 | 19 | ||
20 | 20 | let feePriorityAssetId = match getString(this, "Fee_priorityAsset") { | |
21 | 21 | case priorityAssetStr: String => | |
22 | 22 | fromBase58String(priorityAssetStr) | |
23 | 23 | case _ => | |
24 | 24 | throw("WAVES cannot be a priority asset") | |
25 | 25 | } | |
26 | 26 | ||
27 | 27 | let feePriorityMinReceived = valueOrElse(getInteger(this, "Fee_priorityMinReceived"), 0) | |
28 | 28 | ||
29 | 29 | let feeManager = match getString(this, "Fee_managerPublicKey") { | |
30 | 30 | case maybeFeeManager: String => | |
31 | 31 | fromBase58String(maybeFeeManager) | |
32 | 32 | case _ => | |
33 | 33 | unit | |
34 | 34 | } | |
35 | 35 | ||
36 | - | let | |
36 | + | let txFeeLimit = getInteger(this, "Fee_txFeeLimit") | |
37 | 37 | ||
38 | - | let feeAssetSwapInterval = valueOrElse(getInteger(this, "Fee_assetSwapInterval"), 0) | |
38 | + | let feeSwapInterval = valueOrElse(getInteger(this, "Fee_swapInterval"), 0) | |
39 | + | ||
40 | + | func getPriorityAssetInfo () = match assetInfo(feePriorityAssetId) { | |
41 | + | case feePriorityAsset: Asset => | |
42 | + | $Tuple4(toBase58String(feePriorityAsset.id), feePriorityAsset.name, pow(10, 0, feePriorityAsset.decimals, 0, 0, DOWN), feePriorityMinReceived) | |
43 | + | case _ => | |
44 | + | throw("Unexpected behaviour") | |
45 | + | } | |
46 | + | ||
39 | 47 | ||
40 | 48 | func getLastFeeSwapTimestamp (assetId) = valueOrElse(getInteger(this, key_lastFeeSwapTimestamp(toBase58String(assetId))), 0) | |
41 | 49 | ||
42 | 50 | ||
43 | 51 | func setLastFeeSwapTimestamp (assetId,timestamp) = [IntegerEntry(key_lastFeeSwapTimestamp(toBase58String(assetId)), timestamp)] | |
44 | 52 | ||
45 | 53 | ||
46 | 54 | @Callable(inv) | |
47 | 55 | func claimReferrerReward (amount,assetId) = { | |
48 | 56 | let asset = getAssetId(assetId) | |
49 | 57 | if ((proxyAddress != inv.caller)) | |
50 | 58 | then throw("only self calls or by collector are allowed") | |
51 | 59 | else if ((0 >= amount)) | |
52 | 60 | then throw("Incorrect reward amount") | |
53 | 61 | else [ScriptTransfer(proxyAddress, amount, asset)] | |
54 | 62 | } | |
55 | 63 | ||
56 | 64 | ||
57 | 65 | ||
58 | 66 | @Callable(inv) | |
59 | 67 | func PRIVATE_swap (amountsIn,addresses,assetsToReceive,estReceived,slippageTolerance,minReceived,options,pmtAmount,pmtAssetStr) = { | |
60 | 68 | let pmtAssetId = fromBase58String(pmtAssetStr) | |
61 | 69 | let pmt = if (if ((pmtAssetStr == "WAVES")) | |
62 | 70 | then true | |
63 | 71 | else (pmtAssetId == feePriorityAssetId)) | |
64 | 72 | then throw("Unable to swap WAVES or priority asset") | |
65 | 73 | else if ((0 >= pmtAmount)) | |
66 | 74 | then throw("Payment amount must be positive") | |
67 | 75 | else AttachedPayment(pmtAssetId, pmtAmount) | |
68 | 76 | if ((inv.caller != this)) | |
69 | 77 | then throw("Only self calls are allowed") | |
70 | 78 | else if (isDefined(inv.feeAssetId)) | |
71 | 79 | then throw("Only WAVES allowed for feeAssetId") | |
72 | - | else if (if (isDefined( | |
73 | - | then (inv.fee > value( | |
80 | + | else if (if (isDefined(txFeeLimit)) | |
81 | + | then (inv.fee > value(txFeeLimit)) | |
74 | 82 | else false) | |
75 | - | then throw((("Maximum fee (" + toString(value( | |
76 | - | else if (( | |
77 | - | then throw((("Swap is only possible once every " + toString(( | |
83 | + | then throw((("Maximum fee (" + toString(value(txFeeLimit))) + ") is exceeded")) | |
84 | + | else if ((feeSwapInterval > (lastBlock.timestamp - getLastFeeSwapTimestamp(pmtAssetId)))) | |
85 | + | then throw((("Swap is only possible once every " + toString((feeSwapInterval / 3600000))) + " hours")) | |
78 | 86 | else { | |
79 | 87 | let balanceBefore = assetBalance(this, feePriorityAssetId) | |
80 | 88 | if ((balanceBefore == balanceBefore)) | |
81 | 89 | then { | |
82 | 90 | let swap = invoke(proxyAddress, "swap", [amountsIn, addresses, assetsToReceive, estReceived, slippageTolerance, minReceived, options], [pmt]) | |
83 | 91 | if ((swap == swap)) | |
84 | 92 | then { | |
85 | 93 | let balanceAfter = assetBalance(this, feePriorityAssetId) | |
86 | 94 | if ((balanceAfter == balanceAfter)) | |
87 | 95 | then { | |
88 | 96 | let received = (balanceAfter - balanceBefore) | |
89 | 97 | if ((0 >= received)) | |
90 | 98 | then throw("Swap is only allowed to the priority asset") | |
91 | 99 | else if ((feePriorityMinReceived > received)) | |
92 | 100 | then throw(("Swap result is less than " + toString(feePriorityMinReceived))) | |
93 | 101 | else setLastFeeSwapTimestamp(pmtAssetId, lastBlock.timestamp) | |
94 | 102 | } | |
95 | 103 | else throw("Strict value is not equal to itself.") | |
96 | 104 | } | |
97 | 105 | else throw("Strict value is not equal to itself.") | |
98 | 106 | } | |
99 | 107 | else throw("Strict value is not equal to itself.") | |
100 | 108 | } | |
101 | 109 | } | |
102 | 110 | ||
103 | 111 | ||
104 | 112 | @Verifier(tx) | |
105 | 113 | func verify () = { | |
106 | 114 | let maybeOracle = addressFromString(valueOrElse(getString(this, "Oracle"), "")) | |
107 | 115 | let maybeAdminKeys = if (isDefined(maybeOracle)) | |
108 | 116 | then getString(value(maybeOracle), "AdminKeys") | |
109 | 117 | else unit | |
110 | 118 | let isFeeSwapInvoke = match tx { | |
111 | 119 | case tx: InvokeScriptTransaction => | |
112 | 120 | if ((tx.dApp == this)) | |
113 | 121 | then (tx.function == "PRIVATE_swap") | |
114 | 122 | else false | |
115 | 123 | case _ => | |
116 | 124 | false | |
117 | 125 | } | |
118 | 126 | if (if (isDefined(feeManager)) | |
119 | 127 | then isFeeSwapInvoke | |
120 | 128 | else false) | |
121 | 129 | then sigVerify(tx.bodyBytes, tx.proofs[0], value(feeManager)) | |
122 | 130 | else match maybeAdminKeys { | |
123 | 131 | case adminKeysStr: String => | |
124 | 132 | let adminKeys = { | |
125 | 133 | let stringKeys = split(adminKeysStr, ",") | |
126 | 134 | [fromBase58String(stringKeys[0]), fromBase58String(stringKeys[1]), fromBase58String(stringKeys[2])] | |
127 | 135 | } | |
128 | 136 | func verifyByAllKeys (proof) = if (sigVerify(tx.bodyBytes, proof, adminKeys[0])) | |
129 | 137 | then 1 | |
130 | 138 | else if (sigVerify(tx.bodyBytes, proof, adminKeys[1])) | |
131 | 139 | then 10 | |
132 | 140 | else if (sigVerify(tx.bodyBytes, proof, adminKeys[2])) | |
133 | 141 | then 100 | |
134 | 142 | else 0 | |
135 | 143 | ||
136 | 144 | containsElement([110, 101, 11], (verifyByAllKeys(tx.proofs[0]) + verifyByAllKeys(tx.proofs[1]))) | |
137 | 145 | case _ => | |
138 | 146 | sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) | |
139 | 147 | } | |
140 | 148 | } | |
141 | 149 |
github/deemru/w8io/3ef1775 35.05 ms ◑