com.hedera.hashgraph.sdk.EthereumTransactionDataEip1559 Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of sdk-full Show documentation
Show all versions of sdk-full Show documentation
Hedera™ Hashgraph SDK for Java
/*-
*
* Hedera Java SDK
*
* Copyright (C) 2022 - 2024 Hedera Hashgraph, LLC
*
* 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 com.hedera.hashgraph.sdk;
import com.esaulpaugh.headlong.rlp.RLPDecoder;
import com.esaulpaugh.headlong.rlp.RLPEncoder;
import com.esaulpaugh.headlong.rlp.RLPItem;
import com.esaulpaugh.headlong.util.Integers;
import com.google.common.base.MoreObjects;
import java.util.ArrayList;
import java.util.List;
import org.bouncycastle.util.encoders.Hex;
/**
* The ethereum transaction data, in the format defined in EIP-1559
*/
public class EthereumTransactionDataEip1559 extends EthereumTransactionData {
/**
* ID of the chain
*/
public byte[] chainId;
/**
* Transaction's nonce
*/
public byte[] nonce;
/**
* An 'optional' additional fee in Ethereum that is paid directly to miners in order to incentivize them to include
* your transaction in a block. Not used in Hedera
*/
public byte[] maxPriorityGas;
/**
* The maximum amount, in tinybars, that the payer of the hedera transaction is willing to pay to complete the
* transaction
*/
public byte[] maxGas;
/**
* The amount of gas available for the transaction
*/
public byte[] gasLimit;
/**
* The receiver of the transaction
*/
public byte[] to;
/**
* The transaction value
*/
public byte[] value;
/**
* specifies an array of addresses and storage keys that the transaction plans to access
*/
public byte[] accessList;
/**
* recovery parameter used to ease the signature verification
*/
public byte[] recoveryId;
/**
* The R value of the signature
*/
public byte[] r;
/**
* The S value of the signature
*/
public byte[] s;
EthereumTransactionDataEip1559(
byte[] chainId,
byte[] nonce,
byte[] maxPriorityGas,
byte[] maxGas,
byte[] gasLimit,
byte[] to,
byte[] value,
byte[] callData,
byte[] accessList,
byte[] recoveryId,
byte[] r,
byte[] s
) {
super(callData);
this.chainId = chainId;
this.nonce = nonce;
this.maxPriorityGas = maxPriorityGas;
this.maxGas = maxGas;
this.gasLimit = gasLimit;
this.to = to;
this.value = value;
this.accessList = accessList;
this.recoveryId = recoveryId;
this.r = r;
this.s = s;
}
/**
* Convert a byte array to an ethereum transaction data.
*
* @param bytes the byte array
* @return the ethereum transaction data
*/
public static EthereumTransactionDataEip1559 fromBytes(byte[] bytes) {
var decoder = RLPDecoder.RLP_STRICT.sequenceIterator(bytes);
var rlpItem = decoder.next();
// typed transaction?
byte typeByte = rlpItem.asByte();
if (typeByte != 2) {
throw new IllegalArgumentException("rlp type byte " + typeByte + "is not supported");
}
rlpItem = decoder.next();
if (!rlpItem.isList()) {
throw new IllegalArgumentException("expected RLP element list");
}
List rlpList = rlpItem.asRLPList().elements();
if (rlpList.size() != 12) {
throw new IllegalArgumentException("expected 12 RLP encoded elements, found " + rlpList.size());
}
return new EthereumTransactionDataEip1559(
rlpList.get(0).data(),
rlpList.get(1).data(),
rlpList.get(2).data(),
rlpList.get(3).data(),
rlpList.get(4).data(),
rlpList.get(5).data(),
rlpList.get(6).data(),
rlpList.get(7).data(),
rlpList.get(8).data(),
rlpList.get(9).data(),
rlpList.get(10).data(),
rlpList.get(11).data()
);
}
public byte[] toBytes() {
return RLPEncoder.sequence(Integers.toBytes(0x02), List.of(
chainId, nonce, maxPriorityGas, maxGas, gasLimit, to,
value, callData, new ArrayList(), recoveryId, r, s
));
}
public String toString() {
return MoreObjects.toStringHelper(this)
.add("chainId", Hex.toHexString(chainId))
.add("nonce", Hex.toHexString(nonce))
.add("maxPriorityGas", Hex.toHexString(maxPriorityGas))
.add("maxGas", Hex.toHexString(maxGas))
.add("gasLimit", Hex.toHexString(gasLimit))
.add("to", Hex.toHexString(to))
.add("value", Hex.toHexString(value))
.add("accessList", Hex.toHexString(accessList))
.add("recoveryId", Hex.toHexString(recoveryId))
.add("r", Hex.toHexString(r))
.add("s", Hex.toHexString(s))
.toString();
}
}