tx · 4XEPYGKzp61Bg2tSE3vyjJfTARuHMZ9qn2UNjvH16Bp2

3MwkjgDrsm5k73WJU9Nbxbx4y2iy3zjQzMi:  -0.01400000 Waves

2021.10.12 17:37 [1743203] smart account 3MwkjgDrsm5k73WJU9Nbxbx4y2iy3zjQzMi > SELF 0.00000000 Waves

{ "type": 13, "id": "4XEPYGKzp61Bg2tSE3vyjJfTARuHMZ9qn2UNjvH16Bp2", "fee": 1400000, "feeAssetId": null, "timestamp": 1634049530729, "version": 2, "chainId": 84, "sender": "3MwkjgDrsm5k73WJU9Nbxbx4y2iy3zjQzMi", "senderPublicKey": "FRotxVW1MhTQRDvVbMM4yvYGWzBFvHqvMsonvGeEXQUy", "proofs": [ "6SMhFULYYTVWvF1SjupDvvw9ayaVRd2Q6kMZpK7P72LJaeXX4hm2CK9EVaJAssS7wdPcYHAG5E9qZude9e2p5TH", "3QeY2yB1TvtsETF1YTb378gJemXSyAJmX5nagaK1xEV5wmrczhRkr9gCTFBE7rVPwAuCF3a93QG8nHa8M2aJX4zQ" ], "script": "base64:AAIFAAAAAAAAADYIAhIECgIBCBIDCgEIEgsKCQgBAQEBAQEBARIECgIBCBIECgIBCBIFCgMBAQgSAwoBARIAEgAAAAAzAAAAAAlrZXlBY3RpdmUCAAAABmFjdGl2ZQAAAAAPa2V5QWRtaW5QdWJLZXkxAgAAAAthZG1pbl9wdWJfMQAAAAAPa2V5QWRtaW5QdWJLZXkyAgAAAAthZG1pbl9wdWJfMgAAAAAPa2V5QWRtaW5QdWJLZXkzAgAAAAthZG1pbl9wdWJfMwAAAAAha2V5TGF1bmNocGFkRGF0YVRyYW5zYWN0aW9uU3RhdHVzAgAAACFsYXVuY2hwYWRfZGF0YV90cmFuc2FjdGlvbl9zdGF0dXMAAAAAEmtleUxhdW5jaHBhZE5leHRJZAIAAAARbGF1bmNocGFkX25leHRfaWQAAAAAFGtleUxhdW5jaHBhZEFjdGl2ZUlkAgAAABNsYXVuY2hwYWRfYWN0aXZlX2lkAAAAAA1rZXlJbml0Q2FsbGVyAgAAAAtpbml0X2NhbGxlcgAAAAAKa2V5QWRkcmVzcwIAAAAIX2FkZHJlc3MAAAAADWtleUluaXRIZWlnaHQCAAAADF9pbml0X2hlaWdodAAAAAAOa2V5U3RhcnRIZWlnaHQCAAAADV9zdGFydF9oZWlnaHQAAAAAEWtleUZpbmFsaXNlSGVpZ2h0AgAAABBfZmluYWxpc2VfaGVpZ2h0AAAAAAxrZXlDb21pc3Npb24CAAAACl9jb21pc3Npb24AAAAACmtleUFzc2V0SWQCAAAACV9hc3NldF9pZAAAAAATa2V5VG90YWxUb2tlbkFtb3VudAIAAAATX3RvdGFsX3Rva2VuX2Ftb3VudAAAAAAWa2V5VG90YWxBbW91bnRVc2RuU29sZAIAAAAQX3RvdGFsX3VzZG5fc29sZAAAAAASa2V5VG9rZW5zUGVyVGlja2V0AgAAABJfdG9rZW5zX3Blcl90aWNrZXQAAAAAEGtleVByaWNlUGVyVG9rZW4CAAAAEF9wcmljZV9wZXJfdG9rZW4AAAAAEGtleVN3b3BQZXJUaWNrZXQCAAAAEF9zd29wX3Blcl90aWNrZXQAAAAAFmtleVN3b3BmaVRpY2tldHNBbW91bnQCAAAAF190aWNrZXRzX3N3b3BmaV9tZW1iZXJzAAAAABdrZXlDYW1wYWlnblRva2Vuc0Ftb3VudAIAAAATX3Rva2Vuc19hY2Nlc3NfbGlzdAAAAAAWa2V5VG9rZW5zUGVyQWxsb2NhdGlvbgIAAAAWX3Rva2Vuc19wZXJfYWxsb2NhdGlvbgAAAAATa2V5VGlja2V0TGFzdE51bWJlcgIAAAATX3RpY2tldF9sYXN0X251bWJlcgAAAAATa2V5R292ZXJuYW5jZVN0YWtlZAIAAAAMX1NXT1BfYW1vdW50AAAAAAxrZXlVc2VyUmVmSWQCAAAAB19yZWZfaWQAAAAADWtleVZlcmlmeUhhc2gCAAAADF92ZXJpZnlfaGFzaAAAAAALa2V5RHVyYXRpb24CAAAACV9kdXJhdGlvbgAAAAAYa2V5QW1vdW50VVNETkluTWFya2V0aW5nAgAAACJfdG90YWxfcHVyY2hhc2VkX3VzZG5faW5fbWFya2V0aW5nAAAAACFrZXlBbW91bnRVU0ROSW5NYXJrZXRpbmdGaW5hbGl6ZWQCAAAALF90b3RhbF9wdXJjaGFzZWRfdXNkbl9pbl9tYXJrZXRpbmdfZmluYWxpemVkAAAAABprZXlVc2VyQm91Z2h0VGlja2V0c0Ftb3VudAIAAAAPX2JvdWdodF90aWNrZXRzAAAAAA5rZXlVc2VyVGlja2V0cwIAAAAPX3RpY2tldHNfbnVtYmVyAAAAABtrZXlVc2VyQXZhaWxhYmxlQWxsb2NhdGlvbnMCAAAAHV9hdmFpbGFibGVfcHVyY2hhc2VfbWFya2V0aW5nAAAAABxrZXlVc2VyQW1vdW50VVNETkluTWFya2V0aW5nAgAAABxfcHVyY2hhc2VkX3VzZG5faW5fbWFya2V0aW5nAAAAABhrZXlVc2VyQm91Z2h0QWxsb2NhdGlvbnMCAAAAE19ib3VnaHRfYWxsb2NhdGlvbnMAAAAAEmtleVVzZXJDbGFpbVN0YXR1cwIAAAANX2NsYWltX3N0YXR1cwAAAAAaa2V5VXNlcldpbm5lZFRpY2tldHNBbW91bnQCAAAAD190aWNrZXRzX3Jlc3VsdAAAAAAQbGF1Y2hwYWREdXJhdGlvbgAAAAAAAAAFoAAAAAAGb3JhY2xlCQEAAAAHQWRkcmVzcwAAAAEBAAAAGgFU6UWqHpAvOq7xug7mLpqSXxqYhOHzYrMIAAAAAApnb3Zl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dCBhZG1pbiBjYW4gY2FsbCBpbml0IGZ1bmN0aW9uAwkBAAAAAiE9AAAAAgkAAZAAAAABCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAQkAAAIAAAABAgAAAB1PbmUgYXR0YWNoZWQgcGF5bWVudCBleHBlY3RlZAMJAABmAAAAAgUAAAAGaGVpZ2h0BQAAAAtzdGFydEhlaWdodAkAAAIAAAABAgAAADNTdGFydCBoZWlnaHQgbXVzdCBiZSBncmVhdGVyIHRoYW4gYmxvY2tjaGFpbiBoZWlnaHQEAAAACyR0MDQ0NDI0NTE1CQEAAAAMZ2V0QXNzZXRJbmZvAAAAAQUAAAAKcG10QXNzZXRJZAQAAAANcG10U3RyQXNzZXRJZAgFAAAACyR0MDQ0NDI0NTE1AAAAAl8xBAAAAAxwbXRBc3NldE5hbWUIBQAAAAskdDA0NDQyNDUxNQAAAAJfMgQAAAALcG10RGVjaW1hbHMIBQAAAAskdDA0NDQyNDUxNQAAAAJfMwQAAAALbGF1bmNocGFkSWQJAQAAABJnZXRMYXVuY2hwYWROZXh0SWQAAAAABAAAAA5sYXVuY2hwYWRJZFN0cgkAAaQAAAABBQAAAAtsYXVuY2hwYWRJZAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkAASwAAAACBQAAAA1wbXRTdHJBc3NldElkAgAAAApfbGF1bmNocGFkBQAAAAtsYXVuY2hwYWRJZAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAASa2V5TGF1bmNocGFkTmV4dElkCQAAZAAAAAIFAAAAC2xhdW5jaHBhZElkAAAAAAAAAAABCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAAEsAAAAAgUAAAAObGF1bmNocGFkSWRTdHIFAAAACmtleUFkZHJlc3MFAAAADnByb2plY3RBZGRyZXNzCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQABLAAAAAIFAAAADmxhdW5jaHBhZElkU3RyBQAAAA1rZXlJbml0SGVpZ2h0BQAAAAZoZWlnaHQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAAEsAAAAAgUAAAAObGF1bmNocGFkSWRTdHIFAAAADmtleVN0YXJ0SGVpZ2h0BQAAAAtzdGFydEhlaWdodAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkAASwAAAACBQAAAA5sYXVuY2hwYWRJZFN0cgUAAAALa2V5RHVyYXRpb24FAAAAEGxhdWNocGFkRHVyYXRpb24JAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAAEsAAAAAgUAAAAObGF1bmNocGFkSWRTdHIFAAAAE2tleVRvdGFsVG9rZW5BbW91bnQFAAAACXBtdEFtb3VudAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQABLAAAAAIFAAAADmxhdW5jaHBhZElkU3RyBQAAAAprZXlBc3NldElkBQAAAA1wbXRTdHJBc3NldElkCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQABLAAAAAIFAAAADmxhdW5jaHBhZElkU3RyBQAAAAxrZXlDb21pc3Npb24FAAAACmNvbW1pc3Npb24JAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAAEsAAAAAgUAAAAObGF1bmNocGFkSWRTdHIFAAAAE2tleVRpY2tldExhc3ROdW1iZXIAAAAAAAAAAAAJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAAEsAAAAAgUAAAAObGF1bmNocGFkSWRTdHIFAAAAEmtleVRva2Vuc1BlclRpY2tldAUAAAAPdG9rZW5zUGVyVGlja2V0CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQABLAAAAAIFAAAADmxhdW5jaHBhZElkU3RyBQAAABBrZXlQcmljZVBlclRva2VuBQAAAA1wcmljZVBlclRva2VuCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQABLAAAAAIFAAAADmxhdW5jaHBhZElkU3RyBQAAABBrZXlTd29wUGVyVGlja2V0BQAAAA1zd29wUGVyVGlja2V0CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQABLAAAAAIFAAAADmxhdW5jaHBhZElkU3RyBQAAABZrZXlTd29wZmlUaWNrZXRzQW1vdW50BQAAABNzd29wZmlUaWNrZXRzQW1vdW50CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQABLAAAAAIFAAAADmxhdW5jaHBhZElkU3RyBQAAABdrZXlDYW1wYWlnblRva2Vuc0Ftb3VudAUAAAAUY2FtcGFpZ25Ub2tlbnNBbW91bnQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAAEsAAAAAgUAAAAObGF1bmNocGFkSWRTdHIFAAAAFmtleVRva2Vuc1BlckFsbG9jYXRpb24FAAAAE3Rva2Vuc1BlckFsbG9jYXRpb24JAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAFGtleUxhdW5jaHBhZEFjdGl2ZUlkBQAAAAtsYXVuY2hwYWRJZAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACBQAAAA1rZXlJbml0Q2FsbGVyAgAAAAAFAAAAA25pbAAAAAFpAQAAABBjb21taXRTd29wZmlTYWxlAAAAAgAAAAtsYXVuY2hwYWRJZAAAAAVyZWZJZAQAAAALJHQwNjAwOTYwODQJAAUUAAAAAggJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAGYW1vdW50CAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAAAAAdhc3NldElkBAAAAAlwbXRBbW91bnQIBQAAAAskdDA2MDA5NjA4NAAAAAJfMQQAAAAKcG10QXNzZXRJZAgFAAAACyR0MDYwMDk2MDg0AAAAAl8yBAAAAAtzdGFrZWRTd29wcwkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAApnb3Zlcm5hbmNlCQABLAAAAAIJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyBQAAABNrZXlHb3Zlcm5hbmNlU3Rha2VkAAAAAAAAAAAABAAAABdhbGxvd2VkVGlja2V0c0Ftb3VudEFsbAkAAGkAAAACBQAAAAtzdGFrZWRTd29wcwkBAAAAEUBleHRyTmF0aXZlKDEwNTApAAAAAgUAAAAEdGhpcwkAASwAAAACCQABpAAAAAEFAAAAC2xhdW5jaHBhZElkBQAAABBrZXlTd29wUGVyVGlja2V0BAAAABNib3VnaHRUaWNrZXRzQW1vdW50CQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyAgAAAAFfCQABpAAAAAEFAAAAC2xhdW5jaHBhZElkBQAAABprZXlVc2VyQm91Z2h0VGlja2V0c0Ftb3VudAAAAAAAAAAAAAQAAAAUYWxsb3dlZFRpY2tldHNBbW91bnQJAABlAAAAAgUAAAAXYWxsb3dlZFRpY2tldHNBbW91bnRBbGwFAAAAE2JvdWdodFRpY2tldHNBbW91bnQEAAAAC3N0YXJ0SGVpZ2h0CQEAAAAFdmFsdWUAAAABCQAEGgAAAAIFAAAABHRoaXMJAAEsAAAAAgkAAaQAAAABBQAAAAtsYXVuY2hwYWRJZAUAAAAOa2V5U3RhcnRIZWlnaHQEAAAACGR1cmF0aW9uCQEAAAAFdmFsdWUAAAABCQAEGgAAAAIFAAAABHRoaXMJAAEsAAAAAgkAAaQAAAABBQAAAAtsYXVuY2hwYWRJZAUAAAALa2V5RHVyYXRpb24DCQEAAAABIQAAAAEFAAAACGlzQWN0aXZlCQAAAgAAAAECAAAAH0RBcHAgaXMgaW5hY3RpdmUgYXQgdGhpcyBtb21lbnQDCQEAAAACIT0AAAACBQAAABFhY3RpdmVMYXVuY2hwYWRJZAUAAAALbGF1bmNocGFkSWQJAAACAAAAAQIAAAA3VGhlcmUgaXMgbm8gYWN0aXZlIGxhdW5jaHBhZCBvciB0aGlzIGxhdW5jaHBhZCBpcyBlbmRlZAMJAABmAAAAAgUAAAAGaGVpZ2h0BQAAAAtzdGFydEhlaWdodAkAAAIAAAABAgAAAB5MYXVuY2hwYWQgc2FsZSBub3Qgc3RhcnRlZCB5ZXQDCQAAZgAAAAIJAABkAAAAAgUAAAALc3RhcnRIZWlnaHQFAAAACGR1cmF0aW9uBQAAAAZoZWlnaHQJAAACAAAAAQIAAAAUTGF1bmNocGFkIHNhbGUgZW5kZWQDAwkBAAAAAiE9AAAAAgkAAZAAAAABCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAQYJAQAAAAIhPQAAAAIFAAAACnBtdEFzc2V0SWQFAAAABFVTRE4JAAACAAAAAQIAAAAlT25lIGF0dGFjaGVkIHBheW1lbnQgaW4gVVNETiBleHBlY3RlZAMDCQAAZwAAAAIAAAAAAAAAAAAFAAAAF2FsbG93ZWRUaWNrZXRzQW1vdW50QWxsBgkAAGcAAAACAAAAAAAAAAAABQAAABRhbGxvd2VkVGlja2V0c0Ftb3VudAkAAAIAAAABAgAAACpOb3QgZW5vdWdodCBTV09QIGluIHN0YWtpbmcgdG8gYnV5IHRpY2tldHMEAAAACnRva2VuUHJpY2UJAQAAABFAZXh0ck5hdGl2ZSgxMDUwKQAAAAIFAAAABHRoaXMJAAEsAAAAAgkAAaQAAAABBQAAAAtsYXVuY2hwYWRJZAUAAAAQa2V5UHJpY2VQZXJUb2tlbgQAAAAPdG9rZW5zUGVyVGlja2V0CQEAAAARQGV4dHJOYXRpdmUoMTA1MCkAAAACBQAAAAR0aGlzCQABLAAAAAIJAAGkAAAAAQUAAAALbGF1bmNocGFkSWQFAAAAEmtleVRva2Vuc1BlclRpY2tldAQAAAALdGlja2V0UHJpY2UJAABoAAAAAgUAAAAPdG9rZW5zUGVyVGlja2V0BQAAAAp0b2tlblByaWNlBAAAABNjb21taXNzaW9uUGVyVGlja2V0CQAAawAAAAMFAAAAC3RpY2tldFByaWNlCQEAAAARQGV4dHJOYXRpdmUoMTA1MCkAAAACBQAAAAR0aGlzCQABLAAAAAIJAAGkAAAAAQUAAAALbGF1bmNocGFkSWQFAAAADGtleUNvbWlzc2lvbgAAAAAAAAAAZAQAAAAPYnV5VGlja2V0QW1vdW50CQAAaQAAAAIFAAAACXBtdEFtb3VudAkAAGQAAAACBQAAAAt0aWNrZXRQcmljZQUAAAATY29tbWlzc2lvblBlclRpY2tldAQAAAAWYWxsb3dlZEJ1eVRpY2tldEFtb3VudAkAAZcAAAABCQAETAAAAAIFAAAAD2J1eVRpY2tldEFtb3VudAkABEwAAAACBQAAABRhbGxvd2VkVGlja2V0c0Ftb3VudAUAAAADbmlsBAAAABxhbGxvd2VkQnV5UHJpY2VXaXRoQ29taXNzaW9uCQAAaAAAAAIFAAAAFmFsbG93ZWRCdXlUaWNrZXRBbW91bnQJAABkAAAAAgUAAAALdGlja2V0UHJpY2UFAAAAE2NvbW1pc3Npb25QZXJUaWNrZXQEAAAABmNoYW5nZQkAAGUAAAACBQAAAAlwbXRBbW91bnQF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ZXlUb3RhbEFtb3VudFVzZG5Tb2xkBAAAABZzd29wZmlNZW1iZXJzQ29taXNzaW9uCQAAawAAAAMFAAAAF3N3b3BmaU1lbWJlcnNVc2RuQW1vdW50BQAAAApjb21taXNzaW9uAAAAAAAAAABkBAAAABp0b3RhbEFtb3VudFVzZG5Jbk1hcmtldGluZwkBAAAAEUBleHRyTmF0aXZlKDEwNTApAAAAAgUAAAAEdGhpcwkAASwAAAACCQABpAAAAAEFAAAAC2xhdW5jaHBhZElkBQAAACFrZXlBbW91bnRVU0ROSW5NYXJrZXRpbmdGaW5hbGl6ZWQEAAAAEm1hcmtldGluZ0NvbWlzc2lvbgkAAGsAAAADBQAAABp0b3RhbEFtb3VudFVzZG5Jbk1hcmtldGluZwUAAAAKY29tbWlzc2lvbgAAAAAAAAAAZAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkAASwAAAACCQABpAAAAAEFAAAAC2xhdW5jaHBhZElkBQAAABFrZXlGaW5hbGlzZUhlaWdodAUAAAAGaGVpZ2h0CQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMFAAAADnByb2plY3RBZGRyZXNzCQAAZAAAAAIFAAAAF3N3b3BmaU1lbWJlcnNVc2RuQW1vdW50BQAAABp0b3RhbEFtb3VudFVzZG5Jbk1hcmtldGluZwUAAAAEVVNETgkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAABBjb21taXNzaW9uV2FsbGV0CQAAZAAAAAIFAAAAFnN3b3BmaU1lbWJlcnNDb21pc3Npb24FAAAAEm1hcmtldGluZ0NvbWlzc2lvbgUAAAAEVVNETgUAAAADbmlsAAAAAWkBAAAABWNsYWltAAAAAQAAAAtsYXVuY2hwYWRJZAQAAAAPdXNlckNsYWltU3RhdHVzCQEAAAARQGV4dHJOYXRpdmUoMTA1MSkAAAACBQAAAAR0aGlzCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgIAAAABXwkAAaQAAAABBQAAAAtsYXVuY2hwYWRJZAUAAAASa2V5VXNlckNsYWltU3RhdHVzBAAAAA1ib3VnaHRUaWNrZXRzCQEAAAALdmFs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b2NhdGlvbgQAAAAUdHJhbnNmZXJUb2tlbnNBbW91bnQJAABkAAAAAgkAAGgAAAACBQAAAA13b25uZWRUaWNrZXRzBQAAAA90b2tlbnNQZXJUaWNrZXQJAABoAAAAAgUAAAASYWxsb3dlZEFsbG9jYXRpb25zBQAAABN0b2tlbnNQZXJBbGxvY2F0aW9uBAAAABJ1c2RuRm9yQWxsb2NhdGlvbnMJAABrAAAAAwkAAGUAAAACBQAAABFib3VnaHRBbGxvY2F0aW9ucwUAAAASYWxsb3dlZEFsbG9jYXRpb25zCQAAZAAAAAIAAAAAAAAAAGQFAAAACmNvbW1pc3Npb24AAAAAAAAAAGQEAAAAFnVzZG5Gb3JVbndvbm5lZFRpY2tldHMJAABrAAAAAwkAAGgAAAACCQAAZQAAAAIFAAAADWJvdWdodFRpY2tldHMFAAAADXdvbm5lZFRpY2tldHMFAAAAC3RpY2tldFByaWNlCQAAZAAAAAIAAAAAAAAAAGQFAAAACmNvbW1pc3Npb24AAAAAAAAAAGQDAwkAAGYAAAACAAAAAAAAAAAABQAAABJ1c2RuRm9yQWxsb2NhdGlvbnMGCQAAZgAAAAIAAAAAAAAAAAAFAAAAFnVzZG5Gb3JVbndvbm5lZFRpY2tldHMJAAACAAAAAQIAAABTRXJyb3Igd2l0aCBhbGxvd2VkIGFsbG9jYXRpb24gcGFyYW0gb3Igd29ubmVkIHRpY2tldHMgcGFyYW0mIE9sZWFzZSBjb250YWN0IHN1cHBvcnQEAAAAEnJldHVybmVkVXNkbkFtb3VudAkAAGQAAAACBQAAABJ1c2RuRm9yQWxsb2NhdGlvbnMFAAAAFnVzZG5Gb3JVbndvbm5lZFRpY2tldHMEAAAADHRyYW5zZmVyVXNkbgMJAABmAAAAAgUAAAAScmV0dXJuZWRVc2RuQW1vdW50AAAAAAAAAAAACQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAScmV0dXJuZWRVc2RuQW1vdW50BQAAAARVU0ROBQAAAANuaWwFAAAAA25pbAQAAAAOdHJhbnNmZXJUb2tlbnMDCQAAZgAAAAIFAAAAFHRyYW5zZmVyVG9rZW5zQW1vdW50AAAAAAAAAAAACQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAUdHJhbnNmZXJUb2tlbnNBbW91bnQFAAAAB3Rva2VuSWQFAAAAA25pbAUAAAADbmlsCQAETgAAAAIJAAROAAAAAgkABEwAAAACCQEAAAAMQm9vbGVhbkVudHJ5AAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkABCUAAAABCAUAAAABaQAAAAZjYWxsZXICAAAAAV8JAAGkAAAAAQUAAAALbGF1bmNocGFkSWQFAAAAEmtleVVzZXJDbGFpbVN0YXR1cwYFAAAAA25pbAUAAAAOdHJhbnNmZXJUb2tlbnMFAAAADHRyYW5zZmVyVXNkbgAAAAFpAQAAAAhzaHV0ZG93bgAAAAADCQEAAAABIQAAAAEFAAAACGlzQWN0aXZlCQAAAgAAAAECAAAAFERBcHAgYWxyZWR5IGluYWN0aXZlAwkBAAAAASEAAAABCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgkABEwAAAACBQAAAAxhZG1pblB1YktleTEJAARMAAAAAgUAAAAMYWRtaW5QdWJLZXkyCQAETAAAAAIFAAAADGFkbWluUHViS2V5MwUAAAADbmlsCAUAAAABaQAAAA9jYWxsZXJQdWJsaWNLZXkJAAACAAAAAQIAAAAhT25seSBhZG1pbiBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uCQAETAAAAAIJAQAAAAxCb29sZWFuRW50cnkAAAACBQAAAAlrZXlBY3RpdmUHBQAAAANuaWwAAAABaQEAAAAIYWN0aXZhdGUAAAAAAwUAAAAIaXNBY3RpdmUJAAACAAAAAQIAAAASREFwcCBhbHJlZHkgYWN0aXZlAwkBAAAAASEAAAABCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgkABEwAAAACBQAAAAxhZG1pblB1YktleTEJAARMAAAAAgUAAAAMYWRtaW5QdWJLZXkyCQAETAAAAAIFAAAADGFkbWluUHViS2V5MwUAAAADbmlsCAUAAAABaQAAAA9jYWxsZXJQdWJsaWNLZXkJAAACAAAAAQIAAAAhT25seSBhZG1pbiBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uCQAETAAAAAIJAQAAAAxCb29sZWFuRW50cnkAAAACBQAAAAlrZXlBY3RpdmUGBQAAAANuaWwAAAABAAAAAnR4AQAAAAZ2ZXJpZnkAAAAABAAAABNtdWx0aVNpZ25lZEJ5QWRtaW5zBAAAABJhZG1pblB1YktleTFTaWduZWQDCQAB9AAAAAMIBQAAAAJ0eAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAnR4AAAABnByb29mcwAAAAAAAAAAAAUAAAAMYWRtaW5QdWJLZXkxAAAAAAAAAAABAAAAAAAAAAAABAAAABJhZG1pblB1YktleTJTaWduZWQDCQAB9AAAAAMIBQAAAAJ0eAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAnR4AAAABnByb29mcwAAAAAAAAAAAQUAAAAMYWRtaW5QdWJLZXkyAAAAAAAAAAABAAAAAAAAAAAABAAAABJhZG1pblB1YktleTNTaWduZWQDCQAB9AAAAAMIBQAAAAJ0eAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAnR4AAAABnByb29mcwAAAAAAAAAAAgUAAAAMYWRtaW5QdWJLZXkzAAAAAAAAAAABAAAAAAAAAAAACQAAZwAAAAIJAABkAAAAAgkAAGQAAAACBQAAABJhZG1pblB1YktleTFTaWduZWQFAAAAEmFkbWluUHViS2V5MlNpZ25lZAUAAAASYWRtaW5QdWJLZXkzU2lnbmVkAAAAAAAAAAACBAAAAA1zaWduZWRCeUFkbWluAwMDCQAB9AAAAAMIBQAAAAJ0eAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAnR4AAAABnByb29mcwAAAAAAAAAAAAUAAAAMYWRtaW5QdWJLZXkxBgkAAfQAAAADCAUAAAACdHgAAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJ0eAAAAAZwcm9vZnMAAAAAAAAAAAAFAAAADGFkbWluUHViS2V5MgYJAAH0AAAAAwgFAAAAAnR4AAAACWJvZHlCeXRlcwkAAZEAAAACCAUAAAACdHgAAAAGcHJvb2ZzAAAAAAAAAAAABQAAAAxhZG1pblB1YktleTMGCQAB9AAAAAMIBQAAAAJ0eAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAnR4AAAABnByb29mcwAAAAAAAAAAAAUAAAASYWRtaW5QdWJLZXlTdGFraW5nBAAAAAckbWF0Y2gwBQAAAAJ0eAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAPRGF0YVRyYW5zYWN0aW9uBAAAAANkdHgFAAAAByRtYXRjaDADCQEAAAALdmFsdWVPckVsc2UAAAACCQAEGwAAAAIFAAAABm9yYWNsZQUAAAAha2V5TGF1bmNocGFkRGF0YVRyYW5zYWN0aW9uU3RhdHVzBwUAAAANc2lnbmVkQnlBZG1pbgcFAAAAE211bHRpU2lnbmVkQnlBZG1pbnNWZ3aE", "height": 1743203, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: DP3HA7H5KjQNinz7aYkrBuV7F2HmjkFUMova5YREJAHw Next: B6gnzhRMey1XUqob9c8fp4A3md5XncT4myvRWy4z4z1Q Diff:
OldNewDifferences
1919
2020 let keyAddress = "_address"
2121
22+let keyInitHeight = "_init_height"
23+
2224 let keyStartHeight = "_start_height"
2325
24-let keyStatus = "_status"
26+let keyFinaliseHeight = "_finalise_height"
2527
2628 let keyComission = "_comission"
2729
5355
5456 let keyDuration = "_duration"
5557
56-let keyFinalise = "_finalse"
57-
5858 let keyAmountUSDNInMarketing = "_total_purchased_usdn_in_marketing"
5959
6060 let keyAmountUSDNInMarketingFinalized = "_total_purchased_usdn_in_marketing_finalized"
7171
7272 let keyUserClaimStatus = "_claim_status"
7373
74-let keyUserWinnedTiketsAmount = "_tickets_result"
74+let keyUserWinnedTicketsAmount = "_tickets_result"
7575
7676 let lauchpadDuration = 1440
7777
140140
141141 @Callable(i)
142142 func init (projectAddress,startHeight,commission,tokensPerTicket,pricePerToken,swopfiTicketsAmount,campaignTokensAmount,tokensPerAllocation,swopPerTicket) = {
143- let $t039113986 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
144- let pmtAmount = $t039113986._1
145- let pmtAssetId = $t039113986._2
143+ let $t039394014 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
144+ let pmtAmount = $t039394014._1
145+ let pmtAssetId = $t039394014._2
146146 if (!(isActive))
147147 then throw("DApp is inactive at this moment")
148- else if ((valueOrElse(getString(keyInitCaller), "") == toString(i.caller)))
148+ else if ((valueOrElse(getString(this, keyInitCaller), "") == toString(i.caller)))
149149 then throw("Only project admin can call init function")
150150 else if ((size(i.payments) != 1))
151151 then throw("One attached payment expected")
152152 else if ((height > startHeight))
153153 then throw("Start height must be greater than blockchain height")
154154 else {
155- let $t044094482 = getAssetInfo(pmtAssetId)
156- let pmtStrAssetId = $t044094482._1
157- let pmtAssetName = $t044094482._2
158- let pmtDecimals = $t044094482._3
155+ let $t044424515 = getAssetInfo(pmtAssetId)
156+ let pmtStrAssetId = $t044424515._1
157+ let pmtAssetName = $t044424515._2
158+ let pmtDecimals = $t044424515._3
159159 let launchpadId = getLaunchpadNextId()
160160 let launchpadIdStr = toString(launchpadId)
161-[IntegerEntry((pmtStrAssetId + "_launchpad"), launchpadId), IntegerEntry(keyLaunchpadNextId, (launchpadId + 1)), StringEntry((launchpadIdStr + keyAddress), projectAddress), IntegerEntry((launchpadIdStr + keyStartHeight), startHeight), IntegerEntry((launchpadIdStr + keyDuration), lauchpadDuration), IntegerEntry((launchpadIdStr + keyTotalTokenAmount), pmtAmount), StringEntry((launchpadIdStr + keyStatus), "active"), StringEntry((launchpadIdStr + keyAssetId), pmtStrAssetId), IntegerEntry((launchpadIdStr + keyComission), commission), IntegerEntry((launchpadIdStr + keyTicketLastNumber), 0), IntegerEntry((launchpadIdStr + keyTokensPerTicket), tokensPerTicket), IntegerEntry((launchpadIdStr + keyPricePerToken), pricePerToken), IntegerEntry((launchpadIdStr + keySwopPerTicket), swopPerTicket), IntegerEntry((launchpadIdStr + keySwopfiTicketsAmount), swopfiTicketsAmount), IntegerEntry((launchpadIdStr + keyCampaignTokensAmount), campaignTokensAmount), IntegerEntry((launchpadIdStr + keyTokensPerAllocation), tokensPerAllocation), IntegerEntry(keyLaunchpadActiveId, launchpadId), StringEntry(keyInitCaller, "")]
161+[IntegerEntry((pmtStrAssetId + "_launchpad"), launchpadId), IntegerEntry(keyLaunchpadNextId, (launchpadId + 1)), StringEntry((launchpadIdStr + keyAddress), projectAddress), IntegerEntry((launchpadIdStr + keyInitHeight), height), IntegerEntry((launchpadIdStr + keyStartHeight), startHeight), IntegerEntry((launchpadIdStr + keyDuration), lauchpadDuration), IntegerEntry((launchpadIdStr + keyTotalTokenAmount), pmtAmount), StringEntry((launchpadIdStr + keyAssetId), pmtStrAssetId), IntegerEntry((launchpadIdStr + keyComission), commission), IntegerEntry((launchpadIdStr + keyTicketLastNumber), 0), IntegerEntry((launchpadIdStr + keyTokensPerTicket), tokensPerTicket), IntegerEntry((launchpadIdStr + keyPricePerToken), pricePerToken), IntegerEntry((launchpadIdStr + keySwopPerTicket), swopPerTicket), IntegerEntry((launchpadIdStr + keySwopfiTicketsAmount), swopfiTicketsAmount), IntegerEntry((launchpadIdStr + keyCampaignTokensAmount), campaignTokensAmount), IntegerEntry((launchpadIdStr + keyTokensPerAllocation), tokensPerAllocation), IntegerEntry(keyLaunchpadActiveId, launchpadId), StringEntry(keyInitCaller, "")]
162162 }
163163 }
164164
166166
167167 @Callable(i)
168168 func commitSwopfiSale (launchpadId,refId) = {
169- let $t059736048 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
170- let pmtAmount = $t059736048._1
171- let pmtAssetId = $t059736048._2
169+ let $t060096084 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
170+ let pmtAmount = $t060096084._1
171+ let pmtAssetId = $t060096084._2
172172 let stakedSwops = valueOrElse(getInteger(governance, (toString(i.caller) + keyGovernanceStaked)), 0)
173173 let allowedTicketsAmountAll = (stakedSwops / getIntegerValue(this, (toString(launchpadId) + keySwopPerTicket)))
174- let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
175- let commissionInUSDN = fraction(pmtAmount, commission, 100)
176174 let boughtTicketsAmount = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtTicketsAmount)), 0)
177175 let allowedTicketsAmount = (allowedTicketsAmountAll - boughtTicketsAmount)
176+ let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
177+ let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
178178 if (!(isActive))
179179 then throw("DApp is inactive at this moment")
180180 else if ((activeLaunchpadId != launchpadId))
181181 then throw("There is no active launchpad or this launchpad is ended")
182- else if (if ((size(i.payments) != 1))
183- then true
184- else (pmtAssetId != USDN))
185- then throw("One attached payment in USDN expected")
186- else if (if ((0 >= allowedTicketsAmountAll))
187- then true
188- else (0 >= allowedTicketsAmount))
189- then throw("Not enought SWOP in staking to buy tickets")
190- else {
191- let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
192- let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
193- let ticketPrice = (tokensPerTicket * tokenPrice)
194- let buyTicketAmount = ((pmtAmount - commissionInUSDN) / ticketPrice)
195- let allowedBuyTicketAmount = min([buyTicketAmount, allowedTicketsAmount])
196- let allowedBuyPrice = (allowedBuyTicketAmount * ticketPrice)
197- let allowedBuyPriceWithComission = (allowedBuyPrice + fraction(allowedBuyPrice, commission, 100))
198- let change = (pmtAmount - allowedBuyPriceWithComission)
199- let userBoughtTicketsNumbers = valueOrElse(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserTickets)), "")
200- let lastBoughtTickerNumber = getIntegerValue(this, (toString(launchpadId) + keyTicketLastNumber))
201- let boughtRange = ((toString((lastBoughtTickerNumber + 1)) + "-") + toString((lastBoughtTickerNumber + allowedBuyTicketAmount)))
202- let newUserBoughtTicketsNumbers = (userBoughtTicketsNumbers + (if ((userBoughtTicketsNumbers != ""))
203- then ","
204- else ("" + boughtRange)))
205- let baseEntry = [StringEntry(((toString(i.caller) + toString(launchpadId)) + keyUserRefId), refId), IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtTicketsAmount), (boughtTicketsAmount + allowedBuyTicketAmount)), IntegerEntry((toString(launchpadId) + keyTicketLastNumber), (lastBoughtTickerNumber + allowedBuyTicketAmount)), StringEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserTickets), newUserBoughtTicketsNumbers)]
206- if ((change > 0))
207- then (baseEntry ++ [ScriptTransfer(i.caller, change, pmtAssetId)])
208- else baseEntry
209- }
182+ else if ((height > startHeight))
183+ then throw("Launchpad sale not started yet")
184+ else if (((startHeight + duration) > height))
185+ then throw("Launchpad sale ended")
186+ else if (if ((size(i.payments) != 1))
187+ then true
188+ else (pmtAssetId != USDN))
189+ then throw("One attached payment in USDN expected")
190+ else if (if ((0 >= allowedTicketsAmountAll))
191+ then true
192+ else (0 >= allowedTicketsAmount))
193+ then throw("Not enought SWOP in staking to buy tickets")
194+ else {
195+ let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
196+ let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
197+ let ticketPrice = (tokensPerTicket * tokenPrice)
198+ let commissionPerTicket = fraction(ticketPrice, getIntegerValue(this, (toString(launchpadId) + keyComission)), 100)
199+ let buyTicketAmount = (pmtAmount / (ticketPrice + commissionPerTicket))
200+ let allowedBuyTicketAmount = min([buyTicketAmount, allowedTicketsAmount])
201+ let allowedBuyPriceWithComission = (allowedBuyTicketAmount * (ticketPrice + commissionPerTicket))
202+ let change = (pmtAmount - allowedBuyPriceWithComission)
203+ let userBoughtTicketsNumbers = valueOrElse(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserTickets)), "")
204+ let lastBoughtTicketNumber = getIntegerValue(this, (toString(launchpadId) + keyTicketLastNumber))
205+ let boughtRange = ((toString((lastBoughtTicketNumber + 1)) + "-") + toString((lastBoughtTicketNumber + allowedBuyTicketAmount)))
206+ let newUserBoughtTicketsNumbers = (userBoughtTicketsNumbers + (if ((userBoughtTicketsNumbers != ""))
207+ then ","
208+ else ("" + boughtRange)))
209+ let baseEntry = [StringEntry(((toString(i.caller) + toString(launchpadId)) + keyUserRefId), refId), IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtTicketsAmount), (boughtTicketsAmount + allowedBuyTicketAmount)), IntegerEntry((toString(launchpadId) + keyTicketLastNumber), (lastBoughtTicketNumber + allowedBuyTicketAmount)), StringEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserTickets), newUserBoughtTicketsNumbers)]
210+ if ((change > 0))
211+ then (baseEntry ++ [ScriptTransfer(i.caller, change, pmtAssetId)])
212+ else baseEntry
213+ }
210214 }
211215
212216
213217
214218 @Callable(i)
215219 func commitAccessListSale (launchpadId,refId) = {
216- let $t089779052 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
217- let pmtAmount = $t089779052._1
218- let pmtAssetId = $t089779052._2
220+ let $t092709345 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
221+ let pmtAmount = $t092709345._1
222+ let pmtAssetId = $t092709345._2
219223 let userUsdnInMarketing = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserAmountUSDNInMarketing)), 0)
220224 let usdnInMarketing = valueOrElse(getInteger(this, (toString(launchpadId) + keyAmountUSDNInMarketing)), 0)
221225 let boughtAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtAllocations)), 0)
222226 let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
223227 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
224228 let tokensPerAllocation = getIntegerValue(this, (toString(launchpadId) + keyTokensPerAllocation))
225- let allocationPrice = (tokenPrice * tokensPerAllocation)
226- let allocationPriceWithComission = (allocationPrice + fraction(allocationPrice, commission, 100))
229+ let allocationPriceWithComission = fraction((tokenPrice * tokensPerAllocation), (100 + commission), 100)
230+ let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
231+ let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
227232 if (!(isActive))
228233 then throw("DApp is inactive at this moment")
229234 else if ((activeLaunchpadId != launchpadId))
230235 then throw("There is no active launchpad or this launchpad is ended")
231- else if (if ((size(i.payments) != 1))
232- then true
233- else (pmtAssetId != USDN))
234- then throw("One attached payment in USDN expected")
235- else if ((boughtAllocations >= maxAllocationsAmount))
236- then throw((("You can buy only " + toString(maxAllocationsAmount)) + "allocations"))
237- else if (if ((allocationPriceWithComission != pmtAmount))
238- then ((allocationPriceWithComission * 2) != pmtAmount)
239- else false)
240- then throw((("Wrong payment. You can buy 1 or 2 allocations for " + toString((allocationPriceWithComission / 1000000))) + " USDN per allocation"))
241- else {
242- let buyAllocationsAmount = (pmtAmount / allocationPriceWithComission)
236+ else if ((height > startHeight))
237+ then throw("Launchpad sale not started yet")
238+ else if (((startHeight + duration) > height))
239+ then throw("Launchpad sale ended")
240+ else if (if ((size(i.payments) != 1))
241+ then true
242+ else (pmtAssetId != USDN))
243+ then throw("One attached payment in USDN expected")
244+ else if ((boughtAllocations >= maxAllocationsAmount))
245+ then throw((("You can buy only " + toString(maxAllocationsAmount)) + "allocations"))
246+ else if (if ((allocationPriceWithComission != pmtAmount))
247+ then ((allocationPriceWithComission * 2) != pmtAmount)
248+ else false)
249+ then throw((("Wrong payment. You can buy 1 or 2 allocations for " + toString((allocationPriceWithComission / 1000000))) + " USDN per allocation"))
250+ else {
251+ let buyAllocationsAmount = (pmtAmount / allocationPriceWithComission)
243252 [StringEntry(((toString(i.caller) + toString(launchpadId)) + keyUserRefId), refId), IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtAllocations), (boughtAllocations + buyAllocationsAmount)), IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserAmountUSDNInMarketing), (userUsdnInMarketing + pmtAmount)), IntegerEntry((toString(launchpadId) + keyAmountUSDNInMarketing), (usdnInMarketing + pmtAmount))]
244- }
253+ }
245254 }
246255
247256
263272 let swopfiMembersComission = fraction(swopfiMembersUsdnAmount, commission, 100)
264273 let totalAmountUsdnInMarketing = getIntegerValue(this, (toString(launchpadId) + keyAmountUSDNInMarketingFinalized))
265274 let marketingComission = fraction(totalAmountUsdnInMarketing, commission, 100)
266-[BooleanEntry((toString(launchpadId) + keyFinalise), true), ScriptTransfer(projectAddress, (swopfiMembersUsdnAmount + totalAmountUsdnInMarketing), USDN), ScriptTransfer(commissionWallet, (swopfiMembersComission + marketingComission), USDN)]
275+[IntegerEntry((toString(launchpadId) + keyFinaliseHeight), height), ScriptTransfer(projectAddress, (swopfiMembersUsdnAmount + totalAmountUsdnInMarketing), USDN), ScriptTransfer(commissionWallet, (swopfiMembersComission + marketingComission), USDN)]
267276 }
268277 }
269278
276285 let boughtAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtAllocations)), 0)
277286 if (!(isActive))
278287 then throw("DApp is inactive at this moment")
279- else if (userClaimStatus)
280- then throw("You are already claimed")
281- else if (if ((boughtTickets == 0))
282- then (boughtAllocations == 0)
283- else false)
284- then throw("You can't claim because you don't buy enething")
285- else {
286- let tokenId = fromBase58String(getStringValue(this, (toString(launchpadId) + keyAssetId)))
287- let wonnedTickets = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserWinnedTiketsAmount)), 0)
288- let awailableAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserAvailableAllocations)), 0)
289- let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
290- let allowedAllocations = min([boughtAllocations, awailableAllocations])
291- let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
292- let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
293- let ticketPrice = (tokensPerTicket * tokenPrice)
294- let tokensPerAllocation = getIntegerValue(this, (toString(launchpadId) + keyTokensPerAllocation))
295- let transferTokensAmount = ((wonnedTickets * tokensPerTicket) + (allowedAllocations * tokensPerAllocation))
296- let usdnForAllocations = fraction((boughtAllocations - allowedAllocations), (100 + commission), 100)
297- let usdnForUnwonnedTickets = fraction(((boughtTickets - wonnedTickets) * ticketPrice), (100 + commission), 100)
298- let returnedUsdnAmount = (usdnForAllocations + usdnForUnwonnedTickets)
299- let transferUsdn = if ((returnedUsdnAmount > 0))
300- then [ScriptTransfer(i.caller, returnedUsdnAmount, USDN)]
301- else nil
302- let transferTokens = if ((transferTokensAmount > 0))
303- then [ScriptTransfer(i.caller, transferTokensAmount, tokenId)]
304- else nil
305- (([BooleanEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimStatus), true)] ++ transferTokens) ++ transferUsdn)
306- }
288+ else if (!(isDefined(getInteger(this, (toString(launchpadId) + keyFinaliseHeight)))))
289+ then throw("You can't claim because results are not finalized")
290+ else if (userClaimStatus)
291+ then throw("You are already claimed")
292+ else if (if ((boughtTickets == 0))
293+ then (boughtAllocations == 0)
294+ else false)
295+ then throw("You can't claim because you don't buy enething")
296+ else {
297+ let tokenId = fromBase58String(getStringValue(this, (toString(launchpadId) + keyAssetId)))
298+ let wonnedTickets = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserWinnedTicketsAmount)), 0)
299+ let awailableAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserAvailableAllocations)), 0)
300+ let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
301+ let allowedAllocations = min([boughtAllocations, awailableAllocations])
302+ let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
303+ let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
304+ let ticketPrice = (tokensPerTicket * tokenPrice)
305+ let tokensPerAllocation = getIntegerValue(this, (toString(launchpadId) + keyTokensPerAllocation))
306+ let transferTokensAmount = ((wonnedTickets * tokensPerTicket) + (allowedAllocations * tokensPerAllocation))
307+ let usdnForAllocations = fraction((boughtAllocations - allowedAllocations), (100 + commission), 100)
308+ let usdnForUnwonnedTickets = fraction(((boughtTickets - wonnedTickets) * ticketPrice), (100 + commission), 100)
309+ if (if ((0 > usdnForAllocations))
310+ then true
311+ else (0 > usdnForUnwonnedTickets))
312+ then throw("Error with allowed allocation param or wonned tickets param& Olease contact support")
313+ else {
314+ let returnedUsdnAmount = (usdnForAllocations + usdnForUnwonnedTickets)
315+ let transferUsdn = if ((returnedUsdnAmount > 0))
316+ then [ScriptTransfer(i.caller, returnedUsdnAmount, USDN)]
317+ else nil
318+ let transferTokens = if ((transferTokensAmount > 0))
319+ then [ScriptTransfer(i.caller, transferTokensAmount, tokenId)]
320+ else nil
321+ (([BooleanEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimStatus), true)] ++ transferTokens) ++ transferUsdn)
322+ }
323+ }
307324 }
308325
309326
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
22+let keyInitHeight = "_init_height"
23+
2224 let keyStartHeight = "_start_height"
2325
24-let keyStatus = "_status"
26+let keyFinaliseHeight = "_finalise_height"
2527
2628 let keyComission = "_comission"
2729
2830 let keyAssetId = "_asset_id"
2931
3032 let keyTotalTokenAmount = "_total_token_amount"
3133
3234 let keyTotalAmountUsdnSold = "_total_usdn_sold"
3335
3436 let keyTokensPerTicket = "_tokens_per_ticket"
3537
3638 let keyPricePerToken = "_price_per_token"
3739
3840 let keySwopPerTicket = "_swop_per_ticket"
3941
4042 let keySwopfiTicketsAmount = "_tickets_swopfi_members"
4143
4244 let keyCampaignTokensAmount = "_tokens_access_list"
4345
4446 let keyTokensPerAllocation = "_tokens_per_allocation"
4547
4648 let keyTicketLastNumber = "_ticket_last_number"
4749
4850 let keyGovernanceStaked = "_SWOP_amount"
4951
5052 let keyUserRefId = "_ref_id"
5153
5254 let keyVerifyHash = "_verify_hash"
5355
5456 let keyDuration = "_duration"
5557
56-let keyFinalise = "_finalse"
57-
5858 let keyAmountUSDNInMarketing = "_total_purchased_usdn_in_marketing"
5959
6060 let keyAmountUSDNInMarketingFinalized = "_total_purchased_usdn_in_marketing_finalized"
6161
6262 let keyUserBoughtTicketsAmount = "_bought_tickets"
6363
6464 let keyUserTickets = "_tickets_number"
6565
6666 let keyUserAvailableAllocations = "_available_purchase_marketing"
6767
6868 let keyUserAmountUSDNInMarketing = "_purchased_usdn_in_marketing"
6969
7070 let keyUserBoughtAllocations = "_bought_allocations"
7171
7272 let keyUserClaimStatus = "_claim_status"
7373
74-let keyUserWinnedTiketsAmount = "_tickets_result"
74+let keyUserWinnedTicketsAmount = "_tickets_result"
7575
7676 let lauchpadDuration = 1440
7777
7878 let oracle = Address(base58'3NBBWfzZtZtszaXbitTKnrB2xXwv26Bn7H9')
7979
8080 let governance = Address(base58'3N5W8da2iiijVieA6qLGo7KzCJj8B19smWU')
8181
8282 let commissionWallet = Address(base58'3N2hBdeDEs7wCNA9EY8qv3B6drjgKD64xQG')
8383
8484 let USDN = base58'8UrfDVd5GreeUwm7uPk7eYz1eMv376kzR52C6sANPkwS'
8585
8686 let adminPubKeyStaking = base58'Kn7NpzaG12dLZgcHf2ipUftU6hbJygmrhFqQYE4B7ZK'
8787
8888 let maxAllocationsAmount = 2
8989
9090 let isActive = valueOrElse(getBoolean(this, keyActive), true)
9191
9292 let activeLaunchpadId = valueOrElse(getIntegerValue(this, keyLaunchpadActiveId), -1)
9393
9494 func getAdminPub (keyAdminPub) = match getString(oracle, keyAdminPub) {
9595 case string: String =>
9696 fromBase58String(string)
9797 case nothing =>
9898 throw("Admin public key is empty")
9999 }
100100
101101
102102 let adminPubKey1 = getAdminPub(keyAdminPubKey1)
103103
104104 let adminPubKey2 = getAdminPub(keyAdminPubKey2)
105105
106106 let adminPubKey3 = getAdminPub(keyAdminPubKey3)
107107
108108 func getAssetInfo (assetId) = match assetId {
109109 case id: ByteVector =>
110110 let stringId = toBase58String(id)
111111 let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
112112 $Tuple3(stringId, info.name, info.decimals)
113113 case waves: Unit =>
114114 $Tuple3("WAVES", "WAVES", 8)
115115 case _ =>
116116 throw("Match error")
117117 }
118118
119119
120120 func getLaunchpadNextId () = valueOrElse(getInteger(this, keyLaunchpadNextId), 1)
121121
122122
123123 @Callable(i)
124124 func hashingRandom (launchpadId,hash) = if (!(isActive))
125125 then throw("DApp is inactive at this moment")
126126 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
127127 then throw("Only admin can call this function")
128128 else [StringEntry((toString(launchpadId) + keyVerifyHash), hash)]
129129
130130
131131
132132 @Callable(i)
133133 func initCaller (address) = if (!(isActive))
134134 then throw("DApp is inactive at this moment")
135135 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
136136 then throw("Only admin can call this function")
137137 else [StringEntry(keyInitCaller, address)]
138138
139139
140140
141141 @Callable(i)
142142 func init (projectAddress,startHeight,commission,tokensPerTicket,pricePerToken,swopfiTicketsAmount,campaignTokensAmount,tokensPerAllocation,swopPerTicket) = {
143- let $t039113986 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
144- let pmtAmount = $t039113986._1
145- let pmtAssetId = $t039113986._2
143+ let $t039394014 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
144+ let pmtAmount = $t039394014._1
145+ let pmtAssetId = $t039394014._2
146146 if (!(isActive))
147147 then throw("DApp is inactive at this moment")
148- else if ((valueOrElse(getString(keyInitCaller), "") == toString(i.caller)))
148+ else if ((valueOrElse(getString(this, keyInitCaller), "") == toString(i.caller)))
149149 then throw("Only project admin can call init function")
150150 else if ((size(i.payments) != 1))
151151 then throw("One attached payment expected")
152152 else if ((height > startHeight))
153153 then throw("Start height must be greater than blockchain height")
154154 else {
155- let $t044094482 = getAssetInfo(pmtAssetId)
156- let pmtStrAssetId = $t044094482._1
157- let pmtAssetName = $t044094482._2
158- let pmtDecimals = $t044094482._3
155+ let $t044424515 = getAssetInfo(pmtAssetId)
156+ let pmtStrAssetId = $t044424515._1
157+ let pmtAssetName = $t044424515._2
158+ let pmtDecimals = $t044424515._3
159159 let launchpadId = getLaunchpadNextId()
160160 let launchpadIdStr = toString(launchpadId)
161-[IntegerEntry((pmtStrAssetId + "_launchpad"), launchpadId), IntegerEntry(keyLaunchpadNextId, (launchpadId + 1)), StringEntry((launchpadIdStr + keyAddress), projectAddress), IntegerEntry((launchpadIdStr + keyStartHeight), startHeight), IntegerEntry((launchpadIdStr + keyDuration), lauchpadDuration), IntegerEntry((launchpadIdStr + keyTotalTokenAmount), pmtAmount), StringEntry((launchpadIdStr + keyStatus), "active"), StringEntry((launchpadIdStr + keyAssetId), pmtStrAssetId), IntegerEntry((launchpadIdStr + keyComission), commission), IntegerEntry((launchpadIdStr + keyTicketLastNumber), 0), IntegerEntry((launchpadIdStr + keyTokensPerTicket), tokensPerTicket), IntegerEntry((launchpadIdStr + keyPricePerToken), pricePerToken), IntegerEntry((launchpadIdStr + keySwopPerTicket), swopPerTicket), IntegerEntry((launchpadIdStr + keySwopfiTicketsAmount), swopfiTicketsAmount), IntegerEntry((launchpadIdStr + keyCampaignTokensAmount), campaignTokensAmount), IntegerEntry((launchpadIdStr + keyTokensPerAllocation), tokensPerAllocation), IntegerEntry(keyLaunchpadActiveId, launchpadId), StringEntry(keyInitCaller, "")]
161+[IntegerEntry((pmtStrAssetId + "_launchpad"), launchpadId), IntegerEntry(keyLaunchpadNextId, (launchpadId + 1)), StringEntry((launchpadIdStr + keyAddress), projectAddress), IntegerEntry((launchpadIdStr + keyInitHeight), height), IntegerEntry((launchpadIdStr + keyStartHeight), startHeight), IntegerEntry((launchpadIdStr + keyDuration), lauchpadDuration), IntegerEntry((launchpadIdStr + keyTotalTokenAmount), pmtAmount), StringEntry((launchpadIdStr + keyAssetId), pmtStrAssetId), IntegerEntry((launchpadIdStr + keyComission), commission), IntegerEntry((launchpadIdStr + keyTicketLastNumber), 0), IntegerEntry((launchpadIdStr + keyTokensPerTicket), tokensPerTicket), IntegerEntry((launchpadIdStr + keyPricePerToken), pricePerToken), IntegerEntry((launchpadIdStr + keySwopPerTicket), swopPerTicket), IntegerEntry((launchpadIdStr + keySwopfiTicketsAmount), swopfiTicketsAmount), IntegerEntry((launchpadIdStr + keyCampaignTokensAmount), campaignTokensAmount), IntegerEntry((launchpadIdStr + keyTokensPerAllocation), tokensPerAllocation), IntegerEntry(keyLaunchpadActiveId, launchpadId), StringEntry(keyInitCaller, "")]
162162 }
163163 }
164164
165165
166166
167167 @Callable(i)
168168 func commitSwopfiSale (launchpadId,refId) = {
169- let $t059736048 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
170- let pmtAmount = $t059736048._1
171- let pmtAssetId = $t059736048._2
169+ let $t060096084 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
170+ let pmtAmount = $t060096084._1
171+ let pmtAssetId = $t060096084._2
172172 let stakedSwops = valueOrElse(getInteger(governance, (toString(i.caller) + keyGovernanceStaked)), 0)
173173 let allowedTicketsAmountAll = (stakedSwops / getIntegerValue(this, (toString(launchpadId) + keySwopPerTicket)))
174- let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
175- let commissionInUSDN = fraction(pmtAmount, commission, 100)
176174 let boughtTicketsAmount = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtTicketsAmount)), 0)
177175 let allowedTicketsAmount = (allowedTicketsAmountAll - boughtTicketsAmount)
176+ let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
177+ let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
178178 if (!(isActive))
179179 then throw("DApp is inactive at this moment")
180180 else if ((activeLaunchpadId != launchpadId))
181181 then throw("There is no active launchpad or this launchpad is ended")
182- else if (if ((size(i.payments) != 1))
183- then true
184- else (pmtAssetId != USDN))
185- then throw("One attached payment in USDN expected")
186- else if (if ((0 >= allowedTicketsAmountAll))
187- then true
188- else (0 >= allowedTicketsAmount))
189- then throw("Not enought SWOP in staking to buy tickets")
190- else {
191- let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
192- let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
193- let ticketPrice = (tokensPerTicket * tokenPrice)
194- let buyTicketAmount = ((pmtAmount - commissionInUSDN) / ticketPrice)
195- let allowedBuyTicketAmount = min([buyTicketAmount, allowedTicketsAmount])
196- let allowedBuyPrice = (allowedBuyTicketAmount * ticketPrice)
197- let allowedBuyPriceWithComission = (allowedBuyPrice + fraction(allowedBuyPrice, commission, 100))
198- let change = (pmtAmount - allowedBuyPriceWithComission)
199- let userBoughtTicketsNumbers = valueOrElse(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserTickets)), "")
200- let lastBoughtTickerNumber = getIntegerValue(this, (toString(launchpadId) + keyTicketLastNumber))
201- let boughtRange = ((toString((lastBoughtTickerNumber + 1)) + "-") + toString((lastBoughtTickerNumber + allowedBuyTicketAmount)))
202- let newUserBoughtTicketsNumbers = (userBoughtTicketsNumbers + (if ((userBoughtTicketsNumbers != ""))
203- then ","
204- else ("" + boughtRange)))
205- let baseEntry = [StringEntry(((toString(i.caller) + toString(launchpadId)) + keyUserRefId), refId), IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtTicketsAmount), (boughtTicketsAmount + allowedBuyTicketAmount)), IntegerEntry((toString(launchpadId) + keyTicketLastNumber), (lastBoughtTickerNumber + allowedBuyTicketAmount)), StringEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserTickets), newUserBoughtTicketsNumbers)]
206- if ((change > 0))
207- then (baseEntry ++ [ScriptTransfer(i.caller, change, pmtAssetId)])
208- else baseEntry
209- }
182+ else if ((height > startHeight))
183+ then throw("Launchpad sale not started yet")
184+ else if (((startHeight + duration) > height))
185+ then throw("Launchpad sale ended")
186+ else if (if ((size(i.payments) != 1))
187+ then true
188+ else (pmtAssetId != USDN))
189+ then throw("One attached payment in USDN expected")
190+ else if (if ((0 >= allowedTicketsAmountAll))
191+ then true
192+ else (0 >= allowedTicketsAmount))
193+ then throw("Not enought SWOP in staking to buy tickets")
194+ else {
195+ let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
196+ let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
197+ let ticketPrice = (tokensPerTicket * tokenPrice)
198+ let commissionPerTicket = fraction(ticketPrice, getIntegerValue(this, (toString(launchpadId) + keyComission)), 100)
199+ let buyTicketAmount = (pmtAmount / (ticketPrice + commissionPerTicket))
200+ let allowedBuyTicketAmount = min([buyTicketAmount, allowedTicketsAmount])
201+ let allowedBuyPriceWithComission = (allowedBuyTicketAmount * (ticketPrice + commissionPerTicket))
202+ let change = (pmtAmount - allowedBuyPriceWithComission)
203+ let userBoughtTicketsNumbers = valueOrElse(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserTickets)), "")
204+ let lastBoughtTicketNumber = getIntegerValue(this, (toString(launchpadId) + keyTicketLastNumber))
205+ let boughtRange = ((toString((lastBoughtTicketNumber + 1)) + "-") + toString((lastBoughtTicketNumber + allowedBuyTicketAmount)))
206+ let newUserBoughtTicketsNumbers = (userBoughtTicketsNumbers + (if ((userBoughtTicketsNumbers != ""))
207+ then ","
208+ else ("" + boughtRange)))
209+ let baseEntry = [StringEntry(((toString(i.caller) + toString(launchpadId)) + keyUserRefId), refId), IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtTicketsAmount), (boughtTicketsAmount + allowedBuyTicketAmount)), IntegerEntry((toString(launchpadId) + keyTicketLastNumber), (lastBoughtTicketNumber + allowedBuyTicketAmount)), StringEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserTickets), newUserBoughtTicketsNumbers)]
210+ if ((change > 0))
211+ then (baseEntry ++ [ScriptTransfer(i.caller, change, pmtAssetId)])
212+ else baseEntry
213+ }
210214 }
211215
212216
213217
214218 @Callable(i)
215219 func commitAccessListSale (launchpadId,refId) = {
216- let $t089779052 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
217- let pmtAmount = $t089779052._1
218- let pmtAssetId = $t089779052._2
220+ let $t092709345 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
221+ let pmtAmount = $t092709345._1
222+ let pmtAssetId = $t092709345._2
219223 let userUsdnInMarketing = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserAmountUSDNInMarketing)), 0)
220224 let usdnInMarketing = valueOrElse(getInteger(this, (toString(launchpadId) + keyAmountUSDNInMarketing)), 0)
221225 let boughtAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtAllocations)), 0)
222226 let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
223227 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
224228 let tokensPerAllocation = getIntegerValue(this, (toString(launchpadId) + keyTokensPerAllocation))
225- let allocationPrice = (tokenPrice * tokensPerAllocation)
226- let allocationPriceWithComission = (allocationPrice + fraction(allocationPrice, commission, 100))
229+ let allocationPriceWithComission = fraction((tokenPrice * tokensPerAllocation), (100 + commission), 100)
230+ let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
231+ let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
227232 if (!(isActive))
228233 then throw("DApp is inactive at this moment")
229234 else if ((activeLaunchpadId != launchpadId))
230235 then throw("There is no active launchpad or this launchpad is ended")
231- else if (if ((size(i.payments) != 1))
232- then true
233- else (pmtAssetId != USDN))
234- then throw("One attached payment in USDN expected")
235- else if ((boughtAllocations >= maxAllocationsAmount))
236- then throw((("You can buy only " + toString(maxAllocationsAmount)) + "allocations"))
237- else if (if ((allocationPriceWithComission != pmtAmount))
238- then ((allocationPriceWithComission * 2) != pmtAmount)
239- else false)
240- then throw((("Wrong payment. You can buy 1 or 2 allocations for " + toString((allocationPriceWithComission / 1000000))) + " USDN per allocation"))
241- else {
242- let buyAllocationsAmount = (pmtAmount / allocationPriceWithComission)
236+ else if ((height > startHeight))
237+ then throw("Launchpad sale not started yet")
238+ else if (((startHeight + duration) > height))
239+ then throw("Launchpad sale ended")
240+ else if (if ((size(i.payments) != 1))
241+ then true
242+ else (pmtAssetId != USDN))
243+ then throw("One attached payment in USDN expected")
244+ else if ((boughtAllocations >= maxAllocationsAmount))
245+ then throw((("You can buy only " + toString(maxAllocationsAmount)) + "allocations"))
246+ else if (if ((allocationPriceWithComission != pmtAmount))
247+ then ((allocationPriceWithComission * 2) != pmtAmount)
248+ else false)
249+ then throw((("Wrong payment. You can buy 1 or 2 allocations for " + toString((allocationPriceWithComission / 1000000))) + " USDN per allocation"))
250+ else {
251+ let buyAllocationsAmount = (pmtAmount / allocationPriceWithComission)
243252 [StringEntry(((toString(i.caller) + toString(launchpadId)) + keyUserRefId), refId), IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtAllocations), (boughtAllocations + buyAllocationsAmount)), IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserAmountUSDNInMarketing), (userUsdnInMarketing + pmtAmount)), IntegerEntry((toString(launchpadId) + keyAmountUSDNInMarketing), (usdnInMarketing + pmtAmount))]
244- }
253+ }
245254 }
246255
247256
248257
249258 @Callable(i)
250259 func finalise (launchpadId,vrfHeight,secretWord) = {
251260 let savedHash = getStringValue(this, (toString(launchpadId) + keyVerifyHash))
252261 let calcHash = toBase58String(sha256((toBytes(vrfHeight) + toBytes(secretWord))))
253262 if (!(isActive))
254263 then throw("DApp is inactive at this moment")
255264 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
256265 then throw("Only admin can call this function")
257266 else if ((calcHash != savedHash))
258267 then throw("vrf Height hash not matching")
259268 else {
260269 let projectAddress = addressFromStringValue(getStringValue(this, (toString(launchpadId) + keyAddress)))
261270 let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
262271 let swopfiMembersUsdnAmount = getIntegerValue(this, (toString(launchpadId) + keyTotalAmountUsdnSold))
263272 let swopfiMembersComission = fraction(swopfiMembersUsdnAmount, commission, 100)
264273 let totalAmountUsdnInMarketing = getIntegerValue(this, (toString(launchpadId) + keyAmountUSDNInMarketingFinalized))
265274 let marketingComission = fraction(totalAmountUsdnInMarketing, commission, 100)
266-[BooleanEntry((toString(launchpadId) + keyFinalise), true), ScriptTransfer(projectAddress, (swopfiMembersUsdnAmount + totalAmountUsdnInMarketing), USDN), ScriptTransfer(commissionWallet, (swopfiMembersComission + marketingComission), USDN)]
275+[IntegerEntry((toString(launchpadId) + keyFinaliseHeight), height), ScriptTransfer(projectAddress, (swopfiMembersUsdnAmount + totalAmountUsdnInMarketing), USDN), ScriptTransfer(commissionWallet, (swopfiMembersComission + marketingComission), USDN)]
267276 }
268277 }
269278
270279
271280
272281 @Callable(i)
273282 func claim (launchpadId) = {
274283 let userClaimStatus = getBooleanValue(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimStatus))
275284 let boughtTickets = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtTicketsAmount)), 0)
276285 let boughtAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtAllocations)), 0)
277286 if (!(isActive))
278287 then throw("DApp is inactive at this moment")
279- else if (userClaimStatus)
280- then throw("You are already claimed")
281- else if (if ((boughtTickets == 0))
282- then (boughtAllocations == 0)
283- else false)
284- then throw("You can't claim because you don't buy enething")
285- else {
286- let tokenId = fromBase58String(getStringValue(this, (toString(launchpadId) + keyAssetId)))
287- let wonnedTickets = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserWinnedTiketsAmount)), 0)
288- let awailableAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserAvailableAllocations)), 0)
289- let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
290- let allowedAllocations = min([boughtAllocations, awailableAllocations])
291- let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
292- let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
293- let ticketPrice = (tokensPerTicket * tokenPrice)
294- let tokensPerAllocation = getIntegerValue(this, (toString(launchpadId) + keyTokensPerAllocation))
295- let transferTokensAmount = ((wonnedTickets * tokensPerTicket) + (allowedAllocations * tokensPerAllocation))
296- let usdnForAllocations = fraction((boughtAllocations - allowedAllocations), (100 + commission), 100)
297- let usdnForUnwonnedTickets = fraction(((boughtTickets - wonnedTickets) * ticketPrice), (100 + commission), 100)
298- let returnedUsdnAmount = (usdnForAllocations + usdnForUnwonnedTickets)
299- let transferUsdn = if ((returnedUsdnAmount > 0))
300- then [ScriptTransfer(i.caller, returnedUsdnAmount, USDN)]
301- else nil
302- let transferTokens = if ((transferTokensAmount > 0))
303- then [ScriptTransfer(i.caller, transferTokensAmount, tokenId)]
304- else nil
305- (([BooleanEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimStatus), true)] ++ transferTokens) ++ transferUsdn)
306- }
288+ else if (!(isDefined(getInteger(this, (toString(launchpadId) + keyFinaliseHeight)))))
289+ then throw("You can't claim because results are not finalized")
290+ else if (userClaimStatus)
291+ then throw("You are already claimed")
292+ else if (if ((boughtTickets == 0))
293+ then (boughtAllocations == 0)
294+ else false)
295+ then throw("You can't claim because you don't buy enething")
296+ else {
297+ let tokenId = fromBase58String(getStringValue(this, (toString(launchpadId) + keyAssetId)))
298+ let wonnedTickets = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserWinnedTicketsAmount)), 0)
299+ let awailableAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserAvailableAllocations)), 0)
300+ let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
301+ let allowedAllocations = min([boughtAllocations, awailableAllocations])
302+ let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
303+ let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
304+ let ticketPrice = (tokensPerTicket * tokenPrice)
305+ let tokensPerAllocation = getIntegerValue(this, (toString(launchpadId) + keyTokensPerAllocation))
306+ let transferTokensAmount = ((wonnedTickets * tokensPerTicket) + (allowedAllocations * tokensPerAllocation))
307+ let usdnForAllocations = fraction((boughtAllocations - allowedAllocations), (100 + commission), 100)
308+ let usdnForUnwonnedTickets = fraction(((boughtTickets - wonnedTickets) * ticketPrice), (100 + commission), 100)
309+ if (if ((0 > usdnForAllocations))
310+ then true
311+ else (0 > usdnForUnwonnedTickets))
312+ then throw("Error with allowed allocation param or wonned tickets param& Olease contact support")
313+ else {
314+ let returnedUsdnAmount = (usdnForAllocations + usdnForUnwonnedTickets)
315+ let transferUsdn = if ((returnedUsdnAmount > 0))
316+ then [ScriptTransfer(i.caller, returnedUsdnAmount, USDN)]
317+ else nil
318+ let transferTokens = if ((transferTokensAmount > 0))
319+ then [ScriptTransfer(i.caller, transferTokensAmount, tokenId)]
320+ else nil
321+ (([BooleanEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimStatus), true)] ++ transferTokens) ++ transferUsdn)
322+ }
323+ }
307324 }
308325
309326
310327
311328 @Callable(i)
312329 func shutdown () = if (!(isActive))
313330 then throw("DApp alredy inactive")
314331 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
315332 then throw("Only admin can call this function")
316333 else [BooleanEntry(keyActive, false)]
317334
318335
319336
320337 @Callable(i)
321338 func activate () = if (isActive)
322339 then throw("DApp alredy active")
323340 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
324341 then throw("Only admin can call this function")
325342 else [BooleanEntry(keyActive, true)]
326343
327344
328345 @Verifier(tx)
329346 func verify () = {
330347 let multiSignedByAdmins = {
331348 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
332349 then 1
333350 else 0
334351 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
335352 then 1
336353 else 0
337354 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
338355 then 1
339356 else 0
340357 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
341358 }
342359 let signedByAdmin = if (if (if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
343360 then true
344361 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey2))
345362 then true
346363 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey3))
347364 then true
348365 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKeyStaking)
349366 match tx {
350367 case dtx: DataTransaction =>
351368 if (valueOrElse(getBoolean(oracle, keyLaunchpadDataTransactionStatus), false))
352369 then signedByAdmin
353370 else false
354371 case _ =>
355372 multiSignedByAdmins
356373 }
357374 }
358375

github/deemru/w8io/169f3d6 
80.03 ms