tx · CjMbhy5f14Hmn2iKNrRryY45mFt9dNuRZi7M13fByn3k

3N9DJDtinaAjK3DAhVZn6drz1yGjFBi5pb7:  -0.01400000 Waves

2022.02.01 00:46 [1903671] smart account 3N9DJDtinaAjK3DAhVZn6drz1yGjFBi5pb7 > SELF 0.00000000 Waves

{ "type": 13, "id": "CjMbhy5f14Hmn2iKNrRryY45mFt9dNuRZi7M13fByn3k", "fee": 1400000, "feeAssetId": null, "timestamp": 1643665612599, "version": 2, "chainId": 84, "sender": "3N9DJDtinaAjK3DAhVZn6drz1yGjFBi5pb7", "senderPublicKey": "73NMyMtVPbUD7s1DCVZ5F8Vqzvf5tYLHM6Coz1RRCUuf", "proofs": [ "2zh8zMetHnghAWKxjagocEH3JzZnghnNEbPc7D3YCrVKdKtjPkGGhz6eYvgGj1RxxgMRAccuAxK84Piton5jpTrE", "4zt3Cq1XcTfsumSMTYLfiRJXEaa9sPrk6XgtDQA7mYQHNVN2ESCFWQTtMj55jBNwPSHUR3sshAo37jiKfb2j1eA4" ], "script": "base64:AAIFAAAAAAAADmIIAhIDCgEEEgcKBQEBCAgEEgMKAQESAwoBARIAEgMKAQESABIAEgASBQoDBAEIEgAaFAoBQRIPa2V5QWRtaW5QdWJLZXkyGhQKAUISD2tleUFkbWluUHViS2V5MxoLCgFDEgZvcmFjbGUaEAoBRBILZ2V0QWRtaW5QdWIaEAoBRRILa2V5QWRtaW5QdWIaDAoBRhIHJG1hdGNoMBoLCgFHEgZzdHJpbmcaDAoBSBIHbm90aGluZxoRCgFJEgxhZG1pblB1YktleTEaEQoBShIMYWRtaW5QdWJLZXkyGhEKAUsSDGFkbWluUHViS2V5MxoZCgFMEhRhZG1pblB1YktleVN0YXJ0U3RvcBoXCgFNEhJhZG1pblB1YktleVN0YWtpbmcaEgoBThINd2FsbGV0QWRkcmVzcxoSCgFPEg12b3RpbmdBZGRyZXNzGgkKAVASBFVTRE4aCQoBURIETlNCVBoJCgFSEgRFVVJOGhIKAVMSDXN0YWtpbmdBc3NldHMaGwoBVBIWc3Rha2luZ1VTRE5OU0JUQWRkcmVzcxoXCgFVEhJzdGFraW5nRVVSTkFkZHJlc3MaGQoBVhIUVVNETlRvV2F2ZXNFeGNoYW5nZXIaGAoBVxITVVNETlRvTlNCVEV4Y2hhbmdlchoPCgFYEgpiYXNlUGVyaW9kGhAKAVkSC3N0YXJ0SGVpZ2h0GhEKAVoSDHBlcmlvZExlbmd0aBoMCgFhEgd2ZXJzaW9uGhMKAmFBEg1zdGFrZWRBbW91bnRBGhMKAmFCEg1zdGFrZWRBbW91bnRCGhAKAmFDEgphc3NldEluaXRBGhAKAmFEEgphc3NldEluaXRCGh8KAmFFEhlhY2NvdW50QmFsYW5jZVdpdGhTdGFrZWRBGh8KAmFGEhlhY2NvdW50QmFsYW5jZVdpdGhTdGFrZWRCGhYKAmFHEhBoYXNFbm91Z2hCYWxhbmNlGhIKAmFIEgxnZXRBc3NldEluZm8aDgoCYUkSCHN0cmluZ0lkGgoKAmFKEgRpbmZvGhwKAmFLEhZnZXRBc3NldEluZm9Gcm9tU3RyaW5nGg4KAmFMEghhc3NldFN0choNCgJhTRIHc3VzcGVuZBoLCgJhThIFY2F1c2UaHgoCYU8SGGNhbGNTdGFraW5nRnVuY0FuZEFkZHJlcxoLCgJhUBIFc3Rha2UaFwoCYVESEWNhbGNTdGFraW5nUGFyYW1zGgwKAmFSEgZhbW91bnQaEQoCYVMSCyR0MDY5MjI2OTg4GgoKAmFUEgRjYWxsGhEKAmFVEgtzdGFraW5nQWRkchoRCgJhVhILJHQwNzA3NDcxNDAaEwoCYVcSDWNhbGN1bGF0ZUZlZXMaDwoCYVgSCXBtdEFtb3VudBoYCgJhWRISbWluQW1vdW50VG9SZWNlaXZlGg8KAmFaEgl0b2tlbkZyb20aGwoCYWESFWZpcnN0SGFydmVzdEVuZFBlcmlvZBoMCgJhYhIGYWN0aXZlGhEKAmFjEgtzdHJBc3NldElkQRoRCgJhZBILc3RyQXNzZXRJZEIaDgoCYWUSCGFzc2V0SWRBGg4KAmFmEghhc3NldElkQhoQCgJhZxIKYXNzZXROYW1lQRoICgJhaBICaWQaCwoCYWkSBXdhdmVzGhAKAmFqEgphc3NldE5hbWVCGg4KAmFrEghiYWxhbmNlQRoOCgJhbBIIYmFsYW5jZUIaEgoCYW0SDHNoYXJlQXNzZXRJZBoWCgJhbhIQc2hhcmVBc3NldFN1cHBseRoQCgJhbxIKY29tbWlzc2lvbhoaCgJhcBIUY29tbWlzc2lvbkdvdmVybmFuY2UaHgoCYXESGGNvbW1pc3Npb25TY2FsZURlbGltaXRlchoRCgJhchILc2NhbGVWYWx1ZTMaEQoCYXMSC3NjYWxlVmFsdWU4GiAKAmF0EhpzbGlwcGFnZVRvbGVyYW5jZURlbGltaXRlchoUCgJhdRIOYWNjb3VudEJhbGFuY2UaDQoCYXYSB2Fzc2V0SWQaEgoCYXcSDHN0YWtlZEFtb3VudBocCgJheBIWc3Rha2VkQW1vdW50Q2FsY3VsYXRlZBoJCgJheRIDYUlkGgcKAmF6EgFpGg8KAWISCmtleVZlcnNpb24aCgoCYkESBGFyZzMaGAoCYkISEnNoYXJlSW5pdGlhbFN1cHBseRoQCgJiQxIKc2hhcmVJc3N1ZRoSCgJiRBIMc2hhcmVJc3N1ZUlkGgwKAmJFEgZzdGFrZTEaDAoCYkYSBnN0YWtlMhoPCgJiRxIJYmFzZUVudHJ5Gg8KAmJIEglhbXRBc3NldEEaDwoCYkkSCWFtdEFzc2V0QhoTCgJiShINJHQwMTEyMjIxMTMwORoTCgJiSxINJHQwMTEzMTQxMTQwMRoQCgJiTBIKc2hhcmVMaW1pdBoXCgJiTRIRc2xpcHBhZ2VUb2xlcmFuY2UaEwoCYk4SDSR0MDEzODY5MTM5NDYaEwoCYk8SDSR0MDEzOTUxMTQwMjgaDAoCYlASBmluaXRhbBoQCgJiURIKdG9rZW5SYXRpbxobCgJiUhIVc2hhcmVUb2tlblRvUGF5QW1vdW50GhMKAmJTEg0kdDAxNjgzNDE2OTA5GhAKAmJUEgpwbXRBc3NldElkGhIKAmJVEgxhbW91bnRUb1BheUEaEgoCYlYSDGFtb3VudFRvUGF5QhoTCgJiVxINJHQwMTgyMTUxODI5MBoRCgJiWBILYXNzZXRJZFNlbmQaEwoCYlkSDSR0MDE4ODQ1MTg5NjcaEQoCYloSC25ld0JhbGFuY2VBGg0KAmJhEgd0b2tlblRvGhYKAmJiEhBhbW91bnRXaXRob3V0RmVlGhMKAmJjEg1hbW91bnRXaXRoRmVlGhYKAmJkEhBnb3Zlcm5hbmNlUmV3YXJkGhcKAmJlEhFzdXNwZW5kU3VzcGljaW91cxoOCgJiZhIIaXNBY3RpdmUaEgoCYmcSDGZpcnN0SGFydmVzdBoRCgJiaBILJHQwODMxMDgzODcaEAoCYmkSCnBtdEFtb3VudEEaEQoCYmoSC3BtdEFzc2V0SWRBGhEKAmJrEgskdDA4MzkyODQ2ORoQCgJibBIKcG10QW1vdW50QhoRCgJibRILcG10QXNzZXRJZEIaEQoCYm4SCyR0MDg0NzQ4NTUxGhQKAmJvEg5wbXRTdHJBc3NldElkQRoTCgJicBINcG10QXNzZXROYW1lQRoSCgJicRIMcG10RGVjaW1hbHNBGhEKAmJyEgskdDA4NTU2ODYzMxoUCgJicxIOcG10U3RyQXNzZXRJZEIaEwoCYnQSDXBtdEFzc2V0TmFtZUIaEgoCYnUSDHBtdERlY2ltYWxzQhoPCgJidhIJc2hhcmVOYW1lGhYKAmJ3EhBzaGFyZURlc2NyaXB0aW9uGhMKAmJ4Eg1zaGFyZURlY2ltYWxzGgoKAmJ5EgRhcmcxGgoKAmJ6EgRhcmcyGg4KAWMSCWtleUFjdGl2ZRoZCgJjQRITY2FsbFRha2VJbnRvQWNjb3VudBoVCgJjQhIPZXhjaGFuZ2VUb1dhdmVzGhUKAmNDEg9leGNoYW5nZVRvTlNCVHMaEwoCY0QSDXNpZ25lZEJ5QWRtaW4aEQoCY2ESC25ld0JhbGFuY2VCGhMKAmNiEg0kdDAxOTkyMjIwMDQ0GhMKAmNjEg1hbW91bnRFbnJvbGxBGhMKAmNkEg1hbW91bnRFbnJvbGxCGhMKAmNlEg1hc3NldElkU3RyaW5nGgoKAmNmEgRwb29sGg8KAmNnEglsZWFzaW5nSWQaEwoCY2gSDWxlYXNpbmdBbW91bnQaFAoCY2kSDm5ld0xlYXNlQW1vdW50Gg4KAmNqEghuZXdMZWFzZRoQCgJjaxIKbmV3TGVhc2VJZBoOCgJjbBIIYmFzZUV0cnkaCQoCY20SA2xJZBoTCgJjbhINJHQwMjM3NzgyMzg4MRoKCgJjbxIEYWRkchoMCgJjcBIGcGFyYW1zGg4KAmNxEghwYXltZW50cxoJCgJjchIDaW52Gg0KAmNzEgdhbW91bnRBGg0KAmN0EgdhbW91bnRCGggKAmN1EgJ0eBoMCgJjdhIGdmVyaWZ5GhkKAmN3EhNtdWx0aVNpZ25lZEJ5QWRtaW5zGhgKAmN4EhJhZG1pblB1YktleTFTaWduZWQaGAoCY3kSEmFkbWluUHViS2V5MlNpZ25lZBoYCgJjehISYWRtaW5QdWJLZXkzU2lnbmVkGhAKAWQSC2tleUFzc2V0SWRBGhAKAWUSC2tleUFzc2V0SWRCGhAKAWYSC2tleUJhbGFuY2VBGhAKAWcSC2tleUJhbGFuY2VCGhQKAWgSD2tleUJhbGFuY2VJbml0QRoUCgFpEg9rZXlCYWxhbmNlSW5pdEIaFAoBahIPa2V5U2hhcmVBc3NldElkGhgKAWsSE2tleVNoYXJlQXNzZXRTdXBwbHkaEgoBbBINa2V5Q29tbWlzc2lvbhogCgFtEhtrZXlDb21taXNzaW9uU2NhbGVEZWxpbWl0ZXIaDQoBbhIIa2V5Q2F1c2UaFAoBbxIPa2V5Rmlyc3RIYXJ2ZXN0GhoKAXASFWtleUZpcnN0SGFydmVzdEhlaWdodBoQCgFxEgtrU2hhcmVMaW1pdBoQCgFyEgtrQmFzZVBlcmlvZBoSCgFzEg1rUGVyaW9kTGVuZ3RoGhEKAXQSDGtTdGFydEhlaWdodBoXCgF1EhJrZXlVU0ROTlNCVEFkZHJlc3MaEwoBdhIOa2V5RVVSTkFkZHJlc3MaEwoBdxIOa2V5TGVhc2luZ1Bvb2waFQoBeBIQa2V5TGVhc2luZ0Ftb3VudBoRCgF5EgxrZXlMZWFzaW5nSWQaFAoBehIPa2V5QWRtaW5QdWJLZXkxAAAAUwAAAAABYQIAAAAFMS4wLjAAAAAAAWICAAAAB3ZlcnNpb24AAAAAAWMCAAAABmFjdGl2ZQAAAAABZAIAAAAKQV9hc3NldF9pZAAAAAABZQIAAAAKQl9hc3NldF9pZAAAAAABZgIAAAAPQV9hc3NldF9iYWxhbmNlAAAAAAFnAgAAAA9CX2Fzc2V0X2JhbGFuY2UAAAAAAWgCAAAADEFfYXNzZXRfaW5pdAAAAAABaQIAAAAMQl9hc3NldF9pbml0AAAAAAFqAgAAAA5zaGFyZV9hc3NldF9pZAAAAAABawIAAAASc2hhcmVfYXNzZXRfc3VwcGx5AAAAAAFsAgAAAApjb21taXNzaW9uAAAAAAFtAgAAABpjb21taXNzaW9uX3NjYWxlX2RlbGltaXRlcgAAAAABbgIAAAAOc2h1dGRvd25fY2F1c2UAAAAAAW8CAAAADWZpcnN0X2hhcnZlc3QAAAAAAXACAAAAFGZpcnN0X2hhcnZlc3RfaGVpZ2h0AAAAAAFxAgAAABxzaGFyZV9saW1pdF9vbl9maXJzdF9oYXJ2ZXN0AAAAAAFyAgAAAAtiYXNlX3BlcmlvZAAAAAABcwIAAAANcGVyaW9kX2xlbmd0aAAAAAABdAIAAAAMc3RhcnRfaGVpZ2h0AAAAAAF1AgAAABhzdGFraW5nX3VzZG5uc2J0X2FkZHJlc3MAAAAAAXYCAAAAFHN0YWtpbmdfZXVybl9hZGRyZXNzAAAAAAF3AgAAAA9sZWFzaW5nX2FkZHJlc3MAAAAAAXgCAAAADmxlYXNpbmdfYW1vdW50AAAAAAF5AgAAAApsZWFzaW5nX2lkAAAAAAF6AgAAAAthZG1pbl9wdWJfMQAAAAABQQIAAAALYWRtaW5fcHViXzIAAAAAAUICAAAAC2FkbWluX3B1Yl8zAAAAAAFDCQEAAAAHQWRkcmVzcwAAAAEBAAAAGgFU6UWqHpAvOq7xug7mLpqSXxqYhOHzYrMIAQAAAAFEAAAAAQAAAAFFBAAAAAFGCQAEHQAAAAIFAAAAAUMFAAAAAUUDCQAAAQAAAAIFAAAA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", "height": 1903671, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: EkNhma8FNVnvCfL7SSbYVdZTNcQ3XvvMz2Ja1PRbbbSe Next: none 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 eurn 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 commissionGovernance = 1200
151151
152152 let commissionScaleDelimiter = 1000000
153153
154154 let scaleValue3 = 1000
155155
156156 let scaleValue8 = 100000000
157157
158158 let slippageToleranceDelimiter = 1000
159159
160160 func accountBalance (assetId) = match assetId {
161161 case id: ByteVector =>
162162 assetBalance(this, id)
163163 case waves: Unit =>
164164 wavesBalance(this).available
165165 case _ =>
166166 throw("Match error")
167167 }
168168
169169
170170 func stakedAmount (assetId) = {
171171 let stakedAmountCalculated = match assetId {
172172 case aId: ByteVector =>
173173 if (if ((aId == USDN))
174174 then true
175175 else (aId == NSBT))
176176 then getInteger(stakingUSDNNSBTAddress, ((("rpd_balance_" + toBase58String(aId)) + "_") + toString(this)))
177177 else if ((aId == EURN))
178178 then getInteger(stakingEURNAddress, ((("%s%s%s__stakingBalance__" + toBase58String(aId)) + "__") + toString(this)))
179179 else 0
180180 case _: Unit =>
181181 valueOrElse(getInteger(this, keyLeasingAmount), 0)
182182 case _ =>
183183 throw("Match error")
184184 }
185185 match stakedAmountCalculated {
186186 case i: Int =>
187187 i
188188 case _ =>
189189 0
190190 }
191191 }
192192
193193
194194 let stakedAmountA = stakedAmount(assetIdA)
195195
196196 let stakedAmountB = stakedAmount(assetIdB)
197197
198198 let assetInitA = getIntegerValue(this, keyBalanceInitA)
199199
200200 let assetInitB = getIntegerValue(this, keyBalanceInitB)
201201
202202 let accountBalanceWithStakedA = (accountBalance(assetIdA) + stakedAmountA)
203203
204204 let accountBalanceWithStakedB = (accountBalance(assetIdB) + stakedAmountB)
205205
206206 let hasEnoughBalance = if ((accountBalanceWithStakedA >= balanceA))
207207 then (accountBalanceWithStakedB >= balanceB)
208208 else false
209209
210210 func getAssetInfo (assetId) = match assetId {
211211 case id: ByteVector =>
212212 let stringId = toBase58String(id)
213213 let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
214214 $Tuple3(stringId, info.name, info.decimals)
215215 case waves: Unit =>
216216 $Tuple3("WAVES", "WAVES", 8)
217217 case _ =>
218218 throw("Match error")
219219 }
220220
221221
222222 func getAssetInfoFromString (assetStr) = if ((assetStr == "WAVES"))
223223 then $Tuple3("WAVES", "WAVES", 8)
224224 else {
225225 let stringId = assetStr
226226 let id = fromBase58String(assetStr)
227227 let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
228228 $Tuple3(stringId, info.name, info.decimals)
229229 }
230230
231231
232232 func suspend (cause) = [BooleanEntry(keyActive, false), StringEntry(keyCause, cause)]
233233
234234
235235 func calcStakingFuncAndAddres (stake,assetId) = if (stake)
236236 then if ((assetId == USDN))
237237 then $Tuple2("lockNeutrino", stakingUSDNNSBTAddress)
238238 else if ((assetId == NSBT))
239239 then $Tuple2("lockNsbt", stakingUSDNNSBTAddress)
240240 else $Tuple2("startStaking", stakingEURNAddress)
241241 else if ((assetId == USDN))
242242 then $Tuple2("unlockNeutrino", stakingUSDNNSBTAddress)
243243 else if ((assetId == NSBT))
244244 then $Tuple2("unlockNsbt", stakingUSDNNSBTAddress)
245245 else $Tuple2("stopStaking", stakingEURNAddress)
246246
247247
248248 func calcStakingParams (stake,amount,assetId) = if (stake)
249249 then {
250250 let $t069226988 = calcStakingFuncAndAddres(stake, assetId)
251251 let call = $t069226988._1
252252 let stakingAddr = $t069226988._2
253253 $Tuple4(call, stakingAddr, nil, [AttachedPayment(assetId, amount)])
254254 }
255255 else {
256256 let $t070747140 = calcStakingFuncAndAddres(stake, assetId)
257257 let call = $t070747140._1
258258 let stakingAddr = $t070747140._2
259259 $Tuple4(call, stakingAddr, [amount, toBase58String(assetId)], nil)
260260 }
261261
262262
263263 func calculateFees (pmtAmount,minAmountToReceive,tokenFrom,tokenTo) = {
264264 let amountWithoutFee = fraction(tokenTo, pmtAmount, (pmtAmount + tokenFrom))
265265 let amountWithFee = fraction(amountWithoutFee, (commissionScaleDelimiter - commission), commissionScaleDelimiter)
266266 let governanceReward = fraction(amountWithoutFee, commissionGovernance, commissionScaleDelimiter)
267267 if ((minAmountToReceive > amountWithFee))
268268 then throw(((("Calculated amount to receive " + toString(amountWithFee)) + " is less than specified minimum ") + toString(minAmountToReceive)))
269269 else $Tuple3(amountWithoutFee, amountWithFee, governanceReward)
270270 }
271271
272272
273273 func suspendSuspicious () = suspend(((((((((((((((("Suspicious state. Actual balances: " + toString(accountBalanceWithStakedA)) + " ") + assetNameA) + ", ") + toString(accountBalanceWithStakedB)) + " ") + assetNameB) + ". State: ") + toString(balanceA)) + " ") + assetNameA) + ", ") + toString(balanceB)) + " ") + assetNameB))
274274
275275
276276 func isActive () = if (active)
277277 then unit
278278 else throw("DApp is inactive at this moment")
279279
280280
281281 @Callable(i)
282282 func init (firstHarvest) = {
283283 let $t083108387 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
284284 let pmtAmountA = $t083108387._1
285285 let pmtAssetIdA = $t083108387._2
286286 let $t083928469 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
287287 let pmtAmountB = $t083928469._1
288288 let pmtAssetIdB = $t083928469._2
289289 let $t084748551 = getAssetInfo(pmtAssetIdA)
290290 let pmtStrAssetIdA = $t084748551._1
291291 let pmtAssetNameA = $t084748551._2
292292 let pmtDecimalsA = $t084748551._3
293293 let $t085568633 = getAssetInfo(pmtAssetIdB)
294294 let pmtStrAssetIdB = $t085568633._1
295295 let pmtAssetNameB = $t085568633._2
296296 let pmtDecimalsB = $t085568633._3
297297 if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStaking], i.callerPublicKey)))
298298 then throw("Only admin can call this function")
299299 else if (isDefined(getBoolean(this, keyActive)))
300300 then throw("DApp is already active")
301301 else if ((pmtAssetIdA == pmtAssetIdB))
302302 then throw("Assets must be different")
303303 else {
304304 let shareName = ((("s" + take(pmtAssetNameA, 7)) + "_") + take(pmtAssetNameB, 7))
305305 let shareDescription = ((((("ShareToken of SwopFi protocol for " + pmtAssetNameA) + " and ") + pmtAssetNameB) + " at address ") + toString(this))
306306 let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
307307 let arg1 = pow(pmtAmountA, pmtDecimalsA, 5, 1, pmtDecimalsA, DOWN)
308308 let arg2 = pow(pmtAmountB, pmtDecimalsB, 5, 1, pmtDecimalsB, DOWN)
309309 let arg3 = pow(10, 0, shareDecimals, 0, 0, DOWN)
310310 let shareInitialSupply = fraction(arg1, arg2, arg3)
311311 let shareIssue = Issue(shareName, shareDescription, shareInitialSupply, shareDecimals, true)
312312 let shareIssueId = calculateAssetId(shareIssue)
313313 let stake1 = if (containsElement(stakingAssets, pmtStrAssetIdA))
314314 then invoke(this, "stakeUnstake", [true, pmtAmountA, pmtStrAssetIdA], nil)
315315 else 0
316316 if ((stake1 == stake1))
317317 then {
318318 let stake2 = if (containsElement(stakingAssets, pmtStrAssetIdB))
319319 then invoke(this, "stakeUnstake", [true, pmtAmountB, pmtStrAssetIdB], nil)
320320 else 0
321321 if ((stake2 == stake2))
322322 then {
323323 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)]
324324 if (firstHarvest)
325325 then (baseEntry ++ [BooleanEntry(keyFirstHarvest, firstHarvest), IntegerEntry(keyFirstHarvestHeight, (startHeight + (firstHarvestEndPeriod * periodLength)))])
326326 else baseEntry
327327 }
328328 else throw("Strict value is not equal to itself.")
329329 }
330330 else throw("Strict value is not equal to itself.")
331331 }
332332 }
333333
334334
335335
336336 @Callable(i)
337337 func initWithInitRatio (amtAssetA,amtAssetB,strAssetIdA,strAssetIdB,firstHarvest) = {
338338 let $t01122211309 = getAssetInfoFromString(strAssetIdA)
339339 let pmtStrAssetIdA = $t01122211309._1
340340 let pmtAssetNameA = $t01122211309._2
341341 let pmtDecimalsA = $t01122211309._3
342342 let $t01131411401 = getAssetInfoFromString(strAssetIdB)
343343 let pmtStrAssetIdB = $t01131411401._1
344344 let pmtAssetNameB = $t01131411401._2
345345 let pmtDecimalsB = $t01131411401._3
346346 if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStaking], i.callerPublicKey)))
347347 then throw("Only admin can call this function")
348348 else if (isDefined(getBoolean(this, keyActive)))
349349 then throw("DApp is already active")
350350 else if ((strAssetIdA == strAssetIdB))
351351 then throw("Assets must be different")
352352 else {
353353 let shareName = ((("s" + take(pmtAssetNameA, 7)) + "_") + take(pmtAssetNameB, 7))
354354 let shareDescription = ((((("ShareToken of SwopFi protocol for " + pmtAssetNameA) + " and ") + pmtAssetNameB) + " at address ") + toString(this))
355355 let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
356356 let shareInitialSupply = 0
357357 let shareIssue = Issue(shareName, shareDescription, shareInitialSupply, shareDecimals, true)
358358 let shareIssueId = calculateAssetId(shareIssue)
359359 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)]
360360 if (firstHarvest)
361361 then (baseEntry ++ [BooleanEntry(keyFirstHarvest, firstHarvest), IntegerEntry(keyFirstHarvestHeight, (startHeight + (firstHarvestEndPeriod * periodLength)))])
362362 else baseEntry
363363 }
364364 }
365365
366366
367367
368368 @Callable(i)
369369 func keepLimitForFirstHarvest (shareLimit) = valueOrElse(isActive(), if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStaking], i.callerPublicKey)))
370370 then throw("Only admin can call this function")
371371 else [IntegerEntry(kShareLimit, shareLimit)])
372372
373373
374374
375375 @Callable(i)
376376 func replenishWithTwoTokens (slippageTolerance) = valueOrElse(isActive(), {
377377 let pmtAssetIdA = i.payments[0].assetId
378378 let pmtAssetIdB = i.payments[1].assetId
379379 let pmtAmountA = i.payments[0].amount
380380 let pmtAmountB = i.payments[1].amount
381381 let $t01386913946 = getAssetInfo(pmtAssetIdA)
382382 let pmtStrAssetIdA = $t01386913946._1
383383 let pmtAssetNameA = $t01386913946._2
384384 let pmtDecimalsA = $t01386913946._3
385385 let $t01395114028 = getAssetInfo(pmtAssetIdB)
386386 let pmtStrAssetIdB = $t01395114028._1
387387 let pmtAssetNameB = $t01395114028._2
388388 let pmtDecimalsB = $t01395114028._3
389389 let inital = if (if ((balanceA == 0))
390390 then (balanceB == 0)
391391 else false)
392392 then true
393393 else false
394394 let tokenRatio = if (inital)
395395 then fraction(fraction(assetInitA, scaleValue8, pmtAmountA), scaleValue3, fraction(assetInitB, scaleValue8, pmtAmountB))
396396 else fraction(fraction(balanceA, scaleValue8, pmtAmountA), scaleValue3, fraction(balanceB, scaleValue8, pmtAmountB))
397397 let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
398398 let shareTokenToPayAmount = if (inital)
399399 then fraction(pow(pmtAmountA, pmtDecimalsA, 5, 1, pmtDecimalsA, DOWN), pow(pmtAmountB, pmtDecimalsB, 5, 1, pmtDecimalsB, DOWN), pow(10, 0, shareDecimals, 0, 0, DOWN))
400400 else fraction(min([fraction(pmtAmountA, scaleValue8, balanceA), fraction(pmtAmountB, scaleValue8, balanceB)]), shareAssetSupply, scaleValue8)
401401 if (if ((0 > slippageTolerance))
402402 then true
403403 else (slippageTolerance > slippageToleranceDelimiter))
404404 then throw(((("Slippage tolerance must be between 0 and " + toString(slippageToleranceDelimiter)) + " inclusively. Actual: ") + toString(slippageTolerance)))
405405 else if ((size(i.payments) != 2))
406406 then throw("Two attached assets expected")
407407 else if (if ((pmtAssetIdA != assetIdA))
408408 then true
409409 else (pmtAssetIdB != assetIdB))
410410 then throw(((("Incorrect assets attached. Expected: " + strAssetIdA) + " and ") + strAssetIdB))
411411 else if (if ((((scaleValue3 * (slippageToleranceDelimiter - slippageTolerance)) / slippageToleranceDelimiter) > tokenRatio))
412412 then true
413413 else (tokenRatio > ((scaleValue3 * (slippageToleranceDelimiter + slippageTolerance)) / slippageToleranceDelimiter)))
414414 then throw("Incorrect assets amount: amounts must have the contract ratio")
415415 else if ((shareTokenToPayAmount == 0))
416416 then throw("Too small amount to replenish")
417417 else if (!(hasEnoughBalance))
418418 then ([ScriptTransfer(i.caller, pmtAmountA, pmtAssetIdA), ScriptTransfer(i.caller, pmtAmountB, pmtAssetIdB)] ++ suspendSuspicious())
419419 else {
420420 let stake1 = if (containsElement(stakingAssets, pmtStrAssetIdA))
421421 then invoke(this, "stakeUnstake", [true, pmtAmountA, pmtStrAssetIdA], nil)
422422 else 0
423423 if ((stake1 == stake1))
424424 then {
425425 let stake2 = if (containsElement(stakingAssets, pmtStrAssetIdB))
426426 then invoke(this, "stakeUnstake", [true, pmtAmountB, pmtStrAssetIdB], nil)
427427 else 0
428428 if ((stake2 == stake2))
429429 then [Reissue(shareAssetId, shareTokenToPayAmount, true), IntegerEntry(keyBalanceA, (balanceA + pmtAmountA)), IntegerEntry(keyBalanceB, (balanceB + pmtAmountB)), IntegerEntry(keyShareAssetSupply, (shareAssetSupply + shareTokenToPayAmount)), ScriptTransfer(i.caller, shareTokenToPayAmount, shareAssetId)]
430430 else throw("Strict value is not equal to itself.")
431431 }
432432 else throw("Strict value is not equal to itself.")
433433 }
434434 })
435435
436436
437437
438438 @Callable(i)
439439 func withdraw () = valueOrElse(isActive(), {
440440 let $t01683416909 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
441441 let pmtAmount = $t01683416909._1
442442 let pmtAssetId = $t01683416909._2
443443 let amountToPayA = fraction(pmtAmount, balanceA, shareAssetSupply)
444444 let amountToPayB = fraction(pmtAmount, balanceB, shareAssetSupply)
445445 if ((size(i.payments) != 1))
446446 then throw("One attached payment expected")
447447 else if ((pmtAssetId != shareAssetId))
448448 then throw(("Incorrect asset attached. Expected: " + toBase58String(shareAssetId)))
449449 else if (!(hasEnoughBalance))
450450 then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
451451 else {
452452 let stake1 = if (containsElement(stakingAssets, strAssetIdA))
453453 then invoke(this, "stakeUnstake", [false, amountToPayA, strAssetIdA], nil)
454454 else 0
455455 if ((stake1 == stake1))
456456 then {
457457 let stake2 = if (containsElement(stakingAssets, strAssetIdB))
458458 then invoke(this, "stakeUnstake", [false, amountToPayB, strAssetIdB], nil)
459459 else 0
460460 if ((stake2 == stake2))
461461 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)]
462462 else throw("Strict value is not equal to itself.")
463463 }
464464 else throw("Strict value is not equal to itself.")
465465 }
466466 })
467467
468468
469469
470470 @Callable(i)
471471 func exchange (minAmountToReceive) = valueOrElse(isActive(), {
472472 let $t01821518290 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
473473 let pmtAmount = $t01821518290._1
474474 let pmtAssetId = $t01821518290._2
475475 if (if ((balanceA == 0))
476476 then true
477477 else (balanceB == 0))
478478 then throw("Can't exchange with zero balance")
479479 else if ((0 >= minAmountToReceive))
480480 then throw(("Minimal amount to receive must be positive. Actual: " + toString(minAmountToReceive)))
481481 else if ((size(i.payments) != 1))
482482 then throw("One attached payment expected")
483483 else if (!(hasEnoughBalance))
484484 then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
485485 else if ((pmtAssetId == assetIdA))
486486 then {
487487 let assetIdSend = assetIdB
488488 let $t01884518967 = calculateFees(pmtAmount, minAmountToReceive, balanceA, balanceB)
489489 let amountWithoutFee = $t01884518967._1
490490 let amountWithFee = $t01884518967._2
491491 let governanceReward = $t01884518967._3
492492 let newBalanceA = (balanceA + pmtAmount)
493493 let newBalanceB = ((balanceB - amountWithFee) - governanceReward)
494494 let stake1 = if (containsElement(stakingAssets, strAssetIdA))
495495 then invoke(this, "stakeUnstake", [true, pmtAmount, strAssetIdA], nil)
496496 else 0
497497 if ((stake1 == stake1))
498498 then {
499499 let stake2 = if (containsElement(stakingAssets, strAssetIdB))
500500 then invoke(this, "stakeUnstake", [false, (amountWithFee + governanceReward), strAssetIdB], nil)
501501 else 0
502502 if ((stake2 == stake2))
503503 then [IntegerEntry(keyBalanceA, newBalanceA), IntegerEntry(keyBalanceB, newBalanceB), ScriptTransfer(i.caller, amountWithFee, assetIdSend), ScriptTransfer(walletAddress, governanceReward, assetIdSend)]
504504 else throw("Strict value is not equal to itself.")
505505 }
506506 else throw("Strict value is not equal to itself.")
507507 }
508508 else if ((pmtAssetId == assetIdB))
509509 then {
510510 let assetIdSend = assetIdA
511511 let $t01992220044 = calculateFees(pmtAmount, minAmountToReceive, balanceB, balanceA)
512512 let amountWithoutFee = $t01992220044._1
513513 let amountWithFee = $t01992220044._2
514514 let governanceReward = $t01992220044._3
515515 let newBalanceA = ((balanceA - amountWithFee) - governanceReward)
516516 let newBalanceB = (balanceB + pmtAmount)
517517 let stake1 = if (containsElement(stakingAssets, strAssetIdA))
518518 then invoke(this, "stakeUnstake", [false, (amountWithFee + governanceReward), strAssetIdA], nil)
519519 else 0
520520 if ((stake1 == stake1))
521521 then {
522522 let stake2 = if (containsElement(stakingAssets, strAssetIdB))
523523 then invoke(this, "stakeUnstake", [true, pmtAmount, strAssetIdB], nil)
524524 else 0
525525 if ((stake2 == stake2))
526526 then [IntegerEntry(keyBalanceA, newBalanceA), IntegerEntry(keyBalanceB, newBalanceB), ScriptTransfer(i.caller, amountWithFee, assetIdSend), ScriptTransfer(walletAddress, governanceReward, assetIdSend)]
527527 else throw("Strict value is not equal to itself.")
528528 }
529529 else throw("Strict value is not equal to itself.")
530530 }
531531 else throw(((("Incorrect asset attached. Expected: " + strAssetIdA) + " or ") + strAssetIdB))
532532 })
533533
534534
535535
536536 @Callable(i)
537537 func shutdown () = if (!(active))
538538 then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, keyCause), "the cause wasn't specified")))
539539 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStartStop], i.callerPublicKey)))
540540 then throw("Only admin can call this function")
541541 else suspend("Paused by admin")
542542
543543
544544
545545 @Callable(i)
546546 func activate () = if (active)
547547 then throw("DApp is already active")
548548 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStartStop], i.callerPublicKey)))
549549 then throw("Only admin can call this function")
550550 else [BooleanEntry(keyActive, true), DeleteEntry(keyCause)]
551551
552552
553553
554554 @Callable(i)
555555 func takeIntoAccountExtraFunds () = valueOrElse(isActive(), {
556556 let amountEnrollA = (accountBalanceWithStakedA - balanceA)
557557 let amountEnrollB = (accountBalanceWithStakedB - balanceB)
558558 if ((i.caller != walletAddress))
559559 then throw("Only the wallet can call this function")
560560 else if (if ((0 > amountEnrollA))
561561 then true
562562 else (0 > amountEnrollB))
563563 then suspend("Enroll amount negative")
564564 else if (if ((amountEnrollA == 0))
565565 then (amountEnrollB == 0)
566566 else false)
567567 then throw("No money to take")
568568 else {
569569 let stake1 = if (containsElement(stakingAssets, strAssetIdA))
570570 then invoke(this, "stakeUnstake", [true, amountEnrollA, strAssetIdA], nil)
571571 else 0
572572 if ((stake1 == stake1))
573573 then {
574574 let stake2 = if (containsElement(stakingAssets, strAssetIdB))
575575 then invoke(this, "stakeUnstake", [true, amountEnrollB, strAssetIdB], nil)
576576 else 0
577577 if ((stake2 == stake2))
578578 then [IntegerEntry(keyBalanceA, (balanceA + amountEnrollA)), IntegerEntry(keyBalanceB, (balanceB + amountEnrollB)), IntegerEntry(("last_income_" + strAssetIdA), amountEnrollA), IntegerEntry(("last_income_" + strAssetIdB), amountEnrollB)]
579579 else throw("Strict value is not equal to itself.")
580580 }
581581 else throw("Strict value is not equal to itself.")
582582 }
583583 })
584584
585585
586586
587587 @Callable(i)
588588 func stakeUnstake (stake,amount,assetIdString) = if ((i.caller != this))
589589 then throw("Only contract itself can invoke this function")
590590 else if ((assetIdString == "WAVES"))
591591 then {
592592 let pool = addressFromStringValue(valueOrErrorMessage(getString(oracle, keyLeasingPool), "No leasing pool in oracle"))
593593 let leasingId = getBinary(this, keyLeasingId)
594594 let leasingAmount = valueOrElse(getInteger(this, keyLeasingAmount), 0)
595595 let newLeaseAmount = if (stake)
596596 then (leasingAmount + amount)
597597 else (leasingAmount - amount)
598598 let newLease = Lease(pool, newLeaseAmount)
599599 let newLeaseId = calculateLeaseId(newLease)
600600 let baseEtry = [newLease, BinaryEntry(keyLeasingId, newLeaseId), IntegerEntry(keyLeasingAmount, newLeaseAmount)]
601601 match leasingId {
602602 case lId: ByteVector =>
603603 ([LeaseCancel(lId)] ++ baseEtry)
604604 case _ =>
605605 baseEtry
606606 }
607607 }
608608 else {
609609 let $t02377823881 = calcStakingParams(stake, amount, fromBase58String(assetIdString))
610610 let call = $t02377823881._1
611611 let addr = $t02377823881._2
612612 let params = $t02377823881._3
613613 let payments = $t02377823881._4
614614 let inv = invoke(addr, call, params, payments)
615615 if ((inv == inv))
616616 then nil
617617 else throw("Strict value is not equal to itself.")
618618 }
619619
620620
621621
622622 @Callable(i)
623623 func stakeAll () = valueOrElse(isActive(), if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStartStop], i.callerPublicKey)))
624624 then throw("Only admin can call this function")
625625 else {
626626 let stake1 = if (containsElement(stakingAssets, strAssetIdA))
627627 then {
628628 let amountA = (balanceA - stakedAmountA)
629629 if ((amountA > 0))
630630 then invoke(this, "stakeUnstake", [true, amountA, strAssetIdA], nil)
631631 else 0
632632 }
633633 else 0
634634 if ((stake1 == stake1))
635635 then {
636636 let stake2 = if (containsElement(stakingAssets, strAssetIdB))
637637 then {
638638 let amountB = (balanceB - stakedAmountB)
639639 if ((amountB > 0))
640640 then invoke(this, "stakeUnstake", [true, amountB, strAssetIdB], nil)
641641 else 0
642642 }
643643 else 0
644644 if ((stake2 == stake2))
645645 then nil
646646 else throw("Strict value is not equal to itself.")
647647 }
648648 else throw("Strict value is not equal to itself.")
649649 })
650650
651651
652652 @Verifier(tx)
653653 func verify () = {
654654 let multiSignedByAdmins = {
655655 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
656656 then 1
657657 else 0
658658 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
659659 then 1
660660 else 0
661661 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
662662 then 1
663663 else 0
664664 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
665665 }
666666 match tx {
667667 case inv: InvokeScriptTransaction =>
668668 let callTakeIntoAccount = if ((inv.dApp == this))
669669 then (inv.function == "takeIntoAccountExtraFunds")
670670 else false
671671 let exchangeToWaves = if (if (if ((inv.dApp == USDNToWavesExchanger))
672672 then (inv.function == "exchange")
673673 else false)
674674 then (assetIdA == USDN)
675675 else false)
676676 then true
677677 else if (if ((assetIdB == USDN))
678678 then (size(inv.payments) == 1)
679679 else false)
680680 then (inv.payments[0].assetId == USDN)
681681 else false
682682 let exchangeToNSBTs = if (if (if ((inv.dApp == USDNToNSBTExchanger))
683683 then (inv.function == "exchange")
684684 else false)
685685 then (assetIdA == NSBT)
686686 else false)
687687 then true
688688 else if (if ((assetIdB == NSBT))
689689 then (size(inv.payments) == 1)
690690 else false)
691691 then (inv.payments[0].assetId == USDN)
692692 else false
693693 let signedByAdmin = if (if (if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
694694 then true
695695 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey2))
696696 then true
697697 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey3))
698698 then true
699699 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKeyStaking)
700700 if (if (if (if (callTakeIntoAccount)
701701 then true
702702 else exchangeToWaves)
703703 then true
704704 else exchangeToNSBTs)
705705 then signedByAdmin
706706 else false)
707707 then true
708708 else multiSignedByAdmins
709709 case _ =>
710710 multiSignedByAdmins
711711 }
712712 }
713713

github/deemru/w8io/026f985 
71.27 ms