tx · B4fW4UajahkcpvRFRoue4KzfhZUfS6VFkxmetKm8F8Z8

3P73HDkPqG15nLXevjCbmXtazHYTZbpPoPw:  -0.01400000 Waves

2021.09.15 13:17 [2768946] smart account 3P73HDkPqG15nLXevjCbmXtazHYTZbpPoPw > SELF 0.00000000 Waves

{ "type": 13, "id": "B4fW4UajahkcpvRFRoue4KzfhZUfS6VFkxmetKm8F8Z8", "fee": 1400000, "feeAssetId": null, "timestamp": 1631700175142, "version": 2, "chainId": 87, "sender": "3P73HDkPqG15nLXevjCbmXtazHYTZbpPoPw", "senderPublicKey": "B3jG1KiAb24bgwe28D9JKKkg9mtpiGTeEAYmQPrtHwQQ", "proofs": [ "", "67MmN7YKDDXDW8LSybwHRFK4gNj1aJn5sdjfhdkA5veeiRsVGQWjA4ZFjqmZFNeWNQUucW6v8EAgxXCK2z1Vav7L", "3mZtHHoRWVMY2WV1hMHY1yuPrMbGxRsV12jajraV5vqTwUbXEtVPoy2QbBnr43Dy3BxmqFu2jTJfNtxCzSBtiJPH" ], "script": "base64:AAIFAAAAAAAAE+AIAhIDCgEIEgMKAQgSAwoBCBIDCgEIEgQKAggBEgUKAwgYARIFCgMICAESBAoCCAESAwoBCBIAEgAaEgoCYTESDGFkbWluUHViS2V5MRoSCgJhMhIMYWRtaW5QdWJLZXkyGhIKAmEzEgxhZG1pblB1YktleTMaEAoCYTQSCmFkbVN0YWtpbmcaGgoCYTUSFGtleVNoYXJlVG9rZW5zTG9ja2VkGhEKAmE2EgtrU2hhcmVMaW1pdBoPCgJhNxIJa2V5QWN0aXZlGg4KAmE4EghrZXlDYXVzZRoiCgJhORIca2V5UmV3YXJkUG9vbEZyYWN0aW9uQ3VycmVudBojCgJiMRIda2V5UmV3YXJkUG9vbEZyYWN0aW9uUHJldmlvdXMaGwoCYjISFWtleUhlaWdodFBvb2xGcmFjdGlvbhojCgJiMxIda2V5VG90YWxSZXdhcmRQZXJCbG9ja0N1cnJlbnQaJAoCYjQSHmtleVRvdGFsUmV3YXJkUGVyQmxvY2tQcmV2aW91cxobCgJiNRIVa2V5UmV3YXJkVXBkYXRlSGVpZ2h0GhUKAmI2Eg9rZXlMYXN0SW50ZXJlc3QaGwoCYjcSFWtleUxhc3RJbnRlcmVzdEhlaWdodBoeCgJiOBIYa2V5VXNlclNoYXJlVG9rZW5zTG9ja2VkGhkKAmI5EhNrZXlVc2VyTGFzdEludGVyZXN0Gg8KAmMxEglrZXlTV09QaWQaHgoCYzISGGtleVVzZXJTV09QQ2xhaW1lZEFtb3VudBoiCgJjMxIca2V5VXNlclNXT1BMYXN0Q2xhaW1lZEFtb3VudBoWCgJjNBIQa2V5QXZhaWxhYmxlU1dPUBobCgJjNRIVa2V5RmFybWluZ1N0YXJ0SGVpZ2h0GgwKAmM2EgZrZXlBUFkaHAoCYzcSFmtQcmV2aW91c1RvdGFsVm90ZVNXT1AaGQoCYzgSE2tleVN3b3BZZWFyRW1pc3Npb24aFQoCYzkSD2tleUJhbGFuY2VjcG1tQRoVCgJkMRIPa2V5QmFsYW5jZWNwbW1CGicKAmQyEiFrSGFydmVzdFBvb2xBY3RpdmVWb3RlU3RydWNWb3RpbmcaKwoCZDMSJWtIYXJ2ZXN0VXNlclBvb2xBY3RpdmVWb3RlU3RydWNWb3RpbmcaHwoCZDQSGWtleUxpbWl0U2hhcmVGaXJzdEhhcnZlc3QaEQoCZDUSC2tleUFzc2V0SWRBGhEKAmQ2EgtrZXlBc3NldElkQhobCgJkNxIVa2V5Rmlyc3RIYXJ2ZXN0SGVpZ2h0GhkKAmQ4EhNrZXlmaXJzdEhhcnZlc3RDcG1tGhQKAmQ5Eg5rZXlUZW1wUHJldlN1bRoTCgJlMRINa2V5VGVtcEN1clN1bRoXCgJlMhIRZ292ZXJuYW5jZUFkZHJlc3MaDAoCZTMSBndhbGxldBoTCgJlNBINdm90aW5nQWRkcmVzcxoiCgJlNRIcYWRtaW5JbmNyZWFzZUludGVyZXN0QWRkcmVzcxoUCgJlNhIOb25lV2Vla0luQmxvY2saFAoCZTcSDnRvdGFsVm90ZVNoYXJlGhEKAmU4EgtzY2FsZVZhbHVlMRoRCgJlORILc2NhbGVWYWx1ZTMaEQoCZjESC3NjYWxlVmFsdWU1GhEKAmYyEgtzY2FsZVZhbHVlNhoRCgJmMxILc2NhbGVWYWx1ZTgaEgoCZjQSDHNjYWxlVmFsdWUxMRoRCgJmNRILc3RyQXNzZXRJZEEaCgoCZjYSBHBvb2waEQoCZjcSC3N0ckFzc2V0SWRCGg4KAmY4Eghhc3NldElkQRoOCgJmORIIYXNzZXRJZEIaEQoCZzESC2tCYXNlUGVyaW9kGhMKAmcyEg1rUGVyaW9kTGVuZ3RoGhIKAmczEgxrU3RhcnRIZWlnaHQaGQoCZzQSE2tGaXJzdEhhcnZlc3RIZWlnaHQaHAoCZzUSFmtEdXJhdGlvbkZ1bGxWb3RlUG93ZXIaEwoCZzYSDWtNaW5Wb3RlUG93ZXIaEAoCZzcSCmJhc2VQZXJpb2QaEQoCZzgSC3N0YXJ0SGVpZ2h0GhIKAmc5EgxwZXJpb2RMZW5ndGgaGwoCaDESFWR1cmF0aW9uRnVsbFZvdGVQb3dlchoSCgJoMhIMbWluVm90ZVBvd2VyGg4KAmgzEghpc0FjdGl2ZRoQCgJoNBIKY3VyclBlcmlvZBoTCgJoNRINZ2V0TGltaXRUb2tlbhoJCgJoNhIDQVBZGhYKAmg3EhBTd29wWWVhckVtaXNzaW9uGhAKAmg4Egphc3NldE5hbWVBGg0KAmg5EgckbWF0Y2gwGggKAmkxEgJpZBoLCgJpMhIFd2F2ZXMaEAoCaTMSCmFzc2V0TmFtZUIaCgoCaTQSBFNXT1AaFAoCaTUSDmlzRmlyc3RIYXJ2ZXN0GhsKAmk2EhVnZXRIZWlnaHRGaXJzdEhhcnZlc3QaEQoCaTcSC2dldEJhbGFuY2VBGhEKAmk4EgtnZXRCYWxhbmNlQhoYCgJpORISZ2V0U2hhcmVMaW1pdFRva2VuGh4KAmoxEhhnZXRUb3RhbFNoYXJlVG9rZW5Mb2NrZWQaFQoCajISD2dldFNoYXJlQXNzZXRJZBoUCgJqMxIOYWNjb3VudEJhbGFuY2UaDQoCajQSB2Fzc2V0SWQaEgoCajUSDGdldEFzc2V0SW5mbxoOCgJqNhIIc3RyaW5nSWQaCgoCajcSBGluZm8aFAoCajgSDmNhbGNTY2FsZVZhbHVlGg4KAmo5Eghhc3NldElkMRoOCgJrMRIIYXNzZXRJZDIaFgoCazISEGFzc2V0SWQxRGVjaW1hbHMaFgoCazMSEGFzc2V0SWQyRGVjaW1hbHMaEQoCazQSC3NjYWxlRGlnaXRzGhcKAms1EhF1c2VyQXZhaWxhYmxlU1dPUBoKCgJrNhIEdXNlchoQCgJrNxIKcmV3YXJkSW5mbxogCgJrOBIadG90YWxSZXdhcmRQZXJCbG9ja0N1cnJlbnQaIQoCazkSG3RvdGFsUmV3YXJkUGVyQmxvY2tQcmV2aW91cxofCgJsMRIZcmV3YXJkUG9vbEZyYWN0aW9uQ3VycmVudBoYCgJsMhIScmV3YXJkVXBkYXRlSGVpZ2h0GhwKAmwzEhZwb29sUmV3YXJkVXBkYXRlSGVpZ2h0GiAKAmw0EhpyZXdhcmRQb29sRnJhY3Rpb25QcmV2aW91cxoXCgJsNRIRcmV3YXJkUG9vbEN1cnJlbnQaGAoCbDYSEnJld2FyZFBvb2xQcmV2aW91cxoZCgJsNxITZ2V0TGFzdEludGVyZXN0SW5mbxoSCgJsOBIMbGFzdEludGVyZXN0GhgKAmw5EhJsYXN0SW50ZXJlc3RIZWlnaHQaGQoCbTESE2dldFVzZXJJbnRlcmVzdEluZm8aEQoCbTISC3VzZXJBZGRyU3RyGhYKAm0zEhB1c2VyTGFzdEludGVyZXN0Gg8KAm00Egl1c2VyU2hhcmUaGwoCbTUSFXVzZXJMYXN0SW50ZXJlc3RWYWx1ZRobCgJtNhIVdXNlclNoYXJlVG9rZW5zQW1vdW50GhIKAm03EgxjYWxjSW50ZXJlc3QaGwoCbTgSFWN1cnJlbnRSZXdhcmRQZXJCbG9jaxoWCgJtORIQc2hhcmVUb2tlbkxvY2tlZBocCgJuMRIWcHJldmlvdXNSZXdhcmRQZXJCbG9jaxoQCgJuMhIKc2NhbGVWYWx1ZRoHCgJuMxIBaBoMCgJuNBIGcmV3YXJkGjAKAm41EipyZXdhcmRBZnRlckxhc3RJbnRlcmVzdEJlZm9yZVJlYXdhcmRVcGRhdGUaGQoCbjYSE2ludGVyZXN0QWZ0ZXJVcGRhdGUaDwoCbjcSCWNsYWltQ2FsYxoSCgJuOBIMc2hhcmVBc3NldElkGhMKAm45Eg0kdDAxMzA1MDEzMTE1GhMKAm8xEg0kdDAxMzEyMDEzMjMyGhMKAm8yEg0kdDAxMzIzNzEzMzIxGhUKAm8zEg9jdXJyZW50SW50ZXJlc3QaEQoCbzQSC2NsYWltQW1vdW50GhUKAm81Eg91c2VyTmV3SW50ZXJlc3QaGwoCbzYSFWNsYWltQ2FsY0Zvck1pZ3JhdGlvbhoTCgJvNxINJHQwMTQwNDQxNDEwORoTCgJvOBINJHQwMTQxMTQxNDIyNhoTCgJvORINJHQwMTQyMzExNDMxNRodCgJwMRIXY2FsY3VsYXRlUHJvdG9jb2xSZXdhcmQaEwoCcDISDSR0MDE0ODE5MTQ4ODQaEwoCcDMSDSR0MDE0ODg5MTUwMDAaHAoCcDQSFmNoZWNrUG10QXNzZXRJZENvcnJlY3QaEAoCcDUSCnBtdEFzc2V0SWQaFgoCcDYSEHBvb2xTaGFyZUFzc2V0SWQaHgoCcDcSGGdldFVzZXJTV09QQ2xhaW1lZEFtb3VudBoNCgJwOBIHc3VzcGVuZBoLCgJwORIFY2F1c2UaBwoCcTESAWkaDQoCcTISB2Vhcmx5TFAaEAoCcTMSCmluaXRBbW91bnQaDwoCcTQSCVNXT1Bpc3N1ZRoMCgJxNRIGU1dPUGlkGhMKAnE2Eg0kdDAxNzk3MDE4MDczGhMKAnE3Eg1jdXJyZW50UmV3YXJkGhMKAnE4Eg0kdDAxODQ4MjE4NjE4GhMKAnE5Eg0kdDAxODYyMzE4NzI2GhMKAnIxEg0kdDAxODk2MDE5MDM1Gg8KAnIyEglwbXRBbW91bnQaEwoCcjMSDSR0MDE5MDQwMTkxMTMaEwoCcjQSDXBtdFN0ckFzc2V0SWQaEgoCcjUSDHBtdEFzc2V0TmFtZRoRCgJyNhILcG10RGVjaW1hbHMaEwoCcjcSDSR0MDE5MTE4MTkyMzQaGAoCcjgSEnVzZXJTaGFyZUFtb3VudE5ldxoXCgJyORIRYXZhaWxhYmxlRnVuZHNOZXcaFgoCczESEHRvdGFsU2hhcmVBbW91bnQaGQoCczISE3RvdGFsU2hhcmVBbW91bnROZXcaFwoCczMSEXVzZXJDbGFpbWVkQW1vdW50GhoKAnM0EhR1c2VyQ2xhaW1lZEFtb3VudE5ldxoPCgJzNRIJYmFzZUVudHJ5GhMKAnM2Eg1oYXJ2ZXN0UGVyaW9kGhQKAnM3Eg5hbW91bnRPZlZvdGluZxoWCgJzOBIQYW1vdW50UG9vbFN0cmFjdBokCgJzORIeYW1vdW50QWN0aXZlVm90ZVVzZXJQb29sU3RyYWN0GiAKAnQxEhphbW91bnRQb29sQWN0aXZlVm90ZVN0cmFjdBoaCgJ0MhIUdXNlclNoYXJlVG9rZW5Mb2NrZWQaGAoCdDMSEnVzZXJQb29sQWN0aXZlVm90ZRoUCgJ0NBIOcG9vbEFjdGl2ZVZvdGUaFAoCdDUSDnByb3RvY29sUmV3YXJkGhUKAnQ2Eg9saW1pdFNoYXJlVG9rZW4aEAoCdDcSCnNoYXJlVG9rZW4aHwoCdDgSGXNoYXJlVG9rZW5zV2l0aGRyYXdBbW91bnQaEwoCdDkSDXNoYXJlVG9rZW5zSWQaEwoCdTESDSR0MDIzNzY5MjM4ODUaCwoCdTISBXVzZXJzGhUKAnUzEg9taWdyYXRpb25IZWlnaHQaEAoCdTQSCnVwZGF0ZVVzZXIaCwoCdTUSBWFjY3VtGgcKAnU2EgF1GgcKAnU3EgFyGhUKAnU4Eg8kbGlzdDI2MzUyMjYzODMaFQoCdTkSDyRzaXplMjYzNTIyNjM4MxoVCgJ2MRIPJGFjYzAyNjM1MjI2MzgzGhUKAnYyEg8kYWNjMTI2MzUyMjYzODMaFQoCdjMSDyRhY2MyMjYzNTIyNjM4MxoVCgJ2NBIPJGFjYzMyNjM1MjI2MzgzGhUKAnY1Eg8kYWNjNDI2MzUyMjYzODMaFQoCdjYSDyRhY2M1MjYzNTIyNjM4MxoVCgJ2NxIPJGFjYzYyNjM1MjI2MzgzGhUKAnY4Eg8kYWNjNzI2MzUyMjYzODMaFQoCdjkSDyRhY2M4MjYzNTIyNjM4MxoVCgJ3MRIPJGFjYzkyNjM1MjI2MzgzGhYKAncyEhAkYWNjMTAyNjM1MjI2MzgzGhYKAnczEhAkYWNjMTEyNjM1MjI2MzgzGhYKAnc0EhAkYWNjMTIyNjM1MjI2MzgzGhYKAnc1EhAkYWNjMTMyNjM1MjI2MzgzGhoKAnc2EhRzaGFyZVRva2VuTXVsdGlwbHllchoTCgJ3NxINJHQwMjY2MDIyNjcxNBoeCgJ3OBIYdXNlclNoYXJlVG9rZW5zQW1vdW50TmV3GiQKAnc5Eh50b3RhbEFtb3VudE5ld1NoYXJlVG9rZW5Mb2NrZWQaKAoCeDESInRvdGFsQW1vdW50U2hhcmVUb2tlbnNMb2NrZWRCZWZvcmUaJQoCeDISH3RvdGFsQW1vdW50U2hhcmVUb2tlbnNMb2NrZWROZXcaEwoCeDMSDSR0MDI4ODczMjg5MzgaEwoCeDQSDSR0MDI4OTQzMjkwNTUaEwoCeDUSDSR0MDI5MDYwMjkxNzYaEwoCeDYSDWF2YWlsYWJsZUZ1bmQaCAoCeDcSAnR4GgwKAng4EgZ2ZXJpZnkaCQoCeDkSA2ludhoOCgJ5MRIIY2FsbEVnZzEaEwoCeTISDXNpZ25lZEJ5QWRtaW4aGAoCeTMSEmFkbWluUHViS2V5MVNpZ25lZBoYCgJ5NBISYWRtaW5QdWJLZXkyU2lnbmVkGhgKAnk1EhJhZG1pblB1YktleTNTaWduZWQAAABdAAAAAAJhMQEAAAAgugnXO4lZpNFdoP/xuzPQquE5aQ/L4r2R1jvuT16o4BMAAAAAAmEyAQAAACDCkUSZs9KwtA0ipZFYvYi8oTe7CMv/3YzmlO9bFg5+QAAAAAACYTMBAAAAII4eFy54sQc79EhOejMoYHYod/yZ5ZIwoyDCz6ir6Q5VAAAAAAJhNAEAAAAgsj2fHYY3mleF5iNR9OE3eyOPalgB3T7oDWjAjnR7WCgAAAAAAmE1AgAAABpfdG90YWxfc2hhcmVfdG9rZW5zX2xvY2tlZAAAAAACYTYCAAAAHHNoYXJlX2xpbWl0X29uX2ZpcnN0X2hhcnZlc3QAAAAAAmE3AgAAAAZhY3RpdmUAAAAAAmE4AgAAAA5zaHV0ZG93bl9jYXVzZQAAAAACYTkCAAAAHV9jdXJyZW50X3Bvb2xfZnJhY3Rpb25fcmV3YXJkAAAAAAJiMQIAAAAeX3ByZXZpb3VzX3Bvb2xfZnJhY3Rpb25fcmV3YXJkAAAAAAJiMgIAAAAaX3Bvb2xfcmV3YXJkX3VwZGF0ZV9oZWlnaHQAAAAAAmIzAgAAAB50b3RhbF9yZXdhcmRfcGVyX2Jsb2NrX2N1cnJlbnQAAAAAAmI0AgAAAB90b3RhbF9yZXdhcmRfcGVyX2Jsb2NrX3ByZXZpb3VzAAAAAAJiNQIAAAAUcmV3YXJkX3VwZGF0ZV9oZWlnaHQAAAAAAmI2AgAAAA5fbGFzdF9pbnRlcmVzdAAAAAACYjcCAAAAFV9sYXN0X2ludGVyZXN0X2hlaWdodAAAAAACYjgCAAAAFF9zaGFyZV90b2tlbnNfbG9ja2VkAAAAAAJiOQIAAAAOX2xhc3RfaW50ZXJlc3QAAAAAAmMxAgAAAAdTV09QX2lkAAAAAAJjMgIAAAAUX1NXT1BfY2xhaW1lZF9hbW91bnQAAAAAAmMzAgAAABlfU1dPUF9sYXN0X2NsYWltZWRfYW1vdW50AAAAAAJjNAIAAAAPX2F2YWlsYWJsZV9TV09QAAAAAAJjNQIAAAAUZmFybWluZ19zdGFydF9oZWlnaHQAAAAAAmM2AgAAAANhcHkAAAAAAmM3AgAAABhwcmV2aW91c190b3RhbF92b3RlX1NXT1AAAAAAAmM4AgAAABJzd29wX3llYXJfZW1pc3Npb24AAAAAAmM5AgAAAA9BX2Fzc2V0X2JhbGFuY2UAAAAAAmQxAgAAAA9CX2Fzc2V0X2JhbGFuY2UAAAAAAmQyAgAAAB5faGFydmVzdF9wb29sX2FjdGl2ZVZvdGVfc3RydWMAAAAAAmQzAgAAACNfaGFydmVzdF91c2VyX3Bvb2xfYWN0aXZlVm90ZV9zdHJ1YwAAAAACZDQCAAAAHHNoYXJlX2xpbWl0X29uX2ZpcnN0X2hhcnZlc3QAAAAAAmQ1AgAAAApBX2Fzc2V0X2lkAAAAAAJkNgIAAAAKQl9hc3NldF9pZAAAAAACZDcCAAAAFGZpcnN0X2hhcnZlc3RfaGVpZ2h0AAAAAAJkOAIAAAANZmlyc3RfaGFydmVzdAAAAAACZDkCAAAAE3N1bV9yZXdhcmRfcHJldmlvdXMA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", "height": 2768946, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: Dmo8mJrHppFBn2XYhgjUf9Ja1tKmzj1B3XckFdUy93Pj Next: ACtTTUaWqyUBWTRBYAurorzACJ9F8W7a1wcava6wN5kH Diff:
OldNewDifferences
1-{-# STDLIB_VERSION 4 #-}
1+{-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let adminPubKey1 = base58'DXDY2itiEcYBtGkVLnkpHtDFyWQUkoLJz79uJ7ECbMrA'
66 let adminPubKey2 = base58'E6Wa1SGoktYcjHjsKrvjMiqJY3SWmGKcD8Q5L8kxSPS7'
77
88 let adminPubKey3 = base58'AZmWJtuy4GeVrMmJH4hfFBRApe1StvhJSk4jcbT6bArQ'
9+
10+let admStaking = base58'Czn4yoAuUZCVCLJDRfskn8URfkwpknwBTZDbs1wFrY7h'
911
1012 let keyShareTokensLocked = "_total_share_tokens_locked"
1113
215217 let assetId1Decimals = value(assetInfo(assetId1)).decimals
216218 let assetId2Decimals = value(assetInfo(assetId2)).decimals
217219 let scaleDigits = ((assetId2Decimals - assetId1Decimals) + 8)
218- pow(10, 0, scaleDigits, 0, 0, HALFDOWN)
220+ pow(10, 0, scaleDigits, 0, 0, FLOOR)
219221 }
220222
221223
222-func userAvailableSWOP (pool,user) = valueOrElse(getInteger(this, (((pool + "_") + toString(user)) + keyAvailableSWOP)), 0)
224+func userAvailableSWOP (pool,user) = valueOrElse(getInteger(this, (((pool + "_") + user) + keyAvailableSWOP)), 0)
223225
224226
225227 func rewardInfo (pool) = {
246248 }
247249
248250
249-func getUserInterestInfo (pool,userAddress) = {
250- let userLastInterest = getInteger(this, (((pool + "_") + toString(userAddress)) + keyUserLastInterest))
251- let userShare = getInteger(this, (((pool + "_") + toString(userAddress)) + keyUserShareTokensLocked))
251+func getUserInterestInfo (pool,userAddrStr) = {
252+ let userLastInterest = getInteger(this, (((pool + "_") + userAddrStr) + keyUserLastInterest))
253+ let userShare = getInteger(this, (((pool + "_") + userAddrStr) + keyUserShareTokensLocked))
252254 let lastInterest = valueOrErrorMessage(getInteger(this, (pool + keyLastInterest)), (("No data on the key: " + pool) + keyLastInterest))
253255 let userLastInterestValue = match userLastInterest {
254256 case userLastInterest: Int =>
266268 }
267269
268270
269-func calcInterest (lastInterestHeight,rewardUpdateHeight,poolRewardUpdateHeight,lastInterest,currentRewardPerBlock,shareTokenLocked,previousRewardPerBlock,shareAssetId,scaleValue,pmtAmount) = if ((shareTokenLocked == 0))
271+func calcInterest (lastInterestHeight,rewardUpdateHeight,poolRewardUpdateHeight,lastInterest,currentRewardPerBlock,shareTokenLocked,previousRewardPerBlock,scaleValue,h) = if ((shareTokenLocked == 0))
270272 then 0
271273 else if ((poolRewardUpdateHeight != 0))
272- then if (if ((rewardUpdateHeight > height))
274+ then if (if ((rewardUpdateHeight > h))
273275 then (rewardUpdateHeight == poolRewardUpdateHeight)
274276 else false)
275277 then {
276- let reward = (previousRewardPerBlock * (height - lastInterestHeight))
278+ let reward = (previousRewardPerBlock * (h - lastInterestHeight))
277279 (lastInterest + fraction(reward, scaleValue, shareTokenLocked))
278280 }
279- else if (if ((height > rewardUpdateHeight))
281+ else if (if ((h > rewardUpdateHeight))
280282 then (rewardUpdateHeight != poolRewardUpdateHeight)
281283 else false)
282284 then {
283- let reward = (previousRewardPerBlock * (height - lastInterestHeight))
285+ let reward = (previousRewardPerBlock * (h - lastInterestHeight))
284286 (lastInterest + fraction(reward, scaleValue, shareTokenLocked))
285287 }
286- else if (if (if ((height > rewardUpdateHeight))
288+ else if (if (if ((h > rewardUpdateHeight))
287289 then (rewardUpdateHeight == poolRewardUpdateHeight)
288290 else false)
289291 then (lastInterestHeight > rewardUpdateHeight)
290292 else false)
291293 then {
292- let reward = (currentRewardPerBlock * (height - lastInterestHeight))
294+ let reward = (currentRewardPerBlock * (h - lastInterestHeight))
293295 (lastInterest + fraction(reward, scaleValue, shareTokenLocked))
294296 }
295297 else {
296298 let rewardAfterLastInterestBeforeReawardUpdate = (previousRewardPerBlock * (rewardUpdateHeight - lastInterestHeight))
297299 let interestAfterUpdate = (lastInterest + fraction(rewardAfterLastInterestBeforeReawardUpdate, scaleValue, shareTokenLocked))
298- let reward = (currentRewardPerBlock * (height - rewardUpdateHeight))
300+ let reward = (currentRewardPerBlock * (h - rewardUpdateHeight))
299301 (interestAfterUpdate + fraction(reward, scaleValue, shareTokenLocked))
300302 }
301- else if ((rewardUpdateHeight > height))
303+ else if ((rewardUpdateHeight > h))
302304 then {
303- let reward = (previousRewardPerBlock * (height - lastInterestHeight))
305+ let reward = (previousRewardPerBlock * (h - lastInterestHeight))
304306 (lastInterest + fraction(reward, scaleValue, shareTokenLocked))
305307 }
306308 else if ((lastInterestHeight > rewardUpdateHeight))
307309 then {
308- let reward = (currentRewardPerBlock * (height - lastInterestHeight))
310+ let reward = (currentRewardPerBlock * (h - lastInterestHeight))
309311 (lastInterest + fraction(reward, scaleValue, shareTokenLocked))
310312 }
311313 else {
312314 let rewardAfterLastInterestBeforeReawardUpdate = (previousRewardPerBlock * (rewardUpdateHeight - lastInterestHeight))
313315 let interestAfterUpdate = (lastInterest + fraction(rewardAfterLastInterestBeforeReawardUpdate, scaleValue, shareTokenLocked))
314- let reward = (currentRewardPerBlock * (height - rewardUpdateHeight))
316+ let reward = (currentRewardPerBlock * (h - rewardUpdateHeight))
315317 (interestAfterUpdate + fraction(reward, scaleValue, shareTokenLocked))
316318 }
317319
318320
319-func claimCalc (pool,caller,pmtAmount) = {
321+func claimCalc (pool,userAddrStr,h) = {
320322 let shareAssetId = getShareAssetId(pool)
321323 let scaleValue = calcScaleValue(SWOP, shareAssetId)
322324 let shareTokenLocked = getTotalShareTokenLocked(pool)
323- let $t01310313168 = getLastInterestInfo(pool)
324- let lastInterestHeight = $t01310313168._1
325- let lastInterest = $t01310313168._2
326- let $t01317313285 = rewardInfo(pool)
327- let currentRewardPerBlock = $t01317313285._1
328- let rewardUpdateHeight = $t01317313285._2
329- let previousRewardPerBlock = $t01317313285._3
330- let poolRewardUpdateHeight = $t01317313285._4
331- let $t01329013369 = getUserInterestInfo(pool, caller)
332- let userLastInterest = $t01329013369._1
333- let userShareTokensAmount = $t01329013369._2
334- let currentInterest = calcInterest(lastInterestHeight, rewardUpdateHeight, poolRewardUpdateHeight, lastInterest, currentRewardPerBlock, shareTokenLocked, previousRewardPerBlock, shareAssetId, scaleValue, pmtAmount)
325+ let $t01305013115 = getLastInterestInfo(pool)
326+ let lastInterestHeight = $t01305013115._1
327+ let lastInterest = $t01305013115._2
328+ let $t01312013232 = rewardInfo(pool)
329+ let currentRewardPerBlock = $t01312013232._1
330+ let rewardUpdateHeight = $t01312013232._2
331+ let previousRewardPerBlock = $t01312013232._3
332+ let poolRewardUpdateHeight = $t01312013232._4
333+ let $t01323713321 = getUserInterestInfo(pool, userAddrStr)
334+ let userLastInterest = $t01323713321._1
335+ let userShareTokensAmount = $t01323713321._2
336+ let currentInterest = calcInterest(lastInterestHeight, rewardUpdateHeight, poolRewardUpdateHeight, lastInterest, currentRewardPerBlock, shareTokenLocked, previousRewardPerBlock, scaleValue, h)
337+ let claimAmount = fraction(userShareTokensAmount, (currentInterest - userLastInterest), scaleValue)
338+ let userNewInterest = currentInterest
339+ $Tuple4(userNewInterest, currentInterest, claimAmount, userShareTokensAmount)
340+ }
341+
342+
343+func claimCalcForMigration (pool,userAddrStr,h) = {
344+ let shareAssetId = getShareAssetId(pool)
345+ let scaleValue = calcScaleValue(SWOP, shareAssetId)
346+ let shareTokenLocked = getTotalShareTokenLocked(pool)
347+ let $t01404414109 = getLastInterestInfo(pool)
348+ let lastInterestHeight = $t01404414109._1
349+ let lastInterest = $t01404414109._2
350+ let $t01411414226 = rewardInfo(pool)
351+ let currentRewardPerBlock = $t01411414226._1
352+ let rewardUpdateHeight = $t01411414226._2
353+ let previousRewardPerBlock = $t01411414226._3
354+ let poolRewardUpdateHeight = $t01411414226._4
355+ let $t01423114315 = getUserInterestInfo(pool, userAddrStr)
356+ let userLastInterest = $t01423114315._1
357+ let userShareTokensAmount = $t01423114315._2
358+ let currentInterest = calcInterest(lastInterestHeight, rewardUpdateHeight, poolRewardUpdateHeight, lastInterest, currentRewardPerBlock, shareTokenLocked, previousRewardPerBlock, scaleValue, h)
335359 let claimAmount = fraction(userShareTokensAmount, (currentInterest - userLastInterest), scaleValue)
336360 let userNewInterest = currentInterest
337361 $Tuple4(userNewInterest, currentInterest, claimAmount, userShareTokensAmount)
339363
340364
341365 func calculateProtocolReward (pool) = {
342- let $t01388713952 = getLastInterestInfo(pool)
343- let lastInterestHeight = $t01388713952._1
344- let lastInterest = $t01388713952._2
345- let $t01395714068 = rewardInfo(pool)
346- let currentRewardPerBlock = $t01395714068._1
347- let rewardUpdateHeight = $t01395714068._2
348- let previousRewardPerBlock = $t01395714068._3
349- let poolRewardUpdateHeight = $t01395714068._4
366+ let $t01481914884 = getLastInterestInfo(pool)
367+ let lastInterestHeight = $t01481914884._1
368+ let lastInterest = $t01481914884._2
369+ let $t01488915000 = rewardInfo(pool)
370+ let currentRewardPerBlock = $t01488915000._1
371+ let rewardUpdateHeight = $t01488915000._2
372+ let previousRewardPerBlock = $t01488915000._3
373+ let poolRewardUpdateHeight = $t01488915000._4
350374 let shareTokenLocked = getTotalShareTokenLocked(pool)
351375 if (if ((shareTokenLocked == 0))
352376 then (poolRewardUpdateHeight == 0)
409433 }
410434
411435
412-func getUserSWOPClaimedAmount (pool,user) = valueOrElse(getInteger(this, (((pool + "_") + toString(user)) + keyUserSWOPClaimedAmount)), 0)
436+func getUserSWOPClaimedAmount (pool,user) = valueOrElse(getInteger(this, (((pool + "_") + user) + keyUserSWOPClaimedAmount)), 0)
413437
414438
415439 func suspend (cause) = [BooleanEntry(keyActive, false), StringEntry(keyCause, cause)]
431455 func initPoolShareFarming (pool) = if ((i.caller != this))
432456 then throw("Only the DApp itself can call this function")
433457 else {
434- let $t01705417157 = rewardInfo(pool)
435- let currentReward = $t01705417157._1
436- let rewardUpdateHeight = $t01705417157._2
437- let previousRewardPerBlock = $t01705417157._3
438- let poolRewardUpdateHeight = $t01705417157._4
458+ let $t01797018073 = rewardInfo(pool)
459+ let currentReward = $t01797018073._1
460+ let rewardUpdateHeight = $t01797018073._2
461+ let previousRewardPerBlock = $t01797018073._3
462+ let poolRewardUpdateHeight = $t01797018073._4
439463 [IntegerEntry((pool + keyShareTokensLocked), 0), IntegerEntry((pool + keyLastInterest), 0), IntegerEntry((pool + keyLastInterestHeight), height)]
440464 }
441465
447471 else if (!(isActive))
448472 then throw("DApp is inactive at this moment")
449473 else {
450- let $t01756617686 = claimCalc(pool, adminIncreaseInterestAddress, 0)
451- let userNewInterest = $t01756617686._1
452- let currentInterest = $t01756617686._2
453- let claimAmount = $t01756617686._3
454- let userShareTokensAmount = $t01756617686._4
455- let $t01769117794 = rewardInfo(pool)
456- let currentReward = $t01769117794._1
457- let rewardUpdateHeight = $t01769117794._2
458- let previousRewardPerBlock = $t01769117794._3
459- let poolRewardUpdateHeight = $t01769117794._4
474+ let $t01848218618 = claimCalc(pool, toString(adminIncreaseInterestAddress), height)
475+ let userNewInterest = $t01848218618._1
476+ let currentInterest = $t01848218618._2
477+ let claimAmount = $t01848218618._3
478+ let userShareTokensAmount = $t01848218618._4
479+ let $t01862318726 = rewardInfo(pool)
480+ let currentReward = $t01862318726._1
481+ let rewardUpdateHeight = $t01862318726._2
482+ let previousRewardPerBlock = $t01862318726._3
483+ let poolRewardUpdateHeight = $t01862318726._4
460484 [IntegerEntry((pool + keyLastInterest), userNewInterest), IntegerEntry((pool + keyLastInterestHeight), height)]
461485 }
462486
464488
465489 @Callable(i)
466490 func lockShareTokens (pool) = {
467- let $t01798618061 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
468- let pmtAmount = $t01798618061._1
469- let pmtAssetId = $t01798618061._2
470- let $t01806618139 = getAssetInfo(pmtAssetId)
471- let pmtStrAssetId = $t01806618139._1
472- let pmtAssetName = $t01806618139._2
473- let pmtDecimals = $t01806618139._3
474- let $t01814418252 = claimCalc(pool, i.caller, pmtAmount)
475- let userNewInterest = $t01814418252._1
476- let currentInterest = $t01814418252._2
477- let claimAmount = $t01814418252._3
478- let userShareTokensAmount = $t01814418252._4
491+ let userAddrStr = toString(i.caller)
492+ let $t01896019035 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
493+ let pmtAmount = $t01896019035._1
494+ let pmtAssetId = $t01896019035._2
495+ let $t01904019113 = getAssetInfo(pmtAssetId)
496+ let pmtStrAssetId = $t01904019113._1
497+ let pmtAssetName = $t01904019113._2
498+ let pmtDecimals = $t01904019113._3
499+ let $t01911819234 = claimCalc(pool, toString(i.caller), height)
500+ let userNewInterest = $t01911819234._1
501+ let currentInterest = $t01911819234._2
502+ let claimAmount = $t01911819234._3
503+ let userShareTokensAmount = $t01911819234._4
479504 let userShareAmountNew = (userShareTokensAmount + pmtAmount)
480- let availableFundsNew = (userAvailableSWOP(pool, i.caller) + claimAmount)
505+ let availableFundsNew = (userAvailableSWOP(pool, toString(i.caller)) + claimAmount)
481506 let totalShareAmount = getTotalShareTokenLocked(pool)
482507 let totalShareAmountNew = (totalShareAmount + pmtAmount)
483- let userClaimedAmount = getUserSWOPClaimedAmount(pool, i.caller)
508+ let userClaimedAmount = getUserSWOPClaimedAmount(pool, toString(i.caller))
484509 let userClaimedAmountNew = (userClaimedAmount + claimAmount)
485- let baseEntry = [IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserLastInterest), userNewInterest), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserShareTokensLocked), userShareAmountNew), IntegerEntry((pool + keyShareTokensLocked), totalShareAmountNew), IntegerEntry((pool + keyLastInterest), currentInterest), IntegerEntry((pool + keyLastInterestHeight), height), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserSWOPClaimedAmount), userClaimedAmountNew), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserSWOPLastClaimedAmount), claimAmount), IntegerEntry((((pool + "_") + toString(i.caller)) + keyAvailableSWOP), availableFundsNew)]
486- if ((0 >= pmtAmount))
487- then throw("You can't lock token")
488- else if (!(isActive))
489- then throw("DApp is inactive at this moment")
490- else if (!(checkPmtAssetIdCorrect(pool, pmtAssetId)))
491- then throw("Incorrect pmtAssetId")
492- else if (if (isFirstHarvest(Address(fromBase58String(pool))))
493- then (getHeightFirstHarvest(Address(fromBase58String(pool))) > height)
494- else false)
495- then {
496- let harvestPeriod = ((((getHeightFirstHarvest(Address(fromBase58String(pool))) - startHeight) + 1) / periodLength) - 1)
497- let amountOfVoting = split(getStringValue(votingAddress, (((toString(i.caller) + "_") + pool) + "_user_pool_struc")), "_")
498- let amountPoolStract = split(getStringValue(votingAddress, (pool + "_pool_struc")), "_")
499- let amountActiveVoteUserPoolStract = split(valueOrElse(getString(votingAddress, (((toString(i.caller) + "_") + pool) + kHarvestUserPoolActiveVoteStrucVoting)), ""), "_")
500- let amountPoolActiveVoteStract = split(valueOrElse(getString(votingAddress, (pool + kHarvestPoolActiveVoteStrucVoting)), ""), "_")
501- let userShareTokenLocked = userShareTokensAmount
502- let userPoolActiveVote = if ((toString(currPeriod) == amountOfVoting[2]))
503- then valueOrElse(parseInt(amountActiveVoteUserPoolStract[0]), 0)
504- else valueOrElse(parseInt(amountOfVoting[1]), 0)
505- let poolActiveVote = if ((toString(currPeriod) == amountPoolStract[2]))
506- then valueOrElse(parseInt(amountPoolActiveVoteStract[0]), 0)
507- else valueOrElse(parseInt(amountPoolStract[1]), 0)
508- let protocolReward = calculateProtocolReward(pool)
509- if ((userPoolActiveVote != 0))
510- then {
511- let limitShareToken = getShareLimitToken(addressFromStringValue(pool))
512- let shareToken = (fraction(limitShareToken, userPoolActiveVote, poolActiveVote) - userShareTokenLocked)
513- if (if ((size(amountActiveVoteUserPoolStract) > 1))
514- then (valueOrElse(parseInt(amountActiveVoteUserPoolStract[1]), 0) >= harvestPeriod)
515- else false)
516- then throw("You can't share token")
517- else if ((pmtAmount > limitShareToken))
518- then throw(("You can't share token more than " + toString(limitShareToken)))
519- else if ((shareToken > 0))
520- then if ((fraction(99, (accountBalance(pmtAssetId) + pmtAmount), 100) > totalShareAmountNew))
521- then throw("Balance of share-token is greater than totalAmount")
522- else if ((totalShareAmount == 0))
523- then (baseEntry ++ [Reissue(SWOP, protocolReward, true), ScriptTransfer(wallet, protocolReward, SWOP)])
524- else if ((shareToken >= pmtAmount))
525- then baseEntry
526- else throw(("Your maximum share token is " + toString(shareToken)))
527- else throw("You can't share token")
528- }
529- else throw("Your amount of token less than 0")
530- }
531- else baseEntry
510+ let baseEntry = [IntegerEntry((((pool + "_") + userAddrStr) + keyUserLastInterest), userNewInterest), IntegerEntry((((pool + "_") + userAddrStr) + keyUserShareTokensLocked), userShareAmountNew), IntegerEntry((pool + keyShareTokensLocked), totalShareAmountNew), IntegerEntry((pool + keyLastInterest), currentInterest), IntegerEntry((pool + keyLastInterestHeight), height), IntegerEntry((((pool + "_") + userAddrStr) + keyUserSWOPClaimedAmount), userClaimedAmountNew), IntegerEntry((((pool + "_") + userAddrStr) + keyUserSWOPLastClaimedAmount), claimAmount), IntegerEntry((((pool + "_") + userAddrStr) + keyAvailableSWOP), availableFundsNew)]
511+ if (if ((pool == "3PNVFWopwCD9CgGXkpYWEY94oQ5XCAEXBmQ"))
512+ then true
513+ else (pool == "3PEeJQRJT4v4XvSUBPmxhdWKz439nae7KtQ"))
514+ then throw()
515+ else if ((0 >= pmtAmount))
516+ then throw("You can't lock token")
517+ else if (!(isActive))
518+ then throw("DApp is inactive at this moment")
519+ else if (!(checkPmtAssetIdCorrect(pool, pmtAssetId)))
520+ then throw("Incorrect pmtAssetId")
521+ else if (if (isFirstHarvest(Address(fromBase58String(pool))))
522+ then (getHeightFirstHarvest(Address(fromBase58String(pool))) > height)
523+ else false)
524+ then {
525+ let harvestPeriod = ((((getHeightFirstHarvest(Address(fromBase58String(pool))) - startHeight) + 1) / periodLength) - 1)
526+ let amountOfVoting = split(getStringValue(votingAddress, (((userAddrStr + "_") + pool) + "_user_pool_struc")), "_")
527+ let amountPoolStract = split(getStringValue(votingAddress, (pool + "_pool_struc")), "_")
528+ let amountActiveVoteUserPoolStract = split(valueOrElse(getString(votingAddress, (((userAddrStr + "_") + pool) + kHarvestUserPoolActiveVoteStrucVoting)), ""), "_")
529+ let amountPoolActiveVoteStract = split(valueOrElse(getString(votingAddress, (pool + kHarvestPoolActiveVoteStrucVoting)), ""), "_")
530+ let userShareTokenLocked = userShareTokensAmount
531+ let userPoolActiveVote = if ((toString(currPeriod) == amountOfVoting[2]))
532+ then valueOrElse(parseInt(amountActiveVoteUserPoolStract[0]), 0)
533+ else valueOrElse(parseInt(amountOfVoting[1]), 0)
534+ let poolActiveVote = if ((toString(currPeriod) == amountPoolStract[2]))
535+ then valueOrElse(parseInt(amountPoolActiveVoteStract[0]), 0)
536+ else valueOrElse(parseInt(amountPoolStract[1]), 0)
537+ let protocolReward = calculateProtocolReward(pool)
538+ if ((userPoolActiveVote != 0))
539+ then {
540+ let limitShareToken = getShareLimitToken(addressFromStringValue(pool))
541+ let shareToken = (fraction(limitShareToken, userPoolActiveVote, poolActiveVote) - userShareTokenLocked)
542+ if (if ((size(amountActiveVoteUserPoolStract) > 1))
543+ then (valueOrElse(parseInt(amountActiveVoteUserPoolStract[1]), 0) >= harvestPeriod)
544+ else false)
545+ then throw("You can't share token")
546+ else if ((pmtAmount > limitShareToken))
547+ then throw(("You can't share token more than " + toString(limitShareToken)))
548+ else if ((shareToken > 0))
549+ then if ((fraction(99, (accountBalance(pmtAssetId) + pmtAmount), 100) > totalShareAmountNew))
550+ then throw("Balance of share-token is greater than totalAmount")
551+ else if ((totalShareAmount == 0))
552+ then (baseEntry ++ [Reissue(SWOP, protocolReward, true), ScriptTransfer(wallet, protocolReward, SWOP)])
553+ else if ((shareToken >= pmtAmount))
554+ then baseEntry
555+ else throw(("Your maximum share token is " + toString(shareToken)))
556+ else throw("You can't share token")
557+ }
558+ else throw("Your amount of token less than 0")
559+ }
560+ else baseEntry
532561 }
533562
534563
536565 @Callable(i)
537566 func withdrawShareTokens (pool,shareTokensWithdrawAmount) = {
538567 let shareTokensId = fromBase58String(getStringValue(value(addressFromString(pool)), "share_asset_id"))
539- let $t02270022800 = claimCalc(pool, i.caller, 1)
540- let userNewInterest = $t02270022800._1
541- let currentInterest = $t02270022800._2
542- let claimAmount = $t02270022800._3
543- let userShareTokensAmount = $t02270022800._4
568+ let $t02376923885 = claimCalc(pool, toString(i.caller), height)
569+ let userNewInterest = $t02376923885._1
570+ let currentInterest = $t02376923885._2
571+ let claimAmount = $t02376923885._3
572+ let userShareTokensAmount = $t02376923885._4
544573 let userShareAmountNew = (userShareTokensAmount - shareTokensWithdrawAmount)
545- let availableFundsNew = (userAvailableSWOP(pool, i.caller) + claimAmount)
574+ let availableFundsNew = (userAvailableSWOP(pool, toString(i.caller)) + claimAmount)
546575 let totalShareAmount = getTotalShareTokenLocked(pool)
547576 let totalShareAmountNew = (totalShareAmount - shareTokensWithdrawAmount)
548- let userClaimedAmount = getUserSWOPClaimedAmount(pool, i.caller)
577+ let userClaimedAmount = getUserSWOPClaimedAmount(pool, toString(i.caller))
549578 let userClaimedAmountNew = (userClaimedAmount + claimAmount)
550- if ((shareTokensWithdrawAmount > userShareTokensAmount))
551- then throw("Withdraw amount more then user locked amount")
552- else if (!(isActive))
553- then throw("DApp is inactive at this moment")
554- else if ((shareTokensWithdrawAmount > userShareTokensAmount))
555- then throw("Withdraw amount more then user locked amount")
556- else if ((fraction(99, (accountBalance(shareTokensId) - shareTokensWithdrawAmount), 100) > totalShareAmountNew))
557- then throw("Balance of share-token is greater than totalAmount")
558- else [IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserLastInterest), userNewInterest), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserShareTokensLocked), userShareAmountNew), IntegerEntry((pool + keyLastInterest), currentInterest), IntegerEntry((pool + keyLastInterestHeight), height), IntegerEntry((pool + keyShareTokensLocked), totalShareAmountNew), IntegerEntry((((pool + "_") + toString(i.caller)) + keyAvailableSWOP), availableFundsNew), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserSWOPClaimedAmount), userClaimedAmountNew), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserSWOPLastClaimedAmount), claimAmount), ScriptTransfer(i.caller, shareTokensWithdrawAmount, shareTokensId)]
579+ if (if ((pool == "3PNVFWopwCD9CgGXkpYWEY94oQ5XCAEXBmQ"))
580+ then true
581+ else (pool == "3PEeJQRJT4v4XvSUBPmxhdWKz439nae7KtQ"))
582+ then throw()
583+ else if ((shareTokensWithdrawAmount > userShareTokensAmount))
584+ then throw("Withdraw amount more then user locked amount")
585+ else if (!(isActive))
586+ then throw("DApp is inactive at this moment")
587+ else if ((shareTokensWithdrawAmount > userShareTokensAmount))
588+ then throw("Withdraw amount more then user locked amount")
589+ else if ((fraction(99, (accountBalance(shareTokensId) - shareTokensWithdrawAmount), 100) > totalShareAmountNew))
590+ then throw("Balance of share-token is greater than totalAmount")
591+ else [IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserLastInterest), userNewInterest), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserShareTokensLocked), userShareAmountNew), IntegerEntry((pool + keyLastInterest), currentInterest), IntegerEntry((pool + keyLastInterestHeight), height), IntegerEntry((pool + keyShareTokensLocked), totalShareAmountNew), IntegerEntry((((pool + "_") + toString(i.caller)) + keyAvailableSWOP), availableFundsNew), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserSWOPClaimedAmount), userClaimedAmountNew), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserSWOPLastClaimedAmount), claimAmount), ScriptTransfer(i.caller, shareTokensWithdrawAmount, shareTokensId)]
559592 }
593+
594+
595+
596+@Callable(i)
597+func egg0 (pool,users,migrationHeight) = if (if ((pool != "3PNVFWopwCD9CgGXkpYWEY94oQ5XCAEXBmQ"))
598+ then (pool != "3PEeJQRJT4v4XvSUBPmxhdWKz439nae7KtQ")
599+ else false)
600+ then throw()
601+ else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, admStaking], i.callerPublicKey)))
602+ then throw("Only admin can call this function")
603+ else {
604+ func updateUser (accum,u) = {
605+ let r = invoke(this, "egg1", [pool, u, migrationHeight], nil)
606+ if ((r == r))
607+ then accum
608+ else throw("Strict value is not equal to itself.")
609+ }
610+
611+ let $list2635226383 = users
612+ let $size2635226383 = size($list2635226383)
613+ let $acc02635226383 = nil
614+ if (($size2635226383 == 0))
615+ then $acc02635226383
616+ else {
617+ let $acc12635226383 = updateUser($acc02635226383, $list2635226383[0])
618+ if (($size2635226383 == 1))
619+ then $acc12635226383
620+ else {
621+ let $acc22635226383 = updateUser($acc12635226383, $list2635226383[1])
622+ if (($size2635226383 == 2))
623+ then $acc22635226383
624+ else {
625+ let $acc32635226383 = updateUser($acc22635226383, $list2635226383[2])
626+ if (($size2635226383 == 3))
627+ then $acc32635226383
628+ else {
629+ let $acc42635226383 = updateUser($acc32635226383, $list2635226383[3])
630+ if (($size2635226383 == 4))
631+ then $acc42635226383
632+ else {
633+ let $acc52635226383 = updateUser($acc42635226383, $list2635226383[4])
634+ if (($size2635226383 == 5))
635+ then $acc52635226383
636+ else {
637+ let $acc62635226383 = updateUser($acc52635226383, $list2635226383[5])
638+ if (($size2635226383 == 6))
639+ then $acc62635226383
640+ else {
641+ let $acc72635226383 = updateUser($acc62635226383, $list2635226383[6])
642+ if (($size2635226383 == 7))
643+ then $acc72635226383
644+ else {
645+ let $acc82635226383 = updateUser($acc72635226383, $list2635226383[7])
646+ if (($size2635226383 == 8))
647+ then $acc82635226383
648+ else {
649+ let $acc92635226383 = updateUser($acc82635226383, $list2635226383[8])
650+ if (($size2635226383 == 9))
651+ then $acc92635226383
652+ else {
653+ let $acc102635226383 = updateUser($acc92635226383, $list2635226383[9])
654+ if (($size2635226383 == 10))
655+ then $acc102635226383
656+ else {
657+ let $acc112635226383 = updateUser($acc102635226383, $list2635226383[10])
658+ if (($size2635226383 == 11))
659+ then $acc112635226383
660+ else {
661+ let $acc122635226383 = updateUser($acc112635226383, $list2635226383[11])
662+ if (($size2635226383 == 12))
663+ then $acc122635226383
664+ else {
665+ let $acc132635226383 = updateUser($acc122635226383, $list2635226383[12])
666+ throw("List size exceed 12")
667+ }
668+ }
669+ }
670+ }
671+ }
672+ }
673+ }
674+ }
675+ }
676+ }
677+ }
678+ }
679+ }
680+ }
681+
682+
683+
684+@Callable(i)
685+func egg1 (pool,u,migrationHeight) = if ((i.caller != this))
686+ then throw("Only contract itself can invoke this function")
687+ else {
688+ let shareTokenMultiplyer = 1000
689+ let $t02660226714 = claimCalc(pool, u, migrationHeight)
690+ let userNewInterest = $t02660226714._1
691+ let currentInterest = $t02660226714._2
692+ let claimAmount = $t02660226714._3
693+ let userShareTokensAmount = $t02660226714._4
694+ let availableFundsNew = (userAvailableSWOP(pool, u) + claimAmount)
695+ let userClaimedAmount = getUserSWOPClaimedAmount(pool, u)
696+ let userClaimedAmountNew = (userClaimedAmount + claimAmount)
697+ let userShareTokensAmountNew = (userShareTokensAmount * shareTokenMultiplyer)
698+ let totalAmountNewShareTokenLocked = valueOrElse(getInteger(this, ((pool + "_") + "tansl")), 0)
699+[IntegerEntry((((pool + "_") + u) + keyUserLastInterest), 0), IntegerEntry((((pool + "_") + u) + keyUserShareTokensLocked), userShareTokensAmountNew), IntegerEntry((((pool + "_") + u) + keyAvailableSWOP), availableFundsNew), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserSWOPClaimedAmount), userClaimedAmountNew), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserSWOPLastClaimedAmount), claimAmount), IntegerEntry(((pool + "_") + "tansl"), (totalAmountNewShareTokenLocked + userShareTokensAmountNew))]
700+ }
701+
702+
703+
704+@Callable(i)
705+func updateTotalShareTokensLocked (pool,migrationHeight) = if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, admStaking], i.callerPublicKey)))
706+ then throw("Only admin can call this function")
707+ else {
708+ let shareTokenMultiplyer = 1000
709+ let totalAmountShareTokensLockedBefore = (getIntegerValue(this, (pool + keyShareTokensLocked)) * 1000)
710+ let totalAmountShareTokensLockedNew = getIntegerValue(this, ((pool + "_") + "tansl"))
711+ if ((totalAmountShareTokensLockedBefore != totalAmountShareTokensLockedNew))
712+ then throw("New total amount share tockens != old total amount")
713+ else [IntegerEntry((pool + keyLastInterest), 0), IntegerEntry((pool + keyLastInterestHeight), migrationHeight), IntegerEntry((pool + keyShareTokensLocked), totalAmountShareTokensLockedNew), DeleteEntry(((pool + "_") + "tansl"))]
714+ }
560715
561716
562717
564719 func claim (pool) = {
565720 let shareTokensId = fromBase58String(getStringValue(value(addressFromString(pool)), "share_asset_id"))
566721 let shareTokenLocked = getTotalShareTokenLocked(pool)
567- let $t02481024875 = getLastInterestInfo(pool)
568- let lastInterestHeight = $t02481024875._1
569- let lastInterest = $t02481024875._2
570- let $t02488024992 = rewardInfo(pool)
571- let currentRewardPerBlock = $t02488024992._1
572- let rewardUpdateHeight = $t02488024992._2
573- let previousRewardPerBlock = $t02488024992._3
574- let poolRewardUpdateHeight = $t02488024992._4
575- let $t02499725097 = claimCalc(pool, i.caller, 1)
576- let userNewInterest = $t02499725097._1
577- let currentInterest = $t02499725097._2
578- let claimAmount = $t02499725097._3
579- let userShareTokensAmount = $t02499725097._4
580- let availableFund = (userAvailableSWOP(pool, i.caller) + claimAmount)
581- let userClaimedAmount = getUserSWOPClaimedAmount(pool, i.caller)
722+ let $t02887328938 = getLastInterestInfo(pool)
723+ let lastInterestHeight = $t02887328938._1
724+ let lastInterest = $t02887328938._2
725+ let $t02894329055 = rewardInfo(pool)
726+ let currentRewardPerBlock = $t02894329055._1
727+ let rewardUpdateHeight = $t02894329055._2
728+ let previousRewardPerBlock = $t02894329055._3
729+ let poolRewardUpdateHeight = $t02894329055._4
730+ let $t02906029176 = claimCalc(pool, toString(i.caller), height)
731+ let userNewInterest = $t02906029176._1
732+ let currentInterest = $t02906029176._2
733+ let claimAmount = $t02906029176._3
734+ let userShareTokensAmount = $t02906029176._4
735+ let availableFund = (userAvailableSWOP(pool, toString(i.caller)) + claimAmount)
736+ let userClaimedAmount = getUserSWOPClaimedAmount(pool, toString(i.caller))
582737 let userClaimedAmountNew = (userClaimedAmount + claimAmount)
583- if ((availableFund == 0))
584- then throw("You have 0 available SWOP")
585- else if (!(isActive))
586- then throw("DApp is inactive at this moment")
587- else if ((availableFund == 0))
588- then throw("You have 0 available SWOP")
589- else if ((fraction(99, accountBalance(shareTokensId), 100) > shareTokenLocked))
590- then throw("Balance of share-token is greater than totalAmount")
591- else [IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserLastInterest), userNewInterest), IntegerEntry((pool + keyLastInterest), currentInterest), IntegerEntry((pool + keyLastInterestHeight), height), IntegerEntry((((pool + "_") + toString(i.caller)) + keyAvailableSWOP), 0), Reissue(SWOP, availableFund, true), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserSWOPClaimedAmount), userClaimedAmountNew), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserSWOPLastClaimedAmount), claimAmount), ScriptTransfer(i.caller, availableFund, SWOP)]
738+ if (if ((pool == "3PNVFWopwCD9CgGXkpYWEY94oQ5XCAEXBmQ"))
739+ then true
740+ else (pool == "3PEeJQRJT4v4XvSUBPmxhdWKz439nae7KtQ"))
741+ then throw()
742+ else if ((availableFund == 0))
743+ then throw("You have 0 available SWOP")
744+ else if (!(isActive))
745+ then throw("DApp is inactive at this moment")
746+ else if ((availableFund == 0))
747+ then throw("You have 0 available SWOP")
748+ else if ((fraction(99, accountBalance(shareTokensId), 100) > shareTokenLocked))
749+ then throw("Balance of share-token is greater than totalAmount")
750+ else [IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserLastInterest), userNewInterest), IntegerEntry((pool + keyLastInterest), currentInterest), IntegerEntry((pool + keyLastInterestHeight), height), IntegerEntry((((pool + "_") + toString(i.caller)) + keyAvailableSWOP), 0), Reissue(SWOP, availableFund, true), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserSWOPClaimedAmount), userClaimedAmountNew), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserSWOPLastClaimedAmount), claimAmount), ScriptTransfer(i.caller, availableFund, SWOP)]
592751 }
593752
594753
612771
613772 @Verifier(tx)
614773 func verify () = match tx {
774+ case inv: InvokeScriptTransaction =>
775+ let callEgg1 = if ((inv.dApp == this))
776+ then (inv.function == "egg1")
777+ else false
778+ let signedByAdmin = if (if (if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
779+ then true
780+ else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey2))
781+ then true
782+ else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey3))
783+ then true
784+ else sigVerify(tx.bodyBytes, tx.proofs[0], admStaking)
785+ if (callEgg1)
786+ then signedByAdmin
787+ else false
615788 case _ =>
616789 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
617790 then 1
Full:
OldNewDifferences
1-{-# STDLIB_VERSION 4 #-}
1+{-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let adminPubKey1 = base58'DXDY2itiEcYBtGkVLnkpHtDFyWQUkoLJz79uJ7ECbMrA'
55
66 let adminPubKey2 = base58'E6Wa1SGoktYcjHjsKrvjMiqJY3SWmGKcD8Q5L8kxSPS7'
77
88 let adminPubKey3 = base58'AZmWJtuy4GeVrMmJH4hfFBRApe1StvhJSk4jcbT6bArQ'
9+
10+let admStaking = base58'Czn4yoAuUZCVCLJDRfskn8URfkwpknwBTZDbs1wFrY7h'
911
1012 let keyShareTokensLocked = "_total_share_tokens_locked"
1113
1214 let kShareLimit = "share_limit_on_first_harvest"
1315
1416 let keyActive = "active"
1517
1618 let keyCause = "shutdown_cause"
1719
1820 let keyRewardPoolFractionCurrent = "_current_pool_fraction_reward"
1921
2022 let keyRewardPoolFractionPrevious = "_previous_pool_fraction_reward"
2123
2224 let keyHeightPoolFraction = "_pool_reward_update_height"
2325
2426 let keyTotalRewardPerBlockCurrent = "total_reward_per_block_current"
2527
2628 let keyTotalRewardPerBlockPrevious = "total_reward_per_block_previous"
2729
2830 let keyRewardUpdateHeight = "reward_update_height"
2931
3032 let keyLastInterest = "_last_interest"
3133
3234 let keyLastInterestHeight = "_last_interest_height"
3335
3436 let keyUserShareTokensLocked = "_share_tokens_locked"
3537
3638 let keyUserLastInterest = "_last_interest"
3739
3840 let keySWOPid = "SWOP_id"
3941
4042 let keyUserSWOPClaimedAmount = "_SWOP_claimed_amount"
4143
4244 let keyUserSWOPLastClaimedAmount = "_SWOP_last_claimed_amount"
4345
4446 let keyAvailableSWOP = "_available_SWOP"
4547
4648 let keyFarmingStartHeight = "farming_start_height"
4749
4850 let keyAPY = "apy"
4951
5052 let kPreviousTotalVoteSWOP = "previous_total_vote_SWOP"
5153
5254 let keySwopYearEmission = "swop_year_emission"
5355
5456 let keyBalancecpmmA = "A_asset_balance"
5557
5658 let keyBalancecpmmB = "B_asset_balance"
5759
5860 let kHarvestPoolActiveVoteStrucVoting = "_harvest_pool_activeVote_struc"
5961
6062 let kHarvestUserPoolActiveVoteStrucVoting = "_harvest_user_pool_activeVote_struc"
6163
6264 let keyLimitShareFirstHarvest = "share_limit_on_first_harvest"
6365
6466 let keyAssetIdA = "A_asset_id"
6567
6668 let keyAssetIdB = "B_asset_id"
6769
6870 let keyFirstHarvestHeight = "first_harvest_height"
6971
7072 let keyfirstHarvestCpmm = "first_harvest"
7173
7274 let keyTempPrevSum = "sum_reward_previous"
7375
7476 let keyTempCurSum = "sum_reward_current"
7577
7678 let governanceAddress = Address(base58'3PLHVWCqA9DJPDbadUofTohnCULLauiDWhS')
7779
7880 let wallet = Address(base58'3P6J84oH51DzY6xk2mT5TheXRbrCwBMxonp')
7981
8082 let votingAddress = Address(base58'3PQZWxShKGRgBN1qoJw6B4s9YWS9FneZTPg')
8183
8284 let adminIncreaseInterestAddress = Address(base58'3PPupsBVHgDXaRhyMbkTxminzAotp8AMsr6')
8385
8486 let oneWeekInBlock = 10106
8587
8688 let totalVoteShare = 10000000000
8789
8890 let scaleValue1 = 10
8991
9092 let scaleValue3 = 1000
9193
9294 let scaleValue5 = 100000
9395
9496 let scaleValue6 = 1000000
9597
9698 let scaleValue8 = 100000000
9799
98100 let scaleValue11 = 100000000000
99101
100102 func strAssetIdA (pool) = getStringValue(pool, keyAssetIdA)
101103
102104
103105 func strAssetIdB (pool) = getStringValue(pool, keyAssetIdB)
104106
105107
106108 func assetIdA (pool) = if ((strAssetIdA(pool) == "WAVES"))
107109 then unit
108110 else fromBase58String(strAssetIdA(pool))
109111
110112
111113 func assetIdB (pool) = if ((strAssetIdB(pool) == "WAVES"))
112114 then unit
113115 else fromBase58String(strAssetIdB(pool))
114116
115117
116118 let kBasePeriod = "base_period"
117119
118120 let kPeriodLength = "period_length"
119121
120122 let kStartHeight = "start_height"
121123
122124 let kFirstHarvestHeight = "first_harvest_height"
123125
124126 let kDurationFullVotePower = "duration_full_vote_power"
125127
126128 let kMinVotePower = "min_vote_power"
127129
128130 let basePeriod = valueOrErrorMessage(getInteger(votingAddress, kBasePeriod), "Empty kBasePeriod")
129131
130132 let startHeight = valueOrErrorMessage(getInteger(votingAddress, kStartHeight), "Empty kStartHeight")
131133
132134 let periodLength = valueOrErrorMessage(getInteger(votingAddress, kPeriodLength), "Empty kPeriodLength")
133135
134136 let durationFullVotePower = valueOrErrorMessage(getInteger(votingAddress, kDurationFullVotePower), "Empty kDurationFullVotePower")
135137
136138 let minVotePower = valueOrErrorMessage(getInteger(votingAddress, kMinVotePower), "Empty kMinVotePower")
137139
138140 let isActive = getBooleanValue(this, keyActive)
139141
140142 let currPeriod = (basePeriod + ((height - startHeight) / periodLength))
141143
142144 func getLimitToken (pool) = valueOrElse(getIntegerValue(pool, keyLimitShareFirstHarvest), 0)
143145
144146
145147 let APY = getIntegerValue(this, keyAPY)
146148
147149 let SwopYearEmission = getIntegerValue(this, keySwopYearEmission)
148150
149151 func assetNameA (pool) = match assetIdA(pool) {
150152 case id: ByteVector =>
151153 value(assetInfo(id)).name
152154 case waves: Unit =>
153155 "WAVES"
154156 case _ =>
155157 throw("Match error")
156158 }
157159
158160
159161 func assetNameB (pool) = match assetIdB(pool) {
160162 case id: ByteVector =>
161163 value(assetInfo(id)).name
162164 case waves: Unit =>
163165 "WAVES"
164166 case _ =>
165167 throw("Match error")
166168 }
167169
168170
169171 let SWOP = fromBase58String(getStringValue(this, keySWOPid))
170172
171173 func isFirstHarvest (pool) = valueOrElse(getBoolean(pool, keyfirstHarvestCpmm), false)
172174
173175
174176 func getHeightFirstHarvest (pool) = valueOrElse(getInteger(pool, keyFirstHarvestHeight), 0)
175177
176178
177179 func getBalanceA (pool) = valueOrErrorMessage(getInteger(pool, keyBalancecpmmA), ("No data on the key: " + keyBalancecpmmA))
178180
179181
180182 func getBalanceB (pool) = valueOrErrorMessage(getInteger(pool, keyBalancecpmmB), ("No data on the key: " + keyBalancecpmmB))
181183
182184
183185 func getShareLimitToken (pool) = valueOrErrorMessage(getInteger(pool, kShareLimit), ("No data on the key: " + kShareLimit))
184186
185187
186188 func getTotalShareTokenLocked (pool) = valueOrErrorMessage(getInteger(this, (pool + keyShareTokensLocked)), (("No data on the key: " + pool) + keyShareTokensLocked))
187189
188190
189191 func getShareAssetId (pool) = fromBase58String(getStringValue(value(addressFromString(pool)), "share_asset_id"))
190192
191193
192194 func accountBalance (assetId) = match assetId {
193195 case id: ByteVector =>
194196 assetBalance(this, id)
195197 case waves: Unit =>
196198 wavesBalance(this).available
197199 case _ =>
198200 throw("Match error")
199201 }
200202
201203
202204 func getAssetInfo (assetId) = match assetId {
203205 case id: ByteVector =>
204206 let stringId = toBase58String(id)
205207 let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
206208 $Tuple3(stringId, info.name, info.decimals)
207209 case waves: Unit =>
208210 $Tuple3("WAVES", "WAVES", 8)
209211 case _ =>
210212 throw("Match error")
211213 }
212214
213215
214216 func calcScaleValue (assetId1,assetId2) = {
215217 let assetId1Decimals = value(assetInfo(assetId1)).decimals
216218 let assetId2Decimals = value(assetInfo(assetId2)).decimals
217219 let scaleDigits = ((assetId2Decimals - assetId1Decimals) + 8)
218- pow(10, 0, scaleDigits, 0, 0, HALFDOWN)
220+ pow(10, 0, scaleDigits, 0, 0, FLOOR)
219221 }
220222
221223
222-func userAvailableSWOP (pool,user) = valueOrElse(getInteger(this, (((pool + "_") + toString(user)) + keyAvailableSWOP)), 0)
224+func userAvailableSWOP (pool,user) = valueOrElse(getInteger(this, (((pool + "_") + user) + keyAvailableSWOP)), 0)
223225
224226
225227 func rewardInfo (pool) = {
226228 let totalRewardPerBlockCurrent = valueOrErrorMessage(getInteger(governanceAddress, keyTotalRewardPerBlockCurrent), ((("No data on the key: " + keyTotalRewardPerBlockCurrent) + " at address ") + toString(governanceAddress)))
227229 let totalRewardPerBlockPrevious = valueOrErrorMessage(getInteger(governanceAddress, keyTotalRewardPerBlockPrevious), ((("No data on the key: " + keyTotalRewardPerBlockPrevious) + " at address ") + toString(governanceAddress)))
228230 let rewardPoolFractionCurrent = valueOrErrorMessage(getInteger(governanceAddress, (pool + keyRewardPoolFractionCurrent)), (((("No data on the key: " + pool) + keyRewardPoolFractionCurrent) + " at address ") + toString(governanceAddress)))
229231 let rewardUpdateHeight = valueOrErrorMessage(getInteger(governanceAddress, keyRewardUpdateHeight), ((("No data on the key: " + keyRewardUpdateHeight) + " at address ") + toString(governanceAddress)))
230232 let poolRewardUpdateHeight = valueOrElse(getInteger(governanceAddress, (pool + keyHeightPoolFraction)), 0)
231233 let rewardPoolFractionPrevious = valueOrErrorMessage(getInteger(governanceAddress, (pool + keyRewardPoolFractionPrevious)), (((("No data on the key: " + pool) + keyRewardPoolFractionPrevious) + " at address ") + toString(governanceAddress)))
232234 let rewardPoolCurrent = fraction(totalRewardPerBlockCurrent, rewardPoolFractionCurrent, totalVoteShare)
233235 let rewardPoolPrevious = fraction(totalRewardPerBlockPrevious, rewardPoolFractionPrevious, totalVoteShare)
234236 if (if ((rewardPoolCurrent > totalRewardPerBlockCurrent))
235237 then true
236238 else (rewardPoolPrevious > totalRewardPerBlockPrevious))
237239 then throw("rewardPoolCurrent > totalRewardPerBlockCurrent or rewardPoolPrevious > totalRewardPerBlockPrevious")
238240 else $Tuple4(rewardPoolCurrent, rewardUpdateHeight, rewardPoolPrevious, poolRewardUpdateHeight)
239241 }
240242
241243
242244 func getLastInterestInfo (pool) = {
243245 let lastInterest = valueOrErrorMessage(getInteger(this, (pool + keyLastInterest)), (("No data on the key: " + pool) + keyLastInterest))
244246 let lastInterestHeight = valueOrElse(getInteger(this, (pool + keyLastInterestHeight)), height)
245247 $Tuple2(lastInterestHeight, lastInterest)
246248 }
247249
248250
249-func getUserInterestInfo (pool,userAddress) = {
250- let userLastInterest = getInteger(this, (((pool + "_") + toString(userAddress)) + keyUserLastInterest))
251- let userShare = getInteger(this, (((pool + "_") + toString(userAddress)) + keyUserShareTokensLocked))
251+func getUserInterestInfo (pool,userAddrStr) = {
252+ let userLastInterest = getInteger(this, (((pool + "_") + userAddrStr) + keyUserLastInterest))
253+ let userShare = getInteger(this, (((pool + "_") + userAddrStr) + keyUserShareTokensLocked))
252254 let lastInterest = valueOrErrorMessage(getInteger(this, (pool + keyLastInterest)), (("No data on the key: " + pool) + keyLastInterest))
253255 let userLastInterestValue = match userLastInterest {
254256 case userLastInterest: Int =>
255257 userLastInterest
256258 case _ =>
257259 lastInterest
258260 }
259261 let userShareTokensAmount = match userShare {
260262 case userShare: Int =>
261263 userShare
262264 case _ =>
263265 0
264266 }
265267 $Tuple2(userLastInterestValue, userShareTokensAmount)
266268 }
267269
268270
269-func calcInterest (lastInterestHeight,rewardUpdateHeight,poolRewardUpdateHeight,lastInterest,currentRewardPerBlock,shareTokenLocked,previousRewardPerBlock,shareAssetId,scaleValue,pmtAmount) = if ((shareTokenLocked == 0))
271+func calcInterest (lastInterestHeight,rewardUpdateHeight,poolRewardUpdateHeight,lastInterest,currentRewardPerBlock,shareTokenLocked,previousRewardPerBlock,scaleValue,h) = if ((shareTokenLocked == 0))
270272 then 0
271273 else if ((poolRewardUpdateHeight != 0))
272- then if (if ((rewardUpdateHeight > height))
274+ then if (if ((rewardUpdateHeight > h))
273275 then (rewardUpdateHeight == poolRewardUpdateHeight)
274276 else false)
275277 then {
276- let reward = (previousRewardPerBlock * (height - lastInterestHeight))
278+ let reward = (previousRewardPerBlock * (h - lastInterestHeight))
277279 (lastInterest + fraction(reward, scaleValue, shareTokenLocked))
278280 }
279- else if (if ((height > rewardUpdateHeight))
281+ else if (if ((h > rewardUpdateHeight))
280282 then (rewardUpdateHeight != poolRewardUpdateHeight)
281283 else false)
282284 then {
283- let reward = (previousRewardPerBlock * (height - lastInterestHeight))
285+ let reward = (previousRewardPerBlock * (h - lastInterestHeight))
284286 (lastInterest + fraction(reward, scaleValue, shareTokenLocked))
285287 }
286- else if (if (if ((height > rewardUpdateHeight))
288+ else if (if (if ((h > rewardUpdateHeight))
287289 then (rewardUpdateHeight == poolRewardUpdateHeight)
288290 else false)
289291 then (lastInterestHeight > rewardUpdateHeight)
290292 else false)
291293 then {
292- let reward = (currentRewardPerBlock * (height - lastInterestHeight))
294+ let reward = (currentRewardPerBlock * (h - lastInterestHeight))
293295 (lastInterest + fraction(reward, scaleValue, shareTokenLocked))
294296 }
295297 else {
296298 let rewardAfterLastInterestBeforeReawardUpdate = (previousRewardPerBlock * (rewardUpdateHeight - lastInterestHeight))
297299 let interestAfterUpdate = (lastInterest + fraction(rewardAfterLastInterestBeforeReawardUpdate, scaleValue, shareTokenLocked))
298- let reward = (currentRewardPerBlock * (height - rewardUpdateHeight))
300+ let reward = (currentRewardPerBlock * (h - rewardUpdateHeight))
299301 (interestAfterUpdate + fraction(reward, scaleValue, shareTokenLocked))
300302 }
301- else if ((rewardUpdateHeight > height))
303+ else if ((rewardUpdateHeight > h))
302304 then {
303- let reward = (previousRewardPerBlock * (height - lastInterestHeight))
305+ let reward = (previousRewardPerBlock * (h - lastInterestHeight))
304306 (lastInterest + fraction(reward, scaleValue, shareTokenLocked))
305307 }
306308 else if ((lastInterestHeight > rewardUpdateHeight))
307309 then {
308- let reward = (currentRewardPerBlock * (height - lastInterestHeight))
310+ let reward = (currentRewardPerBlock * (h - lastInterestHeight))
309311 (lastInterest + fraction(reward, scaleValue, shareTokenLocked))
310312 }
311313 else {
312314 let rewardAfterLastInterestBeforeReawardUpdate = (previousRewardPerBlock * (rewardUpdateHeight - lastInterestHeight))
313315 let interestAfterUpdate = (lastInterest + fraction(rewardAfterLastInterestBeforeReawardUpdate, scaleValue, shareTokenLocked))
314- let reward = (currentRewardPerBlock * (height - rewardUpdateHeight))
316+ let reward = (currentRewardPerBlock * (h - rewardUpdateHeight))
315317 (interestAfterUpdate + fraction(reward, scaleValue, shareTokenLocked))
316318 }
317319
318320
319-func claimCalc (pool,caller,pmtAmount) = {
321+func claimCalc (pool,userAddrStr,h) = {
320322 let shareAssetId = getShareAssetId(pool)
321323 let scaleValue = calcScaleValue(SWOP, shareAssetId)
322324 let shareTokenLocked = getTotalShareTokenLocked(pool)
323- let $t01310313168 = getLastInterestInfo(pool)
324- let lastInterestHeight = $t01310313168._1
325- let lastInterest = $t01310313168._2
326- let $t01317313285 = rewardInfo(pool)
327- let currentRewardPerBlock = $t01317313285._1
328- let rewardUpdateHeight = $t01317313285._2
329- let previousRewardPerBlock = $t01317313285._3
330- let poolRewardUpdateHeight = $t01317313285._4
331- let $t01329013369 = getUserInterestInfo(pool, caller)
332- let userLastInterest = $t01329013369._1
333- let userShareTokensAmount = $t01329013369._2
334- let currentInterest = calcInterest(lastInterestHeight, rewardUpdateHeight, poolRewardUpdateHeight, lastInterest, currentRewardPerBlock, shareTokenLocked, previousRewardPerBlock, shareAssetId, scaleValue, pmtAmount)
325+ let $t01305013115 = getLastInterestInfo(pool)
326+ let lastInterestHeight = $t01305013115._1
327+ let lastInterest = $t01305013115._2
328+ let $t01312013232 = rewardInfo(pool)
329+ let currentRewardPerBlock = $t01312013232._1
330+ let rewardUpdateHeight = $t01312013232._2
331+ let previousRewardPerBlock = $t01312013232._3
332+ let poolRewardUpdateHeight = $t01312013232._4
333+ let $t01323713321 = getUserInterestInfo(pool, userAddrStr)
334+ let userLastInterest = $t01323713321._1
335+ let userShareTokensAmount = $t01323713321._2
336+ let currentInterest = calcInterest(lastInterestHeight, rewardUpdateHeight, poolRewardUpdateHeight, lastInterest, currentRewardPerBlock, shareTokenLocked, previousRewardPerBlock, scaleValue, h)
337+ let claimAmount = fraction(userShareTokensAmount, (currentInterest - userLastInterest), scaleValue)
338+ let userNewInterest = currentInterest
339+ $Tuple4(userNewInterest, currentInterest, claimAmount, userShareTokensAmount)
340+ }
341+
342+
343+func claimCalcForMigration (pool,userAddrStr,h) = {
344+ let shareAssetId = getShareAssetId(pool)
345+ let scaleValue = calcScaleValue(SWOP, shareAssetId)
346+ let shareTokenLocked = getTotalShareTokenLocked(pool)
347+ let $t01404414109 = getLastInterestInfo(pool)
348+ let lastInterestHeight = $t01404414109._1
349+ let lastInterest = $t01404414109._2
350+ let $t01411414226 = rewardInfo(pool)
351+ let currentRewardPerBlock = $t01411414226._1
352+ let rewardUpdateHeight = $t01411414226._2
353+ let previousRewardPerBlock = $t01411414226._3
354+ let poolRewardUpdateHeight = $t01411414226._4
355+ let $t01423114315 = getUserInterestInfo(pool, userAddrStr)
356+ let userLastInterest = $t01423114315._1
357+ let userShareTokensAmount = $t01423114315._2
358+ let currentInterest = calcInterest(lastInterestHeight, rewardUpdateHeight, poolRewardUpdateHeight, lastInterest, currentRewardPerBlock, shareTokenLocked, previousRewardPerBlock, scaleValue, h)
335359 let claimAmount = fraction(userShareTokensAmount, (currentInterest - userLastInterest), scaleValue)
336360 let userNewInterest = currentInterest
337361 $Tuple4(userNewInterest, currentInterest, claimAmount, userShareTokensAmount)
338362 }
339363
340364
341365 func calculateProtocolReward (pool) = {
342- let $t01388713952 = getLastInterestInfo(pool)
343- let lastInterestHeight = $t01388713952._1
344- let lastInterest = $t01388713952._2
345- let $t01395714068 = rewardInfo(pool)
346- let currentRewardPerBlock = $t01395714068._1
347- let rewardUpdateHeight = $t01395714068._2
348- let previousRewardPerBlock = $t01395714068._3
349- let poolRewardUpdateHeight = $t01395714068._4
366+ let $t01481914884 = getLastInterestInfo(pool)
367+ let lastInterestHeight = $t01481914884._1
368+ let lastInterest = $t01481914884._2
369+ let $t01488915000 = rewardInfo(pool)
370+ let currentRewardPerBlock = $t01488915000._1
371+ let rewardUpdateHeight = $t01488915000._2
372+ let previousRewardPerBlock = $t01488915000._3
373+ let poolRewardUpdateHeight = $t01488915000._4
350374 let shareTokenLocked = getTotalShareTokenLocked(pool)
351375 if (if ((shareTokenLocked == 0))
352376 then (poolRewardUpdateHeight == 0)
353377 else false)
354378 then if ((rewardUpdateHeight > height))
355379 then {
356380 let reward = (previousRewardPerBlock * (height - lastInterestHeight))
357381 reward
358382 }
359383 else if ((lastInterestHeight > rewardUpdateHeight))
360384 then {
361385 let reward = (currentRewardPerBlock * (height - lastInterestHeight))
362386 reward
363387 }
364388 else {
365389 let rewardAfterLastInterestBeforeReawardUpdate = (previousRewardPerBlock * (rewardUpdateHeight - lastInterestHeight))
366390 let reward = (currentRewardPerBlock * (height - rewardUpdateHeight))
367391 (reward + rewardAfterLastInterestBeforeReawardUpdate)
368392 }
369393 else if (if ((shareTokenLocked == 0))
370394 then (poolRewardUpdateHeight != 0)
371395 else false)
372396 then if (if ((rewardUpdateHeight > height))
373397 then (rewardUpdateHeight == poolRewardUpdateHeight)
374398 else false)
375399 then {
376400 let reward = (previousRewardPerBlock * (height - lastInterestHeight))
377401 reward
378402 }
379403 else if (if ((height > rewardUpdateHeight))
380404 then (rewardUpdateHeight != poolRewardUpdateHeight)
381405 else false)
382406 then {
383407 let reward = (previousRewardPerBlock * (height - lastInterestHeight))
384408 reward
385409 }
386410 else if (if (if ((height > rewardUpdateHeight))
387411 then (rewardUpdateHeight == poolRewardUpdateHeight)
388412 else false)
389413 then (lastInterestHeight > rewardUpdateHeight)
390414 else false)
391415 then {
392416 let reward = (currentRewardPerBlock * (height - lastInterestHeight))
393417 reward
394418 }
395419 else {
396420 let rewardAfterLastInterestBeforeReawardUpdate = (previousRewardPerBlock * (rewardUpdateHeight - lastInterestHeight))
397421 let reward = (currentRewardPerBlock * (height - rewardUpdateHeight))
398422 (reward + rewardAfterLastInterestBeforeReawardUpdate)
399423 }
400424 else 0
401425 }
402426
403427
404428 func checkPmtAssetIdCorrect (pool,pmtAssetId) = {
405429 let poolShareAssetId = fromBase58String(getStringValue(value(addressFromString(pool)), "share_asset_id"))
406430 if ((pmtAssetId == poolShareAssetId))
407431 then true
408432 else false
409433 }
410434
411435
412-func getUserSWOPClaimedAmount (pool,user) = valueOrElse(getInteger(this, (((pool + "_") + toString(user)) + keyUserSWOPClaimedAmount)), 0)
436+func getUserSWOPClaimedAmount (pool,user) = valueOrElse(getInteger(this, (((pool + "_") + user) + keyUserSWOPClaimedAmount)), 0)
413437
414438
415439 func suspend (cause) = [BooleanEntry(keyActive, false), StringEntry(keyCause, cause)]
416440
417441
418442 @Callable(i)
419443 func init (earlyLP) = if (isDefined(getString(this, keySWOPid)))
420444 then throw("SWOP already initialized")
421445 else {
422446 let initAmount = 100000000000000
423447 let SWOPissue = Issue("SWOP", "SWOP protocol token", initAmount, 8, true)
424448 let SWOPid = calculateAssetId(SWOPissue)
425449 [BooleanEntry(keyActive, true), Issue("SWOP", "SWOP protocol token", initAmount, 8, true), StringEntry(keySWOPid, toBase58String(SWOPid))]
426450 }
427451
428452
429453
430454 @Callable(i)
431455 func initPoolShareFarming (pool) = if ((i.caller != this))
432456 then throw("Only the DApp itself can call this function")
433457 else {
434- let $t01705417157 = rewardInfo(pool)
435- let currentReward = $t01705417157._1
436- let rewardUpdateHeight = $t01705417157._2
437- let previousRewardPerBlock = $t01705417157._3
438- let poolRewardUpdateHeight = $t01705417157._4
458+ let $t01797018073 = rewardInfo(pool)
459+ let currentReward = $t01797018073._1
460+ let rewardUpdateHeight = $t01797018073._2
461+ let previousRewardPerBlock = $t01797018073._3
462+ let poolRewardUpdateHeight = $t01797018073._4
439463 [IntegerEntry((pool + keyShareTokensLocked), 0), IntegerEntry((pool + keyLastInterest), 0), IntegerEntry((pool + keyLastInterestHeight), height)]
440464 }
441465
442466
443467
444468 @Callable(i)
445469 func updatePoolInterest (pool) = if ((i.caller != wallet))
446470 then throw("Only the Admin itself can call this function")
447471 else if (!(isActive))
448472 then throw("DApp is inactive at this moment")
449473 else {
450- let $t01756617686 = claimCalc(pool, adminIncreaseInterestAddress, 0)
451- let userNewInterest = $t01756617686._1
452- let currentInterest = $t01756617686._2
453- let claimAmount = $t01756617686._3
454- let userShareTokensAmount = $t01756617686._4
455- let $t01769117794 = rewardInfo(pool)
456- let currentReward = $t01769117794._1
457- let rewardUpdateHeight = $t01769117794._2
458- let previousRewardPerBlock = $t01769117794._3
459- let poolRewardUpdateHeight = $t01769117794._4
474+ let $t01848218618 = claimCalc(pool, toString(adminIncreaseInterestAddress), height)
475+ let userNewInterest = $t01848218618._1
476+ let currentInterest = $t01848218618._2
477+ let claimAmount = $t01848218618._3
478+ let userShareTokensAmount = $t01848218618._4
479+ let $t01862318726 = rewardInfo(pool)
480+ let currentReward = $t01862318726._1
481+ let rewardUpdateHeight = $t01862318726._2
482+ let previousRewardPerBlock = $t01862318726._3
483+ let poolRewardUpdateHeight = $t01862318726._4
460484 [IntegerEntry((pool + keyLastInterest), userNewInterest), IntegerEntry((pool + keyLastInterestHeight), height)]
461485 }
462486
463487
464488
465489 @Callable(i)
466490 func lockShareTokens (pool) = {
467- let $t01798618061 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
468- let pmtAmount = $t01798618061._1
469- let pmtAssetId = $t01798618061._2
470- let $t01806618139 = getAssetInfo(pmtAssetId)
471- let pmtStrAssetId = $t01806618139._1
472- let pmtAssetName = $t01806618139._2
473- let pmtDecimals = $t01806618139._3
474- let $t01814418252 = claimCalc(pool, i.caller, pmtAmount)
475- let userNewInterest = $t01814418252._1
476- let currentInterest = $t01814418252._2
477- let claimAmount = $t01814418252._3
478- let userShareTokensAmount = $t01814418252._4
491+ let userAddrStr = toString(i.caller)
492+ let $t01896019035 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
493+ let pmtAmount = $t01896019035._1
494+ let pmtAssetId = $t01896019035._2
495+ let $t01904019113 = getAssetInfo(pmtAssetId)
496+ let pmtStrAssetId = $t01904019113._1
497+ let pmtAssetName = $t01904019113._2
498+ let pmtDecimals = $t01904019113._3
499+ let $t01911819234 = claimCalc(pool, toString(i.caller), height)
500+ let userNewInterest = $t01911819234._1
501+ let currentInterest = $t01911819234._2
502+ let claimAmount = $t01911819234._3
503+ let userShareTokensAmount = $t01911819234._4
479504 let userShareAmountNew = (userShareTokensAmount + pmtAmount)
480- let availableFundsNew = (userAvailableSWOP(pool, i.caller) + claimAmount)
505+ let availableFundsNew = (userAvailableSWOP(pool, toString(i.caller)) + claimAmount)
481506 let totalShareAmount = getTotalShareTokenLocked(pool)
482507 let totalShareAmountNew = (totalShareAmount + pmtAmount)
483- let userClaimedAmount = getUserSWOPClaimedAmount(pool, i.caller)
508+ let userClaimedAmount = getUserSWOPClaimedAmount(pool, toString(i.caller))
484509 let userClaimedAmountNew = (userClaimedAmount + claimAmount)
485- let baseEntry = [IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserLastInterest), userNewInterest), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserShareTokensLocked), userShareAmountNew), IntegerEntry((pool + keyShareTokensLocked), totalShareAmountNew), IntegerEntry((pool + keyLastInterest), currentInterest), IntegerEntry((pool + keyLastInterestHeight), height), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserSWOPClaimedAmount), userClaimedAmountNew), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserSWOPLastClaimedAmount), claimAmount), IntegerEntry((((pool + "_") + toString(i.caller)) + keyAvailableSWOP), availableFundsNew)]
486- if ((0 >= pmtAmount))
487- then throw("You can't lock token")
488- else if (!(isActive))
489- then throw("DApp is inactive at this moment")
490- else if (!(checkPmtAssetIdCorrect(pool, pmtAssetId)))
491- then throw("Incorrect pmtAssetId")
492- else if (if (isFirstHarvest(Address(fromBase58String(pool))))
493- then (getHeightFirstHarvest(Address(fromBase58String(pool))) > height)
494- else false)
495- then {
496- let harvestPeriod = ((((getHeightFirstHarvest(Address(fromBase58String(pool))) - startHeight) + 1) / periodLength) - 1)
497- let amountOfVoting = split(getStringValue(votingAddress, (((toString(i.caller) + "_") + pool) + "_user_pool_struc")), "_")
498- let amountPoolStract = split(getStringValue(votingAddress, (pool + "_pool_struc")), "_")
499- let amountActiveVoteUserPoolStract = split(valueOrElse(getString(votingAddress, (((toString(i.caller) + "_") + pool) + kHarvestUserPoolActiveVoteStrucVoting)), ""), "_")
500- let amountPoolActiveVoteStract = split(valueOrElse(getString(votingAddress, (pool + kHarvestPoolActiveVoteStrucVoting)), ""), "_")
501- let userShareTokenLocked = userShareTokensAmount
502- let userPoolActiveVote = if ((toString(currPeriod) == amountOfVoting[2]))
503- then valueOrElse(parseInt(amountActiveVoteUserPoolStract[0]), 0)
504- else valueOrElse(parseInt(amountOfVoting[1]), 0)
505- let poolActiveVote = if ((toString(currPeriod) == amountPoolStract[2]))
506- then valueOrElse(parseInt(amountPoolActiveVoteStract[0]), 0)
507- else valueOrElse(parseInt(amountPoolStract[1]), 0)
508- let protocolReward = calculateProtocolReward(pool)
509- if ((userPoolActiveVote != 0))
510- then {
511- let limitShareToken = getShareLimitToken(addressFromStringValue(pool))
512- let shareToken = (fraction(limitShareToken, userPoolActiveVote, poolActiveVote) - userShareTokenLocked)
513- if (if ((size(amountActiveVoteUserPoolStract) > 1))
514- then (valueOrElse(parseInt(amountActiveVoteUserPoolStract[1]), 0) >= harvestPeriod)
515- else false)
516- then throw("You can't share token")
517- else if ((pmtAmount > limitShareToken))
518- then throw(("You can't share token more than " + toString(limitShareToken)))
519- else if ((shareToken > 0))
520- then if ((fraction(99, (accountBalance(pmtAssetId) + pmtAmount), 100) > totalShareAmountNew))
521- then throw("Balance of share-token is greater than totalAmount")
522- else if ((totalShareAmount == 0))
523- then (baseEntry ++ [Reissue(SWOP, protocolReward, true), ScriptTransfer(wallet, protocolReward, SWOP)])
524- else if ((shareToken >= pmtAmount))
525- then baseEntry
526- else throw(("Your maximum share token is " + toString(shareToken)))
527- else throw("You can't share token")
528- }
529- else throw("Your amount of token less than 0")
530- }
531- else baseEntry
510+ let baseEntry = [IntegerEntry((((pool + "_") + userAddrStr) + keyUserLastInterest), userNewInterest), IntegerEntry((((pool + "_") + userAddrStr) + keyUserShareTokensLocked), userShareAmountNew), IntegerEntry((pool + keyShareTokensLocked), totalShareAmountNew), IntegerEntry((pool + keyLastInterest), currentInterest), IntegerEntry((pool + keyLastInterestHeight), height), IntegerEntry((((pool + "_") + userAddrStr) + keyUserSWOPClaimedAmount), userClaimedAmountNew), IntegerEntry((((pool + "_") + userAddrStr) + keyUserSWOPLastClaimedAmount), claimAmount), IntegerEntry((((pool + "_") + userAddrStr) + keyAvailableSWOP), availableFundsNew)]
511+ if (if ((pool == "3PNVFWopwCD9CgGXkpYWEY94oQ5XCAEXBmQ"))
512+ then true
513+ else (pool == "3PEeJQRJT4v4XvSUBPmxhdWKz439nae7KtQ"))
514+ then throw()
515+ else if ((0 >= pmtAmount))
516+ then throw("You can't lock token")
517+ else if (!(isActive))
518+ then throw("DApp is inactive at this moment")
519+ else if (!(checkPmtAssetIdCorrect(pool, pmtAssetId)))
520+ then throw("Incorrect pmtAssetId")
521+ else if (if (isFirstHarvest(Address(fromBase58String(pool))))
522+ then (getHeightFirstHarvest(Address(fromBase58String(pool))) > height)
523+ else false)
524+ then {
525+ let harvestPeriod = ((((getHeightFirstHarvest(Address(fromBase58String(pool))) - startHeight) + 1) / periodLength) - 1)
526+ let amountOfVoting = split(getStringValue(votingAddress, (((userAddrStr + "_") + pool) + "_user_pool_struc")), "_")
527+ let amountPoolStract = split(getStringValue(votingAddress, (pool + "_pool_struc")), "_")
528+ let amountActiveVoteUserPoolStract = split(valueOrElse(getString(votingAddress, (((userAddrStr + "_") + pool) + kHarvestUserPoolActiveVoteStrucVoting)), ""), "_")
529+ let amountPoolActiveVoteStract = split(valueOrElse(getString(votingAddress, (pool + kHarvestPoolActiveVoteStrucVoting)), ""), "_")
530+ let userShareTokenLocked = userShareTokensAmount
531+ let userPoolActiveVote = if ((toString(currPeriod) == amountOfVoting[2]))
532+ then valueOrElse(parseInt(amountActiveVoteUserPoolStract[0]), 0)
533+ else valueOrElse(parseInt(amountOfVoting[1]), 0)
534+ let poolActiveVote = if ((toString(currPeriod) == amountPoolStract[2]))
535+ then valueOrElse(parseInt(amountPoolActiveVoteStract[0]), 0)
536+ else valueOrElse(parseInt(amountPoolStract[1]), 0)
537+ let protocolReward = calculateProtocolReward(pool)
538+ if ((userPoolActiveVote != 0))
539+ then {
540+ let limitShareToken = getShareLimitToken(addressFromStringValue(pool))
541+ let shareToken = (fraction(limitShareToken, userPoolActiveVote, poolActiveVote) - userShareTokenLocked)
542+ if (if ((size(amountActiveVoteUserPoolStract) > 1))
543+ then (valueOrElse(parseInt(amountActiveVoteUserPoolStract[1]), 0) >= harvestPeriod)
544+ else false)
545+ then throw("You can't share token")
546+ else if ((pmtAmount > limitShareToken))
547+ then throw(("You can't share token more than " + toString(limitShareToken)))
548+ else if ((shareToken > 0))
549+ then if ((fraction(99, (accountBalance(pmtAssetId) + pmtAmount), 100) > totalShareAmountNew))
550+ then throw("Balance of share-token is greater than totalAmount")
551+ else if ((totalShareAmount == 0))
552+ then (baseEntry ++ [Reissue(SWOP, protocolReward, true), ScriptTransfer(wallet, protocolReward, SWOP)])
553+ else if ((shareToken >= pmtAmount))
554+ then baseEntry
555+ else throw(("Your maximum share token is " + toString(shareToken)))
556+ else throw("You can't share token")
557+ }
558+ else throw("Your amount of token less than 0")
559+ }
560+ else baseEntry
532561 }
533562
534563
535564
536565 @Callable(i)
537566 func withdrawShareTokens (pool,shareTokensWithdrawAmount) = {
538567 let shareTokensId = fromBase58String(getStringValue(value(addressFromString(pool)), "share_asset_id"))
539- let $t02270022800 = claimCalc(pool, i.caller, 1)
540- let userNewInterest = $t02270022800._1
541- let currentInterest = $t02270022800._2
542- let claimAmount = $t02270022800._3
543- let userShareTokensAmount = $t02270022800._4
568+ let $t02376923885 = claimCalc(pool, toString(i.caller), height)
569+ let userNewInterest = $t02376923885._1
570+ let currentInterest = $t02376923885._2
571+ let claimAmount = $t02376923885._3
572+ let userShareTokensAmount = $t02376923885._4
544573 let userShareAmountNew = (userShareTokensAmount - shareTokensWithdrawAmount)
545- let availableFundsNew = (userAvailableSWOP(pool, i.caller) + claimAmount)
574+ let availableFundsNew = (userAvailableSWOP(pool, toString(i.caller)) + claimAmount)
546575 let totalShareAmount = getTotalShareTokenLocked(pool)
547576 let totalShareAmountNew = (totalShareAmount - shareTokensWithdrawAmount)
548- let userClaimedAmount = getUserSWOPClaimedAmount(pool, i.caller)
577+ let userClaimedAmount = getUserSWOPClaimedAmount(pool, toString(i.caller))
549578 let userClaimedAmountNew = (userClaimedAmount + claimAmount)
550- if ((shareTokensWithdrawAmount > userShareTokensAmount))
551- then throw("Withdraw amount more then user locked amount")
552- else if (!(isActive))
553- then throw("DApp is inactive at this moment")
554- else if ((shareTokensWithdrawAmount > userShareTokensAmount))
555- then throw("Withdraw amount more then user locked amount")
556- else if ((fraction(99, (accountBalance(shareTokensId) - shareTokensWithdrawAmount), 100) > totalShareAmountNew))
557- then throw("Balance of share-token is greater than totalAmount")
558- else [IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserLastInterest), userNewInterest), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserShareTokensLocked), userShareAmountNew), IntegerEntry((pool + keyLastInterest), currentInterest), IntegerEntry((pool + keyLastInterestHeight), height), IntegerEntry((pool + keyShareTokensLocked), totalShareAmountNew), IntegerEntry((((pool + "_") + toString(i.caller)) + keyAvailableSWOP), availableFundsNew), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserSWOPClaimedAmount), userClaimedAmountNew), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserSWOPLastClaimedAmount), claimAmount), ScriptTransfer(i.caller, shareTokensWithdrawAmount, shareTokensId)]
579+ if (if ((pool == "3PNVFWopwCD9CgGXkpYWEY94oQ5XCAEXBmQ"))
580+ then true
581+ else (pool == "3PEeJQRJT4v4XvSUBPmxhdWKz439nae7KtQ"))
582+ then throw()
583+ else if ((shareTokensWithdrawAmount > userShareTokensAmount))
584+ then throw("Withdraw amount more then user locked amount")
585+ else if (!(isActive))
586+ then throw("DApp is inactive at this moment")
587+ else if ((shareTokensWithdrawAmount > userShareTokensAmount))
588+ then throw("Withdraw amount more then user locked amount")
589+ else if ((fraction(99, (accountBalance(shareTokensId) - shareTokensWithdrawAmount), 100) > totalShareAmountNew))
590+ then throw("Balance of share-token is greater than totalAmount")
591+ else [IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserLastInterest), userNewInterest), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserShareTokensLocked), userShareAmountNew), IntegerEntry((pool + keyLastInterest), currentInterest), IntegerEntry((pool + keyLastInterestHeight), height), IntegerEntry((pool + keyShareTokensLocked), totalShareAmountNew), IntegerEntry((((pool + "_") + toString(i.caller)) + keyAvailableSWOP), availableFundsNew), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserSWOPClaimedAmount), userClaimedAmountNew), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserSWOPLastClaimedAmount), claimAmount), ScriptTransfer(i.caller, shareTokensWithdrawAmount, shareTokensId)]
559592 }
593+
594+
595+
596+@Callable(i)
597+func egg0 (pool,users,migrationHeight) = if (if ((pool != "3PNVFWopwCD9CgGXkpYWEY94oQ5XCAEXBmQ"))
598+ then (pool != "3PEeJQRJT4v4XvSUBPmxhdWKz439nae7KtQ")
599+ else false)
600+ then throw()
601+ else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, admStaking], i.callerPublicKey)))
602+ then throw("Only admin can call this function")
603+ else {
604+ func updateUser (accum,u) = {
605+ let r = invoke(this, "egg1", [pool, u, migrationHeight], nil)
606+ if ((r == r))
607+ then accum
608+ else throw("Strict value is not equal to itself.")
609+ }
610+
611+ let $list2635226383 = users
612+ let $size2635226383 = size($list2635226383)
613+ let $acc02635226383 = nil
614+ if (($size2635226383 == 0))
615+ then $acc02635226383
616+ else {
617+ let $acc12635226383 = updateUser($acc02635226383, $list2635226383[0])
618+ if (($size2635226383 == 1))
619+ then $acc12635226383
620+ else {
621+ let $acc22635226383 = updateUser($acc12635226383, $list2635226383[1])
622+ if (($size2635226383 == 2))
623+ then $acc22635226383
624+ else {
625+ let $acc32635226383 = updateUser($acc22635226383, $list2635226383[2])
626+ if (($size2635226383 == 3))
627+ then $acc32635226383
628+ else {
629+ let $acc42635226383 = updateUser($acc32635226383, $list2635226383[3])
630+ if (($size2635226383 == 4))
631+ then $acc42635226383
632+ else {
633+ let $acc52635226383 = updateUser($acc42635226383, $list2635226383[4])
634+ if (($size2635226383 == 5))
635+ then $acc52635226383
636+ else {
637+ let $acc62635226383 = updateUser($acc52635226383, $list2635226383[5])
638+ if (($size2635226383 == 6))
639+ then $acc62635226383
640+ else {
641+ let $acc72635226383 = updateUser($acc62635226383, $list2635226383[6])
642+ if (($size2635226383 == 7))
643+ then $acc72635226383
644+ else {
645+ let $acc82635226383 = updateUser($acc72635226383, $list2635226383[7])
646+ if (($size2635226383 == 8))
647+ then $acc82635226383
648+ else {
649+ let $acc92635226383 = updateUser($acc82635226383, $list2635226383[8])
650+ if (($size2635226383 == 9))
651+ then $acc92635226383
652+ else {
653+ let $acc102635226383 = updateUser($acc92635226383, $list2635226383[9])
654+ if (($size2635226383 == 10))
655+ then $acc102635226383
656+ else {
657+ let $acc112635226383 = updateUser($acc102635226383, $list2635226383[10])
658+ if (($size2635226383 == 11))
659+ then $acc112635226383
660+ else {
661+ let $acc122635226383 = updateUser($acc112635226383, $list2635226383[11])
662+ if (($size2635226383 == 12))
663+ then $acc122635226383
664+ else {
665+ let $acc132635226383 = updateUser($acc122635226383, $list2635226383[12])
666+ throw("List size exceed 12")
667+ }
668+ }
669+ }
670+ }
671+ }
672+ }
673+ }
674+ }
675+ }
676+ }
677+ }
678+ }
679+ }
680+ }
681+
682+
683+
684+@Callable(i)
685+func egg1 (pool,u,migrationHeight) = if ((i.caller != this))
686+ then throw("Only contract itself can invoke this function")
687+ else {
688+ let shareTokenMultiplyer = 1000
689+ let $t02660226714 = claimCalc(pool, u, migrationHeight)
690+ let userNewInterest = $t02660226714._1
691+ let currentInterest = $t02660226714._2
692+ let claimAmount = $t02660226714._3
693+ let userShareTokensAmount = $t02660226714._4
694+ let availableFundsNew = (userAvailableSWOP(pool, u) + claimAmount)
695+ let userClaimedAmount = getUserSWOPClaimedAmount(pool, u)
696+ let userClaimedAmountNew = (userClaimedAmount + claimAmount)
697+ let userShareTokensAmountNew = (userShareTokensAmount * shareTokenMultiplyer)
698+ let totalAmountNewShareTokenLocked = valueOrElse(getInteger(this, ((pool + "_") + "tansl")), 0)
699+[IntegerEntry((((pool + "_") + u) + keyUserLastInterest), 0), IntegerEntry((((pool + "_") + u) + keyUserShareTokensLocked), userShareTokensAmountNew), IntegerEntry((((pool + "_") + u) + keyAvailableSWOP), availableFundsNew), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserSWOPClaimedAmount), userClaimedAmountNew), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserSWOPLastClaimedAmount), claimAmount), IntegerEntry(((pool + "_") + "tansl"), (totalAmountNewShareTokenLocked + userShareTokensAmountNew))]
700+ }
701+
702+
703+
704+@Callable(i)
705+func updateTotalShareTokensLocked (pool,migrationHeight) = if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, admStaking], i.callerPublicKey)))
706+ then throw("Only admin can call this function")
707+ else {
708+ let shareTokenMultiplyer = 1000
709+ let totalAmountShareTokensLockedBefore = (getIntegerValue(this, (pool + keyShareTokensLocked)) * 1000)
710+ let totalAmountShareTokensLockedNew = getIntegerValue(this, ((pool + "_") + "tansl"))
711+ if ((totalAmountShareTokensLockedBefore != totalAmountShareTokensLockedNew))
712+ then throw("New total amount share tockens != old total amount")
713+ else [IntegerEntry((pool + keyLastInterest), 0), IntegerEntry((pool + keyLastInterestHeight), migrationHeight), IntegerEntry((pool + keyShareTokensLocked), totalAmountShareTokensLockedNew), DeleteEntry(((pool + "_") + "tansl"))]
714+ }
560715
561716
562717
563718 @Callable(i)
564719 func claim (pool) = {
565720 let shareTokensId = fromBase58String(getStringValue(value(addressFromString(pool)), "share_asset_id"))
566721 let shareTokenLocked = getTotalShareTokenLocked(pool)
567- let $t02481024875 = getLastInterestInfo(pool)
568- let lastInterestHeight = $t02481024875._1
569- let lastInterest = $t02481024875._2
570- let $t02488024992 = rewardInfo(pool)
571- let currentRewardPerBlock = $t02488024992._1
572- let rewardUpdateHeight = $t02488024992._2
573- let previousRewardPerBlock = $t02488024992._3
574- let poolRewardUpdateHeight = $t02488024992._4
575- let $t02499725097 = claimCalc(pool, i.caller, 1)
576- let userNewInterest = $t02499725097._1
577- let currentInterest = $t02499725097._2
578- let claimAmount = $t02499725097._3
579- let userShareTokensAmount = $t02499725097._4
580- let availableFund = (userAvailableSWOP(pool, i.caller) + claimAmount)
581- let userClaimedAmount = getUserSWOPClaimedAmount(pool, i.caller)
722+ let $t02887328938 = getLastInterestInfo(pool)
723+ let lastInterestHeight = $t02887328938._1
724+ let lastInterest = $t02887328938._2
725+ let $t02894329055 = rewardInfo(pool)
726+ let currentRewardPerBlock = $t02894329055._1
727+ let rewardUpdateHeight = $t02894329055._2
728+ let previousRewardPerBlock = $t02894329055._3
729+ let poolRewardUpdateHeight = $t02894329055._4
730+ let $t02906029176 = claimCalc(pool, toString(i.caller), height)
731+ let userNewInterest = $t02906029176._1
732+ let currentInterest = $t02906029176._2
733+ let claimAmount = $t02906029176._3
734+ let userShareTokensAmount = $t02906029176._4
735+ let availableFund = (userAvailableSWOP(pool, toString(i.caller)) + claimAmount)
736+ let userClaimedAmount = getUserSWOPClaimedAmount(pool, toString(i.caller))
582737 let userClaimedAmountNew = (userClaimedAmount + claimAmount)
583- if ((availableFund == 0))
584- then throw("You have 0 available SWOP")
585- else if (!(isActive))
586- then throw("DApp is inactive at this moment")
587- else if ((availableFund == 0))
588- then throw("You have 0 available SWOP")
589- else if ((fraction(99, accountBalance(shareTokensId), 100) > shareTokenLocked))
590- then throw("Balance of share-token is greater than totalAmount")
591- else [IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserLastInterest), userNewInterest), IntegerEntry((pool + keyLastInterest), currentInterest), IntegerEntry((pool + keyLastInterestHeight), height), IntegerEntry((((pool + "_") + toString(i.caller)) + keyAvailableSWOP), 0), Reissue(SWOP, availableFund, true), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserSWOPClaimedAmount), userClaimedAmountNew), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserSWOPLastClaimedAmount), claimAmount), ScriptTransfer(i.caller, availableFund, SWOP)]
738+ if (if ((pool == "3PNVFWopwCD9CgGXkpYWEY94oQ5XCAEXBmQ"))
739+ then true
740+ else (pool == "3PEeJQRJT4v4XvSUBPmxhdWKz439nae7KtQ"))
741+ then throw()
742+ else if ((availableFund == 0))
743+ then throw("You have 0 available SWOP")
744+ else if (!(isActive))
745+ then throw("DApp is inactive at this moment")
746+ else if ((availableFund == 0))
747+ then throw("You have 0 available SWOP")
748+ else if ((fraction(99, accountBalance(shareTokensId), 100) > shareTokenLocked))
749+ then throw("Balance of share-token is greater than totalAmount")
750+ else [IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserLastInterest), userNewInterest), IntegerEntry((pool + keyLastInterest), currentInterest), IntegerEntry((pool + keyLastInterestHeight), height), IntegerEntry((((pool + "_") + toString(i.caller)) + keyAvailableSWOP), 0), Reissue(SWOP, availableFund, true), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserSWOPClaimedAmount), userClaimedAmountNew), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserSWOPLastClaimedAmount), claimAmount), ScriptTransfer(i.caller, availableFund, SWOP)]
592751 }
593752
594753
595754
596755 @Callable(i)
597756 func shutdown () = if (!(isActive))
598757 then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, keyCause), "the cause wasn't specified")))
599758 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
600759 then throw("Only admin can call this function")
601760 else suspend("Paused by admin")
602761
603762
604763
605764 @Callable(i)
606765 func activate () = if (isActive)
607766 then throw("DApp is already active")
608767 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
609768 then throw("Only admin can call this function")
610769 else [BooleanEntry(keyActive, true), DeleteEntry(keyCause)]
611770
612771
613772 @Verifier(tx)
614773 func verify () = match tx {
774+ case inv: InvokeScriptTransaction =>
775+ let callEgg1 = if ((inv.dApp == this))
776+ then (inv.function == "egg1")
777+ else false
778+ let signedByAdmin = if (if (if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
779+ then true
780+ else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey2))
781+ then true
782+ else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey3))
783+ then true
784+ else sigVerify(tx.bodyBytes, tx.proofs[0], admStaking)
785+ if (callEgg1)
786+ then signedByAdmin
787+ else false
615788 case _ =>
616789 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
617790 then 1
618791 else 0
619792 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
620793 then 1
621794 else 0
622795 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
623796 then 1
624797 else 0
625798 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
626799 }
627800

github/deemru/w8io/3ef1775 
135.54 ms