tx · BAaUTUxAp6nNLCyN5sLJ8gxi4hE9EwJ68Kmy9edw8q9b

3MwkjgDrsm5k73WJU9Nbxbx4y2iy3zjQzMi:  -0.01400000 Waves

2021.11.30 16:53 [1813859] smart account 3MwkjgDrsm5k73WJU9Nbxbx4y2iy3zjQzMi > SELF 0.00000000 Waves

{ "type": 13, "id": "BAaUTUxAp6nNLCyN5sLJ8gxi4hE9EwJ68Kmy9edw8q9b", "fee": 1400000, "feeAssetId": null, "timestamp": 1638280460284, "version": 2, "chainId": 84, "sender": "3MwkjgDrsm5k73WJU9Nbxbx4y2iy3zjQzMi", "senderPublicKey": "FRotxVW1MhTQRDvVbMM4yvYGWzBFvHqvMsonvGeEXQUy", "proofs": [ "269ZH68dbGVgrDtBVV9cEzYzybXCkXXRfrKmFtXHzE5msnkBLZnnzhgkgMwVYYbt5qBwFXXH3AXCXs9tSPbW9YgD", "31rkEdRT7JbJ73tFKzyATHUL1WRbvTCapbtgdVF9xXu5YYEvDfVC8eeCtfVgvrP631764QayipyHWBnSBbbRYsc2" ], "script": "base64:AAIFAAAAAAAAABwIAhIHCgUBERgRGBIAEgMKAQgSBAoCAQgSABIAAAAAHQAAAAAJa2V5QWN0aXZlAgAAAAZhY3RpdmUAAAAADGtleUVuZEhlaWdodAIAAAAKZW5kX2hlaWdodAAAAAAPa2V5UHJpemVzUHJpY2VzAgAAAA1wcml6ZXNfcHJpY2VzAAAAAA1rZXlQcml6ZXNBSWRzAgAAABdwcml6ZXNfYWNoaWV2ZW1lbnRzX2lkcwAAAAAQa2V5UHJpemVzQW1vdW50cwIAAAANcHJpemVzX2Ftb3VudAAAAAAOa2V5TGV2ZWxQcmljZXMCAAAADGxldmVsX3ByaWNlcwAAAAAWa2V5TGV2ZWxBY2hpZXZlbW50c0lkcwIAAAAWbGV2ZWxfYWNoaWV2ZW1lbnRzX2lkcwAAAAAJa2V5U1dPUGlkAgAAAAdTV09QX2lkAAAAAA5rZXlUb3RhbEJ1cm5lZAIAAAAMdG90YWxfYnVybmVkAAAAAA1rZXlWZXJpZnlIYXNoAgAAAAt2ZXJpZnlfaGFzaAAAAAARa2V5RmluYWxpemVIZWlnaHQCAAAAD2ZpbmFsaXplX2hlaWdodAAAAAASa2V5VXNlclRvdGFsQnVybmVkAgAAAA1fdG90YWxfYnVybmVkAAAAAAZvcmFjbGUJAQAAAAdBZGRyZXNzAAAAAQEAAAAaAVTpRaoekC86rvG6DuYumpJfGpiE4fNiswgAAAAAB2Zhcm1pbmcJAQAAAAdBZGRyZXNzAAAAAQEAAAAaAVQsS4J2Ro3vGTI9KakEzAv69iHSjreZL2YAAAAADGFjaGlldmVtZW50cwkBAAAAB0FkZHJlc3MAAAABAQAAABoBVJK5fKIHIb/pZr3vGi+pG6QkOinYZMH4PwAAAAAPa2V5QWRtaW5QdWJLZXkxAgAAAAthZG1pbl9wdWJfMQAAAAAPa2V5QWRtaW5QdWJLZXkyAgAAAAthZG1pbl9wdWJfMgAAAAAPa2V5QWRtaW5QdWJLZXkzAgAAAAthZG1pbl9wdWJfMwEAAAALZ2V0QWRtaW5QdWIAAAABAAAAC2tleUFkbWluUHViBAAAAAckbWF0Y2gwCQAEHQAAAAIFAAAABm9yYWNsZQUAAAALa2V5QWRtaW5QdWIDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABlN0cmluZwQA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", "height": 1813859, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: EaWG1mVY4A4eqRwKDRTjuajb2gCxGZNsqifi6aYVtwzA Next: H4hTfBNTa542YFxbMpo1gQ9EAKFy2h8BWmvXF1S7PuuD Diff:
OldNewDifferences
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let keyActive = "active"
5+
6+let keyEndHeight = "end_height"
7+
8+let keyPrizesPrices = "prizes_prices"
9+
10+let keyPrizesAIds = "prizes_achievements_ids"
11+
12+let keyPrizesAmounts = "prizes_amount"
13+
14+let keyLevelPrices = "level_prices"
15+
16+let keyLevelAchievemntsIds = "level_achievements_ids"
17+
18+let keySWOPid = "SWOP_id"
19+
20+let keyTotalBurned = "total_burned"
21+
22+let keyVerifyHash = "verify_hash"
23+
24+let keyFinalizeHeight = "finalize_height"
25+
26+let keyUserTotalBurned = "_total_burned"
27+
28+let oracle = Address(base58'3NBBWfzZtZtszaXbitTKnrB2xXwv26Bn7H9')
29+
30+let farming = Address(base58'3MsxHxruYWoddB4HRiPBYAWtMXMtCF1V9XT')
31+
32+let achievements = Address(base58'3N3HtdnBkqSSc16DaydiwtrMBUv3DfqKjSW')
533
634 let keyAdminPubKey1 = "admin_pub_1"
735
836 let keyAdminPubKey2 = "admin_pub_2"
937
1038 let keyAdminPubKey3 = "admin_pub_3"
11-
12-let keyLaunchpadDataTransactionStatus = "launchpad_data_transaction_status"
13-
14-let keyLaunchpadNextId = "launchpad_next_id"
15-
16-let keyLaunchpadActiveId = "launchpad_active_id"
17-
18-let keyInitCaller = "init_caller"
19-
20-let keyAddress = "_address"
21-
22-let keyInitHeight = "_init_height"
23-
24-let keyStartHeight = "_start_height"
25-
26-let keyFinaliseHeight = "_finalise_height"
27-
28-let keyComission = "_comission"
29-
30-let keyAssetId = "_asset_id"
31-
32-let keyTotalTokenAmount = "_total_token_amount"
33-
34-let keyTotalAmountUsdnSold = "_total_usdn_sold"
35-
36-let keyTokensPerTicket = "_tokens_per_ticket"
37-
38-let keyPricePerToken = "_price_per_token"
39-
40-let keySwopPerTicket = "_swop_per_ticket"
41-
42-let keySwopfiTicketsAmount = "_tickets_swopfi_members"
43-
44-let keyCampaignTokensAmount = "_tokens_access_list"
45-
46-let keyTokensPerAllocation = "_tokens_per_allocation"
47-
48-let keyTicketLastNumber = "_ticket_last_number"
49-
50-let keyGovernanceStaked = "_SWOP_amount"
51-
52-let keyUserRefId = "_ref_id"
53-
54-let keyVerifyHash = "_verify_hash"
55-
56-let keyDuration = "_duration"
57-
58-let keyAmountUSDNInMarketing = "_total_purchased_usdn_in_marketing"
59-
60-let keyAmountUSDNInMarketingFinalized = "_total_purchased_usdn_in_marketing_finalized"
61-
62-let keyTransferUsd = "_transfer_usd"
63-
64-let keyUserBoughtTicketsAmount = "_bought_tickets"
65-
66-let keyUserTickets = "_tickets_number"
67-
68-let keyUserAvailableAllocations = "_available_purchase_marketing"
69-
70-let keyUserAmountUSDNInMarketing = "_purchased_usdn_in_marketing"
71-
72-let keyUserBoughtAllocations = "_bought_allocations"
73-
74-let keyUserClaimStatus = "_claim_status"
75-
76-let keyUserWinnedTicketsAmount = "_tickets_result"
77-
78-let lauchpadDuration = 100
79-
80-let oracle = Address(base58'3NBBWfzZtZtszaXbitTKnrB2xXwv26Bn7H9')
81-
82-let governance = Address(base58'3N5W8da2iiijVieA6qLGo7KzCJj8B19smWU')
83-
84-let commissionWallet = Address(base58'3N2hBdeDEs7wCNA9EY8qv3B6drjgKD64xQG')
85-
86-let stakingUSDNAddress = Address(base58'3N6q7sCGSSLBUXDdjBdYGTJbZGZfhhh8cNg')
87-
88-let USDN = base58'8UrfDVd5GreeUwm7uPk7eYz1eMv376kzR52C6sANPkwS'
89-
90-let adminPubKeyStaking = base58'Kn7NpzaG12dLZgcHf2ipUftU6hbJygmrhFqQYE4B7ZK'
91-
92-let maxAllocationsAmount = 2
93-
94-let isActive = valueOrElse(getBoolean(this, keyActive), true)
95-
96-let activeLaunchpadId = valueOrElse(getIntegerValue(this, keyLaunchpadActiveId), -1)
9739
9840 func getAdminPub (keyAdminPub) = match getString(oracle, keyAdminPub) {
9941 case string: String =>
10951
11052 let adminPubKey3 = getAdminPub(keyAdminPubKey3)
11153
112-func getAssetInfo (assetId) = match assetId {
113- case id: ByteVector =>
114- let stringId = toBase58String(id)
115- let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
116- $Tuple3(stringId, info.name, info.decimals)
117- case waves: Unit =>
118- $Tuple3("WAVES", "WAVES", 8)
119- case _ =>
120- throw("Match error")
121-}
54+let adminPubKeyStaking = base58'Kn7NpzaG12dLZgcHf2ipUftU6hbJygmrhFqQYE4B7ZK'
55+
56+let swopId = fromBase58String(getStringValue(farming, keySWOPid))
57+
58+let isActive = valueOrElse(getBoolean(this, keyActive), true)
59+
60+func inListToStr (acc,next) = if ((acc == ""))
61+ then (acc + toString(next))
62+ else ((acc + ",") + toString(next))
12263
12364
124-func getLaunchpadNextId () = valueOrElse(getInteger(this, keyLaunchpadNextId), 1)
65+func inListToInt (acc,next) = (acc :+ parseIntValue(next))
12566
12667
127-func stakedUsdnAmount () = valueOrElse(getInteger(stakingUSDNAddress, ((("rpd_balance_" + toBase58String(USDN)) + "_") + toString(this))), 0)
68+func calcPrizesAmounts (acc,next) = {
69+ let $t016511676 = acc
70+ let total = $t016511676._1
71+ let result = $t016511676._2
72+ $Tuple2(total, (result :+ (total / next)))
73+ }
74+
75+
76+func calcLevel (burned) = {
77+ let levelPrices = {
78+ let $l = split(getStringValue(this, keyLevelPrices), ",")
79+ let $s = size($l)
80+ let $acc0 = nil
81+ func 1 ($a,$i) = if (($i >= $s))
82+ then $a
83+ else inListToInt($a, $l[$i])
84+
85+ func 2 ($a,$i) = if (($i >= $s))
86+ then $a
87+ else throw("List size exceeds 5")
88+
89+ 2(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5)
90+ }
91+ if ((levelPrices[3] >= burned))
92+ then 4
93+ else if ((levelPrices[2] >= burned))
94+ then 3
95+ else if ((levelPrices[1] >= burned))
96+ then 2
97+ else if ((levelPrices[0] >= burned))
98+ then 1
99+ else 0
100+ }
128101
129102
130103 @Callable(i)
131-func hashingRandom (launchpadId,hash) = if (!(isActive))
132- then throw("DApp is inactive at this moment")
133- else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
134- then throw("Only admin can call this function")
135- else [StringEntry((toString(launchpadId) + keyVerifyHash), hash)]
104+func init (endHeight,prizePrices,prizeAchievmentsIds,levelPrices,levelAchievmentsIds) = if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
105+ then throw("Only admin can call this function")
106+ else if (isDefined(getInteger(this, keyEndHeight)))
107+ then throw("DApp is already inited")
108+ else if ((height > endHeight))
109+ then throw("Burning ending must be greater than current height")
110+ else if (if ((size(prizePrices) != 5))
111+ then true
112+ else (size(prizeAchievmentsIds) != 5))
113+ then throw("Amount of prizes achievemts lists must equal to 5")
114+ else if (if ((size(levelPrices) != 4))
115+ then true
116+ else (size(levelAchievmentsIds) != 4))
117+ then throw("Amount of levels lists must equal to 4")
118+ else {
119+ let prizePricesStr = {
120+ let $l = prizePrices
121+ let $s = size($l)
122+ let $acc0 = ""
123+ func 1 ($a,$i) = if (($i >= $s))
124+ then $a
125+ else inListToStr($a, $l[$i])
126+
127+ func 2 ($a,$i) = if (($i >= $s))
128+ then $a
129+ else throw("List size exceeds 5")
130+
131+ 2(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5)
132+ }
133+ let prizeAchievmentsIdsStr = makeString(prizeAchievmentsIds, ",")
134+ let levelPricesStr = {
135+ let $l = levelPrices
136+ let $s = size($l)
137+ let $acc0 = ""
138+ func 1 ($a,$i) = if (($i >= $s))
139+ then $a
140+ else inListToStr($a, $l[$i])
141+
142+ func 2 ($a,$i) = if (($i >= $s))
143+ then $a
144+ else throw("List size exceeds 5")
145+
146+ 2(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5)
147+ }
148+ let levelAchievmentsIdsStr = makeString(levelAchievmentsIds, ",")
149+ let prizesAmountStr = "0,0,0,0,0"
150+[IntegerEntry(keyEndHeight, endHeight), StringEntry(keyPrizesPrices, prizePricesStr), StringEntry(keyPrizesAIds, prizeAchievmentsIdsStr), StringEntry(keyLevelPrices, levelPricesStr), StringEntry(keyLevelAchievemntsIds, levelAchievmentsIdsStr), StringEntry(keyPrizesAmounts, prizesAmountStr)]
151+ }
136152
137153
138154
139155 @Callable(i)
140-func initCaller (address) = if (!(isActive))
141- then throw("DApp is inactive at this moment")
142- else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
143- then throw("Only admin can call this function")
144- else [StringEntry(keyInitCaller, address)]
145-
146-
147-
148-@Callable(i)
149-func init (projectAddress,startHeight,commission,tokensPerTicket,pricePerToken,swopfiTicketsAmount,campaignTokensAmount,tokensPerAllocation,swopPerTicket) = {
150- let $t042004275 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
151- let pmtAmount = $t042004275._1
152- let pmtAssetId = $t042004275._2
156+func add () = {
157+ let $t035253600 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
158+ let pmtAmount = $t035253600._1
159+ let pmtAssetId = $t035253600._2
160+ let endHeight = valueOrElse(getInteger(this, keyEndHeight), 0)
153161 if (!(isActive))
154162 then throw("DApp is inactive at this moment")
155- else if ((toString(i.caller) != valueOrElse(getString(this, keyInitCaller), "")))
156- then throw("Only project admin can call init function")
157- else if ((size(i.payments) != 1))
158- then throw("One attached payment expected")
159- else if ((height > startHeight))
160- then throw("Start height must be greater than blockchain height")
161- else {
162- let $t047034776 = getAssetInfo(pmtAssetId)
163- let pmtStrAssetId = $t047034776._1
164- let pmtAssetName = $t047034776._2
165- let pmtDecimals = $t047034776._3
166- let launchpadId = getLaunchpadNextId()
167- let launchpadIdStr = toString(launchpadId)
168-[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, "")]
163+ else if (if ((height > endHeight))
164+ then true
165+ else (endHeight == 0))
166+ then throw("Swop burning are ended or not started yet")
167+ else if ((pmtAssetId != swopId))
168+ then throw("You can add only SWOP token")
169+ else {
170+ let newTotalBurned = (valueOrElse(getInteger(this, keyTotalBurned), 0) + pmtAmount)
171+ let userTotalBurned = valueOrElse(getInteger(this, (toString(i.caller) + keyUserTotalBurned)), 0)
172+ let prizesAmounts = {
173+ let $l = split(getStringValue(this, keyPrizesAmounts), ",")
174+ let $s = size($l)
175+ let $acc0 = nil
176+ func 1 ($a,$i) = if (($i >= $s))
177+ then $a
178+ else inListToInt($a, $l[$i])
179+
180+ func 2 ($a,$i) = if (($i >= $s))
181+ then $a
182+ else throw("List size exceeds 5")
183+
184+ 2(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5)
169185 }
186+ let prizesPrices = {
187+ let $l = split(getStringValue(this, keyPrizesPrices), ",")
188+ let $s = size($l)
189+ let $acc0 = nil
190+ func 1 ($a,$i) = if (($i >= $s))
191+ then $a
192+ else inListToInt($a, $l[$i])
193+
194+ func 2 ($a,$i) = if (($i >= $s))
195+ then $a
196+ else throw("List size exceeds 5")
197+
198+ 2(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5)
199+ }
200+ let prizesAchievementsIds = split(getStringValue(this, keyPrizesAIds), ",")
201+ let levelAchievementsIds = split(getStringValue(this, keyLevelAchievemntsIds), ",")
202+ let res = {
203+ let $l = prizesPrices
204+ let $s = size($l)
205+ let $acc0 = $Tuple2(newTotalBurned, nil)
206+ func 1 ($a,$i) = if (($i >= $s))
207+ then $a
208+ else calcPrizesAmounts($a, $l[$i])
209+
210+ func 2 ($a,$i) = if (($i >= $s))
211+ then $a
212+ else throw("List size exceeds 5")
213+
214+ 2(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5)
215+ }
216+ let newPrizesAmounts = res._2
217+ let newPrizesAmountsStr = {
218+ let $l = newPrizesAmounts
219+ let $s = size($l)
220+ let $acc0 = ""
221+ func 1 ($a,$i) = if (($i >= $s))
222+ then $a
223+ else inListToStr($a, $l[$i])
224+
225+ func 2 ($a,$i) = if (($i >= $s))
226+ then $a
227+ else throw("List size exceeds 5")
228+
229+ 2(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5)
230+ }
231+ let inv0 = if ((newPrizesAmounts[0] != prizesAmounts[0]))
232+ then {
233+ let achievementAmount = (newPrizesAmounts[0] - prizesAmounts[0])
234+ invoke(achievements, "add", [prizesAchievementsIds[0], achievementAmount], nil)
235+ }
236+ else 0
237+ if ((inv0 == inv0))
238+ then {
239+ let inv1 = if ((newPrizesAmounts[1] != prizesAmounts[1]))
240+ then {
241+ let achievementAmount = (newPrizesAmounts[1] - prizesAmounts[1])
242+ invoke(achievements, "add", [prizesAchievementsIds[1], achievementAmount], nil)
243+ }
244+ else 0
245+ if ((inv1 == inv1))
246+ then {
247+ let inv2 = if ((newPrizesAmounts[2] != prizesAmounts[2]))
248+ then {
249+ let achievementAmount = (newPrizesAmounts[2] - prizesAmounts[2])
250+ invoke(achievements, "add", [prizesAchievementsIds[2], achievementAmount], nil)
251+ }
252+ else 0
253+ if ((inv2 == inv2))
254+ then {
255+ let inv3 = if ((newPrizesAmounts[3] != prizesAmounts[3]))
256+ then {
257+ let achievementAmount = (newPrizesAmounts[3] - prizesAmounts[3])
258+ invoke(achievements, "add", [prizesAchievementsIds[3], achievementAmount], nil)
259+ }
260+ else 0
261+ if ((inv3 == inv3))
262+ then {
263+ let inv4 = if ((newPrizesAmounts[4] != prizesAmounts[4]))
264+ then {
265+ let achievementAmount = (newPrizesAmounts[4] - prizesAmounts[4])
266+ invoke(achievements, "add", [prizesAchievementsIds[4], achievementAmount], nil)
267+ }
268+ else 0
269+ if ((inv4 == inv4))
270+ then {
271+ let baseEntry = [IntegerEntry(keyTotalBurned, newTotalBurned), IntegerEntry((toString(i.caller) + keyUserTotalBurned), (userTotalBurned + pmtAmount)), StringEntry(keyPrizesAmounts, newPrizesAmountsStr)]
272+ let oldLevel = calcLevel(userTotalBurned)
273+ let newLevel = calcLevel(newTotalBurned)
274+ let levelDiff = (newLevel - oldLevel)
275+ if ((levelDiff > 0))
276+ then {
277+ let inv5 = if ((levelDiff == 1))
278+ then invoke(achievements, "add", [levelAchievementsIds[(newLevel - 1)], 1], nil)
279+ else 0
280+ if ((inv5 == inv5))
281+ then {
282+ let inv6 = if ((levelDiff >= 2))
283+ then invoke(achievements, "add", [levelAchievementsIds[(newLevel - 1)], 1], nil)
284+ else 0
285+ if ((inv6 == inv6))
286+ then {
287+ let inv7 = if ((levelDiff >= 3))
288+ then invoke(achievements, "add", [levelAchievementsIds[(newLevel - 1)], 1], nil)
289+ else 0
290+ if ((inv7 == inv7))
291+ then {
292+ let inv8 = if ((levelDiff == 4))
293+ then invoke(achievements, "add", [levelAchievementsIds[(newLevel - 1)], 1], nil)
294+ else 0
295+ if ((inv8 == inv8))
296+ then baseEntry
297+ else throw("Strict value is not equal to itself.")
298+ }
299+ else throw("Strict value is not equal to itself.")
300+ }
301+ else throw("Strict value is not equal to itself.")
302+ }
303+ else throw("Strict value is not equal to itself.")
304+ }
305+ else baseEntry
306+ }
307+ else throw("Strict value is not equal to itself.")
308+ }
309+ else throw("Strict value is not equal to itself.")
310+ }
311+ else throw("Strict value is not equal to itself.")
312+ }
313+ else throw("Strict value is not equal to itself.")
314+ }
315+ else throw("Strict value is not equal to itself.")
316+ }
170317 }
171318
172319
173320
174321 @Callable(i)
175-func commitSwopfiSale (launchpadId,refId) = {
176- let $t062706345 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
177- let pmtAmount = $t062706345._1
178- let pmtAssetId = $t062706345._2
179- let stakedSwops = valueOrElse(getInteger(governance, (toString(i.caller) + keyGovernanceStaked)), 0)
180- let allowedTicketsAmountAll = (stakedSwops / getIntegerValue(this, (toString(launchpadId) + keySwopPerTicket)))
181- let boughtTicketsAmount = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtTicketsAmount)), 0)
182- let allowedTicketsAmount = (allowedTicketsAmountAll - boughtTicketsAmount)
183- let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
184- let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
185- if (!(isActive))
186- then throw("DApp is inactive at this moment")
187- else if ((activeLaunchpadId != launchpadId))
188- then throw("There is no active launchpad or this launchpad is ended")
189- else if ((startHeight > height))
190- then throw("Launchpad sale not started yet")
191- else if ((height > (startHeight + duration)))
192- then throw("Launchpad sale ended")
193- else if (if ((size(i.payments) != 1))
194- then true
195- else (pmtAssetId != USDN))
196- then throw("One attached payment in USDN expected")
197- else if (if ((0 >= allowedTicketsAmountAll))
198- then true
199- else (0 >= allowedTicketsAmount))
200- then throw("Not enought SWOP in staking to buy tickets")
201- else {
202- let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
203- let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
204- let tokenId = fromBase58String(getStringValue(this, (toString(launchpadId) + keyAssetId)))
205- let $t078697945 = getAssetInfo(tokenId)
206- let tokenStrAssetId = $t078697945._1
207- let tokenAssetName = $t078697945._2
208- let tokenDecimals = $t078697945._3
209- let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
210- let commissionPerTicket = fraction(ticketPrice, getIntegerValue(this, (toString(launchpadId) + keyComission)), 100)
211- let buyTicketAmount = (pmtAmount / (ticketPrice + commissionPerTicket))
212- let allowedBuyTicketAmount = min([buyTicketAmount, allowedTicketsAmount])
213- let allowedBuyPriceWithComission = (allowedBuyTicketAmount * (ticketPrice + commissionPerTicket))
214- let change = (pmtAmount - allowedBuyPriceWithComission)
215- if ((buyTicketAmount == 0))
216- then throw("Not enought USDN to buy tickets")
217- else if ((change != 0))
218- then throw((((("Wrong payment. To buy " + toString(allowedBuyTicketAmount)) + "tickets you need to pay ") + toString(allowedBuyPriceWithComission)) + "USDN"))
219- else {
220- let userBoughtTicketsNumbers = valueOrElse(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserTickets)), "")
221- let lastBoughtTicketNumber = getIntegerValue(this, (toString(launchpadId) + keyTicketLastNumber))
222- let boughtRange = ((toString((lastBoughtTicketNumber + 1)) + "-") + toString((lastBoughtTicketNumber + allowedBuyTicketAmount)))
223- let newUserBoughtTicketsNumbers = (userBoughtTicketsNumbers + (if ((userBoughtTicketsNumbers != ""))
224- then ("," + boughtRange)
225- else ("" + boughtRange)))
226- let inv = invoke(stakingUSDNAddress, "lockNeutrino", nil, [AttachedPayment(pmtAssetId, pmtAmount)])
227- if ((inv == inv))
228- then {
229- 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)]
230- if (!(isDefined(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId)))))
231- then (baseEntry ++ [StringEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId), refId)])
232- else baseEntry
233- }
234- else throw("Strict value is not equal to itself.")
235- }
236- }
237- }
322+func hashingRandom (hash) = if (!(isActive))
323+ then throw("DApp is inactive at this moment")
324+ else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
325+ then throw("Only admin can call this function")
326+ else [StringEntry(keyVerifyHash, hash)]
238327
239328
240329
241330 @Callable(i)
242-func commitAccessListSale (launchpadId,refId) = {
243- let $t01026510340 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
244- let pmtAmount = $t01026510340._1
245- let pmtAssetId = $t01026510340._2
246- let userUsdnInMarketing = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserAmountUSDNInMarketing)), 0)
247- let usdnInMarketing = valueOrElse(getInteger(this, (toString(launchpadId) + keyAmountUSDNInMarketing)), 0)
248- let boughtAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtAllocations)), 0)
249- let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
250- let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
251- let tokensPerAllocation = getIntegerValue(this, (toString(launchpadId) + keyTokensPerAllocation))
252- let tokenId = fromBase58String(getStringValue(this, (toString(launchpadId) + keyAssetId)))
253- let $t01109511171 = getAssetInfo(tokenId)
254- let tokenStrAssetId = $t01109511171._1
255- let tokenAssetName = $t01109511171._2
256- let tokenDecimals = $t01109511171._3
257- let allocationPriceWithComission = fraction(fraction(tokenPrice, tokensPerAllocation, pow(10, 0, tokenDecimals, 0, 0, DOWN)), (100 + commission), 100)
258- let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
259- let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
260- if (!(isActive))
261- then throw("DApp is inactive at this moment")
262- else if ((activeLaunchpadId != launchpadId))
263- then throw("There is no active launchpad or this launchpad is ended")
264- else if ((startHeight > height))
265- then throw("Launchpad sale not started yet")
266- else if ((height > (startHeight + duration)))
267- then throw("Launchpad sale ended")
268- else if (if ((size(i.payments) != 1))
269- then true
270- else (pmtAssetId != USDN))
271- then throw("One attached payment in USDN expected")
272- else if ((boughtAllocations >= maxAllocationsAmount))
273- then throw((("You can buy only " + toString(maxAllocationsAmount)) + "allocations"))
274- else if (if ((allocationPriceWithComission != pmtAmount))
275- then ((allocationPriceWithComission * 2) != pmtAmount)
276- else false)
277- then throw((("Wrong payment. You can buy 1 or 2 allocations for " + toString(allocationPriceWithComission)) + " USDN per allocation"))
278- else {
279- let buyAllocationsAmount = (pmtAmount / allocationPriceWithComission)
280- let inv = invoke(stakingUSDNAddress, "lockNeutrino", nil, [AttachedPayment(pmtAssetId, pmtAmount)])
281- if ((inv == inv))
282- then {
283- let baseEntry = [IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtAllocations), (boughtAllocations + buyAllocationsAmount)), IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserAmountUSDNInMarketing), (userUsdnInMarketing + pmtAmount)), IntegerEntry((toString(launchpadId) + keyAmountUSDNInMarketing), (usdnInMarketing + pmtAmount))]
284- if (!(isDefined(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId)))))
285- then (baseEntry ++ [StringEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId), refId)])
286- else baseEntry
287- }
288- else throw("Strict value is not equal to itself.")
289- }
290- }
291-
292-
293-
294-@Callable(i)
295-func finalise (launchpadId,vrfHeight,secretWord) = {
296- let savedHash = getStringValue(this, (toString(launchpadId) + keyVerifyHash))
331+func finalize (vrfHeight,secretWord) = {
332+ let savedHash = getStringValue(this, keyVerifyHash)
297333 let calcHash = toBase58String(sha256((toBytes(vrfHeight) + toBytes(secretWord))))
298334 if (!(isActive))
299335 then throw("DApp is inactive at this moment")
302338 else if ((calcHash != savedHash))
303339 then throw("vrf Height hash not matching")
304340 else {
305- let projectAddress = addressFromStringValue(getStringValue(this, (toString(launchpadId) + keyAddress)))
306- let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
307- let transferedUsdn = valueOrElse(getInteger(this, (toString(launchpadId) + keyTransferUsd)), 0)
308- let swopfiMembersUsdnAmount = getIntegerValue(this, (toString(launchpadId) + keyTotalAmountUsdnSold))
309- let swopfiMembersComission = fraction(swopfiMembersUsdnAmount, commission, 100)
310- let totalAmountUsdnInMarketing = getIntegerValue(this, (toString(launchpadId) + keyAmountUSDNInMarketingFinalized))
311- let marketingComission = fraction(totalAmountUsdnInMarketing, commission, 100)
312- let unstakeAmount = (((swopfiMembersUsdnAmount + totalAmountUsdnInMarketing) + swopfiMembersComission) + marketingComission)
313- if ((transferedUsdn > (swopfiMembersUsdnAmount + totalAmountUsdnInMarketing)))
314- then throw("Can't transfer negative value to project")
315- else {
316- let inv = invoke(stakingUSDNAddress, "unlockNeutrino", [unstakeAmount, toBase58String(USDN)], nil)
317- if ((inv == inv))
318- then [IntegerEntry((toString(launchpadId) + keyFinaliseHeight), height), ScriptTransfer(projectAddress, ((swopfiMembersUsdnAmount + totalAmountUsdnInMarketing) - transferedUsdn), USDN), ScriptTransfer(commissionWallet, (swopfiMembersComission + marketingComission), USDN)]
319- else throw("Strict value is not equal to itself.")
320- }
341+ let burnAmount = getIntegerValue(this, keyTotalBurned)
342+[Burn(swopId, burnAmount), IntegerEntry(keyFinalizeHeight, height)]
321343 }
322344 }
323-
324-
325-
326-@Callable(i)
327-func claim (launchpadId) = {
328- let userClaimStatus = valueOrElse(getBoolean(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimStatus)), false)
329- let boughtTickets = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtTicketsAmount)), 0)
330- let boughtAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtAllocations)), 0)
331- if (!(isActive))
332- then throw("DApp is inactive at this moment")
333- else if (!(isDefined(getInteger(this, (toString(launchpadId) + keyFinaliseHeight)))))
334- then throw("You can't claim because results are not finalized")
335- else if (userClaimStatus)
336- then throw("You are already claimed")
337- else if (if ((boughtTickets == 0))
338- then (boughtAllocations == 0)
339- else false)
340- then throw("You can't claim because you don't buy anything")
341- else {
342- let tokenId = fromBase58String(getStringValue(this, (toString(launchpadId) + keyAssetId)))
343- let wonnedTickets = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserWinnedTicketsAmount)), 0)
344- let awailableAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserAvailableAllocations)), 0)
345- let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
346- let allowedAllocations = min([boughtAllocations, awailableAllocations])
347- let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
348- let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
349- let $t01694517021 = getAssetInfo(tokenId)
350- let tokenStrAssetId = $t01694517021._1
351- let tokenAssetName = $t01694517021._2
352- let tokenDecimals = $t01694517021._3
353- let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
354- let tokensPerAllocation = getIntegerValue(this, (toString(launchpadId) + keyTokensPerAllocation))
355- let transferTokensAmount = ((wonnedTickets * tokensPerTicket) + (allowedAllocations * tokensPerAllocation))
356- let notAllowedAllocationsTokens = ((boughtAllocations - allowedAllocations) * tokensPerAllocation)
357- let usdnForAllocations = fraction(fraction(notAllowedAllocationsTokens, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN)), (100 + commission), 100)
358- let usdnForUnwonnedTickets = fraction(((boughtTickets - wonnedTickets) * ticketPrice), (100 + commission), 100)
359- if (if ((0 > usdnForAllocations))
360- then true
361- else (0 > usdnForUnwonnedTickets))
362- then throw("Error with allowed allocation param or wonned tickets param please contact support")
363- else {
364- let returnedUsdnAmount = (usdnForAllocations + usdnForUnwonnedTickets)
365- let transferUsdn = if ((returnedUsdnAmount > 0))
366- then [ScriptTransfer(i.caller, returnedUsdnAmount, USDN)]
367- else nil
368- let transferTokens = if ((transferTokensAmount > 0))
369- then [ScriptTransfer(i.caller, transferTokensAmount, tokenId)]
370- else nil
371- let inv = if ((returnedUsdnAmount > 0))
372- then invoke(stakingUSDNAddress, "unlockNeutrino", [returnedUsdnAmount, toBase58String(USDN)], nil)
373- else 0
374- if ((inv == inv))
375- then (([BooleanEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimStatus), true)] ++ transferTokens) ++ transferUsdn)
376- else throw("Strict value is not equal to itself.")
377- }
378- }
379- }
380-
381-
382-
383-@Callable(i)
384-func transferUsd (launchpadId,amountUsdn) = if (!(isActive))
385- then throw("DApp is inactive")
386- else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
387- then throw("Only admin can call this function")
388- else {
389- let projectAddress = addressFromStringValue(getStringValue(this, (toString(launchpadId) + keyAddress)))
390-[IntegerEntry((toString(launchpadId) + keyTransferUsd), amountUsdn), ScriptTransfer(projectAddress, amountUsdn, USDN)]
391- }
392345
393346
394347
431384 then true
432385 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKeyStaking)
433386 match tx {
434- case dtx: DataTransaction =>
435- if (valueOrElse(getBoolean(oracle, keyLaunchpadDataTransactionStatus), false))
436- then signedByAdmin
437- else false
438387 case _ =>
439388 multiSignedByAdmins
440389 }
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let keyActive = "active"
5+
6+let keyEndHeight = "end_height"
7+
8+let keyPrizesPrices = "prizes_prices"
9+
10+let keyPrizesAIds = "prizes_achievements_ids"
11+
12+let keyPrizesAmounts = "prizes_amount"
13+
14+let keyLevelPrices = "level_prices"
15+
16+let keyLevelAchievemntsIds = "level_achievements_ids"
17+
18+let keySWOPid = "SWOP_id"
19+
20+let keyTotalBurned = "total_burned"
21+
22+let keyVerifyHash = "verify_hash"
23+
24+let keyFinalizeHeight = "finalize_height"
25+
26+let keyUserTotalBurned = "_total_burned"
27+
28+let oracle = Address(base58'3NBBWfzZtZtszaXbitTKnrB2xXwv26Bn7H9')
29+
30+let farming = Address(base58'3MsxHxruYWoddB4HRiPBYAWtMXMtCF1V9XT')
31+
32+let achievements = Address(base58'3N3HtdnBkqSSc16DaydiwtrMBUv3DfqKjSW')
533
634 let keyAdminPubKey1 = "admin_pub_1"
735
836 let keyAdminPubKey2 = "admin_pub_2"
937
1038 let keyAdminPubKey3 = "admin_pub_3"
11-
12-let keyLaunchpadDataTransactionStatus = "launchpad_data_transaction_status"
13-
14-let keyLaunchpadNextId = "launchpad_next_id"
15-
16-let keyLaunchpadActiveId = "launchpad_active_id"
17-
18-let keyInitCaller = "init_caller"
19-
20-let keyAddress = "_address"
21-
22-let keyInitHeight = "_init_height"
23-
24-let keyStartHeight = "_start_height"
25-
26-let keyFinaliseHeight = "_finalise_height"
27-
28-let keyComission = "_comission"
29-
30-let keyAssetId = "_asset_id"
31-
32-let keyTotalTokenAmount = "_total_token_amount"
33-
34-let keyTotalAmountUsdnSold = "_total_usdn_sold"
35-
36-let keyTokensPerTicket = "_tokens_per_ticket"
37-
38-let keyPricePerToken = "_price_per_token"
39-
40-let keySwopPerTicket = "_swop_per_ticket"
41-
42-let keySwopfiTicketsAmount = "_tickets_swopfi_members"
43-
44-let keyCampaignTokensAmount = "_tokens_access_list"
45-
46-let keyTokensPerAllocation = "_tokens_per_allocation"
47-
48-let keyTicketLastNumber = "_ticket_last_number"
49-
50-let keyGovernanceStaked = "_SWOP_amount"
51-
52-let keyUserRefId = "_ref_id"
53-
54-let keyVerifyHash = "_verify_hash"
55-
56-let keyDuration = "_duration"
57-
58-let keyAmountUSDNInMarketing = "_total_purchased_usdn_in_marketing"
59-
60-let keyAmountUSDNInMarketingFinalized = "_total_purchased_usdn_in_marketing_finalized"
61-
62-let keyTransferUsd = "_transfer_usd"
63-
64-let keyUserBoughtTicketsAmount = "_bought_tickets"
65-
66-let keyUserTickets = "_tickets_number"
67-
68-let keyUserAvailableAllocations = "_available_purchase_marketing"
69-
70-let keyUserAmountUSDNInMarketing = "_purchased_usdn_in_marketing"
71-
72-let keyUserBoughtAllocations = "_bought_allocations"
73-
74-let keyUserClaimStatus = "_claim_status"
75-
76-let keyUserWinnedTicketsAmount = "_tickets_result"
77-
78-let lauchpadDuration = 100
79-
80-let oracle = Address(base58'3NBBWfzZtZtszaXbitTKnrB2xXwv26Bn7H9')
81-
82-let governance = Address(base58'3N5W8da2iiijVieA6qLGo7KzCJj8B19smWU')
83-
84-let commissionWallet = Address(base58'3N2hBdeDEs7wCNA9EY8qv3B6drjgKD64xQG')
85-
86-let stakingUSDNAddress = Address(base58'3N6q7sCGSSLBUXDdjBdYGTJbZGZfhhh8cNg')
87-
88-let USDN = base58'8UrfDVd5GreeUwm7uPk7eYz1eMv376kzR52C6sANPkwS'
89-
90-let adminPubKeyStaking = base58'Kn7NpzaG12dLZgcHf2ipUftU6hbJygmrhFqQYE4B7ZK'
91-
92-let maxAllocationsAmount = 2
93-
94-let isActive = valueOrElse(getBoolean(this, keyActive), true)
95-
96-let activeLaunchpadId = valueOrElse(getIntegerValue(this, keyLaunchpadActiveId), -1)
9739
9840 func getAdminPub (keyAdminPub) = match getString(oracle, keyAdminPub) {
9941 case string: String =>
10042 fromBase58String(string)
10143 case nothing =>
10244 throw("Admin public key is empty")
10345 }
10446
10547
10648 let adminPubKey1 = getAdminPub(keyAdminPubKey1)
10749
10850 let adminPubKey2 = getAdminPub(keyAdminPubKey2)
10951
11052 let adminPubKey3 = getAdminPub(keyAdminPubKey3)
11153
112-func getAssetInfo (assetId) = match assetId {
113- case id: ByteVector =>
114- let stringId = toBase58String(id)
115- let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
116- $Tuple3(stringId, info.name, info.decimals)
117- case waves: Unit =>
118- $Tuple3("WAVES", "WAVES", 8)
119- case _ =>
120- throw("Match error")
121-}
54+let adminPubKeyStaking = base58'Kn7NpzaG12dLZgcHf2ipUftU6hbJygmrhFqQYE4B7ZK'
55+
56+let swopId = fromBase58String(getStringValue(farming, keySWOPid))
57+
58+let isActive = valueOrElse(getBoolean(this, keyActive), true)
59+
60+func inListToStr (acc,next) = if ((acc == ""))
61+ then (acc + toString(next))
62+ else ((acc + ",") + toString(next))
12263
12364
124-func getLaunchpadNextId () = valueOrElse(getInteger(this, keyLaunchpadNextId), 1)
65+func inListToInt (acc,next) = (acc :+ parseIntValue(next))
12566
12667
127-func stakedUsdnAmount () = valueOrElse(getInteger(stakingUSDNAddress, ((("rpd_balance_" + toBase58String(USDN)) + "_") + toString(this))), 0)
68+func calcPrizesAmounts (acc,next) = {
69+ let $t016511676 = acc
70+ let total = $t016511676._1
71+ let result = $t016511676._2
72+ $Tuple2(total, (result :+ (total / next)))
73+ }
74+
75+
76+func calcLevel (burned) = {
77+ let levelPrices = {
78+ let $l = split(getStringValue(this, keyLevelPrices), ",")
79+ let $s = size($l)
80+ let $acc0 = nil
81+ func 1 ($a,$i) = if (($i >= $s))
82+ then $a
83+ else inListToInt($a, $l[$i])
84+
85+ func 2 ($a,$i) = if (($i >= $s))
86+ then $a
87+ else throw("List size exceeds 5")
88+
89+ 2(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5)
90+ }
91+ if ((levelPrices[3] >= burned))
92+ then 4
93+ else if ((levelPrices[2] >= burned))
94+ then 3
95+ else if ((levelPrices[1] >= burned))
96+ then 2
97+ else if ((levelPrices[0] >= burned))
98+ then 1
99+ else 0
100+ }
128101
129102
130103 @Callable(i)
131-func hashingRandom (launchpadId,hash) = if (!(isActive))
132- then throw("DApp is inactive at this moment")
133- else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
134- then throw("Only admin can call this function")
135- else [StringEntry((toString(launchpadId) + keyVerifyHash), hash)]
104+func init (endHeight,prizePrices,prizeAchievmentsIds,levelPrices,levelAchievmentsIds) = if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
105+ then throw("Only admin can call this function")
106+ else if (isDefined(getInteger(this, keyEndHeight)))
107+ then throw("DApp is already inited")
108+ else if ((height > endHeight))
109+ then throw("Burning ending must be greater than current height")
110+ else if (if ((size(prizePrices) != 5))
111+ then true
112+ else (size(prizeAchievmentsIds) != 5))
113+ then throw("Amount of prizes achievemts lists must equal to 5")
114+ else if (if ((size(levelPrices) != 4))
115+ then true
116+ else (size(levelAchievmentsIds) != 4))
117+ then throw("Amount of levels lists must equal to 4")
118+ else {
119+ let prizePricesStr = {
120+ let $l = prizePrices
121+ let $s = size($l)
122+ let $acc0 = ""
123+ func 1 ($a,$i) = if (($i >= $s))
124+ then $a
125+ else inListToStr($a, $l[$i])
126+
127+ func 2 ($a,$i) = if (($i >= $s))
128+ then $a
129+ else throw("List size exceeds 5")
130+
131+ 2(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5)
132+ }
133+ let prizeAchievmentsIdsStr = makeString(prizeAchievmentsIds, ",")
134+ let levelPricesStr = {
135+ let $l = levelPrices
136+ let $s = size($l)
137+ let $acc0 = ""
138+ func 1 ($a,$i) = if (($i >= $s))
139+ then $a
140+ else inListToStr($a, $l[$i])
141+
142+ func 2 ($a,$i) = if (($i >= $s))
143+ then $a
144+ else throw("List size exceeds 5")
145+
146+ 2(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5)
147+ }
148+ let levelAchievmentsIdsStr = makeString(levelAchievmentsIds, ",")
149+ let prizesAmountStr = "0,0,0,0,0"
150+[IntegerEntry(keyEndHeight, endHeight), StringEntry(keyPrizesPrices, prizePricesStr), StringEntry(keyPrizesAIds, prizeAchievmentsIdsStr), StringEntry(keyLevelPrices, levelPricesStr), StringEntry(keyLevelAchievemntsIds, levelAchievmentsIdsStr), StringEntry(keyPrizesAmounts, prizesAmountStr)]
151+ }
136152
137153
138154
139155 @Callable(i)
140-func initCaller (address) = if (!(isActive))
141- then throw("DApp is inactive at this moment")
142- else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
143- then throw("Only admin can call this function")
144- else [StringEntry(keyInitCaller, address)]
145-
146-
147-
148-@Callable(i)
149-func init (projectAddress,startHeight,commission,tokensPerTicket,pricePerToken,swopfiTicketsAmount,campaignTokensAmount,tokensPerAllocation,swopPerTicket) = {
150- let $t042004275 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
151- let pmtAmount = $t042004275._1
152- let pmtAssetId = $t042004275._2
156+func add () = {
157+ let $t035253600 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
158+ let pmtAmount = $t035253600._1
159+ let pmtAssetId = $t035253600._2
160+ let endHeight = valueOrElse(getInteger(this, keyEndHeight), 0)
153161 if (!(isActive))
154162 then throw("DApp is inactive at this moment")
155- else if ((toString(i.caller) != valueOrElse(getString(this, keyInitCaller), "")))
156- then throw("Only project admin can call init function")
157- else if ((size(i.payments) != 1))
158- then throw("One attached payment expected")
159- else if ((height > startHeight))
160- then throw("Start height must be greater than blockchain height")
161- else {
162- let $t047034776 = getAssetInfo(pmtAssetId)
163- let pmtStrAssetId = $t047034776._1
164- let pmtAssetName = $t047034776._2
165- let pmtDecimals = $t047034776._3
166- let launchpadId = getLaunchpadNextId()
167- let launchpadIdStr = toString(launchpadId)
168-[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, "")]
163+ else if (if ((height > endHeight))
164+ then true
165+ else (endHeight == 0))
166+ then throw("Swop burning are ended or not started yet")
167+ else if ((pmtAssetId != swopId))
168+ then throw("You can add only SWOP token")
169+ else {
170+ let newTotalBurned = (valueOrElse(getInteger(this, keyTotalBurned), 0) + pmtAmount)
171+ let userTotalBurned = valueOrElse(getInteger(this, (toString(i.caller) + keyUserTotalBurned)), 0)
172+ let prizesAmounts = {
173+ let $l = split(getStringValue(this, keyPrizesAmounts), ",")
174+ let $s = size($l)
175+ let $acc0 = nil
176+ func 1 ($a,$i) = if (($i >= $s))
177+ then $a
178+ else inListToInt($a, $l[$i])
179+
180+ func 2 ($a,$i) = if (($i >= $s))
181+ then $a
182+ else throw("List size exceeds 5")
183+
184+ 2(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5)
169185 }
186+ let prizesPrices = {
187+ let $l = split(getStringValue(this, keyPrizesPrices), ",")
188+ let $s = size($l)
189+ let $acc0 = nil
190+ func 1 ($a,$i) = if (($i >= $s))
191+ then $a
192+ else inListToInt($a, $l[$i])
193+
194+ func 2 ($a,$i) = if (($i >= $s))
195+ then $a
196+ else throw("List size exceeds 5")
197+
198+ 2(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5)
199+ }
200+ let prizesAchievementsIds = split(getStringValue(this, keyPrizesAIds), ",")
201+ let levelAchievementsIds = split(getStringValue(this, keyLevelAchievemntsIds), ",")
202+ let res = {
203+ let $l = prizesPrices
204+ let $s = size($l)
205+ let $acc0 = $Tuple2(newTotalBurned, nil)
206+ func 1 ($a,$i) = if (($i >= $s))
207+ then $a
208+ else calcPrizesAmounts($a, $l[$i])
209+
210+ func 2 ($a,$i) = if (($i >= $s))
211+ then $a
212+ else throw("List size exceeds 5")
213+
214+ 2(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5)
215+ }
216+ let newPrizesAmounts = res._2
217+ let newPrizesAmountsStr = {
218+ let $l = newPrizesAmounts
219+ let $s = size($l)
220+ let $acc0 = ""
221+ func 1 ($a,$i) = if (($i >= $s))
222+ then $a
223+ else inListToStr($a, $l[$i])
224+
225+ func 2 ($a,$i) = if (($i >= $s))
226+ then $a
227+ else throw("List size exceeds 5")
228+
229+ 2(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5)
230+ }
231+ let inv0 = if ((newPrizesAmounts[0] != prizesAmounts[0]))
232+ then {
233+ let achievementAmount = (newPrizesAmounts[0] - prizesAmounts[0])
234+ invoke(achievements, "add", [prizesAchievementsIds[0], achievementAmount], nil)
235+ }
236+ else 0
237+ if ((inv0 == inv0))
238+ then {
239+ let inv1 = if ((newPrizesAmounts[1] != prizesAmounts[1]))
240+ then {
241+ let achievementAmount = (newPrizesAmounts[1] - prizesAmounts[1])
242+ invoke(achievements, "add", [prizesAchievementsIds[1], achievementAmount], nil)
243+ }
244+ else 0
245+ if ((inv1 == inv1))
246+ then {
247+ let inv2 = if ((newPrizesAmounts[2] != prizesAmounts[2]))
248+ then {
249+ let achievementAmount = (newPrizesAmounts[2] - prizesAmounts[2])
250+ invoke(achievements, "add", [prizesAchievementsIds[2], achievementAmount], nil)
251+ }
252+ else 0
253+ if ((inv2 == inv2))
254+ then {
255+ let inv3 = if ((newPrizesAmounts[3] != prizesAmounts[3]))
256+ then {
257+ let achievementAmount = (newPrizesAmounts[3] - prizesAmounts[3])
258+ invoke(achievements, "add", [prizesAchievementsIds[3], achievementAmount], nil)
259+ }
260+ else 0
261+ if ((inv3 == inv3))
262+ then {
263+ let inv4 = if ((newPrizesAmounts[4] != prizesAmounts[4]))
264+ then {
265+ let achievementAmount = (newPrizesAmounts[4] - prizesAmounts[4])
266+ invoke(achievements, "add", [prizesAchievementsIds[4], achievementAmount], nil)
267+ }
268+ else 0
269+ if ((inv4 == inv4))
270+ then {
271+ let baseEntry = [IntegerEntry(keyTotalBurned, newTotalBurned), IntegerEntry((toString(i.caller) + keyUserTotalBurned), (userTotalBurned + pmtAmount)), StringEntry(keyPrizesAmounts, newPrizesAmountsStr)]
272+ let oldLevel = calcLevel(userTotalBurned)
273+ let newLevel = calcLevel(newTotalBurned)
274+ let levelDiff = (newLevel - oldLevel)
275+ if ((levelDiff > 0))
276+ then {
277+ let inv5 = if ((levelDiff == 1))
278+ then invoke(achievements, "add", [levelAchievementsIds[(newLevel - 1)], 1], nil)
279+ else 0
280+ if ((inv5 == inv5))
281+ then {
282+ let inv6 = if ((levelDiff >= 2))
283+ then invoke(achievements, "add", [levelAchievementsIds[(newLevel - 1)], 1], nil)
284+ else 0
285+ if ((inv6 == inv6))
286+ then {
287+ let inv7 = if ((levelDiff >= 3))
288+ then invoke(achievements, "add", [levelAchievementsIds[(newLevel - 1)], 1], nil)
289+ else 0
290+ if ((inv7 == inv7))
291+ then {
292+ let inv8 = if ((levelDiff == 4))
293+ then invoke(achievements, "add", [levelAchievementsIds[(newLevel - 1)], 1], nil)
294+ else 0
295+ if ((inv8 == inv8))
296+ then baseEntry
297+ else throw("Strict value is not equal to itself.")
298+ }
299+ else throw("Strict value is not equal to itself.")
300+ }
301+ else throw("Strict value is not equal to itself.")
302+ }
303+ else throw("Strict value is not equal to itself.")
304+ }
305+ else baseEntry
306+ }
307+ else throw("Strict value is not equal to itself.")
308+ }
309+ else throw("Strict value is not equal to itself.")
310+ }
311+ else throw("Strict value is not equal to itself.")
312+ }
313+ else throw("Strict value is not equal to itself.")
314+ }
315+ else throw("Strict value is not equal to itself.")
316+ }
170317 }
171318
172319
173320
174321 @Callable(i)
175-func commitSwopfiSale (launchpadId,refId) = {
176- let $t062706345 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
177- let pmtAmount = $t062706345._1
178- let pmtAssetId = $t062706345._2
179- let stakedSwops = valueOrElse(getInteger(governance, (toString(i.caller) + keyGovernanceStaked)), 0)
180- let allowedTicketsAmountAll = (stakedSwops / getIntegerValue(this, (toString(launchpadId) + keySwopPerTicket)))
181- let boughtTicketsAmount = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtTicketsAmount)), 0)
182- let allowedTicketsAmount = (allowedTicketsAmountAll - boughtTicketsAmount)
183- let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
184- let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
185- if (!(isActive))
186- then throw("DApp is inactive at this moment")
187- else if ((activeLaunchpadId != launchpadId))
188- then throw("There is no active launchpad or this launchpad is ended")
189- else if ((startHeight > height))
190- then throw("Launchpad sale not started yet")
191- else if ((height > (startHeight + duration)))
192- then throw("Launchpad sale ended")
193- else if (if ((size(i.payments) != 1))
194- then true
195- else (pmtAssetId != USDN))
196- then throw("One attached payment in USDN expected")
197- else if (if ((0 >= allowedTicketsAmountAll))
198- then true
199- else (0 >= allowedTicketsAmount))
200- then throw("Not enought SWOP in staking to buy tickets")
201- else {
202- let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
203- let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
204- let tokenId = fromBase58String(getStringValue(this, (toString(launchpadId) + keyAssetId)))
205- let $t078697945 = getAssetInfo(tokenId)
206- let tokenStrAssetId = $t078697945._1
207- let tokenAssetName = $t078697945._2
208- let tokenDecimals = $t078697945._3
209- let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
210- let commissionPerTicket = fraction(ticketPrice, getIntegerValue(this, (toString(launchpadId) + keyComission)), 100)
211- let buyTicketAmount = (pmtAmount / (ticketPrice + commissionPerTicket))
212- let allowedBuyTicketAmount = min([buyTicketAmount, allowedTicketsAmount])
213- let allowedBuyPriceWithComission = (allowedBuyTicketAmount * (ticketPrice + commissionPerTicket))
214- let change = (pmtAmount - allowedBuyPriceWithComission)
215- if ((buyTicketAmount == 0))
216- then throw("Not enought USDN to buy tickets")
217- else if ((change != 0))
218- then throw((((("Wrong payment. To buy " + toString(allowedBuyTicketAmount)) + "tickets you need to pay ") + toString(allowedBuyPriceWithComission)) + "USDN"))
219- else {
220- let userBoughtTicketsNumbers = valueOrElse(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserTickets)), "")
221- let lastBoughtTicketNumber = getIntegerValue(this, (toString(launchpadId) + keyTicketLastNumber))
222- let boughtRange = ((toString((lastBoughtTicketNumber + 1)) + "-") + toString((lastBoughtTicketNumber + allowedBuyTicketAmount)))
223- let newUserBoughtTicketsNumbers = (userBoughtTicketsNumbers + (if ((userBoughtTicketsNumbers != ""))
224- then ("," + boughtRange)
225- else ("" + boughtRange)))
226- let inv = invoke(stakingUSDNAddress, "lockNeutrino", nil, [AttachedPayment(pmtAssetId, pmtAmount)])
227- if ((inv == inv))
228- then {
229- 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)]
230- if (!(isDefined(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId)))))
231- then (baseEntry ++ [StringEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId), refId)])
232- else baseEntry
233- }
234- else throw("Strict value is not equal to itself.")
235- }
236- }
237- }
322+func hashingRandom (hash) = if (!(isActive))
323+ then throw("DApp is inactive at this moment")
324+ else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
325+ then throw("Only admin can call this function")
326+ else [StringEntry(keyVerifyHash, hash)]
238327
239328
240329
241330 @Callable(i)
242-func commitAccessListSale (launchpadId,refId) = {
243- let $t01026510340 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
244- let pmtAmount = $t01026510340._1
245- let pmtAssetId = $t01026510340._2
246- let userUsdnInMarketing = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserAmountUSDNInMarketing)), 0)
247- let usdnInMarketing = valueOrElse(getInteger(this, (toString(launchpadId) + keyAmountUSDNInMarketing)), 0)
248- let boughtAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtAllocations)), 0)
249- let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
250- let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
251- let tokensPerAllocation = getIntegerValue(this, (toString(launchpadId) + keyTokensPerAllocation))
252- let tokenId = fromBase58String(getStringValue(this, (toString(launchpadId) + keyAssetId)))
253- let $t01109511171 = getAssetInfo(tokenId)
254- let tokenStrAssetId = $t01109511171._1
255- let tokenAssetName = $t01109511171._2
256- let tokenDecimals = $t01109511171._3
257- let allocationPriceWithComission = fraction(fraction(tokenPrice, tokensPerAllocation, pow(10, 0, tokenDecimals, 0, 0, DOWN)), (100 + commission), 100)
258- let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
259- let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
260- if (!(isActive))
261- then throw("DApp is inactive at this moment")
262- else if ((activeLaunchpadId != launchpadId))
263- then throw("There is no active launchpad or this launchpad is ended")
264- else if ((startHeight > height))
265- then throw("Launchpad sale not started yet")
266- else if ((height > (startHeight + duration)))
267- then throw("Launchpad sale ended")
268- else if (if ((size(i.payments) != 1))
269- then true
270- else (pmtAssetId != USDN))
271- then throw("One attached payment in USDN expected")
272- else if ((boughtAllocations >= maxAllocationsAmount))
273- then throw((("You can buy only " + toString(maxAllocationsAmount)) + "allocations"))
274- else if (if ((allocationPriceWithComission != pmtAmount))
275- then ((allocationPriceWithComission * 2) != pmtAmount)
276- else false)
277- then throw((("Wrong payment. You can buy 1 or 2 allocations for " + toString(allocationPriceWithComission)) + " USDN per allocation"))
278- else {
279- let buyAllocationsAmount = (pmtAmount / allocationPriceWithComission)
280- let inv = invoke(stakingUSDNAddress, "lockNeutrino", nil, [AttachedPayment(pmtAssetId, pmtAmount)])
281- if ((inv == inv))
282- then {
283- let baseEntry = [IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtAllocations), (boughtAllocations + buyAllocationsAmount)), IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserAmountUSDNInMarketing), (userUsdnInMarketing + pmtAmount)), IntegerEntry((toString(launchpadId) + keyAmountUSDNInMarketing), (usdnInMarketing + pmtAmount))]
284- if (!(isDefined(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId)))))
285- then (baseEntry ++ [StringEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId), refId)])
286- else baseEntry
287- }
288- else throw("Strict value is not equal to itself.")
289- }
290- }
291-
292-
293-
294-@Callable(i)
295-func finalise (launchpadId,vrfHeight,secretWord) = {
296- let savedHash = getStringValue(this, (toString(launchpadId) + keyVerifyHash))
331+func finalize (vrfHeight,secretWord) = {
332+ let savedHash = getStringValue(this, keyVerifyHash)
297333 let calcHash = toBase58String(sha256((toBytes(vrfHeight) + toBytes(secretWord))))
298334 if (!(isActive))
299335 then throw("DApp is inactive at this moment")
300336 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
301337 then throw("Only admin can call this function")
302338 else if ((calcHash != savedHash))
303339 then throw("vrf Height hash not matching")
304340 else {
305- let projectAddress = addressFromStringValue(getStringValue(this, (toString(launchpadId) + keyAddress)))
306- let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
307- let transferedUsdn = valueOrElse(getInteger(this, (toString(launchpadId) + keyTransferUsd)), 0)
308- let swopfiMembersUsdnAmount = getIntegerValue(this, (toString(launchpadId) + keyTotalAmountUsdnSold))
309- let swopfiMembersComission = fraction(swopfiMembersUsdnAmount, commission, 100)
310- let totalAmountUsdnInMarketing = getIntegerValue(this, (toString(launchpadId) + keyAmountUSDNInMarketingFinalized))
311- let marketingComission = fraction(totalAmountUsdnInMarketing, commission, 100)
312- let unstakeAmount = (((swopfiMembersUsdnAmount + totalAmountUsdnInMarketing) + swopfiMembersComission) + marketingComission)
313- if ((transferedUsdn > (swopfiMembersUsdnAmount + totalAmountUsdnInMarketing)))
314- then throw("Can't transfer negative value to project")
315- else {
316- let inv = invoke(stakingUSDNAddress, "unlockNeutrino", [unstakeAmount, toBase58String(USDN)], nil)
317- if ((inv == inv))
318- then [IntegerEntry((toString(launchpadId) + keyFinaliseHeight), height), ScriptTransfer(projectAddress, ((swopfiMembersUsdnAmount + totalAmountUsdnInMarketing) - transferedUsdn), USDN), ScriptTransfer(commissionWallet, (swopfiMembersComission + marketingComission), USDN)]
319- else throw("Strict value is not equal to itself.")
320- }
341+ let burnAmount = getIntegerValue(this, keyTotalBurned)
342+[Burn(swopId, burnAmount), IntegerEntry(keyFinalizeHeight, height)]
321343 }
322344 }
323-
324-
325-
326-@Callable(i)
327-func claim (launchpadId) = {
328- let userClaimStatus = valueOrElse(getBoolean(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimStatus)), false)
329- let boughtTickets = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtTicketsAmount)), 0)
330- let boughtAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtAllocations)), 0)
331- if (!(isActive))
332- then throw("DApp is inactive at this moment")
333- else if (!(isDefined(getInteger(this, (toString(launchpadId) + keyFinaliseHeight)))))
334- then throw("You can't claim because results are not finalized")
335- else if (userClaimStatus)
336- then throw("You are already claimed")
337- else if (if ((boughtTickets == 0))
338- then (boughtAllocations == 0)
339- else false)
340- then throw("You can't claim because you don't buy anything")
341- else {
342- let tokenId = fromBase58String(getStringValue(this, (toString(launchpadId) + keyAssetId)))
343- let wonnedTickets = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserWinnedTicketsAmount)), 0)
344- let awailableAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserAvailableAllocations)), 0)
345- let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
346- let allowedAllocations = min([boughtAllocations, awailableAllocations])
347- let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
348- let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
349- let $t01694517021 = getAssetInfo(tokenId)
350- let tokenStrAssetId = $t01694517021._1
351- let tokenAssetName = $t01694517021._2
352- let tokenDecimals = $t01694517021._3
353- let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
354- let tokensPerAllocation = getIntegerValue(this, (toString(launchpadId) + keyTokensPerAllocation))
355- let transferTokensAmount = ((wonnedTickets * tokensPerTicket) + (allowedAllocations * tokensPerAllocation))
356- let notAllowedAllocationsTokens = ((boughtAllocations - allowedAllocations) * tokensPerAllocation)
357- let usdnForAllocations = fraction(fraction(notAllowedAllocationsTokens, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN)), (100 + commission), 100)
358- let usdnForUnwonnedTickets = fraction(((boughtTickets - wonnedTickets) * ticketPrice), (100 + commission), 100)
359- if (if ((0 > usdnForAllocations))
360- then true
361- else (0 > usdnForUnwonnedTickets))
362- then throw("Error with allowed allocation param or wonned tickets param please contact support")
363- else {
364- let returnedUsdnAmount = (usdnForAllocations + usdnForUnwonnedTickets)
365- let transferUsdn = if ((returnedUsdnAmount > 0))
366- then [ScriptTransfer(i.caller, returnedUsdnAmount, USDN)]
367- else nil
368- let transferTokens = if ((transferTokensAmount > 0))
369- then [ScriptTransfer(i.caller, transferTokensAmount, tokenId)]
370- else nil
371- let inv = if ((returnedUsdnAmount > 0))
372- then invoke(stakingUSDNAddress, "unlockNeutrino", [returnedUsdnAmount, toBase58String(USDN)], nil)
373- else 0
374- if ((inv == inv))
375- then (([BooleanEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimStatus), true)] ++ transferTokens) ++ transferUsdn)
376- else throw("Strict value is not equal to itself.")
377- }
378- }
379- }
380-
381-
382-
383-@Callable(i)
384-func transferUsd (launchpadId,amountUsdn) = if (!(isActive))
385- then throw("DApp is inactive")
386- else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
387- then throw("Only admin can call this function")
388- else {
389- let projectAddress = addressFromStringValue(getStringValue(this, (toString(launchpadId) + keyAddress)))
390-[IntegerEntry((toString(launchpadId) + keyTransferUsd), amountUsdn), ScriptTransfer(projectAddress, amountUsdn, USDN)]
391- }
392345
393346
394347
395348 @Callable(i)
396349 func shutdown () = if (!(isActive))
397350 then throw("DApp already inactive")
398351 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
399352 then throw("Only admin can call this function")
400353 else [BooleanEntry(keyActive, false)]
401354
402355
403356
404357 @Callable(i)
405358 func activate () = if (isActive)
406359 then throw("DApp already active")
407360 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
408361 then throw("Only admin can call this function")
409362 else [BooleanEntry(keyActive, true)]
410363
411364
412365 @Verifier(tx)
413366 func verify () = {
414367 let multiSignedByAdmins = {
415368 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
416369 then 1
417370 else 0
418371 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
419372 then 1
420373 else 0
421374 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
422375 then 1
423376 else 0
424377 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
425378 }
426379 let signedByAdmin = if (if (if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
427380 then true
428381 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey2))
429382 then true
430383 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey3))
431384 then true
432385 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKeyStaking)
433386 match tx {
434- case dtx: DataTransaction =>
435- if (valueOrElse(getBoolean(oracle, keyLaunchpadDataTransactionStatus), false))
436- then signedByAdmin
437- else false
438387 case _ =>
439388 multiSignedByAdmins
440389 }
441390 }
442391

github/deemru/w8io/873ac7e 
96.76 ms