tx · Hb7ZhobsVBdGfdxez9bhyfzDhFKYqkjEfoL1LccWKHEw

3MtQJPJK9B7kkT9Yx15fnfyubSaF3xPtFpB:  -0.05000000 Waves

2023.05.15 20:42 [2579396] smart account 3MtQJPJK9B7kkT9Yx15fnfyubSaF3xPtFpB > SELF 0.00000000 Waves

{ "type": 13, "id": "Hb7ZhobsVBdGfdxez9bhyfzDhFKYqkjEfoL1LccWKHEw", "fee": 5000000, "feeAssetId": null, "timestamp": 1684172595196, "version": 2, "chainId": 84, "sender": "3MtQJPJK9B7kkT9Yx15fnfyubSaF3xPtFpB", "senderPublicKey": "EaV9TUgMG5bKtTENBeMN5cyZvQ7RukLoGkAPaKSDSXTH", "proofs": [ "3vjKA71sXVxMpWMp9hpz7FMRAEEYvSEWMT36kw1pAsF3pvdrV5LafeZsiSHFA9n8dF9RqEBhJFfSZPSfVZeeoCiC" ], "script": "base64:BgK7BAgCEgMKAQgSAwoBARIDCgEIEgMKAQgiA1NFUCIEam9pbiICYXIiDmtleUluaXRpYWxpemVkIhVrZXlDb29yZGluYXRvckFkZHJlc3MiEmtleVZlcmlmaWVyQWRkcmVzcyIMa2V5RWFzdEFzc2V0IglrZXlTaWduZWQiCF9hZGRyZXNzIgVfdHhJZCIRa2V5UHJvdG9jb2xBY3RpdmUiDWlzSW5pdGlhbGl6ZWQiD211c3RJbml0aWFsaXplZCISbXVzdE5vdEluaXRpYWxpemVkIghtdXN0U2VsZiIBaSILY29vcmRpbmF0b3IiCHZlcmlmaWVyIgckbWF0Y2gwIgFzIg9nZXRFYXN0QXNzZXRTdHIiDGdldEVhc3RBc3NldCIIaXNBY3RpdmUiCm11c3RBY3RpdmUiDGNoZWNrQWRkcmVzcyIHYWRkcmVzcyIKQVNTRVRfTkFNRSILREVTQ1JJUFRJT04iEWtleUFsbG93ZWRBZGRyZXNzIhBpc0FkZHJlc3NFbmFibGVkIhJtdXN0QWxsb3dlZEFkZHJlc3MiEGNhbGxlckFkZHJlc3NTdHIiCWlzRW5hYmxlZCITY2hlY2tBZGRyZXNzRW5hYmxlZCIUY2hlY2tBZGRyZXNzRGlzYWJsZWQiE19jb29yZGluYXRvckFkZHJlc3MiBmNoZWNrcyIEZWFzdCILZWFzdEFzc2V0SWQiC19lYXN0QW1vdW50IgllYXN0QXNzZXQiAnR4IgZ2ZXJpZnkaAAFhAgJfXwEBYgEBYwkAuQkCBQFjBQFhAQFkAAkBAWIBCQDMCAICAiVzCQDMCAICC2luaXRpYWxpemVkBQNuaWwBAWUACQEBYgEJAMwIAgICJXMJAMwIAgISY29vcmRpbmF0b3JBZGRyZXNzBQNuaWwBAWYACQEBYgEJAMwIAgICJXMJAMwIAgIPdmVyaWZpZXJBZGRyZXNzBQNuaWwBAWcACQEBYgEJAMwIAgICJXMJAMwIAgIJZWFzdEFzc2V0BQNuaWwBAWgCAWkBagkBAWIBCQDMCAICBiVzJXMlcwkAzAgCAgZzaWduZWQJAMwIAgUBaQkAzAgCBQFqBQNuaWwBAWsACQEBYgEJAMwIAgICJXMJAMwIAgIOcHJvdG9jb2xBY3RpdmUFA25pbAEBbAAJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwkBAWQABwEBbQADCQEBIQEJAQFsAAkAAgECD05vdCBpbml0aWFsaXplZAUEdW5pdAEBbgADCQEBbAAJAAIBAhNBbHJlYWR5IGluaXRpYWxpemVkBQR1bml0AQFvAQFwAwkBAiE9AggFAXAGY2FsbGVyBQR0aGlzCQACAQIdT25seSBzZWxmIGludm9jYXRpb24gYWxsb3dlZC4FBHVuaXQBAXEACQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKIIAQkBAWUAAhZDb29yZGluYXRvciBpcyBub3Qgc2V0AQFyAAQBcwkAoggBCQEBZQADCQABAgUBcwIGU3RyaW5nBAF0BQFzCQCdCAIJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAXQJAQFmAAMJAAECBQFzAgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IBAXUACQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgkBAXEACQEBZwACFUVhc3QgYXNzZXQgaXMgbm90IHNldAEBdgAJANkEAQkBAXUAAQF3AAkBC3ZhbHVlT3JFbHNlAgkAmwgCCQEBcQAJAQFrAAcBAXgAAwMJAQEhAQkBAXcABgkBASEBCQEBbAAJAAIBAi1Qcm90b2NvbCBpcyBkaXNhYmxlZC4gUGxlYXNlIGNvbnRhY3Qgc3VwcG9ydC4FBHVuaXQBAXkBAWkEAXMJAKYIAQUBaQMJAAECBQFzAgdBZGRyZXNzBAF6BQFzBgMJAAECBQFzAgRVbml0CQACAQIPSW52YWxpZCBhZGRyZXNzCQACAQILTWF0Y2ggZXJyb3IAAUECBEVBU1QAAUICzgFFQVNUIOKAlCBFbnRlcnByaXNlIEFsZ29yaXRobWljIFN0YWJsZSBUb2tlbiBidWlsdCBvbiB0aGUgV2F2ZXMgRW50ZXJwcmlzZSBhbmQgV2F2ZXMgbWFpbm5ldC4gRW5zdXJlZCBib3RoIGJ5IHNpZ25pZmljYW50IG92ZXJjb2xsYXRlcmFsaXphdGlvbiBhbmQgd2VsbC1kZWZpbmVkIGxpcXVpZGF0aW9uIG1lY2hhbmlzbXMuIGh0dHBzOi8vZWFzdC5maW5hbmNlLwEBQwEBaQkBAWIBCQDMCAICBCVzJXMJAMwIAgIOYWxsb3dlZEFkZHJlc3MJAMwIAgUBaQUDbmlsAQFEAQFpCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAQFDAQUBaQcBAUUBAXAEAUYJANgEAQgIBQFwBmNhbGxlcgVieXRlcwQBRwkBAUQBBQFGAwUBRwUEdW5pdAkAAgEJAKwCAgkArAICCQCsAgICGFVua25vd24gY2FsbGVyIGFkZHJlc3MuIAkApQgBCAUBcAZjYWxsZXICASAJANgEAQgIBQFwBmNhbGxlcgVieXRlcwEBSAEBaQMJAQFEAQUBaQUEdW5pdAkAAgECGEFkZHJlc3MgYWxyZWFkeSBkaXNhYmxlZAEBSQEBaQMJAQFEAQUBaQkAAgECF0FkZHJlc3MgYWxyZWFkeSBlbmFibGVkBQR1bml0BAFwAQppbml0aWFsaXplAQFKBAFLCQDMCAIJAQFuAAkAzAgCCQEBeQEFAUoFA25pbAMJAAACBQFLBQFLBAFMCQDDCAcFAUEFAUIAAAAGBgUEdW5pdAAABAFNCQC4CAEFAUwJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAWUABQFKCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFnAAkA2AQBBQFNCQDMCAIJAQxCb29sZWFuRW50cnkCCQEBZAAGCQDMCAIFAUwFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFwAQVpc3N1ZQEBTgQBSwkAzAgCCQEBeAAJAMwIAgkBAUUBBQFwBQNuaWwDCQAAAgUBSwUBSwQBTwkBAXYACQDMCAIJAQdSZWlzc3VlAwUBTwUBTgYJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAXAGY2FsbGVyBQFOBQFPBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BcAEKYWRkQWRkcmVzcwEBaQQBSwkAzAgCCQEBbQAJAMwIAgkBAW8BBQFwCQDMCAIJAQF5AQUBaQkAzAgCCQEBSQEFAWkFA25pbAMJAAACBQFLBQFLCQDMCAIJAQxCb29sZWFuRW50cnkCCQEBQwEFAWkGBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BcAENcmVtb3ZlQWRkcmVzcwEBaQQBSwkAzAgCCQEBbQAJAMwIAgkBAW8BBQFwCQDMCAIJAQF5AQUBaQkAzAgCCQEBSAEFAWkFA25pbAMJAAACBQFLBQFLCQDMCAIJAQxCb29sZWFuRW50cnkCCQEBQwEFAWkHBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAVABAVEABAFzCQEBcgADCQABAgUBcwIGU3RyaW5nBAF6BQFzCQELdmFsdWVPckVsc2UCCQCbCAIJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAXoJAQFoAgkApQgBBQR0aGlzCQDYBAEIBQFQAmlkBwkA9AMDCAUBUAlib2R5Qnl0ZXMJAJEDAggFAVAGcHJvb2ZzAAAIBQFQD3NlbmRlclB1YmxpY0tleSxM6eI=", "height": 2579396, "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 keyEastAsset () = join(["%s", "eastAsset"])
19+
20+
21+func keySigned (_address,_txId) = join(["%s%s%s", "signed", _address, _txId])
22+
23+
24+func keyProtocolActive () = join(["%s", "protocolActive"])
25+
26+
27+func isInitialized () = valueOrElse(getBoolean(this, keyInitialized()), false)
28+
29+
30+func mustInitialized () = if (!(isInitialized()))
31+ then throw("Not initialized")
32+ else unit
33+
34+
35+func mustNotInitialized () = if (isInitialized())
36+ then throw("Already initialized")
37+ else unit
38+
39+
40+func mustSelf (i) = if ((i.caller != this))
41+ then throw("Only self invocation allowed.")
42+ else unit
43+
44+
45+func coordinator () = addressFromStringValue(valueOrErrorMessage(getString(keyCoordinatorAddress()), "Coordinator is not set"))
46+
47+
48+func verifier () = match getString(keyCoordinatorAddress()) {
49+ case s: String =>
50+ getString(addressFromStringValue(s), keyVerifierAddress())
51+ case _: Unit =>
52+ unit
53+ case _ =>
54+ throw("Match error")
55+}
56+
57+
58+func getEastAssetStr () = valueOrErrorMessage(getString(coordinator(), keyEastAsset()), "East asset is not set")
59+
60+
61+func getEastAsset () = fromBase58String(getEastAssetStr())
62+
63+
64+func isActive () = valueOrElse(getBoolean(coordinator(), keyProtocolActive()), false)
65+
66+
67+func mustActive () = if (if (!(isActive()))
68+ then true
69+ else !(isInitialized()))
70+ then throw("Protocol is disabled. Please contact support.")
71+ else unit
72+
73+
74+func checkAddress (_address) = match addressFromString(_address) {
75+ case address: Address =>
76+ true
77+ case _: Unit =>
78+ throw("Invalid address")
79+ case _ =>
80+ throw("Match error")
81+}
82+
83+
84+let ASSET_NAME = "EAST"
85+
86+let DESCRIPTION = "EAST — Enterprise Algorithmic Stable Token built on the Waves Enterprise and Waves mainnet. Ensured both by significant overcollateralization and well-defined liquidation mechanisms. https://east.finance/"
87+
88+func keyAllowedAddress (_address) = join(["%s%s", "allowedAddress", _address])
89+
90+
91+func isAddressEnabled (_address) = valueOrElse(getBoolean(this, keyAllowedAddress(_address)), false)
92+
93+
94+func mustAllowedAddress (i) = {
95+ let callerAddressStr = toBase58String(i.caller.bytes)
96+ let isEnabled = isAddressEnabled(callerAddressStr)
97+ if (isEnabled)
98+ then unit
99+ else throw(((("Unknown caller address. " + toString(i.caller)) + " ") + toBase58String(i.caller.bytes)))
100+ }
101+
102+
103+func checkAddressEnabled (_address) = if (isAddressEnabled(_address))
104+ then unit
105+ else throw("Address already disabled")
106+
107+
108+func checkAddressDisabled (_address) = if (isAddressEnabled(_address))
109+ then throw("Address already enabled")
110+ else unit
111+
112+
113+@Callable(i)
114+func initialize (_coordinatorAddress) = {
115+ let checks = [mustNotInitialized(), checkAddress(_coordinatorAddress)]
116+ if ((checks == checks))
117+ then {
118+ let east = Issue(ASSET_NAME, DESCRIPTION, 0, 6, true, unit, 0)
119+ let eastAssetId = calculateAssetId(east)
120+[StringEntry(keyCoordinatorAddress(), _coordinatorAddress), StringEntry(keyEastAsset(), toBase58String(eastAssetId)), BooleanEntry(keyInitialized(), true), east]
121+ }
122+ else throw("Strict value is not equal to itself.")
123+ }
124+
125+
126+
127+@Callable(i)
128+func issue (_eastAmount) = {
129+ let checks = [mustActive(), mustAllowedAddress(i)]
130+ if ((checks == checks))
131+ then {
132+ let eastAsset = getEastAsset()
133+[Reissue(eastAsset, _eastAmount, true), ScriptTransfer(i.caller, _eastAmount, eastAsset)]
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/c3f4982 
22.73 ms