tx · 5nBZNPx1WynphUcymGAMVsbj8zxqZpscHcaBTxuVtYks

3Mq63YubY7UKJEobhDuXfsnXaPDJZT1fDhx:  -0.01400000 Waves

2021.12.29 19:38 [1855760] smart account 3Mq63YubY7UKJEobhDuXfsnXaPDJZT1fDhx > SELF 0.00000000 Waves

{ "type": 13, "id": "5nBZNPx1WynphUcymGAMVsbj8zxqZpscHcaBTxuVtYks", "fee": 1400000, "feeAssetId": null, "timestamp": 1640795959275, "version": 2, "chainId": 84, "sender": "3Mq63YubY7UKJEobhDuXfsnXaPDJZT1fDhx", "senderPublicKey": "HXfVyeXgXUtHD3uSP6yjsk6JQcTwmU9qQTvhXzFpPw2T", "proofs": [ "5Dr6iMSDtYaxDqYvzueTSPAiZqJfeMtLh8uzx5bmPyMvwhvgBy1UwxNeMvjGKC72zFC5amrTMVLQPScxuAKf8VCc", "2JGsnWzwFRQi5pNM76V428dTJderdx88FpQqqhQFXVERPbcvc76KcTFyW6bvfghsRsjSA28pCeL2Nn3eXvJK2adS" ], "script": "base64:AAIFAAAAAAAADqYIAhIDCgEEEgcKBQEBCAgEEgMKAQESAwoBARIAEgMKAQESABIAEgMKAQESBQoDBAEIEgAaFAoBQRIPa2V5QWRtaW5QdWJLZXkyGhQKAUISD2tleUFkbWluUHViS2V5MxoLCgFDEgZvcmFjbGUaEAoBRBILZ2V0QWRtaW5QdWIaEAoBRRILa2V5QWRtaW5QdWIaDAoBRhIHJG1hdGNoMBoLCgFHEgZzdHJpbmcaDAoBSBIHbm90aGluZxoRCgFJEgxhZG1pblB1YktleTEaEQoBShIMYWRtaW5QdWJLZXkyGhEKAUsSDGFkbWluUHViS2V5MxoZCgFMEhRhZG1pblB1YktleVN0YXJ0U3RvcBoXCgFNEhJhZG1pblB1YktleVN0YWtpbmcaEgoBThINd2FsbGV0QWRkcmVzcxoSCgFPEg12b3RpbmdBZGRyZXNzGgkKAVASBFVTRE4aCQoBURIETlNCVBoJCgFSEgRFVVJOGhIKAVMSDXN0YWtpbmdBc3NldHMaGwoBVBIWc3Rha2luZ1VTRE5OU0JUQWRkcmVzcxoXCgFVEhJzdGFraW5nRVVSTkFkZHJlc3MaGQoBVhIUVVNETlRvV2F2ZXNFeGNoYW5nZXIaGAoBVxITVVNETlRvTlNCVEV4Y2hhbmdlchoPCgFYEgpiYXNlUGVyaW9kGhAKAVkSC3N0YXJ0SGVpZ2h0GhEKAVoSDHBlcmlvZExlbmd0aBoMCgFhEgd2ZXJzaW9uGhMKAmFBEg1zdGFrZWRBbW91bnRCGhAKAmFCEgphc3NldEluaXRBGhAKAmFDEgphc3NldEluaXRCGh8KAmFEEhlhY2NvdW50QmFsYW5jZVdpdGhTdGFrZWRBGh8KAmFFEhlhY2NvdW50QmFsYW5jZVdpdGhTdGFrZWRCGhYKAmFGEhBoYXNFbm91Z2hCYWxhbmNlGhIKAmFHEgxnZXRBc3NldEluZm8aDgoCYUgSCHN0cmluZ0lkGgoKAmFJEgRpbmZvGhwKAmFKEhZnZXRBc3NldEluZm9Gcm9tU3RyaW5nGg4KAmFLEghhc3NldFN0choNCgJhTBIHc3VzcGVuZBoLCgJhTRIFY2F1c2UaHgoCYU4SGGNhbGNTdGFraW5nRnVuY0FuZEFkZHJlcxoLCgJhTxIFc3Rha2UaFwoCYVASEWNhbGNTdGFraW5nUGFyYW1zGgwKAmFREgZhbW91bnQaEQoCYVISCyR0MDY5Mjg2OTk0GgoKAmFTEgRjYWxsGhEKAmFUEgtzdGFraW5nQWRkchoRCgJhVRILJHQwNzA4MDcxNDYaFwoCYVYSEXN1c3BlbmRTdXNwaWNpb3VzGg4KAmFXEghpc0FjdGl2ZRoSCgJhWBIMZmlyc3RIYXJ2ZXN0GhEKAmFZEgskdDA3NjYyNzczORoQCgJhWhIKcG10QW1vdW50QRobCgJhYRIVZmlyc3RIYXJ2ZXN0RW5kUGVyaW9kGgwKAmFiEgZhY3RpdmUaEQoCYWMSC3N0ckFzc2V0SWRBGhEKAmFkEgtzdHJBc3NldElkQhoOCgJhZRIIYXNzZXRJZEEaDgoCYWYSCGFzc2V0SWRCGhAKAmFnEgphc3NldE5hbWVBGggKAmFoEgJpZBoLCgJhaRIFd2F2ZXMaEAoCYWoSCmFzc2V0TmFtZUIaDgoCYWsSCGJhbGFuY2VBGg4KAmFsEghiYWxhbmNlQhoSCgJhbRIMc2hhcmVBc3NldElkGhYKAmFuEhBzaGFyZUFzc2V0U3VwcGx5GhAKAmFvEgpjb21taXNzaW9uGh4KAmFwEhhjb21taXNzaW9uU2NhbGVEZWxpbWl0ZXIaEQoCYXESC3NjYWxlVmFsdWUzGhEKAmFyEgtzY2FsZVZhbHVlOBogCgJhcxIac2xpcHBhZ2VUb2xlcmFuY2VEZWxpbWl0ZXIaFAoCYXQSDmFjY291bnRCYWxhbmNlGg0KAmF1Egdhc3NldElkGhIKAmF2EgxzdGFrZWRBbW91bnQaHAoCYXcSFnN0YWtlZEFtb3VudENhbGN1bGF0ZWQaCQoCYXgSA2FJZBoHCgJheRIBaRoTCgJhehINc3Rha2VkQW1vdW50QRoPCgFiEgprZXlWZXJzaW9uGhMKAmJBEg0kdDAxMDU3NDEwNjYxGhMKAmJCEg0kdDAxMDY2NjEwNzUzGhAKAmJDEgpzaGFyZUxpbWl0GhcKAmJEEhFzbGlwcGFnZVRvbGVyYW5jZRoTCgJiRRINJHQwMTMyMjExMzI5OBoTCgJiRhINJHQwMTMzMDMxMzM4MBoMCgJiRxIGaW5pdGFsGhAKAmJIEgp0b2tlblJhdGlvGhsKAmJJEhVzaGFyZVRva2VuVG9QYXlBbW91bnQaEwoCYkoSDSR0MDE2MTQ2MTYyMjEaDwoCYksSCXBtdEFtb3VudBoQCgJiTBIKcG10QXNzZXRJZBoSCgJiTRIMYW1vdW50VG9QYXlBGhIKAmJOEgxhbW91bnRUb1BheUIaGAoCYk8SEm1pbkFtb3VudFRvUmVjZWl2ZRoTCgJiUBINJHQwMTc1MjcxNzYwMhoTCgJiURINY2FsY3VsYXRlRmVlcxoPCgJiUhIJdG9rZW5Gcm9tGg0KAmJTEgd0b2tlblRvGhYKAmJUEhBhbW91bnRXaXRob3V0RmVlGhMKAmJVEg1hbW91bnRXaXRoRmVlGhYKAmJWEhBnb3Zlcm5hbmNlUmV3YXJkGhEKAmJXEgthc3NldElkU2VuZBoTCgJiWBINJHQwMTg4MDAxODg5MRoRCgJiWRILbmV3QmFsYW5jZUEaEQoCYloSC25ld0JhbGFuY2VCGhEKAmJhEgtwbXRBc3NldElkQRoRCgJiYhILJHQwNzc0NDc4MjEaEAoCYmMSCnBtdEFtb3VudEIaEQoCYmQSC3BtdEFzc2V0SWRCGhEKAmJlEgskdDA3ODI2NzkwMxoUCgJiZhIOcG10U3RyQXNzZXRJZEEaEwoCYmcSDXBtdEFzc2V0TmFtZUEaEgoCYmgSDHBtdERlY2ltYWxzQRoRCgJiaRILJHQwNzkwODc5ODUaFAoCYmoSDnBtdFN0ckFzc2V0SWRCGhMKAmJrEg1wbXRBc3NldE5hbWVCGhIKAmJsEgxwbXREZWNpbWFsc0IaDwoCYm0SCXNoYXJlTmFtZRoWCgJibhIQc2hhcmVEZXNjcmlwdGlvbhoTCgJibxINc2hhcmVEZWNpbWFscxoKCgJicBIEYXJnMRoKCgJicRIEYXJnMhoKCgJichIEYXJnMxoYCgJicxISc2hhcmVJbml0aWFsU3VwcGx5GhAKAmJ0EgpzaGFyZUlzc3VlGhIKAmJ1EgxzaGFyZUlzc3VlSWQaDAoCYnYSBnN0YWtlMRoMCgJidxIGc3Rha2UyGg8KAmJ4EgliYXNlRW50cnkaDwoCYnkSCWFtdEFzc2V0QRoPCgJiehIJYW10QXNzZXRCGg4KAWMSCWtleUFjdGl2ZRoYCgJjQRISYWRtaW5QdWJLZXkyU2lnbmVkGhgKAmNCEhJhZG1pblB1YktleTNTaWduZWQaGQoCY0MSE2NhbGxUYWtlSW50b0FjY291bnQaFQoCY0QSD2V4Y2hhbmdlVG9XYXZlcxoVCgJjRRIPZXhjaGFuZ2VUb05TQlRzGhMKAmNGEg1zaWduZWRCeUFkbWluGhMKAmNhEg0kdDAxOTg0NjE5OTM3GhEKAmNiEgthbW91bnRMZWF2ZRojCgJjYxIddW5jb3VudGFibGVBbW91bnRFbnJvbGxBc3NldEEaIwoCY2QSHXVuY291bnRhYmxlQW1vdW50RW5yb2xsQXNzZXRCGhMKAmNlEg1hbW91bnRFbnJvbGxBGhMKAmNmEg1hbW91bnRFbnJvbGxCGhMKAmNnEg1hc3NldElkU3RyaW5nGgoKAmNoEgRwb29sGg8KAmNpEglsZWFzaW5nSWQaEwoCY2oSDWxlYXNpbmdBbW91bnQaFAoCY2sSDm5ld0xlYXNlQW1vdW50Gg4KAmNsEghuZXdMZWFzZRoQCgJjbRIKbmV3TGVhc2VJZBoOCgJjbhIIYmFzZUV0cnkaCQoCY28SA2xJZBoTCgJjcBINJHQwMjQwODUyNDE4OBoKCgJjcRIEYWRkchoMCgJjchIGcGFyYW1zGg4KAmNzEghwYXltZW50cxoJCgJjdBIDaW52Gg0KAmN1EgdhbW91bnRBGg0KAmN2EgdhbW91bnRCGggKAmN3EgJ0eBoMCgJjeBIGdmVyaWZ5GhkKAmN5EhNtdWx0aVNpZ25lZEJ5QWRtaW5zGhgKAmN6EhJhZG1pblB1YktleTFTaWduZWQaEAoBZBILa2V5QXNzZXRJZEEaEAoBZRILa2V5QXNzZXRJZEIaEAoBZhILa2V5QmFsYW5jZUEaEAoBZxILa2V5QmFsYW5jZUIaFAoBaBIPa2V5QmFsYW5jZUluaXRBGhQKAWkSD2tleUJhbGFuY2VJbml0QhoUCgFqEg9rZXlTaGFyZUFzc2V0SWQaGAoBaxITa2V5U2hhcmVBc3NldFN1cHBseRoSCgFsEg1rZXlDb21taXNzaW9uGiAKAW0SG2tleUNvbW1pc3Npb25TY2FsZURlbGltaXRlchoNCgFuEghrZXlDYXVzZRoUCgFvEg9rZXlGaXJzdEhhcnZlc3QaGgoBcBIVa2V5Rmlyc3RIYXJ2ZXN0SGVpZ2h0GhAKAXESC2tTaGFyZUxpbWl0GhAKAXISC2tCYXNlUGVyaW9kGhIKAXMSDWtQZXJpb2RMZW5ndGgaEQoBdBIMa1N0YXJ0SGVpZ2h0GhcKAXUSEmtleVVTRE5OU0JUQWRkcmVzcxoTCgF2Eg5rZXlFVVJOQWRkcmVzcxoTCgF3Eg5rZXlMZWFzaW5nUG9vbBoVCgF4EhBrZXlMZWFzaW5nQW1vdW50GhEKAXkSDGtleUxlYXNpbmdJZBoUCgF6Eg9rZXlBZG1pblB1YktleTEAAABRAAAAAAFhAgAAAAUxLjAuMAAAAAABYgIAAAAHdmVyc2lvbgAAAAABYwIAAAAGYWN0aXZlAAAAAAFkAgAAAApBX2Fzc2V0X2lkAAAAAAFlAgAAAApCX2Fzc2V0X2lkAAAAAAFmAgAAAA9BX2Fzc2V0X2JhbGFuY2UAAAAAAWcCAAAAD0JfYXNzZXRfYmFsYW5jZQAAAAABaAIAAAAMQV9hc3NldF9pbml0AAAAAAFpAgAAAAxCX2Fzc2V0X2luaXQAAAAAAWoCAAAADnNoYXJlX2Fzc2V0X2lkAAAAAAFrAgAAABJzaGFyZV9hc3NldF9zdXBwbHkAAAAAAWwCAAAACmNvbW1pc3Npb24AAAAAAW0CAAAAGmNvbW1pc3Npb25fc2NhbGVfZGVsaW1pdGVyAAAAAAFuAgAAAA5zaHV0ZG93bl9jYXVzZQAAAAABbwIAAAANZmlyc3RfaGFydmVzdAAAAAABcAIAAAAUZmlyc3RfaGFydmVzdF9oZWlnaHQAAAAAAXECAAAAHHNoYXJlX2xpbWl0X29uX2ZpcnN0X2hhcnZlc3QAAAAAAXICAAAAC2Jhc2VfcGVyaW9kAAAAAAFzAgAAAA1wZXJpb2RfbGVuZ3RoAAAAAAF0AgAAAAxzdGFydF9oZWlnaHQAAAAAAXUCAAAAGHN0YWtpbmdfdXNkbm5zYnRfYWRkcmVzcwAAAAABdgIAAAAUc3Rha2luZ19ldXJuX2FkZHJlc3MAAAAAAXcCAAAAD2xlYXNpbmdfYWRkcmVzcwAAAAABeAIAAAAObGVhc2luZ19hbW91bnQAAAAAAXkCAAAACmxlYXNpbmdfaWQAAAAAAXoCAAAAC2FkbWluX3B1Yl8xAAAAAAFBAgAAAAthZG1pbl9wdWJfMgAAAAABQgIAAAALYWRtaW5fcHViXzMAAAAAAUMJAQAAAAdBZGRyZXNzAAAAAQEAAAAaAVTpRaoekC86rvG6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", "height": 1855760, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 8rYiFi2o9kjEz3Z3JKP8AvKttrKcfT4sRexurNmsGQfs Next: 2VVe3JYquT2gW3tbyiMscaMkEbg4KAbn5P5aonaHxeAG Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let version = "1.0.0"
55
66 let keyVersion = "version"
77
88 let keyActive = "active"
99
1010 let keyAssetIdA = "A_asset_id"
1111
1212 let keyAssetIdB = "B_asset_id"
1313
1414 let keyBalanceA = "A_asset_balance"
1515
1616 let keyBalanceB = "B_asset_balance"
1717
1818 let keyBalanceInitA = "A_asset_init"
1919
2020 let keyBalanceInitB = "B_asset_init"
2121
2222 let keyShareAssetId = "share_asset_id"
2323
2424 let keyShareAssetSupply = "share_asset_supply"
2525
2626 let keyCommission = "commission"
2727
2828 let keyCommissionScaleDelimiter = "commission_scale_delimiter"
2929
3030 let keyCause = "shutdown_cause"
3131
3232 let keyFirstHarvest = "first_harvest"
3333
3434 let keyFirstHarvestHeight = "first_harvest_height"
3535
3636 let kShareLimit = "share_limit_on_first_harvest"
3737
3838 let kBasePeriod = "base_period"
3939
4040 let kPeriodLength = "period_length"
4141
4242 let kStartHeight = "start_height"
4343
4444 let keyUSDNNSBTAddress = "staking_usdnnsbt_address"
4545
4646 let keyEURNAddress = "staking_eurn_address"
4747
4848 let keyLeasingPool = "leasing_address"
4949
5050 let keyLeasingAmount = "leasing_amount"
5151
5252 let keyLeasingId = "leasing_id"
5353
5454 let keyAdminPubKey1 = "admin_pub_1"
5555
5656 let keyAdminPubKey2 = "admin_pub_2"
5757
5858 let keyAdminPubKey3 = "admin_pub_3"
5959
6060 let oracle = Address(base58'3NBBWfzZtZtszaXbitTKnrB2xXwv26Bn7H9')
6161
6262 func getAdminPub (keyAdminPub) = match getString(oracle, keyAdminPub) {
6363 case string: String =>
6464 fromBase58String(string)
6565 case nothing =>
6666 throw("Admin public key is empty")
6767 }
6868
6969
7070 let adminPubKey1 = getAdminPub(keyAdminPubKey1)
7171
7272 let adminPubKey2 = getAdminPub(keyAdminPubKey2)
7373
7474 let adminPubKey3 = getAdminPub(keyAdminPubKey3)
7575
7676 let adminPubKeyStartStop = base58'Kn7NpzaG12dLZgcHf2ipUftU6hbJygmrhFqQYE4B7ZK'
7777
7878 let adminPubKeyStaking = base58'Kn7NpzaG12dLZgcHf2ipUftU6hbJygmrhFqQYE4B7ZK'
7979
8080 let walletAddress = Address(base58'3NAGTtZz6WpupSN89NZD5rMZwwziZEg4Kx4')
8181
8282 let votingAddress = Address(base58'3MrJgdL1GniipErHy44YF9idzLaUL2iX5DQ')
8383
8484 let USDN = base58'8UrfDVd5GreeUwm7uPk7eYz1eMv376kzR52C6sANPkwS'
8585
8686 let NSBT = base58'36mg8NZTaFRDygiVwb8uBnLR51hetJruUCZcxhaVcHj9'
8787
8888 let EURN = base58'ECBCkHS68DckpBrzLeoRgYbFg7sCVqR176mPqbXsj9pA'
8989
9090 let stakingAssets = ["WAVES", toBase58String(USDN), toBase58String(NSBT), toBase58String(EURN)]
9191
9292 let stakingUSDNNSBTAddress = Address(fromBase58String(valueOrErrorMessage(getString(oracle, keyUSDNNSBTAddress), "no usdn staking address")))
9393
9494 let stakingEURNAddress = Address(fromBase58String(valueOrErrorMessage(getString(oracle, keyEURNAddress), "no usdn staking address")))
9595
9696 let USDNToWavesExchanger = Address(base58'3N8PGkzXhbtTvEwEQTtE2xiTJmsDEQ9XfoZ')
9797
9898 let USDNToNSBTExchanger = Address(base58'3MqW1t2cxdYy2emEMk3YtZkRwQPhHaTfWRe')
9999
100100 let basePeriod = valueOrErrorMessage(getInteger(votingAddress, kBasePeriod), "Empty kBasePeriod")
101101
102102 let startHeight = valueOrErrorMessage(getInteger(votingAddress, kStartHeight), "Empty kStartHeight")
103103
104104 let periodLength = valueOrErrorMessage(getInteger(votingAddress, kPeriodLength), "Empty kPeriodLength")
105105
106106 let firstHarvestEndPeriod = ((basePeriod + ((height - startHeight) / periodLength)) + 3)
107107
108108 let active = getBooleanValue(this, keyActive)
109109
110110 let strAssetIdA = getStringValue(this, keyAssetIdA)
111111
112112 let strAssetIdB = getStringValue(this, keyAssetIdB)
113113
114114 let assetIdA = if ((strAssetIdA == "WAVES"))
115115 then unit
116116 else fromBase58String(strAssetIdA)
117117
118118 let assetIdB = if ((strAssetIdB == "WAVES"))
119119 then unit
120120 else fromBase58String(strAssetIdB)
121121
122122 let assetNameA = match assetIdA {
123123 case id: ByteVector =>
124124 value(assetInfo(id)).name
125125 case waves: Unit =>
126126 "WAVES"
127127 case _ =>
128128 throw("Match error")
129129 }
130130
131131 let assetNameB = match assetIdB {
132132 case id: ByteVector =>
133133 value(assetInfo(id)).name
134134 case waves: Unit =>
135135 "WAVES"
136136 case _ =>
137137 throw("Match error")
138138 }
139139
140140 let balanceA = getIntegerValue(this, keyBalanceA)
141141
142142 let balanceB = getIntegerValue(this, keyBalanceB)
143143
144144 let shareAssetId = fromBase58String(getStringValue(this, keyShareAssetId))
145145
146146 let shareAssetSupply = getIntegerValue(this, keyShareAssetSupply)
147147
148148 let commission = 3000
149149
150150 let commissionScaleDelimiter = 1000000
151151
152152 let scaleValue3 = 1000
153153
154154 let scaleValue8 = 100000000
155155
156156 let slippageToleranceDelimiter = 1000
157157
158158 func accountBalance (assetId) = match assetId {
159159 case id: ByteVector =>
160160 assetBalance(this, id)
161161 case waves: Unit =>
162162 wavesBalance(this).available
163163 case _ =>
164164 throw("Match error")
165165 }
166166
167167
168168 func stakedAmount (assetId) = {
169169 let stakedAmountCalculated = match assetId {
170170 case aId: ByteVector =>
171171 if (if ((aId == USDN))
172172 then true
173173 else (aId == NSBT))
174174 then getInteger(stakingUSDNNSBTAddress, ((("rpd_balance_" + toBase58String(aId)) + "_") + toString(this)))
175175 else if ((aId == EURN))
176176 then getInteger(stakingEURNAddress, ((("%s%s%s__stakingBalance__" + toBase58String(aId)) + "__") + toString(this)))
177177 else 0
178178 case _: Unit =>
179179 valueOrElse(getInteger(this, keyLeasingAmount), 0)
180180 case _ =>
181181 throw("Match error")
182182 }
183183 match stakedAmountCalculated {
184184 case i: Int =>
185185 i
186186 case _ =>
187187 0
188188 }
189189 }
190190
191191
192192 let stakedAmountA = stakedAmount(assetIdA)
193193
194194 let stakedAmountB = stakedAmount(assetIdB)
195195
196196 let assetInitA = getIntegerValue(this, keyBalanceInitA)
197197
198198 let assetInitB = getIntegerValue(this, keyBalanceInitB)
199199
200200 let accountBalanceWithStakedA = (accountBalance(assetIdA) + stakedAmountA)
201201
202202 let accountBalanceWithStakedB = (accountBalance(assetIdB) + stakedAmountB)
203203
204204 let hasEnoughBalance = if ((accountBalanceWithStakedA >= balanceA))
205205 then (accountBalanceWithStakedB >= balanceB)
206206 else false
207207
208208 func getAssetInfo (assetId) = match assetId {
209209 case id: ByteVector =>
210210 let stringId = toBase58String(id)
211211 let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
212212 $Tuple3(stringId, info.name, info.decimals)
213213 case waves: Unit =>
214214 $Tuple3("WAVES", "WAVES", 8)
215215 case _ =>
216216 throw("Match error")
217217 }
218218
219219
220220 func getAssetInfoFromString (assetStr) = if ((assetStr == "WAVES"))
221221 then $Tuple3("WAVES", "WAVES", 8)
222222 else {
223223 let stringId = assetStr
224224 let id = fromBase58String(assetStr)
225225 let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
226226 $Tuple3(stringId, info.name, info.decimals)
227227 }
228228
229229
230230 func suspend (cause) = [BooleanEntry(keyActive, false), StringEntry(keyCause, cause)]
231231
232232
233233 func calcStakingFuncAndAddres (stake,assetId) = if (stake)
234234 then if ((assetId == USDN))
235235 then $Tuple2("lockNeutrino", stakingUSDNNSBTAddress)
236236 else if ((assetId == NSBT))
237237 then $Tuple2("lockNsbt", stakingUSDNNSBTAddress)
238238 else $Tuple2("startStaking", stakingEURNAddress)
239239 else if ((assetId == USDN))
240240 then $Tuple2("unlockNeutrino", stakingUSDNNSBTAddress)
241241 else if ((assetId == NSBT))
242242 then $Tuple2("unlockNsbt", stakingUSDNNSBTAddress)
243243 else $Tuple2("stopStaking", stakingEURNAddress)
244244
245245
246246 func calcStakingParams (stake,amount,assetId) = if (stake)
247247 then {
248248 let $t069286994 = calcStakingFuncAndAddres(stake, assetId)
249249 let call = $t069286994._1
250250 let stakingAddr = $t069286994._2
251251 $Tuple4(call, stakingAddr, nil, [AttachedPayment(assetId, amount)])
252252 }
253253 else {
254254 let $t070807146 = calcStakingFuncAndAddres(stake, assetId)
255255 let call = $t070807146._1
256256 let stakingAddr = $t070807146._2
257257 $Tuple4(call, stakingAddr, [amount, toBase58String(assetId)], nil)
258258 }
259259
260260
261261 func suspendSuspicious () = suspend(((((((((((((((("Suspicious state. Actual balances: " + toString(accountBalanceWithStakedA)) + " ") + assetNameA) + ", ") + toString(accountBalanceWithStakedB)) + " ") + assetNameB) + ". State: ") + toString(balanceA)) + " ") + assetNameA) + ", ") + toString(balanceB)) + " ") + assetNameB))
262262
263263
264264 func isActive () = if (active)
265265 then unit
266266 else throw("DApp is inactive at this moment")
267267
268268
269269 @Callable(i)
270270 func init (firstHarvest) = {
271271 let $t076627739 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
272272 let pmtAmountA = $t076627739._1
273273 let pmtAssetIdA = $t076627739._2
274274 let $t077447821 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
275275 let pmtAmountB = $t077447821._1
276276 let pmtAssetIdB = $t077447821._2
277277 let $t078267903 = getAssetInfo(pmtAssetIdA)
278278 let pmtStrAssetIdA = $t078267903._1
279279 let pmtAssetNameA = $t078267903._2
280280 let pmtDecimalsA = $t078267903._3
281281 let $t079087985 = getAssetInfo(pmtAssetIdB)
282282 let pmtStrAssetIdB = $t079087985._1
283283 let pmtAssetNameB = $t079087985._2
284284 let pmtDecimalsB = $t079087985._3
285285 if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStaking], i.callerPublicKey)))
286286 then throw("Only admin can call this function")
287287 else if (isDefined(getBoolean(this, keyActive)))
288288 then throw("DApp is already active")
289289 else if ((pmtAssetIdA == pmtAssetIdB))
290290 then throw("Assets must be different")
291291 else {
292292 let shareName = ((("s" + take(pmtAssetNameA, 7)) + "_") + take(pmtAssetNameB, 7))
293293 let shareDescription = ((((("ShareToken of SwopFi protocol for " + pmtAssetNameA) + " and ") + pmtAssetNameB) + " at address ") + toString(this))
294294 let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
295295 let arg1 = pow(pmtAmountA, pmtDecimalsA, 5, 1, pmtDecimalsA, DOWN)
296296 let arg2 = pow(pmtAmountB, pmtDecimalsB, 5, 1, pmtDecimalsB, DOWN)
297297 let arg3 = pow(10, 0, shareDecimals, 0, 0, DOWN)
298298 let shareInitialSupply = fraction(arg1, arg2, arg3)
299299 let shareIssue = Issue(shareName, shareDescription, shareInitialSupply, shareDecimals, true)
300300 let shareIssueId = calculateAssetId(shareIssue)
301301 let stake1 = if (containsElement(stakingAssets, pmtStrAssetIdA))
302302 then invoke(this, "stakeUnstake", [true, pmtAmountA, pmtStrAssetIdA], nil)
303303 else 0
304304 if ((stake1 == stake1))
305305 then {
306306 let stake2 = if (containsElement(stakingAssets, pmtStrAssetIdB))
307307 then invoke(this, "stakeUnstake", [true, pmtAmountB, pmtStrAssetIdB], nil)
308308 else 0
309309 if ((stake2 == stake2))
310310 then {
311311 let baseEntry = [StringEntry(keyVersion, version), BooleanEntry(keyActive, true), StringEntry(keyAssetIdA, pmtStrAssetIdA), StringEntry(keyAssetIdB, pmtStrAssetIdB), IntegerEntry(keyBalanceA, pmtAmountA), IntegerEntry(keyBalanceB, pmtAmountB), IntegerEntry(keyCommission, commission), IntegerEntry(keyCommissionScaleDelimiter, commissionScaleDelimiter), shareIssue, StringEntry(keyShareAssetId, toBase58String(shareIssueId)), IntegerEntry(keyShareAssetSupply, shareInitialSupply), ScriptTransfer(i.caller, shareInitialSupply, shareIssueId)]
312312 if (firstHarvest)
313313 then (baseEntry ++ [BooleanEntry(keyFirstHarvest, firstHarvest), IntegerEntry(keyFirstHarvestHeight, (startHeight + (firstHarvestEndPeriod * periodLength)))])
314314 else baseEntry
315315 }
316316 else throw("Strict value is not equal to itself.")
317317 }
318318 else throw("Strict value is not equal to itself.")
319319 }
320320 }
321321
322322
323323
324324 @Callable(i)
325325 func initWithInitRatio (amtAssetA,amtAssetB,strAssetIdA,strAssetIdB,firstHarvest) = {
326326 let $t01057410661 = getAssetInfoFromString(strAssetIdA)
327327 let pmtStrAssetIdA = $t01057410661._1
328328 let pmtAssetNameA = $t01057410661._2
329329 let pmtDecimalsA = $t01057410661._3
330330 let $t01066610753 = getAssetInfoFromString(strAssetIdB)
331331 let pmtStrAssetIdB = $t01066610753._1
332332 let pmtAssetNameB = $t01066610753._2
333333 let pmtDecimalsB = $t01066610753._3
334334 if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStaking], i.callerPublicKey)))
335335 then throw("Only admin can call this function")
336336 else if (isDefined(getBoolean(this, keyActive)))
337337 then throw("DApp is already active")
338338 else if ((strAssetIdA == strAssetIdB))
339339 then throw("Assets must be different")
340340 else {
341341 let shareName = ((("s" + take(pmtAssetNameA, 7)) + "_") + take(pmtAssetNameB, 7))
342342 let shareDescription = ((((("ShareToken of SwopFi protocol for " + pmtAssetNameA) + " and ") + pmtAssetNameB) + " at address ") + toString(this))
343343 let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
344344 let shareInitialSupply = 0
345345 let shareIssue = Issue(shareName, shareDescription, shareInitialSupply, shareDecimals, true)
346346 let shareIssueId = calculateAssetId(shareIssue)
347347 let baseEntry = [StringEntry(keyVersion, version), BooleanEntry(keyActive, true), StringEntry(keyAssetIdA, pmtStrAssetIdA), StringEntry(keyAssetIdB, pmtStrAssetIdB), IntegerEntry(keyBalanceInitA, amtAssetA), IntegerEntry(keyBalanceInitB, amtAssetB), IntegerEntry(keyBalanceA, 0), IntegerEntry(keyBalanceB, 0), IntegerEntry(keyCommission, commission), IntegerEntry(keyCommissionScaleDelimiter, commissionScaleDelimiter), shareIssue, StringEntry(keyShareAssetId, toBase58String(shareIssueId)), IntegerEntry(keyShareAssetSupply, shareInitialSupply)]
348348 if (firstHarvest)
349349 then (baseEntry ++ [BooleanEntry(keyFirstHarvest, firstHarvest), IntegerEntry(keyFirstHarvestHeight, (startHeight + (firstHarvestEndPeriod * periodLength)))])
350350 else baseEntry
351351 }
352352 }
353353
354354
355355
356356 @Callable(i)
357357 func keepLimitForFirstHarvest (shareLimit) = valueOrElse(isActive(), if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStaking], i.callerPublicKey)))
358358 then throw("Only admin can call this function")
359359 else [IntegerEntry(kShareLimit, shareLimit)])
360360
361361
362362
363363 @Callable(i)
364364 func replenishWithTwoTokens (slippageTolerance) = valueOrElse(isActive(), {
365365 let pmtAssetIdA = i.payments[0].assetId
366366 let pmtAssetIdB = i.payments[1].assetId
367367 let pmtAmountA = i.payments[0].amount
368368 let pmtAmountB = i.payments[1].amount
369369 let $t01322113298 = getAssetInfo(pmtAssetIdA)
370370 let pmtStrAssetIdA = $t01322113298._1
371371 let pmtAssetNameA = $t01322113298._2
372372 let pmtDecimalsA = $t01322113298._3
373373 let $t01330313380 = getAssetInfo(pmtAssetIdB)
374374 let pmtStrAssetIdB = $t01330313380._1
375375 let pmtAssetNameB = $t01330313380._2
376376 let pmtDecimalsB = $t01330313380._3
377377 let inital = if (if ((balanceA == 0))
378378 then (balanceB == 0)
379379 else false)
380380 then true
381381 else false
382382 let tokenRatio = if (inital)
383383 then fraction(fraction(assetInitA, scaleValue8, pmtAmountA), scaleValue3, fraction(assetInitB, scaleValue8, pmtAmountB))
384384 else fraction(fraction(balanceA, scaleValue8, pmtAmountA), scaleValue3, fraction(balanceB, scaleValue8, pmtAmountB))
385385 let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
386386 let shareTokenToPayAmount = if (inital)
387387 then fraction(pow(pmtAmountA, pmtDecimalsA, 5, 1, pmtDecimalsA, DOWN), pow(pmtAmountB, pmtDecimalsB, 5, 1, pmtDecimalsB, DOWN), pow(10, 0, shareDecimals, 0, 0, DOWN))
388388 else fraction(min([fraction(pmtAmountA, scaleValue8, balanceA), fraction(pmtAmountB, scaleValue8, balanceB)]), shareAssetSupply, scaleValue8)
389389 if (if ((0 > slippageTolerance))
390390 then true
391391 else (slippageTolerance > slippageToleranceDelimiter))
392392 then throw(((("Slippage tolerance must be between 0 and " + toString(slippageToleranceDelimiter)) + " inclusively. Actual: ") + toString(slippageTolerance)))
393393 else if ((size(i.payments) != 2))
394394 then throw("Two attached assets expected")
395395 else if (if ((pmtAssetIdA != assetIdA))
396396 then true
397397 else (pmtAssetIdB != assetIdB))
398398 then throw(((("Incorrect assets attached. Expected: " + strAssetIdA) + " and ") + strAssetIdB))
399399 else if (if ((((scaleValue3 * (slippageToleranceDelimiter - slippageTolerance)) / slippageToleranceDelimiter) > tokenRatio))
400400 then true
401401 else (tokenRatio > ((scaleValue3 * (slippageToleranceDelimiter + slippageTolerance)) / slippageToleranceDelimiter)))
402402 then throw("Incorrect assets amount: amounts must have the contract ratio")
403403 else if ((shareTokenToPayAmount == 0))
404404 then throw("Too small amount to replenish")
405405 else if (!(hasEnoughBalance))
406406 then ([ScriptTransfer(i.caller, pmtAmountA, pmtAssetIdA), ScriptTransfer(i.caller, pmtAmountB, pmtAssetIdB)] ++ suspendSuspicious())
407407 else {
408408 let stake1 = if (containsElement(stakingAssets, pmtStrAssetIdA))
409409 then invoke(this, "stakeUnstake", [true, pmtAmountA, pmtStrAssetIdA], nil)
410410 else 0
411411 if ((stake1 == stake1))
412412 then {
413413 let stake2 = if (containsElement(stakingAssets, pmtStrAssetIdB))
414414 then invoke(this, "stakeUnstake", [true, pmtAmountB, pmtStrAssetIdB], nil)
415415 else 0
416416 if ((stake2 == stake2))
417417 then [Reissue(shareAssetId, shareTokenToPayAmount, true), IntegerEntry(keyBalanceA, pmtAmountA), IntegerEntry(keyBalanceB, pmtAmountB), IntegerEntry(keyShareAssetSupply, shareTokenToPayAmount), ScriptTransfer(i.caller, shareTokenToPayAmount, shareAssetId)]
418418 else throw("Strict value is not equal to itself.")
419419 }
420420 else throw("Strict value is not equal to itself.")
421421 }
422422 })
423423
424424
425425
426426 @Callable(i)
427427 func withdraw () = valueOrElse(isActive(), {
428428 let $t01614616221 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
429429 let pmtAmount = $t01614616221._1
430430 let pmtAssetId = $t01614616221._2
431431 let amountToPayA = fraction(pmtAmount, balanceA, shareAssetSupply)
432432 let amountToPayB = fraction(pmtAmount, balanceB, shareAssetSupply)
433433 if ((size(i.payments) != 1))
434434 then throw("One attached payment expected")
435435 else if ((pmtAssetId != shareAssetId))
436436 then throw(("Incorrect asset attached. Expected: " + toBase58String(shareAssetId)))
437437 else if (!(hasEnoughBalance))
438438 then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
439439 else {
440440 let stake1 = if (containsElement(stakingAssets, strAssetIdA))
441441 then invoke(this, "stakeUnstake", [false, amountToPayA, strAssetIdA], nil)
442442 else 0
443443 if ((stake1 == stake1))
444444 then {
445445 let stake2 = if (containsElement(stakingAssets, strAssetIdB))
446446 then invoke(this, "stakeUnstake", [false, amountToPayB, strAssetIdB], nil)
447447 else 0
448448 if ((stake2 == stake2))
449449 then [IntegerEntry(keyBalanceA, (balanceA - amountToPayA)), IntegerEntry(keyBalanceB, (balanceB - amountToPayB)), IntegerEntry(keyShareAssetSupply, (shareAssetSupply - pmtAmount)), Burn(shareAssetId, pmtAmount), ScriptTransfer(i.caller, amountToPayA, assetIdA), ScriptTransfer(i.caller, amountToPayB, assetIdB)]
450450 else throw("Strict value is not equal to itself.")
451451 }
452452 else throw("Strict value is not equal to itself.")
453453 }
454454 })
455455
456456
457457
458458 @Callable(i)
459459 func exchange (minAmountToReceive) = valueOrElse(isActive(), {
460460 let $t01752717602 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
461461 let pmtAmount = $t01752717602._1
462462 let pmtAssetId = $t01752717602._2
463463 func calculateFees (tokenFrom,tokenTo) = {
464464 let amountWithoutFee = fraction(tokenTo, pmtAmount, (pmtAmount + tokenFrom))
465465 let amountWithFee = fraction(amountWithoutFee, (commissionScaleDelimiter - commission), commissionScaleDelimiter)
466466 let governanceReward = fraction(amountWithoutFee, commissionGovernance, commissionScaleDelimiter)
467467 if ((minAmountToReceive > amountWithFee))
468468 then throw(((("Calculated amount to receive " + toString(amountWithFee)) + " is less than specified minimum ") + toString(minAmountToReceive)))
469469 else $Tuple3(amountWithoutFee, amountWithFee, governanceReward)
470470 }
471471
472472 if (if ((balanceA == 0))
473473 then true
474474 else (balanceB == 0))
475475 then throw("Can't exchange with zero balance")
476476 else if ((0 >= minAmountToReceive))
477477 then throw(("Minimal amount to receive must be positive. Actual: " + toString(minAmountToReceive)))
478478 else if ((size(i.payments) != 1))
479479 then throw("One attached payment expected")
480480 else if (!(hasEnoughBalance))
481481 then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
482482 else if ((pmtAssetId == assetIdA))
483483 then {
484484 let assetIdSend = assetIdB
485485 let $t01880018891 = calculateFees(balanceA, balanceB)
486486 let amountWithoutFee = $t01880018891._1
487487 let amountWithFee = $t01880018891._2
488488 let governanceReward = $t01880018891._3
489489 let newBalanceA = (balanceA + pmtAmount)
490490 let newBalanceB = ((balanceB - amountWithFee) - governanceReward)
491491 let stake1 = if (containsElement(stakingAssets, strAssetIdA))
492492 then invoke(this, "stakeUnstake", [true, pmtAmount, strAssetIdA], nil)
493493 else 0
494494 if ((stake1 == stake1))
495495 then {
496496 let stake2 = if (containsElement(stakingAssets, strAssetIdB))
497497 then invoke(this, "stakeUnstake", [false, (amountWithFee + governanceReward), strAssetIdB], nil)
498498 else 0
499499 if ((stake2 == stake2))
500500 then [IntegerEntry(keyBalanceA, newBalanceA), IntegerEntry(keyBalanceB, newBalanceB), ScriptTransfer(i.caller, amountWithFee, assetIdSend), ScriptTransfer(walletAddress, governanceReward, assetIdSend)]
501501 else throw("Strict value is not equal to itself.")
502502 }
503503 else throw("Strict value is not equal to itself.")
504504 }
505505 else if ((pmtAssetId == assetIdB))
506506 then {
507507 let assetIdSend = assetIdA
508508 let $t01984619937 = calculateFees(balanceB, balanceA)
509509 let amountWithoutFee = $t01984619937._1
510510 let amountWithFee = $t01984619937._2
511511 let governanceReward = $t01984619937._3
512512 let newBalanceA = ((balanceA - amountWithFee) - governanceReward)
513513 let newBalanceB = (balanceB + pmtAmount)
514514 let stake1 = if (containsElement(stakingAssets, strAssetIdA))
515515 then invoke(this, "stakeUnstake", [false, (amountWithFee + governanceReward), strAssetIdA], nil)
516516 else 0
517517 if ((stake1 == stake1))
518518 then {
519519 let stake2 = if (containsElement(stakingAssets, strAssetIdB))
520520 then invoke(this, "stakeUnstake", [true, pmtAmount, strAssetIdB], nil)
521521 else 0
522522 if ((stake2 == stake2))
523523 then [IntegerEntry(keyBalanceA, newBalanceA), IntegerEntry(keyBalanceB, newBalanceB), ScriptTransfer(i.caller, amountWithFee, assetIdSend), ScriptTransfer(walletAddress, governanceReward, assetIdSend)]
524524 else throw("Strict value is not equal to itself.")
525525 }
526526 else throw("Strict value is not equal to itself.")
527527 }
528528 else throw(((("Incorrect asset attached. Expected: " + strAssetIdA) + " or ") + strAssetIdB))
529529 })
530530
531531
532532
533533 @Callable(i)
534534 func shutdown () = if (!(active))
535535 then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, keyCause), "the cause wasn't specified")))
536536 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStartStop], i.callerPublicKey)))
537537 then throw("Only admin can call this function")
538538 else suspend("Paused by admin")
539539
540540
541541
542542 @Callable(i)
543543 func activate () = valueOrElse(isActive(), if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStartStop], i.callerPublicKey)))
544544 then throw("Only admin can call this function")
545545 else [BooleanEntry(keyActive, true), DeleteEntry(keyCause)])
546546
547547
548548
549549 @Callable(i)
550550 func takeIntoAccountExtraFunds (amountLeave) = valueOrElse(isActive(), {
551551 let uncountableAmountEnrollAssetA = (accountBalanceWithStakedA - balanceA)
552552 let uncountableAmountEnrollAssetB = (accountBalanceWithStakedB - balanceB)
553553 let amountEnrollA = (uncountableAmountEnrollAssetA - (if ((assetIdA == unit))
554554 then amountLeave
555555 else 0))
556556 let amountEnrollB = (uncountableAmountEnrollAssetB - (if ((assetIdB == unit))
557557 then amountLeave
558558 else 0))
559559 if ((i.caller != this))
560560 then throw("Only the DApp itself can call this function")
561561 else if ((0 > amountLeave))
562562 then throw(("Argument 'amountLeave' cannot be negative. Actual: " + toString(amountLeave)))
563563 else if (if ((0 > uncountableAmountEnrollAssetA))
564564 then true
565565 else (0 > uncountableAmountEnrollAssetB))
566566 then suspend("Enroll amount negative")
567567 else if (if ((0 > amountEnrollA))
568568 then true
569569 else (0 > amountEnrollB))
570570 then throw("Too large amountLeave")
571571 else {
572572 let stake1 = if (if (containsElement(stakingAssets, strAssetIdA))
573573 then (amountEnrollA > 0)
574574 else false)
575575 then invoke(this, "stakeUnstake", [true, amountEnrollA, strAssetIdA], nil)
576576 else 0
577577 if ((stake1 == stake1))
578578 then {
579579 let stake2 = if (if (containsElement(stakingAssets, strAssetIdB))
580580 then (amountEnrollB > 0)
581581 else false)
582582 then invoke(this, "stakeUnstake", [true, amountEnrollB, strAssetIdB], nil)
583583 else 0
584584 if ((stake2 == stake2))
585585 then [IntegerEntry(keyBalanceA, (balanceA + amountEnrollA)), IntegerEntry(keyBalanceB, (balanceB + amountEnrollB)), IntegerEntry(("last_income_" + strAssetIdA), amountEnrollA), IntegerEntry(("last_income_" + strAssetIdB), amountEnrollB)]
586586 else throw("Strict value is not equal to itself.")
587587 }
588588 else throw("Strict value is not equal to itself.")
589589 }
590590 })
591591
592592
593593
594594 @Callable(i)
595595 func stakeUnstake (stake,amount,assetIdString) = if ((i.caller != this))
596596 then throw("Only contract itself can invoke this function")
597597 else if ((assetIdString == "WAVES"))
598598 then {
599599 let pool = addressFromStringValue(valueOrErrorMessage(getString(oracle, keyLeasingPool), "No leasing pool in oracle"))
600600 let leasingId = getBinary(this, keyLeasingId)
601601 let leasingAmount = valueOrElse(getInteger(this, keyLeasingAmount), 0)
602602 let newLeaseAmount = if (stake)
603603 then (leasingAmount + amount)
604604 else (leasingAmount - amount)
605605 let newLease = Lease(pool, newLeaseAmount)
606606 let newLeaseId = calculateLeaseId(newLease)
607607 let baseEtry = [newLease, BinaryEntry(keyLeasingId, newLeaseId), IntegerEntry(keyLeasingAmount, newLeaseAmount)]
608608 match leasingId {
609609 case lId: ByteVector =>
610610 ([LeaseCancel(lId)] ++ baseEtry)
611611 case _ =>
612612 baseEtry
613613 }
614614 }
615615 else {
616616 let $t02408524188 = calcStakingParams(stake, amount, fromBase58String(assetIdString))
617617 let call = $t02408524188._1
618618 let addr = $t02408524188._2
619619 let params = $t02408524188._3
620620 let payments = $t02408524188._4
621621 let inv = invoke(addr, call, params, payments)
622622 if ((inv == inv))
623623 then nil
624624 else throw("Strict value is not equal to itself.")
625625 }
626626
627627
628628
629629 @Callable(i)
630630 func stakeAll () = valueOrElse(isActive(), if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStartStop], i.callerPublicKey)))
631631 then throw("Only admin can call this function")
632632 else {
633633 let stake1 = if (containsElement(stakingAssets, strAssetIdA))
634634 then {
635635 let amountA = (balanceA - stakedAmountA)
636636 if ((amountA > 0))
637637 then invoke(this, "stakeUnstake", [true, amountA, strAssetIdA], nil)
638638 else 0
639639 }
640640 else 0
641641 if ((stake1 == stake1))
642642 then {
643643 let stake2 = if (containsElement(stakingAssets, strAssetIdB))
644644 then {
645645 let amountB = (balanceB - stakedAmountB)
646646 if ((amountB > 0))
647647 then invoke(this, "stakeUnstake", [true, amountB, strAssetIdB], nil)
648648 else 0
649649 }
650650 else 0
651651 if ((stake2 == stake2))
652652 then nil
653653 else throw("Strict value is not equal to itself.")
654654 }
655655 else throw("Strict value is not equal to itself.")
656656 })
657657
658658
659659 @Verifier(tx)
660660 func verify () = {
661661 let multiSignedByAdmins = {
662662 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
663663 then 1
664664 else 0
665665 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
666666 then 1
667667 else 0
668668 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
669669 then 1
670670 else 0
671671 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
672672 }
673673 match tx {
674674 case inv: InvokeScriptTransaction =>
675675 let callTakeIntoAccount = if ((inv.dApp == this))
676676 then (inv.function == "takeIntoAccountExtraFunds")
677677 else false
678678 let exchangeToWaves = if (if (if ((inv.dApp == USDNToWavesExchanger))
679679 then (inv.function == "exchange")
680680 else false)
681681 then (assetIdA == USDN)
682682 else false)
683683 then true
684684 else if (if ((assetIdB == USDN))
685685 then (size(inv.payments) == 1)
686686 else false)
687687 then (inv.payments[0].assetId == USDN)
688688 else false
689689 let exchangeToNSBTs = if (if (if ((inv.dApp == USDNToNSBTExchanger))
690690 then (inv.function == "exchange")
691691 else false)
692692 then (assetIdA == NSBT)
693693 else false)
694694 then true
695695 else if (if ((assetIdB == NSBT))
696696 then (size(inv.payments) == 1)
697697 else false)
698698 then (inv.payments[0].assetId == USDN)
699699 else false
700700 let signedByAdmin = if (if (if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
701701 then true
702702 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey2))
703703 then true
704704 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey3))
705705 then true
706706 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKeyStaking)
707707 if (if (if (if (callTakeIntoAccount)
708708 then true
709709 else exchangeToWaves)
710710 then true
711711 else exchangeToNSBTs)
712712 then signedByAdmin
713713 else false)
714714 then true
715715 else multiSignedByAdmins
716716 case _ =>
717717 multiSignedByAdmins
718718 }
719719 }
720720

github/deemru/w8io/169f3d6 
66.67 ms