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:
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 4 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# 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 | + | } | |
4 | 36 | ||
5 | 37 | ||
6 | 38 | @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 | + | } | |
12 | 142 | ||
13 | 143 | ||
14 | 144 | @Verifier(tx) |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 4 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# 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 | + | } | |
4 | 36 | ||
5 | 37 | ||
6 | 38 | @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 | + | } | |
12 | 142 | ||
13 | 143 | ||
14 | 144 | @Verifier(tx) | |
15 | 145 | func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) | |
16 | 146 |
github/deemru/w8io/169f3d6 33.60 ms ◑![]()