tx · BpinKKp1BQkzdjU2a9LrRbM9WAVUSP6EzK4Zp4bo5AfQ

3MwJisSfBdVkuZgonEmsFrJE1qokvCLzeDv:  -0.00400000 Waves

2024.10.04 21:28 [3312473] smart account 3MwJisSfBdVkuZgonEmsFrJE1qokvCLzeDv > SELF 0.00000000 Waves

{ "type": 13, "id": "BpinKKp1BQkzdjU2a9LrRbM9WAVUSP6EzK4Zp4bo5AfQ", "fee": 400000, "feeAssetId": null, "timestamp": 1728066587017, "version": 2, "chainId": 84, "sender": "3MwJisSfBdVkuZgonEmsFrJE1qokvCLzeDv", "senderPublicKey": "J26AGFxMNgMP7Bmvg5WLkByWMWn2DYNdgPAPAQo168oW", "proofs": [ "2gvAHKRCBaf2CVRubdTZJ9JWNWS2VALumC2tMwUJQSnW7Zhh7GGVhBTxuLxJckAXErAudmkvWphWYWxfmymyUQqq" ], "script": "base64:BgIWCAISAwoBCBIDCgEIEgMKAQgSAwoBCBABC3dyaXRlU3RyaW5nAgNrZXkFdmFsdWUJAQtTdHJpbmdFbnRyeQIFA2tleQUFdmFsdWUBEHdyaXRlQ29uc3RTdHJpbmcCA2tleQV2YWx1ZQMJAQEhAQkBCWlzRGVmaW5lZAEJAJ0IAgUEdGhpcwUDa2V5CQELU3RyaW5nRW50cnkCBQNrZXkFBXZhbHVlCQACAQkArAICAhVhbHJlYWR5IGluaXRpYWxpemVkOiAFA2tleQENd3JpdGVDb25zdEludAIDa2V5BXZhbHVlAwkBASEBCQEJaXNEZWZpbmVkAQkAmggCBQR0aGlzBQNrZXkJAQxJbnRlZ2VyRW50cnkCBQNrZXkFBXZhbHVlCQACAQkArAICAhBhbHJlYWR5IGV4aXN0czogBQNrZXkADWNvbmZpZ0FkZHJlc3MFBHRoaXMADXZvdGluZ1Jlc3VsdHMJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUNY29uZmlnQWRkcmVzcwIWY29udHJhY3Rfdm90aW5nX3Jlc3VsdAIhY29uZmlnOiBubyBjb250cmFjdF92b3RpbmdfcmVzdWx0Ah5pbnZhbGlkIGNvbnRyYWN0X3ZvdGluZ19yZXN1bHQABkhFSUdIVAUGaGVpZ2h0AQZhZHZpc2UACQCsAgICCGhlaWdodDogCQCkAwEFBkhFSUdIVAADb3BzCQDMCAICBXN0YWtlCQDMCAICB3Vuc3Rha2UJAMwIAgIVZ292ZXJuYW5jZV9wcm9wb3NlX3R4CQDMCAICG2dvdmVybmFuY2VfZWRpdF9hdHRhY2htZW50cwkAzAgCAhJnb3Zlcm5hbmNlX3ZvdGVfdHgJAMwIAgIXZ292ZXJuYW5jZV9yZXRyYWN0X3ZvdGUJAMwIAgIeZ292ZXJuYW5jZV9yZXRyYWN0X3Byb3Bvc2FsX3R4CQDMCAICE2dvdmVybmFuY2VfYXBwbHlfdHgFA25pbAASc3lzdGVtQ29udHJvbFN0b3JlAg5zeXN0ZW1fYWxsb3dlZAEOb3BBbGxvd2VkU3RvcmUBAm9wAwkBCWlzRGVmaW5lZAEJAM8IAgUDb3BzBQJvcAkArAICCQCsAgICA29wXwUCb3ACCF9hbGxvd2VkCQACAQkArAICCQCsAgICFkludmFsaWQgYXJndW1lbnQ6IG9wLiAFAm9wAhwgb3BlcmF0aW9uIGlzIG5vdCByZWdpc3RlcmVkAQ5vcFVucGF1c2VTdG9yZQECb3AJAKwCAgkArAICAgNvcF8FAm9wAgxfdW5wYXVzZWRfYnkADnNlbnRpbmVsc1N0b3JlAglzZW50aW5lbHMADHNlbnRpbmVsc1N0cgkAnQgCBQR0aGlzBQ5zZW50aW5lbHNTdG9yZQAJc2VudGluZWxzAwkBCWlzRGVmaW5lZAEFDHNlbnRpbmVsc1N0cgkAtQkCCQEFdmFsdWUBBQxzZW50aW5lbHNTdHICASwFA25pbAEOYXNzZXJ0U2VudGluZWwBAXMJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAzwgCBQlzZW50aW5lbHMJAKUIAQUBcwIOcGF1c2VPcCBkZW5pZWQBBnF1b3J1bQAEA2FsbAkAkAMBBQlzZW50aW5lbHMDCQBmAgADBQNhbGwAAQkAZAIJAGkCBQNhbGwAAgABBAFpAQlvcEFsbG93ZWQBAm9wBAVzdG9yZQkBDm9wQWxsb3dlZFN0b3JlAQUCb3ADCQEIY29udGFpbnMCCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMCCHN0b3BsaXN0AgAJAKUIAQgFAWkMb3JpZ2luQ2FsbGVyCQACAQIcb3BlcmF0aW9uIHBhdXNlZCBieSBzdG9wbGlzdAMJAQhjb250YWlucwIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwIDZXhjAgAJAKUIAQgFAWkMb3JpZ2luQ2FsbGVyCQCUCgIFA25pbAYECGVuYWJsZWQwCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFEnN5c3RlbUNvbnRyb2xTdG9yZQYECGVuYWJsZWQxCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFBXN0b3JlBgMJAQEhAQUIZW5hYmxlZDAJAAIBCQCsAgIJAKwCAgIUb3BlcmF0aW9uIHBhdXNlZCBieSAFEnN5c3RlbUNvbnRyb2xTdG9yZQIGPWZhbHNlAwkBASEBBQhlbmFibGVkMQkAAgEJAKwCAgkArAICAhRvcGVyYXRpb24gcGF1c2VkIGJ5IAUFc3RvcmUCBj1mYWxzZQkAlAoCBQNuaWwGAWkBB3BhdXNlT3ABAm9wBAFzCQEOYXNzZXJ0U2VudGluZWwBCAUBaQZjYWxsZXIDCQAAAgUBcwUBcwkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBDm9wQWxsb3dlZFN0b3JlAQUCb3AHBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEJdW5wYXVzZU9wAQJvcAQBcwkBDmFzc2VydFNlbnRpbmVsAQgFAWkGY2FsbGVyAwkAAAIFAXMFAXMEBXN0b3JlCQEOb3BBbGxvd2VkU3RvcmUBBQJvcAMJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwUFc3RvcmUGCQACAQIcdW5wYXVzZU9wOiBpbnZhbGlkIG9wZXJhdGlvbgQIc2VudGluZWwJAKUIAQgFAWkGY2FsbGVyBA91bnBhdXNlZEJ5U3RvcmUJAQ5vcFVucGF1c2VTdG9yZQEFAm9wBA11bnBhdXNlZEJ5U3RyCQCdCAIFBHRoaXMFD3VucGF1c2VkQnlTdG9yZQQBcQkBBnF1b3J1bQADCQEJaXNEZWZpbmVkAQUNdW5wYXVzZWRCeVN0cgQPdW5wYXVzZWRCeVZhbHVlCQEFdmFsdWUBBQ11bnBhdXNlZEJ5U3RyBAp1bnBhdXNlZEJ5CQC1CQIFD3VucGF1c2VkQnlWYWx1ZQIBLAMJAQlpc0RlZmluZWQBCQDPCAIFCnVucGF1c2VkQnkFCHNlbnRpbmVsCQACAQIRZHVwbGljYXRlIHVucGF1c2UDCQAAAgkAZAIJAJADAQUKdW5wYXVzZWRCeQABBQFxCQDMCAIJAQtEZWxldGVFbnRyeQEFBXN0b3JlCQDMCAIJAQtEZWxldGVFbnRyeQEFD3VucGF1c2VkQnlTdG9yZQUDbmlsCQDMCAIJAQtTdHJpbmdFbnRyeQIFD3VucGF1c2VkQnlTdG9yZQkArAICCQCsAgIFD3VucGF1c2VkQnlWYWx1ZQIBLAUIc2VudGluZWwFA25pbAMJAAACBQFxAAEJAMwIAgkBC0RlbGV0ZUVudHJ5AQUFc3RvcmUFA25pbAkAzAgCCQELU3RyaW5nRW50cnkCBQ91bnBhdXNlZEJ5U3RvcmUFCHNlbnRpbmVsBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQELYWRkU2VudGluZWwBCHNlbnRpbmVsAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIab25seSBzZWxmIGNhbiBhZGQgc2VudGluZWwEAWEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBBQhzZW50aW5lbAIYaW52YWxpZCBzZW50aW5lbCBhZGRyZXNzAwkAAAIFAWEFAWEDCQEBIQEJAQlpc0RlZmluZWQBBQxzZW50aW5lbHNTdHIJAMwIAgkBC1N0cmluZ0VudHJ5AgUOc2VudGluZWxzU3RvcmUFCHNlbnRpbmVsBQNuaWwDCQEJaXNEZWZpbmVkAQkAzwgCBQlzZW50aW5lbHMFCHNlbnRpbmVsBQNuaWwJAMwIAgkBC1N0cmluZ0VudHJ5AgUOc2VudGluZWxzU3RvcmUJAKwCAgkArAICCQEFdmFsdWUBBQxzZW50aW5lbHNTdHICASwFCHNlbnRpbmVsBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAnR4AQZ2ZXJpZnkABAJpZAkA2AQBCAUCdHgCaWQJAGcCBQZoZWlnaHQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkArAICCQCsAgICGXByb3Bvc2FsX2FsbG93X2Jyb2FkY2FzdF8JAKUIAQUEdGhpcwIBXwUCaWQerIRM", "height": 3312473, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: none Next: none Full:
OldNewDifferences
1-# no script
1+{-# STDLIB_VERSION 6 #-}
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+func writeConstInt (key,value) = if (!(isDefined(getInteger(this, key))))
13+ then IntegerEntry(key, value)
14+ else throw(("already exists: " + key))
15+
16+
17+let configAddress = this
18+
19+let votingResults = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "contract_voting_result"), "config: no contract_voting_result")), "invalid contract_voting_result")
20+
21+let HEIGHT = height
22+
23+func advise () = ("height: " + toString(HEIGHT))
24+
25+
26+let ops = ["stake", "unstake", "governance_propose_tx", "governance_edit_attachments", "governance_vote_tx", "governance_retract_vote", "governance_retract_proposal_tx", "governance_apply_tx"]
27+
28+let systemControlStore = "system_allowed"
29+
30+func opAllowedStore (op) = if (isDefined(indexOf(ops, op)))
31+ then (("op_" + op) + "_allowed")
32+ else throw((("Invalid argument: op. " + op) + " operation is not registered"))
33+
34+
35+func opUnpauseStore (op) = (("op_" + op) + "_unpaused_by")
36+
37+
38+let sentinelsStore = "sentinels"
39+
40+let sentinelsStr = getString(this, sentinelsStore)
41+
42+let sentinels = if (isDefined(sentinelsStr))
43+ then split(value(sentinelsStr), ",")
44+ else nil
45+
46+func assertSentinel (s) = valueOrErrorMessage(indexOf(sentinels, toString(s)), "pauseOp denied")
47+
48+
49+func quorum () = {
50+ let all = size(sentinels)
51+ if ((3 > all))
52+ then 1
53+ else ((all / 2) + 1)
54+ }
55+
56+
57+@Callable(i)
58+func opAllowed (op) = {
59+ let store = opAllowedStore(op)
60+ if (contains(valueOrElse(getString(this, "stoplist"), ""), toString(i.originCaller)))
61+ then throw("operation paused by stoplist")
62+ else if (contains(valueOrElse(getString(this, "exc"), ""), toString(i.originCaller)))
63+ then $Tuple2(nil, true)
64+ else {
65+ let enabled0 = valueOrElse(getBoolean(this, systemControlStore), true)
66+ let enabled1 = valueOrElse(getBoolean(this, store), true)
67+ if (!(enabled0))
68+ then throw((("operation paused by " + systemControlStore) + "=false"))
69+ else if (!(enabled1))
70+ then throw((("operation paused by " + store) + "=false"))
71+ else $Tuple2(nil, true)
72+ }
73+ }
74+
75+
76+
77+@Callable(i)
78+func pauseOp (op) = {
79+ let s = assertSentinel(i.caller)
80+ if ((s == s))
81+ then [BooleanEntry(opAllowedStore(op), false)]
82+ else throw("Strict value is not equal to itself.")
83+ }
84+
85+
86+
87+@Callable(i)
88+func unpauseOp (op) = {
89+ let s = assertSentinel(i.caller)
90+ if ((s == s))
91+ then {
92+ let store = opAllowedStore(op)
93+ if (valueOrElse(getBoolean(this, store), true))
94+ then throw("unpauseOp: invalid operation")
95+ else {
96+ let sentinel = toString(i.caller)
97+ let unpausedByStore = opUnpauseStore(op)
98+ let unpausedByStr = getString(this, unpausedByStore)
99+ let q = quorum()
100+ if (isDefined(unpausedByStr))
101+ then {
102+ let unpausedByValue = value(unpausedByStr)
103+ let unpausedBy = split(unpausedByValue, ",")
104+ if (isDefined(indexOf(unpausedBy, sentinel)))
105+ then throw("duplicate unpause")
106+ else if (((size(unpausedBy) + 1) == q))
107+ then [DeleteEntry(store), DeleteEntry(unpausedByStore)]
108+ else [StringEntry(unpausedByStore, ((unpausedByValue + ",") + sentinel))]
109+ }
110+ else if ((q == 1))
111+ then [DeleteEntry(store)]
112+ else [StringEntry(unpausedByStore, sentinel)]
113+ }
114+ }
115+ else throw("Strict value is not equal to itself.")
116+ }
117+
118+
119+
120+@Callable(i)
121+func addSentinel (sentinel) = if ((i.caller != this))
122+ then throw("only self can add sentinel")
123+ else {
124+ let a = valueOrErrorMessage(addressFromString(sentinel), "invalid sentinel address")
125+ if ((a == a))
126+ then if (!(isDefined(sentinelsStr)))
127+ then [StringEntry(sentinelsStore, sentinel)]
128+ else if (isDefined(indexOf(sentinels, sentinel)))
129+ then nil
130+ else [StringEntry(sentinelsStore, ((value(sentinelsStr) + ",") + sentinel))]
131+ else throw("Strict value is not equal to itself.")
132+ }
133+
134+
135+@Verifier(tx)
136+func verify () = {
137+ let id = toBase58String(tx.id)
138+ (height >= getIntegerValue(this, ((("proposal_allow_broadcast_" + toString(this)) + "_") + id)))
139+ }
140+

github/deemru/w8io/c3f4982 
11.89 ms