tx · DpBnKrkZzLRZvrHzj181W395GwdhwFtgLGMx9USQ7ETa

3MwkjgDrsm5k73WJU9Nbxbx4y2iy3zjQzMi:  -0.01400000 Waves

2021.12.10 16:32 [1828204] smart account 3MwkjgDrsm5k73WJU9Nbxbx4y2iy3zjQzMi > SELF 0.00000000 Waves

{ "type": 13, "id": "DpBnKrkZzLRZvrHzj181W395GwdhwFtgLGMx9USQ7ETa", "fee": 1400000, "feeAssetId": null, "timestamp": 1639143161665, "version": 2, "chainId": 84, "sender": "3MwkjgDrsm5k73WJU9Nbxbx4y2iy3zjQzMi", "senderPublicKey": "FRotxVW1MhTQRDvVbMM4yvYGWzBFvHqvMsonvGeEXQUy", "proofs": [ "2UY3Jugx25mPHpi4ruyz5Yx4SdHaJpzYexSR8Df9b5RTRZas1ysWPorZjJwwMVVvYUjMokCWrdhrowRgWbtoXSjD", "3RK2sgWK8vQjN4Z22UxTJum9qywpQCRwCsdD5jeRLFUwQxUYxM86Nqa4siD7vcBSpdwLhJgwoMzpVEzY5xgmuCa6" ], "script": "base64:AAIFAAAAAAAAEvwIAhIECgIBCBIDCgEIEhQKEggBAQgBAQEBAQEBARgEAQEEGBIECgIBCBIECgIBCBIECgIBCBIFCgMBAQgSAwoBARIDCgEBEgQKAgEBEgASABoPCgJhMRIJa2V5QWN0aXZlGhUKAmEyEg9rZXlBZG1pblB1YktleTEaFQoCYTMSD2tleUFkbWluUHViS2V5MhoVCgJhNBIPa2V5QWRtaW5QdWJLZXkzGicKAmE1EiFrZXlMYXVuY2hwYWREYXRhVHJhbnNhY3Rpb25TdGF0dXMaGAoCYTYSEmtleUxhdW5jaHBhZE5leHRJZBoaCgJhNxIUa2V5TGF1bmNocGFkQWN0aXZlSWQaEwoCYTgSDWtleUluaXRDYWxsZXIaEAoCYTkSCmtleUFkZHJlc3MaEwoCYjESDWtleUluaXRIZWlnaHQaFAoCYjISDmtleVN0YXJ0SGVpZ2h0GhcKAmIzEhFrZXlGaW5hbGlzZUhlaWdodBoSCgJiNBIMa2V5Q29taXNzaW9uGiEKAmI1EhtrZXlIaWdoQ29tcGV0aXRpb25Db21pc3Npb24aEAoCYjYSCmtleUFzc2V0SWQaGQoCYjcSE2tleVRvdGFsVG9rZW5BbW91bnQaIAoCYjgSGmtleVRvdGFsQW1vdW50QnV5QXNzZXRTb2xkGiIKAmI5EhxrZXlUb3RhbEFtb3VudEJ1eUFzc2V0U29sZEhDGhgKAmMxEhJrZXlUb2tlbnNQZXJUaWNrZXQaFgoCYzISEGtleVByaWNlUGVyVG9rZW4aFgoCYzMSEGtleVN3b3BQZXJUaWNrZXQaHAoCYzQSFmtleVN3b3BmaVRpY2tldHNBbW91bnQaEQoCYzUSC2tleUhDQW1vdW50Gh0KAmM2EhdrZXlDYW1wYWlnblRva2Vuc0Ftb3VudBocCgJjNxIWa2V5VG9rZW5zUGVyQWxsb2NhdGlvbhoZCgJjOBITa2V5VGlja2V0TGFzdE51bWJlchobCgJjORIVa2V5SENUaWNrZXRMYXN0TnVtYmVyGhkKAmQxEhNrZXlHb3Zlcm5hbmNlU3Rha2VkGhIKAmQyEgxrZXlVc2VyUmVmSWQaEwoCZDMSDWtleVZlcmlmeUhhc2gaEQoCZDQSC2tleUR1cmF0aW9uGiIKAmQ1EhxrZXlBbW91bnRCdXlBc3NldEluTWFya2V0aW5nGisKAmQ2EiVrZXlBbW91bnRCdXlBc3NldEluTWFya2V0aW5nRmluYWxpemVkGhkKAmQ3EhNrZXlUcmFuc2ZlckJ1eUFzc2V0GhoKAmQ4EhRrZXlGcmVlelN3b3BEdXJhdGlvbhocCgJkORIWa2V5SGlnaENvbXBldGl0aW9uU2FsZRoeCgJlMRIYa2V5RnJlZXplQWRkaXRpb25hbFRva2VuGhYKAmUyEhBrZXlGcmVlemVUb2tlbklkGhwKAmUzEhZrZXlGcmVlemVUb2tlbkR1cmF0aW9uGh0KAmU0EhdrZXlGcmVlemVUb2tlblBlclRpY2tldBoRCgJlNRILa2V5QnV5VG9rZW4aFAoCZTYSDmtleUNsYWltUGFyYW1zGiAKAmU3EhprZXlVc2VyQm91Z2h0VGlja2V0c0Ftb3VudBoiCgJlOBIca2V5VXNlckhDQm91Z2h0VGlja2V0c0Ftb3VudBoUCgJlORIOa2V5VXNlclRpY2tldHMaFgoCZjESEGtleVVzZXJIQ1RpY2tldHMaIQoCZjISG2tleVVzZXJBdmFpbGFibGVBbGxvY2F0aW9ucxomCgJmMxIga2V5VXNlckFtb3VudEJ1eUFzc2V0SW5NYXJrZXRpbmcaHgoCZjQSGGtleVVzZXJCb3VnaHRBbGxvY2F0aW9ucxoYCgJmNRISa2V5VXNlckNsYWltU3RhdHVzGiAKAmY2EhprZXlVc2VyV2lubmVkVGlja2V0c0Ftb3VudBoYCgJmNxISa2V5VXNlckZyZWV6ZVRva2VuGgwKAmY4EgZvcmFjbGUaEAoCZjkSCmdvdmVybmFuY2UaFgoCZzESEGNvbW1pc3Npb25XYWxsZXQaGAoCZzISEnN0YWtpbmdVU0ROQWRkcmVzcxoKCgJnMxIEVVNEThoYCgJnNBISYWRtaW5QdWJLZXlTdGFraW5nGhoKAmc1EhRtYXhBbGxvY2F0aW9uc0Ftb3VudBoOCgJnNhIIaXNBY3RpdmUaFwoCZzcSEWFjdGl2ZUxhdW5jaHBhZElkGhEKAmc4EgtnZXRBZG1pblB1YhoRCgJnORILa2V5QWRtaW5QdWIaDQoCaDESByRtYXRjaDAaDAoCaDISBnN0cmluZxoNCgJoMxIHbm90aGluZxoSCgJoNBIMYWRtaW5QdWJLZXkxGhIKAmg1EgxhZG1pblB1YktleTIaEgoCaDYSDGFkbWluUHViS2V5MxoSCgJoNxIMZ2V0QXNzZXRJbmZvGg0KAmg4Egdhc3NldElkGg4KAmg5EghzdHJpbmdJZBoKCgJpMRIEaW5mbxoLCgJpMhIFd2F2ZXMaGAoCaTMSEmdldExhdW5jaHBhZE5leHRJZBoWCgJpNBIQc3Rha2VkVXNkbkFtb3VudBocCgJpNRIWZ2V0QXNzZXRJbmZvRnJvbVN0cmluZxoOCgJpNhIIYXNzZXRTdHIaEQoCaTcSC2xhdW5jaHBhZElkGgoKAmk4EgRoYXNoGg0KAmk5EgdhZGRyZXNzGhQKAmoxEg5wcm9qZWN0QWRkcmVzcxoRCgJqMhILc3RhcnRIZWlnaHQaDgoCajMSCGR1cmF0aW9uGg4KAmo0EghidXlUb2tlbhoQCgJqNRIKY29tbWlzc2lvbhoVCgJqNhIPdG9rZW5zUGVyVGlja2V0GhMKAmo3Eg1wcmljZVBlclRva2VuGhkKAmo4EhNzd29wZmlUaWNrZXRzQW1vdW50GhoKAmo5EhRjYW1wYWlnblRva2Vuc0Ftb3VudBoZCgJrMRITdG9rZW5zUGVyQWxsb2NhdGlvbhoTCgJrMhINc3dvcFBlclRpY2tldBoYCgJrMxISc3dvcEZyZWV6ZUR1cmF0aW9uGhEKAms0EgtjbGFpbVBhcmFtcxoZCgJrNRITSGlnaENvbXBldGl0aW9uU2FsZRoeCgJrNhIYaGlnaENvbXBldGl0aW9uQ29taXNzaW9uGiIKAms3EhxoaWdoQ29tcGV0aXRpb25UaWNrZXRzQW1vdW50GhsKAms4EhVmcmVlemVBZGRpdGlvbmFsVG9rZW4aEgoCazkSDGZyZWV6ZVBhcmFtcxoUCgJsMRIObGF1bmNocGFkSWRTdHIaEQoCbDISCyR0MDYzMzU2NDEwGg8KAmwzEglwbXRBbW91bnQaEAoCbDQSCnBtdEFzc2V0SWQaEQoCbDUSCyR0MDY0MTk2NDkyGhMKAmw2Eg1wbXRTdHJBc3NldElkGhIKAmw3EgxwbXRBc3NldE5hbWUaEQoCbDgSC3BtdERlY2ltYWxzGhsKAmw5EhVmcmVlemVBZGRpdGlvbmFsRW50cnkaCwoCbTESBXJlZklkGhEKAm0yEgskdDA4OTkyOTA2NxoRCgJtMxILJHQwOTA3MjkyMjIaEAoCbTQSCmJ1eUFzc2V0SWQaEwoCbTUSDWJ1eUFzc2V0U3RySWQaEgoCbTYSDGJ1eUFzc2V0TmFtZRoWCgJtNxIQYnV5QXNzZXREZWNpbWFscxoRCgJtOBILc3Rha2VkU3dvcHMaHQoCbTkSF2FsbG93ZWRUaWNrZXRzQW1vdW50QWxsGhkKAm4xEhNib3VnaHRUaWNrZXRzQW1vdW50GhoKAm4yEhRhbGxvd2VkVGlja2V0c0Ftb3VudBoTCgJuMxINZnJlZXplVG9rZW5JZBoQCgJuNBIKdG9rZW5QcmljZRoTCgJuNRINJHQwMTExMTAxMTI1NBoNCgJuNhIHdG9rZW5JZBoVCgJuNxIPdG9rZW5TdHJBc3NldElkGhQKAm44Eg50b2tlbkFzc2V0TmFtZRoTCgJuORINdG9rZW5EZWNpbWFscxoRCgJvMRILdGlja2V0UHJpY2UaGQoCbzISE2NvbW1pc3Npb25QZXJUaWNrZXQaFQoCbzMSD2J1eVRpY2tldEFtb3VudBocCgJvNBIWYWxsb3dlZEJ1eVRpY2tldEFtb3VudBoiCgJvNRIcYWxsb3dlZEJ1eVByaWNlV2l0aENvbWlzc2lvbhoMCgJvNhIGY2hhbmdlGhoKAm83EhRmcmVlemVUb2tlblBlclRpY2tldBoTCgJvOBINJHQwMTI0MTgxMjUwNRoVCgJvORIPcG10QW1vdW50RnJlZXplGhYKAnAxEhBwbXRBc3NldElkRnJlZXplGhMKAnAyEg0kdDAxMjUyMjEyNjEzGhkKAnAzEhNwbXRGcmVlemVTdHJBc3NldElkGhgKAnA0EhJwbXRGcmVlemVBc3NldE5hbWUaFwoCcDUSEXBtdEZyZWV6ZURlY2ltYWxzGhYKAnA2EhBuZWVkRnJlZXplVG9rZW5zGh4KAnA3Ehh1c2VyQm91Z2h0VGlja2V0c051bWJlcnMaHAoCcDgSFmxhc3RCb3VnaHRUaWNrZXROdW1iZXIaEQoCcDkSC2JvdWdodFJhbmdlGiEKAnExEhtuZXdVc2VyQm91Z2h0VGlja2V0c051bWJlcnMaCQoCcTISA2ludhoPCgJxMxIJYmFzZUVudHJ5GhMKAnE0Eg0kdDAxNDY2MDE0NzM1GhMKAnE1Eg0kdDAxNDc0MDE0ODkwGhkKAnE2EhN1c2VyVXNkbkluTWFya2V0aW5nGhUKAnE3Eg91c2RuSW5NYXJrZXRpbmcaFwoCcTgSEWJvdWdodEFsbG9jYXRpb25zGhMKAnE5Eg0kdDAxNTU1OTE1NzAzGiIKAnIxEhxhbGxvY2F0aW9uUHJpY2VXaXRoQ29taXNzaW9uGhoKAnIyEhRidXlBbGxvY2F0aW9uc0Ftb3VudBoTCgJyMxINJHQwMTgwMTIxODA4NxoTCgJyNBINJHQwMTgwOTIxODI0MhobCgJyNRIVYm91Z2h0SENUaWNrZXRzQW1vdW50GhkKAnI2EhNoaWdoQ29tcGV0aXRpb25TYWxlGhMKAnI3Eg0kdDAxOTQ5MTE5NjM1GhsKAnI4EhVidXlQcmljZVdpdGhDb21pc3Npb24aDwoCcjkSCXZyZkhlaWdodBoQCgJzMRIKc2VjcmV0V29yZBoPCgJzMhIJc2F2ZWRIYXNoGg4KAnMzEghjYWxjSGFzaBoTCgJzNBINJHQwMjI0MjAyMjU3MBoSCgJzNRIMY29tbWlzc2lvbkhDGhgKAnM2EhJ0cmFuc2ZlcmVkQnV5QXNzZXQaIQoCczcSG3N3b3BmaU1lbWJlcnNCdXlBc3NldEFtb3VudBocCgJzOBIWc3dvcGZpSENCdXlBc3NldEFtb3VudBocCgJzORIWc3dvcGZpTWVtYmVyc0NvbWlzc2lvbhoXCgJ0MRIRc3dvcGZpSENDb21pc3Npb24aJAoCdDISHnRvdGFsQW1vdW50QnV5QXNzZXRJbk1hcmtldGluZxoYCgJ0MxISbWFya2V0aW5nQ29taXNzaW9uGhMKAnQ0Eg11bnN0YWtlQW1vdW50GhUKAnQ1Eg91c2VyQ2xhaW1TdGF0dXMaEwoCdDYSDWJvdWdodFRpY2tldHMaEwoCdDcSDSR0MDI1NDI5MjU1NzkaEwoCdDgSDXdvbm5lZFRpY2tldHMaGgoCdDkSFGF3YWlsYWJsZUFsbG9jYXRpb25zGhgKAnUxEhJhbGxvd2VkQWxsb2NhdGlvbnMaEwoCdTISDSR0MDI2MjI2MjYzNzAaGgoCdTMSFHRyYW5zZmVyVG9rZW5zQW1vdW50GiEKAnU0Ehtub3RBbGxvd2VkQWxsb2NhdGlvbnNUb2tlbnMaHAoCdTUSFmJ1eUFzc2V0Rm9yQWxsb2NhdGlvbnMaIAoCdTYSGmJ1eUFzc2V0Rm9yVW53b25uZWRUaWNrZXRzGhwKAnU3EhZyZXR1cm5lZEJ1eUFzc2V0QW1vdW50GhIKAnU4Egx0cmFuc2ZlclVzZG4aFAoCdTkSDnRyYW5zZmVyVG9rZW5zGhcKAnYxEhF1c2VyVG9rZW5zRnJlZXplZBoZCgJ2MhITZnJlZXplVG9rZW5EdXJhdGlvbhoUCgJ2MxIOYmxvY2tFbmRIZWlnaHQaDAoCdjQSBmFtb3VudBoTCgJ2NRINJHQwMzAwNDIzMDE5MhoMCgJ2NhIGdmVyaWZ5GhkKAnY3EhNtdWx0aVNpZ25lZEJ5QWRtaW5zGhgKAnY4EhJhZG1pblB1YktleTFTaWduZWQaGAoCdjkSEmFkbWluUHViS2V5MlNpZ25lZBoYCgJ3MRISYWRtaW5QdWJLZXkzU2lnbmVkGhMKAncyEg1zaWduZWRCeUFkbWluGgkKAnczEgNkdHgAAABFAAAAAAJhMQIAAAAGYWN0aXZlAAAAAAJhMgIAAAALYWRtaW5fcHViXzEAAAAAAmEzAgAAAAthZG1pbl9wdWJfMgAAAAACYTQCAAAAC2FkbWluX3B1Yl8zAAAAAAJhNQIAAAAhbGF1bmNocGFkX2RhdGFfdHJhbnNhY3Rpb25fc3RhdHVzAAAAAAJhNgIAAAARbGF1bmNocGFkX25leHRfaWQAAAAAAmE3AgAAABNsYXVuY2hwYWRfYWN0aXZlX2lkAAAAAAJhOAIAAAALaW5pdF9jYWxsZXIAAAAAAmE5AgAAAAhfYWRkcmVzcwAAAAACYjECAAAADF9pbml0X2hlaWdodAAAAAACYjICAAAADV9zdGFydF9oZWlnaHQAAAAAAmIzAgAAABBfZmluYWxpc2VfaGVpZ2h0AAAAAAJiNAIAAAAKX2NvbWlzc2lvbgAAAAACYjUCAAAAG19oaWdoX2NvbXBldGl0aW9uX2NvbWlzc2lvbgAAAAACYjYCAAAACV9hc3NldF9pZAAAAAACYjcCAAAAE190b3RhbF90b2tlbl9hbW91bnQAAAAAAmI4AgAAABVfdG90YWxfYnV5X2Fzc2V0X3NvbGQAAAAAAmI5AgAAACZfdG90YWxfYnV5X2Fzc2V0X3NvbGRfaGlnaF9jb21wZXRpdGlvbgAAAAACYzECAAAAEl90b2tlbnNfcGVyX3RpY2tldAAAAAACYzICAAAAEF9wcmljZV9wZXJfdG9rZW4AAAAAAmMzAgAAABBfc3dvcF9wZXJfdGlja2V0AAAAAAJjNAIAAAAXX3RpY2tldHNfc3dvcGZpX21lbWJlcnMAAAAAAmM1AgAAABlfdGlja2V0c19oaWdoX2NvbXBldGl0aW9uAAAAAAJjNgIAAAATX3Rva2Vuc19hY2Nlc3NfbGlzdAAAAAACYzcCAAAAFl90b2tlbnNfcGVyX2FsbG9jYXRpb24AAAAAAmM4AgAAACRfdGlja2V0X2xhc3RfbnVtYmVyX2hpZ2hfY29tcGV0aXRpb24AAAAAAmM5AgAAABNfdGlja2V0X2xhc3RfbnVtYmVyAAAAAAJkMQIAAAAMX1NXT1BfYW1vdW50AAAAAAJkMgIAAAAHX3JlZl9pZAAAAAACZDMCAAAADF92ZXJpZnlfaGFzaAAAAAACZDQCAAAACV9kdXJhdGlvbgAAAAACZDUCAAAAJ190b3RhbF9wdXJjaGFzZWRfYnV5X2Fzc2V0X2luX21hcmtldGluZwAAAAACZDYCAAAAMV90b3RhbF9wdXJjaGFzZWRfYnV5X2Fzc2V0X2luX21hcmtldGluZ19maW5hbGl6ZWQAAAAAAmQ3AgAAABNfdHJhbnNmZXJfYnV5X2Fzc2V0AAAAAAJkOAIAAAAVX2ZyZWV6ZV9zd29wX2R1cmF0aW9uAAAAAAJkOQIAAAAWX2hpZ2hfY29tcGV0aXRpb25fc2FsZQAAAAACZTECAAAAGF9mcmVlemVfYWRkaXRpb25hbF90b2tlbgAAAAACZTICAAAAEF9mcmVlemVfdG9rZW5faWQAAAAAAmUzAgAAABZfZnJlZXplX3Rva2VuX2R1cmF0aW9uAAAAAAJlNAIAAAAYX2ZyZWV6ZV90b2tlbl9wZXJfdGlja2V0AAAAAAJlNQIAAAAKX2J1eV90b2tlbgAAAAACZTYCAAAADV9jbGFpbV9wYXJhbXMAAAAAAmU3AgAAAA9fYm91Z2h0X3RpY2tldHMAAAAAAmU4AgAAACBfYm91Z2h0X3RpY2tldHNfaGlnaF9jb21wZXRpdGlvbgAAAAACZTkCAAAAD190aWNrZXRzX251bWJlcgAAAAACZjECAAAAIF90aWNrZXRzX251bWJlcl9oaWdoX2NvbXBl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", "height": 1828204, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: CDWcwp553L4RJpxspWNTcpGXwthNGVK4Hch9wENYEfvb Next: 3t4G5GERYgzUXMfnuYcEKXmpfy9UkCF4JeCctU6btD7c Diff:
OldNewDifferences
2727
2828 let keyComission = "_comission"
2929
30+let keyHighCompetitionComission = "_high_competition_comission"
31+
3032 let keyAssetId = "_asset_id"
3133
3234 let keyTotalTokenAmount = "_total_token_amount"
3335
34-let keyTotalAmountUsdnSold = "_total_usdn_sold"
36+let keyTotalAmountBuyAssetSold = "_total_buy_asset_sold"
37+
38+let keyTotalAmountBuyAssetSoldHC = "_total_buy_asset_sold_high_competition"
3539
3640 let keyTokensPerTicket = "_tokens_per_ticket"
3741
4145
4246 let keySwopfiTicketsAmount = "_tickets_swopfi_members"
4347
48+let keyHCAmount = "_tickets_high_competition"
49+
4450 let keyCampaignTokensAmount = "_tokens_access_list"
4551
4652 let keyTokensPerAllocation = "_tokens_per_allocation"
4753
48-let keyTicketLastNumber = "_ticket_last_number"
54+let keyTicketLastNumber = "_ticket_last_number_high_competition"
55+
56+let keyHCTicketLastNumber = "_ticket_last_number"
4957
5058 let keyGovernanceStaked = "_SWOP_amount"
5159
5563
5664 let keyDuration = "_duration"
5765
58-let keyAmountUSDNInMarketing = "_total_purchased_usdn_in_marketing"
66+let keyAmountBuyAssetInMarketing = "_total_purchased_buy_asset_in_marketing"
5967
60-let keyAmountUSDNInMarketingFinalized = "_total_purchased_usdn_in_marketing_finalized"
68+let keyAmountBuyAssetInMarketingFinalized = "_total_purchased_buy_asset_in_marketing_finalized"
6169
62-let keyTransferUsd = "_transfer_usd"
70+let keyTransferBuyAsset = "_transfer_buy_asset"
6371
6472 let keyFreezSwopDuration = "_freeze_swop_duration"
73+
74+let keyHighCompetitionSale = "_high_competition_sale"
6575
6676 let keyFreezeAdditionalToken = "_freeze_additional_token"
6777
7181
7282 let keyFreezeTokenPerTicket = "_freeze_token_per_ticket"
7383
84+let keyBuyToken = "_buy_token"
85+
86+let keyClaimParams = "_claim_params"
87+
7488 let keyUserBoughtTicketsAmount = "_bought_tickets"
89+
90+let keyUserHCBoughtTicketsAmount = "_bought_tickets_high_competition"
7591
7692 let keyUserTickets = "_tickets_number"
7793
94+let keyUserHCTickets = "_tickets_number_high_competition"
95+
7896 let keyUserAvailableAllocations = "_available_purchase_marketing"
7997
80-let keyUserAmountUSDNInMarketing = "_purchased_usdn_in_marketing"
98+let keyUserAmountBuyAssetInMarketing = "_purchased_buy_asset_in_marketing"
8199
82100 let keyUserBoughtAllocations = "_bought_allocations"
83101
86104 let keyUserWinnedTicketsAmount = "_tickets_result"
87105
88106 let keyUserFreezeToken = "_freeze_token_amount"
89-
90-let lauchpadDuration = 10000
91107
92108 let oracle = Address(base58'3NBBWfzZtZtszaXbitTKnrB2xXwv26Bn7H9')
93109
139155 func stakedUsdnAmount () = valueOrElse(getInteger(stakingUSDNAddress, ((("rpd_balance_" + toBase58String(USDN)) + "_") + toString(this))), 0)
140156
141157
158+func getAssetInfoFromString (assetStr) = if ((assetStr == "WAVES"))
159+ then $Tuple4(unit, "WAVES", "WAVES", 8)
160+ else {
161+ let stringId = assetStr
162+ let id = fromBase58String(assetStr)
163+ let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
164+ $Tuple4(id, stringId, info.name, info.decimals)
165+ }
166+
167+
142168 @Callable(i)
143169 func hashingRandom (launchpadId,hash) = if (!(isActive))
144170 then throw("DApp is inactive at this moment")
158184
159185
160186 @Callable(i)
161-func init (projectAddress,startHeight,commission,tokensPerTicket,pricePerToken,swopfiTicketsAmount,campaignTokensAmount,tokensPerAllocation,swopPerTicket,swopFreezeDuration,freezeAdditionalToken,freezeParams) = if (!(isActive))
187+func init (projectAddress,startHeight,duration,buyToken,commission,tokensPerTicket,pricePerToken,swopfiTicketsAmount,campaignTokensAmount,tokensPerAllocation,swopPerTicket,swopFreezeDuration,claimParams,HighCompetitionSale,highCompetitionComission,highCompetitionTicketsAmount,freezeAdditionalToken,freezeParams) = if (!(isActive))
162188 then throw("DApp is inactive at this moment")
163189 else if ((toString(i.caller) != valueOrElse(getString(this, keyInitCaller), "")))
164190 then throw("Only project admin can call init function")
173199 else {
174200 let launchpadId = getLaunchpadNextId()
175201 let launchpadIdStr = toString(launchpadId)
176- let $t053095384 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
177- let pmtAmount = $t053095384._1
178- let pmtAssetId = $t053095384._2
179- let $t053935466 = getAssetInfo(pmtAssetId)
180- let pmtStrAssetId = $t053935466._1
181- let pmtAssetName = $t053935466._2
182- let pmtDecimals = $t053935466._3
202+ let $t063356410 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
203+ let pmtAmount = $t063356410._1
204+ let pmtAssetId = $t063356410._2
205+ let $t064196492 = getAssetInfo(pmtAssetId)
206+ let pmtStrAssetId = $t064196492._1
207+ let pmtAssetName = $t064196492._2
208+ let pmtDecimals = $t064196492._3
183209 let freezeAdditionalEntry = if (freezeAdditionalToken)
184210 then [BooleanEntry((launchpadIdStr + keyFreezeAdditionalToken), true), StringEntry((launchpadIdStr + keyFreezeTokenId), freezeParams[0]), IntegerEntry((launchpadIdStr + keyFreezeTokenDuration), parseIntValue(freezeParams[1])), IntegerEntry((launchpadIdStr + keyFreezeTokenPerTicket), parseIntValue(freezeParams[2]))]
185211 else nil
186- ([IntegerEntry((pmtStrAssetId + "_launchpad"), launchpadId), IntegerEntry(keyLaunchpadNextId, (launchpadId + 1)), StringEntry((launchpadIdStr + keyAddress), projectAddress), IntegerEntry((launchpadIdStr + keyInitHeight), height), IntegerEntry((launchpadIdStr + keyStartHeight), startHeight), IntegerEntry((launchpadIdStr + keyDuration), lauchpadDuration), 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), IntegerEntry(keyLaunchpadActiveId, launchpadId), StringEntry(keyInitCaller, "")] ++ freezeAdditionalEntry)
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 + keyHighCompetitionComission), highCompetitionComission), 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 + keyHCAmount), highCompetitionTicketsAmount), IntegerEntry((launchpadIdStr + keyTokensPerAllocation), tokensPerAllocation), StringEntry((launchpadIdStr + keyClaimParams), makeString(claimParams, ",")), BooleanEntry((launchpadIdStr + keyHighCompetitionSale), HighCompetitionSale), IntegerEntry(keyLaunchpadActiveId, launchpadId), StringEntry(keyInitCaller, "")] ++ freezeAdditionalEntry)
187213 }
188214
189215
190216
191217 @Callable(i)
192218 func commitSwopfiSale (launchpadId,refId) = {
193- let $t075377612 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
194- let pmtAmount = $t075377612._1
195- let pmtAssetId = $t075377612._2
219+ let $t089929067 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
220+ let pmtAmount = $t089929067._1
221+ let pmtAssetId = $t089929067._2
222+ let $t090729222 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
223+ let buyAssetId = $t090729222._1
224+ let buyAssetStrId = $t090729222._2
225+ let buyAssetName = $t090729222._3
226+ let buyAssetDecimals = $t090729222._4
196227 let stakedSwops = valueOrElse(getInteger(governance, (toString(i.caller) + keyGovernanceStaked)), 0)
197228 let allowedTicketsAmountAll = (stakedSwops / getIntegerValue(this, (toString(launchpadId) + keySwopPerTicket)))
198229 let boughtTicketsAmount = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtTicketsAmount)), 0)
211242 else if (if (!(freezeAdditionalToken))
212243 then if ((size(i.payments) != 1))
213244 then true
214- else (pmtAssetId != USDN)
245+ else (pmtAssetId != buyAssetId)
215246 else false)
216- then throw("One attached payment in USDN expected")
247+ then throw((("One attached payment in " + buyAssetName) + " expected"))
217248 else if (if (freezeAdditionalToken)
218249 then if ((size(i.payments) != 2))
219250 then true
220- else (pmtAssetId != USDN)
251+ else (pmtAssetId != buyAssetId)
221252 else false)
222253 then {
223254 let freezeTokenId = getStringValue(this, (toString(launchpadId) + keyFreezeTokenId))
224- throw(("Two attached payments expected: First in USDN, second in " + freezeTokenId))
255+ throw(((("Two attached payments expected: First in " + buyAssetName) + ", second in ") + freezeTokenId))
225256 }
226257 else if (if ((0 >= allowedTicketsAmountAll))
227258 then true
230261 else {
231262 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
232263 let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
233- let tokenId = fromBase58String(getStringValue(this, (toString(launchpadId) + keyAssetId)))
234- let $t095549630 = getAssetInfo(tokenId)
235- let tokenStrAssetId = $t095549630._1
236- let tokenAssetName = $t095549630._2
237- let tokenDecimals = $t095549630._3
264+ let $t01111011254 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
265+ let tokenId = $t01111011254._1
266+ let tokenStrAssetId = $t01111011254._2
267+ let tokenAssetName = $t01111011254._3
268+ let tokenDecimals = $t01111011254._4
238269 let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
239270 let commissionPerTicket = fraction(ticketPrice, getIntegerValue(this, (toString(launchpadId) + keyComission)), 100)
240271 let buyTicketAmount = (pmtAmount / (ticketPrice + commissionPerTicket))
242273 let allowedBuyPriceWithComission = (allowedBuyTicketAmount * (ticketPrice + commissionPerTicket))
243274 let change = (pmtAmount - allowedBuyPriceWithComission)
244275 if ((buyTicketAmount == 0))
245- then throw("Not enought USDN to buy tickets")
276+ then throw((("Not enought " + buyAssetName) + " to buy tickets"))
246277 else if ((change != 0))
247- then throw((((("Wrong payment. To buy " + toString(allowedBuyTicketAmount)) + "tickets you need to pay ") + toString(allowedBuyPriceWithComission)) + "USDN"))
278+ then throw((((("Wrong payment. To buy " + toString(allowedBuyTicketAmount)) + "tickets you need to pay ") + toString(allowedBuyPriceWithComission)) + buyAssetName))
248279 else {
249280 let freezeAdditionalEntry = if (freezeAdditionalToken)
250281 then {
251282 let freezeTokenId = getStringValue(this, (toString(launchpadId) + keyFreezeTokenId))
252283 let freezeTokenPerTicket = getIntegerValue(this, (toString(launchpadId) + keyFreezeTokenPerTicket))
253- let $t01077210859 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
254- let pmtAmountFreeze = $t01077210859._1
255- let pmtAssetIdFreeze = $t01077210859._2
256- let $t01087610967 = getAssetInfo(pmtAssetId)
257- let pmtFreezeStrAssetId = $t01087610967._1
258- let pmtFreezeAssetName = $t01087610967._2
259- let pmtFreezeDecimals = $t01087610967._3
284+ let $t01241812505 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
285+ let pmtAmountFreeze = $t01241812505._1
286+ let pmtAssetIdFreeze = $t01241812505._2
287+ let $t01252212613 = getAssetInfo(pmtAssetId)
288+ let pmtFreezeStrAssetId = $t01252212613._1
289+ let pmtFreezeAssetName = $t01252212613._2
290+ let pmtFreezeDecimals = $t01252212613._3
260291 let needFreezeTokens = (freezeTokenPerTicket * buyTicketAmount)
261292 if (if ((pmtFreezeStrAssetId != freezeTokenId))
262293 then true
271302 let newUserBoughtTicketsNumbers = (userBoughtTicketsNumbers + (if ((userBoughtTicketsNumbers != ""))
272303 then ("," + boughtRange)
273304 else ("" + boughtRange)))
274- let inv = invoke(stakingUSDNAddress, "lockNeutrino", nil, [AttachedPayment(pmtAssetId, pmtAmount)])
305+ let inv = if ((buyAssetId == USDN))
306+ then invoke(stakingUSDNAddress, "lockNeutrino", nil, [AttachedPayment(pmtAssetId, pmtAmount)])
307+ else 0
275308 if ((inv == inv))
276309 then {
277310 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)
288321
289322 @Callable(i)
290323 func commitAccessListSale (launchpadId,refId) = {
291- let $t01295413029 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
292- let pmtAmount = $t01295413029._1
293- let pmtAssetId = $t01295413029._2
294- let userUsdnInMarketing = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserAmountUSDNInMarketing)), 0)
295- let usdnInMarketing = valueOrElse(getInteger(this, (toString(launchpadId) + keyAmountUSDNInMarketing)), 0)
324+ let $t01466014735 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
325+ let pmtAmount = $t01466014735._1
326+ let pmtAssetId = $t01466014735._2
327+ let $t01474014890 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
328+ let buyAssetId = $t01474014890._1
329+ let buyAssetStrId = $t01474014890._2
330+ let buyAssetName = $t01474014890._3
331+ let buyAssetDecimals = $t01474014890._4
332+ let userUsdnInMarketing = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserAmountBuyAssetInMarketing)), 0)
333+ let usdnInMarketing = valueOrElse(getInteger(this, (toString(launchpadId) + keyAmountBuyAssetInMarketing)), 0)
296334 let boughtAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtAllocations)), 0)
297335 let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
298336 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
299337 let tokensPerAllocation = getIntegerValue(this, (toString(launchpadId) + keyTokensPerAllocation))
300- let tokenId = fromBase58String(getStringValue(this, (toString(launchpadId) + keyAssetId)))
301- let $t01378413860 = getAssetInfo(tokenId)
302- let tokenStrAssetId = $t01378413860._1
303- let tokenAssetName = $t01378413860._2
304- let tokenDecimals = $t01378413860._3
338+ let $t01555915703 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
339+ let tokenId = $t01555915703._1
340+ let tokenStrAssetId = $t01555915703._2
341+ let tokenAssetName = $t01555915703._3
342+ let tokenDecimals = $t01555915703._4
305343 let allocationPriceWithComission = fraction(fraction(tokenPrice, tokensPerAllocation, pow(10, 0, tokenDecimals, 0, 0, DOWN)), (100 + commission), 100)
306344 let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
307345 let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
315353 then throw("Launchpad sale ended")
316354 else if (if ((size(i.payments) != 1))
317355 then true
318- else (pmtAssetId != USDN))
319- then throw("One attached payment in USDN expected")
356+ else (pmtAssetId != buyAssetId))
357+ then throw((("One attached payment in " + buyAssetName) + " expected"))
320358 else if ((boughtAllocations >= maxAllocationsAmount))
321359 then throw((("You can buy only " + toString(maxAllocationsAmount)) + "allocations"))
322360 else if (if ((allocationPriceWithComission != pmtAmount))
323361 then ((allocationPriceWithComission * 2) != pmtAmount)
324362 else false)
325- then throw((("Wrong payment. You can buy 1 or 2 allocations for " + toString(allocationPriceWithComission)) + " USDN per allocation"))
363+ then throw(((("Wrong payment. You can buy 1 or 2 allocations for " + toString(allocationPriceWithComission)) + buyAssetName) + " per allocation"))
326364 else {
327365 let buyAllocationsAmount = (pmtAmount / allocationPriceWithComission)
328- let inv = invoke(stakingUSDNAddress, "lockNeutrino", nil, [AttachedPayment(pmtAssetId, pmtAmount)])
366+ let inv = if ((buyAssetId == USDN))
367+ then invoke(stakingUSDNAddress, "lockNeutrino", nil, [AttachedPayment(pmtAssetId, pmtAmount)])
368+ else 0
329369 if ((inv == inv))
330370 then {
331- let baseEntry = [IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtAllocations), (boughtAllocations + buyAllocationsAmount)), IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserAmountUSDNInMarketing), (userUsdnInMarketing + pmtAmount)), IntegerEntry((toString(launchpadId) + keyAmountUSDNInMarketing), (usdnInMarketing + pmtAmount))]
371+ 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))]
332372 if (!(isDefined(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId)))))
333373 then (baseEntry ++ [StringEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId), refId)])
334374 else baseEntry
335375 }
336376 else throw("Strict value is not equal to itself.")
337377 }
378+ }
379+
380+
381+
382+@Callable(i)
383+func commitHighCompetitionSale (launchpadId,refId) = {
384+ let $t01801218087 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
385+ let pmtAmount = $t01801218087._1
386+ let pmtAssetId = $t01801218087._2
387+ let $t01809218242 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
388+ let buyAssetId = $t01809218242._1
389+ let buyAssetStrId = $t01809218242._2
390+ let buyAssetName = $t01809218242._3
391+ let buyAssetDecimals = $t01809218242._4
392+ let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
393+ let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
394+ let boughtHCTicketsAmount = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserHCBoughtTicketsAmount)), 0)
395+ let highCompetitionSale = valueOrElse(getBoolean(this, (toString(launchpadId) + keyHighCompetitionSale)), false)
396+ if (!(isActive))
397+ then throw("DApp is inactive at this moment")
398+ else if ((activeLaunchpadId != launchpadId))
399+ then throw("There is no active launchpad or this launchpad is ended")
400+ else if (!(highCompetitionSale))
401+ then throw("There is no high competition sale for this launchpad")
402+ else if ((startHeight > height))
403+ then throw("Launchpad sale not started yet")
404+ else if ((height > (startHeight + duration)))
405+ then throw("Launchpad sale ended")
406+ else if (if ((size(i.payments) != 1))
407+ then true
408+ else (pmtAssetId != buyAssetId))
409+ then throw((("One attached payment in " + buyAssetName) + " expected"))
410+ else {
411+ let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
412+ let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
413+ let $t01949119635 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
414+ let tokenId = $t01949119635._1
415+ let tokenStrAssetId = $t01949119635._2
416+ let tokenAssetName = $t01949119635._3
417+ let tokenDecimals = $t01949119635._4
418+ let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
419+ let commissionPerTicket = fraction(ticketPrice, getIntegerValue(this, (toString(launchpadId) + keyHighCompetitionComission)), 100)
420+ let buyTicketAmount = (pmtAmount / (ticketPrice + commissionPerTicket))
421+ let buyPriceWithComission = (buyTicketAmount * (ticketPrice + commissionPerTicket))
422+ let change = (pmtAmount - buyPriceWithComission)
423+ if ((buyTicketAmount == 0))
424+ then throw((("Not enought " + buyAssetName) + " to buy tickets"))
425+ else if ((change != 0))
426+ then throw((((("Wrong payment. To buy " + toString(buyTicketAmount)) + "tickets you need to pay ") + toString(buyPriceWithComission)) + buyAssetName))
427+ else {
428+ let userBoughtTicketsNumbers = valueOrElse(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserHCTickets)), "")
429+ let lastBoughtTicketNumber = getIntegerValue(this, (toString(launchpadId) + keyHCTicketLastNumber))
430+ let boughtRange = ((toString((lastBoughtTicketNumber + 1)) + "-") + toString((lastBoughtTicketNumber + buyTicketAmount)))
431+ let newUserBoughtTicketsNumbers = (userBoughtTicketsNumbers + (if ((userBoughtTicketsNumbers != ""))
432+ then ("," + boughtRange)
433+ else ("" + boughtRange)))
434+ let inv = if ((buyAssetId == USDN))
435+ then invoke(stakingUSDNAddress, "lockNeutrino", nil, [AttachedPayment(pmtAssetId, pmtAmount)])
436+ else 0
437+ if ((inv == inv))
438+ then {
439+ 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)]
440+ if (!(isDefined(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId)))))
441+ then (baseEntry ++ [StringEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId), refId)])
442+ else baseEntry
443+ }
444+ else throw("Strict value is not equal to itself.")
445+ }
446+ }
338447 }
339448
340449
350459 else if ((calcHash != savedHash))
351460 then throw("vrf Height hash not matching")
352461 else {
462+ let $t02242022570 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
463+ let buyAssetId = $t02242022570._1
464+ let buyAssetStrId = $t02242022570._2
465+ let buyAssetName = $t02242022570._3
466+ let buyAssetDecimals = $t02242022570._4
353467 let projectAddress = addressFromStringValue(getStringValue(this, (toString(launchpadId) + keyAddress)))
354468 let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
355- let transferedUsdn = valueOrElse(getInteger(this, (toString(launchpadId) + keyTransferUsd)), 0)
356- let swopfiMembersUsdnAmount = getIntegerValue(this, (toString(launchpadId) + keyTotalAmountUsdnSold))
357- let swopfiMembersComission = fraction(swopfiMembersUsdnAmount, commission, 100)
358- let totalAmountUsdnInMarketing = getIntegerValue(this, (toString(launchpadId) + keyAmountUSDNInMarketingFinalized))
359- let marketingComission = fraction(totalAmountUsdnInMarketing, commission, 100)
360- let unstakeAmount = (((swopfiMembersUsdnAmount + totalAmountUsdnInMarketing) + swopfiMembersComission) + marketingComission)
361- if ((transferedUsdn > (swopfiMembersUsdnAmount + totalAmountUsdnInMarketing)))
469+ let commissionHC = getIntegerValue(this, (toString(launchpadId) + keyHighCompetitionComission))
470+ let transferedBuyAsset = valueOrElse(getInteger(this, (toString(launchpadId) + keyTransferBuyAsset)), 0)
471+ let swopfiMembersBuyAssetAmount = getIntegerValue(this, (toString(launchpadId) + keyTotalAmountBuyAssetSold))
472+ let swopfiHCBuyAssetAmount = valueOrElse(getIntegerValue(this, (toString(launchpadId) + keyTotalAmountBuyAssetSoldHC)), 0)
473+ let swopfiMembersComission = fraction(swopfiMembersBuyAssetAmount, commission, 100)
474+ let swopfiHCComission = fraction(swopfiHCBuyAssetAmount, commissionHC, 100)
475+ let totalAmountBuyAssetInMarketing = getIntegerValue(this, (toString(launchpadId) + keyAmountBuyAssetInMarketingFinalized))
476+ let marketingComission = fraction(totalAmountBuyAssetInMarketing, commission, 100)
477+ let unstakeAmount = (((((swopfiMembersBuyAssetAmount + totalAmountBuyAssetInMarketing) + swopfiMembersComission) + marketingComission) + swopfiHCBuyAssetAmount) + swopfiHCComission)
478+ if ((transferedBuyAsset > (swopfiMembersBuyAssetAmount + totalAmountBuyAssetInMarketing)))
362479 then throw("Can't transfer negative value to project")
363480 else {
364- let inv = invoke(stakingUSDNAddress, "unlockNeutrino", [unstakeAmount, toBase58String(USDN)], nil)
481+ let inv = if ((buyAssetId == USDN))
482+ then invoke(stakingUSDNAddress, "unlockNeutrino", [unstakeAmount, toBase58String(USDN)], nil)
483+ else 0
365484 if ((inv == inv))
366- then [IntegerEntry((toString(launchpadId) + keyFinaliseHeight), height), ScriptTransfer(projectAddress, ((swopfiMembersUsdnAmount + totalAmountUsdnInMarketing) - transferedUsdn), USDN), ScriptTransfer(commissionWallet, (swopfiMembersComission + marketingComission), USDN)]
485+ then [IntegerEntry((toString(launchpadId) + keyFinaliseHeight), height), ScriptTransfer(projectAddress, ((swopfiMembersBuyAssetAmount + totalAmountBuyAssetInMarketing) - transferedBuyAsset), buyAssetId), ScriptTransfer(commissionWallet, ((swopfiMembersComission + marketingComission) + swopfiHCComission), buyAssetId)]
367486 else throw("Strict value is not equal to itself.")
368487 }
369488 }
387506 else false)
388507 then throw("You can't claim because you don't buy anything")
389508 else {
390- let tokenId = fromBase58String(getStringValue(this, (toString(launchpadId) + keyAssetId)))
509+ let $t02542925579 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
510+ let buyAssetId = $t02542925579._1
511+ let buyAssetStrId = $t02542925579._2
512+ let buyAssetName = $t02542925579._3
513+ let buyAssetDecimals = $t02542925579._4
391514 let wonnedTickets = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserWinnedTicketsAmount)), 0)
392515 let awailableAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserAvailableAllocations)), 0)
393516 let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
394517 let allowedAllocations = min([boughtAllocations, awailableAllocations])
395518 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
396519 let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
397- let $t01963419710 = getAssetInfo(tokenId)
398- let tokenStrAssetId = $t01963419710._1
399- let tokenAssetName = $t01963419710._2
400- let tokenDecimals = $t01963419710._3
520+ let $t02622626370 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
521+ let tokenId = $t02622626370._1
522+ let tokenStrAssetId = $t02622626370._2
523+ let tokenAssetName = $t02622626370._3
524+ let tokenDecimals = $t02622626370._4
401525 let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
402526 let tokensPerAllocation = getIntegerValue(this, (toString(launchpadId) + keyTokensPerAllocation))
403527 let transferTokensAmount = ((wonnedTickets * tokensPerTicket) + (allowedAllocations * tokensPerAllocation))
404528 let notAllowedAllocationsTokens = ((boughtAllocations - allowedAllocations) * tokensPerAllocation)
405- let usdnForAllocations = fraction(fraction(notAllowedAllocationsTokens, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN)), (100 + commission), 100)
406- let usdnForUnwonnedTickets = fraction(((boughtTickets - wonnedTickets) * ticketPrice), (100 + commission), 100)
407- if (if ((0 > usdnForAllocations))
529+ let buyAssetForAllocations = fraction(fraction(notAllowedAllocationsTokens, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN)), (100 + commission), 100)
530+ let buyAssetForUnwonnedTickets = fraction(((boughtTickets - wonnedTickets) * ticketPrice), (100 + commission), 100)
531+ if (if ((0 > buyAssetForAllocations))
408532 then true
409- else (0 > usdnForUnwonnedTickets))
533+ else (0 > buyAssetForUnwonnedTickets))
410534 then throw("Error with allowed allocation param or wonned tickets param please contact support")
411535 else {
412- let returnedUsdnAmount = (usdnForAllocations + usdnForUnwonnedTickets)
413- let transferUsdn = if ((returnedUsdnAmount > 0))
414- then [ScriptTransfer(i.caller, returnedUsdnAmount, USDN)]
536+ let returnedBuyAssetAmount = (buyAssetForUnwonnedTickets + buyAssetForUnwonnedTickets)
537+ let transferUsdn = if ((returnedBuyAssetAmount > 0))
538+ then [ScriptTransfer(i.caller, returnedBuyAssetAmount, buyAssetId)]
415539 else nil
416540 let transferTokens = if ((transferTokensAmount > 0))
417541 then [ScriptTransfer(i.caller, transferTokensAmount, tokenId)]
418542 else nil
419- let inv = if ((returnedUsdnAmount > 0))
420- then invoke(stakingUSDNAddress, "unlockNeutrino", [returnedUsdnAmount, toBase58String(USDN)], nil)
543+ let inv = if (if ((returnedBuyAssetAmount > 0))
544+ then (buyAssetId == USDN)
545+ else false)
546+ then invoke(stakingUSDNAddress, "unlockNeutrino", [returnedBuyAssetAmount, toBase58String(USDN)], nil)
421547 else 0
422548 if ((inv == inv))
423549 then (([BooleanEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimStatus), true)] ++ transferTokens) ++ transferUsdn)
455581
456582
457583 @Callable(i)
458-func transferUsd (launchpadId,amountUsdn) = if (!(isActive))
584+func transferBuyAsset (launchpadId,amount) = if (!(isActive))
459585 then throw("DApp is inactive")
460586 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
461587 then throw("Only admin can call this function")
462588 else {
463589 let projectAddress = addressFromStringValue(getStringValue(this, (toString(launchpadId) + keyAddress)))
464-[IntegerEntry((toString(launchpadId) + keyTransferUsd), amountUsdn), ScriptTransfer(projectAddress, amountUsdn, USDN)]
590+ let $t03004230192 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
591+ let buyAssetId = $t03004230192._1
592+ let buyAssetStrId = $t03004230192._2
593+ let buyAssetName = $t03004230192._3
594+ let buyAssetDecimals = $t03004230192._4
595+[IntegerEntry((toString(launchpadId) + keyTransferBuyAsset), amount), ScriptTransfer(projectAddress, amount, buyAssetId)]
465596 }
466597
467598
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
30+let keyHighCompetitionComission = "_high_competition_comission"
31+
3032 let keyAssetId = "_asset_id"
3133
3234 let keyTotalTokenAmount = "_total_token_amount"
3335
34-let keyTotalAmountUsdnSold = "_total_usdn_sold"
36+let keyTotalAmountBuyAssetSold = "_total_buy_asset_sold"
37+
38+let keyTotalAmountBuyAssetSoldHC = "_total_buy_asset_sold_high_competition"
3539
3640 let keyTokensPerTicket = "_tokens_per_ticket"
3741
3842 let keyPricePerToken = "_price_per_token"
3943
4044 let keySwopPerTicket = "_swop_per_ticket"
4145
4246 let keySwopfiTicketsAmount = "_tickets_swopfi_members"
4347
48+let keyHCAmount = "_tickets_high_competition"
49+
4450 let keyCampaignTokensAmount = "_tokens_access_list"
4551
4652 let keyTokensPerAllocation = "_tokens_per_allocation"
4753
48-let keyTicketLastNumber = "_ticket_last_number"
54+let keyTicketLastNumber = "_ticket_last_number_high_competition"
55+
56+let keyHCTicketLastNumber = "_ticket_last_number"
4957
5058 let keyGovernanceStaked = "_SWOP_amount"
5159
5260 let keyUserRefId = "_ref_id"
5361
5462 let keyVerifyHash = "_verify_hash"
5563
5664 let keyDuration = "_duration"
5765
58-let keyAmountUSDNInMarketing = "_total_purchased_usdn_in_marketing"
66+let keyAmountBuyAssetInMarketing = "_total_purchased_buy_asset_in_marketing"
5967
60-let keyAmountUSDNInMarketingFinalized = "_total_purchased_usdn_in_marketing_finalized"
68+let keyAmountBuyAssetInMarketingFinalized = "_total_purchased_buy_asset_in_marketing_finalized"
6169
62-let keyTransferUsd = "_transfer_usd"
70+let keyTransferBuyAsset = "_transfer_buy_asset"
6371
6472 let keyFreezSwopDuration = "_freeze_swop_duration"
73+
74+let keyHighCompetitionSale = "_high_competition_sale"
6575
6676 let keyFreezeAdditionalToken = "_freeze_additional_token"
6777
6878 let keyFreezeTokenId = "_freeze_token_id"
6979
7080 let keyFreezeTokenDuration = "_freeze_token_duration"
7181
7282 let keyFreezeTokenPerTicket = "_freeze_token_per_ticket"
7383
84+let keyBuyToken = "_buy_token"
85+
86+let keyClaimParams = "_claim_params"
87+
7488 let keyUserBoughtTicketsAmount = "_bought_tickets"
89+
90+let keyUserHCBoughtTicketsAmount = "_bought_tickets_high_competition"
7591
7692 let keyUserTickets = "_tickets_number"
7793
94+let keyUserHCTickets = "_tickets_number_high_competition"
95+
7896 let keyUserAvailableAllocations = "_available_purchase_marketing"
7997
80-let keyUserAmountUSDNInMarketing = "_purchased_usdn_in_marketing"
98+let keyUserAmountBuyAssetInMarketing = "_purchased_buy_asset_in_marketing"
8199
82100 let keyUserBoughtAllocations = "_bought_allocations"
83101
84102 let keyUserClaimStatus = "_claim_status"
85103
86104 let keyUserWinnedTicketsAmount = "_tickets_result"
87105
88106 let keyUserFreezeToken = "_freeze_token_amount"
89-
90-let lauchpadDuration = 10000
91107
92108 let oracle = Address(base58'3NBBWfzZtZtszaXbitTKnrB2xXwv26Bn7H9')
93109
94110 let governance = Address(base58'3N5W8da2iiijVieA6qLGo7KzCJj8B19smWU')
95111
96112 let commissionWallet = Address(base58'3N2hBdeDEs7wCNA9EY8qv3B6drjgKD64xQG')
97113
98114 let stakingUSDNAddress = Address(base58'3N6q7sCGSSLBUXDdjBdYGTJbZGZfhhh8cNg')
99115
100116 let USDN = base58'8UrfDVd5GreeUwm7uPk7eYz1eMv376kzR52C6sANPkwS'
101117
102118 let adminPubKeyStaking = base58'Kn7NpzaG12dLZgcHf2ipUftU6hbJygmrhFqQYE4B7ZK'
103119
104120 let maxAllocationsAmount = 2
105121
106122 let isActive = valueOrElse(getBoolean(this, keyActive), true)
107123
108124 let activeLaunchpadId = valueOrElse(getIntegerValue(this, keyLaunchpadActiveId), -1)
109125
110126 func getAdminPub (keyAdminPub) = match getString(oracle, keyAdminPub) {
111127 case string: String =>
112128 fromBase58String(string)
113129 case nothing =>
114130 throw("Admin public key is empty")
115131 }
116132
117133
118134 let adminPubKey1 = getAdminPub(keyAdminPubKey1)
119135
120136 let adminPubKey2 = getAdminPub(keyAdminPubKey2)
121137
122138 let adminPubKey3 = getAdminPub(keyAdminPubKey3)
123139
124140 func getAssetInfo (assetId) = match assetId {
125141 case id: ByteVector =>
126142 let stringId = toBase58String(id)
127143 let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
128144 $Tuple3(stringId, info.name, info.decimals)
129145 case waves: Unit =>
130146 $Tuple3("WAVES", "WAVES", 8)
131147 case _ =>
132148 throw("Match error")
133149 }
134150
135151
136152 func getLaunchpadNextId () = valueOrElse(getInteger(this, keyLaunchpadNextId), 1)
137153
138154
139155 func stakedUsdnAmount () = valueOrElse(getInteger(stakingUSDNAddress, ((("rpd_balance_" + toBase58String(USDN)) + "_") + toString(this))), 0)
140156
141157
158+func getAssetInfoFromString (assetStr) = if ((assetStr == "WAVES"))
159+ then $Tuple4(unit, "WAVES", "WAVES", 8)
160+ else {
161+ let stringId = assetStr
162+ let id = fromBase58String(assetStr)
163+ let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
164+ $Tuple4(id, stringId, info.name, info.decimals)
165+ }
166+
167+
142168 @Callable(i)
143169 func hashingRandom (launchpadId,hash) = if (!(isActive))
144170 then throw("DApp is inactive at this moment")
145171 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
146172 then throw("Only admin can call this function")
147173 else [StringEntry((toString(launchpadId) + keyVerifyHash), hash)]
148174
149175
150176
151177 @Callable(i)
152178 func initCaller (address) = if (!(isActive))
153179 then throw("DApp is inactive at this moment")
154180 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
155181 then throw("Only admin can call this function")
156182 else [StringEntry(keyInitCaller, address)]
157183
158184
159185
160186 @Callable(i)
161-func init (projectAddress,startHeight,commission,tokensPerTicket,pricePerToken,swopfiTicketsAmount,campaignTokensAmount,tokensPerAllocation,swopPerTicket,swopFreezeDuration,freezeAdditionalToken,freezeParams) = if (!(isActive))
187+func init (projectAddress,startHeight,duration,buyToken,commission,tokensPerTicket,pricePerToken,swopfiTicketsAmount,campaignTokensAmount,tokensPerAllocation,swopPerTicket,swopFreezeDuration,claimParams,HighCompetitionSale,highCompetitionComission,highCompetitionTicketsAmount,freezeAdditionalToken,freezeParams) = if (!(isActive))
162188 then throw("DApp is inactive at this moment")
163189 else if ((toString(i.caller) != valueOrElse(getString(this, keyInitCaller), "")))
164190 then throw("Only project admin can call init function")
165191 else if ((size(i.payments) != 1))
166192 then throw("One attached payment expected")
167193 else if ((height > startHeight))
168194 then throw("Start height must be greater than blockchain height")
169195 else if (if (freezeAdditionalToken)
170196 then (size(freezeParams) != 3)
171197 else false)
172198 then throw("Freeze params list must have 3 items")
173199 else {
174200 let launchpadId = getLaunchpadNextId()
175201 let launchpadIdStr = toString(launchpadId)
176- let $t053095384 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
177- let pmtAmount = $t053095384._1
178- let pmtAssetId = $t053095384._2
179- let $t053935466 = getAssetInfo(pmtAssetId)
180- let pmtStrAssetId = $t053935466._1
181- let pmtAssetName = $t053935466._2
182- let pmtDecimals = $t053935466._3
202+ let $t063356410 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
203+ let pmtAmount = $t063356410._1
204+ let pmtAssetId = $t063356410._2
205+ let $t064196492 = getAssetInfo(pmtAssetId)
206+ let pmtStrAssetId = $t064196492._1
207+ let pmtAssetName = $t064196492._2
208+ let pmtDecimals = $t064196492._3
183209 let freezeAdditionalEntry = if (freezeAdditionalToken)
184210 then [BooleanEntry((launchpadIdStr + keyFreezeAdditionalToken), true), StringEntry((launchpadIdStr + keyFreezeTokenId), freezeParams[0]), IntegerEntry((launchpadIdStr + keyFreezeTokenDuration), parseIntValue(freezeParams[1])), IntegerEntry((launchpadIdStr + keyFreezeTokenPerTicket), parseIntValue(freezeParams[2]))]
185211 else nil
186- ([IntegerEntry((pmtStrAssetId + "_launchpad"), launchpadId), IntegerEntry(keyLaunchpadNextId, (launchpadId + 1)), StringEntry((launchpadIdStr + keyAddress), projectAddress), IntegerEntry((launchpadIdStr + keyInitHeight), height), IntegerEntry((launchpadIdStr + keyStartHeight), startHeight), IntegerEntry((launchpadIdStr + keyDuration), lauchpadDuration), 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), IntegerEntry(keyLaunchpadActiveId, launchpadId), StringEntry(keyInitCaller, "")] ++ freezeAdditionalEntry)
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 + keyHighCompetitionComission), highCompetitionComission), 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 + keyHCAmount), highCompetitionTicketsAmount), IntegerEntry((launchpadIdStr + keyTokensPerAllocation), tokensPerAllocation), StringEntry((launchpadIdStr + keyClaimParams), makeString(claimParams, ",")), BooleanEntry((launchpadIdStr + keyHighCompetitionSale), HighCompetitionSale), IntegerEntry(keyLaunchpadActiveId, launchpadId), StringEntry(keyInitCaller, "")] ++ freezeAdditionalEntry)
187213 }
188214
189215
190216
191217 @Callable(i)
192218 func commitSwopfiSale (launchpadId,refId) = {
193- let $t075377612 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
194- let pmtAmount = $t075377612._1
195- let pmtAssetId = $t075377612._2
219+ let $t089929067 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
220+ let pmtAmount = $t089929067._1
221+ let pmtAssetId = $t089929067._2
222+ let $t090729222 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
223+ let buyAssetId = $t090729222._1
224+ let buyAssetStrId = $t090729222._2
225+ let buyAssetName = $t090729222._3
226+ let buyAssetDecimals = $t090729222._4
196227 let stakedSwops = valueOrElse(getInteger(governance, (toString(i.caller) + keyGovernanceStaked)), 0)
197228 let allowedTicketsAmountAll = (stakedSwops / getIntegerValue(this, (toString(launchpadId) + keySwopPerTicket)))
198229 let boughtTicketsAmount = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtTicketsAmount)), 0)
199230 let allowedTicketsAmount = (allowedTicketsAmountAll - boughtTicketsAmount)
200231 let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
201232 let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
202233 let freezeAdditionalToken = valueOrElse(getBoolean(this, (toString(launchpadId) + keyFreezeAdditionalToken)), false)
203234 if (!(isActive))
204235 then throw("DApp is inactive at this moment")
205236 else if ((activeLaunchpadId != launchpadId))
206237 then throw("There is no active launchpad or this launchpad is ended")
207238 else if ((startHeight > height))
208239 then throw("Launchpad sale not started yet")
209240 else if ((height > (startHeight + duration)))
210241 then throw("Launchpad sale ended")
211242 else if (if (!(freezeAdditionalToken))
212243 then if ((size(i.payments) != 1))
213244 then true
214- else (pmtAssetId != USDN)
245+ else (pmtAssetId != buyAssetId)
215246 else false)
216- then throw("One attached payment in USDN expected")
247+ then throw((("One attached payment in " + buyAssetName) + " expected"))
217248 else if (if (freezeAdditionalToken)
218249 then if ((size(i.payments) != 2))
219250 then true
220- else (pmtAssetId != USDN)
251+ else (pmtAssetId != buyAssetId)
221252 else false)
222253 then {
223254 let freezeTokenId = getStringValue(this, (toString(launchpadId) + keyFreezeTokenId))
224- throw(("Two attached payments expected: First in USDN, second in " + freezeTokenId))
255+ throw(((("Two attached payments expected: First in " + buyAssetName) + ", second in ") + freezeTokenId))
225256 }
226257 else if (if ((0 >= allowedTicketsAmountAll))
227258 then true
228259 else (0 >= allowedTicketsAmount))
229260 then throw("Not enought SWOP in staking to buy tickets")
230261 else {
231262 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
232263 let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
233- let tokenId = fromBase58String(getStringValue(this, (toString(launchpadId) + keyAssetId)))
234- let $t095549630 = getAssetInfo(tokenId)
235- let tokenStrAssetId = $t095549630._1
236- let tokenAssetName = $t095549630._2
237- let tokenDecimals = $t095549630._3
264+ let $t01111011254 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
265+ let tokenId = $t01111011254._1
266+ let tokenStrAssetId = $t01111011254._2
267+ let tokenAssetName = $t01111011254._3
268+ let tokenDecimals = $t01111011254._4
238269 let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
239270 let commissionPerTicket = fraction(ticketPrice, getIntegerValue(this, (toString(launchpadId) + keyComission)), 100)
240271 let buyTicketAmount = (pmtAmount / (ticketPrice + commissionPerTicket))
241272 let allowedBuyTicketAmount = min([buyTicketAmount, allowedTicketsAmount])
242273 let allowedBuyPriceWithComission = (allowedBuyTicketAmount * (ticketPrice + commissionPerTicket))
243274 let change = (pmtAmount - allowedBuyPriceWithComission)
244275 if ((buyTicketAmount == 0))
245- then throw("Not enought USDN to buy tickets")
276+ then throw((("Not enought " + buyAssetName) + " to buy tickets"))
246277 else if ((change != 0))
247- then throw((((("Wrong payment. To buy " + toString(allowedBuyTicketAmount)) + "tickets you need to pay ") + toString(allowedBuyPriceWithComission)) + "USDN"))
278+ then throw((((("Wrong payment. To buy " + toString(allowedBuyTicketAmount)) + "tickets you need to pay ") + toString(allowedBuyPriceWithComission)) + buyAssetName))
248279 else {
249280 let freezeAdditionalEntry = if (freezeAdditionalToken)
250281 then {
251282 let freezeTokenId = getStringValue(this, (toString(launchpadId) + keyFreezeTokenId))
252283 let freezeTokenPerTicket = getIntegerValue(this, (toString(launchpadId) + keyFreezeTokenPerTicket))
253- let $t01077210859 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
254- let pmtAmountFreeze = $t01077210859._1
255- let pmtAssetIdFreeze = $t01077210859._2
256- let $t01087610967 = getAssetInfo(pmtAssetId)
257- let pmtFreezeStrAssetId = $t01087610967._1
258- let pmtFreezeAssetName = $t01087610967._2
259- let pmtFreezeDecimals = $t01087610967._3
284+ let $t01241812505 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
285+ let pmtAmountFreeze = $t01241812505._1
286+ let pmtAssetIdFreeze = $t01241812505._2
287+ let $t01252212613 = getAssetInfo(pmtAssetId)
288+ let pmtFreezeStrAssetId = $t01252212613._1
289+ let pmtFreezeAssetName = $t01252212613._2
290+ let pmtFreezeDecimals = $t01252212613._3
260291 let needFreezeTokens = (freezeTokenPerTicket * buyTicketAmount)
261292 if (if ((pmtFreezeStrAssetId != freezeTokenId))
262293 then true
263294 else (needFreezeTokens != pmtAmountFreeze))
264295 then throw((((("You need to add " + toString(needFreezeTokens)) + " ") + pmtFreezeAssetName) + " as a second payment"))
265296 else [IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserFreezeToken), pmtAmountFreeze)]
266297 }
267298 else nil
268299 let userBoughtTicketsNumbers = valueOrElse(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserTickets)), "")
269300 let lastBoughtTicketNumber = getIntegerValue(this, (toString(launchpadId) + keyTicketLastNumber))
270301 let boughtRange = ((toString((lastBoughtTicketNumber + 1)) + "-") + toString((lastBoughtTicketNumber + allowedBuyTicketAmount)))
271302 let newUserBoughtTicketsNumbers = (userBoughtTicketsNumbers + (if ((userBoughtTicketsNumbers != ""))
272303 then ("," + boughtRange)
273304 else ("" + boughtRange)))
274- let inv = invoke(stakingUSDNAddress, "lockNeutrino", nil, [AttachedPayment(pmtAssetId, pmtAmount)])
305+ let inv = if ((buyAssetId == USDN))
306+ then invoke(stakingUSDNAddress, "lockNeutrino", nil, [AttachedPayment(pmtAssetId, pmtAmount)])
307+ else 0
275308 if ((inv == inv))
276309 then {
277310 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)
278311 if (!(isDefined(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId)))))
279312 then (baseEntry ++ [StringEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId), refId)])
280313 else baseEntry
281314 }
282315 else throw("Strict value is not equal to itself.")
283316 }
284317 }
285318 }
286319
287320
288321
289322 @Callable(i)
290323 func commitAccessListSale (launchpadId,refId) = {
291- let $t01295413029 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
292- let pmtAmount = $t01295413029._1
293- let pmtAssetId = $t01295413029._2
294- let userUsdnInMarketing = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserAmountUSDNInMarketing)), 0)
295- let usdnInMarketing = valueOrElse(getInteger(this, (toString(launchpadId) + keyAmountUSDNInMarketing)), 0)
324+ let $t01466014735 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
325+ let pmtAmount = $t01466014735._1
326+ let pmtAssetId = $t01466014735._2
327+ let $t01474014890 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
328+ let buyAssetId = $t01474014890._1
329+ let buyAssetStrId = $t01474014890._2
330+ let buyAssetName = $t01474014890._3
331+ let buyAssetDecimals = $t01474014890._4
332+ let userUsdnInMarketing = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserAmountBuyAssetInMarketing)), 0)
333+ let usdnInMarketing = valueOrElse(getInteger(this, (toString(launchpadId) + keyAmountBuyAssetInMarketing)), 0)
296334 let boughtAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtAllocations)), 0)
297335 let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
298336 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
299337 let tokensPerAllocation = getIntegerValue(this, (toString(launchpadId) + keyTokensPerAllocation))
300- let tokenId = fromBase58String(getStringValue(this, (toString(launchpadId) + keyAssetId)))
301- let $t01378413860 = getAssetInfo(tokenId)
302- let tokenStrAssetId = $t01378413860._1
303- let tokenAssetName = $t01378413860._2
304- let tokenDecimals = $t01378413860._3
338+ let $t01555915703 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
339+ let tokenId = $t01555915703._1
340+ let tokenStrAssetId = $t01555915703._2
341+ let tokenAssetName = $t01555915703._3
342+ let tokenDecimals = $t01555915703._4
305343 let allocationPriceWithComission = fraction(fraction(tokenPrice, tokensPerAllocation, pow(10, 0, tokenDecimals, 0, 0, DOWN)), (100 + commission), 100)
306344 let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
307345 let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
308346 if (!(isActive))
309347 then throw("DApp is inactive at this moment")
310348 else if ((activeLaunchpadId != launchpadId))
311349 then throw("There is no active launchpad or this launchpad is ended")
312350 else if ((startHeight > height))
313351 then throw("Launchpad sale not started yet")
314352 else if ((height > (startHeight + duration)))
315353 then throw("Launchpad sale ended")
316354 else if (if ((size(i.payments) != 1))
317355 then true
318- else (pmtAssetId != USDN))
319- then throw("One attached payment in USDN expected")
356+ else (pmtAssetId != buyAssetId))
357+ then throw((("One attached payment in " + buyAssetName) + " expected"))
320358 else if ((boughtAllocations >= maxAllocationsAmount))
321359 then throw((("You can buy only " + toString(maxAllocationsAmount)) + "allocations"))
322360 else if (if ((allocationPriceWithComission != pmtAmount))
323361 then ((allocationPriceWithComission * 2) != pmtAmount)
324362 else false)
325- then throw((("Wrong payment. You can buy 1 or 2 allocations for " + toString(allocationPriceWithComission)) + " USDN per allocation"))
363+ then throw(((("Wrong payment. You can buy 1 or 2 allocations for " + toString(allocationPriceWithComission)) + buyAssetName) + " per allocation"))
326364 else {
327365 let buyAllocationsAmount = (pmtAmount / allocationPriceWithComission)
328- let inv = invoke(stakingUSDNAddress, "lockNeutrino", nil, [AttachedPayment(pmtAssetId, pmtAmount)])
366+ let inv = if ((buyAssetId == USDN))
367+ then invoke(stakingUSDNAddress, "lockNeutrino", nil, [AttachedPayment(pmtAssetId, pmtAmount)])
368+ else 0
329369 if ((inv == inv))
330370 then {
331- let baseEntry = [IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtAllocations), (boughtAllocations + buyAllocationsAmount)), IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserAmountUSDNInMarketing), (userUsdnInMarketing + pmtAmount)), IntegerEntry((toString(launchpadId) + keyAmountUSDNInMarketing), (usdnInMarketing + pmtAmount))]
371+ 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))]
332372 if (!(isDefined(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId)))))
333373 then (baseEntry ++ [StringEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId), refId)])
334374 else baseEntry
335375 }
336376 else throw("Strict value is not equal to itself.")
337377 }
378+ }
379+
380+
381+
382+@Callable(i)
383+func commitHighCompetitionSale (launchpadId,refId) = {
384+ let $t01801218087 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
385+ let pmtAmount = $t01801218087._1
386+ let pmtAssetId = $t01801218087._2
387+ let $t01809218242 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
388+ let buyAssetId = $t01809218242._1
389+ let buyAssetStrId = $t01809218242._2
390+ let buyAssetName = $t01809218242._3
391+ let buyAssetDecimals = $t01809218242._4
392+ let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
393+ let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
394+ let boughtHCTicketsAmount = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserHCBoughtTicketsAmount)), 0)
395+ let highCompetitionSale = valueOrElse(getBoolean(this, (toString(launchpadId) + keyHighCompetitionSale)), false)
396+ if (!(isActive))
397+ then throw("DApp is inactive at this moment")
398+ else if ((activeLaunchpadId != launchpadId))
399+ then throw("There is no active launchpad or this launchpad is ended")
400+ else if (!(highCompetitionSale))
401+ then throw("There is no high competition sale for this launchpad")
402+ else if ((startHeight > height))
403+ then throw("Launchpad sale not started yet")
404+ else if ((height > (startHeight + duration)))
405+ then throw("Launchpad sale ended")
406+ else if (if ((size(i.payments) != 1))
407+ then true
408+ else (pmtAssetId != buyAssetId))
409+ then throw((("One attached payment in " + buyAssetName) + " expected"))
410+ else {
411+ let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
412+ let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
413+ let $t01949119635 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
414+ let tokenId = $t01949119635._1
415+ let tokenStrAssetId = $t01949119635._2
416+ let tokenAssetName = $t01949119635._3
417+ let tokenDecimals = $t01949119635._4
418+ let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
419+ let commissionPerTicket = fraction(ticketPrice, getIntegerValue(this, (toString(launchpadId) + keyHighCompetitionComission)), 100)
420+ let buyTicketAmount = (pmtAmount / (ticketPrice + commissionPerTicket))
421+ let buyPriceWithComission = (buyTicketAmount * (ticketPrice + commissionPerTicket))
422+ let change = (pmtAmount - buyPriceWithComission)
423+ if ((buyTicketAmount == 0))
424+ then throw((("Not enought " + buyAssetName) + " to buy tickets"))
425+ else if ((change != 0))
426+ then throw((((("Wrong payment. To buy " + toString(buyTicketAmount)) + "tickets you need to pay ") + toString(buyPriceWithComission)) + buyAssetName))
427+ else {
428+ let userBoughtTicketsNumbers = valueOrElse(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserHCTickets)), "")
429+ let lastBoughtTicketNumber = getIntegerValue(this, (toString(launchpadId) + keyHCTicketLastNumber))
430+ let boughtRange = ((toString((lastBoughtTicketNumber + 1)) + "-") + toString((lastBoughtTicketNumber + buyTicketAmount)))
431+ let newUserBoughtTicketsNumbers = (userBoughtTicketsNumbers + (if ((userBoughtTicketsNumbers != ""))
432+ then ("," + boughtRange)
433+ else ("" + boughtRange)))
434+ let inv = if ((buyAssetId == USDN))
435+ then invoke(stakingUSDNAddress, "lockNeutrino", nil, [AttachedPayment(pmtAssetId, pmtAmount)])
436+ else 0
437+ if ((inv == inv))
438+ then {
439+ 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)]
440+ if (!(isDefined(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId)))))
441+ then (baseEntry ++ [StringEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId), refId)])
442+ else baseEntry
443+ }
444+ else throw("Strict value is not equal to itself.")
445+ }
446+ }
338447 }
339448
340449
341450
342451 @Callable(i)
343452 func finalise (launchpadId,vrfHeight,secretWord) = {
344453 let savedHash = getStringValue(this, (toString(launchpadId) + keyVerifyHash))
345454 let calcHash = toBase58String(sha256((toBytes(vrfHeight) + toBytes(secretWord))))
346455 if (!(isActive))
347456 then throw("DApp is inactive at this moment")
348457 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
349458 then throw("Only admin can call this function")
350459 else if ((calcHash != savedHash))
351460 then throw("vrf Height hash not matching")
352461 else {
462+ let $t02242022570 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
463+ let buyAssetId = $t02242022570._1
464+ let buyAssetStrId = $t02242022570._2
465+ let buyAssetName = $t02242022570._3
466+ let buyAssetDecimals = $t02242022570._4
353467 let projectAddress = addressFromStringValue(getStringValue(this, (toString(launchpadId) + keyAddress)))
354468 let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
355- let transferedUsdn = valueOrElse(getInteger(this, (toString(launchpadId) + keyTransferUsd)), 0)
356- let swopfiMembersUsdnAmount = getIntegerValue(this, (toString(launchpadId) + keyTotalAmountUsdnSold))
357- let swopfiMembersComission = fraction(swopfiMembersUsdnAmount, commission, 100)
358- let totalAmountUsdnInMarketing = getIntegerValue(this, (toString(launchpadId) + keyAmountUSDNInMarketingFinalized))
359- let marketingComission = fraction(totalAmountUsdnInMarketing, commission, 100)
360- let unstakeAmount = (((swopfiMembersUsdnAmount + totalAmountUsdnInMarketing) + swopfiMembersComission) + marketingComission)
361- if ((transferedUsdn > (swopfiMembersUsdnAmount + totalAmountUsdnInMarketing)))
469+ let commissionHC = getIntegerValue(this, (toString(launchpadId) + keyHighCompetitionComission))
470+ let transferedBuyAsset = valueOrElse(getInteger(this, (toString(launchpadId) + keyTransferBuyAsset)), 0)
471+ let swopfiMembersBuyAssetAmount = getIntegerValue(this, (toString(launchpadId) + keyTotalAmountBuyAssetSold))
472+ let swopfiHCBuyAssetAmount = valueOrElse(getIntegerValue(this, (toString(launchpadId) + keyTotalAmountBuyAssetSoldHC)), 0)
473+ let swopfiMembersComission = fraction(swopfiMembersBuyAssetAmount, commission, 100)
474+ let swopfiHCComission = fraction(swopfiHCBuyAssetAmount, commissionHC, 100)
475+ let totalAmountBuyAssetInMarketing = getIntegerValue(this, (toString(launchpadId) + keyAmountBuyAssetInMarketingFinalized))
476+ let marketingComission = fraction(totalAmountBuyAssetInMarketing, commission, 100)
477+ let unstakeAmount = (((((swopfiMembersBuyAssetAmount + totalAmountBuyAssetInMarketing) + swopfiMembersComission) + marketingComission) + swopfiHCBuyAssetAmount) + swopfiHCComission)
478+ if ((transferedBuyAsset > (swopfiMembersBuyAssetAmount + totalAmountBuyAssetInMarketing)))
362479 then throw("Can't transfer negative value to project")
363480 else {
364- let inv = invoke(stakingUSDNAddress, "unlockNeutrino", [unstakeAmount, toBase58String(USDN)], nil)
481+ let inv = if ((buyAssetId == USDN))
482+ then invoke(stakingUSDNAddress, "unlockNeutrino", [unstakeAmount, toBase58String(USDN)], nil)
483+ else 0
365484 if ((inv == inv))
366- then [IntegerEntry((toString(launchpadId) + keyFinaliseHeight), height), ScriptTransfer(projectAddress, ((swopfiMembersUsdnAmount + totalAmountUsdnInMarketing) - transferedUsdn), USDN), ScriptTransfer(commissionWallet, (swopfiMembersComission + marketingComission), USDN)]
485+ then [IntegerEntry((toString(launchpadId) + keyFinaliseHeight), height), ScriptTransfer(projectAddress, ((swopfiMembersBuyAssetAmount + totalAmountBuyAssetInMarketing) - transferedBuyAsset), buyAssetId), ScriptTransfer(commissionWallet, ((swopfiMembersComission + marketingComission) + swopfiHCComission), buyAssetId)]
367486 else throw("Strict value is not equal to itself.")
368487 }
369488 }
370489 }
371490
372491
373492
374493 @Callable(i)
375494 func claim (launchpadId) = {
376495 let userClaimStatus = valueOrElse(getBoolean(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimStatus)), false)
377496 let boughtTickets = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtTicketsAmount)), 0)
378497 let boughtAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtAllocations)), 0)
379498 if (!(isActive))
380499 then throw("DApp is inactive at this moment")
381500 else if (!(isDefined(getInteger(this, (toString(launchpadId) + keyFinaliseHeight)))))
382501 then throw("You can't claim because results are not finalized")
383502 else if (userClaimStatus)
384503 then throw("You are already claimed")
385504 else if (if ((boughtTickets == 0))
386505 then (boughtAllocations == 0)
387506 else false)
388507 then throw("You can't claim because you don't buy anything")
389508 else {
390- let tokenId = fromBase58String(getStringValue(this, (toString(launchpadId) + keyAssetId)))
509+ let $t02542925579 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
510+ let buyAssetId = $t02542925579._1
511+ let buyAssetStrId = $t02542925579._2
512+ let buyAssetName = $t02542925579._3
513+ let buyAssetDecimals = $t02542925579._4
391514 let wonnedTickets = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserWinnedTicketsAmount)), 0)
392515 let awailableAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserAvailableAllocations)), 0)
393516 let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
394517 let allowedAllocations = min([boughtAllocations, awailableAllocations])
395518 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
396519 let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
397- let $t01963419710 = getAssetInfo(tokenId)
398- let tokenStrAssetId = $t01963419710._1
399- let tokenAssetName = $t01963419710._2
400- let tokenDecimals = $t01963419710._3
520+ let $t02622626370 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
521+ let tokenId = $t02622626370._1
522+ let tokenStrAssetId = $t02622626370._2
523+ let tokenAssetName = $t02622626370._3
524+ let tokenDecimals = $t02622626370._4
401525 let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
402526 let tokensPerAllocation = getIntegerValue(this, (toString(launchpadId) + keyTokensPerAllocation))
403527 let transferTokensAmount = ((wonnedTickets * tokensPerTicket) + (allowedAllocations * tokensPerAllocation))
404528 let notAllowedAllocationsTokens = ((boughtAllocations - allowedAllocations) * tokensPerAllocation)
405- let usdnForAllocations = fraction(fraction(notAllowedAllocationsTokens, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN)), (100 + commission), 100)
406- let usdnForUnwonnedTickets = fraction(((boughtTickets - wonnedTickets) * ticketPrice), (100 + commission), 100)
407- if (if ((0 > usdnForAllocations))
529+ let buyAssetForAllocations = fraction(fraction(notAllowedAllocationsTokens, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN)), (100 + commission), 100)
530+ let buyAssetForUnwonnedTickets = fraction(((boughtTickets - wonnedTickets) * ticketPrice), (100 + commission), 100)
531+ if (if ((0 > buyAssetForAllocations))
408532 then true
409- else (0 > usdnForUnwonnedTickets))
533+ else (0 > buyAssetForUnwonnedTickets))
410534 then throw("Error with allowed allocation param or wonned tickets param please contact support")
411535 else {
412- let returnedUsdnAmount = (usdnForAllocations + usdnForUnwonnedTickets)
413- let transferUsdn = if ((returnedUsdnAmount > 0))
414- then [ScriptTransfer(i.caller, returnedUsdnAmount, USDN)]
536+ let returnedBuyAssetAmount = (buyAssetForUnwonnedTickets + buyAssetForUnwonnedTickets)
537+ let transferUsdn = if ((returnedBuyAssetAmount > 0))
538+ then [ScriptTransfer(i.caller, returnedBuyAssetAmount, buyAssetId)]
415539 else nil
416540 let transferTokens = if ((transferTokensAmount > 0))
417541 then [ScriptTransfer(i.caller, transferTokensAmount, tokenId)]
418542 else nil
419- let inv = if ((returnedUsdnAmount > 0))
420- then invoke(stakingUSDNAddress, "unlockNeutrino", [returnedUsdnAmount, toBase58String(USDN)], nil)
543+ let inv = if (if ((returnedBuyAssetAmount > 0))
544+ then (buyAssetId == USDN)
545+ else false)
546+ then invoke(stakingUSDNAddress, "unlockNeutrino", [returnedBuyAssetAmount, toBase58String(USDN)], nil)
421547 else 0
422548 if ((inv == inv))
423549 then (([BooleanEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimStatus), true)] ++ transferTokens) ++ transferUsdn)
424550 else throw("Strict value is not equal to itself.")
425551 }
426552 }
427553 }
428554
429555
430556
431557 @Callable(i)
432558 func claimFreezeToken (launchpadId) = {
433559 let freezeAdditionalToken = valueOrElse(getBoolean(this, (toString(launchpadId) + keyFreezeAdditionalToken)), false)
434560 if (!(isActive))
435561 then throw("DApp is inactive at this moment")
436562 else if (!(isDefined(getInteger(this, (toString(launchpadId) + keyFinaliseHeight)))))
437563 then throw("You can't claim because results are not finalized")
438564 else if (!(freezeAdditionalToken))
439565 then throw("There are no additional token freezing for this launchpad")
440566 else {
441567 let tokenId = fromBase58String(getStringValue(this, (toString(launchpadId) + keyFreezeTokenId)))
442568 let userTokensFreezed = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserFreezeToken)), 0)
443569 let startHeight = valueOrElse(getInteger(this, (toString(launchpadId) + keyStartHeight)), 0)
444570 let duration = valueOrElse(getInteger(this, (toString(launchpadId) + keyDuration)), 0)
445571 let freezeTokenDuration = getIntegerValue(this, (toString(launchpadId) + keyFreezeTokenDuration))
446572 let blockEndHeight = ((startHeight + duration) + freezeTokenDuration)
447573 if ((userTokensFreezed == 0))
448574 then throw("You are already claimed your tokens or not paid anything")
449575 else if ((blockEndHeight > height))
450576 then throw(("Your tokens freezed teel " + toString(blockEndHeight)))
451577 else [ScriptTransfer(i.caller, userTokensFreezed, tokenId), IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserFreezeToken), 0)]
452578 }
453579 }
454580
455581
456582
457583 @Callable(i)
458-func transferUsd (launchpadId,amountUsdn) = if (!(isActive))
584+func transferBuyAsset (launchpadId,amount) = if (!(isActive))
459585 then throw("DApp is inactive")
460586 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
461587 then throw("Only admin can call this function")
462588 else {
463589 let projectAddress = addressFromStringValue(getStringValue(this, (toString(launchpadId) + keyAddress)))
464-[IntegerEntry((toString(launchpadId) + keyTransferUsd), amountUsdn), ScriptTransfer(projectAddress, amountUsdn, USDN)]
590+ let $t03004230192 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
591+ let buyAssetId = $t03004230192._1
592+ let buyAssetStrId = $t03004230192._2
593+ let buyAssetName = $t03004230192._3
594+ let buyAssetDecimals = $t03004230192._4
595+[IntegerEntry((toString(launchpadId) + keyTransferBuyAsset), amount), ScriptTransfer(projectAddress, amount, buyAssetId)]
465596 }
466597
467598
468599
469600 @Callable(i)
470601 func shutdown () = if (!(isActive))
471602 then throw("DApp already inactive")
472603 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
473604 then throw("Only admin can call this function")
474605 else [BooleanEntry(keyActive, false)]
475606
476607
477608
478609 @Callable(i)
479610 func activate () = if (isActive)
480611 then throw("DApp already active")
481612 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
482613 then throw("Only admin can call this function")
483614 else [BooleanEntry(keyActive, true)]
484615
485616
486617 @Verifier(tx)
487618 func verify () = {
488619 let multiSignedByAdmins = {
489620 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
490621 then 1
491622 else 0
492623 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
493624 then 1
494625 else 0
495626 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
496627 then 1
497628 else 0
498629 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
499630 }
500631 let signedByAdmin = if (if (if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
501632 then true
502633 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey2))
503634 then true
504635 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey3))
505636 then true
506637 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKeyStaking)
507638 match tx {
508639 case dtx: DataTransaction =>
509640 if (valueOrElse(getBoolean(oracle, keyLaunchpadDataTransactionStatus), false))
510641 then signedByAdmin
511642 else false
512643 case _ =>
513644 multiSignedByAdmins
514645 }
515646 }
516647

github/deemru/w8io/873ac7e 
140.52 ms