move domain clasess to dshackle to fix integer limitation of transaction V value
This commit is contained in:
@@ -0,0 +1,186 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2020 EmeraldPay Inc, All Rights Reserved.
|
||||||
|
* Copyright (c) 2016-2017 Infinitape Inc, All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.emeraldpay.dshackle.upstream.ethereum.domain;
|
||||||
|
|
||||||
|
import io.emeraldpay.etherjar.hex.Hex32;
|
||||||
|
import io.emeraldpay.etherjar.hex.HexData;
|
||||||
|
import org.bouncycastle.jcajce.provider.digest.Keccak;
|
||||||
|
import org.bouncycastle.util.encoders.Hex;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ethereum Wallet address
|
||||||
|
*/
|
||||||
|
public class Address extends HexData {
|
||||||
|
|
||||||
|
private final static byte[] HEX_BYTES = "0123456789abcdef".getBytes();
|
||||||
|
|
||||||
|
public static final int SIZE_BYTES = 20;
|
||||||
|
public static final int SIZE_HEX = 2 + SIZE_BYTES * 2;
|
||||||
|
|
||||||
|
private static final byte[] EMPTY_12BYTES = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Use {@link Address#empty()}
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
public static final Address EMPTY = Address.from("0x0000000000000000000000000000000000000000");
|
||||||
|
|
||||||
|
private static final Pattern CASE_INSENSITIVE_PATTERN = Pattern.compile("0x(?i:[0-9a-f]{40})");
|
||||||
|
private static final Pattern CASE_SENSITIVE_PATTERN = Pattern.compile("0x(?:[0-9a-f]{40}|[0-9A-F]{40})");
|
||||||
|
|
||||||
|
private Address(byte[] bytes) {
|
||||||
|
super(bytes, SIZE_BYTES);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create address from the provided value
|
||||||
|
*
|
||||||
|
* @param value 20 byte data
|
||||||
|
* @return address
|
||||||
|
*/
|
||||||
|
public static Address from(HexData value) {
|
||||||
|
if (value == null) {
|
||||||
|
throw new IllegalArgumentException("Null input value");
|
||||||
|
}
|
||||||
|
if (value.getSize() != SIZE_BYTES) {
|
||||||
|
throw new IllegalArgumentException("Invalid input length: " + value.getSize() + " != " + SIZE_BYTES);
|
||||||
|
}
|
||||||
|
return new Address(value.getBytes());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Address from(byte[] value) {
|
||||||
|
if (value == null) {
|
||||||
|
throw new IllegalArgumentException("Null input value");
|
||||||
|
}
|
||||||
|
if (value.length != SIZE_BYTES) {
|
||||||
|
throw new IllegalArgumentException("Invalid input length: " + value.length + " != " + SIZE_BYTES);
|
||||||
|
}
|
||||||
|
return new Address(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Address from(String value) {
|
||||||
|
if (value == null) {
|
||||||
|
throw new IllegalArgumentException("Null input value");
|
||||||
|
}
|
||||||
|
if (value.length() != SIZE_HEX) {
|
||||||
|
throw new IllegalArgumentException("Invalid input length: " + value.length() + " != " + SIZE_HEX);
|
||||||
|
}
|
||||||
|
return new Address(HexData.from(value).getBytes());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Address empty() {
|
||||||
|
return new Address(new byte[SIZE_BYTES]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extract address from Hex32 (i.e. from method call parameters, logs, etc). The extract method verifies
|
||||||
|
* that the input in fact contains only address, i.e. input has zeroes for initial non-address bytes.
|
||||||
|
*
|
||||||
|
* @param value a Hex 32
|
||||||
|
* @return address
|
||||||
|
*/
|
||||||
|
public static Address extract(Hex32 value) {
|
||||||
|
if (value == null) {
|
||||||
|
throw new IllegalArgumentException("Null input value");
|
||||||
|
}
|
||||||
|
byte[] bytes = value.getBytes();
|
||||||
|
byte[] empty = new byte[Hex32.SIZE_BYTES - Address.SIZE_BYTES];
|
||||||
|
System.arraycopy(bytes, 0, empty, 0, empty.length);
|
||||||
|
if (!Arrays.equals(empty, EMPTY_12BYTES)) {
|
||||||
|
throw new IllegalArgumentException("Hex32 has non zero prefix for an Address");
|
||||||
|
}
|
||||||
|
byte[] address = new byte[Address.SIZE_BYTES];
|
||||||
|
System.arraycopy(bytes, Hex32.SIZE_BYTES - Address.SIZE_BYTES, address,0, address.length);
|
||||||
|
return new Address(address);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validate address according to EIP 55.
|
||||||
|
*
|
||||||
|
* @param address a wallet address ('0x...')
|
||||||
|
* @return {@code true} if address correct or {@code false} otherwise
|
||||||
|
* @see <a href="https://github.com/ethereum/EIPs/issues/55">EIP 55</a>
|
||||||
|
*/
|
||||||
|
public static boolean isValidAddress(String address) {
|
||||||
|
return CASE_INSENSITIVE_PATTERN.matcher(address).matches()
|
||||||
|
&& (CASE_SENSITIVE_PATTERN.matcher(address).matches() || isValidChecksum(address));
|
||||||
|
}
|
||||||
|
|
||||||
|
public String toChecksumString() {
|
||||||
|
Keccak.Digest256 digest256 = new Keccak.Digest256();
|
||||||
|
|
||||||
|
byte[] hex = new byte[value.length * 2];
|
||||||
|
for(int i = 0, j = 0; i < value.length; i++){
|
||||||
|
hex[j++] = HEX_BYTES[(0xF0 & value[i]) >>> 4];
|
||||||
|
hex[j++] = HEX_BYTES[0x0F & value[i]];
|
||||||
|
}
|
||||||
|
digest256.update(hex);
|
||||||
|
String hash = Hex.toHexString(digest256.digest());
|
||||||
|
|
||||||
|
char[] plain = toHex().toCharArray();
|
||||||
|
char[] str = new char[hex.length + 2];
|
||||||
|
if (plain.length != str.length) {
|
||||||
|
throw new IllegalStateException("Hex representation has invalid length: " + plain.length + " != " + str.length);
|
||||||
|
}
|
||||||
|
str[0] = '0';
|
||||||
|
str[1] = 'x';
|
||||||
|
for (int i = 0; i < 40; i++) {
|
||||||
|
int dg = Character.digit(hash.charAt(i), 16);
|
||||||
|
if (dg > 7) {
|
||||||
|
str[i + 2] = Character.toUpperCase(plain[i + 2]);
|
||||||
|
} else {
|
||||||
|
str[i + 2] = plain[i + 2];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return new String(str);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return toChecksumString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if the given string is an address with checksum (Keccak256).
|
||||||
|
*
|
||||||
|
* @param address a wallet address ('0x...')
|
||||||
|
* @return {@code true} if address with checksum
|
||||||
|
*/
|
||||||
|
static boolean isValidChecksum(String address) {
|
||||||
|
Keccak.Digest256 digest256 = new Keccak.Digest256();
|
||||||
|
|
||||||
|
digest256.update(
|
||||||
|
address.substring(2).toLowerCase().getBytes());
|
||||||
|
|
||||||
|
String hash = Hex.toHexString(digest256.digest());
|
||||||
|
|
||||||
|
for (int i = 0; i < 40; i++) {
|
||||||
|
char ch = address.charAt(i + 2);
|
||||||
|
int dg = Character.digit(hash.charAt(i), 16);
|
||||||
|
|
||||||
|
if ((dg > 7 && Character.toUpperCase(ch) != ch)
|
||||||
|
|| (dg <= 7 && Character.toLowerCase(ch) != ch))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,54 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2020 EmeraldPay Inc, All Rights Reserved.
|
||||||
|
* Copyright (c) 2016-2017 Infinitape Inc, All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.emeraldpay.dshackle.upstream.ethereum.domain;
|
||||||
|
|
||||||
|
import io.emeraldpay.etherjar.hex.HexData;
|
||||||
|
|
||||||
|
public class BlockHash extends HexData {
|
||||||
|
|
||||||
|
public static final int SIZE_BYTES = 32;
|
||||||
|
public static final int SIZE_HEX = 2 + SIZE_BYTES * 2;
|
||||||
|
|
||||||
|
public BlockHash(byte[] value) {
|
||||||
|
super(value, SIZE_BYTES);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static BlockHash from(byte[] value) {
|
||||||
|
if (value == null) {
|
||||||
|
throw new IllegalArgumentException("Null Hash");
|
||||||
|
}
|
||||||
|
if (value.length != SIZE_BYTES) {
|
||||||
|
throw new IllegalArgumentException("Invalid Block Hash length: " + value.length);
|
||||||
|
}
|
||||||
|
return new BlockHash(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static BlockHash from(String value) {
|
||||||
|
if (value == null) {
|
||||||
|
throw new IllegalArgumentException("Null Hash");
|
||||||
|
}
|
||||||
|
if (value.length() != SIZE_HEX) {
|
||||||
|
throw new IllegalArgumentException("Invalid Block Hash length: " + value.length());
|
||||||
|
}
|
||||||
|
return new BlockHash(HexData.from(value).getBytes());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static BlockHash empty() {
|
||||||
|
return new BlockHash(new byte[SIZE_BYTES]);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,131 @@
|
|||||||
|
package io.emeraldpay.dshackle.upstream.ethereum.domain;
|
||||||
|
|
||||||
|
import io.emeraldpay.etherjar.hex.HexData;
|
||||||
|
import org.bouncycastle.jcajce.provider.digest.Keccak;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
|
public class Bloom extends HexData {
|
||||||
|
|
||||||
|
public static final int SIZE_BYTES = 256;
|
||||||
|
public static final int SIZE_HEX = 2 + SIZE_BYTES * 2;
|
||||||
|
|
||||||
|
public Bloom(byte[] value) {
|
||||||
|
super(value, SIZE_BYTES);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Bloom from(HexData value) {
|
||||||
|
if (value == null) {
|
||||||
|
throw new IllegalArgumentException("Null input value");
|
||||||
|
}
|
||||||
|
if (value.getSize() != SIZE_BYTES) {
|
||||||
|
throw new IllegalArgumentException("Invalid input length: " + value.getSize() + " != " + SIZE_BYTES);
|
||||||
|
}
|
||||||
|
return new Bloom(value.getBytes());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Bloom from(String value) {
|
||||||
|
if (value == null) {
|
||||||
|
throw new IllegalArgumentException("Null input value");
|
||||||
|
}
|
||||||
|
if (value.length() != SIZE_HEX) {
|
||||||
|
throw new IllegalArgumentException("Invalid input length: " + value.length() + " != " + SIZE_HEX);
|
||||||
|
}
|
||||||
|
return new Bloom(HexData.from(value).getBytes());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Bloom empty() {
|
||||||
|
return new Bloom(new byte[SIZE_BYTES]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Bloom mergeWith(Bloom another) {
|
||||||
|
byte[] result = new byte[SIZE_BYTES];
|
||||||
|
for (int i = 0; i < SIZE_BYTES; i++) {
|
||||||
|
result[i] = (byte)(this.value[i] | another.value[i]);
|
||||||
|
}
|
||||||
|
return new Bloom(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Builder newBuilder() {
|
||||||
|
return new Builder();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int bytePosition(int bitpos) {
|
||||||
|
return bitpos >> 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int byteMask(int bytepos, int bitpos) {
|
||||||
|
int inbytepos = bitpos - (bytepos << 3);
|
||||||
|
return 1 << (inbytepos);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Builder {
|
||||||
|
private final byte[] current = new byte[SIZE_BYTES];
|
||||||
|
private final Keccak.Digest256 keccak = new Keccak.Digest256();
|
||||||
|
|
||||||
|
public Builder add(HexData value) {
|
||||||
|
keccak.update(value.getBytes());
|
||||||
|
byte[] hash = keccak.digest();
|
||||||
|
|
||||||
|
for (int i = 0; i < 6; i+= 2) {
|
||||||
|
int high = hash[i] & 0x7;
|
||||||
|
int low = hash[i + 1] & 0xff;
|
||||||
|
int bitpos = (high << 8) + low;
|
||||||
|
int bytepos = bytePosition(bitpos);
|
||||||
|
int bytemask = byteMask(bytepos, bitpos);
|
||||||
|
current[SIZE_BYTES - bytepos - 1] |= bytemask & 0xff;
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Bloom build() {
|
||||||
|
return new Bloom(current);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Filter buildFilter() {
|
||||||
|
List<Filter.Check> checks = new ArrayList<>();
|
||||||
|
for (int i = 0; i < SIZE_BYTES; i++) {
|
||||||
|
if (current[i] != 0) {
|
||||||
|
checks.add(new Filter.Check(i, current[i]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return new Filter(checks.toArray(new Filter.Check[0]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Filter {
|
||||||
|
private final Check[] checks;
|
||||||
|
|
||||||
|
public Filter(Check[] checks) {
|
||||||
|
this.checks = checks;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isSet(Bloom bloom) {
|
||||||
|
for (Check check: checks) {
|
||||||
|
int actual = bloom.value[check.pos] & check.mask;
|
||||||
|
if (actual == 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Check {
|
||||||
|
private final int pos;
|
||||||
|
private final byte mask;
|
||||||
|
|
||||||
|
public Check(int pos, byte mask) {
|
||||||
|
if (pos >= SIZE_BYTES) {
|
||||||
|
throw new IllegalArgumentException("Out of filter boundaries position: " + pos);
|
||||||
|
}
|
||||||
|
if (mask == 0) {
|
||||||
|
throw new IllegalArgumentException("Mask cannot be empty");
|
||||||
|
}
|
||||||
|
this.pos = pos;
|
||||||
|
this.mask = mask;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,59 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2020 EmeraldPay Inc, All Rights Reserved.
|
||||||
|
* Copyright (c) 2016-2017 Infinitape Inc, All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.emeraldpay.dshackle.upstream.ethereum.domain;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* CHAIN_ID for Replay Protection (EIP-155)
|
||||||
|
*/
|
||||||
|
public class ChainId {
|
||||||
|
|
||||||
|
private long value;
|
||||||
|
|
||||||
|
public ChainId(long value) {
|
||||||
|
this.value = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getValue() {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String toHex() {
|
||||||
|
StringBuilder buf = new StringBuilder(4);
|
||||||
|
buf.append("0x");
|
||||||
|
if (value < 16) {
|
||||||
|
buf.append('0');
|
||||||
|
}
|
||||||
|
buf.append(Long.toHexString(value));
|
||||||
|
return buf.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object o) {
|
||||||
|
if (this == o) return true;
|
||||||
|
if (!(o instanceof ChainId)) return false;
|
||||||
|
|
||||||
|
ChainId chainId = (ChainId) o;
|
||||||
|
|
||||||
|
return value == chainId.value;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return (int)value;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,74 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2021 EmeraldPay Inc, All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package io.emeraldpay.dshackle.upstream.ethereum.domain;
|
||||||
|
|
||||||
|
import io.emeraldpay.etherjar.hex.Hex32;
|
||||||
|
import io.emeraldpay.etherjar.hex.HexData;
|
||||||
|
import org.bouncycastle.jcajce.provider.digest.Keccak;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A 32-byte long id representing a contract event, i.e. first item of the topics array in the log.
|
||||||
|
* Calculated as keccac256("EventName(types...)")
|
||||||
|
*/
|
||||||
|
public class EventId extends Hex32 {
|
||||||
|
|
||||||
|
public static final int SIZE_BYTES = Hex32.SIZE_BYTES;
|
||||||
|
public static final int SIZE_HEX = Hex32.SIZE_HEX;
|
||||||
|
|
||||||
|
private EventId(byte[] value) {
|
||||||
|
super(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static EventId from(byte[] value) {
|
||||||
|
if (value == null)
|
||||||
|
throw new IllegalArgumentException("Null Hash");
|
||||||
|
|
||||||
|
if (value.length != SIZE_BYTES)
|
||||||
|
throw new IllegalArgumentException("Invalid EventId length: " + value.length);
|
||||||
|
|
||||||
|
return new EventId(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static EventId from(String value) {
|
||||||
|
if (value == null)
|
||||||
|
throw new IllegalArgumentException("Null Hash");
|
||||||
|
|
||||||
|
if (value.length() != SIZE_HEX)
|
||||||
|
throw new IllegalArgumentException("Invalid EventId length: " + value.length());
|
||||||
|
|
||||||
|
return new EventId(HexData.from(value).getBytes());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static EventId empty() {
|
||||||
|
return new EventId(new byte[SIZE_BYTES]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static EventId fromSignature(String name, String... types) {
|
||||||
|
return fromSignature(name, Arrays.asList(types));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static EventId fromSignature(String name, Collection<String> types) {
|
||||||
|
String sign = Objects.requireNonNull(name) +
|
||||||
|
'(' + String.join(",", Objects.requireNonNull(types)) + ')';
|
||||||
|
Keccak.Digest256 digest256 = new Keccak.Digest256();
|
||||||
|
digest256.update(sign.getBytes());
|
||||||
|
return from(digest256.digest());
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2020 EmeraldPay Inc, All Rights Reserved.
|
||||||
|
* Copyright (c) 2016-2017 Infinitape Inc, All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.emeraldpay.dshackle.upstream.ethereum.domain;
|
||||||
|
|
||||||
|
import io.emeraldpay.etherjar.hex.HexData;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An address, followed by a function selector.
|
||||||
|
*/
|
||||||
|
public class Function extends HexData {
|
||||||
|
|
||||||
|
public static final int SIZE_BYTES = 24;
|
||||||
|
public static final int SIZE_HEX = 2 + SIZE_BYTES * 2;
|
||||||
|
|
||||||
|
private Function(byte[] bytes) {
|
||||||
|
super(bytes, SIZE_BYTES);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Function from(byte[] value) {
|
||||||
|
if (value == null) {
|
||||||
|
throw new IllegalArgumentException("Null Function");
|
||||||
|
}
|
||||||
|
if (value.length != SIZE_BYTES) {
|
||||||
|
throw new IllegalArgumentException("Invalid Function length: " + value.length);
|
||||||
|
}
|
||||||
|
return new Function(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Function from(String value) {
|
||||||
|
if (value == null) {
|
||||||
|
throw new IllegalArgumentException("Null Function");
|
||||||
|
}
|
||||||
|
if (value.length() != SIZE_HEX) {
|
||||||
|
throw new IllegalArgumentException("Invalid Function length: " + value.length());
|
||||||
|
}
|
||||||
|
return new Function(HexData.from(value).getBytes());
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,97 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2020 EmeraldPay Inc, All Rights Reserved.
|
||||||
|
* Copyright (c) 2016-2017 Infinitape Inc, All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.emeraldpay.dshackle.upstream.ethereum.domain;
|
||||||
|
|
||||||
|
import io.emeraldpay.etherjar.hex.HexData;
|
||||||
|
import org.bouncycastle.jcajce.provider.digest.Keccak;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The first four bytes of the call data for a function call specifies the function to be called.
|
||||||
|
*
|
||||||
|
* <p>It is the first (left, high-order in big-endian) four bytes of the Keccak256 (SHA-3) hash
|
||||||
|
* of the signature of the function.
|
||||||
|
*
|
||||||
|
* @see <a href="https://github.com/ethereum/wiki/wiki/Ethereum-Contract-ABI#function-selector">Function Selector</a>
|
||||||
|
*/
|
||||||
|
public class MethodId extends HexData {
|
||||||
|
|
||||||
|
public static final int SIZE_BYTES = 4;
|
||||||
|
public static final int SIZE_HEX = 2 + SIZE_BYTES * 2;
|
||||||
|
|
||||||
|
public static MethodId fromSignature(String name, String... types) {
|
||||||
|
return fromSignature(name, Arrays.asList(types));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static MethodId fromSignature(String name, Collection<String> types) {
|
||||||
|
String sign = Objects.requireNonNull(name) +
|
||||||
|
'(' + String.join(",", Objects.requireNonNull(types)) + ')';
|
||||||
|
|
||||||
|
byte[] head = new byte[SIZE_BYTES];
|
||||||
|
Keccak.Digest256 digest256 = new Keccak.Digest256();
|
||||||
|
|
||||||
|
digest256.update(sign.getBytes());
|
||||||
|
System.arraycopy(digest256.digest(), 0, head, 0, SIZE_BYTES);
|
||||||
|
|
||||||
|
return from(head);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static MethodId from(byte[] value) {
|
||||||
|
if (value == null)
|
||||||
|
throw new IllegalArgumentException("Null Hash");
|
||||||
|
|
||||||
|
if (value.length != SIZE_BYTES)
|
||||||
|
throw new IllegalArgumentException("Invalid MethodId length: " + value.length);
|
||||||
|
|
||||||
|
return new MethodId(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static MethodId from(String value) {
|
||||||
|
if (value == null)
|
||||||
|
throw new IllegalArgumentException("Null Hash");
|
||||||
|
|
||||||
|
if (value.length() != SIZE_HEX)
|
||||||
|
throw new IllegalArgumentException("Invalid MethodId length: " + value.length());
|
||||||
|
|
||||||
|
return new MethodId(HexData.from(value).getBytes());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static MethodId empty() {
|
||||||
|
return new MethodId(new byte[SIZE_BYTES]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static MethodId fromInput(HexData input) {
|
||||||
|
if (input == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
byte[] data = input.getBytes();
|
||||||
|
if (data.length < SIZE_BYTES) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
byte[] head = new byte[SIZE_BYTES];
|
||||||
|
System.arraycopy(data, 0, head, 0, SIZE_BYTES);
|
||||||
|
return new MethodId(head);
|
||||||
|
}
|
||||||
|
|
||||||
|
public MethodId(byte[] value) {
|
||||||
|
super(value, SIZE_BYTES);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,51 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2020 EmeraldPay Inc, All Rights Reserved.
|
||||||
|
* Copyright (c) 2016-2017 Infinitape Inc, All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.emeraldpay.dshackle.upstream.ethereum.domain;
|
||||||
|
|
||||||
|
|
||||||
|
import io.emeraldpay.etherjar.hex.HexData;
|
||||||
|
|
||||||
|
public class Nonce extends HexData {
|
||||||
|
|
||||||
|
public static final int SIZE_BYTES = 8;
|
||||||
|
public static final int SIZE_HEX = 2 + SIZE_BYTES * 2;
|
||||||
|
|
||||||
|
public Nonce(byte[] value) {
|
||||||
|
super(value, SIZE_BYTES);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Nonce from(byte[] value) {
|
||||||
|
if (value == null) {
|
||||||
|
throw new IllegalArgumentException("Null Hash");
|
||||||
|
}
|
||||||
|
if (value.length != SIZE_BYTES) {
|
||||||
|
throw new IllegalArgumentException("Invalid Nonce length: " + value.length);
|
||||||
|
}
|
||||||
|
return new Nonce(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Nonce from(String value) {
|
||||||
|
if (value == null) {
|
||||||
|
throw new IllegalArgumentException("Null Hash");
|
||||||
|
}
|
||||||
|
if (value.length() != SIZE_HEX) {
|
||||||
|
throw new IllegalArgumentException("Invalid Nonce length: " + value.length());
|
||||||
|
}
|
||||||
|
return new Nonce(HexData.from(value).getBytes());
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,67 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2020 EmeraldPay Inc, All Rights Reserved.
|
||||||
|
* Copyright (c) 2016-2017 Infinitape Inc, All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.emeraldpay.dshackle.upstream.ethereum.domain;
|
||||||
|
|
||||||
|
import io.emeraldpay.etherjar.hex.HexData;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Transaction Hash value
|
||||||
|
*/
|
||||||
|
public class TransactionId extends HexData {
|
||||||
|
|
||||||
|
public static final int SIZE_BYTES = 32;
|
||||||
|
public static final int SIZE_HEX = 2 + SIZE_BYTES * 2;
|
||||||
|
|
||||||
|
protected TransactionId(byte[] value) {
|
||||||
|
super(value, SIZE_BYTES);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse value from bytes representation. Value must be 32 bytes long.
|
||||||
|
*
|
||||||
|
* @param value bytes representation
|
||||||
|
* @return TransactionId
|
||||||
|
*/
|
||||||
|
public static TransactionId from(byte[] value) {
|
||||||
|
if (value.length != SIZE_BYTES) {
|
||||||
|
throw new IllegalArgumentException("Invalid Tx length: " + value.length);
|
||||||
|
}
|
||||||
|
return new TransactionId(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse value from hex representation. Value must be 64 characters long.
|
||||||
|
*
|
||||||
|
* @param value bytes representation
|
||||||
|
* @return TransactionId
|
||||||
|
*/
|
||||||
|
public static TransactionId from(String value) {
|
||||||
|
if (value == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
if (value.length() != SIZE_HEX) {
|
||||||
|
throw new IllegalArgumentException("Invalid Tx length: " + value.length());
|
||||||
|
}
|
||||||
|
return new TransactionId(HexData.from(value).getBytes());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static TransactionId empty() {
|
||||||
|
return new TransactionId(new byte[SIZE_BYTES]);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
package io.emeraldpay.dshackle.upstream.ethereum.domain;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Transaction reference
|
||||||
|
*/
|
||||||
|
public interface TransactionRef {
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @return hash of the transaction
|
||||||
|
*/
|
||||||
|
TransactionId getHash();
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,115 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2020 EmeraldPay Inc, All Rights Reserved.
|
||||||
|
* Copyright (c) 2016-2017 Infinitape Inc, All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.emeraldpay.dshackle.upstream.ethereum.domain;
|
||||||
|
|
||||||
|
import io.emeraldpay.etherjar.hex.HexData;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Transaction signature with support of Replay Protection (EIP-155)
|
||||||
|
*/
|
||||||
|
public class TransactionSignature {
|
||||||
|
|
||||||
|
private ChainId chainId;
|
||||||
|
|
||||||
|
private HexData publicKey;
|
||||||
|
private HexData r;
|
||||||
|
private HexData s;
|
||||||
|
private Long v;
|
||||||
|
|
||||||
|
public TransactionSignature() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public ChainId getChainId() {
|
||||||
|
return chainId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setChainId(ChainId chainId) {
|
||||||
|
this.chainId = chainId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public HexData getPublicKey() {
|
||||||
|
return publicKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPublicKey(HexData publicKey) {
|
||||||
|
this.publicKey = publicKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
public HexData getR() {
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setR(HexData r) {
|
||||||
|
this.r = r;
|
||||||
|
}
|
||||||
|
|
||||||
|
public HexData getS() {
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setS(HexData s) {
|
||||||
|
this.s = s;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Long getV() {
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setV(Long v) {
|
||||||
|
if (v == null || v < 0) {
|
||||||
|
throw new IllegalArgumentException("Invalid V: " + v);
|
||||||
|
}
|
||||||
|
this.v = v;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ChainId getExtractedChainId() {
|
||||||
|
if (!isProtected()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return new ChainId((v - 35) / 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Long getNormalizedV() {
|
||||||
|
if (chainId == null) {
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
return v - chainId.getValue() * 2 - 35 + 27;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isProtected() {
|
||||||
|
if (v == 27 || v == 28) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object o) {
|
||||||
|
if (this == o) return true;
|
||||||
|
if (!(o instanceof TransactionSignature)) return false;
|
||||||
|
TransactionSignature that = (TransactionSignature) o;
|
||||||
|
return Objects.equals(chainId, that.chainId) && Objects.equals(publicKey, that.publicKey) && Objects.equals(r, that.r) && Objects.equals(s, that.s) && Objects.equals(v, that.v);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return Objects.hash(chainId, s, v);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,254 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2020 EmeraldPay Inc, All Rights Reserved.
|
||||||
|
* Copyright (c) 2016-2017 Infinitape Inc, All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.emeraldpay.dshackle.upstream.ethereum.domain;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.math.BigInteger;
|
||||||
|
import java.math.RoundingMode;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wei amount.
|
||||||
|
*/
|
||||||
|
public class Wei implements Serializable, Comparable<Wei> {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wei denomination units.
|
||||||
|
*/
|
||||||
|
public enum Unit {
|
||||||
|
|
||||||
|
WEI("wei", 0),
|
||||||
|
KWEI("Kwei", 3),
|
||||||
|
MWEI("Mwei", 6),
|
||||||
|
GWEI("Gwei", 9),
|
||||||
|
SZABO("szabo", 12),
|
||||||
|
FINNEY("finney", 15),
|
||||||
|
ETHER("ether", 18),
|
||||||
|
KETHER("Kether", 21),
|
||||||
|
METHER("Mether", 24);
|
||||||
|
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
private int scale;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param name a unit name
|
||||||
|
* @param scale a wei base multiplication factor expressed as a degree of power ten
|
||||||
|
*/
|
||||||
|
Unit(String name, int scale) {
|
||||||
|
this.name = name;
|
||||||
|
this.scale = scale;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return a unit name
|
||||||
|
*/
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return a wei base multiplication factor expressed as a degree of power ten
|
||||||
|
*/
|
||||||
|
public int getScale() {
|
||||||
|
return scale;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public final static Wei ZERO = new Wei();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param val amount in {@link Unit#ETHER}
|
||||||
|
* @return corresponding amount in wei
|
||||||
|
* @see #ofUnits(double, Unit)
|
||||||
|
*/
|
||||||
|
public static Wei ofEthers(double val) {
|
||||||
|
return ofUnits(val, Unit.ETHER);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param num amount in {@link Unit#ETHER}
|
||||||
|
* @return corresponding amount in wei
|
||||||
|
* @see #ofUnits(BigDecimal, Unit)
|
||||||
|
*/
|
||||||
|
public static Wei ofEthers(BigDecimal num) {
|
||||||
|
return ofUnits(num, Unit.ETHER);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param val amount in some custom denomination {@link Unit}
|
||||||
|
* @param unit target unit
|
||||||
|
* @return corresponding amount in wei
|
||||||
|
*/
|
||||||
|
public static Wei ofUnits(double val, Unit unit) {
|
||||||
|
return ofUnits(BigDecimal.valueOf(val), unit);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param num amount in some custom denomination {@link Unit}
|
||||||
|
* @param unit target unit
|
||||||
|
* @return corresponding amount in wei
|
||||||
|
*/
|
||||||
|
public static Wei ofUnits(BigDecimal num, Unit unit) {
|
||||||
|
return new Wei(num.scaleByPowerOfTen(unit.getScale()).toBigInteger());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse hex representation of the amount, like 0x100
|
||||||
|
*
|
||||||
|
* @param value string representation of the amount
|
||||||
|
* @return parsed value or exception
|
||||||
|
* @throws IllegalArgumentException if passed value is null or not hex
|
||||||
|
*/
|
||||||
|
public static Wei from(String value) { //TODO rename to fromHex?
|
||||||
|
//TODO return null?
|
||||||
|
if (value == null) {
|
||||||
|
throw new IllegalArgumentException("Null Address");
|
||||||
|
}
|
||||||
|
if (!value.startsWith("0x") || value.length() <= 2) {
|
||||||
|
throw new IllegalArgumentException("Invalid hex format: " + value);
|
||||||
|
}
|
||||||
|
value = value.substring(2);
|
||||||
|
return new Wei(new BigInteger(value, 16));
|
||||||
|
}
|
||||||
|
|
||||||
|
private final BigInteger amount;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create zero wei amount.
|
||||||
|
*/
|
||||||
|
public Wei() {
|
||||||
|
this(BigInteger.ZERO);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param val an amount in wei
|
||||||
|
*/
|
||||||
|
public Wei(long val) {
|
||||||
|
this(BigInteger.valueOf(val));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param num an amount in wei
|
||||||
|
*/
|
||||||
|
public Wei(BigInteger num) {
|
||||||
|
this.amount = Objects.requireNonNull(num);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return an amount in wei
|
||||||
|
*/
|
||||||
|
public BigInteger getAmount() {
|
||||||
|
return amount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Wei plus(Wei another) {
|
||||||
|
Objects.requireNonNull(another);
|
||||||
|
return new Wei(amount.add(another.amount));
|
||||||
|
}
|
||||||
|
|
||||||
|
public Wei minus(Wei another) {
|
||||||
|
Objects.requireNonNull(another);
|
||||||
|
return new Wei(amount.subtract(another.amount));
|
||||||
|
}
|
||||||
|
|
||||||
|
public Wei multiply(Long multiplier) {
|
||||||
|
Objects.requireNonNull(multiplier);
|
||||||
|
return new Wei(amount.multiply(BigInteger.valueOf(multiplier)));
|
||||||
|
}
|
||||||
|
|
||||||
|
public Wei multiply(Integer multiplier) {
|
||||||
|
Objects.requireNonNull(multiplier);
|
||||||
|
return new Wei(amount.multiply(BigInteger.valueOf(multiplier)));
|
||||||
|
}
|
||||||
|
|
||||||
|
public Wei div(Long divider) {
|
||||||
|
Objects.requireNonNull(divider);
|
||||||
|
return new Wei(amount.divide(BigInteger.valueOf(divider)));
|
||||||
|
}
|
||||||
|
|
||||||
|
public Wei div(Integer divider) {
|
||||||
|
Objects.requireNonNull(divider);
|
||||||
|
return new Wei(amount.divide(BigInteger.valueOf(divider)));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param decimalPlaces scale of the {@code BigDecimal} value to be returned
|
||||||
|
* @return corresponding amount in {@link Unit#ETHER}
|
||||||
|
* @see #toUnits(Unit, int)
|
||||||
|
*/
|
||||||
|
public BigDecimal toEthers(int decimalPlaces) {
|
||||||
|
return toUnits(Unit.ETHER, decimalPlaces);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return corresponding amount in {@link Unit#ETHER}
|
||||||
|
* @see #toUnits(Unit)
|
||||||
|
*/
|
||||||
|
public BigDecimal toEthers() {
|
||||||
|
return toUnits(Unit.ETHER);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param decimalPlaces scale of the {@code BigDecimal} value to be returned
|
||||||
|
* @param unit target unit
|
||||||
|
* @return corresponding amount in custom denomination {@link Unit}
|
||||||
|
* @see #toUnits(Unit, int)
|
||||||
|
*/
|
||||||
|
public BigDecimal toUnits(Unit unit, int decimalPlaces) {
|
||||||
|
return toUnits(unit).setScale(decimalPlaces, RoundingMode.HALF_UP);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return corresponding amount in custom denomination {@link Unit}
|
||||||
|
* @param unit target unit
|
||||||
|
* @see #toUnits(Unit)
|
||||||
|
*/
|
||||||
|
public BigDecimal toUnits(Unit unit) {
|
||||||
|
return new BigDecimal(amount).scaleByPowerOfTen(-unit.getScale());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int compareTo(Wei o) {
|
||||||
|
return amount.compareTo(o.amount);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public final int hashCode() {
|
||||||
|
return Objects.hash(getClass(), amount);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public final boolean equals(Object obj) {
|
||||||
|
if (!(obj instanceof Wei)) return false;
|
||||||
|
|
||||||
|
Wei other = (Wei) obj;
|
||||||
|
|
||||||
|
return Objects.equals(amount, other.amount);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return String.format("%s wei", amount.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
public String toHex() {
|
||||||
|
return "0x" + amount.toString(16);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,13 +2,11 @@ package io.emeraldpay.dshackle.upstream.ethereum.json;
|
|||||||
|
|
||||||
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
|
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
|
||||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||||
import io.emeraldpay.etherjar.domain.Address;
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.Address;
|
||||||
import io.emeraldpay.etherjar.domain.BlockHash;
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.BlockHash;
|
||||||
import io.emeraldpay.etherjar.domain.Bloom;
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.Bloom;
|
||||||
import io.emeraldpay.etherjar.domain.Wei;
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.Wei;
|
||||||
import io.emeraldpay.etherjar.hex.HexData;
|
import io.emeraldpay.etherjar.hex.HexData;
|
||||||
import io.emeraldpay.etherjar.rpc.json.TransactionJson;
|
|
||||||
import io.emeraldpay.etherjar.rpc.json.TransactionRefJson;
|
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.math.BigInteger;
|
import java.math.BigInteger;
|
||||||
|
|||||||
@@ -21,13 +21,10 @@ import com.fasterxml.jackson.core.JsonParser;
|
|||||||
import com.fasterxml.jackson.core.JsonProcessingException;
|
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||||
import com.fasterxml.jackson.databind.DeserializationContext;
|
import com.fasterxml.jackson.databind.DeserializationContext;
|
||||||
import com.fasterxml.jackson.databind.JsonNode;
|
import com.fasterxml.jackson.databind.JsonNode;
|
||||||
import io.emeraldpay.etherjar.domain.BlockHash;
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.BlockHash;
|
||||||
import io.emeraldpay.etherjar.domain.Bloom;
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.Bloom;
|
||||||
import io.emeraldpay.etherjar.domain.TransactionId;
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.TransactionId;
|
||||||
import io.emeraldpay.etherjar.hex.HexData;
|
import io.emeraldpay.etherjar.hex.HexData;
|
||||||
import io.emeraldpay.etherjar.rpc.json.EtherJsonDeserializer;
|
|
||||||
import io.emeraldpay.etherjar.rpc.json.TransactionJsonDeserializer;
|
|
||||||
import io.emeraldpay.etherjar.rpc.json.TransactionRefJson;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
@@ -36,7 +33,7 @@ import java.util.List;
|
|||||||
|
|
||||||
public class BlockJsonDeserializer extends EtherJsonDeserializer<BlockJson<?>> {
|
public class BlockJsonDeserializer extends EtherJsonDeserializer<BlockJson<?>> {
|
||||||
|
|
||||||
private TransactionJsonDeserializer transactionJsonDeserializer = new TransactionJsonDeserializer();
|
private final TransactionJsonDeserializer transactionJsonDeserializer = new TransactionJsonDeserializer();
|
||||||
|
|
||||||
@Override @SuppressWarnings("unchecked")
|
@Override @SuppressWarnings("unchecked")
|
||||||
public BlockJson deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
|
public BlockJson deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
|
||||||
|
|||||||
@@ -17,12 +17,8 @@ package io.emeraldpay.dshackle.upstream.ethereum.json;
|
|||||||
|
|
||||||
import com.fasterxml.jackson.core.JsonGenerator;
|
import com.fasterxml.jackson.core.JsonGenerator;
|
||||||
import com.fasterxml.jackson.databind.SerializerProvider;
|
import com.fasterxml.jackson.databind.SerializerProvider;
|
||||||
import io.emeraldpay.etherjar.domain.BlockHash;
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.BlockHash;
|
||||||
import io.emeraldpay.etherjar.domain.Wei;
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.Wei;
|
||||||
import io.emeraldpay.etherjar.rpc.json.EtherJsonSerializer;
|
|
||||||
import io.emeraldpay.etherjar.rpc.json.TransactionJson;
|
|
||||||
import io.emeraldpay.etherjar.rpc.json.TransactionJsonSerializer;
|
|
||||||
import io.emeraldpay.etherjar.rpc.json.TransactionRefJson;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,140 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2020 EmeraldPay Inc, All Rights Reserved.
|
||||||
|
* Copyright (c) 2016-2017 Infinitape Inc, All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.emeraldpay.dshackle.upstream.ethereum.json;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.databind.JsonDeserializer;
|
||||||
|
import com.fasterxml.jackson.databind.JsonNode;
|
||||||
|
import com.fasterxml.jackson.databind.node.NumericNode;
|
||||||
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.Address;
|
||||||
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.BlockHash;
|
||||||
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.TransactionId;
|
||||||
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.Wei;
|
||||||
|
import io.emeraldpay.etherjar.hex.HexData;
|
||||||
|
import io.emeraldpay.etherjar.hex.HexEncoding;
|
||||||
|
|
||||||
|
import java.math.BigInteger;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Utility class for Ethereum RPC JSON deserialization
|
||||||
|
*/
|
||||||
|
public abstract class EtherJsonDeserializer<T> extends JsonDeserializer<T> {
|
||||||
|
|
||||||
|
protected String getHexString(JsonNode node) {
|
||||||
|
if (node == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
String value = node.textValue();
|
||||||
|
if (value == null || value.length() == 0 || value.equals("0x")) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected String getHexString(JsonNode node, String name) {
|
||||||
|
return getHexString(node.get(name));
|
||||||
|
}
|
||||||
|
|
||||||
|
protected HexData getData(JsonNode node, String name) {
|
||||||
|
String value = getHexString(node, name);
|
||||||
|
if (value == null) return null;
|
||||||
|
return HexData.from(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected BigInteger getQuantity(JsonNode node, String name) {
|
||||||
|
return getQuantity(node.get(name));
|
||||||
|
}
|
||||||
|
|
||||||
|
protected BigInteger getQuantity(JsonNode node) {
|
||||||
|
if (node instanceof NumericNode) {
|
||||||
|
return BigInteger.valueOf(node.longValue());
|
||||||
|
}
|
||||||
|
String value = getHexString(node);
|
||||||
|
if (value == null) return null;
|
||||||
|
if (!value.startsWith("0x")) {
|
||||||
|
return new BigInteger(value, 10);
|
||||||
|
}
|
||||||
|
return HexEncoding.fromHex(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Integer getInt(JsonNode node, String name) {
|
||||||
|
if (!node.has(name)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return getInt(node.get(name));
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Integer getInt(JsonNode node) {
|
||||||
|
if (node instanceof NumericNode) {
|
||||||
|
return node.intValue();
|
||||||
|
}
|
||||||
|
String hex = getHexString(node);
|
||||||
|
if (hex == null || hex.length() <= 2) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return Integer.parseInt(hex.substring(2), 16);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Long getLong(JsonNode node, String name) {
|
||||||
|
if (!node.has(name)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return getLong(node.get(name));
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Long getLong(JsonNode node) {
|
||||||
|
if (node instanceof NumericNode) {
|
||||||
|
return node.longValue();
|
||||||
|
}
|
||||||
|
String hex = getHexString(node);
|
||||||
|
if (hex == null || hex.length() <= 2) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return Long.parseLong(hex.substring(2), 16);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Address getAddress(JsonNode node, String name) {
|
||||||
|
String value = getHexString(node, name);
|
||||||
|
if (value == null) return null;
|
||||||
|
return Address.from(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected TransactionId getTxHash(JsonNode node, String name) {
|
||||||
|
String value = getHexString(node, name);
|
||||||
|
if (value == null) return null;
|
||||||
|
return TransactionId.from(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Wei getWei(JsonNode node, String name) {
|
||||||
|
String value = getHexString(node, name);
|
||||||
|
if (value == null) return null;
|
||||||
|
return new Wei(HexEncoding.fromHex(value));
|
||||||
|
}
|
||||||
|
|
||||||
|
protected BlockHash getBlockHash(JsonNode node, String name) {
|
||||||
|
String value = getHexString(node, name);
|
||||||
|
if (value == null) return null;
|
||||||
|
return BlockHash.from(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Boolean getBoolean(JsonNode node, String name) {
|
||||||
|
if (!node.has(name)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return node.get(name).asBoolean();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,84 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2016-2019 Igor Artamonov, All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package io.emeraldpay.dshackle.upstream.ethereum.json;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.core.JsonGenerator;
|
||||||
|
import com.fasterxml.jackson.databind.JsonSerializer;
|
||||||
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.Wei;
|
||||||
|
import io.emeraldpay.etherjar.hex.HexData;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.math.BigInteger;
|
||||||
|
import java.time.Instant;
|
||||||
|
|
||||||
|
public abstract class EtherJsonSerializer<T> extends JsonSerializer<T> {
|
||||||
|
|
||||||
|
protected void writeField(JsonGenerator gen, String name, HexData value) throws IOException {
|
||||||
|
if (value == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
gen.writeStringField(name, value.toHex());
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void writeField(JsonGenerator gen, String name, Wei value) throws IOException {
|
||||||
|
if (value == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
gen.writeStringField(name, value.toHex());
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void writeField(JsonGenerator gen, String name, BigInteger value) throws IOException {
|
||||||
|
if (value == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
gen.writeStringField(name, "0x"+value.toString(16));
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void writeField(JsonGenerator gen, String name, Integer value) throws IOException {
|
||||||
|
if (value == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
gen.writeStringField(name, "0x"+ Integer.toString(value,16));
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void writeField(JsonGenerator gen, String name, Long value) throws IOException {
|
||||||
|
if (value == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
gen.writeStringField(name, "0x"+ Long.toString(value,16));
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void writeFieldNumber(JsonGenerator gen, String name, Integer value) throws IOException {
|
||||||
|
if (value == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
gen.writeNumberField(name, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void writeField(JsonGenerator gen, String name, Instant value) throws IOException {
|
||||||
|
if (value == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
gen.writeStringField(name, "0x"+ Long.toString(value.toEpochMilli() / 1000L, 16));
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void writeField(JsonGenerator gen, String name, Boolean value) throws IOException {
|
||||||
|
if (value == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
gen.writeBooleanField(name, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,139 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2020 EmeraldPay Inc, All Rights Reserved.
|
||||||
|
* Copyright (c) 2016-2017 Infinitape Inc, All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.emeraldpay.dshackle.upstream.ethereum.json;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||||
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.Address;
|
||||||
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.Wei;
|
||||||
|
import io.emeraldpay.etherjar.hex.HexData;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
@JsonSerialize(using = TransactionCallJsonSerializer.class)
|
||||||
|
public class TransactionCallJson implements Serializable {
|
||||||
|
|
||||||
|
private Address from;
|
||||||
|
private Address to;
|
||||||
|
private Long gas;
|
||||||
|
private Wei gasPrice;
|
||||||
|
private Wei value;
|
||||||
|
private HexData data;
|
||||||
|
private Long nonce;
|
||||||
|
|
||||||
|
public TransactionCallJson() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public TransactionCallJson(Address to, HexData data) {
|
||||||
|
this.to = to;
|
||||||
|
this.data = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
public TransactionCallJson(Address from, Address to, Wei value) {
|
||||||
|
this.from = from;
|
||||||
|
this.to = to;
|
||||||
|
this.value = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public TransactionCallJson(Address from, Address to, Long gas, Wei value, HexData data) {
|
||||||
|
this.from = from;
|
||||||
|
this.to = to;
|
||||||
|
this.gas = gas;
|
||||||
|
this.value = value;
|
||||||
|
this.data = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Address getFrom() {
|
||||||
|
return from;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFrom(Address from) {
|
||||||
|
this.from = from;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Address getTo() {
|
||||||
|
return to;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTo(Address to) {
|
||||||
|
this.to = to;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Long getGas() {
|
||||||
|
return gas;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setGas(Long gas) {
|
||||||
|
this.gas = gas;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Wei getGasPrice() {
|
||||||
|
return gasPrice;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setGasPrice(Wei gasPrice) {
|
||||||
|
this.gasPrice = gasPrice;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Wei getValue() {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setValue(Wei value) {
|
||||||
|
this.value = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public HexData getData() {
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setData(HexData data) {
|
||||||
|
this.data = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Long getNonce() {
|
||||||
|
return nonce;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setNonce(Long nonce) {
|
||||||
|
this.nonce = nonce;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object o) {
|
||||||
|
if (this == o) return true;
|
||||||
|
if (!(o instanceof TransactionCallJson)) return false;
|
||||||
|
|
||||||
|
TransactionCallJson that = (TransactionCallJson) o;
|
||||||
|
|
||||||
|
if (from != null ? !from.equals(that.from) : that.from != null) return false;
|
||||||
|
if (!to.equals(that.to)) return false;
|
||||||
|
if (gas != null ? !gas.equals(that.gas) : that.gas != null) return false;
|
||||||
|
if (gasPrice != null ? !gasPrice.equals(that.gasPrice) : that.gasPrice != null) return false;
|
||||||
|
if (value != null ? !value.equals(that.value) : that.value != null) return false;
|
||||||
|
if (nonce != null ? !nonce.equals(that.nonce) : that.nonce != null) return false;
|
||||||
|
return data != null ? data.equals(that.data) : that.data == null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
int result = from != null ? from.hashCode() : 0;
|
||||||
|
result = 31 * result + to.hashCode();
|
||||||
|
result = 31 * result + (data != null ? data.hashCode() : 0);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,70 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2020 EmeraldPay Inc, All Rights Reserved.
|
||||||
|
* Copyright (c) 2016-2017 Infinitape Inc, All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.emeraldpay.dshackle.upstream.ethereum.json;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.core.JsonGenerator;
|
||||||
|
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||||
|
import com.fasterxml.jackson.databind.JsonSerializer;
|
||||||
|
import com.fasterxml.jackson.databind.SerializerProvider;
|
||||||
|
import io.emeraldpay.etherjar.hex.HexEncoding;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.math.BigInteger;
|
||||||
|
|
||||||
|
public class TransactionCallJsonSerializer extends JsonSerializer<TransactionCallJson> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void serialize(TransactionCallJson value, JsonGenerator gen, SerializerProvider serializers)
|
||||||
|
throws IOException, JsonProcessingException
|
||||||
|
{
|
||||||
|
if (value == null) {
|
||||||
|
gen.writeNull();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
gen.writeStartObject();
|
||||||
|
if (value.getFrom() != null) {
|
||||||
|
gen.writeFieldName("from");
|
||||||
|
gen.writeString(value.getFrom().toHex());
|
||||||
|
}
|
||||||
|
if (value.getTo() != null) {
|
||||||
|
gen.writeFieldName("to");
|
||||||
|
gen.writeString(value.getTo().toHex());
|
||||||
|
}
|
||||||
|
if (value.getGas() != null) {
|
||||||
|
gen.writeFieldName("gas");
|
||||||
|
gen.writeString(HexEncoding.toHex(BigInteger.valueOf(value.getGas())));
|
||||||
|
}
|
||||||
|
if (value.getGasPrice() != null) {
|
||||||
|
gen.writeFieldName("gasPrice");
|
||||||
|
gen.writeString(HexEncoding.toHex(value.getGasPrice().getAmount()));
|
||||||
|
}
|
||||||
|
if (value.getValue() != null) {
|
||||||
|
gen.writeFieldName("value");
|
||||||
|
gen.writeString(HexEncoding.toHex(value.getValue().getAmount()));
|
||||||
|
}
|
||||||
|
if (value.getData() != null) {
|
||||||
|
gen.writeFieldName("data");
|
||||||
|
gen.writeString(value.getData().toHex());
|
||||||
|
}
|
||||||
|
if (value.getNonce() != null) {
|
||||||
|
gen.writeFieldName("nonce");
|
||||||
|
gen.writeString(HexEncoding.toHex(value.getNonce()));
|
||||||
|
}
|
||||||
|
gen.writeEndObject();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,334 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2020 EmeraldPay Inc, All Rights Reserved.
|
||||||
|
* Copyright (c) 2016-2017 Infinitape Inc, All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.emeraldpay.dshackle.upstream.ethereum.json;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
|
||||||
|
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||||
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.Address;
|
||||||
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.BlockHash;
|
||||||
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.TransactionRef;
|
||||||
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.TransactionSignature;
|
||||||
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.Wei;
|
||||||
|
import io.emeraldpay.etherjar.hex.Hex32;
|
||||||
|
import io.emeraldpay.etherjar.hex.HexData;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
@JsonDeserialize(using = TransactionJsonDeserializer.class)
|
||||||
|
@JsonSerialize(using = TransactionJsonSerializer.class)
|
||||||
|
public class TransactionJson extends TransactionRefJson implements TransactionRef, Serializable {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* the number of transactions made by the sender prior to this one.
|
||||||
|
*/
|
||||||
|
private Long nonce;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* hash of the block where this transaction was in. null when its pending.
|
||||||
|
*/
|
||||||
|
private BlockHash blockHash;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* block number where this transaction was in. null when its pending.
|
||||||
|
*/
|
||||||
|
private Long blockNumber;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* position in the block. null when its pending.
|
||||||
|
*/
|
||||||
|
private Long transactionIndex;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* address of the sender.
|
||||||
|
*/
|
||||||
|
private Address from;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* address of the receiver. null when its a contract creation transaction.
|
||||||
|
*/
|
||||||
|
private Address to;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Address of a contract created from that transaction
|
||||||
|
*/
|
||||||
|
private Address creates;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* value transferred in Wei.
|
||||||
|
*/
|
||||||
|
private Wei value;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gas price provided by the sender in Wei.
|
||||||
|
*/
|
||||||
|
private Wei gasPrice;
|
||||||
|
private Wei maxFeePerGas;
|
||||||
|
private Wei maxPriorityFeePerGas;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gas provided by the sender.
|
||||||
|
*/
|
||||||
|
private Long gas;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* the data send along with the transaction.
|
||||||
|
*/
|
||||||
|
private HexData input;
|
||||||
|
|
||||||
|
private TransactionSignature signature;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Transaction type
|
||||||
|
* @see <a href="https://eips.ethereum.org/EIPS/eip-2718">EIP-2718: Typed Transaction Envelope</a>
|
||||||
|
*/
|
||||||
|
private int type = 0;
|
||||||
|
|
||||||
|
private Integer chainId;
|
||||||
|
|
||||||
|
private List<Access> accessList;
|
||||||
|
|
||||||
|
public Long getNonce() {
|
||||||
|
return nonce;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setNonce(Long nonce) {
|
||||||
|
this.nonce = nonce;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BlockHash getBlockHash() {
|
||||||
|
return blockHash;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setBlockHash(BlockHash blockHash) {
|
||||||
|
this.blockHash = blockHash;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Long getBlockNumber() {
|
||||||
|
return blockNumber;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setBlockNumber(Long blockNumber) {
|
||||||
|
this.blockNumber = blockNumber;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Long getTransactionIndex() {
|
||||||
|
return transactionIndex;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTransactionIndex(Long transactionIndex) {
|
||||||
|
this.transactionIndex = transactionIndex;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Address getFrom() {
|
||||||
|
return from;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFrom(Address from) {
|
||||||
|
this.from = from;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Address getTo() {
|
||||||
|
return to;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTo(Address to) {
|
||||||
|
this.to = to;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Wei getValue() {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setValue(Wei value) {
|
||||||
|
this.value = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Wei getGasPrice() {
|
||||||
|
return gasPrice;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setGasPrice(Wei gasPrice) {
|
||||||
|
this.gasPrice = gasPrice;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Wei getMaxFeePerGas() {
|
||||||
|
return maxFeePerGas;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMaxFeePerGas(Wei maxFeePerGas) {
|
||||||
|
this.maxFeePerGas = maxFeePerGas;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Wei getMaxPriorityFeePerGas() {
|
||||||
|
return maxPriorityFeePerGas;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMaxPriorityFeePerGas(Wei maxPriorityFeePerGas) {
|
||||||
|
this.maxPriorityFeePerGas = maxPriorityFeePerGas;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getChainId() {
|
||||||
|
return chainId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setChainId(Integer chainId) {
|
||||||
|
this.chainId = chainId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Long getGas() {
|
||||||
|
return gas;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setGas(Long gas) {
|
||||||
|
this.gas = gas;
|
||||||
|
}
|
||||||
|
|
||||||
|
public HexData getInput() {
|
||||||
|
return input;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setInput(HexData input) {
|
||||||
|
this.input = input;
|
||||||
|
}
|
||||||
|
|
||||||
|
public TransactionSignature getSignature() {
|
||||||
|
return signature;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSignature(TransactionSignature signature) {
|
||||||
|
this.signature = signature;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Address getCreates() {
|
||||||
|
return creates;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCreates(Address creates) {
|
||||||
|
this.creates = creates;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getType() {
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setType(int type) {
|
||||||
|
this.type = type;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Access> getAccessList() {
|
||||||
|
return accessList;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAccessList(List<Access> accessList) {
|
||||||
|
this.accessList = accessList;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addAccess(Access access) {
|
||||||
|
if (this.accessList == null) {
|
||||||
|
this.accessList = new ArrayList<>();
|
||||||
|
}
|
||||||
|
accessList.add(access);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object o) {
|
||||||
|
if (this == o) return true;
|
||||||
|
if (!(o instanceof TransactionJson)) return false;
|
||||||
|
|
||||||
|
TransactionJson that = (TransactionJson) o;
|
||||||
|
|
||||||
|
if (!Objects.equals(getHash(), that.getHash())) return false;
|
||||||
|
if (!Objects.equals(nonce, that.nonce)) return false;
|
||||||
|
if (!Objects.equals(blockHash, that.blockHash)) return false;
|
||||||
|
if (!Objects.equals(blockNumber, that.blockNumber)) return false;
|
||||||
|
if (!Objects.equals(transactionIndex, that.transactionIndex)) return false;
|
||||||
|
if (!Objects.equals(from, that.from)) return false;
|
||||||
|
if (!Objects.equals(to, that.to)) return false;
|
||||||
|
if (!Objects.equals(value, that.value)) return false;
|
||||||
|
if (!Objects.equals(gasPrice, that.gasPrice)) return false;
|
||||||
|
if (!Objects.equals(gas, that.gas)) return false;
|
||||||
|
if (!Objects.equals(input, that.input)) return false;
|
||||||
|
if (!Objects.equals(creates, that.creates)) return false;
|
||||||
|
if (type != that.type) return false;
|
||||||
|
if (!Objects.equals(maxFeePerGas, that.maxFeePerGas)) return false;
|
||||||
|
if (!Objects.equals(maxPriorityFeePerGas, that.maxPriorityFeePerGas)) return false;
|
||||||
|
if (!Objects.equals(accessList, that.accessList)) return false;
|
||||||
|
return Objects.equals(signature, that.signature);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
int result = super.hashCode();
|
||||||
|
result = 31 * result + type;
|
||||||
|
result = 31 * result + (from != null ? from.hashCode() : 0);
|
||||||
|
result = 31 * result + (blockHash != null ? blockHash.hashCode() : 0);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Access {
|
||||||
|
private Address address;
|
||||||
|
private List<Hex32> storageKeys;
|
||||||
|
|
||||||
|
public Access() {
|
||||||
|
storageKeys = Collections.emptyList();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Access(Address address) {
|
||||||
|
this();
|
||||||
|
this.address = address;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Access(Address address, List<Hex32> storageKeys) {
|
||||||
|
this.address = address;
|
||||||
|
this.storageKeys = storageKeys;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Address getAddress() {
|
||||||
|
return address;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAddress(Address address) {
|
||||||
|
this.address = address;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Hex32> getStorageKeys() {
|
||||||
|
return storageKeys;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setStorageKeys(List<Hex32> storageKeys) {
|
||||||
|
this.storageKeys = storageKeys;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object o) {
|
||||||
|
if (this == o) return true;
|
||||||
|
if (!(o instanceof Access)) return false;
|
||||||
|
Access that = (Access) o;
|
||||||
|
return Objects.equals(address, that.address) && Objects.equals(storageKeys, that.storageKeys);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return Objects.hash(address);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,104 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2020 EmeraldPay Inc, All Rights Reserved.
|
||||||
|
* Copyright (c) 2016-2017 Infinitape Inc, All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.emeraldpay.dshackle.upstream.ethereum.json;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.core.JsonParser;
|
||||||
|
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||||
|
import com.fasterxml.jackson.databind.DeserializationContext;
|
||||||
|
import com.fasterxml.jackson.databind.JsonNode;
|
||||||
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.Address;
|
||||||
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.ChainId;
|
||||||
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.TransactionSignature;
|
||||||
|
import io.emeraldpay.etherjar.hex.Hex32;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class TransactionJsonDeserializer extends EtherJsonDeserializer<TransactionJson> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TransactionJson deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
|
||||||
|
JsonNode node = jp.readValueAsTree();
|
||||||
|
return deserialize(node);
|
||||||
|
}
|
||||||
|
|
||||||
|
public TransactionJson deserialize(JsonNode node) {
|
||||||
|
TransactionJson tx = new TransactionJson();
|
||||||
|
tx.setHash(getTxHash(node, "hash"));
|
||||||
|
tx.setNonce(getLong(node, "nonce"));
|
||||||
|
tx.setBlockHash(getBlockHash(node, "blockHash"));
|
||||||
|
Integer type = getInt(node, "type");
|
||||||
|
if (type != null) {
|
||||||
|
tx.setType(type);
|
||||||
|
}
|
||||||
|
Integer chainId = getInt(node, "chainId");
|
||||||
|
if (chainId != null) {
|
||||||
|
tx.setChainId(chainId);
|
||||||
|
}
|
||||||
|
Long blockNumber = getLong(node, "blockNumber");
|
||||||
|
if (blockNumber != null) {
|
||||||
|
tx.setBlockNumber(blockNumber);
|
||||||
|
}
|
||||||
|
Long txIndex = getLong(node, "transactionIndex");
|
||||||
|
if (txIndex != null) {
|
||||||
|
tx.setTransactionIndex(txIndex);
|
||||||
|
}
|
||||||
|
tx.setFrom(getAddress(node, "from"));
|
||||||
|
tx.setTo(getAddress(node, "to"));
|
||||||
|
tx.setValue(getWei(node, "value"));
|
||||||
|
tx.setGasPrice(getWei(node, "gasPrice"));
|
||||||
|
tx.setMaxFeePerGas(getWei(node, "maxFeePerGas"));
|
||||||
|
tx.setMaxPriorityFeePerGas(getWei(node, "maxPriorityFeePerGas"));
|
||||||
|
tx.setGas(getLong(node, "gas"));
|
||||||
|
tx.setInput(getData(node, "input"));
|
||||||
|
|
||||||
|
if (node.has("r") && node.has("v") && node.has("s")) {
|
||||||
|
TransactionSignature signature = new TransactionSignature();
|
||||||
|
|
||||||
|
if (node.hasNonNull("networkId")) {
|
||||||
|
signature.setChainId(new ChainId(node.get("networkId").intValue()));
|
||||||
|
}
|
||||||
|
signature.setR(getData(node, "r"));
|
||||||
|
signature.setS(getData(node, "s"));
|
||||||
|
signature.setV(getLong(node, "v"));
|
||||||
|
signature.setPublicKey(getData(node, "publicKey"));
|
||||||
|
|
||||||
|
tx.setSignature(signature);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (node.has("accessList")) {
|
||||||
|
List<TransactionJson.Access> accessList = new ArrayList<>();
|
||||||
|
for (JsonNode access: node.get("accessList")) {
|
||||||
|
Address address = getAddress(access, "address");
|
||||||
|
if (access.has("storageKeys")) {
|
||||||
|
List<Hex32> storageKeys = new ArrayList<>();
|
||||||
|
for (JsonNode storageKey: access.get("storageKeys")) {
|
||||||
|
storageKeys.add(Hex32.from(storageKey.textValue()));
|
||||||
|
}
|
||||||
|
accessList.add(new TransactionJson.Access(address, storageKeys));
|
||||||
|
} else {
|
||||||
|
accessList.add(new TransactionJson.Access(address));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
tx.setAccessList(accessList);
|
||||||
|
}
|
||||||
|
|
||||||
|
return tx;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,88 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2016-2019 Igor Artamonov, All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package io.emeraldpay.dshackle.upstream.ethereum.json;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.core.JsonGenerator;
|
||||||
|
import com.fasterxml.jackson.databind.SerializerProvider;
|
||||||
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.TransactionSignature;
|
||||||
|
import io.emeraldpay.etherjar.hex.Hex32;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class TransactionJsonSerializer extends EtherJsonSerializer<TransactionJson> {
|
||||||
|
@Override
|
||||||
|
public void serialize(TransactionJson value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
|
||||||
|
gen.writeStartObject();
|
||||||
|
writeField(gen, "hash", value.getHash());
|
||||||
|
writeField(gen, "nonce", value.getNonce());
|
||||||
|
writeField(gen, "blockHash", value.getBlockHash());
|
||||||
|
writeField(gen, "blockNumber", value.getBlockNumber());
|
||||||
|
if (value.getType() != 0) {
|
||||||
|
writeField(gen, "type", value.getType());
|
||||||
|
}
|
||||||
|
writeField(gen, "chainId", value.getChainId());
|
||||||
|
writeField(gen, "maxFeePerGas", value.getMaxFeePerGas());
|
||||||
|
writeField(gen, "maxPriorityFeePerGas", value.getMaxPriorityFeePerGas());
|
||||||
|
if (value.getTransactionIndex() != null) {
|
||||||
|
writeField(gen, "transactionIndex", value.getTransactionIndex().intValue());
|
||||||
|
}
|
||||||
|
writeField(gen, "from", value.getFrom());
|
||||||
|
if (value.getTo() == null) {
|
||||||
|
gen.writeNullField("to");
|
||||||
|
} else {
|
||||||
|
writeField(gen, "to", value.getTo());
|
||||||
|
}
|
||||||
|
writeField(gen, "creates", value.getCreates());
|
||||||
|
writeField(gen, "value", value.getValue());
|
||||||
|
writeField(gen, "gasPrice", value.getGasPrice());
|
||||||
|
writeField(gen, "gas", value.getGas());
|
||||||
|
writeField(gen, "input", value.getInput());
|
||||||
|
TransactionSignature signature = value.getSignature();
|
||||||
|
if (signature != null) {
|
||||||
|
if (signature.getChainId() != null) {
|
||||||
|
writeField(gen, "networkId", signature.getChainId().getValue());
|
||||||
|
}
|
||||||
|
writeField(gen, "r", signature.getR());
|
||||||
|
writeField(gen, "s", signature.getS());
|
||||||
|
if (signature.getV() != null) {
|
||||||
|
writeField(gen, "v", signature.getV().longValue());
|
||||||
|
}
|
||||||
|
writeField(gen, "publicKey", signature.getPublicKey());
|
||||||
|
}
|
||||||
|
List<TransactionJson.Access> accessList = value.getAccessList();
|
||||||
|
if (accessList != null) {
|
||||||
|
gen.writeFieldName("accessList");
|
||||||
|
gen.writeStartArray();
|
||||||
|
for (TransactionJson.Access access: accessList) {
|
||||||
|
gen.writeStartObject();
|
||||||
|
writeField(gen, "address", access.getAddress());
|
||||||
|
gen.writeFieldName("storageKeys");
|
||||||
|
gen.writeStartArray();
|
||||||
|
List<Hex32> storageKeys = access.getStorageKeys();
|
||||||
|
if (storageKeys != null) {
|
||||||
|
for (Hex32 key : storageKeys) {
|
||||||
|
gen.writeString(key.toHex());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
gen.writeEndArray();
|
||||||
|
gen.writeEndObject();
|
||||||
|
}
|
||||||
|
gen.writeEndArray();
|
||||||
|
}
|
||||||
|
gen.writeEndObject();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,10 +1,9 @@
|
|||||||
package io.emeraldpay.dshackle.upstream.ethereum.json;
|
package io.emeraldpay.dshackle.upstream.ethereum.json;
|
||||||
|
|
||||||
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
|
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
|
||||||
import io.emeraldpay.etherjar.domain.BlockHash;
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.BlockHash;
|
||||||
import io.emeraldpay.etherjar.domain.TransactionRef;
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.TransactionRef;
|
||||||
import io.emeraldpay.etherjar.domain.Wei;
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.Wei;
|
||||||
import io.emeraldpay.etherjar.rpc.json.TransactionRefJson;
|
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ import com.fasterxml.jackson.core.JsonParser;
|
|||||||
import com.fasterxml.jackson.core.JsonProcessingException;
|
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||||
import com.fasterxml.jackson.databind.DeserializationContext;
|
import com.fasterxml.jackson.databind.DeserializationContext;
|
||||||
import com.fasterxml.jackson.databind.JsonNode;
|
import com.fasterxml.jackson.databind.JsonNode;
|
||||||
import io.emeraldpay.etherjar.rpc.json.EtherJsonDeserializer;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,190 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2020 EmeraldPay Inc, All Rights Reserved.
|
||||||
|
* Copyright (c) 2016-2017 Infinitape Inc, All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.emeraldpay.dshackle.upstream.ethereum.json;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
|
||||||
|
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||||
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.Address;
|
||||||
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.BlockHash;
|
||||||
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.TransactionId;
|
||||||
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.TransactionRef;
|
||||||
|
import io.emeraldpay.etherjar.hex.Hex32;
|
||||||
|
import io.emeraldpay.etherjar.hex.HexData;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
@JsonDeserialize(using = TransactionLogJsonDeserializer.class)
|
||||||
|
@JsonSerialize(using = TransactionLogJsonSerializer.class)
|
||||||
|
public class TransactionLogJson implements TransactionRef, Serializable {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* true when the log was removed, due to a chain reorganization. false if its a valid log.
|
||||||
|
*/
|
||||||
|
private Boolean removed;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* log index position in the block. null when its pending log.
|
||||||
|
*/
|
||||||
|
private Long logIndex;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* transactions index position log was created from. null when its pending log.
|
||||||
|
*/
|
||||||
|
private Long transactionIndex;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* hash of the transactions this log was created from. null when its pending log.
|
||||||
|
*/
|
||||||
|
private TransactionId transactionHash;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* hash of the block where this log was in. null when its pending. null when its pending log.
|
||||||
|
*/
|
||||||
|
private BlockHash blockHash;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* the block number where this log was in. null when its pending. null when its pending log.
|
||||||
|
*/
|
||||||
|
private Long blockNumber;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* address from which this log originated.
|
||||||
|
*/
|
||||||
|
private Address address;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* contains one or more 32 Bytes non-indexed arguments of the log.
|
||||||
|
*/
|
||||||
|
private HexData data;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Array of 0 to 4 32 Bytes DATA of indexed log arguments.
|
||||||
|
*
|
||||||
|
* In solidity: The first topic is the hash of the signature of the event (e.g. Deposit(address,bytes32,uint256)),
|
||||||
|
* except you declared the event with the anonymous specifier.
|
||||||
|
* @see io.emeraldpay.etherjar.domain.EventId
|
||||||
|
*/
|
||||||
|
private List<Hex32> topics;
|
||||||
|
|
||||||
|
public Boolean getRemoved() {
|
||||||
|
return removed;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRemoved(Boolean removed) {
|
||||||
|
this.removed = removed;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Long getLogIndex() {
|
||||||
|
return logIndex;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLogIndex(Long logIndex) {
|
||||||
|
this.logIndex = logIndex;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Long getTransactionIndex() {
|
||||||
|
return transactionIndex;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTransactionIndex(Long transactionIndex) {
|
||||||
|
this.transactionIndex = transactionIndex;
|
||||||
|
}
|
||||||
|
|
||||||
|
public TransactionId getTransactionHash() {
|
||||||
|
return transactionHash;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTransactionHash(TransactionId transactionHash) {
|
||||||
|
this.transactionHash = transactionHash;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BlockHash getBlockHash() {
|
||||||
|
return blockHash;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setBlockHash(BlockHash blockHash) {
|
||||||
|
this.blockHash = blockHash;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Long getBlockNumber() {
|
||||||
|
return blockNumber;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setBlockNumber(Long blockNumber) {
|
||||||
|
this.blockNumber = blockNumber;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Address getAddress() {
|
||||||
|
return address;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAddress(Address address) {
|
||||||
|
this.address = address;
|
||||||
|
}
|
||||||
|
|
||||||
|
public HexData getData() {
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setData(HexData data) {
|
||||||
|
this.data = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Hex32> getTopics() {
|
||||||
|
return topics;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTopics(List<Hex32> topics) {
|
||||||
|
this.topics = topics;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TransactionId getHash() {
|
||||||
|
return transactionHash;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object o) {
|
||||||
|
if (this == o) return true;
|
||||||
|
if (!(o instanceof TransactionLogJson)) return false;
|
||||||
|
|
||||||
|
TransactionLogJson that = (TransactionLogJson) o;
|
||||||
|
|
||||||
|
if (!Objects.equals(removed, that.removed)) return false;
|
||||||
|
if (!Objects.equals(logIndex, that.logIndex)) return false;
|
||||||
|
if (!Objects.equals(transactionIndex, that.transactionIndex))
|
||||||
|
return false;
|
||||||
|
if (!Objects.equals(transactionHash, that.transactionHash))
|
||||||
|
return false;
|
||||||
|
if (!Objects.equals(blockHash, that.blockHash)) return false;
|
||||||
|
if (!Objects.equals(blockNumber, that.blockNumber)) return false;
|
||||||
|
if (!Objects.equals(address, that.address)) return false;
|
||||||
|
if (!Objects.equals(data, that.data)) return false;
|
||||||
|
return Objects.equals(topics, that.topics);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
int result = logIndex != null ? logIndex.hashCode() : 0;
|
||||||
|
result = 31 * result + (transactionHash != null ? transactionHash.hashCode() : 0);
|
||||||
|
result = 31 * result + (blockHash != null ? blockHash.hashCode() : 0);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,57 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2020 EmeraldPay Inc, All Rights Reserved.
|
||||||
|
* Copyright (c) 2016-2017 Infinitape Inc, All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.emeraldpay.dshackle.upstream.ethereum.json;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.core.JsonParser;
|
||||||
|
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||||
|
import com.fasterxml.jackson.databind.DeserializationContext;
|
||||||
|
import com.fasterxml.jackson.databind.JsonNode;
|
||||||
|
import io.emeraldpay.etherjar.hex.Hex32;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class TransactionLogJsonDeserializer extends EtherJsonDeserializer<TransactionLogJson> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TransactionLogJson deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
|
||||||
|
JsonNode node = jp.readValueAsTree();
|
||||||
|
return deserialize(node);
|
||||||
|
}
|
||||||
|
|
||||||
|
public TransactionLogJson deserialize(JsonNode node) {
|
||||||
|
TransactionLogJson log = new TransactionLogJson();
|
||||||
|
|
||||||
|
log.setAddress(getAddress(node, "address"));
|
||||||
|
log.setBlockHash(getBlockHash(node, "blockHash"));
|
||||||
|
log.setBlockNumber(getLong(node, "blockNumber"));
|
||||||
|
log.setData(getData(node, "data"));
|
||||||
|
log.setLogIndex(getLong(node, "logIndex"));
|
||||||
|
List<Hex32> topics = new ArrayList<>();
|
||||||
|
for (JsonNode topic: node.get("topics")) {
|
||||||
|
topics.add(Hex32.from(topic.textValue()));
|
||||||
|
}
|
||||||
|
log.setTopics(topics);
|
||||||
|
log.setTransactionHash(getTxHash(node, "transactionHash"));
|
||||||
|
log.setTransactionIndex(getLong(node, "transactionIndex"));
|
||||||
|
log.setRemoved(getBoolean(node, "removed"));
|
||||||
|
|
||||||
|
return log;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2021 EmeraldPay Inc, All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package io.emeraldpay.dshackle.upstream.ethereum.json;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.core.JsonGenerator;
|
||||||
|
import com.fasterxml.jackson.databind.SerializerProvider;
|
||||||
|
import io.emeraldpay.etherjar.hex.HexData;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
public class TransactionLogJsonSerializer extends EtherJsonSerializer<TransactionLogJson> {
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void serialize(TransactionLogJson value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
|
||||||
|
gen.writeStartObject();
|
||||||
|
writeField(gen, "address", value.getAddress());
|
||||||
|
writeField(gen, "blockHash", value.getBlockHash());
|
||||||
|
writeField(gen, "blockNumber", value.getBlockNumber());
|
||||||
|
writeField(gen, "data", value.getData());
|
||||||
|
writeField(gen, "logIndex", value.getLogIndex());
|
||||||
|
|
||||||
|
gen.writeFieldName("topics");
|
||||||
|
gen.writeStartArray();
|
||||||
|
if (value.getTopics() != null) {
|
||||||
|
for (HexData topic : value.getTopics()) {
|
||||||
|
gen.writeString(topic.toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
gen.writeEndArray();
|
||||||
|
|
||||||
|
writeField(gen, "transactionHash", value.getHash());
|
||||||
|
writeField(gen, "transactionIndex", value.getTransactionIndex());
|
||||||
|
writeField(gen, "removed", value.getRemoved());
|
||||||
|
gen.writeEndObject();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,245 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2020 EmeraldPay Inc, All Rights Reserved.
|
||||||
|
* Copyright (c) 2016-2017 Infinitape Inc, All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.emeraldpay.dshackle.upstream.ethereum.json;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
|
||||||
|
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||||
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.Address;
|
||||||
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.BlockHash;
|
||||||
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.Bloom;
|
||||||
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.TransactionId;
|
||||||
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.TransactionRef;
|
||||||
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.Wei;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
@JsonDeserialize(using = TransactionReceiptJsonDeserializer.class)
|
||||||
|
@JsonSerialize(using = TransactionReceiptJsonSerializer.class)
|
||||||
|
public class TransactionReceiptJson implements TransactionRef, Serializable {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* hash of the transaction
|
||||||
|
*/
|
||||||
|
private TransactionId transactionHash;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* position in the block
|
||||||
|
*/
|
||||||
|
private Long transactionIndex;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* hash of the block where this transaction was in.
|
||||||
|
*/
|
||||||
|
private BlockHash blockHash;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* block number where this transaction was in
|
||||||
|
*/
|
||||||
|
private Long blockNumber;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* total amount of gas used when this transaction was executed in the block.
|
||||||
|
*/
|
||||||
|
private Long cumulativeGasUsed;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sender
|
||||||
|
*/
|
||||||
|
private Address from;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Target address
|
||||||
|
*/
|
||||||
|
private Address to;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* amount of gas used by this specific transaction alone.
|
||||||
|
*/
|
||||||
|
private Long gasUsed;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The contract address created, if the transaction was a contract creation, otherwise null.
|
||||||
|
*/
|
||||||
|
private Address contractAddress;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Array of log objects, which this transaction generated.
|
||||||
|
*/
|
||||||
|
private List<TransactionLogJson> logs;
|
||||||
|
|
||||||
|
private Bloom logsBloom;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Optinal tx status. 0 if failed, 1 if successfull
|
||||||
|
*/
|
||||||
|
private Integer status;
|
||||||
|
|
||||||
|
private Wei effectiveGasPrice;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Transaction type
|
||||||
|
* @see <a href="https://eips.ethereum.org/EIPS/eip-2718">EIP-2718: Typed Transaction Envelope</a>
|
||||||
|
*/
|
||||||
|
private int type = 0;
|
||||||
|
|
||||||
|
public TransactionId getTransactionHash() {
|
||||||
|
return transactionHash;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTransactionHash(TransactionId transactionHash) {
|
||||||
|
this.transactionHash = transactionHash;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Long getTransactionIndex() {
|
||||||
|
return transactionIndex;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTransactionIndex(Long transactionIndex) {
|
||||||
|
this.transactionIndex = transactionIndex;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BlockHash getBlockHash() {
|
||||||
|
return blockHash;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setBlockHash(BlockHash blockHash) {
|
||||||
|
this.blockHash = blockHash;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Long getBlockNumber() {
|
||||||
|
return blockNumber;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setBlockNumber(Long blockNumber) {
|
||||||
|
this.blockNumber = blockNumber;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Long getCumulativeGasUsed() {
|
||||||
|
return cumulativeGasUsed;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCumulativeGasUsed(Long cumulativeGasUsed) {
|
||||||
|
this.cumulativeGasUsed = cumulativeGasUsed;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Address getFrom() {
|
||||||
|
return from;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFrom(Address from) {
|
||||||
|
this.from = from;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Address getTo() {
|
||||||
|
return to;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTo(Address to) {
|
||||||
|
this.to = to;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Long getGasUsed() {
|
||||||
|
return gasUsed;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setGasUsed(Long gasUsed) {
|
||||||
|
this.gasUsed = gasUsed;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Address getContractAddress() {
|
||||||
|
return contractAddress;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setContractAddress(Address contractAddress) {
|
||||||
|
this.contractAddress = contractAddress;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<TransactionLogJson> getLogs() {
|
||||||
|
return logs;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLogs(List<TransactionLogJson> logs) {
|
||||||
|
this.logs = logs;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Bloom getLogsBloom() {
|
||||||
|
return logsBloom;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLogsBloom(Bloom logsBloom) {
|
||||||
|
this.logsBloom = logsBloom;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getStatus() {
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setStatus(Integer status) {
|
||||||
|
this.status = status;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Wei getEffectiveGasPrice() {
|
||||||
|
return effectiveGasPrice;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setEffectiveGasPrice(Wei effectiveGasPrice) {
|
||||||
|
this.effectiveGasPrice = effectiveGasPrice;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getType() {
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setType(int type) {
|
||||||
|
this.type = type;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TransactionId getHash() {
|
||||||
|
return transactionHash;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object o) {
|
||||||
|
if (this == o) return true;
|
||||||
|
if (!(o instanceof TransactionReceiptJson)) return false;
|
||||||
|
|
||||||
|
TransactionReceiptJson that = (TransactionReceiptJson) o;
|
||||||
|
|
||||||
|
if (!Objects.equals(transactionHash, that.transactionHash)) return false;
|
||||||
|
if (!Objects.equals(transactionIndex, that.transactionIndex)) return false;
|
||||||
|
if (!Objects.equals(from, that.from)) return false;
|
||||||
|
if (!Objects.equals(to, that.to)) return false;
|
||||||
|
if (!Objects.equals(blockHash, that.blockHash)) return false;
|
||||||
|
if (!Objects.equals(blockNumber, that.blockNumber)) return false;
|
||||||
|
if (!Objects.equals(cumulativeGasUsed, that.cumulativeGasUsed)) return false;
|
||||||
|
if (!Objects.equals(gasUsed, that.gasUsed)) return false;
|
||||||
|
if (!Objects.equals(contractAddress, that.contractAddress)) return false;
|
||||||
|
if (!Objects.equals(logsBloom, that.logsBloom)) return false;
|
||||||
|
return Objects.equals(logs, that.logs);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
int result = transactionHash != null ? transactionHash.hashCode() : 0;
|
||||||
|
result = 31 * result + (blockHash != null ? blockHash.hashCode() : 0);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,75 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2020 EmeraldPay Inc, All Rights Reserved.
|
||||||
|
* Copyright (c) 2016-2017 Infinitape Inc, All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.emeraldpay.dshackle.upstream.ethereum.json;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.core.JsonParser;
|
||||||
|
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||||
|
import com.fasterxml.jackson.databind.DeserializationContext;
|
||||||
|
import com.fasterxml.jackson.databind.JsonNode;
|
||||||
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.Bloom;
|
||||||
|
import io.emeraldpay.etherjar.hex.HexData;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class TransactionReceiptJsonDeserializer extends EtherJsonDeserializer<TransactionReceiptJson> {
|
||||||
|
|
||||||
|
private TransactionLogJsonDeserializer transactionLogJsonDeserializer = new TransactionLogJsonDeserializer();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TransactionReceiptJson deserialize(JsonParser jp, DeserializationContext ctxt)
|
||||||
|
throws IOException, JsonProcessingException {
|
||||||
|
JsonNode node = jp.readValueAsTree();
|
||||||
|
TransactionReceiptJson receipt = new TransactionReceiptJson();
|
||||||
|
|
||||||
|
receipt.setBlockHash(getBlockHash(node, "blockHash"));
|
||||||
|
receipt.setBlockNumber(getLong(node, "blockNumber"));
|
||||||
|
receipt.setContractAddress(getAddress(node, "contractAddress"));
|
||||||
|
receipt.setFrom(getAddress(node, "from"));
|
||||||
|
receipt.setTo(getAddress(node, "to"));
|
||||||
|
receipt.setCumulativeGasUsed(getLong(node, "cumulativeGasUsed"));
|
||||||
|
receipt.setGasUsed(getLong(node, "gasUsed"));
|
||||||
|
receipt.setEffectiveGasPrice(getWei(node, "effectiveGasPrice"));
|
||||||
|
receipt.setTransactionHash(getTxHash(node, "transactionHash"));
|
||||||
|
receipt.setTransactionIndex(getLong(node, "transactionIndex"));
|
||||||
|
HexData logsBloom = getData(node, "logsBloom");
|
||||||
|
if (logsBloom != null) {
|
||||||
|
receipt.setLogsBloom(Bloom.from(logsBloom));
|
||||||
|
}
|
||||||
|
|
||||||
|
List<TransactionLogJson> logs = new ArrayList<>();
|
||||||
|
if (node.hasNonNull("logs")) {
|
||||||
|
for (JsonNode log: node.get("logs")) {
|
||||||
|
logs.add(transactionLogJsonDeserializer.deserialize(log));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
receipt.setLogs(logs);
|
||||||
|
|
||||||
|
Integer status = getInt(node, "status");
|
||||||
|
if (status != null) {
|
||||||
|
receipt.setStatus(status);
|
||||||
|
}
|
||||||
|
Integer type = getInt(node, "type");
|
||||||
|
if (type != null) {
|
||||||
|
receipt.setType(type);
|
||||||
|
}
|
||||||
|
|
||||||
|
return receipt;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,60 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2021 EmeraldPay Inc, All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package io.emeraldpay.dshackle.upstream.ethereum.json;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.core.JsonGenerator;
|
||||||
|
import com.fasterxml.jackson.databind.JsonSerializer;
|
||||||
|
import com.fasterxml.jackson.databind.SerializerProvider;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
public class TransactionReceiptJsonSerializer extends EtherJsonSerializer<TransactionReceiptJson> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void serialize(TransactionReceiptJson value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
|
||||||
|
|
||||||
|
gen.writeStartObject();
|
||||||
|
writeField(gen, "blockHash", value.getBlockHash());
|
||||||
|
writeField(gen, "blockNumber", value.getBlockNumber());
|
||||||
|
writeField(gen, "contractAddress", value.getContractAddress());
|
||||||
|
writeField(gen, "from", value.getFrom());
|
||||||
|
writeField(gen, "to", value.getTo());
|
||||||
|
writeField(gen, "cumulativeGasUsed", value.getCumulativeGasUsed());
|
||||||
|
writeField(gen, "gasUsed", value.getGasUsed());
|
||||||
|
writeField(gen, "effectiveGasPrice", value.getEffectiveGasPrice());
|
||||||
|
writeField(gen, "transactionHash", value.getTransactionHash());
|
||||||
|
writeField(gen, "transactionIndex", value.getTransactionIndex());
|
||||||
|
writeField(gen, "logsBloom", value.getLogsBloom());
|
||||||
|
|
||||||
|
gen.writeFieldName("logs");
|
||||||
|
gen.writeStartArray();
|
||||||
|
if (value.getLogs() != null) {
|
||||||
|
JsonSerializer<Object> transactionLogJsonSerialized = serializers.findValueSerializer(TransactionLogJson.class);
|
||||||
|
for (TransactionLogJson logJson : value.getLogs()) {
|
||||||
|
transactionLogJsonSerialized.serialize(logJson, gen, serializers);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
gen.writeEndArray();
|
||||||
|
|
||||||
|
if (value.getStatus() != null) {
|
||||||
|
writeField(gen, "status", value.getStatus());
|
||||||
|
}
|
||||||
|
if (value.getType() != 0) {
|
||||||
|
writeField(gen, "type", value.getType());
|
||||||
|
}
|
||||||
|
gen.writeEndObject();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
package io.emeraldpay.dshackle.upstream.ethereum.json;
|
||||||
|
|
||||||
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.TransactionId;
|
||||||
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.TransactionRef;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A simple reference to a transaction
|
||||||
|
*/
|
||||||
|
public class TransactionRefJson implements TransactionRef {
|
||||||
|
|
||||||
|
private TransactionId hash;
|
||||||
|
|
||||||
|
public TransactionRefJson() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public TransactionRefJson(TransactionId hash) {
|
||||||
|
this.hash = hash;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TransactionId getHash() {
|
||||||
|
return hash;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setHash(TransactionId hash) {
|
||||||
|
this.hash = hash;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object o) {
|
||||||
|
if (this == o) return true;
|
||||||
|
if (o == null || getClass() != o.getClass()) return false;
|
||||||
|
TransactionRefJson that = (TransactionRefJson) o;
|
||||||
|
return Objects.equals(hash, that.hash);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return Objects.hash(hash);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -25,10 +25,10 @@ import io.emeraldpay.dshackle.upstream.bitcoin.data.EsploraUnspent
|
|||||||
import io.emeraldpay.dshackle.upstream.bitcoin.data.EsploraUnspentDeserializer
|
import io.emeraldpay.dshackle.upstream.bitcoin.data.EsploraUnspentDeserializer
|
||||||
import io.emeraldpay.dshackle.upstream.bitcoin.data.RpcUnspent
|
import io.emeraldpay.dshackle.upstream.bitcoin.data.RpcUnspent
|
||||||
import io.emeraldpay.dshackle.upstream.bitcoin.data.RpcUnspentDeserializer
|
import io.emeraldpay.dshackle.upstream.bitcoin.data.RpcUnspentDeserializer
|
||||||
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.TransactionId
|
||||||
import io.emeraldpay.dshackle.upstream.ethereum.subscribe.json.TransactionIdSerializer
|
import io.emeraldpay.dshackle.upstream.ethereum.subscribe.json.TransactionIdSerializer
|
||||||
import io.emeraldpay.dshackle.upstream.rpcclient.JsonRpcRequest
|
import io.emeraldpay.dshackle.upstream.rpcclient.JsonRpcRequest
|
||||||
import io.emeraldpay.dshackle.upstream.rpcclient.JsonRpcResponse
|
import io.emeraldpay.dshackle.upstream.rpcclient.JsonRpcResponse
|
||||||
import io.emeraldpay.etherjar.domain.TransactionId
|
|
||||||
import java.text.SimpleDateFormat
|
import java.text.SimpleDateFormat
|
||||||
import java.util.Locale
|
import java.util.Locale
|
||||||
import java.util.TimeZone
|
import java.util.TimeZone
|
||||||
|
|||||||
@@ -25,8 +25,8 @@ import io.emeraldpay.dshackle.reader.CompoundReader
|
|||||||
import io.emeraldpay.dshackle.reader.Reader
|
import io.emeraldpay.dshackle.reader.Reader
|
||||||
import io.emeraldpay.dshackle.upstream.Head
|
import io.emeraldpay.dshackle.upstream.Head
|
||||||
import io.emeraldpay.dshackle.upstream.ethereum.json.BlockJson
|
import io.emeraldpay.dshackle.upstream.ethereum.json.BlockJson
|
||||||
import io.emeraldpay.etherjar.rpc.json.TransactionJson
|
import io.emeraldpay.dshackle.upstream.ethereum.json.TransactionJson
|
||||||
import io.emeraldpay.etherjar.rpc.json.TransactionReceiptJson
|
import io.emeraldpay.dshackle.upstream.ethereum.json.TransactionReceiptJson
|
||||||
import org.slf4j.LoggerFactory
|
import org.slf4j.LoggerFactory
|
||||||
import reactor.core.publisher.Flux
|
import reactor.core.publisher.Flux
|
||||||
import reactor.core.publisher.Mono
|
import reactor.core.publisher.Mono
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ import io.emeraldpay.dshackle.data.BlockContainer
|
|||||||
import io.emeraldpay.dshackle.data.DefaultContainer
|
import io.emeraldpay.dshackle.data.DefaultContainer
|
||||||
import io.emeraldpay.dshackle.data.TxId
|
import io.emeraldpay.dshackle.data.TxId
|
||||||
import io.emeraldpay.dshackle.reader.Reader
|
import io.emeraldpay.dshackle.reader.Reader
|
||||||
import io.emeraldpay.etherjar.rpc.json.TransactionReceiptJson
|
import io.emeraldpay.dshackle.upstream.ethereum.json.TransactionReceiptJson
|
||||||
import org.slf4j.LoggerFactory
|
import org.slf4j.LoggerFactory
|
||||||
import reactor.core.publisher.Mono
|
import reactor.core.publisher.Mono
|
||||||
|
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ package io.emeraldpay.dshackle.cache
|
|||||||
import io.emeraldpay.dshackle.Chain
|
import io.emeraldpay.dshackle.Chain
|
||||||
import io.emeraldpay.dshackle.data.DefaultContainer
|
import io.emeraldpay.dshackle.data.DefaultContainer
|
||||||
import io.emeraldpay.dshackle.proto.CachesProto
|
import io.emeraldpay.dshackle.proto.CachesProto
|
||||||
import io.emeraldpay.etherjar.rpc.json.TransactionReceiptJson
|
import io.emeraldpay.dshackle.upstream.ethereum.json.TransactionReceiptJson
|
||||||
import io.lettuce.core.api.reactive.RedisReactiveCommands
|
import io.lettuce.core.api.reactive.RedisReactiveCommands
|
||||||
import reactor.core.publisher.Mono
|
import reactor.core.publisher.Mono
|
||||||
|
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ package io.emeraldpay.dshackle.config
|
|||||||
|
|
||||||
import io.emeraldpay.dshackle.BlockchainType
|
import io.emeraldpay.dshackle.BlockchainType
|
||||||
import io.emeraldpay.dshackle.Chain
|
import io.emeraldpay.dshackle.Chain
|
||||||
import io.emeraldpay.etherjar.domain.Address
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.Address
|
||||||
|
|
||||||
class TokensConfig(
|
class TokensConfig(
|
||||||
val tokens: List<Token>,
|
val tokens: List<Token>,
|
||||||
|
|||||||
@@ -17,13 +17,13 @@
|
|||||||
package io.emeraldpay.dshackle.data
|
package io.emeraldpay.dshackle.data
|
||||||
|
|
||||||
import io.emeraldpay.dshackle.Global
|
import io.emeraldpay.dshackle.Global
|
||||||
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.Address
|
||||||
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.BlockHash
|
||||||
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.Bloom
|
||||||
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.Wei
|
||||||
import io.emeraldpay.dshackle.upstream.ethereum.json.BlockJson
|
import io.emeraldpay.dshackle.upstream.ethereum.json.BlockJson
|
||||||
import io.emeraldpay.etherjar.domain.Address
|
import io.emeraldpay.dshackle.upstream.ethereum.json.TransactionJson
|
||||||
import io.emeraldpay.etherjar.domain.BlockHash
|
import io.emeraldpay.dshackle.upstream.ethereum.json.TransactionRefJson
|
||||||
import io.emeraldpay.etherjar.domain.Bloom
|
|
||||||
import io.emeraldpay.etherjar.domain.Wei
|
|
||||||
import io.emeraldpay.etherjar.rpc.json.TransactionJson
|
|
||||||
import io.emeraldpay.etherjar.rpc.json.TransactionRefJson
|
|
||||||
import java.math.BigInteger
|
import java.math.BigInteger
|
||||||
import java.time.Instant
|
import java.time.Instant
|
||||||
|
|
||||||
|
|||||||
@@ -16,8 +16,8 @@
|
|||||||
*/
|
*/
|
||||||
package io.emeraldpay.dshackle.data
|
package io.emeraldpay.dshackle.data
|
||||||
|
|
||||||
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.BlockHash
|
||||||
import io.emeraldpay.dshackle.upstream.ethereum.json.BlockJson
|
import io.emeraldpay.dshackle.upstream.ethereum.json.BlockJson
|
||||||
import io.emeraldpay.etherjar.domain.BlockHash
|
|
||||||
import org.bouncycastle.util.encoders.Hex
|
import org.bouncycastle.util.encoders.Hex
|
||||||
import java.util.Base64
|
import java.util.Base64
|
||||||
|
|
||||||
|
|||||||
@@ -17,8 +17,8 @@
|
|||||||
package io.emeraldpay.dshackle.data
|
package io.emeraldpay.dshackle.data
|
||||||
|
|
||||||
import io.emeraldpay.dshackle.Global
|
import io.emeraldpay.dshackle.Global
|
||||||
|
import io.emeraldpay.dshackle.upstream.ethereum.json.TransactionJson
|
||||||
import io.emeraldpay.dshackle.upstream.ethereum.json.TransactionJsonSnapshot
|
import io.emeraldpay.dshackle.upstream.ethereum.json.TransactionJsonSnapshot
|
||||||
import io.emeraldpay.etherjar.rpc.json.TransactionJson
|
|
||||||
|
|
||||||
class TxContainer(
|
class TxContainer(
|
||||||
val height: Long?,
|
val height: Long?,
|
||||||
|
|||||||
@@ -16,8 +16,8 @@
|
|||||||
*/
|
*/
|
||||||
package io.emeraldpay.dshackle.data
|
package io.emeraldpay.dshackle.data
|
||||||
|
|
||||||
import io.emeraldpay.etherjar.domain.TransactionId
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.TransactionId
|
||||||
import io.emeraldpay.etherjar.rpc.json.TransactionJson
|
import io.emeraldpay.dshackle.upstream.ethereum.json.TransactionJson
|
||||||
import org.bouncycastle.util.encoders.Hex
|
import org.bouncycastle.util.encoders.Hex
|
||||||
|
|
||||||
class TxId(
|
class TxId(
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
package io.emeraldpay.dshackle.rpc
|
package io.emeraldpay.dshackle.rpc
|
||||||
|
|
||||||
import io.emeraldpay.api.proto.Common
|
import io.emeraldpay.api.proto.Common
|
||||||
import io.emeraldpay.etherjar.domain.Address
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.Address
|
||||||
import org.slf4j.LoggerFactory
|
import org.slf4j.LoggerFactory
|
||||||
import reactor.core.publisher.Flux
|
import reactor.core.publisher.Flux
|
||||||
|
|
||||||
|
|||||||
@@ -37,14 +37,14 @@ import io.emeraldpay.dshackle.upstream.CachingReader
|
|||||||
import io.emeraldpay.dshackle.upstream.Multistream
|
import io.emeraldpay.dshackle.upstream.Multistream
|
||||||
import io.emeraldpay.dshackle.upstream.calls.CallMethods
|
import io.emeraldpay.dshackle.upstream.calls.CallMethods
|
||||||
import io.emeraldpay.dshackle.upstream.ethereum.EthereumDirectReader.Result
|
import io.emeraldpay.dshackle.upstream.ethereum.EthereumDirectReader.Result
|
||||||
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.Address
|
||||||
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.BlockHash
|
||||||
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.TransactionId
|
||||||
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.Wei
|
||||||
import io.emeraldpay.dshackle.upstream.ethereum.json.BlockJson
|
import io.emeraldpay.dshackle.upstream.ethereum.json.BlockJson
|
||||||
import io.emeraldpay.dshackle.upstream.ethereum.json.TransactionJsonSnapshot
|
import io.emeraldpay.dshackle.upstream.ethereum.json.TransactionJsonSnapshot
|
||||||
import io.emeraldpay.etherjar.domain.Address
|
import io.emeraldpay.dshackle.upstream.ethereum.json.TransactionLogJson
|
||||||
import io.emeraldpay.etherjar.domain.BlockHash
|
import io.emeraldpay.dshackle.upstream.ethereum.json.TransactionRefJson
|
||||||
import io.emeraldpay.etherjar.domain.TransactionId
|
|
||||||
import io.emeraldpay.etherjar.domain.Wei
|
|
||||||
import io.emeraldpay.etherjar.rpc.json.TransactionLogJson
|
|
||||||
import io.emeraldpay.etherjar.rpc.json.TransactionRefJson
|
|
||||||
import org.apache.commons.collections4.Factory
|
import org.apache.commons.collections4.Factory
|
||||||
import org.springframework.cloud.sleuth.Tracer
|
import org.springframework.cloud.sleuth.Tracer
|
||||||
import reactor.core.publisher.Mono
|
import reactor.core.publisher.Mono
|
||||||
|
|||||||
@@ -17,20 +17,20 @@ import io.emeraldpay.dshackle.upstream.Multistream
|
|||||||
import io.emeraldpay.dshackle.upstream.Selector
|
import io.emeraldpay.dshackle.upstream.Selector
|
||||||
import io.emeraldpay.dshackle.upstream.calls.CallMethods
|
import io.emeraldpay.dshackle.upstream.calls.CallMethods
|
||||||
import io.emeraldpay.dshackle.upstream.calls.EthereumCallSelector
|
import io.emeraldpay.dshackle.upstream.calls.EthereumCallSelector
|
||||||
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.Address
|
||||||
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.BlockHash
|
||||||
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.TransactionId
|
||||||
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.Wei
|
||||||
import io.emeraldpay.dshackle.upstream.ethereum.json.BlockJson
|
import io.emeraldpay.dshackle.upstream.ethereum.json.BlockJson
|
||||||
import io.emeraldpay.dshackle.upstream.ethereum.json.TransactionJsonSnapshot
|
import io.emeraldpay.dshackle.upstream.ethereum.json.TransactionJsonSnapshot
|
||||||
|
import io.emeraldpay.dshackle.upstream.ethereum.json.TransactionLogJson
|
||||||
|
import io.emeraldpay.dshackle.upstream.ethereum.json.TransactionReceiptJson
|
||||||
|
import io.emeraldpay.dshackle.upstream.ethereum.json.TransactionRefJson
|
||||||
import io.emeraldpay.dshackle.upstream.rpcclient.JsonRpcException
|
import io.emeraldpay.dshackle.upstream.rpcclient.JsonRpcException
|
||||||
import io.emeraldpay.dshackle.upstream.rpcclient.JsonRpcRequest
|
import io.emeraldpay.dshackle.upstream.rpcclient.JsonRpcRequest
|
||||||
import io.emeraldpay.etherjar.domain.Address
|
|
||||||
import io.emeraldpay.etherjar.domain.BlockHash
|
|
||||||
import io.emeraldpay.etherjar.domain.TransactionId
|
|
||||||
import io.emeraldpay.etherjar.domain.Wei
|
|
||||||
import io.emeraldpay.etherjar.hex.HexQuantity
|
import io.emeraldpay.etherjar.hex.HexQuantity
|
||||||
import io.emeraldpay.etherjar.rpc.RpcException
|
import io.emeraldpay.etherjar.rpc.RpcException
|
||||||
import io.emeraldpay.etherjar.rpc.RpcResponseError
|
import io.emeraldpay.etherjar.rpc.RpcResponseError
|
||||||
import io.emeraldpay.etherjar.rpc.json.TransactionLogJson
|
|
||||||
import io.emeraldpay.etherjar.rpc.json.TransactionReceiptJson
|
|
||||||
import io.emeraldpay.etherjar.rpc.json.TransactionRefJson
|
|
||||||
import org.apache.commons.collections4.Factory
|
import org.apache.commons.collections4.Factory
|
||||||
import org.apache.commons.lang3.exception.ExceptionUtils
|
import org.apache.commons.lang3.exception.ExceptionUtils
|
||||||
import org.slf4j.LoggerFactory
|
import org.slf4j.LoggerFactory
|
||||||
|
|||||||
@@ -4,10 +4,10 @@ import io.emeraldpay.dshackle.upstream.Capability
|
|||||||
import io.emeraldpay.dshackle.upstream.EgressSubscription
|
import io.emeraldpay.dshackle.upstream.EgressSubscription
|
||||||
import io.emeraldpay.dshackle.upstream.Multistream
|
import io.emeraldpay.dshackle.upstream.Multistream
|
||||||
import io.emeraldpay.dshackle.upstream.Selector
|
import io.emeraldpay.dshackle.upstream.Selector
|
||||||
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.Address
|
||||||
import io.emeraldpay.dshackle.upstream.ethereum.subscribe.ConnectLogs
|
import io.emeraldpay.dshackle.upstream.ethereum.subscribe.ConnectLogs
|
||||||
import io.emeraldpay.dshackle.upstream.ethereum.subscribe.ConnectNewHeads
|
import io.emeraldpay.dshackle.upstream.ethereum.subscribe.ConnectNewHeads
|
||||||
import io.emeraldpay.dshackle.upstream.ethereum.subscribe.PendingTxesSource
|
import io.emeraldpay.dshackle.upstream.ethereum.subscribe.PendingTxesSource
|
||||||
import io.emeraldpay.etherjar.domain.Address
|
|
||||||
import io.emeraldpay.etherjar.hex.Hex32
|
import io.emeraldpay.etherjar.hex.Hex32
|
||||||
import org.slf4j.LoggerFactory
|
import org.slf4j.LoggerFactory
|
||||||
import reactor.core.publisher.Flux
|
import reactor.core.publisher.Flux
|
||||||
|
|||||||
@@ -26,12 +26,12 @@ import io.emeraldpay.dshackle.upstream.Upstream
|
|||||||
import io.emeraldpay.dshackle.upstream.UpstreamAvailability
|
import io.emeraldpay.dshackle.upstream.UpstreamAvailability
|
||||||
import io.emeraldpay.dshackle.upstream.UpstreamValidator
|
import io.emeraldpay.dshackle.upstream.UpstreamValidator
|
||||||
import io.emeraldpay.dshackle.upstream.ValidateUpstreamSettingsResult
|
import io.emeraldpay.dshackle.upstream.ValidateUpstreamSettingsResult
|
||||||
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.Address
|
||||||
|
import io.emeraldpay.dshackle.upstream.ethereum.json.TransactionCallJson
|
||||||
import io.emeraldpay.dshackle.upstream.rpcclient.JsonRpcRequest
|
import io.emeraldpay.dshackle.upstream.rpcclient.JsonRpcRequest
|
||||||
import io.emeraldpay.dshackle.upstream.rpcclient.JsonRpcResponse
|
import io.emeraldpay.dshackle.upstream.rpcclient.JsonRpcResponse
|
||||||
import io.emeraldpay.etherjar.domain.Address
|
|
||||||
import io.emeraldpay.etherjar.hex.HexData
|
import io.emeraldpay.etherjar.hex.HexData
|
||||||
import io.emeraldpay.etherjar.rpc.json.SyncingJson
|
import io.emeraldpay.etherjar.rpc.json.SyncingJson
|
||||||
import io.emeraldpay.etherjar.rpc.json.TransactionCallJson
|
|
||||||
import org.slf4j.LoggerFactory
|
import org.slf4j.LoggerFactory
|
||||||
import org.springframework.scheduling.concurrent.CustomizableThreadFactory
|
import org.springframework.scheduling.concurrent.CustomizableThreadFactory
|
||||||
import reactor.core.publisher.Mono
|
import reactor.core.publisher.Mono
|
||||||
|
|||||||
@@ -29,9 +29,7 @@ import io.emeraldpay.dshackle.upstream.rpcclient.ResponseWSParser
|
|||||||
import io.emeraldpay.dshackle.upstream.rpcclient.RpcMetrics
|
import io.emeraldpay.dshackle.upstream.rpcclient.RpcMetrics
|
||||||
import io.emeraldpay.etherjar.rpc.RpcResponseError
|
import io.emeraldpay.etherjar.rpc.RpcResponseError
|
||||||
import io.micrometer.core.instrument.Metrics
|
import io.micrometer.core.instrument.Metrics
|
||||||
import io.netty.buffer.ByteBuf
|
|
||||||
import io.netty.buffer.ByteBufInputStream
|
import io.netty.buffer.ByteBufInputStream
|
||||||
import io.netty.buffer.Unpooled
|
|
||||||
import io.netty.handler.codec.http.HttpHeaderNames
|
import io.netty.handler.codec.http.HttpHeaderNames
|
||||||
import io.netty.resolver.DefaultAddressResolverGroup
|
import io.netty.resolver.DefaultAddressResolverGroup
|
||||||
import org.reactivestreams.Publisher
|
import org.reactivestreams.Publisher
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ package io.emeraldpay.dshackle.upstream.ethereum.subscribe
|
|||||||
|
|
||||||
import com.github.benmanes.caffeine.cache.Caffeine
|
import com.github.benmanes.caffeine.cache.Caffeine
|
||||||
import io.emeraldpay.dshackle.upstream.Selector
|
import io.emeraldpay.dshackle.upstream.Selector
|
||||||
import io.emeraldpay.etherjar.domain.TransactionId
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.TransactionId
|
||||||
import reactor.core.publisher.Flux
|
import reactor.core.publisher.Flux
|
||||||
import java.time.Duration
|
import java.time.Duration
|
||||||
|
|
||||||
|
|||||||
@@ -18,8 +18,8 @@ package io.emeraldpay.dshackle.upstream.ethereum.subscribe
|
|||||||
import io.emeraldpay.dshackle.upstream.Multistream
|
import io.emeraldpay.dshackle.upstream.Multistream
|
||||||
import io.emeraldpay.dshackle.upstream.Selector
|
import io.emeraldpay.dshackle.upstream.Selector
|
||||||
import io.emeraldpay.dshackle.upstream.SubscriptionConnect
|
import io.emeraldpay.dshackle.upstream.SubscriptionConnect
|
||||||
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.Address
|
||||||
import io.emeraldpay.dshackle.upstream.ethereum.subscribe.json.LogMessage
|
import io.emeraldpay.dshackle.upstream.ethereum.subscribe.json.LogMessage
|
||||||
import io.emeraldpay.etherjar.domain.Address
|
|
||||||
import io.emeraldpay.etherjar.hex.Hex32
|
import io.emeraldpay.etherjar.hex.Hex32
|
||||||
import io.emeraldpay.etherjar.hex.HexDataComparator
|
import io.emeraldpay.etherjar.hex.HexDataComparator
|
||||||
import reactor.core.publisher.Flux
|
import reactor.core.publisher.Flux
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ import io.emeraldpay.dshackle.commons.DurableFlux
|
|||||||
import io.emeraldpay.dshackle.commons.SharedFluxHolder
|
import io.emeraldpay.dshackle.commons.SharedFluxHolder
|
||||||
import io.emeraldpay.dshackle.upstream.Selector
|
import io.emeraldpay.dshackle.upstream.Selector
|
||||||
import io.emeraldpay.dshackle.upstream.SubscriptionConnect
|
import io.emeraldpay.dshackle.upstream.SubscriptionConnect
|
||||||
import io.emeraldpay.etherjar.domain.TransactionId
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.TransactionId
|
||||||
import reactor.core.publisher.Flux
|
import reactor.core.publisher.Flux
|
||||||
import java.time.Duration
|
import java.time.Duration
|
||||||
|
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ import io.emeraldpay.api.proto.BlockchainOuterClass.NativeSubscribeRequest
|
|||||||
import io.emeraldpay.api.proto.ReactorBlockchainGrpc
|
import io.emeraldpay.api.proto.ReactorBlockchainGrpc
|
||||||
import io.emeraldpay.dshackle.Chain
|
import io.emeraldpay.dshackle.Chain
|
||||||
import io.emeraldpay.dshackle.upstream.ethereum.EthereumEgressSubscription
|
import io.emeraldpay.dshackle.upstream.ethereum.EthereumEgressSubscription
|
||||||
import io.emeraldpay.etherjar.domain.TransactionId
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.TransactionId
|
||||||
import reactor.core.publisher.Flux
|
import reactor.core.publisher.Flux
|
||||||
|
|
||||||
class DshacklePendingTxesSource(
|
class DshacklePendingTxesSource(
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
package io.emeraldpay.dshackle.upstream.ethereum.subscribe
|
package io.emeraldpay.dshackle.upstream.ethereum.subscribe
|
||||||
|
|
||||||
import io.emeraldpay.dshackle.upstream.Selector
|
import io.emeraldpay.dshackle.upstream.Selector
|
||||||
import io.emeraldpay.etherjar.domain.TransactionId
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.TransactionId
|
||||||
import org.slf4j.LoggerFactory
|
import org.slf4j.LoggerFactory
|
||||||
import reactor.core.publisher.Flux
|
import reactor.core.publisher.Flux
|
||||||
|
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
package io.emeraldpay.dshackle.upstream.ethereum.subscribe
|
package io.emeraldpay.dshackle.upstream.ethereum.subscribe
|
||||||
|
|
||||||
import io.emeraldpay.dshackle.upstream.SubscriptionConnect
|
import io.emeraldpay.dshackle.upstream.SubscriptionConnect
|
||||||
import io.emeraldpay.etherjar.domain.TransactionId
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.TransactionId
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A source to subscribe to newPendingTransactions.
|
* A source to subscribe to newPendingTransactions.
|
||||||
|
|||||||
@@ -22,9 +22,9 @@ import io.emeraldpay.dshackle.reader.Reader
|
|||||||
import io.emeraldpay.dshackle.upstream.Multistream
|
import io.emeraldpay.dshackle.upstream.Multistream
|
||||||
import io.emeraldpay.dshackle.upstream.ethereum.EthereumCachingReader
|
import io.emeraldpay.dshackle.upstream.ethereum.EthereumCachingReader
|
||||||
import io.emeraldpay.dshackle.upstream.ethereum.EthereumDirectReader.Result
|
import io.emeraldpay.dshackle.upstream.ethereum.EthereumDirectReader.Result
|
||||||
|
import io.emeraldpay.dshackle.upstream.ethereum.json.TransactionLogJson
|
||||||
import io.emeraldpay.dshackle.upstream.ethereum.subscribe.json.LogMessage
|
import io.emeraldpay.dshackle.upstream.ethereum.subscribe.json.LogMessage
|
||||||
import io.emeraldpay.etherjar.hex.HexData
|
import io.emeraldpay.etherjar.hex.HexData
|
||||||
import io.emeraldpay.etherjar.rpc.json.TransactionLogJson
|
|
||||||
import org.slf4j.LoggerFactory
|
import org.slf4j.LoggerFactory
|
||||||
import reactor.core.publisher.Flux
|
import reactor.core.publisher.Flux
|
||||||
import reactor.core.publisher.Mono
|
import reactor.core.publisher.Mono
|
||||||
|
|||||||
@@ -18,8 +18,8 @@ package io.emeraldpay.dshackle.upstream.ethereum.subscribe
|
|||||||
import io.emeraldpay.dshackle.upstream.SubscriptionConnect
|
import io.emeraldpay.dshackle.upstream.SubscriptionConnect
|
||||||
import io.emeraldpay.dshackle.upstream.ethereum.EthereumEgressSubscription
|
import io.emeraldpay.dshackle.upstream.ethereum.EthereumEgressSubscription
|
||||||
import io.emeraldpay.dshackle.upstream.ethereum.WsSubscriptions
|
import io.emeraldpay.dshackle.upstream.ethereum.WsSubscriptions
|
||||||
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.TransactionId
|
||||||
import io.emeraldpay.dshackle.upstream.rpcclient.JsonRpcRequest
|
import io.emeraldpay.dshackle.upstream.rpcclient.JsonRpcRequest
|
||||||
import io.emeraldpay.etherjar.domain.TransactionId
|
|
||||||
import org.slf4j.LoggerFactory
|
import org.slf4j.LoggerFactory
|
||||||
import reactor.core.publisher.Flux
|
import reactor.core.publisher.Flux
|
||||||
import reactor.core.publisher.Mono
|
import reactor.core.publisher.Mono
|
||||||
|
|||||||
@@ -17,9 +17,9 @@ package io.emeraldpay.dshackle.upstream.ethereum.subscribe.json
|
|||||||
|
|
||||||
import com.fasterxml.jackson.annotation.JsonIgnore
|
import com.fasterxml.jackson.annotation.JsonIgnore
|
||||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize
|
import com.fasterxml.jackson.databind.annotation.JsonSerialize
|
||||||
import io.emeraldpay.etherjar.domain.Address
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.Address
|
||||||
import io.emeraldpay.etherjar.domain.BlockHash
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.BlockHash
|
||||||
import io.emeraldpay.etherjar.domain.TransactionId
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.TransactionId
|
||||||
import io.emeraldpay.etherjar.hex.Hex32
|
import io.emeraldpay.etherjar.hex.Hex32
|
||||||
import io.emeraldpay.etherjar.hex.HexData
|
import io.emeraldpay.etherjar.hex.HexData
|
||||||
import io.emeraldpay.etherjar.rpc.json.HexDataSerializer
|
import io.emeraldpay.etherjar.rpc.json.HexDataSerializer
|
||||||
|
|||||||
@@ -18,10 +18,10 @@ package io.emeraldpay.dshackle.upstream.ethereum.subscribe.json
|
|||||||
import com.fasterxml.jackson.annotation.JsonIgnore
|
import com.fasterxml.jackson.annotation.JsonIgnore
|
||||||
import com.fasterxml.jackson.annotation.JsonInclude
|
import com.fasterxml.jackson.annotation.JsonInclude
|
||||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize
|
import com.fasterxml.jackson.databind.annotation.JsonSerialize
|
||||||
import io.emeraldpay.etherjar.domain.Address
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.Address
|
||||||
import io.emeraldpay.etherjar.domain.BlockHash
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.BlockHash
|
||||||
import io.emeraldpay.etherjar.domain.Bloom
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.Bloom
|
||||||
import io.emeraldpay.etherjar.domain.TransactionId
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.TransactionId
|
||||||
import io.emeraldpay.etherjar.hex.HexData
|
import io.emeraldpay.etherjar.hex.HexData
|
||||||
import io.emeraldpay.etherjar.rpc.json.HexDataSerializer
|
import io.emeraldpay.etherjar.rpc.json.HexDataSerializer
|
||||||
import java.math.BigInteger
|
import java.math.BigInteger
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ package io.emeraldpay.dshackle.upstream.ethereum.subscribe.json
|
|||||||
import com.fasterxml.jackson.core.JsonGenerator
|
import com.fasterxml.jackson.core.JsonGenerator
|
||||||
import com.fasterxml.jackson.databind.JsonSerializer
|
import com.fasterxml.jackson.databind.JsonSerializer
|
||||||
import com.fasterxml.jackson.databind.SerializerProvider
|
import com.fasterxml.jackson.databind.SerializerProvider
|
||||||
import io.emeraldpay.etherjar.domain.TransactionId
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.TransactionId
|
||||||
import org.slf4j.LoggerFactory
|
import org.slf4j.LoggerFactory
|
||||||
|
|
||||||
class TransactionIdSerializer : JsonSerializer<TransactionId>() {
|
class TransactionIdSerializer : JsonSerializer<TransactionId>() {
|
||||||
|
|||||||
@@ -34,9 +34,9 @@ import io.emeraldpay.dshackle.upstream.Lifecycle
|
|||||||
import io.emeraldpay.dshackle.upstream.LowerBoundBlockDetector
|
import io.emeraldpay.dshackle.upstream.LowerBoundBlockDetector
|
||||||
import io.emeraldpay.dshackle.upstream.Upstream
|
import io.emeraldpay.dshackle.upstream.Upstream
|
||||||
import io.emeraldpay.dshackle.upstream.calls.CallMethods
|
import io.emeraldpay.dshackle.upstream.calls.CallMethods
|
||||||
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.BlockHash
|
||||||
import io.emeraldpay.dshackle.upstream.forkchoice.NoChoiceWithPriorityForkChoice
|
import io.emeraldpay.dshackle.upstream.forkchoice.NoChoiceWithPriorityForkChoice
|
||||||
import io.emeraldpay.dshackle.upstream.rpcclient.JsonRpcGrpcClient
|
import io.emeraldpay.dshackle.upstream.rpcclient.JsonRpcGrpcClient
|
||||||
import io.emeraldpay.etherjar.domain.BlockHash
|
|
||||||
import reactor.core.publisher.Flux
|
import reactor.core.publisher.Flux
|
||||||
import reactor.core.scheduler.Scheduler
|
import reactor.core.scheduler.Scheduler
|
||||||
import java.math.BigInteger
|
import java.math.BigInteger
|
||||||
|
|||||||
@@ -18,11 +18,11 @@ package io.emeraldpay.dshackle.cache
|
|||||||
import com.fasterxml.jackson.databind.ObjectMapper
|
import com.fasterxml.jackson.databind.ObjectMapper
|
||||||
import io.emeraldpay.dshackle.Global
|
import io.emeraldpay.dshackle.Global
|
||||||
import io.emeraldpay.dshackle.data.BlockContainer
|
import io.emeraldpay.dshackle.data.BlockContainer
|
||||||
import io.emeraldpay.etherjar.domain.BlockHash
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.BlockHash
|
||||||
import io.emeraldpay.etherjar.domain.TransactionId
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.TransactionId
|
||||||
import io.emeraldpay.dshackle.upstream.ethereum.json.BlockJson
|
import io.emeraldpay.dshackle.upstream.ethereum.json.BlockJson
|
||||||
import io.emeraldpay.etherjar.rpc.json.TransactionJson
|
import io.emeraldpay.dshackle.upstream.ethereum.json.TransactionJson
|
||||||
import io.emeraldpay.etherjar.rpc.json.TransactionRefJson
|
import io.emeraldpay.dshackle.upstream.ethereum.json.TransactionRefJson
|
||||||
import spock.lang.Specification
|
import spock.lang.Specification
|
||||||
|
|
||||||
import java.time.Instant
|
import java.time.Instant
|
||||||
|
|||||||
@@ -20,11 +20,11 @@ package io.emeraldpay.dshackle.cache
|
|||||||
import io.emeraldpay.dshackle.Global
|
import io.emeraldpay.dshackle.Global
|
||||||
import io.emeraldpay.dshackle.data.BlockContainer
|
import io.emeraldpay.dshackle.data.BlockContainer
|
||||||
import io.emeraldpay.dshackle.data.BlockId
|
import io.emeraldpay.dshackle.data.BlockId
|
||||||
import io.emeraldpay.etherjar.domain.BlockHash
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.BlockHash
|
||||||
import io.emeraldpay.etherjar.domain.TransactionId
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.TransactionId
|
||||||
import io.emeraldpay.dshackle.upstream.ethereum.json.BlockJson
|
import io.emeraldpay.dshackle.upstream.ethereum.json.BlockJson
|
||||||
import io.emeraldpay.etherjar.rpc.json.TransactionJson
|
import io.emeraldpay.dshackle.upstream.ethereum.json.TransactionJson
|
||||||
import io.emeraldpay.etherjar.rpc.json.TransactionRefJson
|
import io.emeraldpay.dshackle.upstream.ethereum.json.TransactionRefJson
|
||||||
import spock.lang.Specification
|
import spock.lang.Specification
|
||||||
|
|
||||||
import java.time.Instant
|
import java.time.Instant
|
||||||
|
|||||||
@@ -22,9 +22,9 @@ import io.emeraldpay.dshackle.data.BlockContainer
|
|||||||
import io.emeraldpay.dshackle.data.BlockId
|
import io.emeraldpay.dshackle.data.BlockId
|
||||||
import io.emeraldpay.dshackle.data.TxId
|
import io.emeraldpay.dshackle.data.TxId
|
||||||
import io.emeraldpay.dshackle.test.IntegrationTestingCommons
|
import io.emeraldpay.dshackle.test.IntegrationTestingCommons
|
||||||
import io.emeraldpay.etherjar.domain.BlockHash
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.BlockHash
|
||||||
import io.emeraldpay.dshackle.upstream.ethereum.json.BlockJson
|
import io.emeraldpay.dshackle.upstream.ethereum.json.BlockJson
|
||||||
import io.emeraldpay.etherjar.rpc.json.TransactionRefJson
|
import io.emeraldpay.dshackle.upstream.ethereum.json.TransactionRefJson
|
||||||
import io.lettuce.core.api.StatefulRedisConnection
|
import io.lettuce.core.api.StatefulRedisConnection
|
||||||
import spock.lang.IgnoreIf
|
import spock.lang.IgnoreIf
|
||||||
import spock.lang.Specification
|
import spock.lang.Specification
|
||||||
|
|||||||
@@ -23,13 +23,13 @@ import io.emeraldpay.dshackle.data.DefaultContainer
|
|||||||
import io.emeraldpay.dshackle.data.TxContainer
|
import io.emeraldpay.dshackle.data.TxContainer
|
||||||
import io.emeraldpay.dshackle.data.TxId
|
import io.emeraldpay.dshackle.data.TxId
|
||||||
import io.emeraldpay.dshackle.upstream.Head
|
import io.emeraldpay.dshackle.upstream.Head
|
||||||
import io.emeraldpay.etherjar.domain.Address
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.Address
|
||||||
import io.emeraldpay.etherjar.domain.BlockHash
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.BlockHash
|
||||||
import io.emeraldpay.etherjar.domain.TransactionId
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.TransactionId
|
||||||
import io.emeraldpay.dshackle.upstream.ethereum.json.BlockJson
|
import io.emeraldpay.dshackle.upstream.ethereum.json.BlockJson
|
||||||
import io.emeraldpay.etherjar.rpc.json.TransactionJson
|
import io.emeraldpay.dshackle.upstream.ethereum.json.TransactionJson
|
||||||
import io.emeraldpay.etherjar.rpc.json.TransactionReceiptJson
|
import io.emeraldpay.dshackle.upstream.ethereum.json.TransactionReceiptJson
|
||||||
import io.emeraldpay.etherjar.rpc.json.TransactionRefJson
|
import io.emeraldpay.dshackle.upstream.ethereum.json.TransactionRefJson
|
||||||
import reactor.core.publisher.Mono
|
import reactor.core.publisher.Mono
|
||||||
import spock.lang.Specification
|
import spock.lang.Specification
|
||||||
|
|
||||||
|
|||||||
@@ -16,9 +16,9 @@
|
|||||||
package io.emeraldpay.dshackle.cache
|
package io.emeraldpay.dshackle.cache
|
||||||
|
|
||||||
import io.emeraldpay.dshackle.data.BlockContainer
|
import io.emeraldpay.dshackle.data.BlockContainer
|
||||||
import io.emeraldpay.etherjar.domain.BlockHash
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.BlockHash
|
||||||
import io.emeraldpay.dshackle.upstream.ethereum.json.BlockJson
|
import io.emeraldpay.dshackle.upstream.ethereum.json.BlockJson
|
||||||
import io.emeraldpay.etherjar.rpc.json.TransactionRefJson
|
import io.emeraldpay.dshackle.upstream.ethereum.json.TransactionRefJson
|
||||||
import spock.lang.Specification
|
import spock.lang.Specification
|
||||||
|
|
||||||
import java.time.Instant
|
import java.time.Instant
|
||||||
|
|||||||
@@ -21,10 +21,10 @@ import io.emeraldpay.dshackle.data.BlockContainer
|
|||||||
import io.emeraldpay.dshackle.data.BlockId
|
import io.emeraldpay.dshackle.data.BlockId
|
||||||
import io.emeraldpay.dshackle.data.DefaultContainer
|
import io.emeraldpay.dshackle.data.DefaultContainer
|
||||||
import io.emeraldpay.dshackle.data.TxId
|
import io.emeraldpay.dshackle.data.TxId
|
||||||
import io.emeraldpay.etherjar.domain.Address
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.Address
|
||||||
import io.emeraldpay.etherjar.domain.BlockHash
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.BlockHash
|
||||||
import io.emeraldpay.etherjar.domain.TransactionId
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.TransactionId
|
||||||
import io.emeraldpay.etherjar.rpc.json.TransactionReceiptJson
|
import io.emeraldpay.dshackle.upstream.ethereum.json.TransactionReceiptJson
|
||||||
import spock.lang.Specification
|
import spock.lang.Specification
|
||||||
|
|
||||||
import java.time.Instant
|
import java.time.Instant
|
||||||
|
|||||||
@@ -7,9 +7,9 @@ import io.emeraldpay.dshackle.data.BlockId
|
|||||||
import io.emeraldpay.dshackle.data.DefaultContainer
|
import io.emeraldpay.dshackle.data.DefaultContainer
|
||||||
import io.emeraldpay.dshackle.data.TxId
|
import io.emeraldpay.dshackle.data.TxId
|
||||||
import io.emeraldpay.dshackle.test.IntegrationTestingCommons
|
import io.emeraldpay.dshackle.test.IntegrationTestingCommons
|
||||||
import io.emeraldpay.etherjar.domain.BlockHash
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.BlockHash
|
||||||
import io.emeraldpay.etherjar.domain.TransactionId
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.TransactionId
|
||||||
import io.emeraldpay.etherjar.rpc.json.TransactionReceiptJson
|
import io.emeraldpay.dshackle.upstream.ethereum.json.TransactionReceiptJson
|
||||||
import io.lettuce.core.api.StatefulRedisConnection
|
import io.lettuce.core.api.StatefulRedisConnection
|
||||||
import spock.lang.IgnoreIf
|
import spock.lang.IgnoreIf
|
||||||
import spock.lang.Specification
|
import spock.lang.Specification
|
||||||
|
|||||||
@@ -21,11 +21,11 @@ import io.emeraldpay.dshackle.data.BlockContainer
|
|||||||
import io.emeraldpay.dshackle.data.BlockId
|
import io.emeraldpay.dshackle.data.BlockId
|
||||||
import io.emeraldpay.dshackle.data.TxContainer
|
import io.emeraldpay.dshackle.data.TxContainer
|
||||||
import io.emeraldpay.dshackle.data.TxId
|
import io.emeraldpay.dshackle.data.TxId
|
||||||
import io.emeraldpay.etherjar.domain.BlockHash
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.BlockHash
|
||||||
import io.emeraldpay.etherjar.domain.TransactionId
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.TransactionId
|
||||||
import io.emeraldpay.dshackle.upstream.ethereum.json.BlockJson
|
import io.emeraldpay.dshackle.upstream.ethereum.json.BlockJson
|
||||||
import io.emeraldpay.etherjar.rpc.json.TransactionJson
|
import io.emeraldpay.dshackle.upstream.ethereum.json.TransactionJson
|
||||||
import io.emeraldpay.etherjar.rpc.json.TransactionRefJson
|
import io.emeraldpay.dshackle.upstream.ethereum.json.TransactionRefJson
|
||||||
import spock.lang.Specification
|
import spock.lang.Specification
|
||||||
|
|
||||||
import java.time.Instant
|
import java.time.Instant
|
||||||
|
|||||||
@@ -23,12 +23,12 @@ import io.emeraldpay.dshackle.data.BlockId
|
|||||||
import io.emeraldpay.dshackle.data.TxContainer
|
import io.emeraldpay.dshackle.data.TxContainer
|
||||||
import io.emeraldpay.dshackle.data.TxId
|
import io.emeraldpay.dshackle.data.TxId
|
||||||
import io.emeraldpay.dshackle.test.IntegrationTestingCommons
|
import io.emeraldpay.dshackle.test.IntegrationTestingCommons
|
||||||
import io.emeraldpay.etherjar.domain.BlockHash
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.BlockHash
|
||||||
import io.emeraldpay.etherjar.domain.TransactionId
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.TransactionId
|
||||||
import io.emeraldpay.etherjar.domain.Wei
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.Wei
|
||||||
import io.emeraldpay.dshackle.upstream.ethereum.json.BlockJson
|
import io.emeraldpay.dshackle.upstream.ethereum.json.BlockJson
|
||||||
import io.emeraldpay.etherjar.rpc.json.TransactionJson
|
import io.emeraldpay.dshackle.upstream.ethereum.json.TransactionJson
|
||||||
import io.emeraldpay.etherjar.rpc.json.TransactionRefJson
|
import io.emeraldpay.dshackle.upstream.ethereum.json.TransactionRefJson
|
||||||
import io.lettuce.core.api.StatefulRedisConnection
|
import io.lettuce.core.api.StatefulRedisConnection
|
||||||
import spock.lang.IgnoreIf
|
import spock.lang.IgnoreIf
|
||||||
import spock.lang.Specification
|
import spock.lang.Specification
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
*/
|
*/
|
||||||
package io.emeraldpay.dshackle.data
|
package io.emeraldpay.dshackle.data
|
||||||
|
|
||||||
import io.emeraldpay.etherjar.domain.BlockHash
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.BlockHash
|
||||||
import spock.lang.Specification
|
import spock.lang.Specification
|
||||||
|
|
||||||
class BlockIdSpec extends Specification {
|
class BlockIdSpec extends Specification {
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
*/
|
*/
|
||||||
package io.emeraldpay.dshackle.data
|
package io.emeraldpay.dshackle.data
|
||||||
|
|
||||||
import io.emeraldpay.etherjar.domain.TransactionId
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.TransactionId
|
||||||
import spock.lang.Specification
|
import spock.lang.Specification
|
||||||
|
|
||||||
class TxIdSpec extends Specification {
|
class TxIdSpec extends Specification {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
package io.emeraldpay.dshackle.rpc
|
package io.emeraldpay.dshackle.rpc
|
||||||
|
|
||||||
import io.emeraldpay.api.proto.Common
|
import io.emeraldpay.api.proto.Common
|
||||||
import io.emeraldpay.etherjar.domain.Address
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.Address
|
||||||
import reactor.test.StepVerifier
|
import reactor.test.StepVerifier
|
||||||
import spock.lang.Specification
|
import spock.lang.Specification
|
||||||
|
|
||||||
|
|||||||
@@ -26,8 +26,8 @@ import io.emeraldpay.dshackle.test.GenericUpstreamMock
|
|||||||
import io.emeraldpay.dshackle.test.MultistreamHolderMock
|
import io.emeraldpay.dshackle.test.MultistreamHolderMock
|
||||||
import io.emeraldpay.dshackle.test.TestingCommons
|
import io.emeraldpay.dshackle.test.TestingCommons
|
||||||
import io.emeraldpay.dshackle.upstream.ethereum.json.BlockJson
|
import io.emeraldpay.dshackle.upstream.ethereum.json.BlockJson
|
||||||
import io.emeraldpay.etherjar.domain.BlockHash
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.BlockHash
|
||||||
import io.emeraldpay.etherjar.rpc.json.TransactionRefJson
|
import io.emeraldpay.dshackle.upstream.ethereum.json.TransactionRefJson
|
||||||
import reactor.core.publisher.Mono
|
import reactor.core.publisher.Mono
|
||||||
import reactor.test.StepVerifier
|
import reactor.test.StepVerifier
|
||||||
import spock.lang.Specification
|
import spock.lang.Specification
|
||||||
|
|||||||
@@ -35,9 +35,9 @@ import io.emeraldpay.dshackle.upstream.ethereum.json.BlockJson
|
|||||||
import io.emeraldpay.dshackle.upstream.generic.GenericMultistream
|
import io.emeraldpay.dshackle.upstream.generic.GenericMultistream
|
||||||
import io.emeraldpay.dshackle.upstream.rpcclient.JsonRpcRequest
|
import io.emeraldpay.dshackle.upstream.rpcclient.JsonRpcRequest
|
||||||
import io.emeraldpay.dshackle.upstream.rpcclient.JsonRpcResponse
|
import io.emeraldpay.dshackle.upstream.rpcclient.JsonRpcResponse
|
||||||
import io.emeraldpay.etherjar.domain.BlockHash
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.BlockHash
|
||||||
import io.emeraldpay.etherjar.domain.TransactionId
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.TransactionId
|
||||||
import io.emeraldpay.etherjar.rpc.json.TransactionRefJson
|
import io.emeraldpay.dshackle.upstream.ethereum.json.TransactionRefJson
|
||||||
import io.micrometer.core.instrument.MeterRegistry
|
import io.micrometer.core.instrument.MeterRegistry
|
||||||
import io.micrometer.core.instrument.logging.LoggingMeterRegistry
|
import io.micrometer.core.instrument.logging.LoggingMeterRegistry
|
||||||
import org.apache.commons.lang3.StringUtils
|
import org.apache.commons.lang3.StringUtils
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
package io.emeraldpay.dshackle.upstream
|
package io.emeraldpay.dshackle.upstream
|
||||||
|
|
||||||
import io.emeraldpay.dshackle.data.BlockContainer
|
import io.emeraldpay.dshackle.data.BlockContainer
|
||||||
import io.emeraldpay.etherjar.domain.BlockHash
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.BlockHash
|
||||||
import io.emeraldpay.dshackle.upstream.ethereum.json.BlockJson
|
import io.emeraldpay.dshackle.upstream.ethereum.json.BlockJson
|
||||||
import spock.lang.Specification
|
import spock.lang.Specification
|
||||||
|
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
package io.emeraldpay.dshackle.upstream
|
package io.emeraldpay.dshackle.upstream
|
||||||
|
|
||||||
import io.emeraldpay.dshackle.data.BlockContainer
|
import io.emeraldpay.dshackle.data.BlockContainer
|
||||||
import io.emeraldpay.etherjar.domain.BlockHash
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.BlockHash
|
||||||
import io.emeraldpay.dshackle.upstream.ethereum.json.BlockJson
|
import io.emeraldpay.dshackle.upstream.ethereum.json.BlockJson
|
||||||
import org.jetbrains.annotations.NotNull
|
import org.jetbrains.annotations.NotNull
|
||||||
import reactor.core.publisher.Flux
|
import reactor.core.publisher.Flux
|
||||||
|
|||||||
@@ -36,8 +36,8 @@ import io.emeraldpay.dshackle.upstream.grpc.GenericGrpcUpstream
|
|||||||
import io.emeraldpay.dshackle.upstream.rpcclient.JsonRpcRequest
|
import io.emeraldpay.dshackle.upstream.rpcclient.JsonRpcRequest
|
||||||
import io.emeraldpay.dshackle.upstream.rpcclient.JsonRpcResponse
|
import io.emeraldpay.dshackle.upstream.rpcclient.JsonRpcResponse
|
||||||
import io.emeraldpay.dshackle.upstream.starknet.StarknetChainSpecific
|
import io.emeraldpay.dshackle.upstream.starknet.StarknetChainSpecific
|
||||||
import io.emeraldpay.etherjar.domain.BlockHash
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.BlockHash
|
||||||
import io.emeraldpay.etherjar.rpc.json.TransactionRefJson
|
import io.emeraldpay.dshackle.upstream.ethereum.json.TransactionRefJson
|
||||||
import org.jetbrains.annotations.NotNull
|
import org.jetbrains.annotations.NotNull
|
||||||
import reactor.core.publisher.Flux
|
import reactor.core.publisher.Flux
|
||||||
import reactor.core.publisher.Mono
|
import reactor.core.publisher.Mono
|
||||||
|
|||||||
@@ -13,13 +13,13 @@ import io.emeraldpay.dshackle.upstream.*
|
|||||||
import io.emeraldpay.dshackle.upstream.calls.DefaultEthereumMethods
|
import io.emeraldpay.dshackle.upstream.calls.DefaultEthereumMethods
|
||||||
import io.emeraldpay.dshackle.upstream.ethereum.json.BlockJson
|
import io.emeraldpay.dshackle.upstream.ethereum.json.BlockJson
|
||||||
import io.emeraldpay.dshackle.upstream.rpcclient.JsonRpcRequest
|
import io.emeraldpay.dshackle.upstream.rpcclient.JsonRpcRequest
|
||||||
import io.emeraldpay.etherjar.domain.Address
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.Address
|
||||||
import io.emeraldpay.etherjar.domain.BlockHash
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.BlockHash
|
||||||
import io.emeraldpay.etherjar.domain.TransactionId
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.TransactionId
|
||||||
import io.emeraldpay.etherjar.domain.Wei
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.Wei
|
||||||
import io.emeraldpay.etherjar.rpc.json.TransactionJson
|
import io.emeraldpay.dshackle.upstream.ethereum.json.TransactionJson
|
||||||
import io.emeraldpay.etherjar.rpc.json.TransactionLogJson
|
import io.emeraldpay.dshackle.upstream.ethereum.json.TransactionLogJson
|
||||||
import io.emeraldpay.etherjar.rpc.json.TransactionReceiptJson
|
import io.emeraldpay.dshackle.upstream.ethereum.json.TransactionReceiptJson
|
||||||
import org.apache.commons.collections4.Factory
|
import org.apache.commons.collections4.Factory
|
||||||
import reactor.core.publisher.Mono
|
import reactor.core.publisher.Mono
|
||||||
import reactor.test.StepVerifier
|
import reactor.test.StepVerifier
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ package io.emeraldpay.dshackle.upstream.ethereum
|
|||||||
import io.emeraldpay.dshackle.test.TestingCommons
|
import io.emeraldpay.dshackle.test.TestingCommons
|
||||||
import io.emeraldpay.dshackle.upstream.generic.GenericMultistream
|
import io.emeraldpay.dshackle.upstream.generic.GenericMultistream
|
||||||
import io.emeraldpay.dshackle.upstream.ethereum.subscribe.PendingTxesSource
|
import io.emeraldpay.dshackle.upstream.ethereum.subscribe.PendingTxesSource
|
||||||
import io.emeraldpay.etherjar.domain.Address
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.Address
|
||||||
import io.emeraldpay.etherjar.hex.Hex32
|
import io.emeraldpay.etherjar.hex.Hex32
|
||||||
import reactor.core.publisher.Flux
|
import reactor.core.publisher.Flux
|
||||||
import reactor.core.scheduler.Schedulers
|
import reactor.core.scheduler.Schedulers
|
||||||
|
|||||||
@@ -25,10 +25,10 @@ import io.emeraldpay.dshackle.upstream.rpcclient.JsonRpcError
|
|||||||
import io.emeraldpay.dshackle.upstream.rpcclient.JsonRpcRequest
|
import io.emeraldpay.dshackle.upstream.rpcclient.JsonRpcRequest
|
||||||
import io.emeraldpay.dshackle.upstream.rpcclient.JsonRpcResponse
|
import io.emeraldpay.dshackle.upstream.rpcclient.JsonRpcResponse
|
||||||
import io.emeraldpay.dshackle.upstream.Upstream
|
import io.emeraldpay.dshackle.upstream.Upstream
|
||||||
import io.emeraldpay.etherjar.domain.Address
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.Address
|
||||||
import io.emeraldpay.etherjar.hex.HexData
|
import io.emeraldpay.etherjar.hex.HexData
|
||||||
import io.emeraldpay.etherjar.rpc.RpcResponseError
|
import io.emeraldpay.etherjar.rpc.RpcResponseError
|
||||||
import io.emeraldpay.etherjar.rpc.json.TransactionCallJson
|
import io.emeraldpay.dshackle.upstream.ethereum.json.TransactionCallJson
|
||||||
import reactor.core.publisher.Mono
|
import reactor.core.publisher.Mono
|
||||||
import reactor.util.function.Tuples
|
import reactor.util.function.Tuples
|
||||||
import spock.lang.Specification
|
import spock.lang.Specification
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ import io.emeraldpay.dshackle.data.BlockContainer
|
|||||||
import io.emeraldpay.dshackle.upstream.BlockValidator
|
import io.emeraldpay.dshackle.upstream.BlockValidator
|
||||||
import io.emeraldpay.dshackle.upstream.generic.GenericHead
|
import io.emeraldpay.dshackle.upstream.generic.GenericHead
|
||||||
import io.emeraldpay.dshackle.upstream.forkchoice.MostWorkForkChoice
|
import io.emeraldpay.dshackle.upstream.forkchoice.MostWorkForkChoice
|
||||||
import io.emeraldpay.etherjar.domain.BlockHash
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.BlockHash
|
||||||
import io.emeraldpay.dshackle.upstream.ethereum.json.BlockJson
|
import io.emeraldpay.dshackle.upstream.ethereum.json.BlockJson
|
||||||
import reactor.core.publisher.Flux
|
import reactor.core.publisher.Flux
|
||||||
import reactor.core.scheduler.Schedulers
|
import reactor.core.scheduler.Schedulers
|
||||||
|
|||||||
@@ -27,8 +27,8 @@ import io.emeraldpay.dshackle.upstream.ethereum.json.BlockJson
|
|||||||
import io.emeraldpay.dshackle.upstream.forkchoice.AlwaysForkChoice
|
import io.emeraldpay.dshackle.upstream.forkchoice.AlwaysForkChoice
|
||||||
import io.emeraldpay.dshackle.upstream.rpcclient.JsonRpcRequest
|
import io.emeraldpay.dshackle.upstream.rpcclient.JsonRpcRequest
|
||||||
import io.emeraldpay.dshackle.upstream.rpcclient.JsonRpcResponse
|
import io.emeraldpay.dshackle.upstream.rpcclient.JsonRpcResponse
|
||||||
import io.emeraldpay.etherjar.domain.BlockHash
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.BlockHash
|
||||||
import io.emeraldpay.etherjar.rpc.json.TransactionRefJson
|
import io.emeraldpay.dshackle.upstream.ethereum.json.TransactionRefJson
|
||||||
import reactor.core.publisher.Flux
|
import reactor.core.publisher.Flux
|
||||||
import reactor.core.publisher.Mono
|
import reactor.core.publisher.Mono
|
||||||
import reactor.core.publisher.Sinks
|
import reactor.core.publisher.Sinks
|
||||||
|
|||||||
@@ -21,9 +21,9 @@ import io.emeraldpay.dshackle.test.GenericUpstreamMock
|
|||||||
import io.emeraldpay.dshackle.test.TestingCommons
|
import io.emeraldpay.dshackle.test.TestingCommons
|
||||||
import io.emeraldpay.dshackle.upstream.DefaultUpstream
|
import io.emeraldpay.dshackle.upstream.DefaultUpstream
|
||||||
import io.emeraldpay.dshackle.upstream.rpcclient.JsonRpcRequest
|
import io.emeraldpay.dshackle.upstream.rpcclient.JsonRpcRequest
|
||||||
import io.emeraldpay.etherjar.domain.TransactionId
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.TransactionId
|
||||||
import io.emeraldpay.etherjar.rpc.RpcResponseError
|
import io.emeraldpay.etherjar.rpc.RpcResponseError
|
||||||
import io.emeraldpay.etherjar.rpc.json.TransactionJson
|
import io.emeraldpay.dshackle.upstream.ethereum.json.TransactionJson
|
||||||
import reactor.core.publisher.Flux
|
import reactor.core.publisher.Flux
|
||||||
import reactor.core.scheduler.Schedulers
|
import reactor.core.scheduler.Schedulers
|
||||||
import reactor.test.StepVerifier
|
import reactor.test.StepVerifier
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
package io.emeraldpay.dshackle.upstream.ethereum.subscribe
|
package io.emeraldpay.dshackle.upstream.ethereum.subscribe
|
||||||
|
|
||||||
import io.emeraldpay.dshackle.upstream.Selector
|
import io.emeraldpay.dshackle.upstream.Selector
|
||||||
import io.emeraldpay.etherjar.domain.TransactionId
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.TransactionId
|
||||||
import reactor.core.publisher.Flux
|
import reactor.core.publisher.Flux
|
||||||
import spock.lang.Specification
|
import spock.lang.Specification
|
||||||
|
|
||||||
|
|||||||
@@ -21,10 +21,10 @@ import io.emeraldpay.dshackle.data.TxId
|
|||||||
import io.emeraldpay.dshackle.upstream.Head
|
import io.emeraldpay.dshackle.upstream.Head
|
||||||
import io.emeraldpay.dshackle.upstream.Selector
|
import io.emeraldpay.dshackle.upstream.Selector
|
||||||
import io.emeraldpay.dshackle.upstream.generic.GenericMultistream
|
import io.emeraldpay.dshackle.upstream.generic.GenericMultistream
|
||||||
import io.emeraldpay.etherjar.domain.BlockHash
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.BlockHash
|
||||||
import io.emeraldpay.etherjar.domain.TransactionId
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.TransactionId
|
||||||
import io.emeraldpay.dshackle.upstream.ethereum.json.BlockJson
|
import io.emeraldpay.dshackle.upstream.ethereum.json.BlockJson
|
||||||
import io.emeraldpay.etherjar.rpc.json.TransactionRefJson
|
import io.emeraldpay.dshackle.upstream.ethereum.json.TransactionRefJson
|
||||||
import reactor.core.publisher.Flux
|
import reactor.core.publisher.Flux
|
||||||
import reactor.core.scheduler.Schedulers
|
import reactor.core.scheduler.Schedulers
|
||||||
import spock.lang.Specification
|
import spock.lang.Specification
|
||||||
|
|||||||
@@ -17,9 +17,9 @@ package io.emeraldpay.dshackle.upstream.ethereum.subscribe
|
|||||||
|
|
||||||
import io.emeraldpay.dshackle.test.TestingCommons
|
import io.emeraldpay.dshackle.test.TestingCommons
|
||||||
import io.emeraldpay.dshackle.upstream.ethereum.subscribe.json.LogMessage
|
import io.emeraldpay.dshackle.upstream.ethereum.subscribe.json.LogMessage
|
||||||
import io.emeraldpay.etherjar.domain.Address
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.Address
|
||||||
import io.emeraldpay.etherjar.domain.BlockHash
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.BlockHash
|
||||||
import io.emeraldpay.etherjar.domain.TransactionId
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.TransactionId
|
||||||
import io.emeraldpay.etherjar.hex.Hex32
|
import io.emeraldpay.etherjar.hex.Hex32
|
||||||
import io.emeraldpay.etherjar.hex.HexData
|
import io.emeraldpay.etherjar.hex.HexData
|
||||||
import reactor.core.publisher.Flux
|
import reactor.core.publisher.Flux
|
||||||
|
|||||||
@@ -20,11 +20,11 @@ import io.emeraldpay.dshackle.data.BlockId
|
|||||||
import io.emeraldpay.dshackle.data.TxId
|
import io.emeraldpay.dshackle.data.TxId
|
||||||
import io.emeraldpay.dshackle.reader.Reader
|
import io.emeraldpay.dshackle.reader.Reader
|
||||||
import io.emeraldpay.dshackle.upstream.ethereum.EthereumDirectReader
|
import io.emeraldpay.dshackle.upstream.ethereum.EthereumDirectReader
|
||||||
import io.emeraldpay.etherjar.domain.Address
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.Address
|
||||||
import io.emeraldpay.etherjar.domain.BlockHash
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.BlockHash
|
||||||
import io.emeraldpay.etherjar.domain.TransactionId
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.TransactionId
|
||||||
import io.emeraldpay.etherjar.hex.HexData
|
import io.emeraldpay.etherjar.hex.HexData
|
||||||
import io.emeraldpay.etherjar.rpc.json.TransactionLogJson
|
import io.emeraldpay.dshackle.upstream.ethereum.json.TransactionLogJson
|
||||||
import reactor.core.publisher.Mono
|
import reactor.core.publisher.Mono
|
||||||
import spock.lang.Specification
|
import spock.lang.Specification
|
||||||
|
|
||||||
|
|||||||
@@ -17,9 +17,9 @@ package io.emeraldpay.dshackle.upstream.ethereum.subscribe.json
|
|||||||
|
|
||||||
import com.fasterxml.jackson.databind.ObjectMapper
|
import com.fasterxml.jackson.databind.ObjectMapper
|
||||||
import io.emeraldpay.dshackle.Global
|
import io.emeraldpay.dshackle.Global
|
||||||
import io.emeraldpay.etherjar.domain.Address
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.Address
|
||||||
import io.emeraldpay.etherjar.domain.BlockHash
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.BlockHash
|
||||||
import io.emeraldpay.etherjar.domain.TransactionId
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.TransactionId
|
||||||
import io.emeraldpay.etherjar.hex.Hex32
|
import io.emeraldpay.etherjar.hex.Hex32
|
||||||
import io.emeraldpay.etherjar.hex.HexData
|
import io.emeraldpay.etherjar.hex.HexData
|
||||||
import spock.lang.Specification
|
import spock.lang.Specification
|
||||||
|
|||||||
@@ -2,9 +2,9 @@ package io.emeraldpay.dshackle.upstream.ethereum.subscribe.json
|
|||||||
|
|
||||||
import com.fasterxml.jackson.databind.ObjectMapper
|
import com.fasterxml.jackson.databind.ObjectMapper
|
||||||
import io.emeraldpay.dshackle.Global
|
import io.emeraldpay.dshackle.Global
|
||||||
import io.emeraldpay.etherjar.domain.Address
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.Address
|
||||||
import io.emeraldpay.etherjar.domain.BlockHash
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.BlockHash
|
||||||
import io.emeraldpay.etherjar.domain.Bloom
|
import io.emeraldpay.dshackle.upstream.ethereum.domain.Bloom
|
||||||
import io.emeraldpay.etherjar.hex.HexData
|
import io.emeraldpay.etherjar.hex.HexData
|
||||||
import spock.lang.Specification
|
import spock.lang.Specification
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user