tx · 7K6iXKEfk8RBPq9UtDa8F1z3uBBPk3jyboN4R91XzEJC

3MwkjgDrsm5k73WJU9Nbxbx4y2iy3zjQzMi:  -0.01400000 Waves

2021.12.17 18:51 [1838459] smart account 3MwkjgDrsm5k73WJU9Nbxbx4y2iy3zjQzMi > SELF 0.00000000 Waves

{ "type": 13, "id": "7K6iXKEfk8RBPq9UtDa8F1z3uBBPk3jyboN4R91XzEJC", "fee": 1400000, "feeAssetId": null, "timestamp": 1639756288014, "version": 2, "chainId": 84, "sender": "3MwkjgDrsm5k73WJU9Nbxbx4y2iy3zjQzMi", "senderPublicKey": "FRotxVW1MhTQRDvVbMM4yvYGWzBFvHqvMsonvGeEXQUy", "proofs": [ "5EL7hQgQc9xP6xQynvNvdEYPqiJcbjtt1qHywZsRpz154YCeAgJeHHb87b36HG8N3HrioYbALE3RMGFsLeQNu2fu", "66vDSibV8DFPKv6LQVZHUWdaX6QTLBz87Sx3RuKn5H1HJ3nwHQLQ4RHpUfyFLiYNs1cPasF1bSNxsLtukAeR6VqA" ], "script": "base64:AAIFAAAAAAAAFEMIAhIECgIBCBIDCgEIEhQKEggBAQgBAQEBAQEBARgEAQEEGBIECgIBCBIECgIBCBIECgIBCBIFCgMBAQgSAwoBARIDCgEBEgQKAgEBEgASABoQCgFBEgtrZXlEdXJhdGlvbhohCgFCEhxrZXlBbW91bnRCdXlBc3NldEluTWFya2V0aW5nGioKAUMSJWtleUFtb3VudEJ1eUFzc2V0SW5NYXJrZXRpbmdGaW5hbGl6ZWQaGAoBRBITa2V5VHJhbnNmZXJCdXlBc3NldBoZCgFFEhRrZXlGcmVlelN3b3BEdXJhdGlvbhodCgFGEhhrZXlGcmVlemVBZGRpdGlvbmFsVG9rZW4aFQoBRxIQa2V5RnJlZXplVG9rZW5JZBobCgFIEhZrZXlGcmVlemVUb2tlbkR1cmF0aW9uGhwKAUkSF2tleUZyZWV6ZVRva2VuUGVyVGlja2V0GhAKAUoSC2tleUJ1eVRva2VuGhMKAUsSDmtleUNsYWltUGFyYW1zGiAKAUwSG2tleUhpZ2hDb21wZXRpdGlvbkNvbWlzc2lvbhobCgFNEhZrZXlIaWdoQ29tcGV0aXRpb25TYWxlGhoKAU4SFWtleUhDVGlja2V0TGFzdE51bWJlchodCgFPEhhrZXlIaWdoQ29tcGV0aXRpb25BbW91bnQaIQoBUBIca2V5VG90YWxBbW91bnRCdXlBc3NldFNvbGRIQxoZCgFREhRrZXlVc2VyQ2xhaW1lZFRva2VucxocCgFSEhdrZXlVc2VyQ2xhaW1lZEJ1eVRva2VucxofCgFTEhprZXlVc2VyQm91Z2h0VGlja2V0c0Ftb3VudBoTCgFUEg5rZXlVc2VyVGlja2V0cxoVCgFVEhBrZXlVc2VySENUaWNrZXRzGiEKAVYSHGtleVVzZXJIQ0JvdWdodFRpY2tldHNBbW91bnQaIAoBVxIba2V5VXNlckF2YWlsYWJsZUFsbG9jYXRpb25zGiUKAVgSIGtleVVzZXJBbW91bnRCdXlBc3NldEluTWFya2V0aW5nGh0KAVkSGGtleVVzZXJCb3VnaHRBbGxvY2F0aW9ucxoXCgFaEhJrZXlVc2VyQ2xhaW1TdGF0dXMaDgoBYRIJa2V5QWN0aXZlGhwKAmFBEhZnZXRBc3NldEluZm9Gcm9tU3RyaW5nGg4KAmFCEghhc3NldFN0choHCgJhQxIBaRoRCgJhRBILbGF1bmNocGFkSWQaCgoCYUUSBGhhc2gaDQoCYUYSB2FkZHJlc3MaFAoCYUcSDnByb2plY3RBZGRyZXNzGhEKAmFIEgtzdGFydEhlaWdodBoOCgJhSRIIZHVyYXRpb24aDgoCYUoSCGJ1eVRva2VuGhAKAmFLEgpjb21taXNzaW9uGhUKAmFMEg90b2tlbnNQZXJUaWNrZXQaEwoCYU0SDXByaWNlUGVyVG9rZW4aGQoCYU4SE3N3b3BmaVRpY2tldHNBbW91bnQaGgoCYU8SFGNhbXBhaWduVG9rZW5zQW1vdW50GhkKAmFQEhN0b2tlbnNQZXJBbGxvY2F0aW9uGhMKAmFREg1zd29wUGVyVGlja2V0GhgKAmFSEhJzd29wRnJlZXplRHVyYXRpb24aEQoCYVMSC2NsYWltUGFyYW1zGhkKAmFUEhNIaWdoQ29tcGV0aXRpb25TYWxlGh4KAmFVEhhoaWdoQ29tcGV0aXRpb25Db21pc3Npb24aIgoCYVYSHGhpZ2hDb21wZXRpdGlvblRpY2tldHNBbW91bnQaGwoCYVcSFWZyZWV6ZUFkZGl0aW9uYWxUb2tlbhoSCgJhWBIMZnJlZXplUGFyYW1zGhQKAmFZEg5sYXVuY2hwYWRJZFN0choRCgJhWhILJHQwNjU0ODY2MjMaIAoCYWESGmtleVVzZXJXaW5uZWRUaWNrZXRzQW1vdW50GhgKAmFiEhJrZXlVc2VyRnJlZXplVG9rZW4aDAoCYWMSBm9yYWNsZRoQCgJhZBIKZ292ZXJuYW5jZRoWCgJhZRIQY29tbWlzc2lvbldhbGxldBoYCgJhZhISc3Rha2luZ1VTRE5BZGRyZXNzGgoKAmFnEgRVU0ROGhgKAmFoEhJhZG1pblB1YktleVN0YWtpbmcaGgoCYWkSFG1heEFsbG9jYXRpb25zQW1vdW50Gg4KAmFqEghpc0FjdGl2ZRoXCgJhaxIRYWN0aXZlTGF1bmNocGFkSWQaEQoCYWwSC2dldEFkbWluUHViGhEKAmFtEgtrZXlBZG1pblB1YhoNCgJhbhIHJG1hdGNoMBoMCgJhbxIGc3RyaW5nGg0KAmFwEgdub3RoaW5nGhIKAmFxEgxhZG1pblB1YktleTEaEgoCYXISDGFkbWluUHViS2V5MhoSCgJhcxIMYWRtaW5QdWJLZXkzGhIKAmF0EgxnZXRBc3NldEluZm8aDQoCYXUSB2Fzc2V0SWQaCAoCYXYSAmlkGg4KAmF3EghzdHJpbmdJZBoKCgJheBIEaW5mbxoLCgJheRIFd2F2ZXMaGAoCYXoSEmdldExhdW5jaHBhZE5leHRJZBoUCgFiEg9rZXlBZG1pblB1YktleTEaGQoCYkESE2NvbW1pc3Npb25QZXJUaWNrZXQaFQoCYkISD2J1eVRpY2tldEFtb3VudBocCgJiQxIWYWxsb3dlZEJ1eVRpY2tldEFtb3VudBoiCgJiRBIcYWxsb3dlZEJ1eVByaWNlV2l0aENvbWlzc2lvbhoMCgJiRRIGY2hhbmdlGhoKAmJGEhRmcmVlemVUb2tlblBlclRpY2tldBoTCgJiRxINJHQwMTI3MTMxMjgwMBoVCgJiSBIPcG10QW1vdW50RnJlZXplGhYKAmJJEhBwbXRBc3NldElkRnJlZXplGhMKAmJKEg0kdDAxMjgxNzEyOTA4GhkKAmJLEhNwbXRGcmVlemVTdHJBc3NldElkGhgKAmJMEhJwbXRGcmVlemVBc3NldE5hbWUaFwoCYk0SEXBtdEZyZWV6ZURlY2ltYWxzGhYKAmJOEhBuZWVkRnJlZXplVG9rZW5zGh4KAmJPEhh1c2VyQm91Z2h0VGlja2V0c051bWJlcnMaHAoCYlASFmxhc3RCb3VnaHRUaWNrZXROdW1iZXIaEQoCYlESC2JvdWdodFJhbmdlGiEKAmJSEhtuZXdVc2VyQm91Z2h0VGlja2V0c051bWJlcnMaCQoCYlMSA2ludhoPCgJiVBIJYmFzZUVudHJ5GhMKAmJVEg0kdDAxNDk1NTE1MDMwGhMKAmJWEg0kdDAxNTAzNTE1MTg1GhkKAmJXEhN1c2VyVXNkbkluTWFya2V0aW5nGhUKAmJYEg91c2RuSW5NYXJrZXRpbmcaFwoCYlkSEWJvdWdodEFsbG9jYXRpb25zGhMKAmJaEg0kdDAxNTg1NDE1OTk4Gg8KAmJhEglwbXRBbW91bnQaEAoCYmISCnBtdEFzc2V0SWQaEQoCYmMSCyR0MDY2MzI2NzA1GhMKAmJkEg1wbXRTdHJBc3NldElkGhIKAmJlEgxwbXRBc3NldE5hbWUaEQoCYmYSC3BtdERlY2ltYWxzGhsKAmJnEhVmcmVlemVBZGRpdGlvbmFsRW50cnkaCwoCYmgSBXJlZklkGhEKAmJpEgskdDA5Mjg3OTM2MhoRCgJiahILJHQwOTM2Nzk1MTcaEAoCYmsSCmJ1eUFzc2V0SWQaEwoCYmwSDWJ1eUFzc2V0U3RySWQaEgoCYm0SDGJ1eUFzc2V0TmFtZRoWCgJibhIQYnV5QXNzZXREZWNpbWFscxoRCgJibxILc3Rha2VkU3dvcHMaHQoCYnASF2FsbG93ZWRUaWNrZXRzQW1vdW50QWxsGhkKAmJxEhNib3VnaHRUaWNrZXRzQW1vdW50GhoKAmJyEhRhbGxvd2VkVGlja2V0c0Ftb3VudBoTCgJicxINZnJlZXplVG9rZW5JZBoQCgJidBIKdG9rZW5QcmljZRoTCgJidRINJHQwMTE0MDUxMTU0ORoNCgJidhIHdG9rZW5JZBoVCgJidxIPdG9rZW5TdHJBc3NldElkGhQKAmJ4Eg50b2tlbkFzc2V0TmFtZRoTCgJieRINdG9rZW5EZWNpbWFscxoRCgJiehILdGlja2V0UHJpY2UaFAoBYxIPa2V5QWRtaW5QdWJLZXkyGhMKAmNBEg0kdDAyNTkzNTI2MDg1GhMKAmNCEg13b25uZWRUaWNrZXRzGhUKAmNDEg93b25uZWRIQ1RpY2tldHMaGgoCY0QSFGF3YWlsYWJsZUFsbG9jYXRpb25zGhgKAmNFEhJhbGxvd2VkQWxsb2NhdGlvbnMaEwoCY0YSDSR0MDI2ODc0MjcwMTgaGgoCY0cSFHRyYW5zZmVyVG9rZW5zQW1vdW50GiEKAmNIEhtub3RBbGxvd2VkQWxsb2NhdGlvbnNUb2tlbnMaHAoCY0kSFmJ1eUFzc2V0Rm9yQWxsb2NhdGlvbnMaIAoCY0oSGmJ1eUFzc2V0Rm9yVW53b25uZWRUaWNrZXRzGiIKAmNLEhxidXlBc3NldEZvckhDVW53b25uZWRUaWNrZXRzGhUKAmNMEg9jbGFpbWVkQnV5VG9rZW4aHAoCY00SFnJldHVybmVkQnV5QXNzZXRBbW91bnQaFgoCY04SEHRyYW5zZmVyQnV5QXNzZXQaEwoCY08SDWNsYWltZWRQYXJhbXMaFAoCY1ASDnRyYW5zZmVyVG9rZW5zGhMKAmNREg1jbGFpbWVkVG9rZW5zGhEKAmNSEgtzdGFydEFtb3VudBoSCgJjUxIMdW5sb2NrUGVyaW9kGhEKAmNUEgtibG9ja0hlaWdodBoSCgJjVRIMdW5sb2NrSGVpZ2h0GhkKAmNWEhNhbGxvd2VkVG9rZW5zQW1vdW50GhYKAmNXEhBjbGFpbVN0YXR1c0VudHJ5GhcKAmNYEhF1c2VyVG9rZW5zRnJlZXplZBoZCgJjWRITZnJlZXplVG9rZW5EdXJhdGlvbhoUCgJjWhIOYmxvY2tFbmRIZWlnaHQaIgoCY2ESHGFsbG9jYXRpb25QcmljZVdpdGhDb21pc3Npb24aGgoCY2ISFGJ1eUFsbG9jYXRpb25zQW1vdW50GhMKAmNjEg0kdDAxODMwNzE4MzgyGhMKAmNkEg0kdDAxODM4NzE4NTM3GhsKAmNlEhVib3VnaHRIQ1RpY2tldHNBbW91bnQaGQoCY2YSE2hpZ2hDb21wZXRpdGlvblNhbGUaEwoCY2cSDSR0MDE5Nzg2MTk5MzAaGwoCY2gSFWJ1eVByaWNlV2l0aENvbWlzc2lvbhoPCgJjaRIJdnJmSGVpZ2h0GhAKAmNqEgpzZWNyZXRXb3JkGg8KAmNrEglzYXZlZEhhc2gaDgoCY2wSCGNhbGNIYXNoGhMKAmNtEg0kdDAyMjcxNTIyODY1GhIKAmNuEgxjb21taXNzaW9uSEMaGAoCY28SEnRyYW5zZmVyZWRCdXlBc3NldBohCgJjcBIbc3dvcGZpTWVtYmVyc0J1eUFzc2V0QW1vdW50GhwKAmNxEhZzd29wZmlIQ0J1eUFzc2V0QW1vdW50GhwKAmNyEhZzd29wZmlNZW1iZXJzQ29taXNzaW9uGhcKAmNzEhFzd29wZmlIQ0NvbWlzc2lvbhokCgJjdBIedG90YWxBbW91bnRCdXlBc3NldEluTWFya2V0aW5nGhgKAmN1EhJtYXJrZXRpbmdDb21pc3Npb24aEwoCY3YSDXVuc3Rha2VBbW91bnQaEwoCY3cSDWJvdWdodFRpY2tldHMaFQoCY3gSD2JvdWdodEhDVGlja2V0cxoVCgJjeRIPdXNlckNsYWltU3RhdHVzGhQKAmN6Eg5maW5hbGl6ZUhlaWdodBoUCgFkEg9rZXlBZG1pblB1YktleTMaDAoCZGESBmFtb3VudBoTCgJkYhINJHQwMzM0MTQzMzU2NBoICgJkYxICdHgaDAoCZGQSBnZlcmlmeRoZCgJkZRITbXVsdGlTaWduZWRCeUFkbWlucxoYCgJkZhISYWRtaW5QdWJLZXkxU2lnbmVkGhgKAmRnEhJhZG1pblB1YktleTJTaWduZWQaGAoCZGgSEmFkbWluUHViS2V5M1NpZ25lZBoTCgJkaRINc2lnbmVkQnlBZG1pbhoJCgJkahIDZHR4GiYKAWUSIWtleUxhdW5jaHBhZERhdGFUcmFuc2FjdGlvblN0YXR1cxoXCgFmEhJrZXlMYXVuY2hwYWROZXh0SWQaGQoBZxIUa2V5TGF1bmNocGFkQWN0aXZlSWQaEgoBaBINa2V5SW5pdENhbGxlchoPCgFpEgprZXlBZGRyZXNzGhIKAWoSDWtleUluaXRIZWlnaHQaEwoBaxIOa2V5U3RhcnRIZWlnaHQaFgoBbBIRa2V5RmluYWxpc2VIZWlnaHQaEQoBbRIMa2V5Q29taXNzaW9uGg8KAW4SCmtleUFzc2V0SWQaGAoBbxITa2V5VG90YWxUb2tlbkFtb3VudBofCgFwEhprZXlUb3RhbEFtb3VudEJ1eUFzc2V0U29sZBoXCgFxEhJrZXlUb2tlbnNQZXJUaWNrZXQaFQoBchIQa2V5UHJpY2VQZXJUb2tlbhoVCgFzEhBrZXlTd29wUGVyVGlja2V0GhsKAXQSFmtleVN3b3BmaVRpY2tldHNBbW91bnQaHAoBdRIXa2V5Q2FtcGFpZ25Ub2tlbnNBbW91bnQaGwoBdhIWa2V5VG9rZW5zUGVyQWxsb2NhdGlvbhoYCgF3EhNrZXlUaWNrZXRMYXN0TnVtYmVyGhgKAXgSE2tleUdvdmVybmFuY2VTdGFrZWQaEQoBeRIMa2V5VXNlclJlZklkGhIKAXoSDWtleVZlcmlmeUhhc2gAAABGAAAAAAFhAgAAAAZhY3RpdmUAAAAAAWICAAAAC2FkbWluX3B1Yl8xAAAAAAFjAgAAAAthZG1pbl9wdWJfMgAAAAABZAIAAAALYWRtaW5fcHViXzMAAAAAAWUCAAAAIWxhdW5jaHBhZF9kYXRhX3RyYW5zYWN0aW9uX3N0YXR1cwAAAAABZgIAAAARbGF1bmNocGFkX25leHRfaWQAAAAAAWcCAAAAE2xhdW5jaHBhZF9hY3RpdmVfaWQAAAAAAWgCAAAAC2luaXRfY2FsbGVyAAAAAAFpAgAAAAhfYWRkcmVzcwAAAAABagIAAAAMX2luaXRfaGVpZ2h0AAAAAAFrAgAAAA1fc3RhcnRfaGVpZ2h0AAAAAAFsAgAAABBfZmluYWxpc2VfaGVpZ2h0AAAAAAFtAgAAAApfY29taXNzaW9uAAAAAAFuAgAAAAlfYXNzZXRfaWQAAAAAAW8CAAAAE190b3RhbF90b2tlbl9hbW91bnQAAAAAAXACAAAAFV90b3RhbF9idXlfYXNzZXRfc29sZAAAAAABcQIAAAASX3Rva2Vuc19wZXJfdGlja2V0AAAAAAFyAgAAABBfcHJpY2VfcGVyX3Rva2VuAAAAAAFzAgAAABBfc3dvcF9wZXJfdGlja2V0AAAAAAF0AgAAABdfdGlja2V0c19zd29wZmlfbWVtYmVycwAAAAABdQIAAAATX3Rva2Vuc19hY2Nlc3NfbGlzdAAAAAABdgIAAAAWX3Rva2Vuc19wZXJfYWxsb2NhdGlvbgAAAAABdwIAAAAkX3RpY2tldF9sYXN0X251bWJlcl9oaWdoX2NvbXBldGl0aW9uAAAAAAF4AgAAAAxfU1dPUF9hbW91bnQAAAAAAXkCAAAAB19yZWZfaWQAAAAAAXoCAAAADF92ZXJpZnlfaGFzaAAAAAABQQIAAAAJX2R1cmF0aW9uAAAAAAFCAgAAACdfdG90YWxfcHVyY2hhc2VkX2J1eV9hc3NldF9pbl9tYXJrZXRpbmcAAAAAAUMCAAAAMV90b3RhbF9wdXJjaGFzZWRfYnV5X2Fzc2V0X2luX21hcmtldGluZ19maW5hbGl6ZWQAAAAAAUQCAAAAE190cmFuc2Zlcl9idXlfYXNzZXQAAAAAAUUCAAAAFV9mcmVlemVfc3dvcF9kdXJhdGlvbgAAAAABRgIAAAAYX2ZyZWV6ZV9hZGRpdGlvbmFsX3Rva2VuAAAAAAFHAgAAABBfZnJlZXplX3Rva2VuX2lkAAAAAAFIAgAAABZfZnJlZXplX3Rva2VuX2R1cmF0aW9uAAAAAAFJAgAAABhfZnJlZXplX3Rva2VuX3Blcl90aWNrZXQAAAAAAUoCAAAACl9idXlfdG9rZW4AAAAAAUsCAAAADV9jbGFpbV9wYXJhbXMAAAAAAUwCAAAAG19oaWdoX2NvbXBldGl0aW9uX2NvbWlzc2lv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", "height": 1838459, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: DY7MKkABKfTiV8XzFkqjR1RNnAw25S7FwSQnrGPjGaHq Next: none Diff:
OldNewDifferences
2727
2828 let keyComission = "_comission"
2929
30-let keyHighCompetitionComission = "_high_competition_comission"
31-
3230 let keyAssetId = "_asset_id"
3331
3432 let keyTotalTokenAmount = "_total_token_amount"
3533
3634 let keyTotalAmountBuyAssetSold = "_total_buy_asset_sold"
37-
38-let keyTotalAmountBuyAssetSoldHC = "_total_buy_asset_sold_high_competition"
3935
4036 let keyTokensPerTicket = "_tokens_per_ticket"
4137
4541
4642 let keySwopfiTicketsAmount = "_tickets_swopfi_members"
4743
48-let keyHCAmount = "_tickets_high_competition"
49-
5044 let keyCampaignTokensAmount = "_tokens_access_list"
5145
5246 let keyTokensPerAllocation = "_tokens_per_allocation"
5347
5448 let keyTicketLastNumber = "_ticket_last_number_high_competition"
55-
56-let keyHCTicketLastNumber = "_ticket_last_number"
5749
5850 let keyGovernanceStaked = "_SWOP_amount"
5951
7163
7264 let keyFreezSwopDuration = "_freeze_swop_duration"
7365
74-let keyHighCompetitionSale = "_high_competition_sale"
75-
7666 let keyFreezeAdditionalToken = "_freeze_additional_token"
7767
7868 let keyFreezeTokenId = "_freeze_token_id"
8575
8676 let keyClaimParams = "_claim_params"
8777
78+let keyHighCompetitionComission = "_high_competition_comission"
79+
80+let keyHighCompetitionSale = "_high_competition_sale"
81+
82+let keyHCTicketLastNumber = "_high_competition_ticket_last_number"
83+
84+let keyHighCompetitionAmount = "_tickets_high_competition"
85+
86+let keyTotalAmountBuyAssetSoldHC = "_total_buy_asset_sold_high_competition"
87+
88+let keyUserClaimedTokens = "_claimed_tokens"
89+
90+let keyUserClaimedBuyTokens = "_claimed_buy_tokens"
91+
8892 let keyUserBoughtTicketsAmount = "_bought_tickets"
89-
90-let keyUserHCBoughtTicketsAmount = "_bought_tickets_high_competition"
9193
9294 let keyUserTickets = "_tickets_number"
9395
9496 let keyUserHCTickets = "_tickets_number_high_competition"
97+
98+let keyUserHCBoughtTicketsAmount = "_bought_tickets_high_competition"
9599
96100 let keyUserAvailableAllocations = "_available_purchase_marketing"
97101
105109
106110 let keyUserFreezeToken = "_freeze_token_amount"
107111
108-let oracle = Address(base58'3NBBWfzZtZtszaXbitTKnrB2xXwv26Bn7H9')
112+let oracle = Address(base58'3PEbqViERCoKnmcSULh6n2aiMvUdSQdCsom')
109113
110-let governance = Address(base58'3N5W8da2iiijVieA6qLGo7KzCJj8B19smWU')
114+let governance = Address(base58'3PLHVWCqA9DJPDbadUofTohnCULLauiDWhS')
111115
112116 let commissionWallet = Address(base58'3PGYafJ2GuqPckmZNywet8moiPnBHz51Xdg')
113117
150154
151155
152156 func getLaunchpadNextId () = valueOrElse(getInteger(this, keyLaunchpadNextId), 1)
153-
154-
155-func stakedUsdnAmount () = valueOrElse(getInteger(stakingUSDNAddress, ((("rpd_balance_" + toBase58String(USDN)) + "_") + toString(this))), 0)
156157
157158
158159 func getAssetInfoFromString (assetStr) = if ((assetStr == "WAVES"))
199200 else {
200201 let launchpadId = getLaunchpadNextId()
201202 let launchpadIdStr = toString(launchpadId)
202- let $t063366411 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
203- let pmtAmount = $t063366411._1
204- let pmtAssetId = $t063366411._2
205- let $t064206493 = getAssetInfo(pmtAssetId)
206- let pmtStrAssetId = $t064206493._1
207- let pmtAssetName = $t064206493._2
208- let pmtDecimals = $t064206493._3
203+ let $t065486623 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
204+ let pmtAmount = $t065486623._1
205+ let pmtAssetId = $t065486623._2
206+ let $t066326705 = getAssetInfo(pmtAssetId)
207+ let pmtStrAssetId = $t066326705._1
208+ let pmtAssetName = $t066326705._2
209+ let pmtDecimals = $t066326705._3
209210 let freezeAdditionalEntry = if (freezeAdditionalToken)
210211 then [BooleanEntry((launchpadIdStr + keyFreezeAdditionalToken), true), StringEntry((launchpadIdStr + keyFreezeTokenId), freezeParams[0]), IntegerEntry((launchpadIdStr + keyFreezeTokenDuration), parseIntValue(freezeParams[1])), IntegerEntry((launchpadIdStr + keyFreezeTokenPerTicket), parseIntValue(freezeParams[2]))]
211212 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 + 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)
213+ ([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 + keyHCTicketLastNumber), 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)
213214 }
214215
215216
216217
217218 @Callable(i)
218219 func commitSwopfiSale (launchpadId,refId) = {
219- let $t089939068 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
220- let pmtAmount = $t089939068._1
221- let pmtAssetId = $t089939068._2
222- let $t090739223 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
223- let buyAssetId = $t090739223._1
224- let buyAssetStrId = $t090739223._2
225- let buyAssetName = $t090739223._3
226- let buyAssetDecimals = $t090739223._4
220+ let $t092879362 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
221+ let pmtAmount = $t092879362._1
222+ let pmtAssetId = $t092879362._2
223+ let $t093679517 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
224+ let buyAssetId = $t093679517._1
225+ let buyAssetStrId = $t093679517._2
226+ let buyAssetName = $t093679517._3
227+ let buyAssetDecimals = $t093679517._4
227228 let stakedSwops = valueOrElse(getInteger(governance, (toString(i.caller) + keyGovernanceStaked)), 0)
228229 let allowedTicketsAmountAll = (stakedSwops / getIntegerValue(this, (toString(launchpadId) + keySwopPerTicket)))
229230 let boughtTicketsAmount = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtTicketsAmount)), 0)
261262 else {
262263 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
263264 let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
264- let $t01111111255 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
265- let tokenId = $t01111111255._1
266- let tokenStrAssetId = $t01111111255._2
267- let tokenAssetName = $t01111111255._3
268- let tokenDecimals = $t01111111255._4
265+ let $t01140511549 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
266+ let tokenId = $t01140511549._1
267+ let tokenStrAssetId = $t01140511549._2
268+ let tokenAssetName = $t01140511549._3
269+ let tokenDecimals = $t01140511549._4
269270 let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
270271 let commissionPerTicket = fraction(ticketPrice, getIntegerValue(this, (toString(launchpadId) + keyComission)), 100)
271272 let buyTicketAmount = (pmtAmount / (ticketPrice + commissionPerTicket))
281282 then {
282283 let freezeTokenId = getStringValue(this, (toString(launchpadId) + keyFreezeTokenId))
283284 let freezeTokenPerTicket = getIntegerValue(this, (toString(launchpadId) + keyFreezeTokenPerTicket))
284- let $t01241912506 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
285- let pmtAmountFreeze = $t01241912506._1
286- let pmtAssetIdFreeze = $t01241912506._2
287- let $t01252312614 = getAssetInfo(pmtAssetId)
288- let pmtFreezeStrAssetId = $t01252312614._1
289- let pmtFreezeAssetName = $t01252312614._2
290- let pmtFreezeDecimals = $t01252312614._3
285+ let $t01271312800 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
286+ let pmtAmountFreeze = $t01271312800._1
287+ let pmtAssetIdFreeze = $t01271312800._2
288+ let $t01281712908 = getAssetInfo(pmtAssetId)
289+ let pmtFreezeStrAssetId = $t01281712908._1
290+ let pmtFreezeAssetName = $t01281712908._2
291+ let pmtFreezeDecimals = $t01281712908._3
291292 let needFreezeTokens = (freezeTokenPerTicket * buyTicketAmount)
292293 if (if ((pmtFreezeStrAssetId != freezeTokenId))
293294 then true
321322
322323 @Callable(i)
323324 func commitAccessListSale (launchpadId,refId) = {
324- let $t01466114736 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
325- let pmtAmount = $t01466114736._1
326- let pmtAssetId = $t01466114736._2
327- let $t01474114891 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
328- let buyAssetId = $t01474114891._1
329- let buyAssetStrId = $t01474114891._2
330- let buyAssetName = $t01474114891._3
331- let buyAssetDecimals = $t01474114891._4
325+ let $t01495515030 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
326+ let pmtAmount = $t01495515030._1
327+ let pmtAssetId = $t01495515030._2
328+ let $t01503515185 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
329+ let buyAssetId = $t01503515185._1
330+ let buyAssetStrId = $t01503515185._2
331+ let buyAssetName = $t01503515185._3
332+ let buyAssetDecimals = $t01503515185._4
332333 let userUsdnInMarketing = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserAmountBuyAssetInMarketing)), 0)
333334 let usdnInMarketing = valueOrElse(getInteger(this, (toString(launchpadId) + keyAmountBuyAssetInMarketing)), 0)
334335 let boughtAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtAllocations)), 0)
335336 let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
336337 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
337338 let tokensPerAllocation = getIntegerValue(this, (toString(launchpadId) + keyTokensPerAllocation))
338- let $t01556015704 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
339- let tokenId = $t01556015704._1
340- let tokenStrAssetId = $t01556015704._2
341- let tokenAssetName = $t01556015704._3
342- let tokenDecimals = $t01556015704._4
339+ let $t01585415998 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
340+ let tokenId = $t01585415998._1
341+ let tokenStrAssetId = $t01585415998._2
342+ let tokenAssetName = $t01585415998._3
343+ let tokenDecimals = $t01585415998._4
343344 let allocationPriceWithComission = fraction(fraction(tokenPrice, tokensPerAllocation, pow(10, 0, tokenDecimals, 0, 0, DOWN)), (100 + commission), 100)
344345 let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
345346 let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
381382
382383 @Callable(i)
383384 func commitHighCompetitionSale (launchpadId,refId) = {
384- let $t01801318088 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
385- let pmtAmount = $t01801318088._1
386- let pmtAssetId = $t01801318088._2
387- let $t01809318243 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
388- let buyAssetId = $t01809318243._1
389- let buyAssetStrId = $t01809318243._2
390- let buyAssetName = $t01809318243._3
391- let buyAssetDecimals = $t01809318243._4
385+ let $t01830718382 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
386+ let pmtAmount = $t01830718382._1
387+ let pmtAssetId = $t01830718382._2
388+ let $t01838718537 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
389+ let buyAssetId = $t01838718537._1
390+ let buyAssetStrId = $t01838718537._2
391+ let buyAssetName = $t01838718537._3
392+ let buyAssetDecimals = $t01838718537._4
392393 let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
393394 let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
394395 let boughtHCTicketsAmount = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserHCBoughtTicketsAmount)), 0)
410411 else {
411412 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
412413 let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
413- let $t01949219636 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
414- let tokenId = $t01949219636._1
415- let tokenStrAssetId = $t01949219636._2
416- let tokenAssetName = $t01949219636._3
417- let tokenDecimals = $t01949219636._4
414+ let $t01978619930 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
415+ let tokenId = $t01978619930._1
416+ let tokenStrAssetId = $t01978619930._2
417+ let tokenAssetName = $t01978619930._3
418+ let tokenDecimals = $t01978619930._4
418419 let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
419420 let commissionPerTicket = fraction(ticketPrice, getIntegerValue(this, (toString(launchpadId) + keyHighCompetitionComission)), 100)
420421 let buyTicketAmount = (pmtAmount / (ticketPrice + commissionPerTicket))
459460 else if ((calcHash != savedHash))
460461 then throw("vrf Height hash not matching")
461462 else {
462- let $t02242122571 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
463- let buyAssetId = $t02242122571._1
464- let buyAssetStrId = $t02242122571._2
465- let buyAssetName = $t02242122571._3
466- let buyAssetDecimals = $t02242122571._4
463+ let $t02271522865 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
464+ let buyAssetId = $t02271522865._1
465+ let buyAssetStrId = $t02271522865._2
466+ let buyAssetName = $t02271522865._3
467+ let buyAssetDecimals = $t02271522865._4
467468 let projectAddress = addressFromStringValue(getStringValue(this, (toString(launchpadId) + keyAddress)))
468469 let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
469470 let commissionHC = getIntegerValue(this, (toString(launchpadId) + keyHighCompetitionComission))
492493
493494 @Callable(i)
494495 func claim (launchpadId) = {
496+ let boughtTickets = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtTicketsAmount)), 0)
497+ let boughtHCTickets = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserHCBoughtTicketsAmount)), 0)
498+ let boughtAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtAllocations)), 0)
495499 let userClaimStatus = valueOrElse(getBoolean(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimStatus)), false)
496- let boughtTickets = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtTicketsAmount)), 0)
497- let boughtAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtAllocations)), 0)
500+ let finalizeHeight = valueOrElse(getInteger(this, (toString(launchpadId) + keyFinaliseHeight)), 0)
498501 if (!(isActive))
499502 then throw("DApp is inactive at this moment")
500- else if (!(isDefined(getInteger(this, (toString(launchpadId) + keyFinaliseHeight)))))
503+ else if ((finalizeHeight == 0))
501504 then throw("You can't claim because results are not finalized")
502505 else if (userClaimStatus)
503506 then throw("You are already claimed")
504- else if (if ((boughtTickets == 0))
507+ else if (if (if ((boughtTickets == 0))
505508 then (boughtAllocations == 0)
509+ else false)
510+ then (boughtHCTickets == 0)
506511 else false)
507512 then throw("You can't claim because you don't buy anything")
508513 else {
509- let $t02543025580 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
510- let buyAssetId = $t02543025580._1
511- let buyAssetStrId = $t02543025580._2
512- let buyAssetName = $t02543025580._3
513- let buyAssetDecimals = $t02543025580._4
514+ let $t02593526085 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
515+ let buyAssetId = $t02593526085._1
516+ let buyAssetStrId = $t02593526085._2
517+ let buyAssetName = $t02593526085._3
518+ let buyAssetDecimals = $t02593526085._4
514519 let wonnedTickets = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserWinnedTicketsAmount)), 0)
520+ let wonnedHCTickets = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserWinnedTicketsAmount)), 0)
515521 let awailableAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserAvailableAllocations)), 0)
516522 let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
517523 let allowedAllocations = min([boughtAllocations, awailableAllocations])
518524 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
519525 let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
520- let $t02622726371 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
521- let tokenId = $t02622726371._1
522- let tokenStrAssetId = $t02622726371._2
523- let tokenAssetName = $t02622726371._3
524- let tokenDecimals = $t02622726371._4
526+ let $t02687427018 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
527+ let tokenId = $t02687427018._1
528+ let tokenStrAssetId = $t02687427018._2
529+ let tokenAssetName = $t02687427018._3
530+ let tokenDecimals = $t02687427018._4
525531 let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
526532 let tokensPerAllocation = getIntegerValue(this, (toString(launchpadId) + keyTokensPerAllocation))
527- let transferTokensAmount = ((wonnedTickets * tokensPerTicket) + (allowedAllocations * tokensPerAllocation))
533+ let transferTokensAmount = (((wonnedTickets * tokensPerTicket) + (allowedAllocations * tokensPerAllocation)) + (wonnedHCTickets * tokensPerTicket))
528534 let notAllowedAllocationsTokens = ((boughtAllocations - allowedAllocations) * tokensPerAllocation)
529535 let buyAssetForAllocations = fraction(fraction(notAllowedAllocationsTokens, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN)), (100 + commission), 100)
530536 let buyAssetForUnwonnedTickets = fraction(((boughtTickets - wonnedTickets) * ticketPrice), (100 + commission), 100)
531- if (if ((0 > buyAssetForAllocations))
537+ let buyAssetForHCUnwonnedTickets = fraction(((boughtHCTickets - wonnedHCTickets) * ticketPrice), (100 + commission), 100)
538+ let claimedBuyToken = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimedBuyTokens)), 0)
539+ if (if (if ((0 > buyAssetForAllocations))
532540 then true
533541 else (0 > buyAssetForUnwonnedTickets))
542+ then true
543+ else (0 > buyAssetForHCUnwonnedTickets))
534544 then throw("Error with allowed allocation param or wonned tickets param please contact support")
535545 else {
536- let returnedBuyAssetAmount = (buyAssetForUnwonnedTickets + buyAssetForUnwonnedTickets)
537- let transferUsdn = if ((returnedBuyAssetAmount > 0))
538- then [ScriptTransfer(i.caller, returnedBuyAssetAmount, buyAssetId)]
539- else nil
540- let transferTokens = if ((transferTokensAmount > 0))
541- then [ScriptTransfer(i.caller, transferTokensAmount, tokenId)]
546+ let returnedBuyAssetAmount = ((buyAssetForUnwonnedTickets + buyAssetForHCUnwonnedTickets) - claimedBuyToken)
547+ let transferBuyAsset = if ((returnedBuyAssetAmount > 0))
548+ then [ScriptTransfer(i.caller, returnedBuyAssetAmount, buyAssetId), IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimedBuyTokens), returnedBuyAssetAmount)]
542549 else nil
543550 let inv = if (if ((returnedBuyAssetAmount > 0))
544551 then (buyAssetId == USDN)
546553 then invoke(stakingUSDNAddress, "unlockNeutrino", [returnedBuyAssetAmount, toBase58String(USDN)], nil)
547554 else 0
548555 if ((inv == inv))
549- then (([BooleanEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimStatus), true)] ++ transferTokens) ++ transferUsdn)
556+ then {
557+ let claimedParams = split(valueOrElse(getString(this, keyClaimParams), ""), ",")
558+ if (if ((size(claimedParams) == 0))
559+ then true
560+ else (claimedParams[0] == "claimAll"))
561+ then {
562+ let transferTokens = if ((transferTokensAmount > 0))
563+ then [ScriptTransfer(i.caller, transferTokensAmount, tokenId)]
564+ else nil
565+ (([BooleanEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimStatus), true), IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimedTokens), transferTokensAmount)] ++ transferTokens) ++ transferBuyAsset)
566+ }
567+ else if ((claimedParams[0] == "claimPeriod"))
568+ then {
569+ let claimedTokens = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimedTokens)), 0)
570+ let startAmount = value(parseInt(claimedParams[0]))
571+ let unlockPeriod = value(parseInt(claimedParams[0]))
572+ let blockHeight = (value(parseInt(claimedParams[0])) + finalizeHeight)
573+ let unlockHeight = ((unlockPeriod + finalizeHeight) + blockHeight)
574+ let allowedTokensAmount = (fraction(transferTokensAmount, value(parseInt(claimedParams[0])), 100) + (if ((height > blockHeight))
575+ then fraction(transferTokensAmount, (height - blockHeight), unlockPeriod)
576+ else (0 - claimedTokens)))
577+ let claimStatusEntry = if ((transferTokensAmount >= (claimedTokens + allowedTokensAmount)))
578+ then [BooleanEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimStatus), true)]
579+ else nil
580+ if (if ((allowedTokensAmount > 0))
581+ then true
582+ else (returnedBuyAssetAmount > 0))
583+ then {
584+ let transferTokens = if ((allowedTokensAmount > 0))
585+ then [IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimedTokens), (claimedTokens + allowedTokensAmount)), ScriptTransfer(i.caller, allowedTokensAmount, tokenId)]
586+ else nil
587+ (transferBuyAsset ++ transferTokens)
588+ }
589+ else throw("Nothing to claim")
590+ }
591+ else throw("Error whith claim params: unknown function")
592+ }
550593 else throw("Strict value is not equal to itself.")
551594 }
552595 }
587630 then throw("Only admin can call this function")
588631 else {
589632 let projectAddress = addressFromStringValue(getStringValue(this, (toString(launchpadId) + keyAddress)))
590- let $t03004330193 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
591- let buyAssetId = $t03004330193._1
592- let buyAssetStrId = $t03004330193._2
593- let buyAssetName = $t03004330193._3
594- let buyAssetDecimals = $t03004330193._4
633+ let $t03341433564 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
634+ let buyAssetId = $t03341433564._1
635+ let buyAssetStrId = $t03341433564._2
636+ let buyAssetName = $t03341433564._3
637+ let buyAssetDecimals = $t03341433564._4
595638 [IntegerEntry((toString(launchpadId) + keyTransferBuyAsset), amount), ScriptTransfer(projectAddress, amount, buyAssetId)]
596639 }
597640
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-
3230 let keyAssetId = "_asset_id"
3331
3432 let keyTotalTokenAmount = "_total_token_amount"
3533
3634 let keyTotalAmountBuyAssetSold = "_total_buy_asset_sold"
37-
38-let keyTotalAmountBuyAssetSoldHC = "_total_buy_asset_sold_high_competition"
3935
4036 let keyTokensPerTicket = "_tokens_per_ticket"
4137
4238 let keyPricePerToken = "_price_per_token"
4339
4440 let keySwopPerTicket = "_swop_per_ticket"
4541
4642 let keySwopfiTicketsAmount = "_tickets_swopfi_members"
4743
48-let keyHCAmount = "_tickets_high_competition"
49-
5044 let keyCampaignTokensAmount = "_tokens_access_list"
5145
5246 let keyTokensPerAllocation = "_tokens_per_allocation"
5347
5448 let keyTicketLastNumber = "_ticket_last_number_high_competition"
55-
56-let keyHCTicketLastNumber = "_ticket_last_number"
5749
5850 let keyGovernanceStaked = "_SWOP_amount"
5951
6052 let keyUserRefId = "_ref_id"
6153
6254 let keyVerifyHash = "_verify_hash"
6355
6456 let keyDuration = "_duration"
6557
6658 let keyAmountBuyAssetInMarketing = "_total_purchased_buy_asset_in_marketing"
6759
6860 let keyAmountBuyAssetInMarketingFinalized = "_total_purchased_buy_asset_in_marketing_finalized"
6961
7062 let keyTransferBuyAsset = "_transfer_buy_asset"
7163
7264 let keyFreezSwopDuration = "_freeze_swop_duration"
7365
74-let keyHighCompetitionSale = "_high_competition_sale"
75-
7666 let keyFreezeAdditionalToken = "_freeze_additional_token"
7767
7868 let keyFreezeTokenId = "_freeze_token_id"
7969
8070 let keyFreezeTokenDuration = "_freeze_token_duration"
8171
8272 let keyFreezeTokenPerTicket = "_freeze_token_per_ticket"
8373
8474 let keyBuyToken = "_buy_token"
8575
8676 let keyClaimParams = "_claim_params"
8777
78+let keyHighCompetitionComission = "_high_competition_comission"
79+
80+let keyHighCompetitionSale = "_high_competition_sale"
81+
82+let keyHCTicketLastNumber = "_high_competition_ticket_last_number"
83+
84+let keyHighCompetitionAmount = "_tickets_high_competition"
85+
86+let keyTotalAmountBuyAssetSoldHC = "_total_buy_asset_sold_high_competition"
87+
88+let keyUserClaimedTokens = "_claimed_tokens"
89+
90+let keyUserClaimedBuyTokens = "_claimed_buy_tokens"
91+
8892 let keyUserBoughtTicketsAmount = "_bought_tickets"
89-
90-let keyUserHCBoughtTicketsAmount = "_bought_tickets_high_competition"
9193
9294 let keyUserTickets = "_tickets_number"
9395
9496 let keyUserHCTickets = "_tickets_number_high_competition"
97+
98+let keyUserHCBoughtTicketsAmount = "_bought_tickets_high_competition"
9599
96100 let keyUserAvailableAllocations = "_available_purchase_marketing"
97101
98102 let keyUserAmountBuyAssetInMarketing = "_purchased_buy_asset_in_marketing"
99103
100104 let keyUserBoughtAllocations = "_bought_allocations"
101105
102106 let keyUserClaimStatus = "_claim_status"
103107
104108 let keyUserWinnedTicketsAmount = "_tickets_result"
105109
106110 let keyUserFreezeToken = "_freeze_token_amount"
107111
108-let oracle = Address(base58'3NBBWfzZtZtszaXbitTKnrB2xXwv26Bn7H9')
112+let oracle = Address(base58'3PEbqViERCoKnmcSULh6n2aiMvUdSQdCsom')
109113
110-let governance = Address(base58'3N5W8da2iiijVieA6qLGo7KzCJj8B19smWU')
114+let governance = Address(base58'3PLHVWCqA9DJPDbadUofTohnCULLauiDWhS')
111115
112116 let commissionWallet = Address(base58'3PGYafJ2GuqPckmZNywet8moiPnBHz51Xdg')
113117
114118 let stakingUSDNAddress = Address(base58'3PNikM6yp4NqcSU8guxQtmR5onr2D4e8yTJ')
115119
116120 let USDN = base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p'
117121
118122 let adminPubKeyStaking = base58'Czn4yoAuUZCVCLJDRfskn8URfkwpknwBTZDbs1wFrY7h'
119123
120124 let maxAllocationsAmount = 2
121125
122126 let isActive = valueOrElse(getBoolean(this, keyActive), true)
123127
124128 let activeLaunchpadId = valueOrElse(getIntegerValue(this, keyLaunchpadActiveId), -1)
125129
126130 func getAdminPub (keyAdminPub) = match getString(oracle, keyAdminPub) {
127131 case string: String =>
128132 fromBase58String(string)
129133 case nothing =>
130134 throw("Admin public key is empty")
131135 }
132136
133137
134138 let adminPubKey1 = getAdminPub(keyAdminPubKey1)
135139
136140 let adminPubKey2 = getAdminPub(keyAdminPubKey2)
137141
138142 let adminPubKey3 = getAdminPub(keyAdminPubKey3)
139143
140144 func getAssetInfo (assetId) = match assetId {
141145 case id: ByteVector =>
142146 let stringId = toBase58String(id)
143147 let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
144148 $Tuple3(stringId, info.name, info.decimals)
145149 case waves: Unit =>
146150 $Tuple3("WAVES", "WAVES", 8)
147151 case _ =>
148152 throw("Match error")
149153 }
150154
151155
152156 func getLaunchpadNextId () = valueOrElse(getInteger(this, keyLaunchpadNextId), 1)
153-
154-
155-func stakedUsdnAmount () = valueOrElse(getInteger(stakingUSDNAddress, ((("rpd_balance_" + toBase58String(USDN)) + "_") + toString(this))), 0)
156157
157158
158159 func getAssetInfoFromString (assetStr) = if ((assetStr == "WAVES"))
159160 then $Tuple4(unit, "WAVES", "WAVES", 8)
160161 else {
161162 let stringId = assetStr
162163 let id = fromBase58String(assetStr)
163164 let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
164165 $Tuple4(id, stringId, info.name, info.decimals)
165166 }
166167
167168
168169 @Callable(i)
169170 func hashingRandom (launchpadId,hash) = if (!(isActive))
170171 then throw("DApp is inactive at this moment")
171172 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
172173 then throw("Only admin can call this function")
173174 else [StringEntry((toString(launchpadId) + keyVerifyHash), hash)]
174175
175176
176177
177178 @Callable(i)
178179 func initCaller (address) = if (!(isActive))
179180 then throw("DApp is inactive at this moment")
180181 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
181182 then throw("Only admin can call this function")
182183 else [StringEntry(keyInitCaller, address)]
183184
184185
185186
186187 @Callable(i)
187188 func init (projectAddress,startHeight,duration,buyToken,commission,tokensPerTicket,pricePerToken,swopfiTicketsAmount,campaignTokensAmount,tokensPerAllocation,swopPerTicket,swopFreezeDuration,claimParams,HighCompetitionSale,highCompetitionComission,highCompetitionTicketsAmount,freezeAdditionalToken,freezeParams) = if (!(isActive))
188189 then throw("DApp is inactive at this moment")
189190 else if ((toString(i.caller) != valueOrElse(getString(this, keyInitCaller), "")))
190191 then throw("Only project admin can call init function")
191192 else if ((size(i.payments) != 1))
192193 then throw("One attached payment expected")
193194 else if ((height > startHeight))
194195 then throw("Start height must be greater than blockchain height")
195196 else if (if (freezeAdditionalToken)
196197 then (size(freezeParams) != 3)
197198 else false)
198199 then throw("Freeze params list must have 3 items")
199200 else {
200201 let launchpadId = getLaunchpadNextId()
201202 let launchpadIdStr = toString(launchpadId)
202- let $t063366411 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
203- let pmtAmount = $t063366411._1
204- let pmtAssetId = $t063366411._2
205- let $t064206493 = getAssetInfo(pmtAssetId)
206- let pmtStrAssetId = $t064206493._1
207- let pmtAssetName = $t064206493._2
208- let pmtDecimals = $t064206493._3
203+ let $t065486623 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
204+ let pmtAmount = $t065486623._1
205+ let pmtAssetId = $t065486623._2
206+ let $t066326705 = getAssetInfo(pmtAssetId)
207+ let pmtStrAssetId = $t066326705._1
208+ let pmtAssetName = $t066326705._2
209+ let pmtDecimals = $t066326705._3
209210 let freezeAdditionalEntry = if (freezeAdditionalToken)
210211 then [BooleanEntry((launchpadIdStr + keyFreezeAdditionalToken), true), StringEntry((launchpadIdStr + keyFreezeTokenId), freezeParams[0]), IntegerEntry((launchpadIdStr + keyFreezeTokenDuration), parseIntValue(freezeParams[1])), IntegerEntry((launchpadIdStr + keyFreezeTokenPerTicket), parseIntValue(freezeParams[2]))]
211212 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 + 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)
213+ ([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 + keyHCTicketLastNumber), 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)
213214 }
214215
215216
216217
217218 @Callable(i)
218219 func commitSwopfiSale (launchpadId,refId) = {
219- let $t089939068 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
220- let pmtAmount = $t089939068._1
221- let pmtAssetId = $t089939068._2
222- let $t090739223 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
223- let buyAssetId = $t090739223._1
224- let buyAssetStrId = $t090739223._2
225- let buyAssetName = $t090739223._3
226- let buyAssetDecimals = $t090739223._4
220+ let $t092879362 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
221+ let pmtAmount = $t092879362._1
222+ let pmtAssetId = $t092879362._2
223+ let $t093679517 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
224+ let buyAssetId = $t093679517._1
225+ let buyAssetStrId = $t093679517._2
226+ let buyAssetName = $t093679517._3
227+ let buyAssetDecimals = $t093679517._4
227228 let stakedSwops = valueOrElse(getInteger(governance, (toString(i.caller) + keyGovernanceStaked)), 0)
228229 let allowedTicketsAmountAll = (stakedSwops / getIntegerValue(this, (toString(launchpadId) + keySwopPerTicket)))
229230 let boughtTicketsAmount = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtTicketsAmount)), 0)
230231 let allowedTicketsAmount = (allowedTicketsAmountAll - boughtTicketsAmount)
231232 let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
232233 let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
233234 let freezeAdditionalToken = valueOrElse(getBoolean(this, (toString(launchpadId) + keyFreezeAdditionalToken)), false)
234235 if (!(isActive))
235236 then throw("DApp is inactive at this moment")
236237 else if ((activeLaunchpadId != launchpadId))
237238 then throw("There is no active launchpad or this launchpad is ended")
238239 else if ((startHeight > height))
239240 then throw("Launchpad sale not started yet")
240241 else if ((height > (startHeight + duration)))
241242 then throw("Launchpad sale ended")
242243 else if (if (!(freezeAdditionalToken))
243244 then if ((size(i.payments) != 1))
244245 then true
245246 else (pmtAssetId != buyAssetId)
246247 else false)
247248 then throw((("One attached payment in " + buyAssetName) + " expected"))
248249 else if (if (freezeAdditionalToken)
249250 then if ((size(i.payments) != 2))
250251 then true
251252 else (pmtAssetId != buyAssetId)
252253 else false)
253254 then {
254255 let freezeTokenId = getStringValue(this, (toString(launchpadId) + keyFreezeTokenId))
255256 throw(((("Two attached payments expected: First in " + buyAssetName) + ", second in ") + freezeTokenId))
256257 }
257258 else if (if ((0 >= allowedTicketsAmountAll))
258259 then true
259260 else (0 >= allowedTicketsAmount))
260261 then throw("Not enought SWOP in staking to buy tickets")
261262 else {
262263 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
263264 let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
264- let $t01111111255 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
265- let tokenId = $t01111111255._1
266- let tokenStrAssetId = $t01111111255._2
267- let tokenAssetName = $t01111111255._3
268- let tokenDecimals = $t01111111255._4
265+ let $t01140511549 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
266+ let tokenId = $t01140511549._1
267+ let tokenStrAssetId = $t01140511549._2
268+ let tokenAssetName = $t01140511549._3
269+ let tokenDecimals = $t01140511549._4
269270 let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
270271 let commissionPerTicket = fraction(ticketPrice, getIntegerValue(this, (toString(launchpadId) + keyComission)), 100)
271272 let buyTicketAmount = (pmtAmount / (ticketPrice + commissionPerTicket))
272273 let allowedBuyTicketAmount = min([buyTicketAmount, allowedTicketsAmount])
273274 let allowedBuyPriceWithComission = (allowedBuyTicketAmount * (ticketPrice + commissionPerTicket))
274275 let change = (pmtAmount - allowedBuyPriceWithComission)
275276 if ((buyTicketAmount == 0))
276277 then throw((("Not enought " + buyAssetName) + " to buy tickets"))
277278 else if ((change != 0))
278279 then throw((((("Wrong payment. To buy " + toString(allowedBuyTicketAmount)) + "tickets you need to pay ") + toString(allowedBuyPriceWithComission)) + buyAssetName))
279280 else {
280281 let freezeAdditionalEntry = if (freezeAdditionalToken)
281282 then {
282283 let freezeTokenId = getStringValue(this, (toString(launchpadId) + keyFreezeTokenId))
283284 let freezeTokenPerTicket = getIntegerValue(this, (toString(launchpadId) + keyFreezeTokenPerTicket))
284- let $t01241912506 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
285- let pmtAmountFreeze = $t01241912506._1
286- let pmtAssetIdFreeze = $t01241912506._2
287- let $t01252312614 = getAssetInfo(pmtAssetId)
288- let pmtFreezeStrAssetId = $t01252312614._1
289- let pmtFreezeAssetName = $t01252312614._2
290- let pmtFreezeDecimals = $t01252312614._3
285+ let $t01271312800 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
286+ let pmtAmountFreeze = $t01271312800._1
287+ let pmtAssetIdFreeze = $t01271312800._2
288+ let $t01281712908 = getAssetInfo(pmtAssetId)
289+ let pmtFreezeStrAssetId = $t01281712908._1
290+ let pmtFreezeAssetName = $t01281712908._2
291+ let pmtFreezeDecimals = $t01281712908._3
291292 let needFreezeTokens = (freezeTokenPerTicket * buyTicketAmount)
292293 if (if ((pmtFreezeStrAssetId != freezeTokenId))
293294 then true
294295 else (needFreezeTokens != pmtAmountFreeze))
295296 then throw((((("You need to add " + toString(needFreezeTokens)) + " ") + pmtFreezeAssetName) + " as a second payment"))
296297 else [IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserFreezeToken), pmtAmountFreeze)]
297298 }
298299 else nil
299300 let userBoughtTicketsNumbers = valueOrElse(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserTickets)), "")
300301 let lastBoughtTicketNumber = getIntegerValue(this, (toString(launchpadId) + keyTicketLastNumber))
301302 let boughtRange = ((toString((lastBoughtTicketNumber + 1)) + "-") + toString((lastBoughtTicketNumber + allowedBuyTicketAmount)))
302303 let newUserBoughtTicketsNumbers = (userBoughtTicketsNumbers + (if ((userBoughtTicketsNumbers != ""))
303304 then ("," + boughtRange)
304305 else ("" + boughtRange)))
305306 let inv = if ((buyAssetId == USDN))
306307 then invoke(stakingUSDNAddress, "lockNeutrino", nil, [AttachedPayment(pmtAssetId, pmtAmount)])
307308 else 0
308309 if ((inv == inv))
309310 then {
310311 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)
311312 if (!(isDefined(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId)))))
312313 then (baseEntry ++ [StringEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId), refId)])
313314 else baseEntry
314315 }
315316 else throw("Strict value is not equal to itself.")
316317 }
317318 }
318319 }
319320
320321
321322
322323 @Callable(i)
323324 func commitAccessListSale (launchpadId,refId) = {
324- let $t01466114736 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
325- let pmtAmount = $t01466114736._1
326- let pmtAssetId = $t01466114736._2
327- let $t01474114891 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
328- let buyAssetId = $t01474114891._1
329- let buyAssetStrId = $t01474114891._2
330- let buyAssetName = $t01474114891._3
331- let buyAssetDecimals = $t01474114891._4
325+ let $t01495515030 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
326+ let pmtAmount = $t01495515030._1
327+ let pmtAssetId = $t01495515030._2
328+ let $t01503515185 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
329+ let buyAssetId = $t01503515185._1
330+ let buyAssetStrId = $t01503515185._2
331+ let buyAssetName = $t01503515185._3
332+ let buyAssetDecimals = $t01503515185._4
332333 let userUsdnInMarketing = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserAmountBuyAssetInMarketing)), 0)
333334 let usdnInMarketing = valueOrElse(getInteger(this, (toString(launchpadId) + keyAmountBuyAssetInMarketing)), 0)
334335 let boughtAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtAllocations)), 0)
335336 let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
336337 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
337338 let tokensPerAllocation = getIntegerValue(this, (toString(launchpadId) + keyTokensPerAllocation))
338- let $t01556015704 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
339- let tokenId = $t01556015704._1
340- let tokenStrAssetId = $t01556015704._2
341- let tokenAssetName = $t01556015704._3
342- let tokenDecimals = $t01556015704._4
339+ let $t01585415998 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
340+ let tokenId = $t01585415998._1
341+ let tokenStrAssetId = $t01585415998._2
342+ let tokenAssetName = $t01585415998._3
343+ let tokenDecimals = $t01585415998._4
343344 let allocationPriceWithComission = fraction(fraction(tokenPrice, tokensPerAllocation, pow(10, 0, tokenDecimals, 0, 0, DOWN)), (100 + commission), 100)
344345 let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
345346 let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
346347 if (!(isActive))
347348 then throw("DApp is inactive at this moment")
348349 else if ((activeLaunchpadId != launchpadId))
349350 then throw("There is no active launchpad or this launchpad is ended")
350351 else if ((startHeight > height))
351352 then throw("Launchpad sale not started yet")
352353 else if ((height > (startHeight + duration)))
353354 then throw("Launchpad sale ended")
354355 else if (if ((size(i.payments) != 1))
355356 then true
356357 else (pmtAssetId != buyAssetId))
357358 then throw((("One attached payment in " + buyAssetName) + " expected"))
358359 else if ((boughtAllocations >= maxAllocationsAmount))
359360 then throw((("You can buy only " + toString(maxAllocationsAmount)) + "allocations"))
360361 else if (if ((allocationPriceWithComission != pmtAmount))
361362 then ((allocationPriceWithComission * 2) != pmtAmount)
362363 else false)
363364 then throw(((("Wrong payment. You can buy 1 or 2 allocations for " + toString(allocationPriceWithComission)) + buyAssetName) + " per allocation"))
364365 else {
365366 let buyAllocationsAmount = (pmtAmount / allocationPriceWithComission)
366367 let inv = if ((buyAssetId == USDN))
367368 then invoke(stakingUSDNAddress, "lockNeutrino", nil, [AttachedPayment(pmtAssetId, pmtAmount)])
368369 else 0
369370 if ((inv == inv))
370371 then {
371372 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))]
372373 if (!(isDefined(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId)))))
373374 then (baseEntry ++ [StringEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId), refId)])
374375 else baseEntry
375376 }
376377 else throw("Strict value is not equal to itself.")
377378 }
378379 }
379380
380381
381382
382383 @Callable(i)
383384 func commitHighCompetitionSale (launchpadId,refId) = {
384- let $t01801318088 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
385- let pmtAmount = $t01801318088._1
386- let pmtAssetId = $t01801318088._2
387- let $t01809318243 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
388- let buyAssetId = $t01809318243._1
389- let buyAssetStrId = $t01809318243._2
390- let buyAssetName = $t01809318243._3
391- let buyAssetDecimals = $t01809318243._4
385+ let $t01830718382 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
386+ let pmtAmount = $t01830718382._1
387+ let pmtAssetId = $t01830718382._2
388+ let $t01838718537 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
389+ let buyAssetId = $t01838718537._1
390+ let buyAssetStrId = $t01838718537._2
391+ let buyAssetName = $t01838718537._3
392+ let buyAssetDecimals = $t01838718537._4
392393 let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
393394 let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
394395 let boughtHCTicketsAmount = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserHCBoughtTicketsAmount)), 0)
395396 let highCompetitionSale = valueOrElse(getBoolean(this, (toString(launchpadId) + keyHighCompetitionSale)), false)
396397 if (!(isActive))
397398 then throw("DApp is inactive at this moment")
398399 else if ((activeLaunchpadId != launchpadId))
399400 then throw("There is no active launchpad or this launchpad is ended")
400401 else if (!(highCompetitionSale))
401402 then throw("There is no high competition sale for this launchpad")
402403 else if ((startHeight > height))
403404 then throw("Launchpad sale not started yet")
404405 else if ((height > (startHeight + duration)))
405406 then throw("Launchpad sale ended")
406407 else if (if ((size(i.payments) != 1))
407408 then true
408409 else (pmtAssetId != buyAssetId))
409410 then throw((("One attached payment in " + buyAssetName) + " expected"))
410411 else {
411412 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
412413 let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
413- let $t01949219636 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
414- let tokenId = $t01949219636._1
415- let tokenStrAssetId = $t01949219636._2
416- let tokenAssetName = $t01949219636._3
417- let tokenDecimals = $t01949219636._4
414+ let $t01978619930 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
415+ let tokenId = $t01978619930._1
416+ let tokenStrAssetId = $t01978619930._2
417+ let tokenAssetName = $t01978619930._3
418+ let tokenDecimals = $t01978619930._4
418419 let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
419420 let commissionPerTicket = fraction(ticketPrice, getIntegerValue(this, (toString(launchpadId) + keyHighCompetitionComission)), 100)
420421 let buyTicketAmount = (pmtAmount / (ticketPrice + commissionPerTicket))
421422 let buyPriceWithComission = (buyTicketAmount * (ticketPrice + commissionPerTicket))
422423 let change = (pmtAmount - buyPriceWithComission)
423424 if ((buyTicketAmount == 0))
424425 then throw((("Not enought " + buyAssetName) + " to buy tickets"))
425426 else if ((change != 0))
426427 then throw((((("Wrong payment. To buy " + toString(buyTicketAmount)) + "tickets you need to pay ") + toString(buyPriceWithComission)) + buyAssetName))
427428 else {
428429 let userBoughtTicketsNumbers = valueOrElse(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserHCTickets)), "")
429430 let lastBoughtTicketNumber = getIntegerValue(this, (toString(launchpadId) + keyHCTicketLastNumber))
430431 let boughtRange = ((toString((lastBoughtTicketNumber + 1)) + "-") + toString((lastBoughtTicketNumber + buyTicketAmount)))
431432 let newUserBoughtTicketsNumbers = (userBoughtTicketsNumbers + (if ((userBoughtTicketsNumbers != ""))
432433 then ("," + boughtRange)
433434 else ("" + boughtRange)))
434435 let inv = if ((buyAssetId == USDN))
435436 then invoke(stakingUSDNAddress, "lockNeutrino", nil, [AttachedPayment(pmtAssetId, pmtAmount)])
436437 else 0
437438 if ((inv == inv))
438439 then {
439440 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)]
440441 if (!(isDefined(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId)))))
441442 then (baseEntry ++ [StringEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId), refId)])
442443 else baseEntry
443444 }
444445 else throw("Strict value is not equal to itself.")
445446 }
446447 }
447448 }
448449
449450
450451
451452 @Callable(i)
452453 func finalise (launchpadId,vrfHeight,secretWord) = {
453454 let savedHash = getStringValue(this, (toString(launchpadId) + keyVerifyHash))
454455 let calcHash = toBase58String(sha256((toBytes(vrfHeight) + toBytes(secretWord))))
455456 if (!(isActive))
456457 then throw("DApp is inactive at this moment")
457458 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
458459 then throw("Only admin can call this function")
459460 else if ((calcHash != savedHash))
460461 then throw("vrf Height hash not matching")
461462 else {
462- let $t02242122571 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
463- let buyAssetId = $t02242122571._1
464- let buyAssetStrId = $t02242122571._2
465- let buyAssetName = $t02242122571._3
466- let buyAssetDecimals = $t02242122571._4
463+ let $t02271522865 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
464+ let buyAssetId = $t02271522865._1
465+ let buyAssetStrId = $t02271522865._2
466+ let buyAssetName = $t02271522865._3
467+ let buyAssetDecimals = $t02271522865._4
467468 let projectAddress = addressFromStringValue(getStringValue(this, (toString(launchpadId) + keyAddress)))
468469 let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
469470 let commissionHC = getIntegerValue(this, (toString(launchpadId) + keyHighCompetitionComission))
470471 let transferedBuyAsset = valueOrElse(getInteger(this, (toString(launchpadId) + keyTransferBuyAsset)), 0)
471472 let swopfiMembersBuyAssetAmount = getIntegerValue(this, (toString(launchpadId) + keyTotalAmountBuyAssetSold))
472473 let swopfiHCBuyAssetAmount = valueOrElse(getIntegerValue(this, (toString(launchpadId) + keyTotalAmountBuyAssetSoldHC)), 0)
473474 let swopfiMembersComission = fraction(swopfiMembersBuyAssetAmount, commission, 100)
474475 let swopfiHCComission = fraction(swopfiHCBuyAssetAmount, commissionHC, 100)
475476 let totalAmountBuyAssetInMarketing = getIntegerValue(this, (toString(launchpadId) + keyAmountBuyAssetInMarketingFinalized))
476477 let marketingComission = fraction(totalAmountBuyAssetInMarketing, commission, 100)
477478 let unstakeAmount = (((((swopfiMembersBuyAssetAmount + totalAmountBuyAssetInMarketing) + swopfiMembersComission) + marketingComission) + swopfiHCBuyAssetAmount) + swopfiHCComission)
478479 if ((transferedBuyAsset > (swopfiMembersBuyAssetAmount + totalAmountBuyAssetInMarketing)))
479480 then throw("Can't transfer negative value to project")
480481 else {
481482 let inv = if ((buyAssetId == USDN))
482483 then invoke(stakingUSDNAddress, "unlockNeutrino", [unstakeAmount, toBase58String(USDN)], nil)
483484 else 0
484485 if ((inv == inv))
485486 then [IntegerEntry((toString(launchpadId) + keyFinaliseHeight), height), ScriptTransfer(projectAddress, ((swopfiMembersBuyAssetAmount + totalAmountBuyAssetInMarketing) - transferedBuyAsset), buyAssetId), ScriptTransfer(commissionWallet, ((swopfiMembersComission + marketingComission) + swopfiHCComission), buyAssetId)]
486487 else throw("Strict value is not equal to itself.")
487488 }
488489 }
489490 }
490491
491492
492493
493494 @Callable(i)
494495 func claim (launchpadId) = {
496+ let boughtTickets = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtTicketsAmount)), 0)
497+ let boughtHCTickets = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserHCBoughtTicketsAmount)), 0)
498+ let boughtAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtAllocations)), 0)
495499 let userClaimStatus = valueOrElse(getBoolean(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimStatus)), false)
496- let boughtTickets = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtTicketsAmount)), 0)
497- let boughtAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtAllocations)), 0)
500+ let finalizeHeight = valueOrElse(getInteger(this, (toString(launchpadId) + keyFinaliseHeight)), 0)
498501 if (!(isActive))
499502 then throw("DApp is inactive at this moment")
500- else if (!(isDefined(getInteger(this, (toString(launchpadId) + keyFinaliseHeight)))))
503+ else if ((finalizeHeight == 0))
501504 then throw("You can't claim because results are not finalized")
502505 else if (userClaimStatus)
503506 then throw("You are already claimed")
504- else if (if ((boughtTickets == 0))
507+ else if (if (if ((boughtTickets == 0))
505508 then (boughtAllocations == 0)
509+ else false)
510+ then (boughtHCTickets == 0)
506511 else false)
507512 then throw("You can't claim because you don't buy anything")
508513 else {
509- let $t02543025580 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
510- let buyAssetId = $t02543025580._1
511- let buyAssetStrId = $t02543025580._2
512- let buyAssetName = $t02543025580._3
513- let buyAssetDecimals = $t02543025580._4
514+ let $t02593526085 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
515+ let buyAssetId = $t02593526085._1
516+ let buyAssetStrId = $t02593526085._2
517+ let buyAssetName = $t02593526085._3
518+ let buyAssetDecimals = $t02593526085._4
514519 let wonnedTickets = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserWinnedTicketsAmount)), 0)
520+ let wonnedHCTickets = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserWinnedTicketsAmount)), 0)
515521 let awailableAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserAvailableAllocations)), 0)
516522 let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
517523 let allowedAllocations = min([boughtAllocations, awailableAllocations])
518524 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
519525 let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
520- let $t02622726371 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
521- let tokenId = $t02622726371._1
522- let tokenStrAssetId = $t02622726371._2
523- let tokenAssetName = $t02622726371._3
524- let tokenDecimals = $t02622726371._4
526+ let $t02687427018 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
527+ let tokenId = $t02687427018._1
528+ let tokenStrAssetId = $t02687427018._2
529+ let tokenAssetName = $t02687427018._3
530+ let tokenDecimals = $t02687427018._4
525531 let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
526532 let tokensPerAllocation = getIntegerValue(this, (toString(launchpadId) + keyTokensPerAllocation))
527- let transferTokensAmount = ((wonnedTickets * tokensPerTicket) + (allowedAllocations * tokensPerAllocation))
533+ let transferTokensAmount = (((wonnedTickets * tokensPerTicket) + (allowedAllocations * tokensPerAllocation)) + (wonnedHCTickets * tokensPerTicket))
528534 let notAllowedAllocationsTokens = ((boughtAllocations - allowedAllocations) * tokensPerAllocation)
529535 let buyAssetForAllocations = fraction(fraction(notAllowedAllocationsTokens, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN)), (100 + commission), 100)
530536 let buyAssetForUnwonnedTickets = fraction(((boughtTickets - wonnedTickets) * ticketPrice), (100 + commission), 100)
531- if (if ((0 > buyAssetForAllocations))
537+ let buyAssetForHCUnwonnedTickets = fraction(((boughtHCTickets - wonnedHCTickets) * ticketPrice), (100 + commission), 100)
538+ let claimedBuyToken = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimedBuyTokens)), 0)
539+ if (if (if ((0 > buyAssetForAllocations))
532540 then true
533541 else (0 > buyAssetForUnwonnedTickets))
542+ then true
543+ else (0 > buyAssetForHCUnwonnedTickets))
534544 then throw("Error with allowed allocation param or wonned tickets param please contact support")
535545 else {
536- let returnedBuyAssetAmount = (buyAssetForUnwonnedTickets + buyAssetForUnwonnedTickets)
537- let transferUsdn = if ((returnedBuyAssetAmount > 0))
538- then [ScriptTransfer(i.caller, returnedBuyAssetAmount, buyAssetId)]
539- else nil
540- let transferTokens = if ((transferTokensAmount > 0))
541- then [ScriptTransfer(i.caller, transferTokensAmount, tokenId)]
546+ let returnedBuyAssetAmount = ((buyAssetForUnwonnedTickets + buyAssetForHCUnwonnedTickets) - claimedBuyToken)
547+ let transferBuyAsset = if ((returnedBuyAssetAmount > 0))
548+ then [ScriptTransfer(i.caller, returnedBuyAssetAmount, buyAssetId), IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimedBuyTokens), returnedBuyAssetAmount)]
542549 else nil
543550 let inv = if (if ((returnedBuyAssetAmount > 0))
544551 then (buyAssetId == USDN)
545552 else false)
546553 then invoke(stakingUSDNAddress, "unlockNeutrino", [returnedBuyAssetAmount, toBase58String(USDN)], nil)
547554 else 0
548555 if ((inv == inv))
549- then (([BooleanEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimStatus), true)] ++ transferTokens) ++ transferUsdn)
556+ then {
557+ let claimedParams = split(valueOrElse(getString(this, keyClaimParams), ""), ",")
558+ if (if ((size(claimedParams) == 0))
559+ then true
560+ else (claimedParams[0] == "claimAll"))
561+ then {
562+ let transferTokens = if ((transferTokensAmount > 0))
563+ then [ScriptTransfer(i.caller, transferTokensAmount, tokenId)]
564+ else nil
565+ (([BooleanEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimStatus), true), IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimedTokens), transferTokensAmount)] ++ transferTokens) ++ transferBuyAsset)
566+ }
567+ else if ((claimedParams[0] == "claimPeriod"))
568+ then {
569+ let claimedTokens = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimedTokens)), 0)
570+ let startAmount = value(parseInt(claimedParams[0]))
571+ let unlockPeriod = value(parseInt(claimedParams[0]))
572+ let blockHeight = (value(parseInt(claimedParams[0])) + finalizeHeight)
573+ let unlockHeight = ((unlockPeriod + finalizeHeight) + blockHeight)
574+ let allowedTokensAmount = (fraction(transferTokensAmount, value(parseInt(claimedParams[0])), 100) + (if ((height > blockHeight))
575+ then fraction(transferTokensAmount, (height - blockHeight), unlockPeriod)
576+ else (0 - claimedTokens)))
577+ let claimStatusEntry = if ((transferTokensAmount >= (claimedTokens + allowedTokensAmount)))
578+ then [BooleanEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimStatus), true)]
579+ else nil
580+ if (if ((allowedTokensAmount > 0))
581+ then true
582+ else (returnedBuyAssetAmount > 0))
583+ then {
584+ let transferTokens = if ((allowedTokensAmount > 0))
585+ then [IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimedTokens), (claimedTokens + allowedTokensAmount)), ScriptTransfer(i.caller, allowedTokensAmount, tokenId)]
586+ else nil
587+ (transferBuyAsset ++ transferTokens)
588+ }
589+ else throw("Nothing to claim")
590+ }
591+ else throw("Error whith claim params: unknown function")
592+ }
550593 else throw("Strict value is not equal to itself.")
551594 }
552595 }
553596 }
554597
555598
556599
557600 @Callable(i)
558601 func claimFreezeToken (launchpadId) = {
559602 let freezeAdditionalToken = valueOrElse(getBoolean(this, (toString(launchpadId) + keyFreezeAdditionalToken)), false)
560603 if (!(isActive))
561604 then throw("DApp is inactive at this moment")
562605 else if (!(isDefined(getInteger(this, (toString(launchpadId) + keyFinaliseHeight)))))
563606 then throw("You can't claim because results are not finalized")
564607 else if (!(freezeAdditionalToken))
565608 then throw("There are no additional token freezing for this launchpad")
566609 else {
567610 let tokenId = fromBase58String(getStringValue(this, (toString(launchpadId) + keyFreezeTokenId)))
568611 let userTokensFreezed = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserFreezeToken)), 0)
569612 let startHeight = valueOrElse(getInteger(this, (toString(launchpadId) + keyStartHeight)), 0)
570613 let duration = valueOrElse(getInteger(this, (toString(launchpadId) + keyDuration)), 0)
571614 let freezeTokenDuration = getIntegerValue(this, (toString(launchpadId) + keyFreezeTokenDuration))
572615 let blockEndHeight = ((startHeight + duration) + freezeTokenDuration)
573616 if ((userTokensFreezed == 0))
574617 then throw("You are already claimed your tokens or not paid anything")
575618 else if ((blockEndHeight > height))
576619 then throw(("Your tokens freezed teel " + toString(blockEndHeight)))
577620 else [ScriptTransfer(i.caller, userTokensFreezed, tokenId), IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserFreezeToken), 0)]
578621 }
579622 }
580623
581624
582625
583626 @Callable(i)
584627 func transferBuyAsset (launchpadId,amount) = if (!(isActive))
585628 then throw("DApp is inactive")
586629 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
587630 then throw("Only admin can call this function")
588631 else {
589632 let projectAddress = addressFromStringValue(getStringValue(this, (toString(launchpadId) + keyAddress)))
590- let $t03004330193 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
591- let buyAssetId = $t03004330193._1
592- let buyAssetStrId = $t03004330193._2
593- let buyAssetName = $t03004330193._3
594- let buyAssetDecimals = $t03004330193._4
633+ let $t03341433564 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
634+ let buyAssetId = $t03341433564._1
635+ let buyAssetStrId = $t03341433564._2
636+ let buyAssetName = $t03341433564._3
637+ let buyAssetDecimals = $t03341433564._4
595638 [IntegerEntry((toString(launchpadId) + keyTransferBuyAsset), amount), ScriptTransfer(projectAddress, amount, buyAssetId)]
596639 }
597640
598641
599642
600643 @Callable(i)
601644 func shutdown () = if (!(isActive))
602645 then throw("DApp already inactive")
603646 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
604647 then throw("Only admin can call this function")
605648 else [BooleanEntry(keyActive, false)]
606649
607650
608651
609652 @Callable(i)
610653 func activate () = if (isActive)
611654 then throw("DApp already active")
612655 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
613656 then throw("Only admin can call this function")
614657 else [BooleanEntry(keyActive, true)]
615658
616659
617660 @Verifier(tx)
618661 func verify () = {
619662 let multiSignedByAdmins = {
620663 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
621664 then 1
622665 else 0
623666 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
624667 then 1
625668 else 0
626669 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
627670 then 1
628671 else 0
629672 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
630673 }
631674 let signedByAdmin = if (if (if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
632675 then true
633676 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey2))
634677 then true
635678 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey3))
636679 then true
637680 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKeyStaking)
638681 match tx {
639682 case dtx: DataTransaction =>
640683 if (valueOrElse(getBoolean(oracle, keyLaunchpadDataTransactionStatus), false))
641684 then signedByAdmin
642685 else false
643686 case _ =>
644687 multiSignedByAdmins
645688 }
646689 }
647690

github/deemru/w8io/169f3d6 
143.85 ms