tx · 3mLrEyZ1EP2zHrxWsj6SENQM18d1FVDMN85HDvi1B9wU

3My5T5LFFZoBKWquCciNddKbBioxyaNxiTm:  -0.01000000 Waves

2024.03.22 14:46 [3029201] smart account 3My5T5LFFZoBKWquCciNddKbBioxyaNxiTm > SELF 0.00000000 Waves

{ "type": 13, "id": "3mLrEyZ1EP2zHrxWsj6SENQM18d1FVDMN85HDvi1B9wU", "fee": 1000000, "feeAssetId": null, "timestamp": 1711108079497, "version": 2, "chainId": 84, "sender": "3My5T5LFFZoBKWquCciNddKbBioxyaNxiTm", "senderPublicKey": "2Z7jSeYihgvqrswc4rPBYdDo2MY4nQYaiRMVnt6rToBt", "proofs": [ "2ifzNaNcz4vFeeTGmm39UErrd7SSYat6ELy6QYvxt1SM8JcZ4NRqeSWHp6XSrUaafjESpq4RNwZqJKWmq7Wv7DXt" ], "script": "base64:BgIjCAISBAoCGAESAwoBCBIDCgEIEgMKAQESBAoCCAgSBAoCCAgIAAlTRVBBUkFUT1ICAl9fAAxLRVlfTVVMVElTSUcCCE1VTFRJU0lHAA9LRVlfUFVCTElDX0tFWVMCC1BVQkxJQ19LRVlTAApLRVlfUVVPUlVNAgZRVU9SVU0AC0tFWV9DT05GSVJNAgdDT05GSVJNAApLRVlfU1RBVFVTAgZTVEFUVVMBEF92YWxpZGF0ZUFkZHJlc3MBCGFkZHJlc3NfBAckbWF0Y2gwCQCmCAEFCGFkZHJlc3NfAwkAAQIFByRtYXRjaDACB0FkZHJlc3MEAWEFByRtYXRjaDAGBwEOX3ZhbGlkYXRlT3duZXICBGFjY18FZWxlbV8DCQAAAgUFZWxlbV8CAAkAAgECDWludmFsaWQgb3duZXIDCQECIT0CCQDIAQEJANkEAQUFZWxlbV8AIAkAAgECGGludmFsaWQgb3duZXIgcHVibGljIGtleQUEYWNjXwYBaQEEaW5pdAIHb3duZXJzXwdxdW9ydW1fBANlcnIDCQEJaXNEZWZpbmVkAQkAoggBBQxLRVlfTVVMVElTSUcJAAIBAhlpbml0OiBhbHJlYWR5IGluaXRpYWxpemVkBQR1bml0AwkAAAIFA2VycgUDZXJyBARlcnIxAwMJAGcCAAAJAJADAQUHb3duZXJzXwYJAGYCCQCQAwEFB293bmVyc18ACgkAAgECFGluaXQ6IGludmFsaWQgb3duZXJzAwMJAGcCAAAFB3F1b3J1bV8GCQBmAgUHcXVvcnVtXwkAkAMBBQdvd25lcnNfCQACAQIUaW5pdDogaW52YWxpZCBxdW9ydW0FBHVuaXQDCQAAAgUEZXJyMQUEZXJyMQQEZXJyMgoAAiRsBQdvd25lcnNfCgACJHMJAJADAQUCJGwKAAUkYWNjMAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQ5fdmFsaWRhdGVPd25lcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgMJAAACBQRlcnIyBQRlcnIyCQCUCgIJAMwIAgkBC1N0cmluZ0VudHJ5AgUMS0VZX01VTFRJU0lHCQClCAEFBHRoaXMJAMwIAgkBC1N0cmluZ0VudHJ5AgUPS0VZX1BVQkxJQ19LRVlTCQC5CQIFB293bmVyc18FCVNFUEFSQVRPUgkAzAgCCQEMSW50ZWdlckVudHJ5AgUKS0VZX1FVT1JVTQUHcXVvcnVtXwUDbmlsBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCGFkZE93bmVyAQpwdWJsaWNLZXlfBApwdWJsaWNLZXlzCQERQGV4dHJOYXRpdmUoMTA1OCkBBQ9LRVlfUFVCTElDX0tFWVMEDnB1YmxpY0tleXNMaXN0CQC1CQIFCnB1YmxpY0tleXMFCVNFUEFSQVRPUgMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECFWFkZE93bmVyOiBub3QgYWxsb3dlZAMJAQIhPQIJAQ5fdmFsaWRhdGVPd25lcgIAAAUKcHVibGljS2V5XwAACQACAQIcYWRkT3duZXI6IGludmFsaWQgcHVibGljIGtleQMJAQ9jb250YWluc0VsZW1lbnQCBQ5wdWJsaWNLZXlzTGlzdAUKcHVibGljS2V5XwkAAgECImFkZE93bmVyOiBwdWJsaWMga2V5IGFscmVhZHkgYWRkZWQDCQAAAgkAkAMBBQ5wdWJsaWNLZXlzTGlzdAAKCQACAQIZYWRkT3duZXI6IHRvbyBtYW55IG93bmVycwQVcHVibGljS2V5c0xpc3RVcGRhdGVkCQDNCAIFDnB1YmxpY0tleXNMaXN0BQpwdWJsaWNLZXlfBBFwdWJsaWNLZXlzVXBkYXRlZAkAzAgCCQELU3RyaW5nRW50cnkCBQ9LRVlfUFVCTElDX0tFWVMJALkJAgUVcHVibGljS2V5c0xpc3RVcGRhdGVkBQlTRVBBUkFUT1IFA25pbAkAlAoCBRFwdWJsaWNLZXlzVXBkYXRlZAUEdW5pdAFpAQtyZW1vdmVPd25lcgEKcHVibGljS2V5XwQGcXVvcnVtCQERQGV4dHJOYXRpdmUoMTA1NSkBBQpLRVlfUVVPUlVNBApwdWJsaWNLZXlzCQERQGV4dHJOYXRpdmUoMTA1OCkBBQ9LRVlfUFVCTElDX0tFWVMEDnB1YmxpY0tleXNMaXN0CQC1CQIFCnB1YmxpY0tleXMFCVNFUEFSQVRPUgMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECGHJlbW92ZU93bmVyOiBub3QgYWxsb3dlZAMJAAACBQpwdWJsaWNLZXlfAgAJAAIBAh9yZW1vdmVPd25lcjogaW52YWxpZCBwdWJsaWMga2V5AwkAAAIJAJADAQUOcHVibGljS2V5c0xpc3QAAQkAAgECG3JlbW92ZU93bmVyOiB0b28gZmV3IG93bmVycwQFaW5kZXgEByRtYXRjaDAJAM8IAgUOcHVibGljS2V5c0xpc3QFCnB1YmxpY0tleV8DCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhCQACAQIacmVtb3ZlT3duZXI6IG5vIHN1Y2ggb3duZXIEFXB1YmxpY0tleXNMaXN0VXBkYXRlZAkA0QgCBQ5wdWJsaWNLZXlzTGlzdAUFaW5kZXgEEXB1YmxpY0tleXNVcGRhdGVkCQDMCAIJAQtTdHJpbmdFbnRyeQIFD0tFWV9QVUJMSUNfS0VZUwkAuQkCBRVwdWJsaWNLZXlzTGlzdFVwZGF0ZWQFCVNFUEFSQVRPUgUDbmlsBA1xdW9ydW1VcGRhdGVkAwkAZgIFBnF1b3J1bQkAkAMBBRVwdWJsaWNLZXlzTGlzdFVwZGF0ZWQJAMwIAgkBDEludGVnZXJFbnRyeQIFCktFWV9RVU9SVU0JAJADAQUVcHVibGljS2V5c0xpc3RVcGRhdGVkBQNuaWwFA25pbAkAlAoCCQDOCAIFEXB1YmxpY0tleXNVcGRhdGVkBQ1xdW9ydW1VcGRhdGVkBQR1bml0AWkBCXNldFF1b3J1bQEHcXVvcnVtXwQKcHVibGljS2V5cwkBEUBleHRyTmF0aXZlKDEwNTgpAQUPS0VZX1BVQkxJQ19LRVlTBA5wdWJsaWNLZXlzTGlzdAkAtQkCBQpwdWJsaWNLZXlzBQlTRVBBUkFUT1IDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhZzZXRRdW9ydW06IG5vdCBhbGxvd2VkAwMJAGcCAAAFB3F1b3J1bV8GCQBmAgUHcXVvcnVtXwkAkAMBBQ5wdWJsaWNLZXlzTGlzdAkAAgECGXNldFF1b3J1bTogaW52YWxpZCBxdW9ydW0JAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgUKS0VZX1FVT1JVTQUHcXVvcnVtXwUDbmlsBQR1bml0AWkBEmNvbmZpcm1UcmFuc2FjdGlvbgIFZGFwcF8FdHhJZF8ED2NhbGxlclB1YmxpY0tleQkA2AQBCAUBaQ9jYWxsZXJQdWJsaWNLZXkEBnF1b3J1bQkBEUBleHRyTmF0aXZlKDEwNTUpAQUKS0VZX1FVT1JVTQQKcHVibGljS2V5cwkBEUBleHRyTmF0aXZlKDEwNTgpAQUPS0VZX1BVQkxJQ19LRVlTBA5wdWJsaWNLZXlzTGlzdAkAtQkCBQpwdWJsaWNLZXlzBQlTRVBBUkFUT1IEEGNvbmZpcm1hdGlvbnNLZXkJALkJAgkAzAgCBQtLRVlfQ09ORklSTQkAzAgCBQVkYXBwXwkAzAgCBQV0eElkXwUDbmlsBQlTRVBBUkFUT1IEDWNvbmZpcm1hdGlvbnMJAQt2YWx1ZU9yRWxzZQIJAKIIAQUQY29uZmlybWF0aW9uc0tleQIABAlzdGF0dXNLZXkJALkJAgkAzAgCBQpLRVlfU1RBVFVTCQDMCAIFBWRhcHBfCQDMCAIFBXR4SWRfBQNuaWwFCVNFUEFSQVRPUgQDZXJyAwkBASEBCQEPY29udGFpbnNFbGVtZW50AgUOcHVibGljS2V5c0xpc3QFD2NhbGxlclB1YmxpY0tleQkAAgECHmNvbmZpcm1UcmFuc2FjdGlvbjogb25seSBhZG1pbgMJAQIhPQIJAMgBAQkA2QQBBQV0eElkXwAgCQACAQIgY29uZmlybVRyYW5zYWN0aW9uOiBpbnZhbGlkIHR4SWQDCQEBIQEJARBfdmFsaWRhdGVBZGRyZXNzAQUFZGFwcF8JAAIBAihjb25maXJtVHJhbnNhY3Rpb246IGludmFsaWQgZGFwcCBhZGRyZXNzAwkBCGNvbnRhaW5zAgUNY29uZmlybWF0aW9ucwUPY2FsbGVyUHVibGljS2V5CQACAQIlY29uZmlybVRyYW5zYWN0aW9uOiBhbHJlYWR5IGNvbmZpcm1lZAUEdW5pdAMJAAACBQNlcnIFA2VycgQSY29uZmlybWF0aW9uc0NvdW50CQBkAgABAwkAAAIFDWNvbmZpcm1hdGlvbnMCAAAACQCQAwEJALUJAgUNY29uZmlybWF0aW9ucwUJU0VQQVJBVE9SBBRjb25maXJtYXRpb25zVXBkYXRlZAMJAAACBQ1jb25maXJtYXRpb25zAgAFD2NhbGxlclB1YmxpY0tleQkArAICCQCsAgIFDWNvbmZpcm1hdGlvbnMFCVNFUEFSQVRPUgUPY2FsbGVyUHVibGljS2V5CQCUCgIJAMwIAgkBC1N0cmluZ0VudHJ5AgUQY29uZmlybWF0aW9uc0tleQUUY29uZmlybWF0aW9uc1VwZGF0ZWQJAMwIAgkBDEJvb2xlYW5FbnRyeQIFCXN0YXR1c0tleQkAZwIFEmNvbmZpcm1hdGlvbnNDb3VudAUGcXVvcnVtBQNuaWwFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEScmV2b2tlQ29uZmlybWF0aW9uAgVkYXBwXwV0eElkXwQPY2FsbGVyUHVibGljS2V5CQDYBAEIBQFpD2NhbGxlclB1YmxpY0tleQQGcXVvcnVtCQERQGV4dHJOYXRpdmUoMTA1NSkBBQpLRVlfUVVPUlVNBApwdWJsaWNLZXlzCQERQGV4dHJOYXRpdmUoMTA1OCkBBQ9LRVlfUFVCTElDX0tFWVMEDnB1YmxpY0tleXNMaXN0CQC1CQIFCnB1YmxpY0tleXMFCVNFUEFSQVRPUgQQY29uZmlybWF0aW9uc0tleQkAuQkCCQDMCAIFC0tFWV9DT05GSVJNCQDMCAIFBWRhcHBfCQDMCAIFBXR4SWRfBQNuaWwFCVNFUEFSQVRPUgQNY29uZmlybWF0aW9ucwkBC3ZhbHVlT3JFbHNlAgkAoggBBRBjb25maXJtYXRpb25zS2V5AgAEEWNvbmZpcm1hdGlvbnNMaXN0CQC1CQIFDWNvbmZpcm1hdGlvbnMFCVNFUEFSQVRPUgQJc3RhdHVzS2V5CQC5CQIJAMwIAgUKS0VZX1NUQVRVUwkAzAgCBQVkYXBwXwkAzAgCBQV0eElkXwUDbmlsBQlTRVBBUkFUT1IEBnN0YXR1cwkBC3ZhbHVlT3JFbHNlAgkAoAgBBQlzdGF0dXNLZXkHBANlcnIDCQEBIQEJAQ9jb250YWluc0VsZW1lbnQCBQ5wdWJsaWNLZXlzTGlzdAUPY2FsbGVyUHVibGljS2V5CQACAQIecmV2b2tlQ29uZmlybWF0aW9uOiBvbmx5IGFkbWluAwkBAiE9AgkAyAEBCQDZBAEFBXR4SWRfACAJAAIBAiByZXZva2VDb25maXJtYXRpb246IGludmFsaWQgdHhJZAMJAQEhAQkBEF92YWxpZGF0ZUFkZHJlc3MBBQVkYXBwXwkAAgECKHJldm9rZUNvbmZpcm1hdGlvbjogaW52YWxpZCBkYXBwIGFkZHJlc3MDCQEBIQEJAQ9jb250YWluc0VsZW1lbnQCBRFjb25maXJtYXRpb25zTGlzdAUPY2FsbGVyUHVibGljS2V5CQACAQIhcmV2b2tlQ29uZmlybWF0aW9uOiBub3QgY29uZmlybWVkAwUGc3RhdHVzCQACAQIqcmV2b2tlQ29uZmlybWF0aW9uOiBxdW9ydW0gYWxyZWFkeSByZWFjaGVkBQR1bml0AwkAAAIFA2VycgUDZXJyBBhjb25maXJtYXRpb25zTGlzdFVwZGF0ZWQJANEIAgURY29uZmlybWF0aW9uc0xpc3QJAQV2YWx1ZQEJAM8IAgURY29uZmlybWF0aW9uc0xpc3QFD2NhbGxlclB1YmxpY0tleQQSY29uZmlybWF0aW9uc0NvdW50CQCQAwEFGGNvbmZpcm1hdGlvbnNMaXN0VXBkYXRlZAkAlAoCCQDMCAIJAQtTdHJpbmdFbnRyeQIFEGNvbmZpcm1hdGlvbnNLZXkJALkJAgUYY29uZmlybWF0aW9uc0xpc3RVcGRhdGVkBQlTRVBBUkFUT1IJAMwIAgkBDEJvb2xlYW5FbnRyeQIFCXN0YXR1c0tleQkAZwIFEmNvbmZpcm1hdGlvbnNDb3VudAUGcXVvcnVtBQNuaWwFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAnR4AQZ2ZXJpZnkABAckbWF0Y2gwCQCiCAEFDEtFWV9NVUxUSVNJRwMJAAECBQckbWF0Y2gwAgZTdHJpbmcECG11bHRpc2lnBQckbWF0Y2gwCQELdmFsdWVPckVsc2UCCQCbCAIJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCG11bHRpc2lnCQC5CQIJAMwIAgUKS0VZX1NUQVRVUwkAzAgCCQClCAEFBHRoaXMJAMwIAgkA2AQBCAUCdHgCaWQFA25pbAUJU0VQQVJBVE9SBwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAgFAnR4D3NlbmRlclB1YmxpY0tledsxC/w=", "height": 3029201, "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 a = "__"
5+
6+let b = "MULTISIG"
7+
8+let c = "PUBLIC_KEYS"
9+
10+let d = "QUORUM"
11+
12+let e = "CONFIRM"
13+
14+let f = "STATUS"
15+
16+func g (h) = {
17+ let i = addressFromString(h)
18+ if ($isInstanceOf(i, "Address"))
19+ then {
20+ let j = i
21+ true
22+ }
23+ else false
24+ }
25+
26+
27+func k (l,m) = if ((m == ""))
28+ then throw("invalid owner")
29+ else if ((size(fromBase58String(m)) != 32))
30+ then throw("invalid owner public key")
31+ else l
32+
33+
34+@Callable(n)
35+func init (o,p) = {
36+ let q = if (isDefined(getString(b)))
37+ then throw("init: already initialized")
38+ else unit
39+ if ((q == q))
40+ then {
41+ let r = if (if ((0 >= size(o)))
42+ then true
43+ else (size(o) > 10))
44+ then throw("init: invalid owners")
45+ else if (if ((0 >= p))
46+ then true
47+ else (p > size(o)))
48+ then throw("init: invalid quorum")
49+ else unit
50+ if ((r == r))
51+ then {
52+ let s = {
53+ let t = o
54+ let u = size(t)
55+ let v = 0
56+ func w (x,y) = if ((y >= u))
57+ then x
58+ else k(x, t[y])
59+
60+ func z (x,y) = if ((y >= u))
61+ then x
62+ else throw("List size exceeds 10")
63+
64+ z(w(w(w(w(w(w(w(w(w(w(v, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
65+ }
66+ if ((s == s))
67+ then $Tuple2([StringEntry(b, toString(this)), StringEntry(c, makeString(o, a)), IntegerEntry(d, p)], unit)
68+ else throw("Strict value is not equal to itself.")
69+ }
70+ else throw("Strict value is not equal to itself.")
71+ }
72+ else throw("Strict value is not equal to itself.")
73+ }
74+
75+
76+
77+@Callable(n)
78+func addOwner (A) = {
79+ let B = getStringValue(c)
80+ let C = split(B, a)
81+ if ((n.caller != this))
82+ then throw("addOwner: not allowed")
83+ else if ((k(0, A) != 0))
84+ then throw("addOwner: invalid public key")
85+ else if (containsElement(C, A))
86+ then throw("addOwner: public key already added")
87+ else if ((size(C) == 10))
88+ then throw("addOwner: too many owners")
89+ else {
90+ let D = (C :+ A)
91+ let E = [StringEntry(c, makeString(D, a))]
92+ $Tuple2(E, unit)
93+ }
94+ }
95+
96+
97+
98+@Callable(n)
99+func removeOwner (A) = {
100+ let F = getIntegerValue(d)
101+ let B = getStringValue(c)
102+ let C = split(B, a)
103+ if ((n.caller != this))
104+ then throw("removeOwner: not allowed")
105+ else if ((A == ""))
106+ then throw("removeOwner: invalid public key")
107+ else if ((size(C) == 1))
108+ then throw("removeOwner: too few owners")
109+ else {
110+ let G = {
111+ let i = indexOf(C, A)
112+ if ($isInstanceOf(i, "Int"))
113+ then {
114+ let j = i
115+ j
116+ }
117+ else throw("removeOwner: no such owner")
118+ }
119+ let D = removeByIndex(C, G)
120+ let E = [StringEntry(c, makeString(D, a))]
121+ let H = if ((F > size(D)))
122+ then [IntegerEntry(d, size(D))]
123+ else nil
124+ $Tuple2((E ++ H), unit)
125+ }
126+ }
127+
128+
129+
130+@Callable(n)
131+func setQuorum (p) = {
132+ let B = getStringValue(c)
133+ let C = split(B, a)
134+ if ((n.caller != this))
135+ then throw("setQuorum: not allowed")
136+ else if (if ((0 >= p))
137+ then true
138+ else (p > size(C)))
139+ then throw("setQuorum: invalid quorum")
140+ else $Tuple2([IntegerEntry(d, p)], unit)
141+ }
142+
143+
144+
145+@Callable(n)
146+func confirmTransaction (I,J) = {
147+ let K = toBase58String(n.callerPublicKey)
148+ let F = getIntegerValue(d)
149+ let B = getStringValue(c)
150+ let C = split(B, a)
151+ let L = makeString([e, I, J], a)
152+ let M = valueOrElse(getString(L), "")
153+ let N = makeString([f, I, J], a)
154+ let q = if (!(containsElement(C, K)))
155+ then throw("confirmTransaction: only admin")
156+ else if ((size(fromBase58String(J)) != 32))
157+ then throw("confirmTransaction: invalid txId")
158+ else if (!(g(I)))
159+ then throw("confirmTransaction: invalid dapp address")
160+ else if (contains(M, K))
161+ then throw("confirmTransaction: already confirmed")
162+ else unit
163+ if ((q == q))
164+ then {
165+ let O = (1 + (if ((M == ""))
166+ then 0
167+ else size(split(M, a))))
168+ let P = if ((M == ""))
169+ then K
170+ else ((M + a) + K)
171+ $Tuple2([StringEntry(L, P), BooleanEntry(N, (O >= F))], unit)
172+ }
173+ else throw("Strict value is not equal to itself.")
174+ }
175+
176+
177+
178+@Callable(n)
179+func revokeConfirmation (I,J) = {
180+ let K = toBase58String(n.callerPublicKey)
181+ let F = getIntegerValue(d)
182+ let B = getStringValue(c)
183+ let C = split(B, a)
184+ let L = makeString([e, I, J], a)
185+ let M = valueOrElse(getString(L), "")
186+ let Q = split(M, a)
187+ let N = makeString([f, I, J], a)
188+ let R = valueOrElse(getBoolean(N), false)
189+ let q = if (!(containsElement(C, K)))
190+ then throw("revokeConfirmation: only admin")
191+ else if ((size(fromBase58String(J)) != 32))
192+ then throw("revokeConfirmation: invalid txId")
193+ else if (!(g(I)))
194+ then throw("revokeConfirmation: invalid dapp address")
195+ else if (!(containsElement(Q, K)))
196+ then throw("revokeConfirmation: not confirmed")
197+ else if (R)
198+ then throw("revokeConfirmation: quorum already reached")
199+ else unit
200+ if ((q == q))
201+ then {
202+ let S = removeByIndex(Q, value(indexOf(Q, K)))
203+ let O = size(S)
204+ $Tuple2([StringEntry(L, makeString(S, a)), BooleanEntry(N, (O >= F))], unit)
205+ }
206+ else throw("Strict value is not equal to itself.")
207+ }
208+
209+
210+@Verifier(T)
211+func U () = {
212+ let i = getString(b)
213+ if ($isInstanceOf(i, "String"))
214+ then {
215+ let V = i
216+ valueOrElse(getBoolean(addressFromStringValue(V), makeString([f, toString(this), toBase58String(T.id)], a)), false)
217+ }
218+ else sigVerify(T.bodyBytes, T.proofs[0], T.senderPublicKey)
219+ }
220+

github/deemru/w8io/169f3d6 
36.08 ms