tx · 269JkUQbjcwiHcSmcSz2fWZsuNFA9VVsioiztQz6ryo5

3Mq63YubY7UKJEobhDuXfsnXaPDJZT1fDhx:  -0.01400000 Waves

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

{ "type": 13, "id": "269JkUQbjcwiHcSmcSz2fWZsuNFA9VVsioiztQz6ryo5", "fee": 1400000, "feeAssetId": null, "timestamp": 1640792481293, "version": 2, "chainId": 84, "sender": "3Mq63YubY7UKJEobhDuXfsnXaPDJZT1fDhx", "senderPublicKey": "HXfVyeXgXUtHD3uSP6yjsk6JQcTwmU9qQTvhXzFpPw2T", "proofs": [ "2DkjeekK8mDvXW1pULNvwDzuSi5ibvSyovQmu9XbAmTCdNpWCJzotyew5JofREHH4LztGSJLUXAPEgFK4v2RE46G", "5z5ykCLK2mYauk6sKuiSXyBx9UYND5a81cpjeo8Y3HDTnLXJCTVhprjHfLAD19HVKpuXy89aFSb5NZbj2dAYELAy" ], "script": "base64:AAIFAAAAAAAAD2cIAhIDCgEEEgcKBQEBCAgEEgMKAQESAwoBARIAEgMKAQESABIAEgMKAQESBQoDBAEIEgAaFAoBQRIPa2V5QWRtaW5QdWJLZXkyGhQKAUISD2tleUFkbWluUHViS2V5MxoLCgFDEgZvcmFjbGUaEAoBRBILZ2V0QWRtaW5QdWIaEAoBRRILa2V5QWRtaW5QdWIaDAoBRhIHJG1hdGNoMBoLCgFHEgZzdHJpbmcaDAoBSBIHbm90aGluZxoRCgFJEgxhZG1pblB1YktleTEaEQoBShIMYWRtaW5QdWJLZXkyGhEKAUsSDGFkbWluUHViS2V5MxoZCgFMEhRhZG1pblB1YktleVN0YXJ0U3RvcBoXCgFNEhJhZG1pblB1YktleVN0YWtpbmcaEgoBThINd2FsbGV0QWRkcmVzcxoSCgFPEg12b3RpbmdBZGRyZXNzGgkKAVASBFVTRE4aCQoBURIETlNCVBoJCgFSEgRFVVJOGhIKAVMSDXN0YWtpbmdBc3NldHMaGwoBVBIWc3Rha2luZ1VTRE5OU0JUQWRkcmVzcxoXCgFVEhJzdGFraW5nRVVSTkFkZHJlc3MaGQoBVhIUVVNETlRvV2F2ZXNFeGNoYW5nZXIaGAoBVxITVVNETlRvTlNCVEV4Y2hhbmdlchoPCgFYEgpiYXNlUGVyaW9kGhAKAVkSC3N0YXJ0SGVpZ2h0GhEKAVoSDHBlcmlvZExlbmd0aBoMCgFhEgd2ZXJzaW9uGhMKAmFBEg1zdGFrZWRBbW91bnRCGhAKAmFCEgphc3NldEluaXRBGhAKAmFDEgphc3NldEluaXRCGhcKAmFEEhFhdmFpbGFibGVCYWxhbmNlQRoXCgJhRRIRYXZhaWxhYmxlQmFsYW5jZUIaHwoCYUYSGWFjY291bnRCYWxhbmNlV2l0aFN0YWtlZEEaHwoCYUcSGWFjY291bnRCYWxhbmNlV2l0aFN0YWtlZEIaFgoCYUgSEGhhc0Vub3VnaEJhbGFuY2UaEgoCYUkSDGdldEFzc2V0SW5mbxoOCgJhShIIc3RyaW5nSWQaCgoCYUsSBGluZm8aHAoCYUwSFmdldEFzc2V0SW5mb0Zyb21TdHJpbmcaDgoCYU0SCGFzc2V0U3RyGg0KAmFOEgdzdXNwZW5kGgsKAmFPEgVjYXVzZRoeCgJhUBIYY2FsY1N0YWtpbmdGdW5jQW5kQWRkcmVzGgsKAmFREgVzdGFrZRoXCgJhUhIRY2FsY1N0YWtpbmdQYXJhbXMaDAoCYVMSBmFtb3VudBoRCgJhVBILJHQwNjkzMDY5OTYaCgoCYVUSBGNhbGwaEQoCYVYSC3N0YWtpbmdBZGRyGhEKAmFXEgskdDA3MDgyNzE0OBonCgJhWBIhdGhyb3dJbnN1ZmZpY2llbnRBdmFpbGFibGVCYWxhbmNlGg8KAmFZEglhdmFpbGFibGUaDwoCYVoSCWFzc2V0TmFtZRobCgJhYRIVZmlyc3RIYXJ2ZXN0RW5kUGVyaW9kGg4KAmFiEghpc0FjdGl2ZRoRCgJhYxILc3RyQXNzZXRJZEEaEQoCYWQSC3N0ckFzc2V0SWRCGg4KAmFlEghhc3NldElkQRoOCgJhZhIIYXNzZXRJZEIaEAoCYWcSCmFzc2V0TmFtZUEaCAoCYWgSAmlkGgsKAmFpEgV3YXZlcxoQCgJhahIKYXNzZXROYW1lQhoOCgJhaxIIYmFsYW5jZUEaDgoCYWwSCGJhbGFuY2VCGhIKAmFtEgxzaGFyZUFzc2V0SWQaFgoCYW4SEHNoYXJlQXNzZXRTdXBwbHkaEAoCYW8SCmNvbW1pc3Npb24aHgoCYXASGGNvbW1pc3Npb25TY2FsZURlbGltaXRlchoRCgJhcRILc2NhbGVWYWx1ZTMaEQoCYXISC3NjYWxlVmFsdWU4GiAKAmFzEhpzbGlwcGFnZVRvbGVyYW5jZURlbGltaXRlchoUCgJhdBIOYWNjb3VudEJhbGFuY2UaDQoCYXUSB2Fzc2V0SWQaEgoCYXYSDHN0YWtlZEFtb3VudBocCgJhdxIWc3Rha2VkQW1vdW50Q2FsY3VsYXRlZBoJCgJheBIDYUlkGgcKAmF5EgFpGhMKAmF6Eg1zdGFrZWRBbW91bnRBGg8KAWISCmtleVZlcnNpb24aEAoCYkESCnNoYXJlSXNzdWUaEgoCYkISDHNoYXJlSXNzdWVJZBoMCgJiQxIGc3Rha2UxGgwKAmJEEgZzdGFrZTIaDwoCYkUSCWJhc2VFbnRyeRoPCgJiRhIJYW10QXNzZXRBGg8KAmJHEglhbXRBc3NldEIaEwoCYkgSDSR0MDExMjQ3MTEzMzQaEwoCYkkSDSR0MDExMzM5MTE0MjYaEAoCYkoSCnNoYXJlTGltaXQaFwoCYksSEXNsaXBwYWdlVG9sZXJhbmNlGhMKAmJMEg0kdDAxMzkyMzE0MDAwGhMKAmJNEg0kdDAxNDAwNTE0MDgyGhAKAmJOEgp0b2tlblJhdGlvGhkKAmJPEhNyYXRpb1NoYXJlVG9rZW5zSW5BGhkKAmJQEhNyYXRpb1NoYXJlVG9rZW5zSW5CGhsKAmJREhVzaGFyZVRva2VuVG9QYXlBbW91bnQaEwoCYlISDSR0MDE5MjUxMTkzMjYaDwoCYlMSCXBtdEFtb3VudBoQCgJiVBIKcG10QXNzZXRJZBoSCgJiVRIMYW1vdW50VG9QYXlBGhIKAmJWEgxhbW91bnRUb1BheUIaGAoCYlcSEm1pbkFtb3VudFRvUmVjZWl2ZRoTCgJiWBINJHQwMjA4NDEyMDkxNhoTCgJiWRINY2FsY3VsYXRlRmVlcxoPCgJiWhIJdG9rZW5Gcm9tGigKAmJhEiJ0aHJvd0luc3VmZmljaWVudEF2YWlsYWJsZUJhbGFuY2VzGg0KAmJiEgdhbW91bnRBGg0KAmJjEgdhbW91bnRCGhcKAmJkEhFzdXNwZW5kU3VzcGljaW91cxoSCgJiZRIMZmlyc3RIYXJ2ZXN0GhEKAmJmEgskdDA4MzM1ODQxMhoQCgJiZxIKcG10QW1vdW50QRoRCgJiaBILcG10QXNzZXRJZEEaEQoCYmkSCyR0MDg0MTc4NDk0GhAKAmJqEgpwbXRBbW91bnRCGhEKAmJrEgtwbXRBc3NldElkQhoRCgJibBILJHQwODQ5OTg1NzYaFAoCYm0SDnBtdFN0ckFzc2V0SWRBGhMKAmJuEg1wbXRBc3NldE5hbWVBGhIKAmJvEgxwbXREZWNpbWFsc0EaEQoCYnASCyR0MDg1ODE4NjU4GhQKAmJxEg5wbXRTdHJBc3NldElkQhoTCgJichINcG10QXNzZXROYW1lQhoSCgJicxIMcG10RGVjaW1hbHNCGg8KAmJ0EglzaGFyZU5hbWUaFgoCYnUSEHNoYXJlRGVzY3JpcHRpb24aEwoCYnYSDXNoYXJlRGVjaW1hbHMaCgoCYncSBGFyZzEaCgoCYngSBGFyZzIaCgoCYnkSBGFyZzMaGAoCYnoSEnNoYXJlSW5pdGlhbFN1cHBseRoOCgFjEglrZXlBY3RpdmUaDgoCY0ESCHBheW1lbnRzGgkKAmNCEgNpbnYaCAoCY0MSAnR4GgwKAmNEEgZ2ZXJpZnkaGQoCY0USE211bHRpU2lnbmVkQnlBZG1pbnMaGAoCY0YSEmFkbWluUHViS2V5MVNpZ25lZBoYCgJjRxISYWRtaW5QdWJLZXkyU2lnbmVkGhgKAmNIEhJhZG1pblB1YktleTNTaWduZWQaGQoCY0kSE2NhbGxUYWtlSW50b0FjY291bnQaFQoCY0oSD2V4Y2hhbmdlVG9XYXZlcxoVCgJjSxIPZXhjaGFuZ2VUb05TQlRzGhMKAmNMEg1zaWduZWRCeUFkbWluGg0KAmNhEgd0b2tlblRvGhYKAmNiEhBhbW91bnRXaXRob3V0RmVlGhMKAmNjEg1hbW91bnRXaXRoRmVlGhYKAmNkEhBnb3Zlcm5hbmNlUmV3YXJkGhEKAmNlEgthc3NldElkU2VuZBoTCgJjZhINJHQwMjIxOTAyMjI4MRoRCgJjZxILbmV3QmFsYW5jZUEaEQoCY2gSC25ld0JhbGFuY2VCGhMKAmNpEg0kdDAyMzIzNjIzMzI3GhEKAmNqEgthbW91bnRMZWF2ZRojCgJjaxIddW5jb3VudGFibGVBbW91bnRFbnJvbGxBc3NldEEaIwoCY2wSHXVuY291bnRhYmxlQW1vdW50RW5yb2xsQXNzZXRCGhMKAmNtEg1hbW91bnRFbnJvbGxBGhMKAmNuEg1hbW91bnRFbnJvbGxCGhMKAmNvEg1hc3NldElkU3RyaW5nGgoKAmNwEgRwb29sGg8KAmNxEglsZWFzaW5nSWQaEwoCY3ISDWxlYXNpbmdBbW91bnQaFAoCY3MSDm5ld0xlYXNlQW1vdW50Gg4KAmN0EghuZXdMZWFzZRoQCgJjdRIKbmV3TGVhc2VJZBoOCgJjdhIIYmFzZUV0cnkaCQoCY3cSA2xJZBoTCgJjeBINJHQwMjc5MzEyODAzNBoKCgJjeRIEYWRkchoMCgJjehIGcGFyYW1zGhAKAWQSC2tleUFzc2V0SWRBGhAKAWUSC2tleUFzc2V0SWRCGhAKAWYSC2tleUJhbGFuY2VBGhAKAWcSC2tleUJhbGFuY2VCGhQKAWgSD2tleUJhbGFuY2VJbml0QRoUCgFpEg9rZXlCYWxhbmNlSW5pdEIaFAoBahIPa2V5U2hhcmVBc3NldElkGhgKAWsSE2tleVNoYXJlQXNzZXRTdXBwbHkaEgoBbBINa2V5Q29tbWlzc2lvbhogCgFtEhtrZXlDb21taXNzaW9uU2NhbGVEZWxpbWl0ZXIaDQoBbhIIa2V5Q2F1c2UaFAoBbxIPa2V5Rmlyc3RIYXJ2ZXN0GhoKAXASFWtleUZpcnN0SGFydmVzdEhlaWdodBoQCgFxEgtrU2hhcmVMaW1pdBoQCgFyEgtrQmFzZVBlcmlvZBoSCgFzEg1rUGVyaW9kTGVuZ3RoGhEKAXQSDGtTdGFydEhlaWdodBoXCgF1EhJrZXlVU0ROTlNCVEFkZHJlc3MaEwoBdhIOa2V5RVVSTkFkZHJlc3MaEwoBdxIOa2V5TGVhc2luZ1Bvb2waFQoBeBIQa2V5TGVhc2luZ0Ftb3VudBoRCgF5EgxrZXlMZWFzaW5nSWQaFAoBehIPa2V5QWRtaW5QdWJLZXkxAAAAVAAAAAABYQIAAAAFMS4wLjAAAAAAAWICAAAAB3ZlcnNpb24AAAAAAWMCAAAABmFjdGl2ZQAAAAABZAIAAAAKQV9hc3NldF9pZAAAAAABZQIAAAAKQl9hc3NldF9pZAAAAAABZgIAAAAPQV9hc3NldF9iYWxhbmNlAAAAAAFnAgAAAA9CX2Fzc2V0X2JhbGFuY2UAAAAAAWgCAAAADEFfYXNzZXRfaW5pdAAAAAABaQIAAAAMQl9hc3NldF9pbml0AAAAAAFqAgAAAA5zaGFyZV9hc3NldF9pZAAAAAABawIAAAASc2hhcmVfYXNzZXRfc3VwcGx5AAAAAAFsAgAAAApjb21taXNzaW9uAAAAAAFtAgAAABpjb21taXNzaW9uX3NjYWxlX2RlbGltaXRlcgAAAAABbgIAAAAOc2h1dGRvd25fY2F1c2UAAAAAAW8CAAAADWZpcnN0X2hhcnZlc3QAAAAAAXACAAAAFGZpcnN0X2hhcnZlc3RfaGVpZ2h0AAAAAAFxAgAAABxzaGFyZV9saW1pdF9vbl9maXJzdF9oYXJ2ZXN0AAAAAAFyAgAAAAtiYXNlX3BlcmlvZAAAAAABcwIAAAANcGVyaW9kX2xlbmd0aAAAAAABdAIAAAAMc3RhcnRfaGVpZ2h0AAAAAAF1AgAAABhzdGFraW5nX3VzZG5uc2J0X2FkZHJlc3MAAAAAAXYCAAAAFHN0YWtp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", "height": 1855704, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: EZ2XS3At8DUxcYMDxigutYKYcs7NxdE3ApMeu7Bhs5rv Next: EP4sVG81wmGjP6gprVZ2nmnyzZCC1NNbTTtNGNe3JmrE Diff:
OldNewDifferences
687687 let params = $t02793128034._3
688688 let payments = $t02793128034._4
689689 let inv = invoke(addr, call, params, payments)
690- nil
690+ if ((inv == inv))
691+ then nil
692+ else throw("Strict value is not equal to itself.")
691693 }
692694
693695
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 isActive = 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 availableBalanceA = (balanceA - stakedAmountA)
201201
202202 let availableBalanceB = (balanceB - stakedAmountB)
203203
204204 let accountBalanceWithStakedA = (accountBalance(assetIdA) + stakedAmountA)
205205
206206 let accountBalanceWithStakedB = (accountBalance(assetIdB) + stakedAmountB)
207207
208208 let hasEnoughBalance = if ((accountBalanceWithStakedA >= balanceA))
209209 then (accountBalanceWithStakedB >= balanceB)
210210 else false
211211
212212 func getAssetInfo (assetId) = match assetId {
213213 case id: ByteVector =>
214214 let stringId = toBase58String(id)
215215 let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
216216 $Tuple3(stringId, info.name, info.decimals)
217217 case waves: Unit =>
218218 $Tuple3("WAVES", "WAVES", 8)
219219 case _ =>
220220 throw("Match error")
221221 }
222222
223223
224224 func getAssetInfoFromString (assetStr) = if ((assetStr == "WAVES"))
225225 then $Tuple3("WAVES", "WAVES", 8)
226226 else {
227227 let stringId = assetStr
228228 let id = fromBase58String(assetStr)
229229 let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
230230 $Tuple3(stringId, info.name, info.decimals)
231231 }
232232
233233
234234 func suspend (cause) = [BooleanEntry(keyActive, false), StringEntry(keyCause, cause)]
235235
236236
237237 func calcStakingFuncAndAddres (stake,assetId) = if (stake)
238238 then if ((assetId == USDN))
239239 then $Tuple2("lockNeutrino", stakingUSDNNSBTAddress)
240240 else if ((assetId == NSBT))
241241 then $Tuple2("lockNsbt", stakingUSDNNSBTAddress)
242242 else $Tuple2("startStaking", stakingEURNAddress)
243243 else if ((assetId == USDN))
244244 then $Tuple2("unlockNeutrino", stakingUSDNNSBTAddress)
245245 else if ((assetId == NSBT))
246246 then $Tuple2("unlockNsbt", stakingUSDNNSBTAddress)
247247 else $Tuple2("stopStaking", stakingEURNAddress)
248248
249249
250250 func calcStakingParams (stake,amount,assetId) = if (stake)
251251 then {
252252 let $t069306996 = calcStakingFuncAndAddres(stake, assetId)
253253 let call = $t069306996._1
254254 let stakingAddr = $t069306996._2
255255 $Tuple4(call, stakingAddr, nil, [AttachedPayment(assetId, amount)])
256256 }
257257 else {
258258 let $t070827148 = calcStakingFuncAndAddres(stake, assetId)
259259 let call = $t070827148._1
260260 let stakingAddr = $t070827148._2
261261 $Tuple4(call, stakingAddr, [amount, toBase58String(assetId)], nil)
262262 }
263263
264264
265265 func throwInsufficientAvailableBalance (amount,available,assetName) = throw((((((((("Insufficient DApp balance to pay " + toString(amount)) + " ") + assetName) + " due to staking. Available: ") + toString(available)) + " ") + assetName) + ". Please contact support in Telegram: https://t.me/swopfisupport"))
266266
267267
268268 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"))
269269
270270
271271 func suspendSuspicious () = suspend(((((((((((((((("Suspicious state. Actual balances: " + toString(accountBalanceWithStakedA)) + " ") + assetNameA) + ", ") + toString(accountBalanceWithStakedB)) + " ") + assetNameB) + ". State: ") + toString(balanceA)) + " ") + assetNameA) + ", ") + toString(balanceB)) + " ") + assetNameB))
272272
273273
274274 @Callable(i)
275275 func init (firstHarvest) = {
276276 let $t083358412 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
277277 let pmtAmountA = $t083358412._1
278278 let pmtAssetIdA = $t083358412._2
279279 let $t084178494 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
280280 let pmtAmountB = $t084178494._1
281281 let pmtAssetIdB = $t084178494._2
282282 let $t084998576 = getAssetInfo(pmtAssetIdA)
283283 let pmtStrAssetIdA = $t084998576._1
284284 let pmtAssetNameA = $t084998576._2
285285 let pmtDecimalsA = $t084998576._3
286286 let $t085818658 = getAssetInfo(pmtAssetIdB)
287287 let pmtStrAssetIdB = $t085818658._1
288288 let pmtAssetNameB = $t085818658._2
289289 let pmtDecimalsB = $t085818658._3
290290 if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStaking], i.callerPublicKey)))
291291 then throw("Only admin can call this function")
292292 else if (isDefined(getBoolean(this, keyActive)))
293293 then throw("DApp is already active")
294294 else if ((pmtAssetIdA == pmtAssetIdB))
295295 then throw("Assets must be different")
296296 else {
297297 let shareName = ((("s" + take(pmtAssetNameA, 7)) + "_") + take(pmtAssetNameB, 7))
298298 let shareDescription = ((((("ShareToken of SwopFi protocol for " + pmtAssetNameA) + " and ") + pmtAssetNameB) + " at address ") + toString(this))
299299 let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
300300 let arg1 = pow(pmtAmountA, pmtDecimalsA, 5, 1, pmtDecimalsA, DOWN)
301301 let arg2 = pow(pmtAmountB, pmtDecimalsB, 5, 1, pmtDecimalsB, DOWN)
302302 let arg3 = pow(10, 0, shareDecimals, 0, 0, DOWN)
303303 let shareInitialSupply = fraction(arg1, arg2, arg3)
304304 let shareIssue = Issue(shareName, shareDescription, shareInitialSupply, shareDecimals, true)
305305 let shareIssueId = calculateAssetId(shareIssue)
306306 let stake1 = if (containsElement(stakingAssets, pmtStrAssetIdA))
307307 then invoke(this, "stakeUnstake", [true, pmtAmountA, pmtStrAssetIdA], nil)
308308 else 0
309309 if ((stake1 == stake1))
310310 then {
311311 let stake2 = if (containsElement(stakingAssets, pmtStrAssetIdB))
312312 then invoke(this, "stakeUnstake", [true, pmtAmountB, pmtStrAssetIdB], nil)
313313 else 0
314314 if ((stake2 == stake2))
315315 then {
316316 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)]
317317 if (firstHarvest)
318318 then (baseEntry ++ [BooleanEntry(keyFirstHarvest, firstHarvest), IntegerEntry(keyFirstHarvestHeight, (startHeight + (firstHarvestEndPeriod * periodLength)))])
319319 else baseEntry
320320 }
321321 else throw("Strict value is not equal to itself.")
322322 }
323323 else throw("Strict value is not equal to itself.")
324324 }
325325 }
326326
327327
328328
329329 @Callable(i)
330330 func initWithInitRatio (amtAssetA,amtAssetB,strAssetIdA,strAssetIdB,firstHarvest) = {
331331 let $t01124711334 = getAssetInfoFromString(strAssetIdA)
332332 let pmtStrAssetIdA = $t01124711334._1
333333 let pmtAssetNameA = $t01124711334._2
334334 let pmtDecimalsA = $t01124711334._3
335335 let $t01133911426 = getAssetInfoFromString(strAssetIdB)
336336 let pmtStrAssetIdB = $t01133911426._1
337337 let pmtAssetNameB = $t01133911426._2
338338 let pmtDecimalsB = $t01133911426._3
339339 if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStaking], i.callerPublicKey)))
340340 then throw("Only admin can call this function")
341341 else if (isDefined(getBoolean(this, keyActive)))
342342 then throw("DApp is already active")
343343 else if ((strAssetIdA == strAssetIdB))
344344 then throw("Assets must be different")
345345 else {
346346 let shareName = ((("s" + take(pmtAssetNameA, 7)) + "_") + take(pmtAssetNameB, 7))
347347 let shareDescription = ((((("ShareToken of SwopFi protocol for " + pmtAssetNameA) + " and ") + pmtAssetNameB) + " at address ") + toString(this))
348348 let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
349349 let shareInitialSupply = 0
350350 let shareIssue = Issue(shareName, shareDescription, shareInitialSupply, shareDecimals, true)
351351 let shareIssueId = calculateAssetId(shareIssue)
352352 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)]
353353 if (firstHarvest)
354354 then (baseEntry ++ [BooleanEntry(keyFirstHarvest, firstHarvest), IntegerEntry(keyFirstHarvestHeight, (startHeight + (firstHarvestEndPeriod * periodLength)))])
355355 else baseEntry
356356 }
357357 }
358358
359359
360360
361361 @Callable(i)
362362 func keepLimitForFirstHarvest (shareLimit) = if (!(isActive))
363363 then throw("DApp is inactive at this moment")
364364 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStaking], i.callerPublicKey)))
365365 then throw("Only admin can call this function")
366366 else [IntegerEntry(kShareLimit, shareLimit)]
367367
368368
369369
370370 @Callable(i)
371371 func replenishWithTwoTokens (slippageTolerance) = {
372372 let pmtAssetIdA = i.payments[0].assetId
373373 let pmtAssetIdB = i.payments[1].assetId
374374 let pmtAmountA = i.payments[0].amount
375375 let pmtAmountB = i.payments[1].amount
376376 let $t01392314000 = getAssetInfo(pmtAssetIdA)
377377 let pmtStrAssetIdA = $t01392314000._1
378378 let pmtAssetNameA = $t01392314000._2
379379 let pmtDecimalsA = $t01392314000._3
380380 let $t01400514082 = getAssetInfo(pmtAssetIdB)
381381 let pmtStrAssetIdB = $t01400514082._1
382382 let pmtAssetNameB = $t01400514082._2
383383 let pmtDecimalsB = $t01400514082._3
384384 if (if ((balanceA == 0))
385385 then (balanceB == 0)
386386 else false)
387387 then {
388388 let tokenRatio = fraction(fraction(assetInitA, scaleValue8, pmtAmountA), scaleValue3, fraction(assetInitB, scaleValue8, pmtAmountB))
389389 if ((pmtAssetIdA == pmtAssetIdB))
390390 then throw("Assets must be different")
391391 else {
392392 let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
393393 let shareInitialSupply = fraction(pow(pmtAmountA, pmtDecimalsA, 5, 1, pmtDecimalsA, DOWN), pow(pmtAmountB, pmtDecimalsB, 5, 1, pmtDecimalsB, DOWN), pow(10, 0, shareDecimals, 0, 0, DOWN))
394394 if (!(isActive))
395395 then throw("DApp is inactive at this moment")
396396 else if (if ((0 > slippageTolerance))
397397 then true
398398 else (slippageTolerance > slippageToleranceDelimiter))
399399 then throw(((("Slippage tolerance must be between 0 and " + toString(slippageToleranceDelimiter)) + " inclusively. Actual: ") + toString(slippageTolerance)))
400400 else if ((size(i.payments) != 2))
401401 then throw("Two attached assets expected")
402402 else if (if ((((scaleValue3 * (slippageToleranceDelimiter - slippageTolerance)) / slippageToleranceDelimiter) > tokenRatio))
403403 then true
404404 else (tokenRatio > ((scaleValue3 * (slippageToleranceDelimiter + slippageTolerance)) / slippageToleranceDelimiter)))
405405 then throw("Incorrect assets amount: amounts must have the contract ratio")
406406 else if (if ((pmtAssetIdA != assetIdA))
407407 then true
408408 else (pmtAssetIdB != assetIdB))
409409 then throw(((("Incorrect assets attached. Expected: " + strAssetIdA) + " and ") + strAssetIdB))
410410 else if ((shareInitialSupply == 0))
411411 then throw("Too small amount to replenish")
412412 else if (!(hasEnoughBalance))
413413 then ([ScriptTransfer(i.caller, pmtAmountA, pmtAssetIdA), ScriptTransfer(i.caller, pmtAmountB, pmtAssetIdB)] ++ suspendSuspicious())
414414 else {
415415 let stake1 = if (containsElement(stakingAssets, pmtStrAssetIdA))
416416 then invoke(this, "stakeUnstake", [true, pmtAmountA, pmtStrAssetIdA], nil)
417417 else 0
418418 if ((stake1 == stake1))
419419 then {
420420 let stake2 = if (containsElement(stakingAssets, pmtStrAssetIdB))
421421 then invoke(this, "stakeUnstake", [true, pmtAmountB, pmtStrAssetIdB], nil)
422422 else 0
423423 if ((stake2 == stake2))
424424 then [Reissue(shareAssetId, shareInitialSupply, true), IntegerEntry(keyBalanceA, pmtAmountA), IntegerEntry(keyBalanceB, pmtAmountB), IntegerEntry(keyShareAssetSupply, shareInitialSupply), ScriptTransfer(i.caller, shareInitialSupply, shareAssetId)]
425425 else throw("Strict value is not equal to itself.")
426426 }
427427 else throw("Strict value is not equal to itself.")
428428 }
429429 }
430430 }
431431 else {
432432 let tokenRatio = fraction(fraction(balanceA, scaleValue8, pmtAmountA), scaleValue3, fraction(balanceB, scaleValue8, pmtAmountB))
433433 let ratioShareTokensInA = fraction(pmtAmountA, scaleValue8, balanceA)
434434 let ratioShareTokensInB = fraction(pmtAmountB, scaleValue8, balanceB)
435435 let shareTokenToPayAmount = fraction(min([ratioShareTokensInA, ratioShareTokensInB]), shareAssetSupply, scaleValue8)
436436 if (!(isActive))
437437 then throw("DApp is inactive at this moment")
438438 else if (if ((0 > slippageTolerance))
439439 then true
440440 else (slippageTolerance > slippageToleranceDelimiter))
441441 then throw(((("Slippage tolerance must be between 0 and " + toString(slippageToleranceDelimiter)) + " inclusively. Actual: ") + toString(slippageTolerance)))
442442 else if ((size(i.payments) != 2))
443443 then throw("Two attached assets expected")
444444 else if (if ((pmtAssetIdA != assetIdA))
445445 then true
446446 else (pmtAssetIdB != assetIdB))
447447 then throw(((("Incorrect assets attached. Expected: " + strAssetIdA) + " and ") + strAssetIdB))
448448 else if (if ((((scaleValue3 * (slippageToleranceDelimiter - slippageTolerance)) / slippageToleranceDelimiter) > tokenRatio))
449449 then true
450450 else (tokenRatio > ((scaleValue3 * (slippageToleranceDelimiter + slippageTolerance)) / slippageToleranceDelimiter)))
451451 then throw("Incorrect assets amount: amounts must have the contract ratio")
452452 else if ((shareTokenToPayAmount == 0))
453453 then throw("Too small amount to replenish")
454454 else if (!(hasEnoughBalance))
455455 then ([ScriptTransfer(i.caller, pmtAmountA, pmtAssetIdA), ScriptTransfer(i.caller, pmtAmountB, pmtAssetIdB)] ++ suspendSuspicious())
456456 else {
457457 let stake1 = if (containsElement(stakingAssets, pmtStrAssetIdA))
458458 then invoke(this, "stakeUnstake", [true, pmtAmountA, pmtStrAssetIdA], nil)
459459 else 0
460460 if ((stake1 == stake1))
461461 then {
462462 let stake2 = if (containsElement(stakingAssets, pmtStrAssetIdB))
463463 then invoke(this, "stakeUnstake", [true, pmtAmountB, pmtStrAssetIdB], nil)
464464 else 0
465465 if ((stake2 == stake2))
466466 then [IntegerEntry(keyBalanceA, (balanceA + pmtAmountA)), IntegerEntry(keyBalanceB, (balanceB + pmtAmountB)), IntegerEntry(keyShareAssetSupply, (shareAssetSupply + shareTokenToPayAmount)), Reissue(shareAssetId, shareTokenToPayAmount, true), ScriptTransfer(i.caller, shareTokenToPayAmount, shareAssetId)]
467467 else throw("Strict value is not equal to itself.")
468468 }
469469 else throw("Strict value is not equal to itself.")
470470 }
471471 }
472472 }
473473
474474
475475
476476 @Callable(i)
477477 func withdraw () = {
478478 let $t01925119326 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
479479 let pmtAmount = $t01925119326._1
480480 let pmtAssetId = $t01925119326._2
481481 let amountToPayA = fraction(pmtAmount, balanceA, shareAssetSupply)
482482 let amountToPayB = fraction(pmtAmount, balanceB, shareAssetSupply)
483483 if (!(isActive))
484484 then throw("DApp is inactive at this moment")
485485 else if ((size(i.payments) != 1))
486486 then throw("One attached payment expected")
487487 else if ((pmtAssetId != shareAssetId))
488488 then throw(("Incorrect asset attached. Expected: " + toBase58String(shareAssetId)))
489489 else if (!(hasEnoughBalance))
490490 then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
491491 else if (if ((amountToPayA > availableBalanceA))
492492 then true
493493 else (amountToPayB > availableBalanceB))
494494 then throwInsufficientAvailableBalances(amountToPayA, amountToPayB)
495495 else {
496496 let stake1 = if (containsElement(stakingAssets, strAssetIdA))
497497 then invoke(this, "stakeUnstake", [false, amountToPayA, strAssetIdA], nil)
498498 else 0
499499 if ((stake1 == stake1))
500500 then {
501501 let stake2 = if (containsElement(stakingAssets, strAssetIdB))
502502 then invoke(this, "stakeUnstake", [false, amountToPayB, strAssetIdB], nil)
503503 else 0
504504 if ((stake2 == stake2))
505505 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)]
506506 else throw("Strict value is not equal to itself.")
507507 }
508508 else throw("Strict value is not equal to itself.")
509509 }
510510 }
511511
512512
513513
514514 @Callable(i)
515515 func exchange (minAmountToReceive) = {
516516 let $t02084120916 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
517517 let pmtAmount = $t02084120916._1
518518 let pmtAssetId = $t02084120916._2
519519 func calculateFees (tokenFrom,tokenTo) = {
520520 let amountWithoutFee = fraction(tokenTo, pmtAmount, (pmtAmount + tokenFrom))
521521 let amountWithFee = fraction(amountWithoutFee, (commissionScaleDelimiter - commission), commissionScaleDelimiter)
522522 let governanceReward = fraction(amountWithoutFee, commissionGovernance, commissionScaleDelimiter)
523523 if ((minAmountToReceive > amountWithFee))
524524 then throw(((("Calculated amount to receive " + toString(amountWithFee)) + " is less than specified minimum ") + toString(minAmountToReceive)))
525525 else $Tuple3(amountWithoutFee, amountWithFee, governanceReward)
526526 }
527527
528528 if (!(isActive))
529529 then throw("DApp is inactive at this moment")
530530 else if (if ((balanceA == 0))
531531 then true
532532 else (balanceB == 0))
533533 then throw("Can't exchange with zero balance")
534534 else if ((0 >= minAmountToReceive))
535535 then throw(("Minimal amount to receive must be positive. Actual: " + toString(minAmountToReceive)))
536536 else if ((size(i.payments) != 1))
537537 then throw("One attached payment expected")
538538 else if (!(hasEnoughBalance))
539539 then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
540540 else if ((pmtAssetId == assetIdA))
541541 then {
542542 let assetIdSend = assetIdB
543543 let $t02219022281 = calculateFees(balanceA, balanceB)
544544 let amountWithoutFee = $t02219022281._1
545545 let amountWithFee = $t02219022281._2
546546 let governanceReward = $t02219022281._3
547547 let newBalanceA = (balanceA + pmtAmount)
548548 let newBalanceB = ((balanceB - amountWithFee) - governanceReward)
549549 let stake1 = if (containsElement(stakingAssets, strAssetIdA))
550550 then invoke(this, "stakeUnstake", [true, pmtAmount, strAssetIdA], nil)
551551 else 0
552552 if ((stake1 == stake1))
553553 then {
554554 let stake2 = if (containsElement(stakingAssets, strAssetIdB))
555555 then invoke(this, "stakeUnstake", [false, (amountWithFee + governanceReward), strAssetIdB], nil)
556556 else 0
557557 if ((stake2 == stake2))
558558 then [IntegerEntry(keyBalanceA, newBalanceA), IntegerEntry(keyBalanceB, newBalanceB), ScriptTransfer(i.caller, amountWithFee, assetIdSend), ScriptTransfer(walletAddress, governanceReward, assetIdSend)]
559559 else throw("Strict value is not equal to itself.")
560560 }
561561 else throw("Strict value is not equal to itself.")
562562 }
563563 else if ((pmtAssetId == assetIdB))
564564 then {
565565 let assetIdSend = assetIdA
566566 let $t02323623327 = calculateFees(balanceB, balanceA)
567567 let amountWithoutFee = $t02323623327._1
568568 let amountWithFee = $t02323623327._2
569569 let governanceReward = $t02323623327._3
570570 let newBalanceA = ((balanceA - amountWithFee) - governanceReward)
571571 let newBalanceB = (balanceB + pmtAmount)
572572 if (if ((stakedAmountA >= newBalanceA))
573573 then true
574574 else (stakedAmountB >= newBalanceB))
575575 then throwInsufficientAvailableBalance(amountWithFee, availableBalanceA, assetNameA)
576576 else {
577577 let stake1 = if (containsElement(stakingAssets, strAssetIdA))
578578 then invoke(this, "stakeUnstake", [false, (amountWithFee + governanceReward), strAssetIdA], nil)
579579 else 0
580580 if ((stake1 == stake1))
581581 then {
582582 let stake2 = if (containsElement(stakingAssets, strAssetIdB))
583583 then invoke(this, "stakeUnstake", [true, pmtAmount, strAssetIdB], nil)
584584 else 0
585585 if ((stake2 == stake2))
586586 then [IntegerEntry(keyBalanceA, newBalanceA), IntegerEntry(keyBalanceB, newBalanceB), ScriptTransfer(i.caller, amountWithFee, assetIdSend), ScriptTransfer(walletAddress, governanceReward, assetIdSend)]
587587 else throw("Strict value is not equal to itself.")
588588 }
589589 else throw("Strict value is not equal to itself.")
590590 }
591591 }
592592 else throw(((("Incorrect asset attached. Expected: " + strAssetIdA) + " or ") + strAssetIdB))
593593 }
594594
595595
596596
597597 @Callable(i)
598598 func shutdown () = if (!(isActive))
599599 then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, keyCause), "the cause wasn't specified")))
600600 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStartStop], i.callerPublicKey)))
601601 then throw("Only admin can call this function")
602602 else suspend("Paused by admin")
603603
604604
605605
606606 @Callable(i)
607607 func activate () = if (isActive)
608608 then throw("DApp is already active")
609609 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStartStop], i.callerPublicKey)))
610610 then throw("Only admin can call this function")
611611 else [BooleanEntry(keyActive, true), DeleteEntry(keyCause)]
612612
613613
614614
615615 @Callable(i)
616616 func takeIntoAccountExtraFunds (amountLeave) = {
617617 let uncountableAmountEnrollAssetA = (accountBalanceWithStakedA - balanceA)
618618 let uncountableAmountEnrollAssetB = (accountBalanceWithStakedB - balanceB)
619619 let amountEnrollA = (uncountableAmountEnrollAssetA - (if ((assetIdA == unit))
620620 then amountLeave
621621 else 0))
622622 let amountEnrollB = (uncountableAmountEnrollAssetB - (if ((assetIdB == unit))
623623 then amountLeave
624624 else 0))
625625 if (!(isActive))
626626 then throw("DApp is inactive at this moment")
627627 else if ((i.caller != this))
628628 then throw("Only the DApp itself can call this function")
629629 else if ((0 > amountLeave))
630630 then throw(("Argument 'amountLeave' cannot be negative. Actual: " + toString(amountLeave)))
631631 else if (if ((0 > uncountableAmountEnrollAssetA))
632632 then true
633633 else (0 > uncountableAmountEnrollAssetB))
634634 then suspend("Enroll amount negative")
635635 else if (if ((0 > amountEnrollA))
636636 then true
637637 else (0 > amountEnrollB))
638638 then throw("Too large amountLeave")
639639 else {
640640 let stake1 = if (if (containsElement(stakingAssets, strAssetIdA))
641641 then (amountEnrollA > 0)
642642 else false)
643643 then invoke(this, "stakeUnstake", [true, amountEnrollA, strAssetIdA], nil)
644644 else 0
645645 if ((stake1 == stake1))
646646 then {
647647 let stake2 = if (if (containsElement(stakingAssets, strAssetIdB))
648648 then (amountEnrollB > 0)
649649 else false)
650650 then invoke(this, "stakeUnstake", [true, amountEnrollB, strAssetIdB], nil)
651651 else 0
652652 if ((stake2 == stake2))
653653 then [IntegerEntry(keyBalanceA, (balanceA + amountEnrollA)), IntegerEntry(keyBalanceB, (balanceB + amountEnrollB)), IntegerEntry(("last_income_" + strAssetIdA), amountEnrollA), IntegerEntry(("last_income_" + strAssetIdB), amountEnrollB)]
654654 else throw("Strict value is not equal to itself.")
655655 }
656656 else throw("Strict value is not equal to itself.")
657657 }
658658 }
659659
660660
661661
662662 @Callable(i)
663663 func stakeUnstake (stake,amount,assetIdString) = if ((i.caller != this))
664664 then throw("Only contract itself can invoke this function")
665665 else if ((assetIdString == "WAVES"))
666666 then {
667667 let pool = addressFromStringValue(valueOrErrorMessage(getString(oracle, keyLeasingPool), "No leasing pool in oracle"))
668668 let leasingId = getBinary(this, keyLeasingId)
669669 let leasingAmount = valueOrElse(getInteger(this, keyLeasingAmount), 0)
670670 let newLeaseAmount = if (stake)
671671 then (leasingAmount + amount)
672672 else (leasingAmount - amount)
673673 let newLease = Lease(pool, newLeaseAmount)
674674 let newLeaseId = calculateLeaseId(newLease)
675675 let baseEtry = [newLease, BinaryEntry(keyLeasingId, newLeaseId), IntegerEntry(keyLeasingAmount, newLeaseAmount)]
676676 match leasingId {
677677 case lId: ByteVector =>
678678 ([LeaseCancel(lId)] ++ baseEtry)
679679 case _ =>
680680 baseEtry
681681 }
682682 }
683683 else {
684684 let $t02793128034 = calcStakingParams(stake, amount, fromBase58String(assetIdString))
685685 let call = $t02793128034._1
686686 let addr = $t02793128034._2
687687 let params = $t02793128034._3
688688 let payments = $t02793128034._4
689689 let inv = invoke(addr, call, params, payments)
690- nil
690+ if ((inv == inv))
691+ then nil
692+ else throw("Strict value is not equal to itself.")
691693 }
692694
693695
694696
695697 @Callable(i)
696698 func stakeAll () = if (!(isActive))
697699 then throw("DApp is inactive at this moment")
698700 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStartStop], i.callerPublicKey)))
699701 then throw("Only admin can call this function")
700702 else {
701703 let stake1 = if (containsElement(stakingAssets, strAssetIdA))
702704 then {
703705 let amountA = (balanceA - stakedAmountA)
704706 if ((amountA > 0))
705707 then invoke(this, "stakeUnstake", [true, amountA, strAssetIdA], nil)
706708 else 0
707709 }
708710 else 0
709711 if ((stake1 == stake1))
710712 then {
711713 let stake2 = if (containsElement(stakingAssets, strAssetIdB))
712714 then {
713715 let amountB = (balanceB - stakedAmountB)
714716 if ((amountB > 0))
715717 then invoke(this, "stakeUnstake", [true, amountB, strAssetIdB], nil)
716718 else 0
717719 }
718720 else 0
719721 if ((stake2 == stake2))
720722 then nil
721723 else throw("Strict value is not equal to itself.")
722724 }
723725 else throw("Strict value is not equal to itself.")
724726 }
725727
726728
727729 @Verifier(tx)
728730 func verify () = {
729731 let multiSignedByAdmins = {
730732 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
731733 then 1
732734 else 0
733735 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
734736 then 1
735737 else 0
736738 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
737739 then 1
738740 else 0
739741 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
740742 }
741743 match tx {
742744 case inv: InvokeScriptTransaction =>
743745 let callTakeIntoAccount = if ((inv.dApp == this))
744746 then (inv.function == "takeIntoAccountExtraFunds")
745747 else false
746748 let exchangeToWaves = if (if (if ((inv.dApp == USDNToWavesExchanger))
747749 then (inv.function == "exchange")
748750 else false)
749751 then (assetIdA == USDN)
750752 else false)
751753 then true
752754 else if (if ((assetIdB == USDN))
753755 then (size(inv.payments) == 1)
754756 else false)
755757 then (inv.payments[0].assetId == USDN)
756758 else false
757759 let exchangeToNSBTs = if (if (if ((inv.dApp == USDNToNSBTExchanger))
758760 then (inv.function == "exchange")
759761 else false)
760762 then (assetIdA == NSBT)
761763 else false)
762764 then true
763765 else if (if ((assetIdB == NSBT))
764766 then (size(inv.payments) == 1)
765767 else false)
766768 then (inv.payments[0].assetId == USDN)
767769 else false
768770 let signedByAdmin = if (if (if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
769771 then true
770772 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey2))
771773 then true
772774 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey3))
773775 then true
774776 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKeyStaking)
775777 if (if (if (if (callTakeIntoAccount)
776778 then true
777779 else exchangeToWaves)
778780 then true
779781 else exchangeToNSBTs)
780782 then signedByAdmin
781783 else false)
782784 then true
783785 else multiSignedByAdmins
784786 case _ =>
785787 multiSignedByAdmins
786788 }
787789 }
788790

github/deemru/w8io/169f3d6 
95.27 ms