tx · 5oYzfbJL6n9QjMnBmuxBNEjCNmbVpQ9vmxD3Cz9xXFJ2 3PEDESe94yGyY8X3Gez4u7cyZCa4JTAT6h3: -0.10000000 Waves 2020.11.03 22:14 [2313317] smart account 3PEDESe94yGyY8X3Gez4u7cyZCa4JTAT6h3 > SELF 0.00000000 Waves
{ "type": 13, "id": "5oYzfbJL6n9QjMnBmuxBNEjCNmbVpQ9vmxD3Cz9xXFJ2", "fee": 10000000, "feeAssetId": null, "timestamp": 1604430875620, "version": 1, "sender": "3PEDESe94yGyY8X3Gez4u7cyZCa4JTAT6h3", "senderPublicKey": "5NS2bDTAeSrSw5v6xQuM3YLsN9q5BXwfWuKCPkwFCH3y", "proofs": [ "4gmkFdHZbyaXXtzzJkigbRZynvSixcDgfeDX2Wj2eazXDDUugewTn2cjJUMxTXXUZnBWnx1Xoo7HfZKT9cntSmiK" ], "script": "base64:AAIDAAAAAAAAAAwIARIDCgECEgMKAQgAAAAeAAAAAAROT05FAAAAAAAAAAAAAAAAAANORVcAAAAAAAAAAAEAAAAACUNPTVBMRVRFRAAAAAAAAAAAAgAAAAAHQVBQUk9WRQAAAAAAAAAAAQAAAAAGVU5MT0NLAAAAAAAAAAACAAAAAAhMT0NLVFlQRQAAAAAAAAAAAQAAAAAKVU5MT0NLVFlQRQAAAAAAAAAAAgEAAAAPZ2V0SW50ZWdlckJ5S2V5AAAAAQAAAANrZXkEAAAAByRtYXRjaDAJAAQaAAAAAgUAAAAEdGhpcwUAAAADa2V5AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAANJbnQEAAAAAXYFAAAAByRtYXRjaDAFAAAAAXYAAAAAAAAAAAABAAAADWdldEJ5dGVzQnlLZXkAAAABAAAAA2tleQQAAAAHJG1hdGNoMAkABBwAAAACBQAAAAR0aGlzBQAAAANrZXkDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAACkJ5dGVWZWN0b3IEAAAAAXYFAAAAByRtYXRjaDAFAAAAAXYBAAAAA9AAAAEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABAAAAA2tleQQAAAAHJG1hdGNoMAkABB0AAAACBQAAAAR0aGlzBQAAAANrZXkDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABlN0cmluZwQAAAABdgUAAAAHJG1hdGNoMAUAAAABdgIAAAAAAAAAAApBc3NldElkS2V5AgAAAAhhc3NldF9pZAAAAAAKRmlyc3RScUtleQIAAAAIZmlyc3RfcnEAAAAACUxhc3RScUtleQIAAAAHbGFzdF9ycQAAAAAQTmVidWxhQWRkcmVzc0tleQIAAAAObmVidWxhX2FkZHJlc3MBAAAADGdldE5leHRScUtleQAAAAEAAAACaWQJAAEsAAAAAgIAAAAIbmV4dF9ycV8FAAAAAmlkAQAAAAxnZXRQcmV2UnFLZXkAAAABAAAAAmlkCQABLAAAAAICAAAACHByZXZfcnFfBQAAAAJpZAEAAAAQZ2V0UnFSZWNlaXZlcktleQAAAAEAAAACaWQJAAEsAAAAAgIAAAAMcnFfcmVjZWl2ZXJfBQAAAAJpZAEAAAAOZ2V0UnFBbW91bnRLZXkAAAABAAAAAmlkCQABLAAAAAICAAAACnJxX2Ftb3VudF8FAAAAAmlkAQAAAA5nZXRScVN0YXR1c0tleQAAAAEAAAACaWQJAAEsAAAAAgIAAAAKcnFfc3RhdHVzXwUAAAACaWQBAAAADGdldFJxVHlwZUtleQAAAAEAAAACaWQJAAEsAAAAAgIAAAAIcnFfdHlwZV8FAAAAAmlkAAAAAA1uZWJ1bGFBZGRyZXNzCQEAAAAcQGV4dHJVc2VyKGFkZHJlc3NGcm9tU3RyaW5nKQAAAAEJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEFAAAAEE5lYnVsYUFkZHJlc3NLZXkAAAAAB2Fzc2V0SWQJAAJZAAAAAQkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQUAAAAKQXNzZXRJZEtleQAAAAAHZmlyc3RScQkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQUAAAAKRmlyc3RScUtleQAAAAAGbGFzdFJxCQEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABBQAAAAlMYXN0UnFLZXkBAAAACWdldE5leHRScQAAAAEAAAACaWQJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEJAQAAAAxnZXROZXh0UnFLZXkAAAABBQAAAAJpZAEAAAAJZ2V0UHJldlJxAAAAAQAAAAJpZAkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQkBAAAADGdldFByZXZScUtleQAAAAEFAAAAAmlkAQAAAAtnZXRScUFtb3VudAAAAAEAAAACaWQJAQAAAA9nZXRJbnRlZ2VyQnlLZXkAAAABCQEAAAAOZ2V0UnFBbW91bnRLZXkAAAABBQAAAAJpZAEAAAALZ2V0UnFTdGF0dXMAAAABAAAAAmlkCQEAAAAPZ2V0SW50ZWdlckJ5S2V5AAAAAQkBAAAADmdldFJxU3RhdHVzS2V5AAAAAQUAAAACaWQBAAAACWdldFJxVHlwZQAAAAEAAAACaWQJAQAAAA9nZXRJbnRlZ2VyQnlLZXkAAAABCQEAAAAMZ2V0UnFUeXBlS2V5AAAAAQUAAAACaWQBAAAADWdldFJxUmVjZWl2ZXIAAAABAAAAAmlkCQEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABCQEAAAAQZ2V0UnFSZWNlaXZlcktleQAAAAEFAAAAAmlkAAAAAgAAAAFpAQAAAAphdHRhY2hEYXRhAAAA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", "chainId": 87, "height": 2313317, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: none Next: 9hW4GcuNJGFPAHpMXsAqs67aiAbi2Hhm92D3PYf85mrU Full:
Old | New | Differences | |
---|---|---|---|
1 | - | # no script | |
1 | + | {-# STDLIB_VERSION 3 #-} | |
2 | + | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | + | {-# CONTENT_TYPE DAPP #-} | |
4 | + | let NONE = 0 | |
5 | + | ||
6 | + | let NEW = 1 | |
7 | + | ||
8 | + | let COMPLETED = 2 | |
9 | + | ||
10 | + | let APPROVE = 1 | |
11 | + | ||
12 | + | let UNLOCK = 2 | |
13 | + | ||
14 | + | let LOCKTYPE = 1 | |
15 | + | ||
16 | + | let UNLOCKTYPE = 2 | |
17 | + | ||
18 | + | func getIntegerByKey (key) = match getInteger(this, key) { | |
19 | + | case v: Int => | |
20 | + | v | |
21 | + | case _ => | |
22 | + | 0 | |
23 | + | } | |
24 | + | ||
25 | + | ||
26 | + | func getBytesByKey (key) = match getBinary(this, key) { | |
27 | + | case v: ByteVector => | |
28 | + | v | |
29 | + | case _ => | |
30 | + | base58'2CsAf' | |
31 | + | } | |
32 | + | ||
33 | + | ||
34 | + | func getStringByKey (key) = match getString(this, key) { | |
35 | + | case v: String => | |
36 | + | v | |
37 | + | case _ => | |
38 | + | "" | |
39 | + | } | |
40 | + | ||
41 | + | ||
42 | + | let AssetIdKey = "asset_id" | |
43 | + | ||
44 | + | let FirstRqKey = "first_rq" | |
45 | + | ||
46 | + | let LastRqKey = "last_rq" | |
47 | + | ||
48 | + | let NebulaAddressKey = "nebula_address" | |
49 | + | ||
50 | + | func getNextRqKey (id) = ("next_rq_" + id) | |
51 | + | ||
52 | + | ||
53 | + | func getPrevRqKey (id) = ("prev_rq_" + id) | |
54 | + | ||
55 | + | ||
56 | + | func getRqReceiverKey (id) = ("rq_receiver_" + id) | |
57 | + | ||
58 | + | ||
59 | + | func getRqAmountKey (id) = ("rq_amount_" + id) | |
60 | + | ||
61 | + | ||
62 | + | func getRqStatusKey (id) = ("rq_status_" + id) | |
63 | + | ||
64 | + | ||
65 | + | func getRqTypeKey (id) = ("rq_type_" + id) | |
66 | + | ||
67 | + | ||
68 | + | let nebulaAddress = addressFromStringValue(getStringByKey(NebulaAddressKey)) | |
69 | + | ||
70 | + | let assetId = fromBase58String(getStringByKey(AssetIdKey)) | |
71 | + | ||
72 | + | let firstRq = getStringByKey(FirstRqKey) | |
73 | + | ||
74 | + | let lastRq = getStringByKey(LastRqKey) | |
75 | + | ||
76 | + | func getNextRq (id) = getStringByKey(getNextRqKey(id)) | |
77 | + | ||
78 | + | ||
79 | + | func getPrevRq (id) = getStringByKey(getPrevRqKey(id)) | |
80 | + | ||
81 | + | ||
82 | + | func getRqAmount (id) = getIntegerByKey(getRqAmountKey(id)) | |
83 | + | ||
84 | + | ||
85 | + | func getRqStatus (id) = getIntegerByKey(getRqStatusKey(id)) | |
86 | + | ||
87 | + | ||
88 | + | func getRqType (id) = getIntegerByKey(getRqTypeKey(id)) | |
89 | + | ||
90 | + | ||
91 | + | func getRqReceiver (id) = getStringByKey(getRqReceiverKey(id)) | |
92 | + | ||
93 | + | ||
94 | + | @Callable(i) | |
95 | + | func attachData (v) = { | |
96 | + | let action = toInt(take(v, 8)) | |
97 | + | let rqId = toBase58String(take(drop(v, 8), 32)) | |
98 | + | if ((i.caller != nebulaAddress)) | |
99 | + | then throw("invalid sender") | |
100 | + | else if ((action == UNLOCK)) | |
101 | + | then { | |
102 | + | let amount = toInt(take(drop(v, 40), 8)) | |
103 | + | if ((getRqStatus(rqId) != NONE)) | |
104 | + | then throw("rq is exist") | |
105 | + | else { | |
106 | + | let recipient = drop(v, 48) | |
107 | + | ScriptResult(WriteSet([DataEntry(getRqStatusKey(rqId), COMPLETED), DataEntry(getRqAmountKey(rqId), amount), DataEntry(getRqTypeKey(rqId), UNLOCKTYPE)]), TransferSet([ScriptTransfer(Address(recipient), amount, assetId)])) | |
108 | + | } | |
109 | + | } | |
110 | + | else if ((action == APPROVE)) | |
111 | + | then if ((getRqStatus(rqId) == NONE)) | |
112 | + | then throw("rq not found") | |
113 | + | else if ((getRqStatus(rqId) == COMPLETED)) | |
114 | + | then throw("rq was approved") | |
115 | + | else { | |
116 | + | let nextRq = getNextRq(rqId) | |
117 | + | let prevRq = getPrevRq(rqId) | |
118 | + | WriteSet([DataEntry(FirstRqKey, if ((firstRq == rqId)) | |
119 | + | then getNextRq(rqId) | |
120 | + | else firstRq), DataEntry(LastRqKey, if ((lastRq == rqId)) | |
121 | + | then getPrevRq(rqId) | |
122 | + | else lastRq), DataEntry(getNextRqKey(prevRq), nextRq), DataEntry(getPrevRqKey(nextRq), prevRq), DataEntry(getRqStatusKey(rqId), COMPLETED)]) | |
123 | + | } | |
124 | + | else throw("invalid action type") | |
125 | + | } | |
126 | + | ||
127 | + | ||
128 | + | ||
129 | + | @Callable(i) | |
130 | + | func createTransferWrapRq (receiver) = { | |
131 | + | let pmt = value(i.payment) | |
132 | + | let rqId = toBase58String(i.transactionId) | |
133 | + | if ((pmt.assetId != assetId)) | |
134 | + | then throw("invalid asset in payments") | |
135 | + | else WriteSet([DataEntry(FirstRqKey, if ((firstRq == "")) | |
136 | + | then rqId | |
137 | + | else firstRq), DataEntry(LastRqKey, rqId), DataEntry(getNextRqKey(lastRq), rqId), DataEntry(getPrevRqKey(rqId), lastRq), DataEntry(getRqAmountKey(rqId), pmt.amount), DataEntry(getRqStatusKey(rqId), NEW), DataEntry(getRqReceiverKey(rqId), receiver), DataEntry(getRqTypeKey(rqId), LOCKTYPE)]) | |
138 | + | } | |
139 | + | ||
140 | + |
github/deemru/w8io/3ef1775 34.23 ms ◑