signatures, int compression,
String packagedContextFreeData, @NotNull String packTrx) {
this.signatures = signatures;
this.compression = compression;
diff --git a/eosiojava/src/main/java/one/block/eosiojava/models/rpcProvider/response/PushTransactionResponse.java b/eosiojava/src/main/java/one/block/eosiojava/models/rpcProvider/response/SendTransactionResponse.java
similarity index 69%
rename from eosiojava/src/main/java/one/block/eosiojava/models/rpcProvider/response/PushTransactionResponse.java
rename to eosiojava/src/main/java/one/block/eosiojava/models/rpcProvider/response/SendTransactionResponse.java
index a55edd1..fae6597 100644
--- a/eosiojava/src/main/java/one/block/eosiojava/models/rpcProvider/response/PushTransactionResponse.java
+++ b/eosiojava/src/main/java/one/block/eosiojava/models/rpcProvider/response/SendTransactionResponse.java
@@ -2,13 +2,11 @@
import com.google.gson.annotations.SerializedName;
import java.util.Map;
-import one.block.eosiojava.models.rpcProvider.request.PushTransactionRequest;
/**
- * The response of the pushTransaction() RPC call
- * {@link one.block.eosiojava.interfaces.IRPCProvider#pushTransaction(PushTransactionRequest)}
+ * The base class for send transaction responses
*/
-public class PushTransactionResponse {
+public class SendTransactionResponse {
/**
* The transaction id of the successful transaction.
@@ -16,6 +14,9 @@ public class PushTransactionResponse {
@SerializedName("transaction_id")
private String transactionId;
+ /**
+ * The processed transaction
+ */
@SerializedName("processed")
private Map processed;
@@ -28,6 +29,11 @@ public String getTransactionId() {
return transactionId;
}
+ /**
+ * Gets the processed information of the successful transaction.
+ *
+ * @return The processed information.
+ */
public Map getProcessed() {
return processed;
}
diff --git a/eosiojava/src/main/java/one/block/eosiojava/session/TransactionProcessor.java b/eosiojava/src/main/java/one/block/eosiojava/session/TransactionProcessor.java
index 2add4e2..2e4cabf 100644
--- a/eosiojava/src/main/java/one/block/eosiojava/session/TransactionProcessor.java
+++ b/eosiojava/src/main/java/one/block/eosiojava/session/TransactionProcessor.java
@@ -1,20 +1,24 @@
package one.block.eosiojava.session;
import com.google.common.base.Strings;
+import io.reactivex.Completable;
import java.io.IOException;
import java.io.Serializable;
import java.math.BigInteger;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.List;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
import one.block.eosiojava.error.ErrorConstants;
import one.block.eosiojava.error.abiProvider.GetAbiError;
import one.block.eosiojava.error.rpcProvider.GetBlockRpcError;
import one.block.eosiojava.error.rpcProvider.GetInfoRpcError;
import one.block.eosiojava.error.rpcProvider.GetRequiredKeysRpcError;
-import one.block.eosiojava.error.rpcProvider.PushTransactionRpcError;
+import one.block.eosiojava.error.rpcProvider.SendTransactionRpcError;
import one.block.eosiojava.error.serializationProvider.DeserializeTransactionError;
import one.block.eosiojava.error.serializationProvider.SerializeError;
+import one.block.eosiojava.error.serializationProvider.SerializePackedTransactionError;
import one.block.eosiojava.error.serializationProvider.SerializeTransactionError;
import one.block.eosiojava.error.session.TransactionBroadCastEmptySignatureError;
import one.block.eosiojava.error.session.TransactionBroadCastError;
@@ -33,16 +37,20 @@
import one.block.eosiojava.error.session.TransactionPrepareInputError;
import one.block.eosiojava.error.session.TransactionPrepareRpcError;
import one.block.eosiojava.error.session.TransactionProcessorConstructorInputError;
-import one.block.eosiojava.error.session.TransactionPushTransactionError;
+import one.block.eosiojava.error.session.TransactionSendRpcTransactionError;
+import one.block.eosiojava.error.session.TransactionSendAmqpTransactionError;
import one.block.eosiojava.error.session.TransactionSerializeError;
import one.block.eosiojava.error.session.TransactionSignAndBroadCastError;
import one.block.eosiojava.error.session.TransactionSignError;
import one.block.eosiojava.error.signatureProvider.GetAvailableKeysError;
import one.block.eosiojava.error.signatureProvider.SignatureProviderError;
import one.block.eosiojava.interfaces.IABIProvider;
+import one.block.eosiojava.interfaces.IAMQPProvider;
import one.block.eosiojava.interfaces.IRPCProvider;
import one.block.eosiojava.interfaces.ISerializationProvider;
import one.block.eosiojava.interfaces.ISignatureProvider;
+import one.block.eosiojava.models.amqpProvider.AMQPMessageFailedResponse;
+import one.block.eosiojava.models.amqpProvider.AMQPMessageSuccessResponse;
import one.block.eosiojava.models.AbiEosSerializationObject;
import one.block.eosiojava.models.EOSIOName;
import one.block.eosiojava.models.rpcProvider.Action;
@@ -51,15 +59,16 @@
import one.block.eosiojava.models.rpcProvider.TransactionConfig;
import one.block.eosiojava.models.rpcProvider.request.GetBlockRequest;
import one.block.eosiojava.models.rpcProvider.request.GetRequiredKeysRequest;
-import one.block.eosiojava.models.rpcProvider.request.PushTransactionRequest;
+import one.block.eosiojava.models.rpcProvider.request.SendTransactionRequest;
import one.block.eosiojava.models.rpcProvider.response.GetBlockResponse;
import one.block.eosiojava.models.rpcProvider.response.GetInfoResponse;
import one.block.eosiojava.models.rpcProvider.response.GetRequiredKeysResponse;
-import one.block.eosiojava.models.rpcProvider.response.PushTransactionResponse;
+import one.block.eosiojava.models.rpcProvider.response.SendTransactionResponse;
import one.block.eosiojava.models.signatureProvider.EosioTransactionSignatureRequest;
import one.block.eosiojava.models.signatureProvider.EosioTransactionSignatureResponse;
import one.block.eosiojava.utilities.DateFormatter;
import one.block.eosiojava.utilities.Utils;
+import org.bouncycastle.util.encoders.Hex;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -105,6 +114,12 @@ public class TransactionProcessor {
@NotNull
private ISignatureProvider signatureProvider;
+ /**
+ * Reference of AMQP Provider from TransactionSession
+ */
+ @Nullable
+ private IAMQPProvider amqpProvider;
+
/**
* Transaction instance that holds all data relating to an EOS Transaction.
*
@@ -198,6 +213,11 @@ public class TransactionProcessor {
*/
private boolean isTransactionModificationAllowed;
+ /**
+ * Prefix for packed transaction v0
+ */
+ private static final String PACKED_TRANSACTION_V0_PREFIX = "00";
+
/**
* Constructor with all provider references from {@link TransactionSession}
* @param serializationProvider the serialization provider.
@@ -216,6 +236,24 @@ public TransactionProcessor(
this.signatureProvider = signatureProvider;
}
+ /**
+ * Constructor with all provider references from {@link TransactionSession}
+ * @param serializationProvider the serialization provider.
+ * @param rpcProvider the rpc provider.
+ * @param abiProvider the abi provider.
+ * @param signatureProvider the signature provider.
+ * @param amqpProvider the AMQP provider.
+ */
+ public TransactionProcessor(
+ @NotNull ISerializationProvider serializationProvider,
+ @NotNull IRPCProvider rpcProvider,
+ @NotNull IABIProvider abiProvider,
+ @NotNull ISignatureProvider signatureProvider,
+ @NotNull IAMQPProvider amqpProvider) {
+ this(serializationProvider, rpcProvider, abiProvider, signatureProvider);
+ this.amqpProvider = amqpProvider;
+ }
+
/**
* Constructor with all provider references from {@link TransactionSession} and preset
* Transaction
@@ -223,7 +261,7 @@ public TransactionProcessor(
* @param rpcProvider the rpc provider.
* @param abiProvider the abi provider.
* @param signatureProvider the signature provider.
- * @param transaction - preset Transaction
+ * @param transaction - the preset Transaction.
* @throws TransactionProcessorConstructorInputError thrown if the input transaction has an empty action list.
*/
public TransactionProcessor(
@@ -233,11 +271,29 @@ public TransactionProcessor(
@NotNull ISignatureProvider signatureProvider,
@NotNull Transaction transaction) throws TransactionProcessorConstructorInputError {
this(serializationProvider, rpcProvider, abiProvider, signatureProvider);
- this.transaction = transaction;
- if (this.transaction.getActions().isEmpty()) {
- throw new TransactionProcessorConstructorInputError(
- ErrorConstants.TRANSACTION_PROCESSOR_ACTIONS_EMPTY_ERROR_MSG);
- }
+ this.setTransaction(transaction);
+ }
+
+ /**
+ * Constructor with all provider references from {@link TransactionSession} and preset
+ * Transaction
+ * @param serializationProvider the serialization provider.
+ * @param rpcProvider the rpc provider.
+ * @param abiProvider the abi provider.
+ * @param signatureProvider the signature provider.
+ * @param transaction - the preset Transaction.
+ * @param amqpProvider the AMQP provider.
+ * @throws TransactionProcessorConstructorInputError thrown if the input transaction has an empty action list.
+ */
+ public TransactionProcessor(
+ @NotNull ISerializationProvider serializationProvider,
+ @NotNull IRPCProvider rpcProvider,
+ @NotNull IABIProvider abiProvider,
+ @NotNull ISignatureProvider signatureProvider,
+ @NotNull Transaction transaction,
+ @NotNull IAMQPProvider amqpProvider) throws TransactionProcessorConstructorInputError {
+ this(serializationProvider, rpcProvider, abiProvider, signatureProvider, amqpProvider);
+ this.setTransaction(transaction);
}
//region public methods
@@ -472,10 +528,12 @@ public boolean sign() throws TransactionSignError {
*
* - The transaction has not been signed yet (no signature).
*
- * - An error has been returned from the blockchain. Cause: {@link TransactionPushTransactionError}
+ * - An error has been returned from the blockchain. Cause: {@link TransactionSendRpcTransactionError}
+ *
+ * - An error has been returned from the AMQP TRX queue process. Cause: {@link TransactionSendAmqpTransactionError}
*/
@NotNull
- public PushTransactionResponse broadcast() throws TransactionBroadCastError {
+ public SendTransactionResponse broadcast() throws TransactionBroadCastError {
if (this.serializedTransaction == null || this.serializedTransaction.isEmpty()) {
throw new TransactionBroadCastError(
ErrorConstants.TRANSACTION_PROCESSOR_BROADCAST_SERIALIZED_TRANSACTION_EMPTY);
@@ -486,21 +544,21 @@ public PushTransactionResponse broadcast() throws TransactionBroadCastError {
ErrorConstants.TRANSACTION_PROCESSOR_BROADCAST_SIGN_EMPTY);
}
- PushTransactionRequest pushTransactionRequest = new PushTransactionRequest(this.signatures,
+ SendTransactionRequest sendTransactionRequest = new SendTransactionRequest(this.signatures,
0, this.contextFreeData.getHexed(), this.serializedTransaction);
try {
- return this.pushTransaction(pushTransactionRequest);
- } catch (TransactionPushTransactionError transactionPushTransactionError) {
+ return this.sendTransaction(sendTransactionRequest);
+ } catch (TransactionSendRpcTransactionError | TransactionSendAmqpTransactionError transactionSendTransactionError) {
throw new TransactionBroadCastError(
ErrorConstants.TRANSACTION_PROCESSOR_BROADCAST_TRANS_ERROR,
- transactionPushTransactionError);
+ transactionSendTransactionError);
}
}
/**
* Sign and broadcast the transaction and signature/s to chain
*
- * @return PushTransactionResponse from blockchain.
+ * @return SendTransactionResponse from blockchain.
* @throws TransactionSignAndBroadCastError thrown under the following conditions:
*
* - Exception while creating signature. Cause: {@link TransactionCreateSignatureRequestError}
@@ -511,10 +569,12 @@ public PushTransactionResponse broadcast() throws TransactionBroadCastError {
*
* - The transaction has not been signed yet (no signature).
*
- * - An error has been returned from the blockchain. Cause: {@link TransactionPushTransactionError}
+ * - An error has been returned from the blockchain. Cause: {@link TransactionSendRpcTransactionError}
+ *
+ * - An error has been returned from the AMQP TRX queue process. Cause: {@link TransactionSendAmqpTransactionError}
*/
@NotNull
- public PushTransactionResponse signAndBroadcast() throws TransactionSignAndBroadCastError {
+ public SendTransactionResponse signAndBroadcast() throws TransactionSignAndBroadCastError {
EosioTransactionSignatureRequest eosioTransactionSignatureRequest;
try {
eosioTransactionSignatureRequest = this.createSignatureRequest();
@@ -539,12 +599,12 @@ public PushTransactionResponse signAndBroadcast() throws TransactionSignAndBroad
}
// Signatures and serializedTransaction are assigned and finalized in getSignature() method
- PushTransactionRequest pushTransactionRequest = new PushTransactionRequest(this.signatures,
+ SendTransactionRequest sendTransactionRequest = new SendTransactionRequest(this.signatures,
0, this.contextFreeData.getHexed(), this.serializedTransaction);
try {
- return this.pushTransaction(pushTransactionRequest);
- } catch (TransactionPushTransactionError transactionPushTransactionError) {
- throw new TransactionSignAndBroadCastError(transactionPushTransactionError);
+ return this.sendTransaction(sendTransactionRequest);
+ } catch (TransactionSendRpcTransactionError | TransactionSendAmqpTransactionError transactionSendTransactionError) {
+ throw new TransactionSignAndBroadCastError(transactionSendTransactionError);
}
}
@@ -760,26 +820,6 @@ private EosioTransactionSignatureResponse getSignature(
return eosioTransactionSignatureResponse;
}
- /**
- * Push signed transaction to blockchain.
- *
- * Check pushTransaction() flow in "Complete Workflow" document for more details.
- *
- * @param pushTransactionRequest the request
- * @return Response from chain
- */
- @NotNull
- private PushTransactionResponse pushTransaction(PushTransactionRequest pushTransactionRequest)
- throws TransactionPushTransactionError {
- try {
- return this.rpcProvider.pushTransaction(pushTransactionRequest);
- } catch (PushTransactionRpcError pushTransactionRpcError) {
- throw new TransactionPushTransactionError(
- ErrorConstants.TRANSACTION_PROCESSOR_RPC_PUSH_TRANSACTION,
- pushTransactionRpcError);
- }
- }
-
/**
* Serialize current transaction
*
@@ -1003,6 +1043,20 @@ private void finishPreparing(Transaction preparingTransaction, ContextFreeData p
}
}
+ /**
+ * Set the preset transaction
+ * @param transaction the preset transaction
+ * @throws TransactionProcessorConstructorInputError
+ */
+ private void setTransaction(Transaction transaction)
+ throws TransactionProcessorConstructorInputError {
+ this.transaction = transaction;
+ if (this.transaction.getActions().isEmpty()) {
+ throw new TransactionProcessorConstructorInputError(
+ ErrorConstants.TRANSACTION_PROCESSOR_ACTIONS_EMPTY_ERROR_MSG);
+ }
+ }
+
//endregion
//region getters/setters
@@ -1149,5 +1203,62 @@ public ContextFreeData getContextFreeData() {
return this.contextFreeData;
}
+ /**
+ * Queue message to AMQP TRX queue if amqpProvider exists. Otherwise, send signed transaction to blockchain.
+ *
+ * Check sendTransaction() flow in "Complete Workflow" document for more details.
+ *
+ * @param sendTransactionRequest the request
+ * @return Response from chain
+ */
+ @NotNull
+ private SendTransactionResponse sendTransaction(SendTransactionRequest sendTransactionRequest)
+ throws TransactionSendRpcTransactionError, TransactionSendAmqpTransactionError {
+ if (this.amqpProvider != null) {
+ try {
+ return this.sendAmqpTransaction(sendTransactionRequest);
+ } catch (SerializePackedTransactionError serializePackedTransactionError) {
+ throw new TransactionSendAmqpTransactionError(
+ ErrorConstants.TRANSACTION_PROCESSOR_AMQP_SEND_TRANSACTION,
+ serializePackedTransactionError);
+ }
+ } else {
+ try {
+ return this.rpcProvider.sendTransaction(sendTransactionRequest);
+ } catch (SendTransactionRpcError sendTransactionRpcError) {
+ throw new TransactionSendRpcTransactionError(
+ ErrorConstants.TRANSACTION_PROCESSOR_RPC_SEND_TRANSACTION,
+ sendTransactionRpcError);
+ }
+ }
+ }
+
+ private SendTransactionResponse sendAmqpTransaction(SendTransactionRequest sendTransactionRequest)
+ throws SerializePackedTransactionError {
+ AtomicBoolean success = new AtomicBoolean(false);
+ String packedTransactionV0 = getPackedTransactionV0(sendTransactionRequest);
+ Completable completable = this.amqpProvider.send(Hex.decode(packedTransactionV0));
+
+ // What do we do on error?
+ Completable onComplete = completable.doOnComplete(() -> success.set(true));
+
+ // Await response for 5 seconds
+ onComplete.blockingAwait(5, TimeUnit.SECONDS);
+
+ if (success.get()) {
+ return new AMQPMessageSuccessResponse();
+ } else {
+ return new AMQPMessageFailedResponse();
+ }
+ }
+
+ private String getPackedTransactionV0(SendTransactionRequest sendTransactionRequest)
+ throws SerializePackedTransactionError {
+ String json = Utils.getGson(DateFormatter.BACKEND_DATE_PATTERN).toJson(sendTransactionRequest);
+ String packedTransactionV0 = this.serializationProvider.serializePackedTransaction(json);
+
+ return PACKED_TRANSACTION_V0_PREFIX + packedTransactionV0;
+ }
+
//endregion
}
diff --git a/eosiojava/src/main/java/one/block/eosiojava/session/TransactionSession.java b/eosiojava/src/main/java/one/block/eosiojava/session/TransactionSession.java
index 9f70b48..2ed9cb7 100644
--- a/eosiojava/src/main/java/one/block/eosiojava/session/TransactionSession.java
+++ b/eosiojava/src/main/java/one/block/eosiojava/session/TransactionSession.java
@@ -2,11 +2,13 @@
import one.block.eosiojava.error.session.TransactionProcessorConstructorInputError;
import one.block.eosiojava.interfaces.IABIProvider;
+import one.block.eosiojava.interfaces.IAMQPProvider;
import one.block.eosiojava.interfaces.IRPCProvider;
import one.block.eosiojava.interfaces.ISerializationProvider;
import one.block.eosiojava.interfaces.ISignatureProvider;
import one.block.eosiojava.models.rpcProvider.Transaction;
import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
/**
* Transaction Session class has a factory role for creating {@link TransactionProcessor} object from providers instances
@@ -45,6 +47,14 @@ public class TransactionSession {
@NotNull
private ISignatureProvider signatureProvider;
+ /**
+ * AMQP Provider to be used as a reference on {@link TransactionProcessor} object
+ *
+ * Responsible for AMQP message publishing on EOSIO chain
+ */
+ @Nullable
+ private IAMQPProvider amqpProvider;
+
/**
* Initialize TransactionSession object which acts like a factory to create {@link TransactionProcessor} object from providers instances.
*
@@ -63,6 +73,24 @@ public TransactionSession(
this.signatureProvider = signatureProvider;
}
+ /**
+ * Initialize TransactionSession object which acts like a factory to create {@link TransactionProcessor} object from providers instances.
+ *
+ * @param serializationProvider serialization provider.
+ * @param rpcProvider Rpc provider.
+ * @param abiProvider ABI provider.
+ * @param signatureProvider signature provider.
+ * @param amqpProvider AMQP provider.
+ */
+ public TransactionSession(
+ @NotNull ISerializationProvider serializationProvider,
+ @NotNull IRPCProvider rpcProvider, @NotNull IABIProvider abiProvider,
+ @NotNull ISignatureProvider signatureProvider,
+ @NotNull IAMQPProvider amqpProvider) {
+ this(serializationProvider, rpcProvider, abiProvider, signatureProvider);
+ this.amqpProvider = amqpProvider;
+ }
+
/**
* Create and return a new instance of TransactionProcessor
*
@@ -70,7 +98,7 @@ public TransactionSession(
*/
public TransactionProcessor getTransactionProcessor() {
return new TransactionProcessor(this.serializationProvider, this.rpcProvider,
- this.abiProvider, this.signatureProvider);
+ this.abiProvider, this.signatureProvider, this.amqpProvider);
}
/**
diff --git a/eosiojava/src/test/java/one/block/eosiojava/RpcModelTest.java b/eosiojava/src/test/java/one/block/eosiojava/RpcModelTest.java
index f029417..f03176d 100644
--- a/eosiojava/src/test/java/one/block/eosiojava/RpcModelTest.java
+++ b/eosiojava/src/test/java/one/block/eosiojava/RpcModelTest.java
@@ -11,12 +11,12 @@
import one.block.eosiojava.models.rpcProvider.request.GetBlockRequest;
import one.block.eosiojava.models.rpcProvider.request.GetRawAbiRequest;
import one.block.eosiojava.models.rpcProvider.request.GetRequiredKeysRequest;
-import one.block.eosiojava.models.rpcProvider.request.PushTransactionRequest;
+import one.block.eosiojava.models.rpcProvider.request.SendTransactionRequest;
import one.block.eosiojava.models.rpcProvider.response.GetBlockResponse;
import one.block.eosiojava.models.rpcProvider.response.GetInfoResponse;
import one.block.eosiojava.models.rpcProvider.response.GetRawAbiResponse;
import one.block.eosiojava.models.rpcProvider.response.GetRequiredKeysResponse;
-import one.block.eosiojava.models.rpcProvider.response.PushTransactionResponse;
+import one.block.eosiojava.models.rpcProvider.response.SendTransactionResponse;
import org.junit.Before;
import org.junit.Test;
@@ -148,29 +148,29 @@ public void GetRequiredKeysRequestTest() {
}
/**
- * Test PushTransactionRequest
+ * Test SendTransactionRequest
*/
@Test
- public void PushTransactionRequestTest() {
+ public void SendTransactionRequestTest() {
String jsonContent = "{\"signatures\":[\"signature in EOS format\"],\"compression\":0,\"packed_context_free_data\":\"\",\"packed_trx\":\"packed transaction\"}";
// FromJSON test
- PushTransactionRequest pushTransactionRequest = this.gson
- .fromJson(jsonContent, PushTransactionRequest.class);
- assertNotNull(pushTransactionRequest);
- assertEquals(0, pushTransactionRequest.getCompression());
+ SendTransactionRequest sendTransactionRequest = this.gson
+ .fromJson(jsonContent, SendTransactionRequest.class);
+ assertNotNull(sendTransactionRequest);
+ assertEquals(0, sendTransactionRequest.getCompression());
assertEquals(
"packed transaction",
- pushTransactionRequest.getPackTrx());
- assertEquals("", pushTransactionRequest.getPackagedContextFreeData());
- assertNotNull(pushTransactionRequest.getSignatures());
- assertEquals(1, pushTransactionRequest.getSignatures().size());
+ sendTransactionRequest.getPackTrx());
+ assertEquals("", sendTransactionRequest.getPackagedContextFreeData());
+ assertNotNull(sendTransactionRequest.getSignatures());
+ assertEquals(1, sendTransactionRequest.getSignatures().size());
assertEquals(
"signature in EOS format",
- pushTransactionRequest.getSignatures().get(0));
+ sendTransactionRequest.getSignatures().get(0));
// ToJSON test
- String toJSON = this.gson.toJson(pushTransactionRequest);
+ String toJSON = this.gson.toJson(sendTransactionRequest);
assertNotNull(toJSON);
assertNotEquals("", toJSON);
assertEquals(jsonContent, toJSON);
@@ -274,21 +274,21 @@ public void GetRequiredKeysResponseTest() {
}
/**
- * Test PushTransactionResponse
+ * Test SendTransactionResponse
*/
@Test
- public void PushTransactionResponseTest() {
+ public void SendTransactionResponseTest() {
String jsonContent = "{\"transaction_id\":\"dump_transaction_id\",\"processed\":{\"id\":\"dump_id\",\"block_num\":1231214214,\"block_time\":\"2019-12-12T12:12:12.500\",\"receipt\":{\"status\":\"executed\",\"cpu_usage_us\":1,\"net_usage_words\":1},\"elapsed\":1,\"net_usage\":1,\"scheduled\":false,\"action_traces\":[{\"receipt\":{\"receiver\":\"eosio.assert\",\"act_digest\":\"digest\",\"global_sequence\":1,\"recv_sequence\":1,\"auth_sequence\":[],\"code_sequence\":1,\"abi_sequence\":1},\"act\":{\"account\":\"eosio.assert\",\"name\":\"require\",\"authorization\":[],\"data\":{\"chain_params_hash\":\"hash\",\"manifest_id\":\"manifest id\",\"actions\":[{\"contract\":\"eosio.token\",\"action\":\"transfer\"}],\"abi_hashes\":[\"abi hashes\"]},\"hex_data\":\"hex data\"},\"context_free\":false,\"elapsed\":1,\"cpu_usage\":0,\"console\":\"\",\"total_cpu_usage\":0,\"trx_id\":\"transaction id\",\"block_num\":1,\"block_time\":\"2019-12-12T12:12:12.500\",\"account_ram_deltas\":[],\"inline_traces\":[]},{\"receipt\":{\"receiver\":\"eosio.token\",\"act_digest\":\"digest\",\"global_sequence\":1,\"recv_sequence\":1,\"auth_sequence\":[[\"dummy_account\",1]],\"code_sequence\":1,\"abi_sequence\":1},\"act\":{\"account\":\"eosio.token\",\"name\":\"transfer\",\"authorization\":[{\"actor\":\"dummy_account\",\"permission\":\"active\"}],\"data\":{\"from\":\"dummy_account\",\"to\":\"dummy_account_2\",\"quantity\":\"1.0000 EOS\",\"memo\":\"dummy memo\"},\"hex_data\":\"hex data\"},\"context_free\":false,\"elapsed\":1,\"cpu_usage\":0,\"console\":\"\",\"total_cpu_usage\":0,\"trx_id\":\"transaction id\",\"block_num\":123123123,\"block_time\":\"2019-12-12T12:12:12.500\",\"account_ram_deltas\":[],\"inline_traces\":[{\"receipt\":{\"receiver\":\"dummy_account\",\"act_digest\":\"digest\",\"global_sequence\":1,\"recv_sequence\":1,\"auth_sequence\":[[\"dummy_account\",1]],\"code_sequence\":1,\"abi_sequence\":1},\"act\":{\"account\":\"eosio.token\",\"name\":\"transfer\",\"authorization\":[{\"actor\":\"dummy_account\",\"permission\":\"active\"}],\"data\":{\"from\":\"dummy_account\",\"to\":\"dummy_account_2\",\"quantity\":\"1.0000 EOS\",\"memo\":\"dummy memo\"},\"hex_data\":\"hex data\"},\"context_free\":false,\"elapsed\":1,\"cpu_usage\":0,\"console\":\"\",\"total_cpu_usage\":0,\"trx_id\":\"transaction id\",\"block_num\":1,\"block_time\":\"2019-12-12T12:12:12.500\",\"account_ram_deltas\":[],\"inline_traces\":[]},{\"receipt\":{\"receiver\":\"dummy_account_2\",\"act_digest\":\"digest\",\"global_sequence\":1,\"recv_sequence\":1,\"auth_sequence\":[[\"dummy_account\",111]],\"code_sequence\":1,\"abi_sequence\":1},\"act\":{\"account\":\"eosio.token\",\"name\":\"transfer\",\"authorization\":[{\"actor\":\"dummy_account\",\"permission\":\"active\"}],\"data\":{\"from\":\"dummy_account\",\"to\":\"dummy_account_2\",\"quantity\":\"1.0000 EOS\",\"memo\":\"dummy memo\"},\"hex_data\":\"hex data\"},\"context_free\":false,\"elapsed\":1,\"cpu_usage\":0,\"console\":\"\",\"total_cpu_usage\":0,\"trx_id\":\"transaction id\",\"block_num\":123123,\"block_time\":\"2019-12-12T12:12:12.500\",\"account_ram_deltas\":[],\"inline_traces\":[]}]}]}}";
// FromJSON test
- PushTransactionResponse pushTransactionResponse = this.gson
- .fromJson(jsonContent, PushTransactionResponse.class);
- assertNotNull(pushTransactionResponse);
- assertEquals("dump_transaction_id", pushTransactionResponse.getTransactionId());
- assertEquals("dump_id", pushTransactionResponse.getProcessed().get("id"));
+ SendTransactionResponse sendTransactionResponse = this.gson
+ .fromJson(jsonContent, SendTransactionResponse.class);
+ assertNotNull(sendTransactionResponse);
+ assertEquals("dump_transaction_id", sendTransactionResponse.getTransactionId());
+ assertEquals("dump_id", sendTransactionResponse.getProcessed().get("id"));
// ToJSON test
- String toJSON = this.gson.toJson(pushTransactionResponse);
+ String toJSON = this.gson.toJson(sendTransactionResponse);
assertNotNull(toJSON);
assertNotEquals("", toJSON);
// This test does not do verify toJSON with original json content because they are generated different values due to deep level model which is not defined in the source code.
diff --git a/eosiojava/src/test/java/one/block/eosiojava/session/NegativeTransactionProcessorTest.java b/eosiojava/src/test/java/one/block/eosiojava/session/NegativeTransactionProcessorTest.java
index e5ffd5f..c4f94e4 100644
--- a/eosiojava/src/test/java/one/block/eosiojava/session/NegativeTransactionProcessorTest.java
+++ b/eosiojava/src/test/java/one/block/eosiojava/session/NegativeTransactionProcessorTest.java
@@ -17,9 +17,10 @@
import one.block.eosiojava.error.rpcProvider.GetBlockRpcError;
import one.block.eosiojava.error.rpcProvider.GetInfoRpcError;
import one.block.eosiojava.error.rpcProvider.GetRequiredKeysRpcError;
-import one.block.eosiojava.error.rpcProvider.PushTransactionRpcError;
+import one.block.eosiojava.error.rpcProvider.SendTransactionRpcError;
import one.block.eosiojava.error.serializationProvider.DeserializeTransactionError;
import one.block.eosiojava.error.serializationProvider.SerializeError;
+import one.block.eosiojava.error.serializationProvider.SerializePackedTransactionError;
import one.block.eosiojava.error.serializationProvider.SerializeTransactionError;
import one.block.eosiojava.error.session.TransactionBroadCastError;
import one.block.eosiojava.error.session.TransactionCreateSignatureRequestError;
@@ -30,11 +31,13 @@
import one.block.eosiojava.error.session.TransactionPrepareInputError;
import one.block.eosiojava.error.session.TransactionPrepareRpcError;
import one.block.eosiojava.error.session.TransactionProcessorConstructorInputError;
-import one.block.eosiojava.error.session.TransactionPushTransactionError;
+import one.block.eosiojava.error.session.TransactionSendAmqpTransactionError;
+import one.block.eosiojava.error.session.TransactionSendRpcTransactionError;
import one.block.eosiojava.error.session.TransactionSignError;
import one.block.eosiojava.error.signatureProvider.GetAvailableKeysError;
import one.block.eosiojava.error.signatureProvider.SignTransactionError;
import one.block.eosiojava.interfaces.IABIProvider;
+import one.block.eosiojava.interfaces.IAMQPProvider;
import one.block.eosiojava.interfaces.IRPCProvider;
import one.block.eosiojava.interfaces.ISerializationProvider;
import one.block.eosiojava.interfaces.ISignatureProvider;
@@ -46,7 +49,7 @@
import one.block.eosiojava.models.rpcProvider.TransactionConfig;
import one.block.eosiojava.models.rpcProvider.request.GetBlockRequest;
import one.block.eosiojava.models.rpcProvider.request.GetRequiredKeysRequest;
-import one.block.eosiojava.models.rpcProvider.request.PushTransactionRequest;
+import one.block.eosiojava.models.rpcProvider.request.SendTransactionRequest;
import one.block.eosiojava.models.rpcProvider.response.GetBlockResponse;
import one.block.eosiojava.models.rpcProvider.response.GetInfoResponse;
import one.block.eosiojava.models.rpcProvider.response.GetRequiredKeysResponse;
@@ -71,6 +74,7 @@ public class NegativeTransactionProcessorTest {
public ExpectedException exceptionRule = ExpectedException.none();
private IRPCProvider mockedRpcProvider = mock(IRPCProvider.class);
+ private IAMQPProvider mockedAmqpProvider = mock(IAMQPProvider.class);
private ISignatureProvider mockedSignatureProvider = mock(ISignatureProvider.class);
private IABIProvider mockedABIProvider = mock(IABIProvider.class);
private ISerializationProvider mockedSerializationProvider = mock(ISerializationProvider.class);
@@ -82,6 +86,11 @@ public void setUp() {
this.mockedSignatureProvider);
}
+ public void setUpWithAmqpProvider() {
+ this.session = new TransactionSession(this.mockedSerializationProvider, this.mockedRpcProvider, this.mockedABIProvider,
+ this.mockedSignatureProvider, this.mockedAmqpProvider);
+ }
+
//region negative tests for "prepare"
@Test
public void prepare_thenFailWithEmptyActions() throws TransactionPrepareError {
@@ -407,22 +416,73 @@ public void signCallGetSignatureWithTransactionModified_thenFailWithDeserializeT
//region negative tests for broadcast
@Test
- public void broadCast_thenFailWithPushTransactionError() throws TransactionBroadCastError {
+ public void broadCast_thenFailWithSendRpcTransactionError() throws TransactionBroadCastError {
+ exceptionRule.expect(TransactionBroadCastError.class);
+ exceptionRule.expectMessage(ErrorConstants.TRANSACTION_PROCESSOR_BROADCAST_TRANS_ERROR);
+ exceptionRule.expectCause(IsInstanceOf.instanceOf(TransactionSendRpcTransactionError.class));
+
+ // Mock RpcProvider
+ this.mockGetInfoPositively();
+ this.mockGetBlockPositively();
+ this.mockRequiredKeys(Utils.getGson(DateFormatter.BACKEND_DATE_PATTERN).fromJson(mockedGetRequiredKeysResponse, GetRequiredKeysResponse.class));
+
+ // Mock SendTransaction RPC to throw error
+ try {
+ when(this.mockedRpcProvider.sendTransaction(any(SendTransactionRequest.class))).thenThrow(new SendTransactionRpcError());
+ } catch (SendTransactionRpcError sendTransactionRpcError) {
+ sendTransactionRpcError.printStackTrace();
+ fail("Exception should not be thrown here for mocking sendTransaction");
+ }
+
+ // Mock AbiProvider
+ this.mockGetAbi(EOSIOTOKENABIJSON);
+
+ // mock serialization
+ this.mockSerialize(MOCKED_ACTION_HEX);
+ this.mockSerializeTransaction(MOCKED_TRANSACTION_HEX);
+
+ // Mock signature provider
+ this.mockGetAvailableKey(Arrays.asList("Key1", "Key2"));
+ this.mockSignTransaction(Utils.getGson(DateFormatter.BACKEND_DATE_PATTERN)
+ .fromJson(mockedEosioTransactionSignatureResponseJSON, EosioTransactionSignatureResponse.class));
+
+ TransactionProcessor processor = session.getTransactionProcessor();
+
+ try {
+ processor.prepare(this.defaultActions());
+ } catch (TransactionPrepareError transactionPrepareError) {
+ transactionPrepareError.printStackTrace();
+ fail("Exception should not be thrown here for calling prepare");
+ }
+
+ try {
+ processor.sign();
+ } catch (TransactionSignError transactionSignError) {
+ transactionSignError.printStackTrace();
+ fail("Exception should not be thrown here for calling prepare");
+ }
+
+ processor.broadcast();
+ }
+
+ @Test
+ public void broadCast_thenFailWithSendAmqpTransactionError() throws TransactionBroadCastError {
+ setUpWithAmqpProvider();
exceptionRule.expect(TransactionBroadCastError.class);
exceptionRule.expectMessage(ErrorConstants.TRANSACTION_PROCESSOR_BROADCAST_TRANS_ERROR);
- exceptionRule.expectCause(IsInstanceOf.instanceOf(TransactionPushTransactionError.class));
+ exceptionRule.expectCause(IsInstanceOf.instanceOf(TransactionSendAmqpTransactionError.class));
// Mock RpcProvider
this.mockGetInfoPositively();
this.mockGetBlockPositively();
this.mockRequiredKeys(Utils.getGson(DateFormatter.BACKEND_DATE_PATTERN).fromJson(mockedGetRequiredKeysResponse, GetRequiredKeysResponse.class));
- // Mock PushTransaction RPC to throw error
+ // Mock AMQPProvider send to throw error
try {
- when(this.mockedRpcProvider.pushTransaction(any(PushTransactionRequest.class))).thenThrow(new PushTransactionRpcError());
- } catch (PushTransactionRpcError pushTransactionRpcError) {
- pushTransactionRpcError.printStackTrace();
- fail("Exception should not be thrown here for mocking pushTransaction");
+ when(this.mockedSerializationProvider.serializePackedTransaction(any(String.class))).thenThrow(new SerializePackedTransactionError());
+ } catch (SerializePackedTransactionError serializePackedTransactionError) {
+ serializePackedTransactionError.printStackTrace();
+ fail("Exception should not be thrown here for mocking sendTransaction");
}
// Mock AbiProvider
diff --git a/eosiojava/src/test/java/one/block/eosiojava/session/TransactionProcessorTest.java b/eosiojava/src/test/java/one/block/eosiojava/session/TransactionProcessorTest.java
index bbcb04c..c566890 100644
--- a/eosiojava/src/test/java/one/block/eosiojava/session/TransactionProcessorTest.java
+++ b/eosiojava/src/test/java/one/block/eosiojava/session/TransactionProcessorTest.java
@@ -17,7 +17,7 @@
import one.block.eosiojava.error.rpcProvider.GetBlockRpcError;
import one.block.eosiojava.error.rpcProvider.GetInfoRpcError;
import one.block.eosiojava.error.rpcProvider.GetRequiredKeysRpcError;
-import one.block.eosiojava.error.rpcProvider.PushTransactionRpcError;
+import one.block.eosiojava.error.rpcProvider.SendTransactionRpcError;
import one.block.eosiojava.error.serializationProvider.DeserializeTransactionError;
import one.block.eosiojava.error.serializationProvider.SerializeError;
import one.block.eosiojava.error.serializationProvider.SerializeTransactionError;
@@ -43,11 +43,11 @@
import one.block.eosiojava.models.rpcProvider.TransactionConfig;
import one.block.eosiojava.models.rpcProvider.request.GetBlockRequest;
import one.block.eosiojava.models.rpcProvider.request.GetRequiredKeysRequest;
-import one.block.eosiojava.models.rpcProvider.request.PushTransactionRequest;
+import one.block.eosiojava.models.rpcProvider.request.SendTransactionRequest;
import one.block.eosiojava.models.rpcProvider.response.GetBlockResponse;
import one.block.eosiojava.models.rpcProvider.response.GetInfoResponse;
import one.block.eosiojava.models.rpcProvider.response.GetRequiredKeysResponse;
-import one.block.eosiojava.models.rpcProvider.response.PushTransactionResponse;
+import one.block.eosiojava.models.rpcProvider.response.SendTransactionResponse;
import one.block.eosiojava.models.signatureProvider.EosioTransactionSignatureRequest;
import one.block.eosiojava.models.signatureProvider.EosioTransactionSignatureResponse;
import one.block.eosiojava.utilities.DateFormatter;
@@ -144,9 +144,9 @@ public void broadcast() {
}
try {
- PushTransactionResponse pushTransactionResponse = processor.broadcast();
- assertNotNull(pushTransactionResponse);
- assertEquals(DUMP_TRANSACTION_ID, pushTransactionResponse.getTransactionId());
+ SendTransactionResponse sendTransactionResponse = processor.broadcast();
+ assertNotNull(sendTransactionResponse);
+ assertEquals(DUMP_TRANSACTION_ID, sendTransactionResponse.getTransactionId());
} catch (TransactionBroadCastError transactionBroadCastError) {
transactionBroadCastError.printStackTrace();
fail("Exception should not be thrown here for calling broadcast");
@@ -160,9 +160,9 @@ public void signAndBroadcast() {
assertNotNull(processor);
try {
- PushTransactionResponse pushTransactionResponse = processor.signAndBroadcast();
- assertNotNull(pushTransactionResponse);
- assertEquals(DUMP_TRANSACTION_ID, pushTransactionResponse.getTransactionId());
+ SendTransactionResponse sendTransactionResponse = processor.signAndBroadcast();
+ assertNotNull(sendTransactionResponse);
+ assertEquals(DUMP_TRANSACTION_ID, sendTransactionResponse.getTransactionId());
} catch (TransactionSignAndBroadCastError transactionSignAndBroadCastError) {
transactionSignAndBroadCastError.printStackTrace();
fail("Exception should not be thrown here for calling signAndBroadcast");
@@ -377,9 +377,9 @@ public void setRequiredKeys() {
processor.setRequiredKeys(requiredKeys);
try {
- PushTransactionResponse pushTransactionResponse = processor.signAndBroadcast();
- assertNotNull(pushTransactionResponse);
- assertEquals(DUMP_TRANSACTION_ID, pushTransactionResponse.getTransactionId());
+ SendTransactionResponse sendTransactionResponse = processor.signAndBroadcast();
+ assertNotNull(sendTransactionResponse);
+ assertEquals(DUMP_TRANSACTION_ID, sendTransactionResponse.getTransactionId());
} catch (TransactionSignAndBroadCastError transactionSignAndBroadCastError) {
transactionSignAndBroadCastError.printStackTrace();
fail("Exception should not be thrown here for calling signAndBroadcast");
@@ -392,7 +392,7 @@ public void isAllowTransactionToBeModified() {
Utils.getGson(DateFormatter.BACKEND_DATE_PATTERN).fromJson(mockedGetInfoResponse, GetInfoResponse.class),
Utils.getGson(DateFormatter.BACKEND_DATE_PATTERN).fromJson(mockedGetBlockResponse, GetBlockResponse.class),
Utils.getGson(DateFormatter.BACKEND_DATE_PATTERN).fromJson(mockedGetRequiredKeysResponse, GetRequiredKeysResponse.class),
- Utils.getGson(DateFormatter.BACKEND_DATE_PATTERN).fromJson(MOCKED_PUSHTRANSACTION_RESPONE_JSON, PushTransactionResponse.class));
+ Utils.getGson(DateFormatter.BACKEND_DATE_PATTERN).fromJson(MOCKED_SENDTRANSACTION_RESPONE_JSON, SendTransactionResponse.class));
this.mockAbiProvider(EOSIOTOKENABIJSON);
this.mockSerializationProvider(MOCKED_ACTION_HEX, MOCKED_TRANSACTION_HEX, mockedDeserilizedTransaction);
@@ -415,9 +415,9 @@ public void isAllowTransactionToBeModified() {
assertTrue(processor.isTransactionModificationAllowed());
try {
- PushTransactionResponse pushTransactionResponse = processor.signAndBroadcast();
- assertNotNull(pushTransactionResponse);
- assertEquals(DUMP_TRANSACTION_ID, pushTransactionResponse.getTransactionId());
+ SendTransactionResponse sendTransactionResponse = processor.signAndBroadcast();
+ assertNotNull(sendTransactionResponse);
+ assertEquals(DUMP_TRANSACTION_ID, sendTransactionResponse.getTransactionId());
// after signing and broadcast, serialized transaction is updated
assertEquals(MOCKED_TRANSACTION_HEX_MODIFIED, processor.getSerializedTransaction());
@@ -456,9 +456,9 @@ public void testPresetTransaction() {
}
try {
- PushTransactionResponse pushTransactionResponse = processor.signAndBroadcast();
- assertNotNull(pushTransactionResponse);
- assertEquals(DUMP_TRANSACTION_ID, pushTransactionResponse.getTransactionId());
+ SendTransactionResponse sendTransactionResponse = processor.signAndBroadcast();
+ assertNotNull(sendTransactionResponse);
+ assertEquals(DUMP_TRANSACTION_ID, sendTransactionResponse.getTransactionId());
} catch (TransactionSignAndBroadCastError transactionSignAndBroadCastError) {
transactionSignAndBroadCastError.printStackTrace();
fail("Exception should not be thrown here for sign and broadcast");
@@ -589,7 +589,7 @@ private void mockDefaultSuccessData() {
Utils.getGson(DateFormatter.BACKEND_DATE_PATTERN).fromJson(mockedGetInfoResponse, GetInfoResponse.class),
Utils.getGson(DateFormatter.BACKEND_DATE_PATTERN).fromJson(mockedGetBlockResponse, GetBlockResponse.class),
Utils.getGson(DateFormatter.BACKEND_DATE_PATTERN).fromJson(mockedGetRequiredKeysResponse, GetRequiredKeysResponse.class),
- Utils.getGson(DateFormatter.BACKEND_DATE_PATTERN).fromJson(MOCKED_PUSHTRANSACTION_RESPONE_JSON, PushTransactionResponse.class));
+ Utils.getGson(DateFormatter.BACKEND_DATE_PATTERN).fromJson(MOCKED_SENDTRANSACTION_RESPONE_JSON, SendTransactionResponse.class));
this.mockAbiProvider(EOSIOTOKENABIJSON);
this.mockSerializationProvider(MOCKED_ACTION_HEX, MOCKED_TRANSACTION_HEX, mockedDeserilizedTransaction);
@@ -664,7 +664,7 @@ private void mockRPC(
@Nullable GetInfoResponse getInfoResponse,
@Nullable GetBlockResponse getBlockResponse,
@Nullable GetRequiredKeysResponse getRequiredKeysResponse,
- @Nullable PushTransactionResponse pushTransactionResponse) {
+ @Nullable SendTransactionResponse sendTransactionResponse) {
if (getInfoResponse != null) {
try {
@@ -693,12 +693,12 @@ private void mockRPC(
}
}
- if (pushTransactionResponse != null) {
+ if (sendTransactionResponse != null) {
try {
- when(this.mockedRpcProvider.pushTransaction(any(PushTransactionRequest.class))).thenReturn(pushTransactionResponse);
- } catch (PushTransactionRpcError pushTransactionRpcError) {
- pushTransactionRpcError.printStackTrace();
- fail("Exception should not be thrown here for mocking pushTransaction");
+ when(this.mockedRpcProvider.sendTransaction(any(SendTransactionRequest.class))).thenReturn(sendTransactionResponse);
+ } catch (SendTransactionRpcError sendTransactionRpcError) {
+ sendTransactionRpcError.printStackTrace();
+ fail("Exception should not be thrown here for mocking sendTransaction");
}
}
}
@@ -771,7 +771,7 @@ private void mockSignatureProvider(List mockedAvaialbleKeys, EosioTransa
private static final String EOSIOTOKENABIJSON = "{\"version\":\"eosio::abi/1.0\",\"types\":[{\"new_type_name\":\"account_name\",\"type\":\"name\"}],\"structs\":[{\"name\":\"transfer\",\"base\":\"\",\"fields\":[{\"name\":\"from\",\"type\":\"account_name\"},{\"name\":\"to\",\"type\":\"account_name\"},{\"name\":\"quantity\",\"type\":\"asset\"},{\"name\":\"memo\",\"type\":\"string\"}]},{\"name\":\"create\",\"base\":\"\",\"fields\":[{\"name\":\"issuer\",\"type\":\"account_name\"},{\"name\":\"maximum_supply\",\"type\":\"asset\"}]},{\"name\":\"issue\",\"base\":\"\",\"fields\":[{\"name\":\"to\",\"type\":\"account_name\"},{\"name\":\"quantity\",\"type\":\"asset\"},{\"name\":\"memo\",\"type\":\"string\"}]},{\"name\":\"account\",\"base\":\"\",\"fields\":[{\"name\":\"balance\",\"type\":\"asset\"}]},{\"name\":\"currency_stats\",\"base\":\"\",\"fields\":[{\"name\":\"supply\",\"type\":\"asset\"},{\"name\":\"max_supply\",\"type\":\"asset\"},{\"name\":\"issuer\",\"type\":\"account_name\"}]}],\"actions\":[{\"name\":\"transfer\",\"type\":\"transfer\",\"ricardian_contract\":\"---\\ntitle: Token Transfer\\nsummary: Transfer tokens from one account to another.\\nicon: https://cdn.testnet.dev.b1ops.net/token-transfer.png#ce51ef9f9eeca3434e85507e0ed49e76fff1265422bded0255f3196ea59c8b0c\\n---\\n\\n## Transfer Terms & Conditions\\n\\nI, {{from}}, certify the following to be true to the best of my knowledge:\\n\\n1. I certify that {{quantity}} is not the proceeds of fraudulent or violent activities.\\n2. I certify that, to the best of my knowledge, {{to}} is not supporting initiation of violence against others.\\n3. I have disclosed any contractual terms & conditions with respect to {{quantity}} to {{to}}.\\n\\nI understand that funds transfers are not reversible after the {{$transaction.delay_sec}} seconds or other delay as configured by {{from}}'s permissions.\\n\\nIf this action fails to be irreversibly confirmed after receiving goods or services from '{{to}}', I agree to either return the goods or services or resend {{quantity}} in a timely manner.\"},{\"name\":\"issue\",\"type\":\"issue\",\"ricardian_contract\":\"\"},{\"name\":\"create\",\"type\":\"create\",\"ricardian_contract\":\"\"}],\"tables\":[{\"name\":\"accounts\",\"index_type\":\"i64\",\"key_names\":[\"currency\"],\"key_types\":[\"uint64\"],\"type\":\"account\"},{\"name\":\"stat\",\"index_type\":\"i64\",\"key_names\":[\"currency\"],\"key_types\":[\"uint64\"],\"type\":\"currency_stats\"}],\"ricardian_clauses\":[],\"error_messages\":[],\"abi_extensions\":[],\"variants\":[]}";
private static final String DUMP_TRANSACTION_ID = "17335a29eae22e531966f3775e44f8b02173e780c9549881e01e470ff0ab46ce";
- private static final String MOCKED_PUSHTRANSACTION_RESPONE_JSON = "{\"transaction_id\":\"" + DUMP_TRANSACTION_ID + "\"}";
+ private static final String MOCKED_SENDTRANSACTION_RESPONE_JSON = "{\"transaction_id\":\"" + DUMP_TRANSACTION_ID + "\"}";
private static final BigInteger headBlockNum = BigInteger.valueOf(31984402L);
private static final String headBlockTime = "2019-04-01T22:08:40.000";