tx · HmZBvABeTzB1LbH5avgsCVL59n9EafxumUubw5a2wUtJ

3P9W71Qk6896gxVNVZXkhevuB41HzgNBsHx:  -0.05000000 Waves

2023.05.16 11:06 [3645691] smart account 3P9W71Qk6896gxVNVZXkhevuB41HzgNBsHx > SELF 0.00000000 Waves

{ "type": 13, "id": "HmZBvABeTzB1LbH5avgsCVL59n9EafxumUubw5a2wUtJ", "fee": 5000000, "feeAssetId": null, "timestamp": 1684224418599, "version": 2, "chainId": 87, "sender": "3P9W71Qk6896gxVNVZXkhevuB41HzgNBsHx", "senderPublicKey": "AZNUatJ2VUi87L2WHzQcNFRupFKakggGyqqBceGWazUH", "proofs": [ "4wNffqGGL24RZhqfeMDZQnteRjFCFS7VUq93sH3hSi9weaDkqCUhxGKMhQgaBEYZyQyeEYzuLGtL8bgMbsZX4gWW" ], "script": "base64:BgLCBAgCEgMKAQgSAwoBARIDCgEIEgMKAQgiA1NFUCIEam9pbiICYXIiDmtleUluaXRpYWxpemVkIhVrZXlDb29yZGluYXRvckFkZHJlc3MiEmtleVZlcmlmaWVyQWRkcmVzcyIJa2V5U2lnbmVkIghfYWRkcmVzcyIFX3R4SWQiEWtleVByb3RvY29sQWN0aXZlIg1pc0luaXRpYWxpemVkIg9tdXN0SW5pdGlhbGl6ZWQiEm11c3ROb3RJbml0aWFsaXplZCIIbXVzdFNlbGYiAWkiC2Nvb3JkaW5hdG9yIgh2ZXJpZmllciIHJG1hdGNoMCIBcyIIaXNBY3RpdmUiCm11c3RBY3RpdmUiDGNoZWNrQWRkcmVzcyIHYWRkcmVzcyIKQVNTRVRfTkFNRSILREVTQ1JJUFRJT04iEWtleUFsbG93ZWRBZGRyZXNzIhBpc0FkZHJlc3NFbmFibGVkIhJtdXN0QWxsb3dlZEFkZHJlc3MiEGNhbGxlckFkZHJlc3NTdHIiCWlzRW5hYmxlZCITY2hlY2tBZGRyZXNzRW5hYmxlZCIUY2hlY2tBZGRyZXNzRGlzYWJsZWQiDWtleU5vcnRoQXNzZXQiEGdldE5vcnRoQXNzZXRTdHIiDWdldE5vcnRoQXNzZXQiE19jb29yZGluYXRvckFkZHJlc3MiBmNoZWNrcyIFbm9ydGgiDG5vcnRoQXNzZXRJZCIMX25vcnRoQW1vdW50Igpub3J0aEFzc2V0IgJ0eCIGdmVyaWZ5GgABYQICX18BAWIBAWMJALkJAgUBYwUBYQEBZAAJAQFiAQkAzAgCAgIlcwkAzAgCAgtpbml0aWFsaXplZAUDbmlsAQFlAAkBAWIBCQDMCAICAiVzCQDMCAICEmNvb3JkaW5hdG9yQWRkcmVzcwUDbmlsAQFmAAkBAWIBCQDMCAICAiVzCQDMCAICD3ZlcmlmaWVyQWRkcmVzcwUDbmlsAQFnAgFoAWkJAQFiAQkAzAgCAgYlcyVzJXMJAMwIAgIGc2lnbmVkCQDMCAIFAWgJAMwIAgUBaQUDbmlsAQFqAAkBAWIBCQDMCAICAiVzCQDMCAICDnByb3RvY29sQWN0aXZlBQNuaWwBAWsACQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAQFkAAcBAWwAAwkBASEBCQEBawAJAAIBAg9Ob3QgaW5pdGlhbGl6ZWQFBHVuaXQBAW0AAwkBAWsACQACAQITQWxyZWFkeSBpbml0aWFsaXplZAUEdW5pdAEBbgEBbwMJAQIhPQIIBQFvBmNhbGxlcgUEdGhpcwkAAgECHU9ubHkgc2VsZiBpbnZvY2F0aW9uIGFsbG93ZWQuBQR1bml0AQFwAAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAEJAQFlAAIWQ29vcmRpbmF0b3IgaXMgbm90IHNldAEBcQAEAXIJAKIIAQkBAWUAAwkAAQIFAXICBlN0cmluZwQBcwUBcgkAnQgCCQERQGV4dHJOYXRpdmUoMTA2MikBBQFzCQEBZgADCQABAgUBcgIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yAQF0AAkBC3ZhbHVlT3JFbHNlAgkAmwgCCQEBcAAJAQFqAAcBAXUAAwMJAQEhAQkBAXQABgkBASEBCQEBawAJAAIBAi1Qcm90b2NvbCBpcyBkaXNhYmxlZC4gUGxlYXNlIGNvbnRhY3Qgc3VwcG9ydC4FBHVuaXQBAXYBAWgEAXIJAKYIAQUBaAMJAAECBQFyAgdBZGRyZXNzBAF3BQFyBgMJAAECBQFyAgRVbml0CQACAQIPSW52YWxpZCBhZGRyZXNzCQACAQILTWF0Y2ggZXJyb3IAAXgCBk9SSUVOVAABeQJOT1JJRU5UIGlzIGFuIGFkZGl0aW9uYWwgaW5jZW50aXZlIGZvciBFQVNUIGFjdGl2ZSB1c2VycyBhbmQgZ292ZXJuYW5jZSB0b2tlbnMuAQF6AQFoCQEBYgEJAMwIAgIEJXMlcwkAzAgCAg5hbGxvd2VkQWRkcmVzcwkAzAgCBQFoBQNuaWwBAUEBAWgJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwkBAXoBBQFoBwEBQgEBbwQBQwkA2AQBCAgFAW8GY2FsbGVyBWJ5dGVzBAFECQEBQQEFAUMDBQFEBQR1bml0CQACAQkArAICCQCsAgIJAKwCAgIYVW5rbm93biBjYWxsZXIgYWRkcmVzcy4gCQClCAEIBQFvBmNhbGxlcgIBIAkA2AQBCAgFAW8GY2FsbGVyBWJ5dGVzAQFFAQFoAwkBAUEBBQFoBQR1bml0CQACAQIYQWRkcmVzcyBhbHJlYWR5IGRpc2FibGVkAQFGAQFoAwkBAUEBBQFoCQACAQIXQWRkcmVzcyBhbHJlYWR5IGVuYWJsZWQFBHVuaXQBAUcACQEBYgEJAMwIAgICJXMJAMwIAgIKbm9ydGhBc3NldAUDbmlsAQFIAAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAQFHAAIWTm9ydGggYXNzZXQgaXMgbm90IHNldAEBSQAJANkEAQkBAUgABAFvAQppbml0aWFsaXplAQFKBAFLCQDMCAIJAQFtAAkAzAgCCQEBdgEFAUoFA25pbAMJAAACBQFLBQFLBAFMCQDDCAcFAXgFAXkAAAAIBgUEdW5pdAAABAFNCQC4CAEFAUwJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAWUABQFKCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFHAAkA2AQBBQFNCQDMCAIJAQxCb29sZWFuRW50cnkCCQEBZAAGCQDMCAIFAUwFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFvAQVpc3N1ZQEBTgQBSwkAzAgCCQEBdQAJAMwIAgkBAUIBBQFvBQNuaWwDCQAAAgUBSwUBSwQBTwkBAUkACQDMCAIJAQdSZWlzc3VlAwUBTwUBTgYJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAW8GY2FsbGVyBQFOBQFPBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BbwEKYWRkQWRkcmVzcwEBaAQBSwkAzAgCCQEBbAAJAMwIAgkBAW4BBQFvCQDMCAIJAQF2AQUBaAkAzAgCCQEBRgEFAWgFA25pbAMJAAACBQFLBQFLCQDMCAIJAQxCb29sZWFuRW50cnkCCQEBegEFAWgGBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BbwENcmVtb3ZlQWRkcmVzcwEBaAQBSwkAzAgCCQEBbAAJAMwIAgkBAW4BBQFvCQDMCAIJAQF2AQUBaAkAzAgCCQEBRQEFAWgFA25pbAMJAAACBQFLBQFLCQDMCAIJAQxCb29sZWFuRW50cnkCCQEBegEFAWgHBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAVABAVEABAFyCQEBcQADCQABAgUBcgIGU3RyaW5nBAF3BQFyCQELdmFsdWVPckVsc2UCCQCbCAIJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAXcJAQFnAgkApQgBBQR0aGlzCQDYBAEIBQFQAmlkBwkA9AMDCAUBUAlib2R5Qnl0ZXMJAJEDAggFAVAGcHJvb2ZzAAAIBQFQD3NlbmRlclB1YmxpY0tleUVQlRE=", "height": 3645691, "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+let SEP = "__"
5+
6+func join (ar) = makeString(ar, SEP)
7+
8+
9+func keyInitialized () = join(["%s", "initialized"])
10+
11+
12+func keyCoordinatorAddress () = join(["%s", "coordinatorAddress"])
13+
14+
15+func keyVerifierAddress () = join(["%s", "verifierAddress"])
16+
17+
18+func keySigned (_address,_txId) = join(["%s%s%s", "signed", _address, _txId])
19+
20+
21+func keyProtocolActive () = join(["%s", "protocolActive"])
22+
23+
24+func isInitialized () = valueOrElse(getBoolean(this, keyInitialized()), false)
25+
26+
27+func mustInitialized () = if (!(isInitialized()))
28+ then throw("Not initialized")
29+ else unit
30+
31+
32+func mustNotInitialized () = if (isInitialized())
33+ then throw("Already initialized")
34+ else unit
35+
36+
37+func mustSelf (i) = if ((i.caller != this))
38+ then throw("Only self invocation allowed.")
39+ else unit
40+
41+
42+func coordinator () = addressFromStringValue(valueOrErrorMessage(getString(keyCoordinatorAddress()), "Coordinator is not set"))
43+
44+
45+func verifier () = match getString(keyCoordinatorAddress()) {
46+ case s: String =>
47+ getString(addressFromStringValue(s), keyVerifierAddress())
48+ case _: Unit =>
49+ unit
50+ case _ =>
51+ throw("Match error")
52+}
53+
54+
55+func isActive () = valueOrElse(getBoolean(coordinator(), keyProtocolActive()), false)
56+
57+
58+func mustActive () = if (if (!(isActive()))
59+ then true
60+ else !(isInitialized()))
61+ then throw("Protocol is disabled. Please contact support.")
62+ else unit
63+
64+
65+func checkAddress (_address) = match addressFromString(_address) {
66+ case address: Address =>
67+ true
68+ case _: Unit =>
69+ throw("Invalid address")
70+ case _ =>
71+ throw("Match error")
72+}
73+
74+
75+let ASSET_NAME = "ORIENT"
76+
77+let DESCRIPTION = "ORIENT is an additional incentive for EAST active users and governance tokens."
78+
79+func keyAllowedAddress (_address) = join(["%s%s", "allowedAddress", _address])
80+
81+
82+func isAddressEnabled (_address) = valueOrElse(getBoolean(this, keyAllowedAddress(_address)), false)
83+
84+
85+func mustAllowedAddress (i) = {
86+ let callerAddressStr = toBase58String(i.caller.bytes)
87+ let isEnabled = isAddressEnabled(callerAddressStr)
88+ if (isEnabled)
89+ then unit
90+ else throw(((("Unknown caller address. " + toString(i.caller)) + " ") + toBase58String(i.caller.bytes)))
91+ }
92+
93+
94+func checkAddressEnabled (_address) = if (isAddressEnabled(_address))
95+ then unit
96+ else throw("Address already disabled")
97+
98+
99+func checkAddressDisabled (_address) = if (isAddressEnabled(_address))
100+ then throw("Address already enabled")
101+ else unit
102+
103+
104+func keyNorthAsset () = join(["%s", "northAsset"])
105+
106+
107+func getNorthAssetStr () = valueOrErrorMessage(getString(this, keyNorthAsset()), "North asset is not set")
108+
109+
110+func getNorthAsset () = fromBase58String(getNorthAssetStr())
111+
112+
113+@Callable(i)
114+func initialize (_coordinatorAddress) = {
115+ let checks = [mustNotInitialized(), checkAddress(_coordinatorAddress)]
116+ if ((checks == checks))
117+ then {
118+ let north = Issue(ASSET_NAME, DESCRIPTION, 0, 8, true, unit, 0)
119+ let northAssetId = calculateAssetId(north)
120+[StringEntry(keyCoordinatorAddress(), _coordinatorAddress), StringEntry(keyNorthAsset(), toBase58String(northAssetId)), BooleanEntry(keyInitialized(), true), north]
121+ }
122+ else throw("Strict value is not equal to itself.")
123+ }
124+
125+
126+
127+@Callable(i)
128+func issue (_northAmount) = {
129+ let checks = [mustActive(), mustAllowedAddress(i)]
130+ if ((checks == checks))
131+ then {
132+ let northAsset = getNorthAsset()
133+[Reissue(northAsset, _northAmount, true), ScriptTransfer(i.caller, _northAmount, northAsset)]
134+ }
135+ else throw("Strict value is not equal to itself.")
136+ }
137+
138+
139+
140+@Callable(i)
141+func addAddress (_address) = {
142+ let checks = [mustInitialized(), mustSelf(i), checkAddress(_address), checkAddressDisabled(_address)]
143+ if ((checks == checks))
144+ then [BooleanEntry(keyAllowedAddress(_address), true)]
145+ else throw("Strict value is not equal to itself.")
146+ }
147+
148+
149+
150+@Callable(i)
151+func removeAddress (_address) = {
152+ let checks = [mustInitialized(), mustSelf(i), checkAddress(_address), checkAddressEnabled(_address)]
153+ if ((checks == checks))
154+ then [BooleanEntry(keyAllowedAddress(_address), false)]
155+ else throw("Strict value is not equal to itself.")
156+ }
157+
158+
159+@Verifier(tx)
160+func verify () = match verifier() {
161+ case address: String =>
162+ valueOrElse(getBoolean(addressFromStringValue(address), keySigned(toString(this), toBase58String(tx.id))), false)
163+ case _ =>
164+ sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
165+}
166+

github/deemru/w8io/6500d08 
18.18 ms