tx · 3wMv96PW62ySaurs9WEQS8NrURqwQb9sU1F1KtcXy96b

3PFq5vswexHUS15BXYaKMXtTDVhkUfPXoG2:  -0.01000000 Waves

2023.03.04 15:14 [3540767] smart account 3PFq5vswexHUS15BXYaKMXtTDVhkUfPXoG2 > SELF 0.00000000 Waves

{ "type": 13, "id": "3wMv96PW62ySaurs9WEQS8NrURqwQb9sU1F1KtcXy96b", "fee": 1000000, "feeAssetId": null, "timestamp": 1677932092842, "version": 2, "chainId": 87, "sender": "3PFq5vswexHUS15BXYaKMXtTDVhkUfPXoG2", "senderPublicKey": "BmLDfnwrA4DPL2GDx65UZGp28BgtnaZs2ioyo5Y17UK4", "proofs": [ "5yKK8eRU4Jq7wUoJcLaBweugNghLoLb9w2wAkcUcUNZU8MZkVnJoSXCAduzgYT4xAn3bkeF3ic5hgKFgjgYUYHcs" ], "script": "base64:BgIQCAISAwoBCBIAEgASAwoBAREBDHRyeUdldFN0cmluZwEDa2V5BAckbWF0Y2gwCQCdCAIFBHRoaXMFA2tleQMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAFAWECAAENdHJ5R2V0SW50ZWdlcgEDa2V5BAckbWF0Y2gwCQCaCAIFBHRoaXMFA2tleQMJAAECBQckbWF0Y2gwAgNJbnQEAWEFByRtYXRjaDAFAWEAAAEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCB2FkZHJlc3MDa2V5BAckbWF0Y2gwCQCdCAIFB2FkZHJlc3MFA2tleQMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAFAWECAAEJZ2V0T3JhY2xlAAkBB0FkZHJlc3MBCQDZBAEJAQx0cnlHZXRTdHJpbmcBAhRzdGF0aWNfb3JhY2xlQWRkcmVzcwENZ2V0RWdnQXNzZXRJZAAJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQACEXN0YXRpY19lZ2dBc3NldElkARJnZXRCYWJ5ZHVja0FkZHJlc3MACQEHQWRkcmVzcwEJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQACFnN0YXRpY19iYWJ5RHVja0FkZHJlc3MBEWdldENvdXBvbnNBZGRyZXNzAAkBB0FkZHJlc3MBCQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUAAhVzdGF0aWNfY291cG9uc0FkZHJlc3MBD2dldFRvdGFsQnVybktleQACFUJVUk5fVE9UQUxfQU1PVU5UX05FVwESZ2V0VG90YWxCdXJuS2V5T2xkAAIVQlVSTl9UT1RBTF9BTU9VTlRfT0xEAQ5nZXRMYXN0QnVybktleQACEEJVUk5fTEFTVF9BTU9VTlQBDmdldFVzZXJCdXJuS2V5AQdhZGRyZXNzCQCsAgIJAKwCAgIFQlVSTl8FB2FkZHJlc3MCC19BTU9VTlRfTkVXARFnZXRVc2VyQnVybktleU9sZAEHYWRkcmVzcwkArAICCQCsAgICBUJVUk5fBQdhZGRyZXNzAgtfQU1PVU5UX09MRAENZ2V0QnVybkJ5RGFwcAEHYWRkcmVzcwkArAICCQCsAgICCkJVUk5fREFQUF8FB2FkZHJlc3MCB19BTU9VTlQBFHRvdGFsRHVja2xpbmdzQnVybmVkAAIeQlVSTl9UT1RBTF9BTU9VTlRfRFVDS0xJTkdfTkVXARd0b3RhbER1Y2tsaW5nc0J1cm5lZE9sZAACHkJVUk5fVE9UQUxfQU1PVU5UX0RVQ0tMSU5HX09MRAEWZ2V0VXNlckJ1cm5EdWNrbGluZ0tleQEHYWRkcmVzcwkArAICCQCsAgICBUJVUk5fBQdhZGRyZXNzAhRfQU1PVU5UX0RVQ0tMSU5HX05FVwEZZ2V0VXNlckJ1cm5EdWNrbGluZ0tleU9sZAEHYWRkcmVzcwkArAICCQCsAgICBUJVUk5fBQdhZGRyZXNzAhRfQU1PVU5UX0RVQ0tMSU5HX09MRAQBaQEPY29uZmlndXJlT3JhY2xlAQZvcmFjbGUDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAgphZG1pbiBvbmx5CQDMCAIJAQtTdHJpbmdFbnRyeQICFHN0YXRpY19vcmFjbGVBZGRyZXNzBQZvcmFjbGUFA25pbAFpARRidXJuQXR0YWNoZWRQYXltZW50cwAECHBheW1lbnRzCAUBaQhwYXltZW50cwMJAQIhPQIJAJADAQUIcGF5bWVudHMAAQkAAgECL0JBUDogUGxlYXNlIG1ha2Ugc3VyZSB0byBhdHRhY2ggb25seSAxIHBheW1lbnQhBApwYXltZW50RWdnCQEFdmFsdWUBCQCRAwIFCHBheW1lbnRzAAADCQECIT0CCAUKcGF5bWVudEVnZwdhc3NldElkCQENZ2V0RWdnQXNzZXRJZAAJAAIBAhxCQVA6IFlvdSBjYW4gb25seSBidXJuICRFR0chBAZidXJuZXIJAKUIAQgFAWkMb3JpZ2luQ2FsbGVyBAZhbW91bnQIBQpwYXltZW50RWdnBmFtb3VudAQRdG90YWxCdXJuVGlsbERhdGUJAQ10cnlHZXRJbnRlZ2VyAQkBD2dldFRvdGFsQnVybktleQAEF3RvdGFsQnVyblRpbGxEYXRlQnlVc2VyCQENdHJ5R2V0SW50ZWdlcgEJAQ5nZXRVc2VyQnVybktleQEFBmJ1cm5lcgQKYnVybkJ5RGFwcAkBDXRyeUdldEludGVnZXIBCQENZ2V0QnVybkJ5RGFwcAEJAKUIAQgFAWkGY2FsbGVyCQDMCAIJAQRCdXJuAgkBDWdldEVnZ0Fzc2V0SWQABQZhbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJARJnZXRUb3RhbEJ1cm5LZXlPbGQABRF0b3RhbEJ1cm5UaWxsRGF0ZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBEWdldFVzZXJCdXJuS2V5T2xkAQUGYnVybmVyBRd0b3RhbEJ1cm5UaWxsRGF0ZUJ5VXNlcgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBD2dldFRvdGFsQnVybktleQAJAGQCBRF0b3RhbEJ1cm5UaWxsRGF0ZQUGYW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEOZ2V0VXNlckJ1cm5LZXkBBQZidXJuZXIJAGQCBRd0b3RhbEJ1cm5UaWxsRGF0ZUJ5VXNlcgUGYW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEOZ2V0TGFzdEJ1cm5LZXkABQZhbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ1nZXRCdXJuQnlEYXBwAQkApQgBCAUBaQZjYWxsZXIJAGQCBQpidXJuQnlEYXBwBQZhbW91bnQFA25pbAFpAQxidXJuRHVja2xpbmcABAhwYXltZW50cwgFAWkIcGF5bWVudHMDCQECIT0CCQCQAwEFCHBheW1lbnRzAAEJAAIBAi9CQkQ6IFBsZWFzZSBtYWtlIHN1cmUgdG8gYXR0YWNoIG9ubHkgMSBwYXltZW50IQQHcGF5bWVudAkBBXZhbHVlAQkAkQMCBQhwYXltZW50cwAAAwkBAiE9AggFB3BheW1lbnQGYW1vdW50AAEJAAIBAihCQkQ6IFBsZWFzZSBtYWtlIHN1cmUgdG8gYXR0YWNoIHRoZSBORlQhAwkBAiE9AggJAQV2YWx1ZQEJAOwHAQkBBXZhbHVlAQgFB3BheW1lbnQHYXNzZXRJZAZpc3N1ZXIJARJnZXRCYWJ5ZHVja0FkZHJlc3MACQACAQIZQkJEOiBUaGlzIGlzIG5vIGR1Y2tsaW5nIQQGYW1vdW50AICJegQGYnVybmVyCQClCAEIBQFpDG9yaWdpbkNhbGxlcgQRdG90YWxCdXJuVGlsbERhdGUJAQ10cnlHZXRJbnRlZ2VyAQkBD2dldFRvdGFsQnVybktleQAEF3RvdGFsQnVyblRpbGxEYXRlQnlVc2VyCQENdHJ5R2V0SW50ZWdlcgEJAQ5nZXRVc2VyQnVybktleQEFBmJ1cm5lcgQTdG90YWxEdWNrbGluZ0J1cm5lZAkBDXRyeUdldEludGVnZXIBCQEUdG90YWxEdWNrbGluZ3NCdXJuZWQABBl0b3RhbER1Y2tsaW5nQnVybmVkQnlVc2VyCQENdHJ5R2V0SW50ZWdlcgEJARZnZXRVc2VyQnVybkR1Y2tsaW5nS2V5AQUGYnVybmVyCQDMCAIJAQRCdXJuAgkBDWdldEVnZ0Fzc2V0SWQABQZhbW91bnQJAMwIAgkBBEJ1cm4CCQEFdmFsdWUBCAUHcGF5bWVudAdhc3NldElkCAUHcGF5bWVudAZhbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJARJnZXRUb3RhbEJ1cm5LZXlPbGQABRF0b3RhbEJ1cm5UaWxsRGF0ZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBEWdldFVzZXJCdXJuS2V5T2xkAQUGYnVybmVyBRd0b3RhbEJ1cm5UaWxsRGF0ZUJ5VXNlcgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBF3RvdGFsRHVja2xpbmdzQnVybmVkT2xkAAUTdG90YWxEdWNrbGluZ0J1cm5lZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBGWdldFVzZXJCdXJuRHVja2xpbmdLZXlPbGQBBQZidXJuZXIFGXRvdGFsRHVja2xpbmdCdXJuZWRCeVVzZXIJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ9nZXRUb3RhbEJ1cm5LZXkACQBkAgURdG90YWxCdXJuVGlsbERhdGUFBmFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDmdldFVzZXJCdXJuS2V5AQUGYnVybmVyCQBkAgUXdG90YWxCdXJuVGlsbERhdGVCeVVzZXIFBmFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFHRvdGFsRHVja2xpbmdzQnVybmVkAAUTdG90YWxEdWNrbGluZ0J1cm5lZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFmdldFVzZXJCdXJuRHVja2xpbmdLZXkBBQZidXJuZXIFGXRvdGFsRHVja2xpbmdCdXJuZWRCeVVzZXIJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ5nZXRMYXN0QnVybktleQAFBmFtb3VudAUDbmlsAWkBDGJ1cm5CeUludm9rZQEGYW1vdW50AwMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkBAiE9AggFAWkGY2FsbGVyCQERZ2V0Q291cG9uc0FkZHJlc3MABwkAAgECGEJCSTogQWRtaW4gZmVhdHVyZSBvbmx5IQQGYnVybmVyCQClCAEIBQFpDG9yaWdpbkNhbGxlcgQRdG90YWxCdXJuVGlsbERhdGUJAQ10cnlHZXRJbnRlZ2VyAQkBD2dldFRvdGFsQnVybktleQAEF3RvdGFsQnVyblRpbGxEYXRlQnlVc2VyCQENdHJ5R2V0SW50ZWdlcgEJAQ5nZXRVc2VyQnVybktleQEFBmJ1cm5lcgQKYnVybkJ5RGFwcAkBDXRyeUdldEludGVnZXIBCQENZ2V0QnVybkJ5RGFwcAEJAKUIAQgFAWkGY2FsbGVyCQDMCAIJAQRCdXJuAgkBDWdldEVnZ0Fzc2V0SWQABQZhbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJARJnZXRUb3RhbEJ1cm5LZXlPbGQABRF0b3RhbEJ1cm5UaWxsRGF0ZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBEWdldFVzZXJCdXJuS2V5T2xkAQUGYnVybmVyBRd0b3RhbEJ1cm5UaWxsRGF0ZUJ5VXNlcgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBD2dldFRvdGFsQnVybktleQAJAGQCBRF0b3RhbEJ1cm5UaWxsRGF0ZQUGYW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEOZ2V0VXNlckJ1cm5LZXkBBQZidXJuZXIJAGQCBRd0b3RhbEJ1cm5UaWxsRGF0ZUJ5VXNlcgUGYW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEOZ2V0TGFzdEJ1cm5LZXkABQZhbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ1nZXRCdXJuQnlEYXBwAQkApQgBCAUBaQZjYWxsZXIJAGQCBQpidXJuQnlEYXBwBQZhbW91bnQFA25pbAECdHgBBnZlcmlmeQAECWZpcnN0VXNlcgEg3tbGUeRTFtBlgOsBmioL0PeXUfocdpF+m44GQ3cXvSUECnNlY29uZFVzZXIBIMFs347t041zj4ui+fqJD/R1zUQbVHJSo7Sc0lakLeB1BAl0aGlyZFVzZXIBIOdb9I6q0vlJnm6EJrj5fh/cZ6h93Cu41Op7zfJoCsElBA9maXJzdFVzZXJTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQlmaXJzdFVzZXIAAQMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAEFCWZpcnN0VXNlcgABAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAgUJZmlyc3RVc2VyAAEAAAQQc2Vjb25kVXNlclNpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFCnNlY29uZFVzZXIAAQMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAEFCnNlY29uZFVzZXIAAQMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAIFCnNlY29uZFVzZXIAAQAABA90aGlyZFVzZXJTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQl0aGlyZFVzZXIAAQMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAEFCXRoaXJkVXNlcgABAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAgUJdGhpcmRVc2VyAAEAAAQPc2lnbmF0dXJlc0NvdW50CQBkAgkAZAIFD2ZpcnN0VXNlclNpZ25lZAUQc2Vjb25kVXNlclNpZ25lZAUPdGhpcmRVc2VyU2lnbmVkBAckbWF0Y2gwBQJ0eAkAZwIFD3NpZ25hdHVyZXNDb3VudAACMpGnyw==", "height": 3540767, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 6P6WtPiqgEPsRefJhfVMbVQiLTC6HJnbFUbMksRh74aR Next: none Diff:
OldNewDifferences
135135 }
136136
137137
138+@Verifier(tx)
139+func verify () = {
140+ let firstUser = base58'FzsTVRXqD46KW5yj6qGNVrsouvWjpCQvD1446A96iGt4'
141+ let secondUser = base58'E23yUg8eun5nXB1nZRDf7RTyRADKxQhGNXdpTYonEvtU'
142+ let thirdUser = base58'Ga8WEBTPXbHuoXRD355mQ6ms8PsM2RFYKeA1mEP32CFe'
143+ let firstUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], firstUser))
144+ then 1
145+ else if (sigVerify(tx.bodyBytes, tx.proofs[1], firstUser))
146+ then 1
147+ else if (sigVerify(tx.bodyBytes, tx.proofs[2], firstUser))
148+ then 1
149+ else 0
150+ let secondUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], secondUser))
151+ then 1
152+ else if (sigVerify(tx.bodyBytes, tx.proofs[1], secondUser))
153+ then 1
154+ else if (sigVerify(tx.bodyBytes, tx.proofs[2], secondUser))
155+ then 1
156+ else 0
157+ let thirdUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], thirdUser))
158+ then 1
159+ else if (sigVerify(tx.bodyBytes, tx.proofs[1], thirdUser))
160+ then 1
161+ else if (sigVerify(tx.bodyBytes, tx.proofs[2], thirdUser))
162+ then 1
163+ else 0
164+ let signaturesCount = ((firstUserSigned + secondUserSigned) + thirdUserSigned)
165+ match tx {
166+ case _ =>
167+ (signaturesCount >= 2)
168+ }
169+ }
170+
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 func tryGetString (key) = match getString(this, key) {
55 case a: String =>
66 a
77 case _ =>
88 ""
99 }
1010
1111
1212 func tryGetInteger (key) = match getInteger(this, key) {
1313 case a: Int =>
1414 a
1515 case _ =>
1616 0
1717 }
1818
1919
2020 func tryGetStringExternal (address,key) = match getString(address, key) {
2121 case a: String =>
2222 a
2323 case _ =>
2424 ""
2525 }
2626
2727
2828 func getOracle () = Address(fromBase58String(tryGetString("static_oracleAddress")))
2929
3030
3131 func getEggAssetId () = fromBase58String(tryGetStringExternal(getOracle(), "static_eggAssetId"))
3232
3333
3434 func getBabyduckAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_babyDuckAddress")))
3535
3636
3737 func getCouponsAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_couponsAddress")))
3838
3939
4040 func getTotalBurnKey () = "BURN_TOTAL_AMOUNT_NEW"
4141
4242
4343 func getTotalBurnKeyOld () = "BURN_TOTAL_AMOUNT_OLD"
4444
4545
4646 func getLastBurnKey () = "BURN_LAST_AMOUNT"
4747
4848
4949 func getUserBurnKey (address) = (("BURN_" + address) + "_AMOUNT_NEW")
5050
5151
5252 func getUserBurnKeyOld (address) = (("BURN_" + address) + "_AMOUNT_OLD")
5353
5454
5555 func getBurnByDapp (address) = (("BURN_DAPP_" + address) + "_AMOUNT")
5656
5757
5858 func totalDucklingsBurned () = "BURN_TOTAL_AMOUNT_DUCKLING_NEW"
5959
6060
6161 func totalDucklingsBurnedOld () = "BURN_TOTAL_AMOUNT_DUCKLING_OLD"
6262
6363
6464 func getUserBurnDucklingKey (address) = (("BURN_" + address) + "_AMOUNT_DUCKLING_NEW")
6565
6666
6767 func getUserBurnDucklingKeyOld (address) = (("BURN_" + address) + "_AMOUNT_DUCKLING_OLD")
6868
6969
7070 @Callable(i)
7171 func configureOracle (oracle) = if ((i.caller != this))
7272 then throw("admin only")
7373 else [StringEntry("static_oracleAddress", oracle)]
7474
7575
7676
7777 @Callable(i)
7878 func burnAttachedPayments () = {
7979 let payments = i.payments
8080 if ((size(payments) != 1))
8181 then throw("BAP: Please make sure to attach only 1 payment!")
8282 else {
8383 let paymentEgg = value(payments[0])
8484 if ((paymentEgg.assetId != getEggAssetId()))
8585 then throw("BAP: You can only burn $EGG!")
8686 else {
8787 let burner = toString(i.originCaller)
8888 let amount = paymentEgg.amount
8989 let totalBurnTillDate = tryGetInteger(getTotalBurnKey())
9090 let totalBurnTillDateByUser = tryGetInteger(getUserBurnKey(burner))
9191 let burnByDapp = tryGetInteger(getBurnByDapp(toString(i.caller)))
9292 [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))]
9393 }
9494 }
9595 }
9696
9797
9898
9999 @Callable(i)
100100 func burnDuckling () = {
101101 let payments = i.payments
102102 if ((size(payments) != 1))
103103 then throw("BBD: Please make sure to attach only 1 payment!")
104104 else {
105105 let payment = value(payments[0])
106106 if ((payment.amount != 1))
107107 then throw("BBD: Please make sure to attach the NFT!")
108108 else if ((value(assetInfo(value(payment.assetId))).issuer != getBabyduckAddress()))
109109 then throw("BBD: This is no duckling!")
110110 else {
111111 let amount = 2000000
112112 let burner = toString(i.originCaller)
113113 let totalBurnTillDate = tryGetInteger(getTotalBurnKey())
114114 let totalBurnTillDateByUser = tryGetInteger(getUserBurnKey(burner))
115115 let totalDucklingBurned = tryGetInteger(totalDucklingsBurned())
116116 let totalDucklingBurnedByUser = tryGetInteger(getUserBurnDucklingKey(burner))
117117 [Burn(getEggAssetId(), amount), Burn(value(payment.assetId), payment.amount), IntegerEntry(getTotalBurnKeyOld(), totalBurnTillDate), IntegerEntry(getUserBurnKeyOld(burner), totalBurnTillDateByUser), IntegerEntry(totalDucklingsBurnedOld(), totalDucklingBurned), IntegerEntry(getUserBurnDucklingKeyOld(burner), totalDucklingBurnedByUser), IntegerEntry(getTotalBurnKey(), (totalBurnTillDate + amount)), IntegerEntry(getUserBurnKey(burner), (totalBurnTillDateByUser + amount)), IntegerEntry(totalDucklingsBurned(), totalDucklingBurned), IntegerEntry(getUserBurnDucklingKey(burner), totalDucklingBurnedByUser), IntegerEntry(getLastBurnKey(), amount)]
118118 }
119119 }
120120 }
121121
122122
123123
124124 @Callable(i)
125125 func burnByInvoke (amount) = if (if ((i.caller != this))
126126 then (i.caller != getCouponsAddress())
127127 else false)
128128 then throw("BBI: Admin feature only!")
129129 else {
130130 let burner = toString(i.originCaller)
131131 let totalBurnTillDate = tryGetInteger(getTotalBurnKey())
132132 let totalBurnTillDateByUser = tryGetInteger(getUserBurnKey(burner))
133133 let burnByDapp = tryGetInteger(getBurnByDapp(toString(i.caller)))
134134 [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))]
135135 }
136136
137137
138+@Verifier(tx)
139+func verify () = {
140+ let firstUser = base58'FzsTVRXqD46KW5yj6qGNVrsouvWjpCQvD1446A96iGt4'
141+ let secondUser = base58'E23yUg8eun5nXB1nZRDf7RTyRADKxQhGNXdpTYonEvtU'
142+ let thirdUser = base58'Ga8WEBTPXbHuoXRD355mQ6ms8PsM2RFYKeA1mEP32CFe'
143+ let firstUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], firstUser))
144+ then 1
145+ else if (sigVerify(tx.bodyBytes, tx.proofs[1], firstUser))
146+ then 1
147+ else if (sigVerify(tx.bodyBytes, tx.proofs[2], firstUser))
148+ then 1
149+ else 0
150+ let secondUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], secondUser))
151+ then 1
152+ else if (sigVerify(tx.bodyBytes, tx.proofs[1], secondUser))
153+ then 1
154+ else if (sigVerify(tx.bodyBytes, tx.proofs[2], secondUser))
155+ then 1
156+ else 0
157+ let thirdUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], thirdUser))
158+ then 1
159+ else if (sigVerify(tx.bodyBytes, tx.proofs[1], thirdUser))
160+ then 1
161+ else if (sigVerify(tx.bodyBytes, tx.proofs[2], thirdUser))
162+ then 1
163+ else 0
164+ let signaturesCount = ((firstUserSigned + secondUserSigned) + thirdUserSigned)
165+ match tx {
166+ case _ =>
167+ (signaturesCount >= 2)
168+ }
169+ }
170+

github/deemru/w8io/3ef1775 
27.62 ms