tx · APELtinjFmh2Zxpzzae6ctvjn35HkyCu3Wk11ZLz7P2g 3P3fbwPmK2QMq1Qo8tkYdXjP3KXhY4nMTTq: -0.01400000 Waves 2022.03.31 20:27 [3053605] smart account 3P3fbwPmK2QMq1Qo8tkYdXjP3KXhY4nMTTq > SELF 0.00000000 Waves
{ "type": 13, "id": "APELtinjFmh2Zxpzzae6ctvjn35HkyCu3Wk11ZLz7P2g", "fee": 1400000, "feeAssetId": null, "timestamp": 1648747675860, "version": 2, "chainId": 87, "sender": "3P3fbwPmK2QMq1Qo8tkYdXjP3KXhY4nMTTq", "senderPublicKey": "8ciTzmMSuF3wZMbHd7VqUrY1oA7ZvwHPGa3REvo51bfZ", "proofs": [ "3YEr8x6VvrzB9vJSfGEWLRVdjtYt5seJ3GsS46BvuaVhco6eX3j8vJ2FKZUCn6MMyqwXNdQ7vku4kd9Rcjbow9ZL" ], "script": "base64:AAIFAAAAAAAAAAkIAhIAEgMKAQgAAAAOAAAAAA1wdXp6bGVBc3NldElkAQAAACDxGv4l/vaZOPRpKsTf4RLWR7LGyg66Nwmvd20fjqLlYwAAAAALdXNkbkFzc2V0SWQBAAAAILYmKcME9c5TkaQOS3UkL2SMUbH6369UKb1I0h0qsqrRAAAAABFwdXp6bGVQb29sQWRkcmVzcwEAAAAaAVeRxuop6nlnD9mE7zJ2lLPAdULkNYPB01gAAAAAEm5mdENyZWF0aW9uQWRkcmVzcwEAAAAaAVeT3cTSF+cgCv33IRJO8PB2ZyaDA3jUXEwAAAAAEmVhZ2xlSG9sZGVyQWRkcmVzcwEAAAAaAVfAiq1zlCEzvbAYVg8otbk+QXfOv2/y/tcAAAAACWFydGVmYWN0cwkABEwAAAACCQAETAAAAAICAAAAC1B1enpsZSBTdXJmCQAETAAAAAICAAAAWVB1enpsZSBTdXJmIGFydGVmYWN0IGNhbiBiZSB1c2VkIHRvIGxhdW5jaCBhIGN1c3RvbSBwb29sIG9uIFB1enpsZSBTd2FwIChQdXp6bGVTd2FwLm9yZykuCQAETAAAAAICAAAAQ2h0dHBzOi8vaXBmcy5pby9pcGZzL1FtVWF3UWhQVmhQaXRCU1J0Z2Q2Wkt1cnNlWUozUVdZVWhZbVYyM1BTMnFMNFkFAAAAA25pbAkABEwAAAACCQAETAAAAAICAAAADVB1enpsZSBEZXNlcnQJAARMAAAAAgIAAABbUHV6emxlIERlc2VydCBhcnRlZmFjdCBjYW4gYmUgdXNlZCB0byBsYXVuY2ggYSBjdXN0b20gcG9vbCBvbiBQdXp6bGUgU3dhcCAoUHV6emxlU3dhcC5vcmcpLgkABEwAAAACAgAAAENodHRwczovL2lwZnMuaW8vaXBmcy9RbWE3QmVoOXBQa1JoZ0s2V05NUUtMSGFoUURLZUtScDVteWp2Mm14MXp2MXptBQAAAANuaWwJAARMAAAAAgkABEwAAAACAgAAAA9QdXp6bGUgQWlycGxhbmUJAARMAAAAAgIAAABdUHV6emxlIEFpcnBsYW5lIGFydGVmYWN0IGNhbiBiZSB1c2VkIHRvIGxhdW5jaCBhIGN1c3RvbSBwb29sIG9uIFB1enpsZSBTd2FwIChQdXp6bGVTd2FwLm9yZykuCQAETAAAAAICAAAAQ2h0dHBzOi8vaXBmcy5pby9pcGZzL1FtTlR6emR2Qng2NThoaUNWdkhOR1M0RnNSazhaaEFnWXdlekg2UTlRRUt5N0sFAAAAA25pbAkABEwAAAACCQAETAAAAAICAAAADFB1enpsZSBXaGVlbAkABEwAAAACAgAAAFpQdXp6bGUgV2hlZWwgYXJ0ZWZhY3QgY2FuIGJlIHVzZWQgdG8gbGF1bmNoIGEgY3VzdG9tIHBvb2wgb24gUHV6emxlIFN3YXAgKFB1enpsZVN3YXAub3JnKS4JAARMAAAAAgIAAABDaHR0cHM6Ly9pcGZzLmlvL2lwZnMvUW1Udk41c0FDMmthNHF0TGpTZDJ2V1E0TnFZSkQ4UW84Y0ppQ2hkOFFqWU5DNQUAAAADbmlsCQAETAAAAAIJAARMAAAAAgIAAAAOUHV6emxlIEtoYWxpZmEJAARMAAAAAgIAAABcUHV6emxlIEtoYWxpZmEgYXJ0ZWZhY3QgY2FuIGJlIHVzZWQgdG8gbGF1bmNoIGEgY3VzdG9tIHBvb2wgb24gUHV6emxlIFN3YXAgKFB1enpsZVN3YXAub3JnKS4JAARMAAAAAgIAAABDaHR0cHM6Ly9pcGZzLmlvL2lwZnMvUW1ja0RNc2NudVlwOHNocjNOeHFiZURKODJWNmMxVXZXUDFlY1BBZk1rU3YyRAUAAAADbmlsBQAAAANuaWwAAAAAEnRvdGFsQ291bnRfRGF0YUtleQIAAAAOdG90YWxfc29sZF9uZnQBAAAAD2dldFJhbmRvbU51bWJlcgAAAAQAAAAIdmFyaWFudHMAAAAEdHhJZAAAABRoYXRjaGluZ0ZpbmlzaEhlaWdodAAAAAZvZmZzZXQEAAAAD3JhbmRvbVNlZWRCbG9jawkBAAAABXZhbHVlAAAAAQkAA+0AAAABCQAAZQAAAAIFAAAAFGhhdGNoaW5nRmluaXNoSGVpZ2h0AAAAAAAAAAABBAAAAApyYW5kb21IYXNoCQAB9wAAAAEJAADLAAAAAgUAAAAEdHhJZAkBAAAABXZhbHVlAAAAAQgFAAAAD3JhbmRvbVNlZWRCbG9jawAAAAN2cmYJAABqAAAAAgkABLIAAAACBQAAAApyYW5kb21IYXNoCQAAaAAAAAIFAAAABm9mZnNldAAAAAAAAAAACAUAAAAIdmFy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", "height": 3053605, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 9dLxQu1vVp3AqKNro3YKKBB7zoPkyGjd9r9kZUiwbn5C Next: EG1EsJdLwth54ueNYzSxsUQByVdyJFWuzXwUA82RwUnM Diff:
Old | New | Differences | |
---|---|---|---|
58 | 58 | } | |
59 | 59 | ||
60 | 60 | ||
61 | - | func getArtefactUsdnPrice () = (400000000 + (getIntegerData(totalCount_DataKey) | |
61 | + | func getArtefactUsdnPrice () = (400000000 + fraction(getIntegerData(totalCount_DataKey), 1000000, 1)) | |
62 | 62 | ||
63 | 63 | ||
64 | 64 | func deltaUsdnSum (puzzleAmount,puzzlePriceUsdn,isEagleHolder) = { | |
65 | - | let usdnSum = fraction(puzzlePriceUsdn, puzzleAmount, | |
65 | + | let usdnSum = fraction(puzzlePriceUsdn, fraction(puzzleAmount, 1, 100), 1000000) | |
66 | 66 | let artefactUsdnPrice = if (isEagleHolder) | |
67 | 67 | then { | |
68 | 68 | let price = getArtefactUsdnPrice() | |
117 | 117 | ||
118 | 118 | ||
119 | 119 | @Callable(i) | |
120 | - | func spendArtefact () = if (if ((size( | |
121 | - | then ( | |
120 | + | func spendArtefact (poolDomain) = if (if ((size(poolDomain) > 0)) | |
121 | + | then (size(fromBase58String(poolDomain)) == 26) | |
122 | 122 | else false) | |
123 | - | then { | |
124 | - | let nftAsset = value(assetInfo(value(i.payments[0].assetId))) | |
125 | - | if (isValidNFT(nftAsset)) | |
126 | - | then { | |
127 | - | let soldCountKey = (toString(i.caller) + "_sold_count") | |
128 | - | let addressSoldKey = (toString(i.caller) + "_address_spend") | |
129 | - | let inv = invoke(Address(nftCreationAddress), "burnNFT", nil, i.payments) | |
130 | - | if ((inv == inv)) | |
131 | - | then [StringEntry(addressSoldKey, toBase58String(nftAsset.id)), IntegerEntry(soldCountKey, (getIntegerData(soldCountKey) + 1))] | |
132 | - | else throw("Strict value is not equal to itself.") | |
133 | - | } | |
134 | - | else throw("Invalid NFT.") | |
135 | - | } | |
136 | - | else throw("Invalid payment. You should use NFT for payment.") | |
123 | + | then if (if ((size(i.payments) == 1)) | |
124 | + | then (i.payments[0].amount == 1) | |
125 | + | else false) | |
126 | + | then { | |
127 | + | let nftAsset = value(assetInfo(value(i.payments[0].assetId))) | |
128 | + | if (isValidNFT(nftAsset)) | |
129 | + | then { | |
130 | + | let soldCountKey = (toString(i.caller) + "_sold_count") | |
131 | + | let addressSoldKey = (toString(i.caller) + "_address_spend") | |
132 | + | let inv = invoke(Address(nftCreationAddress), "burnNFT", nil, i.payments) | |
133 | + | if ((inv == inv)) | |
134 | + | then [IntegerEntry((("domain_" + poolDomain) + "_purchased"), 1), StringEntry(addressSoldKey, toBase58String(nftAsset.id)), IntegerEntry(soldCountKey, (getIntegerData(soldCountKey) + 1))] | |
135 | + | else throw("Strict value is not equal to itself.") | |
136 | + | } | |
137 | + | else throw("Invalid NFT.") | |
138 | + | } | |
139 | + | else throw("Invalid payment. You should use NFT for payment.") | |
140 | + | else throw("Invalid pool domain.") | |
137 | 141 | ||
138 | 142 | ||
139 | 143 | @Verifier(tx) |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 5 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | let puzzleAssetId = base58'HEB8Qaw9xrWpWs8tHsiATYGBWDBtP2S7kcPALrMu43AS' | |
5 | 5 | ||
6 | 6 | let usdnAssetId = base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p' | |
7 | 7 | ||
8 | 8 | let puzzlePoolAddress = base58'3PFDgzu1UtswAkCMxqqQjbTeHaX4cMab8Kh' | |
9 | 9 | ||
10 | 10 | let nftCreationAddress = base58'3PFQjjDMiZKQZdu5JqTHD7HwgSXyp9Rw9By' | |
11 | 11 | ||
12 | 12 | let eagleHolderAddress = base58'3PKUxbZaSYfsR7wu2HaAgiirHYwAMupDrYW' | |
13 | 13 | ||
14 | 14 | let artefacts = [["Puzzle Surf", "Puzzle Surf artefact can be used to launch a custom pool on Puzzle Swap (PuzzleSwap.org).", "https://ipfs.io/ipfs/QmUawQhPVhPitBSRtgd6ZKurseYJ3QWYUhYmV23PS2qL4Y"], ["Puzzle Desert", "Puzzle Desert artefact can be used to launch a custom pool on Puzzle Swap (PuzzleSwap.org).", "https://ipfs.io/ipfs/Qma7Beh9pPkRhgK6WNMQKLHahQDKeKRp5myjv2mx1zv1zm"], ["Puzzle Airplane", "Puzzle Airplane artefact can be used to launch a custom pool on Puzzle Swap (PuzzleSwap.org).", "https://ipfs.io/ipfs/QmNTzzdvBx658hiCVvHNGS4FsRk8ZhAgYwezH6Q9QEKy7K"], ["Puzzle Wheel", "Puzzle Wheel artefact can be used to launch a custom pool on Puzzle Swap (PuzzleSwap.org).", "https://ipfs.io/ipfs/QmTvN5sAC2ka4qtLjSd2vWQ4NqYJD8Qo8cJiChd8QjYNC5"], ["Puzzle Khalifa", "Puzzle Khalifa artefact can be used to launch a custom pool on Puzzle Swap (PuzzleSwap.org).", "https://ipfs.io/ipfs/QmckDMscnuYp8shr3NxqbeDJ82V6c1UvWP1ecPAfMkSv2D"]] | |
15 | 15 | ||
16 | 16 | let totalCount_DataKey = "total_sold_nft" | |
17 | 17 | ||
18 | 18 | func getRandomNumber (variants,txId,hatchingFinishHeight,offset) = { | |
19 | 19 | let randomSeedBlock = value(blockInfoByHeight((hatchingFinishHeight - 1))) | |
20 | 20 | let randomHash = sha256((txId + value(randomSeedBlock.vrf))) | |
21 | 21 | (toInt(randomHash, (offset * 8)) % variants) | |
22 | 22 | } | |
23 | 23 | ||
24 | 24 | ||
25 | 25 | func getIntegerData (key) = match getInteger(this, key) { | |
26 | 26 | case t: Int => | |
27 | 27 | t | |
28 | 28 | case _ => | |
29 | 29 | 0 | |
30 | 30 | } | |
31 | 31 | ||
32 | 32 | ||
33 | 33 | func isValidNFT (asset) = { | |
34 | 34 | let issuerAddress = getString(Address(nftCreationAddress), (("nft_" + toBase58String(asset.id)) + "_issuer")) | |
35 | 35 | if (if (if ((asset.issuer == Address(nftCreationAddress))) | |
36 | 36 | then (issuerAddress == toString(this)) | |
37 | 37 | else false) | |
38 | 38 | then (asset.decimals == 0) | |
39 | 39 | else false) | |
40 | 40 | then (asset.quantity == 1) | |
41 | 41 | else false | |
42 | 42 | } | |
43 | 43 | ||
44 | 44 | ||
45 | 45 | func isEagleHolder (address) = match getInteger(Address(eagleHolderAddress), (address + "_staked")) { | |
46 | 46 | case t: Int => | |
47 | 47 | (t > 0) | |
48 | 48 | case _ => | |
49 | 49 | false | |
50 | 50 | } | |
51 | 51 | ||
52 | 52 | ||
53 | 53 | func getPuzzlePrice () = { | |
54 | 54 | let usdnBalance = getIntegerValue(Address(puzzlePoolAddress), (("global_" + toBase58String(usdnAssetId)) + "_balance")) | |
55 | 55 | let puzzleBalance = getIntegerValue(Address(puzzlePoolAddress), (("global_" + toBase58String(puzzleAssetId)) + "_balance")) | |
56 | 56 | let puzzlePart = fraction(puzzleBalance, 1, 8) | |
57 | 57 | fraction(usdnBalance, 1000000, fraction(puzzlePart, 1, 100)) | |
58 | 58 | } | |
59 | 59 | ||
60 | 60 | ||
61 | - | func getArtefactUsdnPrice () = (400000000 + (getIntegerData(totalCount_DataKey) | |
61 | + | func getArtefactUsdnPrice () = (400000000 + fraction(getIntegerData(totalCount_DataKey), 1000000, 1)) | |
62 | 62 | ||
63 | 63 | ||
64 | 64 | func deltaUsdnSum (puzzleAmount,puzzlePriceUsdn,isEagleHolder) = { | |
65 | - | let usdnSum = fraction(puzzlePriceUsdn, puzzleAmount, | |
65 | + | let usdnSum = fraction(puzzlePriceUsdn, fraction(puzzleAmount, 1, 100), 1000000) | |
66 | 66 | let artefactUsdnPrice = if (isEagleHolder) | |
67 | 67 | then { | |
68 | 68 | let price = getArtefactUsdnPrice() | |
69 | 69 | (price - fraction(price, 20, 100)) | |
70 | 70 | } | |
71 | 71 | else getArtefactUsdnPrice() | |
72 | 72 | (usdnSum - artefactUsdnPrice) | |
73 | 73 | } | |
74 | 74 | ||
75 | 75 | ||
76 | 76 | @Callable(i) | |
77 | 77 | func generateArtefact () = if (if (if ((size(i.payments) == 1)) | |
78 | 78 | then (i.payments[0].assetId == puzzleAssetId) | |
79 | 79 | else false) | |
80 | 80 | then (i.payments[0].amount > 0) | |
81 | 81 | else false) | |
82 | 82 | then { | |
83 | 83 | let puzzlePriceUsdn = getPuzzlePrice() | |
84 | 84 | let paymentUsdnDelta = deltaUsdnSum(i.payments[0].amount, puzzlePriceUsdn, isEagleHolder(toString(i.caller))) | |
85 | 85 | if ((paymentUsdnDelta >= 0)) | |
86 | 86 | then { | |
87 | 87 | let randIndex = getRandomNumber(5, i.transactionId, height, 0) | |
88 | 88 | if (if ((randIndex >= 0)) | |
89 | 89 | then (5 > randIndex) | |
90 | 90 | else false) | |
91 | 91 | then { | |
92 | 92 | let artefact = artefacts[randIndex] | |
93 | 93 | let createdNFTStr = match invoke(Address(nftCreationAddress), "createNFT", [artefact[0], artefact[1], artefact[2], "Puzzle Pool Artefact"], nil) { | |
94 | 94 | case x: String => | |
95 | 95 | x | |
96 | 96 | case _ => | |
97 | 97 | throw("something went wrong during creation of NFT") | |
98 | 98 | } | |
99 | 99 | if ((createdNFTStr == createdNFTStr)) | |
100 | 100 | then { | |
101 | 101 | let extraTransactionList = if ((paymentUsdnDelta > 0)) | |
102 | 102 | then { | |
103 | 103 | let returnPuzzleAmount = fraction(paymentUsdnDelta, 100000000, puzzlePriceUsdn) | |
104 | 104 | [ScriptTransfer(i.caller, returnPuzzleAmount, puzzleAssetId), Burn(puzzleAssetId, (i.payments[0].amount - returnPuzzleAmount))] | |
105 | 105 | } | |
106 | 106 | else [Burn(puzzleAssetId, i.payments[0].amount)] | |
107 | 107 | $Tuple2(([ScriptTransfer(i.caller, 1, fromBase58String(createdNFTStr)), IntegerEntry(totalCount_DataKey, (getIntegerData(totalCount_DataKey) + 1))] ++ extraTransactionList), createdNFTStr) | |
108 | 108 | } | |
109 | 109 | else throw("Strict value is not equal to itself.") | |
110 | 110 | } | |
111 | 111 | else throw("Inalid random index.") | |
112 | 112 | } | |
113 | 113 | else throw("Not enough payment amount.") | |
114 | 114 | } | |
115 | 115 | else throw("Invalid payment. You can use only Puzzle for payment.") | |
116 | 116 | ||
117 | 117 | ||
118 | 118 | ||
119 | 119 | @Callable(i) | |
120 | - | func spendArtefact () = if (if ((size( | |
121 | - | then ( | |
120 | + | func spendArtefact (poolDomain) = if (if ((size(poolDomain) > 0)) | |
121 | + | then (size(fromBase58String(poolDomain)) == 26) | |
122 | 122 | else false) | |
123 | - | then { | |
124 | - | let nftAsset = value(assetInfo(value(i.payments[0].assetId))) | |
125 | - | if (isValidNFT(nftAsset)) | |
126 | - | then { | |
127 | - | let soldCountKey = (toString(i.caller) + "_sold_count") | |
128 | - | let addressSoldKey = (toString(i.caller) + "_address_spend") | |
129 | - | let inv = invoke(Address(nftCreationAddress), "burnNFT", nil, i.payments) | |
130 | - | if ((inv == inv)) | |
131 | - | then [StringEntry(addressSoldKey, toBase58String(nftAsset.id)), IntegerEntry(soldCountKey, (getIntegerData(soldCountKey) + 1))] | |
132 | - | else throw("Strict value is not equal to itself.") | |
133 | - | } | |
134 | - | else throw("Invalid NFT.") | |
135 | - | } | |
136 | - | else throw("Invalid payment. You should use NFT for payment.") | |
123 | + | then if (if ((size(i.payments) == 1)) | |
124 | + | then (i.payments[0].amount == 1) | |
125 | + | else false) | |
126 | + | then { | |
127 | + | let nftAsset = value(assetInfo(value(i.payments[0].assetId))) | |
128 | + | if (isValidNFT(nftAsset)) | |
129 | + | then { | |
130 | + | let soldCountKey = (toString(i.caller) + "_sold_count") | |
131 | + | let addressSoldKey = (toString(i.caller) + "_address_spend") | |
132 | + | let inv = invoke(Address(nftCreationAddress), "burnNFT", nil, i.payments) | |
133 | + | if ((inv == inv)) | |
134 | + | then [IntegerEntry((("domain_" + poolDomain) + "_purchased"), 1), StringEntry(addressSoldKey, toBase58String(nftAsset.id)), IntegerEntry(soldCountKey, (getIntegerData(soldCountKey) + 1))] | |
135 | + | else throw("Strict value is not equal to itself.") | |
136 | + | } | |
137 | + | else throw("Invalid NFT.") | |
138 | + | } | |
139 | + | else throw("Invalid payment. You should use NFT for payment.") | |
140 | + | else throw("Invalid pool domain.") | |
137 | 141 | ||
138 | 142 | ||
139 | 143 | @Verifier(tx) | |
140 | 144 | func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) | |
141 | 145 |
github/deemru/w8io/0e76f2f 51.23 ms ◑