tx · GRnG6WqytpSUvUNekCmK8BuoYYr1k4L4BZBHJYTXNQHG

3Mz29fiz3zgY9JDbiHKANvHsFgQutdfu4Ua:  -0.01400000 Waves

2021.03.28 07:20 [1457123] smart account 3Mz29fiz3zgY9JDbiHKANvHsFgQutdfu4Ua > SELF 0.00000000 Waves

{ "type": 13, "id": "GRnG6WqytpSUvUNekCmK8BuoYYr1k4L4BZBHJYTXNQHG", "fee": 1400000, "feeAssetId": null, "timestamp": 1616905223297, "version": 2, "chainId": 84, "sender": "3Mz29fiz3zgY9JDbiHKANvHsFgQutdfu4Ua", "senderPublicKey": "CTyHhnVTxf16Z4CmGGneAK8WB5g2QyT4MB8kUn8vPPcu", "proofs": [ "29EiaepdrDBTG6TfU5pW39Ssu4xM5yxqkArRQVdrgGWvjQy3EKY54ujpiui2u87eNht7njupKqKqCuh6e1MULHjM" ], "script": "base64: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dHJhY3RJZEJ5dGVWZWN0b3IEAAAAByRtYXRjaDAICQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAAAAAAB2Fzc2V0SWQDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAACkJ5dGVWZWN0b3IEAAAADGlzQnl0ZVZlY3RvcgUAAAAHJG1hdGNoMAUAAAAMaXNCeXRlVmVjdG9yCQAAAgAAAAECAAAAFEVSUk9SOiBDb250cmFjdCB0eXBlBAAAAAxjb250cmFjdEluZm8EAAAAByRtYXRjaDAJAAPsAAAAAQUAAAAUY29udHJhY3RJZEJ5dGVWZWN0b3IDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABUFzc2V0BAAAAAdpc0Fzc2V0BQAAAAckbWF0Y2gwBQAAAAdpc0Fzc2V0CQAAAgAAAAECAAAAF0VSUk9SOiBVbmtub3duIENvbnRyYWN0AwkBAAAAAiE9AAAAAggFAAAADGNvbnRyYWN0SW5mbwAAAAZpc3N1ZXIFAAAABHRoaXMJAAACAAAAAQIAAAAWRVJST1I6IENvbnRyYWN0IElzc3VlcgMJAQAAAAIhPQAAAAIIBQAAAAxjb250cmFjdEluZm8AAAAEbmFtZQUAAAAMY29udHJhY3ROYW1lCQAAAgAAAAECAAAAFEVSUk9SOiBDb250cmFjdCBuYW1lAwMDAwkBAAAAAiE9AAAAAggFAAAADGNvbnRyYWN0SW5mbwAAAAhkZWNpbWFscwAAAAAAAAAAAAYJAQAAAAIhPQAAAAIIBQAAAAxjb250cmFjdEluZm8AAAAIcXVhbnRpdHkAAAAAAAAAAAEGCQEAAAACIT0AAAACCAUAAAAMY29udHJhY3RJbmZvAAAACnJlaXNzdWFibGUHBgkBAAAAAiE9AAAAAggFAAAADGNvbnRyYWN0SW5mbwAAAAhzY3JpcHRlZAcJAAACAAAAAQIAAAAXRVJST1I6IENvbnRyYWN0IG5vdCBORlQEAAAAE2NvbnRyYWN0RGVzY3JpcHRpb24JAAS1AAAAAggFAAAADGNvbnRyYWN0SW5mbwAAAAtkZXNjcmlwdGlvbgUAAAARY29udHJhY3RTZXBhcmF0b3IEAAAADmNvbnRyYWN0SGVpZ2h0CQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAATY29udHJhY3REZXNjcmlwdGlvbgAAAAAAAAAAAQQAAAAVY29udHJhY3RDYWxsZXJBZGRyZXNzCQABkQAAAAIFAAAAE2NvbnRyYWN0RGVzY3JpcHRpb24AAAAAAAAAAAIEAAAAD2NvbnRyYWN0QXNzZXRJZAkAAZEAAAACBQAAABNjb250cmFjdERlc2NyaXB0aW9uAAAAAAAAAAADBAAAABVjb250cmFjdEFzc2V0UXVhbnRpdHkJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAABNjb250cmFjdERlc2NyaXB0aW9uAAAAAAAAAAAEBAAAABFjb250cmFjdEFzc2V0SW5mbwQAAAAHJG1hdGNoMAkAA+wAAAABCQACWQAAAAEFAAAAD2NvbnRyYWN0QXNzZXRJZAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAFQXNzZXQEAAAAB2lzQXNzZXQFAAAAByRtYXRjaDAFAAAAB2lzQXNzZXQJAAACAAAAAQIAAAAURVJST1I6IFVua25vd24gQXNzZXQDCQEAAAACIT0AAAACCQABkAAAAAEFAAAAE2NvbnRyYWN0RGVzY3JpcHRpb24AAAAAAAAAAAUJAAACAAAAAQIAAAAbRVJST1I6IENvbnRyYWN0IGRlc2NyaXB0aW9uAwMJAABnAAAAAgUAAAANZ2VuZXNpc0hlaWdodAUAAAAOY29udHJhY3RIZWlnaHQGCQAAZwAAAAIFAAAADmNvbnRyYWN0SGVpZ2h0BQAAAAZoZWlnaHQJAAACAAAAAQIAAAANRVJST1I6IEhlaWdodAMDCQAAZgAAAAIAAAAAAAAAAAEFAAAAFWNvbnRyYWN0QXNzZXRRdWFudGl0eQYJAABmAAAAAgUAAAAVY29udHJhY3RBc3NldFF1YW50aXR5CAUAAAARY29udHJhY3RBc3NldEluZm8AAAAIcXVhbnRpdHkJAAACAAAAAQIAAAAVRVJST1I6IEFzc2V0IHF1YW50aXR5AwkAAGYAAAACBQAAABVjb250cmFjdEFzc2V0UXVhbnRpdHkJAAPwAAAAAgUAAAAEdGhpcwgFAAAAEWNvbnRyYWN0QXNzZXRJbmZvAAAAAmlkCQAAAgAAAAECAAAAFEVSUk9SOiBWYXVsdCBiYWxhbmNlBAAAAAVub25jZQkBAAAADWdlbmVyYXRlTm9uY2UAAAAABAAAABJyZWNlaXB0RGVzY3JpcHRpb24JAAS5AAAAAgkABEwAAAACBQAAAAtyZWNlaXB0VGV4dAkABEwAAAACCQABpAAAAAEFAAAADmNvbnRyYWN0SGVpZ2h0CQAETAAAAAIJAAGkAAAAAQUAAAAGaGVpZ2h0CQAETAAAAAIJAAJYAAAAAQUAAAAUY29udHJhY3RJZEJ5dGVWZWN0b3IJAARMAAAAAgUAAAAVY29udHJhY3RDYWxsZXJBZGRyZXNzCQAETAAAAAIJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyCQAETAAAAAIFAAAAD2NvbnRyYWN0QXNzZXRJZAkABEwAAAACCQABpAAAAAEFAAAAFWNvbnRyYWN0QXNzZXRRdWFudGl0eQUAAAADbmlsBQAAABFjb250cmFjdFNlcGFyYXRvcgQAAAAMcmVjZWlwdElzc3VlCQAEQwAAAAcFAAAAC3JlY2VpcHROYW1lBQAAABJyZWNlaXB0RGVzY3JpcHRpb24AAAAAAAAAAAEAAAAAAAAAAAAHBQAAAAR1bml0BQAAAAVub25jZQQAAAAJcmVjZWlwdElkCQAEOAAAAAEFAAAADHJlY2VpcHRJc3N1ZQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAANa2V5Tm9uY2VDb3VudAUAAAAFbm9uY2UJAARMAAAAAgkBAAAABEJ1cm4AAAACBQAAABRjb250cmFjdElkQnl0ZVZlY3RvcgAAAAAAAAAAAQkABEwAAAACBQAAAAxyZWNlaXB0SXNzdWUJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyCAUAAAAMcmVjZWlwdElzc3VlAAAACHF1YW50aXR5BQAAAAlyZWNlaXB0SWQJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAABVjb250cmFjdEFzc2V0UXVhbnRpdHkIBQAAABFjb250cmFjdEFzc2V0SW5mbwAAAAJpZAUAAAADbmlsAAAAAQAAAAJ0eAEAAAAGdmVyaWZ5AAAAAAkAAfQAAAADCAUAAAACdHgAAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJ0eAAAAAZwcm9vZnMAAAAAAAAAAAAIBQAAAAJ0eAAAAA9zZW5kZXJQdWJsaWNLZXlSnVjh", "height": 1457123, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: Dq534cAB5hStgdPBKUBTxRUvnnrEQk8Td5q8hFEQFwcq Next: DVkHXqwBgKbr7oJrb5v3oZFHBxPqWgdPd34aYM78UTUD Diff:
OldNewDifferences
11 {-# STDLIB_VERSION 4 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4+let self = toString(this)
5+
6+let genesisHeight = 1456230
7+
8+let wavesId = "WAVES"
9+
10+let maxInt = 9223372036854775805
11+
12+let maxDescriptionBytes = 1000
13+
14+let contractName = "VaultContract"
15+
16+let contractText = (("Don't trust, verify ! The NFT Issuer and dApp are the same address <" + self) + ">.")
17+
18+let contractSeparator = "___"
19+
20+let receiptName = "VaultReceipt"
21+
22+let receiptText = "fuck off"
23+
24+let rulerAddressEmpty = "null"
25+
26+let keyNonceCount = "NONCE_COUNT"
27+
28+func generateNonce () = match getInteger(this, keyNonceCount) {
29+ case isInt: Int =>
30+ if ((isInt >= maxInt))
31+ then 1
32+ else (isInt + 1)
33+ case _ =>
34+ 1
35+}
436
537
638 @Callable(i)
7-func call () = {
8- let asset = Issue("Asset", "", 1, 0, true, unit, 0)
9- let assetId = calculateAssetId(asset)
10-[BinaryEntry("bin", base58''), BooleanEntry("bool", true), IntegerEntry("int", 1), StringEntry("str", ""), DeleteEntry("str"), asset, Reissue(assetId, 1, false), Burn(assetId, 1), ScriptTransfer(i.caller, 1, assetId)]
11- }
39+func deposit (rulerAddress) = if ((genesisHeight > height))
40+ then throw(("ERROR: Deposits are denied until block " + toString(genesisHeight)))
41+ else if ((this == i.caller))
42+ then throw("ERROR: Self-invoke is forbidden")
43+ else if ((size(i.payments) != 1))
44+ then throw("ERROR: Attached Payment != 1")
45+ else if (if ((1 > i.payments[0].amount))
46+ then true
47+ else (i.payments[0].amount > maxInt))
48+ then throw("ERROR: Payment amount")
49+ else {
50+ let contractAssetId = match i.payments[0].assetId {
51+ case isByteVector: ByteVector =>
52+ match assetInfo(isByteVector) {
53+ case isAsset: Asset =>
54+ toBase58String(isAsset.id)
55+ case _ =>
56+ throw("ERROR: Asset not found")
57+ }
58+ case isWaves: Unit =>
59+ wavesId
60+ case _ =>
61+ throw("ERROR: Unknown Asset type")
62+ }
63+ let testAddr = Address(fromBase58String(rulerAddress))
64+ let nonce = generateNonce()
65+ let contractDescription = makeString([contractText, toString(height), toString(i.caller), contractAssetId, toString(i.payments[0].amount)], contractSeparator)
66+ if ((size(toBytes(contractDescription)) > maxDescriptionBytes))
67+ then throw("ERROR: Too long contract")
68+ else {
69+ let contractIssue = Issue(contractName, contractDescription, 1, 0, false, unit, nonce)
70+ let contractId = calculateAssetId(contractIssue)
71+[StringEntry("test", toString(testAddr)), IntegerEntry(keyNonceCount, nonce), contractIssue, ScriptTransfer(i.caller, contractIssue.quantity, contractId)]
72+ }
73+ }
74+
75+
76+
77+@Callable(i)
78+func withdraw () = if ((this == i.caller))
79+ then throw("ERROR: Self-invoke is forbidden")
80+ else if ((size(i.payments) != 1))
81+ then throw("ERROR: Attached Payment != 1")
82+ else if ((i.payments[0].amount != 1))
83+ then throw("ERROR: Payment amount != 1")
84+ else {
85+ let contractIdByteVector = match i.payments[0].assetId {
86+ case isByteVector: ByteVector =>
87+ isByteVector
88+ case _ =>
89+ throw("ERROR: Contract type")
90+ }
91+ let contractInfo = match assetInfo(contractIdByteVector) {
92+ case isAsset: Asset =>
93+ isAsset
94+ case _ =>
95+ throw("ERROR: Unknown Contract")
96+ }
97+ if ((contractInfo.issuer != this))
98+ then throw("ERROR: Contract Issuer")
99+ else if ((contractInfo.name != contractName))
100+ then throw("ERROR: Contract name")
101+ else if (if (if (if ((contractInfo.decimals != 0))
102+ then true
103+ else (contractInfo.quantity != 1))
104+ then true
105+ else (contractInfo.reissuable != false))
106+ then true
107+ else (contractInfo.scripted != false))
108+ then throw("ERROR: Contract not NFT")
109+ else {
110+ let contractDescription = split(contractInfo.description, contractSeparator)
111+ let contractHeight = parseIntValue(contractDescription[1])
112+ let contractCallerAddress = contractDescription[2]
113+ let contractAssetId = contractDescription[3]
114+ let contractAssetQuantity = parseIntValue(contractDescription[4])
115+ let contractAssetInfo = match assetInfo(fromBase58String(contractAssetId)) {
116+ case isAsset: Asset =>
117+ isAsset
118+ case _ =>
119+ throw("ERROR: Unknown Asset")
120+ }
121+ if ((size(contractDescription) != 5))
122+ then throw("ERROR: Contract description")
123+ else if (if ((genesisHeight >= contractHeight))
124+ then true
125+ else (contractHeight >= height))
126+ then throw("ERROR: Height")
127+ else if (if ((1 > contractAssetQuantity))
128+ then true
129+ else (contractAssetQuantity > contractAssetInfo.quantity))
130+ then throw("ERROR: Asset quantity")
131+ else if ((contractAssetQuantity > assetBalance(this, contractAssetInfo.id)))
132+ then throw("ERROR: Vault balance")
133+ else {
134+ let nonce = generateNonce()
135+ let receiptDescription = makeString([receiptText, toString(contractHeight), toString(height), toBase58String(contractIdByteVector), contractCallerAddress, toString(i.caller), contractAssetId, toString(contractAssetQuantity)], contractSeparator)
136+ let receiptIssue = Issue(receiptName, receiptDescription, 1, 0, false, unit, nonce)
137+ let receiptId = calculateAssetId(receiptIssue)
138+[IntegerEntry(keyNonceCount, nonce), Burn(contractIdByteVector, 1), receiptIssue, ScriptTransfer(i.caller, receiptIssue.quantity, receiptId), ScriptTransfer(i.caller, contractAssetQuantity, contractAssetInfo.id)]
139+ }
140+ }
141+ }
12142
13143
14144 @Verifier(tx)
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 4 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4+let self = toString(this)
5+
6+let genesisHeight = 1456230
7+
8+let wavesId = "WAVES"
9+
10+let maxInt = 9223372036854775805
11+
12+let maxDescriptionBytes = 1000
13+
14+let contractName = "VaultContract"
15+
16+let contractText = (("Don't trust, verify ! The NFT Issuer and dApp are the same address <" + self) + ">.")
17+
18+let contractSeparator = "___"
19+
20+let receiptName = "VaultReceipt"
21+
22+let receiptText = "fuck off"
23+
24+let rulerAddressEmpty = "null"
25+
26+let keyNonceCount = "NONCE_COUNT"
27+
28+func generateNonce () = match getInteger(this, keyNonceCount) {
29+ case isInt: Int =>
30+ if ((isInt >= maxInt))
31+ then 1
32+ else (isInt + 1)
33+ case _ =>
34+ 1
35+}
436
537
638 @Callable(i)
7-func call () = {
8- let asset = Issue("Asset", "", 1, 0, true, unit, 0)
9- let assetId = calculateAssetId(asset)
10-[BinaryEntry("bin", base58''), BooleanEntry("bool", true), IntegerEntry("int", 1), StringEntry("str", ""), DeleteEntry("str"), asset, Reissue(assetId, 1, false), Burn(assetId, 1), ScriptTransfer(i.caller, 1, assetId)]
11- }
39+func deposit (rulerAddress) = if ((genesisHeight > height))
40+ then throw(("ERROR: Deposits are denied until block " + toString(genesisHeight)))
41+ else if ((this == i.caller))
42+ then throw("ERROR: Self-invoke is forbidden")
43+ else if ((size(i.payments) != 1))
44+ then throw("ERROR: Attached Payment != 1")
45+ else if (if ((1 > i.payments[0].amount))
46+ then true
47+ else (i.payments[0].amount > maxInt))
48+ then throw("ERROR: Payment amount")
49+ else {
50+ let contractAssetId = match i.payments[0].assetId {
51+ case isByteVector: ByteVector =>
52+ match assetInfo(isByteVector) {
53+ case isAsset: Asset =>
54+ toBase58String(isAsset.id)
55+ case _ =>
56+ throw("ERROR: Asset not found")
57+ }
58+ case isWaves: Unit =>
59+ wavesId
60+ case _ =>
61+ throw("ERROR: Unknown Asset type")
62+ }
63+ let testAddr = Address(fromBase58String(rulerAddress))
64+ let nonce = generateNonce()
65+ let contractDescription = makeString([contractText, toString(height), toString(i.caller), contractAssetId, toString(i.payments[0].amount)], contractSeparator)
66+ if ((size(toBytes(contractDescription)) > maxDescriptionBytes))
67+ then throw("ERROR: Too long contract")
68+ else {
69+ let contractIssue = Issue(contractName, contractDescription, 1, 0, false, unit, nonce)
70+ let contractId = calculateAssetId(contractIssue)
71+[StringEntry("test", toString(testAddr)), IntegerEntry(keyNonceCount, nonce), contractIssue, ScriptTransfer(i.caller, contractIssue.quantity, contractId)]
72+ }
73+ }
74+
75+
76+
77+@Callable(i)
78+func withdraw () = if ((this == i.caller))
79+ then throw("ERROR: Self-invoke is forbidden")
80+ else if ((size(i.payments) != 1))
81+ then throw("ERROR: Attached Payment != 1")
82+ else if ((i.payments[0].amount != 1))
83+ then throw("ERROR: Payment amount != 1")
84+ else {
85+ let contractIdByteVector = match i.payments[0].assetId {
86+ case isByteVector: ByteVector =>
87+ isByteVector
88+ case _ =>
89+ throw("ERROR: Contract type")
90+ }
91+ let contractInfo = match assetInfo(contractIdByteVector) {
92+ case isAsset: Asset =>
93+ isAsset
94+ case _ =>
95+ throw("ERROR: Unknown Contract")
96+ }
97+ if ((contractInfo.issuer != this))
98+ then throw("ERROR: Contract Issuer")
99+ else if ((contractInfo.name != contractName))
100+ then throw("ERROR: Contract name")
101+ else if (if (if (if ((contractInfo.decimals != 0))
102+ then true
103+ else (contractInfo.quantity != 1))
104+ then true
105+ else (contractInfo.reissuable != false))
106+ then true
107+ else (contractInfo.scripted != false))
108+ then throw("ERROR: Contract not NFT")
109+ else {
110+ let contractDescription = split(contractInfo.description, contractSeparator)
111+ let contractHeight = parseIntValue(contractDescription[1])
112+ let contractCallerAddress = contractDescription[2]
113+ let contractAssetId = contractDescription[3]
114+ let contractAssetQuantity = parseIntValue(contractDescription[4])
115+ let contractAssetInfo = match assetInfo(fromBase58String(contractAssetId)) {
116+ case isAsset: Asset =>
117+ isAsset
118+ case _ =>
119+ throw("ERROR: Unknown Asset")
120+ }
121+ if ((size(contractDescription) != 5))
122+ then throw("ERROR: Contract description")
123+ else if (if ((genesisHeight >= contractHeight))
124+ then true
125+ else (contractHeight >= height))
126+ then throw("ERROR: Height")
127+ else if (if ((1 > contractAssetQuantity))
128+ then true
129+ else (contractAssetQuantity > contractAssetInfo.quantity))
130+ then throw("ERROR: Asset quantity")
131+ else if ((contractAssetQuantity > assetBalance(this, contractAssetInfo.id)))
132+ then throw("ERROR: Vault balance")
133+ else {
134+ let nonce = generateNonce()
135+ let receiptDescription = makeString([receiptText, toString(contractHeight), toString(height), toBase58String(contractIdByteVector), contractCallerAddress, toString(i.caller), contractAssetId, toString(contractAssetQuantity)], contractSeparator)
136+ let receiptIssue = Issue(receiptName, receiptDescription, 1, 0, false, unit, nonce)
137+ let receiptId = calculateAssetId(receiptIssue)
138+[IntegerEntry(keyNonceCount, nonce), Burn(contractIdByteVector, 1), receiptIssue, ScriptTransfer(i.caller, receiptIssue.quantity, receiptId), ScriptTransfer(i.caller, contractAssetQuantity, contractAssetInfo.id)]
139+ }
140+ }
141+ }
12142
13143
14144 @Verifier(tx)
15145 func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
16146

github/deemru/w8io/169f3d6 
33.60 ms