tx · 472AGAchqVUaSHUBUBHuXF6feBdwjbsh6bGao5kS8Egc

3MwkjgDrsm5k73WJU9Nbxbx4y2iy3zjQzMi:  -0.01400000 Waves

2021.12.13 17:44 [1832618] smart account 3MwkjgDrsm5k73WJU9Nbxbx4y2iy3zjQzMi > SELF 0.00000000 Waves

{ "type": 13, "id": "472AGAchqVUaSHUBUBHuXF6feBdwjbsh6bGao5kS8Egc", "fee": 1400000, "feeAssetId": null, "timestamp": 1639406705916, "version": 2, "chainId": 84, "sender": "3MwkjgDrsm5k73WJU9Nbxbx4y2iy3zjQzMi", "senderPublicKey": "FRotxVW1MhTQRDvVbMM4yvYGWzBFvHqvMsonvGeEXQUy", "proofs": [ "4KS9uGGoAehQHqWrjD26JMNvazrVJj1okPe9PP82fjokgSdeKDJu2pseb7iHno1FVaYWz5uzmw7jPHmWZe8j2kPR", "4nnQKq7534NV7oq1GFAbivUiPtT8VDx3fhYUQ6NF5ewRzKT6s5b1bHxKC7B8eCt7uYH4u5Qu9Hm1zuLD7mR4e3bJ" ], "script": "base64:AAIFAAAAAAAAEwkIAhIECgIBCBIDCgEIEhQKEggBAQgBAQEBAQEBARgEAQEEGBIECgIBCBIECgIBCBIECgIBCBIFCgMBAQgSAwoBARIDCgEBEgQKAgEBEgASABoPCgJhMRIJa2V5QWN0aXZlGhUKAmEyEg9rZXlBZG1pblB1YktleTEaFQoCYTMSD2tleUFkbWluUHViS2V5MhoVCgJhNBIPa2V5QWRtaW5QdWJLZXkzGicKAmE1EiFrZXlMYXVuY2hwYWREYXRhVHJhbnNhY3Rpb25TdGF0dXMaGAoCYTYSEmtleUxhdW5jaHBhZE5leHRJZBoaCgJhNxIUa2V5TGF1bmNocGFkQWN0aXZlSWQaEwoCYTgSDWtleUluaXRDYWxsZXIaEAoCYTkSCmtleUFkZHJlc3MaEwoCYjESDWtleUluaXRIZWlnaHQaFAoCYjISDmtleVN0YXJ0SGVpZ2h0GhcKAmIzEhFrZXlGaW5hbGlzZUhlaWdodBoSCgJiNBIMa2V5Q29taXNzaW9uGhAKAmI1EgprZXlBc3NldElkGhkKAmI2EhNrZXlUb3RhbFRva2VuQW1vdW50GiAKAmI3EhprZXlUb3RhbEFtb3VudEJ1eUFzc2V0U29sZBoYCgJiOBISa2V5VG9rZW5zUGVyVGlja2V0GhYKAmI5EhBrZXlQcmljZVBlclRva2VuGhYKAmMxEhBrZXlTd29wUGVyVGlja2V0GhwKAmMyEhZrZXlTd29wZmlUaWNrZXRzQW1vdW50Gh0KAmMzEhdrZXlDYW1wYWlnblRva2Vuc0Ftb3VudBocCgJjNBIWa2V5VG9rZW5zUGVyQWxsb2NhdGlvbhoZCgJjNRITa2V5VGlja2V0TGFzdE51bWJlchoZCgJjNhITa2V5R292ZXJuYW5jZVN0YWtlZBoSCgJjNxIMa2V5VXNlclJlZklkGhMKAmM4Eg1rZXlWZXJpZnlIYXNoGhEKAmM5EgtrZXlEdXJhdGlvbhoiCgJkMRIca2V5QW1vdW50QnV5QXNzZXRJbk1hcmtldGluZxorCgJkMhIla2V5QW1vdW50QnV5QXNzZXRJbk1hcmtldGluZ0ZpbmFsaXplZBoZCgJkMxITa2V5VHJhbnNmZXJCdXlBc3NldBoaCgJkNBIUa2V5RnJlZXpTd29wRHVyYXRpb24aHgoCZDUSGGtleUZyZWV6ZUFkZGl0aW9uYWxUb2tlbhoWCgJkNhIQa2V5RnJlZXplVG9rZW5JZBocCgJkNxIWa2V5RnJlZXplVG9rZW5EdXJhdGlvbhodCgJkOBIXa2V5RnJlZXplVG9rZW5QZXJUaWNrZXQaEQoCZDkSC2tleUJ1eVRva2VuGhQKAmUxEg5rZXlDbGFpbVBhcmFtcxohCgJlMhIba2V5SGlnaENvbXBldGl0aW9uQ29taXNzaW9uGhwKAmUzEhZrZXlIaWdoQ29tcGV0aXRpb25TYWxlGhsKAmU0EhVrZXlIQ1RpY2tldExhc3ROdW1iZXIaHgoCZTUSGGtleUhpZ2hDb21wZXRpdGlvbkFtb3VudBoiCgJlNhIca2V5VG90YWxBbW91bnRCdXlBc3NldFNvbGRIQxogCgJlNxIaa2V5VXNlckJvdWdodFRpY2tldHNBbW91bnQaFAoCZTgSDmtleVVzZXJUaWNrZXRzGhYKAmU5EhBrZXlVc2VySENUaWNrZXRzGiIKAmYxEhxrZXlVc2VySENCb3VnaHRUaWNrZXRzQW1vdW50GiEKAmYyEhtrZXlVc2VyQXZhaWxhYmxlQWxsb2NhdGlvbnMaJgoCZjMSIGtleVVzZXJBbW91bnRCdXlBc3NldEluTWFya2V0aW5nGh4KAmY0EhhrZXlVc2VyQm91Z2h0QWxsb2NhdGlvbnMaGAoCZjUSEmtleVVzZXJDbGFpbVN0YXR1cxogCgJmNhIaa2V5VXNlcldpbm5lZFRpY2tldHNBbW91bnQaGAoCZjcSEmtleVVzZXJGcmVlemVUb2tlbhoMCgJmOBIGb3JhY2xlGhAKAmY5Egpnb3Zlcm5hbmNlGhYKAmcxEhBjb21taXNzaW9uV2FsbGV0GhgKAmcyEhJzdGFraW5nVVNETkFkZHJlc3MaCgoCZzMSBFVTRE4aGAoCZzQSEmFkbWluUHViS2V5U3Rha2luZxoaCgJnNRIUbWF4QWxsb2NhdGlvbnNBbW91bnQaDgoCZzYSCGlzQWN0aXZlGhcKAmc3EhFhY3RpdmVMYXVuY2hwYWRJZBoRCgJnOBILZ2V0QWRtaW5QdWIaEQoCZzkSC2tleUFkbWluUHViGg0KAmgxEgckbWF0Y2gwGgwKAmgyEgZzdHJpbmcaDQoCaDMSB25vdGhpbmcaEgoCaDQSDGFkbWluUHViS2V5MRoSCgJoNRIMYWRtaW5QdWJLZXkyGhIKAmg2EgxhZG1pblB1YktleTMaEgoCaDcSDGdldEFzc2V0SW5mbxoNCgJoOBIHYXNzZXRJZBoOCgJoORIIc3RyaW5nSWQaCgoCaTESBGluZm8aCwoCaTISBXdhdmVzGhgKAmkzEhJnZXRMYXVuY2hwYWROZXh0SWQaFgoCaTQSEHN0YWtlZFVzZG5BbW91bnQaHAoCaTUSFmdldEFzc2V0SW5mb0Zyb21TdHJpbmcaDgoCaTYSCGFzc2V0U3RyGhEKAmk3EgtsYXVuY2hwYWRJZBoKCgJpOBIEaGFzaBoNCgJpORIHYWRkcmVzcxoUCgJqMRIOcHJvamVjdEFkZHJlc3MaEQoCajISC3N0YXJ0SGVpZ2h0Gg4KAmozEghkdXJhdGlvbhoOCgJqNBIIYnV5VG9rZW4aEAoCajUSCmNvbW1pc3Npb24aFQoCajYSD3Rva2Vuc1BlclRpY2tldBoTCgJqNxINcHJpY2VQZXJUb2tlbhoZCgJqOBITc3dvcGZpVGlja2V0c0Ftb3VudBoaCgJqORIUY2FtcGFpZ25Ub2tlbnNBbW91bnQaGQoCazESE3Rva2Vuc1BlckFsbG9jYXRpb24aEwoCazISDXN3b3BQZXJUaWNrZXQaGAoCazMSEnN3b3BGcmVlemVEdXJhdGlvbhoRCgJrNBILY2xhaW1QYXJhbXMaGQoCazUSE0hpZ2hDb21wZXRpdGlvblNhbGUaHgoCazYSGGhpZ2hDb21wZXRpdGlvbkNvbWlzc2lvbhoiCgJrNxIcaGlnaENvbXBldGl0aW9uVGlja2V0c0Ftb3VudBobCgJrOBIVZnJlZXplQWRkaXRpb25hbFRva2VuGhIKAms5EgxmcmVlemVQYXJhbXMaFAoCbDESDmxhdW5jaHBhZElkU3RyGhEKAmwyEgskdDA2MzU0NjQyORoPCgJsMxIJcG10QW1vdW50GhAKAmw0EgpwbXRBc3NldElkGhEKAmw1EgskdDA2NDM4NjUxMRoTCgJsNhINcG10U3RyQXNzZXRJZBoSCgJsNxIMcG10QXNzZXROYW1lGhEKAmw4EgtwbXREZWNpbWFscxobCgJsORIVZnJlZXplQWRkaXRpb25hbEVudHJ5GgsKAm0xEgVyZWZJZBoRCgJtMhILJHQwOTAyNDkwOTkaEQoCbTMSCyR0MDkxMDQ5MjU0GhAKAm00EgpidXlBc3NldElkGhMKAm01Eg1idXlBc3NldFN0cklkGhIKAm02EgxidXlBc3NldE5hbWUaFgoCbTcSEGJ1eUFzc2V0RGVjaW1hbHMaEQoCbTgSC3N0YWtlZFN3b3BzGh0KAm05EhdhbGxvd2VkVGlja2V0c0Ftb3VudEFsbBoZCgJuMRITYm91Z2h0VGlja2V0c0Ftb3VudBoaCgJuMhIUYWxsb3dlZFRpY2tldHNBbW91bnQaEwoCbjMSDWZyZWV6ZVRva2VuSWQaEAoCbjQSCnRva2VuUHJpY2UaEwoCbjUSDSR0MDExMTQyMTEyODYaDQoCbjYSB3Rva2VuSWQaFQoCbjcSD3Rva2VuU3RyQXNzZXRJZBoUCgJuOBIOdG9rZW5Bc3NldE5hbWUaEwoCbjkSDXRva2VuRGVjaW1hbHMaEQoCbzESC3RpY2tldFByaWNlGhkKAm8yEhNjb21taXNzaW9uUGVyVGlja2V0GhUKAm8zEg9idXlUaWNrZXRBbW91bnQaHAoCbzQSFmFsbG93ZWRCdXlUaWNrZXRBbW91bnQaIgoCbzUSHGFsbG93ZWRCdXlQcmljZVdpdGhDb21pc3Npb24aDAoCbzYSBmNoYW5nZRoaCgJvNxIUZnJlZXplVG9rZW5QZXJUaWNrZXQaEwoCbzgSDSR0MDEyNDUwMTI1MzcaFQoCbzkSD3BtdEFtb3VudEZyZWV6ZRoWCgJwMRIQcG10QXNzZXRJZEZyZWV6ZRoTCgJwMhINJHQwMTI1NTQxMjY0NRoZCgJwMxITcG10RnJlZXplU3RyQXNzZXRJZBoYCgJwNBIScG10RnJlZXplQXNzZXROYW1lGhcKAnA1EhFwbXRGcmVlemVEZWNpbWFscxoWCgJwNhIQbmVlZEZyZWV6ZVRva2VucxoeCgJwNxIYdXNlckJvdWdodFRpY2tldHNOdW1iZXJzGhwKAnA4EhZsYXN0Qm91Z2h0VGlja2V0TnVtYmVyGhEKAnA5Egtib3VnaHRSYW5nZRohCgJxMRIbbmV3VXNlckJvdWdodFRpY2tldHNOdW1iZXJzGgkKAnEyEgNpbnYaDwoCcTMSCWJhc2VFbnRyeRoTCgJxNBINJHQwMTQ2OTIxNDc2NxoTCgJxNRINJHQwMTQ3NzIxNDkyMhoZCgJxNhITdXNlclVzZG5Jbk1hcmtldGluZxoVCgJxNxIPdXNkbkluTWFya2V0aW5nGhcKAnE4EhFib3VnaHRBbGxvY2F0aW9ucxoTCgJxORINJHQwMTU1OTExNTczNRoiCgJyMRIcYWxsb2NhdGlvblByaWNlV2l0aENvbWlzc2lvbhoaCgJyMhIUYnV5QWxsb2NhdGlvbnNBbW91bnQaEwoCcjMSDSR0MDE4MDQ0MTgxMTkaEwoCcjQSDSR0MDE4MTI0MTgyNzQaGwoCcjUSFWJvdWdodEhDVGlja2V0c0Ftb3VudBoZCgJyNhITaGlnaENvbXBldGl0aW9uU2FsZRoTCgJyNxINJHQwMTk1MjMxOTY2NxobCgJyOBIVYnV5UHJpY2VXaXRoQ29taXNzaW9uGg8KAnI5Egl2cmZIZWlnaHQaEAoCczESCnNlY3JldFdvcmQaDwoCczISCXNhdmVkSGFzaBoOCgJzMxIIY2FsY0hhc2gaEwoCczQSDSR0MDIyNDUyMjI2MDIaEgoCczUSDGNvbW1pc3Npb25IQxoYCgJzNhISdHJhbnNmZXJlZEJ1eUFzc2V0GiEKAnM3Ehtzd29wZmlNZW1iZXJzQnV5QXNzZXRBbW91bnQaHAoCczgSFnN3b3BmaUhDQnV5QXNzZXRBbW91bnQaHAoCczkSFnN3b3BmaU1lbWJlcnNDb21pc3Npb24aFwoCdDESEXN3b3BmaUhDQ29taXNzaW9uGiQKAnQyEh50b3RhbEFtb3VudEJ1eUFzc2V0SW5NYXJrZXRpbmcaGAoCdDMSEm1hcmtldGluZ0NvbWlzc2lvbhoTCgJ0NBINdW5zdGFrZUFtb3VudBoVCgJ0NRIPdXNlckNsYWltU3RhdHVzGhMKAnQ2Eg1ib3VnaHRUaWNrZXRzGhMKAnQ3Eg0kdDAyNTQ2MTI1NjExGhMKAnQ4Eg13b25uZWRUaWNrZXRzGhoKAnQ5EhRhd2FpbGFibGVBbGxvY2F0aW9ucxoYCgJ1MRISYWxsb3dlZEFsbG9jYXRpb25zGhMKAnUyEg0kdDAyNjI1ODI2NDAyGhoKAnUzEhR0cmFuc2ZlclRva2Vuc0Ftb3VudBohCgJ1NBIbbm90QWxsb3dlZEFsbG9jYXRpb25zVG9rZW5zGhwKAnU1EhZidXlBc3NldEZvckFsbG9jYXRpb25zGiAKAnU2EhpidXlBc3NldEZvclVud29ubmVkVGlja2V0cxocCgJ1NxIWcmV0dXJuZWRCdXlBc3NldEFtb3VudBoSCgJ1OBIMdHJhbnNmZXJVc2RuGhQKAnU5Eg50cmFuc2ZlclRva2VucxoXCgJ2MRIRdXNlclRva2Vuc0ZyZWV6ZWQaGQoCdjISE2ZyZWV6ZVRva2VuRHVyYXRpb24aFAoCdjMSDmJsb2NrRW5kSGVpZ2h0GgwKAnY0EgZhbW91bnQaEwoCdjUSDSR0MDMwMDc0MzAyMjQaDAoCdjYSBnZlcmlmeRoZCgJ2NxITbXVsdGlTaWduZWRCeUFkbWlucxoYCgJ2OBISYWRtaW5QdWJLZXkxU2lnbmVkGhgKAnY5EhJhZG1pblB1YktleTJTaWduZWQaGAoCdzESEmFkbWluUHViS2V5M1NpZ25lZBoTCgJ3MhINc2lnbmVkQnlBZG1pbhoJCgJ3MxIDZHR4AAAARQAAAAACYTECAAAABmFjdGl2ZQAAAAACYTICAAAAC2FkbWluX3B1Yl8xAAAAAAJhMwIAAAALYWRtaW5fcHViXzIAAAAAAmE0AgAAAAthZG1pbl9wdWJfMwAAAAACYTUCAAAAIWxhdW5jaHBhZF9kYXRhX3RyYW5zYWN0aW9uX3N0YXR1cwAAAAACYTYCAAAAEWxhdW5jaHBhZF9uZXh0X2lkAAAAAAJhNwIAAAATbGF1bmNocGFkX2FjdGl2ZV9pZAAAAAACYTgCAAAAC2luaXRfY2FsbGVyAAAAAAJhOQIAAAAIX2FkZHJlc3MAAAAAAmIxAgAAAAxfaW5pdF9oZWlnaHQAAAAAAmIyAgAAAA1fc3RhcnRfaGVpZ2h0AAAAAAJiMwIAAAAQX2ZpbmFsaXNlX2hlaWdodAAAAAACYjQCAAAACl9jb21pc3Npb24AAAAAAmI1AgAAAAlfYXNzZXRfaWQAAAAAAmI2AgAAABNfdG90YWxfdG9rZW5fYW1vdW50AAAAAAJiNwIAAAAVX3RvdGFsX2J1eV9hc3NldF9zb2xkAAAAAAJiOAIAAAASX3Rva2Vuc19wZXJfdGlja2V0AAAAAAJiOQIAAAAQX3ByaWNlX3Blcl90b2tlbgAAAAACYzECAAAAEF9zd29wX3Blcl90aWNrZXQAAAAAAmMyAgAAABdfdGlja2V0c19zd29wZmlfbWVtYmVycwAAAAACYzMCAAAAE190b2tlbnNfYWNjZXNzX2xpc3QAAAAAAmM0AgAAABZfdG9rZW5zX3Blcl9hbGxvY2F0aW9uAAAAAAJjNQIAAAAkX3RpY2tldF9sYXN0X251bWJlcl9oaWdoX2NvbXBldGl0aW9uAAAAAAJjNgIAAAAMX1NXT1BfYW1vdW50AAAAAAJjNwIAAAAHX3JlZl9pZAAAAAACYzgCAAAADF92ZXJpZnlfaGFzaAAAAAACYzkCAAAACV9kdXJhdGlvbgAAAAACZDECAAAAJ190b3RhbF9wdXJjaGFzZWRfYnV5X2Fzc2V0X2luX21hcmtldGluZwAAAAACZDICAAAAMV90b3RhbF9wdXJjaGFzZWRfYnV5X2Fzc2V0X2luX21hcmtldGluZ19maW5hbGl6ZWQAAAAAAmQzAgAAABNfdHJhbnNmZXJfYnV5X2Fzc2V0AAAAAAJkNAIAAAAVX2ZyZWV6ZV9zd29wX2R1cmF0aW9uAAAAAAJkNQIAAAAYX2ZyZWV6ZV9hZGRpdGlvbmFsX3Rva2VuAAAAAAJkNgIAAAAQX2ZyZWV6ZV90b2tlbl9pZAAAAAACZDcCAAAAFl9mcmVlemVfdG9rZW5fZHVyYXRpb24AAAAAAmQ4AgAAABhfZnJlZXplX3Rva2VuX3Blcl90aWNrZXQAAAAAAmQ5AgAAAApfYnV5X3Rva2VuAAAAAAJlMQIAAAANX2NsYWltX3BhcmFtcwAAAAACZTICAAAAG19oaWdoX2NvbXBldGl0aW9uX2NvbWlzc2lvbgAAAAACZTMCAAAAFl9oaWdoX2NvbXBldGl0aW9uX3NhbGUAAAAAAmU0AgAAABNfdGlja2V0X2xhc3RfbnVtYmVyAAAAAAJlNQIAAAAZX3RpY2tldHNfaGlnaF9jb21wZXRpdGlvbgAAAAACZTYCAAAAJl90b3RhbF9idXlfYXNzZXRfc29sZF9oaWdoX2NvbXBldGl0aW9uAAAAAAJlNwIAAAAPX2JvdWdodF90aWNrZXRzAAAAAAJlOAIAAAAPX3RpY2tldHNfbnVtYmVyAAAAAAJlOQIAAAAgX3RpY2tldHNfbnVtYmVyX2hpZ2hfY29tcGV0aXRpb24AAAAAAmYxAgAAACBfYm91Z2h0X3RpY2tl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", "height": 1832618, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: Ee2jxru2Dv1HBbkLEU7kn6KKUVG1ktegyhjEcbgGUkHq Next: 5DJKTBUbZTpSd8zzPtqirMmNwaKcB2TyakNtmBrqe2tf Diff:
OldNewDifferences
184184
185185
186186 @Callable(i)
187-func init (projectAddress,startHeight,duration,buyToken,commission,tokensPerTicket,pricePerToken,swopfiTicketsAmount,campaignTokensAmount,tokensPerAllocation,swopPerTicket,swopFreezeDuration,claimParams,HighCompetitionSale,highCompetitionComission,highCompetitionTicketsAmount,freezeAdditionalToken,freezeParams) = {
188- let adminInitkey = valueOrElse(getString(this, keyInitCaller), "")
189- if (!(isActive))
190- then throw("DApp is inactive at this moment")
191- else if ((toString(i.caller) != adminInitkey))
192- then throw("Only project admin can call init function")
193- else if ((size(i.payments) != 1))
194- then throw("One attached payment expected")
195- else if ((height > startHeight))
196- then throw("Start height must be greater than blockchain height")
197- else if (if (freezeAdditionalToken)
198- then (size(freezeParams) != 3)
199- else false)
200- then throw("Freeze params list must have 3 items")
201- else {
202- let launchpadId = getLaunchpadNextId()
203- let launchpadIdStr = toString(launchpadId)
204- let $t063906465 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
205- let pmtAmount = $t063906465._1
206- let pmtAssetId = $t063906465._2
207- let $t064746547 = getAssetInfo(pmtAssetId)
208- let pmtStrAssetId = $t064746547._1
209- let pmtAssetName = $t064746547._2
210- let pmtDecimals = $t064746547._3
211- let freezeAdditionalEntry = if (freezeAdditionalToken)
212- then [BooleanEntry((launchpadIdStr + keyFreezeAdditionalToken), true), StringEntry((launchpadIdStr + keyFreezeTokenId), freezeParams[0]), IntegerEntry((launchpadIdStr + keyFreezeTokenDuration), parseIntValue(freezeParams[1])), IntegerEntry((launchpadIdStr + keyFreezeTokenPerTicket), parseIntValue(freezeParams[2]))]
213- else nil
214- ([IntegerEntry((pmtStrAssetId + "_launchpad"), launchpadId), IntegerEntry(keyLaunchpadNextId, (launchpadId + 1)), StringEntry((launchpadIdStr + keyAddress), projectAddress), IntegerEntry((launchpadIdStr + keyInitHeight), height), IntegerEntry((launchpadIdStr + keyStartHeight), startHeight), IntegerEntry((launchpadIdStr + keyDuration), duration), StringEntry((launchpadIdStr + keyBuyToken), buyToken), IntegerEntry((launchpadIdStr + keyFreezSwopDuration), swopFreezeDuration), IntegerEntry((launchpadIdStr + keyTotalTokenAmount), pmtAmount), StringEntry((launchpadIdStr + keyAssetId), pmtStrAssetId), IntegerEntry((launchpadIdStr + keyComission), commission), IntegerEntry((launchpadIdStr + keyTicketLastNumber), 0), IntegerEntry((launchpadIdStr + keyTokensPerTicket), tokensPerTicket), IntegerEntry((launchpadIdStr + keyPricePerToken), pricePerToken), IntegerEntry((launchpadIdStr + keySwopPerTicket), swopPerTicket), IntegerEntry((launchpadIdStr + keySwopfiTicketsAmount), swopfiTicketsAmount), IntegerEntry((launchpadIdStr + keyCampaignTokensAmount), campaignTokensAmount), IntegerEntry((launchpadIdStr + keyTokensPerAllocation), tokensPerAllocation), StringEntry((launchpadIdStr + keyClaimParams), makeString(claimParams, ",")), BooleanEntry((launchpadIdStr + keyHighCompetitionSale), HighCompetitionSale), IntegerEntry((launchpadIdStr + keyHighCompetitionComission), highCompetitionComission), IntegerEntry((launchpadIdStr + keyHighCompetitionAmount), highCompetitionTicketsAmount), IntegerEntry(keyLaunchpadActiveId, launchpadId), StringEntry(keyInitCaller, "")] ++ freezeAdditionalEntry)
215- }
216- }
187+func init (projectAddress,startHeight,duration,buyToken,commission,tokensPerTicket,pricePerToken,swopfiTicketsAmount,campaignTokensAmount,tokensPerAllocation,swopPerTicket,swopFreezeDuration,claimParams,HighCompetitionSale,highCompetitionComission,highCompetitionTicketsAmount,freezeAdditionalToken,freezeParams) = if (!(isActive))
188+ then throw("DApp is inactive at this moment")
189+ else if ((toString(i.caller) != valueOrElse(getString(this, keyInitCaller), "")))
190+ then throw("Only project admin can call init function")
191+ else if ((size(i.payments) != 1))
192+ then throw("One attached payment expected")
193+ else if ((height > startHeight))
194+ then throw("Start height must be greater than blockchain height")
195+ else if (if (freezeAdditionalToken)
196+ then (size(freezeParams) != 3)
197+ else false)
198+ then throw("Freeze params list must have 3 items")
199+ else {
200+ let launchpadId = getLaunchpadNextId()
201+ let launchpadIdStr = toString(launchpadId)
202+ let $t063546429 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
203+ let pmtAmount = $t063546429._1
204+ let pmtAssetId = $t063546429._2
205+ let $t064386511 = getAssetInfo(pmtAssetId)
206+ let pmtStrAssetId = $t064386511._1
207+ let pmtAssetName = $t064386511._2
208+ let pmtDecimals = $t064386511._3
209+ let freezeAdditionalEntry = if (freezeAdditionalToken)
210+ then [BooleanEntry((launchpadIdStr + keyFreezeAdditionalToken), true), StringEntry((launchpadIdStr + keyFreezeTokenId), freezeParams[0]), IntegerEntry((launchpadIdStr + keyFreezeTokenDuration), parseIntValue(freezeParams[1])), IntegerEntry((launchpadIdStr + keyFreezeTokenPerTicket), parseIntValue(freezeParams[2]))]
211+ else nil
212+ ([IntegerEntry((pmtStrAssetId + "_launchpad"), launchpadId), IntegerEntry(keyLaunchpadNextId, (launchpadId + 1)), StringEntry((launchpadIdStr + keyAddress), projectAddress), IntegerEntry((launchpadIdStr + keyInitHeight), height), IntegerEntry((launchpadIdStr + keyStartHeight), startHeight), IntegerEntry((launchpadIdStr + keyDuration), duration), StringEntry((launchpadIdStr + keyBuyToken), buyToken), IntegerEntry((launchpadIdStr + keyFreezSwopDuration), swopFreezeDuration), IntegerEntry((launchpadIdStr + keyTotalTokenAmount), pmtAmount), StringEntry((launchpadIdStr + keyAssetId), pmtStrAssetId), IntegerEntry((launchpadIdStr + keyComission), commission), IntegerEntry((launchpadIdStr + keyTicketLastNumber), 0), IntegerEntry((launchpadIdStr + keyTokensPerTicket), tokensPerTicket), IntegerEntry((launchpadIdStr + keyPricePerToken), pricePerToken), IntegerEntry((launchpadIdStr + keySwopPerTicket), swopPerTicket), IntegerEntry((launchpadIdStr + keySwopfiTicketsAmount), swopfiTicketsAmount), IntegerEntry((launchpadIdStr + keyCampaignTokensAmount), campaignTokensAmount), IntegerEntry((launchpadIdStr + keyTokensPerAllocation), tokensPerAllocation), StringEntry((launchpadIdStr + keyClaimParams), makeString(claimParams, ",")), BooleanEntry((launchpadIdStr + keyHighCompetitionSale), HighCompetitionSale), IntegerEntry((launchpadIdStr + keyHighCompetitionComission), highCompetitionComission), IntegerEntry((launchpadIdStr + keyHighCompetitionAmount), highCompetitionTicketsAmount), IntegerEntry(keyLaunchpadActiveId, launchpadId), StringEntry(keyInitCaller, "")] ++ freezeAdditionalEntry)
213+ }
217214
218215
219216
220217 @Callable(i)
221218 func commitSwopfiSale (launchpadId,refId) = {
222- let $t090609135 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
223- let pmtAmount = $t090609135._1
224- let pmtAssetId = $t090609135._2
225- let $t091409290 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
226- let buyAssetId = $t091409290._1
227- let buyAssetStrId = $t091409290._2
228- let buyAssetName = $t091409290._3
229- let buyAssetDecimals = $t091409290._4
219+ let $t090249099 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
220+ let pmtAmount = $t090249099._1
221+ let pmtAssetId = $t090249099._2
222+ let $t091049254 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
223+ let buyAssetId = $t091049254._1
224+ let buyAssetStrId = $t091049254._2
225+ let buyAssetName = $t091049254._3
226+ let buyAssetDecimals = $t091049254._4
230227 let stakedSwops = valueOrElse(getInteger(governance, (toString(i.caller) + keyGovernanceStaked)), 0)
231228 let allowedTicketsAmountAll = (stakedSwops / getIntegerValue(this, (toString(launchpadId) + keySwopPerTicket)))
232229 let boughtTicketsAmount = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtTicketsAmount)), 0)
264261 else {
265262 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
266263 let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
267- let $t01117811322 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
268- let tokenId = $t01117811322._1
269- let tokenStrAssetId = $t01117811322._2
270- let tokenAssetName = $t01117811322._3
271- let tokenDecimals = $t01117811322._4
264+ let $t01114211286 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
265+ let tokenId = $t01114211286._1
266+ let tokenStrAssetId = $t01114211286._2
267+ let tokenAssetName = $t01114211286._3
268+ let tokenDecimals = $t01114211286._4
272269 let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
273270 let commissionPerTicket = fraction(ticketPrice, getIntegerValue(this, (toString(launchpadId) + keyComission)), 100)
274271 let buyTicketAmount = (pmtAmount / (ticketPrice + commissionPerTicket))
284281 then {
285282 let freezeTokenId = getStringValue(this, (toString(launchpadId) + keyFreezeTokenId))
286283 let freezeTokenPerTicket = getIntegerValue(this, (toString(launchpadId) + keyFreezeTokenPerTicket))
287- let $t01248612573 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
288- let pmtAmountFreeze = $t01248612573._1
289- let pmtAssetIdFreeze = $t01248612573._2
290- let $t01259012681 = getAssetInfo(pmtAssetId)
291- let pmtFreezeStrAssetId = $t01259012681._1
292- let pmtFreezeAssetName = $t01259012681._2
293- let pmtFreezeDecimals = $t01259012681._3
284+ let $t01245012537 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
285+ let pmtAmountFreeze = $t01245012537._1
286+ let pmtAssetIdFreeze = $t01245012537._2
287+ let $t01255412645 = getAssetInfo(pmtAssetId)
288+ let pmtFreezeStrAssetId = $t01255412645._1
289+ let pmtFreezeAssetName = $t01255412645._2
290+ let pmtFreezeDecimals = $t01255412645._3
294291 let needFreezeTokens = (freezeTokenPerTicket * buyTicketAmount)
295292 if (if ((pmtFreezeStrAssetId != freezeTokenId))
296293 then true
324321
325322 @Callable(i)
326323 func commitAccessListSale (launchpadId,refId) = {
327- let $t01472814803 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
328- let pmtAmount = $t01472814803._1
329- let pmtAssetId = $t01472814803._2
330- let $t01480814958 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
331- let buyAssetId = $t01480814958._1
332- let buyAssetStrId = $t01480814958._2
333- let buyAssetName = $t01480814958._3
334- let buyAssetDecimals = $t01480814958._4
324+ let $t01469214767 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
325+ let pmtAmount = $t01469214767._1
326+ let pmtAssetId = $t01469214767._2
327+ let $t01477214922 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
328+ let buyAssetId = $t01477214922._1
329+ let buyAssetStrId = $t01477214922._2
330+ let buyAssetName = $t01477214922._3
331+ let buyAssetDecimals = $t01477214922._4
335332 let userUsdnInMarketing = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserAmountBuyAssetInMarketing)), 0)
336333 let usdnInMarketing = valueOrElse(getInteger(this, (toString(launchpadId) + keyAmountBuyAssetInMarketing)), 0)
337334 let boughtAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtAllocations)), 0)
338335 let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
339336 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
340337 let tokensPerAllocation = getIntegerValue(this, (toString(launchpadId) + keyTokensPerAllocation))
341- let $t01562715771 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
342- let tokenId = $t01562715771._1
343- let tokenStrAssetId = $t01562715771._2
344- let tokenAssetName = $t01562715771._3
345- let tokenDecimals = $t01562715771._4
338+ let $t01559115735 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
339+ let tokenId = $t01559115735._1
340+ let tokenStrAssetId = $t01559115735._2
341+ let tokenAssetName = $t01559115735._3
342+ let tokenDecimals = $t01559115735._4
346343 let allocationPriceWithComission = fraction(fraction(tokenPrice, tokensPerAllocation, pow(10, 0, tokenDecimals, 0, 0, DOWN)), (100 + commission), 100)
347344 let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
348345 let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
384381
385382 @Callable(i)
386383 func commitHighCompetitionSale (launchpadId,refId) = {
387- let $t01808018155 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
388- let pmtAmount = $t01808018155._1
389- let pmtAssetId = $t01808018155._2
390- let $t01816018310 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
391- let buyAssetId = $t01816018310._1
392- let buyAssetStrId = $t01816018310._2
393- let buyAssetName = $t01816018310._3
394- let buyAssetDecimals = $t01816018310._4
384+ let $t01804418119 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
385+ let pmtAmount = $t01804418119._1
386+ let pmtAssetId = $t01804418119._2
387+ let $t01812418274 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
388+ let buyAssetId = $t01812418274._1
389+ let buyAssetStrId = $t01812418274._2
390+ let buyAssetName = $t01812418274._3
391+ let buyAssetDecimals = $t01812418274._4
395392 let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
396393 let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
397394 let boughtHCTicketsAmount = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserHCBoughtTicketsAmount)), 0)
413410 else {
414411 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
415412 let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
416- let $t01955919703 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
417- let tokenId = $t01955919703._1
418- let tokenStrAssetId = $t01955919703._2
419- let tokenAssetName = $t01955919703._3
420- let tokenDecimals = $t01955919703._4
413+ let $t01952319667 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
414+ let tokenId = $t01952319667._1
415+ let tokenStrAssetId = $t01952319667._2
416+ let tokenAssetName = $t01952319667._3
417+ let tokenDecimals = $t01952319667._4
421418 let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
422419 let commissionPerTicket = fraction(ticketPrice, getIntegerValue(this, (toString(launchpadId) + keyHighCompetitionComission)), 100)
423420 let buyTicketAmount = (pmtAmount / (ticketPrice + commissionPerTicket))
462459 else if ((calcHash != savedHash))
463460 then throw("vrf Height hash not matching")
464461 else {
465- let $t02248822638 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
466- let buyAssetId = $t02248822638._1
467- let buyAssetStrId = $t02248822638._2
468- let buyAssetName = $t02248822638._3
469- let buyAssetDecimals = $t02248822638._4
462+ let $t02245222602 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
463+ let buyAssetId = $t02245222602._1
464+ let buyAssetStrId = $t02245222602._2
465+ let buyAssetName = $t02245222602._3
466+ let buyAssetDecimals = $t02245222602._4
470467 let projectAddress = addressFromStringValue(getStringValue(this, (toString(launchpadId) + keyAddress)))
471468 let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
472469 let commissionHC = getIntegerValue(this, (toString(launchpadId) + keyHighCompetitionComission))
509506 else false)
510507 then throw("You can't claim because you don't buy anything")
511508 else {
512- let $t02549725647 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
513- let buyAssetId = $t02549725647._1
514- let buyAssetStrId = $t02549725647._2
515- let buyAssetName = $t02549725647._3
516- let buyAssetDecimals = $t02549725647._4
509+ let $t02546125611 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
510+ let buyAssetId = $t02546125611._1
511+ let buyAssetStrId = $t02546125611._2
512+ let buyAssetName = $t02546125611._3
513+ let buyAssetDecimals = $t02546125611._4
517514 let wonnedTickets = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserWinnedTicketsAmount)), 0)
518515 let awailableAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserAvailableAllocations)), 0)
519516 let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
520517 let allowedAllocations = min([boughtAllocations, awailableAllocations])
521518 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
522519 let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
523- let $t02629426438 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
524- let tokenId = $t02629426438._1
525- let tokenStrAssetId = $t02629426438._2
526- let tokenAssetName = $t02629426438._3
527- let tokenDecimals = $t02629426438._4
520+ let $t02625826402 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
521+ let tokenId = $t02625826402._1
522+ let tokenStrAssetId = $t02625826402._2
523+ let tokenAssetName = $t02625826402._3
524+ let tokenDecimals = $t02625826402._4
528525 let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
529526 let tokensPerAllocation = getIntegerValue(this, (toString(launchpadId) + keyTokensPerAllocation))
530527 let transferTokensAmount = ((wonnedTickets * tokensPerTicket) + (allowedAllocations * tokensPerAllocation))
590587 then throw("Only admin can call this function")
591588 else {
592589 let projectAddress = addressFromStringValue(getStringValue(this, (toString(launchpadId) + keyAddress)))
593- let $t03011030260 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
594- let buyAssetId = $t03011030260._1
595- let buyAssetStrId = $t03011030260._2
596- let buyAssetName = $t03011030260._3
597- let buyAssetDecimals = $t03011030260._4
590+ let $t03007430224 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
591+ let buyAssetId = $t03007430224._1
592+ let buyAssetStrId = $t03007430224._2
593+ let buyAssetName = $t03007430224._3
594+ let buyAssetDecimals = $t03007430224._4
598595 [IntegerEntry((toString(launchpadId) + keyTransferBuyAsset), amount), ScriptTransfer(projectAddress, amount, buyAssetId)]
599596 }
600597
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let keyActive = "active"
55
66 let keyAdminPubKey1 = "admin_pub_1"
77
88 let keyAdminPubKey2 = "admin_pub_2"
99
1010 let keyAdminPubKey3 = "admin_pub_3"
1111
1212 let keyLaunchpadDataTransactionStatus = "launchpad_data_transaction_status"
1313
1414 let keyLaunchpadNextId = "launchpad_next_id"
1515
1616 let keyLaunchpadActiveId = "launchpad_active_id"
1717
1818 let keyInitCaller = "init_caller"
1919
2020 let keyAddress = "_address"
2121
2222 let keyInitHeight = "_init_height"
2323
2424 let keyStartHeight = "_start_height"
2525
2626 let keyFinaliseHeight = "_finalise_height"
2727
2828 let keyComission = "_comission"
2929
3030 let keyAssetId = "_asset_id"
3131
3232 let keyTotalTokenAmount = "_total_token_amount"
3333
3434 let keyTotalAmountBuyAssetSold = "_total_buy_asset_sold"
3535
3636 let keyTokensPerTicket = "_tokens_per_ticket"
3737
3838 let keyPricePerToken = "_price_per_token"
3939
4040 let keySwopPerTicket = "_swop_per_ticket"
4141
4242 let keySwopfiTicketsAmount = "_tickets_swopfi_members"
4343
4444 let keyCampaignTokensAmount = "_tokens_access_list"
4545
4646 let keyTokensPerAllocation = "_tokens_per_allocation"
4747
4848 let keyTicketLastNumber = "_ticket_last_number_high_competition"
4949
5050 let keyGovernanceStaked = "_SWOP_amount"
5151
5252 let keyUserRefId = "_ref_id"
5353
5454 let keyVerifyHash = "_verify_hash"
5555
5656 let keyDuration = "_duration"
5757
5858 let keyAmountBuyAssetInMarketing = "_total_purchased_buy_asset_in_marketing"
5959
6060 let keyAmountBuyAssetInMarketingFinalized = "_total_purchased_buy_asset_in_marketing_finalized"
6161
6262 let keyTransferBuyAsset = "_transfer_buy_asset"
6363
6464 let keyFreezSwopDuration = "_freeze_swop_duration"
6565
6666 let keyFreezeAdditionalToken = "_freeze_additional_token"
6767
6868 let keyFreezeTokenId = "_freeze_token_id"
6969
7070 let keyFreezeTokenDuration = "_freeze_token_duration"
7171
7272 let keyFreezeTokenPerTicket = "_freeze_token_per_ticket"
7373
7474 let keyBuyToken = "_buy_token"
7575
7676 let keyClaimParams = "_claim_params"
7777
7878 let keyHighCompetitionComission = "_high_competition_comission"
7979
8080 let keyHighCompetitionSale = "_high_competition_sale"
8181
8282 let keyHCTicketLastNumber = "_ticket_last_number"
8383
8484 let keyHighCompetitionAmount = "_tickets_high_competition"
8585
8686 let keyTotalAmountBuyAssetSoldHC = "_total_buy_asset_sold_high_competition"
8787
8888 let keyUserBoughtTicketsAmount = "_bought_tickets"
8989
9090 let keyUserTickets = "_tickets_number"
9191
9292 let keyUserHCTickets = "_tickets_number_high_competition"
9393
9494 let keyUserHCBoughtTicketsAmount = "_bought_tickets_high_competition"
9595
9696 let keyUserAvailableAllocations = "_available_purchase_marketing"
9797
9898 let keyUserAmountBuyAssetInMarketing = "_purchased_buy_asset_in_marketing"
9999
100100 let keyUserBoughtAllocations = "_bought_allocations"
101101
102102 let keyUserClaimStatus = "_claim_status"
103103
104104 let keyUserWinnedTicketsAmount = "_tickets_result"
105105
106106 let keyUserFreezeToken = "_freeze_token_amount"
107107
108108 let oracle = Address(base58'3NBBWfzZtZtszaXbitTKnrB2xXwv26Bn7H9')
109109
110110 let governance = Address(base58'3N5W8da2iiijVieA6qLGo7KzCJj8B19smWU')
111111
112112 let commissionWallet = Address(base58'3N2hBdeDEs7wCNA9EY8qv3B6drjgKD64xQG')
113113
114114 let stakingUSDNAddress = Address(base58'3N6q7sCGSSLBUXDdjBdYGTJbZGZfhhh8cNg')
115115
116116 let USDN = base58'8UrfDVd5GreeUwm7uPk7eYz1eMv376kzR52C6sANPkwS'
117117
118118 let adminPubKeyStaking = base58'Kn7NpzaG12dLZgcHf2ipUftU6hbJygmrhFqQYE4B7ZK'
119119
120120 let maxAllocationsAmount = 2
121121
122122 let isActive = valueOrElse(getBoolean(this, keyActive), true)
123123
124124 let activeLaunchpadId = valueOrElse(getIntegerValue(this, keyLaunchpadActiveId), -1)
125125
126126 func getAdminPub (keyAdminPub) = match getString(oracle, keyAdminPub) {
127127 case string: String =>
128128 fromBase58String(string)
129129 case nothing =>
130130 throw("Admin public key is empty")
131131 }
132132
133133
134134 let adminPubKey1 = getAdminPub(keyAdminPubKey1)
135135
136136 let adminPubKey2 = getAdminPub(keyAdminPubKey2)
137137
138138 let adminPubKey3 = getAdminPub(keyAdminPubKey3)
139139
140140 func getAssetInfo (assetId) = match assetId {
141141 case id: ByteVector =>
142142 let stringId = toBase58String(id)
143143 let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
144144 $Tuple3(stringId, info.name, info.decimals)
145145 case waves: Unit =>
146146 $Tuple3("WAVES", "WAVES", 8)
147147 case _ =>
148148 throw("Match error")
149149 }
150150
151151
152152 func getLaunchpadNextId () = valueOrElse(getInteger(this, keyLaunchpadNextId), 1)
153153
154154
155155 func stakedUsdnAmount () = valueOrElse(getInteger(stakingUSDNAddress, ((("rpd_balance_" + toBase58String(USDN)) + "_") + toString(this))), 0)
156156
157157
158158 func getAssetInfoFromString (assetStr) = if ((assetStr == "WAVES"))
159159 then $Tuple4(unit, "WAVES", "WAVES", 8)
160160 else {
161161 let stringId = assetStr
162162 let id = fromBase58String(assetStr)
163163 let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
164164 $Tuple4(id, stringId, info.name, info.decimals)
165165 }
166166
167167
168168 @Callable(i)
169169 func hashingRandom (launchpadId,hash) = if (!(isActive))
170170 then throw("DApp is inactive at this moment")
171171 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
172172 then throw("Only admin can call this function")
173173 else [StringEntry((toString(launchpadId) + keyVerifyHash), hash)]
174174
175175
176176
177177 @Callable(i)
178178 func initCaller (address) = if (!(isActive))
179179 then throw("DApp is inactive at this moment")
180180 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
181181 then throw("Only admin can call this function")
182182 else [StringEntry(keyInitCaller, address)]
183183
184184
185185
186186 @Callable(i)
187-func init (projectAddress,startHeight,duration,buyToken,commission,tokensPerTicket,pricePerToken,swopfiTicketsAmount,campaignTokensAmount,tokensPerAllocation,swopPerTicket,swopFreezeDuration,claimParams,HighCompetitionSale,highCompetitionComission,highCompetitionTicketsAmount,freezeAdditionalToken,freezeParams) = {
188- let adminInitkey = valueOrElse(getString(this, keyInitCaller), "")
189- if (!(isActive))
190- then throw("DApp is inactive at this moment")
191- else if ((toString(i.caller) != adminInitkey))
192- then throw("Only project admin can call init function")
193- else if ((size(i.payments) != 1))
194- then throw("One attached payment expected")
195- else if ((height > startHeight))
196- then throw("Start height must be greater than blockchain height")
197- else if (if (freezeAdditionalToken)
198- then (size(freezeParams) != 3)
199- else false)
200- then throw("Freeze params list must have 3 items")
201- else {
202- let launchpadId = getLaunchpadNextId()
203- let launchpadIdStr = toString(launchpadId)
204- let $t063906465 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
205- let pmtAmount = $t063906465._1
206- let pmtAssetId = $t063906465._2
207- let $t064746547 = getAssetInfo(pmtAssetId)
208- let pmtStrAssetId = $t064746547._1
209- let pmtAssetName = $t064746547._2
210- let pmtDecimals = $t064746547._3
211- let freezeAdditionalEntry = if (freezeAdditionalToken)
212- then [BooleanEntry((launchpadIdStr + keyFreezeAdditionalToken), true), StringEntry((launchpadIdStr + keyFreezeTokenId), freezeParams[0]), IntegerEntry((launchpadIdStr + keyFreezeTokenDuration), parseIntValue(freezeParams[1])), IntegerEntry((launchpadIdStr + keyFreezeTokenPerTicket), parseIntValue(freezeParams[2]))]
213- else nil
214- ([IntegerEntry((pmtStrAssetId + "_launchpad"), launchpadId), IntegerEntry(keyLaunchpadNextId, (launchpadId + 1)), StringEntry((launchpadIdStr + keyAddress), projectAddress), IntegerEntry((launchpadIdStr + keyInitHeight), height), IntegerEntry((launchpadIdStr + keyStartHeight), startHeight), IntegerEntry((launchpadIdStr + keyDuration), duration), StringEntry((launchpadIdStr + keyBuyToken), buyToken), IntegerEntry((launchpadIdStr + keyFreezSwopDuration), swopFreezeDuration), IntegerEntry((launchpadIdStr + keyTotalTokenAmount), pmtAmount), StringEntry((launchpadIdStr + keyAssetId), pmtStrAssetId), IntegerEntry((launchpadIdStr + keyComission), commission), IntegerEntry((launchpadIdStr + keyTicketLastNumber), 0), IntegerEntry((launchpadIdStr + keyTokensPerTicket), tokensPerTicket), IntegerEntry((launchpadIdStr + keyPricePerToken), pricePerToken), IntegerEntry((launchpadIdStr + keySwopPerTicket), swopPerTicket), IntegerEntry((launchpadIdStr + keySwopfiTicketsAmount), swopfiTicketsAmount), IntegerEntry((launchpadIdStr + keyCampaignTokensAmount), campaignTokensAmount), IntegerEntry((launchpadIdStr + keyTokensPerAllocation), tokensPerAllocation), StringEntry((launchpadIdStr + keyClaimParams), makeString(claimParams, ",")), BooleanEntry((launchpadIdStr + keyHighCompetitionSale), HighCompetitionSale), IntegerEntry((launchpadIdStr + keyHighCompetitionComission), highCompetitionComission), IntegerEntry((launchpadIdStr + keyHighCompetitionAmount), highCompetitionTicketsAmount), IntegerEntry(keyLaunchpadActiveId, launchpadId), StringEntry(keyInitCaller, "")] ++ freezeAdditionalEntry)
215- }
216- }
187+func init (projectAddress,startHeight,duration,buyToken,commission,tokensPerTicket,pricePerToken,swopfiTicketsAmount,campaignTokensAmount,tokensPerAllocation,swopPerTicket,swopFreezeDuration,claimParams,HighCompetitionSale,highCompetitionComission,highCompetitionTicketsAmount,freezeAdditionalToken,freezeParams) = if (!(isActive))
188+ then throw("DApp is inactive at this moment")
189+ else if ((toString(i.caller) != valueOrElse(getString(this, keyInitCaller), "")))
190+ then throw("Only project admin can call init function")
191+ else if ((size(i.payments) != 1))
192+ then throw("One attached payment expected")
193+ else if ((height > startHeight))
194+ then throw("Start height must be greater than blockchain height")
195+ else if (if (freezeAdditionalToken)
196+ then (size(freezeParams) != 3)
197+ else false)
198+ then throw("Freeze params list must have 3 items")
199+ else {
200+ let launchpadId = getLaunchpadNextId()
201+ let launchpadIdStr = toString(launchpadId)
202+ let $t063546429 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
203+ let pmtAmount = $t063546429._1
204+ let pmtAssetId = $t063546429._2
205+ let $t064386511 = getAssetInfo(pmtAssetId)
206+ let pmtStrAssetId = $t064386511._1
207+ let pmtAssetName = $t064386511._2
208+ let pmtDecimals = $t064386511._3
209+ let freezeAdditionalEntry = if (freezeAdditionalToken)
210+ then [BooleanEntry((launchpadIdStr + keyFreezeAdditionalToken), true), StringEntry((launchpadIdStr + keyFreezeTokenId), freezeParams[0]), IntegerEntry((launchpadIdStr + keyFreezeTokenDuration), parseIntValue(freezeParams[1])), IntegerEntry((launchpadIdStr + keyFreezeTokenPerTicket), parseIntValue(freezeParams[2]))]
211+ else nil
212+ ([IntegerEntry((pmtStrAssetId + "_launchpad"), launchpadId), IntegerEntry(keyLaunchpadNextId, (launchpadId + 1)), StringEntry((launchpadIdStr + keyAddress), projectAddress), IntegerEntry((launchpadIdStr + keyInitHeight), height), IntegerEntry((launchpadIdStr + keyStartHeight), startHeight), IntegerEntry((launchpadIdStr + keyDuration), duration), StringEntry((launchpadIdStr + keyBuyToken), buyToken), IntegerEntry((launchpadIdStr + keyFreezSwopDuration), swopFreezeDuration), IntegerEntry((launchpadIdStr + keyTotalTokenAmount), pmtAmount), StringEntry((launchpadIdStr + keyAssetId), pmtStrAssetId), IntegerEntry((launchpadIdStr + keyComission), commission), IntegerEntry((launchpadIdStr + keyTicketLastNumber), 0), IntegerEntry((launchpadIdStr + keyTokensPerTicket), tokensPerTicket), IntegerEntry((launchpadIdStr + keyPricePerToken), pricePerToken), IntegerEntry((launchpadIdStr + keySwopPerTicket), swopPerTicket), IntegerEntry((launchpadIdStr + keySwopfiTicketsAmount), swopfiTicketsAmount), IntegerEntry((launchpadIdStr + keyCampaignTokensAmount), campaignTokensAmount), IntegerEntry((launchpadIdStr + keyTokensPerAllocation), tokensPerAllocation), StringEntry((launchpadIdStr + keyClaimParams), makeString(claimParams, ",")), BooleanEntry((launchpadIdStr + keyHighCompetitionSale), HighCompetitionSale), IntegerEntry((launchpadIdStr + keyHighCompetitionComission), highCompetitionComission), IntegerEntry((launchpadIdStr + keyHighCompetitionAmount), highCompetitionTicketsAmount), IntegerEntry(keyLaunchpadActiveId, launchpadId), StringEntry(keyInitCaller, "")] ++ freezeAdditionalEntry)
213+ }
217214
218215
219216
220217 @Callable(i)
221218 func commitSwopfiSale (launchpadId,refId) = {
222- let $t090609135 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
223- let pmtAmount = $t090609135._1
224- let pmtAssetId = $t090609135._2
225- let $t091409290 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
226- let buyAssetId = $t091409290._1
227- let buyAssetStrId = $t091409290._2
228- let buyAssetName = $t091409290._3
229- let buyAssetDecimals = $t091409290._4
219+ let $t090249099 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
220+ let pmtAmount = $t090249099._1
221+ let pmtAssetId = $t090249099._2
222+ let $t091049254 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
223+ let buyAssetId = $t091049254._1
224+ let buyAssetStrId = $t091049254._2
225+ let buyAssetName = $t091049254._3
226+ let buyAssetDecimals = $t091049254._4
230227 let stakedSwops = valueOrElse(getInteger(governance, (toString(i.caller) + keyGovernanceStaked)), 0)
231228 let allowedTicketsAmountAll = (stakedSwops / getIntegerValue(this, (toString(launchpadId) + keySwopPerTicket)))
232229 let boughtTicketsAmount = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtTicketsAmount)), 0)
233230 let allowedTicketsAmount = (allowedTicketsAmountAll - boughtTicketsAmount)
234231 let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
235232 let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
236233 let freezeAdditionalToken = valueOrElse(getBoolean(this, (toString(launchpadId) + keyFreezeAdditionalToken)), false)
237234 if (!(isActive))
238235 then throw("DApp is inactive at this moment")
239236 else if ((activeLaunchpadId != launchpadId))
240237 then throw("There is no active launchpad or this launchpad is ended")
241238 else if ((startHeight > height))
242239 then throw("Launchpad sale not started yet")
243240 else if ((height > (startHeight + duration)))
244241 then throw("Launchpad sale ended")
245242 else if (if (!(freezeAdditionalToken))
246243 then if ((size(i.payments) != 1))
247244 then true
248245 else (pmtAssetId != buyAssetId)
249246 else false)
250247 then throw((("One attached payment in " + buyAssetName) + " expected"))
251248 else if (if (freezeAdditionalToken)
252249 then if ((size(i.payments) != 2))
253250 then true
254251 else (pmtAssetId != buyAssetId)
255252 else false)
256253 then {
257254 let freezeTokenId = getStringValue(this, (toString(launchpadId) + keyFreezeTokenId))
258255 throw(((("Two attached payments expected: First in " + buyAssetName) + ", second in ") + freezeTokenId))
259256 }
260257 else if (if ((0 >= allowedTicketsAmountAll))
261258 then true
262259 else (0 >= allowedTicketsAmount))
263260 then throw("Not enought SWOP in staking to buy tickets")
264261 else {
265262 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
266263 let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
267- let $t01117811322 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
268- let tokenId = $t01117811322._1
269- let tokenStrAssetId = $t01117811322._2
270- let tokenAssetName = $t01117811322._3
271- let tokenDecimals = $t01117811322._4
264+ let $t01114211286 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
265+ let tokenId = $t01114211286._1
266+ let tokenStrAssetId = $t01114211286._2
267+ let tokenAssetName = $t01114211286._3
268+ let tokenDecimals = $t01114211286._4
272269 let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
273270 let commissionPerTicket = fraction(ticketPrice, getIntegerValue(this, (toString(launchpadId) + keyComission)), 100)
274271 let buyTicketAmount = (pmtAmount / (ticketPrice + commissionPerTicket))
275272 let allowedBuyTicketAmount = min([buyTicketAmount, allowedTicketsAmount])
276273 let allowedBuyPriceWithComission = (allowedBuyTicketAmount * (ticketPrice + commissionPerTicket))
277274 let change = (pmtAmount - allowedBuyPriceWithComission)
278275 if ((buyTicketAmount == 0))
279276 then throw((("Not enought " + buyAssetName) + " to buy tickets"))
280277 else if ((change != 0))
281278 then throw((((("Wrong payment. To buy " + toString(allowedBuyTicketAmount)) + "tickets you need to pay ") + toString(allowedBuyPriceWithComission)) + buyAssetName))
282279 else {
283280 let freezeAdditionalEntry = if (freezeAdditionalToken)
284281 then {
285282 let freezeTokenId = getStringValue(this, (toString(launchpadId) + keyFreezeTokenId))
286283 let freezeTokenPerTicket = getIntegerValue(this, (toString(launchpadId) + keyFreezeTokenPerTicket))
287- let $t01248612573 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
288- let pmtAmountFreeze = $t01248612573._1
289- let pmtAssetIdFreeze = $t01248612573._2
290- let $t01259012681 = getAssetInfo(pmtAssetId)
291- let pmtFreezeStrAssetId = $t01259012681._1
292- let pmtFreezeAssetName = $t01259012681._2
293- let pmtFreezeDecimals = $t01259012681._3
284+ let $t01245012537 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
285+ let pmtAmountFreeze = $t01245012537._1
286+ let pmtAssetIdFreeze = $t01245012537._2
287+ let $t01255412645 = getAssetInfo(pmtAssetId)
288+ let pmtFreezeStrAssetId = $t01255412645._1
289+ let pmtFreezeAssetName = $t01255412645._2
290+ let pmtFreezeDecimals = $t01255412645._3
294291 let needFreezeTokens = (freezeTokenPerTicket * buyTicketAmount)
295292 if (if ((pmtFreezeStrAssetId != freezeTokenId))
296293 then true
297294 else (needFreezeTokens != pmtAmountFreeze))
298295 then throw((((("You need to add " + toString(needFreezeTokens)) + " ") + pmtFreezeAssetName) + " as a second payment"))
299296 else [IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserFreezeToken), pmtAmountFreeze)]
300297 }
301298 else nil
302299 let userBoughtTicketsNumbers = valueOrElse(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserTickets)), "")
303300 let lastBoughtTicketNumber = getIntegerValue(this, (toString(launchpadId) + keyTicketLastNumber))
304301 let boughtRange = ((toString((lastBoughtTicketNumber + 1)) + "-") + toString((lastBoughtTicketNumber + allowedBuyTicketAmount)))
305302 let newUserBoughtTicketsNumbers = (userBoughtTicketsNumbers + (if ((userBoughtTicketsNumbers != ""))
306303 then ("," + boughtRange)
307304 else ("" + boughtRange)))
308305 let inv = if ((buyAssetId == USDN))
309306 then invoke(stakingUSDNAddress, "lockNeutrino", nil, [AttachedPayment(pmtAssetId, pmtAmount)])
310307 else 0
311308 if ((inv == inv))
312309 then {
313310 let baseEntry = ([IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtTicketsAmount), (boughtTicketsAmount + allowedBuyTicketAmount)), IntegerEntry((toString(launchpadId) + keyTicketLastNumber), (lastBoughtTicketNumber + allowedBuyTicketAmount)), StringEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserTickets), newUserBoughtTicketsNumbers)] ++ freezeAdditionalEntry)
314311 if (!(isDefined(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId)))))
315312 then (baseEntry ++ [StringEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId), refId)])
316313 else baseEntry
317314 }
318315 else throw("Strict value is not equal to itself.")
319316 }
320317 }
321318 }
322319
323320
324321
325322 @Callable(i)
326323 func commitAccessListSale (launchpadId,refId) = {
327- let $t01472814803 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
328- let pmtAmount = $t01472814803._1
329- let pmtAssetId = $t01472814803._2
330- let $t01480814958 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
331- let buyAssetId = $t01480814958._1
332- let buyAssetStrId = $t01480814958._2
333- let buyAssetName = $t01480814958._3
334- let buyAssetDecimals = $t01480814958._4
324+ let $t01469214767 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
325+ let pmtAmount = $t01469214767._1
326+ let pmtAssetId = $t01469214767._2
327+ let $t01477214922 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
328+ let buyAssetId = $t01477214922._1
329+ let buyAssetStrId = $t01477214922._2
330+ let buyAssetName = $t01477214922._3
331+ let buyAssetDecimals = $t01477214922._4
335332 let userUsdnInMarketing = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserAmountBuyAssetInMarketing)), 0)
336333 let usdnInMarketing = valueOrElse(getInteger(this, (toString(launchpadId) + keyAmountBuyAssetInMarketing)), 0)
337334 let boughtAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtAllocations)), 0)
338335 let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
339336 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
340337 let tokensPerAllocation = getIntegerValue(this, (toString(launchpadId) + keyTokensPerAllocation))
341- let $t01562715771 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
342- let tokenId = $t01562715771._1
343- let tokenStrAssetId = $t01562715771._2
344- let tokenAssetName = $t01562715771._3
345- let tokenDecimals = $t01562715771._4
338+ let $t01559115735 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
339+ let tokenId = $t01559115735._1
340+ let tokenStrAssetId = $t01559115735._2
341+ let tokenAssetName = $t01559115735._3
342+ let tokenDecimals = $t01559115735._4
346343 let allocationPriceWithComission = fraction(fraction(tokenPrice, tokensPerAllocation, pow(10, 0, tokenDecimals, 0, 0, DOWN)), (100 + commission), 100)
347344 let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
348345 let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
349346 if (!(isActive))
350347 then throw("DApp is inactive at this moment")
351348 else if ((activeLaunchpadId != launchpadId))
352349 then throw("There is no active launchpad or this launchpad is ended")
353350 else if ((startHeight > height))
354351 then throw("Launchpad sale not started yet")
355352 else if ((height > (startHeight + duration)))
356353 then throw("Launchpad sale ended")
357354 else if (if ((size(i.payments) != 1))
358355 then true
359356 else (pmtAssetId != buyAssetId))
360357 then throw((("One attached payment in " + buyAssetName) + " expected"))
361358 else if ((boughtAllocations >= maxAllocationsAmount))
362359 then throw((("You can buy only " + toString(maxAllocationsAmount)) + "allocations"))
363360 else if (if ((allocationPriceWithComission != pmtAmount))
364361 then ((allocationPriceWithComission * 2) != pmtAmount)
365362 else false)
366363 then throw(((("Wrong payment. You can buy 1 or 2 allocations for " + toString(allocationPriceWithComission)) + buyAssetName) + " per allocation"))
367364 else {
368365 let buyAllocationsAmount = (pmtAmount / allocationPriceWithComission)
369366 let inv = if ((buyAssetId == USDN))
370367 then invoke(stakingUSDNAddress, "lockNeutrino", nil, [AttachedPayment(pmtAssetId, pmtAmount)])
371368 else 0
372369 if ((inv == inv))
373370 then {
374371 let baseEntry = [IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtAllocations), (boughtAllocations + buyAllocationsAmount)), IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserAmountBuyAssetInMarketing), (userUsdnInMarketing + pmtAmount)), IntegerEntry((toString(launchpadId) + keyAmountBuyAssetInMarketing), (usdnInMarketing + pmtAmount))]
375372 if (!(isDefined(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId)))))
376373 then (baseEntry ++ [StringEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId), refId)])
377374 else baseEntry
378375 }
379376 else throw("Strict value is not equal to itself.")
380377 }
381378 }
382379
383380
384381
385382 @Callable(i)
386383 func commitHighCompetitionSale (launchpadId,refId) = {
387- let $t01808018155 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
388- let pmtAmount = $t01808018155._1
389- let pmtAssetId = $t01808018155._2
390- let $t01816018310 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
391- let buyAssetId = $t01816018310._1
392- let buyAssetStrId = $t01816018310._2
393- let buyAssetName = $t01816018310._3
394- let buyAssetDecimals = $t01816018310._4
384+ let $t01804418119 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
385+ let pmtAmount = $t01804418119._1
386+ let pmtAssetId = $t01804418119._2
387+ let $t01812418274 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
388+ let buyAssetId = $t01812418274._1
389+ let buyAssetStrId = $t01812418274._2
390+ let buyAssetName = $t01812418274._3
391+ let buyAssetDecimals = $t01812418274._4
395392 let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
396393 let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
397394 let boughtHCTicketsAmount = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserHCBoughtTicketsAmount)), 0)
398395 let highCompetitionSale = valueOrElse(getBoolean(this, (toString(launchpadId) + keyHighCompetitionSale)), false)
399396 if (!(isActive))
400397 then throw("DApp is inactive at this moment")
401398 else if ((activeLaunchpadId != launchpadId))
402399 then throw("There is no active launchpad or this launchpad is ended")
403400 else if (!(highCompetitionSale))
404401 then throw("There is no high competition sale for this launchpad")
405402 else if ((startHeight > height))
406403 then throw("Launchpad sale not started yet")
407404 else if ((height > (startHeight + duration)))
408405 then throw("Launchpad sale ended")
409406 else if (if ((size(i.payments) != 1))
410407 then true
411408 else (pmtAssetId != buyAssetId))
412409 then throw((("One attached payment in " + buyAssetName) + " expected"))
413410 else {
414411 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
415412 let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
416- let $t01955919703 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
417- let tokenId = $t01955919703._1
418- let tokenStrAssetId = $t01955919703._2
419- let tokenAssetName = $t01955919703._3
420- let tokenDecimals = $t01955919703._4
413+ let $t01952319667 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
414+ let tokenId = $t01952319667._1
415+ let tokenStrAssetId = $t01952319667._2
416+ let tokenAssetName = $t01952319667._3
417+ let tokenDecimals = $t01952319667._4
421418 let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
422419 let commissionPerTicket = fraction(ticketPrice, getIntegerValue(this, (toString(launchpadId) + keyHighCompetitionComission)), 100)
423420 let buyTicketAmount = (pmtAmount / (ticketPrice + commissionPerTicket))
424421 let buyPriceWithComission = (buyTicketAmount * (ticketPrice + commissionPerTicket))
425422 let change = (pmtAmount - buyPriceWithComission)
426423 if ((buyTicketAmount == 0))
427424 then throw((("Not enought " + buyAssetName) + " to buy tickets"))
428425 else if ((change != 0))
429426 then throw((((("Wrong payment. To buy " + toString(buyTicketAmount)) + "tickets you need to pay ") + toString(buyPriceWithComission)) + buyAssetName))
430427 else {
431428 let userBoughtTicketsNumbers = valueOrElse(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserHCTickets)), "")
432429 let lastBoughtTicketNumber = getIntegerValue(this, (toString(launchpadId) + keyHCTicketLastNumber))
433430 let boughtRange = ((toString((lastBoughtTicketNumber + 1)) + "-") + toString((lastBoughtTicketNumber + buyTicketAmount)))
434431 let newUserBoughtTicketsNumbers = (userBoughtTicketsNumbers + (if ((userBoughtTicketsNumbers != ""))
435432 then ("," + boughtRange)
436433 else ("" + boughtRange)))
437434 let inv = if ((buyAssetId == USDN))
438435 then invoke(stakingUSDNAddress, "lockNeutrino", nil, [AttachedPayment(pmtAssetId, pmtAmount)])
439436 else 0
440437 if ((inv == inv))
441438 then {
442439 let baseEntry = [IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserHCBoughtTicketsAmount), (boughtHCTicketsAmount + buyTicketAmount)), IntegerEntry((toString(launchpadId) + keyHCTicketLastNumber), (lastBoughtTicketNumber + buyTicketAmount)), StringEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserHCTickets), newUserBoughtTicketsNumbers)]
443440 if (!(isDefined(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId)))))
444441 then (baseEntry ++ [StringEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId), refId)])
445442 else baseEntry
446443 }
447444 else throw("Strict value is not equal to itself.")
448445 }
449446 }
450447 }
451448
452449
453450
454451 @Callable(i)
455452 func finalise (launchpadId,vrfHeight,secretWord) = {
456453 let savedHash = getStringValue(this, (toString(launchpadId) + keyVerifyHash))
457454 let calcHash = toBase58String(sha256((toBytes(vrfHeight) + toBytes(secretWord))))
458455 if (!(isActive))
459456 then throw("DApp is inactive at this moment")
460457 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
461458 then throw("Only admin can call this function")
462459 else if ((calcHash != savedHash))
463460 then throw("vrf Height hash not matching")
464461 else {
465- let $t02248822638 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
466- let buyAssetId = $t02248822638._1
467- let buyAssetStrId = $t02248822638._2
468- let buyAssetName = $t02248822638._3
469- let buyAssetDecimals = $t02248822638._4
462+ let $t02245222602 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
463+ let buyAssetId = $t02245222602._1
464+ let buyAssetStrId = $t02245222602._2
465+ let buyAssetName = $t02245222602._3
466+ let buyAssetDecimals = $t02245222602._4
470467 let projectAddress = addressFromStringValue(getStringValue(this, (toString(launchpadId) + keyAddress)))
471468 let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
472469 let commissionHC = getIntegerValue(this, (toString(launchpadId) + keyHighCompetitionComission))
473470 let transferedBuyAsset = valueOrElse(getInteger(this, (toString(launchpadId) + keyTransferBuyAsset)), 0)
474471 let swopfiMembersBuyAssetAmount = getIntegerValue(this, (toString(launchpadId) + keyTotalAmountBuyAssetSold))
475472 let swopfiHCBuyAssetAmount = valueOrElse(getIntegerValue(this, (toString(launchpadId) + keyTotalAmountBuyAssetSoldHC)), 0)
476473 let swopfiMembersComission = fraction(swopfiMembersBuyAssetAmount, commission, 100)
477474 let swopfiHCComission = fraction(swopfiHCBuyAssetAmount, commissionHC, 100)
478475 let totalAmountBuyAssetInMarketing = getIntegerValue(this, (toString(launchpadId) + keyAmountBuyAssetInMarketingFinalized))
479476 let marketingComission = fraction(totalAmountBuyAssetInMarketing, commission, 100)
480477 let unstakeAmount = (((((swopfiMembersBuyAssetAmount + totalAmountBuyAssetInMarketing) + swopfiMembersComission) + marketingComission) + swopfiHCBuyAssetAmount) + swopfiHCComission)
481478 if ((transferedBuyAsset > (swopfiMembersBuyAssetAmount + totalAmountBuyAssetInMarketing)))
482479 then throw("Can't transfer negative value to project")
483480 else {
484481 let inv = if ((buyAssetId == USDN))
485482 then invoke(stakingUSDNAddress, "unlockNeutrino", [unstakeAmount, toBase58String(USDN)], nil)
486483 else 0
487484 if ((inv == inv))
488485 then [IntegerEntry((toString(launchpadId) + keyFinaliseHeight), height), ScriptTransfer(projectAddress, ((swopfiMembersBuyAssetAmount + totalAmountBuyAssetInMarketing) - transferedBuyAsset), buyAssetId), ScriptTransfer(commissionWallet, ((swopfiMembersComission + marketingComission) + swopfiHCComission), buyAssetId)]
489486 else throw("Strict value is not equal to itself.")
490487 }
491488 }
492489 }
493490
494491
495492
496493 @Callable(i)
497494 func claim (launchpadId) = {
498495 let userClaimStatus = valueOrElse(getBoolean(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimStatus)), false)
499496 let boughtTickets = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtTicketsAmount)), 0)
500497 let boughtAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtAllocations)), 0)
501498 if (!(isActive))
502499 then throw("DApp is inactive at this moment")
503500 else if (!(isDefined(getInteger(this, (toString(launchpadId) + keyFinaliseHeight)))))
504501 then throw("You can't claim because results are not finalized")
505502 else if (userClaimStatus)
506503 then throw("You are already claimed")
507504 else if (if ((boughtTickets == 0))
508505 then (boughtAllocations == 0)
509506 else false)
510507 then throw("You can't claim because you don't buy anything")
511508 else {
512- let $t02549725647 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
513- let buyAssetId = $t02549725647._1
514- let buyAssetStrId = $t02549725647._2
515- let buyAssetName = $t02549725647._3
516- let buyAssetDecimals = $t02549725647._4
509+ let $t02546125611 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
510+ let buyAssetId = $t02546125611._1
511+ let buyAssetStrId = $t02546125611._2
512+ let buyAssetName = $t02546125611._3
513+ let buyAssetDecimals = $t02546125611._4
517514 let wonnedTickets = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserWinnedTicketsAmount)), 0)
518515 let awailableAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserAvailableAllocations)), 0)
519516 let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
520517 let allowedAllocations = min([boughtAllocations, awailableAllocations])
521518 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
522519 let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
523- let $t02629426438 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
524- let tokenId = $t02629426438._1
525- let tokenStrAssetId = $t02629426438._2
526- let tokenAssetName = $t02629426438._3
527- let tokenDecimals = $t02629426438._4
520+ let $t02625826402 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
521+ let tokenId = $t02625826402._1
522+ let tokenStrAssetId = $t02625826402._2
523+ let tokenAssetName = $t02625826402._3
524+ let tokenDecimals = $t02625826402._4
528525 let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
529526 let tokensPerAllocation = getIntegerValue(this, (toString(launchpadId) + keyTokensPerAllocation))
530527 let transferTokensAmount = ((wonnedTickets * tokensPerTicket) + (allowedAllocations * tokensPerAllocation))
531528 let notAllowedAllocationsTokens = ((boughtAllocations - allowedAllocations) * tokensPerAllocation)
532529 let buyAssetForAllocations = fraction(fraction(notAllowedAllocationsTokens, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN)), (100 + commission), 100)
533530 let buyAssetForUnwonnedTickets = fraction(((boughtTickets - wonnedTickets) * ticketPrice), (100 + commission), 100)
534531 if (if ((0 > buyAssetForAllocations))
535532 then true
536533 else (0 > buyAssetForUnwonnedTickets))
537534 then throw("Error with allowed allocation param or wonned tickets param please contact support")
538535 else {
539536 let returnedBuyAssetAmount = (buyAssetForUnwonnedTickets + buyAssetForUnwonnedTickets)
540537 let transferUsdn = if ((returnedBuyAssetAmount > 0))
541538 then [ScriptTransfer(i.caller, returnedBuyAssetAmount, buyAssetId)]
542539 else nil
543540 let transferTokens = if ((transferTokensAmount > 0))
544541 then [ScriptTransfer(i.caller, transferTokensAmount, tokenId)]
545542 else nil
546543 let inv = if (if ((returnedBuyAssetAmount > 0))
547544 then (buyAssetId == USDN)
548545 else false)
549546 then invoke(stakingUSDNAddress, "unlockNeutrino", [returnedBuyAssetAmount, toBase58String(USDN)], nil)
550547 else 0
551548 if ((inv == inv))
552549 then (([BooleanEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimStatus), true)] ++ transferTokens) ++ transferUsdn)
553550 else throw("Strict value is not equal to itself.")
554551 }
555552 }
556553 }
557554
558555
559556
560557 @Callable(i)
561558 func claimFreezeToken (launchpadId) = {
562559 let freezeAdditionalToken = valueOrElse(getBoolean(this, (toString(launchpadId) + keyFreezeAdditionalToken)), false)
563560 if (!(isActive))
564561 then throw("DApp is inactive at this moment")
565562 else if (!(isDefined(getInteger(this, (toString(launchpadId) + keyFinaliseHeight)))))
566563 then throw("You can't claim because results are not finalized")
567564 else if (!(freezeAdditionalToken))
568565 then throw("There are no additional token freezing for this launchpad")
569566 else {
570567 let tokenId = fromBase58String(getStringValue(this, (toString(launchpadId) + keyFreezeTokenId)))
571568 let userTokensFreezed = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserFreezeToken)), 0)
572569 let startHeight = valueOrElse(getInteger(this, (toString(launchpadId) + keyStartHeight)), 0)
573570 let duration = valueOrElse(getInteger(this, (toString(launchpadId) + keyDuration)), 0)
574571 let freezeTokenDuration = getIntegerValue(this, (toString(launchpadId) + keyFreezeTokenDuration))
575572 let blockEndHeight = ((startHeight + duration) + freezeTokenDuration)
576573 if ((userTokensFreezed == 0))
577574 then throw("You are already claimed your tokens or not paid anything")
578575 else if ((blockEndHeight > height))
579576 then throw(("Your tokens freezed teel " + toString(blockEndHeight)))
580577 else [ScriptTransfer(i.caller, userTokensFreezed, tokenId), IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserFreezeToken), 0)]
581578 }
582579 }
583580
584581
585582
586583 @Callable(i)
587584 func transferBuyAsset (launchpadId,amount) = if (!(isActive))
588585 then throw("DApp is inactive")
589586 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
590587 then throw("Only admin can call this function")
591588 else {
592589 let projectAddress = addressFromStringValue(getStringValue(this, (toString(launchpadId) + keyAddress)))
593- let $t03011030260 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
594- let buyAssetId = $t03011030260._1
595- let buyAssetStrId = $t03011030260._2
596- let buyAssetName = $t03011030260._3
597- let buyAssetDecimals = $t03011030260._4
590+ let $t03007430224 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
591+ let buyAssetId = $t03007430224._1
592+ let buyAssetStrId = $t03007430224._2
593+ let buyAssetName = $t03007430224._3
594+ let buyAssetDecimals = $t03007430224._4
598595 [IntegerEntry((toString(launchpadId) + keyTransferBuyAsset), amount), ScriptTransfer(projectAddress, amount, buyAssetId)]
599596 }
600597
601598
602599
603600 @Callable(i)
604601 func shutdown () = if (!(isActive))
605602 then throw("DApp already inactive")
606603 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
607604 then throw("Only admin can call this function")
608605 else [BooleanEntry(keyActive, false)]
609606
610607
611608
612609 @Callable(i)
613610 func activate () = if (isActive)
614611 then throw("DApp already active")
615612 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
616613 then throw("Only admin can call this function")
617614 else [BooleanEntry(keyActive, true)]
618615
619616
620617 @Verifier(tx)
621618 func verify () = {
622619 let multiSignedByAdmins = {
623620 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
624621 then 1
625622 else 0
626623 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
627624 then 1
628625 else 0
629626 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
630627 then 1
631628 else 0
632629 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
633630 }
634631 let signedByAdmin = if (if (if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
635632 then true
636633 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey2))
637634 then true
638635 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey3))
639636 then true
640637 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKeyStaking)
641638 match tx {
642639 case dtx: DataTransaction =>
643640 if (valueOrElse(getBoolean(oracle, keyLaunchpadDataTransactionStatus), false))
644641 then signedByAdmin
645642 else false
646643 case _ =>
647644 multiSignedByAdmins
648645 }
649646 }
650647

github/deemru/w8io/873ac7e 
118.01 ms