tx · 3ty4Z8dBzpnzDbxsdozNQRw3bu6yY3SjnZP4cQLuxKee

3Mp8MKhxBFzzBhS6txZgmaD7xvsbZgLuhjB:  -0.01000000 Waves

2024.10.07 20:27 [3316721] smart account 3Mp8MKhxBFzzBhS6txZgmaD7xvsbZgLuhjB > SELF 0.00000000 Waves

{ "type": 13, "id": "3ty4Z8dBzpnzDbxsdozNQRw3bu6yY3SjnZP4cQLuxKee", "fee": 1000000, "feeAssetId": null, "timestamp": 1728322103134, "version": 2, "chainId": 84, "sender": "3Mp8MKhxBFzzBhS6txZgmaD7xvsbZgLuhjB", "senderPublicKey": "3NZ17UvGivxB5ADP36v9oJaxLoxqNCf9eTbqv9RMhug2", "proofs": [ "2kUwjFR3kwPtLPYckfWBacKpBGciqE94sH9iJarAyWfB6WWa7HxfZPYtxRmWXnV1NZZRiczvL2JEx7on684uUN5S" ], "script": "base64:BgITCAISAwoBCBIAEgMKAQgSAwoBARYBDHRyeUdldFN0cmluZwEDa2V5BAckbWF0Y2gwCQCdCAIFBHRoaXMFA2tleQMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAFAWECAAENdHJ5R2V0SW50ZWdlcgEDa2V5BAckbWF0Y2gwCQCaCAIFBHRoaXMFA2tleQMJAAECBQckbWF0Y2gwAgNJbnQEAWEFByRtYXRjaDAFAWEAAAEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCB2FkZHJlc3MDa2V5BAckbWF0Y2gwCQCdCAIFB2FkZHJlc3MFA2tleQMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAFAWECAAEJZ2V0T3JhY2xlAAkBB0FkZHJlc3MBCQDZBAEJAQx0cnlHZXRTdHJpbmcBAhRzdGF0aWNfb3JhY2xlQWRkcmVzcwERc3RhdGljX2VnZ0Fzc2V0SWQAAhFzdGF0aWNfZWdnQXNzZXRJZAEWc3RhdGljX2JhYnlEdWNrQWRkcmVzcwACFnN0YXRpY19iYWJ5RHVja0FkZHJlc3MBFXN0YXRpY19jb3Vwb25zQWRkcmVzcwACFXN0YXRpY19jb3Vwb25zQWRkcmVzcwENZ2V0RWdnQXNzZXRJZAAJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQAJARFzdGF0aWNfZWdnQXNzZXRJZAABEmdldEJhYnlkdWNrQWRkcmVzcwAJAQdBZGRyZXNzAQkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAkBFnN0YXRpY19iYWJ5RHVja0FkZHJlc3MAARFnZXRDb3Vwb25zQWRkcmVzcwAJAQdBZGRyZXNzAQkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAkBFXN0YXRpY19jb3Vwb25zQWRkcmVzcwABD2dldFRvdGFsQnVybktleQACFUJVUk5fVE9UQUxfQU1PVU5UX05FVwESZ2V0VG90YWxCdXJuS2V5T2xkAAIVQlVSTl9UT1RBTF9BTU9VTlRfT0xEAQ5nZXRMYXN0QnVybktleQACEEJVUk5fTEFTVF9BTU9VTlQBDmdldFVzZXJCdXJuS2V5AQdhZGRyZXNzCQCsAgIJAKwCAgIFQlVSTl8FB2FkZHJlc3MCC19BTU9VTlRfTkVXARFnZXRVc2VyQnVybktleU9sZAEHYWRkcmVzcwkArAICCQCsAgICBUJVUk5fBQdhZGRyZXNzAgtfQU1PVU5UX09MRAENZ2V0QnVybkJ5RGFwcAEHYWRkcmVzcwkArAICCQCsAgICCkJVUk5fREFQUF8FB2FkZHJlc3MCB19BTU9VTlQBFHRvdGFsRHVja2xpbmdzQnVybmVkAAIeQlVSTl9UT1RBTF9BTU9VTlRfRFVDS0xJTkdfTkVXARd0b3RhbER1Y2tsaW5nc0J1cm5lZE9sZAACHkJVUk5fVE9UQUxfQU1PVU5UX0RVQ0tMSU5HX09MRAEWZ2V0VXNlckJ1cm5EdWNrbGluZ0tleQEHYWRkcmVzcwkArAICCQCsAgICBUJVUk5fBQdhZGRyZXNzAhRfQU1PVU5UX0RVQ0tMSU5HX05FVwEZZ2V0VXNlckJ1cm5EdWNrbGluZ0tleU9sZAEHYWRkcmVzcwkArAICCQCsAgICBUJVUk5fBQdhZGRyZXNzAhRfQU1PVU5UX0RVQ0tMSU5HX09MRAEHZ2V0Qm9vbAEDa2V5BAckbWF0Y2gwCQCbCAIFBHRoaXMFA2tleQMJAAECBQckbWF0Y2gwAgdCb29sZWFuBAFiBQckbWF0Y2gwBQFiBwEJaXNUZXN0RW52AAkBB2dldEJvb2wBAgdURVNURU5WBAFpAQ9jb25maWd1cmVPcmFjbGUBBm9yYWNsZQMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECCmFkbWluIG9ubHkJAMwIAgkBC1N0cmluZ0VudHJ5AgIUc3RhdGljX29yYWNsZUFkZHJlc3MFBm9yYWNsZQUDbmlsAWkBFGJ1cm5BdHRhY2hlZFBheW1lbnRzAAQIcGF5bWVudHMIBQFpCHBheW1lbnRzAwkBAiE9AgkAkAMBBQhwYXltZW50cwABCQACAQIvQkFQOiBQbGVhc2UgbWFrZSBzdXJlIHRvIGF0dGFjaCBvbmx5IDEgcGF5bWVudCEECnBheW1lbnRFZ2cJAQV2YWx1ZQEJAJEDAgUIcGF5bWVudHMAAAMJAQIhPQIIBQpwYXltZW50RWdnB2Fzc2V0SWQJAQ1nZXRFZ2dBc3NldElkAAkAAgECHEJBUDogWW91IGNhbiBvbmx5IGJ1cm4gJEVHRyEEBmJ1cm5lcgkApQgBCAUBaQxvcmlnaW5DYWxsZXIEBmFtb3VudAgFCnBheW1lbnRFZ2cGYW1vdW50BBF0b3RhbEJ1cm5UaWxsRGF0ZQkBDXRyeUdldEludGVnZXIBCQEPZ2V0VG90YWxCdXJuS2V5AAQXdG90YWxCdXJuVGlsbERhdGVCeVVzZXIJAQ10cnlHZXRJbnRlZ2VyAQkBDmdldFVzZXJCdXJuS2V5AQUGYnVybmVyBApidXJuQnlEYXBwCQENdHJ5R2V0SW50ZWdlcgEJAQ1nZXRCdXJuQnlEYXBwAQkApQgBCAUBaQZjYWxsZXIJAMwIAgkBBEJ1cm4CCQENZ2V0RWdnQXNzZXRJZAAFBmFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBEmdldFRvdGFsQnVybktleU9sZAAFEXRvdGFsQnVyblRpbGxEYXRlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQERZ2V0VXNlckJ1cm5LZXlPbGQBBQZidXJuZXIFF3RvdGFsQnVyblRpbGxEYXRlQnlVc2VyCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEPZ2V0VG90YWxCdXJuS2V5AAkAZAIFEXRvdGFsQnVyblRpbGxEYXRlBQZhbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ5nZXRVc2VyQnVybktleQEFBmJ1cm5lcgkAZAIFF3RvdGFsQnVyblRpbGxEYXRlQnlVc2VyBQZhbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ5nZXRMYXN0QnVybktleQAFBmFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDWdldEJ1cm5CeURhcHABCQClCAEIBQFpBmNhbGxlcgkAZAIFCmJ1cm5CeURhcHAFBmFtb3VudAUDbmlsAWkBDGJ1cm5EdWNrbGluZwEEdXNlcgQIcGF5bWVudHMIBQFpCHBheW1lbnRzAwkBAiE9AgkAkAMBBQhwYXltZW50cwABCQACAQIvQkJEOiBQbGVhc2UgbWFrZSBzdXJlIHRvIGF0dGFjaCBvbmx5IDEgcGF5bWVudCEEB3BheW1lbnQJAQV2YWx1ZQEJAJEDAgUIcGF5bWVudHMAAAMJAQIhPQIIBQdwYXltZW50BmFtb3VudAABCQACAQIoQkJEOiBQbGVhc2UgbWFrZSBzdXJlIHRvIGF0dGFjaCB0aGUgTkZUIQMJAQIhPQIICQEFdmFsdWUBCQDsBwEJAQV2YWx1ZQEIBQdwYXltZW50B2Fzc2V0SWQGaXNzdWVyCQESZ2V0QmFieWR1Y2tBZGRyZXNzAAkAAgECGUJCRDogVGhpcyBpcyBubyBkdWNrbGluZyEEEXRvdGFsQnVyblRpbGxEYXRlCQENdHJ5R2V0SW50ZWdlcgEJAQ9nZXRUb3RhbEJ1cm5LZXkABBd0b3RhbEJ1cm5UaWxsRGF0ZUJ5VXNlcgkBDXRyeUdldEludGVnZXIBCQEOZ2V0VXNlckJ1cm5LZXkBBQR1c2VyBBN0b3RhbER1Y2tsaW5nQnVybmVkCQENdHJ5R2V0SW50ZWdlcgEJARR0b3RhbER1Y2tsaW5nc0J1cm5lZAAEGXRvdGFsRHVja2xpbmdCdXJuZWRCeVVzZXIJAQ10cnlHZXRJbnRlZ2VyAQkBFmdldFVzZXJCdXJuRHVja2xpbmdLZXkBBQR1c2VyCQDMCAIJAQRCdXJuAgkBBXZhbHVlAQgFB3BheW1lbnQHYXNzZXRJZAgFB3BheW1lbnQGYW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQESZ2V0VG90YWxCdXJuS2V5T2xkAAURdG90YWxCdXJuVGlsbERhdGUJAMwIAgkBDEludGVnZXJFbnRyeQIJARFnZXRVc2VyQnVybktleU9sZAEFBHVzZXIFF3RvdGFsQnVyblRpbGxEYXRlQnlVc2VyCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEXdG90YWxEdWNrbGluZ3NCdXJuZWRPbGQABRN0b3RhbER1Y2tsaW5nQnVybmVkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEZZ2V0VXNlckJ1cm5EdWNrbGluZ0tleU9sZAEFBHVzZXIFGXRvdGFsRHVja2xpbmdCdXJuZWRCeVVzZXIJAMwIAgkBDEludGVnZXJFbnRyeQIJARR0b3RhbER1Y2tsaW5nc0J1cm5lZAAFE3RvdGFsRHVja2xpbmdCdXJuZWQJAMwIAgkBDEludGVnZXJFbnRyeQIJARZnZXRVc2VyQnVybkR1Y2tsaW5nS2V5AQUEdXNlcgUZdG90YWxEdWNrbGluZ0J1cm5lZEJ5VXNlcgUDbmlsAWkBDGJ1cm5CeUludm9rZQEGYW1vdW50AwMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkBAiE9AggFAWkGY2FsbGVyCQERZ2V0Q291cG9uc0FkZHJlc3MABwkAAgECGEJCSTogQWRtaW4gZmVhdHVyZSBvbmx5IQQGYnVybmVyCQClCAEIBQFpDG9yaWdpbkNhbGxlcgQRdG90YWxCdXJuVGlsbERhdGUJAQ10cnlHZXRJbnRlZ2VyAQkBD2dldFRvdGFsQnVybktleQAEF3RvdGFsQnVyblRpbGxEYXRlQnlVc2VyCQENdHJ5R2V0SW50ZWdlcgEJAQ5nZXRVc2VyQnVybktleQEFBmJ1cm5lcgQKYnVybkJ5RGFwcAkBDXRyeUdldEludGVnZXIBCQENZ2V0QnVybkJ5RGFwcAEJAKUIAQgFAWkGY2FsbGVyCQDMCAIJAQRCdXJuAgkBDWdldEVnZ0Fzc2V0SWQABQZhbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJARJnZXRUb3RhbEJ1cm5LZXlPbGQABRF0b3RhbEJ1cm5UaWxsRGF0ZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBEWdldFVzZXJCdXJuS2V5T2xkAQUGYnVybmVyBRd0b3RhbEJ1cm5UaWxsRGF0ZUJ5VXNlcgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBD2dldFRvdGFsQnVybktleQAJAGQCBRF0b3RhbEJ1cm5UaWxsRGF0ZQUGYW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEOZ2V0VXNlckJ1cm5LZXkBBQZidXJuZXIJAGQCBRd0b3RhbEJ1cm5UaWxsRGF0ZUJ5VXNlcgUGYW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEOZ2V0TGFzdEJ1cm5LZXkABQZhbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ1nZXRCdXJuQnlEYXBwAQkApQgBCAUBaQZjYWxsZXIJAGQCBQpidXJuQnlEYXBwBQZhbW91bnQFA25pbAECdHgBBnZlcmlmeQADCQEJaXNUZXN0RW52AAkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAgFAnR4D3NlbmRlclB1YmxpY0tleQQJZmlyc3RVc2VyASBRHOT9Zv8SadLxWhSfO7Li9Dt/wctoJ6I0Xmw411fdbQQKc2Vjb25kVXNlcgEgXHIOS67xIU9m5hlF+mqise2xNilZXxnMzLDhTUGIan0ECXRoaXJkVXNlcgEgoK+R5S15Q2FhMhKtjrn6GFlRnS1TSTbD0KP3qGAZO04ED2ZpcnN0VXNlclNpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFCWZpcnN0VXNlcgABAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAQUJZmlyc3RVc2VyAAEDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwACBQlmaXJzdFVzZXIAAQAABBBzZWNvbmRVc2VyU2lnbmVkAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAUKc2Vjb25kVXNlcgABAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAQUKc2Vjb25kVXNlcgABAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAgUKc2Vjb25kVXNlcgABAAAED3RoaXJkVXNlclNpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFCXRoaXJkVXNlcgABAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAQUJdGhpcmRVc2VyAAEDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwACBQl0aGlyZFVzZXIAAQAABA9zaWduYXR1cmVzQ291bnQJAGQCCQBkAgUPZmlyc3RVc2VyU2lnbmVkBRBzZWNvbmRVc2VyU2lnbmVkBQ90aGlyZFVzZXJTaWduZWQEByRtYXRjaDAFAnR4CQBnAgUPc2lnbmF0dXJlc0NvdW50AAJCZiki", "height": 3316721, "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 tryGetString (key) = match getString(this, key) {
5+ case a: String =>
6+ a
7+ case _ =>
8+ ""
9+}
10+
11+
12+func tryGetInteger (key) = match getInteger(this, key) {
13+ case a: Int =>
14+ a
15+ case _ =>
16+ 0
17+}
18+
19+
20+func tryGetStringExternal (address,key) = match getString(address, key) {
21+ case a: String =>
22+ a
23+ case _ =>
24+ ""
25+}
26+
27+
28+func getOracle () = Address(fromBase58String(tryGetString("static_oracleAddress")))
29+
30+
31+func static_eggAssetId () = "static_eggAssetId"
32+
33+
34+func static_babyDuckAddress () = "static_babyDuckAddress"
35+
36+
37+func static_couponsAddress () = "static_couponsAddress"
38+
39+
40+func getEggAssetId () = fromBase58String(tryGetStringExternal(getOracle(), static_eggAssetId()))
41+
42+
43+func getBabyduckAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), static_babyDuckAddress())))
44+
45+
46+func getCouponsAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), static_couponsAddress())))
47+
48+
49+func getTotalBurnKey () = "BURN_TOTAL_AMOUNT_NEW"
50+
51+
52+func getTotalBurnKeyOld () = "BURN_TOTAL_AMOUNT_OLD"
53+
54+
55+func getLastBurnKey () = "BURN_LAST_AMOUNT"
56+
57+
58+func getUserBurnKey (address) = (("BURN_" + address) + "_AMOUNT_NEW")
59+
60+
61+func getUserBurnKeyOld (address) = (("BURN_" + address) + "_AMOUNT_OLD")
62+
63+
64+func getBurnByDapp (address) = (("BURN_DAPP_" + address) + "_AMOUNT")
65+
66+
67+func totalDucklingsBurned () = "BURN_TOTAL_AMOUNT_DUCKLING_NEW"
68+
69+
70+func totalDucklingsBurnedOld () = "BURN_TOTAL_AMOUNT_DUCKLING_OLD"
71+
72+
73+func getUserBurnDucklingKey (address) = (("BURN_" + address) + "_AMOUNT_DUCKLING_NEW")
74+
75+
76+func getUserBurnDucklingKeyOld (address) = (("BURN_" + address) + "_AMOUNT_DUCKLING_OLD")
77+
78+
79+func getBool (key) = match getBoolean(this, key) {
80+ case b: Boolean =>
81+ b
82+ case _ =>
83+ false
84+}
85+
86+
87+func isTestEnv () = getBool("TESTENV")
88+
89+
90+@Callable(i)
91+func configureOracle (oracle) = if ((i.caller != this))
92+ then throw("admin only")
93+ else [StringEntry("static_oracleAddress", oracle)]
94+
95+
96+
97+@Callable(i)
98+func burnAttachedPayments () = {
99+ let payments = i.payments
100+ if ((size(payments) != 1))
101+ then throw("BAP: Please make sure to attach only 1 payment!")
102+ else {
103+ let paymentEgg = value(payments[0])
104+ if ((paymentEgg.assetId != getEggAssetId()))
105+ then throw("BAP: You can only burn $EGG!")
106+ else {
107+ let burner = toString(i.originCaller)
108+ let amount = paymentEgg.amount
109+ let totalBurnTillDate = tryGetInteger(getTotalBurnKey())
110+ let totalBurnTillDateByUser = tryGetInteger(getUserBurnKey(burner))
111+ let burnByDapp = tryGetInteger(getBurnByDapp(toString(i.caller)))
112+[Burn(getEggAssetId(), amount), IntegerEntry(getTotalBurnKeyOld(), totalBurnTillDate), IntegerEntry(getUserBurnKeyOld(burner), totalBurnTillDateByUser), IntegerEntry(getTotalBurnKey(), (totalBurnTillDate + amount)), IntegerEntry(getUserBurnKey(burner), (totalBurnTillDateByUser + amount)), IntegerEntry(getLastBurnKey(), amount), IntegerEntry(getBurnByDapp(toString(i.caller)), (burnByDapp + amount))]
113+ }
114+ }
115+ }
116+
117+
118+
119+@Callable(i)
120+func burnDuckling (user) = {
121+ let payments = i.payments
122+ if ((size(payments) != 1))
123+ then throw("BBD: Please make sure to attach only 1 payment!")
124+ else {
125+ let payment = value(payments[0])
126+ if ((payment.amount != 1))
127+ then throw("BBD: Please make sure to attach the NFT!")
128+ else if ((value(assetInfo(value(payment.assetId))).issuer != getBabyduckAddress()))
129+ then throw("BBD: This is no duckling!")
130+ else {
131+ let totalBurnTillDate = tryGetInteger(getTotalBurnKey())
132+ let totalBurnTillDateByUser = tryGetInteger(getUserBurnKey(user))
133+ let totalDucklingBurned = tryGetInteger(totalDucklingsBurned())
134+ let totalDucklingBurnedByUser = tryGetInteger(getUserBurnDucklingKey(user))
135+[Burn(value(payment.assetId), payment.amount), IntegerEntry(getTotalBurnKeyOld(), totalBurnTillDate), IntegerEntry(getUserBurnKeyOld(user), totalBurnTillDateByUser), IntegerEntry(totalDucklingsBurnedOld(), totalDucklingBurned), IntegerEntry(getUserBurnDucklingKeyOld(user), totalDucklingBurnedByUser), IntegerEntry(totalDucklingsBurned(), totalDucklingBurned), IntegerEntry(getUserBurnDucklingKey(user), totalDucklingBurnedByUser)]
136+ }
137+ }
138+ }
139+
140+
141+
142+@Callable(i)
143+func burnByInvoke (amount) = if (if ((i.caller != this))
144+ then (i.caller != getCouponsAddress())
145+ else false)
146+ then throw("BBI: Admin feature only!")
147+ else {
148+ let burner = toString(i.originCaller)
149+ let totalBurnTillDate = tryGetInteger(getTotalBurnKey())
150+ let totalBurnTillDateByUser = tryGetInteger(getUserBurnKey(burner))
151+ let burnByDapp = tryGetInteger(getBurnByDapp(toString(i.caller)))
152+[Burn(getEggAssetId(), amount), IntegerEntry(getTotalBurnKeyOld(), totalBurnTillDate), IntegerEntry(getUserBurnKeyOld(burner), totalBurnTillDateByUser), IntegerEntry(getTotalBurnKey(), (totalBurnTillDate + amount)), IntegerEntry(getUserBurnKey(burner), (totalBurnTillDateByUser + amount)), IntegerEntry(getLastBurnKey(), amount), IntegerEntry(getBurnByDapp(toString(i.caller)), (burnByDapp + amount))]
153+ }
154+
155+
156+@Verifier(tx)
157+func verify () = if (isTestEnv())
158+ then sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
159+ else {
160+ let firstUser = base58'6TdaXEfhnjYquvPf3yV7MFxt2CbgFmaqsvGwkKfXtKi4'
161+ let secondUser = base58'7DsP2WaMLocbHuUxux7pbXRjTrrZ1TFQPsi5QumS3gr8'
162+ let thirdUser = base58'BpFWP3p3JgYrrP45xfrKzeMcWMEXoinj4FVPPkUiA8D3'
163+ let firstUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], firstUser))
164+ then 1
165+ else if (sigVerify(tx.bodyBytes, tx.proofs[1], firstUser))
166+ then 1
167+ else if (sigVerify(tx.bodyBytes, tx.proofs[2], firstUser))
168+ then 1
169+ else 0
170+ let secondUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], secondUser))
171+ then 1
172+ else if (sigVerify(tx.bodyBytes, tx.proofs[1], secondUser))
173+ then 1
174+ else if (sigVerify(tx.bodyBytes, tx.proofs[2], secondUser))
175+ then 1
176+ else 0
177+ let thirdUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], thirdUser))
178+ then 1
179+ else if (sigVerify(tx.bodyBytes, tx.proofs[1], thirdUser))
180+ then 1
181+ else if (sigVerify(tx.bodyBytes, tx.proofs[2], thirdUser))
182+ then 1
183+ else 0
184+ let signaturesCount = ((firstUserSigned + secondUserSigned) + thirdUserSigned)
185+ match tx {
186+ case _ =>
187+ (signaturesCount >= 2)
188+ }
189+ }
190+

github/deemru/w8io/026f985 
16.57 ms