tx · DvzhaZFW6vDaCuMw9xrT1px3HMRPF8kXYjutroGjrdJC

3N61Cvq5XcnPk9rxpy2Rnp3bSr4syNGUJph:  -0.01400000 Waves

2022.01.11 15:48 [1874305] smart account 3N61Cvq5XcnPk9rxpy2Rnp3bSr4syNGUJph > SELF 0.00000000 Waves

{ "type": 13, "id": "DvzhaZFW6vDaCuMw9xrT1px3HMRPF8kXYjutroGjrdJC", "fee": 1400000, "feeAssetId": null, "timestamp": 1641905336697, "version": 2, "chainId": 84, "sender": "3N61Cvq5XcnPk9rxpy2Rnp3bSr4syNGUJph", "senderPublicKey": "G7cNXePvAHUHmZfXa1eHnvFeH6DuykPC5wm9v9djTKgD", "proofs": [ "oP69GuhR8rQt4akvRrisb9fXdyz8MXQAGhN5boQacParskEqztHxbmp13QknxouPbNNNGsf4ZAgi1v3RUkinE7V", "Bh2NcUK9Adjp7QFhUhfjhBvfG6YCkDU8diEW4F1YtZ7cnyTQSGv9df74peSctL2avgXAhY6ZvdeRQp3qCDnA3u8", "4cmHehnYxsnRbRdKCW73qvCEVZHi5YuFQT4AG3Ggkzz3bKvB2eJi6yJW8pXKX5mpZ6RnDkpR7AZFkztezhrab2sB" ], "script": "base64:AAIFAAAAAAAAB5AIAhIGCgQYGBgREgMKARgSBgoECAgBARIAEgMKAQgSAwoBCBIECgIYFBoVCgFBEhBkQXBwU3Rha2VkVG9rZW5zGhQKAUISD2Fzc2V0SWRRdWFudGl0eRoGCgFDEgFpGgoKAUQSBXBvb2xzGhQKAUUSD2xpcXVpZGl0eVRva2VucxoSCgFGEg1zZXJ2aWNlVG9rZW5zGhsKAUcSFmxpcXVpZGl0eVRva2VuRGVjaW1hbHMaFQoBSBIQZ2VuZXJhdGVQb29sS2V5cxoQCgFJEgthY2N1bXVsYXRlZBojCgFKEh5nZW5lcmF0ZVBvb2xMaXF1aWRpdHlUb2tlbktleXMaDgoBSxIJcG9vbEluZGV4GhMKAUwSDmxpcXVpZGl0eVRva2VuGiEKAU0SHGdlbmVyYXRlUG9vbFNlcnZpY2VUb2tlbktleXMaKgoBThIlZ2VuZXJhdGVQb29sTGlxdWlkaXR5VG9rZW5EZWNpbWFsS2V5cxobCgFPEhZnZW5lcmF0ZVBvb2xBY3RpdmVLZXlzGhQKAVASD3Bvb2xCYWxhbmNlS2V5cxoHCgFREgIkbBoHCgFSEgIkcxoKCgFTEgUkYWNjMBoKCgFUEgUkZjBfMRoHCgFVEgIkYRoHCgFWEgIkaRoKCgFXEgUkZjBfMhobCgFYEhZwb29sTGlxdWlkaXR5VG9rZW5LZXlzGgoKAVkSBSRmMV8xGgoKAVoSBSRmMV8yGg8KAWESCmRlcG9zaXRGZWUaCwoCYUESBWFzc2V0GhAKAmFCEgpwb29sQW1vdW50GhAKAmFDEgp1c2VyQW1vdW50GgkKAmFEEgNpbnQaGgoCYUUSFHVzZXJBbW91bnRXaXRob3V0RmVlGhoKAmFGEhR0cmFuc2ZlclRvVXNlckFtb3VudBoJCgJhRxIDZmVlGhMKAmFIEg1uZXdQb29sQW1vdW50GhcKAmFJEhFuZXdVc2VyUG9vbEFtb3VudBoTCgJhShINbG9ja1Rva2Vuc0tleRoOCgJhSxIIc3RhdHVzZXMaDAoCYUwSBnN0YXR1cxoICgJhTRICdHgaDAoCYU4SBnZlcmlmeRoJCgJhTxIDaW52GhUKAmFQEg9sb2NrU2hhcmVUb2tlbnMaEQoCYVESC2RBcHBBZGRyZXNzGg0KAmFSEgckbWF0Y2gxGgoKAmFTEgRkQXBwGhMKAmFUEg1wb29sRnVuY3Rpb25zGhMKAmFVEg1zaWduZWRCeUFkbWluGhAKAmFWEgphZG0xU2lnbmVkGhAKAmFXEgphZG0yU2lnbmVkGhAKAmFYEgphZG0zU2lnbmVkGhoKAmFhEhRwb29sU2VydmljZVRva2VuS2V5cxoLCgJhYhIFJGYyXzEaCwoCYWMSBSRmMl8yGiMKAmFkEh1wb29sTGlxdWlkaXR5VG9rZW5EZWNpbWFsS2V5cxoLCgJhZRIFJGYzXzEaCwoCYWYSBSRmM18yGhQKAmFnEg5wb29sQWN0aXZlS2V5cxoLCgJhaBIFJGY0XzEaCwoCYWkSBSRmNF8yGg0KAmFqEgdyZWNvcmRzGhoKAmFrEhRnZW5lcmF0ZURlbGV0aW5nS2V5cxoMCgJhbBIGcmVjb3JkGhAKAmFtEgpkZWxldGVLZXlzGgoKAmFuEgRuYW1lGhEKAmFvEgtkZXNjcmlwdGlvbhoOCgJhcBIIcXVhbnRpdHkaDgoCYXESCGRlY2ltYWxzGggKAmFyEgJhOBoTCgJhcxINYXNzZXRJZFN0cmluZxoICgJhdBICaWQaEwoCYXUSDXBvb2xBbW91bnRLZXkaEQoCYXYSC3VzZXJBZGRyZXNzGhcKAmF3EhF1c2VyUG9vbEFtb3VudEtleRoWCgJheBIQZEFwcEFzc2V0QWRkcmVzcxobCgJheRIVbGlxdWlkdXR5QXNzZXRBZGRyZXNzGhsKAmF6EhVsaXF1aWRpdHlUb2tlbkRlY2ltYWwaEgoBYhINY29udHJvbGxlckZlZRoQCgFjEgtwbGF0Zm9ybUZlZRoRCgFkEgxhZG1pblB1YktleTEaEQoBZRIMYWRtaW5QdWJLZXkyGhEKAWYSDGFkbWluUHViS2V5MxoRCgFnEgxhZG1pblB1YktleTQaFgoBaBIRZ292ZXJtYW5jZUFkZHJlc3MaEwoBaRIOZmFybWluZ0FkZHJlc3MaEAoBahILc3dvcEZpUG9vbHMaFAoBaxIPc3dvcEZpRnVuY3Rpb25zGhEKAWwSDGlzUG9vbEFjdGl2ZRoJCgFtEgRwb29sGgwKAW4SB2tBY3RpdmUaDQoBbxIIaXNBY3RpdmUaGAoBcBITZ2V0REFwcEFzc2V0QWRkcmVzcxoMCgFxEgckbWF0Y2gwGgsKAXISBnN0cmlu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VAAAAAIJAQAAAAFUAAAAAgkBAAAAAVQAAAACCQEAAAABVAAAAAIJAQAAAAFUAAAAAgkBAAAAAVQAAAACCQEAAAABVAAAAAIJAQAAAAFUAAAAAgkBAAAAAVQAAAACCQEAAAABVAAAAAIJAQAAAAFUAAAAAgkBAAAAAVQAAAACCQEAAAABVAAAAAIJAQAAAAFUAAAAAgkBAAAAAVQAAAACCQEAAAABVAAAAAIJAQAAAAFUAAAAAgkBAAAAAVQAAAACCQEAAAABVAAAAAIJAQAAAAFUAAAAAgkBAAAAAVQAAAACCQEAAAABVAAAAAIJAQAAAAFUAAAAAgkBAAAAAVQAAAACCQEAAAABVAAAAAIJAQAAAAFUAAAAAgkBAAAAAVQAAAACCQEAAAABVAAAAAIJAQAAAAFUAAAAAgkBAAAAAVQAAAACCQEAAAABVAAAAAIJAQAAAAFUAAAAAgkBAAAAAVQAAAACCQEAAAABVAAAAAIJAQAAAAFUAAAAAgkBAAAAAVQAAAACCQEAAAABVAAAAAIJAQAAAAFUAAAAAgkBAAAAAVQAAAACCQEAAAABVAAAAAIJAQAAAAFUAAAAAgkBAAAAAVQAAAACCQEAAAABVAAAAAIJAQAAAAFUAAAAAgkBAAAAAVQAAAACCQEAAAABVAAAAAIJAQAAAAFUAAAAAgkBAAAAAVQAAAACCQEAAAABVAAAAAIJAQAAAAFUAAAAAgkBAAAAAVQAAAACCQEAAAABVAAAAAIJAQAAAAFUAAAAAgkBAAAAAVQAAAACCQEAAAABVAAAAAIJAQAAAAFUAAAAAgkBAAAAAVQAAAACCQEAAAABVAAAAAIJAQAAAAFUAAAAAgkBAAAAAVQAAAACCQEAAAABVAAAAAIJAQAAAAFUAAAAAgkBAAAAAVQAAAACCQEAAAABVAAAAAIJAQAAAAFUAAAAAgkBAAAAAVQAAAACCQEAAAABVAAAAAIJAQAAAAFUAAAAAgkBAAAAAVQAAAACCQEAAAABVAAAAAIJAQAAAAFUAAAAAgkBAAAAAVQAAAACCQEAAAABVAAAAAIJAQAAAAFUAAAAAgkBAAAAAVQAAAACCQEAAAABVAAAAAIJAQAAAAFUAAAAAgkBAAAAAVQAAAACCQEAAAABVAAAAAIJAQAAAAFUAAAAAgkBAAAAAVQAAAACCQEAAAABVAAAAAIJAQAAAAFUAAAAAgkBAAAAAVQAAAACCQEAAAABVAAAAAIJAQAAAAFUAAAAAgkBAAAAAVQAAAACCQEAAAABVAAAAAIJAQAAAAFUAAAAAgkBAAAAAVQAAAACCQEAAAABVAAAAAIJAQAAAAFUAAAAAgUAAAABUwAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAgAAAAAAAAAAAwAAAAAAAAAABAAAAAAAAAAABQAAAAAAAAAABgAAAAAAAAAABwAAAAAAAAAACAAAAAAAAAAACQAAAAAAAAAACgAAAAAAAAAACwAAAAAAAAAADAAAAAAAAAAADQAAAAAAAAAADgAAAAAAAAAADwAAAAAAAAAAEAAAAAAAAAAAEQAAAAAAAAAAEgAAAAAAAAAAEwAAAAAAAAAAFAAAAAAAAAAAFQAAAAAAAAAAFgAAAAAAAAAAFwAAAAAAAAAAGAAAAAAAAAAAGQAAAAAAAAAAGgAAAAAAAAAAGwAAAAAAAAAAHAAAAAAAAAAAHQAAAAAAAAAAHgAAAAAAAAAAHwAAAAAAAAAAIAAAAAAAAAAAIQAAAAAAAAAAIgAAAAAAAAAAIwAAAAAAAAAAJAAAAAAAAAAAJQAAAAAAAAAAJgAAAAAAAAAAJwAAAAAAAAAAKAAAAAAAAAAAKQAAAAAAAAAAKgAAAAAAAAAAKwAAAAAAAAAALAAAAAAAAAAALQAAAAAAAAAALgAAAAAAAAAALwAAAAAAAAAAMAAAAAAAAAAAMQAAAAAAAAAAMgAAAAAAAAAAMwAAAAAAAAAANAAAAAAAAAAANQAAAAAAAAAANgAAAAAAAAAANwAAAAAAAAAAOAAAAAAAAAAAOQAAAAAAAAAAOgAAAAAAAAAAOwAAAAAAAAAAPAAAAAAAAAAAPQAAAAAAAAAAPgAAAAAAAAAAPwAAAAAAAAAAQAAAAAAAAAAAQQAAAAAAAAAAQgAAAAAAAAAAQwAAAAAAAAAARAAAAAAAAAAARQAAAAAAAAAARgAAAAAAAAAARwAAAAAAAAAASAAAAAAAAAAASQAAAAAAAAAASgAAAAAAAAAASwAAAAAAAAAATAAAAAAAAAAATQAAAAAAAAAATgAAAAAAAAAATwAAAAAAAAAAUAAAAAAAAAAAUQAAAAAAAAAAUgAAAAAAAAAAUwAAAAAAAAAAVAAAAAAAAAAAVQAAAAAAAAAAVgAAAAAA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AgkBAAAAAVQAAAACCQEAAAABVAAAAAIJAQAAAAFUAAAAAgkBAAAAAVQAAAACCQEAAAABVAAAAAIJAQAAAAFUAAAAAgkBAAAAAVQAAAACCQEAAAABVAAAAAIJAQAAAAFUAAAAAgkBAAAAAVQAAAACCQEAAAABVAAAAAIJAQAAAAFUAAAAAgkBAAAAAVQAAAACCQEAAAABVAAAAAIJAQAAAAFUAAAAAgkBAAAAAVQAAAACCQEAAAABVAAAAAIJAQAAAAFUAAAAAgkBAAAAAVQAAAACCQEAAAABVAAAAAIJAQAAAAFUAAAAAgkBAAAAAVQAAAACCQEAAAABVAAAAAIJAQAAAAFUAAAAAgkBAAAAAVQAAAACCQEAAAABVAAAAAIJAQAAAAFUAAAAAgkBAAAAAVQAAAACCQEAAAABVAAAAAIJAQAAAAFUAAAAAgkBAAAAAVQAAAACCQEAAAABVAAAAAIJAQAAAAFUAAAAAgkBAAAAAVQAAAACCQEAAAABVAAAAAIJAQAAAAFUAAAAAgkBAAAAAVQAAAACCQEAAAABVAAAAAIJAQAAAAFUAAAAAgkBAAAAAVQAAAACCQEAAAABVAAAAAIJAQAAAAFUAAAAAgkBAAAAAVQAAAACCQEAAAABVAAAAAIJAQAAAAFUAAAAAgkBAAAAAVQAAAACCQEAAAABVAAAAAIJAQAAAAFUAAAAAgkBAAAAAVQAAAACCQEAAAABVAAAAAIJAQAAAAFUAAAAAgkBAAAAAVQAAAACCQEAAAABVAAAAAIJAQAAAAFUAAAAAgkBAAAAAVQAAAACCQEAAAABVAAAAAIJAQAAAAFUAAAAAgkBAAAAAVQAAAACCQEAAAABVAAAAAIJAQAAAAFUAAAAAgkBAAAAAVQAAAACCQEAAAABVAAAAAIJAQAAAAFUAAAAAgkBAAAAAVQAAAACCQEAAAABVAAAAAIJAQAAAAFUAAAAAgkBAAAAAVQAAAACCQEAAAABVAAAAAIJAQAAAAFUAAAAAgkBAAAAAVQAAAACCQEAAAABVAAAAAIJAQAAAAFUAAAAAgkBAAAAAVQAAAACCQEAAAABVAAAAAIJAQAAAAFUAAAAAgkBAAAAAVQAAAACCQEAAAABVAAAAAIJAQAAAAFUAAAAAgkBAAAAAVQAAAACCQEAAAABVAAAAAIJAQAAAAFUAAAAAgkBAAAAAVQAAAACCQEAAAABVAAAAAIJAQAAAAFUAAAAAgUAAAABUwAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAgAAAAAAAAAAAwAAAAAAAAAABAAAAAAAAAAABQAAAAAAAAAABgAAAAAAAAAABwAAAAAAAAAACAAAAAAAAAAACQAAAAAAAAAACgAAAAAAAAAACwAAAAAAAAAADAAAAAAAAAAADQAAAAAAAAAADgAAAAAAAAAADwAAAAAAAAAAEAAAAAAAAAAAEQAAAAAAAAAAEgAAAAAAAAAAEwAAAAAAAAAAFAAAAAAAAAAAFQAAAAAAAAAAFgAAAAAAAAAAFwAAAAAAAAAAGAAAAAAAAAAAGQAAAAAAAAAAGgAAAAAAAAAAGwAAAAAAAAAAHAAAAAAAAAAAHQAAAAAAAAAAHgAAAAAAAAAAHwAAAAAAAAAAIAAAAAAAAAAAIQAAAAAAAAAAIgAAAAAAAAAAIwAAAAAAAAAAJAAAAAAAAAAAJQAAAAAAAAAAJgAAAAAAAAAAJwAAAAAAAAAAKAAAAAAAAAAAKQAAAAAAAAAAKgAAAAAAAAAAKwAAAAAAAAAALAAAAAAAAAAALQAAAAAAAAAALgAAAAAAAAAALwAAAAAAAAAAMAAAAAAAAAAAMQAAAAAAAAAAMgAAAAAAAAAAMwAAAAAAAAAANAAAAAAAAAAANQAAAAAAAAAANgAAAAAAAAAANwAAAAAAAAAAOAAAAAAAAAAAOQAAAAAAAAAAOgAAAAAAAAAAOwAAAAAAAAAAPAAAAAAAAAAAPQAAAAAAAAAAPgAAAAAAAAAAPwAAAAAAAAAAQAAAAAAAAAAAQQAAAAAAAAAAQgAAAAAAAAAAQwAAAAAAAAAARAAAAAAAAAAARQAAAAAAAAAARgAAAAAAAAAARwAAAAAAAAAASAAAAAAAAAAASQAAAAAAAAAASgAAAAAAAAAASwAAAAAAAAAATAAAAAAAAAAATQAAAAAAAAAATgAAAAAAAAAATwAAAAAAAAAAUAAAAAAAAAAAUQAAAAAAAAAAUgAAAAAAAAAAUwAAAAAAAAAAVAAAAAAAAAAAVQAAAAAAAAAAVgAAAAAAAAAAVwAAAAAAAAAAWAAAAAAAAAAAWQAAAAAAAAAAWgAAAAAAAAAAWwAAAAAAAAAAXAAAAAAAAAAAXQAAAAAAAAAAXgAAAAAAAAAAXwAAAAAAAAAAYAAAAAAAAAAAYQAAAAAAAAAAYgAAAAAAAAAAYwAAAAAAAAAAZAUAAAACYWcJAAACAAAAAQIAAAAhT25seSBhZG1pbiBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uAAAAAQAAAAJhTQEAAAACYU4AAAAABAAAAAFxBQAAAAJhTQMJAAABAAAAAgUAAAABcQIAAAAXSW52b2tlU2NyaXB0VHJhbnNhY3Rpb24EAAAAAmFPBQAAAAFxBAAAAAJhUAMJAAAAAAAAAggFAAAAAmFPAAAABGRBcHAFAAAAAWkDAwkAAAAAAAACCAUAAAACYU8AAAAIZnVuY3Rpb24CAAAAD2xvY2tTaGFyZVRva2VucwYJAAAAAAAAAggFAAAAAmFPAAAACGZ1bmN0aW9uAgAAAAVjbGFpbQYJAAAAAAAAAggFAAAAAmFPAAAACGZ1bmN0aW9uAgAAABN3aXRoZHJhd1NoYXJlVG9rZW5zBwQAAAACYVEEAAAAAmFSCAUAAAACYU8AAAAEZEFwcAMJAAABAAAAAgUAAAACYVICAAAAB0FkZHJlc3MEAAAAAmFTBQAAAAJhUgkABCUAAAABBQAAAAJhUwkAAAIAAAABAgAAACJUcmFuc2FjdGlvbiBtdXN0IGhhdmUgb25seSBhZGRyZXNzBAAAAAJhVAMJAQAAAA9jb250YWluc0VsZW1lbnQAAAACBQAAAAFqBQAAAAJhUQkBAAAAD2NvbnRhaW5zRWxlbWVudAAAAAIFAAAAAWsIBQAAAAJhTwAAAAhmdW5jdGlvbgcEAAAAAmFVAwMDCQAB9AAAAAMIBQAAAAJhTQAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAmFNAAAABnByb29mcwAAAAAAAAAAAAUAAAABZAYJAAH0AAAAAwgFAAAAAmFNAAAACWJvZHlCeXRlcwkAAZEAAAACCAUAAAACYU0AAAAGcHJvb2ZzAAAAAAAAAAAABQAAAAFlBgkAAfQAAAADCAUAAAACYU0AAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJhTQAAAAZwcm9vZnMAAAAAAAAAAAAFAAAAAWcGCQAB9AAAAAMIBQAAAAJhTQAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAmFNAAAABnByb29mcwAAAAAAAAAAAAgFAAAAAmFNAAAAD3NlbmRlclB1YmxpY0tleQMDBQAAAAJhUAYFAAAAAmFUBQAAAAJhVQcEAAAAAmFWAwkAAfQAAAADCAUAAAACYU0AAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJhTQAAAAZwcm9vZnMAAAAAAAAAAAAFAAAAAWQAAAAAAAAAAAEAAAAAAAAAAAAEAAAAAmFXAwkAAfQAAAADCAUAAAACYU0AAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJhTQAAAAZwcm9vZnMAAAAAAAAAAAEFAAAAAWUAAAAAAAAAAAEAAAAAAAAAAAAEAAAAAmFYAwkAAfQAAAADCAUAAAACYU0AAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJhTQAAAAZwcm9vZnMAAAAAAAAAAAIFAAAAAWYAAAAAAAAAAAEAAAAAAAAAAAAJAABnAAAAAgkAAGQAAAACCQAAZAAAAAIFAAAAAmFWBQAAAAJhVwUAAAACYVgAAAAAAAAAAAIqrxRY", "height": 1874305, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 4nSjJLr1GqEzSDs5ZQ9wKdkydzettMENgDMwHcnwhnqr Next: DY7dLcNsgeZddD8yuk4VHuiiGxAqEe7rjA7jNXLohqV3 Diff:
OldNewDifferences
1515
1616 let adminPubKey4 = base58'ALsqwPqiUP3bVbM7grozc1Y5oHVBAGKqACRJ5J8RXceC'
1717
18-let govermanceAddress = Address(base58'3N7ExjwfofPYTvNBv2zqtAtLcMxqjTxS7iL')
18+let govermanceAddress = Address(base58'3PKoJ7GHwmidFPX6NiqKZdq8Zj2auPMNPnE')
1919
20-let farmingAddress = Address(base58'3P73HDkPqG15nLXevjCbmXtazHYTZbpPoPw')
20+let farmingAddress = Address(base58'3NBTuZhn2CwAgWGL99qpGDjZQ4Wtbg56iDL')
2121
22-let swopFiPools = ["3PPH7x7iqobW5ziyiRCic19rQqKr6nPYaK1"]
22+let swopFiPools = ["3PPH7x7iqobW5ziyiRCic19rQqKr6nPYaK1", "3PKy2mZqnvT2EtpwDim9Mgs6YvCRe4s85nX", "3P27S9V36kw2McjWRZ37AxTx8iwkd7HXw6W"]
2323
2424 let swopFiFunctions = ["replenishWithTwoTokens", "exchange"]
2525
4444 case nothing =>
4545 throw("You try to withdraw from unsupported pool")
4646 }
47+
48+
49+func getStakedAmount (poolAddress) = match getInteger(farmingAddress, (((poolAddress + "_") + toString(this)) + "_share_tokens_locked")) {
50+ case staked: Int =>
51+ staked
52+ case nothing: Unit =>
53+ 0
54+ case _ =>
55+ throw("Match error")
56+}
57+
58+
59+func transferToUser (amount,assetId,poolAddress) = {
60+ let dAppStakedTokens = getStakedAmount(poolAddress)
61+ let assetIdQuantity = value(assetInfo(assetId)).quantity
62+ fraction(amount, dAppStakedTokens, assetIdQuantity)
63+ }
4764
4865
4966 @Callable(i)
173190
174191
175192 @Callable(i)
176-func distributionReward (pool,totalReward,wallets,rewardValues) = if (containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey))
177- then {
178- func generateRecords (accumulated,wallet) = {
179- let walletIndex = value(indexOf(wallets, wallet))
180- let rewardValue = rewardValues[walletIndex]
181- let rewardKey = (((pool + "_") + wallet) + "_current_reward")
182- let userPreviousReward = match getInteger(rewardKey) {
183- case int: Int =>
184- int
185- case nothing =>
186- 0
187- }
188- let userNewReward = (userPreviousReward + rewardValue)
189-IntegerEntry(rewardKey, userNewReward) :: accumulated
190- }
191-
192- let rewards = {
193- let $l = wallets
194- let $s = size($l)
195- let $acc0 = nil
196- func $f0_1 ($a,$i) = if (($i >= $s))
197- then $a
198- else generateRecords($a, $l[$i])
199-
200- func $f0_2 ($a,$i) = if (($i >= $s))
201- then $a
202- else throw("List size exceeds 87")
203-
204- $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64), 65), 66), 67), 68), 69), 70), 71), 72), 73), 74), 75), 76), 77), 78), 79), 80), 81), 82), 83), 84), 85), 86), 87)
205- }
206- let dAppAssetAddress = getDAppAssetAddress(pool)
207-Reissue(fromBase58String(dAppAssetAddress), totalReward, true) :: rewards
208- }
209- else throw("Only admin can call this function")
210-
211-
212-
213-@Callable(i)
214193 func issueToken (name,description,quantity,decimals) = if (containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey))
215194 then [Issue(name, description, quantity, decimals, true, unit, 0)]
216195 else throw("Only admin can call this function")
265244 case nothing =>
266245 0
267246 }
268- let newPoolAmount = (poolAmount + amount)
269247 let userAmountWithoutFee = ((amount - fraction(amount, 1, depositFee, HALFUP)) - fraction(amount, 1, controllerFee, HALFUP))
248+ let transferToUserAmount = transferToUser(userAmountWithoutFee, fromBase58String(assetIdString), pool)
270249 let fee = (amount - userAmountWithoutFee)
271- let newUserPoolAmount = (userAmount + userAmountWithoutFee)
250+ let newPoolAmount = ((poolAmount + amount) - fee)
251+ let newUserPoolAmount = (userAmount + transferToUserAmount)
272252 let lockTokensKey = (((((pool + "_") + userAddress) + "_") + toBase58String(i.transactionId)) + "_locked")
273-[Reissue(fromBase58String(dAppAssetAddress), userAmountWithoutFee, true), ScriptTransfer(i.caller, userAmountWithoutFee, fromBase58String(dAppAssetAddress)), ScriptTransfer(govermanceAddress, fee, fromBase58String(liquidutyAssetAddress)), IntegerEntry(lockTokensKey, userAmountWithoutFee), IntegerEntry(poolAmountKey, newPoolAmount), IntegerEntry(userPoolAmountKey, newUserPoolAmount)]
253+[Reissue(fromBase58String(dAppAssetAddress), transferToUserAmount, true), ScriptTransfer(i.caller, userAmountWithoutFee, fromBase58String(dAppAssetAddress)), ScriptTransfer(govermanceAddress, fee, fromBase58String(liquidutyAssetAddress)), IntegerEntry(lockTokensKey, userAmountWithoutFee), IntegerEntry(poolAmountKey, newPoolAmount), IntegerEntry(userPoolAmountKey, newUserPoolAmount)]
274254 }
275255 }
276256 else throw("Pool is not active!")
293273 }
294274 if ((0 >= amount))
295275 then throw(("Deposit amount must be positive. Actual: " + toString(amount)))
296- else {
297- let poolAmountKey = (pool + "_asset_balance")
298- let userAddress = toString(i.caller)
299- let userPoolAmountKey = (((pool + "_") + userAddress) + "_asset_balance")
300- let dAppAssetAddress = getDAppAssetAddress(pool)
301- let liquidutyAssetAddress = getLiquidutyAssetAddress(pool)
302- let poolAmount = getIntegerValue(this, poolAmountKey)
303- let amountWithoutFee = ((amount - fraction(amount, 1, platformFee, HALFUP)) - fraction(amount, 1, controllerFee, HALFUP))
304- let newPoolAmount = (poolAmount - amountWithoutFee)
305- let fee = (amount - amountWithoutFee)
306-[Burn(fromBase58String(dAppAssetAddress), amountWithoutFee), ScriptTransfer(i.caller, amountWithoutFee, fromBase58String(liquidutyAssetAddress)), ScriptTransfer(govermanceAddress, fee, fromBase58String(liquidutyAssetAddress)), IntegerEntry(poolAmountKey, newPoolAmount)]
307- }
276+ else if (isPoolActive(pool))
277+ then {
278+ let poolAmountKey = (pool + "_asset_balance")
279+ let userAddress = toString(i.caller)
280+ let userPoolAmountKey = (((pool + "_") + userAddress) + "_asset_balance")
281+ let userAmount = match getInteger(userPoolAmountKey) {
282+ case int: Int =>
283+ int
284+ case nothing =>
285+ 0
286+ }
287+ let dAppAssetAddress = getDAppAssetAddress(pool)
288+ let liquidutyAssetAddress = getLiquidutyAssetAddress(pool)
289+ let poolAmount = getIntegerValue(this, poolAmountKey)
290+ let userAmountWithoutFee = ((amount - fraction(amount, 1, platformFee, HALFUP)) - fraction(amount, 1, controllerFee, HALFUP))
291+ let transferToUserAmount = transferToUser(userAmountWithoutFee, fromBase58String(assetIdString), pool)
292+ let newPoolAmount = (poolAmount - userAmountWithoutFee)
293+ let fee = (amount - userAmountWithoutFee)
294+ let newUserPoolAmount = (userAmount - amount)
295+[Burn(fromBase58String(dAppAssetAddress), transferToUserAmount), ScriptTransfer(i.caller, transferToUserAmount, fromBase58String(liquidutyAssetAddress)), ScriptTransfer(govermanceAddress, fee, fromBase58String(liquidutyAssetAddress)), IntegerEntry(poolAmountKey, newPoolAmount), IntegerEntry(userPoolAmountKey, newUserPoolAmount)]
296+ }
297+ else throw("Pool is not active!")
308298 }
309-
310-
311-
312-@Callable(i)
313-func claimReward (pool) = {
314- let userAddress = toString(i.caller)
315- let userRewardKey = (((pool + "_") + userAddress) + "_current_reward")
316- let userReward = match getInteger(userRewardKey) {
317- case int: Int =>
318- int
319- case nothing =>
320- throw("You have not any reward in this pool")
321- }
322- let dAppAssetAddress = getDAppAssetAddress(pool)
323- let liquidutyAssetAddress = getLiquidutyAssetAddress(pool)
324-[Burn(fromBase58String(dAppAssetAddress), userReward), ScriptTransfer(i.caller, userReward, fromBase58String(liquidutyAssetAddress)), IntegerEntry(userRewardKey, 0)]
325- }
326299
327300
328301
358331 func verify () = match tx {
359332 case inv: InvokeScriptTransaction =>
360333 let lockShareTokens = if ((inv.dApp == farmingAddress))
361- then if ((inv.function == "lockShareTokens"))
334+ then if (if ((inv.function == "lockShareTokens"))
362335 then true
363- else (inv.function == "claim")
336+ else (inv.function == "claim"))
337+ then true
338+ else (inv.function == "withdrawShareTokens")
364339 else false
365340 let dAppAddress = match inv.dApp {
366341 case dApp: Address =>
371346 let poolFunctions = if (containsElement(swopFiPools, dAppAddress))
372347 then containsElement(swopFiFunctions, inv.function)
373348 else false
374- let signedByAdmin = if (if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
349+ let signedByAdmin = if (if (if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
375350 then true
376351 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey2))
377352 then true
378- else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey4)
353+ else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey4))
354+ then true
355+ else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
379356 if (if (lockShareTokens)
380357 then true
381358 else poolFunctions)
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let depositFee = 1000
55
66 let controllerFee = 10000
77
88 let platformFee = 10000
99
1010 let adminPubKey1 = base58'68Po1k24uP6goKr7RDmXPg4QkMiKuyTMEirao14rif8s'
1111
1212 let adminPubKey2 = base58'Bze4aurT9WmLgBT6swA9CajaZFtUwhtwCri6XGAjnAkt'
1313
1414 let adminPubKey3 = base58'ALsqwPqiUP3bVbM7grozc1Y5oHVBAGKqACRJ5J8RXceC'
1515
1616 let adminPubKey4 = base58'ALsqwPqiUP3bVbM7grozc1Y5oHVBAGKqACRJ5J8RXceC'
1717
18-let govermanceAddress = Address(base58'3N7ExjwfofPYTvNBv2zqtAtLcMxqjTxS7iL')
18+let govermanceAddress = Address(base58'3PKoJ7GHwmidFPX6NiqKZdq8Zj2auPMNPnE')
1919
20-let farmingAddress = Address(base58'3P73HDkPqG15nLXevjCbmXtazHYTZbpPoPw')
20+let farmingAddress = Address(base58'3NBTuZhn2CwAgWGL99qpGDjZQ4Wtbg56iDL')
2121
22-let swopFiPools = ["3PPH7x7iqobW5ziyiRCic19rQqKr6nPYaK1"]
22+let swopFiPools = ["3PPH7x7iqobW5ziyiRCic19rQqKr6nPYaK1", "3PKy2mZqnvT2EtpwDim9Mgs6YvCRe4s85nX", "3P27S9V36kw2McjWRZ37AxTx8iwkd7HXw6W"]
2323
2424 let swopFiFunctions = ["replenishWithTwoTokens", "exchange"]
2525
2626 func isPoolActive (pool) = {
2727 let kActive = (pool + "_active")
2828 let isActive = getBooleanValue(this, kActive)
2929 isActive
3030 }
3131
3232
3333 func getDAppAssetAddress (pool) = match getString((pool + "_service_token")) {
3434 case string: String =>
3535 string
3636 case nothing =>
3737 throw("You try to deposit on unsupported pool")
3838 }
3939
4040
4141 func getLiquidutyAssetAddress (pool) = match getString((pool + "_liquidity_token")) {
4242 case string: String =>
4343 string
4444 case nothing =>
4545 throw("You try to withdraw from unsupported pool")
4646 }
47+
48+
49+func getStakedAmount (poolAddress) = match getInteger(farmingAddress, (((poolAddress + "_") + toString(this)) + "_share_tokens_locked")) {
50+ case staked: Int =>
51+ staked
52+ case nothing: Unit =>
53+ 0
54+ case _ =>
55+ throw("Match error")
56+}
57+
58+
59+func transferToUser (amount,assetId,poolAddress) = {
60+ let dAppStakedTokens = getStakedAmount(poolAddress)
61+ let assetIdQuantity = value(assetInfo(assetId)).quantity
62+ fraction(amount, dAppStakedTokens, assetIdQuantity)
63+ }
4764
4865
4966 @Callable(i)
5067 func addPools (pools,liquidityTokens,serviceTokens,liquidityTokenDecimals) = if (containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey))
5168 then {
5269 func generatePoolKeys (accumulated,pool) = IntegerEntry((pool + "_asset_balance"), 0) :: accumulated
5370
5471 func generatePoolLiquidityTokenKeys (accumulated,pool) = {
5572 let poolIndex = value(indexOf(pools, pool))
5673 let liquidityToken = liquidityTokens[poolIndex]
5774 StringEntry((pool + "_liquidity_token"), liquidityToken) :: accumulated
5875 }
5976
6077 func generatePoolServiceTokenKeys (accumulated,pool) = {
6178 let poolIndex = value(indexOf(pools, pool))
6279 let liquidityToken = serviceTokens[poolIndex]
6380 StringEntry((pool + "_service_token"), liquidityToken) :: accumulated
6481 }
6582
6683 func generatePoolLiquidityTokenDecimalKeys (accumulated,pool) = {
6784 let poolIndex = value(indexOf(pools, pool))
6885 let liquidityToken = liquidityTokenDecimals[poolIndex]
6986 IntegerEntry((pool + "_service_token_decimal"), liquidityToken) :: accumulated
7087 }
7188
7289 func generatePoolActiveKeys (accumulated,pool) = BooleanEntry((pool + "_active"), true) :: accumulated
7390
7491 let poolBalanceKeys = {
7592 let $l = pools
7693 let $s = size($l)
7794 let $acc0 = nil
7895 func $f0_1 ($a,$i) = if (($i >= $s))
7996 then $a
8097 else generatePoolKeys($a, $l[$i])
8198
8299 func $f0_2 ($a,$i) = if (($i >= $s))
83100 then $a
84101 else throw("List size exceeds 20")
85102
86103 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
87104 }
88105 let poolLiquidityTokenKeys = {
89106 let $l = pools
90107 let $s = size($l)
91108 let $acc0 = nil
92109 func $f1_1 ($a,$i) = if (($i >= $s))
93110 then $a
94111 else generatePoolLiquidityTokenKeys($a, $l[$i])
95112
96113 func $f1_2 ($a,$i) = if (($i >= $s))
97114 then $a
98115 else throw("List size exceeds 20")
99116
100117 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
101118 }
102119 let poolServiceTokenKeys = {
103120 let $l = pools
104121 let $s = size($l)
105122 let $acc0 = nil
106123 func $f2_1 ($a,$i) = if (($i >= $s))
107124 then $a
108125 else generatePoolServiceTokenKeys($a, $l[$i])
109126
110127 func $f2_2 ($a,$i) = if (($i >= $s))
111128 then $a
112129 else throw("List size exceeds 20")
113130
114131 $f2_2($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
115132 }
116133 let poolLiquidityTokenDecimalKeys = {
117134 let $l = pools
118135 let $s = size($l)
119136 let $acc0 = nil
120137 func $f3_1 ($a,$i) = if (($i >= $s))
121138 then $a
122139 else generatePoolLiquidityTokenDecimalKeys($a, $l[$i])
123140
124141 func $f3_2 ($a,$i) = if (($i >= $s))
125142 then $a
126143 else throw("List size exceeds 20")
127144
128145 $f3_2($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
129146 }
130147 let poolActiveKeys = {
131148 let $l = pools
132149 let $s = size($l)
133150 let $acc0 = nil
134151 func $f4_1 ($a,$i) = if (($i >= $s))
135152 then $a
136153 else generatePoolActiveKeys($a, $l[$i])
137154
138155 func $f4_2 ($a,$i) = if (($i >= $s))
139156 then $a
140157 else throw("List size exceeds 20")
141158
142159 $f4_2($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
143160 }
144161 ((((poolBalanceKeys ++ poolLiquidityTokenKeys) ++ poolServiceTokenKeys) ++ poolLiquidityTokenDecimalKeys) ++ poolActiveKeys)
145162 }
146163 else throw("Only admin can call this function")
147164
148165
149166
150167 @Callable(i)
151168 func deleteDepositLockRecords (records) = if (containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey))
152169 then {
153170 func generateDeletingKeys (accumulated,record) = DeleteEntry((record + "_locked")) :: accumulated
154171
155172 let deleteKeys = {
156173 let $l = records
157174 let $s = size($l)
158175 let $acc0 = nil
159176 func $f0_1 ($a,$i) = if (($i >= $s))
160177 then $a
161178 else generateDeletingKeys($a, $l[$i])
162179
163180 func $f0_2 ($a,$i) = if (($i >= $s))
164181 then $a
165182 else throw("List size exceeds 100")
166183
167184 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64), 65), 66), 67), 68), 69), 70), 71), 72), 73), 74), 75), 76), 77), 78), 79), 80), 81), 82), 83), 84), 85), 86), 87), 88), 89), 90), 91), 92), 93), 94), 95), 96), 97), 98), 99), 100)
168185 }
169186 deleteKeys
170187 }
171188 else throw("Only admin can call this function")
172189
173190
174191
175192 @Callable(i)
176-func distributionReward (pool,totalReward,wallets,rewardValues) = if (containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey))
177- then {
178- func generateRecords (accumulated,wallet) = {
179- let walletIndex = value(indexOf(wallets, wallet))
180- let rewardValue = rewardValues[walletIndex]
181- let rewardKey = (((pool + "_") + wallet) + "_current_reward")
182- let userPreviousReward = match getInteger(rewardKey) {
183- case int: Int =>
184- int
185- case nothing =>
186- 0
187- }
188- let userNewReward = (userPreviousReward + rewardValue)
189-IntegerEntry(rewardKey, userNewReward) :: accumulated
190- }
191-
192- let rewards = {
193- let $l = wallets
194- let $s = size($l)
195- let $acc0 = nil
196- func $f0_1 ($a,$i) = if (($i >= $s))
197- then $a
198- else generateRecords($a, $l[$i])
199-
200- func $f0_2 ($a,$i) = if (($i >= $s))
201- then $a
202- else throw("List size exceeds 87")
203-
204- $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64), 65), 66), 67), 68), 69), 70), 71), 72), 73), 74), 75), 76), 77), 78), 79), 80), 81), 82), 83), 84), 85), 86), 87)
205- }
206- let dAppAssetAddress = getDAppAssetAddress(pool)
207-Reissue(fromBase58String(dAppAssetAddress), totalReward, true) :: rewards
208- }
209- else throw("Only admin can call this function")
210-
211-
212-
213-@Callable(i)
214193 func issueToken (name,description,quantity,decimals) = if (containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey))
215194 then [Issue(name, description, quantity, decimals, true, unit, 0)]
216195 else throw("Only admin can call this function")
217196
218197
219198
220199 @Callable(a8)
221200 func call () = [DeleteEntry("3PPH7x7iqobW5ziyiRCic19rQqKr6nPYaK1_3N5viYFhnu1ew4FRZ9nujme9edr918FkT1a_current_reward")]
222201
223202
224203
225204 @Callable(i)
226205 func deposit (pool) = if ((size(i.payments) != 1))
227206 then throw("One attached payment expected")
228207 else {
229208 let amount = i.payments[0].amount
230209 let assetId = i.payments[0].assetId
231210 let assetIdString = match assetId {
232211 case id: ByteVector =>
233212 toBase58String(id)
234213 case _ =>
235214 throw("Match error")
236215 }
237216 if ((0 >= amount))
238217 then throw(("Deposit amount must be positive. Actual: " + toString(amount)))
239218 else {
240219 let poolAmountKey = (pool + "_asset_balance")
241220 let userAddress = toString(i.caller)
242221 let userPoolAmountKey = (((pool + "_") + userAddress) + "_asset_balance")
243222 let dAppAssetAddress = getDAppAssetAddress(pool)
244223 let liquidutyAssetAddress = match getString((pool + "_liquidity_token")) {
245224 case string: String =>
246225 string
247226 case nothing =>
248227 throw("You try to deposit on unsupported pool")
249228 }
250229 if (isPoolActive(pool))
251230 then {
252231 let liquidityTokenDecimal = match assetInfo(fromBase58String(liquidutyAssetAddress)) {
253232 case asset: Asset =>
254233 asset.decimals
255234 case _ =>
256235 throw("Can't find asset")
257236 }
258237 if ((liquidutyAssetAddress != assetIdString))
259238 then throw("You attached wrong liquidity token from Swop.fi")
260239 else {
261240 let poolAmount = getIntegerValue(this, poolAmountKey)
262241 let userAmount = match getInteger(userPoolAmountKey) {
263242 case int: Int =>
264243 int
265244 case nothing =>
266245 0
267246 }
268- let newPoolAmount = (poolAmount + amount)
269247 let userAmountWithoutFee = ((amount - fraction(amount, 1, depositFee, HALFUP)) - fraction(amount, 1, controllerFee, HALFUP))
248+ let transferToUserAmount = transferToUser(userAmountWithoutFee, fromBase58String(assetIdString), pool)
270249 let fee = (amount - userAmountWithoutFee)
271- let newUserPoolAmount = (userAmount + userAmountWithoutFee)
250+ let newPoolAmount = ((poolAmount + amount) - fee)
251+ let newUserPoolAmount = (userAmount + transferToUserAmount)
272252 let lockTokensKey = (((((pool + "_") + userAddress) + "_") + toBase58String(i.transactionId)) + "_locked")
273-[Reissue(fromBase58String(dAppAssetAddress), userAmountWithoutFee, true), ScriptTransfer(i.caller, userAmountWithoutFee, fromBase58String(dAppAssetAddress)), ScriptTransfer(govermanceAddress, fee, fromBase58String(liquidutyAssetAddress)), IntegerEntry(lockTokensKey, userAmountWithoutFee), IntegerEntry(poolAmountKey, newPoolAmount), IntegerEntry(userPoolAmountKey, newUserPoolAmount)]
253+[Reissue(fromBase58String(dAppAssetAddress), transferToUserAmount, true), ScriptTransfer(i.caller, userAmountWithoutFee, fromBase58String(dAppAssetAddress)), ScriptTransfer(govermanceAddress, fee, fromBase58String(liquidutyAssetAddress)), IntegerEntry(lockTokensKey, userAmountWithoutFee), IntegerEntry(poolAmountKey, newPoolAmount), IntegerEntry(userPoolAmountKey, newUserPoolAmount)]
274254 }
275255 }
276256 else throw("Pool is not active!")
277257 }
278258 }
279259
280260
281261
282262 @Callable(i)
283263 func withdraw (pool) = if ((size(i.payments) != 1))
284264 then throw("One attached payment expected")
285265 else {
286266 let amount = i.payments[0].amount
287267 let assetId = i.payments[0].assetId
288268 let assetIdString = match assetId {
289269 case id: ByteVector =>
290270 toBase58String(id)
291271 case _ =>
292272 throw("Match error")
293273 }
294274 if ((0 >= amount))
295275 then throw(("Deposit amount must be positive. Actual: " + toString(amount)))
296- else {
297- let poolAmountKey = (pool + "_asset_balance")
298- let userAddress = toString(i.caller)
299- let userPoolAmountKey = (((pool + "_") + userAddress) + "_asset_balance")
300- let dAppAssetAddress = getDAppAssetAddress(pool)
301- let liquidutyAssetAddress = getLiquidutyAssetAddress(pool)
302- let poolAmount = getIntegerValue(this, poolAmountKey)
303- let amountWithoutFee = ((amount - fraction(amount, 1, platformFee, HALFUP)) - fraction(amount, 1, controllerFee, HALFUP))
304- let newPoolAmount = (poolAmount - amountWithoutFee)
305- let fee = (amount - amountWithoutFee)
306-[Burn(fromBase58String(dAppAssetAddress), amountWithoutFee), ScriptTransfer(i.caller, amountWithoutFee, fromBase58String(liquidutyAssetAddress)), ScriptTransfer(govermanceAddress, fee, fromBase58String(liquidutyAssetAddress)), IntegerEntry(poolAmountKey, newPoolAmount)]
307- }
276+ else if (isPoolActive(pool))
277+ then {
278+ let poolAmountKey = (pool + "_asset_balance")
279+ let userAddress = toString(i.caller)
280+ let userPoolAmountKey = (((pool + "_") + userAddress) + "_asset_balance")
281+ let userAmount = match getInteger(userPoolAmountKey) {
282+ case int: Int =>
283+ int
284+ case nothing =>
285+ 0
286+ }
287+ let dAppAssetAddress = getDAppAssetAddress(pool)
288+ let liquidutyAssetAddress = getLiquidutyAssetAddress(pool)
289+ let poolAmount = getIntegerValue(this, poolAmountKey)
290+ let userAmountWithoutFee = ((amount - fraction(amount, 1, platformFee, HALFUP)) - fraction(amount, 1, controllerFee, HALFUP))
291+ let transferToUserAmount = transferToUser(userAmountWithoutFee, fromBase58String(assetIdString), pool)
292+ let newPoolAmount = (poolAmount - userAmountWithoutFee)
293+ let fee = (amount - userAmountWithoutFee)
294+ let newUserPoolAmount = (userAmount - amount)
295+[Burn(fromBase58String(dAppAssetAddress), transferToUserAmount), ScriptTransfer(i.caller, transferToUserAmount, fromBase58String(liquidutyAssetAddress)), ScriptTransfer(govermanceAddress, fee, fromBase58String(liquidutyAssetAddress)), IntegerEntry(poolAmountKey, newPoolAmount), IntegerEntry(userPoolAmountKey, newUserPoolAmount)]
296+ }
297+ else throw("Pool is not active!")
308298 }
309-
310-
311-
312-@Callable(i)
313-func claimReward (pool) = {
314- let userAddress = toString(i.caller)
315- let userRewardKey = (((pool + "_") + userAddress) + "_current_reward")
316- let userReward = match getInteger(userRewardKey) {
317- case int: Int =>
318- int
319- case nothing =>
320- throw("You have not any reward in this pool")
321- }
322- let dAppAssetAddress = getDAppAssetAddress(pool)
323- let liquidutyAssetAddress = getLiquidutyAssetAddress(pool)
324-[Burn(fromBase58String(dAppAssetAddress), userReward), ScriptTransfer(i.caller, userReward, fromBase58String(liquidutyAssetAddress)), IntegerEntry(userRewardKey, 0)]
325- }
326299
327300
328301
329302 @Callable(i)
330303 func poolActivating (pools,statuses) = if (containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey))
331304 then {
332305 func generatePoolActiveKeys (accumulated,pool) = {
333306 let poolIndex = value(indexOf(pools, pool))
334307 let status = statuses[poolIndex]
335308 BooleanEntry((pool + "_active"), status) :: accumulated
336309 }
337310
338311 let poolActiveKeys = {
339312 let $l = pools
340313 let $s = size($l)
341314 let $acc0 = nil
342315 func $f0_1 ($a,$i) = if (($i >= $s))
343316 then $a
344317 else generatePoolActiveKeys($a, $l[$i])
345318
346319 func $f0_2 ($a,$i) = if (($i >= $s))
347320 then $a
348321 else throw("List size exceeds 100")
349322
350323 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64), 65), 66), 67), 68), 69), 70), 71), 72), 73), 74), 75), 76), 77), 78), 79), 80), 81), 82), 83), 84), 85), 86), 87), 88), 89), 90), 91), 92), 93), 94), 95), 96), 97), 98), 99), 100)
351324 }
352325 poolActiveKeys
353326 }
354327 else throw("Only admin can call this function")
355328
356329
357330 @Verifier(tx)
358331 func verify () = match tx {
359332 case inv: InvokeScriptTransaction =>
360333 let lockShareTokens = if ((inv.dApp == farmingAddress))
361- then if ((inv.function == "lockShareTokens"))
334+ then if (if ((inv.function == "lockShareTokens"))
362335 then true
363- else (inv.function == "claim")
336+ else (inv.function == "claim"))
337+ then true
338+ else (inv.function == "withdrawShareTokens")
364339 else false
365340 let dAppAddress = match inv.dApp {
366341 case dApp: Address =>
367342 toString(dApp)
368343 case _ =>
369344 throw("Transaction must have only address")
370345 }
371346 let poolFunctions = if (containsElement(swopFiPools, dAppAddress))
372347 then containsElement(swopFiFunctions, inv.function)
373348 else false
374- let signedByAdmin = if (if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
349+ let signedByAdmin = if (if (if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
375350 then true
376351 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey2))
377352 then true
378- else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey4)
353+ else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey4))
354+ then true
355+ else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
379356 if (if (lockShareTokens)
380357 then true
381358 else poolFunctions)
382359 then signedByAdmin
383360 else false
384361 case _ =>
385362 let adm1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
386363 then 1
387364 else 0
388365 let adm2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
389366 then 1
390367 else 0
391368 let adm3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
392369 then 1
393370 else 0
394371 (((adm1Signed + adm2Signed) + adm3Signed) >= 2)
395372 }
396373

github/deemru/w8io/169f3d6 
115.40 ms