2023.01.03 20:29 [3454567] smart account 3P975LUuqc7uBPiSxp3nemf2FZh62zfirSh > SELF 0.00000000 Waves
{ "type": 13, "id": "2H3udUk5MGF54Cf5E7E1LRxD8tsFmoCmji6LFBp3i1T4", "fee": 1000000, "feeAssetId": null, "timestamp": 1672767048224, "version": 2, "chainId": 87, "sender": "3P975LUuqc7uBPiSxp3nemf2FZh62zfirSh", "senderPublicKey": "6Dx2LuCqezyDYjt3zMEL6WRrs5oaor6aK3L6QouPMP1b", "proofs": [ "rmbxidwHw9NNrBWwsnSR4rrLGRyeYvtLAYxRcqWwS3KtjXb7jqkmZvG3fQb8NtjVajxfNTuUzHqB23mPcXmjecU" ], "script": "base64:BgITCAISABIDCgEIEgMKAQgSAwoBCAYAD2NyZWF0aW9uQWRkcmVzcwkBB0FkZHJlc3MBARoBV5PdxNIX5yAK/fchEk7w8HZnJoMDeNRcTAAOdG90YWxTdGFrZWRLZXkCDHRvdGFsX3N0YWtlZAANdG90YWxQb3dlcktleQILdG90YWxfcG93ZXIBCGNoZWNrTkZUAQVhc3NldAMDAwMJAAACCQERQGV4dHJOYXRpdmUoMTA1MykCBQ9jcmVhdGlvbkFkZHJlc3MJAKwCAgkArAICAgRuZnRfCQDYBAEIBQVhc3NldAJpZAIHX2lzc3VlcgkApQgBBQR0aGlzCQAAAggFBWFzc2V0Bmlzc3VlcgUPY3JlYXRpb25BZGRyZXNzBwkAAAIIBQVhc3NldAhkZWNpbWFscwAABwkAAAIIBQVhc3NldApyZWlzc3VhYmxlBwcJAAACCAUFYXNzZXQIcXVhbnRpdHkAAQcBC2dldFBvd2VyTkZUAQVhc3NldAQGcGFyYW1zCQERQGV4dHJOYXRpdmUoMTA1MykCBQ9jcmVhdGlvbkFkZHJlc3MJAKwCAgkArAICAgRuZnRfCQDYBAEIBQVhc3NldAJpZAIHX3BhcmFtcwMJAAACBQZwYXJhbXMCBGdvbGQAMgAKARNnZXRDb2xsZWN0aW9uSXNzdWVyAQxjb2xsZWN0aW9uSWQEB2Fzc2V0SWQJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUPY3JlYXRpb25BZGRyZXNzCQCsAgIJAKwCAgILY29sbGVjdGlvbl8FDGNvbGxlY3Rpb25JZAIIX2Fzc2V0SWQCAAQMZ3JvdXBBc3NldElkCQELdmFsdWVPckVsc2UCCQCdCAIFD2NyZWF0aW9uQWRkcmVzcwkArAICCQCsAgICBmdyb3VwXwUMY29sbGVjdGlvbklkAghfYXNzZXRJZAIACQELdmFsdWVPckVsc2UCCQCdCAIFD2NyZWF0aW9uQWRkcmVzcwkArAICCQCsAgICBG5mdF8JAKwCAgUHYXNzZXRJZAUMZ3JvdXBBc3NldElkAgdfaXNzdWVyAgAEAWkBBXN0YWtlAAQKYWRkcmVzc1N0cgkApQgBCAUBaQZjYWxsZXIEAXAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAkQMCCAUBaQhwYXltZW50cwAAAgtObyBwYXltZW50cwQFYXNzZXQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkA7AcBCQETdmFsdWVPckVycm9yTWVzc2FnZQIIBQFwB2Fzc2V0SWQCD0ludmFsaWQgcGF5bWVudAIQSW52YWxpZCBhc3NldCBJZAMDCQBmAggFAXAGYW1vdW50AAAJAQhjaGVja05GVAEFBWFzc2V0BwQLdG90YWxTdGFrZWQJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUOdG90YWxTdGFrZWRLZXkAAAQKdG90YWxQb3dlcgkBC3ZhbHVlT3JFbHNlAgkAnwgBBQ10b3RhbFBvd2VyS2V5AAAEDGFkZHJlc3NQb3dlcgkBC3ZhbHVlT3JFbHNlAgkAnwgBCQCsAgIJAKwCAgIIYWRkcmVzc18FCmFkZHJlc3NTdHICBl9wb3dlcgAABAhuZnRQb3dlcgkBC2dldFBvd2VyTkZUAQUFYXNzZXQECG5mdElkU3RyCQDYBAEIBQVhc3NldAJpZAkAzAgCCQEMSW50ZWdlckVudHJ5AgUOdG90YWxTdGFrZWRLZXkJAGQCBQt0b3RhbFN0YWtlZAABCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ10b3RhbFBvd2VyS2V5CQBkAgUKdG90YWxQb3dlcgUIbmZ0UG93ZXIJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgICBG5mdF8FCG5mdElkU3RyAgZfb3duZXIFCmFkZHJlc3NTdHIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICAgRuZnRfBQhuZnRJZFN0cgIGX3Bvd2VyBQhuZnRQb3dlcgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgICCGFkZHJlc3NfBQphZGRyZXNzU3RyAgZfcG93ZXIJAGQCBQxhZGRyZXNzUG93ZXIFCG5mdFBvd2VyBQNuaWwJAAIBAgtObyBwYXltZW50cwFpAQd1bnN0YWtlAQhuZnRJZFN0cgQKYWRkcmVzc1N0cgkApQgBCAUBaQZjYWxsZXIEBWFzc2V0CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQkA2QQBBQhuZnRJZFN0cgIOSW52YWxpZCBuZnQgSWQEDG93bmVyQWRkcmVzcwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAEJAKwCAgkArAICAgRuZnRfBQhuZnRJZFN0cgIGX293bmVyAhJPd25lciBkYXRhIGludmFsaWQDCQECIT0CBQxvd25lckFkZHJlc3MFCmFkZHJlc3NTdHIJAAIBAhVZb3UgYXJlIG5vdCB0aGUgb3duZXIDCQEIY2hlY2tORlQBBQVhc3NldAQLdG90YWxTdGFrZWQJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUOdG90YWxTdGFrZWRLZXkAAAQKdG90YWxQb3dlcgkBC3ZhbHVlT3JFbHNlAgkAnwgBBQ10b3RhbFBvd2VyS2V5AAAEDGFkZHJlc3NQb3dlcgkBC3ZhbHVlT3JFbHNlAgkAnwgBCQCsAgIJAKwCAgIIYWRkcmVzc18FCmFkZHJlc3NTdHICBl9wb3dlcgAABA1uZnRBc3NldElkU3RyCQDYBAEIBQVhc3NldAJpZAQIbmZ0UG93ZXIJARFAZXh0ck5hdGl2ZSgxMDU1KQEJAKwCAgkArAICAgRuZnRfBQ1uZnRBc3NldElkU3RyAgZfcG93ZXIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyAAEIBQVhc3NldAJpZAkAzAgCCQEMSW50ZWdlckVudHJ5AgUOdG90YWxTdGFrZWRLZXkJAGUCBQt0b3RhbFN0YWtlZAABCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ10b3RhbFBvd2VyS2V5CQBlAgUKdG90YWxQb3dlcgUIbmZ0UG93ZXIJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgICBG5mdF8FDW5mdEFzc2V0SWRTdHICBl9vd25lcgkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgIEbmZ0XwUNbmZ0QXNzZXRJZFN0cgIGX3Bvd2VyCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgIIYWRkcmVzc18FCmFkZHJlc3NTdHICBl9wb3dlcgkAZQIFDGFkZHJlc3NQb3dlcgUIbmZ0UG93ZXIFA25pbAkAAgECDkludmFsaWQgbmZ0IElkAWkBCnNlbmRUb1ZvdGUBDGNvbGxlY3Rpb25JZAQGaXNzdWVyCQETZ2V0Q29sbGVjdGlvbklzc3VlcgEFDGNvbGxlY3Rpb25JZAMJAAACCQCxAgEFBmlzc3VlcgAACQACAQIbQ29sbGVjdGlvbiBpc3N1ZXIgbm90IGZvdW5kAwkBAiE9AgUGaXNzdWVyCQClCAEIBQFpBmNhbGxlcgkAAgECJk9ubHkgdGhlIGlzc3VlciBjYW4gc3VibWl0IHRvIHRoZSB2b3RlBAZ2b3RlSWQJANgEAQgFAWkNdHJhbnNhY3Rpb25JZAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgIFdm90ZV8FDGNvbGxlY3Rpb25JZAIDX2lkBQZ2b3RlSWQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgICBXZvdGVfBQZ2b3RlSWQCDV9jb2xsZWN0aW9uSWQFDGNvbGxlY3Rpb25JZAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgIFdm90ZV8FBnZvdGVJZAIGX293bmVyCQClCAEIBQFpBmNhbGxlcgUDbmlsAWkBDnJlbW92ZUZyb21Wb3RlAQZ2b3RlSWQEDGNvbGxlY3Rpb25JZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAEJAKwCAgkArAICAgV2b3RlXwUGdm90ZUlkAg1fY29sbGVjdGlvbklkAhdDb2xsZWN0aW9uIElkIG5vdCBmb3VuZAQFb3duZXIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBCQCsAgIJAKwCAgIFdm90ZV8FBnZvdGVJZAIGX293bmVyAg9Pd25lciBub3QgZm91bmQDCQECIT0CBQVvd25lcgkApQgBCAUBaQZjYWxsZXIJAAIBAhVZb3UgYXJlIG5vdCB0aGUgb3duZXIJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgICBXZvdGVfBQxjb2xsZWN0aW9uSWQCA19pZAkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgIFdm90ZV8FBnZvdGVJZAINX2NvbGxlY3Rpb25JZAkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgIFdm90ZV8FBnZvdGVJZAIGX293bmVyBQNuaWwBAnR4AQZ2ZXJpZnkACQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACAUCdHgPc2VuZGVyUHVibGljS2V5qS8SZQ==", "height": 3454567, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 5A5FoLET1Tu7RjjjiSXgZQVfWzPPTvVrZwgPmneMmTSm Next: Eznm6twvWN4jQm3dY1ficXDjwm3fvhPAyjtGVBAmAQuT Diff:
Old | New | Differences | |
---|---|---|---|
23 | 23 | if ((params == "gold")) | |
24 | 24 | then 50 | |
25 | 25 | else 10 | |
26 | + | } | |
27 | + | ||
28 | + | ||
29 | + | func getCollectionIssuer (collectionId) = { | |
30 | + | let assetId = valueOrElse(getString(creationAddress, (("collection_" + collectionId) + "_assetId")), "") | |
31 | + | let groupAssetId = valueOrElse(getString(creationAddress, (("group_" + collectionId) + "_assetId")), "") | |
32 | + | valueOrElse(getString(creationAddress, (("nft_" + (assetId + groupAssetId)) + "_issuer")), "") | |
26 | 33 | } | |
27 | 34 | ||
28 | 35 | ||
67 | 74 | } | |
68 | 75 | ||
69 | 76 | ||
77 | + | ||
78 | + | @Callable(i) | |
79 | + | func sendToVote (collectionId) = { | |
80 | + | let issuer = getCollectionIssuer(collectionId) | |
81 | + | if ((size(issuer) == 0)) | |
82 | + | then throw("Collection issuer not found") | |
83 | + | else if ((issuer != toString(i.caller))) | |
84 | + | then throw("Only the issuer can submit to the vote") | |
85 | + | else { | |
86 | + | let voteId = toBase58String(i.transactionId) | |
87 | + | [StringEntry((("vote_" + collectionId) + "_id"), voteId), StringEntry((("vote_" + voteId) + "_collectionId"), collectionId), StringEntry((("vote_" + voteId) + "_owner"), toString(i.caller))] | |
88 | + | } | |
89 | + | } | |
90 | + | ||
91 | + | ||
92 | + | ||
93 | + | @Callable(i) | |
94 | + | func removeFromVote (voteId) = { | |
95 | + | let collectionId = valueOrErrorMessage(getString((("vote_" + voteId) + "_collectionId")), "Collection Id not found") | |
96 | + | let owner = valueOrErrorMessage(getString((("vote_" + voteId) + "_owner")), "Owner not found") | |
97 | + | if ((owner != toString(i.caller))) | |
98 | + | then throw("You are not the owner") | |
99 | + | else [DeleteEntry((("vote_" + collectionId) + "_id")), DeleteEntry((("vote_" + voteId) + "_collectionId")), DeleteEntry((("vote_" + voteId) + "_owner"))] | |
100 | + | } | |
101 | + | ||
102 | + | ||
70 | 103 | @Verifier(tx) | |
71 | 104 | func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) | |
72 | 105 |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 6 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | let creationAddress = Address(base58'3PFQjjDMiZKQZdu5JqTHD7HwgSXyp9Rw9By') | |
5 | 5 | ||
6 | 6 | let totalStakedKey = "total_staked" | |
7 | 7 | ||
8 | 8 | let totalPowerKey = "total_power" | |
9 | 9 | ||
10 | 10 | func checkNFT (asset) = if (if (if (if ((getStringValue(creationAddress, (("nft_" + toBase58String(asset.id)) + "_issuer")) == toString(this))) | |
11 | 11 | then (asset.issuer == creationAddress) | |
12 | 12 | else false) | |
13 | 13 | then (asset.decimals == 0) | |
14 | 14 | else false) | |
15 | 15 | then (asset.reissuable == false) | |
16 | 16 | else false) | |
17 | 17 | then (asset.quantity == 1) | |
18 | 18 | else false | |
19 | 19 | ||
20 | 20 | ||
21 | 21 | func getPowerNFT (asset) = { | |
22 | 22 | let params = getStringValue(creationAddress, (("nft_" + toBase58String(asset.id)) + "_params")) | |
23 | 23 | if ((params == "gold")) | |
24 | 24 | then 50 | |
25 | 25 | else 10 | |
26 | + | } | |
27 | + | ||
28 | + | ||
29 | + | func getCollectionIssuer (collectionId) = { | |
30 | + | let assetId = valueOrElse(getString(creationAddress, (("collection_" + collectionId) + "_assetId")), "") | |
31 | + | let groupAssetId = valueOrElse(getString(creationAddress, (("group_" + collectionId) + "_assetId")), "") | |
32 | + | valueOrElse(getString(creationAddress, (("nft_" + (assetId + groupAssetId)) + "_issuer")), "") | |
26 | 33 | } | |
27 | 34 | ||
28 | 35 | ||
29 | 36 | @Callable(i) | |
30 | 37 | func stake () = { | |
31 | 38 | let addressStr = toString(i.caller) | |
32 | 39 | let p = valueOrErrorMessage(i.payments[0], "No payments") | |
33 | 40 | let asset = valueOrErrorMessage(assetInfo(valueOrErrorMessage(p.assetId, "Invalid payment")), "Invalid asset Id") | |
34 | 41 | if (if ((p.amount > 0)) | |
35 | 42 | then checkNFT(asset) | |
36 | 43 | else false) | |
37 | 44 | then { | |
38 | 45 | let totalStaked = valueOrElse(getInteger(totalStakedKey), 0) | |
39 | 46 | let totalPower = valueOrElse(getInteger(totalPowerKey), 0) | |
40 | 47 | let addressPower = valueOrElse(getInteger((("address_" + addressStr) + "_power")), 0) | |
41 | 48 | let nftPower = getPowerNFT(asset) | |
42 | 49 | let nftIdStr = toBase58String(asset.id) | |
43 | 50 | [IntegerEntry(totalStakedKey, (totalStaked + 1)), IntegerEntry(totalPowerKey, (totalPower + nftPower)), StringEntry((("nft_" + nftIdStr) + "_owner"), addressStr), IntegerEntry((("nft_" + nftIdStr) + "_power"), nftPower), IntegerEntry((("address_" + addressStr) + "_power"), (addressPower + nftPower))] | |
44 | 51 | } | |
45 | 52 | else throw("No payments") | |
46 | 53 | } | |
47 | 54 | ||
48 | 55 | ||
49 | 56 | ||
50 | 57 | @Callable(i) | |
51 | 58 | func unstake (nftIdStr) = { | |
52 | 59 | let addressStr = toString(i.caller) | |
53 | 60 | let asset = valueOrErrorMessage(assetInfo(fromBase58String(nftIdStr)), "Invalid nft Id") | |
54 | 61 | let ownerAddress = valueOrErrorMessage(getString((("nft_" + nftIdStr) + "_owner")), "Owner data invalid") | |
55 | 62 | if ((ownerAddress != addressStr)) | |
56 | 63 | then throw("You are not the owner") | |
57 | 64 | else if (checkNFT(asset)) | |
58 | 65 | then { | |
59 | 66 | let totalStaked = valueOrElse(getInteger(totalStakedKey), 0) | |
60 | 67 | let totalPower = valueOrElse(getInteger(totalPowerKey), 0) | |
61 | 68 | let addressPower = valueOrElse(getInteger((("address_" + addressStr) + "_power")), 0) | |
62 | 69 | let nftAssetIdStr = toBase58String(asset.id) | |
63 | 70 | let nftPower = getIntegerValue((("nft_" + nftAssetIdStr) + "_power")) | |
64 | 71 | [ScriptTransfer(i.caller, 1, asset.id), IntegerEntry(totalStakedKey, (totalStaked - 1)), IntegerEntry(totalPowerKey, (totalPower - nftPower)), DeleteEntry((("nft_" + nftAssetIdStr) + "_owner")), DeleteEntry((("nft_" + nftAssetIdStr) + "_power")), IntegerEntry((("address_" + addressStr) + "_power"), (addressPower - nftPower))] | |
65 | 72 | } | |
66 | 73 | else throw("Invalid nft Id") | |
67 | 74 | } | |
68 | 75 | ||
69 | 76 | ||
77 | + | ||
78 | + | @Callable(i) | |
79 | + | func sendToVote (collectionId) = { | |
80 | + | let issuer = getCollectionIssuer(collectionId) | |
81 | + | if ((size(issuer) == 0)) | |
82 | + | then throw("Collection issuer not found") | |
83 | + | else if ((issuer != toString(i.caller))) | |
84 | + | then throw("Only the issuer can submit to the vote") | |
85 | + | else { | |
86 | + | let voteId = toBase58String(i.transactionId) | |
87 | + | [StringEntry((("vote_" + collectionId) + "_id"), voteId), StringEntry((("vote_" + voteId) + "_collectionId"), collectionId), StringEntry((("vote_" + voteId) + "_owner"), toString(i.caller))] | |
88 | + | } | |
89 | + | } | |
90 | + | ||
91 | + | ||
92 | + | ||
93 | + | @Callable(i) | |
94 | + | func removeFromVote (voteId) = { | |
95 | + | let collectionId = valueOrErrorMessage(getString((("vote_" + voteId) + "_collectionId")), "Collection Id not found") | |
96 | + | let owner = valueOrErrorMessage(getString((("vote_" + voteId) + "_owner")), "Owner not found") | |
97 | + | if ((owner != toString(i.caller))) | |
98 | + | then throw("You are not the owner") | |
99 | + | else [DeleteEntry((("vote_" + collectionId) + "_id")), DeleteEntry((("vote_" + voteId) + "_collectionId")), DeleteEntry((("vote_" + voteId) + "_owner"))] | |
100 | + | } | |
101 | + | ||
102 | + | ||
70 | 103 | @Verifier(tx) | |
71 | 104 | func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) | |
72 | 105 |
github/deemru/w8io/786bc32 29.45 ms ◑