tx · 9N9ZqKs5z1unpKR3LC1mX1czcDNU8jCeD4BAX568wHXn

3Mq63YubY7UKJEobhDuXfsnXaPDJZT1fDhx:  -0.01400000 Waves

2021.12.29 20:02 [1855780] smart account 3Mq63YubY7UKJEobhDuXfsnXaPDJZT1fDhx > SELF 0.00000000 Waves

{ "type": 13, "id": "9N9ZqKs5z1unpKR3LC1mX1czcDNU8jCeD4BAX568wHXn", "fee": 1400000, "feeAssetId": null, "timestamp": 1640797330876, "version": 2, "chainId": 84, "sender": "3Mq63YubY7UKJEobhDuXfsnXaPDJZT1fDhx", "senderPublicKey": "HXfVyeXgXUtHD3uSP6yjsk6JQcTwmU9qQTvhXzFpPw2T", "proofs": [ "ed62VUWp1tZjamUbhMgLv4Z7tcwYkDRY2caPnJ61EzWBLRtz3U1jhj3WKUEwZUTCFWmsKMQydL623jpEZD3Nr6R", "2K9jmAjVpKdBE8xG7Bgr4sufD4QQdtSERJwnMAT9iEXfTJPUw8o1QwvCP48xPNMu59qnJg7BA64mEo8JF1T3BJfK" ], "script": "base64:AAIFAAAAAAAADsIIAhIDCgEEEgcKBQEBCAgEEgMKAQESAwoBARIAEgMKAQESABIAEgMKAQESBQoDBAEIEgAaFAoBQRIPa2V5QWRtaW5QdWJLZXkyGhQKAUISD2tleUFkbWluUHViS2V5MxoLCgFDEgZvcmFjbGUaEAoBRBILZ2V0QWRtaW5QdWIaEAoBRRILa2V5QWRtaW5QdWIaDAoBRhIHJG1hdGNoMBoLCgFHEgZzdHJpbmcaDAoBSBIHbm90aGluZxoRCgFJEgxhZG1pblB1YktleTEaEQoBShIMYWRtaW5QdWJLZXkyGhEKAUsSDGFkbWluUHViS2V5MxoZCgFMEhRhZG1pblB1YktleVN0YXJ0U3RvcBoXCgFNEhJhZG1pblB1YktleVN0YWtpbmcaEgoBThINd2FsbGV0QWRkcmVzcxoSCgFPEg12b3RpbmdBZGRyZXNzGgkKAVASBFVTRE4aCQoBURIETlNCVBoJCgFSEgRFVVJOGhIKAVMSDXN0YWtpbmdBc3NldHMaGwoBVBIWc3Rha2luZ1VTRE5OU0JUQWRkcmVzcxoXCgFVEhJzdGFraW5nRVVSTkFkZHJlc3MaGQoBVhIUVVNETlRvV2F2ZXNFeGNoYW5nZXIaGAoBVxITVVNETlRvTlNCVEV4Y2hhbmdlchoPCgFYEgpiYXNlUGVyaW9kGhAKAVkSC3N0YXJ0SGVpZ2h0GhEKAVoSDHBlcmlvZExlbmd0aBoMCgFhEgd2ZXJzaW9uGhMKAmFBEg1zdGFrZWRBbW91bnRBGhMKAmFCEg1zdGFrZWRBbW91bnRCGhAKAmFDEgphc3NldEluaXRBGhAKAmFEEgphc3NldEluaXRCGh8KAmFFEhlhY2NvdW50QmFsYW5jZVdpdGhTdGFrZWRBGh8KAmFGEhlhY2NvdW50QmFsYW5jZVdpdGhTdGFrZWRCGhYKAmFHEhBoYXNFbm91Z2hCYWxhbmNlGhIKAmFIEgxnZXRBc3NldEluZm8aDgoCYUkSCHN0cmluZ0lkGgoKAmFKEgRpbmZvGhwKAmFLEhZnZXRBc3NldEluZm9Gcm9tU3RyaW5nGg4KAmFMEghhc3NldFN0choNCgJhTRIHc3VzcGVuZBoLCgJhThIFY2F1c2UaHgoCYU8SGGNhbGNTdGFraW5nRnVuY0FuZEFkZHJlcxoLCgJhUBIFc3Rha2UaFwoCYVESEWNhbGNTdGFraW5nUGFyYW1zGgwKAmFSEgZhbW91bnQaEQoCYVMSCyR0MDY5MjE2OTg3GgoKAmFUEgRjYWxsGhEKAmFVEgtzdGFraW5nQWRkchoRCgJhVhILJHQwNzA3MzcxMzkaEwoCYVcSDWNhbGN1bGF0ZUZlZXMaDwoCYVgSCXBtdEFtb3VudBoYCgJhWRISbWluQW1vdW50VG9SZWNlaXZlGg8KAmFaEgl0b2tlbkZyb20aGwoCYWESFWZpcnN0SGFydmVzdEVuZFBlcmlvZBoMCgJhYhIGYWN0aXZlGhEKAmFjEgtzdHJBc3NldElkQRoRCgJhZBILc3RyQXNzZXRJZEIaDgoCYWUSCGFzc2V0SWRBGg4KAmFmEghhc3NldElkQhoQCgJhZxIKYXNzZXROYW1lQRoICgJhaBICaWQaCwoCYWkSBXdhdmVzGhAKAmFqEgphc3NldE5hbWVCGg4KAmFrEghiYWxhbmNlQRoOCgJhbBIIYmFsYW5jZUIaEgoCYW0SDHNoYXJlQXNzZXRJZBoWCgJhbhIQc2hhcmVBc3NldFN1cHBseRoQCgJhbxIKY29tbWlzc2lvbhoaCgJhcBIUY29tbWlzc2lvbkdvdmVybmFuY2UaHgoCYXESGGNvbW1pc3Npb25TY2FsZURlbGltaXRlchoRCgJhchILc2NhbGVWYWx1ZTMaEQoCYXMSC3NjYWxlVmFsdWU4GiAKAmF0EhpzbGlwcGFnZVRvbGVyYW5jZURlbGltaXRlchoUCgJhdRIOYWNjb3VudEJhbGFuY2UaDQoCYXYSB2Fzc2V0SWQaEgoCYXcSDHN0YWtlZEFtb3VudBocCgJheBIWc3Rha2VkQW1vdW50Q2FsY3VsYXRlZBoJCgJheRIDYUlkGgcKAmF6EgFpGg8KAWISCmtleVZlcnNpb24aCgoCYkESBGFyZzMaGAoCYkISEnNoYXJlSW5pdGlhbFN1cHBseRoQCgJiQxIKc2hhcmVJc3N1ZRoSCgJiRBIMc2hhcmVJc3N1ZUlkGgwKAmJFEgZzdGFrZTEaDAoCYkYSBnN0YWtlMhoPCgJiRxIJYmFzZUVudHJ5Gg8KAmJIEglhbXRBc3NldEEaDwoCYkkSCWFtdEFzc2V0QhoTCgJiShINJHQwMTEyMjExMTMwOBoTCgJiSxINJHQwMTEzMTMxMTQwMBoQCgJiTBIKc2hhcmVMaW1pdBoXCgJiTRIRc2xpcHBhZ2VUb2xlcmFuY2UaEwoCYk4SDSR0MDEzODY4MTM5NDUaEwoCYk8SDSR0MDEzOTUwMTQwMjcaDAoCYlASBmluaXRhbBoQCgJiURIKdG9rZW5SYXRpbxobCgJiUhIVc2hhcmVUb2tlblRvUGF5QW1vdW50GhMKAmJTEg0kdDAxNjc5MzE2ODY4GhAKAmJUEgpwbXRBc3NldElkGhIKAmJVEgxhbW91bnRUb1BheUEaEgoCYlYSDGFtb3VudFRvUGF5QhoTCgJiVxINJHQwMTgxNzQxODI0ORoRCgJiWBILYXNzZXRJZFNlbmQaEwoCYlkSDSR0MDE4ODA0MTg5MjYaEQoCYloSC25ld0JhbGFuY2VBGg0KAmJhEgd0b2tlblRvGhYKAmJiEhBhbW91bnRXaXRob3V0RmVlGhMKAmJjEg1hbW91bnRXaXRoRmVlGhYKAmJkEhBnb3Zlcm5hbmNlUmV3YXJkGhcKAmJlEhFzdXNwZW5kU3VzcGljaW91cxoOCgJiZhIIaXNBY3RpdmUaEgoCYmcSDGZpcnN0SGFydmVzdBoRCgJiaBILJHQwODMwOTgzODYaEAoCYmkSCnBtdEFtb3VudEEaEQoCYmoSC3BtdEFzc2V0SWRBGhEKAmJrEgskdDA4MzkxODQ2OBoQCgJibBIKcG10QW1vdW50QhoRCgJibRILcG10QXNzZXRJZEIaEQoCYm4SCyR0MDg0NzM4NTUwGhQKAmJvEg5wbXRTdHJBc3NldElkQRoTCgJicBINcG10QXNzZXROYW1lQRoSCgJicRIMcG10RGVjaW1hbHNBGhEKAmJyEgskdDA4NTU1ODYzMhoUCgJicxIOcG10U3RyQXNzZXRJZEIaEwoCYnQSDXBtdEFzc2V0TmFtZUIaEgoCYnUSDHBtdERlY2ltYWxzQhoPCgJidhIJc2hhcmVOYW1lGhYKAmJ3EhBzaGFyZURlc2NyaXB0aW9uGhMKAmJ4Eg1zaGFyZURlY2ltYWxzGgoKAmJ5EgRhcmcxGgoKAmJ6EgRhcmcyGg4KAWMSCWtleUFjdGl2ZRoYCgJjQRISYWRtaW5QdWJLZXkxU2lnbmVkGhgKAmNCEhJhZG1pblB1YktleTJTaWduZWQaGAoCY0MSEmFkbWluUHViS2V5M1NpZ25lZBoZCgJjRBITY2FsbFRha2VJbnRvQWNjb3VudBoVCgJjRRIPZXhjaGFuZ2VUb1dhdmVzGhUKAmNGEg9leGNoYW5nZVRvTlNCVHMaEwoCY0cSDXNpZ25lZEJ5QWRtaW4aEQoCY2ESC25ld0JhbGFuY2VCGhMKAmNiEg0kdDAxOTg4MTIwMDAzGhEKAmNjEgthbW91bnRMZWF2ZRojCgJjZBIddW5jb3VudGFibGVBbW91bnRFbnJvbGxBc3NldEEaIwoCY2USHXVuY291bnRhYmxlQW1vdW50RW5yb2xsQXNzZXRCGhMKAmNmEg1hbW91bnRFbnJvbGxBGhMKAmNnEg1hbW91bnRFbnJvbGxCGhMKAmNoEg1hc3NldElkU3RyaW5nGgoKAmNpEgRwb29sGg8KAmNqEglsZWFzaW5nSWQaEwoCY2sSDWxlYXNpbmdBbW91bnQaFAoCY2wSDm5ld0xlYXNlQW1vdW50Gg4KAmNtEghuZXdMZWFzZRoQCgJjbhIKbmV3TGVhc2VJZBoOCgJjbxIIYmFzZUV0cnkaCQoCY3ASA2xJZBoTCgJjcRINJHQwMjQxNTEyNDI1NBoKCgJjchIEYWRkchoMCgJjcxIGcGFyYW1zGg4KAmN0EghwYXltZW50cxoJCgJjdRIDaW52Gg0KAmN2EgdhbW91bnRBGg0KAmN3EgdhbW91bnRCGggKAmN4EgJ0eBoMCgJjeRIGdmVyaWZ5GhkKAmN6EhNtdWx0aVNpZ25lZEJ5QWRtaW5zGhAKAWQSC2tleUFzc2V0SWRBGhAKAWUSC2tleUFzc2V0SWRCGhAKAWYSC2tleUJhbGFuY2VBGhAKAWcSC2tleUJhbGFuY2VCGhQKAWgSD2tleUJhbGFuY2VJbml0QRoUCgFpEg9rZXlCYWxhbmNlSW5pdEIaFAoBahIPa2V5U2hhcmVBc3NldElkGhgKAWsSE2tleVNoYXJlQXNzZXRTdXBwbHkaEgoBbBINa2V5Q29tbWlzc2lvbhogCgFtEhtrZXlDb21taXNzaW9uU2NhbGVEZWxpbWl0ZXIaDQoBbhIIa2V5Q2F1c2UaFAoBbxIPa2V5Rmlyc3RIYXJ2ZXN0GhoKAXASFWtleUZpcnN0SGFydmVzdEhlaWdodBoQCgFxEgtrU2hhcmVMaW1pdBoQCgFyEgtrQmFzZVBlcmlvZBoSCgFzEg1rUGVyaW9kTGVuZ3RoGhEKAXQSDGtTdGFydEhlaWdodBoXCgF1EhJrZXlVU0ROTlNCVEFkZHJlc3MaEwoBdhIOa2V5RVVSTkFkZHJlc3MaEwoBdxIOa2V5TGVhc2luZ1Bvb2waFQoBeBIQa2V5TGVhc2luZ0Ftb3VudBoRCgF5EgxrZXlMZWFzaW5nSWQaFAoBehIPa2V5QWRtaW5QdWJLZXkxAAAAUwAAAAABYQIAAAAFMS4wLjAAAAAAAWICAAAAB3ZlcnNpb24AAAAAAWMCAAAABmFjdGl2ZQAAAAABZAIAAAAKQV9hc3NldF9pZAAAAAABZQIAAAAKQl9hc3NldF9pZAAAAAABZgIAAAAPQV9hc3NldF9iYWxhbmNlAAAAAAFnAgAAAA9CX2Fzc2V0X2JhbGFuY2UAAAAAAWgCAAAADEFfYXNzZXRfaW5pdAAAAAABaQIAAAAMQl9hc3NldF9pbml0AAAAAAFqAgAAAA5zaGFyZV9hc3NldF9pZAAAAAABawIAAAASc2hhcmVfYXNzZXRfc3VwcGx5AAAAAAFsAgAAAApjb21taXNzaW9uAAAAAAFtAgAAABpjb21taXNzaW9uX3NjYWxlX2RlbGltaXRlcgAAAAABbgIAAAAOc2h1dGRvd25fY2F1c2UAAAAAAW8CAAAADWZpcnN0X2hhcnZlc3QAAAAAAXACAAAAFGZpcnN0X2hhcnZlc3RfaGVpZ2h0AAAAAAFxAgAAABxzaGFyZV9saW1pdF9vbl9maXJzdF9oYXJ2ZXN0AAAAAAFyAgAAAAtiYXNlX3BlcmlvZAAAAAABcwIAAAANcGVyaW9kX2xlbmd0aAAAAAABdAIAAAAMc3RhcnRfaGVpZ2h0AAAAAAF1AgAAABhzdGFraW5nX3VzZG5uc2J0X2FkZHJlc3MAAAAAAXYCAAAAFHN0YWtpbmdfZXVybl9hZGRyZXNzAAAAAAF3AgAAAA9sZWFzaW5nX2FkZHJlc3MAAAAAAXgCAAAADmxlYXNpbmdfYW1vdW50AAAAAAF5AgAAAApsZWFzaW5nX2lkAAAAAAF6AgAAAAthZG1pbl9wdWJfMQAAAAABQQIAAAALYWRtaW5fcHViXzIAAAAAAUICAAAAC2FkbWluX3B1Yl8zAAAAAAFDCQEAAAAH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", "height": 1855780, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 3RohkzdFAr8vMGFcNWgmXdQa4A8v3dQFsJqi1dSxVkir Next: none Diff:
OldNewDifferences
4040 let kPeriodLength = "period_length"
4141
4242 let kStartHeight = "start_height"
43-
44-let kFirstHarvestHeight = "first_harvest_height"
4543
4644 let keyUSDNNSBTAddress = "staking_usdnnsbt_address"
4745
8684 let USDN = base58'8UrfDVd5GreeUwm7uPk7eYz1eMv376kzR52C6sANPkwS'
8785
8886 let NSBT = base58'36mg8NZTaFRDygiVwb8uBnLR51hetJruUCZcxhaVcHj9'
89-
90-let SWOP = base58'2HAJrwa8q4SxBx9cHYaBTQdBjdk5wwqdof7ccpAx2uhZ'
9187
9288 let EURN = base58'ECBCkHS68DckpBrzLeoRgYbFg7sCVqR176mPqbXsj9pA'
9389
161157
162158 let slippageToleranceDelimiter = 1000
163159
164-let scaleValue8Digits = 8
165-
166160 func accountBalance (assetId) = match assetId {
167161 case id: ByteVector =>
168162 assetBalance(this, id)
204198 let assetInitA = getIntegerValue(this, keyBalanceInitA)
205199
206200 let assetInitB = getIntegerValue(this, keyBalanceInitB)
207-
208-let availableBalanceA = (balanceA - stakedAmountA)
209-
210-let availableBalanceB = (balanceB - stakedAmountB)
211201
212202 let accountBalanceWithStakedA = (accountBalance(assetIdA) + stakedAmountA)
213203
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"
43-
44-let kFirstHarvestHeight = "first_harvest_height"
4543
4644 let keyUSDNNSBTAddress = "staking_usdnnsbt_address"
4745
4846 let keyEURNAddress = "staking_eurn_address"
4947
5048 let keyLeasingPool = "leasing_address"
5149
5250 let keyLeasingAmount = "leasing_amount"
5351
5452 let keyLeasingId = "leasing_id"
5553
5654 let keyAdminPubKey1 = "admin_pub_1"
5755
5856 let keyAdminPubKey2 = "admin_pub_2"
5957
6058 let keyAdminPubKey3 = "admin_pub_3"
6159
6260 let oracle = Address(base58'3NBBWfzZtZtszaXbitTKnrB2xXwv26Bn7H9')
6361
6462 func getAdminPub (keyAdminPub) = match getString(oracle, keyAdminPub) {
6563 case string: String =>
6664 fromBase58String(string)
6765 case nothing =>
6866 throw("Admin public key is empty")
6967 }
7068
7169
7270 let adminPubKey1 = getAdminPub(keyAdminPubKey1)
7371
7472 let adminPubKey2 = getAdminPub(keyAdminPubKey2)
7573
7674 let adminPubKey3 = getAdminPub(keyAdminPubKey3)
7775
7876 let adminPubKeyStartStop = base58'Kn7NpzaG12dLZgcHf2ipUftU6hbJygmrhFqQYE4B7ZK'
7977
8078 let adminPubKeyStaking = base58'Kn7NpzaG12dLZgcHf2ipUftU6hbJygmrhFqQYE4B7ZK'
8179
8280 let walletAddress = Address(base58'3NAGTtZz6WpupSN89NZD5rMZwwziZEg4Kx4')
8381
8482 let votingAddress = Address(base58'3MrJgdL1GniipErHy44YF9idzLaUL2iX5DQ')
8583
8684 let USDN = base58'8UrfDVd5GreeUwm7uPk7eYz1eMv376kzR52C6sANPkwS'
8785
8886 let NSBT = base58'36mg8NZTaFRDygiVwb8uBnLR51hetJruUCZcxhaVcHj9'
89-
90-let SWOP = base58'2HAJrwa8q4SxBx9cHYaBTQdBjdk5wwqdof7ccpAx2uhZ'
9187
9288 let EURN = base58'ECBCkHS68DckpBrzLeoRgYbFg7sCVqR176mPqbXsj9pA'
9389
9490 let stakingAssets = ["WAVES", toBase58String(USDN), toBase58String(NSBT), toBase58String(EURN)]
9591
9692 let stakingUSDNNSBTAddress = Address(fromBase58String(valueOrErrorMessage(getString(oracle, keyUSDNNSBTAddress), "no usdn staking address")))
9793
9894 let stakingEURNAddress = Address(fromBase58String(valueOrErrorMessage(getString(oracle, keyEURNAddress), "no usdn staking address")))
9995
10096 let USDNToWavesExchanger = Address(base58'3N8PGkzXhbtTvEwEQTtE2xiTJmsDEQ9XfoZ')
10197
10298 let USDNToNSBTExchanger = Address(base58'3MqW1t2cxdYy2emEMk3YtZkRwQPhHaTfWRe')
10399
104100 let basePeriod = valueOrErrorMessage(getInteger(votingAddress, kBasePeriod), "Empty kBasePeriod")
105101
106102 let startHeight = valueOrErrorMessage(getInteger(votingAddress, kStartHeight), "Empty kStartHeight")
107103
108104 let periodLength = valueOrErrorMessage(getInteger(votingAddress, kPeriodLength), "Empty kPeriodLength")
109105
110106 let firstHarvestEndPeriod = ((basePeriod + ((height - startHeight) / periodLength)) + 3)
111107
112108 let active = getBooleanValue(this, keyActive)
113109
114110 let strAssetIdA = getStringValue(this, keyAssetIdA)
115111
116112 let strAssetIdB = getStringValue(this, keyAssetIdB)
117113
118114 let assetIdA = if ((strAssetIdA == "WAVES"))
119115 then unit
120116 else fromBase58String(strAssetIdA)
121117
122118 let assetIdB = if ((strAssetIdB == "WAVES"))
123119 then unit
124120 else fromBase58String(strAssetIdB)
125121
126122 let assetNameA = match assetIdA {
127123 case id: ByteVector =>
128124 value(assetInfo(id)).name
129125 case waves: Unit =>
130126 "WAVES"
131127 case _ =>
132128 throw("Match error")
133129 }
134130
135131 let assetNameB = match assetIdB {
136132 case id: ByteVector =>
137133 value(assetInfo(id)).name
138134 case waves: Unit =>
139135 "WAVES"
140136 case _ =>
141137 throw("Match error")
142138 }
143139
144140 let balanceA = getIntegerValue(this, keyBalanceA)
145141
146142 let balanceB = getIntegerValue(this, keyBalanceB)
147143
148144 let shareAssetId = fromBase58String(getStringValue(this, keyShareAssetId))
149145
150146 let shareAssetSupply = getIntegerValue(this, keyShareAssetSupply)
151147
152148 let commission = 3000
153149
154150 let commissionGovernance = 1200
155151
156152 let commissionScaleDelimiter = 1000000
157153
158154 let scaleValue3 = 1000
159155
160156 let scaleValue8 = 100000000
161157
162158 let slippageToleranceDelimiter = 1000
163159
164-let scaleValue8Digits = 8
165-
166160 func accountBalance (assetId) = match assetId {
167161 case id: ByteVector =>
168162 assetBalance(this, id)
169163 case waves: Unit =>
170164 wavesBalance(this).available
171165 case _ =>
172166 throw("Match error")
173167 }
174168
175169
176170 func stakedAmount (assetId) = {
177171 let stakedAmountCalculated = match assetId {
178172 case aId: ByteVector =>
179173 if (if ((aId == USDN))
180174 then true
181175 else (aId == NSBT))
182176 then getInteger(stakingUSDNNSBTAddress, ((("rpd_balance_" + toBase58String(aId)) + "_") + toString(this)))
183177 else if ((aId == EURN))
184178 then getInteger(stakingEURNAddress, ((("%s%s%s__stakingBalance__" + toBase58String(aId)) + "__") + toString(this)))
185179 else 0
186180 case _: Unit =>
187181 valueOrElse(getInteger(this, keyLeasingAmount), 0)
188182 case _ =>
189183 throw("Match error")
190184 }
191185 match stakedAmountCalculated {
192186 case i: Int =>
193187 i
194188 case _ =>
195189 0
196190 }
197191 }
198192
199193
200194 let stakedAmountA = stakedAmount(assetIdA)
201195
202196 let stakedAmountB = stakedAmount(assetIdB)
203197
204198 let assetInitA = getIntegerValue(this, keyBalanceInitA)
205199
206200 let assetInitB = getIntegerValue(this, keyBalanceInitB)
207-
208-let availableBalanceA = (balanceA - stakedAmountA)
209-
210-let availableBalanceB = (balanceB - stakedAmountB)
211201
212202 let accountBalanceWithStakedA = (accountBalance(assetIdA) + stakedAmountA)
213203
214204 let accountBalanceWithStakedB = (accountBalance(assetIdB) + stakedAmountB)
215205
216206 let hasEnoughBalance = if ((accountBalanceWithStakedA >= balanceA))
217207 then (accountBalanceWithStakedB >= balanceB)
218208 else false
219209
220210 func getAssetInfo (assetId) = match assetId {
221211 case id: ByteVector =>
222212 let stringId = toBase58String(id)
223213 let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
224214 $Tuple3(stringId, info.name, info.decimals)
225215 case waves: Unit =>
226216 $Tuple3("WAVES", "WAVES", 8)
227217 case _ =>
228218 throw("Match error")
229219 }
230220
231221
232222 func getAssetInfoFromString (assetStr) = if ((assetStr == "WAVES"))
233223 then $Tuple3("WAVES", "WAVES", 8)
234224 else {
235225 let stringId = assetStr
236226 let id = fromBase58String(assetStr)
237227 let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
238228 $Tuple3(stringId, info.name, info.decimals)
239229 }
240230
241231
242232 func suspend (cause) = [BooleanEntry(keyActive, false), StringEntry(keyCause, cause)]
243233
244234
245235 func calcStakingFuncAndAddres (stake,assetId) = if (stake)
246236 then if ((assetId == USDN))
247237 then $Tuple2("lockNeutrino", stakingUSDNNSBTAddress)
248238 else if ((assetId == NSBT))
249239 then $Tuple2("lockNsbt", stakingUSDNNSBTAddress)
250240 else $Tuple2("startStaking", stakingEURNAddress)
251241 else if ((assetId == USDN))
252242 then $Tuple2("unlockNeutrino", stakingUSDNNSBTAddress)
253243 else if ((assetId == NSBT))
254244 then $Tuple2("unlockNsbt", stakingUSDNNSBTAddress)
255245 else $Tuple2("stopStaking", stakingEURNAddress)
256246
257247
258248 func calcStakingParams (stake,amount,assetId) = if (stake)
259249 then {
260250 let $t069216987 = calcStakingFuncAndAddres(stake, assetId)
261251 let call = $t069216987._1
262252 let stakingAddr = $t069216987._2
263253 $Tuple4(call, stakingAddr, nil, [AttachedPayment(assetId, amount)])
264254 }
265255 else {
266256 let $t070737139 = calcStakingFuncAndAddres(stake, assetId)
267257 let call = $t070737139._1
268258 let stakingAddr = $t070737139._2
269259 $Tuple4(call, stakingAddr, [amount, toBase58String(assetId)], nil)
270260 }
271261
272262
273263 func calculateFees (pmtAmount,minAmountToReceive,tokenFrom,tokenTo) = {
274264 let amountWithoutFee = fraction(tokenTo, pmtAmount, (pmtAmount + tokenFrom))
275265 let amountWithFee = fraction(amountWithoutFee, (commissionScaleDelimiter - commission), commissionScaleDelimiter)
276266 let governanceReward = fraction(amountWithoutFee, commissionGovernance, commissionScaleDelimiter)
277267 if ((minAmountToReceive > amountWithFee))
278268 then throw(((("Calculated amount to receive " + toString(amountWithFee)) + " is less than specified minimum ") + toString(minAmountToReceive)))
279269 else $Tuple3(amountWithoutFee, amountWithFee, governanceReward)
280270 }
281271
282272
283273 func suspendSuspicious () = suspend(((((((((((((((("Suspicious state. Actual balances: " + toString(accountBalanceWithStakedA)) + " ") + assetNameA) + ", ") + toString(accountBalanceWithStakedB)) + " ") + assetNameB) + ". State: ") + toString(balanceA)) + " ") + assetNameA) + ", ") + toString(balanceB)) + " ") + assetNameB))
284274
285275
286276 func isActive () = if (active)
287277 then unit
288278 else throw("DApp is inactive at this moment")
289279
290280
291281 @Callable(i)
292282 func init (firstHarvest) = {
293283 let $t083098386 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
294284 let pmtAmountA = $t083098386._1
295285 let pmtAssetIdA = $t083098386._2
296286 let $t083918468 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
297287 let pmtAmountB = $t083918468._1
298288 let pmtAssetIdB = $t083918468._2
299289 let $t084738550 = getAssetInfo(pmtAssetIdA)
300290 let pmtStrAssetIdA = $t084738550._1
301291 let pmtAssetNameA = $t084738550._2
302292 let pmtDecimalsA = $t084738550._3
303293 let $t085558632 = getAssetInfo(pmtAssetIdB)
304294 let pmtStrAssetIdB = $t085558632._1
305295 let pmtAssetNameB = $t085558632._2
306296 let pmtDecimalsB = $t085558632._3
307297 if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStaking], i.callerPublicKey)))
308298 then throw("Only admin can call this function")
309299 else if (isDefined(getBoolean(this, keyActive)))
310300 then throw("DApp is already active")
311301 else if ((pmtAssetIdA == pmtAssetIdB))
312302 then throw("Assets must be different")
313303 else {
314304 let shareName = ((("s" + take(pmtAssetNameA, 7)) + "_") + take(pmtAssetNameB, 7))
315305 let shareDescription = ((((("ShareToken of SwopFi protocol for " + pmtAssetNameA) + " and ") + pmtAssetNameB) + " at address ") + toString(this))
316306 let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
317307 let arg1 = pow(pmtAmountA, pmtDecimalsA, 5, 1, pmtDecimalsA, DOWN)
318308 let arg2 = pow(pmtAmountB, pmtDecimalsB, 5, 1, pmtDecimalsB, DOWN)
319309 let arg3 = pow(10, 0, shareDecimals, 0, 0, DOWN)
320310 let shareInitialSupply = fraction(arg1, arg2, arg3)
321311 let shareIssue = Issue(shareName, shareDescription, shareInitialSupply, shareDecimals, true)
322312 let shareIssueId = calculateAssetId(shareIssue)
323313 let stake1 = if (containsElement(stakingAssets, pmtStrAssetIdA))
324314 then invoke(this, "stakeUnstake", [true, pmtAmountA, pmtStrAssetIdA], nil)
325315 else 0
326316 if ((stake1 == stake1))
327317 then {
328318 let stake2 = if (containsElement(stakingAssets, pmtStrAssetIdB))
329319 then invoke(this, "stakeUnstake", [true, pmtAmountB, pmtStrAssetIdB], nil)
330320 else 0
331321 if ((stake2 == stake2))
332322 then {
333323 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)]
334324 if (firstHarvest)
335325 then (baseEntry ++ [BooleanEntry(keyFirstHarvest, firstHarvest), IntegerEntry(keyFirstHarvestHeight, (startHeight + (firstHarvestEndPeriod * periodLength)))])
336326 else baseEntry
337327 }
338328 else throw("Strict value is not equal to itself.")
339329 }
340330 else throw("Strict value is not equal to itself.")
341331 }
342332 }
343333
344334
345335
346336 @Callable(i)
347337 func initWithInitRatio (amtAssetA,amtAssetB,strAssetIdA,strAssetIdB,firstHarvest) = {
348338 let $t01122111308 = getAssetInfoFromString(strAssetIdA)
349339 let pmtStrAssetIdA = $t01122111308._1
350340 let pmtAssetNameA = $t01122111308._2
351341 let pmtDecimalsA = $t01122111308._3
352342 let $t01131311400 = getAssetInfoFromString(strAssetIdB)
353343 let pmtStrAssetIdB = $t01131311400._1
354344 let pmtAssetNameB = $t01131311400._2
355345 let pmtDecimalsB = $t01131311400._3
356346 if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStaking], i.callerPublicKey)))
357347 then throw("Only admin can call this function")
358348 else if (isDefined(getBoolean(this, keyActive)))
359349 then throw("DApp is already active")
360350 else if ((strAssetIdA == strAssetIdB))
361351 then throw("Assets must be different")
362352 else {
363353 let shareName = ((("s" + take(pmtAssetNameA, 7)) + "_") + take(pmtAssetNameB, 7))
364354 let shareDescription = ((((("ShareToken of SwopFi protocol for " + pmtAssetNameA) + " and ") + pmtAssetNameB) + " at address ") + toString(this))
365355 let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
366356 let shareInitialSupply = 0
367357 let shareIssue = Issue(shareName, shareDescription, shareInitialSupply, shareDecimals, true)
368358 let shareIssueId = calculateAssetId(shareIssue)
369359 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)]
370360 if (firstHarvest)
371361 then (baseEntry ++ [BooleanEntry(keyFirstHarvest, firstHarvest), IntegerEntry(keyFirstHarvestHeight, (startHeight + (firstHarvestEndPeriod * periodLength)))])
372362 else baseEntry
373363 }
374364 }
375365
376366
377367
378368 @Callable(i)
379369 func keepLimitForFirstHarvest (shareLimit) = valueOrElse(isActive(), if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStaking], i.callerPublicKey)))
380370 then throw("Only admin can call this function")
381371 else [IntegerEntry(kShareLimit, shareLimit)])
382372
383373
384374
385375 @Callable(i)
386376 func replenishWithTwoTokens (slippageTolerance) = valueOrElse(isActive(), {
387377 let pmtAssetIdA = i.payments[0].assetId
388378 let pmtAssetIdB = i.payments[1].assetId
389379 let pmtAmountA = i.payments[0].amount
390380 let pmtAmountB = i.payments[1].amount
391381 let $t01386813945 = getAssetInfo(pmtAssetIdA)
392382 let pmtStrAssetIdA = $t01386813945._1
393383 let pmtAssetNameA = $t01386813945._2
394384 let pmtDecimalsA = $t01386813945._3
395385 let $t01395014027 = getAssetInfo(pmtAssetIdB)
396386 let pmtStrAssetIdB = $t01395014027._1
397387 let pmtAssetNameB = $t01395014027._2
398388 let pmtDecimalsB = $t01395014027._3
399389 let inital = if (if ((balanceA == 0))
400390 then (balanceB == 0)
401391 else false)
402392 then true
403393 else false
404394 let tokenRatio = if (inital)
405395 then fraction(fraction(assetInitA, scaleValue8, pmtAmountA), scaleValue3, fraction(assetInitB, scaleValue8, pmtAmountB))
406396 else fraction(fraction(balanceA, scaleValue8, pmtAmountA), scaleValue3, fraction(balanceB, scaleValue8, pmtAmountB))
407397 let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
408398 let shareTokenToPayAmount = if (inital)
409399 then fraction(pow(pmtAmountA, pmtDecimalsA, 5, 1, pmtDecimalsA, DOWN), pow(pmtAmountB, pmtDecimalsB, 5, 1, pmtDecimalsB, DOWN), pow(10, 0, shareDecimals, 0, 0, DOWN))
410400 else fraction(min([fraction(pmtAmountA, scaleValue8, balanceA), fraction(pmtAmountB, scaleValue8, balanceB)]), shareAssetSupply, scaleValue8)
411401 if (if ((0 > slippageTolerance))
412402 then true
413403 else (slippageTolerance > slippageToleranceDelimiter))
414404 then throw(((("Slippage tolerance must be between 0 and " + toString(slippageToleranceDelimiter)) + " inclusively. Actual: ") + toString(slippageTolerance)))
415405 else if ((size(i.payments) != 2))
416406 then throw("Two attached assets expected")
417407 else if (if ((pmtAssetIdA != assetIdA))
418408 then true
419409 else (pmtAssetIdB != assetIdB))
420410 then throw(((("Incorrect assets attached. Expected: " + strAssetIdA) + " and ") + strAssetIdB))
421411 else if (if ((((scaleValue3 * (slippageToleranceDelimiter - slippageTolerance)) / slippageToleranceDelimiter) > tokenRatio))
422412 then true
423413 else (tokenRatio > ((scaleValue3 * (slippageToleranceDelimiter + slippageTolerance)) / slippageToleranceDelimiter)))
424414 then throw("Incorrect assets amount: amounts must have the contract ratio")
425415 else if ((shareTokenToPayAmount == 0))
426416 then throw("Too small amount to replenish")
427417 else if (!(hasEnoughBalance))
428418 then ([ScriptTransfer(i.caller, pmtAmountA, pmtAssetIdA), ScriptTransfer(i.caller, pmtAmountB, pmtAssetIdB)] ++ suspendSuspicious())
429419 else {
430420 let stake1 = if (containsElement(stakingAssets, pmtStrAssetIdA))
431421 then invoke(this, "stakeUnstake", [true, pmtAmountA, pmtStrAssetIdA], nil)
432422 else 0
433423 if ((stake1 == stake1))
434424 then {
435425 let stake2 = if (containsElement(stakingAssets, pmtStrAssetIdB))
436426 then invoke(this, "stakeUnstake", [true, pmtAmountB, pmtStrAssetIdB], nil)
437427 else 0
438428 if ((stake2 == stake2))
439429 then [Reissue(shareAssetId, shareTokenToPayAmount, true), IntegerEntry(keyBalanceA, pmtAmountA), IntegerEntry(keyBalanceB, pmtAmountB), IntegerEntry(keyShareAssetSupply, shareTokenToPayAmount), ScriptTransfer(i.caller, shareTokenToPayAmount, shareAssetId)]
440430 else throw("Strict value is not equal to itself.")
441431 }
442432 else throw("Strict value is not equal to itself.")
443433 }
444434 })
445435
446436
447437
448438 @Callable(i)
449439 func withdraw () = valueOrElse(isActive(), {
450440 let $t01679316868 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
451441 let pmtAmount = $t01679316868._1
452442 let pmtAssetId = $t01679316868._2
453443 let amountToPayA = fraction(pmtAmount, balanceA, shareAssetSupply)
454444 let amountToPayB = fraction(pmtAmount, balanceB, shareAssetSupply)
455445 if ((size(i.payments) != 1))
456446 then throw("One attached payment expected")
457447 else if ((pmtAssetId != shareAssetId))
458448 then throw(("Incorrect asset attached. Expected: " + toBase58String(shareAssetId)))
459449 else if (!(hasEnoughBalance))
460450 then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
461451 else {
462452 let stake1 = if (containsElement(stakingAssets, strAssetIdA))
463453 then invoke(this, "stakeUnstake", [false, amountToPayA, strAssetIdA], nil)
464454 else 0
465455 if ((stake1 == stake1))
466456 then {
467457 let stake2 = if (containsElement(stakingAssets, strAssetIdB))
468458 then invoke(this, "stakeUnstake", [false, amountToPayB, strAssetIdB], nil)
469459 else 0
470460 if ((stake2 == stake2))
471461 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)]
472462 else throw("Strict value is not equal to itself.")
473463 }
474464 else throw("Strict value is not equal to itself.")
475465 }
476466 })
477467
478468
479469
480470 @Callable(i)
481471 func exchange (minAmountToReceive) = valueOrElse(isActive(), {
482472 let $t01817418249 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
483473 let pmtAmount = $t01817418249._1
484474 let pmtAssetId = $t01817418249._2
485475 if (if ((balanceA == 0))
486476 then true
487477 else (balanceB == 0))
488478 then throw("Can't exchange with zero balance")
489479 else if ((0 >= minAmountToReceive))
490480 then throw(("Minimal amount to receive must be positive. Actual: " + toString(minAmountToReceive)))
491481 else if ((size(i.payments) != 1))
492482 then throw("One attached payment expected")
493483 else if (!(hasEnoughBalance))
494484 then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
495485 else if ((pmtAssetId == assetIdA))
496486 then {
497487 let assetIdSend = assetIdB
498488 let $t01880418926 = calculateFees(pmtAmount, minAmountToReceive, balanceA, balanceB)
499489 let amountWithoutFee = $t01880418926._1
500490 let amountWithFee = $t01880418926._2
501491 let governanceReward = $t01880418926._3
502492 let newBalanceA = (balanceA + pmtAmount)
503493 let newBalanceB = ((balanceB - amountWithFee) - governanceReward)
504494 let stake1 = if (containsElement(stakingAssets, strAssetIdA))
505495 then invoke(this, "stakeUnstake", [true, pmtAmount, strAssetIdA], nil)
506496 else 0
507497 if ((stake1 == stake1))
508498 then {
509499 let stake2 = if (containsElement(stakingAssets, strAssetIdB))
510500 then invoke(this, "stakeUnstake", [false, (amountWithFee + governanceReward), strAssetIdB], nil)
511501 else 0
512502 if ((stake2 == stake2))
513503 then [IntegerEntry(keyBalanceA, newBalanceA), IntegerEntry(keyBalanceB, newBalanceB), ScriptTransfer(i.caller, amountWithFee, assetIdSend), ScriptTransfer(walletAddress, governanceReward, assetIdSend)]
514504 else throw("Strict value is not equal to itself.")
515505 }
516506 else throw("Strict value is not equal to itself.")
517507 }
518508 else if ((pmtAssetId == assetIdB))
519509 then {
520510 let assetIdSend = assetIdA
521511 let $t01988120003 = calculateFees(pmtAmount, minAmountToReceive, balanceB, balanceA)
522512 let amountWithoutFee = $t01988120003._1
523513 let amountWithFee = $t01988120003._2
524514 let governanceReward = $t01988120003._3
525515 let newBalanceA = ((balanceA - amountWithFee) - governanceReward)
526516 let newBalanceB = (balanceB + pmtAmount)
527517 let stake1 = if (containsElement(stakingAssets, strAssetIdA))
528518 then invoke(this, "stakeUnstake", [false, (amountWithFee + governanceReward), strAssetIdA], nil)
529519 else 0
530520 if ((stake1 == stake1))
531521 then {
532522 let stake2 = if (containsElement(stakingAssets, strAssetIdB))
533523 then invoke(this, "stakeUnstake", [true, pmtAmount, strAssetIdB], nil)
534524 else 0
535525 if ((stake2 == stake2))
536526 then [IntegerEntry(keyBalanceA, newBalanceA), IntegerEntry(keyBalanceB, newBalanceB), ScriptTransfer(i.caller, amountWithFee, assetIdSend), ScriptTransfer(walletAddress, governanceReward, assetIdSend)]
537527 else throw("Strict value is not equal to itself.")
538528 }
539529 else throw("Strict value is not equal to itself.")
540530 }
541531 else throw(((("Incorrect asset attached. Expected: " + strAssetIdA) + " or ") + strAssetIdB))
542532 })
543533
544534
545535
546536 @Callable(i)
547537 func shutdown () = if (!(active))
548538 then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, keyCause), "the cause wasn't specified")))
549539 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStartStop], i.callerPublicKey)))
550540 then throw("Only admin can call this function")
551541 else suspend("Paused by admin")
552542
553543
554544
555545 @Callable(i)
556546 func activate () = valueOrElse(isActive(), if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStartStop], i.callerPublicKey)))
557547 then throw("Only admin can call this function")
558548 else [BooleanEntry(keyActive, true), DeleteEntry(keyCause)])
559549
560550
561551
562552 @Callable(i)
563553 func takeIntoAccountExtraFunds (amountLeave) = valueOrElse(isActive(), {
564554 let uncountableAmountEnrollAssetA = (accountBalanceWithStakedA - balanceA)
565555 let uncountableAmountEnrollAssetB = (accountBalanceWithStakedB - balanceB)
566556 let amountEnrollA = (uncountableAmountEnrollAssetA - (if ((assetIdA == unit))
567557 then amountLeave
568558 else 0))
569559 let amountEnrollB = (uncountableAmountEnrollAssetB - (if ((assetIdB == unit))
570560 then amountLeave
571561 else 0))
572562 if ((i.caller != this))
573563 then throw("Only the DApp itself can call this function")
574564 else if ((0 > amountLeave))
575565 then throw(("Argument 'amountLeave' cannot be negative. Actual: " + toString(amountLeave)))
576566 else if (if ((0 > uncountableAmountEnrollAssetA))
577567 then true
578568 else (0 > uncountableAmountEnrollAssetB))
579569 then suspend("Enroll amount negative")
580570 else if (if ((0 > amountEnrollA))
581571 then true
582572 else (0 > amountEnrollB))
583573 then throw("Too large amountLeave")
584574 else {
585575 let stake1 = if (if (containsElement(stakingAssets, strAssetIdA))
586576 then (amountEnrollA > 0)
587577 else false)
588578 then invoke(this, "stakeUnstake", [true, amountEnrollA, strAssetIdA], nil)
589579 else 0
590580 if ((stake1 == stake1))
591581 then {
592582 let stake2 = if (if (containsElement(stakingAssets, strAssetIdB))
593583 then (amountEnrollB > 0)
594584 else false)
595585 then invoke(this, "stakeUnstake", [true, amountEnrollB, strAssetIdB], nil)
596586 else 0
597587 if ((stake2 == stake2))
598588 then [IntegerEntry(keyBalanceA, (balanceA + amountEnrollA)), IntegerEntry(keyBalanceB, (balanceB + amountEnrollB)), IntegerEntry(("last_income_" + strAssetIdA), amountEnrollA), IntegerEntry(("last_income_" + strAssetIdB), amountEnrollB)]
599589 else throw("Strict value is not equal to itself.")
600590 }
601591 else throw("Strict value is not equal to itself.")
602592 }
603593 })
604594
605595
606596
607597 @Callable(i)
608598 func stakeUnstake (stake,amount,assetIdString) = if ((i.caller != this))
609599 then throw("Only contract itself can invoke this function")
610600 else if ((assetIdString == "WAVES"))
611601 then {
612602 let pool = addressFromStringValue(valueOrErrorMessage(getString(oracle, keyLeasingPool), "No leasing pool in oracle"))
613603 let leasingId = getBinary(this, keyLeasingId)
614604 let leasingAmount = valueOrElse(getInteger(this, keyLeasingAmount), 0)
615605 let newLeaseAmount = if (stake)
616606 then (leasingAmount + amount)
617607 else (leasingAmount - amount)
618608 let newLease = Lease(pool, newLeaseAmount)
619609 let newLeaseId = calculateLeaseId(newLease)
620610 let baseEtry = [newLease, BinaryEntry(keyLeasingId, newLeaseId), IntegerEntry(keyLeasingAmount, newLeaseAmount)]
621611 match leasingId {
622612 case lId: ByteVector =>
623613 ([LeaseCancel(lId)] ++ baseEtry)
624614 case _ =>
625615 baseEtry
626616 }
627617 }
628618 else {
629619 let $t02415124254 = calcStakingParams(stake, amount, fromBase58String(assetIdString))
630620 let call = $t02415124254._1
631621 let addr = $t02415124254._2
632622 let params = $t02415124254._3
633623 let payments = $t02415124254._4
634624 let inv = invoke(addr, call, params, payments)
635625 if ((inv == inv))
636626 then nil
637627 else throw("Strict value is not equal to itself.")
638628 }
639629
640630
641631
642632 @Callable(i)
643633 func stakeAll () = valueOrElse(isActive(), if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStartStop], i.callerPublicKey)))
644634 then throw("Only admin can call this function")
645635 else {
646636 let stake1 = if (containsElement(stakingAssets, strAssetIdA))
647637 then {
648638 let amountA = (balanceA - stakedAmountA)
649639 if ((amountA > 0))
650640 then invoke(this, "stakeUnstake", [true, amountA, strAssetIdA], nil)
651641 else 0
652642 }
653643 else 0
654644 if ((stake1 == stake1))
655645 then {
656646 let stake2 = if (containsElement(stakingAssets, strAssetIdB))
657647 then {
658648 let amountB = (balanceB - stakedAmountB)
659649 if ((amountB > 0))
660650 then invoke(this, "stakeUnstake", [true, amountB, strAssetIdB], nil)
661651 else 0
662652 }
663653 else 0
664654 if ((stake2 == stake2))
665655 then nil
666656 else throw("Strict value is not equal to itself.")
667657 }
668658 else throw("Strict value is not equal to itself.")
669659 })
670660
671661
672662 @Verifier(tx)
673663 func verify () = {
674664 let multiSignedByAdmins = {
675665 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
676666 then 1
677667 else 0
678668 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
679669 then 1
680670 else 0
681671 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
682672 then 1
683673 else 0
684674 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
685675 }
686676 match tx {
687677 case inv: InvokeScriptTransaction =>
688678 let callTakeIntoAccount = if ((inv.dApp == this))
689679 then (inv.function == "takeIntoAccountExtraFunds")
690680 else false
691681 let exchangeToWaves = if (if (if ((inv.dApp == USDNToWavesExchanger))
692682 then (inv.function == "exchange")
693683 else false)
694684 then (assetIdA == USDN)
695685 else false)
696686 then true
697687 else if (if ((assetIdB == USDN))
698688 then (size(inv.payments) == 1)
699689 else false)
700690 then (inv.payments[0].assetId == USDN)
701691 else false
702692 let exchangeToNSBTs = if (if (if ((inv.dApp == USDNToNSBTExchanger))
703693 then (inv.function == "exchange")
704694 else false)
705695 then (assetIdA == NSBT)
706696 else false)
707697 then true
708698 else if (if ((assetIdB == NSBT))
709699 then (size(inv.payments) == 1)
710700 else false)
711701 then (inv.payments[0].assetId == USDN)
712702 else false
713703 let signedByAdmin = if (if (if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
714704 then true
715705 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey2))
716706 then true
717707 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey3))
718708 then true
719709 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKeyStaking)
720710 if (if (if (if (callTakeIntoAccount)
721711 then true
722712 else exchangeToWaves)
723713 then true
724714 else exchangeToNSBTs)
725715 then signedByAdmin
726716 else false)
727717 then true
728718 else multiSignedByAdmins
729719 case _ =>
730720 multiSignedByAdmins
731721 }
732722 }
733723

github/deemru/w8io/169f3d6 
124.19 ms