tx · 6E3Vv7E8GcxNMrx1Dc9DzyZYsM1Cm2qeRv43z1mENb6F

3PPH7x7iqobW5ziyiRCic19rQqKr6nPYaK1:  -0.01400000 Waves

2022.06.02 16:29 [3144299] smart account 3PPH7x7iqobW5ziyiRCic19rQqKr6nPYaK1 > SELF 0.00000000 Waves

{ "type": 13, "id": "6E3Vv7E8GcxNMrx1Dc9DzyZYsM1Cm2qeRv43z1mENb6F", "fee": 1400000, "feeAssetId": null, "timestamp": 1654171529903, "version": 2, "chainId": 87, "sender": "3PPH7x7iqobW5ziyiRCic19rQqKr6nPYaK1", "senderPublicKey": "5aTg4oxM77iRmUGy3y8Zavn5fhVbgtUciAuSGfCJAYjn", "proofs": [ "", "52n4dNKK916RGLRMjNgGcpcFKuLrDDZgDEJC6piwzvdKBPsaR5qe5iYAbKt4qj8bjJsgCnU4n6AmAR472tcqg7iq", "WyT7YcNFtpMe3L7Tvj88Ax6pMQKUK9DAPi3gVwrTj539CQY8fKoLoKrV4SvPpouVzu4dEovukVSQE5ibcKpEXyf" ], "script": "base64:AAIFAAAAAAAAEmgIAhIAEgASBAoCAQESABIECgIBARIAEgASABIFCgMEAQgSABoMCgFBEgckbWF0Y2gwGgsKAUISBnN0cmluZxoMCgFDEgdub3RoaW5nGhEKAUQSDGFkbWluUHViS2V5MRoRCgFFEgxhZG1pblB1YktleTIaEQoBRhIMYWRtaW5QdWJLZXkzGhYKAUcSEWFkbWluUHViS2V5SW52b2tlGhQKAUgSD21vbmV5Qm94QWRkcmVzcxoPCgFJEgpnb3ZBZGRyZXNzGhcKAUoSEnN0YWtpbmdVU0ROQWRkcmVzcxoJCgFLEgRVU0ROGhIKAUwSDXN0YWtpbmdBc3NldHMaCwoBTRIGYWN0aXZlGhAKAU4SC3N0ckFzc2V0SWRBGhAKAU8SC3N0ckFzc2V0SWRCGg0KAVASCGFzc2V0SWRBGg0KAVESCGFzc2V0SWRCGg8KAVISCmFzc2V0TmFtZUEaBwoBUxICaWQaCgoBVBIFd2F2ZXMaDwoBVRIKYXNzZXROYW1lQhoNCgFWEghiYWxhbmNlQRoNCgFXEghiYWxhbmNlQhoRCgFYEgxzaGFyZUFzc2V0SWQaFQoBWRIQc2hhcmVBc3NldFN1cHBseRoOCgFaEglpbnZhcmlhbnQaDAoBYRIHdmVyc2lvbhofCgJhQRIZYWNjb3VudEJhbGFuY2VXaXRoU3Rha2VkQhoWCgJhQhIQaGFzRW5vdWdoQmFsYW5jZRoOCgJhQxIIc2tld25lc3MaBwoCYUQSAXgaBwoCYUUSAXkaEwoCYUYSDWludmFyaWFudENhbGMaCAoCYUcSAnNrGhkKAmFIEhNjYWxjdWxhdGVTZW5kQW1vdW50GhsKAmFJEhVhbW91bnRUb1NlbmRFc3RpbWF0ZWQaGwoCYUoSFW1pblRva2VuUmVjZWl2ZUFtb3VudBoYCgJhSxISdG9rZW5SZWNlaXZlQW1vdW50Gg0KAmFMEgd0b2tlbklkGiMKAmFNEh13b3JzdEFsbG93ZWROZXdJbnZhcmlhbnRSYXRpbxokCgJhThIeZGVsdGFCZXR3ZWVuTWF4QW5kTWluU2VuZFZhbHVlGhMKAmFPEg1nZXRTdGVwQW1vdW50GgkKAmFQEgNhY2MaCgoCYVESBHN0ZXAaEgoCYVISDGFtb3VudFRvU2VuZBoTCgJhUxINc3RlcEludmFyaWFudBoVCgJhVBIPYW1vdW50VG9TZW5kTWluGhIKAmFVEgxpbnZFc3RpbWF0ZWQaBwoCYVYSAWEaCAoCYVcSAiRsGggKAmFYEgIkcxoLCgJhWRIFJGFjYzAaCwoCYVoSBSRmMF8xGgkKAmFhEgNmZWUaEwoCYWISDWZlZUdvdmVybmFuY2UaDwoCYWMSCWZlZVNjYWxlNhoMCgJhZBIGc2NhbGUzGgwKAmFlEgZzY2FsZTgaDQoCYWYSB3NjYWxlMTYaFAoCYWcSDnNsaXBwYWdlU2NhbGUzGg0KAmFoEgdkaWdpdHM4GhMKAmFpEg1kQXBwVGhyZXNob2xkGhkKAmFqEhNkQXBwVGhyZXNob2xkU2NhbGUyGhsKAmFrEhVleGNoYW5nZVJhdGlvTGltaXRNaW4aGwoCYWwSFWV4Y2hhbmdlUmF0aW9MaW1pdE1heBoLCgJhbRIFYWxwaGEaEQoCYW4SC2FscGhhRGlnaXRzGgoKAmFvEgRiZXRhGhQKAmFwEg5hY2NvdW50QmFsYW5jZRoNCgJhcRIHYXNzZXRJZBoSCgJhchIMc3Rha2VkQW1vdW50GhwKAmFzEhZzdGFrZWRBbW91bnRDYWxjdWxhdGVkGgkKAmF0EgNhSWQaBwoCYXUSAWkaEwoCYXYSDXN0YWtlZEFtb3VudEEaEwoCYXcSDXN0YWtlZEFtb3VudEIaFwoCYXgSEWF2YWlsYWJsZUJhbGFuY2VBGhcKAmF5EhFhdmFpbGFibGVCYWxhbmNlQhofCgJhehIZYWNjb3VudEJhbGFuY2VXaXRoU3Rha2VkQRoNCgFiEghrVmVyc2lvbhoRCgJiQRILJHQwOTQ5ODk1NjQaGgoCYkISFGNhbGN1bGF0ZUZlZURpc2NvdW50Gg4KAmJDEgh1c2VyQWRkchoQCgJiRBIKc3dvcEFtb3VudBoUCgJiRRIOZGlzY291bnRWYWx1ZXMaDwoCYkYSCWRpc2NvdW50cxoTCgJiRxINJHQwMTA3MzYxMDgxMxoQCgJiSBIKcG10QW1vdW50QRoRCgJiSRILcG10QXNzZXRJZEEaEwoCYkoSDSR0MDEwODE4MTA4OTUaEAoCYksSCnBtdEFtb3VudEIaEQoCYkwSC3BtdEFzc2V0SWRCGhMKAmJNEg0kdDAxMDkwMDEwOTc3GhQKAmJOEg5wbXRTdHJBc3NldElkQRoTCgJiTxINcG10QXNzZXROYW1lQRoSCgJiUBIMcG10RGVjaW1hbHNBGhMKAmJREg0kdDAxMDk4MjExMDU5GhQKAmJSEg5wbXRTdHJBc3NldElkQhoTCgJiUxINcG10QXNzZXROYW1lQhoSCgJiVBIMcG10RGVjaW1hbHNCGg8KAmJVEglzaGFyZU5hbWUaFgoCYlYSEHNoYXJlRGVzY3JpcHRpb24aEwoCYlcSDXNoYXJlRGVjaW1hbHMaGAoCYlgSEnNoYXJlSW5pdGlhbFN1cHBseRoQCgJiWRIKc2hhcmVJc3N1ZRoSCgJiWhIMc2hhcmVJc3N1ZUlkGggKAmJhEgIkYRoICgJiYhICJGkaCwoCYmMSBSRmMF8yGhUKAmJkEg90dXBsZVNlbmRCZXR0ZXIaEgoCYmUSDGdldEFzc2V0SW5mbxoOCgJiZhIIc3RyaW5nSWQaCgoCYmcSBGluZm8aDQoCYmgSB3N1c3BlbmQaCwoCYmkSBWNhdXNlGhMKAmJqEg10aHJvd0lzQWN0aXZlGg4KAmJrEghpc0FjdGl2ZRoRCgJibBILaXNBZG1pbkNhbGwaEQoCYm0SC3Rocm93QXNzZXRzGhUKAmJuEg90aHJvd09uZVBheW1lbnQaFAoCYm8SDnRocm93VGhyZXNob2xkGg8KAmJwEgl0aHJlc2hvbGQaDQoCYnESB2Ftb3VudEEaDQoCYnISB2Ftb3VudEIaFwoCYnMSEXN1c3BlbmRTdXNwaWNpb3VzGh4KAmJ0EhhjYWxjU3Rha2luZ0Z1bmNBbmRBZGRyZXMaCwoCYnUSBXN0YWtlGhcKAmJ2EhFjYWxjU3Rha2luZ1BhcmFtcxoMCgJidxIGYW1vdW50GhEKAmJ4EgskdDA5MzQ2OTQxMhoKCgJieRIEY2FsbBoRCgJiehILc3Rha2luZ0FkZHIaDAoBYxIHa0FjdGl2ZRoiCgJjQRIcc2xpcHBhZ2VWYWx1ZU1heEZvclJlcGxlbmlzaBodCgJjQhIXc2xpcHBhZ2VWYWx1ZU1pbkZvclN3YXAaEwoCY0MSDSR0MDE3Mjc5MTc5MjEaFwoCY0QSEXZpcnR1YWxSZXBsZW5pc2hBGhcKAmNFEhF2aXJ0dWFsUmVwbGVuaXNoQhoXCgJjRhIRYmFsYW5jZUFmdGVyU3dhcEEaFwoCY0cSEWJhbGFuY2VBZnRlclN3YXBCGhEKAmNIEgtuZXdCYWxhbmNlQRoRCgJjSRILbmV3QmFsYW5jZUIaEgoCY0oSDGludmFyaWFudE5ldxorCgJjSxIlcmF0aW9WaXJ0dWFsQmFsYW5jZVRvVmlydHVhbFJlcGxlbmlzaBoZCgJjTBITZEFwcFRocmVzaG9sZEFtb3VudBojCgJjTRIdc2hhcmVUb2tlblRvUGF5QW1vdW50QWZ0ZXJGZWUaIAoCY04SGnNoYXJlVG9rZW5Hb3Zlcm5hbmNlUmV3YXJkGhwKAmNPEhZnb3Zlcm5hbmNlUmV3YXJkVG9rZW5BGhwKAmNQEhZnb3Zlcm5hbmNlUmV3YXJkVG9rZW5CGhMKAmNREg0kdDAxOTkwODIwMjAzGhEKAmNSEgtzdGFrZUFtb3VudBoTCgJjUxINdW5zdGFrZUFtb3VudBoSCgJjVBIMdW5zdGFrZUFzc2V0GhMKAmNVEg0kdDAyMTQ5MDIxNTY1GhIKAmNWEgxhbW91bnRUb1BheUEaEgoCY1cSDGFtb3VudFRvUGF5QhoeCgJjWBIYZXN0aW1hdGVkQW1vdW50VG9SZWNlaXZlGhgKAmNZEhJtaW5BbW91bnRUb1JlY2VpdmUaEwoCY1oSDSR0MDIzMTE2MjMxOTEaGQoCY2ESE2ludmFyaWFudENhbGN1bGF0ZWQaDAoCY2ISBnN0YWtlMRoMCgJjYxIGc3Rha2UyGhkKAmNkEhNyYXRpb1NoYXJlVG9rZW5zSW5BGhkKAmNlEhNyYXRpb1NoYXJlVG9rZW5zSW5CGhMKAmNmEg0kdDAxMzcwNzEzNzg0GhMKAmNnEg0kdDAxMzc4OTEzOTA2GhMKAmNoEg0kdDAxMzkxMTE0NDE1GgkKAmNpEgNwbXQaDAoCY2oSBmNoYW5nZRoTCgJjaxINY2hhbmdlQXNzZXRJZBoVCgJjbBIPc2hhcmVUb2tlblJhdGlvGhsKAmNtEhVzaGFyZVRva2VuVG9QYXlBbW91bnQaGQoCY24SE3ZpcnR1YWxTd2FwVG9rZW5QYXkaGQoCY28SE3ZpcnR1YWxTd2FwVG9rZW5HZXQaEwoCY3ASDSR0MDE2MTQ4MTYyMjMaDwoCY3ESCXBtdEFtb3VudBoQCgJjchIKcG10QXNzZXRJZBoTCgJjcxINJHQwMTYyMjgxNjMwMRoTCgJjdBINcG10U3RyQXNzZXRJZBoSCgJjdRIMcG10QXNzZXROYW1lGhEKAmN2EgtwbXREZWNpbWFscxoVCgJjdxIPcG10TWluVGhyZXNob2xkGiMKAmN4Eh10aHJlc2hvbGRWYWx1ZUZvck1pblRvbGVyYW5jZRoPCgJjeRIJdG9sZXJhbmNlGiIKAmN6EhxzbGlwcGFnZVZhbHVlTWluRm9yUmVwbGVuaXNoGg4KAWQSCWtBc3NldElkQRoRCgJkYRILc2VuZEFzc2V0SWQaEQoCZGISC2ZlZURpc2NvdW50GhYKAmRjEhBnb3Zlcm5hbmNlUmV3YXJkGhQKAmRkEg5hbW91bnRNaW51c0ZlZRoTCgJkZRINJHQwMjQ2NDQyNDkwNhoTCgJkZhINJHQwMjUyMDUyNTI3OBoTCgJkZxINJHQwMjUyOTEyNTM2OBoUCgJkaBIOc2VuZFN0ckFzc2V0SWQaEwoCZGkSDXNlbmRBc3NldE5hbWUaEgoCZGoSDHNlbmREZWNpbWFscxoTCgJkaxINYW1vdW50RW5yb2xsQRoTCgJkbBINYW1vdW50RW5yb2xsQhoTCgJkbRINYXNzZXRJZFN0cmluZxoTCgJkbhINJHQwMjgzNzIyODQ3NRoKCgJkbxIEYWRkchoMCgJkcBIGcGFyYW1zGg4KAmRxEghwYXltZW50cxoJCgJkchIDaW52GggKAmRzEgJ0eBoMCgJkdBIGdmVyaWZ5GhkKAmR1EhNtdWx0aVNpZ25lZEJ5QWRtaW5zGhgKAmR2EhJhZG1pblB1YktleTFTaWduZWQaGAoCZHcSEmFkbWluUHViS2V5MlNpZ25lZBoYCgJkeBISYWRtaW5QdWJLZXkzU2lnbmVkGhkKAmR5EhNjYWxsVGFrZUludG9BY2NvdW50GhMKAmR6Eg1zaWduZWRCeUFkbWluGg4KAWUSCWtBc3NldElkQhoOCgFmEglrQmFsYW5jZUEaDgoBZxIJa0JhbGFuY2VCGhIKAWgSDWtTaGFyZUFzc2V0SWQaFgoBaRIRa1NoYXJlQXNzZXRTdXBwbHkaCQoBahIEa0ZlZRoPCgFrEgprSW52YXJpYW50GgsKAWwSBmtDYXVzZRoRCgFtEgxrVVNETkFkZHJlc3MaEQoBbhIMa0VVUk5BZGRyZXNzGg8KAW8SCmtEaXNj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", "height": 3144299, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: YPFm4mAthVPQaQHZnc4sC1WDhpF9Tz71xq9suPb5rAx Next: 7qdbm9wRBNoPma9aig3p2teYZgQq2edusEK7qTCpaRLr Diff:
OldNewDifferences
2929
3030 let kEURNAddress = "staking_eurn_address"
3131
32+let kDiscounts = "discounts"
33+
34+let kDiscountValues = "discount_values"
35+
36+let kUserSwopInGov = "_SWOP_amount"
37+
3238 let kAdminPubKey1 = "admin_pub_1"
3339
3440 let kAdminPubKey2 = "admin_pub_2"
3844 let kAdminInvokePubKey = "admin_invoke_pub"
3945
4046 let kMoneyBoxAddress = "money_box_address"
47+
48+let kGovAddress = "governance_address"
4149
4250 let oracle = Address(base58'3PEbqViERCoKnmcSULh6n2aiMvUdSQdCsom')
4351
5866 let adminPubKeyInvoke = getBase58FromOracle(kAdminInvokePubKey)
5967
6068 let moneyBoxAddress = Address(getBase58FromOracle(kMoneyBoxAddress))
69+
70+let govAddress = Address(getBase58FromOracle(kGovAddress))
6171
6272 let stakingUSDNAddress = Address(getBase58FromOracle(kUSDNAddress))
6373
313323
314324 func calcStakingParams (stake,amount,assetId) = if (stake)
315325 then {
316- let $t091419207 = calcStakingFuncAndAddres(stake, assetId)
317- let call = $t091419207._1
318- let stakingAddr = $t091419207._2
326+ let $t093469412 = calcStakingFuncAndAddres(stake, assetId)
327+ let call = $t093469412._1
328+ let stakingAddr = $t093469412._2
319329 $Tuple4(call, stakingAddr, nil, [AttachedPayment(assetId, amount)])
320330 }
321331 else {
322- let $t092939359 = calcStakingFuncAndAddres(stake, assetId)
323- let call = $t092939359._1
324- let stakingAddr = $t092939359._2
332+ let $t094989564 = calcStakingFuncAndAddres(stake, assetId)
333+ let call = $t094989564._1
334+ let stakingAddr = $t094989564._2
325335 $Tuple4(call, stakingAddr, [amount, toBase58String(assetId)], nil)
326336 }
327337
328338
339+func calculateFeeDiscount (userAddr) = {
340+ let swopAmount = valueOrElse(getInteger(govAddress, (toString(userAddr) + kUserSwopInGov)), 0)
341+ let discountValues = split(getStringValue(oracle, kDiscountValues), ",")
342+ let discounts = split(getStringValue(oracle, kDiscounts), ",")
343+ if (if ((swopAmount >= parseIntValue(discountValues[0])))
344+ then (parseIntValue(discountValues[1]) > swopAmount)
345+ else false)
346+ then (feeScale6 - parseIntValue(discounts[0]))
347+ else if (if ((swopAmount >= parseIntValue(discountValues[1])))
348+ then (parseIntValue(discountValues[2]) > swopAmount)
349+ else false)
350+ then (feeScale6 - parseIntValue(discounts[1]))
351+ else if (if ((swopAmount >= parseIntValue(discountValues[2])))
352+ then (parseIntValue(discountValues[3]) > swopAmount)
353+ else false)
354+ then (feeScale6 - parseIntValue(discounts[2]))
355+ else if (if ((swopAmount >= parseIntValue(discountValues[3])))
356+ then (parseIntValue(discountValues[4]) > swopAmount)
357+ else false)
358+ then (feeScale6 - parseIntValue(discounts[3]))
359+ else if ((swopAmount >= parseIntValue(discountValues[4])))
360+ then (feeScale6 - parseIntValue(discounts[4]))
361+ else feeScale6
362+ }
363+
364+
329365 @Callable(i)
330366 func init () = {
331- let $t094649541 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
332- let pmtAmountA = $t094649541._1
333- let pmtAssetIdA = $t094649541._2
334- let $t095469623 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
335- let pmtAmountB = $t095469623._1
336- let pmtAssetIdB = $t095469623._2
337- let $t096289705 = getAssetInfo(pmtAssetIdA)
338- let pmtStrAssetIdA = $t096289705._1
339- let pmtAssetNameA = $t096289705._2
340- let pmtDecimalsA = $t096289705._3
341- let $t097109787 = getAssetInfo(pmtAssetIdB)
342- let pmtStrAssetIdB = $t097109787._1
343- let pmtAssetNameB = $t097109787._2
344- let pmtDecimalsB = $t097109787._3
367+ let $t01073610813 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
368+ let pmtAmountA = $t01073610813._1
369+ let pmtAssetIdA = $t01073610813._2
370+ let $t01081810895 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
371+ let pmtAmountB = $t01081810895._1
372+ let pmtAssetIdB = $t01081810895._2
373+ let $t01090010977 = getAssetInfo(pmtAssetIdA)
374+ let pmtStrAssetIdA = $t01090010977._1
375+ let pmtAssetNameA = $t01090010977._2
376+ let pmtDecimalsA = $t01090010977._3
377+ let $t01098211059 = getAssetInfo(pmtAssetIdB)
378+ let pmtStrAssetIdB = $t01098211059._1
379+ let pmtAssetNameB = $t01098211059._2
380+ let pmtDecimalsB = $t01098211059._3
345381 if (isDefined(getBoolean(this, kActive)))
346382 then throwIsActive()
347383 else if ((pmtAssetIdA == pmtAssetIdB))
378414 let pmtAssetIdB = i.payments[1].assetId
379415 let ratioShareTokensInA = fraction(scale8, i.payments[0].amount, balanceA)
380416 let ratioShareTokensInB = fraction(scale8, i.payments[1].amount, balanceB)
381- let $t01243512512 = getAssetInfo(pmtAssetIdA)
382- let pmtStrAssetIdA = $t01243512512._1
383- let pmtAssetNameA = $t01243512512._2
384- let pmtDecimalsA = $t01243512512._3
385- let $t01251712634 = getAssetInfo(pmtAssetIdB)
386- let pmtStrAssetIdB = $t01251712634._1
387- let pmtAssetNameB = $t01251712634._2
388- let pmtDecimalsB = $t01251712634._3
389- let $t01263913143 = if ((ratioShareTokensInB > ratioShareTokensInA))
417+ let $t01370713784 = getAssetInfo(pmtAssetIdA)
418+ let pmtStrAssetIdA = $t01370713784._1
419+ let pmtAssetNameA = $t01370713784._2
420+ let pmtDecimalsA = $t01370713784._3
421+ let $t01378913906 = getAssetInfo(pmtAssetIdB)
422+ let pmtStrAssetIdB = $t01378913906._1
423+ let pmtAssetNameB = $t01378913906._2
424+ let pmtDecimalsB = $t01378913906._3
425+ let $t01391114415 = if ((ratioShareTokensInB > ratioShareTokensInA))
390426 then {
391427 let pmt = fraction(balanceB, ratioShareTokensInA, scale8, CEILING)
392428 $Tuple5(i.payments[0].amount, pmt, (i.payments[1].amount - pmt), pmtAssetIdB, ratioShareTokensInA)
395431 let pmt = fraction(balanceA, ratioShareTokensInB, scale8, CEILING)
396432 $Tuple5(pmt, i.payments[1].amount, (i.payments[0].amount - pmt), pmtAssetIdA, ratioShareTokensInB)
397433 }
398- let pmtAmountA = $t01263913143._1
399- let pmtAmountB = $t01263913143._2
400- let change = $t01263913143._3
401- let changeAssetId = $t01263913143._4
402- let shareTokenRatio = $t01263913143._5
434+ let pmtAmountA = $t01391114415._1
435+ let pmtAmountB = $t01391114415._2
436+ let change = $t01391114415._3
437+ let changeAssetId = $t01391114415._4
438+ let shareTokenRatio = $t01391114415._5
403439 let shareTokenToPayAmount = fraction(shareTokenRatio, shareAssetSupply, scale8)
404440 if ((size(i.payments) != 2))
405441 then throw("Two attached assets expected")
434470
435471 @Callable(i)
436472 func replenishWithOneToken (virtualSwapTokenPay,virtualSwapTokenGet) = valueOrElse(isActive(), {
437- let $t01487614951 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
438- let pmtAmount = $t01487614951._1
439- let pmtAssetId = $t01487614951._2
440- let $t01495615029 = getAssetInfo(pmtAssetId)
441- let pmtStrAssetId = $t01495615029._1
442- let pmtAssetName = $t01495615029._2
443- let pmtDecimals = $t01495615029._3
473+ let $t01614816223 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
474+ let pmtAmount = $t01614816223._1
475+ let pmtAssetId = $t01614816223._2
476+ let $t01622816301 = getAssetInfo(pmtAssetId)
477+ let pmtStrAssetId = $t01622816301._1
478+ let pmtAssetName = $t01622816301._2
479+ let pmtDecimals = $t01622816301._3
444480 let pmtMinThreshold = 5000000
445481 let thresholdValueForMinTolerance = 50000000
446482 let tolerance = if ((thresholdValueForMinTolerance > pmtAmount))
460496 else false)
461497 then throwAssets()
462498 else {
463- let $t01600716649 = if ((pmtAssetId == assetIdA))
499+ let $t01727917921 = if ((pmtAssetId == assetIdA))
464500 then $Tuple6((pmtAmount - virtualSwapTokenPay), virtualSwapTokenGet, (balanceA + virtualSwapTokenPay), (balanceB - virtualSwapTokenGet), (balanceA + pmtAmount), balanceB)
465501 else $Tuple6(virtualSwapTokenGet, (pmtAmount - virtualSwapTokenPay), (balanceA - virtualSwapTokenGet), (balanceB + virtualSwapTokenPay), balanceA, (balanceB + pmtAmount))
466- let virtualReplenishA = $t01600716649._1
467- let virtualReplenishB = $t01600716649._2
468- let balanceAfterSwapA = $t01600716649._3
469- let balanceAfterSwapB = $t01600716649._4
470- let newBalanceA = $t01600716649._5
471- let newBalanceB = $t01600716649._6
502+ let virtualReplenishA = $t01727917921._1
503+ let virtualReplenishB = $t01727917921._2
504+ let balanceAfterSwapA = $t01727917921._3
505+ let balanceAfterSwapB = $t01727917921._4
506+ let newBalanceA = $t01727917921._5
507+ let newBalanceB = $t01727917921._6
472508 let invariantNew = invariantCalc(balanceAfterSwapA, balanceAfterSwapB)
473509 let ratioVirtualBalanceToVirtualReplenish = (fraction(scale16, balanceAfterSwapA, balanceAfterSwapB) / fraction(scale8, virtualReplenishA, virtualReplenishB))
474510 let dAppThresholdAmount = fraction((newBalanceA + newBalanceB), dAppThreshold, (2 * dAppThresholdScale2))
492528 let shareTokenGovernanceReward = fraction(shareTokenToPayAmount, (feeGovernance / 2), feeScale6)
493529 let governanceRewardTokenA = fraction(shareTokenGovernanceReward, balanceA, shareAssetSupply)
494530 let governanceRewardTokenB = fraction(shareTokenGovernanceReward, balanceB, shareAssetSupply)
495- let $t01863618931 = if ((pmtStrAssetId == strAssetIdA))
531+ let $t01990820203 = if ((pmtStrAssetId == strAssetIdA))
496532 then $Tuple3((pmtAmount - governanceRewardTokenA), governanceRewardTokenB, strAssetIdB)
497533 else $Tuple3((pmtAmount - governanceRewardTokenB), governanceRewardTokenA, strAssetIdA)
498- let stakeAmount = $t01863618931._1
499- let unstakeAmount = $t01863618931._2
500- let unstakeAsset = $t01863618931._3
534+ let stakeAmount = $t01990820203._1
535+ let unstakeAmount = $t01990820203._2
536+ let unstakeAsset = $t01990820203._3
501537 let stake1 = if (containsElement(stakingAssets, pmtStrAssetId))
502538 then invoke(this, "stakeUnstake", [true, stakeAmount, pmtStrAssetId], nil)
503539 else 0
519555
520556 @Callable(i)
521557 func withdraw () = valueOrElse(isActive(), {
522- let $t02021820293 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
523- let pmtAmount = $t02021820293._1
524- let pmtAssetId = $t02021820293._2
558+ let $t02149021565 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
559+ let pmtAmount = $t02149021565._1
560+ let pmtAssetId = $t02149021565._2
525561 let amountToPayA = fraction(pmtAmount, balanceA, shareAssetSupply)
526562 let amountToPayB = fraction(pmtAmount, balanceB, shareAssetSupply)
527563 let invariantCalculated = invariantCalc((balanceA - amountToPayA), (balanceB - amountToPayB))
552588
553589 @Callable(i)
554590 func exchange (estimatedAmountToReceive,minAmountToReceive) = valueOrElse(isActive(), {
555- let $t02184421919 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
556- let pmtAmount = $t02184421919._1
557- let pmtAssetId = $t02184421919._2
591+ let $t02311623191 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
592+ let pmtAmount = $t02311623191._1
593+ let pmtAssetId = $t02311623191._2
558594 if ((0 >= estimatedAmountToReceive))
559595 then throw(("Estimated amount must be positive. Actual: " + toString(estimatedAmountToReceive)))
560596 else if ((minAmountToReceive > estimatedAmountToReceive))
578614 then assetIdB
579615 else assetIdA
580616 let amount = calculateSendAmount(estimatedAmountToReceive, minAmountToReceive, pmtAmount, pmtAssetId)
581- let governanceReward = fraction(amount, feeGovernance, feeScale6)
582- let amountMinusFee = fraction(amount, (feeScale6 - fee), feeScale6)
583- let $t02322523487 = if ((pmtAssetId == assetIdA))
617+ let feeDiscount = calculateFeeDiscount(i.originCaller)
618+ let governanceReward = fraction(amount, fraction(feeGovernance, feeDiscount, feeScale6, CEILING), feeScale6)
619+ let amountMinusFee = fraction(amount, (feeScale6 - fraction(fee, feeDiscount, feeScale6, CEILING)), feeScale6)
620+ let $t02464424906 = if ((pmtAssetId == assetIdA))
584621 then $Tuple2((balanceA + pmtAmount), ((balanceB - amountMinusFee) - governanceReward))
585622 else $Tuple2(((balanceA - amountMinusFee) - governanceReward), (balanceB + pmtAmount))
586- let newBalanceA = $t02322523487._1
587- let newBalanceB = $t02322523487._2
623+ let newBalanceA = $t02464424906._1
624+ let newBalanceB = $t02464424906._2
588625 let dAppThresholdAmount = fraction((newBalanceA + newBalanceB), dAppThreshold, (2 * dAppThresholdScale2))
589626 if (if ((dAppThresholdAmount > newBalanceA))
590627 then true
591628 else (dAppThresholdAmount > newBalanceB))
592629 then throwThreshold(dAppThresholdAmount, newBalanceA, newBalanceB)
593630 else {
594- let $t02378623859 = getAssetInfo(pmtAssetId)
595- let pmtStrAssetId = $t02378623859._1
596- let pmtAssetName = $t02378623859._2
597- let pmtDecimals = $t02378623859._3
598- let $t02387223949 = getAssetInfo(sendAssetId)
599- let sendStrAssetId = $t02387223949._1
600- let sendAssetName = $t02387223949._2
601- let sendDecimals = $t02387223949._3
631+ let $t02520525278 = getAssetInfo(pmtAssetId)
632+ let pmtStrAssetId = $t02520525278._1
633+ let pmtAssetName = $t02520525278._2
634+ let pmtDecimals = $t02520525278._3
635+ let $t02529125368 = getAssetInfo(sendAssetId)
636+ let sendStrAssetId = $t02529125368._1
637+ let sendAssetName = $t02529125368._2
638+ let sendDecimals = $t02529125368._3
602639 let stake1 = if (containsElement(stakingAssets, pmtStrAssetId))
603640 then invoke(this, "stakeUnstake", [true, pmtAmount, pmtStrAssetId], nil)
604641 else 0
674711 func stakeUnstake (stake,amount,assetIdString) = if ((i.caller != this))
675712 then throw("Only contract itself can invoke this function")
676713 else {
677- let $t02695327056 = calcStakingParams(stake, amount, fromBase58String(assetIdString))
678- let call = $t02695327056._1
679- let addr = $t02695327056._2
680- let params = $t02695327056._3
681- let payments = $t02695327056._4
714+ let $t02837228475 = calcStakingParams(stake, amount, fromBase58String(assetIdString))
715+ let call = $t02837228475._1
716+ let addr = $t02837228475._2
717+ let params = $t02837228475._3
718+ let payments = $t02837228475._4
682719 let inv = invoke(addr, call, params, payments)
683720 if ((inv == inv))
684721 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 kInvariant = "invariant"
2525
2626 let kCause = "shutdown_cause"
2727
2828 let kUSDNAddress = "staking_usdnnsbt_address"
2929
3030 let kEURNAddress = "staking_eurn_address"
3131
32+let kDiscounts = "discounts"
33+
34+let kDiscountValues = "discount_values"
35+
36+let kUserSwopInGov = "_SWOP_amount"
37+
3238 let kAdminPubKey1 = "admin_pub_1"
3339
3440 let kAdminPubKey2 = "admin_pub_2"
3541
3642 let kAdminPubKey3 = "admin_pub_3"
3743
3844 let kAdminInvokePubKey = "admin_invoke_pub"
3945
4046 let kMoneyBoxAddress = "money_box_address"
47+
48+let kGovAddress = "governance_address"
4149
4250 let oracle = Address(base58'3PEbqViERCoKnmcSULh6n2aiMvUdSQdCsom')
4351
4452 func getBase58FromOracle (key) = match getString(oracle, key) {
4553 case string: String =>
4654 fromBase58String(string)
4755 case nothing =>
4856 throw((key + "is empty"))
4957 }
5058
5159
5260 let adminPubKey1 = getBase58FromOracle(kAdminPubKey1)
5361
5462 let adminPubKey2 = getBase58FromOracle(kAdminPubKey2)
5563
5664 let adminPubKey3 = getBase58FromOracle(kAdminPubKey3)
5765
5866 let adminPubKeyInvoke = getBase58FromOracle(kAdminInvokePubKey)
5967
6068 let moneyBoxAddress = Address(getBase58FromOracle(kMoneyBoxAddress))
69+
70+let govAddress = Address(getBase58FromOracle(kGovAddress))
6171
6272 let stakingUSDNAddress = Address(getBase58FromOracle(kUSDNAddress))
6373
6474 let USDN = base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p'
6575
6676 let stakingAssets = [toBase58String(USDN)]
6777
6878 let active = getBooleanValue(this, kActive)
6979
7080 let strAssetIdA = getStringValue(this, kAssetIdA)
7181
7282 let strAssetIdB = getStringValue(this, kAssetIdB)
7383
7484 let assetIdA = if ((strAssetIdA == "WAVES"))
7585 then unit
7686 else fromBase58String(strAssetIdA)
7787
7888 let assetIdB = if ((strAssetIdB == "WAVES"))
7989 then unit
8090 else fromBase58String(strAssetIdB)
8191
8292 let assetNameA = match assetIdA {
8393 case id: ByteVector =>
8494 value(assetInfo(id)).name
8595 case waves: Unit =>
8696 "WAVES"
8797 case _ =>
8898 throw("Match error")
8999 }
90100
91101 let assetNameB = match assetIdB {
92102 case id: ByteVector =>
93103 value(assetInfo(id)).name
94104 case waves: Unit =>
95105 "WAVES"
96106 case _ =>
97107 throw("Match error")
98108 }
99109
100110 let balanceA = getIntegerValue(this, kBalanceA)
101111
102112 let balanceB = getIntegerValue(this, kBalanceB)
103113
104114 let shareAssetId = fromBase58String(getStringValue(this, kShareAssetId))
105115
106116 let shareAssetSupply = getIntegerValue(this, kShareAssetSupply)
107117
108118 let invariant = getIntegerValue(this, kInvariant)
109119
110120 let fee = getIntegerValue(this, kFee)
111121
112122 let feeGovernance = fraction(fee, 40, 100)
113123
114124 let feeScale6 = 1000000
115125
116126 let scale3 = 1000
117127
118128 let scale8 = 100000000
119129
120130 let scale16 = 10000000000000000
121131
122132 let slippageScale3 = 1000
123133
124134 let digits8 = 8
125135
126136 let dAppThreshold = 50
127137
128138 let dAppThresholdScale2 = 100
129139
130140 let exchangeRatioLimitMin = 90000000
131141
132142 let exchangeRatioLimitMax = 110000000
133143
134144 let alpha = 50
135145
136146 let alphaDigits = 2
137147
138148 let beta = 4600000000000000
139149
140150 func accountBalance (assetId) = match assetId {
141151 case id: ByteVector =>
142152 assetBalance(this, id)
143153 case waves: Unit =>
144154 wavesBalance(this).available
145155 case _ =>
146156 throw("Match error")
147157 }
148158
149159
150160 func stakedAmount (assetId) = {
151161 let stakedAmountCalculated = match assetId {
152162 case aId: ByteVector =>
153163 if ((aId == USDN))
154164 then getInteger(stakingUSDNAddress, ((("rpd_balance_" + toBase58String(aId)) + "_") + toString(this)))
155165 else 0
156166 case _: Unit =>
157167 0
158168 case _ =>
159169 throw("Match error")
160170 }
161171 match stakedAmountCalculated {
162172 case i: Int =>
163173 i
164174 case _ =>
165175 0
166176 }
167177 }
168178
169179
170180 let stakedAmountA = stakedAmount(assetIdA)
171181
172182 let stakedAmountB = stakedAmount(assetIdB)
173183
174184 let availableBalanceA = (balanceA - stakedAmountA)
175185
176186 let availableBalanceB = (balanceB - stakedAmountB)
177187
178188 let accountBalanceWithStakedA = (accountBalance(assetIdA) + stakedAmountA)
179189
180190 let accountBalanceWithStakedB = (accountBalance(assetIdB) + stakedAmountB)
181191
182192 let hasEnoughBalance = if ((accountBalanceWithStakedA >= balanceA))
183193 then (accountBalanceWithStakedB >= balanceB)
184194 else false
185195
186196 func skewness (x,y) = ((fraction(scale16, x, y) + fraction(scale16, y, x)) / 2)
187197
188198
189199 func invariantCalc (x,y) = {
190200 let sk = skewness(x, y)
191201 (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)))
192202 }
193203
194204
195205 func calculateSendAmount (amountToSendEstimated,minTokenReceiveAmount,tokenReceiveAmount,tokenId) = {
196206 let worstAllowedNewInvariantRatio = (scale16 - ((scale16 * 1) / 10000000))
197207 let deltaBetweenMaxAndMinSendValue = (amountToSendEstimated - minTokenReceiveAmount)
198208 let x = (balanceA + tokenReceiveAmount)
199209 let y = (balanceB + tokenReceiveAmount)
200210 func getStepAmount (acc,step) = if ((acc._1 == -1))
201211 then {
202212 let amountToSend = (amountToSendEstimated - (((step * deltaBetweenMaxAndMinSendValue) / 3) / scale3))
203213 let stepInvariant = if ((tokenId == assetIdA))
204214 then invariantCalc(x, (balanceB - amountToSend))
205215 else invariantCalc((balanceA - amountToSend), y)
206216 if ((stepInvariant > invariant))
207217 then $Tuple2(amountToSend, stepInvariant)
208218 else $Tuple2(-1, 0)
209219 }
210220 else acc
211221
212222 let amountToSendMin = getStepAmount($Tuple2(-1, 0), 3000)
213223 if ((0 > amountToSendMin._1))
214224 then throw("Price is worse than minReceived")
215225 else {
216226 let invEstimated = if ((tokenId == assetIdA))
217227 then invariantCalc(x, (balanceB - amountToSendEstimated))
218228 else if ((tokenId == assetIdB))
219229 then invariantCalc((balanceA - amountToSendEstimated), y)
220230 else throw("Wrong asset in payment")
221231 if ((invariant > invEstimated))
222232 then if ((worstAllowedNewInvariantRatio >= fraction(scale16, invariant, invEstimated)))
223233 then throw("The requested price is too not profitable for user")
224234 else {
225235 let a = {
226236 let $l = [25, 200, 500]
227237 let $s = size($l)
228238 let $acc0 = $Tuple2(-1, 0)
229239 func $f0_1 ($a,$i) = if (($i >= $s))
230240 then $a
231241 else getStepAmount($a, $l[$i])
232242
233243 func $f0_2 ($a,$i) = if (($i >= $s))
234244 then $a
235245 else throw("List size exceeds 3")
236246
237247 $f0_2($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3)
238248 }
239249 if ((0 > a._1))
240250 then amountToSendMin._1
241251 else a._1
242252 }
243253 else {
244254 let a = {
245255 let $l = [-500, -200, -25]
246256 let $s = size($l)
247257 let $acc0 = $Tuple2(-1, 0)
248258 func $f0_1 ($a,$i) = if (($i >= $s))
249259 then $a
250260 else getStepAmount($a, $l[$i])
251261
252262 func $f0_2 ($a,$i) = if (($i >= $s))
253263 then $a
254264 else throw("List size exceeds 3")
255265
256266 $f0_2($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3)
257267 }
258268 let tupleSendBetter = if ((0 > a._1))
259269 then $Tuple2(amountToSendEstimated, invEstimated)
260270 else a
261271 if ((worstAllowedNewInvariantRatio >= fraction(scale16, invariant, tupleSendBetter._2)))
262272 then throw("The requested price is too not profitable for user")
263273 else tupleSendBetter._1
264274 }
265275 }
266276 }
267277
268278
269279 func getAssetInfo (assetId) = match assetId {
270280 case id: ByteVector =>
271281 let stringId = toBase58String(id)
272282 let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
273283 $Tuple3(stringId, info.name, info.decimals)
274284 case waves: Unit =>
275285 $Tuple3("WAVES", "WAVES", 8)
276286 case _ =>
277287 throw("Match error")
278288 }
279289
280290
281291 func suspend (cause) = [BooleanEntry(kActive, false), StringEntry(kCause, cause)]
282292
283293
284294 func throwIsActive () = throw("DApp is already active")
285295
286296
287297 func isActive () = if (active)
288298 then unit
289299 else throw("DApp is inactive at this moment")
290300
291301
292302 func isAdminCall (i) = if (containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey))
293303 then unit
294304 else throw("Only admin can call this function")
295305
296306
297307 func throwAssets () = throw(((("Incorrect assets attached. Expected: " + strAssetIdA) + " and ") + strAssetIdB))
298308
299309
300310 func throwOnePayment () = throw("One attached payment expected")
301311
302312
303313 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))
304314
305315
306316 func suspendSuspicious () = suspend(((((((((((((((("Suspicious state. Actual balances: " + toString(balanceA)) + " ") + assetNameA) + ", ") + toString(balanceB)) + " ") + assetNameB) + ". State: ") + toString(accountBalance(assetIdA))) + " ") + assetNameA) + ", ") + toString(accountBalance(assetIdB))) + " ") + assetNameB))
307317
308318
309319 func calcStakingFuncAndAddres (stake,assetId) = if (stake)
310320 then $Tuple2("lockNeutrino", stakingUSDNAddress)
311321 else $Tuple2("unlockNeutrino", stakingUSDNAddress)
312322
313323
314324 func calcStakingParams (stake,amount,assetId) = if (stake)
315325 then {
316- let $t091419207 = calcStakingFuncAndAddres(stake, assetId)
317- let call = $t091419207._1
318- let stakingAddr = $t091419207._2
326+ let $t093469412 = calcStakingFuncAndAddres(stake, assetId)
327+ let call = $t093469412._1
328+ let stakingAddr = $t093469412._2
319329 $Tuple4(call, stakingAddr, nil, [AttachedPayment(assetId, amount)])
320330 }
321331 else {
322- let $t092939359 = calcStakingFuncAndAddres(stake, assetId)
323- let call = $t092939359._1
324- let stakingAddr = $t092939359._2
332+ let $t094989564 = calcStakingFuncAndAddres(stake, assetId)
333+ let call = $t094989564._1
334+ let stakingAddr = $t094989564._2
325335 $Tuple4(call, stakingAddr, [amount, toBase58String(assetId)], nil)
326336 }
327337
328338
339+func calculateFeeDiscount (userAddr) = {
340+ let swopAmount = valueOrElse(getInteger(govAddress, (toString(userAddr) + kUserSwopInGov)), 0)
341+ let discountValues = split(getStringValue(oracle, kDiscountValues), ",")
342+ let discounts = split(getStringValue(oracle, kDiscounts), ",")
343+ if (if ((swopAmount >= parseIntValue(discountValues[0])))
344+ then (parseIntValue(discountValues[1]) > swopAmount)
345+ else false)
346+ then (feeScale6 - parseIntValue(discounts[0]))
347+ else if (if ((swopAmount >= parseIntValue(discountValues[1])))
348+ then (parseIntValue(discountValues[2]) > swopAmount)
349+ else false)
350+ then (feeScale6 - parseIntValue(discounts[1]))
351+ else if (if ((swopAmount >= parseIntValue(discountValues[2])))
352+ then (parseIntValue(discountValues[3]) > swopAmount)
353+ else false)
354+ then (feeScale6 - parseIntValue(discounts[2]))
355+ else if (if ((swopAmount >= parseIntValue(discountValues[3])))
356+ then (parseIntValue(discountValues[4]) > swopAmount)
357+ else false)
358+ then (feeScale6 - parseIntValue(discounts[3]))
359+ else if ((swopAmount >= parseIntValue(discountValues[4])))
360+ then (feeScale6 - parseIntValue(discounts[4]))
361+ else feeScale6
362+ }
363+
364+
329365 @Callable(i)
330366 func init () = {
331- let $t094649541 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
332- let pmtAmountA = $t094649541._1
333- let pmtAssetIdA = $t094649541._2
334- let $t095469623 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
335- let pmtAmountB = $t095469623._1
336- let pmtAssetIdB = $t095469623._2
337- let $t096289705 = getAssetInfo(pmtAssetIdA)
338- let pmtStrAssetIdA = $t096289705._1
339- let pmtAssetNameA = $t096289705._2
340- let pmtDecimalsA = $t096289705._3
341- let $t097109787 = getAssetInfo(pmtAssetIdB)
342- let pmtStrAssetIdB = $t097109787._1
343- let pmtAssetNameB = $t097109787._2
344- let pmtDecimalsB = $t097109787._3
367+ let $t01073610813 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
368+ let pmtAmountA = $t01073610813._1
369+ let pmtAssetIdA = $t01073610813._2
370+ let $t01081810895 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
371+ let pmtAmountB = $t01081810895._1
372+ let pmtAssetIdB = $t01081810895._2
373+ let $t01090010977 = getAssetInfo(pmtAssetIdA)
374+ let pmtStrAssetIdA = $t01090010977._1
375+ let pmtAssetNameA = $t01090010977._2
376+ let pmtDecimalsA = $t01090010977._3
377+ let $t01098211059 = getAssetInfo(pmtAssetIdB)
378+ let pmtStrAssetIdB = $t01098211059._1
379+ let pmtAssetNameB = $t01098211059._2
380+ let pmtDecimalsB = $t01098211059._3
345381 if (isDefined(getBoolean(this, kActive)))
346382 then throwIsActive()
347383 else if ((pmtAssetIdA == pmtAssetIdB))
348384 then throw("Assets must be different")
349385 else {
350386 let shareName = ((("s" + take(pmtAssetNameA, 7)) + "_") + take(pmtAssetNameB, 7))
351387 let shareDescription = ((((("ShareToken of SwopFi protocol for " + pmtAssetNameA) + " and ") + pmtAssetNameB) + " at address ") + toString(this))
352388 let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
353389 let shareInitialSupply = fraction(pow(pmtAmountA, pmtDecimalsA, 5, 1, pmtDecimalsA, DOWN), pow(pmtAmountB, pmtDecimalsB, 5, 1, pmtDecimalsB, DOWN), pow(10, 0, shareDecimals, 0, 0, DOWN))
354390 let shareIssue = Issue(shareName, shareDescription, shareInitialSupply, shareDecimals, true)
355391 let shareIssueId = calculateAssetId(shareIssue)
356392 let invariantCalculated = invariantCalc(pmtAmountA, pmtAmountB)
357393 let stake1 = if (containsElement(stakingAssets, pmtStrAssetIdA))
358394 then invoke(this, "stakeUnstake", [true, pmtAmountA, pmtStrAssetIdA], nil)
359395 else 0
360396 if ((stake1 == stake1))
361397 then {
362398 let stake2 = if (containsElement(stakingAssets, pmtStrAssetIdB))
363399 then invoke(this, "stakeUnstake", [true, pmtAmountB, pmtStrAssetIdB], nil)
364400 else 0
365401 if ((stake2 == stake2))
366402 then [StringEntry(kVersion, version), BooleanEntry(kActive, true), StringEntry(kAssetIdA, pmtStrAssetIdA), StringEntry(kAssetIdB, pmtStrAssetIdB), IntegerEntry(kBalanceA, pmtAmountA), IntegerEntry(kBalanceB, pmtAmountB), IntegerEntry(kInvariant, invariantCalculated), IntegerEntry(kFee, getIntegerValue(oracle, "base_fee_flat")), shareIssue, StringEntry(kShareAssetId, toBase58String(shareIssueId)), IntegerEntry(kShareAssetSupply, shareInitialSupply), ScriptTransfer(i.caller, shareInitialSupply, shareIssueId)]
367403 else throw("Strict value is not equal to itself.")
368404 }
369405 else throw("Strict value is not equal to itself.")
370406 }
371407 }
372408
373409
374410
375411 @Callable(i)
376412 func replenishWithTwoTokens () = valueOrElse(isActive(), {
377413 let pmtAssetIdA = i.payments[0].assetId
378414 let pmtAssetIdB = i.payments[1].assetId
379415 let ratioShareTokensInA = fraction(scale8, i.payments[0].amount, balanceA)
380416 let ratioShareTokensInB = fraction(scale8, i.payments[1].amount, balanceB)
381- let $t01243512512 = getAssetInfo(pmtAssetIdA)
382- let pmtStrAssetIdA = $t01243512512._1
383- let pmtAssetNameA = $t01243512512._2
384- let pmtDecimalsA = $t01243512512._3
385- let $t01251712634 = getAssetInfo(pmtAssetIdB)
386- let pmtStrAssetIdB = $t01251712634._1
387- let pmtAssetNameB = $t01251712634._2
388- let pmtDecimalsB = $t01251712634._3
389- let $t01263913143 = if ((ratioShareTokensInB > ratioShareTokensInA))
417+ let $t01370713784 = getAssetInfo(pmtAssetIdA)
418+ let pmtStrAssetIdA = $t01370713784._1
419+ let pmtAssetNameA = $t01370713784._2
420+ let pmtDecimalsA = $t01370713784._3
421+ let $t01378913906 = getAssetInfo(pmtAssetIdB)
422+ let pmtStrAssetIdB = $t01378913906._1
423+ let pmtAssetNameB = $t01378913906._2
424+ let pmtDecimalsB = $t01378913906._3
425+ let $t01391114415 = if ((ratioShareTokensInB > ratioShareTokensInA))
390426 then {
391427 let pmt = fraction(balanceB, ratioShareTokensInA, scale8, CEILING)
392428 $Tuple5(i.payments[0].amount, pmt, (i.payments[1].amount - pmt), pmtAssetIdB, ratioShareTokensInA)
393429 }
394430 else {
395431 let pmt = fraction(balanceA, ratioShareTokensInB, scale8, CEILING)
396432 $Tuple5(pmt, i.payments[1].amount, (i.payments[0].amount - pmt), pmtAssetIdA, ratioShareTokensInB)
397433 }
398- let pmtAmountA = $t01263913143._1
399- let pmtAmountB = $t01263913143._2
400- let change = $t01263913143._3
401- let changeAssetId = $t01263913143._4
402- let shareTokenRatio = $t01263913143._5
434+ let pmtAmountA = $t01391114415._1
435+ let pmtAmountB = $t01391114415._2
436+ let change = $t01391114415._3
437+ let changeAssetId = $t01391114415._4
438+ let shareTokenRatio = $t01391114415._5
403439 let shareTokenToPayAmount = fraction(shareTokenRatio, shareAssetSupply, scale8)
404440 if ((size(i.payments) != 2))
405441 then throw("Two attached assets expected")
406442 else if (if ((pmtAssetIdA != assetIdA))
407443 then true
408444 else (pmtAssetIdB != assetIdB))
409445 then throwAssets()
410446 else if ((shareTokenToPayAmount == 0))
411447 then throw("Too small amount to replenish")
412448 else if ((0 > change))
413449 then throw("Change < 0")
414450 else if (!(hasEnoughBalance))
415451 then ([ScriptTransfer(i.caller, pmtAmountA, pmtAssetIdA), ScriptTransfer(i.caller, pmtAmountB, pmtAssetIdB)] ++ suspendSuspicious())
416452 else {
417453 let stake1 = if (containsElement(stakingAssets, pmtStrAssetIdA))
418454 then invoke(this, "stakeUnstake", [true, pmtAmountA, pmtStrAssetIdA], nil)
419455 else 0
420456 if ((stake1 == stake1))
421457 then {
422458 let stake2 = if (containsElement(stakingAssets, pmtStrAssetIdB))
423459 then invoke(this, "stakeUnstake", [true, pmtAmountB, pmtStrAssetIdB], nil)
424460 else 0
425461 if ((stake2 == stake2))
426462 then [IntegerEntry(kBalanceA, (balanceA + pmtAmountA)), IntegerEntry(kBalanceB, (balanceB + pmtAmountB)), IntegerEntry(kShareAssetSupply, (shareAssetSupply + shareTokenToPayAmount)), IntegerEntry(kInvariant, invariantCalc((balanceA + pmtAmountA), (balanceB + pmtAmountB))), Reissue(shareAssetId, shareTokenToPayAmount, true), ScriptTransfer(i.caller, shareTokenToPayAmount, shareAssetId), ScriptTransfer(i.caller, change, changeAssetId)]
427463 else throw("Strict value is not equal to itself.")
428464 }
429465 else throw("Strict value is not equal to itself.")
430466 }
431467 })
432468
433469
434470
435471 @Callable(i)
436472 func replenishWithOneToken (virtualSwapTokenPay,virtualSwapTokenGet) = valueOrElse(isActive(), {
437- let $t01487614951 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
438- let pmtAmount = $t01487614951._1
439- let pmtAssetId = $t01487614951._2
440- let $t01495615029 = getAssetInfo(pmtAssetId)
441- let pmtStrAssetId = $t01495615029._1
442- let pmtAssetName = $t01495615029._2
443- let pmtDecimals = $t01495615029._3
473+ let $t01614816223 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
474+ let pmtAmount = $t01614816223._1
475+ let pmtAssetId = $t01614816223._2
476+ let $t01622816301 = getAssetInfo(pmtAssetId)
477+ let pmtStrAssetId = $t01622816301._1
478+ let pmtAssetName = $t01622816301._2
479+ let pmtDecimals = $t01622816301._3
444480 let pmtMinThreshold = 5000000
445481 let thresholdValueForMinTolerance = 50000000
446482 let tolerance = if ((thresholdValueForMinTolerance > pmtAmount))
447483 then 100000
448484 else 1
449485 let slippageValueMinForReplenish = (scale8 - ((scale8 * tolerance) / 10000000))
450486 let slippageValueMaxForReplenish = (scale8 + ((scale8 * tolerance) / 10000000))
451487 let slippageValueMinForSwap = (scale8 - ((scale8 * 1) / 10000000))
452488 if ((pmtMinThreshold > pmtAmount))
453489 then throw((((("Payment amount " + toString(pmtAmount)) + " does not exceed the minimum amount of ") + toString(pmtMinThreshold)) + " tokens"))
454490 else if ((size(i.payments) != 1))
455491 then throwOnePayment()
456492 else if (!(hasEnoughBalance))
457493 then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
458494 else if (if ((pmtAssetId != assetIdA))
459495 then (pmtAssetId != assetIdB)
460496 else false)
461497 then throwAssets()
462498 else {
463- let $t01600716649 = if ((pmtAssetId == assetIdA))
499+ let $t01727917921 = if ((pmtAssetId == assetIdA))
464500 then $Tuple6((pmtAmount - virtualSwapTokenPay), virtualSwapTokenGet, (balanceA + virtualSwapTokenPay), (balanceB - virtualSwapTokenGet), (balanceA + pmtAmount), balanceB)
465501 else $Tuple6(virtualSwapTokenGet, (pmtAmount - virtualSwapTokenPay), (balanceA - virtualSwapTokenGet), (balanceB + virtualSwapTokenPay), balanceA, (balanceB + pmtAmount))
466- let virtualReplenishA = $t01600716649._1
467- let virtualReplenishB = $t01600716649._2
468- let balanceAfterSwapA = $t01600716649._3
469- let balanceAfterSwapB = $t01600716649._4
470- let newBalanceA = $t01600716649._5
471- let newBalanceB = $t01600716649._6
502+ let virtualReplenishA = $t01727917921._1
503+ let virtualReplenishB = $t01727917921._2
504+ let balanceAfterSwapA = $t01727917921._3
505+ let balanceAfterSwapB = $t01727917921._4
506+ let newBalanceA = $t01727917921._5
507+ let newBalanceB = $t01727917921._6
472508 let invariantNew = invariantCalc(balanceAfterSwapA, balanceAfterSwapB)
473509 let ratioVirtualBalanceToVirtualReplenish = (fraction(scale16, balanceAfterSwapA, balanceAfterSwapB) / fraction(scale8, virtualReplenishA, virtualReplenishB))
474510 let dAppThresholdAmount = fraction((newBalanceA + newBalanceB), dAppThreshold, (2 * dAppThresholdScale2))
475511 if (if ((slippageValueMinForSwap >= fraction(scale8, invariant, invariantNew)))
476512 then true
477513 else (invariant > invariantNew))
478514 then throw("Incorrect virtualSwapTokenPay or virtualSwapTokenGet value")
479515 else if (if ((slippageValueMinForReplenish > ratioVirtualBalanceToVirtualReplenish))
480516 then true
481517 else (ratioVirtualBalanceToVirtualReplenish > slippageValueMaxForReplenish))
482518 then throw("Swap with virtualSwapTokenPay and virtualSwapTokenGet is possible, but ratio after virtual swap is incorrect")
483519 else if (if ((dAppThresholdAmount > newBalanceA))
484520 then true
485521 else (dAppThresholdAmount > newBalanceB))
486522 then throwThreshold(dAppThresholdAmount, newBalanceA, newBalanceB)
487523 else {
488524 let ratioShareTokensInA = fraction(virtualReplenishA, scale8, balanceAfterSwapA)
489525 let ratioShareTokensInB = fraction(virtualReplenishB, scale8, balanceAfterSwapB)
490526 let shareTokenToPayAmount = fraction(min([ratioShareTokensInA, ratioShareTokensInB]), shareAssetSupply, scale8)
491527 let shareTokenToPayAmountAfterFee = fraction(shareTokenToPayAmount, (feeScale6 - (fee / 2)), feeScale6)
492528 let shareTokenGovernanceReward = fraction(shareTokenToPayAmount, (feeGovernance / 2), feeScale6)
493529 let governanceRewardTokenA = fraction(shareTokenGovernanceReward, balanceA, shareAssetSupply)
494530 let governanceRewardTokenB = fraction(shareTokenGovernanceReward, balanceB, shareAssetSupply)
495- let $t01863618931 = if ((pmtStrAssetId == strAssetIdA))
531+ let $t01990820203 = if ((pmtStrAssetId == strAssetIdA))
496532 then $Tuple3((pmtAmount - governanceRewardTokenA), governanceRewardTokenB, strAssetIdB)
497533 else $Tuple3((pmtAmount - governanceRewardTokenB), governanceRewardTokenA, strAssetIdA)
498- let stakeAmount = $t01863618931._1
499- let unstakeAmount = $t01863618931._2
500- let unstakeAsset = $t01863618931._3
534+ let stakeAmount = $t01990820203._1
535+ let unstakeAmount = $t01990820203._2
536+ let unstakeAsset = $t01990820203._3
501537 let stake1 = if (containsElement(stakingAssets, pmtStrAssetId))
502538 then invoke(this, "stakeUnstake", [true, stakeAmount, pmtStrAssetId], nil)
503539 else 0
504540 if ((stake1 == stake1))
505541 then {
506542 let stake2 = if (containsElement(stakingAssets, unstakeAsset))
507543 then invoke(this, "stakeUnstake", [false, unstakeAmount, unstakeAsset], nil)
508544 else 0
509545 if ((stake2 == stake2))
510546 then [Reissue(shareAssetId, shareTokenToPayAmountAfterFee, true), ScriptTransfer(i.caller, shareTokenToPayAmountAfterFee, shareAssetId), ScriptTransfer(moneyBoxAddress, governanceRewardTokenA, assetIdA), ScriptTransfer(moneyBoxAddress, governanceRewardTokenB, assetIdB), IntegerEntry(kBalanceA, (newBalanceA - governanceRewardTokenA)), IntegerEntry(kBalanceB, (newBalanceB - governanceRewardTokenB)), IntegerEntry(kShareAssetSupply, (shareAssetSupply + shareTokenToPayAmountAfterFee)), IntegerEntry(kInvariant, invariantCalc((newBalanceA - governanceRewardTokenA), (newBalanceB - governanceRewardTokenB)))]
511547 else throw("Strict value is not equal to itself.")
512548 }
513549 else throw("Strict value is not equal to itself.")
514550 }
515551 }
516552 })
517553
518554
519555
520556 @Callable(i)
521557 func withdraw () = valueOrElse(isActive(), {
522- let $t02021820293 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
523- let pmtAmount = $t02021820293._1
524- let pmtAssetId = $t02021820293._2
558+ let $t02149021565 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
559+ let pmtAmount = $t02149021565._1
560+ let pmtAssetId = $t02149021565._2
525561 let amountToPayA = fraction(pmtAmount, balanceA, shareAssetSupply)
526562 let amountToPayB = fraction(pmtAmount, balanceB, shareAssetSupply)
527563 let invariantCalculated = invariantCalc((balanceA - amountToPayA), (balanceB - amountToPayB))
528564 if ((size(i.payments) != 1))
529565 then throwOnePayment()
530566 else if ((pmtAssetId != shareAssetId))
531567 then throw(("Incorrect asset attached. Expected: " + toBase58String(shareAssetId)))
532568 else if (!(hasEnoughBalance))
533569 then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
534570 else {
535571 let stake1 = if (containsElement(stakingAssets, strAssetIdA))
536572 then invoke(this, "stakeUnstake", [false, amountToPayA, strAssetIdA], nil)
537573 else 0
538574 if ((stake1 == stake1))
539575 then {
540576 let stake2 = if (containsElement(stakingAssets, strAssetIdB))
541577 then invoke(this, "stakeUnstake", [false, amountToPayB, strAssetIdB], nil)
542578 else 0
543579 if ((stake2 == stake2))
544580 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)]
545581 else throw("Strict value is not equal to itself.")
546582 }
547583 else throw("Strict value is not equal to itself.")
548584 }
549585 })
550586
551587
552588
553589 @Callable(i)
554590 func exchange (estimatedAmountToReceive,minAmountToReceive) = valueOrElse(isActive(), {
555- let $t02184421919 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
556- let pmtAmount = $t02184421919._1
557- let pmtAssetId = $t02184421919._2
591+ let $t02311623191 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
592+ let pmtAmount = $t02311623191._1
593+ let pmtAssetId = $t02311623191._2
558594 if ((0 >= estimatedAmountToReceive))
559595 then throw(("Estimated amount must be positive. Actual: " + toString(estimatedAmountToReceive)))
560596 else if ((minAmountToReceive > estimatedAmountToReceive))
561597 then throw("Minimal amount can't be greater than estimated.")
562598 else if ((size(i.payments) != 1))
563599 then throwOnePayment()
564600 else if (!(hasEnoughBalance))
565601 then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
566602 else if (if ((pmtAssetId != assetIdA))
567603 then (pmtAssetId != assetIdB)
568604 else false)
569605 then throwAssets()
570606 else if ((10000000 > pmtAmount))
571607 then throw("Only swap of 10.000000 or more tokens is allowed")
572608 else if (if ((exchangeRatioLimitMin > fraction(scale8, minAmountToReceive, pmtAmount)))
573609 then true
574610 else (fraction(scale8, estimatedAmountToReceive, pmtAmount) > exchangeRatioLimitMax))
575611 then throw("Incorrect args and pmt ratio")
576612 else {
577613 let sendAssetId = if ((pmtAssetId == assetIdA))
578614 then assetIdB
579615 else assetIdA
580616 let amount = calculateSendAmount(estimatedAmountToReceive, minAmountToReceive, pmtAmount, pmtAssetId)
581- let governanceReward = fraction(amount, feeGovernance, feeScale6)
582- let amountMinusFee = fraction(amount, (feeScale6 - fee), feeScale6)
583- let $t02322523487 = if ((pmtAssetId == assetIdA))
617+ let feeDiscount = calculateFeeDiscount(i.originCaller)
618+ let governanceReward = fraction(amount, fraction(feeGovernance, feeDiscount, feeScale6, CEILING), feeScale6)
619+ let amountMinusFee = fraction(amount, (feeScale6 - fraction(fee, feeDiscount, feeScale6, CEILING)), feeScale6)
620+ let $t02464424906 = if ((pmtAssetId == assetIdA))
584621 then $Tuple2((balanceA + pmtAmount), ((balanceB - amountMinusFee) - governanceReward))
585622 else $Tuple2(((balanceA - amountMinusFee) - governanceReward), (balanceB + pmtAmount))
586- let newBalanceA = $t02322523487._1
587- let newBalanceB = $t02322523487._2
623+ let newBalanceA = $t02464424906._1
624+ let newBalanceB = $t02464424906._2
588625 let dAppThresholdAmount = fraction((newBalanceA + newBalanceB), dAppThreshold, (2 * dAppThresholdScale2))
589626 if (if ((dAppThresholdAmount > newBalanceA))
590627 then true
591628 else (dAppThresholdAmount > newBalanceB))
592629 then throwThreshold(dAppThresholdAmount, newBalanceA, newBalanceB)
593630 else {
594- let $t02378623859 = getAssetInfo(pmtAssetId)
595- let pmtStrAssetId = $t02378623859._1
596- let pmtAssetName = $t02378623859._2
597- let pmtDecimals = $t02378623859._3
598- let $t02387223949 = getAssetInfo(sendAssetId)
599- let sendStrAssetId = $t02387223949._1
600- let sendAssetName = $t02387223949._2
601- let sendDecimals = $t02387223949._3
631+ let $t02520525278 = getAssetInfo(pmtAssetId)
632+ let pmtStrAssetId = $t02520525278._1
633+ let pmtAssetName = $t02520525278._2
634+ let pmtDecimals = $t02520525278._3
635+ let $t02529125368 = getAssetInfo(sendAssetId)
636+ let sendStrAssetId = $t02529125368._1
637+ let sendAssetName = $t02529125368._2
638+ let sendDecimals = $t02529125368._3
602639 let stake1 = if (containsElement(stakingAssets, pmtStrAssetId))
603640 then invoke(this, "stakeUnstake", [true, pmtAmount, pmtStrAssetId], nil)
604641 else 0
605642 if ((stake1 == stake1))
606643 then {
607644 let stake2 = if (containsElement(stakingAssets, sendStrAssetId))
608645 then invoke(this, "stakeUnstake", [false, (amountMinusFee + governanceReward), sendStrAssetId], nil)
609646 else 0
610647 if ((stake2 == stake2))
611648 then $Tuple2([IntegerEntry(kBalanceA, newBalanceA), IntegerEntry(kBalanceB, newBalanceB), IntegerEntry(kInvariant, invariantCalc(newBalanceA, newBalanceB)), ScriptTransfer(i.caller, amountMinusFee, sendAssetId), ScriptTransfer(moneyBoxAddress, governanceReward, sendAssetId)], $Tuple2(amountMinusFee, sendAssetId))
612649 else throw("Strict value is not equal to itself.")
613650 }
614651 else throw("Strict value is not equal to itself.")
615652 }
616653 }
617654 })
618655
619656
620657
621658 @Callable(i)
622659 func shutdown () = valueOrElse(isAdminCall(i), if (!(active))
623660 then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, kCause), "the cause wasn't specified")))
624661 else suspend("Paused by admin"))
625662
626663
627664
628665 @Callable(i)
629666 func activate () = valueOrElse(isAdminCall(i), if (active)
630667 then throwIsActive()
631668 else [BooleanEntry(kActive, true), DeleteEntry(kCause)])
632669
633670
634671
635672 @Callable(i)
636673 func takeIntoAccountExtraFunds () = valueOrElse(isActive(), {
637674 let amountEnrollA = (accountBalanceWithStakedA - balanceA)
638675 let amountEnrollB = (accountBalanceWithStakedB - balanceB)
639676 let invariantNew = invariantCalc((balanceA + amountEnrollA), (balanceB + amountEnrollB))
640677 if ((i.caller != moneyBoxAddress))
641678 then throw("Only the money box can call this function")
642679 else if (if ((0 > amountEnrollA))
643680 then true
644681 else (0 > amountEnrollB))
645682 then suspend("Enroll amount negative")
646683 else if (if ((amountEnrollA == 0))
647684 then (amountEnrollB == 0)
648685 else false)
649686 then throw("No money to take")
650687 else {
651688 let stake1 = if (if (containsElement(stakingAssets, strAssetIdA))
652689 then (amountEnrollA > 0)
653690 else false)
654691 then invoke(this, "stakeUnstake", [true, amountEnrollA, strAssetIdA], nil)
655692 else 0
656693 if ((stake1 == stake1))
657694 then {
658695 let stake2 = if (if (containsElement(stakingAssets, strAssetIdB))
659696 then (amountEnrollB > 0)
660697 else false)
661698 then invoke(this, "stakeUnstake", [true, amountEnrollB, strAssetIdB], nil)
662699 else 0
663700 if ((stake2 == stake2))
664701 then [IntegerEntry(kInvariant, invariantNew), IntegerEntry(kBalanceA, (balanceA + amountEnrollA)), IntegerEntry(kBalanceB, (balanceB + amountEnrollB))]
665702 else throw("Strict value is not equal to itself.")
666703 }
667704 else throw("Strict value is not equal to itself.")
668705 }
669706 })
670707
671708
672709
673710 @Callable(i)
674711 func stakeUnstake (stake,amount,assetIdString) = if ((i.caller != this))
675712 then throw("Only contract itself can invoke this function")
676713 else {
677- let $t02695327056 = calcStakingParams(stake, amount, fromBase58String(assetIdString))
678- let call = $t02695327056._1
679- let addr = $t02695327056._2
680- let params = $t02695327056._3
681- let payments = $t02695327056._4
714+ let $t02837228475 = calcStakingParams(stake, amount, fromBase58String(assetIdString))
715+ let call = $t02837228475._1
716+ let addr = $t02837228475._2
717+ let params = $t02837228475._3
718+ let payments = $t02837228475._4
682719 let inv = invoke(addr, call, params, payments)
683720 if ((inv == inv))
684721 then nil
685722 else throw("Strict value is not equal to itself.")
686723 }
687724
688725
689726
690727 @Callable(i)
691728 func toBigIntInvariant () = valueOrElse(isAdminCall(i), [IntegerEntry(kInvariant, invariantCalc(balanceA, balanceB))])
692729
693730
694731 @Verifier(tx)
695732 func verify () = {
696733 let multiSignedByAdmins = {
697734 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
698735 then 1
699736 else 0
700737 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
701738 then 1
702739 else 0
703740 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
704741 then 1
705742 else 0
706743 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
707744 }
708745 match tx {
709746 case inv: InvokeScriptTransaction =>
710747 let callTakeIntoAccount = if ((inv.dApp == this))
711748 then (inv.function == "takeIntoAccountExtraFunds")
712749 else false
713750 let signedByAdmin = if (if (if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
714751 then true
715752 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey2))
716753 then true
717754 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey3))
718755 then true
719756 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKeyInvoke)
720757 if (if (callTakeIntoAccount)
721758 then signedByAdmin
722759 else false)
723760 then true
724761 else multiSignedByAdmins
725762 case _ =>
726763 multiSignedByAdmins
727764 }
728765 }
729766

github/deemru/w8io/3ef1775 
110.40 ms