tx · BEh6zN4R6hvEGbvNSsDQaQteav293EWCWrmhPHDkwu2n

3NAHfYKL9t2u9XbAAABAUo9gLo5cfwrGX1D:  -0.01000000 Waves

2021.04.01 17:16 [1463479] smart account 3NAHfYKL9t2u9XbAAABAUo9gLo5cfwrGX1D > SELF 0.00000000 Waves

{ "type": 13, "id": "BEh6zN4R6hvEGbvNSsDQaQteav293EWCWrmhPHDkwu2n", "fee": 1000000, "feeAssetId": null, "timestamp": 1617286574445, "version": 2, "chainId": 84, "sender": "3NAHfYKL9t2u9XbAAABAUo9gLo5cfwrGX1D", "senderPublicKey": "FrvM8P1rpbmcVDvFu26T4SYeQaK6mjhySozqxvD6SHst", "proofs": [ "2Et4XDndpSHsX8QQd4b7Q9KVPtsgDhaWwQYA9T7aEDBYxv18oN8v7eoPWe9RNHqwbgWn6cCtyUiE6h1BeAeP9SS" ], "script": "base64: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", "height": 1463479, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: none Next: none Full:
OldNewDifferences
1-# no script
1+{-# STDLIB_VERSION 4 #-}
2+{-# SCRIPT_TYPE ACCOUNT #-}
3+{-# CONTENT_TYPE DAPP #-}
4+let ownerKey = "_o"
5+
6+let balanceKey = "_b"
7+
8+let approvalKey = "_a"
9+
10+let operatorApprovalKey = "_oa"
11+
12+func checkExistence (tokenId) = match getString(this, (toString(tokenId) + ownerKey)) {
13+ case a: String =>
14+ true
15+ case _ =>
16+ false
17+}
18+
19+
20+func getBalance (account) = match getInteger(this, (account + balanceKey)) {
21+ case a: Int =>
22+ a
23+ case _ =>
24+ 0
25+}
26+
27+
28+func getApproval (tokenId) = match getString(this, (toString(tokenId) + approvalKey)) {
29+ case a: String =>
30+ a
31+ case _ =>
32+ ""
33+}
34+
35+
36+func getOwner (tokenId) = match getString(this, (toString(tokenId) + ownerKey)) {
37+ case o: String =>
38+ o
39+ case _ =>
40+ ""
41+}
42+
43+
44+@Callable(i)
45+func mint (account,tokenId) = {
46+ let currentBalance = getBalance(account)
47+ let address = match addressFromString(account) {
48+ case a: Address =>
49+ toString(a)
50+ case _ =>
51+ throw("Invalid address")
52+ }
53+ let exists = checkExistence(tokenId)
54+ if (exists)
55+ then throw("Token already minted")
56+ else [IntegerEntry((account + balanceKey), (currentBalance + 1)), StringEntry((toString(tokenId) + ownerKey), address)]
57+ }
58+
59+
60+
61+@Callable(i)
62+func burn (tokenId) = {
63+ let exists = checkExistence(tokenId)
64+ if (!(exists))
65+ then throw("Token doesn't exist")
66+ else {
67+ let owner = getOwner(tokenId)
68+ let currentBalance = getBalance(owner)
69+[IntegerEntry((owner + balanceKey), (currentBalance - 1)), DeleteEntry((toString(tokenId) + approvalKey)), DeleteEntry((toString(tokenId) + ownerKey))]
70+ }
71+ }
72+
73+
74+
75+@Callable(i)
76+func approve (to,tokenId) = {
77+ let caller = toString(addressFromPublicKey(i.callerPublicKey))
78+ let owner = getOwner(tokenId)
79+ if ((owner != caller))
80+ then throw("Approve caller is not owner")
81+ else [StringEntry((toString(tokenId) + approvalKey), to)]
82+ }
83+
84+
85+
86+@Callable(i)
87+func transfer (address,tokenId) = {
88+ let from = toString(addressFromPublicKey(i.callerPublicKey))
89+ let owner = getOwner(tokenId)
90+ if ((owner != from))
91+ then throw("Transfer caller is not owner")
92+ else {
93+ let to = match addressFromString(address) {
94+ case a: Address =>
95+ toString(a)
96+ case _ =>
97+ throw("Invalid address")
98+ }
99+ let currentBalanceFrom = getBalance(from)
100+ let currentBalanceTo = getBalance(to)
101+[DeleteEntry((toString(tokenId) + approvalKey)), IntegerEntry((from + balanceKey), (currentBalanceFrom - 1)), IntegerEntry((to + balanceKey), (currentBalanceTo + 1)), StringEntry((toString(tokenId) + ownerKey), to)]
102+ }
103+ }
104+
105+
106+
107+@Callable(i)
108+func transferFrom (from,to,tokenId) = {
109+ let caller = toString(addressFromPublicKey(i.callerPublicKey))
110+ let owner = getOwner(tokenId)
111+ if ((owner != from))
112+ then throw("Transfer caller is not owner")
113+ else {
114+ let approval = getApproval(tokenId)
115+ if ((approval != caller))
116+ then throw("Transfer caller is not owner")
117+ else {
118+ let address = match addressFromString(to) {
119+ case a: Address =>
120+ toString(a)
121+ case _ =>
122+ throw("Invalid address")
123+ }
124+ let currentBalanceFrom = getBalance(from)
125+ let currentBalanceTo = getBalance(address)
126+[DeleteEntry((toString(tokenId) + approvalKey)), IntegerEntry((from + balanceKey), (currentBalanceFrom - 1)), IntegerEntry((address + balanceKey), (currentBalanceTo + 1)), StringEntry((toString(tokenId) + ownerKey), to)]
127+ }
128+ }
129+ }
130+
131+
132+@Verifier(tx)
133+func verify () = match tx {
134+ case _: DataTransaction =>
135+ false
136+ case _: SetScriptTransaction =>
137+ false
138+ case _ =>
139+ sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
140+}
141+

github/deemru/w8io/169f3d6 
23.35 ms