tx · ZxzEwzbtKA58cJPyxgun6Bmka5zPafWvuSMHx6G9fLd

3NBCBtA1F4m6tBir7JX2dUtDNt4ujmHH5NA:  -0.02000000 Waves

2020.06.05 07:10 [1029448] smart account 3NBCBtA1F4m6tBir7JX2dUtDNt4ujmHH5NA > SELF 0.00000000 Waves

{ "type": 13, "id": "ZxzEwzbtKA58cJPyxgun6Bmka5zPafWvuSMHx6G9fLd", "fee": 2000000, "feeAssetId": null, "timestamp": 1591330217443, "version": 1, "sender": "3NBCBtA1F4m6tBir7JX2dUtDNt4ujmHH5NA", "senderPublicKey": "Aj2RvtYHTSnDfcwYBCD5ZEwG3V483xJe2L1n13KPsi3a", "proofs": [ "2bbearM2g4rW6tK7cspWkxuabExbNJD8D1epiBzTnYiFsWkWg5jCd1vjDojUiya3umafG1MqeeJ8G3YMFEUK8ohg" ], "script": "base64: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", "chainId": 84, "height": 1029448, "spentComplexity": 0 } View: original | compacted Prev: DuHXkGuL2sWWi9sp4MFRdcRfGhFuUMcXYELAo2qCm6S3 Next: 4yzfD4RdLap4KYBtrPptUSzhAA2VqorJXnTqvPr4FQoY Diff:
OldNewDifferences
6262 }
6363
6464
65-func decodeBool (data,offset) = {
66- let decoded1 = decodeInt8(data, offset)
67-[DataEntry("bool", (decoded1[0] != 0)), DataEntry("int", decoded1[1])]
68- }
69-
70-
71-func decodeBytes32 (data,offset) = if ((32 > size(data)))
72- then throw("decode bytes32 error, data must be at least 32 bytes")
73- else [DataEntry("byte_vector", take(drop(data, offset), 32)), DataEntry("int", (offset + 32))]
74-
75-
76-func decodeBytes64 (data,offset) = if ((64 > size(data)))
77- then throw("decode bytes64 error, data must be at least 64 bytes")
78- else [DataEntry("byte_vector", take(drop(data, offset), 64)), DataEntry("int", (offset + 64))]
79-
80-
81-func decodeBytes65 (data,offset) = if ((65 > size(data)))
82- then throw("decode bytes65 error, data must be at least 65 bytes")
83- else [DataEntry("byte_vector", take(drop(data, offset), 65)), DataEntry("int", (offset + 65))]
84-
85-
86-func decodeBytes (data,offset) = {
87- let decoded1 = decodeInt32(data, offset)
88- let bytesSize = decoded1[0]
89- let nextOffset = decoded1[1]
90-[DataEntry("byte_vector", take(drop(data, nextOffset), bytesSize)), DataEntry("int", (nextOffset + bytesSize))]
91- }
92-
93-
9465 func decodeString (data,offset) = {
9566 let decoded1 = decodeInt32(data, offset)
9667 let bytesSize = decoded1[0]
9768 let nextOffset = decoded1[1]
9869 [DataEntry("string", toUtf8String(take(drop(data, nextOffset), bytesSize))), DataEntry("int", (nextOffset + bytesSize))]
9970 }
100-
101-
102-func getAsBool (tuple) = match tuple[0].value {
103- case b: Boolean =>
104- b
105- case _ =>
106- throw("not a Boolean")
107-}
108-
109-
110-func getAsByteVector (tuple) = match tuple[0].value {
111- case bv: ByteVector =>
112- bv
113- case _ =>
114- throw("not a ByteVector")
115-}
11671
11772
11873 func getAsString (tuple) = match tuple[0].value {
13287
13388
13489 @Callable(contextObj)
135-func relayAndVerify (data) = {
136- let req1 = decodeString(data, 0)
137- let req2 = decodeInt64(data, getOffset(req1))
138- let req3 = decodeBytes(data, req2[1])
139- let req4 = decodeInt64(data, getOffset(req3))
140- let req5 = decodeInt64(data, req4[1])
141- let res1 = decodeString(data, req5[1])
142- let res2 = decodeInt64(data, getOffset(res1))
143- let res3 = decodeInt64(data, res2[1])
144- let res4 = decodeInt64(data, res3[1])
145- let res5 = decodeInt64(data, res4[1])
146- let res6 = decodeInt8(data, res5[1])
147- let res7 = decodeBytes(data, res6[1])
148- let requestID = toString(res2[0])
149- WriteSet([DataEntry((requestID + "/clientId"), req1[0].value), DataEntry((requestID + "/oracleScriptId"), req2[0]), DataEntry((requestID + "/calldata"), req3[0].value), DataEntry((requestID + "/askCount"), req4[0]), DataEntry((requestID + "/minCount"), req5[0]), DataEntry((requestID + "/ansCount"), res3[0]), DataEntry((requestID + "/requestTime"), res4[0]), DataEntry((requestID + "/resolveTime"), res5[0]), DataEntry((requestID + "/resolveStatus"), res6[0]), DataEntry((requestID + "/result"), res7[0].value)])
90+func init (bridgeAddress) = if ((contextObj.caller != this))
91+ then throw("permission denied")
92+ else match getInteger(this, "latestRequestId") {
93+ case latestRequestId: Int =>
94+ throw("already init")
95+ case _ =>
96+ match getInteger(this, "latestWavesPrice") {
97+ case latestWavesPrice: Int =>
98+ throw("already init")
99+ case _ =>
100+ WriteSet([DataEntry("oracleScriptId", 1), DataEntry("symbol", "WAVES"), DataEntry("multiplier", 100), DataEntry("latestRequestId", 0), DataEntry("latestWavesPrice", 0)])
101+ }
102+ }
103+
104+
105+
106+@Callable(contextObj)
107+func setBridge (bridgeAddress) = if ((contextObj.caller != this))
108+ then throw("permission denied")
109+ else WriteSet([DataEntry("bridge", bridgeAddress)])
110+
111+
112+
113+@Callable(contextObj)
114+func setLatestWavesPrice (requestId) = {
115+ let bridge = Address(getBinaryValue(this, "bridge"))
116+ if ((getIntegerValue(bridge, (toString(requestId) + "/oracleScriptId")) != getIntegerValue(this, "oracleScriptId")))
117+ then throw("incorrect oracleScriptId")
118+ else {
119+ let calldata = getBinaryValue(bridge, (toString(requestId) + "/calldata"))
120+ let tuple1 = decodeString(calldata, 0)
121+ let tuple2 = decodeInt64(calldata, getOffset(tuple1))
122+ let symbol = getAsString(tuple1)
123+ let multiplier = tuple2[0]
124+ if ((symbol != getStringValue(this, "symbol")))
125+ then throw("wrong symbol")
126+ else if ((multiplier != getIntegerValue(this, "multiplier")))
127+ then throw("wrong multiplier")
128+ else if ((getIntegerValue(this, "latestRequestId") >= requestId))
129+ then throw("requestId is not new")
130+ else {
131+ let result = getBinaryValue(bridge, (toString(requestId) + "/result"))
132+ let price = decodeInt64(result, 0)[0]
133+ WriteSet([DataEntry("latestWavesPrice", price), DataEntry("latestRequestId", requestId)])
134+ }
135+ }
150136 }
151137
152138
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 3 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 func decodeInt8 (data,offset) = if ((1 > size(data)))
55 then throw("decode u8 error, data must be at least 1 byte")
66 else if ((offset > size(data)))
77 then throw("decode u8 error, decoding is finish")
88 else {
99 let x0 = take(drop(data, offset), 1)
1010 let x1 = toInt((base58'1111111' + x0), 0)
1111 if ((128 > x1))
1212 then [x1, (offset + 1)]
1313 else [toInt((base58'Ahg1opVcGW' + x0), 0), (offset + 1)]
1414 }
1515
1616
1717 func decodeInt16 (data,offset) = if ((2 > size(data)))
1818 then throw("decode u16 error, data must be at least 2 bytes")
1919 else if ((offset > size(data)))
2020 then throw("decode u16 error, decoding is finish")
2121 else {
2222 let x0 = drop(data, offset)
2323 let x1 = take(x0, 1)
2424 let x2 = take(drop(x0, 1), 1)
2525 if ((decodeInt8(x2, 0)[0] >= 0))
2626 then [toInt(((base58'111111' + x2) + x1), 0), (offset + 2)]
2727 else [toInt(((base58'3CUsUpv9t' + x2) + x1), 0), (offset + 2)]
2828 }
2929
3030
3131 func decodeInt32 (data,offset) = if ((4 > size(data)))
3232 then throw("decode u32 error, data must be at least 4 bytes")
3333 else if ((offset > size(data)))
3434 then throw("decode u32 error, decoding is finish")
3535 else {
3636 let x0 = drop(data, offset)
3737 let x1 = take(x0, 1)
3838 let x2 = take(drop(x0, 1), 1)
3939 let x3 = take(drop(x0, 2), 1)
4040 let x4 = take(drop(x0, 3), 1)
4141 if ((decodeInt8(x4, 0)[0] >= 0))
4242 then [toInt(((((base58'1111' + x4) + x3) + x2) + x1), 0), (offset + 4)]
4343 else [toInt(((((base58'7YXq9G' + x4) + x3) + x2) + x1), 0), (offset + 4)]
4444 }
4545
4646
4747 func decodeInt64 (data,offset) = if ((8 > size(data)))
4848 then throw("decode u32 error, data must be at least 8 bytes")
4949 else if ((offset > size(data)))
5050 then throw("decode u32 error, decoding is finish")
5151 else {
5252 let x0 = drop(data, offset)
5353 let x1 = take(x0, 1)
5454 let x2 = take(drop(x0, 1), 1)
5555 let x3 = take(drop(x0, 2), 1)
5656 let x4 = take(drop(x0, 3), 1)
5757 let x5 = take(drop(x0, 4), 1)
5858 let x6 = take(drop(x0, 5), 1)
5959 let x7 = take(drop(x0, 6), 1)
6060 let x8 = take(drop(x0, 7), 1)
6161 [toInt((((((((x8 + x7) + x6) + x5) + x4) + x3) + x2) + x1), 0), (offset + 8)]
6262 }
6363
6464
65-func decodeBool (data,offset) = {
66- let decoded1 = decodeInt8(data, offset)
67-[DataEntry("bool", (decoded1[0] != 0)), DataEntry("int", decoded1[1])]
68- }
69-
70-
71-func decodeBytes32 (data,offset) = if ((32 > size(data)))
72- then throw("decode bytes32 error, data must be at least 32 bytes")
73- else [DataEntry("byte_vector", take(drop(data, offset), 32)), DataEntry("int", (offset + 32))]
74-
75-
76-func decodeBytes64 (data,offset) = if ((64 > size(data)))
77- then throw("decode bytes64 error, data must be at least 64 bytes")
78- else [DataEntry("byte_vector", take(drop(data, offset), 64)), DataEntry("int", (offset + 64))]
79-
80-
81-func decodeBytes65 (data,offset) = if ((65 > size(data)))
82- then throw("decode bytes65 error, data must be at least 65 bytes")
83- else [DataEntry("byte_vector", take(drop(data, offset), 65)), DataEntry("int", (offset + 65))]
84-
85-
86-func decodeBytes (data,offset) = {
87- let decoded1 = decodeInt32(data, offset)
88- let bytesSize = decoded1[0]
89- let nextOffset = decoded1[1]
90-[DataEntry("byte_vector", take(drop(data, nextOffset), bytesSize)), DataEntry("int", (nextOffset + bytesSize))]
91- }
92-
93-
9465 func decodeString (data,offset) = {
9566 let decoded1 = decodeInt32(data, offset)
9667 let bytesSize = decoded1[0]
9768 let nextOffset = decoded1[1]
9869 [DataEntry("string", toUtf8String(take(drop(data, nextOffset), bytesSize))), DataEntry("int", (nextOffset + bytesSize))]
9970 }
100-
101-
102-func getAsBool (tuple) = match tuple[0].value {
103- case b: Boolean =>
104- b
105- case _ =>
106- throw("not a Boolean")
107-}
108-
109-
110-func getAsByteVector (tuple) = match tuple[0].value {
111- case bv: ByteVector =>
112- bv
113- case _ =>
114- throw("not a ByteVector")
115-}
11671
11772
11873 func getAsString (tuple) = match tuple[0].value {
11974 case s: String =>
12075 s
12176 case _ =>
12277 throw("not a String")
12378 }
12479
12580
12681 func getOffset (tuple) = match tuple[1].value {
12782 case i: Int =>
12883 i
12984 case _ =>
13085 throw("not a Int")
13186 }
13287
13388
13489 @Callable(contextObj)
135-func relayAndVerify (data) = {
136- let req1 = decodeString(data, 0)
137- let req2 = decodeInt64(data, getOffset(req1))
138- let req3 = decodeBytes(data, req2[1])
139- let req4 = decodeInt64(data, getOffset(req3))
140- let req5 = decodeInt64(data, req4[1])
141- let res1 = decodeString(data, req5[1])
142- let res2 = decodeInt64(data, getOffset(res1))
143- let res3 = decodeInt64(data, res2[1])
144- let res4 = decodeInt64(data, res3[1])
145- let res5 = decodeInt64(data, res4[1])
146- let res6 = decodeInt8(data, res5[1])
147- let res7 = decodeBytes(data, res6[1])
148- let requestID = toString(res2[0])
149- WriteSet([DataEntry((requestID + "/clientId"), req1[0].value), DataEntry((requestID + "/oracleScriptId"), req2[0]), DataEntry((requestID + "/calldata"), req3[0].value), DataEntry((requestID + "/askCount"), req4[0]), DataEntry((requestID + "/minCount"), req5[0]), DataEntry((requestID + "/ansCount"), res3[0]), DataEntry((requestID + "/requestTime"), res4[0]), DataEntry((requestID + "/resolveTime"), res5[0]), DataEntry((requestID + "/resolveStatus"), res6[0]), DataEntry((requestID + "/result"), res7[0].value)])
90+func init (bridgeAddress) = if ((contextObj.caller != this))
91+ then throw("permission denied")
92+ else match getInteger(this, "latestRequestId") {
93+ case latestRequestId: Int =>
94+ throw("already init")
95+ case _ =>
96+ match getInteger(this, "latestWavesPrice") {
97+ case latestWavesPrice: Int =>
98+ throw("already init")
99+ case _ =>
100+ WriteSet([DataEntry("oracleScriptId", 1), DataEntry("symbol", "WAVES"), DataEntry("multiplier", 100), DataEntry("latestRequestId", 0), DataEntry("latestWavesPrice", 0)])
101+ }
102+ }
103+
104+
105+
106+@Callable(contextObj)
107+func setBridge (bridgeAddress) = if ((contextObj.caller != this))
108+ then throw("permission denied")
109+ else WriteSet([DataEntry("bridge", bridgeAddress)])
110+
111+
112+
113+@Callable(contextObj)
114+func setLatestWavesPrice (requestId) = {
115+ let bridge = Address(getBinaryValue(this, "bridge"))
116+ if ((getIntegerValue(bridge, (toString(requestId) + "/oracleScriptId")) != getIntegerValue(this, "oracleScriptId")))
117+ then throw("incorrect oracleScriptId")
118+ else {
119+ let calldata = getBinaryValue(bridge, (toString(requestId) + "/calldata"))
120+ let tuple1 = decodeString(calldata, 0)
121+ let tuple2 = decodeInt64(calldata, getOffset(tuple1))
122+ let symbol = getAsString(tuple1)
123+ let multiplier = tuple2[0]
124+ if ((symbol != getStringValue(this, "symbol")))
125+ then throw("wrong symbol")
126+ else if ((multiplier != getIntegerValue(this, "multiplier")))
127+ then throw("wrong multiplier")
128+ else if ((getIntegerValue(this, "latestRequestId") >= requestId))
129+ then throw("requestId is not new")
130+ else {
131+ let result = getBinaryValue(bridge, (toString(requestId) + "/result"))
132+ let price = decodeInt64(result, 0)[0]
133+ WriteSet([DataEntry("latestWavesPrice", price), DataEntry("latestRequestId", requestId)])
134+ }
135+ }
150136 }
151137
152138

github/deemru/w8io/3ef1775 
40.59 ms