tx · 2HvynjoJsnWHg732uTpZgkZVFdFZi8z3HaTFNC46XY8H 3PJKJ1ndephdRt8nStkn7MZDt7icRgrfRWj: -0.01000000 Waves 2023.07.19 10:47 [3738085] smart account 3PJKJ1ndephdRt8nStkn7MZDt7icRgrfRWj > SELF 0.00000000 Waves
{ "type": 13, "id": "2HvynjoJsnWHg732uTpZgkZVFdFZi8z3HaTFNC46XY8H", "fee": 1000000, "feeAssetId": null, "timestamp": 1689752908829, "version": 2, "chainId": 87, "sender": "3PJKJ1ndephdRt8nStkn7MZDt7icRgrfRWj", "senderPublicKey": "8MxitwDZ5QDTBqAnzuqTzrX9n8iYjmpi4K4ZK7Yc2geN", "proofs": [ "4e417NZqDZf2c2xvBiwtdnH8vwS8MvBXQBVJefKBi6nGfjh6CoYf9qNkF2kcc6MjbVC7TjWJ9Y3NUqs7k2DNquvj" ], "script": "base64:BgIZCAISAwoBCBIECgIIARIAEgMKAQgSAwoBCA4AB2tfZnVuZHMCB2tfZnVuZHMAFGtfY29vcmRpbmF0b3JBZGRyZXNzAhRrX2Nvb3JkaW5hdG9yQWRkcmVzcwARa19tYW5hZ2VyX2FkZHJlc3MCEWtfbWFuYWdlcl9hZGRyZXNzAA9rX2FkbWluX2FkZHJlc3MCD2tfYWRtaW5fYWRkcmVzcwANa19pbml0aWFsaXplZAINa19pbml0aWFsaXplZAEOdG9Db21wb3NpdGVLZXkCBF9rZXkIX2FkZHJlc3MJAKwCAgkArAICBQRfa2V5AgFfBQhfYWRkcmVzcwEJYmFsYW5jZU9mAQhfYXNzZXRJZAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEOdG9Db21wb3NpdGVLZXkCBQdrX2Z1bmRzBQhfYXNzZXRJZAAAAQtjb29yZGluYXRvcgAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzBRRrX2Nvb3JkaW5hdG9yQWRkcmVzcwIoQ29vcmRpbmF0b3Igbm90IHNldCBTaW1wbGUgQXNzZXQgTWFuYWdlcgEObWFuYWdlckFkZHJlc3MACQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIJAQtjb29yZGluYXRvcgAFEWtfbWFuYWdlcl9hZGRyZXNzAg9NYW5hZ2VyIG5vdCBzZXQCD01hbmFnZXIgbm90IHNldAELaW5pdGlhbGl6ZWQACQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFDWtfaW5pdGlhbGl6ZWQHAQxhZG1pbkFkZHJlc3MACQCmCAEJARFAZXh0ck5hdGl2ZSgxMDUzKQIJAQtjb29yZGluYXRvcgAFD2tfYWRtaW5fYWRkcmVzcwELaXNXaGl0ZWxpc3QBCF9hZGRyZXNzCQAAAgUIX2FkZHJlc3MJAKUIAQkBDm1hbmFnZXJBZGRyZXNzAAELdXBkYXRlRnVuZHMCCF9hc3NldElkBl92YWx1ZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDnRvQ29tcG9zaXRlS2V5AgUHa19mdW5kcwUIX2Fzc2V0SWQFBl92YWx1ZQUDbmlsAQpzdHJBc3NldElkAQZfYXNzZXQDCQEJaXNEZWZpbmVkAQUGX2Fzc2V0CQDYBAEJAQV2YWx1ZQEFBl9hc3NldAIFV0FWRVMFAWkBCmluaXRpYWxpemUBDF9jb29yZGluYXRvcgMDCQELaW5pdGlhbGl6ZWQABgkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIUVW5hYmxlIHRvIGluaXRpYWxpemUJAMwIAgkBC1N0cmluZ0VudHJ5AgUUa19jb29yZGluYXRvckFkZHJlc3MJAKUIAQkBEUBleHRyTmF0aXZlKDEwNjIpAQUMX2Nvb3JkaW5hdG9yCQDMCAIJAQxCb29sZWFuRW50cnkCBQ1rX2luaXRpYWxpemVkBgUDbmlsAWkBCHdpdGhkcmF3AghfYXNzZXRJZAdfYW1vdW50AwMDCQEBIQEJAQtpc1doaXRlbGlzdAEJAKUIAQgFAWkGY2FsbGVyBgkBASEBCQELaW5pdGlhbGl6ZWQABgkAZgIFB19hbW91bnQJAQliYWxhbmNlT2YBBQhfYXNzZXRJZAkAAgEJAKwCAgkArAICCQCsAgICL0ludmFsaWQgd2l0aGRyYXcgcGFyYW1zIChzaW1wbGUgYXNzZXQgbWFuYWdlcikgCQCkAwEFB19hbW91bnQCAyA+IAkApAMBCQEJYmFsYW5jZU9mAQUIX2Fzc2V0SWQEE2N1cnJlbnRBc3NldEJhbGFuY2UJAGUCCQEJYmFsYW5jZU9mAQUIX2Fzc2V0SWQFB19hbW91bnQJAM4IAgkBC3VwZGF0ZUZ1bmRzAgUIX2Fzc2V0SWQFE2N1cnJlbnRBc3NldEJhbGFuY2UJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQdfYW1vdW50AwkAAAIFCF9hc3NldElkAgVXQVZFUwUEdW5pdAkA2QQBBQhfYXNzZXRJZAUDbmlsAWkBB2RlcG9zaXQABAdfYW1vdW50CAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAQIX2Fzc2V0SWQJAQpzdHJBc3NldElkAQgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkAwMJAQEhAQkBC2luaXRpYWxpemVkAAYDCQEBIQEJAQtpc1doaXRlbGlzdAEJAKUIAQgFAWkGY2FsbGVyCQECIT0CCAUBaQZjYWxsZXIJAQxhZG1pbkFkZHJlc3MABwkAAgECLUludmFsaWQgZGVwb3NpdCBwYXJhbXMgKHNpbXBsZSBhc3NldCBtYW5hZ2VyKQQTY3VycmVudEFzc2V0QmFsYW5jZQkAZAIJAQliYWxhbmNlT2YBBQhfYXNzZXRJZAUHX2Ftb3VudAkBC3VwZGF0ZUZ1bmRzAgUIX2Fzc2V0SWQFE2N1cnJlbnRBc3NldEJhbGFuY2UBaQELY2xhaW1Qcm9maXQBCF9hc3NldElkAwMJAQEhAQkBC2luaXRpYWxpemVkAAYJAQIhPQIIBQFpBmNhbGxlcgkBDm1hbmFnZXJBZGRyZXNzAAkAAgECMUludmFsaWQgY2xhaW1Qcm9maXQgcGFyYW1zIChzaW1wbGUgYXNzZXQgbWFuYWdlcikJAJQKAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIAAAMJAAACBQhfYXNzZXRJZAIFV0FWRVMFBHVuaXQJANkEAQUIX2Fzc2V0SWQFA25pbAAAAWkBEHZpZXdfY2xhaW1Qcm9maXQBCF9hc3NldElkAwkBASEBCQELaW5pdGlhbGl6ZWQACQACAQI2SW52YWxpZCB2aWV3X2NsYWltUHJvZml0IHBhcmFtcyAoc2ltcGxlIGFzc2V0IG1hbmFnZXIpBAZwcm9maXQAAAkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkApAMBCQEJYmFsYW5jZU9mAQUIX2Fzc2V0SWQCASwJAKQDAQkBCWJhbGFuY2VPZgEFCF9hc3NldElkAgEsCQCkAwEFBnByb2ZpdAECdHgBBnZlcmlmeQAEDmNvb3JkaW5hdG9yU3RyCQCdCAIFBHRoaXMFFGtfY29vcmRpbmF0b3JBZGRyZXNzAwkBCWlzRGVmaW5lZAEFDmNvb3JkaW5hdG9yU3RyBAVhZG1pbgkAnQgCCQERQGV4dHJOYXRpdmUoMTA2MikBCQEFdmFsdWUBBQ5jb29yZGluYXRvclN0cgUPa19hZG1pbl9hZGRyZXNzAwkBCWlzRGVmaW5lZAEFBWFkbWluCQELdmFsdWVPckVsc2UCCQCbCAIJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQV2YWx1ZQEFBWFkbWluCQCsAgIJAKwCAgkArAICAgdzdGF0dXNfCQClCAEFBHRoaXMCAV8JANgEAQgFAnR4AmlkBwkAAgECLnVuYWJsZSB0byB2ZXJpZnk6IGFkbWluIG5vdCBzZXQgaW4gY29vcmRpbmF0b3IJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXkjmfZj", "height": 3738085, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: none Next: none Full:
Old | New | Differences | |
---|---|---|---|
1 | - | # no script | |
1 | + | {-# STDLIB_VERSION 6 #-} | |
2 | + | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | + | {-# CONTENT_TYPE DAPP #-} | |
4 | + | let k_funds = "k_funds" | |
5 | + | ||
6 | + | let k_coordinatorAddress = "k_coordinatorAddress" | |
7 | + | ||
8 | + | let k_manager_address = "k_manager_address" | |
9 | + | ||
10 | + | let k_admin_address = "k_admin_address" | |
11 | + | ||
12 | + | let k_initialized = "k_initialized" | |
13 | + | ||
14 | + | func toCompositeKey (_key,_address) = ((_key + "_") + _address) | |
15 | + | ||
16 | + | ||
17 | + | func balanceOf (_assetId) = valueOrElse(getInteger(this, toCompositeKey(k_funds, _assetId)), 0) | |
18 | + | ||
19 | + | ||
20 | + | func coordinator () = valueOrErrorMessage(addressFromString(getStringValue(this, k_coordinatorAddress)), "Coordinator not set Simple Asset Manager") | |
21 | + | ||
22 | + | ||
23 | + | func managerAddress () = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(coordinator(), k_manager_address), "Manager not set")), "Manager not set") | |
24 | + | ||
25 | + | ||
26 | + | func initialized () = valueOrElse(getBoolean(this, k_initialized), false) | |
27 | + | ||
28 | + | ||
29 | + | func adminAddress () = addressFromString(getStringValue(coordinator(), k_admin_address)) | |
30 | + | ||
31 | + | ||
32 | + | func isWhitelist (_address) = (_address == toString(managerAddress())) | |
33 | + | ||
34 | + | ||
35 | + | func updateFunds (_assetId,_value) = [IntegerEntry(toCompositeKey(k_funds, _assetId), _value)] | |
36 | + | ||
37 | + | ||
38 | + | func strAssetId (_asset) = if (isDefined(_asset)) | |
39 | + | then toBase58String(value(_asset)) | |
40 | + | else "WAVES" | |
41 | + | ||
42 | + | ||
43 | + | @Callable(i) | |
44 | + | func initialize (_coordinator) = if (if (initialized()) | |
45 | + | then true | |
46 | + | else (i.caller != this)) | |
47 | + | then throw("Unable to initialize") | |
48 | + | else [StringEntry(k_coordinatorAddress, toString(addressFromStringValue(_coordinator))), BooleanEntry(k_initialized, true)] | |
49 | + | ||
50 | + | ||
51 | + | ||
52 | + | @Callable(i) | |
53 | + | func withdraw (_assetId,_amount) = if (if (if (!(isWhitelist(toString(i.caller)))) | |
54 | + | then true | |
55 | + | else !(initialized())) | |
56 | + | then true | |
57 | + | else (_amount > balanceOf(_assetId))) | |
58 | + | then throw(((("Invalid withdraw params (simple asset manager) " + toString(_amount)) + " > ") + toString(balanceOf(_assetId)))) | |
59 | + | else { | |
60 | + | let currentAssetBalance = (balanceOf(_assetId) - _amount) | |
61 | + | (updateFunds(_assetId, currentAssetBalance) ++ [ScriptTransfer(i.caller, _amount, if ((_assetId == "WAVES")) | |
62 | + | then unit | |
63 | + | else fromBase58String(_assetId))]) | |
64 | + | } | |
65 | + | ||
66 | + | ||
67 | + | ||
68 | + | @Callable(i) | |
69 | + | func deposit () = { | |
70 | + | let _amount = i.payments[0].amount | |
71 | + | let _assetId = strAssetId(i.payments[0].assetId) | |
72 | + | if (if (!(initialized())) | |
73 | + | then true | |
74 | + | else if (!(isWhitelist(toString(i.caller)))) | |
75 | + | then (i.caller != adminAddress()) | |
76 | + | else false) | |
77 | + | then throw("Invalid deposit params (simple asset manager)") | |
78 | + | else { | |
79 | + | let currentAssetBalance = (balanceOf(_assetId) + _amount) | |
80 | + | updateFunds(_assetId, currentAssetBalance) | |
81 | + | } | |
82 | + | } | |
83 | + | ||
84 | + | ||
85 | + | ||
86 | + | @Callable(i) | |
87 | + | func claimProfit (_assetId) = if (if (!(initialized())) | |
88 | + | then true | |
89 | + | else (i.caller != managerAddress())) | |
90 | + | then throw("Invalid claimProfit params (simple asset manager)") | |
91 | + | else $Tuple2([ScriptTransfer(i.caller, 0, if ((_assetId == "WAVES")) | |
92 | + | then unit | |
93 | + | else fromBase58String(_assetId))], 0) | |
94 | + | ||
95 | + | ||
96 | + | ||
97 | + | @Callable(i) | |
98 | + | func view_claimProfit (_assetId) = if (!(initialized())) | |
99 | + | then throw("Invalid view_claimProfit params (simple asset manager)") | |
100 | + | else { | |
101 | + | let profit = 0 | |
102 | + | throw(((((toString(balanceOf(_assetId)) + ",") + toString(balanceOf(_assetId))) + ",") + toString(profit))) | |
103 | + | } | |
104 | + | ||
105 | + | ||
106 | + | @Verifier(tx) | |
107 | + | func verify () = { | |
108 | + | let coordinatorStr = getString(this, k_coordinatorAddress) | |
109 | + | if (isDefined(coordinatorStr)) | |
110 | + | then { | |
111 | + | let admin = getString(addressFromStringValue(value(coordinatorStr)), k_admin_address) | |
112 | + | if (isDefined(admin)) | |
113 | + | then valueOrElse(getBoolean(addressFromStringValue(value(admin)), ((("status_" + toString(this)) + "_") + toBase58String(tx.id))), false) | |
114 | + | else throw("unable to verify: admin not set in coordinator") | |
115 | + | } | |
116 | + | else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) | |
117 | + | } | |
118 | + |
github/deemru/w8io/873ac7e 26.94 ms ◑![]()