tx · 8PJRx5DasaUZvftNami85Eid76dwcd7PSxDW3yjG7JRu 3P2rJGfb5MbeivZNSqdVmsD1Y2Mz8y6Jr3Z: -0.01000000 Waves 2022.03.08 14:40 [3020052] smart account 3P2rJGfb5MbeivZNSqdVmsD1Y2Mz8y6Jr3Z > SELF 0.00000000 Waves
{ "type": 13, "id": "8PJRx5DasaUZvftNami85Eid76dwcd7PSxDW3yjG7JRu", "fee": 1000000, "feeAssetId": null, "timestamp": 1646739611454, "version": 1, "sender": "3P2rJGfb5MbeivZNSqdVmsD1Y2Mz8y6Jr3Z", "senderPublicKey": "3gQ8QUfoGQW6YVuhUv3zuqsbmxbV5F2FAuDXJqVKD6C9", "proofs": [ "VbQ6krQnW4urqGwEBCXQsLKSBNxbTqc3tZxwLiMJgQsLkWrCJaCHz9qMUXR2NBJBu68H7oW54NKTW1GRYe6GUvk" ], "script": "base64:AAIFAAAAAAAAACQIAhIDCgEIEgMKAQgSBAoCCAgSAwoBCBIAEgMKAQgSBAoCCAgAAAAWAQAAAAt3cml0ZVN0cmluZwAAAAIAAAADa2V5AAAABXZhbHVlCQEAAAALU3RyaW5nRW50cnkAAAACBQAAAANrZXkFAAAABXZhbHVlAQAAABB3cml0ZUNvbnN0U3RyaW5nAAAAAgAAAANrZXkAAAAFdmFsdWUDCQEAAAABIQAAAAEJAQAAAAlpc0RlZmluZWQAAAABCQAEHQAAAAIFAAAABHRoaXMFAAAAA2tleQkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAADa2V5BQAAAAV2YWx1ZQkAAAIAAAABCQABLAAAAAICAAAAFWFscmVhZHkgaW5pdGlhbGl6ZWQ6IAUAAAADa2V5AAAAAA1jb25maWdBZGRyZXNzBQAAAAR0aGlzAAAAAAphZG1pblN0b3JlAgAAAAVhZG1pbgAAAAAJbWFpblN0b3JlAgAAAARtYWluAAAAAA9wYXVzYWJsZUJ5U3RvcmUCAAAACnBhdXNhYmxlQnkBAAAAC0FQb2ludFN0b3JlAAAAAQAAAAdhc3NldElkCQABLAAAAAIFAAAAB2Fzc2V0SWQCAAAAB19BUG9pbnQBAAAAC0JQb2ludFN0b3JlAAAAAQAAAAdhc3NldElkCQABLAAAAAIFAAAAB2Fzc2V0SWQCAAAAB19CUG9pbnQBAAAAC0NQb2ludFN0b3JlAAAAAQAAAAdhc3NldElkCQABLAAAAAIFAAAAB2Fzc2V0SWQCAAAAB19DUG9pbnQBAAAAC0RQb2ludFN0b3JlAAAAAQAAAAdhc3NldElkCQABLAAAAAIFAAAAB2Fzc2V0SWQCAAAAB19EUG9pbnQBAAAAFWNvbGxhdGVyYWxGYWN0b3JTdG9yZQAAAAEAAAAHYXNzZXRJZAkAASwAAAACBQAAAAdhc3NldElkAgAAABFfQ29sbGF0ZXJhbEZhY3RvcgEAAAAScmVzZXJ2ZUZhY3RvclN0b3JlAAAAAQAAAAdhc3NldElkCQABLAAAAAIFAAAAB2Fzc2V0SWQCAAAADl9SZXNlcnZlRmFjdG9yAQAAABlsaXF1aWRhdGlvblRocmVzaG9sZFN0b3JlAAAAAQAAAAdhc3NldElkCQABLAAAAAIFAAAAB2Fzc2V0SWQCAAAAFV9MaXF1aWRhdGlvblRocmVzaG9sZAEAAAAXbGlxdWlkYXRpb25QZW5hbHR5U3RvcmUAAAABAAAAB2Fzc2V0SWQJAAEsAAAAAgUAAAAHYXNzZXRJZAIAAAATX0xpcXVpZGF0aW9uUGVuYWx0eQAAAAAGb3BzU3RyCQEAAAALdmFsdWVPckVsc2UAAAACCQAEHQAAAAIFAAAABHRoaXMCAAAAA29wcwkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAABxZGVwb3NpdHx3aXRoZHJhd3xib3Jyb3d8cmVwYXl8YXRva2Vuc3xjb2xsYXBzZXx0cmFuc2Zlcl9kZWJ0fHVzZV9hc19jb2x8Zm9yY2VfY29sbGFwc2V8c3Rha2VfdmlyZXN8dW5zdGFrZV92aXJlc3wCAAAAfGNsYWltX3ZpcmVzX2Rpc3RyaWJ1dGlvbnxjbGFpbV92aXJlc19lYnxyZWFsbG9jfGxvY2tfdmlyZXN8d2l0aGRyYXdfdW5sb2NrZWRfdmlyZXN8Y2xhaW1fZGl2aWRlbmRzfHNoYXJlX2RpdmlkZW5kc19tYW51YWxseXwCAAAAfHN0YWtlcl9taWdyYXRlfHN1cHBseV9wcm90ZWN0ZWRfY29sbGF0ZXJhbHx3aXRoZHJhd19wcm90ZWN0ZWRfY29sbGF0ZXJhbHxjb2xsYXBzZV9wcm90ZWN0ZWRfY29sbGF0ZXJhbHxzZXRfZGVsZWdhdGlvbl9jbGFpbXwCAAAAPGdvdmVybmFuY2VfcHJvcG9zZV90eHxnb3Zlcm5hbmNlX3ZvdGVfdHh8Z292ZXJuYW5jZV9hcHBseV90eAAAAAADb3BzCQAEtQAAAAIFAAAABm9wc1N0cgIAAAABfAEAAAAVcmVzZXJ2ZU9wQ29udHJvbFN0b3JlAAAAAgAAAAdhc3NldElkAAAAAm9wCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAA29wXwUAAAACb3ACAAAAAV8FAAAAB2Fzc2V0SWQCAAAAB19wYXVzZWQBAAAADm9wQ29udHJvbFN0b3JlAAAAAQAAAAJvcAkAASwAAAACCQABLAAAAAICAAAAA29wXwUAAAACb3ACAAAAB19wYXVzZWQAAAAAEnN5c3RlbUNvbnRyb2xTdG9yZQIAAAANc3lzdGVtX3Bh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", "chainId": 87, "height": 3020052, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: none Next: FH6EdwC6bMBNFFcptSgAkw2bUNkwdypUYobLms82rvtk Full:
Old | New | Differences | |
---|---|---|---|
1 | - | # no script | |
1 | + | {-# STDLIB_VERSION 5 #-} | |
2 | + | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | + | {-# CONTENT_TYPE DAPP #-} | |
4 | + | func writeString (key,value) = StringEntry(key, value) | |
5 | + | ||
6 | + | ||
7 | + | func writeConstString (key,value) = if (!(isDefined(getString(this, key)))) | |
8 | + | then StringEntry(key, value) | |
9 | + | else throw(("already initialized: " + key)) | |
10 | + | ||
11 | + | ||
12 | + | let configAddress = this | |
13 | + | ||
14 | + | let adminStore = "admin" | |
15 | + | ||
16 | + | let mainStore = "main" | |
17 | + | ||
18 | + | let pausableByStore = "pausableBy" | |
19 | + | ||
20 | + | func APointStore (assetId) = (assetId + "_APoint") | |
21 | + | ||
22 | + | ||
23 | + | func BPointStore (assetId) = (assetId + "_BPoint") | |
24 | + | ||
25 | + | ||
26 | + | func CPointStore (assetId) = (assetId + "_CPoint") | |
27 | + | ||
28 | + | ||
29 | + | func DPointStore (assetId) = (assetId + "_DPoint") | |
30 | + | ||
31 | + | ||
32 | + | func collateralFactorStore (assetId) = (assetId + "_CollateralFactor") | |
33 | + | ||
34 | + | ||
35 | + | func reserveFactorStore (assetId) = (assetId + "_ReserveFactor") | |
36 | + | ||
37 | + | ||
38 | + | func liquidationThresholdStore (assetId) = (assetId + "_LiquidationThreshold") | |
39 | + | ||
40 | + | ||
41 | + | func liquidationPenaltyStore (assetId) = (assetId + "_LiquidationPenalty") | |
42 | + | ||
43 | + | ||
44 | + | let opsStr = valueOrElse(getString(this, "ops"), ((("deposit|withdraw|borrow|repay|atokens|collapse|transfer_debt|use_as_col|force_collapse|stake_vires|unstake_vires|" + "claim_vires_distribution|claim_vires_eb|realloc|lock_vires|withdraw_unlocked_vires|claim_dividends|share_dividends_manually|") + "staker_migrate|supply_protected_collateral|withdraw_protected_collateral|collapse_protected_collateral|set_delegation_claim|") + "governance_propose_tx|governance_vote_tx|governance_apply_tx")) | |
45 | + | ||
46 | + | let ops = split(opsStr, "|") | |
47 | + | ||
48 | + | func reserveOpControlStore (assetId,op) = (((("op_" + op) + "_") + assetId) + "_paused") | |
49 | + | ||
50 | + | ||
51 | + | func opControlStore (op) = (("op_" + op) + "_paused") | |
52 | + | ||
53 | + | ||
54 | + | let systemControlStore = "system_paused" | |
55 | + | ||
56 | + | func adminOnly (i) = if ((toString(i.caller) != valueOrElse(getString(this, adminStore), "no admin"))) | |
57 | + | then throw("only admin can do") | |
58 | + | else true | |
59 | + | ||
60 | + | ||
61 | + | func inRange (value,min,max) = if (if ((min > value)) | |
62 | + | then true | |
63 | + | else (value > max)) | |
64 | + | then throw(((((("value: " + toString(value)) + " not in range: ") + toString(min)) + " - ") + toString(max))) | |
65 | + | else true | |
66 | + | ||
67 | + | ||
68 | + | func canPause (i) = contains(valueOrErrorMessage(getString(this, pausableByStore), "pausableByStore not configured"), toString(i.caller)) | |
69 | + | ||
70 | + | ||
71 | + | @Callable(i) | |
72 | + | func initialize (main) = [writeConstString(adminStore, toString(i.caller)), writeConstString(mainStore, main)] | |
73 | + | ||
74 | + | ||
75 | + | ||
76 | + | @Callable(i) | |
77 | + | func changeResumeAdmin (newResume) = { | |
78 | + | let checks = adminOnly(i) | |
79 | + | if ((checks == checks)) | |
80 | + | then [writeString(adminStore, newResume)] | |
81 | + | else throw("Strict value is not equal to itself.") | |
82 | + | } | |
83 | + | ||
84 | + | ||
85 | + | ||
86 | + | @Callable(i) | |
87 | + | func pauseAssetOp (assetId,op) = if (!(isDefined(indexOf(ops, op)))) | |
88 | + | then throw(("unknown op: " + op)) | |
89 | + | else if (!(canPause(i))) | |
90 | + | then throw("only pausableBy can do") | |
91 | + | else [BooleanEntry(reserveOpControlStore(assetId, op), false)] | |
92 | + | ||
93 | + | ||
94 | + | ||
95 | + | @Callable(i) | |
96 | + | func pauseOp (op) = if (!(isDefined(indexOf(ops, op)))) | |
97 | + | then throw(("unknown op: " + op)) | |
98 | + | else if (!(canPause(i))) | |
99 | + | then throw("only pausableBy can do") | |
100 | + | else [BooleanEntry(opControlStore(op), false)] | |
101 | + | ||
102 | + | ||
103 | + | ||
104 | + | @Callable(i) | |
105 | + | func pauseSystem () = if (!(canPause(i))) | |
106 | + | then throw("only pausableBy can do") | |
107 | + | else [BooleanEntry(systemControlStore, false)] | |
108 | + | ||
109 | + | ||
110 | + | ||
111 | + | @Callable(i) | |
112 | + | func resume (key) = { | |
113 | + | let checks = adminOnly(i) | |
114 | + | if ((checks == checks)) | |
115 | + | then [BooleanEntry(key, true)] | |
116 | + | else throw("Strict value is not equal to itself.") | |
117 | + | } | |
118 | + | ||
119 | + | ||
120 | + | ||
121 | + | @Callable(i) | |
122 | + | func opAllowed (assetId,op) = { | |
123 | + | let enabled0 = valueOrElse(getBoolean(this, systemControlStore), true) | |
124 | + | let enabled1 = valueOrElse(getBoolean(this, opControlStore(op)), true) | |
125 | + | let enabled2 = valueOrElse(getBoolean(this, reserveOpControlStore(assetId, op)), true) | |
126 | + | if (!(enabled0)) | |
127 | + | then throw(("operation paused by " + systemControlStore)) | |
128 | + | else if (!(enabled1)) | |
129 | + | then throw(("operation paused by " + opControlStore(op))) | |
130 | + | else if (!(enabled2)) | |
131 | + | then throw(("operation paused by " + reserveOpControlStore(assetId, op))) | |
132 | + | else $Tuple2(nil, true) | |
133 | + | } | |
134 | + | ||
135 | + |
github/deemru/w8io/3ef1775 30.86 ms ◑