tx · 3P5pp2hbwwejNCocneUzaq4gPkJ65pU145bCrLXfQtMG

3P6YGPihPiF81VELikoV1myU55iwTvmcQaQ:  -0.01400000 Waves

2021.12.20 16:22 [2907626] smart account 3P6YGPihPiF81VELikoV1myU55iwTvmcQaQ > SELF 0.00000000 Waves

{ "type": 13, "id": "3P5pp2hbwwejNCocneUzaq4gPkJ65pU145bCrLXfQtMG", "fee": 1400000, "feeAssetId": null, "timestamp": 1640006487845, "version": 2, "chainId": 87, "sender": "3P6YGPihPiF81VELikoV1myU55iwTvmcQaQ", "senderPublicKey": "BWnMC6WjWvjJRc2jc1XibbL3RSvL2mFekrvRxpJGdtp1", "proofs": [ "", "2hBBguPh5tETsALBLz7yN8KgYPngKCWTHTskWuzEh7fm45WivAMC53Fu6KzrZ6gHzbpmU85QMtLwEs25RMLpsaw5", "VWeLhmPd3THn99vMTvVuU4t41Fi8bewb1CZR2eQQUMrkV1AZSEAgPv2eCv9rrGPH7z9qFn3Zama3JEKAFP5W4mX" ], "script": "base64:AAIFAAAAAAAAFEMIAhIECgIBCBIDCgEIEhQKEggBAQgBAQEBAQEBARgEAQEEGBIECgIBCBIECgIBCBIECgIBCBIFCgMBAQgSAwoBARIDCgEBEgQKAgEBEgASABoQCgFBEgtrZXlEdXJhdGlvbhohCgFCEhxrZXlBbW91bnRCdXlBc3NldEluTWFya2V0aW5nGioKAUMSJWtleUFtb3VudEJ1eUFzc2V0SW5NYXJrZXRpbmdGaW5hbGl6ZWQaGAoBRBITa2V5VHJhbnNmZXJCdXlBc3NldBoZCgFFEhRrZXlGcmVlelN3b3BEdXJhdGlvbhodCgFGEhhrZXlGcmVlemVBZGRpdGlvbmFsVG9rZW4aFQoBRxIQa2V5RnJlZXplVG9rZW5JZBobCgFIEhZrZXlGcmVlemVUb2tlbkR1cmF0aW9uGhwKAUkSF2tleUZyZWV6ZVRva2VuUGVyVGlja2V0GhAKAUoSC2tleUJ1eVRva2VuGhMKAUsSDmtleUNsYWltUGFyYW1zGiAKAUwSG2tleUhpZ2hDb21wZXRpdGlvbkNvbWlzc2lvbhobCgFNEhZrZXlIaWdoQ29tcGV0aXRpb25TYWxlGhoKAU4SFWtleUhDVGlja2V0TGFzdE51bWJlchodCgFPEhhrZXlIaWdoQ29tcGV0aXRpb25BbW91bnQaIQoBUBIca2V5VG90YWxBbW91bnRCdXlBc3NldFNvbGRIQxoZCgFREhRrZXlVc2VyQ2xhaW1lZFRva2VucxocCgFSEhdrZXlVc2VyQ2xhaW1lZEJ1eVRva2VucxofCgFTEhprZXlVc2VyQm91Z2h0VGlja2V0c0Ftb3VudBoTCgFUEg5rZXlVc2VyVGlja2V0cxoVCgFVEhBrZXlVc2VySENUaWNrZXRzGiEKAVYSHGtleVVzZXJIQ0JvdWdodFRpY2tldHNBbW91bnQaIAoBVxIba2V5VXNlckF2YWlsYWJsZUFsbG9jYXRpb25zGiUKAVgSIGtleVVzZXJBbW91bnRCdXlBc3NldEluTWFya2V0aW5nGh0KAVkSGGtleVVzZXJCb3VnaHRBbGxvY2F0aW9ucxoXCgFaEhJrZXlVc2VyQ2xhaW1TdGF0dXMaDgoBYRIJa2V5QWN0aXZlGhwKAmFBEhZnZXRBc3NldEluZm9Gcm9tU3RyaW5nGg4KAmFCEghhc3NldFN0choHCgJhQxIBaRoRCgJhRBILbGF1bmNocGFkSWQaCgoCYUUSBGhhc2gaDQoCYUYSB2FkZHJlc3MaFAoCYUcSDnByb2plY3RBZGRyZXNzGhEKAmFIEgtzdGFydEhlaWdodBoOCgJhSRIIZHVyYXRpb24aDgoCYUoSCGJ1eVRva2VuGhAKAmFLEgpjb21taXNzaW9uGhUKAmFMEg90b2tlbnNQZXJUaWNrZXQaEwoCYU0SDXByaWNlUGVyVG9rZW4aGQoCYU4SE3N3b3BmaVRpY2tldHNBbW91bnQaGgoCYU8SFGNhbXBhaWduVG9rZW5zQW1vdW50GhkKAmFQEhN0b2tlbnNQZXJBbGxvY2F0aW9uGhMKAmFREg1zd29wUGVyVGlja2V0GhgKAmFSEhJzd29wRnJlZXplRHVyYXRpb24aEQoCYVMSC2NsYWltUGFyYW1zGhkKAmFUEhNIaWdoQ29tcGV0aXRpb25TYWxlGh4KAmFVEhhoaWdoQ29tcGV0aXRpb25Db21pc3Npb24aIgoCYVYSHGhpZ2hDb21wZXRpdGlvblRpY2tldHNBbW91bnQaGwoCYVcSFWZyZWV6ZUFkZGl0aW9uYWxUb2tlbhoSCgJhWBIMZnJlZXplUGFyYW1zGhQKAmFZEg5sYXVuY2hwYWRJZFN0choRCgJhWhILJHQwNjU0ODY2MjMaIAoCYWESGmtleVVzZXJXaW5uZWRUaWNrZXRzQW1vdW50GhgKAmFiEhJrZXlVc2VyRnJlZXplVG9rZW4aDAoCYWMSBm9yYWNsZRoQCgJhZBIKZ292ZXJuYW5jZRoWCgJhZRIQY29tbWlzc2lvbldhbGxldBoYCgJhZhISc3Rha2luZ1VTRE5BZGRyZXNzGgoKAmFnEgRVU0ROGhgKAmFoEhJhZG1pblB1YktleVN0YWtpbmcaGgoCYWkSFG1heEFsbG9jYXRpb25zQW1vdW50Gg4KAmFqEghpc0FjdGl2ZRoXCgJhaxIRYWN0aXZlTGF1bmNocGFkSWQaEQoCYWwSC2dldEFkbWluUHViGhEKAmFtEgtrZXlBZG1pblB1YhoNCgJhbhIHJG1hdGNoMBoMCgJhbxIGc3RyaW5nGg0KAmFwEgdub3RoaW5nGhIKAmFxEgxhZG1pblB1YktleTEaEgoCYXISDGFkbWluUHViS2V5MhoSCgJhcxIMYWRtaW5QdWJLZXkzGhIKAmF0EgxnZXRBc3NldEluZm8aDQoCYXUSB2Fzc2V0SWQaCAoCYXYSAmlkGg4KAmF3EghzdHJpbmdJZBoKCgJheBIEaW5mbxoLCgJheRIFd2F2ZXMaGAoCYXoSEmdldExhdW5jaHBhZE5leHRJZBoUCgFiEg9rZXlBZG1pblB1YktleTEaGQoCYkESE2NvbW1pc3Npb25QZXJUaWNrZXQaFQoCYkISD2J1eVRpY2tldEFtb3VudBocCgJiQxIWYWxsb3dlZEJ1eVRpY2tldEFtb3VudBoiCgJiRBIcYWxsb3dlZEJ1eVByaWNlV2l0aENvbWlzc2lvbhoMCgJiRRIGY2hhbmdlGhoKAmJGEhRmcmVlemVUb2tlblBlclRpY2tldBoTCgJiRxINJHQwMTI3MTMxMjgwMBoVCgJiSBIPcG10QW1vdW50RnJlZXplGhYKAmJJEhBwbXRBc3NldElkRnJlZXplGhMKAmJKEg0kdDAxMjgxNzEyOTA4GhkKAmJLEhNwbXRGcmVlemVTdHJBc3NldElkGhgKAmJMEhJwbXRGcmVlemVBc3NldE5hbWUaFwoCYk0SEXBtdEZyZWV6ZURlY2ltYWxzGhYKAmJOEhBuZWVkRnJlZXplVG9rZW5zGh4KAmJPEhh1c2VyQm91Z2h0VGlja2V0c051bWJlcnMaHAoCYlASFmxhc3RCb3VnaHRUaWNrZXROdW1iZXIaEQoCYlESC2JvdWdodFJhbmdlGiEKAmJSEhtuZXdVc2VyQm91Z2h0VGlja2V0c051bWJlcnMaCQoCYlMSA2ludhoPCgJiVBIJYmFzZUVudHJ5GhMKAmJVEg0kdDAxNDk1NTE1MDMwGhMKAmJWEg0kdDAxNTAzNTE1MTg1GhkKAmJXEhN1c2VyVXNkbkluTWFya2V0aW5nGhUKAmJYEg91c2RuSW5NYXJrZXRpbmcaFwoCYlkSEWJvdWdodEFsbG9jYXRpb25zGhMKAmJaEg0kdDAxNTg1NDE1OTk4Gg8KAmJhEglwbXRBbW91bnQaEAoCYmISCnBtdEFzc2V0SWQaEQoCYmMSCyR0MDY2MzI2NzA1GhMKAmJkEg1wbXRTdHJBc3NldElkGhIKAmJlEgxwbXRBc3NldE5hbWUaEQoCYmYSC3BtdERlY2ltYWxzGhsKAmJnEhVmcmVlemVBZGRpdGlvbmFsRW50cnkaCwoCYmgSBXJlZklkGhEKAmJpEgskdDA5Mjg3OTM2MhoRCgJiahILJHQwOTM2Nzk1MTcaEAoCYmsSCmJ1eUFzc2V0SWQaEwoCYmwSDWJ1eUFzc2V0U3RySWQaEgoCYm0SDGJ1eUFzc2V0TmFtZRoWCgJibhIQYnV5QXNzZXREZWNpbWFscxoRCgJibxILc3Rha2VkU3dvcHMaHQoCYnASF2FsbG93ZWRUaWNrZXRzQW1vdW50QWxsGhkKAmJxEhNib3VnaHRUaWNrZXRzQW1vdW50GhoKAmJyEhRhbGxvd2VkVGlja2V0c0Ftb3VudBoTCgJicxINZnJlZXplVG9rZW5JZBoQCgJidBIKdG9rZW5QcmljZRoTCgJidRINJHQwMTE0MDUxMTU0ORoNCgJidhIHdG9rZW5JZBoVCgJidxIPdG9rZW5TdHJBc3NldElkGhQKAmJ4Eg50b2tlbkFzc2V0TmFtZRoTCgJieRINdG9rZW5EZWNpbWFscxoRCgJiehILdGlja2V0UHJpY2UaFAoBYxIPa2V5QWRtaW5QdWJLZXkyGhMKAmNBEg0kdDAyNTkzNTI2MDg1GhMKAmNCEg13b25uZWRUaWNrZXRzGhUKAmNDEg93b25uZWRIQ1RpY2tldHMaGgoCY0QSFGF3YWlsYWJsZUFsbG9jYXRpb25zGhgKAmNFEhJhbGxvd2VkQWxsb2NhdGlvbnMaEwoCY0YSDSR0MDI2ODc0MjcwMTgaGgoCY0cSFHRyYW5zZmVyVG9rZW5zQW1vdW50GiEKAmNIEhtub3RBbGxvd2VkQWxsb2NhdGlvbnNUb2tlbnMaHAoCY0kSFmJ1eUFzc2V0Rm9yQWxsb2NhdGlvbnMaIAoCY0oSGmJ1eUFzc2V0Rm9yVW53b25uZWRUaWNrZXRzGiIKAmNLEhxidXlBc3NldEZvckhDVW53b25uZWRUaWNrZXRzGhUKAmNMEg9jbGFpbWVkQnV5VG9rZW4aHAoCY00SFnJldHVybmVkQnV5QXNzZXRBbW91bnQaFgoCY04SEHRyYW5zZmVyQnV5QXNzZXQaEwoCY08SDWNsYWltZWRQYXJhbXMaFAoCY1ASDnRyYW5zZmVyVG9rZW5zGhMKAmNREg1jbGFpbWVkVG9rZW5zGhEKAmNSEgtzdGFydEFtb3VudBoSCgJjUxIMdW5sb2NrUGVyaW9kGhEKAmNUEgtibG9ja0hlaWdodBoSCgJjVRIMdW5sb2NrSGVpZ2h0GhkKAmNWEhNhbGxvd2VkVG9rZW5zQW1vdW50GhYKAmNXEhBjbGFpbVN0YXR1c0VudHJ5GhcKAmNYEhF1c2VyVG9rZW5zRnJlZXplZBoZCgJjWRITZnJlZXplVG9rZW5EdXJhdGlvbhoUCgJjWhIOYmxvY2tFbmRIZWlnaHQaIgoCY2ESHGFsbG9jYXRpb25QcmljZVdpdGhDb21pc3Npb24aGgoCY2ISFGJ1eUFsbG9jYXRpb25zQW1vdW50GhMKAmNjEg0kdDAxODMwNzE4MzgyGhMKAmNkEg0kdDAxODM4NzE4NTM3GhsKAmNlEhVib3VnaHRIQ1RpY2tldHNBbW91bnQaGQoCY2YSE2hpZ2hDb21wZXRpdGlvblNhbGUaEwoCY2cSDSR0MDE5Nzg2MTk5MzAaGwoCY2gSFWJ1eVByaWNlV2l0aENvbWlzc2lvbhoPCgJjaRIJdnJmSGVpZ2h0GhAKAmNqEgpzZWNyZXRXb3JkGg8KAmNrEglzYXZlZEhhc2gaDgoCY2wSCGNhbGNIYXNoGhMKAmNtEg0kdDAyMjcxNTIyODY1GhIKAmNuEgxjb21taXNzaW9uSEMaGAoCY28SEnRyYW5zZmVyZWRCdXlBc3NldBohCgJjcBIbc3dvcGZpTWVtYmVyc0J1eUFzc2V0QW1vdW50GhwKAmNxEhZzd29wZmlIQ0J1eUFzc2V0QW1vdW50GhwKAmNyEhZzd29wZmlNZW1iZXJzQ29taXNzaW9uGhcKAmNzEhFzd29wZmlIQ0NvbWlzc2lvbhokCgJjdBIedG90YWxBbW91bnRCdXlBc3NldEluTWFya2V0aW5nGhgKAmN1EhJtYXJrZXRpbmdDb21pc3Npb24aEwoCY3YSDXVuc3Rha2VBbW91bnQaEwoCY3cSDWJvdWdodFRpY2tldHMaFQoCY3gSD2JvdWdodEhDVGlja2V0cxoVCgJjeRIPdXNlckNsYWltU3RhdHVzGhQKAmN6Eg5maW5hbGl6ZUhlaWdodBoUCgFkEg9rZXlBZG1pblB1YktleTMaDAoCZGESBmFtb3VudBoTCgJkYhINJHQwMzM0MTQzMzU2NBoICgJkYxICdHgaDAoCZGQSBnZlcmlmeRoZCgJkZRITbXVsdGlTaWduZWRCeUFkbWlucxoYCgJkZhISYWRtaW5QdWJLZXkxU2lnbmVkGhgKAmRnEhJhZG1pblB1YktleTJTaWduZWQaGAoCZGgSEmFkbWluUHViS2V5M1NpZ25lZBoTCgJkaRINc2lnbmVkQnlBZG1pbhoJCgJkahIDZHR4GiYKAWUSIWtleUxhdW5jaHBhZERhdGFUcmFuc2FjdGlvblN0YXR1cxoXCgFmEhJrZXlMYXVuY2hwYWROZXh0SWQaGQoBZxIUa2V5TGF1bmNocGFkQWN0aXZlSWQaEgoBaBINa2V5SW5pdENhbGxlchoPCgFpEgprZXlBZGRyZXNzGhIKAWoSDWtleUluaXRIZWlnaHQaEwoBaxIOa2V5U3RhcnRIZWlnaHQaFgoBbBIRa2V5RmluYWxpc2VIZWlnaHQaEQoBbRIMa2V5Q29taXNzaW9uGg8KAW4SCmtleUFzc2V0SWQaGAoBbxITa2V5VG90YWxUb2tlbkFtb3VudBofCgFwEhprZXlUb3RhbEFtb3VudEJ1eUFzc2V0U29sZBoXCgFxEhJrZXlUb2tlbnNQZXJUaWNrZXQaFQoBchIQa2V5UHJpY2VQZXJUb2tlbhoVCgFzEhBrZXlTd29wUGVyVGlja2V0GhsKAXQSFmtleVN3b3BmaVRpY2tldHNBbW91bnQaHAoBdRIXa2V5Q2FtcGFpZ25Ub2tlbnNBbW91bnQaGwoBdhIWa2V5VG9rZW5zUGVyQWxsb2NhdGlvbhoYCgF3EhNrZXlUaWNrZXRMYXN0TnVtYmVyGhgKAXgSE2tleUdvdmVybmFuY2VTdGFrZWQaEQoBeRIMa2V5VXNlclJlZklkGhIKAXoSDWtleVZlcmlmeUhhc2gAAABGAAAAAAFhAgAAAAZhY3RpdmUAAAAAAWICAAAAC2FkbWluX3B1Yl8xAAAAAAFjAgAAAAthZG1pbl9wdWJfMgAAAAABZAIAAAALYWRtaW5fcHViXzMAAAAAAWUCAAAAIWxhdW5jaHBhZF9kYXRhX3RyYW5zYWN0aW9uX3N0YXR1cwAAAAABZgIAAAARbGF1bmNocGFkX25leHRfaWQAAAAAAWcCAAAAE2xhdW5jaHBhZF9hY3RpdmVfaWQAAAAAAWgCAAAAC2luaXRfY2FsbGVyAAAAAAFpAgAAAAhfYWRkcmVzcwAAAAABagIAAAAMX2luaXRfaGVpZ2h0AAAAAAFrAgAAAA1fc3RhcnRfaGVpZ2h0AAAAAAFsAgAAABBfZmluYWxpc2VfaGVpZ2h0AAAAAAFtAgAAAApfY29taXNzaW9uAAAAAAFuAgAAAAlfYXNzZXRfaWQAAAAAAW8CAAAAE190b3RhbF90b2tlbl9hbW91bnQAAAAAAXACAAAAFV90b3RhbF9idXlfYXNzZXRfc29sZAAAAAABcQIAAAASX3Rva2Vuc19wZXJfdGlja2V0AAAAAAFyAgAAABBfcHJpY2VfcGVyX3Rva2VuAAAAAAFzAgAAABBfc3dvcF9wZXJfdGlja2V0AAAAAAF0AgAAABdfdGlja2V0c19zd29wZmlfbWVtYmVycwAAAAABdQIAAAATX3Rva2Vuc19hY2Nlc3NfbGlzdAAAAAABdgIAAAAWX3Rva2Vuc19wZXJfYWxsb2NhdGlvbgAAAAABdwIAAAAkX3RpY2tldF9sYXN0X251bWJlcl9oaWdoX2NvbXBldGl0aW9uAAAAAAF4AgAAAAxfU1dPUF9hbW91bnQAAAAAAXkCAAAAB19yZWZfaWQAAAAAAXoCAAAADF92ZXJpZnlfaGFzaAAAAAABQQIAAAAJX2R1cmF0aW9uAAAAAAFCAgAAACdfdG90YWxfcHVyY2hhc2VkX2J1eV9hc3NldF9pbl9tYXJrZXRpbmcAAAAAAUMCAAAAMV90b3RhbF9wdXJjaGFzZWRfYnV5X2Fzc2V0X2luX21hcmtldGluZ19maW5hbGl6ZWQAAAAAAUQCAAAAE190cmFuc2Zlcl9idXlfYXNzZXQAAAAAAUUCAAAAFV9mcmVlemVfc3dvcF9kdXJhdGlvbgAAAAABRgIAAAAYX2ZyZWV6ZV9hZGRpdGlvbmFsX3Rva2VuAAAAAAFHAgAAABBfZnJlZXplX3Rva2VuX2lkAAAAAAFIAgAAABZfZnJlZXplX3Rva2VuX2R1cmF0aW9uAAAAAAFJAgAAABhfZnJlZXplX3Rva2VuX3Blcl90aWNrZXQAAAAAAUoCAAAACl9idXlfdG9rZW4AAAAAAUsCAAAADV9jbGFpbV9wYXJhbXMAAAAAAUwCAAAAG19oaWdoX2NvbXBldGl0aW9uX2NvbWlzc2lv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", "height": 2907626, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 2WJW9WjMKoGGtWcBKquj1NQr83BkptEjmiTEoo8KaMQs Next: 68XDz2f2mYmKWsG6TzHzqmmEvJ3CrxeVubbizUd1NFip Diff:
OldNewDifferences
8585
8686 let keyTotalAmountBuyAssetSoldHC = "_total_buy_asset_sold_high_competition"
8787
88+let keyUserClaimedTokens = "_claimed_tokens"
89+
90+let keyUserClaimedBuyTokens = "_claimed_buy_tokens"
91+
8892 let keyUserBoughtTicketsAmount = "_bought_tickets"
8993
9094 let keyUserTickets = "_tickets_number"
102106 let keyUserClaimStatus = "_claim_status"
103107
104108 let keyUserWinnedTicketsAmount = "_tickets_result"
105-
106-let keyUserWinnedHighCompetitionTicketsAmount = "_tickets_result_high_competition"
107109
108110 let keyUserFreezeToken = "_freeze_token_amount"
109111
154156 func getLaunchpadNextId () = valueOrElse(getInteger(this, keyLaunchpadNextId), 1)
155157
156158
157-func stakedUsdnAmount () = valueOrElse(getInteger(stakingUSDNAddress, ((("rpd_balance_" + toBase58String(USDN)) + "_") + toString(this))), 0)
158-
159-
160159 func getAssetInfoFromString (assetStr) = if ((assetStr == "WAVES"))
161160 then $Tuple4(unit, "WAVES", "WAVES", 8)
162161 else {
201200 else {
202201 let launchpadId = getLaunchpadNextId()
203202 let launchpadIdStr = toString(launchpadId)
204- let $t064516526 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
205- let pmtAmount = $t064516526._1
206- let pmtAssetId = $t064516526._2
207- let $t065356608 = getAssetInfo(pmtAssetId)
208- let pmtStrAssetId = $t065356608._1
209- let pmtAssetName = $t065356608._2
210- let pmtDecimals = $t065356608._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
211210 let freezeAdditionalEntry = if (freezeAdditionalToken)
212211 then [BooleanEntry((launchpadIdStr + keyFreezeAdditionalToken), true), StringEntry((launchpadIdStr + keyFreezeTokenId), freezeParams[0]), IntegerEntry((launchpadIdStr + keyFreezeTokenDuration), parseIntValue(freezeParams[1])), IntegerEntry((launchpadIdStr + keyFreezeTokenPerTicket), parseIntValue(freezeParams[2]))]
213212 else nil
214- ([IntegerEntry((pmtStrAssetId + "_launchpad"), launchpadId), IntegerEntry(keyLaunchpadNextId, (launchpadId + 1)), StringEntry((launchpadIdStr + keyAddress), projectAddress), IntegerEntry((launchpadIdStr + keyInitHeight), height), IntegerEntry((launchpadIdStr + keyStartHeight), startHeight), IntegerEntry((launchpadIdStr + keyDuration), duration), StringEntry((launchpadIdStr + keyBuyToken), buyToken), IntegerEntry((launchpadIdStr + keyFreezSwopDuration), swopFreezeDuration), IntegerEntry((launchpadIdStr + keyTotalTokenAmount), pmtAmount), StringEntry((launchpadIdStr + keyAssetId), pmtStrAssetId), IntegerEntry((launchpadIdStr + keyComission), commission), IntegerEntry((launchpadIdStr + keyTicketLastNumber), 0), IntegerEntry((launchpadIdStr + keyTokensPerTicket), tokensPerTicket), IntegerEntry((launchpadIdStr + keyPricePerToken), pricePerToken), IntegerEntry((launchpadIdStr + keySwopPerTicket), swopPerTicket), IntegerEntry((launchpadIdStr + keySwopfiTicketsAmount), swopfiTicketsAmount), IntegerEntry((launchpadIdStr + keyCampaignTokensAmount), campaignTokensAmount), IntegerEntry((launchpadIdStr + keyTokensPerAllocation), tokensPerAllocation), StringEntry((launchpadIdStr + keyClaimParams), makeString(claimParams, ",")), BooleanEntry((launchpadIdStr + keyHighCompetitionSale), HighCompetitionSale), IntegerEntry((launchpadIdStr + keyHighCompetitionComission), highCompetitionComission), IntegerEntry((launchpadIdStr + keyHighCompetitionAmount), highCompetitionTicketsAmount), IntegerEntry(keyLaunchpadActiveId, launchpadId), StringEntry(keyInitCaller, "")] ++ freezeAdditionalEntry)
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)
215214 }
216215
217216
218217
219218 @Callable(i)
220219 func commitSwopfiSale (launchpadId,refId) = {
221- let $t091219196 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
222- let pmtAmount = $t091219196._1
223- let pmtAssetId = $t091219196._2
224- let $t092019351 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
225- let buyAssetId = $t092019351._1
226- let buyAssetStrId = $t092019351._2
227- let buyAssetName = $t092019351._3
228- let buyAssetDecimals = $t092019351._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
229228 let stakedSwops = valueOrElse(getInteger(governance, (toString(i.caller) + keyGovernanceStaked)), 0)
230229 let allowedTicketsAmountAll = (stakedSwops / getIntegerValue(this, (toString(launchpadId) + keySwopPerTicket)))
231230 let boughtTicketsAmount = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtTicketsAmount)), 0)
263262 else {
264263 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
265264 let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
266- let $t01123911383 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
267- let tokenId = $t01123911383._1
268- let tokenStrAssetId = $t01123911383._2
269- let tokenAssetName = $t01123911383._3
270- let tokenDecimals = $t01123911383._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
271270 let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
272271 let commissionPerTicket = fraction(ticketPrice, getIntegerValue(this, (toString(launchpadId) + keyComission)), 100)
273272 let buyTicketAmount = (pmtAmount / (ticketPrice + commissionPerTicket))
283282 then {
284283 let freezeTokenId = getStringValue(this, (toString(launchpadId) + keyFreezeTokenId))
285284 let freezeTokenPerTicket = getIntegerValue(this, (toString(launchpadId) + keyFreezeTokenPerTicket))
286- let $t01254712634 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
287- let pmtAmountFreeze = $t01254712634._1
288- let pmtAssetIdFreeze = $t01254712634._2
289- let $t01265112742 = getAssetInfo(pmtAssetId)
290- let pmtFreezeStrAssetId = $t01265112742._1
291- let pmtFreezeAssetName = $t01265112742._2
292- let pmtFreezeDecimals = $t01265112742._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
293292 let needFreezeTokens = (freezeTokenPerTicket * buyTicketAmount)
294293 if (if ((pmtFreezeStrAssetId != freezeTokenId))
295294 then true
323322
324323 @Callable(i)
325324 func commitAccessListSale (launchpadId,refId) = {
326- let $t01478914864 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
327- let pmtAmount = $t01478914864._1
328- let pmtAssetId = $t01478914864._2
329- let $t01486915019 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
330- let buyAssetId = $t01486915019._1
331- let buyAssetStrId = $t01486915019._2
332- let buyAssetName = $t01486915019._3
333- let buyAssetDecimals = $t01486915019._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
334333 let userUsdnInMarketing = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserAmountBuyAssetInMarketing)), 0)
335334 let usdnInMarketing = valueOrElse(getInteger(this, (toString(launchpadId) + keyAmountBuyAssetInMarketing)), 0)
336335 let boughtAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtAllocations)), 0)
337336 let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
338337 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
339338 let tokensPerAllocation = getIntegerValue(this, (toString(launchpadId) + keyTokensPerAllocation))
340- let $t01568815832 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
341- let tokenId = $t01568815832._1
342- let tokenStrAssetId = $t01568815832._2
343- let tokenAssetName = $t01568815832._3
344- let tokenDecimals = $t01568815832._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
345344 let allocationPriceWithComission = fraction(fraction(tokenPrice, tokensPerAllocation, pow(10, 0, tokenDecimals, 0, 0, DOWN)), (100 + commission), 100)
346345 let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
347346 let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
383382
384383 @Callable(i)
385384 func commitHighCompetitionSale (launchpadId,refId) = {
386- let $t01814118216 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
387- let pmtAmount = $t01814118216._1
388- let pmtAssetId = $t01814118216._2
389- let $t01822118371 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
390- let buyAssetId = $t01822118371._1
391- let buyAssetStrId = $t01822118371._2
392- let buyAssetName = $t01822118371._3
393- let buyAssetDecimals = $t01822118371._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
394393 let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
395394 let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
396395 let boughtHCTicketsAmount = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserHCBoughtTicketsAmount)), 0)
412411 else {
413412 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
414413 let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
415- let $t01962019764 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
416- let tokenId = $t01962019764._1
417- let tokenStrAssetId = $t01962019764._2
418- let tokenAssetName = $t01962019764._3
419- let tokenDecimals = $t01962019764._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
420419 let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
421420 let commissionPerTicket = fraction(ticketPrice, getIntegerValue(this, (toString(launchpadId) + keyHighCompetitionComission)), 100)
422421 let buyTicketAmount = (pmtAmount / (ticketPrice + commissionPerTicket))
461460 else if ((calcHash != savedHash))
462461 then throw("vrf Height hash not matching")
463462 else {
464- let $t02254922699 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
465- let buyAssetId = $t02254922699._1
466- let buyAssetStrId = $t02254922699._2
467- let buyAssetName = $t02254922699._3
468- let buyAssetDecimals = $t02254922699._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
469468 let projectAddress = addressFromStringValue(getStringValue(this, (toString(launchpadId) + keyAddress)))
470469 let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
471470 let commissionHC = getIntegerValue(this, (toString(launchpadId) + keyHighCompetitionComission))
493492
494493
495494 @Callable(i)
495+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)
499+ let userClaimStatus = valueOrElse(getBoolean(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimStatus)), false)
500+ let finalizeHeight = valueOrElse(getInteger(this, (toString(launchpadId) + keyFinaliseHeight)), 0)
501+ if (!(isActive))
502+ then throw("DApp is inactive at this moment")
503+ else if ((finalizeHeight == 0))
504+ then throw("You can't claim because results are not finalized")
505+ else if (userClaimStatus)
506+ then throw("You are already claimed")
507+ else if (if (if ((boughtTickets == 0))
508+ then (boughtAllocations == 0)
509+ else false)
510+ then (boughtHCTickets == 0)
511+ else false)
512+ then throw("You can't claim because you don't buy anything")
513+ else {
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
519+ 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)
521+ let awailableAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserAvailableAllocations)), 0)
522+ let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
523+ let allowedAllocations = min([boughtAllocations, awailableAllocations])
524+ let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
525+ let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
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
531+ let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
532+ let tokensPerAllocation = getIntegerValue(this, (toString(launchpadId) + keyTokensPerAllocation))
533+ let transferTokensAmount = (((wonnedTickets * tokensPerTicket) + (allowedAllocations * tokensPerAllocation)) + (wonnedHCTickets * tokensPerTicket))
534+ let notAllowedAllocationsTokens = ((boughtAllocations - allowedAllocations) * tokensPerAllocation)
535+ let buyAssetForAllocations = fraction(fraction(notAllowedAllocationsTokens, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN)), (100 + commission), 100)
536+ let buyAssetForUnwonnedTickets = fraction(((boughtTickets - wonnedTickets) * ticketPrice), (100 + commission), 100)
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))
540+ then true
541+ else (0 > buyAssetForUnwonnedTickets))
542+ then true
543+ else (0 > buyAssetForHCUnwonnedTickets))
544+ then throw("Error with allowed allocation param or wonned tickets param please contact support")
545+ else {
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)]
549+ else nil
550+ let inv = if (if ((returnedBuyAssetAmount > 0))
551+ then (buyAssetId == USDN)
552+ else false)
553+ then invoke(stakingUSDNAddress, "unlockNeutrino", [returnedBuyAssetAmount, toBase58String(USDN)], nil)
554+ else 0
555+ if ((inv == inv))
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+ }
593+ else throw("Strict value is not equal to itself.")
594+ }
595+ }
596+ }
597+
598+
599+
600+@Callable(i)
601+func claimFreezeToken (launchpadId) = {
602+ let freezeAdditionalToken = valueOrElse(getBoolean(this, (toString(launchpadId) + keyFreezeAdditionalToken)), false)
603+ if (!(isActive))
604+ then throw("DApp is inactive at this moment")
605+ else if (!(isDefined(getInteger(this, (toString(launchpadId) + keyFinaliseHeight)))))
606+ then throw("You can't claim because results are not finalized")
607+ else if (!(freezeAdditionalToken))
608+ then throw("There are no additional token freezing for this launchpad")
609+ else {
610+ let tokenId = fromBase58String(getStringValue(this, (toString(launchpadId) + keyFreezeTokenId)))
611+ let userTokensFreezed = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserFreezeToken)), 0)
612+ let startHeight = valueOrElse(getInteger(this, (toString(launchpadId) + keyStartHeight)), 0)
613+ let duration = valueOrElse(getInteger(this, (toString(launchpadId) + keyDuration)), 0)
614+ let freezeTokenDuration = getIntegerValue(this, (toString(launchpadId) + keyFreezeTokenDuration))
615+ let blockEndHeight = ((startHeight + duration) + freezeTokenDuration)
616+ if ((userTokensFreezed == 0))
617+ then throw("You are already claimed your tokens or not paid anything")
618+ else if ((blockEndHeight > height))
619+ then throw(("Your tokens freezed teel " + toString(blockEndHeight)))
620+ else [ScriptTransfer(i.caller, userTokensFreezed, tokenId), IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserFreezeToken), 0)]
621+ }
622+ }
623+
624+
625+
626+@Callable(i)
496627 func transferBuyAsset (launchpadId,amount) = if (!(isActive))
497628 then throw("DApp is inactive")
498629 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
499630 then throw("Only admin can call this function")
500631 else {
501632 let projectAddress = addressFromStringValue(getStringValue(this, (toString(launchpadId) + keyAddress)))
502- let $t02505825208 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
503- let buyAssetId = $t02505825208._1
504- let buyAssetStrId = $t02505825208._2
505- let buyAssetName = $t02505825208._3
506- let buyAssetDecimals = $t02505825208._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
507638 [IntegerEntry((toString(launchpadId) + keyTransferBuyAsset), amount), ScriptTransfer(projectAddress, amount, buyAssetId)]
508639 }
509640
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let keyActive = "active"
55
66 let keyAdminPubKey1 = "admin_pub_1"
77
88 let keyAdminPubKey2 = "admin_pub_2"
99
1010 let keyAdminPubKey3 = "admin_pub_3"
1111
1212 let keyLaunchpadDataTransactionStatus = "launchpad_data_transaction_status"
1313
1414 let keyLaunchpadNextId = "launchpad_next_id"
1515
1616 let keyLaunchpadActiveId = "launchpad_active_id"
1717
1818 let keyInitCaller = "init_caller"
1919
2020 let keyAddress = "_address"
2121
2222 let keyInitHeight = "_init_height"
2323
2424 let keyStartHeight = "_start_height"
2525
2626 let keyFinaliseHeight = "_finalise_height"
2727
2828 let keyComission = "_comission"
2929
3030 let keyAssetId = "_asset_id"
3131
3232 let keyTotalTokenAmount = "_total_token_amount"
3333
3434 let keyTotalAmountBuyAssetSold = "_total_buy_asset_sold"
3535
3636 let keyTokensPerTicket = "_tokens_per_ticket"
3737
3838 let keyPricePerToken = "_price_per_token"
3939
4040 let keySwopPerTicket = "_swop_per_ticket"
4141
4242 let keySwopfiTicketsAmount = "_tickets_swopfi_members"
4343
4444 let keyCampaignTokensAmount = "_tokens_access_list"
4545
4646 let keyTokensPerAllocation = "_tokens_per_allocation"
4747
4848 let keyTicketLastNumber = "_ticket_last_number_high_competition"
4949
5050 let keyGovernanceStaked = "_SWOP_amount"
5151
5252 let keyUserRefId = "_ref_id"
5353
5454 let keyVerifyHash = "_verify_hash"
5555
5656 let keyDuration = "_duration"
5757
5858 let keyAmountBuyAssetInMarketing = "_total_purchased_buy_asset_in_marketing"
5959
6060 let keyAmountBuyAssetInMarketingFinalized = "_total_purchased_buy_asset_in_marketing_finalized"
6161
6262 let keyTransferBuyAsset = "_transfer_buy_asset"
6363
6464 let keyFreezSwopDuration = "_freeze_swop_duration"
6565
6666 let keyFreezeAdditionalToken = "_freeze_additional_token"
6767
6868 let keyFreezeTokenId = "_freeze_token_id"
6969
7070 let keyFreezeTokenDuration = "_freeze_token_duration"
7171
7272 let keyFreezeTokenPerTicket = "_freeze_token_per_ticket"
7373
7474 let keyBuyToken = "_buy_token"
7575
7676 let keyClaimParams = "_claim_params"
7777
7878 let keyHighCompetitionComission = "_high_competition_comission"
7979
8080 let keyHighCompetitionSale = "_high_competition_sale"
8181
8282 let keyHCTicketLastNumber = "_high_competition_ticket_last_number"
8383
8484 let keyHighCompetitionAmount = "_tickets_high_competition"
8585
8686 let keyTotalAmountBuyAssetSoldHC = "_total_buy_asset_sold_high_competition"
8787
88+let keyUserClaimedTokens = "_claimed_tokens"
89+
90+let keyUserClaimedBuyTokens = "_claimed_buy_tokens"
91+
8892 let keyUserBoughtTicketsAmount = "_bought_tickets"
8993
9094 let keyUserTickets = "_tickets_number"
9195
9296 let keyUserHCTickets = "_tickets_number_high_competition"
9397
9498 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"
105-
106-let keyUserWinnedHighCompetitionTicketsAmount = "_tickets_result_high_competition"
107109
108110 let keyUserFreezeToken = "_freeze_token_amount"
109111
110112 let oracle = Address(base58'3PEbqViERCoKnmcSULh6n2aiMvUdSQdCsom')
111113
112114 let governance = Address(base58'3PLHVWCqA9DJPDbadUofTohnCULLauiDWhS')
113115
114116 let commissionWallet = Address(base58'3PGYafJ2GuqPckmZNywet8moiPnBHz51Xdg')
115117
116118 let stakingUSDNAddress = Address(base58'3PNikM6yp4NqcSU8guxQtmR5onr2D4e8yTJ')
117119
118120 let USDN = base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p'
119121
120122 let adminPubKeyStaking = base58'Czn4yoAuUZCVCLJDRfskn8URfkwpknwBTZDbs1wFrY7h'
121123
122124 let maxAllocationsAmount = 2
123125
124126 let isActive = valueOrElse(getBoolean(this, keyActive), true)
125127
126128 let activeLaunchpadId = valueOrElse(getIntegerValue(this, keyLaunchpadActiveId), -1)
127129
128130 func getAdminPub (keyAdminPub) = match getString(oracle, keyAdminPub) {
129131 case string: String =>
130132 fromBase58String(string)
131133 case nothing =>
132134 throw("Admin public key is empty")
133135 }
134136
135137
136138 let adminPubKey1 = getAdminPub(keyAdminPubKey1)
137139
138140 let adminPubKey2 = getAdminPub(keyAdminPubKey2)
139141
140142 let adminPubKey3 = getAdminPub(keyAdminPubKey3)
141143
142144 func getAssetInfo (assetId) = match assetId {
143145 case id: ByteVector =>
144146 let stringId = toBase58String(id)
145147 let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
146148 $Tuple3(stringId, info.name, info.decimals)
147149 case waves: Unit =>
148150 $Tuple3("WAVES", "WAVES", 8)
149151 case _ =>
150152 throw("Match error")
151153 }
152154
153155
154156 func getLaunchpadNextId () = valueOrElse(getInteger(this, keyLaunchpadNextId), 1)
155157
156158
157-func stakedUsdnAmount () = valueOrElse(getInteger(stakingUSDNAddress, ((("rpd_balance_" + toBase58String(USDN)) + "_") + toString(this))), 0)
158-
159-
160159 func getAssetInfoFromString (assetStr) = if ((assetStr == "WAVES"))
161160 then $Tuple4(unit, "WAVES", "WAVES", 8)
162161 else {
163162 let stringId = assetStr
164163 let id = fromBase58String(assetStr)
165164 let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
166165 $Tuple4(id, stringId, info.name, info.decimals)
167166 }
168167
169168
170169 @Callable(i)
171170 func hashingRandom (launchpadId,hash) = if (!(isActive))
172171 then throw("DApp is inactive at this moment")
173172 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
174173 then throw("Only admin can call this function")
175174 else [StringEntry((toString(launchpadId) + keyVerifyHash), hash)]
176175
177176
178177
179178 @Callable(i)
180179 func initCaller (address) = if (!(isActive))
181180 then throw("DApp is inactive at this moment")
182181 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
183182 then throw("Only admin can call this function")
184183 else [StringEntry(keyInitCaller, address)]
185184
186185
187186
188187 @Callable(i)
189188 func init (projectAddress,startHeight,duration,buyToken,commission,tokensPerTicket,pricePerToken,swopfiTicketsAmount,campaignTokensAmount,tokensPerAllocation,swopPerTicket,swopFreezeDuration,claimParams,HighCompetitionSale,highCompetitionComission,highCompetitionTicketsAmount,freezeAdditionalToken,freezeParams) = if (!(isActive))
190189 then throw("DApp is inactive at this moment")
191190 else if ((toString(i.caller) != valueOrElse(getString(this, keyInitCaller), "")))
192191 then throw("Only project admin can call init function")
193192 else if ((size(i.payments) != 1))
194193 then throw("One attached payment expected")
195194 else if ((height > startHeight))
196195 then throw("Start height must be greater than blockchain height")
197196 else if (if (freezeAdditionalToken)
198197 then (size(freezeParams) != 3)
199198 else false)
200199 then throw("Freeze params list must have 3 items")
201200 else {
202201 let launchpadId = getLaunchpadNextId()
203202 let launchpadIdStr = toString(launchpadId)
204- let $t064516526 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
205- let pmtAmount = $t064516526._1
206- let pmtAssetId = $t064516526._2
207- let $t065356608 = getAssetInfo(pmtAssetId)
208- let pmtStrAssetId = $t065356608._1
209- let pmtAssetName = $t065356608._2
210- let pmtDecimals = $t065356608._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
211210 let freezeAdditionalEntry = if (freezeAdditionalToken)
212211 then [BooleanEntry((launchpadIdStr + keyFreezeAdditionalToken), true), StringEntry((launchpadIdStr + keyFreezeTokenId), freezeParams[0]), IntegerEntry((launchpadIdStr + keyFreezeTokenDuration), parseIntValue(freezeParams[1])), IntegerEntry((launchpadIdStr + keyFreezeTokenPerTicket), parseIntValue(freezeParams[2]))]
213212 else nil
214- ([IntegerEntry((pmtStrAssetId + "_launchpad"), launchpadId), IntegerEntry(keyLaunchpadNextId, (launchpadId + 1)), StringEntry((launchpadIdStr + keyAddress), projectAddress), IntegerEntry((launchpadIdStr + keyInitHeight), height), IntegerEntry((launchpadIdStr + keyStartHeight), startHeight), IntegerEntry((launchpadIdStr + keyDuration), duration), StringEntry((launchpadIdStr + keyBuyToken), buyToken), IntegerEntry((launchpadIdStr + keyFreezSwopDuration), swopFreezeDuration), IntegerEntry((launchpadIdStr + keyTotalTokenAmount), pmtAmount), StringEntry((launchpadIdStr + keyAssetId), pmtStrAssetId), IntegerEntry((launchpadIdStr + keyComission), commission), IntegerEntry((launchpadIdStr + keyTicketLastNumber), 0), IntegerEntry((launchpadIdStr + keyTokensPerTicket), tokensPerTicket), IntegerEntry((launchpadIdStr + keyPricePerToken), pricePerToken), IntegerEntry((launchpadIdStr + keySwopPerTicket), swopPerTicket), IntegerEntry((launchpadIdStr + keySwopfiTicketsAmount), swopfiTicketsAmount), IntegerEntry((launchpadIdStr + keyCampaignTokensAmount), campaignTokensAmount), IntegerEntry((launchpadIdStr + keyTokensPerAllocation), tokensPerAllocation), StringEntry((launchpadIdStr + keyClaimParams), makeString(claimParams, ",")), BooleanEntry((launchpadIdStr + keyHighCompetitionSale), HighCompetitionSale), IntegerEntry((launchpadIdStr + keyHighCompetitionComission), highCompetitionComission), IntegerEntry((launchpadIdStr + keyHighCompetitionAmount), highCompetitionTicketsAmount), IntegerEntry(keyLaunchpadActiveId, launchpadId), StringEntry(keyInitCaller, "")] ++ freezeAdditionalEntry)
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)
215214 }
216215
217216
218217
219218 @Callable(i)
220219 func commitSwopfiSale (launchpadId,refId) = {
221- let $t091219196 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
222- let pmtAmount = $t091219196._1
223- let pmtAssetId = $t091219196._2
224- let $t092019351 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
225- let buyAssetId = $t092019351._1
226- let buyAssetStrId = $t092019351._2
227- let buyAssetName = $t092019351._3
228- let buyAssetDecimals = $t092019351._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
229228 let stakedSwops = valueOrElse(getInteger(governance, (toString(i.caller) + keyGovernanceStaked)), 0)
230229 let allowedTicketsAmountAll = (stakedSwops / getIntegerValue(this, (toString(launchpadId) + keySwopPerTicket)))
231230 let boughtTicketsAmount = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtTicketsAmount)), 0)
232231 let allowedTicketsAmount = (allowedTicketsAmountAll - boughtTicketsAmount)
233232 let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
234233 let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
235234 let freezeAdditionalToken = valueOrElse(getBoolean(this, (toString(launchpadId) + keyFreezeAdditionalToken)), false)
236235 if (!(isActive))
237236 then throw("DApp is inactive at this moment")
238237 else if ((activeLaunchpadId != launchpadId))
239238 then throw("There is no active launchpad or this launchpad is ended")
240239 else if ((startHeight > height))
241240 then throw("Launchpad sale not started yet")
242241 else if ((height > (startHeight + duration)))
243242 then throw("Launchpad sale ended")
244243 else if (if (!(freezeAdditionalToken))
245244 then if ((size(i.payments) != 1))
246245 then true
247246 else (pmtAssetId != buyAssetId)
248247 else false)
249248 then throw((("One attached payment in " + buyAssetName) + " expected"))
250249 else if (if (freezeAdditionalToken)
251250 then if ((size(i.payments) != 2))
252251 then true
253252 else (pmtAssetId != buyAssetId)
254253 else false)
255254 then {
256255 let freezeTokenId = getStringValue(this, (toString(launchpadId) + keyFreezeTokenId))
257256 throw(((("Two attached payments expected: First in " + buyAssetName) + ", second in ") + freezeTokenId))
258257 }
259258 else if (if ((0 >= allowedTicketsAmountAll))
260259 then true
261260 else (0 >= allowedTicketsAmount))
262261 then throw("Not enought SWOP in staking to buy tickets")
263262 else {
264263 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
265264 let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
266- let $t01123911383 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
267- let tokenId = $t01123911383._1
268- let tokenStrAssetId = $t01123911383._2
269- let tokenAssetName = $t01123911383._3
270- let tokenDecimals = $t01123911383._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
271270 let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
272271 let commissionPerTicket = fraction(ticketPrice, getIntegerValue(this, (toString(launchpadId) + keyComission)), 100)
273272 let buyTicketAmount = (pmtAmount / (ticketPrice + commissionPerTicket))
274273 let allowedBuyTicketAmount = min([buyTicketAmount, allowedTicketsAmount])
275274 let allowedBuyPriceWithComission = (allowedBuyTicketAmount * (ticketPrice + commissionPerTicket))
276275 let change = (pmtAmount - allowedBuyPriceWithComission)
277276 if ((buyTicketAmount == 0))
278277 then throw((("Not enought " + buyAssetName) + " to buy tickets"))
279278 else if ((change != 0))
280279 then throw((((("Wrong payment. To buy " + toString(allowedBuyTicketAmount)) + "tickets you need to pay ") + toString(allowedBuyPriceWithComission)) + buyAssetName))
281280 else {
282281 let freezeAdditionalEntry = if (freezeAdditionalToken)
283282 then {
284283 let freezeTokenId = getStringValue(this, (toString(launchpadId) + keyFreezeTokenId))
285284 let freezeTokenPerTicket = getIntegerValue(this, (toString(launchpadId) + keyFreezeTokenPerTicket))
286- let $t01254712634 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
287- let pmtAmountFreeze = $t01254712634._1
288- let pmtAssetIdFreeze = $t01254712634._2
289- let $t01265112742 = getAssetInfo(pmtAssetId)
290- let pmtFreezeStrAssetId = $t01265112742._1
291- let pmtFreezeAssetName = $t01265112742._2
292- let pmtFreezeDecimals = $t01265112742._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
293292 let needFreezeTokens = (freezeTokenPerTicket * buyTicketAmount)
294293 if (if ((pmtFreezeStrAssetId != freezeTokenId))
295294 then true
296295 else (needFreezeTokens != pmtAmountFreeze))
297296 then throw((((("You need to add " + toString(needFreezeTokens)) + " ") + pmtFreezeAssetName) + " as a second payment"))
298297 else [IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserFreezeToken), pmtAmountFreeze)]
299298 }
300299 else nil
301300 let userBoughtTicketsNumbers = valueOrElse(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserTickets)), "")
302301 let lastBoughtTicketNumber = getIntegerValue(this, (toString(launchpadId) + keyTicketLastNumber))
303302 let boughtRange = ((toString((lastBoughtTicketNumber + 1)) + "-") + toString((lastBoughtTicketNumber + allowedBuyTicketAmount)))
304303 let newUserBoughtTicketsNumbers = (userBoughtTicketsNumbers + (if ((userBoughtTicketsNumbers != ""))
305304 then ("," + boughtRange)
306305 else ("" + boughtRange)))
307306 let inv = if ((buyAssetId == USDN))
308307 then invoke(stakingUSDNAddress, "lockNeutrino", nil, [AttachedPayment(pmtAssetId, pmtAmount)])
309308 else 0
310309 if ((inv == inv))
311310 then {
312311 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)
313312 if (!(isDefined(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId)))))
314313 then (baseEntry ++ [StringEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId), refId)])
315314 else baseEntry
316315 }
317316 else throw("Strict value is not equal to itself.")
318317 }
319318 }
320319 }
321320
322321
323322
324323 @Callable(i)
325324 func commitAccessListSale (launchpadId,refId) = {
326- let $t01478914864 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
327- let pmtAmount = $t01478914864._1
328- let pmtAssetId = $t01478914864._2
329- let $t01486915019 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
330- let buyAssetId = $t01486915019._1
331- let buyAssetStrId = $t01486915019._2
332- let buyAssetName = $t01486915019._3
333- let buyAssetDecimals = $t01486915019._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
334333 let userUsdnInMarketing = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserAmountBuyAssetInMarketing)), 0)
335334 let usdnInMarketing = valueOrElse(getInteger(this, (toString(launchpadId) + keyAmountBuyAssetInMarketing)), 0)
336335 let boughtAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtAllocations)), 0)
337336 let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
338337 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
339338 let tokensPerAllocation = getIntegerValue(this, (toString(launchpadId) + keyTokensPerAllocation))
340- let $t01568815832 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
341- let tokenId = $t01568815832._1
342- let tokenStrAssetId = $t01568815832._2
343- let tokenAssetName = $t01568815832._3
344- let tokenDecimals = $t01568815832._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
345344 let allocationPriceWithComission = fraction(fraction(tokenPrice, tokensPerAllocation, pow(10, 0, tokenDecimals, 0, 0, DOWN)), (100 + commission), 100)
346345 let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
347346 let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
348347 if (!(isActive))
349348 then throw("DApp is inactive at this moment")
350349 else if ((activeLaunchpadId != launchpadId))
351350 then throw("There is no active launchpad or this launchpad is ended")
352351 else if ((startHeight > height))
353352 then throw("Launchpad sale not started yet")
354353 else if ((height > (startHeight + duration)))
355354 then throw("Launchpad sale ended")
356355 else if (if ((size(i.payments) != 1))
357356 then true
358357 else (pmtAssetId != buyAssetId))
359358 then throw((("One attached payment in " + buyAssetName) + " expected"))
360359 else if ((boughtAllocations >= maxAllocationsAmount))
361360 then throw((("You can buy only " + toString(maxAllocationsAmount)) + "allocations"))
362361 else if (if ((allocationPriceWithComission != pmtAmount))
363362 then ((allocationPriceWithComission * 2) != pmtAmount)
364363 else false)
365364 then throw(((("Wrong payment. You can buy 1 or 2 allocations for " + toString(allocationPriceWithComission)) + buyAssetName) + " per allocation"))
366365 else {
367366 let buyAllocationsAmount = (pmtAmount / allocationPriceWithComission)
368367 let inv = if ((buyAssetId == USDN))
369368 then invoke(stakingUSDNAddress, "lockNeutrino", nil, [AttachedPayment(pmtAssetId, pmtAmount)])
370369 else 0
371370 if ((inv == inv))
372371 then {
373372 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))]
374373 if (!(isDefined(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId)))))
375374 then (baseEntry ++ [StringEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId), refId)])
376375 else baseEntry
377376 }
378377 else throw("Strict value is not equal to itself.")
379378 }
380379 }
381380
382381
383382
384383 @Callable(i)
385384 func commitHighCompetitionSale (launchpadId,refId) = {
386- let $t01814118216 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
387- let pmtAmount = $t01814118216._1
388- let pmtAssetId = $t01814118216._2
389- let $t01822118371 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
390- let buyAssetId = $t01822118371._1
391- let buyAssetStrId = $t01822118371._2
392- let buyAssetName = $t01822118371._3
393- let buyAssetDecimals = $t01822118371._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
394393 let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
395394 let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
396395 let boughtHCTicketsAmount = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserHCBoughtTicketsAmount)), 0)
397396 let highCompetitionSale = valueOrElse(getBoolean(this, (toString(launchpadId) + keyHighCompetitionSale)), false)
398397 if (!(isActive))
399398 then throw("DApp is inactive at this moment")
400399 else if ((activeLaunchpadId != launchpadId))
401400 then throw("There is no active launchpad or this launchpad is ended")
402401 else if (!(highCompetitionSale))
403402 then throw("There is no high competition sale for this launchpad")
404403 else if ((startHeight > height))
405404 then throw("Launchpad sale not started yet")
406405 else if ((height > (startHeight + duration)))
407406 then throw("Launchpad sale ended")
408407 else if (if ((size(i.payments) != 1))
409408 then true
410409 else (pmtAssetId != buyAssetId))
411410 then throw((("One attached payment in " + buyAssetName) + " expected"))
412411 else {
413412 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
414413 let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
415- let $t01962019764 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
416- let tokenId = $t01962019764._1
417- let tokenStrAssetId = $t01962019764._2
418- let tokenAssetName = $t01962019764._3
419- let tokenDecimals = $t01962019764._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
420419 let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
421420 let commissionPerTicket = fraction(ticketPrice, getIntegerValue(this, (toString(launchpadId) + keyHighCompetitionComission)), 100)
422421 let buyTicketAmount = (pmtAmount / (ticketPrice + commissionPerTicket))
423422 let buyPriceWithComission = (buyTicketAmount * (ticketPrice + commissionPerTicket))
424423 let change = (pmtAmount - buyPriceWithComission)
425424 if ((buyTicketAmount == 0))
426425 then throw((("Not enought " + buyAssetName) + " to buy tickets"))
427426 else if ((change != 0))
428427 then throw((((("Wrong payment. To buy " + toString(buyTicketAmount)) + "tickets you need to pay ") + toString(buyPriceWithComission)) + buyAssetName))
429428 else {
430429 let userBoughtTicketsNumbers = valueOrElse(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserHCTickets)), "")
431430 let lastBoughtTicketNumber = getIntegerValue(this, (toString(launchpadId) + keyHCTicketLastNumber))
432431 let boughtRange = ((toString((lastBoughtTicketNumber + 1)) + "-") + toString((lastBoughtTicketNumber + buyTicketAmount)))
433432 let newUserBoughtTicketsNumbers = (userBoughtTicketsNumbers + (if ((userBoughtTicketsNumbers != ""))
434433 then ("," + boughtRange)
435434 else ("" + boughtRange)))
436435 let inv = if ((buyAssetId == USDN))
437436 then invoke(stakingUSDNAddress, "lockNeutrino", nil, [AttachedPayment(pmtAssetId, pmtAmount)])
438437 else 0
439438 if ((inv == inv))
440439 then {
441440 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)]
442441 if (!(isDefined(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId)))))
443442 then (baseEntry ++ [StringEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId), refId)])
444443 else baseEntry
445444 }
446445 else throw("Strict value is not equal to itself.")
447446 }
448447 }
449448 }
450449
451450
452451
453452 @Callable(i)
454453 func finalise (launchpadId,vrfHeight,secretWord) = {
455454 let savedHash = getStringValue(this, (toString(launchpadId) + keyVerifyHash))
456455 let calcHash = toBase58String(sha256((toBytes(vrfHeight) + toBytes(secretWord))))
457456 if (!(isActive))
458457 then throw("DApp is inactive at this moment")
459458 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
460459 then throw("Only admin can call this function")
461460 else if ((calcHash != savedHash))
462461 then throw("vrf Height hash not matching")
463462 else {
464- let $t02254922699 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
465- let buyAssetId = $t02254922699._1
466- let buyAssetStrId = $t02254922699._2
467- let buyAssetName = $t02254922699._3
468- let buyAssetDecimals = $t02254922699._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
469468 let projectAddress = addressFromStringValue(getStringValue(this, (toString(launchpadId) + keyAddress)))
470469 let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
471470 let commissionHC = getIntegerValue(this, (toString(launchpadId) + keyHighCompetitionComission))
472471 let transferedBuyAsset = valueOrElse(getInteger(this, (toString(launchpadId) + keyTransferBuyAsset)), 0)
473472 let swopfiMembersBuyAssetAmount = getIntegerValue(this, (toString(launchpadId) + keyTotalAmountBuyAssetSold))
474473 let swopfiHCBuyAssetAmount = valueOrElse(getIntegerValue(this, (toString(launchpadId) + keyTotalAmountBuyAssetSoldHC)), 0)
475474 let swopfiMembersComission = fraction(swopfiMembersBuyAssetAmount, commission, 100)
476475 let swopfiHCComission = fraction(swopfiHCBuyAssetAmount, commissionHC, 100)
477476 let totalAmountBuyAssetInMarketing = getIntegerValue(this, (toString(launchpadId) + keyAmountBuyAssetInMarketingFinalized))
478477 let marketingComission = fraction(totalAmountBuyAssetInMarketing, commission, 100)
479478 let unstakeAmount = (((((swopfiMembersBuyAssetAmount + totalAmountBuyAssetInMarketing) + swopfiMembersComission) + marketingComission) + swopfiHCBuyAssetAmount) + swopfiHCComission)
480479 if ((transferedBuyAsset > (swopfiMembersBuyAssetAmount + totalAmountBuyAssetInMarketing)))
481480 then throw("Can't transfer negative value to project")
482481 else {
483482 let inv = if ((buyAssetId == USDN))
484483 then invoke(stakingUSDNAddress, "unlockNeutrino", [unstakeAmount, toBase58String(USDN)], nil)
485484 else 0
486485 if ((inv == inv))
487486 then [IntegerEntry((toString(launchpadId) + keyFinaliseHeight), height), ScriptTransfer(projectAddress, ((swopfiMembersBuyAssetAmount + totalAmountBuyAssetInMarketing) - transferedBuyAsset), buyAssetId), ScriptTransfer(commissionWallet, ((swopfiMembersComission + marketingComission) + swopfiHCComission), buyAssetId)]
488487 else throw("Strict value is not equal to itself.")
489488 }
490489 }
491490 }
492491
493492
494493
495494 @Callable(i)
495+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)
499+ let userClaimStatus = valueOrElse(getBoolean(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimStatus)), false)
500+ let finalizeHeight = valueOrElse(getInteger(this, (toString(launchpadId) + keyFinaliseHeight)), 0)
501+ if (!(isActive))
502+ then throw("DApp is inactive at this moment")
503+ else if ((finalizeHeight == 0))
504+ then throw("You can't claim because results are not finalized")
505+ else if (userClaimStatus)
506+ then throw("You are already claimed")
507+ else if (if (if ((boughtTickets == 0))
508+ then (boughtAllocations == 0)
509+ else false)
510+ then (boughtHCTickets == 0)
511+ else false)
512+ then throw("You can't claim because you don't buy anything")
513+ else {
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
519+ 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)
521+ let awailableAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserAvailableAllocations)), 0)
522+ let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
523+ let allowedAllocations = min([boughtAllocations, awailableAllocations])
524+ let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
525+ let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
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
531+ let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
532+ let tokensPerAllocation = getIntegerValue(this, (toString(launchpadId) + keyTokensPerAllocation))
533+ let transferTokensAmount = (((wonnedTickets * tokensPerTicket) + (allowedAllocations * tokensPerAllocation)) + (wonnedHCTickets * tokensPerTicket))
534+ let notAllowedAllocationsTokens = ((boughtAllocations - allowedAllocations) * tokensPerAllocation)
535+ let buyAssetForAllocations = fraction(fraction(notAllowedAllocationsTokens, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN)), (100 + commission), 100)
536+ let buyAssetForUnwonnedTickets = fraction(((boughtTickets - wonnedTickets) * ticketPrice), (100 + commission), 100)
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))
540+ then true
541+ else (0 > buyAssetForUnwonnedTickets))
542+ then true
543+ else (0 > buyAssetForHCUnwonnedTickets))
544+ then throw("Error with allowed allocation param or wonned tickets param please contact support")
545+ else {
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)]
549+ else nil
550+ let inv = if (if ((returnedBuyAssetAmount > 0))
551+ then (buyAssetId == USDN)
552+ else false)
553+ then invoke(stakingUSDNAddress, "unlockNeutrino", [returnedBuyAssetAmount, toBase58String(USDN)], nil)
554+ else 0
555+ if ((inv == inv))
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+ }
593+ else throw("Strict value is not equal to itself.")
594+ }
595+ }
596+ }
597+
598+
599+
600+@Callable(i)
601+func claimFreezeToken (launchpadId) = {
602+ let freezeAdditionalToken = valueOrElse(getBoolean(this, (toString(launchpadId) + keyFreezeAdditionalToken)), false)
603+ if (!(isActive))
604+ then throw("DApp is inactive at this moment")
605+ else if (!(isDefined(getInteger(this, (toString(launchpadId) + keyFinaliseHeight)))))
606+ then throw("You can't claim because results are not finalized")
607+ else if (!(freezeAdditionalToken))
608+ then throw("There are no additional token freezing for this launchpad")
609+ else {
610+ let tokenId = fromBase58String(getStringValue(this, (toString(launchpadId) + keyFreezeTokenId)))
611+ let userTokensFreezed = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserFreezeToken)), 0)
612+ let startHeight = valueOrElse(getInteger(this, (toString(launchpadId) + keyStartHeight)), 0)
613+ let duration = valueOrElse(getInteger(this, (toString(launchpadId) + keyDuration)), 0)
614+ let freezeTokenDuration = getIntegerValue(this, (toString(launchpadId) + keyFreezeTokenDuration))
615+ let blockEndHeight = ((startHeight + duration) + freezeTokenDuration)
616+ if ((userTokensFreezed == 0))
617+ then throw("You are already claimed your tokens or not paid anything")
618+ else if ((blockEndHeight > height))
619+ then throw(("Your tokens freezed teel " + toString(blockEndHeight)))
620+ else [ScriptTransfer(i.caller, userTokensFreezed, tokenId), IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserFreezeToken), 0)]
621+ }
622+ }
623+
624+
625+
626+@Callable(i)
496627 func transferBuyAsset (launchpadId,amount) = if (!(isActive))
497628 then throw("DApp is inactive")
498629 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
499630 then throw("Only admin can call this function")
500631 else {
501632 let projectAddress = addressFromStringValue(getStringValue(this, (toString(launchpadId) + keyAddress)))
502- let $t02505825208 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
503- let buyAssetId = $t02505825208._1
504- let buyAssetStrId = $t02505825208._2
505- let buyAssetName = $t02505825208._3
506- let buyAssetDecimals = $t02505825208._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
507638 [IntegerEntry((toString(launchpadId) + keyTransferBuyAsset), amount), ScriptTransfer(projectAddress, amount, buyAssetId)]
508639 }
509640
510641
511642
512643 @Callable(i)
513644 func shutdown () = if (!(isActive))
514645 then throw("DApp already inactive")
515646 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
516647 then throw("Only admin can call this function")
517648 else [BooleanEntry(keyActive, false)]
518649
519650
520651
521652 @Callable(i)
522653 func activate () = if (isActive)
523654 then throw("DApp already active")
524655 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
525656 then throw("Only admin can call this function")
526657 else [BooleanEntry(keyActive, true)]
527658
528659
529660 @Verifier(tx)
530661 func verify () = {
531662 let multiSignedByAdmins = {
532663 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
533664 then 1
534665 else 0
535666 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
536667 then 1
537668 else 0
538669 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
539670 then 1
540671 else 0
541672 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
542673 }
543674 let signedByAdmin = if (if (if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
544675 then true
545676 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey2))
546677 then true
547678 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey3))
548679 then true
549680 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKeyStaking)
550681 match tx {
551682 case dtx: DataTransaction =>
552683 if (valueOrElse(getBoolean(oracle, keyLaunchpadDataTransactionStatus), false))
553684 then signedByAdmin
554685 else false
555686 case _ =>
556687 multiSignedByAdmins
557688 }
558689 }
559690

github/deemru/w8io/3ef1775 
265.90 ms