tx · 9XBFTRBUQEHu6bsx9EnmfomkWghTroDxkSt3Q9gJMt3W

3MzDGFvPnXVbA4wCacqcVnfVJPwG952KVAg:  -0.01400000 Waves

2022.02.14 14:26 [1923236] smart account 3MzDGFvPnXVbA4wCacqcVnfVJPwG952KVAg > SELF 0.00000000 Waves

{ "type": 13, "id": "9XBFTRBUQEHu6bsx9EnmfomkWghTroDxkSt3Q9gJMt3W", "fee": 1400000, "feeAssetId": null, "timestamp": 1644837941972, "version": 2, "chainId": 84, "sender": "3MzDGFvPnXVbA4wCacqcVnfVJPwG952KVAg", "senderPublicKey": "CViCXhHrygDDAtVc1uFczxe6ANj9tBz5PGQDS1yWZqgy", "proofs": [ "4EKcKJpZmZjAb54QmJnAwFvV7CjJH41pkgizTcG6Mp5jtJvYkY7J2G16v3Hgx1ggAzgBbgRzBJuQPGmz8DHenrbR", "JFykU6VGi3YaRBhZ2BfAtKEP7txsv4ACnbxVYmwNz5msE6pN2naGWAyS8AuETtCZnb5Ubrs17hcihcvJ4beUqAp" ], "script": "base64:AAIFAAAAAAAAFLQIAhIECgIBCBIDCgEIEhQKEggBAQgBAQEBAQEBARgEAQEEGBIECgIBCBIECgIBCBIECgIBCBIFCgMBAQgSAwoBARIDCgEBEgQKAgEBEgASABoQCgFBEgtrZXlEdXJhdGlvbhohCgFCEhxrZXlBbW91bnRCdXlBc3NldEluTWFya2V0aW5nGioKAUMSJWtleUFtb3VudEJ1eUFzc2V0SW5NYXJrZXRpbmdGaW5hbGl6ZWQaGAoBRBITa2V5VHJhbnNmZXJCdXlBc3NldBoZCgFFEhRrZXlGcmVlelN3b3BEdXJhdGlvbhodCgFGEhhrZXlGcmVlemVBZGRpdGlvbmFsVG9rZW4aFQoBRxIQa2V5RnJlZXplVG9rZW5JZBobCgFIEhZrZXlGcmVlemVUb2tlbkR1cmF0aW9uGhwKAUkSF2tleUZyZWV6ZVRva2VuUGVyVGlja2V0GhAKAUoSC2tleUJ1eVRva2VuGhMKAUsSDmtleUNsYWltUGFyYW1zGiAKAUwSG2tleUhpZ2hDb21wZXRpdGlvbkNvbWlzc2lvbhobCgFNEhZrZXlIaWdoQ29tcGV0aXRpb25TYWxlGhoKAU4SFWtleUhDVGlja2V0TGFzdE51bWJlchodCgFPEhhrZXlIaWdoQ29tcGV0aXRpb25BbW91bnQaIQoBUBIca2V5VG90YWxBbW91bnRCdXlBc3NldFNvbGRIQxoZCgFREhRrZXlVc2VyQ2xhaW1lZFRva2VucxocCgFSEhdrZXlVc2VyQ2xhaW1lZEJ1eVRva2VucxofCgFTEhprZXlVc2VyQm91Z2h0VGlja2V0c0Ftb3VudBoTCgFUEg5rZXlVc2VyVGlja2V0cxoVCgFVEhBrZXlVc2VySENUaWNrZXRzGiEKAVYSHGtleVVzZXJIQ0JvdWdodFRpY2tldHNBbW91bnQaIAoBVxIba2V5VXNlckF2YWlsYWJsZUFsbG9jYXRpb25zGiUKAVgSIGtleVVzZXJBbW91bnRCdXlBc3NldEluTWFya2V0aW5nGh0KAVkSGGtleVVzZXJCb3VnaHRBbGxvY2F0aW9ucxoXCgFaEhJrZXlVc2VyQ2xhaW1TdGF0dXMaDgoBYRIJa2V5QWN0aXZlGhYKAmFBEhBzdGFrZWRVc2RuQW1vdW50GgwKAmFCEgZhY3RpdmUaDgoCYUMSCGlzQWN0aXZlGhEKAmFEEgtpc0FkbWluQ2FsbBoHCgJhRRIBaRocCgJhRhIWZ2V0QXNzZXRJbmZvRnJvbVN0cmluZxoOCgJhRxIIYXNzZXRTdHIaEQoCYUgSC2xhdW5jaHBhZElkGgoKAmFJEgRoYXNoGg0KAmFKEgdhZGRyZXNzGhQKAmFLEg5wcm9qZWN0QWRkcmVzcxoRCgJhTBILc3RhcnRIZWlnaHQaDgoCYU0SCGR1cmF0aW9uGg4KAmFOEghidXlUb2tlbhoQCgJhTxIKY29tbWlzc2lvbhoVCgJhUBIPdG9rZW5zUGVyVGlja2V0GhMKAmFREg1wcmljZVBlclRva2VuGhkKAmFSEhNzd29wZmlUaWNrZXRzQW1vdW50GhoKAmFTEhRjYW1wYWlnblRva2Vuc0Ftb3VudBoZCgJhVBITdG9rZW5zUGVyQWxsb2NhdGlvbhoTCgJhVRINc3dvcFBlclRpY2tldBoYCgJhVhISc3dvcEZyZWV6ZUR1cmF0aW9uGhEKAmFXEgtjbGFpbVBhcmFtcxoZCgJhWBITSGlnaENvbXBldGl0aW9uU2FsZRoeCgJhWRIYaGlnaENvbXBldGl0aW9uQ29taXNzaW9uGiIKAmFaEhxoaWdoQ29tcGV0aXRpb25UaWNrZXRzQW1vdW50GiAKAmFhEhprZXlVc2VyV2lubmVkVGlja2V0c0Ftb3VudBovCgJhYhIpa2V5VXNlcldpbm5lZEhpZ2hDb21wZXRpdGlvblRpY2tldHNBbW91bnQaGAoCYWMSEmtleVVzZXJGcmVlemVUb2tlbhoMCgJhZBIGb3JhY2xlGhAKAmFlEgpnb3Zlcm5hbmNlGhYKAmFmEhBjb21taXNzaW9uV2FsbGV0GhgKAmFnEhJzdGFraW5nVVNETkFkZHJlc3MaCgoCYWgSBFVTRE4aGAoCYWkSEmFkbWluUHViS2V5U3Rha2luZxoaCgJhahIUbWF4QWxsb2NhdGlvbnNBbW91bnQaFwoCYWsSEWFjdGl2ZUxhdW5jaHBhZElkGhEKAmFsEgtnZXRBZG1pblB1YhoRCgJhbRILa2V5QWRtaW5QdWIaDQoCYW4SByRtYXRjaDAaDAoCYW8SBnN0cmluZxoNCgJhcBIHbm90aGluZxoSCgJhcRIMYWRtaW5QdWJLZXkxGhIKAmFyEgxhZG1pblB1YktleTIaEgoCYXMSDGFkbWluUHViS2V5MxoSCgJhdBIMZ2V0QXNzZXRJbmZvGg0KAmF1Egdhc3NldElkGggKAmF2EgJpZBoOCgJhdxIIc3RyaW5nSWQaCgoCYXgSBGluZm8aCwoCYXkSBXdhdmVzGhgKAmF6EhJnZXRMYXVuY2hwYWROZXh0SWQaFAoBYhIPa2V5QWRtaW5QdWJLZXkxGhUKAmJBEg90b2tlblN0ckFzc2V0SWQaFAoCYkISDnRva2VuQXNzZXROYW1lGhMKAmJDEg10b2tlbkRlY2ltYWxzGhEKAmJEEgt0aWNrZXRQcmljZRoZCgJiRRITY29tbWlzc2lvblBlclRpY2tldBoVCgJiRhIPYnV5VGlja2V0QW1vdW50GhwKAmJHEhZhbGxvd2VkQnV5VGlja2V0QW1vdW50GiIKAmJIEhxhbGxvd2VkQnV5UHJpY2VXaXRoQ29taXNzaW9uGgwKAmJJEgZjaGFuZ2UaGgoCYkoSFGZyZWV6ZVRva2VuUGVyVGlja2V0GhMKAmJLEg0kdDAxMjQ5MDEyNTc3GhUKAmJMEg9wbXRBbW91bnRGcmVlemUaFgoCYk0SEHBtdEFzc2V0SWRGcmVlemUaEwoCYk4SDSR0MDEyNTk0MTI2ODUaGQoCYk8SE3BtdEZyZWV6ZVN0ckFzc2V0SWQaGAoCYlASEnBtdEZyZWV6ZUFzc2V0TmFtZRoXCgJiURIRcG10RnJlZXplRGVjaW1hbHMaFgoCYlISEG5lZWRGcmVlemVUb2tlbnMaHgoCYlMSGHVzZXJCb3VnaHRUaWNrZXRzTnVtYmVycxocCgJiVBIWbGFzdEJvdWdodFRpY2tldE51bWJlchoRCgJiVRILYm91Z2h0UmFuZ2UaIQoCYlYSG25ld1VzZXJCb3VnaHRUaWNrZXRzTnVtYmVycxoJCgJiVxIDaW52Gg8KAmJYEgliYXNlRW50cnkaEwoCYlkSDSR0MDE0NzU2MTQ4MzEaEwoCYloSDSR0MDE0ODM2MTQ5ODYaGwoCYmESFWZyZWV6ZUFkZGl0aW9uYWxUb2tlbhoSCgJiYhIMZnJlZXplUGFyYW1zGhQKAmJjEg5sYXVuY2hwYWRJZFN0choRCgJiZBILJHQwNjM3NzY0NTIaDwoCYmUSCXBtdEFtb3VudBoQCgJiZhIKcG10QXNzZXRJZBoRCgJiZxILJHQwNjQ2MTY1MzQaEwoCYmgSDXBtdFN0ckFzc2V0SWQaEgoCYmkSDHBtdEFzc2V0TmFtZRoRCgJiahILcG10RGVjaW1hbHMaGwoCYmsSFWZyZWV6ZUFkZGl0aW9uYWxFbnRyeRoLCgJibBIFcmVmSWQaEQoCYm0SCyR0MDkxNDA5MjE1GhEKAmJuEgskdDA5MjIwOTM3MBoQCgJibxIKYnV5QXNzZXRJZBoTCgJicBINYnV5QXNzZXRTdHJJZBoSCgJicRIMYnV5QXNzZXROYW1lGhYKAmJyEhBidXlBc3NldERlY2ltYWxzGhEKAmJzEgtzdGFrZWRTd29wcxodCgJidBIXYWxsb3dlZFRpY2tldHNBbW91bnRBbGwaGQoCYnUSE2JvdWdodFRpY2tldHNBbW91bnQaGgoCYnYSFGFsbG93ZWRUaWNrZXRzQW1vdW50GhMKAmJ3Eg1mcmVlemVUb2tlbklkGhAKAmJ4Egp0b2tlblByaWNlGhMKAmJ5Eg0kdDAxMTE4MjExMzI2Gg0KAmJ6Egd0b2tlbklkGhQKAWMSD2tleUFkbWluUHViS2V5MhoTCgJjQRINYm91Z2h0VGlja2V0cxoVCgJjQhIPYm91Z2h0SENUaWNrZXRzGhUKAmNDEg91c2VyQ2xhaW1TdGF0dXMaFAoCY0QSDmZpbmFsaXplSGVpZ2h0GhMKAmNFEg0kdDAyNTQxMjI1NTYyGhMKAmNGEg13b25uZWRUaWNrZXRzGhUKAmNHEg93b25uZWRIQ1RpY2tldHMaGgoCY0gSFGF3YWlsYWJsZUFsbG9jYXRpb25zGhgKAmNJEhJhbGxvd2VkQWxsb2NhdGlvbnMaEwoCY0oSDSR0MDI2NDY4MjY2MTIaGgoCY0sSFHRyYW5zZmVyVG9rZW5zQW1vdW50GiEKAmNMEhtub3RBbGxvd2VkQWxsb2NhdGlvbnNUb2tlbnMaHAoCY00SFmJ1eUFzc2V0Rm9yQWxsb2NhdGlvbnMaIAoCY04SGmJ1eUFzc2V0Rm9yVW53b25uZWRUaWNrZXRzGiIKAmNPEhxidXlBc3NldEZvckhDVW53b25uZWRUaWNrZXRzGhUKAmNQEg9jbGFpbWVkQnV5VG9rZW4aHAoCY1ESFnJldHVybmVkQnV5QXNzZXRBbW91bnQaFgoCY1ISEHRyYW5zZmVyQnV5QXNzZXQaEwoCY1MSDWNsYWltZWRQYXJhbXMaFAoCY1QSDnRyYW5zZmVyVG9rZW5zGhMKAmNVEg1jbGFpbWVkVG9rZW5zGhIKAmNWEgx1bmxvY2tQZXJpb2QaEQoCY1cSC2Jsb2NrSGVpZ2h0GhIKAmNYEgx1bmxvY2tIZWlnaHQaGAoCY1kSEmFsbG93ZWRTdGFydEFtb3VudBoZCgJjWhITYWxsb3dlZFRva2Vuc0Ftb3VudBoZCgJjYRITdXNlclVzZG5Jbk1hcmtldGluZxoVCgJjYhIPdXNkbkluTWFya2V0aW5nGhcKAmNjEhFib3VnaHRBbGxvY2F0aW9ucxoTCgJjZBINJHQwMTU2NTUxNTc5ORoiCgJjZRIcYWxsb2NhdGlvblByaWNlV2l0aENvbWlzc2lvbhoaCgJjZhIUYnV5QWxsb2NhdGlvbnNBbW91bnQaEwoCY2cSDSR0MDE4MDU3MTgxMzIaEwoCY2gSDSR0MDE4MTM3MTgyODcaGwoCY2kSFWJvdWdodEhDVGlja2V0c0Ftb3VudBoZCgJjahITaGlnaENvbXBldGl0aW9uU2FsZRoTCgJjaxINJHQwMTk0NjAxOTYwNBobCgJjbBIVYnV5UHJpY2VXaXRoQ29taXNzaW9uGg8KAmNtEgl2cmZIZWlnaHQaEAoCY24SCnNlY3JldFdvcmQaDwoCY28SCXNhdmVkSGFzaBoOCgJjcBIIY2FsY0hhc2gaEwoCY3ESDSR0MDIyMjE3MjIzNjcaEgoCY3ISDGNvbW1pc3Npb25IQxoYCgJjcxISdHJhbnNmZXJlZEJ1eUFzc2V0GiEKAmN0Ehtzd29wZmlNZW1iZXJzQnV5QXNzZXRBbW91bnQaHAoCY3USFnN3b3BmaUhDQnV5QXNzZXRBbW91bnQaHAoCY3YSFnN3b3BmaU1lbWJlcnNDb21pc3Npb24aFwoCY3cSEXN3b3BmaUhDQ29taXNzaW9uGiQKAmN4Eh50b3RhbEFtb3VudEJ1eUFzc2V0SW5NYXJrZXRpbmcaGAoCY3kSEm1hcmtldGluZ0NvbWlzc2lvbhoTCgJjehINdW5zdGFrZUFtb3VudBoUCgFkEg9rZXlBZG1pblB1YktleTMaFgoCZGESEGNsYWltU3RhdHVzRW50cnkaFwoCZGISEXVzZXJUb2tlbnNGcmVlemVkGhkKAmRjEhNmcmVlemVUb2tlbkR1cmF0aW9uGhQKAmRkEg5ibG9ja0VuZEhlaWdodBoMCgJkZRIGYW1vdW50GhMKAmRmEg0kdDAzMjgxODMyOTY4GggKAmRnEgJ0eBoMCgJkaBIGdmVyaWZ5GhkKAmRpEhNtdWx0aVNpZ25lZEJ5QWRtaW5zGhgKAmRqEhJhZG1pblB1YktleTFTaWduZWQaGAoCZGsSEmFkbWluUHViS2V5MlNpZ25lZBoYCgJkbBISYWRtaW5QdWJLZXkzU2lnbmVkGhMKAmRtEg1zaWduZWRCeUFkbWluGgkKAmRuEgNkdHgaJgoBZRIha2V5TGF1bmNocGFkRGF0YVRyYW5zYWN0aW9uU3RhdHVzGhcKAWYSEmtleUxhdW5jaHBhZE5leHRJZBoZCgFnEhRrZXlMYXVuY2hwYWRBY3RpdmVJZBoSCgFoEg1rZXlJbml0Q2FsbGVyGg8KAWkSCmtleUFkZHJlc3MaEgoBahINa2V5SW5pdEhlaWdodBoTCgFrEg5rZXlTdGFydEhlaWdodBoWCgFsEhFrZXlGaW5hbGlzZUhlaWdodBoRCgFtEgxrZXlDb21pc3Npb24aDwoBbhIKa2V5QXNzZXRJZBoYCgFvEhNrZXlUb3RhbFRva2VuQW1vdW50Gh8KAXASGmtleVRvdGFsQW1vdW50QnV5QXNzZXRTb2xkGhcKAXESEmtleVRva2Vuc1BlclRpY2tldBoVCgFyEhBrZXlQcmljZVBlclRva2VuGhUKAXMSEGtleVN3b3BQZXJUaWNrZXQaGwoBdBIWa2V5U3dvcGZpVGlja2V0c0Ftb3VudBocCgF1EhdrZXlDYW1wYWlnblRva2Vuc0Ftb3VudBobCgF2EhZrZXlUb2tlbnNQZXJBbGxvY2F0aW9uGhgKAXcSE2tleVRpY2tldExhc3ROdW1iZXIaGAoBeBITa2V5R292ZXJuYW5jZVN0YWtlZBoRCgF5EgxrZXlVc2VyUmVmSWQaEgoBehINa2V5VmVyaWZ5SGFzaAAAAEoAAAAAAWECAAAABmFjdGl2ZQAAAAABYgIAAAALYWRtaW5fcHViXzEAAAAAAWMCAAAAC2FkbWluX3B1Yl8yAAAAAAFkAgAAAAthZG1pbl9wdWJfMwAAAAABZQIAAAAhbGF1bmNocGFkX2RhdGFfdHJhbnNhY3Rpb25fc3RhdHVzAAAAAAFmAgAAABFsYXVuY2hwYWRfbmV4dF9pZAAAAAABZwIAAAATbGF1bmNocGFkX2FjdGl2ZV9pZAAAAAABaAIAAAALaW5pdF9jYWxsZXIAAAAAAWkCAAAACF9hZGRyZXNzAAAAAAFqAgAAAAxfaW5pdF9oZWlnaHQAAAAAAWsCAAAADV9zdGFydF9oZWlnaHQAAAAAAWwCAAAAEF9maW5hbGlzZV9oZWlnaHQAAAAAAW0CAAAACl9jb21pc3Npb24AAAAAAW4CAAAACV9hc3NldF9pZAAAAAABbwIAAAATX3RvdGFsX3Rva2VuX2Ftb3VudAAAAAABcAIAAAAVX3RvdGFsX2J1eV9hc3NldF9zb2xkAAAAAAFxAgAAABJfdG9rZW5zX3Blcl90aWNrZXQAAAAAAXICAAAAEF9wcmljZV9wZXJfdG9rZW4AAAAAAXMCAAAAEF9zd29wX3Blcl90aWNrZXQAAAAAAXQCAAAAF190aWNrZXRzX3N3b3BmaV9tZW1iZXJzAAAAAAF1AgAAABNfdG9rZW5zX2FjY2Vzc19saXN0AAAAAAF2AgAAABZfdG9rZW5zX3Blcl9hbGxvY2F0aW9uAAAAAAF3AgAAABNfdGlja2V0X2xhc3RfbnVtYmVyAAAAAAF4AgAAAAxfU1dPUF9hbW91bnQAAAAAAXkCAAAAB19yZWZfaWQAAAAAAXoCAAAADF92ZXJpZnlfaGFzaAAAAAABQQIAAAAJX2R1cmF0aW9uAAAAAAFCAgAAACdfdG90YWxfcHVyY2hhc2VkX2J1eV9hc3NldF9pbl9tYXJrZXRpbmcAAAAAAUMCAAAAMV90b3RhbF9wdXJjaGFzZWRfYnV5X2Fzc2V0X2luX21hcmtldGluZ19maW5hbGl6ZWQAAAAAAUQCAAAAE190cmFuc2Zlcl9idXlfYXNzZXQAAAAAAUUCAAAAFV9mcmVlemVfc3dvcF9kdXJhdGlvbgAAAAABRgIAAAAYX2ZyZWV6ZV9hZGRpdGlvbmFsX3Rva2VuAAAAAAFHAgAAABBfZnJlZXplX3Rva2VuX2lkAAAAAAFIAgAAABZfZnJlZXplX3Rva2VuX2R1cmF0aW9uAAAAAAFJAgAAABhfZnJlZXplX3Rva2VuX3Blcl90aWNrZXQAAAAAAUoCAAAACl9idXlfdG9rZW4AAAAAAUsCAAAADV9jbGFpbV9wYXJhbXMAAAAAAUwCAAAAG19oaWdoX2NvbXBldGl0aW9uX2NvbWlzc2lvbgAAAAABTQIAAAAWX2hpZ2hfY29tcGV0aXRpb25fc2FsZQAAAAABTgIAAAAkX2hpZ2hfY29tcGV0aXRpb25fdGlja2V0X2xhc3RfbnVtYmVyAAAAAAFPAgAAABlfdGlja2V0c19oaWdoX2NvbXBldGl0aW9uAAAAAAFQAgAAACZfdG90YWxfYnV5X2Fzc2V0X3NvbGRfaGlnaF9jb21wZXRpdGlvbgAAAAABUQIAAAAPX2NsYWltZWRfdG9rZW5zAAAAAAFSAgAAABNfY2xhaW1lZF9idXlfdG9rZW5zAAAAAAFTAgAAAA9fYm91Z2h0X3RpY2tldHMAAAAAAVQCAAAAD190aWNrZXRzX251bWJlcgAAAAABVQIAAAAgX3RpY2tldHNfbnVtYmVyX2hpZ2hfY29tcGV0aXRpb24AAAAAAVYCAAAAIF9ib3VnaHRfdGlja2V0c19oaWdoX2NvbXBldGl0aW9uAAAAAAFXAgAAAB1fYXZhaWxhYmxlX3B1cmNoYXNlX21hcmtldGluZwAAAAABWAIAAAAhX3B1cmNoYXNlZF9idXlfYXNzZXRfaW5fbWFya2V0aW5nAAAAAAFZAgAAABNfYm91Z2h0X2FsbG9jYXRpb25zAAAAAAFaAgAAAA1fY2xhaW1fc3RhdHVzAAAAAAJhYQIAAAAPX3RpY2tldHNfcmVzdWx0AAAAAAJhYgIAAAAgX3RpY2tldHNfcmVzdWx0X2hpZ2hfY29tcGV0aXRpb24AAAAAAmFjAgAAABRfZnJlZXplX3Rva2VuX2Ftb3VudAAAAAACYWQJAQAAAAdBZGRyZXNzAAAAAQEAAAAaAVTpRaoekC86rvG6DuYumpJfGpiE4fNiswgAAAAAAmFlCQEAAAAHQWRkcmVzcwAAAAEBAAAAGgFUqvpp3oH0E1KFyj8uOohRsxnqmBxZ8g0tAAAAAAJhZgkBAAAAB0FkZHJlc3MAAAABAQAAABoBVIwpHfmxeVLLCX5an9rXLwYHFIPsDN0RSQAAAAACYWcJAQAAAAdBZGRyZXNzAAAAAQEAAAAaAVS5ic3PR3G6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", "height": 1923236, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 8Up7F9sHuNSYGSz5w16txM1woJnFpLuUCmoWYpxfs9J9 Next: Hy1nqh6UtykgL2qCVF2m9DXMA8uDfTQHdPUk2uGF3C48 Diff:
OldNewDifferences
205205 else {
206206 let launchpadId = getLaunchpadNextId()
207207 let launchpadIdStr = toString(launchpadId)
208- let $t064026477 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
209- let pmtAmount = $t064026477._1
210- let pmtAssetId = $t064026477._2
211- let $t064866559 = getAssetInfo(pmtAssetId)
212- let pmtStrAssetId = $t064866559._1
213- let pmtAssetName = $t064866559._2
214- let pmtDecimals = $t064866559._3
208+ let $t063776452 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
209+ let pmtAmount = $t063776452._1
210+ let pmtAssetId = $t063776452._2
211+ let $t064616534 = getAssetInfo(pmtAssetId)
212+ let pmtStrAssetId = $t064616534._1
213+ let pmtAssetName = $t064616534._2
214+ let pmtDecimals = $t064616534._3
215215 let freezeAdditionalEntry = if (freezeAdditionalToken)
216216 then [BooleanEntry((launchpadIdStr + keyFreezeAdditionalToken), true), StringEntry((launchpadIdStr + keyFreezeTokenId), freezeParams[0]), IntegerEntry((launchpadIdStr + keyFreezeTokenDuration), parseIntValue(freezeParams[1])), IntegerEntry((launchpadIdStr + keyFreezeTokenPerTicket), parseIntValue(freezeParams[2]))]
217217 else nil
218218 ([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)
219219 })
220+
221+
222+
223+@Callable(i)
224+func commitSwopfiSale (launchpadId,refId) = valueOrElse(isActive(), {
225+ let $t091409215 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
226+ let pmtAmount = $t091409215._1
227+ let pmtAssetId = $t091409215._2
228+ let $t092209370 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
229+ let buyAssetId = $t092209370._1
230+ let buyAssetStrId = $t092209370._2
231+ let buyAssetName = $t092209370._3
232+ let buyAssetDecimals = $t092209370._4
233+ let stakedSwops = valueOrElse(getInteger(governance, (toString(i.caller) + keyGovernanceStaked)), 0)
234+ let allowedTicketsAmountAll = (stakedSwops / getIntegerValue(this, (toString(launchpadId) + keySwopPerTicket)))
235+ let boughtTicketsAmount = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtTicketsAmount)), 0)
236+ let allowedTicketsAmount = (allowedTicketsAmountAll - boughtTicketsAmount)
237+ let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
238+ let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
239+ let freezeAdditionalToken = valueOrElse(getBoolean(this, (toString(launchpadId) + keyFreezeAdditionalToken)), false)
240+ if ((activeLaunchpadId != launchpadId))
241+ then throw("There is no active launchpad or this launchpad is ended")
242+ else if ((startHeight > height))
243+ then throw("Launchpad sale not started yet")
244+ else if ((height > (startHeight + duration)))
245+ then throw("Launchpad sale ended")
246+ else if (if (!(freezeAdditionalToken))
247+ then if ((size(i.payments) != 1))
248+ then true
249+ else (pmtAssetId != buyAssetId)
250+ else false)
251+ then throw((("One attached payment in " + buyAssetName) + " expected"))
252+ else if (if (freezeAdditionalToken)
253+ then if ((size(i.payments) != 2))
254+ then true
255+ else (pmtAssetId != buyAssetId)
256+ else false)
257+ then {
258+ let freezeTokenId = getStringValue(this, (toString(launchpadId) + keyFreezeTokenId))
259+ throw(((("Two attached payments expected: First in " + buyAssetName) + ", second in ") + freezeTokenId))
260+ }
261+ else if (if ((0 >= allowedTicketsAmountAll))
262+ then true
263+ else (0 >= allowedTicketsAmount))
264+ then throw("Not enought SWOP in staking to buy tickets")
265+ else {
266+ let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
267+ let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
268+ let $t01118211326 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
269+ let tokenId = $t01118211326._1
270+ let tokenStrAssetId = $t01118211326._2
271+ let tokenAssetName = $t01118211326._3
272+ let tokenDecimals = $t01118211326._4
273+ let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
274+ let commissionPerTicket = fraction(ticketPrice, getIntegerValue(this, (toString(launchpadId) + keyComission)), 100)
275+ let buyTicketAmount = (pmtAmount / (ticketPrice + commissionPerTicket))
276+ let allowedBuyTicketAmount = min([buyTicketAmount, allowedTicketsAmount])
277+ let allowedBuyPriceWithComission = (allowedBuyTicketAmount * (ticketPrice + commissionPerTicket))
278+ let change = (pmtAmount - allowedBuyPriceWithComission)
279+ if ((buyTicketAmount == 0))
280+ then throw((("Not enought " + buyAssetName) + " to buy tickets"))
281+ else if ((change != 0))
282+ then throw((((("Wrong payment. To buy " + toString(allowedBuyTicketAmount)) + "tickets you need to pay ") + toString(allowedBuyPriceWithComission)) + buyAssetName))
283+ else {
284+ let freezeAdditionalEntry = if (freezeAdditionalToken)
285+ then {
286+ let freezeTokenId = getStringValue(this, (toString(launchpadId) + keyFreezeTokenId))
287+ let freezeTokenPerTicket = getIntegerValue(this, (toString(launchpadId) + keyFreezeTokenPerTicket))
288+ let $t01249012577 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
289+ let pmtAmountFreeze = $t01249012577._1
290+ let pmtAssetIdFreeze = $t01249012577._2
291+ let $t01259412685 = getAssetInfo(pmtAssetId)
292+ let pmtFreezeStrAssetId = $t01259412685._1
293+ let pmtFreezeAssetName = $t01259412685._2
294+ let pmtFreezeDecimals = $t01259412685._3
295+ let needFreezeTokens = (freezeTokenPerTicket * buyTicketAmount)
296+ if (if ((pmtFreezeStrAssetId != freezeTokenId))
297+ then true
298+ else (needFreezeTokens != pmtAmountFreeze))
299+ then throw((((("You need to add " + toString(needFreezeTokens)) + " ") + pmtFreezeAssetName) + " as a second payment"))
300+ else [IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserFreezeToken), pmtAmountFreeze)]
301+ }
302+ else nil
303+ let userBoughtTicketsNumbers = valueOrElse(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserTickets)), "")
304+ let lastBoughtTicketNumber = getIntegerValue(this, (toString(launchpadId) + keyTicketLastNumber))
305+ let boughtRange = ((toString((lastBoughtTicketNumber + 1)) + "-") + toString((lastBoughtTicketNumber + allowedBuyTicketAmount)))
306+ let newUserBoughtTicketsNumbers = (userBoughtTicketsNumbers + (if ((userBoughtTicketsNumbers != ""))
307+ then ("," + boughtRange)
308+ else ("" + boughtRange)))
309+ let inv = if ((buyAssetId == USDN))
310+ then invoke(stakingUSDNAddress, "lockNeutrino", nil, [AttachedPayment(pmtAssetId, pmtAmount)])
311+ else 0
312+ if ((inv == inv))
313+ then {
314+ 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)
315+ if (!(isDefined(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId)))))
316+ then (baseEntry ++ [StringEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId), refId)])
317+ else baseEntry
318+ }
319+ else throw("Strict value is not equal to itself.")
320+ }
321+ }
322+ })
323+
324+
325+
326+@Callable(i)
327+func commitAccessListSale (launchpadId,refId) = valueOrElse(isActive(), {
328+ let $t01475614831 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
329+ let pmtAmount = $t01475614831._1
330+ let pmtAssetId = $t01475614831._2
331+ let $t01483614986 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
332+ let buyAssetId = $t01483614986._1
333+ let buyAssetStrId = $t01483614986._2
334+ let buyAssetName = $t01483614986._3
335+ let buyAssetDecimals = $t01483614986._4
336+ let userUsdnInMarketing = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserAmountBuyAssetInMarketing)), 0)
337+ let usdnInMarketing = valueOrElse(getInteger(this, (toString(launchpadId) + keyAmountBuyAssetInMarketing)), 0)
338+ let boughtAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtAllocations)), 0)
339+ let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
340+ let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
341+ let tokensPerAllocation = getIntegerValue(this, (toString(launchpadId) + keyTokensPerAllocation))
342+ let $t01565515799 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
343+ let tokenId = $t01565515799._1
344+ let tokenStrAssetId = $t01565515799._2
345+ let tokenAssetName = $t01565515799._3
346+ let tokenDecimals = $t01565515799._4
347+ let allocationPriceWithComission = fraction(fraction(tokenPrice, tokensPerAllocation, pow(10, 0, tokenDecimals, 0, 0, DOWN)), (100 + commission), 100)
348+ let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
349+ let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
350+ if ((activeLaunchpadId != launchpadId))
351+ then throw("There is no active launchpad or this launchpad is ended")
352+ else if ((startHeight > height))
353+ then throw("Launchpad sale not started yet")
354+ else if ((height > (startHeight + duration)))
355+ then throw("Launchpad sale ended")
356+ else if (if ((size(i.payments) != 1))
357+ then true
358+ else (pmtAssetId != buyAssetId))
359+ then throw((("One attached payment in " + buyAssetName) + " expected"))
360+ else if ((boughtAllocations >= maxAllocationsAmount))
361+ then throw((("You can buy only " + toString(maxAllocationsAmount)) + "allocations"))
362+ else if (if ((allocationPriceWithComission != pmtAmount))
363+ then ((allocationPriceWithComission * 2) != pmtAmount)
364+ else false)
365+ then throw(((("Wrong payment. You can buy 1 or 2 allocations for " + toString(allocationPriceWithComission)) + buyAssetName) + " per allocation"))
366+ else {
367+ let buyAllocationsAmount = (pmtAmount / allocationPriceWithComission)
368+ let inv = if ((buyAssetId == USDN))
369+ then invoke(stakingUSDNAddress, "lockNeutrino", nil, [AttachedPayment(pmtAssetId, pmtAmount)])
370+ else 0
371+ if ((inv == inv))
372+ then {
373+ 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))]
374+ if (!(isDefined(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId)))))
375+ then (baseEntry ++ [StringEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId), refId)])
376+ else baseEntry
377+ }
378+ else throw("Strict value is not equal to itself.")
379+ }
380+ })
381+
382+
383+
384+@Callable(i)
385+func commitHighCompetitionSale (launchpadId,refId) = valueOrElse(isActive(), {
386+ let $t01805718132 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
387+ let pmtAmount = $t01805718132._1
388+ let pmtAssetId = $t01805718132._2
389+ let $t01813718287 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
390+ let buyAssetId = $t01813718287._1
391+ let buyAssetStrId = $t01813718287._2
392+ let buyAssetName = $t01813718287._3
393+ let buyAssetDecimals = $t01813718287._4
394+ let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
395+ let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
396+ let boughtHCTicketsAmount = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserHCBoughtTicketsAmount)), 0)
397+ let highCompetitionSale = valueOrElse(getBoolean(this, (toString(launchpadId) + keyHighCompetitionSale)), false)
398+ if ((activeLaunchpadId != launchpadId))
399+ then throw("There is no active launchpad or this launchpad is ended")
400+ else if (!(highCompetitionSale))
401+ then throw("There is no high competition sale for this launchpad")
402+ else if ((startHeight > height))
403+ then throw("Launchpad sale not started yet")
404+ else if ((height > (startHeight + duration)))
405+ then throw("Launchpad sale ended")
406+ else if (if ((size(i.payments) != 1))
407+ then true
408+ else (pmtAssetId != buyAssetId))
409+ then throw((("One attached payment in " + buyAssetName) + " expected"))
410+ else {
411+ let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
412+ let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
413+ let $t01946019604 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
414+ let tokenId = $t01946019604._1
415+ let tokenStrAssetId = $t01946019604._2
416+ let tokenAssetName = $t01946019604._3
417+ let tokenDecimals = $t01946019604._4
418+ let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
419+ let commissionPerTicket = fraction(ticketPrice, getIntegerValue(this, (toString(launchpadId) + keyHighCompetitionComission)), 100)
420+ let buyTicketAmount = (pmtAmount / (ticketPrice + commissionPerTicket))
421+ let buyPriceWithComission = (buyTicketAmount * (ticketPrice + commissionPerTicket))
422+ let change = (pmtAmount - buyPriceWithComission)
423+ if ((buyTicketAmount == 0))
424+ then throw((("Not enought " + buyAssetName) + " to buy tickets"))
425+ else if ((change != 0))
426+ then throw((((("Wrong payment. To buy " + toString(buyTicketAmount)) + "tickets you need to pay ") + toString(buyPriceWithComission)) + buyAssetName))
427+ else {
428+ let userBoughtTicketsNumbers = valueOrElse(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserHCTickets)), "")
429+ let lastBoughtTicketNumber = getIntegerValue(this, (toString(launchpadId) + keyHCTicketLastNumber))
430+ let boughtRange = ((toString((lastBoughtTicketNumber + 1)) + "-") + toString((lastBoughtTicketNumber + buyTicketAmount)))
431+ let newUserBoughtTicketsNumbers = (userBoughtTicketsNumbers + (if ((userBoughtTicketsNumbers != ""))
432+ then ("," + boughtRange)
433+ else ("" + boughtRange)))
434+ let inv = if ((buyAssetId == USDN))
435+ then invoke(stakingUSDNAddress, "lockNeutrino", nil, [AttachedPayment(pmtAssetId, pmtAmount)])
436+ else 0
437+ if ((inv == inv))
438+ then {
439+ let baseEntry = [IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserHCBoughtTicketsAmount), (boughtHCTicketsAmount + buyTicketAmount)), IntegerEntry((toString(launchpadId) + keyHCTicketLastNumber), (lastBoughtTicketNumber + buyTicketAmount)), StringEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserHCTickets), newUserBoughtTicketsNumbers)]
440+ if (!(isDefined(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId)))))
441+ then (baseEntry ++ [StringEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId), refId)])
442+ else baseEntry
443+ }
444+ else throw("Strict value is not equal to itself.")
445+ }
446+ }
447+ })
220448
221449
222450
227455 if ((calcHash != savedHash))
228456 then throw("vrf Height hash not matching")
229457 else {
230- let $t094659615 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
231- let buyAssetId = $t094659615._1
232- let buyAssetStrId = $t094659615._2
233- let buyAssetName = $t094659615._3
234- let buyAssetDecimals = $t094659615._4
458+ let $t02221722367 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
459+ let buyAssetId = $t02221722367._1
460+ let buyAssetStrId = $t02221722367._2
461+ let buyAssetName = $t02221722367._3
462+ let buyAssetDecimals = $t02221722367._4
235463 let projectAddress = addressFromStringValue(getStringValue(this, (toString(launchpadId) + keyAddress)))
236464 let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
237465 let commissionHC = getIntegerValue(this, (toString(launchpadId) + keyHighCompetitionComission))
276504 else false)
277505 then throw("You can't claim because you don't buy anything")
278506 else {
279- let $t01265912836 = getAssetInfoFromString(valueOrElse(getString(this, (toString(launchpadId) + keyBuyToken)), toBase58String(USDN)))
280- let buyAssetId = $t01265912836._1
281- let buyAssetStrId = $t01265912836._2
282- let buyAssetName = $t01265912836._3
283- let buyAssetDecimals = $t01265912836._4
507+ let $t02541225562 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
508+ let buyAssetId = $t02541225562._1
509+ let buyAssetStrId = $t02541225562._2
510+ let buyAssetName = $t02541225562._3
511+ let buyAssetDecimals = $t02541225562._4
284512 let wonnedTickets = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserWinnedTicketsAmount)), 0)
285513 let wonnedHCTickets = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserWinnedHighCompetitionTicketsAmount)), 0)
286514 let awailableAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserAvailableAllocations)), 0)
287515 let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
288- let commissionHC = valueOrElse(getInteger(this, (toString(launchpadId) + keyHighCompetitionComission)), 0)
516+ let commissionHC = getIntegerValue(this, (toString(launchpadId) + keyHighCompetitionComission))
289517 let allowedAllocations = min([boughtAllocations, awailableAllocations])
290518 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
291519 let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
292- let $t01375213896 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
293- let tokenId = $t01375213896._1
294- let tokenStrAssetId = $t01375213896._2
295- let tokenAssetName = $t01375213896._3
296- let tokenDecimals = $t01375213896._4
520+ let $t02646826612 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
521+ let tokenId = $t02646826612._1
522+ let tokenStrAssetId = $t02646826612._2
523+ let tokenAssetName = $t02646826612._3
524+ let tokenDecimals = $t02646826612._4
297525 let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
298526 let tokensPerAllocation = getIntegerValue(this, (toString(launchpadId) + keyTokensPerAllocation))
299527 let transferTokensAmount = (((wonnedTickets * tokensPerTicket) + (allowedAllocations * tokensPerAllocation)) + (wonnedHCTickets * tokensPerTicket))
390618 @Callable(i)
391619 func transferBuyAsset (launchpadId,amount) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), {
392620 let projectAddress = addressFromStringValue(getStringValue(this, (toString(launchpadId) + keyAddress)))
393- let $t02010220252 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
394- let buyAssetId = $t02010220252._1
395- let buyAssetStrId = $t02010220252._2
396- let buyAssetName = $t02010220252._3
397- let buyAssetDecimals = $t02010220252._4
621+ let $t03281832968 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
622+ let buyAssetId = $t03281832968._1
623+ let buyAssetStrId = $t03281832968._2
624+ let buyAssetName = $t03281832968._3
625+ let buyAssetDecimals = $t03281832968._4
398626 [IntegerEntry((toString(launchpadId) + keyTransferBuyAsset), amount), ScriptTransfer(projectAddress, amount, buyAssetId)]
399627 }))
400628
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"
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
8888 let keyUserClaimedTokens = "_claimed_tokens"
8989
9090 let keyUserClaimedBuyTokens = "_claimed_buy_tokens"
9191
9292 let keyUserBoughtTicketsAmount = "_bought_tickets"
9393
9494 let keyUserTickets = "_tickets_number"
9595
9696 let keyUserHCTickets = "_tickets_number_high_competition"
9797
9898 let keyUserHCBoughtTicketsAmount = "_bought_tickets_high_competition"
9999
100100 let keyUserAvailableAllocations = "_available_purchase_marketing"
101101
102102 let keyUserAmountBuyAssetInMarketing = "_purchased_buy_asset_in_marketing"
103103
104104 let keyUserBoughtAllocations = "_bought_allocations"
105105
106106 let keyUserClaimStatus = "_claim_status"
107107
108108 let keyUserWinnedTicketsAmount = "_tickets_result"
109109
110110 let keyUserWinnedHighCompetitionTicketsAmount = "_tickets_result_high_competition"
111111
112112 let keyUserFreezeToken = "_freeze_token_amount"
113113
114114 let oracle = Address(base58'3NBBWfzZtZtszaXbitTKnrB2xXwv26Bn7H9')
115115
116116 let governance = Address(base58'3N5W8da2iiijVieA6qLGo7KzCJj8B19smWU')
117117
118118 let commissionWallet = Address(base58'3N2hBdeDEs7wCNA9EY8qv3B6drjgKD64xQG')
119119
120120 let stakingUSDNAddress = Address(base58'3N6q7sCGSSLBUXDdjBdYGTJbZGZfhhh8cNg')
121121
122122 let USDN = base58'8UrfDVd5GreeUwm7uPk7eYz1eMv376kzR52C6sANPkwS'
123123
124124 let adminPubKeyStaking = base58'Kn7NpzaG12dLZgcHf2ipUftU6hbJygmrhFqQYE4B7ZK'
125125
126126 let maxAllocationsAmount = 2
127127
128128 let activeLaunchpadId = valueOrElse(getIntegerValue(this, keyLaunchpadActiveId), -1)
129129
130130 func getAdminPub (keyAdminPub) = match getString(oracle, keyAdminPub) {
131131 case string: String =>
132132 fromBase58String(string)
133133 case nothing =>
134134 throw("Admin public key is empty")
135135 }
136136
137137
138138 let adminPubKey1 = getAdminPub(keyAdminPubKey1)
139139
140140 let adminPubKey2 = getAdminPub(keyAdminPubKey2)
141141
142142 let adminPubKey3 = getAdminPub(keyAdminPubKey3)
143143
144144 func getAssetInfo (assetId) = match assetId {
145145 case id: ByteVector =>
146146 let stringId = toBase58String(id)
147147 let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
148148 $Tuple3(stringId, info.name, info.decimals)
149149 case waves: Unit =>
150150 $Tuple3("WAVES", "WAVES", 8)
151151 case _ =>
152152 throw("Match error")
153153 }
154154
155155
156156 func getLaunchpadNextId () = valueOrElse(getInteger(this, keyLaunchpadNextId), 1)
157157
158158
159159 func stakedUsdnAmount () = valueOrElse(getInteger(stakingUSDNAddress, ((("rpd_balance_" + toBase58String(USDN)) + "_") + toString(this))), 0)
160160
161161
162162 let active = valueOrElse(getBoolean(this, keyActive), true)
163163
164164 func isActive () = if (active)
165165 then unit
166166 else throw("DApp is inactive at this moment")
167167
168168
169169 func isAdminCall (i) = if (containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey))
170170 then unit
171171 else throw("Only admin can call this function")
172172
173173
174174 func getAssetInfoFromString (assetStr) = if ((assetStr == "WAVES"))
175175 then $Tuple4(unit, "WAVES", "WAVES", 8)
176176 else {
177177 let stringId = assetStr
178178 let id = fromBase58String(assetStr)
179179 let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
180180 $Tuple4(id, stringId, info.name, info.decimals)
181181 }
182182
183183
184184 @Callable(i)
185185 func hashingRandom (launchpadId,hash) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), [StringEntry((toString(launchpadId) + keyVerifyHash), hash)]))
186186
187187
188188
189189 @Callable(i)
190190 func initCaller (address) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), [StringEntry(keyInitCaller, address)]))
191191
192192
193193
194194 @Callable(i)
195195 func init (projectAddress,startHeight,duration,buyToken,commission,tokensPerTicket,pricePerToken,swopfiTicketsAmount,campaignTokensAmount,tokensPerAllocation,swopPerTicket,swopFreezeDuration,claimParams,HighCompetitionSale,highCompetitionComission,highCompetitionTicketsAmount,freezeAdditionalToken,freezeParams) = valueOrElse(isActive(), if ((toString(i.caller) != valueOrElse(getString(this, keyInitCaller), "")))
196196 then throw("Only project admin can call init function")
197197 else if ((size(i.payments) != 1))
198198 then throw("One attached payment expected")
199199 else if ((height > startHeight))
200200 then throw("Start height must be greater than blockchain height")
201201 else if (if (freezeAdditionalToken)
202202 then (size(freezeParams) != 3)
203203 else false)
204204 then throw("Freeze params list must have 3 items")
205205 else {
206206 let launchpadId = getLaunchpadNextId()
207207 let launchpadIdStr = toString(launchpadId)
208- let $t064026477 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
209- let pmtAmount = $t064026477._1
210- let pmtAssetId = $t064026477._2
211- let $t064866559 = getAssetInfo(pmtAssetId)
212- let pmtStrAssetId = $t064866559._1
213- let pmtAssetName = $t064866559._2
214- let pmtDecimals = $t064866559._3
208+ let $t063776452 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
209+ let pmtAmount = $t063776452._1
210+ let pmtAssetId = $t063776452._2
211+ let $t064616534 = getAssetInfo(pmtAssetId)
212+ let pmtStrAssetId = $t064616534._1
213+ let pmtAssetName = $t064616534._2
214+ let pmtDecimals = $t064616534._3
215215 let freezeAdditionalEntry = if (freezeAdditionalToken)
216216 then [BooleanEntry((launchpadIdStr + keyFreezeAdditionalToken), true), StringEntry((launchpadIdStr + keyFreezeTokenId), freezeParams[0]), IntegerEntry((launchpadIdStr + keyFreezeTokenDuration), parseIntValue(freezeParams[1])), IntegerEntry((launchpadIdStr + keyFreezeTokenPerTicket), parseIntValue(freezeParams[2]))]
217217 else nil
218218 ([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)
219219 })
220+
221+
222+
223+@Callable(i)
224+func commitSwopfiSale (launchpadId,refId) = valueOrElse(isActive(), {
225+ let $t091409215 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
226+ let pmtAmount = $t091409215._1
227+ let pmtAssetId = $t091409215._2
228+ let $t092209370 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
229+ let buyAssetId = $t092209370._1
230+ let buyAssetStrId = $t092209370._2
231+ let buyAssetName = $t092209370._3
232+ let buyAssetDecimals = $t092209370._4
233+ let stakedSwops = valueOrElse(getInteger(governance, (toString(i.caller) + keyGovernanceStaked)), 0)
234+ let allowedTicketsAmountAll = (stakedSwops / getIntegerValue(this, (toString(launchpadId) + keySwopPerTicket)))
235+ let boughtTicketsAmount = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtTicketsAmount)), 0)
236+ let allowedTicketsAmount = (allowedTicketsAmountAll - boughtTicketsAmount)
237+ let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
238+ let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
239+ let freezeAdditionalToken = valueOrElse(getBoolean(this, (toString(launchpadId) + keyFreezeAdditionalToken)), false)
240+ if ((activeLaunchpadId != launchpadId))
241+ then throw("There is no active launchpad or this launchpad is ended")
242+ else if ((startHeight > height))
243+ then throw("Launchpad sale not started yet")
244+ else if ((height > (startHeight + duration)))
245+ then throw("Launchpad sale ended")
246+ else if (if (!(freezeAdditionalToken))
247+ then if ((size(i.payments) != 1))
248+ then true
249+ else (pmtAssetId != buyAssetId)
250+ else false)
251+ then throw((("One attached payment in " + buyAssetName) + " expected"))
252+ else if (if (freezeAdditionalToken)
253+ then if ((size(i.payments) != 2))
254+ then true
255+ else (pmtAssetId != buyAssetId)
256+ else false)
257+ then {
258+ let freezeTokenId = getStringValue(this, (toString(launchpadId) + keyFreezeTokenId))
259+ throw(((("Two attached payments expected: First in " + buyAssetName) + ", second in ") + freezeTokenId))
260+ }
261+ else if (if ((0 >= allowedTicketsAmountAll))
262+ then true
263+ else (0 >= allowedTicketsAmount))
264+ then throw("Not enought SWOP in staking to buy tickets")
265+ else {
266+ let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
267+ let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
268+ let $t01118211326 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
269+ let tokenId = $t01118211326._1
270+ let tokenStrAssetId = $t01118211326._2
271+ let tokenAssetName = $t01118211326._3
272+ let tokenDecimals = $t01118211326._4
273+ let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
274+ let commissionPerTicket = fraction(ticketPrice, getIntegerValue(this, (toString(launchpadId) + keyComission)), 100)
275+ let buyTicketAmount = (pmtAmount / (ticketPrice + commissionPerTicket))
276+ let allowedBuyTicketAmount = min([buyTicketAmount, allowedTicketsAmount])
277+ let allowedBuyPriceWithComission = (allowedBuyTicketAmount * (ticketPrice + commissionPerTicket))
278+ let change = (pmtAmount - allowedBuyPriceWithComission)
279+ if ((buyTicketAmount == 0))
280+ then throw((("Not enought " + buyAssetName) + " to buy tickets"))
281+ else if ((change != 0))
282+ then throw((((("Wrong payment. To buy " + toString(allowedBuyTicketAmount)) + "tickets you need to pay ") + toString(allowedBuyPriceWithComission)) + buyAssetName))
283+ else {
284+ let freezeAdditionalEntry = if (freezeAdditionalToken)
285+ then {
286+ let freezeTokenId = getStringValue(this, (toString(launchpadId) + keyFreezeTokenId))
287+ let freezeTokenPerTicket = getIntegerValue(this, (toString(launchpadId) + keyFreezeTokenPerTicket))
288+ let $t01249012577 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
289+ let pmtAmountFreeze = $t01249012577._1
290+ let pmtAssetIdFreeze = $t01249012577._2
291+ let $t01259412685 = getAssetInfo(pmtAssetId)
292+ let pmtFreezeStrAssetId = $t01259412685._1
293+ let pmtFreezeAssetName = $t01259412685._2
294+ let pmtFreezeDecimals = $t01259412685._3
295+ let needFreezeTokens = (freezeTokenPerTicket * buyTicketAmount)
296+ if (if ((pmtFreezeStrAssetId != freezeTokenId))
297+ then true
298+ else (needFreezeTokens != pmtAmountFreeze))
299+ then throw((((("You need to add " + toString(needFreezeTokens)) + " ") + pmtFreezeAssetName) + " as a second payment"))
300+ else [IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserFreezeToken), pmtAmountFreeze)]
301+ }
302+ else nil
303+ let userBoughtTicketsNumbers = valueOrElse(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserTickets)), "")
304+ let lastBoughtTicketNumber = getIntegerValue(this, (toString(launchpadId) + keyTicketLastNumber))
305+ let boughtRange = ((toString((lastBoughtTicketNumber + 1)) + "-") + toString((lastBoughtTicketNumber + allowedBuyTicketAmount)))
306+ let newUserBoughtTicketsNumbers = (userBoughtTicketsNumbers + (if ((userBoughtTicketsNumbers != ""))
307+ then ("," + boughtRange)
308+ else ("" + boughtRange)))
309+ let inv = if ((buyAssetId == USDN))
310+ then invoke(stakingUSDNAddress, "lockNeutrino", nil, [AttachedPayment(pmtAssetId, pmtAmount)])
311+ else 0
312+ if ((inv == inv))
313+ then {
314+ 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)
315+ if (!(isDefined(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId)))))
316+ then (baseEntry ++ [StringEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId), refId)])
317+ else baseEntry
318+ }
319+ else throw("Strict value is not equal to itself.")
320+ }
321+ }
322+ })
323+
324+
325+
326+@Callable(i)
327+func commitAccessListSale (launchpadId,refId) = valueOrElse(isActive(), {
328+ let $t01475614831 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
329+ let pmtAmount = $t01475614831._1
330+ let pmtAssetId = $t01475614831._2
331+ let $t01483614986 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
332+ let buyAssetId = $t01483614986._1
333+ let buyAssetStrId = $t01483614986._2
334+ let buyAssetName = $t01483614986._3
335+ let buyAssetDecimals = $t01483614986._4
336+ let userUsdnInMarketing = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserAmountBuyAssetInMarketing)), 0)
337+ let usdnInMarketing = valueOrElse(getInteger(this, (toString(launchpadId) + keyAmountBuyAssetInMarketing)), 0)
338+ let boughtAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtAllocations)), 0)
339+ let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
340+ let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
341+ let tokensPerAllocation = getIntegerValue(this, (toString(launchpadId) + keyTokensPerAllocation))
342+ let $t01565515799 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
343+ let tokenId = $t01565515799._1
344+ let tokenStrAssetId = $t01565515799._2
345+ let tokenAssetName = $t01565515799._3
346+ let tokenDecimals = $t01565515799._4
347+ let allocationPriceWithComission = fraction(fraction(tokenPrice, tokensPerAllocation, pow(10, 0, tokenDecimals, 0, 0, DOWN)), (100 + commission), 100)
348+ let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
349+ let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
350+ if ((activeLaunchpadId != launchpadId))
351+ then throw("There is no active launchpad or this launchpad is ended")
352+ else if ((startHeight > height))
353+ then throw("Launchpad sale not started yet")
354+ else if ((height > (startHeight + duration)))
355+ then throw("Launchpad sale ended")
356+ else if (if ((size(i.payments) != 1))
357+ then true
358+ else (pmtAssetId != buyAssetId))
359+ then throw((("One attached payment in " + buyAssetName) + " expected"))
360+ else if ((boughtAllocations >= maxAllocationsAmount))
361+ then throw((("You can buy only " + toString(maxAllocationsAmount)) + "allocations"))
362+ else if (if ((allocationPriceWithComission != pmtAmount))
363+ then ((allocationPriceWithComission * 2) != pmtAmount)
364+ else false)
365+ then throw(((("Wrong payment. You can buy 1 or 2 allocations for " + toString(allocationPriceWithComission)) + buyAssetName) + " per allocation"))
366+ else {
367+ let buyAllocationsAmount = (pmtAmount / allocationPriceWithComission)
368+ let inv = if ((buyAssetId == USDN))
369+ then invoke(stakingUSDNAddress, "lockNeutrino", nil, [AttachedPayment(pmtAssetId, pmtAmount)])
370+ else 0
371+ if ((inv == inv))
372+ then {
373+ 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))]
374+ if (!(isDefined(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId)))))
375+ then (baseEntry ++ [StringEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId), refId)])
376+ else baseEntry
377+ }
378+ else throw("Strict value is not equal to itself.")
379+ }
380+ })
381+
382+
383+
384+@Callable(i)
385+func commitHighCompetitionSale (launchpadId,refId) = valueOrElse(isActive(), {
386+ let $t01805718132 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
387+ let pmtAmount = $t01805718132._1
388+ let pmtAssetId = $t01805718132._2
389+ let $t01813718287 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
390+ let buyAssetId = $t01813718287._1
391+ let buyAssetStrId = $t01813718287._2
392+ let buyAssetName = $t01813718287._3
393+ let buyAssetDecimals = $t01813718287._4
394+ let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
395+ let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
396+ let boughtHCTicketsAmount = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserHCBoughtTicketsAmount)), 0)
397+ let highCompetitionSale = valueOrElse(getBoolean(this, (toString(launchpadId) + keyHighCompetitionSale)), false)
398+ if ((activeLaunchpadId != launchpadId))
399+ then throw("There is no active launchpad or this launchpad is ended")
400+ else if (!(highCompetitionSale))
401+ then throw("There is no high competition sale for this launchpad")
402+ else if ((startHeight > height))
403+ then throw("Launchpad sale not started yet")
404+ else if ((height > (startHeight + duration)))
405+ then throw("Launchpad sale ended")
406+ else if (if ((size(i.payments) != 1))
407+ then true
408+ else (pmtAssetId != buyAssetId))
409+ then throw((("One attached payment in " + buyAssetName) + " expected"))
410+ else {
411+ let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
412+ let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
413+ let $t01946019604 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
414+ let tokenId = $t01946019604._1
415+ let tokenStrAssetId = $t01946019604._2
416+ let tokenAssetName = $t01946019604._3
417+ let tokenDecimals = $t01946019604._4
418+ let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
419+ let commissionPerTicket = fraction(ticketPrice, getIntegerValue(this, (toString(launchpadId) + keyHighCompetitionComission)), 100)
420+ let buyTicketAmount = (pmtAmount / (ticketPrice + commissionPerTicket))
421+ let buyPriceWithComission = (buyTicketAmount * (ticketPrice + commissionPerTicket))
422+ let change = (pmtAmount - buyPriceWithComission)
423+ if ((buyTicketAmount == 0))
424+ then throw((("Not enought " + buyAssetName) + " to buy tickets"))
425+ else if ((change != 0))
426+ then throw((((("Wrong payment. To buy " + toString(buyTicketAmount)) + "tickets you need to pay ") + toString(buyPriceWithComission)) + buyAssetName))
427+ else {
428+ let userBoughtTicketsNumbers = valueOrElse(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserHCTickets)), "")
429+ let lastBoughtTicketNumber = getIntegerValue(this, (toString(launchpadId) + keyHCTicketLastNumber))
430+ let boughtRange = ((toString((lastBoughtTicketNumber + 1)) + "-") + toString((lastBoughtTicketNumber + buyTicketAmount)))
431+ let newUserBoughtTicketsNumbers = (userBoughtTicketsNumbers + (if ((userBoughtTicketsNumbers != ""))
432+ then ("," + boughtRange)
433+ else ("" + boughtRange)))
434+ let inv = if ((buyAssetId == USDN))
435+ then invoke(stakingUSDNAddress, "lockNeutrino", nil, [AttachedPayment(pmtAssetId, pmtAmount)])
436+ else 0
437+ if ((inv == inv))
438+ then {
439+ let baseEntry = [IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserHCBoughtTicketsAmount), (boughtHCTicketsAmount + buyTicketAmount)), IntegerEntry((toString(launchpadId) + keyHCTicketLastNumber), (lastBoughtTicketNumber + buyTicketAmount)), StringEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserHCTickets), newUserBoughtTicketsNumbers)]
440+ if (!(isDefined(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId)))))
441+ then (baseEntry ++ [StringEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId), refId)])
442+ else baseEntry
443+ }
444+ else throw("Strict value is not equal to itself.")
445+ }
446+ }
447+ })
220448
221449
222450
223451 @Callable(i)
224452 func finalise (launchpadId,vrfHeight,secretWord) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), {
225453 let savedHash = getStringValue(this, (toString(launchpadId) + keyVerifyHash))
226454 let calcHash = toBase58String(sha256((toBytes(vrfHeight) + toBytes(secretWord))))
227455 if ((calcHash != savedHash))
228456 then throw("vrf Height hash not matching")
229457 else {
230- let $t094659615 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
231- let buyAssetId = $t094659615._1
232- let buyAssetStrId = $t094659615._2
233- let buyAssetName = $t094659615._3
234- let buyAssetDecimals = $t094659615._4
458+ let $t02221722367 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
459+ let buyAssetId = $t02221722367._1
460+ let buyAssetStrId = $t02221722367._2
461+ let buyAssetName = $t02221722367._3
462+ let buyAssetDecimals = $t02221722367._4
235463 let projectAddress = addressFromStringValue(getStringValue(this, (toString(launchpadId) + keyAddress)))
236464 let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
237465 let commissionHC = getIntegerValue(this, (toString(launchpadId) + keyHighCompetitionComission))
238466 let transferedBuyAsset = valueOrElse(getInteger(this, (toString(launchpadId) + keyTransferBuyAsset)), 0)
239467 let swopfiMembersBuyAssetAmount = getIntegerValue(this, (toString(launchpadId) + keyTotalAmountBuyAssetSold))
240468 let swopfiHCBuyAssetAmount = valueOrElse(getIntegerValue(this, (toString(launchpadId) + keyTotalAmountBuyAssetSoldHC)), 0)
241469 let swopfiMembersComission = fraction(swopfiMembersBuyAssetAmount, commission, 100)
242470 let swopfiHCComission = fraction(swopfiHCBuyAssetAmount, commissionHC, 100)
243471 let totalAmountBuyAssetInMarketing = getIntegerValue(this, (toString(launchpadId) + keyAmountBuyAssetInMarketingFinalized))
244472 let marketingComission = fraction(totalAmountBuyAssetInMarketing, commission, 100)
245473 let unstakeAmount = (((((swopfiMembersBuyAssetAmount + totalAmountBuyAssetInMarketing) + swopfiMembersComission) + marketingComission) + swopfiHCBuyAssetAmount) + swopfiHCComission)
246474 if ((transferedBuyAsset > (swopfiMembersBuyAssetAmount + totalAmountBuyAssetInMarketing)))
247475 then throw("Can't transfer negative value to project")
248476 else {
249477 let inv = if ((buyAssetId == USDN))
250478 then invoke(stakingUSDNAddress, "unlockNeutrino", [unstakeAmount, toBase58String(USDN)], nil)
251479 else 0
252480 if ((inv == inv))
253481 then [IntegerEntry((toString(launchpadId) + keyFinaliseHeight), height), ScriptTransfer(projectAddress, (((swopfiMembersBuyAssetAmount + swopfiHCBuyAssetAmount) + totalAmountBuyAssetInMarketing) - transferedBuyAsset), buyAssetId), ScriptTransfer(commissionWallet, ((swopfiMembersComission + marketingComission) + swopfiHCComission), buyAssetId)]
254482 else throw("Strict value is not equal to itself.")
255483 }
256484 }
257485 }))
258486
259487
260488
261489 @Callable(i)
262490 func claim (launchpadId) = valueOrElse(isActive(), {
263491 let boughtTickets = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtTicketsAmount)), 0)
264492 let boughtHCTickets = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserHCBoughtTicketsAmount)), 0)
265493 let boughtAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtAllocations)), 0)
266494 let userClaimStatus = valueOrElse(getBoolean(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimStatus)), false)
267495 let finalizeHeight = valueOrElse(getInteger(this, (toString(launchpadId) + keyFinaliseHeight)), 0)
268496 if ((finalizeHeight == 0))
269497 then throw("You can't claim because results are not finalized")
270498 else if (userClaimStatus)
271499 then throw("You are already claimed")
272500 else if (if (if ((boughtTickets == 0))
273501 then (boughtAllocations == 0)
274502 else false)
275503 then (boughtHCTickets == 0)
276504 else false)
277505 then throw("You can't claim because you don't buy anything")
278506 else {
279- let $t01265912836 = getAssetInfoFromString(valueOrElse(getString(this, (toString(launchpadId) + keyBuyToken)), toBase58String(USDN)))
280- let buyAssetId = $t01265912836._1
281- let buyAssetStrId = $t01265912836._2
282- let buyAssetName = $t01265912836._3
283- let buyAssetDecimals = $t01265912836._4
507+ let $t02541225562 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
508+ let buyAssetId = $t02541225562._1
509+ let buyAssetStrId = $t02541225562._2
510+ let buyAssetName = $t02541225562._3
511+ let buyAssetDecimals = $t02541225562._4
284512 let wonnedTickets = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserWinnedTicketsAmount)), 0)
285513 let wonnedHCTickets = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserWinnedHighCompetitionTicketsAmount)), 0)
286514 let awailableAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserAvailableAllocations)), 0)
287515 let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
288- let commissionHC = valueOrElse(getInteger(this, (toString(launchpadId) + keyHighCompetitionComission)), 0)
516+ let commissionHC = getIntegerValue(this, (toString(launchpadId) + keyHighCompetitionComission))
289517 let allowedAllocations = min([boughtAllocations, awailableAllocations])
290518 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
291519 let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
292- let $t01375213896 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
293- let tokenId = $t01375213896._1
294- let tokenStrAssetId = $t01375213896._2
295- let tokenAssetName = $t01375213896._3
296- let tokenDecimals = $t01375213896._4
520+ let $t02646826612 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
521+ let tokenId = $t02646826612._1
522+ let tokenStrAssetId = $t02646826612._2
523+ let tokenAssetName = $t02646826612._3
524+ let tokenDecimals = $t02646826612._4
297525 let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
298526 let tokensPerAllocation = getIntegerValue(this, (toString(launchpadId) + keyTokensPerAllocation))
299527 let transferTokensAmount = (((wonnedTickets * tokensPerTicket) + (allowedAllocations * tokensPerAllocation)) + (wonnedHCTickets * tokensPerTicket))
300528 let notAllowedAllocationsTokens = ((boughtAllocations - allowedAllocations) * tokensPerAllocation)
301529 let buyAssetForAllocations = fraction(fraction(notAllowedAllocationsTokens, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN)), (100 + commission), 100)
302530 let buyAssetForUnwonnedTickets = fraction(((boughtTickets - wonnedTickets) * ticketPrice), (100 + commission), 100)
303531 let buyAssetForHCUnwonnedTickets = fraction(((boughtHCTickets - wonnedHCTickets) * ticketPrice), (100 + commissionHC), 100)
304532 let claimedBuyToken = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimedBuyTokens)), 0)
305533 if (if (if ((0 > buyAssetForAllocations))
306534 then true
307535 else (0 > buyAssetForUnwonnedTickets))
308536 then true
309537 else (0 > buyAssetForHCUnwonnedTickets))
310538 then throw("Error with allowed allocation param or wonned tickets param please contact support")
311539 else {
312540 let returnedBuyAssetAmount = (((buyAssetForUnwonnedTickets + buyAssetForHCUnwonnedTickets) + buyAssetForAllocations) - claimedBuyToken)
313541 let transferBuyAsset = if ((returnedBuyAssetAmount > 0))
314542 then [ScriptTransfer(i.caller, returnedBuyAssetAmount, buyAssetId), IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimedBuyTokens), returnedBuyAssetAmount)]
315543 else nil
316544 let inv = if (if ((returnedBuyAssetAmount > 0))
317545 then (buyAssetId == USDN)
318546 else false)
319547 then invoke(stakingUSDNAddress, "unlockNeutrino", [returnedBuyAssetAmount, toBase58String(USDN)], nil)
320548 else 0
321549 if ((inv == inv))
322550 then {
323551 let claimedParams = split(valueOrElse(getString(this, (toString(launchpadId) + keyClaimParams)), ""), ",")
324552 if (if ((size(claimedParams) == 0))
325553 then true
326554 else (claimedParams[0] == "claimAll"))
327555 then {
328556 let transferTokens = if ((transferTokensAmount > 0))
329557 then [ScriptTransfer(i.caller, transferTokensAmount, tokenId)]
330558 else nil
331559 (([BooleanEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimStatus), true), IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimedTokens), transferTokensAmount)] ++ transferTokens) ++ transferBuyAsset)
332560 }
333561 else if ((claimedParams[0] == "claimPeriod"))
334562 then {
335563 let claimedTokens = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimedTokens)), 0)
336564 let unlockPeriod = value(parseInt(claimedParams[2]))
337565 let blockHeight = (value(parseInt(claimedParams[3])) + finalizeHeight)
338566 let unlockHeight = (unlockPeriod + blockHeight)
339567 let allowedStartAmount = fraction(transferTokensAmount, value(parseInt(claimedParams[1])), 100)
340568 let allowedTokensAmount = (allowedStartAmount + (if ((height > blockHeight))
341569 then (fraction((transferTokensAmount - allowedStartAmount), (min([height, unlockHeight]) - blockHeight), unlockPeriod) - claimedTokens)
342570 else (0 - claimedTokens)))
343571 let claimStatusEntry = if ((transferTokensAmount >= (claimedTokens + allowedTokensAmount)))
344572 then [BooleanEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimStatus), true)]
345573 else nil
346574 if (if ((allowedTokensAmount > 0))
347575 then true
348576 else (returnedBuyAssetAmount > 0))
349577 then {
350578 let transferTokens = if ((allowedTokensAmount > 0))
351579 then [IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimedTokens), (claimedTokens + allowedTokensAmount)), ScriptTransfer(i.caller, allowedTokensAmount, tokenId)]
352580 else nil
353581 (transferBuyAsset ++ transferTokens)
354582 }
355583 else throw("Nothing to claim")
356584 }
357585 else throw("Unknown claim function")
358586 }
359587 else throw("Strict value is not equal to itself.")
360588 }
361589 }
362590 })
363591
364592
365593
366594 @Callable(i)
367595 func claimFreezeToken (launchpadId) = valueOrElse(isActive(), {
368596 let freezeAdditionalToken = valueOrElse(getBoolean(this, (toString(launchpadId) + keyFreezeAdditionalToken)), false)
369597 if (!(isDefined(getInteger(this, (toString(launchpadId) + keyFinaliseHeight)))))
370598 then throw("You can't claim because results are not finalized")
371599 else if (!(freezeAdditionalToken))
372600 then throw("There are no additional token freezing for this launchpad")
373601 else {
374602 let tokenId = fromBase58String(getStringValue(this, (toString(launchpadId) + keyFreezeTokenId)))
375603 let userTokensFreezed = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserFreezeToken)), 0)
376604 let startHeight = valueOrElse(getInteger(this, (toString(launchpadId) + keyStartHeight)), 0)
377605 let duration = valueOrElse(getInteger(this, (toString(launchpadId) + keyDuration)), 0)
378606 let freezeTokenDuration = getIntegerValue(this, (toString(launchpadId) + keyFreezeTokenDuration))
379607 let blockEndHeight = ((startHeight + duration) + freezeTokenDuration)
380608 if ((userTokensFreezed == 0))
381609 then throw("You are already claimed your tokens or not paid anything")
382610 else if ((blockEndHeight > height))
383611 then throw(("Your tokens freezed teel " + toString(blockEndHeight)))
384612 else [ScriptTransfer(i.caller, userTokensFreezed, tokenId), IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserFreezeToken), 0)]
385613 }
386614 })
387615
388616
389617
390618 @Callable(i)
391619 func transferBuyAsset (launchpadId,amount) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), {
392620 let projectAddress = addressFromStringValue(getStringValue(this, (toString(launchpadId) + keyAddress)))
393- let $t02010220252 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
394- let buyAssetId = $t02010220252._1
395- let buyAssetStrId = $t02010220252._2
396- let buyAssetName = $t02010220252._3
397- let buyAssetDecimals = $t02010220252._4
621+ let $t03281832968 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
622+ let buyAssetId = $t03281832968._1
623+ let buyAssetStrId = $t03281832968._2
624+ let buyAssetName = $t03281832968._3
625+ let buyAssetDecimals = $t03281832968._4
398626 [IntegerEntry((toString(launchpadId) + keyTransferBuyAsset), amount), ScriptTransfer(projectAddress, amount, buyAssetId)]
399627 }))
400628
401629
402630
403631 @Callable(i)
404632 func shutdown () = valueOrElse(isAdminCall(i), if (!(active))
405633 then throw("DApp already inactive")
406634 else [BooleanEntry(keyActive, false)])
407635
408636
409637
410638 @Callable(i)
411639 func activate () = valueOrElse(isAdminCall(i), if (active)
412640 then throw("DApp already active")
413641 else [BooleanEntry(keyActive, true)])
414642
415643
416644 @Verifier(tx)
417645 func verify () = {
418646 let multiSignedByAdmins = {
419647 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
420648 then 1
421649 else 0
422650 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
423651 then 1
424652 else 0
425653 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
426654 then 1
427655 else 0
428656 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
429657 }
430658 let signedByAdmin = if (if (if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
431659 then true
432660 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey2))
433661 then true
434662 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey3))
435663 then true
436664 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKeyStaking)
437665 match tx {
438666 case dtx: DataTransaction =>
439667 if (valueOrElse(getBoolean(oracle, keyLaunchpadDataTransactionStatus), false))
440668 then signedByAdmin
441669 else false
442670 case _ =>
443671 multiSignedByAdmins
444672 }
445673 }
446674

github/deemru/w8io/873ac7e 
121.04 ms