tx · HhSCi9Vd6CumoZvqaxVt4VS5zpmquQV7RTFUFZUf26vm 3N9pfmX4sH1bKuohmPdggVCFMy6c2iC3Mw2: -0.05000000 Waves 2023.05.15 20:39 [2579391] smart account 3N9pfmX4sH1bKuohmPdggVCFMy6c2iC3Mw2 > SELF 0.00000000 Waves
{ "type": 13, "id": "HhSCi9Vd6CumoZvqaxVt4VS5zpmquQV7RTFUFZUf26vm", "fee": 5000000, "feeAssetId": null, "timestamp": 1684172392640, "version": 2, "chainId": 84, "sender": "3N9pfmX4sH1bKuohmPdggVCFMy6c2iC3Mw2", "senderPublicKey": "7DsETusJ9kRt9q7Me2mjMpd2ZMkxHHnLmBRGZXfc8zen", "proofs": [ "iFQNFNA2TSBnonPoSKokJRCLVRwyBAJcntfEfGxsXnF59krqt7VNpyrQpTBPs27t9fmE8iWaEVpX5YVbrjG2x1t" ], "script": "base64:BgLCBAgCEgMKAQgSAwoBARIDCgEIEgMKAQgiA1NFUCIEam9pbiICYXIiDmtleUluaXRpYWxpemVkIhVrZXlDb29yZGluYXRvckFkZHJlc3MiEmtleVZlcmlmaWVyQWRkcmVzcyIJa2V5U2lnbmVkIghfYWRkcmVzcyIFX3R4SWQiEWtleVByb3RvY29sQWN0aXZlIg1pc0luaXRpYWxpemVkIg9tdXN0SW5pdGlhbGl6ZWQiEm11c3ROb3RJbml0aWFsaXplZCIIbXVzdFNlbGYiAWkiC2Nvb3JkaW5hdG9yIgh2ZXJpZmllciIHJG1hdGNoMCIBcyIIaXNBY3RpdmUiCm11c3RBY3RpdmUiDGNoZWNrQWRkcmVzcyIHYWRkcmVzcyIKQVNTRVRfTkFNRSILREVTQ1JJUFRJT04iEWtleUFsbG93ZWRBZGRyZXNzIhBpc0FkZHJlc3NFbmFibGVkIhJtdXN0QWxsb3dlZEFkZHJlc3MiEGNhbGxlckFkZHJlc3NTdHIiCWlzRW5hYmxlZCITY2hlY2tBZGRyZXNzRW5hYmxlZCIUY2hlY2tBZGRyZXNzRGlzYWJsZWQiDWtleU5vcnRoQXNzZXQiEGdldE5vcnRoQXNzZXRTdHIiDWdldE5vcnRoQXNzZXQiE19jb29yZGluYXRvckFkZHJlc3MiBmNoZWNrcyIFbm9ydGgiDG5vcnRoQXNzZXRJZCIMX25vcnRoQW1vdW50Igpub3J0aEFzc2V0IgJ0eCIGdmVyaWZ5GgABYQICX18BAWIBAWMJALkJAgUBYwUBYQEBZAAJAQFiAQkAzAgCAgIlcwkAzAgCAgtpbml0aWFsaXplZAUDbmlsAQFlAAkBAWIBCQDMCAICAiVzCQDMCAICEmNvb3JkaW5hdG9yQWRkcmVzcwUDbmlsAQFmAAkBAWIBCQDMCAICAiVzCQDMCAICD3ZlcmlmaWVyQWRkcmVzcwUDbmlsAQFnAgFoAWkJAQFiAQkAzAgCAgYlcyVzJXMJAMwIAgIGc2lnbmVkCQDMCAIFAWgJAMwIAgUBaQUDbmlsAQFqAAkBAWIBCQDMCAICAiVzCQDMCAICDnByb3RvY29sQWN0aXZlBQNuaWwBAWsACQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAQFkAAcBAWwAAwkBASEBCQEBawAJAAIBAg9Ob3QgaW5pdGlhbGl6ZWQFBHVuaXQBAW0AAwkBAWsACQACAQITQWxyZWFkeSBpbml0aWFsaXplZAUEdW5pdAEBbgEBbwMJAQIhPQIIBQFvBmNhbGxlcgUEdGhpcwkAAgECHU9ubHkgc2VsZiBpbnZvY2F0aW9uIGFsbG93ZWQuBQR1bml0AQFwAAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAEJAQFlAAIWQ29vcmRpbmF0b3IgaXMgbm90IHNldAEBcQAEAXIJAKIIAQkBAWUAAwkAAQIFAXICBlN0cmluZwQBcwUBcgkAnQgCCQERQGV4dHJOYXRpdmUoMTA2MikBBQFzCQEBZgADCQABAgUBcgIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yAQF0AAkBC3ZhbHVlT3JFbHNlAgkAmwgCCQEBcAAJAQFqAAcBAXUAAwMJAQEhAQkBAXQABgkBASEBCQEBawAJAAIBAi1Qcm90b2NvbCBpcyBkaXNhYmxlZC4gUGxlYXNlIGNvbnRhY3Qgc3VwcG9ydC4FBHVuaXQBAXYBAWgEAXIJAKYIAQUBaAMJAAECBQFyAgdBZGRyZXNzBAF3BQFyBgMJAAECBQFyAgRVbml0CQACAQIPSW52YWxpZCBhZGRyZXNzCQACAQILTWF0Y2ggZXJyb3IAAXgCBk9SSUVOVAABeQJOT1JJRU5UIGlzIGFuIGFkZGl0aW9uYWwgaW5jZW50aXZlIGZvciBFQVNUIGFjdGl2ZSB1c2VycyBhbmQgZ292ZXJuYW5jZSB0b2tlbnMuAQF6AQFoCQEBYgEJAMwIAgIEJXMlcwkAzAgCAg5hbGxvd2VkQWRkcmVzcwkAzAgCBQFoBQNuaWwBAUEBAWgJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwkBAXoBBQFoBwEBQgEBbwQBQwkA2AQBCAgFAW8GY2FsbGVyBWJ5dGVzBAFECQEBQQEFAUMDBQFEBQR1bml0CQACAQkArAICCQCsAgIJAKwCAgIYVW5rbm93biBjYWxsZXIgYWRkcmVzcy4gCQClCAEIBQFvBmNhbGxlcgIBIAkA2AQBCAgFAW8GY2FsbGVyBWJ5dGVzAQFFAQFoAwkBAUEBBQFoBQR1bml0CQACAQIYQWRkcmVzcyBhbHJlYWR5IGRpc2FibGVkAQFGAQFoAwkBAUEBBQFoCQACAQIXQWRkcmVzcyBhbHJlYWR5IGVuYWJsZWQFBHVuaXQBAUcACQEBYgEJAMwIAgICJXMJAMwIAgIKbm9ydGhBc3NldAUDbmlsAQFIAAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAQFHAAIWTm9ydGggYXNzZXQgaXMgbm90IHNldAEBSQAJANkEAQkBAUgABAFvAQppbml0aWFsaXplAQFKBAFLCQDMCAIJAQFtAAkAzAgCCQEBdgEFAUoFA25pbAMJAAACBQFLBQFLBAFMCQDDCAcFAXgFAXkAAAAIBgUEdW5pdAAABAFNCQC4CAEFAUwJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAWUABQFKCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFHAAkA2AQBBQFNCQDMCAIJAQxCb29sZWFuRW50cnkCCQEBZAAGCQDMCAIFAUwFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFvAQVpc3N1ZQEBTgQBSwkAzAgCCQEBdQAJAMwIAgkBAUIBBQFvBQNuaWwDCQAAAgUBSwUBSwQBTwkBAUkACQDMCAIJAQdSZWlzc3VlAwUBTwUBTgYJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAW8GY2FsbGVyBQFOBQFPBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BbwEKYWRkQWRkcmVzcwEBaAQBSwkAzAgCCQEBbAAJAMwIAgkBAW4BBQFvCQDMCAIJAQF2AQUBaAkAzAgCCQEBRgEFAWgFA25pbAMJAAACBQFLBQFLCQDMCAIJAQxCb29sZWFuRW50cnkCCQEBegEFAWgGBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BbwENcmVtb3ZlQWRkcmVzcwEBaAQBSwkAzAgCCQEBbAAJAMwIAgkBAW4BBQFvCQDMCAIJAQF2AQUBaAkAzAgCCQEBRQEFAWgFA25pbAMJAAACBQFLBQFLCQDMCAIJAQxCb29sZWFuRW50cnkCCQEBegEFAWgHBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAVABAVEABAFyCQEBcQADCQABAgUBcgIGU3RyaW5nBAF3BQFyCQELdmFsdWVPckVsc2UCCQCbCAIJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAXcJAQFnAgkApQgBBQR0aGlzCQDYBAEIBQFQAmlkBwkA9AMDCAUBUAlib2R5Qnl0ZXMJAJEDAggFAVAGcHJvb2ZzAAAIBQFQD3NlbmRlclB1YmxpY0tleUVQlRE=", "height": 2579391, "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 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/169f3d6 40.33 ms ◑![]()