tx · FDnfSgeBuZJq2fDt64MpCnXYmTMoB3jLXoQ9ggmaA4BW

3N8rwRVNrxgqwFiVCNyX2Zyy6Lzgd1fDctN:  -0.01400000 Waves

2021.12.29 18:41 [1855704] smart account 3N8rwRVNrxgqwFiVCNyX2Zyy6Lzgd1fDctN > SELF 0.00000000 Waves

{ "type": 13, "id": "FDnfSgeBuZJq2fDt64MpCnXYmTMoB3jLXoQ9ggmaA4BW", "fee": 1400000, "feeAssetId": null, "timestamp": 1640792455505, "version": 2, "chainId": 84, "sender": "3N8rwRVNrxgqwFiVCNyX2Zyy6Lzgd1fDctN", "senderPublicKey": "2SGdJb3x9Ak59xjRyHMHFxLvh6dC5m37urdsBJy3f6TU", "proofs": [ "2kArtiUTQ2uzA1J52A6GsC6mLSUoT5JJTnqVKBUSKwXric1ta3r7v4EXcMG4e3JUafMdwLicij1ZGST7NEBikEG4", "KzuwdgFDtPwGqeesDsRdxfYb1Aa26FN8HdGvFz92xL6cRYF1vtrAvPoAULsXGYbKyp3R9TLNv5ZKK7kUJipGBDy" ], "script": "base64:AAIFAAAAAAAAEPsIAhIAEgMKAQESBAoCAQESABIECgIBARIAEgASAwoBARIFCgMEAQgSABoRCgFBEgxhZG1pblB1YktleTMaEQoBQhIMYWRtU3RhcnRTdG9wGg8KAUMSCmFkbVN0YWtpbmcaDAoBRBIHZ292QWRkchoJCgFFEgRVU0ROGgkKAUYSBEVVUk4aEgoBRxINc3Rha2luZ0Fzc2V0cxobCgFIEhZzdGFraW5nVVNETk5TQlRBZGRyZXNzGhcKAUkSEnN0YWtpbmdFVVJOQWRkcmVzcxoNCgFKEghpc0FjdGl2ZRoQCgFLEgtzdHJBc3NldElkQRoQCgFMEgtzdHJBc3NldElkQhoNCgFNEghhc3NldElkQRoNCgFOEghhc3NldElkQhoPCgFPEgphc3NldE5hbWVBGgcKAVASAmlkGgoKAVESBXdhdmVzGg8KAVISCmFzc2V0TmFtZUIaDQoBUxIIYmFsYW5jZUEaDQoBVBIIYmFsYW5jZUIaEQoBVRIMc2hhcmVBc3NldElkGhUKAVYSEHNoYXJlQXNzZXRTdXBwbHkaDgoBVxIJaW52YXJpYW50GggKAVgSA2ZlZRoSCgFZEg1mZWVHb3Zlcm5hbmNlGg4KAVoSCWZlZVNjYWxlNhoMCgFhEgd2ZXJzaW9uGgcKAmFBEgF4GgcKAmFCEgF5GhMKAmFDEg1pbnZhcmlhbnRDYWxjGggKAmFEEgJzaxoZCgJhRRITY2FsY3VsYXRlU2VuZEFtb3VudBobCgJhRhIVYW1vdW50VG9TZW5kRXN0aW1hdGVkGhsKAmFHEhVtaW5Ub2tlblJlY2VpdmVBbW91bnQaGAoCYUgSEnRva2VuUmVjZWl2ZUFtb3VudBoNCgJhSRIHdG9rZW5JZBoTCgJhShINc2xpcHBhZ2VWYWx1ZRokCgJhSxIeZGVsdGFCZXR3ZWVuTWF4QW5kTWluU2VuZFZhbHVlGhIKAmFMEgxpbnZhcmlhbnROZXcaHQoCYU0SF2ludmFyaWFudEVzdGltYXRlZFJhdGlvGhMKAmFOEg1nZXRTdGVwQW1vdW50GgkKAmFPEgNhY2MaCgoCYVASBHN0ZXAaEgoCYVESDGFtb3VudFRvU2VuZBoTCgJhUhINc3RlcEludmFyaWFudBoQCgJhUxIKc3RlcEFtb3VudBoICgJhVBICJGwaCAoCYVUSAiRzGgsKAmFWEgUkYWNjMBoLCgJhVxIFJGYwXzEaCAoCYVgSAiRhGggKAmFZEgIkaRoLCgJhWhIFJGYwXzIaDAoCYWESBnNjYWxlMxoMCgJhYhIGc2NhbGU4Gg0KAmFjEgdzY2FsZTEyGhQKAmFkEg5zbGlwcGFnZVNjYWxlMxoNCgJhZRIHZGlnaXRzOBoTCgJhZhINZEFwcFRocmVzaG9sZBoZCgJhZxITZEFwcFRocmVzaG9sZFNjYWxlMhobCgJhaBIVZXhjaGFuZ2VSYXRpb0xpbWl0TWluGhsKAmFpEhVleGNoYW5nZVJhdGlvTGltaXRNYXgaCwoCYWoSBWFscGhhGhEKAmFrEgthbHBoYURpZ2l0cxoKCgJhbBIEYmV0YRoUCgJhbRIOYWNjb3VudEJhbGFuY2UaDQoCYW4SB2Fzc2V0SWQaEgoCYW8SDHN0YWtlZEFtb3VudBocCgJhcBIWc3Rha2VkQW1vdW50Q2FsY3VsYXRlZBoJCgJhcRIDYUlkGgcKAmFyEgFpGhMKAmFzEg1zdGFrZWRBbW91bnRBGhMKAmF0Eg1zdGFrZWRBbW91bnRCGhcKAmF1EhFhdmFpbGFibGVCYWxhbmNlQRoXCgJhdhIRYXZhaWxhYmxlQmFsYW5jZUIaHwoCYXcSGWFjY291bnRCYWxhbmNlV2l0aFN0YWtlZEEaHwoCYXgSGWFjY291bnRCYWxhbmNlV2l0aFN0YWtlZEIaFgoCYXkSEGhhc0Vub3VnaEJhbGFuY2UaDgoCYXoSCHNrZXduZXNzGg0KAWISCGtWZXJzaW9uGhIKAmJBEgwkdDA5OTg3MTAwNjQaEAoCYkISCnBtdEFtb3VudEIaEQoCYkMSC3BtdEFzc2V0SWRCGhMKAmJEEg0kdDAxMDA2OTEwMTQ2GhQKAmJFEg5wbXRTdHJBc3NldElkQRoTCgJiRhINcG10QXNzZXROYW1lQRoSCgJiRxIMcG10RGVjaW1hbHNBGhMKAmJIEg0kdDAxMDE1MTEwMjI4GhQKAmJJEg5wbXRTdHJBc3NldElkQhoTCgJiShINcG10QXNzZXROYW1lQhoSCgJiSxIMcG10RGVjaW1hbHNCGg8KAmJMEglzaGFyZU5hbWUaFgoCYk0SEHNoYXJlRGVzY3JpcHRpb24aEwoCYk4SDXNoYXJlRGVjaW1hbHMaGAoCYk8SEnNoYXJlSW5pdGlhbFN1cHBseRoQCgJiUBIKc2hhcmVJc3N1ZRoSCgJiURIMc2hhcmVJc3N1ZUlkGhkKAmJSEhNpbnZhcmlhbnRDYWxjdWxhdGVkGgwKAmJTEgZzdGFrZTEaDAoCYlQSBnN0YWtlMhoXCgJiVRIRc2xpcHBhZ2VUb2xlcmFuY2UaEwoCYlYSDSR0MDEyNzQ4MTI4MjUaEwoCYlcSDSR0MDEyODMwMTMwMjQaEAoCYlgSCnRva2VuUmF0aW8aGQoCYlkSE3JhdGlvU2hhcmVUb2tlbnNJbkEaGQoCYloSE3JhdGlvU2hhcmVUb2tlbnNJbkIaEgoCYmESDGdldEFzc2V0SW5mbxoOCgJiYhIIc3RyaW5nSWQaCgoCYmMSBGluZm8aDQoCYmQSB3N1c3BlbmQaCwoCYmUSBWNhdXNlGhMKAmJmEg10aHJvd0lzQWN0aXZlGhUKAmJnEg90aHJvd0lzSW5hY3RpdmUaFAoCYmgSDnRocm93T25seUFkbWluGhEKAmJpEgt0aHJvd0Fzc2V0cxoUCgJiahIOdGhyb3dUaHJlc2hvbGQaDwoCYmsSCXRocmVzaG9sZBoNCgJibBIHYW1vdW50QRoNCgJibRIHYW1vdW50QhooCgJibhIidGhyb3dJbnN1ZmZpY2llbnRBdmFpbGFibGVCYWxhbmNlcxoXCgJibxIRc3VzcGVuZFN1c3BpY2lvdXMaHgoCYnASGGNhbGNTdGFraW5nRnVuY0FuZEFkZHJlcxoLCgJicRIFc3Rha2UaFwoCYnISEWNhbGNTdGFraW5nUGFyYW1zGgwKAmJzEgZhbW91bnQaEQoCYnQSCyR0MDk1ODI5NjQ4GgoKAmJ1EgRjYWxsGhEKAmJ2EgtzdGFraW5nQWRkchoRCgJidxILJHQwOTczNDk4MDAaEQoCYngSCyR0MDk5MDU5OTgyGhAKAmJ5EgpwbXRBbW91bnRBGhEKAmJ6EgtwbXRBc3NldElkQRoMCgFjEgdrQWN0aXZlGhMKAmNBEg0kdDAxOTQ3OTE5NjIyGhIKAmNCEgxhbW91bnRUb1BheUEaEgoCY0MSDGFtb3VudFRvUGF5QhoeCgJjRBIYZXN0aW1hdGVkQW1vdW50VG9SZWNlaXZlGhgKAmNFEhJtaW5BbW91bnRUb1JlY2VpdmUaEwoCY0YSDSR0MDIxMjkzMjEzNjgaEQoCY0cSC3NlbmRBc3NldElkGhYKAmNIEhBnb3Zlcm5hbmNlUmV3YXJkGhQKAmNJEg5hbW91bnRNaW51c0ZlZRoTCgJjShINJHQwMjI3OTAyMzA1MhoTCgJjSxINJHQwMjMzNTAyMzQyMxoTCgJjTBINJHQwMjM0MzYyMzUxNhoVCgJjTRIPc2VuZFN0ckFzc2V0SWRCGhQKAmNOEg5zZW5kQXNzZXROYW1lQhoTCgJjTxINc2VuZERlY2ltYWxzQhoRCgJjUBILYW1vdW50TGVhdmUaEgoCY1ESDHVuY291bnRhYmxlQRoSCgJjUhIMdW5jb3VudGFibGVCGhMKAmNTEg1hbW91bnRFbnJvbGxBGhMKAmNUEg1hbW91bnRFbnJvbGxCGhMKAmNVEg1hc3NldElkU3RyaW5nGhMKAmNWEg0kdDAyNjgzMTI2OTM0GgoKAmNXEgRhZGRyGgwKAmNYEgZwYXJhbXMaDgoCY1kSCHBheW1lbnRzGgkKAmNaEgNpbnYaGwoCY2ESFXNoYXJlVG9rZW5Ub1BheUFtb3VudBoZCgJjYhITdmlydHVhbFN3YXBUb2tlblBheRoZCgJjYxITdmlydHVhbFN3YXBUb2tlbkdldBoTCgJjZBINJHQwMTUzMjMxNTM5OBoPCgJjZRIJcG10QW1vdW50GhAKAmNmEgpwbXRBc3NldElkGhMKAmNnEg0kdDAxNTQwMzE1NDc2GhMKAmNoEg1wbXRTdHJBc3NldElkGhIKAmNpEgxwbXRBc3NldE5hbWUaEQoCY2oSC3BtdERlY2ltYWxzGhUKAmNrEg9wbXRNaW5UaHJlc2hvbGQaIwoCY2wSHXRocmVzaG9sZFZhbHVlRm9yTWluVG9sZXJhbmNlGg8KAmNtEgl0b2xlcmFuY2UaIgoCY24SHHNsaXBwYWdlVmFsdWVNaW5Gb3JSZXBsZW5pc2gaIgoCY28SHHNsaXBwYWdlVmFsdWVNYXhGb3JSZXBsZW5pc2gaHQoCY3ASF3NsaXBwYWdlVmFsdWVNaW5Gb3JTd2FwGhMKAmNxEg0kdDAxNjQ4ODE3MjUzGhcKAmNyEhF2aXJ0dWFsUmVwbGVuaXNoQRoXCgJjcxIRdmlydHVhbFJlcGxlbmlzaEIaFwoCY3QSEWJhbGFuY2VBZnRlclN3YXBBGhcKAmN1EhFiYWxhbmNlQWZ0ZXJTd2FwQhoRCgJjdhILbmV3QmFsYW5jZUEaEQoCY3cSC25ld0JhbGFuY2VCGhUKAmN4Eg9uZXdCYWxhbmNlRW50cnkaKwoCY3kSJXJhdGlvVmlydHVhbEJhbGFuY2VUb1ZpcnR1YWxSZXBsZW5pc2gaGQoCY3oSE2RBcHBUaHJlc2hvbGRBbW91bnQaDgoBZBIJa0Fzc2V0SWRBGggKAmRhEgJ0eBoMCgJkYhIGdmVyaWZ5GhkKAmRjEhNtdWx0aVNpZ25lZEJ5QWRtaW5zGhgKAmRkEhJhZG1pblB1YktleTFTaWduZWQaGAoCZGUSEmFkbWluUHViS2V5MlNpZ25lZBoYCgJkZhISYWRtaW5QdWJLZXkzU2lnbmVkGhkKAmRnEhNjYWxsVGFrZUludG9BY2NvdW50GhMKAmRoEg1zaWduZWRCeUFkbWluGg4KAWUSCWtBc3NldElkQhoOCgFmEglrQmFsYW5jZUEaDgoBZxIJa0JhbGFuY2VCGhIKAWgSDWtTaGFyZUFzc2V0SWQaFgoBaRIRa1NoYXJlQXNzZXRTdXBwbHkaCQoBahIEa0ZlZRoXCgFrEhJrRmVlU2NhbGVEZWxpbWl0ZXIaDwoBbBIKa0ludmFyaWFudBoLCgFtEgZrQ2F1c2UaFwoBbhISa2V5VVNETk5TQlRBZGRyZXNzGhMKAW8SDmtleUVVUk5BZGRyZXNzGhQKAXASD2tleUFkbWluUHViS2V5MRoUCgFxEg9rZXlBZG1pblB1YktleTIaFAoBchIPa2V5QWRtaW5QdWJLZXkzGgsKAXMSBm9yYWNsZRoQCgF0EgtnZXRBZG1pblB1YhoQCgF1EgtrZXlBZG1pblB1YhoMCgF2EgckbWF0Y2gwGgsKAXcSBnN0cmluZxoMCgF4Egdub3RoaW5nGhEKAXkSDGFkbWluUHViS2V5MRoRCgF6EgxhZG1pblB1YktleTIAAABRAAAAAAFhAgAAAAUyLjAuMAAAAAABYgIAAAAHdmVyc2lvbgAAAAABYwIAAAAGYWN0aXZlAAAAAAFkAgAAAApBX2Fzc2V0X2lkAAAAAAFlAgAAAApCX2Fzc2V0X2lkAAAAAAFmAgAAAA9BX2Fzc2V0X2JhbGFuY2UAAAAAAWcCAAAAD0JfYXNzZXRf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", "height": 1855704, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: DxTsQpeXN57omYE6pTTEZ5hZtBuGGo5gq33VvVEAcjCe Next: 9rB3oP9AyswbxnTspNGxTbhrWcS5YqQfF97caTA9N3CS Diff:
OldNewDifferences
671671 let params = $t02683126934._3
672672 let payments = $t02683126934._4
673673 let inv = invoke(addr, call, params, payments)
674- nil
674+ if ((inv == inv))
675+ then nil
676+ else throw("Strict value is not equal to itself.")
675677 }
676678
677679
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
180180 let availableBalanceA = (balanceA - stakedAmountA)
181181
182182 let availableBalanceB = (balanceB - stakedAmountB)
183183
184184 let accountBalanceWithStakedA = (accountBalance(assetIdA) + stakedAmountA)
185185
186186 let accountBalanceWithStakedB = (accountBalance(assetIdB) + stakedAmountB)
187187
188188 let hasEnoughBalance = if ((accountBalanceWithStakedA >= balanceA))
189189 then (accountBalanceWithStakedB >= balanceB)
190190 else false
191191
192192 func skewness (x,y) = (((fraction(scale12, x, y) + fraction(scale12, y, x)) / 2) / 10000)
193193
194194
195195 func invariantCalc (x,y) = {
196196 let sk = skewness(x, y)
197197 (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)))
198198 }
199199
200200
201201 func calculateSendAmount (amountToSendEstimated,minTokenReceiveAmount,tokenReceiveAmount,tokenId) = {
202202 let slippageValue = (scale8 - ((scale8 * 1) / 10000000))
203203 let deltaBetweenMaxAndMinSendValue = (amountToSendEstimated - minTokenReceiveAmount)
204204 let x = (balanceA + tokenReceiveAmount)
205205 let y = (balanceB + tokenReceiveAmount)
206206 let invariantNew = if ((tokenId == assetIdA))
207207 then invariantCalc(x, (balanceB - amountToSendEstimated))
208208 else if ((tokenId == assetIdB))
209209 then invariantCalc((balanceA - amountToSendEstimated), y)
210210 else throw("Wrong asset in payment")
211211 let invariantEstimatedRatio = fraction(scale8, invariant, invariantNew)
212212 func getStepAmount (acc,step) = if ((acc == -1))
213213 then {
214214 let amountToSend = (amountToSendEstimated - ((step * deltaBetweenMaxAndMinSendValue) / 5))
215215 let stepInvariant = if ((tokenId == assetIdA))
216216 then invariantCalc(x, (balanceB - amountToSend))
217217 else invariantCalc((balanceA - amountToSend), y)
218218 if ((stepInvariant > invariant))
219219 then amountToSend
220220 else -1
221221 }
222222 else acc
223223
224224 let stepAmount = {
225225 let $l = [1, 2, 3, 4, 5]
226226 let $s = size($l)
227227 let $acc0 = -1
228228 func $f0_1 ($a,$i) = if (($i >= $s))
229229 then $a
230230 else getStepAmount($a, $l[$i])
231231
232232 func $f0_2 ($a,$i) = if (($i >= $s))
233233 then $a
234234 else throw("List size exceeds 5")
235235
236236 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
237237 }
238238 if ((0 > stepAmount))
239239 then throw("something went wrong while working with amountToSend")
240240 else if (if ((invariantEstimatedRatio > slippageValue))
241241 then (invariantNew > invariant)
242242 else false)
243243 then amountToSendEstimated
244244 else stepAmount
245245 }
246246
247247
248248 func getAssetInfo (assetId) = match assetId {
249249 case id: ByteVector =>
250250 let stringId = toBase58String(id)
251251 let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
252252 $Tuple3(stringId, info.name, info.decimals)
253253 case waves: Unit =>
254254 $Tuple3("WAVES", "WAVES", 8)
255255 case _ =>
256256 throw("Match error")
257257 }
258258
259259
260260 func suspend (cause) = [BooleanEntry(kActive, false), StringEntry(kCause, cause)]
261261
262262
263263 func throwIsActive () = throw("DApp is already active")
264264
265265
266266 func throwIsInactive () = throw("DApp is inactive at this moment")
267267
268268
269269 func throwOnlyAdmin () = throw("Only admin can call this function")
270270
271271
272272 func throwAssets () = throw(((("Incorrect assets attached. Expected: " + strAssetIdA) + " and ") + strAssetIdB))
273273
274274
275275 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))
276276
277277
278278 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"))
279279
280280
281281 func suspendSuspicious () = suspend(((((((((((((((("Suspicious state. Actual balances: " + toString(balanceA)) + " ") + assetNameA) + ", ") + toString(balanceB)) + " ") + assetNameB) + ". State: ") + toString(accountBalance(assetIdA))) + " ") + assetNameA) + ", ") + toString(accountBalance(assetIdB))) + " ") + assetNameB))
282282
283283
284284 func calcStakingFuncAndAddres (stake,assetId) = if (stake)
285285 then if ((assetId == USDN))
286286 then $Tuple2("lockNeutrino", stakingUSDNNSBTAddress)
287287 else $Tuple2("startStaking", stakingEURNAddress)
288288 else if ((assetId == USDN))
289289 then $Tuple2("unlockNeutrino", stakingUSDNNSBTAddress)
290290 else $Tuple2("stopStaking", stakingEURNAddress)
291291
292292
293293 func calcStakingParams (stake,amount,assetId) = if (stake)
294294 then {
295295 let $t095829648 = calcStakingFuncAndAddres(stake, assetId)
296296 let call = $t095829648._1
297297 let stakingAddr = $t095829648._2
298298 $Tuple4(call, stakingAddr, nil, [AttachedPayment(assetId, amount)])
299299 }
300300 else {
301301 let $t097349800 = calcStakingFuncAndAddres(stake, assetId)
302302 let call = $t097349800._1
303303 let stakingAddr = $t097349800._2
304304 $Tuple4(call, stakingAddr, [amount, toBase58String(assetId)], nil)
305305 }
306306
307307
308308 @Callable(i)
309309 func init () = {
310310 let $t099059982 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
311311 let pmtAmountA = $t099059982._1
312312 let pmtAssetIdA = $t099059982._2
313313 let $t0998710064 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
314314 let pmtAmountB = $t0998710064._1
315315 let pmtAssetIdB = $t0998710064._2
316316 let $t01006910146 = getAssetInfo(pmtAssetIdA)
317317 let pmtStrAssetIdA = $t01006910146._1
318318 let pmtAssetNameA = $t01006910146._2
319319 let pmtDecimalsA = $t01006910146._3
320320 let $t01015110228 = getAssetInfo(pmtAssetIdB)
321321 let pmtStrAssetIdB = $t01015110228._1
322322 let pmtAssetNameB = $t01015110228._2
323323 let pmtDecimalsB = $t01015110228._3
324324 if (isDefined(getBoolean(this, kActive)))
325325 then throwIsActive()
326326 else if ((pmtAssetIdA == pmtAssetIdB))
327327 then throw("Assets must be different")
328328 else {
329329 let shareName = ((("s" + take(pmtAssetNameA, 7)) + "_") + take(pmtAssetNameB, 7))
330330 let shareDescription = ((((("ShareToken of SwopFi protocol for " + pmtAssetNameA) + " and ") + pmtAssetNameB) + " at address ") + toString(this))
331331 let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
332332 let shareInitialSupply = fraction(pow(pmtAmountA, pmtDecimalsA, 5, 1, pmtDecimalsA, DOWN), pow(pmtAmountB, pmtDecimalsB, 5, 1, pmtDecimalsB, DOWN), pow(10, 0, shareDecimals, 0, 0, DOWN))
333333 let shareIssue = Issue(shareName, shareDescription, shareInitialSupply, shareDecimals, true)
334334 let shareIssueId = calculateAssetId(shareIssue)
335335 let invariantCalculated = invariantCalc(pmtAmountA, pmtAmountB)
336336 let stake1 = if (containsElement(stakingAssets, pmtStrAssetIdA))
337337 then invoke(this, "stakeUnstake", [true, pmtAmountA, pmtStrAssetIdA], nil)
338338 else 0
339339 if ((stake1 == stake1))
340340 then {
341341 let stake2 = if (containsElement(stakingAssets, pmtStrAssetIdB))
342342 then invoke(this, "stakeUnstake", [true, pmtAmountB, pmtStrAssetIdB], nil)
343343 else 0
344344 if ((stake2 == stake2))
345345 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)]
346346 else throw("Strict value is not equal to itself.")
347347 }
348348 else throw("Strict value is not equal to itself.")
349349 }
350350 }
351351
352352
353353
354354 @Callable(i)
355355 func replenishWithTwoTokens (slippageTolerance) = {
356356 let pmtAssetIdA = i.payments[0].assetId
357357 let pmtAssetIdB = i.payments[1].assetId
358358 let pmtAmountA = i.payments[0].amount
359359 let pmtAmountB = i.payments[1].amount
360360 let $t01274812825 = getAssetInfo(pmtAssetIdA)
361361 let pmtStrAssetIdA = $t01274812825._1
362362 let pmtAssetNameA = $t01274812825._2
363363 let pmtDecimalsA = $t01274812825._3
364364 let $t01283013024 = getAssetInfo(pmtAssetIdB)
365365 let pmtStrAssetIdB = $t01283013024._1
366366 let pmtAssetNameB = $t01283013024._2
367367 let pmtDecimalsB = $t01283013024._3
368368 let tokenRatio = fraction(fraction(scale8, balanceA, pmtAmountA), scale3, fraction(scale8, balanceB, pmtAmountB))
369369 let ratioShareTokensInA = fraction(scale8, pmtAmountA, balanceA)
370370 let ratioShareTokensInB = fraction(scale8, pmtAmountB, balanceB)
371371 let shareTokenToPayAmount = fraction(min([ratioShareTokensInA, ratioShareTokensInB]), shareAssetSupply, scale8)
372372 let invariantCalculated = invariantCalc((balanceA + pmtAmountA), (balanceB + pmtAmountB))
373373 if (!(isActive))
374374 then throwIsInactive()
375375 else if (if ((0 > slippageTolerance))
376376 then true
377377 else (slippageTolerance > 10))
378378 then throw("Slippage tolerance must be <= 1%")
379379 else if ((size(i.payments) != 2))
380380 then throw("Two attached assets expected")
381381 else if (if ((pmtAssetIdA != assetIdA))
382382 then true
383383 else (pmtAssetIdB != assetIdB))
384384 then throwAssets()
385385 else if (if ((((scale3 * (slippageScale3 - slippageTolerance)) / slippageScale3) > tokenRatio))
386386 then true
387387 else (tokenRatio > ((scale3 * (slippageScale3 + slippageTolerance)) / slippageScale3)))
388388 then throw("Incorrect assets amount: amounts must have the contract ratio")
389389 else if ((shareTokenToPayAmount == 0))
390390 then throw("Too small amount to replenish")
391391 else if (!(hasEnoughBalance))
392392 then ([ScriptTransfer(i.caller, pmtAmountA, pmtAssetIdA), ScriptTransfer(i.caller, pmtAmountB, pmtAssetIdB)] ++ suspendSuspicious())
393393 else {
394394 let stake1 = if (containsElement(stakingAssets, pmtStrAssetIdA))
395395 then invoke(this, "stakeUnstake", [true, pmtAmountA, pmtStrAssetIdA], nil)
396396 else 0
397397 if ((stake1 == stake1))
398398 then {
399399 let stake2 = if (containsElement(stakingAssets, pmtStrAssetIdB))
400400 then invoke(this, "stakeUnstake", [true, pmtAmountB, pmtStrAssetIdB], nil)
401401 else 0
402402 if ((stake2 == stake2))
403403 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)]
404404 else throw("Strict value is not equal to itself.")
405405 }
406406 else throw("Strict value is not equal to itself.")
407407 }
408408 }
409409
410410
411411
412412 @Callable(i)
413413 func replenishWithOneToken (virtualSwapTokenPay,virtualSwapTokenGet) = {
414414 let $t01532315398 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
415415 let pmtAmount = $t01532315398._1
416416 let pmtAssetId = $t01532315398._2
417417 let $t01540315476 = getAssetInfo(pmtAssetId)
418418 let pmtStrAssetId = $t01540315476._1
419419 let pmtAssetName = $t01540315476._2
420420 let pmtDecimals = $t01540315476._3
421421 let pmtMinThreshold = 5000000
422422 let thresholdValueForMinTolerance = 50000000
423423 let tolerance = if ((thresholdValueForMinTolerance > pmtAmount))
424424 then 100000
425425 else 1
426426 let slippageValueMinForReplenish = (scale8 - ((scale8 * tolerance) / 10000000))
427427 let slippageValueMaxForReplenish = (scale8 + ((scale8 * tolerance) / 10000000))
428428 let slippageValueMinForSwap = (scale8 - ((scale8 * 1) / 10000000))
429429 if (!(isActive))
430430 then throwIsInactive()
431431 else if ((pmtMinThreshold > pmtAmount))
432432 then throw((((("Payment amount " + toString(pmtAmount)) + " does not exceed the minimum amount of ") + toString(pmtMinThreshold)) + " tokens"))
433433 else if ((size(i.payments) != 1))
434434 then throw("One attached payment expected")
435435 else if (!(hasEnoughBalance))
436436 then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
437437 else if (if ((pmtAssetId != assetIdA))
438438 then (pmtAssetId != assetIdB)
439439 else false)
440440 then throwAssets()
441441 else {
442442 let $t01648817253 = if ((pmtAssetId == assetIdA))
443443 then $Tuple7((pmtAmount - virtualSwapTokenPay), virtualSwapTokenGet, (balanceA + virtualSwapTokenPay), (balanceB - virtualSwapTokenGet), invariantCalc((balanceA + pmtAmount), balanceB), (balanceA + pmtAmount), balanceB)
444444 else $Tuple7(virtualSwapTokenGet, (pmtAmount - virtualSwapTokenPay), (balanceA - virtualSwapTokenGet), (balanceB + virtualSwapTokenPay), invariantCalc(balanceA, (balanceB + pmtAmount)), balanceA, (balanceB + pmtAmount))
445445 let virtualReplenishA = $t01648817253._1
446446 let virtualReplenishB = $t01648817253._2
447447 let balanceAfterSwapA = $t01648817253._3
448448 let balanceAfterSwapB = $t01648817253._4
449449 let invariantCalculated = $t01648817253._5
450450 let newBalanceA = $t01648817253._6
451451 let newBalanceB = $t01648817253._7
452452 let newBalanceEntry = if ((pmtAssetId == assetIdA))
453453 then IntegerEntry(kBalanceA, newBalanceA)
454454 else IntegerEntry(kBalanceB, newBalanceB)
455455 let invariantNew = invariantCalc(balanceAfterSwapA, balanceAfterSwapB)
456456 let invariantEstimatedRatio = fraction(scale8, invariant, invariantNew)
457457 let ratioVirtualBalanceToVirtualReplenish = (fraction((scale8 * scale8), balanceAfterSwapA, balanceAfterSwapB) / fraction(scale8, virtualReplenishA, virtualReplenishB))
458458 let dAppThresholdAmount = fraction((newBalanceA + newBalanceB), dAppThreshold, (2 * dAppThresholdScale2))
459459 if (if ((slippageValueMinForSwap >= invariantEstimatedRatio))
460460 then true
461461 else (invariant > invariantNew))
462462 then throw("Incorrect virtualSwapTokenPay or virtualSwapTokenGet value")
463463 else if (if ((slippageValueMinForReplenish > ratioVirtualBalanceToVirtualReplenish))
464464 then true
465465 else (ratioVirtualBalanceToVirtualReplenish > slippageValueMaxForReplenish))
466466 then throw("Swap with virtualSwapTokenPay and virtualSwapTokenGet is possible, but ratio after virtual swap is incorrect")
467467 else if (if ((dAppThresholdAmount > newBalanceA))
468468 then true
469469 else (dAppThresholdAmount > newBalanceB))
470470 then throwThreshold(dAppThresholdAmount, newBalanceA, newBalanceB)
471471 else {
472472 let stake1 = if (containsElement(stakingAssets, pmtStrAssetId))
473473 then invoke(this, "stakeUnstake", [true, pmtAmount, pmtStrAssetId], nil)
474474 else 0
475475 if ((stake1 == stake1))
476476 then {
477477 let ratioShareTokensInA = fraction(virtualReplenishA, scale8, balanceAfterSwapA)
478478 let ratioShareTokensInB = fraction(virtualReplenishB, scale8, balanceAfterSwapB)
479479 let shareTokenToPayAmount = fraction(min([ratioShareTokensInA, ratioShareTokensInB]), shareAssetSupply, scale8)
480480 [Reissue(shareAssetId, shareTokenToPayAmount, true), ScriptTransfer(i.caller, shareTokenToPayAmount, shareAssetId), IntegerEntry(kShareAssetSupply, (shareAssetSupply + shareTokenToPayAmount)), newBalanceEntry, IntegerEntry(kInvariant, invariantCalculated)]
481481 }
482482 else throw("Strict value is not equal to itself.")
483483 }
484484 }
485485 }
486486
487487
488488
489489 @Callable(i)
490490 func withdraw () = {
491491 let $t01947919622 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
492492 let pmtAmount = $t01947919622._1
493493 let pmtAssetId = $t01947919622._2
494494 let amountToPayA = fraction(pmtAmount, balanceA, shareAssetSupply)
495495 let amountToPayB = fraction(pmtAmount, balanceB, shareAssetSupply)
496496 let invariantCalculated = invariantCalc((balanceA - amountToPayA), (balanceB - amountToPayB))
497497 if (!(isActive))
498498 then throwIsInactive()
499499 else if ((size(i.payments) != 1))
500500 then throw("One attached payment expected")
501501 else if ((pmtAssetId != shareAssetId))
502502 then throw(("Incorrect asset attached. Expected: " + toBase58String(shareAssetId)))
503503 else if (!(hasEnoughBalance))
504504 then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
505505 else if (if ((amountToPayA > availableBalanceA))
506506 then true
507507 else (amountToPayB > availableBalanceB))
508508 then throwInsufficientAvailableBalances(amountToPayA, amountToPayB)
509509 else {
510510 let stake1 = if (containsElement(stakingAssets, strAssetIdA))
511511 then invoke(this, "stakeUnstake", [false, amountToPayA, strAssetIdA], nil)
512512 else 0
513513 if ((stake1 == stake1))
514514 then {
515515 let stake2 = if (containsElement(stakingAssets, strAssetIdB))
516516 then invoke(this, "stakeUnstake", [false, amountToPayB, strAssetIdB], nil)
517517 else 0
518518 if ((stake2 == stake2))
519519 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)]
520520 else throw("Strict value is not equal to itself.")
521521 }
522522 else throw("Strict value is not equal to itself.")
523523 }
524524 }
525525
526526
527527
528528 @Callable(i)
529529 func exchange (estimatedAmountToReceive,minAmountToReceive) = {
530530 let $t02129321368 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
531531 let pmtAmount = $t02129321368._1
532532 let pmtAssetId = $t02129321368._2
533533 if (!(isActive))
534534 then throwIsInactive()
535535 else if ((0 >= estimatedAmountToReceive))
536536 then throw(("Estimated amount must be positive. Actual: " + toString(estimatedAmountToReceive)))
537537 else if ((minAmountToReceive > estimatedAmountToReceive))
538538 then throw(((("Minimal amount can't be greater than estimated. Estimated: " + toString(estimatedAmountToReceive)) + ". Minimal: ") + toString(minAmountToReceive)))
539539 else if ((size(i.payments) != 1))
540540 then throw("One attached payment expected")
541541 else if (!(hasEnoughBalance))
542542 then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
543543 else if (if ((pmtAssetId != assetIdA))
544544 then (pmtAssetId != assetIdB)
545545 else false)
546546 then throwAssets()
547547 else if ((10000000 > pmtAmount))
548548 then throw("Only swap of 10.000000 or more tokens is allowed")
549549 else if (if ((exchangeRatioLimitMin > fraction(scale8, minAmountToReceive, pmtAmount)))
550550 then true
551551 else (fraction(scale8, estimatedAmountToReceive, pmtAmount) > exchangeRatioLimitMax))
552552 then throw("Incorrect args and pmt ratio")
553553 else {
554554 let sendAssetId = if ((pmtAssetId == assetIdA))
555555 then assetIdB
556556 else assetIdA
557557 let amount = calculateSendAmount(estimatedAmountToReceive, minAmountToReceive, pmtAmount, pmtAssetId)
558558 let governanceReward = fraction(amount, feeGovernance, feeScale6)
559559 let amountMinusFee = fraction(amount, (feeScale6 - fee), feeScale6)
560560 let $t02279023052 = if ((pmtAssetId == assetIdA))
561561 then $Tuple2((balanceA + pmtAmount), ((balanceB - amountMinusFee) - governanceReward))
562562 else $Tuple2(((balanceA - amountMinusFee) - governanceReward), (balanceB + pmtAmount))
563563 let newBalanceA = $t02279023052._1
564564 let newBalanceB = $t02279023052._2
565565 let dAppThresholdAmount = fraction((newBalanceA + newBalanceB), dAppThreshold, (2 * dAppThresholdScale2))
566566 if (if ((dAppThresholdAmount > newBalanceA))
567567 then true
568568 else (dAppThresholdAmount > newBalanceB))
569569 then throwThreshold(dAppThresholdAmount, newBalanceA, newBalanceB)
570570 else {
571571 let $t02335023423 = getAssetInfo(pmtAssetId)
572572 let pmtStrAssetId = $t02335023423._1
573573 let pmtAssetName = $t02335023423._2
574574 let pmtDecimals = $t02335023423._3
575575 let $t02343623516 = getAssetInfo(sendAssetId)
576576 let sendStrAssetIdB = $t02343623516._1
577577 let sendAssetNameB = $t02343623516._2
578578 let sendDecimalsB = $t02343623516._3
579579 let stake1 = if (containsElement(stakingAssets, pmtStrAssetId))
580580 then invoke(this, "stakeUnstake", [true, pmtAmount, pmtAssetId], nil)
581581 else 0
582582 if ((stake1 == stake1))
583583 then {
584584 let stake2 = if (containsElement(stakingAssets, sendStrAssetIdB))
585585 then invoke(this, "stakeUnstake", [false, (amount + governanceReward), sendAssetId], nil)
586586 else 0
587587 if ((stake2 == stake2))
588588 then [IntegerEntry(kBalanceA, newBalanceA), IntegerEntry(kBalanceB, newBalanceB), IntegerEntry(kInvariant, invariantCalc(newBalanceA, newBalanceB)), ScriptTransfer(i.caller, amountMinusFee, sendAssetId), ScriptTransfer(govAddr, governanceReward, sendAssetId)]
589589 else throw("Strict value is not equal to itself.")
590590 }
591591 else throw("Strict value is not equal to itself.")
592592 }
593593 }
594594 }
595595
596596
597597
598598 @Callable(i)
599599 func shutdown () = if (!(isActive))
600600 then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, kCause), "the cause wasn't specified")))
601601 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, admStartStop], i.callerPublicKey)))
602602 then throwOnlyAdmin()
603603 else suspend("Paused by admin")
604604
605605
606606
607607 @Callable(i)
608608 func activate () = if (isActive)
609609 then throwIsActive()
610610 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, admStartStop], i.callerPublicKey)))
611611 then throwOnlyAdmin()
612612 else [BooleanEntry(kActive, true), DeleteEntry(kCause)]
613613
614614
615615
616616 @Callable(i)
617617 func takeIntoAccountExtraFunds (amountLeave) = {
618618 let uncountableA = (accountBalanceWithStakedA - balanceA)
619619 let uncountableB = (accountBalanceWithStakedB - balanceB)
620620 let amountEnrollA = (uncountableA - (if ((assetIdA == unit))
621621 then amountLeave
622622 else 0))
623623 let amountEnrollB = (uncountableB - (if ((assetIdB == unit))
624624 then amountLeave
625625 else 0))
626626 let invariantNew = invariantCalc((balanceA + amountEnrollA), (balanceB + amountEnrollB))
627627 if (!(isActive))
628628 then throwIsInactive()
629629 else if ((i.caller != this))
630630 then throwOnlyAdmin()
631631 else if ((0 > amountLeave))
632632 then throw(("Argument 'amountLeave' cannot be negative. Actual: " + toString(amountLeave)))
633633 else if (if ((0 > uncountableA))
634634 then true
635635 else (0 > uncountableB))
636636 then suspend("Enroll amount negative")
637637 else if (if ((0 > amountEnrollA))
638638 then true
639639 else (0 > amountEnrollB))
640640 then throw("Too large amountLeave")
641641 else {
642642 let stake1 = if (if (containsElement(stakingAssets, strAssetIdA))
643643 then (amountEnrollA > 0)
644644 else false)
645645 then invoke(this, "stakeUnstake", [true, amountEnrollA, strAssetIdA], nil)
646646 else 0
647647 if ((stake1 == stake1))
648648 then {
649649 let stake2 = if (if (containsElement(stakingAssets, strAssetIdB))
650650 then (amountEnrollB > 0)
651651 else false)
652652 then invoke(this, "stakeUnstake", [true, amountEnrollB, strAssetIdB], nil)
653653 else 0
654654 if ((stake2 == stake2))
655655 then [IntegerEntry(kInvariant, invariantNew), IntegerEntry(kBalanceA, (balanceA + amountEnrollA)), IntegerEntry(kBalanceB, (balanceB + amountEnrollB)), IntegerEntry(("last_income_" + strAssetIdA), amountEnrollA), IntegerEntry(("last_income_" + strAssetIdB), amountEnrollB)]
656656 else throw("Strict value is not equal to itself.")
657657 }
658658 else throw("Strict value is not equal to itself.")
659659 }
660660 }
661661
662662
663663
664664 @Callable(i)
665665 func stakeUnstake (stake,amount,assetIdString) = if ((i.caller != this))
666666 then throw("Only contract itself can invoke this function")
667667 else {
668668 let $t02683126934 = calcStakingParams(stake, amount, fromBase58String(assetIdString))
669669 let call = $t02683126934._1
670670 let addr = $t02683126934._2
671671 let params = $t02683126934._3
672672 let payments = $t02683126934._4
673673 let inv = invoke(addr, call, params, payments)
674- nil
674+ if ((inv == inv))
675+ then nil
676+ else throw("Strict value is not equal to itself.")
675677 }
676678
677679
678680
679681 @Callable(i)
680682 func stakeAll () = if (!(isActive))
681683 then throw("DApp is inactive at this moment")
682684 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, admStartStop], i.callerPublicKey)))
683685 then throw("Only admin can call this function")
684686 else {
685687 let stake1 = if (containsElement(stakingAssets, strAssetIdA))
686688 then {
687689 let amountA = (balanceA - stakedAmountA)
688690 if ((amountA > 0))
689691 then invoke(this, "stakeUnstake", [true, amountA, strAssetIdA], nil)
690692 else 0
691693 }
692694 else 0
693695 if ((stake1 == stake1))
694696 then {
695697 let stake2 = if (containsElement(stakingAssets, strAssetIdB))
696698 then {
697699 let amountB = (balanceB - stakedAmountB)
698700 if ((amountB > 0))
699701 then invoke(this, "stakeUnstake", [true, amountB, strAssetIdB], nil)
700702 else 0
701703 }
702704 else 0
703705 if ((stake2 == stake2))
704706 then nil
705707 else throw("Strict value is not equal to itself.")
706708 }
707709 else throw("Strict value is not equal to itself.")
708710 }
709711
710712
711713 @Verifier(tx)
712714 func verify () = {
713715 let multiSignedByAdmins = {
714716 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
715717 then 1
716718 else 0
717719 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
718720 then 1
719721 else 0
720722 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
721723 then 1
722724 else 0
723725 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
724726 }
725727 match tx {
726728 case inv: InvokeScriptTransaction =>
727729 let callTakeIntoAccount = if ((inv.dApp == this))
728730 then (inv.function == "takeIntoAccountExtraFunds")
729731 else false
730732 let signedByAdmin = if (if (if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
731733 then true
732734 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey2))
733735 then true
734736 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey3))
735737 then true
736738 else sigVerify(tx.bodyBytes, tx.proofs[0], admStaking)
737739 if (if (callTakeIntoAccount)
738740 then signedByAdmin
739741 else false)
740742 then true
741743 else multiSignedByAdmins
742744 case _ =>
743745 multiSignedByAdmins
744746 }
745747 }
746748

github/deemru/w8io/3ef1775 
130.87 ms