tx · 9rB3oP9AyswbxnTspNGxTbhrWcS5YqQfF97caTA9N3CS

3N8rwRVNrxgqwFiVCNyX2Zyy6Lzgd1fDctN:  -0.01400000 Waves

2021.12.29 18:57 [1855717] smart account 3N8rwRVNrxgqwFiVCNyX2Zyy6Lzgd1fDctN > SELF 0.00000000 Waves

{ "type": 13, "id": "9rB3oP9AyswbxnTspNGxTbhrWcS5YqQfF97caTA9N3CS", "fee": 1400000, "feeAssetId": null, "timestamp": 1640793499556, "version": 2, "chainId": 84, "sender": "3N8rwRVNrxgqwFiVCNyX2Zyy6Lzgd1fDctN", "senderPublicKey": "2SGdJb3x9Ak59xjRyHMHFxLvh6dC5m37urdsBJy3f6TU", "proofs": [ "27NC7w1F1RLXsay9PPqB266vLSUrdWZGpa3m4wKoyyW3Qr6bN3hgn1Yvu4wWs8Ea5gwBLkP4xbkRWJTWhowXXhTy", "4RptfRFc2EZRJLX2H6ZWpV3TmjWiKDXzqjzdtRHmVPpjCyNryKgr5QwfV4fEvhVwveVb4GAvYq5D5nkRitt6ZArx" ], "script": "base64:AAIFAAAAAAAAEJoIAhIAEgMKAQESBAoCAQESABIECgIBARIAEgASAwoBARIFCgMEAQgSABoRCgFBEgxhZG1pblB1YktleTMaEQoBQhIMYWRtU3RhcnRTdG9wGg8KAUMSCmFkbVN0YWtpbmcaDAoBRBIHZ292QWRkchoJCgFFEgRVU0ROGgkKAUYSBEVVUk4aEgoBRxINc3Rha2luZ0Fzc2V0cxobCgFIEhZzdGFraW5nVVNETk5TQlRBZGRyZXNzGhcKAUkSEnN0YWtpbmdFVVJOQWRkcmVzcxoNCgFKEghpc0FjdGl2ZRoQCgFLEgtzdHJBc3NldElkQRoQCgFMEgtzdHJBc3NldElkQhoNCgFNEghhc3NldElkQRoNCgFOEghhc3NldElkQhoPCgFPEgphc3NldE5hbWVBGgcKAVASAmlkGgoKAVESBXdhdmVzGg8KAVISCmFzc2V0TmFtZUIaDQoBUxIIYmFsYW5jZUEaDQoBVBIIYmFsYW5jZUIaEQoBVRIMc2hhcmVBc3NldElkGhUKAVYSEHNoYXJlQXNzZXRTdXBwbHkaDgoBVxIJaW52YXJpYW50GggKAVgSA2ZlZRoSCgFZEg1mZWVHb3Zlcm5hbmNlGg4KAVoSCWZlZVNjYWxlNhoMCgFhEgd2ZXJzaW9uGhMKAmFBEg1pbnZhcmlhbnRDYWxjGggKAmFCEgJzaxoZCgJhQxITY2FsY3VsYXRlU2VuZEFtb3VudBobCgJhRBIVYW1vdW50VG9TZW5kRXN0aW1hdGVkGhsKAmFFEhVtaW5Ub2tlblJlY2VpdmVBbW91bnQaGAoCYUYSEnRva2VuUmVjZWl2ZUFtb3VudBoNCgJhRxIHdG9rZW5JZBoTCgJhSBINc2xpcHBhZ2VWYWx1ZRokCgJhSRIeZGVsdGFCZXR3ZWVuTWF4QW5kTWluU2VuZFZhbHVlGhIKAmFKEgxpbnZhcmlhbnROZXcaHQoCYUsSF2ludmFyaWFudEVzdGltYXRlZFJhdGlvGhMKAmFMEg1nZXRTdGVwQW1vdW50GgkKAmFNEgNhY2MaCgoCYU4SBHN0ZXAaEgoCYU8SDGFtb3VudFRvU2VuZBoTCgJhUBINc3RlcEludmFyaWFudBoQCgJhURIKc3RlcEFtb3VudBoICgJhUhICJGwaCAoCYVMSAiRzGgsKAmFUEgUkYWNjMBoLCgJhVRIFJGYwXzEaCAoCYVYSAiRhGggKAmFXEgIkaRoLCgJhWBIFJGYwXzIaEgoCYVkSDGdldEFzc2V0SW5mbxoOCgJhWhIIc3RyaW5nSWQaDAoCYWESBnNjYWxlMxoMCgJhYhIGc2NhbGU4Gg0KAmFjEgdzY2FsZTEyGhQKAmFkEg5zbGlwcGFnZVNjYWxlMxoNCgJhZRIHZGlnaXRzOBoTCgJhZhINZEFwcFRocmVzaG9sZBoZCgJhZxITZEFwcFRocmVzaG9sZFNjYWxlMhobCgJhaBIVZXhjaGFuZ2VSYXRpb0xpbWl0TWluGhsKAmFpEhVleGNoYW5nZVJhdGlvTGltaXRNYXgaCwoCYWoSBWFscGhhGhEKAmFrEgthbHBoYURpZ2l0cxoKCgJhbBIEYmV0YRoUCgJhbRIOYWNjb3VudEJhbGFuY2UaDQoCYW4SB2Fzc2V0SWQaEgoCYW8SDHN0YWtlZEFtb3VudBocCgJhcBIWc3Rha2VkQW1vdW50Q2FsY3VsYXRlZBoJCgJhcRIDYUlkGgcKAmFyEgFpGhMKAmFzEg1zdGFrZWRBbW91bnRBGhMKAmF0Eg1zdGFrZWRBbW91bnRCGh8KAmF1EhlhY2NvdW50QmFsYW5jZVdpdGhTdGFrZWRBGh8KAmF2EhlhY2NvdW50QmFsYW5jZVdpdGhTdGFrZWRCGhYKAmF3EhBoYXNFbm91Z2hCYWxhbmNlGg4KAmF4Eghza2V3bmVzcxoHCgJheRIBeBoHCgJhehIBeRoNCgFiEghrVmVyc2lvbhoRCgJiQRILJHQwOTMxMzkzOTAaFAoCYkISDnBtdFN0ckFzc2V0SWRBGhMKAmJDEg1wbXRBc3NldE5hbWVBGhIKAmJEEgxwbXREZWNpbWFsc0EaEQoCYkUSCyR0MDkzOTU5NDcyGhQKAmJGEg5wbXRTdHJBc3NldElkQhoTCgJiRxINcG10QXNzZXROYW1lQhoSCgJiSBIMcG10RGVjaW1hbHNCGg8KAmJJEglzaGFyZU5hbWUaFgoCYkoSEHNoYXJlRGVzY3JpcHRpb24aEwoCYksSDXNoYXJlRGVjaW1hbHMaGAoCYkwSEnNoYXJlSW5pdGlhbFN1cHBseRoQCgJiTRIKc2hhcmVJc3N1ZRoSCgJiThIMc2hhcmVJc3N1ZUlkGhkKAmJPEhNpbnZhcmlhbnRDYWxjdWxhdGVkGgwKAmJQEgZzdGFrZTEaDAoCYlESBnN0YWtlMhoXCgJiUhIRc2xpcHBhZ2VUb2xlcmFuY2UaEwoCYlMSDSR0MDExOTkyMTIwNjkaEwoCYlQSDSR0MDEyMDc0MTIyNjgaEAoCYlUSCnRva2VuUmF0aW8aGQoCYlYSE3JhdGlvU2hhcmVUb2tlbnNJbkEaGQoCYlcSE3JhdGlvU2hhcmVUb2tlbnNJbkIaGwoCYlgSFXNoYXJlVG9rZW5Ub1BheUFtb3VudBoZCgJiWRITdmlydHVhbFN3YXBUb2tlblBheRoZCgJiWhITdmlydHVhbFN3YXBUb2tlbkdldBoKCgJiYRIEaW5mbxoNCgJiYhIHc3VzcGVuZBoLCgJiYxIFY2F1c2UaEwoCYmQSDXRocm93SXNBY3RpdmUaFQoCYmUSD3Rocm93SXNJbmFjdGl2ZRoUCgJiZhIOdGhyb3dPbmx5QWRtaW4aEQoCYmcSC3Rocm93QXNzZXRzGhQKAmJoEg50aHJvd1RocmVzaG9sZBoPCgJiaRIJdGhyZXNob2xkGg0KAmJqEgdhbW91bnRBGg0KAmJrEgdhbW91bnRCGhcKAmJsEhFzdXNwZW5kU3VzcGljaW91cxoeCgJibRIYY2FsY1N0YWtpbmdGdW5jQW5kQWRkcmVzGgsKAmJuEgVzdGFrZRoXCgJibxIRY2FsY1N0YWtpbmdQYXJhbXMaDAoCYnASBmFtb3VudBoRCgJicRILJHQwODgyNjg4OTIaCgoCYnISBGNhbGwaEQoCYnMSC3N0YWtpbmdBZGRyGhEKAmJ0EgskdDA4OTc4OTA0NBoRCgJidRILJHQwOTE0OTkyMjYaEAoCYnYSCnBtdEFtb3VudEEaEQoCYncSC3BtdEFzc2V0SWRBGhEKAmJ4EgskdDA5MjMxOTMwOBoQCgJieRIKcG10QW1vdW50QhoRCgJiehILcG10QXNzZXRJZEIaDAoBYxIHa0FjdGl2ZRoeCgJjQRIYZXN0aW1hdGVkQW1vdW50VG9SZWNlaXZlGhgKAmNCEhJtaW5BbW91bnRUb1JlY2VpdmUaEwoCY0MSDSR0MDIwMzgwMjA0NTUaEQoCY0QSC3NlbmRBc3NldElkGhYKAmNFEhBnb3Zlcm5hbmNlUmV3YXJkGhQKAmNGEg5hbW91bnRNaW51c0ZlZRoTCgJjRxINJHQwMjE4NzcyMjEzORoTCgJjSBINJHQwMjI0MzcyMjUxMBoTCgJjSRINJHQwMjI1MjMyMjYwMxoVCgJjShIPc2VuZFN0ckFzc2V0SWRCGhQKAmNLEg5zZW5kQXNzZXROYW1lQhoTCgJjTBINc2VuZERlY2ltYWxzQhoRCgJjTRILYW1vdW50TGVhdmUaEgoCY04SDHVuY291bnRhYmxlQRoSCgJjTxIMdW5jb3VudGFibGVCGhMKAmNQEg1hbW91bnRFbnJvbGxBGhMKAmNREg1hbW91bnRFbnJvbGxCGhMKAmNSEg1hc3NldElkU3RyaW5nGhMKAmNTEg0kdDAyNTkxODI2MDIxGgoKAmNUEgRhZGRyGgwKAmNVEgZwYXJhbXMaDgoCY1YSCHBheW1lbnRzGgkKAmNXEgNpbnYaCAoCY1gSAnR4GgwKAmNZEgZ2ZXJpZnkaGQoCY1oSE211bHRpU2lnbmVkQnlBZG1pbnMaEwoCY2ESDSR0MDE0NTY3MTQ2NDIaDwoCY2ISCXBtdEFtb3VudBoQCgJjYxIKcG10QXNzZXRJZBoTCgJjZBINJHQwMTQ2NDcxNDcyMBoTCgJjZRINcG10U3RyQXNzZXRJZBoSCgJjZhIMcG10QXNzZXROYW1lGhEKAmNnEgtwbXREZWNpbWFscxoVCgJjaBIPcG10TWluVGhyZXNob2xkGiMKAmNpEh10aHJlc2hvbGRWYWx1ZUZvck1pblRvbGVyYW5jZRoPCgJjahIJdG9sZXJhbmNlGiIKAmNrEhxzbGlwcGFnZVZhbHVlTWluRm9yUmVwbGVuaXNoGiIKAmNsEhxzbGlwcGFnZVZhbHVlTWF4Rm9yUmVwbGVuaXNoGh0KAmNtEhdzbGlwcGFnZVZhbHVlTWluRm9yU3dhcBoTCgJjbhINJHQwMTU3MzIxNjQ5NxoXCgJjbxIRdmlydHVhbFJlcGxlbmlzaEEaFwoCY3ASEXZpcnR1YWxSZXBsZW5pc2hCGhcKAmNxEhFiYWxhbmNlQWZ0ZXJTd2FwQRoXCgJjchIRYmFsYW5jZUFmdGVyU3dhcEIaEQoCY3MSC25ld0JhbGFuY2VBGhEKAmN0EgtuZXdCYWxhbmNlQhoVCgJjdRIPbmV3QmFsYW5jZUVudHJ5GisKAmN2EiVyYXRpb1ZpcnR1YWxCYWxhbmNlVG9WaXJ0dWFsUmVwbGVuaXNoGhkKAmN3EhNkQXBwVGhyZXNob2xkQW1vdW50GhMKAmN4Eg0kdDAxODcyMzE4ODY2GhIKAmN5EgxhbW91bnRUb1BheUEaEgoCY3oSDGFtb3VudFRvUGF5QhoOCgFkEglrQXNzZXRJZEEaGAoCZGESEmFkbWluUHViS2V5MVNpZ25lZBoYCgJkYhISYWRtaW5QdWJLZXkyU2lnbmVkGhgKAmRjEhJhZG1pblB1YktleTNTaWduZWQaGQoCZGQSE2NhbGxUYWtlSW50b0FjY291bnQaEwoCZGUSDXNpZ25lZEJ5QWRtaW4aDgoBZRIJa0Fzc2V0SWRCGg4KAWYSCWtCYWxhbmNlQRoOCgFnEglrQmFsYW5jZUIaEgoBaBINa1NoYXJlQXNzZXRJZBoWCgFpEhFrU2hhcmVBc3NldFN1cHBseRoJCgFqEgRrRmVlGhcKAWsSEmtGZWVTY2FsZURlbGltaXRlchoPCgFsEgprSW52YXJpYW50GgsKAW0SBmtDYXVzZRoXCgFuEhJrZXlVU0ROTlNCVEFkZHJlc3MaEwoBbxIOa2V5RVVSTkFkZHJlc3MaFAoBcBIPa2V5QWRtaW5QdWJLZXkxGhQKAXESD2tleUFkbWluUHViS2V5MhoUCgFyEg9rZXlBZG1pblB1YktleTMaCwoBcxIGb3JhY2xlGhAKAXQSC2dldEFkbWluUHViGhAKAXUSC2tleUFkbWluUHViGgwKAXYSByRtYXRjaDAaCwoBdxIGc3RyaW5nGgwKAXgSB25vdGhpbmcaEQoBeRIMYWRtaW5QdWJLZXkxGhEKAXoSDGFkbWluUHViS2V5MgAAAE4AAAAAAWECAAAABTIuMC4wAAAAAAFiAgAAAAd2ZXJzaW9uAAAAAAFjAgAAAAZhY3RpdmUAAAAAAWQCAAAACkFfYXNzZXRfaWQAAAAAAWUCAAAACkJfYXNzZXRfaWQAAAAAAWYCAAAAD0FfYXNzZXRfYmFsYW5jZQAAAAABZwIAAAAPQl9hc3NldF9iYWxhbmNlAAAAAAFoAgAAAA5zaGFyZV9hc3NldF9pZAAAAAABaQIAAAASc2hhcmVfYXNzZXRfc3VwcGx5AAAAAAFqAgAAAApjb21taXNzaW9uAAAAAAFrAgAAABpjb21t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", "height": 1855717, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: FDnfSgeBuZJq2fDt64MpCnXYmTMoB3jLXoQ9ggmaA4BW Next: FaRA8aykCEdvXnmPqE8V8YCGBS1bWsViXU9YMGAURbji Diff:
OldNewDifferences
177177
178178 let stakedAmountB = stakedAmount(assetIdB)
179179
180-let availableBalanceA = (balanceA - stakedAmountA)
181-
182-let availableBalanceB = (balanceB - stakedAmountB)
183-
184180 let accountBalanceWithStakedA = (accountBalance(assetIdA) + stakedAmountA)
185181
186182 let accountBalanceWithStakedB = (accountBalance(assetIdB) + stakedAmountB)
275271 func throwThreshold (threshold,amountA,amountB) = throw(((((((((("New balance in assets of the DApp is less than threshold " + toString(threshold)) + ": ") + toString(amountA)) + " ") + assetNameA) + ", ") + toString(amountB)) + " ") + assetNameB))
276272
277273
278-func throwInsufficientAvailableBalances (amountA,amountB) = throw((((((((((((((((("Insufficient DApp balance to pay " + toString(amountA)) + " ") + assetNameA) + " and ") + toString(amountB)) + " ") + assetNameB) + " due to staking. Available: ") + toString(availableBalanceA)) + " ") + assetNameA) + " and ") + toString(availableBalanceB)) + " ") + assetNameB) + ". Please contact support in Telegram: https://t.me/swopfisupport"))
279-
280-
281274 func suspendSuspicious () = suspend(((((((((((((((("Suspicious state. Actual balances: " + toString(balanceA)) + " ") + assetNameA) + ", ") + toString(balanceB)) + " ") + assetNameB) + ". State: ") + toString(accountBalance(assetIdA))) + " ") + assetNameA) + ", ") + toString(accountBalance(assetIdB))) + " ") + assetNameB))
282275
283276
292285
293286 func calcStakingParams (stake,amount,assetId) = if (stake)
294287 then {
295- let $t095829648 = calcStakingFuncAndAddres(stake, assetId)
296- let call = $t095829648._1
297- let stakingAddr = $t095829648._2
288+ let $t088268892 = calcStakingFuncAndAddres(stake, assetId)
289+ let call = $t088268892._1
290+ let stakingAddr = $t088268892._2
298291 $Tuple4(call, stakingAddr, nil, [AttachedPayment(assetId, amount)])
299292 }
300293 else {
301- let $t097349800 = calcStakingFuncAndAddres(stake, assetId)
302- let call = $t097349800._1
303- let stakingAddr = $t097349800._2
294+ let $t089789044 = calcStakingFuncAndAddres(stake, assetId)
295+ let call = $t089789044._1
296+ let stakingAddr = $t089789044._2
304297 $Tuple4(call, stakingAddr, [amount, toBase58String(assetId)], nil)
305298 }
306299
307300
308301 @Callable(i)
309302 func init () = {
310- let $t099059982 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
311- let pmtAmountA = $t099059982._1
312- let pmtAssetIdA = $t099059982._2
313- let $t0998710064 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
314- let pmtAmountB = $t0998710064._1
315- let pmtAssetIdB = $t0998710064._2
316- let $t01006910146 = getAssetInfo(pmtAssetIdA)
317- let pmtStrAssetIdA = $t01006910146._1
318- let pmtAssetNameA = $t01006910146._2
319- let pmtDecimalsA = $t01006910146._3
320- let $t01015110228 = getAssetInfo(pmtAssetIdB)
321- let pmtStrAssetIdB = $t01015110228._1
322- let pmtAssetNameB = $t01015110228._2
323- let pmtDecimalsB = $t01015110228._3
303+ let $t091499226 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
304+ let pmtAmountA = $t091499226._1
305+ let pmtAssetIdA = $t091499226._2
306+ let $t092319308 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
307+ let pmtAmountB = $t092319308._1
308+ let pmtAssetIdB = $t092319308._2
309+ let $t093139390 = getAssetInfo(pmtAssetIdA)
310+ let pmtStrAssetIdA = $t093139390._1
311+ let pmtAssetNameA = $t093139390._2
312+ let pmtDecimalsA = $t093139390._3
313+ let $t093959472 = getAssetInfo(pmtAssetIdB)
314+ let pmtStrAssetIdB = $t093959472._1
315+ let pmtAssetNameB = $t093959472._2
316+ let pmtDecimalsB = $t093959472._3
324317 if (isDefined(getBoolean(this, kActive)))
325318 then throwIsActive()
326319 else if ((pmtAssetIdA == pmtAssetIdB))
357350 let pmtAssetIdB = i.payments[1].assetId
358351 let pmtAmountA = i.payments[0].amount
359352 let pmtAmountB = i.payments[1].amount
360- let $t01274812825 = getAssetInfo(pmtAssetIdA)
361- let pmtStrAssetIdA = $t01274812825._1
362- let pmtAssetNameA = $t01274812825._2
363- let pmtDecimalsA = $t01274812825._3
364- let $t01283013024 = getAssetInfo(pmtAssetIdB)
365- let pmtStrAssetIdB = $t01283013024._1
366- let pmtAssetNameB = $t01283013024._2
367- let pmtDecimalsB = $t01283013024._3
353+ let $t01199212069 = getAssetInfo(pmtAssetIdA)
354+ let pmtStrAssetIdA = $t01199212069._1
355+ let pmtAssetNameA = $t01199212069._2
356+ let pmtDecimalsA = $t01199212069._3
357+ let $t01207412268 = getAssetInfo(pmtAssetIdB)
358+ let pmtStrAssetIdB = $t01207412268._1
359+ let pmtAssetNameB = $t01207412268._2
360+ let pmtDecimalsB = $t01207412268._3
368361 let tokenRatio = fraction(fraction(scale8, balanceA, pmtAmountA), scale3, fraction(scale8, balanceB, pmtAmountB))
369362 let ratioShareTokensInA = fraction(scale8, pmtAmountA, balanceA)
370363 let ratioShareTokensInB = fraction(scale8, pmtAmountB, balanceB)
411404
412405 @Callable(i)
413406 func replenishWithOneToken (virtualSwapTokenPay,virtualSwapTokenGet) = {
414- let $t01532315398 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
415- let pmtAmount = $t01532315398._1
416- let pmtAssetId = $t01532315398._2
417- let $t01540315476 = getAssetInfo(pmtAssetId)
418- let pmtStrAssetId = $t01540315476._1
419- let pmtAssetName = $t01540315476._2
420- let pmtDecimals = $t01540315476._3
407+ let $t01456714642 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
408+ let pmtAmount = $t01456714642._1
409+ let pmtAssetId = $t01456714642._2
410+ let $t01464714720 = getAssetInfo(pmtAssetId)
411+ let pmtStrAssetId = $t01464714720._1
412+ let pmtAssetName = $t01464714720._2
413+ let pmtDecimals = $t01464714720._3
421414 let pmtMinThreshold = 5000000
422415 let thresholdValueForMinTolerance = 50000000
423416 let tolerance = if ((thresholdValueForMinTolerance > pmtAmount))
439432 else false)
440433 then throwAssets()
441434 else {
442- let $t01648817253 = if ((pmtAssetId == assetIdA))
435+ let $t01573216497 = if ((pmtAssetId == assetIdA))
443436 then $Tuple7((pmtAmount - virtualSwapTokenPay), virtualSwapTokenGet, (balanceA + virtualSwapTokenPay), (balanceB - virtualSwapTokenGet), invariantCalc((balanceA + pmtAmount), balanceB), (balanceA + pmtAmount), balanceB)
444437 else $Tuple7(virtualSwapTokenGet, (pmtAmount - virtualSwapTokenPay), (balanceA - virtualSwapTokenGet), (balanceB + virtualSwapTokenPay), invariantCalc(balanceA, (balanceB + pmtAmount)), balanceA, (balanceB + pmtAmount))
445- let virtualReplenishA = $t01648817253._1
446- let virtualReplenishB = $t01648817253._2
447- let balanceAfterSwapA = $t01648817253._3
448- let balanceAfterSwapB = $t01648817253._4
449- let invariantCalculated = $t01648817253._5
450- let newBalanceA = $t01648817253._6
451- let newBalanceB = $t01648817253._7
438+ let virtualReplenishA = $t01573216497._1
439+ let virtualReplenishB = $t01573216497._2
440+ let balanceAfterSwapA = $t01573216497._3
441+ let balanceAfterSwapB = $t01573216497._4
442+ let invariantCalculated = $t01573216497._5
443+ let newBalanceA = $t01573216497._6
444+ let newBalanceB = $t01573216497._7
452445 let newBalanceEntry = if ((pmtAssetId == assetIdA))
453446 then IntegerEntry(kBalanceA, newBalanceA)
454447 else IntegerEntry(kBalanceB, newBalanceB)
488481
489482 @Callable(i)
490483 func withdraw () = {
491- let $t01947919622 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
492- let pmtAmount = $t01947919622._1
493- let pmtAssetId = $t01947919622._2
484+ let $t01872318866 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
485+ let pmtAmount = $t01872318866._1
486+ let pmtAssetId = $t01872318866._2
494487 let amountToPayA = fraction(pmtAmount, balanceA, shareAssetSupply)
495488 let amountToPayB = fraction(pmtAmount, balanceB, shareAssetSupply)
496489 let invariantCalculated = invariantCalc((balanceA - amountToPayA), (balanceB - amountToPayB))
502495 then throw(("Incorrect asset attached. Expected: " + toBase58String(shareAssetId)))
503496 else if (!(hasEnoughBalance))
504497 then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
505- else if (if ((amountToPayA > availableBalanceA))
506- then true
507- else (amountToPayB > availableBalanceB))
508- then throwInsufficientAvailableBalances(amountToPayA, amountToPayB)
509- else {
510- let stake1 = if (containsElement(stakingAssets, strAssetIdA))
511- then invoke(this, "stakeUnstake", [false, amountToPayA, strAssetIdA], nil)
512- else 0
513- if ((stake1 == stake1))
514- then {
515- let stake2 = if (containsElement(stakingAssets, strAssetIdB))
516- then invoke(this, "stakeUnstake", [false, amountToPayB, strAssetIdB], nil)
517- else 0
518- if ((stake2 == stake2))
519- then [IntegerEntry(kBalanceA, (balanceA - amountToPayA)), IntegerEntry(kBalanceB, (balanceB - amountToPayB)), IntegerEntry(kShareAssetSupply, (shareAssetSupply - pmtAmount)), IntegerEntry(kInvariant, invariantCalculated), Burn(shareAssetId, pmtAmount), ScriptTransfer(i.caller, amountToPayA, assetIdA), ScriptTransfer(i.caller, amountToPayB, assetIdB)]
520- else throw("Strict value is not equal to itself.")
521- }
522- else throw("Strict value is not equal to itself.")
523- }
498+ else {
499+ let stake1 = if (containsElement(stakingAssets, strAssetIdA))
500+ then invoke(this, "stakeUnstake", [false, amountToPayA, strAssetIdA], nil)
501+ else 0
502+ if ((stake1 == stake1))
503+ then {
504+ let stake2 = if (containsElement(stakingAssets, strAssetIdB))
505+ then invoke(this, "stakeUnstake", [false, amountToPayB, strAssetIdB], nil)
506+ else 0
507+ if ((stake2 == stake2))
508+ then [IntegerEntry(kBalanceA, (balanceA - amountToPayA)), IntegerEntry(kBalanceB, (balanceB - amountToPayB)), IntegerEntry(kShareAssetSupply, (shareAssetSupply - pmtAmount)), IntegerEntry(kInvariant, invariantCalculated), Burn(shareAssetId, pmtAmount), ScriptTransfer(i.caller, amountToPayA, assetIdA), ScriptTransfer(i.caller, amountToPayB, assetIdB)]
509+ else throw("Strict value is not equal to itself.")
510+ }
511+ else throw("Strict value is not equal to itself.")
512+ }
524513 }
525514
526515
527516
528517 @Callable(i)
529518 func exchange (estimatedAmountToReceive,minAmountToReceive) = {
530- let $t02129321368 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
531- let pmtAmount = $t02129321368._1
532- let pmtAssetId = $t02129321368._2
519+ let $t02038020455 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
520+ let pmtAmount = $t02038020455._1
521+ let pmtAssetId = $t02038020455._2
533522 if (!(isActive))
534523 then throwIsInactive()
535524 else if ((0 >= estimatedAmountToReceive))
557546 let amount = calculateSendAmount(estimatedAmountToReceive, minAmountToReceive, pmtAmount, pmtAssetId)
558547 let governanceReward = fraction(amount, feeGovernance, feeScale6)
559548 let amountMinusFee = fraction(amount, (feeScale6 - fee), feeScale6)
560- let $t02279023052 = if ((pmtAssetId == assetIdA))
549+ let $t02187722139 = if ((pmtAssetId == assetIdA))
561550 then $Tuple2((balanceA + pmtAmount), ((balanceB - amountMinusFee) - governanceReward))
562551 else $Tuple2(((balanceA - amountMinusFee) - governanceReward), (balanceB + pmtAmount))
563- let newBalanceA = $t02279023052._1
564- let newBalanceB = $t02279023052._2
552+ let newBalanceA = $t02187722139._1
553+ let newBalanceB = $t02187722139._2
565554 let dAppThresholdAmount = fraction((newBalanceA + newBalanceB), dAppThreshold, (2 * dAppThresholdScale2))
566555 if (if ((dAppThresholdAmount > newBalanceA))
567556 then true
568557 else (dAppThresholdAmount > newBalanceB))
569558 then throwThreshold(dAppThresholdAmount, newBalanceA, newBalanceB)
570559 else {
571- let $t02335023423 = getAssetInfo(pmtAssetId)
572- let pmtStrAssetId = $t02335023423._1
573- let pmtAssetName = $t02335023423._2
574- let pmtDecimals = $t02335023423._3
575- let $t02343623516 = getAssetInfo(sendAssetId)
576- let sendStrAssetIdB = $t02343623516._1
577- let sendAssetNameB = $t02343623516._2
578- let sendDecimalsB = $t02343623516._3
560+ let $t02243722510 = getAssetInfo(pmtAssetId)
561+ let pmtStrAssetId = $t02243722510._1
562+ let pmtAssetName = $t02243722510._2
563+ let pmtDecimals = $t02243722510._3
564+ let $t02252322603 = getAssetInfo(sendAssetId)
565+ let sendStrAssetIdB = $t02252322603._1
566+ let sendAssetNameB = $t02252322603._2
567+ let sendDecimalsB = $t02252322603._3
579568 let stake1 = if (containsElement(stakingAssets, pmtStrAssetId))
580569 then invoke(this, "stakeUnstake", [true, pmtAmount, pmtAssetId], nil)
581570 else 0
665654 func stakeUnstake (stake,amount,assetIdString) = if ((i.caller != this))
666655 then throw("Only contract itself can invoke this function")
667656 else {
668- let $t02683126934 = calcStakingParams(stake, amount, fromBase58String(assetIdString))
669- let call = $t02683126934._1
670- let addr = $t02683126934._2
671- let params = $t02683126934._3
672- let payments = $t02683126934._4
657+ let $t02591826021 = calcStakingParams(stake, amount, fromBase58String(assetIdString))
658+ let call = $t02591826021._1
659+ let addr = $t02591826021._2
660+ let params = $t02591826021._3
661+ let payments = $t02591826021._4
673662 let inv = invoke(addr, call, params, payments)
674663 if ((inv == inv))
675664 then nil
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let version = "2.0.0"
55
66 let kVersion = "version"
77
88 let kActive = "active"
99
1010 let kAssetIdA = "A_asset_id"
1111
1212 let kAssetIdB = "B_asset_id"
1313
1414 let kBalanceA = "A_asset_balance"
1515
1616 let kBalanceB = "B_asset_balance"
1717
1818 let kShareAssetId = "share_asset_id"
1919
2020 let kShareAssetSupply = "share_asset_supply"
2121
2222 let kFee = "commission"
2323
2424 let kFeeScaleDelimiter = "commission_scale_delimiter"
2525
2626 let kInvariant = "invariant"
2727
2828 let kCause = "shutdown_cause"
2929
3030 let keyUSDNNSBTAddress = "staking_usdnnsbt_address"
3131
3232 let keyEURNAddress = "staking_eurn_address"
3333
3434 let keyAdminPubKey1 = "admin_pub_1"
3535
3636 let keyAdminPubKey2 = "admin_pub_2"
3737
3838 let keyAdminPubKey3 = "admin_pub_3"
3939
4040 let oracle = Address(base58'3NBBWfzZtZtszaXbitTKnrB2xXwv26Bn7H9')
4141
4242 func getAdminPub (keyAdminPub) = match getString(oracle, keyAdminPub) {
4343 case string: String =>
4444 fromBase58String(string)
4545 case nothing =>
4646 throw("Admin public key is empty")
4747 }
4848
4949
5050 let adminPubKey1 = getAdminPub(keyAdminPubKey1)
5151
5252 let adminPubKey2 = getAdminPub(keyAdminPubKey2)
5353
5454 let adminPubKey3 = getAdminPub(keyAdminPubKey3)
5555
5656 let admStartStop = base58'Kn7NpzaG12dLZgcHf2ipUftU6hbJygmrhFqQYE4B7ZK'
5757
5858 let admStaking = base58'Kn7NpzaG12dLZgcHf2ipUftU6hbJygmrhFqQYE4B7ZK'
5959
6060 let govAddr = Address(base58'3NAGTtZz6WpupSN89NZD5rMZwwziZEg4Kx4')
6161
6262 let USDN = base58'8UrfDVd5GreeUwm7uPk7eYz1eMv376kzR52C6sANPkwS'
6363
6464 let EURN = base58'ECBCkHS68DckpBrzLeoRgYbFg7sCVqR176mPqbXsj9pA'
6565
6666 let stakingAssets = [toBase58String(USDN), toBase58String(EURN)]
6767
6868 let stakingUSDNNSBTAddress = Address(fromBase58String(valueOrErrorMessage(getString(oracle, keyUSDNNSBTAddress), "no usdn staking address")))
6969
7070 let stakingEURNAddress = Address(fromBase58String(valueOrErrorMessage(getString(oracle, keyEURNAddress), "no usdn staking address")))
7171
7272 let isActive = getBooleanValue(this, kActive)
7373
7474 let strAssetIdA = getStringValue(this, kAssetIdA)
7575
7676 let strAssetIdB = getStringValue(this, kAssetIdB)
7777
7878 let assetIdA = if ((strAssetIdA == "WAVES"))
7979 then unit
8080 else fromBase58String(strAssetIdA)
8181
8282 let assetIdB = if ((strAssetIdB == "WAVES"))
8383 then unit
8484 else fromBase58String(strAssetIdB)
8585
8686 let assetNameA = match assetIdA {
8787 case id: ByteVector =>
8888 value(assetInfo(id)).name
8989 case waves: Unit =>
9090 "WAVES"
9191 case _ =>
9292 throw("Match error")
9393 }
9494
9595 let assetNameB = match assetIdB {
9696 case id: ByteVector =>
9797 value(assetInfo(id)).name
9898 case waves: Unit =>
9999 "WAVES"
100100 case _ =>
101101 throw("Match error")
102102 }
103103
104104 let balanceA = getIntegerValue(this, kBalanceA)
105105
106106 let balanceB = getIntegerValue(this, kBalanceB)
107107
108108 let shareAssetId = fromBase58String(getStringValue(this, kShareAssetId))
109109
110110 let shareAssetSupply = getIntegerValue(this, kShareAssetSupply)
111111
112112 let invariant = getIntegerValue(this, kInvariant)
113113
114114 let fee = 500
115115
116116 let feeGovernance = 200
117117
118118 let feeScale6 = 1000000
119119
120120 let scale3 = 1000
121121
122122 let scale8 = 100000000
123123
124124 let scale12 = 1000000000000
125125
126126 let slippageScale3 = 1000
127127
128128 let digits8 = 8
129129
130130 let dAppThreshold = 50
131131
132132 let dAppThresholdScale2 = 100
133133
134134 let exchangeRatioLimitMin = 90000000
135135
136136 let exchangeRatioLimitMax = 110000000
137137
138138 let alpha = 50
139139
140140 let alphaDigits = 2
141141
142142 let beta = 46000000
143143
144144 func accountBalance (assetId) = match assetId {
145145 case id: ByteVector =>
146146 assetBalance(this, id)
147147 case waves: Unit =>
148148 wavesBalance(this).available
149149 case _ =>
150150 throw("Match error")
151151 }
152152
153153
154154 func stakedAmount (assetId) = {
155155 let stakedAmountCalculated = match assetId {
156156 case aId: ByteVector =>
157157 if ((aId == USDN))
158158 then getInteger(stakingUSDNNSBTAddress, ((("rpd_balance_" + toBase58String(aId)) + "_") + toString(this)))
159159 else if ((aId == EURN))
160160 then getInteger(stakingEURNAddress, ((("%s%s%s__stakingBalance__" + toBase58String(aId)) + "__") + toString(this)))
161161 else 0
162162 case _: Unit =>
163163 0
164164 case _ =>
165165 throw("Match error")
166166 }
167167 match stakedAmountCalculated {
168168 case i: Int =>
169169 i
170170 case _ =>
171171 0
172172 }
173173 }
174174
175175
176176 let stakedAmountA = stakedAmount(assetIdA)
177177
178178 let stakedAmountB = stakedAmount(assetIdB)
179179
180-let availableBalanceA = (balanceA - stakedAmountA)
181-
182-let availableBalanceB = (balanceB - stakedAmountB)
183-
184180 let accountBalanceWithStakedA = (accountBalance(assetIdA) + stakedAmountA)
185181
186182 let accountBalanceWithStakedB = (accountBalance(assetIdB) + stakedAmountB)
187183
188184 let hasEnoughBalance = if ((accountBalanceWithStakedA >= balanceA))
189185 then (accountBalanceWithStakedB >= balanceB)
190186 else false
191187
192188 func skewness (x,y) = (((fraction(scale12, x, y) + fraction(scale12, y, x)) / 2) / 10000)
193189
194190
195191 func invariantCalc (x,y) = {
196192 let sk = skewness(x, y)
197193 (fraction((x + y), scale8, pow(sk, digits8, alpha, alphaDigits, digits8, CEILING)) + (2 * fraction(pow(fraction(x, y, scale8), 0, 5, 1, (digits8 / 2), DOWN), pow((sk - beta), digits8, alpha, alphaDigits, digits8, DOWN), scale8)))
198194 }
199195
200196
201197 func calculateSendAmount (amountToSendEstimated,minTokenReceiveAmount,tokenReceiveAmount,tokenId) = {
202198 let slippageValue = (scale8 - ((scale8 * 1) / 10000000))
203199 let deltaBetweenMaxAndMinSendValue = (amountToSendEstimated - minTokenReceiveAmount)
204200 let x = (balanceA + tokenReceiveAmount)
205201 let y = (balanceB + tokenReceiveAmount)
206202 let invariantNew = if ((tokenId == assetIdA))
207203 then invariantCalc(x, (balanceB - amountToSendEstimated))
208204 else if ((tokenId == assetIdB))
209205 then invariantCalc((balanceA - amountToSendEstimated), y)
210206 else throw("Wrong asset in payment")
211207 let invariantEstimatedRatio = fraction(scale8, invariant, invariantNew)
212208 func getStepAmount (acc,step) = if ((acc == -1))
213209 then {
214210 let amountToSend = (amountToSendEstimated - ((step * deltaBetweenMaxAndMinSendValue) / 5))
215211 let stepInvariant = if ((tokenId == assetIdA))
216212 then invariantCalc(x, (balanceB - amountToSend))
217213 else invariantCalc((balanceA - amountToSend), y)
218214 if ((stepInvariant > invariant))
219215 then amountToSend
220216 else -1
221217 }
222218 else acc
223219
224220 let stepAmount = {
225221 let $l = [1, 2, 3, 4, 5]
226222 let $s = size($l)
227223 let $acc0 = -1
228224 func $f0_1 ($a,$i) = if (($i >= $s))
229225 then $a
230226 else getStepAmount($a, $l[$i])
231227
232228 func $f0_2 ($a,$i) = if (($i >= $s))
233229 then $a
234230 else throw("List size exceeds 5")
235231
236232 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
237233 }
238234 if ((0 > stepAmount))
239235 then throw("something went wrong while working with amountToSend")
240236 else if (if ((invariantEstimatedRatio > slippageValue))
241237 then (invariantNew > invariant)
242238 else false)
243239 then amountToSendEstimated
244240 else stepAmount
245241 }
246242
247243
248244 func getAssetInfo (assetId) = match assetId {
249245 case id: ByteVector =>
250246 let stringId = toBase58String(id)
251247 let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
252248 $Tuple3(stringId, info.name, info.decimals)
253249 case waves: Unit =>
254250 $Tuple3("WAVES", "WAVES", 8)
255251 case _ =>
256252 throw("Match error")
257253 }
258254
259255
260256 func suspend (cause) = [BooleanEntry(kActive, false), StringEntry(kCause, cause)]
261257
262258
263259 func throwIsActive () = throw("DApp is already active")
264260
265261
266262 func throwIsInactive () = throw("DApp is inactive at this moment")
267263
268264
269265 func throwOnlyAdmin () = throw("Only admin can call this function")
270266
271267
272268 func throwAssets () = throw(((("Incorrect assets attached. Expected: " + strAssetIdA) + " and ") + strAssetIdB))
273269
274270
275271 func throwThreshold (threshold,amountA,amountB) = throw(((((((((("New balance in assets of the DApp is less than threshold " + toString(threshold)) + ": ") + toString(amountA)) + " ") + assetNameA) + ", ") + toString(amountB)) + " ") + assetNameB))
276272
277273
278-func throwInsufficientAvailableBalances (amountA,amountB) = throw((((((((((((((((("Insufficient DApp balance to pay " + toString(amountA)) + " ") + assetNameA) + " and ") + toString(amountB)) + " ") + assetNameB) + " due to staking. Available: ") + toString(availableBalanceA)) + " ") + assetNameA) + " and ") + toString(availableBalanceB)) + " ") + assetNameB) + ". Please contact support in Telegram: https://t.me/swopfisupport"))
279-
280-
281274 func suspendSuspicious () = suspend(((((((((((((((("Suspicious state. Actual balances: " + toString(balanceA)) + " ") + assetNameA) + ", ") + toString(balanceB)) + " ") + assetNameB) + ". State: ") + toString(accountBalance(assetIdA))) + " ") + assetNameA) + ", ") + toString(accountBalance(assetIdB))) + " ") + assetNameB))
282275
283276
284277 func calcStakingFuncAndAddres (stake,assetId) = if (stake)
285278 then if ((assetId == USDN))
286279 then $Tuple2("lockNeutrino", stakingUSDNNSBTAddress)
287280 else $Tuple2("startStaking", stakingEURNAddress)
288281 else if ((assetId == USDN))
289282 then $Tuple2("unlockNeutrino", stakingUSDNNSBTAddress)
290283 else $Tuple2("stopStaking", stakingEURNAddress)
291284
292285
293286 func calcStakingParams (stake,amount,assetId) = if (stake)
294287 then {
295- let $t095829648 = calcStakingFuncAndAddres(stake, assetId)
296- let call = $t095829648._1
297- let stakingAddr = $t095829648._2
288+ let $t088268892 = calcStakingFuncAndAddres(stake, assetId)
289+ let call = $t088268892._1
290+ let stakingAddr = $t088268892._2
298291 $Tuple4(call, stakingAddr, nil, [AttachedPayment(assetId, amount)])
299292 }
300293 else {
301- let $t097349800 = calcStakingFuncAndAddres(stake, assetId)
302- let call = $t097349800._1
303- let stakingAddr = $t097349800._2
294+ let $t089789044 = calcStakingFuncAndAddres(stake, assetId)
295+ let call = $t089789044._1
296+ let stakingAddr = $t089789044._2
304297 $Tuple4(call, stakingAddr, [amount, toBase58String(assetId)], nil)
305298 }
306299
307300
308301 @Callable(i)
309302 func init () = {
310- let $t099059982 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
311- let pmtAmountA = $t099059982._1
312- let pmtAssetIdA = $t099059982._2
313- let $t0998710064 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
314- let pmtAmountB = $t0998710064._1
315- let pmtAssetIdB = $t0998710064._2
316- let $t01006910146 = getAssetInfo(pmtAssetIdA)
317- let pmtStrAssetIdA = $t01006910146._1
318- let pmtAssetNameA = $t01006910146._2
319- let pmtDecimalsA = $t01006910146._3
320- let $t01015110228 = getAssetInfo(pmtAssetIdB)
321- let pmtStrAssetIdB = $t01015110228._1
322- let pmtAssetNameB = $t01015110228._2
323- let pmtDecimalsB = $t01015110228._3
303+ let $t091499226 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
304+ let pmtAmountA = $t091499226._1
305+ let pmtAssetIdA = $t091499226._2
306+ let $t092319308 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
307+ let pmtAmountB = $t092319308._1
308+ let pmtAssetIdB = $t092319308._2
309+ let $t093139390 = getAssetInfo(pmtAssetIdA)
310+ let pmtStrAssetIdA = $t093139390._1
311+ let pmtAssetNameA = $t093139390._2
312+ let pmtDecimalsA = $t093139390._3
313+ let $t093959472 = getAssetInfo(pmtAssetIdB)
314+ let pmtStrAssetIdB = $t093959472._1
315+ let pmtAssetNameB = $t093959472._2
316+ let pmtDecimalsB = $t093959472._3
324317 if (isDefined(getBoolean(this, kActive)))
325318 then throwIsActive()
326319 else if ((pmtAssetIdA == pmtAssetIdB))
327320 then throw("Assets must be different")
328321 else {
329322 let shareName = ((("s" + take(pmtAssetNameA, 7)) + "_") + take(pmtAssetNameB, 7))
330323 let shareDescription = ((((("ShareToken of SwopFi protocol for " + pmtAssetNameA) + " and ") + pmtAssetNameB) + " at address ") + toString(this))
331324 let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
332325 let shareInitialSupply = fraction(pow(pmtAmountA, pmtDecimalsA, 5, 1, pmtDecimalsA, DOWN), pow(pmtAmountB, pmtDecimalsB, 5, 1, pmtDecimalsB, DOWN), pow(10, 0, shareDecimals, 0, 0, DOWN))
333326 let shareIssue = Issue(shareName, shareDescription, shareInitialSupply, shareDecimals, true)
334327 let shareIssueId = calculateAssetId(shareIssue)
335328 let invariantCalculated = invariantCalc(pmtAmountA, pmtAmountB)
336329 let stake1 = if (containsElement(stakingAssets, pmtStrAssetIdA))
337330 then invoke(this, "stakeUnstake", [true, pmtAmountA, pmtStrAssetIdA], nil)
338331 else 0
339332 if ((stake1 == stake1))
340333 then {
341334 let stake2 = if (containsElement(stakingAssets, pmtStrAssetIdB))
342335 then invoke(this, "stakeUnstake", [true, pmtAmountB, pmtStrAssetIdB], nil)
343336 else 0
344337 if ((stake2 == stake2))
345338 then [StringEntry(kVersion, version), BooleanEntry(kActive, true), StringEntry(kAssetIdA, pmtStrAssetIdA), StringEntry(kAssetIdB, pmtStrAssetIdB), IntegerEntry(kBalanceA, pmtAmountA), IntegerEntry(kBalanceB, pmtAmountB), IntegerEntry(kInvariant, invariantCalculated), IntegerEntry(kFee, fee), IntegerEntry(kFeeScaleDelimiter, feeScale6), shareIssue, StringEntry(kShareAssetId, toBase58String(shareIssueId)), IntegerEntry(kShareAssetSupply, shareInitialSupply), ScriptTransfer(i.caller, shareInitialSupply, shareIssueId)]
346339 else throw("Strict value is not equal to itself.")
347340 }
348341 else throw("Strict value is not equal to itself.")
349342 }
350343 }
351344
352345
353346
354347 @Callable(i)
355348 func replenishWithTwoTokens (slippageTolerance) = {
356349 let pmtAssetIdA = i.payments[0].assetId
357350 let pmtAssetIdB = i.payments[1].assetId
358351 let pmtAmountA = i.payments[0].amount
359352 let pmtAmountB = i.payments[1].amount
360- let $t01274812825 = getAssetInfo(pmtAssetIdA)
361- let pmtStrAssetIdA = $t01274812825._1
362- let pmtAssetNameA = $t01274812825._2
363- let pmtDecimalsA = $t01274812825._3
364- let $t01283013024 = getAssetInfo(pmtAssetIdB)
365- let pmtStrAssetIdB = $t01283013024._1
366- let pmtAssetNameB = $t01283013024._2
367- let pmtDecimalsB = $t01283013024._3
353+ let $t01199212069 = getAssetInfo(pmtAssetIdA)
354+ let pmtStrAssetIdA = $t01199212069._1
355+ let pmtAssetNameA = $t01199212069._2
356+ let pmtDecimalsA = $t01199212069._3
357+ let $t01207412268 = getAssetInfo(pmtAssetIdB)
358+ let pmtStrAssetIdB = $t01207412268._1
359+ let pmtAssetNameB = $t01207412268._2
360+ let pmtDecimalsB = $t01207412268._3
368361 let tokenRatio = fraction(fraction(scale8, balanceA, pmtAmountA), scale3, fraction(scale8, balanceB, pmtAmountB))
369362 let ratioShareTokensInA = fraction(scale8, pmtAmountA, balanceA)
370363 let ratioShareTokensInB = fraction(scale8, pmtAmountB, balanceB)
371364 let shareTokenToPayAmount = fraction(min([ratioShareTokensInA, ratioShareTokensInB]), shareAssetSupply, scale8)
372365 let invariantCalculated = invariantCalc((balanceA + pmtAmountA), (balanceB + pmtAmountB))
373366 if (!(isActive))
374367 then throwIsInactive()
375368 else if (if ((0 > slippageTolerance))
376369 then true
377370 else (slippageTolerance > 10))
378371 then throw("Slippage tolerance must be <= 1%")
379372 else if ((size(i.payments) != 2))
380373 then throw("Two attached assets expected")
381374 else if (if ((pmtAssetIdA != assetIdA))
382375 then true
383376 else (pmtAssetIdB != assetIdB))
384377 then throwAssets()
385378 else if (if ((((scale3 * (slippageScale3 - slippageTolerance)) / slippageScale3) > tokenRatio))
386379 then true
387380 else (tokenRatio > ((scale3 * (slippageScale3 + slippageTolerance)) / slippageScale3)))
388381 then throw("Incorrect assets amount: amounts must have the contract ratio")
389382 else if ((shareTokenToPayAmount == 0))
390383 then throw("Too small amount to replenish")
391384 else if (!(hasEnoughBalance))
392385 then ([ScriptTransfer(i.caller, pmtAmountA, pmtAssetIdA), ScriptTransfer(i.caller, pmtAmountB, pmtAssetIdB)] ++ suspendSuspicious())
393386 else {
394387 let stake1 = if (containsElement(stakingAssets, pmtStrAssetIdA))
395388 then invoke(this, "stakeUnstake", [true, pmtAmountA, pmtStrAssetIdA], nil)
396389 else 0
397390 if ((stake1 == stake1))
398391 then {
399392 let stake2 = if (containsElement(stakingAssets, pmtStrAssetIdB))
400393 then invoke(this, "stakeUnstake", [true, pmtAmountB, pmtStrAssetIdB], nil)
401394 else 0
402395 if ((stake2 == stake2))
403396 then [IntegerEntry(kBalanceA, (balanceA + pmtAmountA)), IntegerEntry(kBalanceB, (balanceB + pmtAmountB)), IntegerEntry(kShareAssetSupply, (shareAssetSupply + shareTokenToPayAmount)), IntegerEntry(kInvariant, invariantCalculated), Reissue(shareAssetId, shareTokenToPayAmount, true), ScriptTransfer(i.caller, shareTokenToPayAmount, shareAssetId)]
404397 else throw("Strict value is not equal to itself.")
405398 }
406399 else throw("Strict value is not equal to itself.")
407400 }
408401 }
409402
410403
411404
412405 @Callable(i)
413406 func replenishWithOneToken (virtualSwapTokenPay,virtualSwapTokenGet) = {
414- let $t01532315398 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
415- let pmtAmount = $t01532315398._1
416- let pmtAssetId = $t01532315398._2
417- let $t01540315476 = getAssetInfo(pmtAssetId)
418- let pmtStrAssetId = $t01540315476._1
419- let pmtAssetName = $t01540315476._2
420- let pmtDecimals = $t01540315476._3
407+ let $t01456714642 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
408+ let pmtAmount = $t01456714642._1
409+ let pmtAssetId = $t01456714642._2
410+ let $t01464714720 = getAssetInfo(pmtAssetId)
411+ let pmtStrAssetId = $t01464714720._1
412+ let pmtAssetName = $t01464714720._2
413+ let pmtDecimals = $t01464714720._3
421414 let pmtMinThreshold = 5000000
422415 let thresholdValueForMinTolerance = 50000000
423416 let tolerance = if ((thresholdValueForMinTolerance > pmtAmount))
424417 then 100000
425418 else 1
426419 let slippageValueMinForReplenish = (scale8 - ((scale8 * tolerance) / 10000000))
427420 let slippageValueMaxForReplenish = (scale8 + ((scale8 * tolerance) / 10000000))
428421 let slippageValueMinForSwap = (scale8 - ((scale8 * 1) / 10000000))
429422 if (!(isActive))
430423 then throwIsInactive()
431424 else if ((pmtMinThreshold > pmtAmount))
432425 then throw((((("Payment amount " + toString(pmtAmount)) + " does not exceed the minimum amount of ") + toString(pmtMinThreshold)) + " tokens"))
433426 else if ((size(i.payments) != 1))
434427 then throw("One attached payment expected")
435428 else if (!(hasEnoughBalance))
436429 then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
437430 else if (if ((pmtAssetId != assetIdA))
438431 then (pmtAssetId != assetIdB)
439432 else false)
440433 then throwAssets()
441434 else {
442- let $t01648817253 = if ((pmtAssetId == assetIdA))
435+ let $t01573216497 = if ((pmtAssetId == assetIdA))
443436 then $Tuple7((pmtAmount - virtualSwapTokenPay), virtualSwapTokenGet, (balanceA + virtualSwapTokenPay), (balanceB - virtualSwapTokenGet), invariantCalc((balanceA + pmtAmount), balanceB), (balanceA + pmtAmount), balanceB)
444437 else $Tuple7(virtualSwapTokenGet, (pmtAmount - virtualSwapTokenPay), (balanceA - virtualSwapTokenGet), (balanceB + virtualSwapTokenPay), invariantCalc(balanceA, (balanceB + pmtAmount)), balanceA, (balanceB + pmtAmount))
445- let virtualReplenishA = $t01648817253._1
446- let virtualReplenishB = $t01648817253._2
447- let balanceAfterSwapA = $t01648817253._3
448- let balanceAfterSwapB = $t01648817253._4
449- let invariantCalculated = $t01648817253._5
450- let newBalanceA = $t01648817253._6
451- let newBalanceB = $t01648817253._7
438+ let virtualReplenishA = $t01573216497._1
439+ let virtualReplenishB = $t01573216497._2
440+ let balanceAfterSwapA = $t01573216497._3
441+ let balanceAfterSwapB = $t01573216497._4
442+ let invariantCalculated = $t01573216497._5
443+ let newBalanceA = $t01573216497._6
444+ let newBalanceB = $t01573216497._7
452445 let newBalanceEntry = if ((pmtAssetId == assetIdA))
453446 then IntegerEntry(kBalanceA, newBalanceA)
454447 else IntegerEntry(kBalanceB, newBalanceB)
455448 let invariantNew = invariantCalc(balanceAfterSwapA, balanceAfterSwapB)
456449 let invariantEstimatedRatio = fraction(scale8, invariant, invariantNew)
457450 let ratioVirtualBalanceToVirtualReplenish = (fraction((scale8 * scale8), balanceAfterSwapA, balanceAfterSwapB) / fraction(scale8, virtualReplenishA, virtualReplenishB))
458451 let dAppThresholdAmount = fraction((newBalanceA + newBalanceB), dAppThreshold, (2 * dAppThresholdScale2))
459452 if (if ((slippageValueMinForSwap >= invariantEstimatedRatio))
460453 then true
461454 else (invariant > invariantNew))
462455 then throw("Incorrect virtualSwapTokenPay or virtualSwapTokenGet value")
463456 else if (if ((slippageValueMinForReplenish > ratioVirtualBalanceToVirtualReplenish))
464457 then true
465458 else (ratioVirtualBalanceToVirtualReplenish > slippageValueMaxForReplenish))
466459 then throw("Swap with virtualSwapTokenPay and virtualSwapTokenGet is possible, but ratio after virtual swap is incorrect")
467460 else if (if ((dAppThresholdAmount > newBalanceA))
468461 then true
469462 else (dAppThresholdAmount > newBalanceB))
470463 then throwThreshold(dAppThresholdAmount, newBalanceA, newBalanceB)
471464 else {
472465 let stake1 = if (containsElement(stakingAssets, pmtStrAssetId))
473466 then invoke(this, "stakeUnstake", [true, pmtAmount, pmtStrAssetId], nil)
474467 else 0
475468 if ((stake1 == stake1))
476469 then {
477470 let ratioShareTokensInA = fraction(virtualReplenishA, scale8, balanceAfterSwapA)
478471 let ratioShareTokensInB = fraction(virtualReplenishB, scale8, balanceAfterSwapB)
479472 let shareTokenToPayAmount = fraction(min([ratioShareTokensInA, ratioShareTokensInB]), shareAssetSupply, scale8)
480473 [Reissue(shareAssetId, shareTokenToPayAmount, true), ScriptTransfer(i.caller, shareTokenToPayAmount, shareAssetId), IntegerEntry(kShareAssetSupply, (shareAssetSupply + shareTokenToPayAmount)), newBalanceEntry, IntegerEntry(kInvariant, invariantCalculated)]
481474 }
482475 else throw("Strict value is not equal to itself.")
483476 }
484477 }
485478 }
486479
487480
488481
489482 @Callable(i)
490483 func withdraw () = {
491- let $t01947919622 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
492- let pmtAmount = $t01947919622._1
493- let pmtAssetId = $t01947919622._2
484+ let $t01872318866 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
485+ let pmtAmount = $t01872318866._1
486+ let pmtAssetId = $t01872318866._2
494487 let amountToPayA = fraction(pmtAmount, balanceA, shareAssetSupply)
495488 let amountToPayB = fraction(pmtAmount, balanceB, shareAssetSupply)
496489 let invariantCalculated = invariantCalc((balanceA - amountToPayA), (balanceB - amountToPayB))
497490 if (!(isActive))
498491 then throwIsInactive()
499492 else if ((size(i.payments) != 1))
500493 then throw("One attached payment expected")
501494 else if ((pmtAssetId != shareAssetId))
502495 then throw(("Incorrect asset attached. Expected: " + toBase58String(shareAssetId)))
503496 else if (!(hasEnoughBalance))
504497 then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
505- else if (if ((amountToPayA > availableBalanceA))
506- then true
507- else (amountToPayB > availableBalanceB))
508- then throwInsufficientAvailableBalances(amountToPayA, amountToPayB)
509- else {
510- let stake1 = if (containsElement(stakingAssets, strAssetIdA))
511- then invoke(this, "stakeUnstake", [false, amountToPayA, strAssetIdA], nil)
512- else 0
513- if ((stake1 == stake1))
514- then {
515- let stake2 = if (containsElement(stakingAssets, strAssetIdB))
516- then invoke(this, "stakeUnstake", [false, amountToPayB, strAssetIdB], nil)
517- else 0
518- if ((stake2 == stake2))
519- then [IntegerEntry(kBalanceA, (balanceA - amountToPayA)), IntegerEntry(kBalanceB, (balanceB - amountToPayB)), IntegerEntry(kShareAssetSupply, (shareAssetSupply - pmtAmount)), IntegerEntry(kInvariant, invariantCalculated), Burn(shareAssetId, pmtAmount), ScriptTransfer(i.caller, amountToPayA, assetIdA), ScriptTransfer(i.caller, amountToPayB, assetIdB)]
520- else throw("Strict value is not equal to itself.")
521- }
522- else throw("Strict value is not equal to itself.")
523- }
498+ else {
499+ let stake1 = if (containsElement(stakingAssets, strAssetIdA))
500+ then invoke(this, "stakeUnstake", [false, amountToPayA, strAssetIdA], nil)
501+ else 0
502+ if ((stake1 == stake1))
503+ then {
504+ let stake2 = if (containsElement(stakingAssets, strAssetIdB))
505+ then invoke(this, "stakeUnstake", [false, amountToPayB, strAssetIdB], nil)
506+ else 0
507+ if ((stake2 == stake2))
508+ then [IntegerEntry(kBalanceA, (balanceA - amountToPayA)), IntegerEntry(kBalanceB, (balanceB - amountToPayB)), IntegerEntry(kShareAssetSupply, (shareAssetSupply - pmtAmount)), IntegerEntry(kInvariant, invariantCalculated), Burn(shareAssetId, pmtAmount), ScriptTransfer(i.caller, amountToPayA, assetIdA), ScriptTransfer(i.caller, amountToPayB, assetIdB)]
509+ else throw("Strict value is not equal to itself.")
510+ }
511+ else throw("Strict value is not equal to itself.")
512+ }
524513 }
525514
526515
527516
528517 @Callable(i)
529518 func exchange (estimatedAmountToReceive,minAmountToReceive) = {
530- let $t02129321368 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
531- let pmtAmount = $t02129321368._1
532- let pmtAssetId = $t02129321368._2
519+ let $t02038020455 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
520+ let pmtAmount = $t02038020455._1
521+ let pmtAssetId = $t02038020455._2
533522 if (!(isActive))
534523 then throwIsInactive()
535524 else if ((0 >= estimatedAmountToReceive))
536525 then throw(("Estimated amount must be positive. Actual: " + toString(estimatedAmountToReceive)))
537526 else if ((minAmountToReceive > estimatedAmountToReceive))
538527 then throw(((("Minimal amount can't be greater than estimated. Estimated: " + toString(estimatedAmountToReceive)) + ". Minimal: ") + toString(minAmountToReceive)))
539528 else if ((size(i.payments) != 1))
540529 then throw("One attached payment expected")
541530 else if (!(hasEnoughBalance))
542531 then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
543532 else if (if ((pmtAssetId != assetIdA))
544533 then (pmtAssetId != assetIdB)
545534 else false)
546535 then throwAssets()
547536 else if ((10000000 > pmtAmount))
548537 then throw("Only swap of 10.000000 or more tokens is allowed")
549538 else if (if ((exchangeRatioLimitMin > fraction(scale8, minAmountToReceive, pmtAmount)))
550539 then true
551540 else (fraction(scale8, estimatedAmountToReceive, pmtAmount) > exchangeRatioLimitMax))
552541 then throw("Incorrect args and pmt ratio")
553542 else {
554543 let sendAssetId = if ((pmtAssetId == assetIdA))
555544 then assetIdB
556545 else assetIdA
557546 let amount = calculateSendAmount(estimatedAmountToReceive, minAmountToReceive, pmtAmount, pmtAssetId)
558547 let governanceReward = fraction(amount, feeGovernance, feeScale6)
559548 let amountMinusFee = fraction(amount, (feeScale6 - fee), feeScale6)
560- let $t02279023052 = if ((pmtAssetId == assetIdA))
549+ let $t02187722139 = if ((pmtAssetId == assetIdA))
561550 then $Tuple2((balanceA + pmtAmount), ((balanceB - amountMinusFee) - governanceReward))
562551 else $Tuple2(((balanceA - amountMinusFee) - governanceReward), (balanceB + pmtAmount))
563- let newBalanceA = $t02279023052._1
564- let newBalanceB = $t02279023052._2
552+ let newBalanceA = $t02187722139._1
553+ let newBalanceB = $t02187722139._2
565554 let dAppThresholdAmount = fraction((newBalanceA + newBalanceB), dAppThreshold, (2 * dAppThresholdScale2))
566555 if (if ((dAppThresholdAmount > newBalanceA))
567556 then true
568557 else (dAppThresholdAmount > newBalanceB))
569558 then throwThreshold(dAppThresholdAmount, newBalanceA, newBalanceB)
570559 else {
571- let $t02335023423 = getAssetInfo(pmtAssetId)
572- let pmtStrAssetId = $t02335023423._1
573- let pmtAssetName = $t02335023423._2
574- let pmtDecimals = $t02335023423._3
575- let $t02343623516 = getAssetInfo(sendAssetId)
576- let sendStrAssetIdB = $t02343623516._1
577- let sendAssetNameB = $t02343623516._2
578- let sendDecimalsB = $t02343623516._3
560+ let $t02243722510 = getAssetInfo(pmtAssetId)
561+ let pmtStrAssetId = $t02243722510._1
562+ let pmtAssetName = $t02243722510._2
563+ let pmtDecimals = $t02243722510._3
564+ let $t02252322603 = getAssetInfo(sendAssetId)
565+ let sendStrAssetIdB = $t02252322603._1
566+ let sendAssetNameB = $t02252322603._2
567+ let sendDecimalsB = $t02252322603._3
579568 let stake1 = if (containsElement(stakingAssets, pmtStrAssetId))
580569 then invoke(this, "stakeUnstake", [true, pmtAmount, pmtAssetId], nil)
581570 else 0
582571 if ((stake1 == stake1))
583572 then {
584573 let stake2 = if (containsElement(stakingAssets, sendStrAssetIdB))
585574 then invoke(this, "stakeUnstake", [false, (amount + governanceReward), sendAssetId], nil)
586575 else 0
587576 if ((stake2 == stake2))
588577 then [IntegerEntry(kBalanceA, newBalanceA), IntegerEntry(kBalanceB, newBalanceB), IntegerEntry(kInvariant, invariantCalc(newBalanceA, newBalanceB)), ScriptTransfer(i.caller, amountMinusFee, sendAssetId), ScriptTransfer(govAddr, governanceReward, sendAssetId)]
589578 else throw("Strict value is not equal to itself.")
590579 }
591580 else throw("Strict value is not equal to itself.")
592581 }
593582 }
594583 }
595584
596585
597586
598587 @Callable(i)
599588 func shutdown () = if (!(isActive))
600589 then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, kCause), "the cause wasn't specified")))
601590 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, admStartStop], i.callerPublicKey)))
602591 then throwOnlyAdmin()
603592 else suspend("Paused by admin")
604593
605594
606595
607596 @Callable(i)
608597 func activate () = if (isActive)
609598 then throwIsActive()
610599 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, admStartStop], i.callerPublicKey)))
611600 then throwOnlyAdmin()
612601 else [BooleanEntry(kActive, true), DeleteEntry(kCause)]
613602
614603
615604
616605 @Callable(i)
617606 func takeIntoAccountExtraFunds (amountLeave) = {
618607 let uncountableA = (accountBalanceWithStakedA - balanceA)
619608 let uncountableB = (accountBalanceWithStakedB - balanceB)
620609 let amountEnrollA = (uncountableA - (if ((assetIdA == unit))
621610 then amountLeave
622611 else 0))
623612 let amountEnrollB = (uncountableB - (if ((assetIdB == unit))
624613 then amountLeave
625614 else 0))
626615 let invariantNew = invariantCalc((balanceA + amountEnrollA), (balanceB + amountEnrollB))
627616 if (!(isActive))
628617 then throwIsInactive()
629618 else if ((i.caller != this))
630619 then throwOnlyAdmin()
631620 else if ((0 > amountLeave))
632621 then throw(("Argument 'amountLeave' cannot be negative. Actual: " + toString(amountLeave)))
633622 else if (if ((0 > uncountableA))
634623 then true
635624 else (0 > uncountableB))
636625 then suspend("Enroll amount negative")
637626 else if (if ((0 > amountEnrollA))
638627 then true
639628 else (0 > amountEnrollB))
640629 then throw("Too large amountLeave")
641630 else {
642631 let stake1 = if (if (containsElement(stakingAssets, strAssetIdA))
643632 then (amountEnrollA > 0)
644633 else false)
645634 then invoke(this, "stakeUnstake", [true, amountEnrollA, strAssetIdA], nil)
646635 else 0
647636 if ((stake1 == stake1))
648637 then {
649638 let stake2 = if (if (containsElement(stakingAssets, strAssetIdB))
650639 then (amountEnrollB > 0)
651640 else false)
652641 then invoke(this, "stakeUnstake", [true, amountEnrollB, strAssetIdB], nil)
653642 else 0
654643 if ((stake2 == stake2))
655644 then [IntegerEntry(kInvariant, invariantNew), IntegerEntry(kBalanceA, (balanceA + amountEnrollA)), IntegerEntry(kBalanceB, (balanceB + amountEnrollB)), IntegerEntry(("last_income_" + strAssetIdA), amountEnrollA), IntegerEntry(("last_income_" + strAssetIdB), amountEnrollB)]
656645 else throw("Strict value is not equal to itself.")
657646 }
658647 else throw("Strict value is not equal to itself.")
659648 }
660649 }
661650
662651
663652
664653 @Callable(i)
665654 func stakeUnstake (stake,amount,assetIdString) = if ((i.caller != this))
666655 then throw("Only contract itself can invoke this function")
667656 else {
668- let $t02683126934 = calcStakingParams(stake, amount, fromBase58String(assetIdString))
669- let call = $t02683126934._1
670- let addr = $t02683126934._2
671- let params = $t02683126934._3
672- let payments = $t02683126934._4
657+ let $t02591826021 = calcStakingParams(stake, amount, fromBase58String(assetIdString))
658+ let call = $t02591826021._1
659+ let addr = $t02591826021._2
660+ let params = $t02591826021._3
661+ let payments = $t02591826021._4
673662 let inv = invoke(addr, call, params, payments)
674663 if ((inv == inv))
675664 then nil
676665 else throw("Strict value is not equal to itself.")
677666 }
678667
679668
680669
681670 @Callable(i)
682671 func stakeAll () = if (!(isActive))
683672 then throw("DApp is inactive at this moment")
684673 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, admStartStop], i.callerPublicKey)))
685674 then throw("Only admin can call this function")
686675 else {
687676 let stake1 = if (containsElement(stakingAssets, strAssetIdA))
688677 then {
689678 let amountA = (balanceA - stakedAmountA)
690679 if ((amountA > 0))
691680 then invoke(this, "stakeUnstake", [true, amountA, strAssetIdA], nil)
692681 else 0
693682 }
694683 else 0
695684 if ((stake1 == stake1))
696685 then {
697686 let stake2 = if (containsElement(stakingAssets, strAssetIdB))
698687 then {
699688 let amountB = (balanceB - stakedAmountB)
700689 if ((amountB > 0))
701690 then invoke(this, "stakeUnstake", [true, amountB, strAssetIdB], nil)
702691 else 0
703692 }
704693 else 0
705694 if ((stake2 == stake2))
706695 then nil
707696 else throw("Strict value is not equal to itself.")
708697 }
709698 else throw("Strict value is not equal to itself.")
710699 }
711700
712701
713702 @Verifier(tx)
714703 func verify () = {
715704 let multiSignedByAdmins = {
716705 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
717706 then 1
718707 else 0
719708 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
720709 then 1
721710 else 0
722711 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
723712 then 1
724713 else 0
725714 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
726715 }
727716 match tx {
728717 case inv: InvokeScriptTransaction =>
729718 let callTakeIntoAccount = if ((inv.dApp == this))
730719 then (inv.function == "takeIntoAccountExtraFunds")
731720 else false
732721 let signedByAdmin = if (if (if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
733722 then true
734723 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey2))
735724 then true
736725 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey3))
737726 then true
738727 else sigVerify(tx.bodyBytes, tx.proofs[0], admStaking)
739728 if (if (callTakeIntoAccount)
740729 then signedByAdmin
741730 else false)
742731 then true
743732 else multiSignedByAdmins
744733 case _ =>
745734 multiSignedByAdmins
746735 }
747736 }
748737

github/deemru/w8io/3ef1775 
194.80 ms