tx · 2tKcENXTEz1CgBPtamwvv9abFE1mpMevbo6NsJ3H1p66

3P4v7QaMk6us7PdxSuoR5LmZmemv5ruD6oj:  -0.01400000 Waves

2022.05.08 15:35 [3108192] smart account 3P4v7QaMk6us7PdxSuoR5LmZmemv5ruD6oj > SELF 0.00000000 Waves

{ "type": 13, "id": "2tKcENXTEz1CgBPtamwvv9abFE1mpMevbo6NsJ3H1p66", "fee": 1400000, "feeAssetId": null, "timestamp": 1652013293504, "version": 2, "chainId": 87, "sender": "3P4v7QaMk6us7PdxSuoR5LmZmemv5ruD6oj", "senderPublicKey": "8WdPBryKG4xqQQJU9Vt5ehDfjjgaXBQTbBCCriYGisHs", "proofs": [ "", "4LxLURjTwh2LLGSVGb7S2KDguVNB1iX99kq5ajMiWKJAVXtuTgJqBT6YMTzGdEjUWkA5Fa4skQ1arXF5sFGLkWp8", "CuQtQuCWbbk2eYYUSGXdoGzdPAAuv7wLCJavezJJ7Z6A3jgqn71qesYHoGQboc2ovvHbo8aCJMVhBrjV15zVhXh" ], "script": "base64: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b2tlblBheQkBAAAAEUBleHRyTmF0aXZlKDEwNTApAAAAAgkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQkAAZEAAAACBQAAAApleGNoYW5nZXJzAAAAAAAAAAABCQABkQAAAAIFAAAAEXJvdXRpbmdBc3NldHNLZXlzAAAAAAAAAAACBAAAAA1kQXBwMlRva2VuR2V0CQEAAAARQGV4dHJOYXRpdmUoMTA1MCkAAAACCQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABCQABkQAAAAIFAAAACmV4Y2hhbmdlcnMAAAAAAAAAAAEJAAGRAAAAAgUAAAARcm91dGluZ0Fzc2V0c0tleXMAAAAAAAAAAAMEAAAAFGdldEZyb20xVHJhZGVXaXRoRmVlAwkAAAAAAAACCQABkQAAAAIFAAAADmV4Y2hhbmdlcnNUeXBlAAAAAAAAAAAAAgAAAARjcG1tBAAAABdnZXRGcm9tMVRyYWRlV2l0aG91dEZlZQkAAGsAAAADBQAAAA1kQXBwMVRva2VuR2V0BQAAAAlwbXRBbW91bnQJAABkAAAAAgUAAAAJcG10QW1vdW50BQAAAA1kQXBwMVRva2VuUGF5CQAAawAAAAMFAAAAF2dldEZyb20xVHJhZGVXaXRob3V0RmVlCQAAZQAAAAIFAAAAGGNvbW1pc3Npb25TY2FsZURlbGltaXRlcgUAAAAKY29tbWlzc2lvbgUAAAAYY29tbWlzc2lvblNjYWxlRGVsaW1pdGVyAwkAAAAAAAACCQABkQAAAAIFAAAADmV4Y2hhbmdlcnNUeXBlAAAAAAAAAAAAAgAAAARmbGF0BAAAAAlpbnZhcmlhbnQJAQAAAA1pbnZhcmlhbnRDYWxjAAAAAgUAAAANZEFwcDFUb2tlblBheQUAAAANZEFwcDFUb2tlbkdldAQAAAATbWluQW1vdW50VG9SZWNlaXZlMQkAAZEAAAACBQAAAAVhcmdzMgAAAAAAAAAAAAQAAAAMaW52YXJpYW50TmV3CQEAAAANaW52YXJpYW50Q2FsYwAAAAIJAABkAAAAAgUAAAANZEFwcDFUb2tlblBheQUAAAAJcG10QW1vdW50CQAAZQAAAAIFAAAADWRBcHAxVG9rZW5HZXQFAAAAE21pbkFtb3VudFRvUmVjZWl2ZTEDCQAAZwAAAAIFAAAADGludmFyaWFudE5ldwUAAAAJaW52YXJpYW50BQAAABNtaW5BbW91bnRUb1JlY2VpdmUxCQAAAgAAAAECAAAAJ0ZsYXQgY29udHJhY3Q6IGludmFyaWFudE5ldyA8IGludmFyaWFudAkAAAIAAAABAgAAABdJbmNvcnJlY3QgZXhjaGFuZ2UgdHlwZQQAAAAUZ2V0RnJvbTJUcmFkZVdpdGhGZWUDCQAAAAAAAAIJAAGRAAAAAgUAAAAOZXhjaGFuZ2Vyc1R5cGUAAAAAAAAAAAECAAAABGNwbW0EAAAAF2dldEZyb20yVHJhZGVXaXRob3V0RmVlCQAAawAAAAMFAAAADWRBcHAyVG9rZW5HZXQFAAAAFGdldEZyb20xVHJhZGVXaXRoRmVlCQAAZAAAAAIFAAAAFGdldEZyb20xVHJhZGVXaXRoRmVlBQAAAA1kQXBwMlRva2VuUGF5CQAAawAAAAMFAAAAF2dldEZyb20yVHJhZGVXaXRob3V0RmVlCQAAZQAAAAIFAAAAGGNvbW1pc3Npb25TY2FsZURlbGltaXRlcgUAAAAKY29tbWlzc2lvbgUAAAAYY29tbWlzc2lvblNjYWxlRGVsaW1pdGVyAwkAAAAAAAACCQABkQAAAAIFAAAADmV4Y2hhbmdlcnNUeXBlAAAAAAAAAAABAgAAAARmbGF0BAAAAAlpbnZhcmlhbnQJAQAAAA1pbnZhcmlhbnRDYWxjAAAAAgUAAAANZEFwcDJUb2tlblBheQUAAAANZEFwcDJUb2tlbkdldAQAAAATbWluQW1vdW50VG9SZWNlaXZlMgkAAZEAAAACBQAAAAVhcmdzMgAAAAAAAAAAAQQAAAAMaW52YXJpYW50TmV3CQEAAAANaW52YXJpYW50Q2FsYwAAAAIJAABkAAAAAgUAAAANZEFwcDJUb2tlblBheQUAAAAUZ2V0RnJvbTFUcmFkZVdpdGhGZWUJAABlAAAAAgUAAAANZEFwcDJUb2tlbkdldAUAAAATbWluQW1vdW50VG9SZWNlaXZlMgMJAABnAAAAAgUAAAAMaW52YXJpYW50TmV3BQAAAAlpbnZhcmlhbnQFAAAAE21pbkFtb3VudFRvUmVjZWl2ZTIJAAACAAAAAQIAAAAnRmxhdCBjb250cmFjdDogaW52YXJpYW50TmV3IDwgaW52YXJpYW50CQAAAgAAAAECAAAAF0luY29ycmVjdCBleGNoYW5nZSB0eXBlCQAAZwAAAAIFAAAAFGdldEZyb20yVHJhZGVXaXRoRmVlBQAAABJtaW5BbW91bnRUb1JlY2VpdmUAAAADAAAAAWkBAAAADHJvdXRpbmdUcmFkZQAAAAYAAAAKZXhjaGFuZ2VycwAAAA5leGNoYW5nZXJzVHlwZQAAAAVhcmdzMQAAAAVhcmdzMgAAABFyb3V0aW5nQXNzZXRzS2V5cwAAABJtaW5BbW91bnRUb1JlY2VpdmUJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAQAAAAhpc0FjdGl2ZQAAAAAEAAAACyR0MDUyODk1MzYzCQAFFAAAAAIICQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAAAAAABmFtb3VudAgJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAHYXNzZXRJZAQAAAAJcG10QW1vdW50CAUAAAALJHQwNTI4OTUzNjMAAAACXzEEAAAACnBtdEFzc2V0SWQIBQAAAAskdDA1Mjg5NTM2MwAAAAJfMgMJAQAAAAEhAAAAAQkBAAAAEGNoZWNrUG9zc2liaWxpdHkAAAAHBQAAAAlwbXRBbW91bnQFAAAAEm1pbkFtb3VudFRvUmVjZWl2ZQUAAAAKZXhjaGFuZ2VycwUAAAAOZXhjaGFuZ2Vyc1R5cGUFAAAAEXJvdXRpbmdBc3NldHNLZXlzBQAAAAVhcmdzMQUAAAAFYXJnczIJAAACAAAAAQIAAAAmQ2hlY2sgdHJhbnNhY3Rpb24gcG9zc2liaWx0eTogZGVjbGluZWQDAwkBAAAAASEAAAABCQEAAAAJaXNEZWZpbmVkAAAAAQkABB0AAAACBQAAAAZvcmFjbGUJAAEsAAAAAgUAAAANa1Bvb2xJbk9yYWNsZQkAAZEAAAACBQAAAApleGNoYW5nZXJzAAAAAAAAAAAABgkBAAAAASEAAAABCQEAAAAJaXNEZWZpbmVkAAAAAQkABB0AAAACBQAAAAZvcmFjbGUJAAEsAAAAAgUAAAANa1Bvb2xJbk9yYWNsZQkAAZEAAAACBQAAAApleGNoYW5nZXJzAAAAAAAAAAABCQAAAgAAAAECAAAAFVBvb2wgaXMgbm90IGluIG9yYWNsZQQAAAALcm91dGluZ1NpemUJAAGQAAAAAQUAAAAKZXhjaGFuZ2VycwoBAAAADGV4Y2hhbmdlRm9sZAAAAAIAAAALYWNjdW11bGF0ZWQAAAAJZXhjaGFuZ2VyBAAAAAskdDA1ODY3NTkzMgUAAAALYWNjdW11bGF0ZWQEAAAAD2V4Y2hhbmdlQ291bnRlcggFAAAACyR0MDU4Njc1OTMyAAAAAl8xBAAAAA5hbW91bnRzV2l0aEZlZQgFAAAACyR0MDU4Njc1OTMyAAAAAl8yBAAAAAxhc3NldHNJZFNlbmQIBQAAAAskdDA1ODY3NTkzMgAAAAJfMwQAAAALJHQwNTk0NTYxNDMDCQAAAAAAAAIFAAAAD2V4Y2hhbmdlQ291bnRlcgAAAAAAAAAAAAkABRQAAAACBQAAAApwbXRBc3NldElkBQAAAAlwbXRBbW91bnQJAAUUAAAAAgUAAAAMYXNzZXRzSWRTZW5kBQAAAA5hbW91bnRzV2l0aEZlZQQAAAAOcG10QXNzZXRJZFJvdXQIBQAAAAskdDA1OTQ1NjE0MwAAAAJfMQQAAAANcG10QW1vdW50Um91dAgFAAAACyR0MDU5NDU2MTQzAAAAAl8yAwkAAAAAAAACAwkAAGcAAAACBQAAAA9leGNoYW5nZUNvdW50ZXIAAAAAAAAAAAAJAABmAAAAAgUAAAALcm91dGluZ1NpemUFAAAAD2V4Y2hhbmdlQ291bnRlcgcGBAAAABBleGNoYW5nZXJBZGRyZXNzCQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABBQAAAAlleGNoYW5nZXIEAAAAA2ludgMJAAAAAAAAAgkAAZEAAAACBQAAAA5leGNoYW5nZXJzVHlwZQUAAAAPZXhjaGFuZ2VDb3VudGVyAgAAAARjcG1tCQAD/AAAAAQFAAAAEGV4Y2hhbmdlckFkZHJlc3MCAAAACGV4Y2hhbmdlCQAETAAAAAIJAAGRAAAAAgUAAAAFYXJnczEFAAAAD2V4Y2hhbmdlQ291bnRlcgUAAAADbmlsCQAETAAAAAIJAQAAAA9BdHRhY2hlZFBheW1lbnQAAAACBQAAAA5wbXRBc3NldElkUm91dAUAAAANcG10QW1vdW50Um91dAUAAAADbmlsAwkAAAAAAAACCQABkQAAAAIFAAAADmV4Y2hhbmdlcnNU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", "height": 3108192, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: G9e1MvXT3n9ndjqQt3LCM9Njo9L8U4pfEQ3BbEAEmfWc Next: 9ZHPqkVkXupvvstyeAUQCQqPHSWpjQBsgkocdQeoud1j Diff:
OldNewDifferences
156156 else throw("Incorrect exchange type")
157157 if ((inv == inv))
158158 then match inv {
159- case inv: (Int, ByteVector) =>
160- let $t069867024 = inv
161- let amountWithFee = $t069867024._1
162- let assetIdSend = $t069867024._2
159+ case inv: (Int, Unit)|(Int, ByteVector) =>
160+ let $t069917029 = inv
161+ let amountWithFee = $t069917029._1
162+ let assetIdSend = $t069917029._2
163163 $Tuple3((exchangeCounter + 1), amountWithFee, assetIdSend)
164164 case _ =>
165165 throw("Incorrect invoke result: expected amountWithFee and assetsIdSend")
169169 else accumulated
170170 }
171171
172- let $t073047410 = {
172+ let $t073097415 = {
173173 let $l = exchangers
174174 let $s = size($l)
175175 let $acc0 = $Tuple3(0, 0, base58'')
183183
184184 $f0_2($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3)
185185 }
186- let exchangeCounter = $t073047410._1
187- let amountWithoutFee = $t073047410._2
188- let assetIdSend = $t073047410._3
186+ let exchangeCounter = $t073097415._1
187+ let amountWithoutFee = $t073097415._2
188+ let assetIdSend = $t073097415._3
189189 let amountWithFee = fraction(amountWithoutFee, (feeScale6 - routingFee), feeScale6)
190190 if (if ((exchangeCounter == routingSize))
191191 then (amountWithFee >= minAmountToReceive)
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let kActive = "active"
55
66 let kCause = "shutdown_cause"
77
88 let kRoutingFee = "routing_fee"
99
1010 let kAdminPubKey1 = "admin_pub_1"
1111
1212 let kAdminPubKey2 = "admin_pub_2"
1313
1414 let kAdminPubKey3 = "admin_pub_3"
1515
1616 let kMoneyBoxAddress = "money_box_address"
1717
1818 let kPoolInOracle = "pool_"
1919
2020 let digits8 = 8
2121
2222 let scale8 = 100000000
2323
2424 let scale16 = 10000000000000000
2525
2626 let alpha = 50
2727
2828 let alphaDigits = 2
2929
3030 let beta = 4600000000000000
3131
3232 let commission = 3000
3333
3434 let commissionScaleDelimiter = 1000000
3535
3636 let oracle = Address(base58'3PEbqViERCoKnmcSULh6n2aiMvUdSQdCsom')
3737
3838 func getBase58FromOracle (key) = match getString(oracle, key) {
3939 case string: String =>
4040 fromBase58String(string)
4141 case nothing =>
4242 throw((key + "is empty"))
4343 }
4444
4545
4646 let adminPubKey1 = getBase58FromOracle(kAdminPubKey1)
4747
4848 let adminPubKey2 = getBase58FromOracle(kAdminPubKey2)
4949
5050 let adminPubKey3 = getBase58FromOracle(kAdminPubKey3)
5151
5252 let moneyBoxAddress = Address(getBase58FromOracle(kMoneyBoxAddress))
5353
5454 let active = valueOrElse(getBoolean(this, kActive), true)
5555
5656 let routingFee = valueOrErrorMessage(getInteger(oracle, kRoutingFee), "routing_fee is empty")
5757
5858 let feeScale6 = 1000000
5959
6060 func isActive () = if (active)
6161 then unit
6262 else throw("DApp is inactive at this moment")
6363
6464
6565 func isAdminCall (i) = if (containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey))
6666 then unit
6767 else throw("Only admin can call this function")
6868
6969
7070 func throwIsActive () = throw("DApp is already active")
7171
7272
7373 func suspend (cause) = [BooleanEntry(kActive, false), StringEntry(kCause, cause)]
7474
7575
7676 func skewness (x,y) = ((fraction(scale16, x, y) + fraction(scale16, y, x)) / 2)
7777
7878
7979 func invariantCalc (x,y) = {
8080 let sk = skewness(x, y)
8181 (fraction((x + y), scale16, pow(sk, digits8, alpha, alphaDigits, digits8, CEILING)) + (2 * fraction(toInt(pow(fraction(toBigInt(x), toBigInt(y), toBigInt(scale8)), 0, toBigInt(5), 1, (digits8 / 2), DOWN)), pow((sk - beta), digits8, alpha, alphaDigits, digits8, DOWN), scale8)))
8282 }
8383
8484
8585 func checkPossibility (pmtAmount,minAmountToReceive,exchangers,exchangersType,routingAssetsKeys,args1,args2) = {
8686 let dApp1TokenPay = getIntegerValue(addressFromStringValue(exchangers[0]), routingAssetsKeys[0])
8787 let dApp1TokenGet = getIntegerValue(addressFromStringValue(exchangers[0]), routingAssetsKeys[1])
8888 let dApp2TokenPay = getIntegerValue(addressFromStringValue(exchangers[1]), routingAssetsKeys[2])
8989 let dApp2TokenGet = getIntegerValue(addressFromStringValue(exchangers[1]), routingAssetsKeys[3])
9090 let getFrom1TradeWithFee = if ((exchangersType[0] == "cpmm"))
9191 then {
9292 let getFrom1TradeWithoutFee = fraction(dApp1TokenGet, pmtAmount, (pmtAmount + dApp1TokenPay))
9393 fraction(getFrom1TradeWithoutFee, (commissionScaleDelimiter - commission), commissionScaleDelimiter)
9494 }
9595 else if ((exchangersType[0] == "flat"))
9696 then {
9797 let invariant = invariantCalc(dApp1TokenPay, dApp1TokenGet)
9898 let minAmountToReceive1 = args2[0]
9999 let invariantNew = invariantCalc((dApp1TokenPay + pmtAmount), (dApp1TokenGet - minAmountToReceive1))
100100 if ((invariantNew >= invariant))
101101 then minAmountToReceive1
102102 else throw("Flat contract: invariantNew < invariant")
103103 }
104104 else throw("Incorrect exchange type")
105105 let getFrom2TradeWithFee = if ((exchangersType[1] == "cpmm"))
106106 then {
107107 let getFrom2TradeWithoutFee = fraction(dApp2TokenGet, getFrom1TradeWithFee, (getFrom1TradeWithFee + dApp2TokenPay))
108108 fraction(getFrom2TradeWithoutFee, (commissionScaleDelimiter - commission), commissionScaleDelimiter)
109109 }
110110 else if ((exchangersType[1] == "flat"))
111111 then {
112112 let invariant = invariantCalc(dApp2TokenPay, dApp2TokenGet)
113113 let minAmountToReceive2 = args2[1]
114114 let invariantNew = invariantCalc((dApp2TokenPay + getFrom1TradeWithFee), (dApp2TokenGet - minAmountToReceive2))
115115 if ((invariantNew >= invariant))
116116 then minAmountToReceive2
117117 else throw("Flat contract: invariantNew < invariant")
118118 }
119119 else throw("Incorrect exchange type")
120120 (getFrom2TradeWithFee >= minAmountToReceive)
121121 }
122122
123123
124124 @Callable(i)
125125 func routingTrade (exchangers,exchangersType,args1,args2,routingAssetsKeys,minAmountToReceive) = valueOrElse(isActive(), {
126126 let $t052895363 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
127127 let pmtAmount = $t052895363._1
128128 let pmtAssetId = $t052895363._2
129129 if (!(checkPossibility(pmtAmount, minAmountToReceive, exchangers, exchangersType, routingAssetsKeys, args1, args2)))
130130 then throw("Check transaction possibilty: declined")
131131 else if (if (!(isDefined(getString(oracle, (kPoolInOracle + exchangers[0])))))
132132 then true
133133 else !(isDefined(getString(oracle, (kPoolInOracle + exchangers[1])))))
134134 then throw("Pool is not in oracle")
135135 else {
136136 let routingSize = size(exchangers)
137137 func exchangeFold (accumulated,exchanger) = {
138138 let $t058675932 = accumulated
139139 let exchangeCounter = $t058675932._1
140140 let amountsWithFee = $t058675932._2
141141 let assetsIdSend = $t058675932._3
142142 let $t059456143 = if ((exchangeCounter == 0))
143143 then $Tuple2(pmtAssetId, pmtAmount)
144144 else $Tuple2(assetsIdSend, amountsWithFee)
145145 let pmtAssetIdRout = $t059456143._1
146146 let pmtAmountRout = $t059456143._2
147147 if (((if ((exchangeCounter >= 0))
148148 then (routingSize > exchangeCounter)
149149 else false) == true))
150150 then {
151151 let exchangerAddress = addressFromStringValue(exchanger)
152152 let inv = if ((exchangersType[exchangeCounter] == "cpmm"))
153153 then invoke(exchangerAddress, "exchange", [args1[exchangeCounter]], [AttachedPayment(pmtAssetIdRout, pmtAmountRout)])
154154 else if ((exchangersType[exchangeCounter] == "flat"))
155155 then invoke(exchangerAddress, "exchange", [args1[exchangeCounter], args2[exchangeCounter]], [AttachedPayment(pmtAssetIdRout, pmtAmountRout)])
156156 else throw("Incorrect exchange type")
157157 if ((inv == inv))
158158 then match inv {
159- case inv: (Int, ByteVector) =>
160- let $t069867024 = inv
161- let amountWithFee = $t069867024._1
162- let assetIdSend = $t069867024._2
159+ case inv: (Int, Unit)|(Int, ByteVector) =>
160+ let $t069917029 = inv
161+ let amountWithFee = $t069917029._1
162+ let assetIdSend = $t069917029._2
163163 $Tuple3((exchangeCounter + 1), amountWithFee, assetIdSend)
164164 case _ =>
165165 throw("Incorrect invoke result: expected amountWithFee and assetsIdSend")
166166 }
167167 else throw("Strict value is not equal to itself.")
168168 }
169169 else accumulated
170170 }
171171
172- let $t073047410 = {
172+ let $t073097415 = {
173173 let $l = exchangers
174174 let $s = size($l)
175175 let $acc0 = $Tuple3(0, 0, base58'')
176176 func $f0_1 ($a,$i) = if (($i >= $s))
177177 then $a
178178 else exchangeFold($a, $l[$i])
179179
180180 func $f0_2 ($a,$i) = if (($i >= $s))
181181 then $a
182182 else throw("List size exceeds 3")
183183
184184 $f0_2($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3)
185185 }
186- let exchangeCounter = $t073047410._1
187- let amountWithoutFee = $t073047410._2
188- let assetIdSend = $t073047410._3
186+ let exchangeCounter = $t073097415._1
187+ let amountWithoutFee = $t073097415._2
188+ let assetIdSend = $t073097415._3
189189 let amountWithFee = fraction(amountWithoutFee, (feeScale6 - routingFee), feeScale6)
190190 if (if ((exchangeCounter == routingSize))
191191 then (amountWithFee >= minAmountToReceive)
192192 else false)
193193 then [ScriptTransfer(i.caller, amountWithFee, assetIdSend), ScriptTransfer(moneyBoxAddress, (amountWithoutFee - amountWithFee), assetIdSend)]
194194 else throw("routing != routingSize or amountToRecieve < minAmountToReceive")
195195 }
196196 })
197197
198198
199199
200200 @Callable(i)
201201 func shutdown () = valueOrElse(isAdminCall(i), if (!(active))
202202 then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, kCause), "the cause wasn't specified")))
203203 else suspend("Paused by admin"))
204204
205205
206206
207207 @Callable(i)
208208 func activate () = valueOrElse(isAdminCall(i), if (active)
209209 then throwIsActive()
210210 else [BooleanEntry(kActive, true), DeleteEntry(kCause)])
211211
212212
213213 @Verifier(tx)
214214 func verify () = {
215215 let multiSignedByAdmins = {
216216 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
217217 then 1
218218 else 0
219219 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
220220 then 1
221221 else 0
222222 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
223223 then 1
224224 else 0
225225 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
226226 }
227227 match tx {
228228 case _ =>
229229 multiSignedByAdmins
230230 }
231231 }
232232

github/deemru/w8io/0e76f2f 
112.98 ms