tx · Fcwu78tyMhrRsmrqvaz5uGubMUngQZqmmYjPC8musL1W

3MzDGFvPnXVbA4wCacqcVnfVJPwG952KVAg:  -0.01400000 Waves

2021.12.20 12:16 [1842386] smart account 3MzDGFvPnXVbA4wCacqcVnfVJPwG952KVAg > SELF 0.00000000 Waves

{ "type": 13, "id": "Fcwu78tyMhrRsmrqvaz5uGubMUngQZqmmYjPC8musL1W", "fee": 1400000, "feeAssetId": null, "timestamp": 1639991762837, "version": 2, "chainId": 84, "sender": "3MzDGFvPnXVbA4wCacqcVnfVJPwG952KVAg", "senderPublicKey": "CViCXhHrygDDAtVc1uFczxe6ANj9tBz5PGQDS1yWZqgy", "proofs": [ "Sne74Wy4ZU4TBwnzSfSaqgwDWJeCFbdgAvLtBJDhYY8rezeZ16dfDGYcG67uEyVH5zVY2683YK1QeEk5AkbMzKF", "39qvZjuACDUHEihetUF12pDoheeuN3eMvoaExpQQF1ikXzw14uqCA7XkEtm1zTSVZcMb8JZU6GfzWSmUG18da2Rs" ], "script": "base64:AAIFAAAAAAAAADwIAhIECgIBCBIDCgEIEhQKEggBAQgBAQEBAQEBARgEAQEEGBIECgIBCBIECgIBCBIECgIBCBIFCgMBAQgAAABIAAAAAAlrZXlBY3RpdmUCAAAABmFjdGl2ZQAAAAAPa2V5QWRtaW5QdWJLZXkxAgAAAAthZG1pbl9wdWJfMQAAAAAPa2V5QWRtaW5QdWJLZXkyAgAAAAthZG1pbl9wdWJfMgAAAAAPa2V5QWRtaW5QdWJLZXkzAgAAAAthZG1pbl9wdWJfMwAAAAAha2V5TGF1bmNocGFkRGF0YVRyYW5zYWN0aW9uU3RhdHVzAgAAACFsYXVuY2hwYWRfZGF0YV90cmFuc2FjdGlvbl9zdGF0dXMAAAAAEmtleUxhdW5jaHBhZE5leHRJZAIAAAARbGF1bmNocGFkX25leHRfaWQAAAAAFGtleUxhdW5jaHBhZEFjdGl2ZUlkAgAAABNsYXVuY2hwYWRfYWN0aXZlX2lkAAAAAA1rZXlJbml0Q2FsbGVyAgAAAAtpbml0X2NhbGxlcgAAAAAKa2V5QWRkcmVzcwIAAAAIX2FkZHJlc3MAAAAADWtleUluaXRIZWlnaHQCAAAADF9pbml0X2hlaWdodAAAAAAOa2V5U3RhcnRIZWlnaHQCAAAADV9zdGFydF9oZWlnaHQAAAAAEWtleUZpbmFsaXNlSGVpZ2h0AgAAABBfZmluYWxpc2VfaGVpZ2h0AAAAAAxrZXlDb21pc3Npb24CAAAACl9jb21pc3Npb24AAAAACmtleUFzc2V0SWQCAAAACV9hc3NldF9pZAAAAAATa2V5VG90YWxUb2tlbkFtb3VudAIAAAATX3RvdGFsX3Rva2VuX2Ftb3VudAAAAAAaa2V5VG90YWxBbW91bnRCdXlBc3NldFNvbGQCAAAAFV90b3RhbF9idXlfYXNzZXRfc29sZAAAAAASa2V5VG9rZW5zUGVyVGlja2V0AgAAABJfdG9rZW5zX3Blcl90aWNrZXQAAAAAEGtleVByaWNlUGVyVG9rZW4CAAAAEF9wcmljZV9wZXJfdG9rZW4AAAAAEGtleVN3b3BQZXJUaWNrZXQCAAAAEF9zd29wX3Blcl90aWNrZXQAAAAAFmtleVN3b3BmaVRpY2tldHNBbW91bnQCAAAAF190aWNrZXRzX3N3b3BmaV9tZW1iZXJzAAAAABdrZXlDYW1wYWlnblRva2Vuc0Ftb3VudAIAAAATX3Rva2Vuc19hY2Nlc3NfbGlzdAAAAAAWa2V5VG9rZW5zUGVyQWxsb2NhdGlvbgIAAAAWX3Rva2Vuc19wZXJfYWxsb2NhdGlvbgAAAAATa2V5VGlja2V0TGFzdE51bWJlcgIAAAAkX3RpY2tldF9sYXN0X251bWJlcl9oaWdoX2NvbXBldGl0aW9uAAAAABNrZXlHb3Zlcm5hbmNlU3Rha2VkAgAAAAxfU1dPUF9hbW91bnQAAAAADGtleVVzZXJSZWZJZAIAAAAHX3JlZl9pZAAAAAANa2V5VmVyaWZ5SGFzaAIAAAAMX3ZlcmlmeV9oYXNoAAAAAAtrZXlEdXJhdGlvbgIAAAAJX2R1cmF0aW9uAAAAABxrZXlBbW91bnRCdXlBc3NldEluTWFya2V0aW5nAgAAACdfdG90YWxfcHVyY2hhc2VkX2J1eV9hc3NldF9pbl9tYXJrZXRpbmcAAAAAJWtleUFtb3VudEJ1eUFzc2V0SW5NYXJrZXRpbmdGaW5hbGl6ZWQCAAAAMV90b3RhbF9wdXJjaGFzZWRfYnV5X2Fzc2V0X2luX21hcmtldGluZ19maW5hbGl6ZWQAAAAAE2tleVRyYW5zZmVyQnV5QXNzZXQCAAAAE190cmFuc2Zlcl9idXlfYXNzZXQAAAAAFGtleUZyZWV6U3dvcER1cmF0aW9uAgAAABVfZnJlZXplX3N3b3BfZHVyYXRpb24AAAAAGGtleUZyZWV6ZUFkZGl0aW9uYWxUb2tlbgIAAAAYX2ZyZWV6ZV9hZGRpdGlvbmFsX3Rva2VuAAAAABBrZXlGcmVlemVUb2tlbklkAgAAABBfZnJlZXplX3Rva2VuX2lkAAAAABZrZXlGcmVlemVUb2tlbkR1cmF0aW9uAgAAABZfZnJlZXplX3Rva2VuX2R1cmF0aW9uAAAAABdrZXlGcmVlemVUb2tlblBlclRpY2tldAIAAAAYX2ZyZWV6ZV90b2tlbl9wZXJfdGlja2V0AAAAAAtrZXlCdXlUb2tlbgIAAAAKX2J1eV90b2tlbgAAAAAOa2V5Q2xhaW1QYXJhbXMCAAAADV9jbGFpbV9wYXJhbXMAAAAAG2tleUhpZ2hDb21wZXRpdGlvbkNvbWlzc2lvbgIAAAAbX2hpZ2hfY29tcGV0aXRpb25fY29taXNzaW9uAAAAABZrZXlIaWdoQ29tcGV0aXRpb25TYWxlAgAAABZfaGlnaF9jb21wZXRpdGlvbl9zYWxlAAAAABVrZXlIQ1RpY2tldExhc3ROdW1iZXICAAAAJF9oaWdoX2NvbXBldGl0aW9uX3RpY2tldF9sYXN0X251bWJlcgAAAAAYa2V5SGlnaENvbXBldGl0aW9uQW1vdW50AgAAABlfdGlja2V0c19oaWdoX2NvbXBldGl0aW9uAAAAABxrZXlUb3RhbEFtb3VudEJ1eUFzc2V0U29sZEhDAgAAACZfdG90YWxfYnV5X2Fzc2V0X3NvbGRfaGlnaF9jb21wZXRpdGlvbgAAAAAUa2V5VXNlckNsYWltZWRUb2tlbnMCAAAAD19jbGFpbWVkX3Rva2VucwAAAAAXa2V5VXNlckNsYWltZWRCdXlUb2tlbnMCAAAAE19jbGFpbWVkX2J1eV90b2tlbnMAAAAAGmtleVVzZXJCb3VnaHRUaWNrZXRzQW1vdW50AgAAAA9fYm91Z2h0X3RpY2tldHMAAAAADmtleVVzZXJUaWNrZXRzAgAAAA9fdGlja2V0c19udW1iZXIAAAAAEGtleVVzZXJIQ1RpY2tldHMCAAAAIF90aWNrZXRzX251bWJlcl9oaWdoX2NvbXBldGl0aW9uAAAAABxrZXlVc2VySENCb3VnaHRUaWNrZXRzQW1vdW50AgAAACBfYm91Z2h0X3RpY2tldHNfaGlnaF9jb21wZXRpdGlvbgAAAAAba2V5VXNlckF2YWlsYWJsZUFsbG9jYXRpb25zAgAAAB1fYXZhaWxhYmxlX3B1cmNoYXNlX21hcmtldGluZwAAAAAga2V5VXNlckFtb3VudEJ1eUFzc2V0SW5NYXJrZXRpbmcCAAAAIV9wdXJjaGFzZWRfYnV5X2Fzc2V0X2luX21hcmtldGluZwAAAAAYa2V5VXNlckJvdWdodEFsbG9jYXRpb25zAgAAABNfYm91Z2h0X2FsbG9jYXRpb25zAAAAABJrZXlVc2VyQ2xhaW1TdGF0dXMCAAAADV9jbGFpbV9zdGF0dXMAAAAAGmtleVVzZXJXaW5uZWRUaWNrZXRzQW1vdW50AgAAAA9fdGlja2V0c19yZXN1bHQAAAAAKWtleVVzZXJXaW5u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aW5QdWJLZXkxCQAETAAAAAIFAAAADGFkbWluUHViS2V5MgkABEwAAAACBQAAAAxhZG1pblB1YktleTMFAAAAA25pbAgFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5CQAAAgAAAAECAAAAIU9ubHkgYWRtaW4gY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACBQAAAA1rZXlJbml0Q2FsbGVyBQAAAAdhZGRyZXNzBQAAAANuaWwAAAABaQEAAAAEaW5pdAAAABIAAAAOcHJvamVjdEFkZHJlc3MAAAALc3RhcnRIZWlnaHQAAAAIZHVyYXRpb24AAAAIYnV5VG9rZW4AAAAKY29tbWlzc2lvbgAAAA90b2tlbnNQZXJUaWNrZXQAAAANcHJpY2VQZXJUb2tlbgAAABNzd29wZmlUaWNrZXRzQW1vdW50AAAAFGNhbXBhaWduVG9rZW5zQW1vdW50AAAAE3Rva2Vuc1BlckFsbG9jYXRpb24AAAANc3dvcFBlclRpY2tldAAAABJzd29wRnJlZXplRHVyYXRpb24AAAALY2xhaW1QYXJhbXMAAAATSGlnaENvbXBldGl0aW9uU2FsZQAAABhoaWdoQ29tcGV0aXRpb25Db21pc3Npb24AAAAcaGlnaENvbXBldGl0aW9uVGlja2V0c0Ftb3VudAAAABVmcmVlemVBZGRpdGlvbmFsVG9rZW4AAAAMZnJlZXplUGFyYW1zAwkBAAAAASEAAAABBQAAAAhpc0FjdGl2ZQkAAAIAAAABAgAAAB9EQXBwIGlzIGluYWN0aXZlIGF0IHRoaXMgbW9tZW50AwkBAAAAAiE9AAAAAgkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQdAAAAAgUAAAAEdGhpcwUAAAANa2V5SW5pdENhbGxlcgIAAAAACQAAAgAAAAECAAAAKU9ubHkgcHJvamVjdCBhZG1pbiBjYW4gY2FsbCBpbml0IGZ1bmN0aW9uAwkBAAAAAiE9AAAAAgkAAZAAAAABCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAQkAAAIAAAABAgAAAB1PbmUgYXR0YWNoZWQgcGF5bWVudCBleHBlY3RlZAMJAABmAAAAAgUAAAAGaGVpZ2h0BQAAAAtzdGFydEhlaWdodAkAAAIAAAABAgAAADNTdGFydCBoZWlnaHQgbXVzdCBiZSBncmVhdGVyIHRoYW4gYmxvY2tjaGFpbiBoZWlnaHQDAwUAAAAVZnJlZXplQWRkaXRpb25hbFRva2VuCQEAAAACIT0AAAACCQABkAAAAAEFAAAADGZyZWV6ZVBhcmFtcwAAAAAAAAAAAwcJAAACAAAAAQIAAAAkRnJlZXplIHBhcmFtcyBsaXN0IG11c3QgaGF2ZSAzIGl0ZW1zBAAAAAtsYXVuY2hwYWRJZAkBAAAAEmdldExhdW5jaHBhZE5leHRJZAAAAAAEAAAADmxhdW5jaHBhZElkU3RyCQABpAAAAAEFAAAAC2xhdW5jaHBhZElkBAAAAAskdDA2NTYyNjYzNwkABRQAAAACCAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAAAAAZhbW91bnQICQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAAAAAAB2Fzc2V0SWQEAAAACXBtdEFtb3VudAgFAAAACyR0MDY1NjI2NjM3AAAAAl8xBAAAAApwbXRBc3NldElkCAUAAAALJHQwNjU2MjY2MzcAAAACXzIEAAAACyR0MDY2NDY2NzE5CQEAAAAMZ2V0QXNzZXRJbmZvAAAAAQUAAAAKcG10QXNzZXRJZAQAAAANcG10U3RyQXNzZXRJZAgFAAAACyR0MDY2NDY2NzE5AAAAAl8xBAAAAAxwbXRBc3NldE5hbWUIBQAAAAskdDA2NjQ2NjcxOQAAAAJfMgQAAAALcG10RGVjaW1hbHMIBQAAAAskdDA2NjQ2NjcxOQAAAAJfMwQAAAAVZnJlZXplQWRkaXRpb25hbEVudHJ5AwUAAAAVZnJlZXplQWRkaXRpb25hbFRva2VuCQAETAAAAAIJAQAAAAxCb29sZWFuRW50cnkAAAACCQABLAAAAAIFAAAADmxhdW5jaHBhZElkU3RyBQAAABhrZXlGcmVlemVBZGRpdGlvbmFsVG9rZW4GCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAAEsAAAAAgUAAAAObGF1bmNocGFkSWRTdHIFAAAAEGtleUZyZWV6ZVRva2VuSWQJAAGRAAAAAgUAAAAMZnJlZXplUGFyYW1zAAAAAAAAAAAACQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQABLAAAAAIFAAAADmxhdW5jaHBhZElkU3RyBQAAABZrZXlGcmVlemVUb2tlbkR1cmF0aW9uCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAMZnJlZXplUGFyYW1zAAAAAAAAAAABCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQABLAAAAAIFAAAADmxhdW5jaHBhZElkU3RyBQAAABdrZXlGcmVlemVUb2tlblBlclRpY2tldAkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAADGZyZWV6ZVBhcmFtcwAAAAAAAAAAAgUAAAADbmlsBQAAAANuaWwJAAROAAAAAgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkAASwAAAACBQAAAA1wbXRTdHJBc3NldElkAgAAAApfbGF1bmNocGFkBQAAAAtsYXVuY2hwYWRJZAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAASa2V5TGF1bmNocGFkTmV4dElkCQAAZAAAAAIFAAAAC2xhdW5jaHBhZElkAAAAAAAAAAABCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAAEsAAAAAgUAAAAObGF1bmNocGFkSWRTdHIFAAAACmtleUFkZHJlc3MFAAAADnByb2plY3RBZGRyZXNzCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQABLAAAAAIFAAAADmxhdW5jaHBhZElkU3RyBQAAAA1rZXlJbml0SGVpZ2h0BQAAAAZoZWlnaHQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAAEsAAAAAgUAAAAObGF1bmNocGFkSWRTdHIFAAAADmtleVN0YXJ0SGVpZ2h0BQAAAAtzdGFydEhlaWdodAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkAASwAAAACBQAAAA5sYXVuY2hwYWRJZFN0cgUAAAALa2V5RHVyYXRpb24FAAAACGR1cmF0aW9uCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAAEsAAAAAgUAAAAObGF1bmNocGFkSWRTdHIFAAAAC2tleUJ1eVRva2VuBQAAAAhidXlUb2tlbgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkAASwAAAACBQAAAA5sYXVuY2hwYWRJZFN0cgUAAAAUa2V5RnJlZXpTd29wRHVyYXRpb24FAAAAEnN3b3BGcmVlemVEdXJhdGlvbgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkAASwAAAACBQAAAA5sYXVuY2hwYWRJZFN0cgUAAAATa2V5VG90YWxUb2tlbkFtb3VudAUAAAAJcG10QW1vdW50CQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAAEsAAAAAgUAAAAObGF1bmNocGFkSWRTdHIFAAAACmtleUFzc2V0SWQFAAAADXBtdFN0ckFzc2V0SWQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAAEsAAAAAgUAAAAObGF1bmNocGFkSWRTdHIFAAAADGtleUNvbWlzc2lvbgUAAAAKY29tbWlzc2lvbgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkAASwAAAACBQAAAA5sYXVuY2hwYWRJZFN0cgUAAAATa2V5VGlja2V0TGFzdE51bWJlcgAAAAAAAAAAAAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkAASwAAAACBQAAAA5sYXVuY2hwYWRJZFN0cgUAAAAVa2V5SENUaWNrZXRMYXN0TnVtYmVyAAAAAAAAAAAACQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQABLAAAAAIFAAAADmxhdW5jaHBhZElkU3RyBQAAABJrZXlUb2tlbnNQZXJUaWNrZXQFAAAAD3Rva2Vuc1BlclRpY2tldAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkAASwAAAACBQAAAA5sYXVuY2hwYWRJZFN0cgUAAAAQa2V5UHJpY2VQZXJUb2tlbgUAAAANcHJpY2VQZXJUb2tlbgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkAASwAAAACBQAAAA5sYXVuY2hwYWRJZFN0cgUAAAAQa2V5U3dvcFBlclRpY2tldAUAAAANc3dvcFBlclRpY2tldAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkAASwAAAACBQAAAA5sYXVuY2hwYWRJZFN0cgUAAAAWa2V5U3dvcGZpVGlja2V0c0Ftb3VudAUAAAATc3dvcGZpVGlja2V0c0Ftb3VudAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkAASwAAAACBQAAAA5sYXVuY2hwYWRJZFN0cgUAAAAXa2V5Q2FtcGFpZ25Ub2tlbnNBbW91bnQFAAAAFGNhbXBhaWduVG9rZW5zQW1vdW50CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQABLAAAAAIFAAAADmxhdW5jaHBhZElkU3RyBQAAABZrZXlUb2tlbnNQZXJBbGxvY2F0aW9uBQAAABN0b2tlbnNQZXJBbGxvY2F0aW9uCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAAEsAAAAAgUAAAAObGF1bmNocGFkSWRTdHIFAAAADmtleUNsYWltUGFyYW1zCQAEuQAAAAIFAAAAC2NsYWltUGFyYW1zAgAAAAEsCQAETAAAAAIJAQAAAAxCb29sZWFuRW50cnkAAAACCQABLAAAAAIFAAAADmxhdW5jaHBhZElkU3RyBQAAABZrZXlIaWdoQ29tcGV0aXRpb25TYWxlBQAAABNIaWdoQ29tcGV0aXRpb25TYWxlCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQABLAAAAAIFAAAADmxhdW5jaHBhZElkU3RyBQAAABtrZXlIaWdoQ29tcGV0aXRpb25Db21pc3Npb24FAAAAGGhpZ2hDb21wZXRpdGlvbkNvbWlzc2lvbgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkAASwAAAACBQAAAA5sYXVuY2hwYWRJZFN0cgUAAAAYa2V5SGlnaENvbXBldGl0aW9uQW1vdW50BQAAABxoaWdoQ29tcGV0aXRpb25UaWNrZXRzQW1vdW50CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABRrZXlMYXVuY2hwYWRBY3RpdmVJZAUAAAALbGF1bmNocGFkSWQJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAANa2V5SW5pdENhbGxlcgIAAAAABQAAAANuaWwFAAAAFWZyZWV6ZUFkZGl0aW9uYWxFbnRyeQAAAAFpAQAAABBjb21taXRTd29wZmlTYWxlAAAAAgAAAAtsYXVuY2hwYWRJZAAAAAVyZWZJZAQAAAALJHQwOTMwMTkzNzYJAAUUAAAAAggJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAGYW1vdW50CAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAAAAAdhc3NldElkBAAAAAlwbXRBbW91bnQIBQAAAAskdDA5MzAxOTM3NgAAAAJfMQQAAAAKcG10QXNzZXRJZAgFAAAACyR0MDkzMDE5Mzc2AAAAAl8yBAAAAAskdDA5MzgxOTUzMQkBAAAAFmdldEFzc2V0SW5mb0Zyb21TdHJpbmcAAAABCQEAAAAFdmFsdWUAAAABCQAEHQAAAAIFAAAABHRoaXMJAAEsAAAAAgkAAaQAAAABBQAAAAtsYXVuY2hwYWRJZAUAAAALa2V5QnV5VG9rZW4EAAAACmJ1eUFzc2V0SWQIBQAAAAskdDA5MzgxOTUzMQAAAAJfMQQAAAANYnV5QXNzZXRTdHJJZAgFAAAACyR0MDkzODE5NTMxAAAAAl8yBAAAAAxidXlBc3NldE5hbWUIBQAAAAskdDA5MzgxOTUzMQAAAAJfMwQAAAAQYnV5QXNzZXREZWNpbWFscwgFAAAACyR0MDkzODE5NTMxAAAAAl80BAAAAAtzdGFrZWRTd29wcwkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAApnb3Zlcm5hbmNlCQABLAAAAAIJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyBQAAABNrZXlHb3Zlcm5hbmNlU3Rha2VkAAAAAAAAAAAABAAAABdhbGxvd2VkVGlja2V0c0Ftb3VudEFsbAkAAGkAAAACBQAAAAtzdGFrZWRTd29wcwkBAAAAEUBleHRyTmF0aXZlKDEwNTApAAAAAgUAAAAEdGhpcwkAASwAAAACCQABpAAAAAEFAAAAC2xhdW5jaHBhZElkBQAAABBrZXlTd29wUGVyVGlja2V0BAAAABNib3VnaHRUaWNrZXRzQW1vdW50CQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMJAAEsAAAA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VGlja2V0BAAAAA0kdDAxMTQxOTExNTYzCQEAAAAWZ2V0QXNzZXRJbmZvRnJvbVN0cmluZwAAAAEJAQAAABFAZXh0ck5hdGl2ZSgxMDUzKQAAAAIFAAAABHRoaXMJAAEsAAAAAgkAAaQAAAABBQAAAAtsYXVuY2hwYWRJZAUAAAAKa2V5QXNzZXRJZAQAAAAHdG9rZW5JZAgFAAAADSR0MDExNDE5MTE1NjMAAAACXzEEAAAAD3Rva2VuU3RyQXNzZXRJZAgFAAAADSR0MDExNDE5MTE1NjMAAAACXzIEAAAADnRva2VuQXNzZXROYW1lCAUAAAANJHQwMTE0MTkxMTU2MwAAAAJfMwQAAAANdG9rZW5EZWNpbWFscwgFAAAADSR0MDExNDE5MTE1NjMAAAACXzQEAAAAC3RpY2tldFByaWNlCQAAawAAAAMFAAAAD3Rva2Vuc1BlclRpY2tldAUAAAAKdG9rZW5QcmljZQkAAGwAAAAGAAAAAAAAAAAKAAAAAAAAAAAABQAAAA10b2tlbkRlY2ltYWxzAAAAAAAAAAAAAAAAAAAAAAAABQAAAARET1dOBAAAABNjb21taXNzaW9uUGVyVGlja2V0CQAAawAAAAMFAAAAC3RpY2tldFByaWNlCQEAAAARQGV4dHJOYXRpdmUoMTA1MCkAAAACBQAAAAR0aGlzCQABLAAAAAIJAAGkAAAAAQUAAAALbGF1bmNocGFkSWQFAAAADGtleUNvbWlzc2lvbgAAAAAAAAAAZAQAAAAPYnV5VGlja2V0QW1vdW50CQAAaQAAAAIFAAAACXBtdEFtb3VudAkAAGQAAAACBQAAAAt0aWNrZXRQcmljZQUAAAATY29tbWlzc2lvblBlclRpY2tldAQAAAAWYWxsb3dlZEJ1eVRpY2tldEFtb3VudAkAAZcAAAABCQAETAAAAAIFAAAAD2J1eVRpY2tldEFtb3VudAkABEwAAAACBQAAABRhbGxvd2VkVGlja2V0c0Ftb3VudAUAAAADbmlsBAAAABxhbGxvd2VkQnV5UHJpY2VXaXRoQ29taXNzaW9uCQAAaAAAAAIFAAAAFmFsbG93ZWRCdXlUaWNrZXRBbW91bnQJAABkAAAAAgUAAAALdGlja2V0UHJpY2UFAAAAE2NvbW1pc3Npb25QZXJUaWNrZXQEAAAABmNoYW5n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Q29taXNzaW9uBAAAAAxjb21taXNzaW9uSEMJAQAAABFAZXh0ck5hdGl2ZSgxMDUwKQAAAAIFAAAABHRoaXMJAAEsAAAAAgkAAaQAAAABBQAAAAtsYXVuY2hwYWRJZAUAAAAba2V5SGlnaENvbXBldGl0aW9uQ29taXNzaW9uBAAAABJ0cmFuc2ZlcmVkQnV5QXNzZXQJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwkAASwAAAACCQABpAAAAAEFAAAAC2xhdW5jaHBhZElkBQAAABNrZXlUcmFuc2ZlckJ1eUFzc2V0AAAAAAAAAAAABAAAABtzd29wZmlNZW1iZXJzQnV5QXNzZXRBbW91bnQJAQAAABFAZXh0ck5hdGl2ZSgxMDUwKQAAAAIFAAAABHRoaXMJAAEsAAAAAgkAAaQAAAABBQAAAAtsYXVuY2hwYWRJZAUAAAAaa2V5VG90YWxBbW91bnRCdXlBc3NldFNvbGQEAAAAFnN3b3BmaUhDQnV5QXNzZXRBbW91bnQJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAQAAABFAZXh0ck5hdGl2ZSgxMDUwKQAAAAIFAAAABHRoaXMJAAEsAAAAAgkAAaQAAAABBQAAAAtsYXVuY2hwYWRJZAUAAAAca2V5VG90YWxBbW91bnRCdXlBc3NldFNvbGRIQwAAAAAAAAAAAAQAAAAWc3dvcGZpTWVtYmVyc0NvbWlzc2lvbgkAAGsAAAADBQAAABtzd29wZmlNZW1iZXJzQnV5QXNzZXRBbW91bnQFAAAACmNvbW1pc3Npb24AAAAAAAAAAGQEAAAAEXN3b3BmaUhDQ29taXNzaW9uCQAAawAAAAMFAAAAFnN3b3BmaUhDQnV5QXNzZXRBbW91bnQFAAAADGNvbW1pc3Npb25IQwAAAAAAAAAAZAQAAAAedG90YWxBbW91bnRCdXlBc3NldEluTWFya2V0aW5nCQEAAAARQGV4dHJOYXRpdmUoMTA1MCkAAAACBQAAAAR0aGlzCQABLAAAAAIJAAGkAAAAAQUAAAALbGF1bmNocGFkSWQFAAAAJWtleUFtb3VudEJ1eUFzc2V0SW5NYXJrZXRpbmdGaW5hbGl6ZWQEAAAAEm1hcmtldGluZ0NvbWlzc2lvbgkAAGsAAAADBQAAAB50b3RhbEFtb3VudEJ1eUFzc2V0SW5NYXJrZXRpbmcFAAAACmNvbW1pc3Npb24AAAAAAAAAAGQEAAAADXVuc3Rha2VBbW91bnQJAABkAAAAAgkAAGQAAAACCQAAZAAAAAIJAABkAAAAAgkAAGQAAAACBQAAABtzd29wZmlNZW1iZXJzQnV5QXNzZXRBbW91bnQFAAAAHnRvdGFsQW1vdW50QnV5QXNzZXRJbk1hcmtldGluZwUAAAAWc3dvcGZpTWVtYmVyc0NvbWlzc2lvbgUAAAASbWFya2V0aW5nQ29taXNzaW9uBQAAABZzd29wZmlIQ0J1eUFzc2V0QW1vdW50BQAAABFzd29wZmlIQ0NvbWlzc2lvbgMJAABmAAAAAgUAAAASdHJhbnNmZXJlZEJ1eUFzc2V0CQAAZAAAAAIFAAAAG3N3b3BmaU1lbWJlcnNCdXlBc3NldEFtb3VudAUAAAAedG90YWxBbW91bnRCdXlBc3NldEluTWFya2V0aW5nCQAAAgAAAAECAAAAKENhbid0IHRyYW5zZmVyIG5lZ2F0aXZlIHZhbHVlIHRvIHByb2plY3QEAAAAA2ludgMJAAAAAAAAAgUAAAAKYnV5QXNzZXRJZAUAAAAEVVNETgkAA/wAAAAEBQAAABJzdGFraW5nVVNETkFkZHJlc3MCAAAADnVubG9ja05ldXRyaW5vCQAETAAAAAIFAAAADXVuc3Rha2VBbW91bnQJAARMAAAAAgkAAlgAAAABBQAAAARVU0ROBQAAAANuaWwFAAAAA25pbAAAAAAAAAAAAAMJAAAAAAAAAgUAAAADaW52BQAAAANpbnYJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAAEsAAAAAgkAAaQAAAABBQAAAAtsYXVuY2hwYWRJZAUAAAARa2V5RmluYWxpc2VIZWlnaHQFAAAABmhlaWdodAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAAA5wcm9qZWN0QWRkcmVzcwkAAGUAAAACCQAAZAAAAAIFAAAAG3N3b3BmaU1lbWJlcnNCdXlBc3NldEFtb3VudAUAAAAedG90YWxBbW91bnRCdXlBc3NldEluTWFya2V0aW5nBQAAABJ0cmFuc2ZlcmVkQnV5QXNzZXQFAAAACmJ1eUFzc2V0SWQJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAAQY29tbWlzc2lvbldhbGxldAkAAGQAAAACCQAAZAAAAAIFAAAAFnN3b3BmaU1lbWJlcnNDb21pc3Npb24FAAAAEm1hcmtldGluZ0NvbWlzc2lvbgUAAAARc3dvcGZpSENDb21pc3Npb24FAAAACmJ1eUFzc2V0SWQFAAAAA25pbAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAABAAAAAnR4AQAAAAZ2ZXJpZnkAAAAABAAAABNtdWx0aVNpZ25lZEJ5QWRtaW5zBAAAABJhZG1pblB1YktleTFTaWduZWQDCQAB9AAAAAMIBQAAAAJ0eAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAnR4AAAABnByb29mcwAAAAAAAAAAAAUAAAAMYWRtaW5QdWJLZXkxAAAAAAAAAAABAAAAAAAAAAAABAAAABJhZG1pblB1YktleTJTaWduZWQDCQAB9AAAAAMIBQAAAAJ0eAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAnR4AAAABnByb29mcwAAAAAAAAAAAQUAAAAMYWRtaW5QdWJLZXkyAAAAAAAAAAABAAAAAAAAAAAABAAAABJhZG1pblB1YktleTNTaWduZWQDCQAB9AAAAAMIBQAAAAJ0eAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAnR4AAAABnByb29mcwAAAAAAAAAAAgUAAAAMYWRtaW5QdWJLZXkzAAAAAAAAAAABAAAAAAAAAAAACQAAZwAAAAIJAABkAAAAAgkAAGQAAAACBQAAABJhZG1pblB1YktleTFTaWduZWQFAAAAEmFkbWluUHViS2V5MlNpZ25lZAUAAAASYWRtaW5QdWJLZXkzU2lnbmVkAAAAAAAAAAACBAAAAA1zaWduZWRCeUFkbWluAwMDCQAB9AAAAAMIBQAAAAJ0eAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAnR4AAAABnByb29mcwAAAAAAAAAAAAUAAAAMYWRtaW5QdWJLZXkxBgkAAfQAAAADCAUAAAACdHgAAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJ0eAAAAAZwcm9vZnMAAAAAAAAAAAAFAAAADGFkbWluUHViS2V5MgYJAAH0AAAAAwgFAAAAAnR4AAAACWJvZHlCeXRlcwkAAZEAAAACCAUAAAACdHgAAAAGcHJvb2ZzAAAAAAAAAAAABQAAAAxhZG1pblB1YktleTMGCQAB9AAAAAMIBQAAAAJ0eAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAnR4AAAABnByb29mcwAAAAAAAAAAAAUAAAASYWRtaW5QdWJLZXlTdGFraW5nBAAAAAckbWF0Y2gwBQAAAAJ0eAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAPRGF0YVRyYW5zYWN0aW9uBAAAAANkdHgFAAAAByRtYXRjaDADCQEAAAALdmFsdWVPckVsc2UAAAACCQAEGwAAAAIFAAAABm9yYWNsZQUAAAAha2V5TGF1bmNocGFkRGF0YVRyYW5zYWN0aW9uU3RhdHVzBwUAAAANc2lnbmVkQnlBZG1pbgcFAAAAE211bHRpU2lnbmVkQnlBZG1pbnPG2pjt", "height": 1842386, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 89jFK4ceFM8yrwuWoqBy7RN7RxrDKgnMZh2TDtkLgZWK Next: 2uYMdqGBYKBsNjqKHkowWX7VqFuH4SjWV47wfazXsaze Diff:
OldNewDifferences
107107
108108 let keyUserWinnedTicketsAmount = "_tickets_result"
109109
110+let keyUserWinnedHighCompetitionTicketsAmount = "_tickets_result_high_competition"
111+
110112 let keyUserFreezeToken = "_freeze_token_amount"
111113
112114 let oracle = Address(base58'3NBBWfzZtZtszaXbitTKnrB2xXwv26Bn7H9')
154156
155157
156158 func getLaunchpadNextId () = valueOrElse(getInteger(this, keyLaunchpadNextId), 1)
159+
160+
161+func stakedUsdnAmount () = valueOrElse(getInteger(stakingUSDNAddress, ((("rpd_balance_" + toBase58String(USDN)) + "_") + toString(this))), 0)
157162
158163
159164 func getAssetInfoFromString (assetStr) = if ((assetStr == "WAVES"))
490495 }
491496
492497
493-
494-@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 $t02594926099 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
515- let buyAssetId = $t02594926099._1
516- let buyAssetStrId = $t02594926099._2
517- let buyAssetName = $t02594926099._3
518- let buyAssetDecimals = $t02594926099._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 $t02688827032 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
527- let tokenId = $t02688827032._1
528- let tokenStrAssetId = $t02688827032._2
529- let tokenAssetName = $t02688827032._3
530- let tokenDecimals = $t02688827032._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)
627-func transferBuyAsset (launchpadId,amount) = if (!(isActive))
628- then throw("DApp is inactive")
629- else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
630- then throw("Only admin can call this function")
631- else {
632- let projectAddress = addressFromStringValue(getStringValue(this, (toString(launchpadId) + keyAddress)))
633- let $t03342833578 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
634- let buyAssetId = $t03342833578._1
635- let buyAssetStrId = $t03342833578._2
636- let buyAssetName = $t03342833578._3
637- let buyAssetDecimals = $t03342833578._4
638-[IntegerEntry((toString(launchpadId) + keyTransferBuyAsset), amount), ScriptTransfer(projectAddress, amount, buyAssetId)]
639- }
640-
641-
642-
643-@Callable(i)
644-func shutdown () = if (!(isActive))
645- then throw("DApp already inactive")
646- else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
647- then throw("Only admin can call this function")
648- else [BooleanEntry(keyActive, false)]
649-
650-
651-
652-@Callable(i)
653-func activate () = if (isActive)
654- then throw("DApp already active")
655- else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
656- then throw("Only admin can call this function")
657- else [BooleanEntry(keyActive, true)]
658-
659-
660498 @Verifier(tx)
661499 func verify () = {
662500 let multiSignedByAdmins = {
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
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
110+let keyUserWinnedHighCompetitionTicketsAmount = "_tickets_result_high_competition"
111+
110112 let keyUserFreezeToken = "_freeze_token_amount"
111113
112114 let oracle = Address(base58'3NBBWfzZtZtszaXbitTKnrB2xXwv26Bn7H9')
113115
114116 let governance = Address(base58'3N5W8da2iiijVieA6qLGo7KzCJj8B19smWU')
115117
116118 let commissionWallet = Address(base58'3N2hBdeDEs7wCNA9EY8qv3B6drjgKD64xQG')
117119
118120 let stakingUSDNAddress = Address(base58'3N6q7sCGSSLBUXDdjBdYGTJbZGZfhhh8cNg')
119121
120122 let USDN = base58'8UrfDVd5GreeUwm7uPk7eYz1eMv376kzR52C6sANPkwS'
121123
122124 let adminPubKeyStaking = base58'Kn7NpzaG12dLZgcHf2ipUftU6hbJygmrhFqQYE4B7ZK'
123125
124126 let maxAllocationsAmount = 2
125127
126128 let isActive = valueOrElse(getBoolean(this, keyActive), true)
127129
128130 let activeLaunchpadId = valueOrElse(getIntegerValue(this, keyLaunchpadActiveId), -1)
129131
130132 func getAdminPub (keyAdminPub) = match getString(oracle, keyAdminPub) {
131133 case string: String =>
132134 fromBase58String(string)
133135 case nothing =>
134136 throw("Admin public key is empty")
135137 }
136138
137139
138140 let adminPubKey1 = getAdminPub(keyAdminPubKey1)
139141
140142 let adminPubKey2 = getAdminPub(keyAdminPubKey2)
141143
142144 let adminPubKey3 = getAdminPub(keyAdminPubKey3)
143145
144146 func getAssetInfo (assetId) = match assetId {
145147 case id: ByteVector =>
146148 let stringId = toBase58String(id)
147149 let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
148150 $Tuple3(stringId, info.name, info.decimals)
149151 case waves: Unit =>
150152 $Tuple3("WAVES", "WAVES", 8)
151153 case _ =>
152154 throw("Match error")
153155 }
154156
155157
156158 func getLaunchpadNextId () = valueOrElse(getInteger(this, keyLaunchpadNextId), 1)
159+
160+
161+func stakedUsdnAmount () = valueOrElse(getInteger(stakingUSDNAddress, ((("rpd_balance_" + toBase58String(USDN)) + "_") + toString(this))), 0)
157162
158163
159164 func getAssetInfoFromString (assetStr) = if ((assetStr == "WAVES"))
160165 then $Tuple4(unit, "WAVES", "WAVES", 8)
161166 else {
162167 let stringId = assetStr
163168 let id = fromBase58String(assetStr)
164169 let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
165170 $Tuple4(id, stringId, info.name, info.decimals)
166171 }
167172
168173
169174 @Callable(i)
170175 func hashingRandom (launchpadId,hash) = if (!(isActive))
171176 then throw("DApp is inactive at this moment")
172177 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
173178 then throw("Only admin can call this function")
174179 else [StringEntry((toString(launchpadId) + keyVerifyHash), hash)]
175180
176181
177182
178183 @Callable(i)
179184 func initCaller (address) = if (!(isActive))
180185 then throw("DApp is inactive at this moment")
181186 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
182187 then throw("Only admin can call this function")
183188 else [StringEntry(keyInitCaller, address)]
184189
185190
186191
187192 @Callable(i)
188193 func init (projectAddress,startHeight,duration,buyToken,commission,tokensPerTicket,pricePerToken,swopfiTicketsAmount,campaignTokensAmount,tokensPerAllocation,swopPerTicket,swopFreezeDuration,claimParams,HighCompetitionSale,highCompetitionComission,highCompetitionTicketsAmount,freezeAdditionalToken,freezeParams) = if (!(isActive))
189194 then throw("DApp is inactive at this moment")
190195 else if ((toString(i.caller) != valueOrElse(getString(this, keyInitCaller), "")))
191196 then throw("Only project admin can call init function")
192197 else if ((size(i.payments) != 1))
193198 then throw("One attached payment expected")
194199 else if ((height > startHeight))
195200 then throw("Start height must be greater than blockchain height")
196201 else if (if (freezeAdditionalToken)
197202 then (size(freezeParams) != 3)
198203 else false)
199204 then throw("Freeze params list must have 3 items")
200205 else {
201206 let launchpadId = getLaunchpadNextId()
202207 let launchpadIdStr = toString(launchpadId)
203208 let $t065626637 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
204209 let pmtAmount = $t065626637._1
205210 let pmtAssetId = $t065626637._2
206211 let $t066466719 = getAssetInfo(pmtAssetId)
207212 let pmtStrAssetId = $t066466719._1
208213 let pmtAssetName = $t066466719._2
209214 let pmtDecimals = $t066466719._3
210215 let freezeAdditionalEntry = if (freezeAdditionalToken)
211216 then [BooleanEntry((launchpadIdStr + keyFreezeAdditionalToken), true), StringEntry((launchpadIdStr + keyFreezeTokenId), freezeParams[0]), IntegerEntry((launchpadIdStr + keyFreezeTokenDuration), parseIntValue(freezeParams[1])), IntegerEntry((launchpadIdStr + keyFreezeTokenPerTicket), parseIntValue(freezeParams[2]))]
212217 else nil
213218 ([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)
214219 }
215220
216221
217222
218223 @Callable(i)
219224 func commitSwopfiSale (launchpadId,refId) = {
220225 let $t093019376 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
221226 let pmtAmount = $t093019376._1
222227 let pmtAssetId = $t093019376._2
223228 let $t093819531 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
224229 let buyAssetId = $t093819531._1
225230 let buyAssetStrId = $t093819531._2
226231 let buyAssetName = $t093819531._3
227232 let buyAssetDecimals = $t093819531._4
228233 let stakedSwops = valueOrElse(getInteger(governance, (toString(i.caller) + keyGovernanceStaked)), 0)
229234 let allowedTicketsAmountAll = (stakedSwops / getIntegerValue(this, (toString(launchpadId) + keySwopPerTicket)))
230235 let boughtTicketsAmount = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtTicketsAmount)), 0)
231236 let allowedTicketsAmount = (allowedTicketsAmountAll - boughtTicketsAmount)
232237 let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
233238 let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
234239 let freezeAdditionalToken = valueOrElse(getBoolean(this, (toString(launchpadId) + keyFreezeAdditionalToken)), false)
235240 if (!(isActive))
236241 then throw("DApp is inactive at this moment")
237242 else if ((activeLaunchpadId != launchpadId))
238243 then throw("There is no active launchpad or this launchpad is ended")
239244 else if ((startHeight > height))
240245 then throw("Launchpad sale not started yet")
241246 else if ((height > (startHeight + duration)))
242247 then throw("Launchpad sale ended")
243248 else if (if (!(freezeAdditionalToken))
244249 then if ((size(i.payments) != 1))
245250 then true
246251 else (pmtAssetId != buyAssetId)
247252 else false)
248253 then throw((("One attached payment in " + buyAssetName) + " expected"))
249254 else if (if (freezeAdditionalToken)
250255 then if ((size(i.payments) != 2))
251256 then true
252257 else (pmtAssetId != buyAssetId)
253258 else false)
254259 then {
255260 let freezeTokenId = getStringValue(this, (toString(launchpadId) + keyFreezeTokenId))
256261 throw(((("Two attached payments expected: First in " + buyAssetName) + ", second in ") + freezeTokenId))
257262 }
258263 else if (if ((0 >= allowedTicketsAmountAll))
259264 then true
260265 else (0 >= allowedTicketsAmount))
261266 then throw("Not enought SWOP in staking to buy tickets")
262267 else {
263268 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
264269 let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
265270 let $t01141911563 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
266271 let tokenId = $t01141911563._1
267272 let tokenStrAssetId = $t01141911563._2
268273 let tokenAssetName = $t01141911563._3
269274 let tokenDecimals = $t01141911563._4
270275 let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
271276 let commissionPerTicket = fraction(ticketPrice, getIntegerValue(this, (toString(launchpadId) + keyComission)), 100)
272277 let buyTicketAmount = (pmtAmount / (ticketPrice + commissionPerTicket))
273278 let allowedBuyTicketAmount = min([buyTicketAmount, allowedTicketsAmount])
274279 let allowedBuyPriceWithComission = (allowedBuyTicketAmount * (ticketPrice + commissionPerTicket))
275280 let change = (pmtAmount - allowedBuyPriceWithComission)
276281 if ((buyTicketAmount == 0))
277282 then throw((("Not enought " + buyAssetName) + " to buy tickets"))
278283 else if ((change != 0))
279284 then throw((((("Wrong payment. To buy " + toString(allowedBuyTicketAmount)) + "tickets you need to pay ") + toString(allowedBuyPriceWithComission)) + buyAssetName))
280285 else {
281286 let freezeAdditionalEntry = if (freezeAdditionalToken)
282287 then {
283288 let freezeTokenId = getStringValue(this, (toString(launchpadId) + keyFreezeTokenId))
284289 let freezeTokenPerTicket = getIntegerValue(this, (toString(launchpadId) + keyFreezeTokenPerTicket))
285290 let $t01272712814 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
286291 let pmtAmountFreeze = $t01272712814._1
287292 let pmtAssetIdFreeze = $t01272712814._2
288293 let $t01283112922 = getAssetInfo(pmtAssetId)
289294 let pmtFreezeStrAssetId = $t01283112922._1
290295 let pmtFreezeAssetName = $t01283112922._2
291296 let pmtFreezeDecimals = $t01283112922._3
292297 let needFreezeTokens = (freezeTokenPerTicket * buyTicketAmount)
293298 if (if ((pmtFreezeStrAssetId != freezeTokenId))
294299 then true
295300 else (needFreezeTokens != pmtAmountFreeze))
296301 then throw((((("You need to add " + toString(needFreezeTokens)) + " ") + pmtFreezeAssetName) + " as a second payment"))
297302 else [IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserFreezeToken), pmtAmountFreeze)]
298303 }
299304 else nil
300305 let userBoughtTicketsNumbers = valueOrElse(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserTickets)), "")
301306 let lastBoughtTicketNumber = getIntegerValue(this, (toString(launchpadId) + keyTicketLastNumber))
302307 let boughtRange = ((toString((lastBoughtTicketNumber + 1)) + "-") + toString((lastBoughtTicketNumber + allowedBuyTicketAmount)))
303308 let newUserBoughtTicketsNumbers = (userBoughtTicketsNumbers + (if ((userBoughtTicketsNumbers != ""))
304309 then ("," + boughtRange)
305310 else ("" + boughtRange)))
306311 let inv = if ((buyAssetId == USDN))
307312 then invoke(stakingUSDNAddress, "lockNeutrino", nil, [AttachedPayment(pmtAssetId, pmtAmount)])
308313 else 0
309314 if ((inv == inv))
310315 then {
311316 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)
312317 if (!(isDefined(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId)))))
313318 then (baseEntry ++ [StringEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId), refId)])
314319 else baseEntry
315320 }
316321 else throw("Strict value is not equal to itself.")
317322 }
318323 }
319324 }
320325
321326
322327
323328 @Callable(i)
324329 func commitAccessListSale (launchpadId,refId) = {
325330 let $t01496915044 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
326331 let pmtAmount = $t01496915044._1
327332 let pmtAssetId = $t01496915044._2
328333 let $t01504915199 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
329334 let buyAssetId = $t01504915199._1
330335 let buyAssetStrId = $t01504915199._2
331336 let buyAssetName = $t01504915199._3
332337 let buyAssetDecimals = $t01504915199._4
333338 let userUsdnInMarketing = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserAmountBuyAssetInMarketing)), 0)
334339 let usdnInMarketing = valueOrElse(getInteger(this, (toString(launchpadId) + keyAmountBuyAssetInMarketing)), 0)
335340 let boughtAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtAllocations)), 0)
336341 let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
337342 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
338343 let tokensPerAllocation = getIntegerValue(this, (toString(launchpadId) + keyTokensPerAllocation))
339344 let $t01586816012 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
340345 let tokenId = $t01586816012._1
341346 let tokenStrAssetId = $t01586816012._2
342347 let tokenAssetName = $t01586816012._3
343348 let tokenDecimals = $t01586816012._4
344349 let allocationPriceWithComission = fraction(fraction(tokenPrice, tokensPerAllocation, pow(10, 0, tokenDecimals, 0, 0, DOWN)), (100 + commission), 100)
345350 let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
346351 let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
347352 if (!(isActive))
348353 then throw("DApp is inactive at this moment")
349354 else if ((activeLaunchpadId != launchpadId))
350355 then throw("There is no active launchpad or this launchpad is ended")
351356 else if ((startHeight > height))
352357 then throw("Launchpad sale not started yet")
353358 else if ((height > (startHeight + duration)))
354359 then throw("Launchpad sale ended")
355360 else if (if ((size(i.payments) != 1))
356361 then true
357362 else (pmtAssetId != buyAssetId))
358363 then throw((("One attached payment in " + buyAssetName) + " expected"))
359364 else if ((boughtAllocations >= maxAllocationsAmount))
360365 then throw((("You can buy only " + toString(maxAllocationsAmount)) + "allocations"))
361366 else if (if ((allocationPriceWithComission != pmtAmount))
362367 then ((allocationPriceWithComission * 2) != pmtAmount)
363368 else false)
364369 then throw(((("Wrong payment. You can buy 1 or 2 allocations for " + toString(allocationPriceWithComission)) + buyAssetName) + " per allocation"))
365370 else {
366371 let buyAllocationsAmount = (pmtAmount / allocationPriceWithComission)
367372 let inv = if ((buyAssetId == USDN))
368373 then invoke(stakingUSDNAddress, "lockNeutrino", nil, [AttachedPayment(pmtAssetId, pmtAmount)])
369374 else 0
370375 if ((inv == inv))
371376 then {
372377 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))]
373378 if (!(isDefined(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId)))))
374379 then (baseEntry ++ [StringEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId), refId)])
375380 else baseEntry
376381 }
377382 else throw("Strict value is not equal to itself.")
378383 }
379384 }
380385
381386
382387
383388 @Callable(i)
384389 func commitHighCompetitionSale (launchpadId,refId) = {
385390 let $t01832118396 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
386391 let pmtAmount = $t01832118396._1
387392 let pmtAssetId = $t01832118396._2
388393 let $t01840118551 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
389394 let buyAssetId = $t01840118551._1
390395 let buyAssetStrId = $t01840118551._2
391396 let buyAssetName = $t01840118551._3
392397 let buyAssetDecimals = $t01840118551._4
393398 let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
394399 let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
395400 let boughtHCTicketsAmount = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserHCBoughtTicketsAmount)), 0)
396401 let highCompetitionSale = valueOrElse(getBoolean(this, (toString(launchpadId) + keyHighCompetitionSale)), false)
397402 if (!(isActive))
398403 then throw("DApp is inactive at this moment")
399404 else if ((activeLaunchpadId != launchpadId))
400405 then throw("There is no active launchpad or this launchpad is ended")
401406 else if (!(highCompetitionSale))
402407 then throw("There is no high competition sale for this launchpad")
403408 else if ((startHeight > height))
404409 then throw("Launchpad sale not started yet")
405410 else if ((height > (startHeight + duration)))
406411 then throw("Launchpad sale ended")
407412 else if (if ((size(i.payments) != 1))
408413 then true
409414 else (pmtAssetId != buyAssetId))
410415 then throw((("One attached payment in " + buyAssetName) + " expected"))
411416 else {
412417 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
413418 let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
414419 let $t01980019944 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
415420 let tokenId = $t01980019944._1
416421 let tokenStrAssetId = $t01980019944._2
417422 let tokenAssetName = $t01980019944._3
418423 let tokenDecimals = $t01980019944._4
419424 let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
420425 let commissionPerTicket = fraction(ticketPrice, getIntegerValue(this, (toString(launchpadId) + keyHighCompetitionComission)), 100)
421426 let buyTicketAmount = (pmtAmount / (ticketPrice + commissionPerTicket))
422427 let buyPriceWithComission = (buyTicketAmount * (ticketPrice + commissionPerTicket))
423428 let change = (pmtAmount - buyPriceWithComission)
424429 if ((buyTicketAmount == 0))
425430 then throw((("Not enought " + buyAssetName) + " to buy tickets"))
426431 else if ((change != 0))
427432 then throw((((("Wrong payment. To buy " + toString(buyTicketAmount)) + "tickets you need to pay ") + toString(buyPriceWithComission)) + buyAssetName))
428433 else {
429434 let userBoughtTicketsNumbers = valueOrElse(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserHCTickets)), "")
430435 let lastBoughtTicketNumber = getIntegerValue(this, (toString(launchpadId) + keyHCTicketLastNumber))
431436 let boughtRange = ((toString((lastBoughtTicketNumber + 1)) + "-") + toString((lastBoughtTicketNumber + buyTicketAmount)))
432437 let newUserBoughtTicketsNumbers = (userBoughtTicketsNumbers + (if ((userBoughtTicketsNumbers != ""))
433438 then ("," + boughtRange)
434439 else ("" + boughtRange)))
435440 let inv = if ((buyAssetId == USDN))
436441 then invoke(stakingUSDNAddress, "lockNeutrino", nil, [AttachedPayment(pmtAssetId, pmtAmount)])
437442 else 0
438443 if ((inv == inv))
439444 then {
440445 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)]
441446 if (!(isDefined(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId)))))
442447 then (baseEntry ++ [StringEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId), refId)])
443448 else baseEntry
444449 }
445450 else throw("Strict value is not equal to itself.")
446451 }
447452 }
448453 }
449454
450455
451456
452457 @Callable(i)
453458 func finalise (launchpadId,vrfHeight,secretWord) = {
454459 let savedHash = getStringValue(this, (toString(launchpadId) + keyVerifyHash))
455460 let calcHash = toBase58String(sha256((toBytes(vrfHeight) + toBytes(secretWord))))
456461 if (!(isActive))
457462 then throw("DApp is inactive at this moment")
458463 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
459464 then throw("Only admin can call this function")
460465 else if ((calcHash != savedHash))
461466 then throw("vrf Height hash not matching")
462467 else {
463468 let $t02272922879 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
464469 let buyAssetId = $t02272922879._1
465470 let buyAssetStrId = $t02272922879._2
466471 let buyAssetName = $t02272922879._3
467472 let buyAssetDecimals = $t02272922879._4
468473 let projectAddress = addressFromStringValue(getStringValue(this, (toString(launchpadId) + keyAddress)))
469474 let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
470475 let commissionHC = getIntegerValue(this, (toString(launchpadId) + keyHighCompetitionComission))
471476 let transferedBuyAsset = valueOrElse(getInteger(this, (toString(launchpadId) + keyTransferBuyAsset)), 0)
472477 let swopfiMembersBuyAssetAmount = getIntegerValue(this, (toString(launchpadId) + keyTotalAmountBuyAssetSold))
473478 let swopfiHCBuyAssetAmount = valueOrElse(getIntegerValue(this, (toString(launchpadId) + keyTotalAmountBuyAssetSoldHC)), 0)
474479 let swopfiMembersComission = fraction(swopfiMembersBuyAssetAmount, commission, 100)
475480 let swopfiHCComission = fraction(swopfiHCBuyAssetAmount, commissionHC, 100)
476481 let totalAmountBuyAssetInMarketing = getIntegerValue(this, (toString(launchpadId) + keyAmountBuyAssetInMarketingFinalized))
477482 let marketingComission = fraction(totalAmountBuyAssetInMarketing, commission, 100)
478483 let unstakeAmount = (((((swopfiMembersBuyAssetAmount + totalAmountBuyAssetInMarketing) + swopfiMembersComission) + marketingComission) + swopfiHCBuyAssetAmount) + swopfiHCComission)
479484 if ((transferedBuyAsset > (swopfiMembersBuyAssetAmount + totalAmountBuyAssetInMarketing)))
480485 then throw("Can't transfer negative value to project")
481486 else {
482487 let inv = if ((buyAssetId == USDN))
483488 then invoke(stakingUSDNAddress, "unlockNeutrino", [unstakeAmount, toBase58String(USDN)], nil)
484489 else 0
485490 if ((inv == inv))
486491 then [IntegerEntry((toString(launchpadId) + keyFinaliseHeight), height), ScriptTransfer(projectAddress, ((swopfiMembersBuyAssetAmount + totalAmountBuyAssetInMarketing) - transferedBuyAsset), buyAssetId), ScriptTransfer(commissionWallet, ((swopfiMembersComission + marketingComission) + swopfiHCComission), buyAssetId)]
487492 else throw("Strict value is not equal to itself.")
488493 }
489494 }
490495 }
491496
492497
493-
494-@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 $t02594926099 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
515- let buyAssetId = $t02594926099._1
516- let buyAssetStrId = $t02594926099._2
517- let buyAssetName = $t02594926099._3
518- let buyAssetDecimals = $t02594926099._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 $t02688827032 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
527- let tokenId = $t02688827032._1
528- let tokenStrAssetId = $t02688827032._2
529- let tokenAssetName = $t02688827032._3
530- let tokenDecimals = $t02688827032._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)
627-func transferBuyAsset (launchpadId,amount) = if (!(isActive))
628- then throw("DApp is inactive")
629- else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
630- then throw("Only admin can call this function")
631- else {
632- let projectAddress = addressFromStringValue(getStringValue(this, (toString(launchpadId) + keyAddress)))
633- let $t03342833578 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
634- let buyAssetId = $t03342833578._1
635- let buyAssetStrId = $t03342833578._2
636- let buyAssetName = $t03342833578._3
637- let buyAssetDecimals = $t03342833578._4
638-[IntegerEntry((toString(launchpadId) + keyTransferBuyAsset), amount), ScriptTransfer(projectAddress, amount, buyAssetId)]
639- }
640-
641-
642-
643-@Callable(i)
644-func shutdown () = if (!(isActive))
645- then throw("DApp already inactive")
646- else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
647- then throw("Only admin can call this function")
648- else [BooleanEntry(keyActive, false)]
649-
650-
651-
652-@Callable(i)
653-func activate () = if (isActive)
654- then throw("DApp already active")
655- else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
656- then throw("Only admin can call this function")
657- else [BooleanEntry(keyActive, true)]
658-
659-
660498 @Verifier(tx)
661499 func verify () = {
662500 let multiSignedByAdmins = {
663501 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
664502 then 1
665503 else 0
666504 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
667505 then 1
668506 else 0
669507 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
670508 then 1
671509 else 0
672510 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
673511 }
674512 let signedByAdmin = if (if (if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
675513 then true
676514 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey2))
677515 then true
678516 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey3))
679517 then true
680518 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKeyStaking)
681519 match tx {
682520 case dtx: DataTransaction =>
683521 if (valueOrElse(getBoolean(oracle, keyLaunchpadDataTransactionStatus), false))
684522 then signedByAdmin
685523 else false
686524 case _ =>
687525 multiSignedByAdmins
688526 }
689527 }
690528

github/deemru/w8io/873ac7e 
77.79 ms