tx · Ee2jxru2Dv1HBbkLEU7kn6KKUVG1ktegyhjEcbgGUkHq

3MwkjgDrsm5k73WJU9Nbxbx4y2iy3zjQzMi:  -0.01400000 Waves

2021.12.13 17:40 [1832615] smart account 3MwkjgDrsm5k73WJU9Nbxbx4y2iy3zjQzMi > SELF 0.00000000 Waves

{ "type": 13, "id": "Ee2jxru2Dv1HBbkLEU7kn6KKUVG1ktegyhjEcbgGUkHq", "fee": 1400000, "feeAssetId": null, "timestamp": 1639406475338, "version": 2, "chainId": 84, "sender": "3MwkjgDrsm5k73WJU9Nbxbx4y2iy3zjQzMi", "senderPublicKey": "FRotxVW1MhTQRDvVbMM4yvYGWzBFvHqvMsonvGeEXQUy", "proofs": [ "5REtNS9YT1EXmmSXbYhtEw5q5m6G1cReow73qysi16H6oE7pi96GtqohqMRuXFV76pG7BvToj4ZDtYbJhQohnzZu", "5ywmd1ECmhG3QQaSMdV76ETFVCeK9fci43XxcuLTJrweCacSURjEwJPVeRNzFNFiRyvwGeT69swHaN1y274uZE1L" ], "script": "base64:AAIFAAAAAAAAEx0IAhIECgIBCBIDCgEIEhQKEggBAQgBAQEBAQEBARgEAQEEGBIECgIBCBIECgIBCBIECgIBCBIFCgMBAQgSAwoBARIDCgEBEgQKAgEBEgASABoPCgJhMRIJa2V5QWN0aXZlGhUKAmEyEg9rZXlBZG1pblB1YktleTEaFQoCYTMSD2tleUFkbWluUHViS2V5MhoVCgJhNBIPa2V5QWRtaW5QdWJLZXkzGicKAmE1EiFrZXlMYXVuY2hwYWREYXRhVHJhbnNhY3Rpb25TdGF0dXMaGAoCYTYSEmtleUxhdW5jaHBhZE5leHRJZBoaCgJhNxIUa2V5TGF1bmNocGFkQWN0aXZlSWQaEwoCYTgSDWtleUluaXRDYWxsZXIaEAoCYTkSCmtleUFkZHJlc3MaEwoCYjESDWtleUluaXRIZWlnaHQaFAoCYjISDmtleVN0YXJ0SGVpZ2h0GhcKAmIzEhFrZXlGaW5hbGlzZUhlaWdodBoSCgJiNBIMa2V5Q29taXNzaW9uGhAKAmI1EgprZXlBc3NldElkGhkKAmI2EhNrZXlUb3RhbFRva2VuQW1vdW50GiAKAmI3EhprZXlUb3RhbEFtb3VudEJ1eUFzc2V0U29sZBoYCgJiOBISa2V5VG9rZW5zUGVyVGlja2V0GhYKAmI5EhBrZXlQcmljZVBlclRva2VuGhYKAmMxEhBrZXlTd29wUGVyVGlja2V0GhwKAmMyEhZrZXlTd29wZmlUaWNrZXRzQW1vdW50Gh0KAmMzEhdrZXlDYW1wYWlnblRva2Vuc0Ftb3VudBocCgJjNBIWa2V5VG9rZW5zUGVyQWxsb2NhdGlvbhoZCgJjNRITa2V5VGlja2V0TGFzdE51bWJlchoZCgJjNhITa2V5R292ZXJuYW5jZVN0YWtlZBoSCgJjNxIMa2V5VXNlclJlZklkGhMKAmM4Eg1rZXlWZXJpZnlIYXNoGhEKAmM5EgtrZXlEdXJhdGlvbhoiCgJkMRIca2V5QW1vdW50QnV5QXNzZXRJbk1hcmtldGluZxorCgJkMhIla2V5QW1vdW50QnV5QXNzZXRJbk1hcmtldGluZ0ZpbmFsaXplZBoZCgJkMxITa2V5VHJhbnNmZXJCdXlBc3NldBoaCgJkNBIUa2V5RnJlZXpTd29wRHVyYXRpb24aHgoCZDUSGGtleUZyZWV6ZUFkZGl0aW9uYWxUb2tlbhoWCgJkNhIQa2V5RnJlZXplVG9rZW5JZBocCgJkNxIWa2V5RnJlZXplVG9rZW5EdXJhdGlvbhodCgJkOBIXa2V5RnJlZXplVG9rZW5QZXJUaWNrZXQaEQoCZDkSC2tleUJ1eVRva2VuGhQKAmUxEg5rZXlDbGFpbVBhcmFtcxohCgJlMhIba2V5SGlnaENvbXBldGl0aW9uQ29taXNzaW9uGhwKAmUzEhZrZXlIaWdoQ29tcGV0aXRpb25TYWxlGhsKAmU0EhVrZXlIQ1RpY2tldExhc3ROdW1iZXIaHgoCZTUSGGtleUhpZ2hDb21wZXRpdGlvbkFtb3VudBoiCgJlNhIca2V5VG90YWxBbW91bnRCdXlBc3NldFNvbGRIQxogCgJlNxIaa2V5VXNlckJvdWdodFRpY2tldHNBbW91bnQaFAoCZTgSDmtleVVzZXJUaWNrZXRzGhYKAmU5EhBrZXlVc2VySENUaWNrZXRzGiIKAmYxEhxrZXlVc2VySENCb3VnaHRUaWNrZXRzQW1vdW50GiEKAmYyEhtrZXlVc2VyQXZhaWxhYmxlQWxsb2NhdGlvbnMaJgoCZjMSIGtleVVzZXJBbW91bnRCdXlBc3NldEluTWFya2V0aW5nGh4KAmY0EhhrZXlVc2VyQm91Z2h0QWxsb2NhdGlvbnMaGAoCZjUSEmtleVVzZXJDbGFpbVN0YXR1cxogCgJmNhIaa2V5VXNlcldpbm5lZFRpY2tldHNBbW91bnQaGAoCZjcSEmtleVVzZXJGcmVlemVUb2tlbhoMCgJmOBIGb3JhY2xlGhAKAmY5Egpnb3Zlcm5hbmNlGhYKAmcxEhBjb21taXNzaW9uV2FsbGV0GhgKAmcyEhJzdGFraW5nVVNETkFkZHJlc3MaCgoCZzMSBFVTRE4aGAoCZzQSEmFkbWluUHViS2V5U3Rha2luZxoaCgJnNRIUbWF4QWxsb2NhdGlvbnNBbW91bnQaDgoCZzYSCGlzQWN0aXZlGhcKAmc3EhFhY3RpdmVMYXVuY2hwYWRJZBoRCgJnOBILZ2V0QWRtaW5QdWIaEQoCZzkSC2tleUFkbWluUHViGg0KAmgxEgckbWF0Y2gwGgwKAmgyEgZzdHJpbmcaDQoCaDMSB25vdGhpbmcaEgoCaDQSDGFkbWluUHViS2V5MRoSCgJoNRIMYWRtaW5QdWJLZXkyGhIKAmg2EgxhZG1pblB1YktleTMaEgoCaDcSDGdldEFzc2V0SW5mbxoNCgJoOBIHYXNzZXRJZBoOCgJoORIIc3RyaW5nSWQaCgoCaTESBGluZm8aCwoCaTISBXdhdmVzGhgKAmkzEhJnZXRMYXVuY2hwYWROZXh0SWQaFgoCaTQSEHN0YWtlZFVzZG5BbW91bnQaHAoCaTUSFmdldEFzc2V0SW5mb0Zyb21TdHJpbmcaDgoCaTYSCGFzc2V0U3RyGhEKAmk3EgtsYXVuY2hwYWRJZBoKCgJpOBIEaGFzaBoNCgJpORIHYWRkcmVzcxoUCgJqMRIOcHJvamVjdEFkZHJlc3MaEQoCajISC3N0YXJ0SGVpZ2h0Gg4KAmozEghkdXJhdGlvbhoOCgJqNBIIYnV5VG9rZW4aEAoCajUSCmNvbW1pc3Npb24aFQoCajYSD3Rva2Vuc1BlclRpY2tldBoTCgJqNxINcHJpY2VQZXJUb2tlbhoZCgJqOBITc3dvcGZpVGlja2V0c0Ftb3VudBoaCgJqORIUY2FtcGFpZ25Ub2tlbnNBbW91bnQaGQoCazESE3Rva2Vuc1BlckFsbG9jYXRpb24aEwoCazISDXN3b3BQZXJUaWNrZXQaGAoCazMSEnN3b3BGcmVlemVEdXJhdGlvbhoRCgJrNBILY2xhaW1QYXJhbXMaGQoCazUSE0hpZ2hDb21wZXRpdGlvblNhbGUaHgoCazYSGGhpZ2hDb21wZXRpdGlvbkNvbWlzc2lvbhoiCgJrNxIcaGlnaENvbXBldGl0aW9uVGlja2V0c0Ftb3VudBobCgJrOBIVZnJlZXplQWRkaXRpb25hbFRva2VuGhIKAms5EgxmcmVlemVQYXJhbXMaEgoCbDESDGFkbWluSW5pdGtleRoUCgJsMhIObGF1bmNocGFkSWRTdHIaEQoCbDMSCyR0MDYzOTA2NDY1Gg8KAmw0EglwbXRBbW91bnQaEAoCbDUSCnBtdEFzc2V0SWQaEQoCbDYSCyR0MDY0NzQ2NTQ3GhMKAmw3Eg1wbXRTdHJBc3NldElkGhIKAmw4EgxwbXRBc3NldE5hbWUaEQoCbDkSC3BtdERlY2ltYWxzGhsKAm0xEhVmcmVlemVBZGRpdGlvbmFsRW50cnkaCwoCbTISBXJlZklkGhEKAm0zEgskdDA5MDYwOTEzNRoRCgJtNBILJHQwOTE0MDkyOTAaEAoCbTUSCmJ1eUFzc2V0SWQaEwoCbTYSDWJ1eUFzc2V0U3RySWQaEgoCbTcSDGJ1eUFzc2V0TmFtZRoWCgJtOBIQYnV5QXNzZXREZWNpbWFscxoRCgJtORILc3Rha2VkU3dvcHMaHQoCbjESF2FsbG93ZWRUaWNrZXRzQW1vdW50QWxsGhkKAm4yEhNib3VnaHRUaWNrZXRzQW1vdW50GhoKAm4zEhRhbGxvd2VkVGlja2V0c0Ftb3VudBoTCgJuNBINZnJlZXplVG9rZW5JZBoQCgJuNRIKdG9rZW5QcmljZRoTCgJuNhINJHQwMTExNzgxMTMyMhoNCgJuNxIHdG9rZW5JZBoVCgJuOBIPdG9rZW5TdHJBc3NldElkGhQKAm45Eg50b2tlbkFzc2V0TmFtZRoTCgJvMRINdG9rZW5EZWNpbWFscxoRCgJvMhILdGlja2V0UHJpY2UaGQoCbzMSE2NvbW1pc3Npb25QZXJUaWNrZXQaFQoCbzQSD2J1eVRpY2tldEFtb3VudBocCgJvNRIWYWxsb3dlZEJ1eVRpY2tldEFtb3VudBoiCgJvNhIcYWxsb3dlZEJ1eVByaWNlV2l0aENvbWlzc2lvbhoMCgJvNxIGY2hhbmdlGhoKAm84EhRmcmVlemVUb2tlblBlclRpY2tldBoTCgJvORINJHQwMTI0ODYxMjU3MxoVCgJwMRIPcG10QW1vdW50RnJlZXplGhYKAnAyEhBwbXRBc3NldElkRnJlZXplGhMKAnAzEg0kdDAxMjU5MDEyNjgxGhkKAnA0EhNwbXRGcmVlemVTdHJBc3NldElkGhgKAnA1EhJwbXRGcmVlemVBc3NldE5hbWUaFwoCcDYSEXBtdEZyZWV6ZURlY2ltYWxzGhYKAnA3EhBuZWVkRnJlZXplVG9rZW5zGh4KAnA4Ehh1c2VyQm91Z2h0VGlja2V0c051bWJlcnMaHAoCcDkSFmxhc3RCb3VnaHRUaWNrZXROdW1iZXIaEQoCcTESC2JvdWdodFJhbmdlGiEKAnEyEhtuZXdVc2VyQm91Z2h0VGlja2V0c051bWJlcnMaCQoCcTMSA2ludhoPCgJxNBIJYmFzZUVudHJ5GhMKAnE1Eg0kdDAxNDcyODE0ODAzGhMKAnE2Eg0kdDAxNDgwODE0OTU4GhkKAnE3EhN1c2VyVXNkbkluTWFya2V0aW5nGhUKAnE4Eg91c2RuSW5NYXJrZXRpbmcaFwoCcTkSEWJvdWdodEFsbG9jYXRpb25zGhMKAnIxEg0kdDAxNTYyNzE1NzcxGiIKAnIyEhxhbGxvY2F0aW9uUHJpY2VXaXRoQ29taXNzaW9uGhoKAnIzEhRidXlBbGxvY2F0aW9uc0Ftb3VudBoTCgJyNBINJHQwMTgwODAxODE1NRoTCgJyNRINJHQwMTgxNjAxODMxMBobCgJyNhIVYm91Z2h0SENUaWNrZXRzQW1vdW50GhkKAnI3EhNoaWdoQ29tcGV0aXRpb25TYWxlGhMKAnI4Eg0kdDAxOTU1OTE5NzAzGhsKAnI5EhVidXlQcmljZVdpdGhDb21pc3Npb24aDwoCczESCXZyZkhlaWdodBoQCgJzMhIKc2VjcmV0V29yZBoPCgJzMxIJc2F2ZWRIYXNoGg4KAnM0EghjYWxjSGFzaBoTCgJzNRINJHQwMjI0ODgyMjYzOBoSCgJzNhIMY29tbWlzc2lvbkhDGhgKAnM3EhJ0cmFuc2ZlcmVkQnV5QXNzZXQaIQoCczgSG3N3b3BmaU1lbWJlcnNCdXlBc3NldEFtb3VudBocCgJzORIWc3dvcGZpSENCdXlBc3NldEFtb3VudBocCgJ0MRIWc3dvcGZpTWVtYmVyc0NvbWlzc2lvbhoXCgJ0MhIRc3dvcGZpSENDb21pc3Npb24aJAoCdDMSHnRvdGFsQW1vdW50QnV5QXNzZXRJbk1hcmtldGluZxoYCgJ0NBISbWFya2V0aW5nQ29taXNzaW9uGhMKAnQ1Eg11bnN0YWtlQW1vdW50GhUKAnQ2Eg91c2VyQ2xhaW1TdGF0dXMaEwoCdDcSDWJvdWdodFRpY2tldHMaEwoCdDgSDSR0MDI1NDk3MjU2NDcaEwoCdDkSDXdvbm5lZFRpY2tldHMaGgoCdTESFGF3YWlsYWJsZUFsbG9jYXRpb25zGhgKAnUyEhJhbGxvd2VkQWxsb2NhdGlvbnMaEwoCdTMSDSR0MDI2Mjk0MjY0MzgaGgoCdTQSFHRyYW5zZmVyVG9rZW5zQW1vdW50GiEKAnU1Ehtub3RBbGxvd2VkQWxsb2NhdGlvbnNUb2tlbnMaHAoCdTYSFmJ1eUFzc2V0Rm9yQWxsb2NhdGlvbnMaIAoCdTcSGmJ1eUFzc2V0Rm9yVW53b25uZWRUaWNrZXRzGhwKAnU4EhZyZXR1cm5lZEJ1eUFzc2V0QW1vdW50GhIKAnU5Egx0cmFuc2ZlclVzZG4aFAoCdjESDnRyYW5zZmVyVG9rZW5zGhcKAnYyEhF1c2VyVG9rZW5zRnJlZXplZBoZCgJ2MxITZnJlZXplVG9rZW5EdXJhdGlvbhoUCgJ2NBIOYmxvY2tFbmRIZWlnaHQaDAoCdjUSBmFtb3VudBoTCgJ2NhINJHQwMzAxMTAzMDI2MBoMCgJ2NxIGdmVyaWZ5GhkKAnY4EhNtdWx0aVNpZ25lZEJ5QWRtaW5zGhgKAnY5EhJhZG1pblB1YktleTFTaWduZWQaGAoCdzESEmFkbWluUHViS2V5MlNpZ25lZBoYCgJ3MhISYWRtaW5QdWJLZXkzU2lnbmVkGhMKAnczEg1zaWduZWRCeUFkbWluGgkKAnc0EgNkdHgAAABFAAAAAAJhMQIAAAAGYWN0aXZlAAAAAAJhMgIAAAALYWRtaW5fcHViXzEAAAAAAmEzAgAAAAthZG1pbl9wdWJfMgAAAAACYTQCAAAAC2FkbWluX3B1Yl8zAAAAAAJhNQIAAAAhbGF1bmNocGFkX2RhdGFfdHJhbnNhY3Rpb25fc3RhdHVzAAAAAAJhNgIAAAARbGF1bmNocGFkX25leHRfaWQAAAAAAmE3AgAAABNsYXVuY2hwYWRfYWN0aXZlX2lkAAAAAAJhOAIAAAALaW5pdF9jYWxsZXIAAAAAAmE5AgAAAAhfYWRkcmVzcwAAAAACYjECAAAADF9pbml0X2hlaWdodAAAAAACYjICAAAADV9zdGFydF9oZWlnaHQAAAAAAmIzAgAAABBfZmluYWxpc2VfaGVpZ2h0AAAAAAJiNAIAAAAKX2NvbWlzc2lvbgAAAAACYjUCAAAACV9hc3NldF9pZAAAAAACYjYCAAAAE190b3RhbF90b2tlbl9hbW91bnQAAAAAAmI3AgAAABVfdG90YWxfYnV5X2Fzc2V0X3NvbGQAAAAAAmI4AgAAABJfdG9rZW5zX3Blcl90aWNrZXQAAAAAAmI5AgAAABBfcHJpY2VfcGVyX3Rva2VuAAAAAAJjMQIAAAAQX3N3b3BfcGVyX3RpY2tldAAAAAACYzICAAAAF190aWNrZXRzX3N3b3BmaV9tZW1iZXJzAAAAAAJjMwIAAAATX3Rva2Vuc19hY2Nlc3NfbGlzdAAAAAACYzQCAAAAFl90b2tlbnNfcGVyX2FsbG9jYXRpb24AAAAAAmM1AgAAACRfdGlja2V0X2xhc3RfbnVtYmVyX2hpZ2hfY29tcGV0aXRpb24AAAAAAmM2AgAAAAxfU1dPUF9hbW91bnQAAAAAAmM3AgAAAAdfcmVmX2lkAAAAAAJjOAIAAAAMX3ZlcmlmeV9oYXNoAAAAAAJjOQIAAAAJX2R1cmF0aW9uAAAAAAJkMQIAAAAnX3RvdGFsX3B1cmNoYXNlZF9idXlfYXNzZXRfaW5fbWFya2V0aW5nAAAAAAJkMgIAAAAxX3RvdGFsX3B1cmNoYXNlZF9idXlfYXNzZXRfaW5fbWFya2V0aW5nX2ZpbmFsaXplZAAAAAACZDMCAAAAE190cmFuc2Zlcl9idXlfYXNzZXQAAAAAAmQ0AgAAABVfZnJlZXplX3N3b3BfZHVyYXRpb24AAAAAAmQ1AgAAABhfZnJlZXplX2FkZGl0aW9uYWxfdG9rZW4AAAAAAmQ2AgAAABBfZnJlZXplX3Rva2VuX2lkAAAAAAJkNwIAAAAWX2ZyZWV6ZV90b2tlbl9kdXJhdGlvbgAAAAACZDgCAAAAGF9mcmVlemVfdG9rZW5fcGVyX3RpY2tldAAAAAACZDkCAAAACl9idXlfdG9rZW4AAAAAAmUxAgAAAA1fY2xhaW1fcGFyYW1zAAAAAAJlMgIAAAAbX2hpZ2hfY29tcGV0aXRpb25fY29taXNzaW9uAAAAAAJlMwIAAAAWX2hpZ2hfY29tcGV0aXRpb25fc2FsZQAAAAACZTQCAAAAE190aWNrZXRfbGFzdF9udW1iZXIAAAAAAmU1AgAAABlfdGlja2V0c19oaWdoX2NvbXBldGl0aW9uAAAAAAJlNgIAAAAmX3RvdGFsX2J1eV9hc3NldF9zb2xkX2hpZ2hfY29tcGV0aXRpb24AAAAAAmU3AgAAAA9fYm91Z2h0X3RpY2tldHMAAAAAAmU4AgAAAA9fdGlja2V0c19udW1iZXIAAAAAAmU5AgAAACBfdGlja2V0c19udW1iZXJfaGlnaF9jb21wZXRpdGlvbgAAAAAC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", "height": 1832615, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 3t4G5GERYgzUXMfnuYcEKXmpfy9UkCF4JeCctU6btD7c Next: 472AGAchqVUaSHUBUBHuXF6feBdwjbsh6bGao5kS8Egc 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) = 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- }
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+ }
214217
215218
216219
217220 @Callable(i)
218221 func commitSwopfiSale (launchpadId,refId) = {
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
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
227230 let stakedSwops = valueOrElse(getInteger(governance, (toString(i.caller) + keyGovernanceStaked)), 0)
228231 let allowedTicketsAmountAll = (stakedSwops / getIntegerValue(this, (toString(launchpadId) + keySwopPerTicket)))
229232 let boughtTicketsAmount = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtTicketsAmount)), 0)
261264 else {
262265 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
263266 let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
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
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
269272 let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
270273 let commissionPerTicket = fraction(ticketPrice, getIntegerValue(this, (toString(launchpadId) + keyComission)), 100)
271274 let buyTicketAmount = (pmtAmount / (ticketPrice + commissionPerTicket))
281284 then {
282285 let freezeTokenId = getStringValue(this, (toString(launchpadId) + keyFreezeTokenId))
283286 let freezeTokenPerTicket = getIntegerValue(this, (toString(launchpadId) + keyFreezeTokenPerTicket))
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
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
291294 let needFreezeTokens = (freezeTokenPerTicket * buyTicketAmount)
292295 if (if ((pmtFreezeStrAssetId != freezeTokenId))
293296 then true
321324
322325 @Callable(i)
323326 func commitAccessListSale (launchpadId,refId) = {
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
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
332335 let userUsdnInMarketing = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserAmountBuyAssetInMarketing)), 0)
333336 let usdnInMarketing = valueOrElse(getInteger(this, (toString(launchpadId) + keyAmountBuyAssetInMarketing)), 0)
334337 let boughtAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtAllocations)), 0)
335338 let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
336339 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
337340 let tokensPerAllocation = getIntegerValue(this, (toString(launchpadId) + keyTokensPerAllocation))
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
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
343346 let allocationPriceWithComission = fraction(fraction(tokenPrice, tokensPerAllocation, pow(10, 0, tokenDecimals, 0, 0, DOWN)), (100 + commission), 100)
344347 let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
345348 let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
381384
382385 @Callable(i)
383386 func commitHighCompetitionSale (launchpadId,refId) = {
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
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
392395 let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
393396 let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
394397 let boughtHCTicketsAmount = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserHCBoughtTicketsAmount)), 0)
410413 else {
411414 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
412415 let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
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
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
418421 let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
419422 let commissionPerTicket = fraction(ticketPrice, getIntegerValue(this, (toString(launchpadId) + keyHighCompetitionComission)), 100)
420423 let buyTicketAmount = (pmtAmount / (ticketPrice + commissionPerTicket))
459462 else if ((calcHash != savedHash))
460463 then throw("vrf Height hash not matching")
461464 else {
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
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
467470 let projectAddress = addressFromStringValue(getStringValue(this, (toString(launchpadId) + keyAddress)))
468471 let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
469472 let commissionHC = getIntegerValue(this, (toString(launchpadId) + keyHighCompetitionComission))
506509 else false)
507510 then throw("You can't claim because you don't buy anything")
508511 else {
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
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
514517 let wonnedTickets = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserWinnedTicketsAmount)), 0)
515518 let awailableAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserAvailableAllocations)), 0)
516519 let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
517520 let allowedAllocations = min([boughtAllocations, awailableAllocations])
518521 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
519522 let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
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
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
525528 let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
526529 let tokensPerAllocation = getIntegerValue(this, (toString(launchpadId) + keyTokensPerAllocation))
527530 let transferTokensAmount = ((wonnedTickets * tokensPerTicket) + (allowedAllocations * tokensPerAllocation))
587590 then throw("Only admin can call this function")
588591 else {
589592 let projectAddress = addressFromStringValue(getStringValue(this, (toString(launchpadId) + keyAddress)))
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
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
595598 [IntegerEntry((toString(launchpadId) + keyTransferBuyAsset), amount), ScriptTransfer(projectAddress, amount, buyAssetId)]
596599 }
597600
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) = 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- }
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+ }
214217
215218
216219
217220 @Callable(i)
218221 func commitSwopfiSale (launchpadId,refId) = {
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
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
227230 let stakedSwops = valueOrElse(getInteger(governance, (toString(i.caller) + keyGovernanceStaked)), 0)
228231 let allowedTicketsAmountAll = (stakedSwops / getIntegerValue(this, (toString(launchpadId) + keySwopPerTicket)))
229232 let boughtTicketsAmount = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtTicketsAmount)), 0)
230233 let allowedTicketsAmount = (allowedTicketsAmountAll - boughtTicketsAmount)
231234 let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
232235 let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
233236 let freezeAdditionalToken = valueOrElse(getBoolean(this, (toString(launchpadId) + keyFreezeAdditionalToken)), false)
234237 if (!(isActive))
235238 then throw("DApp is inactive at this moment")
236239 else if ((activeLaunchpadId != launchpadId))
237240 then throw("There is no active launchpad or this launchpad is ended")
238241 else if ((startHeight > height))
239242 then throw("Launchpad sale not started yet")
240243 else if ((height > (startHeight + duration)))
241244 then throw("Launchpad sale ended")
242245 else if (if (!(freezeAdditionalToken))
243246 then if ((size(i.payments) != 1))
244247 then true
245248 else (pmtAssetId != buyAssetId)
246249 else false)
247250 then throw((("One attached payment in " + buyAssetName) + " expected"))
248251 else if (if (freezeAdditionalToken)
249252 then if ((size(i.payments) != 2))
250253 then true
251254 else (pmtAssetId != buyAssetId)
252255 else false)
253256 then {
254257 let freezeTokenId = getStringValue(this, (toString(launchpadId) + keyFreezeTokenId))
255258 throw(((("Two attached payments expected: First in " + buyAssetName) + ", second in ") + freezeTokenId))
256259 }
257260 else if (if ((0 >= allowedTicketsAmountAll))
258261 then true
259262 else (0 >= allowedTicketsAmount))
260263 then throw("Not enought SWOP in staking to buy tickets")
261264 else {
262265 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
263266 let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
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
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
269272 let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
270273 let commissionPerTicket = fraction(ticketPrice, getIntegerValue(this, (toString(launchpadId) + keyComission)), 100)
271274 let buyTicketAmount = (pmtAmount / (ticketPrice + commissionPerTicket))
272275 let allowedBuyTicketAmount = min([buyTicketAmount, allowedTicketsAmount])
273276 let allowedBuyPriceWithComission = (allowedBuyTicketAmount * (ticketPrice + commissionPerTicket))
274277 let change = (pmtAmount - allowedBuyPriceWithComission)
275278 if ((buyTicketAmount == 0))
276279 then throw((("Not enought " + buyAssetName) + " to buy tickets"))
277280 else if ((change != 0))
278281 then throw((((("Wrong payment. To buy " + toString(allowedBuyTicketAmount)) + "tickets you need to pay ") + toString(allowedBuyPriceWithComission)) + buyAssetName))
279282 else {
280283 let freezeAdditionalEntry = if (freezeAdditionalToken)
281284 then {
282285 let freezeTokenId = getStringValue(this, (toString(launchpadId) + keyFreezeTokenId))
283286 let freezeTokenPerTicket = getIntegerValue(this, (toString(launchpadId) + keyFreezeTokenPerTicket))
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
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
291294 let needFreezeTokens = (freezeTokenPerTicket * buyTicketAmount)
292295 if (if ((pmtFreezeStrAssetId != freezeTokenId))
293296 then true
294297 else (needFreezeTokens != pmtAmountFreeze))
295298 then throw((((("You need to add " + toString(needFreezeTokens)) + " ") + pmtFreezeAssetName) + " as a second payment"))
296299 else [IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserFreezeToken), pmtAmountFreeze)]
297300 }
298301 else nil
299302 let userBoughtTicketsNumbers = valueOrElse(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserTickets)), "")
300303 let lastBoughtTicketNumber = getIntegerValue(this, (toString(launchpadId) + keyTicketLastNumber))
301304 let boughtRange = ((toString((lastBoughtTicketNumber + 1)) + "-") + toString((lastBoughtTicketNumber + allowedBuyTicketAmount)))
302305 let newUserBoughtTicketsNumbers = (userBoughtTicketsNumbers + (if ((userBoughtTicketsNumbers != ""))
303306 then ("," + boughtRange)
304307 else ("" + boughtRange)))
305308 let inv = if ((buyAssetId == USDN))
306309 then invoke(stakingUSDNAddress, "lockNeutrino", nil, [AttachedPayment(pmtAssetId, pmtAmount)])
307310 else 0
308311 if ((inv == inv))
309312 then {
310313 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)
311314 if (!(isDefined(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId)))))
312315 then (baseEntry ++ [StringEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId), refId)])
313316 else baseEntry
314317 }
315318 else throw("Strict value is not equal to itself.")
316319 }
317320 }
318321 }
319322
320323
321324
322325 @Callable(i)
323326 func commitAccessListSale (launchpadId,refId) = {
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
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
332335 let userUsdnInMarketing = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserAmountBuyAssetInMarketing)), 0)
333336 let usdnInMarketing = valueOrElse(getInteger(this, (toString(launchpadId) + keyAmountBuyAssetInMarketing)), 0)
334337 let boughtAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtAllocations)), 0)
335338 let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
336339 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
337340 let tokensPerAllocation = getIntegerValue(this, (toString(launchpadId) + keyTokensPerAllocation))
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
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
343346 let allocationPriceWithComission = fraction(fraction(tokenPrice, tokensPerAllocation, pow(10, 0, tokenDecimals, 0, 0, DOWN)), (100 + commission), 100)
344347 let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
345348 let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
346349 if (!(isActive))
347350 then throw("DApp is inactive at this moment")
348351 else if ((activeLaunchpadId != launchpadId))
349352 then throw("There is no active launchpad or this launchpad is ended")
350353 else if ((startHeight > height))
351354 then throw("Launchpad sale not started yet")
352355 else if ((height > (startHeight + duration)))
353356 then throw("Launchpad sale ended")
354357 else if (if ((size(i.payments) != 1))
355358 then true
356359 else (pmtAssetId != buyAssetId))
357360 then throw((("One attached payment in " + buyAssetName) + " expected"))
358361 else if ((boughtAllocations >= maxAllocationsAmount))
359362 then throw((("You can buy only " + toString(maxAllocationsAmount)) + "allocations"))
360363 else if (if ((allocationPriceWithComission != pmtAmount))
361364 then ((allocationPriceWithComission * 2) != pmtAmount)
362365 else false)
363366 then throw(((("Wrong payment. You can buy 1 or 2 allocations for " + toString(allocationPriceWithComission)) + buyAssetName) + " per allocation"))
364367 else {
365368 let buyAllocationsAmount = (pmtAmount / allocationPriceWithComission)
366369 let inv = if ((buyAssetId == USDN))
367370 then invoke(stakingUSDNAddress, "lockNeutrino", nil, [AttachedPayment(pmtAssetId, pmtAmount)])
368371 else 0
369372 if ((inv == inv))
370373 then {
371374 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))]
372375 if (!(isDefined(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId)))))
373376 then (baseEntry ++ [StringEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId), refId)])
374377 else baseEntry
375378 }
376379 else throw("Strict value is not equal to itself.")
377380 }
378381 }
379382
380383
381384
382385 @Callable(i)
383386 func commitHighCompetitionSale (launchpadId,refId) = {
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
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
392395 let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
393396 let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
394397 let boughtHCTicketsAmount = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserHCBoughtTicketsAmount)), 0)
395398 let highCompetitionSale = valueOrElse(getBoolean(this, (toString(launchpadId) + keyHighCompetitionSale)), false)
396399 if (!(isActive))
397400 then throw("DApp is inactive at this moment")
398401 else if ((activeLaunchpadId != launchpadId))
399402 then throw("There is no active launchpad or this launchpad is ended")
400403 else if (!(highCompetitionSale))
401404 then throw("There is no high competition sale for this launchpad")
402405 else if ((startHeight > height))
403406 then throw("Launchpad sale not started yet")
404407 else if ((height > (startHeight + duration)))
405408 then throw("Launchpad sale ended")
406409 else if (if ((size(i.payments) != 1))
407410 then true
408411 else (pmtAssetId != buyAssetId))
409412 then throw((("One attached payment in " + buyAssetName) + " expected"))
410413 else {
411414 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
412415 let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
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
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
418421 let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
419422 let commissionPerTicket = fraction(ticketPrice, getIntegerValue(this, (toString(launchpadId) + keyHighCompetitionComission)), 100)
420423 let buyTicketAmount = (pmtAmount / (ticketPrice + commissionPerTicket))
421424 let buyPriceWithComission = (buyTicketAmount * (ticketPrice + commissionPerTicket))
422425 let change = (pmtAmount - buyPriceWithComission)
423426 if ((buyTicketAmount == 0))
424427 then throw((("Not enought " + buyAssetName) + " to buy tickets"))
425428 else if ((change != 0))
426429 then throw((((("Wrong payment. To buy " + toString(buyTicketAmount)) + "tickets you need to pay ") + toString(buyPriceWithComission)) + buyAssetName))
427430 else {
428431 let userBoughtTicketsNumbers = valueOrElse(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserHCTickets)), "")
429432 let lastBoughtTicketNumber = getIntegerValue(this, (toString(launchpadId) + keyHCTicketLastNumber))
430433 let boughtRange = ((toString((lastBoughtTicketNumber + 1)) + "-") + toString((lastBoughtTicketNumber + buyTicketAmount)))
431434 let newUserBoughtTicketsNumbers = (userBoughtTicketsNumbers + (if ((userBoughtTicketsNumbers != ""))
432435 then ("," + boughtRange)
433436 else ("" + boughtRange)))
434437 let inv = if ((buyAssetId == USDN))
435438 then invoke(stakingUSDNAddress, "lockNeutrino", nil, [AttachedPayment(pmtAssetId, pmtAmount)])
436439 else 0
437440 if ((inv == inv))
438441 then {
439442 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)]
440443 if (!(isDefined(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId)))))
441444 then (baseEntry ++ [StringEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId), refId)])
442445 else baseEntry
443446 }
444447 else throw("Strict value is not equal to itself.")
445448 }
446449 }
447450 }
448451
449452
450453
451454 @Callable(i)
452455 func finalise (launchpadId,vrfHeight,secretWord) = {
453456 let savedHash = getStringValue(this, (toString(launchpadId) + keyVerifyHash))
454457 let calcHash = toBase58String(sha256((toBytes(vrfHeight) + toBytes(secretWord))))
455458 if (!(isActive))
456459 then throw("DApp is inactive at this moment")
457460 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
458461 then throw("Only admin can call this function")
459462 else if ((calcHash != savedHash))
460463 then throw("vrf Height hash not matching")
461464 else {
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
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
467470 let projectAddress = addressFromStringValue(getStringValue(this, (toString(launchpadId) + keyAddress)))
468471 let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
469472 let commissionHC = getIntegerValue(this, (toString(launchpadId) + keyHighCompetitionComission))
470473 let transferedBuyAsset = valueOrElse(getInteger(this, (toString(launchpadId) + keyTransferBuyAsset)), 0)
471474 let swopfiMembersBuyAssetAmount = getIntegerValue(this, (toString(launchpadId) + keyTotalAmountBuyAssetSold))
472475 let swopfiHCBuyAssetAmount = valueOrElse(getIntegerValue(this, (toString(launchpadId) + keyTotalAmountBuyAssetSoldHC)), 0)
473476 let swopfiMembersComission = fraction(swopfiMembersBuyAssetAmount, commission, 100)
474477 let swopfiHCComission = fraction(swopfiHCBuyAssetAmount, commissionHC, 100)
475478 let totalAmountBuyAssetInMarketing = getIntegerValue(this, (toString(launchpadId) + keyAmountBuyAssetInMarketingFinalized))
476479 let marketingComission = fraction(totalAmountBuyAssetInMarketing, commission, 100)
477480 let unstakeAmount = (((((swopfiMembersBuyAssetAmount + totalAmountBuyAssetInMarketing) + swopfiMembersComission) + marketingComission) + swopfiHCBuyAssetAmount) + swopfiHCComission)
478481 if ((transferedBuyAsset > (swopfiMembersBuyAssetAmount + totalAmountBuyAssetInMarketing)))
479482 then throw("Can't transfer negative value to project")
480483 else {
481484 let inv = if ((buyAssetId == USDN))
482485 then invoke(stakingUSDNAddress, "unlockNeutrino", [unstakeAmount, toBase58String(USDN)], nil)
483486 else 0
484487 if ((inv == inv))
485488 then [IntegerEntry((toString(launchpadId) + keyFinaliseHeight), height), ScriptTransfer(projectAddress, ((swopfiMembersBuyAssetAmount + totalAmountBuyAssetInMarketing) - transferedBuyAsset), buyAssetId), ScriptTransfer(commissionWallet, ((swopfiMembersComission + marketingComission) + swopfiHCComission), buyAssetId)]
486489 else throw("Strict value is not equal to itself.")
487490 }
488491 }
489492 }
490493
491494
492495
493496 @Callable(i)
494497 func claim (launchpadId) = {
495498 let userClaimStatus = valueOrElse(getBoolean(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimStatus)), false)
496499 let boughtTickets = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtTicketsAmount)), 0)
497500 let boughtAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtAllocations)), 0)
498501 if (!(isActive))
499502 then throw("DApp is inactive at this moment")
500503 else if (!(isDefined(getInteger(this, (toString(launchpadId) + keyFinaliseHeight)))))
501504 then throw("You can't claim because results are not finalized")
502505 else if (userClaimStatus)
503506 then throw("You are already claimed")
504507 else if (if ((boughtTickets == 0))
505508 then (boughtAllocations == 0)
506509 else false)
507510 then throw("You can't claim because you don't buy anything")
508511 else {
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
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
514517 let wonnedTickets = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserWinnedTicketsAmount)), 0)
515518 let awailableAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserAvailableAllocations)), 0)
516519 let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
517520 let allowedAllocations = min([boughtAllocations, awailableAllocations])
518521 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
519522 let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
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
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
525528 let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
526529 let tokensPerAllocation = getIntegerValue(this, (toString(launchpadId) + keyTokensPerAllocation))
527530 let transferTokensAmount = ((wonnedTickets * tokensPerTicket) + (allowedAllocations * tokensPerAllocation))
528531 let notAllowedAllocationsTokens = ((boughtAllocations - allowedAllocations) * tokensPerAllocation)
529532 let buyAssetForAllocations = fraction(fraction(notAllowedAllocationsTokens, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN)), (100 + commission), 100)
530533 let buyAssetForUnwonnedTickets = fraction(((boughtTickets - wonnedTickets) * ticketPrice), (100 + commission), 100)
531534 if (if ((0 > buyAssetForAllocations))
532535 then true
533536 else (0 > buyAssetForUnwonnedTickets))
534537 then throw("Error with allowed allocation param or wonned tickets param please contact support")
535538 else {
536539 let returnedBuyAssetAmount = (buyAssetForUnwonnedTickets + buyAssetForUnwonnedTickets)
537540 let transferUsdn = if ((returnedBuyAssetAmount > 0))
538541 then [ScriptTransfer(i.caller, returnedBuyAssetAmount, buyAssetId)]
539542 else nil
540543 let transferTokens = if ((transferTokensAmount > 0))
541544 then [ScriptTransfer(i.caller, transferTokensAmount, tokenId)]
542545 else nil
543546 let inv = if (if ((returnedBuyAssetAmount > 0))
544547 then (buyAssetId == USDN)
545548 else false)
546549 then invoke(stakingUSDNAddress, "unlockNeutrino", [returnedBuyAssetAmount, toBase58String(USDN)], nil)
547550 else 0
548551 if ((inv == inv))
549552 then (([BooleanEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimStatus), true)] ++ transferTokens) ++ transferUsdn)
550553 else throw("Strict value is not equal to itself.")
551554 }
552555 }
553556 }
554557
555558
556559
557560 @Callable(i)
558561 func claimFreezeToken (launchpadId) = {
559562 let freezeAdditionalToken = valueOrElse(getBoolean(this, (toString(launchpadId) + keyFreezeAdditionalToken)), false)
560563 if (!(isActive))
561564 then throw("DApp is inactive at this moment")
562565 else if (!(isDefined(getInteger(this, (toString(launchpadId) + keyFinaliseHeight)))))
563566 then throw("You can't claim because results are not finalized")
564567 else if (!(freezeAdditionalToken))
565568 then throw("There are no additional token freezing for this launchpad")
566569 else {
567570 let tokenId = fromBase58String(getStringValue(this, (toString(launchpadId) + keyFreezeTokenId)))
568571 let userTokensFreezed = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserFreezeToken)), 0)
569572 let startHeight = valueOrElse(getInteger(this, (toString(launchpadId) + keyStartHeight)), 0)
570573 let duration = valueOrElse(getInteger(this, (toString(launchpadId) + keyDuration)), 0)
571574 let freezeTokenDuration = getIntegerValue(this, (toString(launchpadId) + keyFreezeTokenDuration))
572575 let blockEndHeight = ((startHeight + duration) + freezeTokenDuration)
573576 if ((userTokensFreezed == 0))
574577 then throw("You are already claimed your tokens or not paid anything")
575578 else if ((blockEndHeight > height))
576579 then throw(("Your tokens freezed teel " + toString(blockEndHeight)))
577580 else [ScriptTransfer(i.caller, userTokensFreezed, tokenId), IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserFreezeToken), 0)]
578581 }
579582 }
580583
581584
582585
583586 @Callable(i)
584587 func transferBuyAsset (launchpadId,amount) = if (!(isActive))
585588 then throw("DApp is inactive")
586589 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
587590 then throw("Only admin can call this function")
588591 else {
589592 let projectAddress = addressFromStringValue(getStringValue(this, (toString(launchpadId) + keyAddress)))
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
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
595598 [IntegerEntry((toString(launchpadId) + keyTransferBuyAsset), amount), ScriptTransfer(projectAddress, amount, buyAssetId)]
596599 }
597600
598601
599602
600603 @Callable(i)
601604 func shutdown () = if (!(isActive))
602605 then throw("DApp already inactive")
603606 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
604607 then throw("Only admin can call this function")
605608 else [BooleanEntry(keyActive, false)]
606609
607610
608611
609612 @Callable(i)
610613 func activate () = if (isActive)
611614 then throw("DApp already active")
612615 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
613616 then throw("Only admin can call this function")
614617 else [BooleanEntry(keyActive, true)]
615618
616619
617620 @Verifier(tx)
618621 func verify () = {
619622 let multiSignedByAdmins = {
620623 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
621624 then 1
622625 else 0
623626 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
624627 then 1
625628 else 0
626629 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
627630 then 1
628631 else 0
629632 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
630633 }
631634 let signedByAdmin = if (if (if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
632635 then true
633636 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey2))
634637 then true
635638 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey3))
636639 then true
637640 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKeyStaking)
638641 match tx {
639642 case dtx: DataTransaction =>
640643 if (valueOrElse(getBoolean(oracle, keyLaunchpadDataTransactionStatus), false))
641644 then signedByAdmin
642645 else false
643646 case _ =>
644647 multiSignedByAdmins
645648 }
646649 }
647650

github/deemru/w8io/026f985 
115.83 ms